darken lower levels

This commit is contained in:
Laura Klünder 2017-12-20 12:21:44 +01:00
parent 07a1a79cc4
commit 26cb860efb
4 changed files with 37 additions and 4 deletions

View file

@ -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):

View file

@ -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

View file

@ -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:

View file

@ -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))