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) ], )