diff --git a/src/c3nav/mapdata/render/data.py b/src/c3nav/mapdata/render/data.py index e0a336cb..bb8ba87e 100644 --- a/src/c3nav/mapdata/render/data.py +++ b/src/c3nav/mapdata/render/data.py @@ -216,7 +216,6 @@ class LevelRenderData: new_geoms = LevelGeometries() new_geoms.doors = crop_to.intersection(old_geoms.doors) new_geoms.walls = crop_to.intersection(old_geoms.walls) - new_geoms.walls_extended = crop_to.intersection(old_geoms.walls_extended) for altitudearea in old_geoms.altitudeareas: new_geometry = crop_to.intersection(altitudearea.geometry) @@ -356,6 +355,7 @@ class LevelGeometries: self.walls = None self.walls_extended = None self.doors = None + self.doors_extended = None self.holes = None self.access_restriction_affected = None self.restricted_spaces_indoors = None @@ -460,7 +460,6 @@ class LevelGeometries: for access_restriction, spaces in restricted_spaces_outdoors.items()} geoms.walls = buildings_geom.difference(spaces_geom).difference(doors_geom) - geoms.walls_extended = buildings_geom.difference(spaces_geom) # general level infos geoms.pk = level.pk @@ -484,7 +483,6 @@ class LevelGeometries: self.heightareas = tuple((HybridGeometry.create(area, face_centers), height) for area, height in self.heightareas) self.walls = HybridGeometry.create(self.walls, face_centers) - self.walls_extended = HybridGeometry.create(self.walls_extended, face_centers) self.doors = HybridGeometry.create(self.doors, face_centers) self.restricted_spaces_indoors = {key: HybridGeometry.create(geom, face_centers) for key, geom in self.restricted_spaces_indoors.items()} @@ -599,20 +597,11 @@ class LevelGeometries: # create polyhedrons self.walls_base = HybridGeometry(self.walls.geom, self.walls.faces) self.walls_bottom = HybridGeometry(self.walls.geom, self.walls.faces) - + self.walls_extended = HybridGeometry(self.walls.geom, self.walls.faces) self.walls.build_polyhedron(self._create_polyhedron, lower=vertex_altitudes - int(0.7 * 1000), upper=vertex_wall_heights) - if interpolator is not None: - upper = interpolator(*np.transpose(self.vertices)).astype(np.int32) - int(0.7 * 1000) - self.walls_extended.build_polyhedron(self._create_polyhedron, - lower=vertex_wall_heights, - upper=upper, - bottom=False) - else: - self.walls_extended = None - for key, geometry in self.restricted_spaces_indoors.items(): geometry.crop_ids = frozenset(('in:%s' % key, )) for key, geometry in self.restricted_spaces_outdoors.items(): @@ -620,11 +609,26 @@ class LevelGeometries: crops = tuple((crop, prepared.prep(crop.geom)) for crop in chain(self.restricted_spaces_indoors.values(), self.restricted_spaces_outdoors.values())) + self.doors_extended = HybridGeometry(self.doors.geom, self.doors.faces) self.doors.build_polyhedron(self._create_polyhedron, crops=crops, lower=vertex_wall_heights - int(1 * 1000), upper=vertex_wall_heights) + if interpolator is not None: + upper = interpolator(*np.transpose(self.vertices)).astype(np.int32) - int(0.7 * 1000) + self.walls_extended.build_polyhedron(self._create_polyhedron, + lower=vertex_wall_heights, + upper=upper, + bottom=False) + self.doors_extended.build_polyhedron(self._create_polyhedron, + lower=vertex_wall_heights, + upper=upper, + bottom=False) + else: + self.walls_extended = None + self.doors_extended = None + for area in self.altitudeareas: area.create_polyhedrons(self._create_polyhedron, crops=crops) diff --git a/src/c3nav/mapdata/render/renderer.py b/src/c3nav/mapdata/render/renderer.py index 17820a63..730e671a 100644 --- a/src/c3nav/mapdata/render/renderer.py +++ b/src/c3nav/mapdata/render/renderer.py @@ -86,6 +86,8 @@ class MapRenderer: min_altitude = min(chain(*(tuple(area.altitude for area in geoms.altitudeareas) for geoms in levels))) - int(0.7*1000) + not_full_levels = not self.full_levels and engine.is_3d + full_levels = self.full_levels and engine.is_3d for geoms in levels: if not bbox.intersects(geoms.affected_area): continue @@ -100,7 +102,7 @@ class MapRenderer: if access_restriction not in unlocked_access_restrictions) ).union(add_walls) - if not self.full_levels and engine.is_3d: + if not_full_levels: engine.add_geometry(geoms.walls_base, fill=FillAttribs('#aaaaaa'), category='walls') if min_altitude < geoms.min_altitude: engine.add_geometry(geoms.walls_bottom.fit(scale=geoms.min_altitude-min_altitude, @@ -136,19 +138,24 @@ class MapRenderer: if not add_walls.is_empty or not geoms.walls.is_empty: walls = geoms.walls.union(add_walls) - walls_extended = geoms.walls_extended and self.full_levels and engine.is_3d + walls_extended = geoms.walls_extended and full_levels if walls is not None: - engine.add_geometry(walls.filter(bottom=(self.full_levels or not engine.is_3d), + engine.add_geometry(walls.filter(bottom=not not_full_levels, top=not walls_extended), height=geoms.default_height, fill=FillAttribs('#aaaaaa'), category='walls') if walls_extended: - engine.add_geometry(geoms.walls_extended, height=geoms.default_height, fill=FillAttribs('#aaaaaa'), - category='walls') + engine.add_geometry(geoms.walls_extended, fill=FillAttribs('#aaaaaa'), category='walls') + doors_extended = geoms.doors_extended and full_levels if not geoms.doors.is_empty: - engine.add_geometry(geoms.doors.difference(add_walls), fill=FillAttribs('#ffffff'), - stroke=StrokeAttribs('#ffffff', 0.05, min_px=0.2), category='doors') + engine.add_geometry(geoms.doors.difference(add_walls).filter(top=not doors_extended), + fill=FillAttribs('#ffffff'), + stroke=StrokeAttribs('#ffffff', 0.05, min_px=0.2), + category='doors') + + if doors_extended: + engine.add_geometry(geoms.doors_extended, fill=FillAttribs('#aaaaaa'), category='doors') if walls is not None: engine.add_geometry(walls, stroke=StrokeAttribs('#666666', 0.05, min_px=0.2), category='walls')