Development — arhitektura i povijest
Referentni tehnički vodič ZG Connect sustava: vizija, arhitektura, moduli i registar arhitekturnih odluka.
Početak projekta — vizija i ciljevi
ZG Connect je Unity 6 plugin za georeferenciranu 3D vizualizaciju grada Zagreba u mjerilu 1:1. Projekt je započeo kao Zagreb3D Connector s ciljem automatske izrade terrain grida poravnatog na 4 km master grid, s podrškom za inner zonu 4×4 km i outer zonu 8×8 km.
Definition of Done za vertikalni slice: end-to-end proces generiranja, preuzimanja heightmap/imagery, stitch & apply, cache i reproducibilan build. Unity verzija: 6000.3.8f1, RP-agnostično.
Koordinatni sustav i georeferenciranje
Primarni prostorni referentni sustav je EPSG:3765 (HTRS96 / Croatia TM). Unity world space koristi globalni anchor unity_origin_x / unity_origin_y — EPSG koordinate tile-a minus origin daju Unity X/Z pozicije.
Konverzija: unityX = sourceX - unity_origin_x; unityZ = sourceY - unity_origin_y. Tile ID format: {easting}_{northing} za donji lijevi kut pločice od 1 km.
Struktura podataka na disku
Vanjski _dataset folder sadrži heightmaps/ (RAW + metadata.json), basemaps/ (ortho ili tiled), building_meshes/ (GLB/FBX + JSON), vegetation_masks/ (RGBA PNG + rulesets) i osm_cache/. Svaka pločica ima metadata.json s originX, originY, minHeight, maxHeight i invalidRatio.
Unity generirani output ide u Assets/Generated/ZGConnect/ — TerrainData, prefabi, CityDataset ScriptableObject.
Editor pipeline
Editor workflow: DatasetManager skenira folder → korisnik odabire regiju i slojeve → Importer generira assete.
Vanjski _dataset
↓ ZGConnectDatasetManagerWindow (scan, selekcija)
↓ ZGConnectImporter (TerrainData, basemap, buildings)
↓ CityDataset + CityTile komponente
↓ Addressables migracija (opcionalno)
Ključne klase: ZGConnectDatasetManagerWindow, ZGConnectImporter, ZGConnectJsonModels, CityDataset.
Klasični runtime (Addressables)
TerrainStreamingController upravlja load/unload prstenom oko kamere. TerrainData se učitava preko Addressables; SetNeighbors održava šivove između pločica. BasemapController i BasemapSwitcher omogućuju crossfade između ortho, roadmap i tron stilova.
FlyCameraController i SceneLoadingController pokrivaju navigaciju i async učitavanje scene s progress barom.
Realtime runtime (StreamingAssets + gltfast)
Realtime put ne koristi pre-importane Unity assete. RealtimeDatasetPackager kopira RAW, ortho, GLB i maske u StreamingAssets te generira manifest.json. HlodMergeUtility priprema 2×2 i 4×4 supertile heightmape i ortho teksture za srednju i daleku udaljenost.
RealtimeStreamingController evaluira HLOD prstenove (1/2/4 km), učitava teren preko RuntimeTerrainFactory, zgrade preko RuntimeGlbLoader (gltfast), vegetaciju preko RuntimeVegetationMaskLoader.
Building sustav
Pipeline: Python pivot korekcija → Unity import GLB → BuildingSurfaceMeshProcessor (fasade) → BuildingRoofOrthophotoProcessor (ortho UV krovovi) → BuildingSharedMaterialApplier (shared materijali) → GLB export po pločici. BuildingMetadataApplier i OSM merge obogaćuju JSON metapodatke.
Vegetacija
osm_vegetation_masks.py generira RGBA maske (R=grmlje, G=visoko drveće, B=travnjak, A=putevi). VegetationInstanceGenerator koristi GPU instancing s VegetationRuleSet i VegetationSpeciesSet. VegetationGrowthAnimation i VegetationSpawnAnimationSettings pokrivaju vizualne efekte spawnanja.
Python pipeline
Python_tools/ sadrži 17 skripti za offline pripremu: GeoTIFF→RAW, DGU ortho download, OSM cache, splatmap generiranje, pivot korekcija zgrada i texture atlas. Detaljan workflow opisan u Workflow 1: Priprema podataka.
Mapa modula
91 C# datoteka u Editor/, Runtime/, RealtimeStreaming/. 17 Python alata u Python_tools/.
| Modul | Datoteke | Odgovornost |
|---|---|---|
| Editor import | ~25 | Dataset scan, terrain/building/vegetation import |
| Runtime klasični | ~35 | Streaming, basemap, buildings, vegetation |
| RealtimeStreaming | ~26 | Packager, HLOD, runtime factory/loaders |
| Python_tools | 17 | Offline geodata priprema |
Dual-track arhitektura
ZG Connect podržava dva paralelna runtime puta koji dijele isti vanjski dataset format. Klasični put koristi Unity Editor import → Addressables → TerrainStreamingController. Realtime put koristi packager → StreamingAssets manifest → RealtimeStreamingController s gltfast.
Oba puta dijele ZGConnectCoordinates, tile metadata ugovor i Python pripremu podataka. Odabir puta ovisi o cilju: produkcijski build s pre-baked assetima vs. brza iteracija iz vanjskog foldera.
Workflow pregled
Tri dokumentirana workflow-a pokrivaju cijeli lifecycle:
- Priprema podataka — Python/GDAL offline pipeline
- Klasični Unity import — Editor alati i Addressables
- Realtime streaming — Packager, HLOD, gltfast runtime
Trenutno stanje i otvorene točke
Implementirano: terrain import, basemap switching, Addressables streaming, building surface/roof pipeline, vegetacija GPU instancing, OSM metadata merge, RealTime Asset Importer s HLOD packagerom.
Planirano / otvoreno: buildings LOD Addressable streaming u klasičnom putu, SSE-inspired tile refinement, prošireni tiled splatmap u realtime daljini, CI/CD batch pipeline za Python alate.
Evolucija sustava
Kronološki pregled svih razvojnih faza s detaljnom SWOT analizom:
- Faza 0: Koncept Zagreb3D Connector
- Faza 1: DGU GeoTIFF RAW pipeline
- Faza 2: Korekcija pivot točaka zgrada
- Faza 3: Unity Editor terrain import
- Faza 4: OSM vegetacijske maske
- Faza 5: Addressables terrain streaming
- Faza 6: Teksture fasada i krovova (ortho UV)
- Faza 7: Tiled basemap / splatmap
- Faza 8: Revizija Addressables integracije
- Faza 9: Dinamička rezolucija terena i basemap-a
- Faza 10: Map extent i odabir regije
- Faza 11: Optimizacija importa zgrada
- Faza 12: Roof ortho, shared materijali, OSM metadata merge
- Faza 13: Vegetacija runtime i growth animacija
- Faza 14: RealTime Asset Importer i HLOD packager
- Faza 15: Tehnička projektna dokumentacija
Registar arhitekturnih odluka
| ID | Naslov | Status | Kontekst | Odluka | Alternative | Posljedice | Skripte |
|---|---|---|---|---|---|---|---|
| ADR-001 | EPSG:3765 kao jedini prostorni referentni sustav | accepted | ZG Connect vizualizira Zagreb pomoću službenih hrvatskih geopodataka. Svi izvori (DGU heightmap, ortofoto, zgrade) moraju dijeliti isti koordinatni sustav kako bi se pločice i modeli poravnali bez ruč… | Koristiti EPSG:3765 (HTRS96 / Croatia TM) za sve easting/northing vrijednosti u metadata.json, manifestima i editor alatima. WGS84 se koristi samo za prikaz GPS koordinata korisniku.… | WGS84 kao primarni sustav; Lokalni offset bez CRS metapodatka; EPSG:3857 web mercator |
|
ZGConnectCoordinates, ZGConnectJsonModels, geotiff_tiles_2_raw |
| ADR-002 | unity_origin kao globalni anchor za Unity world space | accepted | Unity koristi lokalni koordinatni sustav oko scene origin-a. Veliki EPSG brojevi uzrokuju floating-point greške ako se koriste izravno kao world pozicije.… | Svaki dataset definira unity_origin_x i unity_origin_y (EPSG easting/northing) koji mapiraju na Unity (0,0). ZGConnectCoordinates.Configure() postavlja OriginEasting i OriginNorthing pri učitavanju Ci… | Double-precision world koordinate bez origin-a; Per-tile lokalni origin bez globalnog anchor-a; Floating origin koji se pomiče s kamerom |
|
ZGConnectCoordinates, patch_heightmap_origin, patch_buildings_origin, StreamingDatasetManifest |
| ADR-003 | Pločice terena veličine 1×1 km | accepted | Cijeli grad Zagreb pokriva stotine kvadratnih kilometara. Potrebna je granularnost koja balansira broj datoteka, memoriju i streaming performanse.… | Standardna veličina pločice je 1000×1000 metara u EPSG:3765. Tile ID je {leftEasting}_{bottomNorthing}, npr. 459000_5070000.… | 512 m pločice; 2 km pločice; Hexagonal grid |
|
geotiff_tiles_2_raw, CityTile, HlodGridZones |
| ADR-004 | Heightmap rezolucija 1025×1025 (native DGU) | accepted | DGU GeoTIFF heightmap podaci dolaze u određenoj rezoluciji. Unity Terrain zahtijeva (2^n + 1) visinsku mrežu.… | Native import koristi 1025×1025 UInt16 RAW datoteke po pločici. Opcionalno 513 za downsampled preview ili HLOD supertileove niže razine.… | 513 kao default za sve; 2049 ultra-visoka rezolucija; Float32 RAW bez kvantizacije |
|
ZGConnectImporter, RealtimeDatasetPackager, geotiff_tiles_2_raw |
| ADR-005 | Vertikalni flip heightmap redoslijeda (GDAL → Unity) | accepted | GDAL i Unity Terrain koriste suprotan redoslijed redova (north→south vs south→north). Bez korekcije teren je zrcaljen po osi Z.… | FlipHeightmapVertically=true kao default u importeru i realtime packageru. Runtime DecodeRaw16 primjenjuje flip pri učitavanju RAW datoteka u GDAL redoslijedu.… | Flip u Python pipeline-u pri pisanju RAW; Bez flipa — ručna rotacija terena; Uvijek flip u editoru pri importu asseta |
|
ZGConnectImporter, RuntimeHeightmapUtility, RealtimeStreamingController |
| ADR-006 | UInt16 RAW format visinskih podataka | accepted | Potrebna je kompaktna reprezentacija visine s dovoljnom preciznošću za urbani teren Zagreba.… | Heightmap se sprema kao little-endian UInt16 RAW s min/max metapodatkom u metadata.json. Unity Y = (sample / 65535) * heightRange + minHeight.… | Float32 RAW; PNG 16-bit grayscale; Direct GeoTIFF u runtime-u |
|
geotiff_tiles_2_raw, ZGConnectJsonModels, RuntimeHeightmapUtility |
| ADR-007 | GDAL Python pipeline za GeoTIFF → pločice | accepted | Izvorni DGU podaci dolaze kao veliki GeoTIFF-ovi izvan Unity projekta. Unity Editor nije pogodan za masovnu reprojekciju i rezanje.… | Dvostupanjski Python pipeline: geotiff_2_tiff_tiles reže na TIFF pločice, geotiff_tiles_2_raw konvertira u Unity RAW + metadata.json.… | Unity Asset postprocessor za GeoTIFF; QGIS ručni export; C# GDAL bindings u editoru |
|
geotiff_2_tiff_tiles, geotiff_tiles_2_raw, patch_heightmap_origin |
| ADR-008 | MinHeight kao referenca za Unity Y elevaciju | accepted | Apsolutne nadmorske visine Zagreba (~100–400 m) ne odgovaraju Unity Y=0 na dnu scene.… | Globalni minimum visine dataseta postaje MinHeightMetres; Unity Y=0 predstavlja tu razinu. ZGConnectCoordinates.UnityYToElevation() vraća apsolutnu visinu.… | Y=0 na razini mora (0 m n.v.); Per-tile lokalni height offset; Bez vertikalnog offseta |
|
ZGConnectCoordinates, CityDataset, StreamingDatasetManifest |
| ADR-009 | Additive Unity Editor import umjesto full rebuild | accepted | Import cijelog grada traje satima i zahtijeva iterativno proširenje regije.… | ZGConnectImporter podržava SkipExisting=true: preskače pločice koje već imaju TerrainData asset. CityDataset se inkrementalno ažurira.… | Uvijek full rebuild; Odvojeni projekti po kvartu; Runtime-only bez editor asseta |
|
ZGConnectImporter, BatchImport, ZGConnectDatasetManagerWindow |
| ADR-010 | Terrain.SetNeighbors za šivanje rubova pločica | accepted | Susjedni Unity Terrain objekti bez SetNeighbors imaju vidljive šavove na granicama heightmap-a.… | SetTerrainNeighbors=true u import postavkama. Importer postavlja left/right/top/bottom susjede po EPSG grid indeksima nakon kreiranja TerrainData.… | Jedan mega-terrain; Ručno spajanje mesh-eva; Bez neighbor stitching — prihvatiti šavove |
|
ZGConnectImporter, TerrainStreamingController, RuntimeTerrainFactory |
| ADR-011 | EPSG region filter za selektivni import | accepted | Developeri testiraju na podskupovima grada. Import cijelog dataseta nije praktičan tijekom razvoja.… | FilterByRegion s MinE/MaxE/MinN/MaxN u EPSG metrima. Tile se uvozi samo ako AABB presjeca region. ZGConnectImportRegionBridge dijeli region između prozora.… | Ručni odabir tile ID liste; WGS84 bounding box; Import po udaljenosti od kamere u editoru |
|
ZGConnectImporter, ZGConnectImportRegionBridge, ZGConnectTileMapWindow, ZGConnectRealtimeStreamerWindow |
| ADR-012 | CityDataset ScriptableObject kao centralni registry pločica | accepted | Runtime streaming treba brzo lookup-ati tile metapodatke, prefabe, addressable ključeve i basemap slojeve.… | CityDataset asset sadrži listu CityTileRecord unosa generiranih pri importu. TerrainStreamingController i BuildingSharedMaterialApplier čitaju iz njega.… | JSON-only bez Unity asseta; Per-scene ručno postavljeni Terrain objekti; SQLite baza u projektu |
|
CityDataset, ZGConnectImporter, TerrainStreamingController |
| ADR-013 | CityTile komponenta na svakom terrain GameObject-u | accepted | Runtime logika treba lokalni pristup tile ID-u, bbox-u i referencama na zgrade/vegetaciju bez globalnog pretraživanja scene.… | AddCityTileComponents=true dodaje CityTile MonoBehaviour s tileId i EPSG granicama na svaki importirani terrain root.… | Samo CityDataset lookup po poziciji; Tag-based identifikacija; Parent grouping bez komponente |
|
CityTile, ZGConnectImporter, TerrainStreamingController |
| ADR-014 | Addressables za runtime učitavanje TerrainData | accepted | Cijeli grad u jednoj sceni premašuje VRAM i editor limite. Potrebno dinamičko učitavanje terena po kameri.… | TerrainData i povezani asseti registrirani su u Unity Addressables grupi. CityTileRecord.addressableKey referencira TerrainData. ZGConnectAddressablesMigrator popunjava prazne ključeve.… | Resources.Load; AssetBundle ručni build; Direct scene reference bez streaminga |
|
TerrainStreamingController, ZGConnectAddressablesMigrator, ZGConnectImporter |
| ADR-015 | Load ring s hysteresis za terrain streaming | accepted | Kamera na granici load zone uzrokuje thrashing — constant load/unload istih pločica.… | TerrainStreamingController koristi veći unload radius od load radiusa (hysteresis). Quality preseti podešavaju pixel error i basemap distance po udaljenosti.… | Isti radius za load i unload; Frustum-only culling bez distance ringa; Fixed set pločica oko spawn točke |
|
TerrainStreamingController, FlyCameraController, BasemapController |
| ADR-016 | Basemap distance LOD za ortho teksture | accepted | Basemap teksture na daljinu troše VRAM bez vidljive koristi. Korisnik je prijavio nisku rezoluciju pri približavanju.… | BasemapController dinamički mijenja detail distance i max texture size ovisno o udaljenosti kamere. Opcija za potpuno disable dinamičkog LOD-a.… | Fiksna max rezolucija uvijek; Samo mipmaps bez distance switcha; Bez basemap sloja — samo splatmap |
|
BasemapController, BasemapSwitcher, ZGConnectImporter |
| ADR-017 | OSM splatmap za više vizualnih stilova terena | accepted | Jedan ortho sloj ne omogućuje stilizirane prikaze (npr. parkovi, ceste, građevinsko područje) bez zamjene cijele teksture.… | osm_splatmap_generator i osm_ortho_splatmap_generator generiraju alphamap PNG po pločici. Importer bake-a u TerrainData alphamaps; BasemapSwitcher mijenja TerrainLayer set.… | Shader-based stylization na ortho; Ručno slikanje splatmapa; Samo jedan diffuse sloj |
|
osm_splatmap_generator, ZGConnectImporter, SplatmapTester, BasemapSwitcher |
| ADR-018 | Two-phase splatmap teksture (readable → compressed) | accepted | GetPixelBilinear zahtijeva readable uncompressed teksture pri importu. Runtime drži previše VRAM ako ostane uncompressed.… | Import koristi isReadable=true i uncompressed. Nakon bake-a u TerrainData, ConfigureSplatmapTextureRuntime komprimira i postavlja non-readable.… | Uvijek uncompressed; Bake iz vanjskog alata bez Unity GetPixel; Compute shader sampling |
|
ZGConnectImporter, RuntimeBasemapFactory |
| ADR-019 | OSM vegetacijske maske po pločici (RGBA kanali) | accepted | Proceduralna vegetacija treba znati gdje smije rasti (parkovi, šume, travnjaci) i gdje ne (ceste, zgrade).… | osm_vegetation_masks.py preuzima regionalni OSM cache, rasterizira RGBA maske i road JSON po 1 km pločici. unity_origin u metadata usklađen s heightmap postavkama.… | Satelitska segmentacija; Ručne maske u Photoshopu; Per-instance OSM query u runtime-u |
|
osm_vegetation_masks, ZGConnectVegetationMaskImporter, RuntimeVegetationMaskLoader |
| ADR-020 | GPU instancing za vegetaciju | accepted | Desetine tisuća stabala po vidljivoj regiji nije izvedivo s individual GameObject instancama.… | VegetationInstanceGenerator + VegetationChunkRenderer koriste Graphics.DrawMeshInstanced s chunkovima i ruleset seed-om. VegetationInstancingMaterialCache dijeli materijale.… | Unity Terrain trees/detail meshes; Individual prefab spawn; Nanite / DOTS entities (nije dostupno u svim targetima) |
|
VegetationInstanceGenerator, VegetationChunkRenderer, VegetationInstancingMaterialCache |
| ADR-021 | Empirijska korekcija pivot točaka zgrada | accepted | Izvorni FBX/GLB modeli zgrada imaju pivot na krivim pozicijama što uzrokuje offset pri tile placement-u.… | fix_building_pivots.py centrira mesh XZ i spušta pivot na dno. patch_buildings_origin ažurira JSON pozicije uz promjenu unity_origin.… | Ručna korekcija u Blenderu po modelu; Runtime offset u shaderu; Ignorirati pivot — prihvatiti offset |
|
fix_building_pivots, patch_buildings_origin, BuildingMeshProcessingUtility |
| ADR-022 | Building surface pipeline (fasada + krov submeshes) | accepted | Uvezene zgrade imaju generičke materijale. Potrebna je vizualna raznolikost fasada i krovova bez ručnog modeliranja.… | BuildingSurfaceMeshProcessor dijeli mesh na wall/roof, remapira UV i dodjeljuje teksture iz BuildingSurfaceSettings. ProcessBuildingSurfaces=true pri importu.… | Teksture u DCC alatu prije exporta; Triplanar bez UV splita; Samo albedo iz ortho bez fasada |
|
BuildingSurfaceMeshProcessor, BuildingSurfacePipeline, BuildingSurfaceSettings |
| ADR-023 | Ortho roof UV kao alternativni building stil | accepted | Fasade s proceduralnim teksturama ne daju fotorealistične krovove. Ortofoto tile pokriva stvarni izgled krovova.… | ProcessRoofOrthophotoUv opcija: samo krovovi, UV 0–1 preko cijelog tile bbox-a, diffuse iz ortho basemap teksture pločice.… | Full mesh ortho projection; Satelitski texture atlas za cijeli grad; Bez posebnog roof moda |
|
BuildingRoofOrthophotoProcessor, BuildingSharedMaterialApplier, StreamingDatasetManifest |
| ADR-024 | Shared building materijali umjesto embedded GLB materijala | accepted | Svaki GLB nosi vlastite materijale i teksture što multiplicira VRAM i draw calls pri tisućama zgrada.… | BuildingSharedMaterialApplier zamjenjuje materijale shared project materijalima na temelju imena izvornog materijala i BuildingCategory. Neprepoznati slotovi zadržavaju GLB materijal.… | MaterialPropertyBlock samo; Texture atlasing u packageru; Zadržati embedded materijale |
|
BuildingSharedMaterialApplier, BuildingMaterialSlotApplier, RealtimeStreamingController |
| ADR-025 | Per-tile GLB export zgrada za vanjski dataset | accepted | Tisuće zgrada ne smiju biti Unity prefabi u projektu ako se koristi realtime streaming s diska.… | ZGConnectBuildingExporterWindow i ZGConnectGlbExportUtility exportaju jedan GLB po tile-u s buildingId u imenu node-a i companion JSON metapodatcima.… | Jedan GLB za cijeli grad; FBX u Addressables; Procedural generiranje iz OSM |
|
ZGConnectBuildingExporterWindow, ZGConnectGlbExportUtility, RuntimeGlbLoader |
| ADR-026 | OSM metadata merge u building JSON | accepted | Izvorni building JSON ima GPS i geometriju. OSM cache dodaje adrese, tipove i dodatne tagove.… | match_buildings_osm.py spaja OSM podatke u postojeće per-tile JSON datoteke. GPS koordinate iz izvornog JSON-a se uvijek prenose; merge je pun, ne selektivan.… | Odvojeni OSM lookup u runtime-u; Samo novi JSON bez merge-a; Ručno uređivanje u QGIS |
|
match_buildings_osm, BuildingMetadataJson, BuildingData |
| ADR-027 | Staggered building aktivacija po X poziciji | accepted | Instant load cijelog tile-a zgrada uzrokuje frame spike. Vizualno je poželjan val aktivacije.… | TerrainStreamingController opcija aktivira zgrade deaktivirane, zatim sweep od tile min X do max X aktivira po lokaciji. BuildingHeightReveal animira scale Z 0→1.… | Random redoslijed aktivacije; Sve odjednom bez animacije; LOD umjesto stagger-a |
|
TerrainStreamingController, BuildingHeightReveal, ZGConnectStreamingControllerEditor |
| ADR-028 | Deferred Unity import za batch building prefabe | accepted | Import 200 tile-ova zgrada uzrokuje AssetDatabase refresh nakon svakog koraka — ekstremno sporo.… | Dvofazni import: prvo kreirati sve prefab strukture u memoriji/disk, zatim batch AssetDatabase operacije. Skip processed opcija preskače već bake-ane GLB-ove.… | AssetDatabase.StartAssetEditing oko cijelog batch-a; Bez Unity prefaba — samo GLB; Paralelni import procesi |
|
ZGConnectImporter, ZGConnectBakeProcessedBuildingsWindow, ZGConnectDatasetManagerWindow |
| ADR-029 | ZGConnectMapExtent za editor kartu i tile grid | accepted | Background tekstura karte i selektabilni tile grid moraju dijeliti isti EPSG extent inače se ne poklapaju.… | Default extent 442000–481000 E, 5061000–5079000 N usklađen s overview teksturom. ZGConnectTileMapWindow crta tileove unutar extent-a.… | Dinamički extent iz dataseta; WGS84 mapa bez EPSG overlay-a; Bez vizualne karte — samo numeric input |
|
ZGConnectMapExtent, ZGConnectTileMapWindow, ZGConnectMapPlaceholderUtility |
| ADR-030 | Unity 6 kao ciljana verzija engine-a | accepted | Projekt koristi moderne Unity API-je (Addressables, Terrain, glTFast paket) i treba dugoročnu podršku.… | Razvoj i dokumentacija pretpostavljaju Unity 6. Kompatibilnost sa starijim verzijama nije cilj.… | Unity 2022 LTS lock; Dual version support; Migracija na Godot/Unreal |
|
ZGConnectEditorBranding, ZGConnectDatasetManagerWindow |
| ADR-031 | Bez Cesium komponenti u streaming arhitekturi | accepted | Potreban je Google 3D Tiles stil streaminga s punom kontrolom nad podacima, licencama i performansama.… | Ne integrirati Cesium for Unity niti ovisiti o Cesium ion servisima. HLOD, manifest i custom loaderi implementiraju slične ideje interno.… | Cesium 3D Tiles native; Google Photorealistic 3D API; Mapbox Unity SDK |
|
RealtimeStreamingController, RealtimeDatasetPackager |
| ADR-032 | Realtime streaming put odvojen od klasičnog Addressables puta | accepted | Import tisuća building prefaba u Unity projekt nije održiv. Potreban runtime load iz vanjskog dataseta.… | Dva runtime puta: TerrainStreamingController + CityDataset + Addressables (klasični) i RealtimeStreamingController + StreamingAssets manifest + gltfast (realtime).… | Samo Addressables za sve; Samo realtime bez klasičnog; Hybrid s automatskom migracijom |
|
TerrainStreamingController, RealtimeStreamingController |
| ADR-033 | gltfast za runtime učitavanje GLB zgrada | accepted | Unity ugrađeni GLB importer nije dizajniran za streaming s diska bez importa u AssetDatabase.… | RuntimeGlbLoader koristi gltfast (GltfImport) za async učitavanje tile GLB datoteka iz packed dataset foldera.… | Unity GLTFast fork s custom shaderima; Assimp native plugin; Pre-import u Addressables |
|
RuntimeGlbLoader, BuildingLodController |
| ADR-034 | StreamingAssets manifest.json kao runtime registry | accepted | Realtime runtime mora znati koje pločice, supertileove, basemapove i HLOD razine postoje bez Unity asseta.… | StreamingDatasetManifest JSON u packed dataset root s verzijom, unityOrigin, tiles, supertiles, hlodLevels, availableBasemaps.… | Binary protobuf manifest; Directory scan bez manifesta; SQLite u StreamingAssets |
|
StreamingDatasetManifest, RealtimeDatasetPackager, RuntimeStreamingPaths |
| ADR-035 | HLOD piramida 1×1 / 2×2 / 4×4 km supertileovi | accepted | Učitavanje punih 1025 heightmap i ortho za desetke 1 km pločica istovremeno premašuje VRAM.… | Packager generira supertileove faktor 2 i 4 spajanjem heightmap i ortho. Runtime HlodRingEvaluator bira faktor po udaljenosti kamere. HlodMergeUtility u editoru.… | Unity Terrain LOD groups samo; Impostor billboards; Jedna niska rezolucija za sve |
|
HlodMergeUtility, HlodRingEvaluator, HlodGridZones |
| ADR-036 | Grid-aligned HLOD zone (L∞ rectangular metric) | accepted | Kružni load radius ne poravnava supertileove na grid što uzrokuje partial coverage i rupe.… | useGridAlignedHlodZones i useRectangularHlodDistances omogućuju square L∞ prstenove poravnate na 2× i 4× ćelije. HlodGridZones.BuildZones gradi zone1/2/4.… | Euclidean circular distance samo; Hex grid HLOD; Manual supertile placement |
|
HlodGridZones, RealtimeStreamingController, ZGConnectRealtimeStreamerWindow |
| ADR-037 | SkipExisting u realtime packageru za inkrementalni pack | accepted | Proširenje EPSG regije ne smije repackati postojeće pločice — operacija traje satima.… | SkipExisting=true preskače tile/supertile pack ako asset već postoji u output folderu. RealtimePackReuseUtility indeksira postojeći manifest.… | Checksum-based invalidation; Uvijek full repack; Git LFS za packed output |
|
RealtimePackReuseUtility, RealtimeDatasetPackager, ZGConnectRealtimeStreamerWindow |
| ADR-038 | Pack rezolucije: ortho 2048, HLOD downscale hijerarhija | accepted | Orthophoto i heightmap rezolucije moraju skalirati s HLOD faktorom da VRAM raste sublinearly.… | 1×1: height 1025, ortho do OrthoMaxResolution 2048. 2×2: height 513, ortho 1024. 4×4: height 257, ortho 512. OrthoCrunchCompression opcionalno.… | Ista rezolucija za sve faktore; Bez ortho na supertileovima; ETC2 umjesto crunch |
|
RealtimeDatasetPackager, HlodMergeUtility |
| ADR-039 | LOD1 box zgrade u pack vremenu | accepted | Puni LOD0 mesh na daljinu je preskup za render i load. Potreban je jednostavan proxy.… | PackBuildingLod=true generira LOD1 box geometriju u GLB hijerarhiji ili dual file modu preko BuildingLodPackUtility. BuildingLodController runtime switch.… | Unity LOD Group na importanim prefabima; Billboard impostori; Bez building LOD — cull samo |
|
BuildingLodPackUtility, BuildingLodController, RealtimeDatasetPackager |
| ADR-040 | Terrain AssetBundle po pločici (RuntimeTerrainBundleLoader) | accepted | Kreiranje TerrainData u runtime-u iz RAW svaki load je CPU-intenzivno.… | PackTerrainBundles=true gradi pre-baked TerrainData asset bundle po tile-u u RealtimeTerrainBundleBuilder. RuntimeTerrainBundleLoader učitava bundle.… | RAW → TerrainData svaki put; Addressables za realtime teren; Mesh terrain umjesto Unity Terrain |
|
RealtimeTerrainBundleBuilder, RuntimeTerrainBundleLoader, RealtimeDatasetPackager |
| ADR-041 | Deferred HLOD unload protiv terena bez šavova | accepted | Preuranjeno unload 1×1 leaf dok supertile još nije spreman uzrokuje bljeskove i neighbor rupe.… | ShouldDeferHlodUnload i ProcessDeferredHlodUnloads odgađaju unload dok coarse pokrivanje nije aktivno. UpdateLeafHlodTransitionVisibility upravlja prijelazima.… | Instant swap bez defer-a; Uvijek držati oba sloja; Crossfade shader između HLOD |
|
RealtimeStreamingController, RuntimeTerrainFactory |
| ADR-042 | DatasetFolderScanner za analizu vanjskog _dataset foldera | accepted | Korisnik pokazuje put do vanjskog dataseta; alat mora automatski otkriti heightmap, basemap, buildings, vegetation.… | ZGConnectRealtimeStreamerWindow koristi DatasetFolderScanner za detekciju izvora i popunjava UI checkboxe (terrain, ortho, tiled, buildings, vegetation).… | Ručni YAML config; Hardcoded putanje; Wizard bez skeniranja |
|
DatasetFolderScanner, ZGConnectRealtimeStreamerWindow |
| ADR-043 | 1 Unity unit = 1 metar | accepted | Fizikalna simulacija, kamera brzina i GPS prikaz zahtijevaju konzistentnu skalu.… | Teren pločice su 1000 Unity jedinica širine. EPSG metre se mapiraju 1:1 na X/Z nakon oduzimanja unity_origin.… | 1 unit = 100 m (centimetar style); Floating scale factor u settings; Non-uniform scale X/Z |
|
ZGConnectCoordinates, CityTile, FlyCameraController |
| ADR-044 | Regionalni OSM cache za više pipeline koraka | accepted | Više skripti (vegetation, splatmap, roads, building match) treba OSM podatke za istu regiju.… | download_osm_overview.py preuzima jedan regionalni Overpass JSON cache koji dijele osm_vegetation_masks, osm_splatmap_generator i match_buildings_osm.… | Per-tile Overpass query; Planet.osm puna baza; Commercial GIS servis |
|
download_osm_overview, osm_vegetation_masks, match_buildings_osm |
| ADR-045 | SceneLoadingController za async učitavanje glavne scene | accepted | Velika scena s CityDataset referencama treba progress UI pri prvom učitavanju.… | Odvojena splash scena s naslovom projekta i progress barom učitava glavnu scenu asinkrono preko SceneLoadingController.… | Direct play glavne scene; Addressables scene load bez UI; Static loading screen texture |
|
SceneLoadingController |
| ADR-046 | ZG Connect top-level editor menu | accepted | Alati raspršeni pod Unity Tools menu bili su teško uočljivi developerima.… | Svi editor prozori i menu itemi premješteni pod root ZG Connect menu s konzistentnim brandingom.… | Ostati pod Tools/; Custom EditorWindow hub samo; Toolbar overlay |
|
ZGConnectEditorBranding, ZGConnectDatasetManagerWindow, ZGConnectRealtimeStreamerWindow |
| ADR-047 | Manifest verzija 2 — GDAL redoslijed supertile heightmap-a | proposed | v1 supertile RAW spremljen je u Unity row order što je inkompatibilno s 1×1 tile flip logikom.… | Manifest version ≥2; UsesGdalSupertileHeightmaps() vraća true. Runtime ResolveHeightmapFlip() ne flip-a legacy v1 supertileove.… | Repack svih v1 dataseta bez verzije; Uvijek flip supertileove; Odvojeni flag po supertile |
|
StreamingDatasetManifest, RealtimeStreamingController, HlodMergeUtility |
| ADR-048 | Runtime tiled splatmap iz packed tile foldera | accepted | Klasični import bake-a splat u TerrainData asset. Realtime put gradi TerrainData u runtime-u iz RAW + splat PNG.… | RuntimeBasemapFactory.ApplyTiledSplatmaps primjenjuje splat teksture iz tile foldera na dinamički TerrainData. RealtimeStreamingController poziva pri tile preparer-u.… | Samo ortho basemap u realtime; Pre-baked splat u bundle bez runtime compose; Shader splat iz single ortho |
|
RuntimeBasemapFactory, RealtimeStreamingController, RuntimeTilePreparer |