darken lower levels
This commit is contained in:
parent
07a1a79cc4
commit
26cb860efb
4 changed files with 37 additions and 4 deletions
|
@ -70,6 +70,9 @@ class RenderEngine(ABC):
|
|||
def add_group(self, group):
|
||||
pass
|
||||
|
||||
def darken(self, area):
|
||||
pass
|
||||
|
||||
def add_geometry(self, geometry, fill: Optional[FillAttribs] = None, stroke: Optional[StrokeAttribs] = None,
|
||||
altitude=None, height=None, shape_cache_key=None, category=None, item=None):
|
||||
# draw a shapely geometry with a given style
|
||||
|
@ -86,7 +89,7 @@ class RenderEngine(ABC):
|
|||
|
||||
@abstractmethod
|
||||
def _add_geometry(self, geometry, fill: Optional[FillAttribs], stroke: Optional[StrokeAttribs],
|
||||
altitude=None, height=None, shape_cache_key=None, item=None):
|
||||
altitude=None, height=None, shape_cache_key=None, category=None, item=None):
|
||||
pass
|
||||
|
||||
def set_mesh_lookup_data(self, data):
|
||||
|
|
|
@ -214,9 +214,13 @@ class SVGEngine(RenderEngine):
|
|||
else:
|
||||
self.altitudes[new_altitude] = new_geometry
|
||||
|
||||
def darken(self, area):
|
||||
if area:
|
||||
self.add_geometry(geometry=area, fill=FillAttribs('#000000', 0.1), category='darken')
|
||||
|
||||
def _add_geometry(self, geometry, fill: Optional[FillAttribs], stroke: Optional[StrokeAttribs],
|
||||
altitude=None, height=None, shape_cache_key=None, **kwargs):
|
||||
geometry = self.buffered_bbox.intersection(geometry.geom)
|
||||
geometry = self.buffered_bbox.intersection(geometry.geom if hasattr(geometry, 'geom') else geometry)
|
||||
|
||||
if geometry.is_empty:
|
||||
return
|
||||
|
|
|
@ -42,6 +42,8 @@ class LevelRenderData:
|
|||
def __init__(self):
|
||||
self.levels = []
|
||||
self.base_altitude = None
|
||||
self.lowest_important_level = None
|
||||
self.darken_area = None
|
||||
|
||||
@staticmethod
|
||||
def rebuild():
|
||||
|
@ -95,12 +97,25 @@ class LevelRenderData:
|
|||
# levels above them.
|
||||
crop_to = None
|
||||
primary_level_count = 0
|
||||
main_level_passed = 0
|
||||
lowest_important_level = None
|
||||
for sublevel in reversed(sublevels):
|
||||
geoms = single_level_geoms[sublevel.pk]
|
||||
|
||||
if geoms.holes is not None:
|
||||
primary_level_count += 1
|
||||
|
||||
# get lowest intermediate level directly below main level
|
||||
|
||||
if not main_level_passed:
|
||||
if geoms.pk == level.pk:
|
||||
main_level_passed = 1
|
||||
else:
|
||||
if not sublevel.on_top_of_id:
|
||||
main_level_passed += 1
|
||||
if main_level_passed < 2:
|
||||
lowest_important_level = sublevel
|
||||
|
||||
# set crop area if we area on the second primary layer from top or below
|
||||
level_crop_to[sublevel.pk] = Cropper(crop_to if primary_level_count > 1 else None)
|
||||
|
||||
|
@ -115,9 +130,11 @@ class LevelRenderData:
|
|||
|
||||
render_data = LevelRenderData()
|
||||
render_data.base_altitude = level.base_altitude
|
||||
render_data.lowest_important_level = lowest_important_level.pk
|
||||
access_restriction_affected = {}
|
||||
|
||||
# go through sublevels, get their level geometries and crop them
|
||||
lowest_important_level_passed = False
|
||||
for sublevel in sublevels:
|
||||
try:
|
||||
crop_to = level_crop_to[sublevel.pk]
|
||||
|
@ -126,6 +143,12 @@ class LevelRenderData:
|
|||
|
||||
old_geoms = single_level_geoms[sublevel.pk]
|
||||
|
||||
if render_data.lowest_important_level == sublevel.pk:
|
||||
lowest_important_level_passed = True
|
||||
|
||||
if old_geoms.holes and render_data.darken_area is None and lowest_important_level_passed:
|
||||
render_data.darken_area = old_geoms.holes
|
||||
|
||||
if crop_to.geometry is not None:
|
||||
map_history.composite(MapHistory.open_level(sublevel.pk, 'base'), crop_to.geometry)
|
||||
elif level.pk != sublevel.pk:
|
||||
|
|
|
@ -54,11 +54,14 @@ class MapRenderer:
|
|||
not_full_levels = engine.is_3d # always do non-full-levels until after the first primary level
|
||||
full_levels = self.full_levels and engine.is_3d
|
||||
for geoms in levels:
|
||||
engine.add_group('level_%s' % geoms.short_label)
|
||||
|
||||
if geoms.pk == level_render_data.lowest_important_level:
|
||||
engine.darken(level_render_data.darken_area)
|
||||
|
||||
if not bbox.intersects(geoms.affected_area):
|
||||
continue
|
||||
|
||||
engine.add_group('level_%s' % geoms.short_label)
|
||||
|
||||
# hide indoor and outdoor rooms if their access restriction was not unlocked
|
||||
add_walls = hybrid_union(tuple(area for access_restriction, area in geoms.restricted_spaces_indoors.items()
|
||||
if access_restriction not in access_permissions))
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue