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/.

ModulDatotekeOdgovornost
Editor import~25Dataset scan, terrain/building/vegetation import
Runtime klasični~35Streaming, basemap, buildings, vegetation
RealtimeStreaming~26Packager, HLOD, runtime factory/loaders
Python_tools17Offline 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:

  1. Priprema podataka — Python/GDAL offline pipeline
  2. Klasični Unity import — Editor alati i Addressables
  3. 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:

Registar arhitekturnih odluka

IDNaslovStatusKontekstOdlukaAlternativePosljediceSkripte
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
  • Jedinstvena konverzija u ZGConnectCoordinates
  • Python alati moraju reprojicirati OSM iz WGS84
  • Tile ID format {easting}_{northing} ostaje konzistentan
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
  • Svi tileovi dijele isti anchor
  • patch_heightmap_origin.py omogućuje migraciju starog origin-a
  • Python match_buildings_osm testira više origin modova
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
  • HLOD piramida 2×2 i 4×4 naturalno skalira na 2 km i 4 km supertileove
  • SetNeighbors radi između susjednih 1 km pločica
  • Import region filter koristi AABB presjek s tile bbox-om
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
  • ~2 MB RAW po pločici
  • Realtime packager default 1025 za 1×1, 513 za 2×2, 257 za 4×4
  • Importer nudi dropdown 513/1025
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
  • Legacy v1 supertile paketi imaju drugačiji redoslijed — manifest verzija ≥2 koristi GDAL order
  • ResolveHeightmapFlip() u runtime kontroleru
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
  • Brže I/O od float formata
  • Globalni minHeight postavlja Unity Y=0 na razinu mora dataset minimuma
  • Patch skripte ažuriraju unity_position uz origin
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
  • Dataset ostaje van Assets foldera
  • Importer čita gotove RAW foldere
  • patch_heightmap_origin za migracije
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
  • Manji float error na Y koordinatama
  • Manifest i CityDataset nose minHeight/maxHeight
  • GPS HUD prikaz koristi istu konverziju
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
  • BatchImport i region filter omogućuju ciljane dopune
  • Realtime put koristi isti SkipExisting princip u packageru
  • Potrebna konzistentnost tile ID-eva
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
  • Runtime streaming mora ponovno pozvati SetNeighbors pri dinamičkom load-u
  • RuntimeTerrainFactory.SetNeighborsByBounds u realtime putu
  • Susjedi izvan učitane regije ostaju null
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
  • Predefinirane regije: Granice grada Zagreba, Centar grada
  • Tile map prozor vizualizira selekciju
  • Realtime packager koristi isti EPSG filter s HLOD poravnanjem
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
  • Importer CreateCityDatasetAsset opcija
  • Addressable ključevi se popunjavaju migratorom
  • Realtime put koristi manifest.json umjesto CityDataset
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
  • TerrainStreamingController koristi CityTile za udaljenost i load
  • Building i vegetation prefabi referenciraju isti tileId
  • Editor alati filtriraju po komponenti
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
  • Load/unload ring s hysteresis u TerrainStreamingController
  • Build pipeline zahtijeva Addressables build
  • Realtime put koristi StreamingAssets umjesto Addressables za teren
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
  • Stabilniji runtime bez flickera
  • Više pločica u memoriji nego minimalno potrebno
  • FlyCameraController za test navigacije
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
  • Bolji balans VRAM/kvaliteta
  • BasemapSwitcher omogućuje više vizualnih stilova
  • Import BasemapMaxTextureSize=2048 default
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
  • Two-phase splatmap import: readable pri bake, compressed runtime
  • SplatmapTester editor alat za validaciju
  • Realtime packager uključuje splat u tile bundle
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
  • 4–16× manji VRAM po tile splat teksturi
  • Dva koraka u importer pipeline-u
  • Isti princip u runtime basemap factory
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
  • ZGConnectVegetationMaskImporter u Unity
  • RuntimeVegetationMaskLoader u realtime putu
  • VegetationPlacementValidator koristi road podatke
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)
  • DeterministicHash za reproducibilne pozicije
  • Draw distance settings po vrsti
  • Growth animation opcionalno na aktivaciji
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
  • BuildingMeshProcessingUtility u editoru
  • match_buildings_osm testira origin modove
  • GLB export koristi ispravljene koordinate
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
  • BuildingSurfacePipeline koordinira korake
  • Variant seed po buildingId za determinističke teksture
  • Reprocess menu za postojeće prefabe
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
  • BuildingMaterialApplyStyle.OrthoRoof u runtime-u
  • RealtimeBuildingStyle.OrthoRoof u packageru
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
  • Primjenjuje se u TerrainStreamingController i RealtimeStreamingController
  • Roof ortho cache po tile+basemapId
  • Manji memory footprint
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
  • RuntimeGlbLoader učitava tile GLB s gltfast
  • BuildingMetadataApplier popunjava BuildingData
  • DualFile LOD storage opcija u manifestu
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
  • BuildingData proširen OSM poljima
  • BuildingMetadataApplier pri importu/runtime
  • Verbose merge log u Python skripti
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
  • Konfigurabilna brzina aktivacije
  • Zgrada ostaje inactive do reda u sweep-u
  • Opcionalno height reveal
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
  • ZGConnectBakeProcessedBuildingsWindow
  • SaveAsPrefabAsset error handling
  • Preporuka ~50 tile-ova po batch-u za dev
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
  • ZGConnectMapPlaceholderUtility generira placeholder
  • Import region bridge sync s map prozorom
  • Promjena extent-a utječe na prikaz, ne na podatke
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
  • Editor branding i menu pod ZG Connect top-level
  • API izbor bez legacy fallback-a
  • Package manifest vezan uz U6
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
  • Potpuna kontrola pack pipeline-a
  • Više vlastitog koda za HLOD i streaming
  • Dataset ostaje lokalni u _dataset / StreamingAssets
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
  • Paralelni development oba puta
  • Dijeljeni ZGConnectCoordinates i building materijali
  • Različiti terrain load mehanizmi
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
  • GLB mora biti pre-processed (UV, materijali)
  • SharedMaterialApplier nakon load-a
  • BuildingLodController za LOD switch
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
  • Incremental pack ažurira manifest
  • Version ≥2 označava GDAL supertile heightmap order
  • LoadFromFile pri startup-u kontrolera
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
  • Hlod2HeightRes=513, Hlod4HeightRes=257
  • Hlod2OrthoRes=1024, Hlod4OrthoRes=512
  • Supertile skriva child 1×1 dok je aktivan
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
  • Supertile mora stati u outer zone i izvan inner zone
  • AlignRegionToHlodGrid u pack prozoru
  • Debug tint po HLOD faktoru
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
  • Regija se može širiti iterativno
  • Ručno brisanje tile foldera forsira rebuild
  • Pruned tiles izvan aligned region
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
  • Manji bundle size na daljinu
  • Vidljiv quality drop na HLOD4 pri zoom-u
  • Pack progress faze Tiles/Hlod/Bundles
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
  • Hierarchy vs DualFile storage u manifestu
  • Samo HLOD 1×1 tileovi nose zgrade
  • Box dimensions iz building bounds
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
  • Veći disk footprint, brži load
  • Bundle staging folder tiles_2x2/tiles_4x4
  • Pack progress faza Bundles
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
  • Privremeno više memorije pri prijelazu
  • SetNeighborsByBounds nakon load-a
  • Manje vidljivih pop-in artefakata
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
  • Jedan entry point za pack
  • SelectedTileIds subset
  • Heightmap metadata obavezan za pack
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
  • FlyCameraController brzina u m/s smislu
  • HLOD distance u metrima u manifestu
  • Building dimenzije u realnim metrima
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
  • Brži follow-up pipeline koraci
  • Cache ne sadrži sve tree node tipove za individual trees
  • Reprojekcija u EPSG:3765 u Python-u
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
  • Bolji UX pri cold start-u
  • Dodatna scena u build settings
  • Ne utječe na runtime streaming logiku
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 centralizira stil
  • Dataset Manager, Tile Map, Realtime Streamer na jednom mjestu
  • BatchImport pod istim menujem
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
  • Migracija starih packova na v2
  • Backward compat kod u kontroleru
  • HlodMergeUtility piše GDAL order za v2+
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
  • Paritet vizualnih stilova između puteva
  • Dodatni I/O pri tile load-u
  • Splat lookup iz manifest tile entry
RuntimeBasemapFactory, RealtimeStreamingController, RuntimeTilePreparer