create doors_extended because walls_extended was non-watertight be design
This commit is contained in:
parent
b092d33a7c
commit
a90de12aba
2 changed files with 31 additions and 20 deletions
|
@ -216,7 +216,6 @@ class LevelRenderData:
|
||||||
new_geoms = LevelGeometries()
|
new_geoms = LevelGeometries()
|
||||||
new_geoms.doors = crop_to.intersection(old_geoms.doors)
|
new_geoms.doors = crop_to.intersection(old_geoms.doors)
|
||||||
new_geoms.walls = crop_to.intersection(old_geoms.walls)
|
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:
|
for altitudearea in old_geoms.altitudeareas:
|
||||||
new_geometry = crop_to.intersection(altitudearea.geometry)
|
new_geometry = crop_to.intersection(altitudearea.geometry)
|
||||||
|
@ -356,6 +355,7 @@ class LevelGeometries:
|
||||||
self.walls = None
|
self.walls = None
|
||||||
self.walls_extended = None
|
self.walls_extended = None
|
||||||
self.doors = None
|
self.doors = None
|
||||||
|
self.doors_extended = None
|
||||||
self.holes = None
|
self.holes = None
|
||||||
self.access_restriction_affected = None
|
self.access_restriction_affected = None
|
||||||
self.restricted_spaces_indoors = None
|
self.restricted_spaces_indoors = None
|
||||||
|
@ -460,7 +460,6 @@ class LevelGeometries:
|
||||||
for access_restriction, spaces in restricted_spaces_outdoors.items()}
|
for access_restriction, spaces in restricted_spaces_outdoors.items()}
|
||||||
|
|
||||||
geoms.walls = buildings_geom.difference(spaces_geom).difference(doors_geom)
|
geoms.walls = buildings_geom.difference(spaces_geom).difference(doors_geom)
|
||||||
geoms.walls_extended = buildings_geom.difference(spaces_geom)
|
|
||||||
|
|
||||||
# general level infos
|
# general level infos
|
||||||
geoms.pk = level.pk
|
geoms.pk = level.pk
|
||||||
|
@ -484,7 +483,6 @@ class LevelGeometries:
|
||||||
self.heightareas = tuple((HybridGeometry.create(area, face_centers), height)
|
self.heightareas = tuple((HybridGeometry.create(area, face_centers), height)
|
||||||
for area, height in self.heightareas)
|
for area, height in self.heightareas)
|
||||||
self.walls = HybridGeometry.create(self.walls, face_centers)
|
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.doors = HybridGeometry.create(self.doors, face_centers)
|
||||||
self.restricted_spaces_indoors = {key: HybridGeometry.create(geom, face_centers)
|
self.restricted_spaces_indoors = {key: HybridGeometry.create(geom, face_centers)
|
||||||
for key, geom in self.restricted_spaces_indoors.items()}
|
for key, geom in self.restricted_spaces_indoors.items()}
|
||||||
|
@ -599,20 +597,11 @@ class LevelGeometries:
|
||||||
# create polyhedrons
|
# create polyhedrons
|
||||||
self.walls_base = HybridGeometry(self.walls.geom, self.walls.faces)
|
self.walls_base = HybridGeometry(self.walls.geom, self.walls.faces)
|
||||||
self.walls_bottom = 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,
|
self.walls.build_polyhedron(self._create_polyhedron,
|
||||||
lower=vertex_altitudes - int(0.7 * 1000),
|
lower=vertex_altitudes - int(0.7 * 1000),
|
||||||
upper=vertex_wall_heights)
|
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():
|
for key, geometry in self.restricted_spaces_indoors.items():
|
||||||
geometry.crop_ids = frozenset(('in:%s' % key, ))
|
geometry.crop_ids = frozenset(('in:%s' % key, ))
|
||||||
for key, geometry in self.restricted_spaces_outdoors.items():
|
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(),
|
crops = tuple((crop, prepared.prep(crop.geom)) for crop in chain(self.restricted_spaces_indoors.values(),
|
||||||
self.restricted_spaces_outdoors.values()))
|
self.restricted_spaces_outdoors.values()))
|
||||||
|
|
||||||
|
self.doors_extended = HybridGeometry(self.doors.geom, self.doors.faces)
|
||||||
self.doors.build_polyhedron(self._create_polyhedron,
|
self.doors.build_polyhedron(self._create_polyhedron,
|
||||||
crops=crops,
|
crops=crops,
|
||||||
lower=vertex_wall_heights - int(1 * 1000),
|
lower=vertex_wall_heights - int(1 * 1000),
|
||||||
upper=vertex_wall_heights)
|
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:
|
for area in self.altitudeareas:
|
||||||
area.create_polyhedrons(self._create_polyhedron, crops=crops)
|
area.create_polyhedrons(self._create_polyhedron, crops=crops)
|
||||||
|
|
||||||
|
|
|
@ -86,6 +86,8 @@ class MapRenderer:
|
||||||
min_altitude = min(chain(*(tuple(area.altitude for area in geoms.altitudeareas)
|
min_altitude = min(chain(*(tuple(area.altitude for area in geoms.altitudeareas)
|
||||||
for geoms in levels))) - int(0.7*1000)
|
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:
|
for geoms in levels:
|
||||||
if not bbox.intersects(geoms.affected_area):
|
if not bbox.intersects(geoms.affected_area):
|
||||||
continue
|
continue
|
||||||
|
@ -100,7 +102,7 @@ class MapRenderer:
|
||||||
if access_restriction not in unlocked_access_restrictions)
|
if access_restriction not in unlocked_access_restrictions)
|
||||||
).union(add_walls)
|
).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')
|
engine.add_geometry(geoms.walls_base, fill=FillAttribs('#aaaaaa'), category='walls')
|
||||||
if min_altitude < geoms.min_altitude:
|
if min_altitude < geoms.min_altitude:
|
||||||
engine.add_geometry(geoms.walls_bottom.fit(scale=geoms.min_altitude-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:
|
if not add_walls.is_empty or not geoms.walls.is_empty:
|
||||||
walls = geoms.walls.union(add_walls)
|
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:
|
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),
|
top=not walls_extended),
|
||||||
height=geoms.default_height, fill=FillAttribs('#aaaaaa'), category='walls')
|
height=geoms.default_height, fill=FillAttribs('#aaaaaa'), category='walls')
|
||||||
|
|
||||||
if walls_extended:
|
if walls_extended:
|
||||||
engine.add_geometry(geoms.walls_extended, height=geoms.default_height, fill=FillAttribs('#aaaaaa'),
|
engine.add_geometry(geoms.walls_extended, fill=FillAttribs('#aaaaaa'), category='walls')
|
||||||
category='walls')
|
|
||||||
|
|
||||||
|
doors_extended = geoms.doors_extended and full_levels
|
||||||
if not geoms.doors.is_empty:
|
if not geoms.doors.is_empty:
|
||||||
engine.add_geometry(geoms.doors.difference(add_walls), fill=FillAttribs('#ffffff'),
|
engine.add_geometry(geoms.doors.difference(add_walls).filter(top=not doors_extended),
|
||||||
stroke=StrokeAttribs('#ffffff', 0.05, min_px=0.2), category='doors')
|
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:
|
if walls is not None:
|
||||||
engine.add_geometry(walls, stroke=StrokeAttribs('#666666', 0.05, min_px=0.2), category='walls')
|
engine.add_geometry(walls, stroke=StrokeAttribs('#666666', 0.05, min_px=0.2), category='walls')
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue