Source code for openworld_radio_twin.simulation.building_context
"""Display meshes share the solver's coordinate and building placement contract."""
from openworld_radio_twin.environment import EnvironmentData
from openworld_radio_twin.models import (
BuildingFeature,
BuildingGeometryContext,
NativeBuildingMesh,
)
from openworld_radio_twin.simulation.scene_builder import LocalBuilding, localize_buildings
[docs]
def placed_building_geometry_context(
local_buildings: tuple[LocalBuilding, ...],
longitude: float,
latitude: float,
) -> BuildingGeometryContext | None:
"""Display meshes of buildings a compiled scene has already placed.
Equivalent to :func:`building_geometry_context` on the scene's source records,
without repeating the terrain footing of every shell.
"""
native = [local for local in local_buildings if local.native_vertices]
if not native:
return None
return BuildingGeometryContext(
origin_longitude=longitude,
origin_latitude=latitude,
meshes=[_native_mesh(local) for local in native],
)
def _native_mesh(local: LocalBuilding) -> NativeBuildingMesh:
return NativeBuildingMesh(
feature_id=local.feature_id,
vertices=[(x, y, z + local.terrain_anchor_m) for x, y, z in local.native_vertices],
triangles=list(local.native_triangles),
surface_types=list(local.native_surface_types),
lod=local.source_lod,
placement_rule=local.placement_rule,
)
[docs]
def building_geometry_context(
buildings: list[BuildingFeature],
longitude: float,
latitude: float,
environment: EnvironmentData | None = None,
) -> BuildingGeometryContext | None:
native = [building for building in buildings if building.geometry is not None]
if not native:
return None
return BuildingGeometryContext(
origin_longitude=longitude,
origin_latitude=latitude,
meshes=[
_native_mesh(local)
for local in localize_buildings(native, longitude, latitude, environment)
],
)