From 90f3327e5cbb918f4bbeca6a1bb03e0f6eb04cfe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Laura=20Kl=C3=BCnder?= Date: Fri, 10 Nov 2017 00:25:27 +0100 Subject: [PATCH] render bases if full_levels is not set --- src/c3nav/mapdata/render/data.py | 28 ++++++++++++++++++++++++++++ src/c3nav/mapdata/render/renderer.py | 8 ++++++++ 2 files changed, 36 insertions(+) diff --git a/src/c3nav/mapdata/render/data.py b/src/c3nav/mapdata/render/data.py index 87dbb182..e0b8a997 100644 --- a/src/c3nav/mapdata/render/data.py +++ b/src/c3nav/mapdata/render/data.py @@ -66,6 +66,14 @@ class HybridGeometry: if crop_id not in other.crop_ids}, crop_ids=self.crop_ids - other.crop_ids) + def fit(self, bottom, top): + offset = np.array((0, 0, bottom)) + scale = np.array((1, 1, top-bottom)) + return HybridGeometry(geom=self.geom, crop_ids=self.crop_ids, + faces=tuple((faces*scale+offset) for faces in self.faces), + add_faces={crop_id: tuple((faces*scale+offset) for faces in self.faces) + for crop_id, faces in self.add_faces}) + @property def is_empty(self): return not self.faces and not any(self.add_faces.values()) @@ -230,9 +238,15 @@ class LevelRenderData: if not new_area.is_empty: new_geoms.restricted_spaces_outdoors[access_restriction] = new_area + new_geoms.level_base = unary_union((new_geoms.walls, + *(area.geometry for area in new_geoms.altitudeareas))) + new_geoms.pk = old_geoms.pk new_geoms.on_top_of_id = old_geoms.on_top_of_id + new_geoms.base_altitude = old_geoms.base_altitude new_geoms.default_height = old_geoms.default_height + new_geoms.min_altitude = float(min(area.altitude for area in new_geoms.altitudeareas) + if new_geoms.altitudeareas else new_geoms.base_altitude) new_geoms.build_mesh() @@ -289,9 +303,14 @@ class LevelGeometries: self.restricted_spaces_outdoors = None self.affected_area = None + self.level_base = None + self.optional_base = None + self.pk = None self.on_top_of_id = None + self.base_altitude = None self.default_height = None + self.min_altitude = None @staticmethod def build_for_level(level): @@ -382,7 +401,10 @@ class LevelGeometries: # general level infos geoms.pk = level.pk geoms.on_top_of_id = level.on_top_of_id + geoms.base_altititude = level.base_altitude geoms.default_height = level.default_height + geoms.min_altitude = float(min(area.altitude for area in geoms.altitudeareas) + if geoms.altitudeareas else level.base_altitude) return geoms @@ -402,6 +424,7 @@ class LevelGeometries: for key, geom in self.restricted_spaces_indoors.items()} self.restricted_spaces_outdoors = {key: HybridGeometry.create(geom, face_centers) for key, geom in self.restricted_spaces_outdoors.items()} + self.level_base = HybridGeometry.create(self.level_base, face_centers) def _build_vertex_values(self, area_values): vertex_values = np.empty(self.vertices.shape[:1], dtype=np.int32) @@ -504,6 +527,11 @@ class LevelGeometries: for key, geometry in self.restricted_spaces_outdoors.items(): geometry.faces = None + self.optional_base = HybridGeometry(self.level_base.geom, self.level_base.faces) + self.level_base.build_polyhedron(self._create_polyhedron, + bottom=self.min_altitude-0.8, top=vertex_altitudes-0.6) + self.optional_base.build_polyhedron(self._create_polyhedron, bottom=0, top=1) + """ for area in self.altitudeareas: area.create_hybrid_geometries(face_centers) diff --git a/src/c3nav/mapdata/render/renderer.py b/src/c3nav/mapdata/render/renderer.py index 0f53b9e0..3935545d 100644 --- a/src/c3nav/mapdata/render/renderer.py +++ b/src/c3nav/mapdata/render/renderer.py @@ -83,6 +83,8 @@ class MapRenderer: else: levels = self.level_render_data.levels + min_altitude = float(min(chain(*(tuple(area.altitude for area in geoms.altitudeareas) for geoms in levels)))) + for geoms in levels: if not bbox.intersects(geoms.affected_area): continue @@ -95,6 +97,12 @@ class MapRenderer: if access_restriction not in unlocked_access_restrictions) ).union(add_walls) + if not self.full_levels: + engine.add_geometry(geoms.level_base, fill=FillAttribs('#aaaaaa')) + if min_altitude < geoms.min_altitude: + engine.add_geometry(geoms.optional_base.fit(min_altitude, geoms.min_altitude+0.05), + fill=FillAttribs('#aaaaaa')) + # render altitude areas in default ground color and add ground colors to each one afterwards # shadows are directly calculated and added by the engine for altitudearea in geoms.altitudeareas: