Changelog — kronologija razvoja
Tehnička kronologija ZG Connect projekta od koncepta do trenutnog stanja. Svaka faza sadrži SWOT analizu, donesene odluke i implementirane artefakte.
Faza 0 — Koncept Zagreb3D Connector (~2025-Q4)
Kontekst
U okviru PROJECT_PLAN-a definiran je Zagreb3D Connector — Unity 6 dodatak za georeferenciranu 3D vizualizaciju grada Zagreba. Vizija spaja službene DGU visinske i ortofoto podatke, vektorske modele zgrada te OpenStreetMap slojeve u jedinstveni editor-first pipeline s pločičnom arhitekturom od 1×1 km u EPSG:3765 (HTRS96 / Croatia TM). Cilj je omogućiti iterativni rad na djelomičnim regijama bez punog uvoza cijelog grada u jednu scenu.
Snage
- Jasna podjela na vanjsku pripremu podataka (Python/GDAL) i Unity Editor import
- Odabir EPSG:3765 usklađen s hrvatskim državnim geopodacima
- Pločični grid 1 km omogućuje paralelizaciju i inkrementalni razvoj
- Unity 6 kao stabilna platforma za velike terenske scene i Addressables
Slabosti
- Visoka početna složenost koordinatnog lanca EPSG:3765 ↔ Unity ↔ WGS84
- Ovisnost o vanjskom _dataset folderu izvan repozitorija
- Nedefiniran runtime put prije kasnijih faza streaminga
- Nedostaju standardizirani metadata.json ugovori po pločici
Prilike
- Ponovna upotreba postojećih Zagreb3D izvora zgrada i visina
- Modularni Python alati neovisni o Unity verziji
- Mogućnost dual-track arhitekture: klasični import i kasniji realtime put
- Integracija OSM-a za vegetaciju, ceste i obogaćivanje metapodataka
Rizici
- Pomak izvornog koordinatnog sustava zgrada u odnosu na DGU visine
- Veličina RAW i ortofoto resursa za cijeli Zagreb
- Regresije pri promjeni verzije Unity Terrain API-ja
- Različite rezolucije i CRS izvora podataka
Donesene odluke
| Odluka | Opis |
|---|---|
| EPSG:3765 kao primarni prostorni referentni sustav | Svi tile ID-evi, metadata.json i Unity world space koriste easting/northing u metrima; WGS84 samo za prikaz i OSM preuzimanje. |
| Pločice 1×1 km | Imenovanje foldera i asset ključeva prema donjem lijevom kutu pločice, npr. 464000_5070000. |
| Editor-first workflow | Teška obrada izvan Unityja; Editor alati za skeniranje dataseta, selekciju regije i generiranje CityDataset ScriptableObject-a. |
Implementirani artefakti
ZGConnectCoordinates, CityDataset, CityTile, ZGConnectJsonModels
Utjecaj na arhitekturu
Postavljen je temeljni arhitektonski okvir koji je usmjerio sve kasnije module: koordinatni sustav, pločična granularnost i odvajanje pripreme podataka od Unity uvoza. Bez ovih odluka kasniji GeoTIFF pipeline, terrain importer i streaming slojevi ne bi imali konzistentan ugovor o podacima.
Faza 1 — DGU GeoTIFF RAW pipeline (~2026-03)
Kontekst
Implementiran je dvostupanjski Python/GDAL lanac za pretvorbu DGU GeoTIFF visinskih modela u Unity-kompatibilne UInt16 RAW datoteke dimenzija 1025×1025 po pločici od 1 km. Prva faza reže izvorni GeoTIFF u TIFF pločice s georeferenciranim metadata.json; druga faza generira RAW heightmape i globalni origin patch za usklađivanje s Unity Terrain formatom.
Snage
- Determinističan offline pipeline bez ručnog rezanja u GIS alatima
- UInt16 RAW direktno kompatibilan s Unity TerrainData.ImportRaw
- metadata.json po pločici s originX, originY i minHeight
- Skalabilnost na stotine pločica kroz batch obradu
Slabosti
- Ovisnost o GDAL instalaciji i Python okruženju na radnoj stanici
- 1025×1025 rezolucija fiksna — nema automatskog LOD-a na ovoj razini
- Vertikalno flipanje heightmape mora biti dosljedno u cijelom lancu
- Veliki privremeni TIFF međuproizvodi zauzimaju disk
Prilike
- Ista struktura foldera kasnije koristi RealtimeDatasetPackager
- Patch skripte za origin omogućuju korekciju bez ponovnog rezanja GeoTIFF-a
- Integracija s DGU ortofoto pipelineom za isti grid
- Automatizacija CI/CD koraka priprema podataka
Rizici
- Pogrešan CRS u izvornom GeoTIFF-u daje tiho pomaknut teren
- NoData vrijednosti u visinama stvaraju artefakte na rubovima pločica
- Nepoklopljeni rubovi između susjednih RAW datoteka
- Promjena DGU formata izvornih datoteka
Donesene odluke
| Odluka | Opis |
|---|---|
| UInt16 RAW umjesto float TIFF u Unity | Heightmap se normalizira prema min/max visini pločice i sprema kao 16-bit RAW radi kompatibilnosti i manje veličine. |
| Dvofazni pipeline geotiff → tiles → raw | geotiff_2_tiff_tiles reže po gridu; geotiff_tiles_2_raw konvertira u RAW i piše metadata. |
| patch_heightmap_origin za globalni origin | WGS84 ↔ EPSG:3765 transformacija u patch skripti usklađuje dataset origin s CityDataset konfiguracijom. |
Implementirani artefakti
geotiff_2_tiff_tiles, geotiff_tiles_2_raw, patch_heightmap_origin
Utjecaj na arhitekturu
Omogućen je masovni uvoz službenih DGU visina u Unity bez ručnog rada. RAW pipeline postaje kritična pretpostavka za terrain importer, Addressables streaming i kasniji HLOD merge heightmapa u Realtime modulu.
Faza 2 — Korekcija pivot točaka zgrada (~2026-03)
Kontekst
Zagreb3D izvorni FBX/GLB modeli zgrada imali su pivot točke izvan geometrijskog centra i na pogrešnoj visini, što je uzrokovalo pomake u odnosu na teren i JSON metapodatke. Python alati centriraju mesh u XZ i postavljaju pivot na dno objekta, dok patch_buildings_origin reprojicira JSON koordinate iz WGS84 u EPSG:3765 i usklađuje s tile gridom.
Snage
- Offline korekcija prije Unity uvoza smanjuje editor vrijeme
- Per-building pivot na dnu i centru XZ odgovara arhitektonskoj praksi
- Empirijski FBX→Unity mapping dokumentiran u BuildingMeshProcessingUtility
- JSON pozicije ostaju konzistentne s transformacijom mesha
Slabosti
- Ručno verificiranje uzorka zgrada potrebno nakon batch obrade
- Različiti izvorni formati (FBX vs GLB) zahtijevaju različite puteve
- Rotacije krovova i fasada ovisne o ispravnom pivotu
- Veliki broj JSON datoteka po pločici usporava diff u verzioniranju
Prilike
- Isti JSON format kasnije obogaćen OSM metapodacima
- Integracija s GLB export pipelineom za processed varijante
- Automatska validacija preklapanja bounding boxa s OSM poligonima
- Batch reprocess kroz BuildingSurfaceReprocessMenu
Rizici
- Dvostruka korekcija pivot-a i origin-a može akumulirati pogreške
- Zgrade na strmom terenu zahtijevaju dodatno snimanje na visinu tla
- Izgubljene veze između building ID i izvornog mesh imena
- Nepreciznost WGS84 u JSON-u prije merge-a s OSM-om
Donesene odluke
| Odluka | Opis |
|---|---|
| Pivot na dnu i centru XZ | fix_building_pivots pomice geometriju tako da pivot leži na min Y i centroidu horizontalne projekcije. |
| Reprojekcija JSON koordinata u EPSG:3765 | patch_buildings_origin koristi WGS84↔3765 transformaciju i EU/US decimal format normalizaciju. |
| Unity-side BuildingMeshProcessingUtility | Editor utility za dodatnu obradu mesha pri importu processed GLB varijanti. |
Implementirani artefakti
fix_building_pivots, patch_buildings_origin, fix_buildings_json_decimals, BuildingMeshProcessingUtility
Utjecaj na arhitekturu
Geometrijska usklađenost zgrada s terenom omogućena je masovni import stambeno-poslovnih objekata. Bez ove faze roof ortho UV, shared materijali i runtime GLB streaming ne bi imali pouzdane world pozicije.
Faza 3 — Unity Editor terrain import (~2026-04)
Kontekst
Razvijen je ZGConnectImporter i prateći Dataset Manager za skeniranje vanjskog _dataset foldera, uvoz RAW heightmapa u TerrainData, dodjelu ortho TerrainLayer tekstura i registraciju pločica u CityDataset ScriptableObject-u. Podržani su additive import, SkipExisting, SetNeighbors za šivove i FilterByRegion za djelomične uvode.
Snage
- Centralizirani editor prozor za cijeli dataset lifecycle
- Automatsko SetNeighbors sprječava vidljive rubove između terena
- CityTile komponenta enkapsulira tileId i referencu na Terrain
- JSON modeli (ZGConnectJsonModels) standardiziraju metadata parsing
Slabosti
- Import velikog broja pločica blokira Editor thread
- TerrainData asseti brzo povećavaju veličinu projekta
- Ručna konfiguracija basemap putanja po dataset verziji
- Nema ugrađene validacije RAW dimenzija prije ImportRaw
Prilike
- BatchImport za ponavljanje uvoza nakon ažuriranja dataseta
- Integracija s map extent prozorom za vizualni odabir pločica
- Migracija TerrainData u Addressables (sljedeća faza)
- Generiranje placeholder karte za editor navigaciju
Rizici
- ImportRaw s krivim byte orderom daje šum na terenu
- Duplicirani TerrainLayer asseti po pločici povećavaju memoriju
- CityDataset drift ako se ručno brišu asseti iz Generated foldera
- Vertikalno flipanje zaboravljeno u novim dataset verzijama
Donesene odluke
| Odluka | Opis |
|---|---|
| Additive import s SkipExisting | Ponovni scan ne prepisuje postojeće TerrainData osim ako korisnik eksplicitno force-a reimport. |
| Flip heightmap vertically pri ImportRaw | Unity Terrain očekuje drugačiju Y orijentaciju od GDAL RAW izlaza; flip je obavezan korak u importeru. |
| FilterByRegion na EPSG:3765 granicama | Import ograničen pravokutnikom u metrima usklađenim s tile gridom. |
Implementirani artefakti
ZGConnectImporter, ZGConnectDatasetManagerWindow, ZGConnectJsonModels, CityDataset, BatchImport
Utjecaj na arhitekturu
Editor terrain import pretvorio je pripremljene RAW podatke u Unity scene spremne za vizualizaciju. CityDataset postaje centralni registar svih pločica i temelj za kasniji TerrainStreamingController i Realtime manifest.
Faza 4 — OSM vegetacijske maske (~2026-04)
Kontekst
Python alat osm_vegetation_masks preuzima OpenStreetMap podatke za zadani bbox, rasterizira RGBA maske po pločici (različiti kanali za tipove vegetacije, parkove, vode) te generira road JSON za kasniju upotrebu. Unity strana ZGConnectVegetationMaskImporter učitava maske u Texture2D resurse, a download_osm_overview omogućuje brži jedinstveni OSM download za pregled regije.
Snage
- Per-tile RGBA maske kompatibilne s GPU instancing pipelineom
- Jedinstveni OSM cache smanjuje ponovna preuzimanja za ceste i zgrade
- VegetationRuleSet omogućuje deklarativno definiranje vrsta po kanalu
- Determinističko sijanje preko DeterministicHash po tile koordinatama
Slabosti
- Rasterizacija velikih regija spora u odnosu na overview download
- OSM podaci nepotpuni za pojedinačna stabla u urbanim zonama
- Veličina PNG maski po pločici na disk-u
- Ručna sinkronizacija bbox-a s map extentom
Prilike
- match_buildings_osm za obogaćivanje building JSON-a iz istog cache-a
- VegetationGrowthAnimation za vizualni prikaz aktivacije
- Chunk renderer s draw distance postavkama
- Reuse maski u Realtime RuntimeVegetationMaskLoader
Rizici
- Promjene OSM tag sheme lome rasterizacijska pravila
- Overpass rate limiting pri velikim bbox-ovima
- Pomak OSM geometrije u odnosu na DGU ortofoto
- Alpha kanal konflikti između preklapajućih landuse poligona
Donesene odluke
| Odluka | Opis |
|---|---|
| RGBA kanali za kategorije vegetacije | R/G/B/A mapiraju različite VegetationRule tipove; importer čita isti layout u editoru i runtime-u. |
| GPU instancing umjesto GameObject stabala | VegetationInstanceGenerator koristi Graphics.DrawMeshInstancedIndirect za tisuće instanci po chunku. |
| ZGConnectVegetationTilesExporter za bbox listu | Editor exporter generira tile listu koju Python skripta koristi za iteraciju preuzimanja. |
Implementirani artefakti
osm_vegetation_masks, download_osm_overview, ZGConnectVegetationMaskImporter, ZGConnectVegetationTilesExporter, VegetationInstanceGenerator
Utjecaj na arhitekturu
Proceduralna vegetacija na stvarnim OSM poligonima znatno poboljšala je vizualnu vjerodostojnost scene bez ručnog postavljanja prefaba. Maske i road JSON postaju shared resurs za splatmap generiranje i kasniji realtime streaming.
Faza 5 — Addressables terrain streaming (~2026-05)
Kontekst
TerrainStreamingController implementira runtime učitavanje i isključivanje TerrainData pločica prema udaljenosti kamere s hysteresis prstenovima. ZGConnectAddressablesMigrator registrira TerrainData i povezane assete u Addressables grupe; FlyCameraController služi za navigaciju i testiranje load/unload prstenova. Quality presets kontroliraju daljinu i broj aktivnih pločica.
Snage
- Scena ne mora sadržavati cijeli grad — samo ring oko kamere
- Addressables omogućuje asinkrono učitavanje bez blokiranja main threada
- SetNeighbors održava šivove pri dinamičkom load/unload
- Integracija s CityDataset addressableKey poljima
Slabosti
- Prazni addressableKey u starijim CityDataset zapisima
- Prvi build Addressables kataloga zahtijeva ručni korak
- Hysteresis parametri zahtijevaju ručno podešavanje po hardveru
- Nema HLOD piramide na ovom putu — samo 1×1 km tereni
Prilike
- Streaming zgrada i vegetacije u istom kontroleru
- SceneLoadingController za boot scena s progress barom
- Dinamička rezolucija basemap-a (faza 9)
- Dual path: Addressables za produkciju, Realtime za iteraciju
Rizici
- Memory spike pri učitavanju više susjednih pločica odjednom
- Addressables hash mismatch nakon reimporta TerrainData
- Pop-up vidljivih rubova ako SetNeighbors zakasni
- Prevelik load ring na slabijem GPU-u
Donesene odluke
| Odluka | Opis |
|---|---|
| Load ring / unload hysteresis | Odvojene udaljenosti za učitavanje i isključivanje sprječavaju thrashing na granici prstena. |
| Addressables za TerrainData | TerrainData asseti izvan scene; učitavanje preko AsyncOperationHandle. |
| Quality presets za load distance | SerializeField profili za blizu/srednje/daleko testiranje bez code promjena. |
Implementirani artefakti
TerrainStreamingController, ZGConnectAddressablesMigrator, FlyCameraController, ZGConnectStreamingControllerEditor
Utjecaj na arhitekturu
Omogućena je interaktivna navigacija kroz velike dijelove Zagreba bez učitavanja cijelog grada u memoriju. Addressables integracija postavila je temelj za kasniju reviziju ključeva i usporednu Realtime HLOD arhitekturu.
Faza 6 — Teksture fasada i krovova (ortho UV) (~2026-05)
Kontekst
BuildingSurfaceMeshProcessor i BuildingSurfaceTextureGenerator implementiraju pipeline za custom teksture fasada i krovova pri importu zgrada. BuildingRoofOrthophotoProcessor postavlja UV krovova prema cijeloj pločici i mapira DGU ortofoto kao roof teksturu. BuildingSharedMaterialApplier i GLB export po pločici omogućuju processed varijante spremne za runtime.
Snage
- Surface pipeline odvaja fasade, krovove i temelje po material slotovima
- Ortho roof UV daje fotorealistične krovove iz istog tile ortofotoa
- BuildingRoofUvRotation za korekciju rotacije krovne ravnine
- Export processed GLB smanjuje runtime obradu
Slabosti
- Dugotrajno procesiranje velikog broja pločica u Editoru
- Svaka zgrada inicijalno nosi vlastite materijale iz GLB-a
- Ovisnost o kvaliteti ortofotoa (sjene, sezonske varijacije)
- UV artefakti na složenim krovnim geometrijama
Prilike
- Shared material atlas za cijelu mapu (faza 12)
- Skip processed opcija za inkrementalni reimport
- RuntimeGlbLoader s gltfast bez Unity importa
- BuildingHeightReveal animacija pri aktivaciji
Rizici
- Duplicirane teksture po pločici povećavaju VRAM
- Pogrešna roof klasifikacija u mesh segmentaciji
- Ortofoto offset u odnosu na visinski model
- Regresija UV-a pri reprocess-u bez verzioniranja processed foldera
Donesene odluke
| Odluka | Opis |
|---|---|
| Surface pipeline po material tipu | BuildingSurfaceMaterialType i BuildingSurfacePipeline određuju koji mesh segmenti dobivaju koje teksture. |
| Ortho roof UV iz tile ortofotoa | Krovovi se UV mapiraju u [0,1] prostoru cijele 1 km pločice; tekstura je ortho.png te pločice. |
| GLB export po pločici | ZGConnectGlbExportUtility i BuildingExporterWindow generiraju TileBuildings_*.glb za vanjski dataset. |
Implementirani artefakti
BuildingSurfaceMeshProcessor, BuildingRoofOrthophotoProcessor, BuildingSurfaceTextureGenerator, BuildingSharedMaterialApplier, ZGConnectBuildingGlbSave, ZGConnectGlbExportUtility
Utjecaj na arhitekturu
Vizualna kvaliteta zgrada značajno je porasla bez ručnog modeliranja tekstura. Processed GLB varijante i roof ortho UV postali su prerekvizit za runtime streaming zgrada i kasniji LOD1 box paket u HLOD modulu.
Faza 7 — Tiled basemap / splatmap (~2026-05)
Kontekst
BasemapController i BasemapSwitcher omogućuju više vizualnih stilova terena kroz alphamap blending umjesto jednog ortho sloja. Python alati osm_splatmap_generator i osm_ortho_splatmap_generator generiraju težine splat kanala iz OSM landuse/coverage podataka; SplatmapTester u Editoru validira rezultate po pločici.
Snage
- Runtime prebacivanje stilova bez reimporta heightmapa
- OSM-derived težine daju semantički smislen terrain paint
- Tiled pristup usklađen s 1 km gridom
- Alphamap blending kompatibilan s Unity TerrainLayer stackom
Slabosti
- Splat rezolucija ograničena na Terrain alphamap resolution
- Generiranje splatmapa za cijeli grad traje dugo
- Ručno usklađivanje TerrainLayer referenci u sceni
- Basemap rezolucija na početku fiksna — niska na blizini (riješeno u fazi 9)
Prilike
- Dinamička basemap rezolucija po udaljenosti kamere
- Kombinacija ortho + splat hibridni stil
- Integracija u RuntimeBasemapFactory za Realtime put
- download_basemap za vanjske tile servise
Rizici
- Alphamap overflow ako suma težina kanala prelazi 1
- Diskrepancija OSM i DGU granica landuse poligona
- Prevelik broj TerrainLayer-a usporava shader
- Stari ortho-only materijali u postojećim scenama
Donesene odluke
| Odluka | Opis |
|---|---|
| Alphamap blending umjesto single ortho | BasemapSwitcher mijenja aktivne TerrainLayer težine prema odabranom stilu. |
| OSM-derived splat weights | Python generatori reprojiciraju OSM u EPSG:3765 i rasteriziraju težine po pločici. |
| SplatmapTester u Editor meniju | Brza vizualna provjera splat kanala prije punog dataset batch-a. |
Implementirani artefakti
BasemapController, BasemapSwitcher, osm_splatmap_generator, osm_ortho_splatmap_generator, SplatmapTester, ZGConnectBasemapControllerEditor
Utjecaj na arhitekturu
Terenski prikaz više nije ograničen na jedan ortofoto sloj — omogućeni su stilizirani i semantički prikazi. Splat pipeline povezuje OSM priprema podataka s Unity Terrain render sustavom i kasnije s dinamičkom rezolucijom basemap-a.
Faza 8 — Revizija Addressables integracije (2026-06-01)
Kontekst
Provedena je analiza kako CityDataset pohranjuje addressableKey po pločici i kako TerrainStreamingController koristi te ključeve pri AsyncOperationHandle učitavanju. Utvrdilo se da mnogi zapisi imaju prazne ključeve nakon ručnog importa bez pokretanja migratora. Dokumentirani su koraci: scan → import → migrator → build kataloga → runtime test.
Snage
- Jasna veza CityTile.tileId ↔ Addressables entry
- ZGConnectAddressablesMigrator automatizira registraciju
- TerrainStreamingController već podržava async load API
- CityDataset centralizira metadata za oba runtime puta
Slabosti
- Ručni koraci lako se preskoče u dev workflow-u
- Nedostaje automatska validacija praznih ključeva pri scan-u
- Katalog rebuild nakon svakog batch importa
- Dvostruko održavanje: lokalni asset path i addressable key
Prilike
- Hook u ZGConnectImporter koji automatski poziva migrator
- Validacijski report u Dataset Manager prozoru
- Shared addressing shema s Realtime manifest GUID-ovima
- CI provjera da svi tile-ovi u regiji imaju ključ
Rizici
- Runtime load failure bez jasne greške korisniku
- Stale katalog u buildu koji referencira obrisane TerrainData
- Miješanje lokalnih i remote Addressables grupa
- Regresija pri upgrade-u Addressables paketa u Unity 6
Donesene odluke
| Odluka | Opis |
|---|---|
| addressableKey obavezan nakon migracije | Svaki CityTile zapis mora imati ključ formata usklađenog s TerrainData asset imenom. |
| Dokumentiran workflow scan → migrator → build | Redoslijed operacija dodan u development dokumentaciju i workflow HTML stranice. |
| Fallback na direktnu referencu u editor play modu | TerrainStreamingController podržava lokalne reference kad Addressables nisu buildani. |
Implementirani artefakti
CityDataset, TerrainStreamingController, ZGConnectAddressablesMigrator, ZGConnectImporter
Utjecaj na arhitekturu
Razjašnjena je Addressables integracija i uklonjena je nejasnoća oko praznih ključeva. Tim je dobio reproducibilan postupak za pouzdano runtime streamanje terena prije uvođenja dinamičke rezolucije i Realtime HLOD alternativnog puta.
Faza 9 — Dinamička rezolucija terena i basemap-a (2026-06-02)
Kontekst
TerrainStreamingController proširen je parametrizacijom heightmap i basemap rezolucije ovisno o udaljenosti kamere. BasemapController sada podržava više rezolucijskih profila s pragovima aktivacije; dodan je boolean za potpuno isključivanje dinamičke promjene. SceneLoadingController implementira boot scenu s naslovom projekta i progress barom za učitavanje glavne scene.
Snage
- Poboljšana vizualna kvaliteta pri zumniranju bez više pločica
- Eksplicitni SerializeField pragovi udaljenosti za tuning
- Master disable flag za debug i usporedbe performansi
- Boot scena poboljšava UX pri velikom Addressables preload-u
Slabosti
- Rezolucijska tranzicija može uzrokovati kratki visual pop
- Više rezolucija povećava broj TerrainData varijanti na disk-u
- Basemap promjena zahtijeva ponovno učitavanje alphamap tekstura
- Kompleksniji inspector za TerrainStreamingController
Prilike
- Ista logika prenosiva na Realtime HLOD heightmap piramidu
- Automatsko generiranje multi-res RAW u Python pipelineu
- Quality settings povezivanje s dinamičkim profilima
- Profiling overlay za aktivnu rezoluciju po pločici
Rizici
- Memory spike pri swap-u visoke rezolucije
- Race condition load/unload tijekom rezolucijske promjene
- Neusklađene rezolucije heightmap vs basmap na istoj pločici
- Korisnik zaboravi enable-ati dinamiku nakon testiranja
Donesene odluke
| Odluka | Opis |
|---|---|
| Udaljenosni pragovi za rezolucijske razine | SerializeField distance thresholds određuju kada se aktivira srednja i visoka heightmap/basemap rezolucija. |
| enableDynamicResolution master toggle | Jedan boolean potpuno gasi dinamičku promjenu za stabilno debug okruženje. |
| SceneLoadingController boot flow | Odvojena scena s progress barom async učitava glavnu scenu i inicijalizira CityDataset. |
Implementirani artefakti
TerrainStreamingController, BasemapController, SceneLoadingController, ZGConnectStreamingControllerEditor
Utjecaj na arhitekturu
Riješen je problem niske vizualne kvalitete terena pri bliskoj kameri bez povećanja broja istovremeno učitanih pločica. Dinamička rezolucija postala je uzor za HLOD piramidu u Realtime modulu i poboljšala je percipiranu kvalitetu demo scena.
Faza 10 — Map extent i odabir regije (2026-06-02)
Kontekst
ZGConnectMapExtent definira defaultni EPSG:3765 bbox (442000–481000 / 5061000–5079000) usklađen s pozadinskom kartom. ZGConnectTileMapWindow i ZGConnectImportRegionBridge omogućuju vizualni odabir pločica; importer dobio je predefinirane regije „Granice grada Zagreba“ i „Centar grada“ u WGS84 koordinatama. ZGConnectMapPlaceholderUtility generira placeholder teksturu za editor mapu.
Snage
- Sinkroniziran grid selekcije s pozadinskom teksturom
- WGS84 preset regije za brzi odabir bez ručnog unosa
- Tile map prozor s rectangle selekcijom
- ImportRegionBridge dijeljen između Dataset Managera i Importera
Slabosti
- Ručno generiranje pozadinske teksture za novi extent
- Hardkodirani default bbox zahtijeva code change za druge gradove
- Moguće neusklađenosti ako se extent promijeni bez nove teksture
- Tile map UI zahtijeva veliku editor teksturu u memoriji
Prilike
- Automatski download preview karte iz DGU/OSM servisa
- Spremanje korisničkih preset regija u ScriptableObject
- Isti extent koristi Realtime DatasetFolderScanner
- Export selekcije u JSON za Python batch alate
Rizici
- Odabir pločica izvan dostupnog dataseta daje prazne load operacije
- Pogrešan Y flip u map teksturi pomice vizualni grid
- Prevelik rectangle selekcije blokira Editor pri importu
- GPS preset granice ne poklapaju se s tile grid poravnanjem
Donesene odluke
| Odluka | Opis |
|---|---|
| Default extent 442000–481000 × 5061000–5079000 | ZGConnectMapExtent konstante usklađene s dostupnom pozadinskom kartom cijele radne regije. |
| Predefinirane WGS84 regije u importeru | Granice Zagreba (45.724–45.901 / 15.818–16.109) i Centar kao quick-select opcije. |
| Rectangle tile selekcija u TileMapWindow | Korisnik vizualno odabire podskup pločica; ImportRegionBridge prosljeđuje bbox importeru. |
Implementirani artefakti
ZGConnectMapExtent, ZGConnectTileMapWindow, ZGConnectImportRegionBridge, ZGConnectMapPlaceholderUtility, ZGConnectDatasetManagerWindow
Utjecaj na arhitekturu
Odabir regije za import postao je intuitivan i vizualno usklađen s podacima. Smanjen je rizik uvoza pogrešnog bbox-a i ubrzan je rad na djelomičnim podskupovima grada, što je kritično za iteracije na ~50 pločica umjesto cijelog dataseta.
Faza 11 — Optimizacija importa zgrada (2026-06-03)
Kontekst
Import ~200 building pločica u Editoru traje predugo zbog Unity import ciklusa po prefabu. Implementirana je odgođena AssetDatabase operacija — kreiranje svih prefabova prije finalnog refresh/import koraka. Dodana je opcija „Skip processed“ za uvoz samo pločica bez processed GLB varijante te ZGConnectBakeProcessedBuildingsWindow za batch bake. Riješene su greške SaveAsPrefabAsset null pri masovnom uvozu.
Snage
- Odgođeni Unity import smanjuje ukupno vrijeme batch operacije
- Skip processed omogućuje inkrementalni rad na novim pločicama
- Manji broj pločica (~50) kao operativna preporuka za dev cikluse
- Bake prozor za centralizirano procesiranje processed varijanti
Slabosti
- I dalje ovisnost o Editor single-thread performansama
- SaveAsPrefabAsset null edge case na specifičnim putanjama
- Processed GLB moraju već imati riješene UV-ove za punu uštedu
- Nema paralelnog importa izvan Unity API ograničenja
Prilike
- Potpuni prelazak na runtime GLB streaming bez Unity importa
- Background bake queue s progress reportingom
- Validacija prije SaveAsPrefabAsset da spriječi null
- BuildingImportSettings profili po regiji
Rizici
- Nepotpuni prefabi ako se odgođeni refresh prekine
- Stale processed flagovi nakon ručne promjene GLB datoteka
- Memory pressure pri 200+ tile batch-u
- Regresija building metadata ako se preskoči reimport
Donesene odluke
| Odluka | Opis |
|---|---|
| Odgođeni AssetDatabase refresh | ZGConnectImporter kreira sve prefab GameObject-e prije jednog consolidated import koraka. |
| Skip processed opcija | Importer preskače pločice koje već imaju processed GLB u dataset folderu. |
| Operativni limit ~50 pločica po batch-u | Preporuka za razvojne cikluse dok se ne završi runtime streaming put. |
Implementirani artefakti
ZGConnectImporter, BuildingImportSettings, ZGConnectBakeProcessedBuildingsWindow, ZGConnectBuildingExporterWindow, BuildingSurfaceReprocessMenu
Utjecaj na arhitekturu
Vrijeme importa zgrada smanjeno je do razine koja omogućuje dnevne iteracije na reprezentativnim podskupovima grada. Optimizacije su direktno motivirale razvoj Realtime GLB streaming puta kao dugoročno rješenje bez Unity asset importa.
Faza 13 — Vegetacija runtime i growth animacija (2026-06-04 – 2026-06-05)
Kontekst
VegetationChunkRenderer i VegetationInstancingMaterialCache implementiraju GPU instanced rendering s draw distance postavkama. VegetationGrowthAnimation i VegetationSpawnAnimationSettings omogućuju animirano pojavljivanje vegetacije pri učitavanju pločice. BuildingHeightReveal dodaje staggered aktivaciju zgrada po X poziciji s Y-scale animacijom. TerrainStreamingController proširen opcijama za sekvencijalnu aktivaciju instanci.
Snage
- GPU instancing skalira na desetke tisuća instanci po chunku
- Determinističko sijanje reproducibilno po tileId
- Growth animacija poboljšava percepciju učitavanja
- Staggered building reveal smanjuje frame spike pri tile load-u
Slabosti
- Vegetation mask kvaliteta ograničava gustoću u urbanim zonama
- Draw distance tuning potreban po platformi
- Growth animacija dodaje CPU overhead za state tracking
- Nema individual tree podataka iz OSM-a u većini zona
Prilike
- VegetationDrawDistanceSettings profili po quality tier-u
- Integracija s Realtime RuntimeVegetationMaskLoader
- Sezonske varijacije preko VegetationSpeciesSet
- Road network spline sustav koristeći isti OSM cache
Rizici
- Overdraw u gustim parkovima na niskom GPU-u
- Floating vegetation na krivo postavljenom terenu
- Animacija zgrada konflikt s physics collider aktivacijom
- Chunk boundary pop-in bez cross-tile blending
Donesene odluke
| Odluka | Opis |
|---|---|
| GPU instancing po VegetationChunk | VegetationInstanceGenerator popunjava chunk buffer; VegetationChunkRenderer submit-a draw calls. |
| VegetationGrowthAnimation pri tile aktivaciji | Scale/alpha animacija od 0 do 1 prema VegetationSpawnAnimationMode postavkama. |
| Staggered building reveal po X sweep-u | BuildingHeightReveal aktivira zgrade kad sweep linija prođe njihovu X poziciju; scale Y animacija. |
Implementirani artefakti
VegetationChunkRenderer, VegetationGrowthAnimation, VegetationDrawDistanceSettings, VegetationInstancingMaterialCache, BuildingHeightReveal, TerrainStreamingController, ZGConnectStreamingControllerEditor
Utjecaj na arhitekturu
Runtime scena dobila je živahnost kroz animirano pojavljivanje vegetacije i zgrada umjesto trenutnog pop-in-a. Performanse ostaju kontrolirane GPU instancingom, a UX pri streamingu pločica značajno je poboljšan.
Faza 14 — RealTime Asset Importer i HLOD packager (2026-06-07)
Kontekst
Novi RealtimeStreaming modul analizira vanjski _dataset folder (DatasetFolderScanner), pakira resurse u StreamingAssets manifest (RealtimeDatasetPackager) i runtime učitava teren, GLB zgrade i vegetaciju bez Unity asset importa. HlodMergeUtility generira 2×2 i 4×4 supertile heightmape i ortho; HlodRingEvaluator i RealtimeStreamingController implementiraju HLOD piramidu 1/2/4 km s grid-aligned L∞ prstenovima. RuntimeGlbLoader koristi gltfast; BuildingLodPackUtility generira LOD1 box proxy.
Snage
- Eliminacija Unity importa za zgrade — direktno GLB s diska
- HLOD 1×1 / 2×2 / 4×4 smanjuje broj draw callova u daljini
- Vlastita implementacija bez vanjskih geospatial plugin komponenti
- Manifest-driven arhitektura omogućuje hot-swap dataseta
- RealtimePackReuseUtility ubrzava ponovno pakiranje
Slabosti
- VRAM pritisak pri više istovremenih 1×1 terena u blizini
- Packaging korak dodaje vrijeme prije runtime testiranja
- gltfast ograničenja na specifične GLB extensione
- Kompleksniji debug bez Unity Inspector pregleda imported mesh-a
Prilike
- Google 3D Tiles inspirirani ring evaluator (bez Cesium ovisnosti)
- Tint basemap po HLOD faktoru za vizualni debug
- Async tile preparer pipeline (RuntimeTilePreparer)
- BuildingLodController za udaljenosni swap full mesh ↔ LOD1 box
Rizici
- Manifest verzija nekompatibilna sa starijim StreamingAssets buildom
- Supertile seam artefakti na HlodMergeUtility rubovima
- GLB materijal override interakcija s shared material applierom
- Prekomjerno učitavanje 1×1 umjesto 4×4 u širokom FOV-u
Donesene odluke
| Odluka | Opis |
|---|---|
| Bez vanjskih geospatial plugin komponenti | Cijeli Realtime put koristi vlastite C# module; nema third-party globe/tile plugin ovisnosti. |
| HLOD piramida 1 / 2 / 4 km | HlodMergeUtility spaja heightmape i ortho u supertile; manifest bilježi StreamingHlodLevel load distance. |
| gltfast za runtime GLB | RuntimeGlbLoader učitava TileBuildings_*.glb izmanifestiranih putanja bez AssetDatabase. |
| LOD1 box u packageru | BuildingLodPackUtility generira pojednostavljene proxy mesh-eve za udaljene zgrade. |
| Grid-aligned L∞ HLOD zone | useRectangularHlodDistances i useGridAlignedHlodZones osiguravaju da supertile padaju na km grid. |
Implementirani artefakti
ZGConnectRealtimeStreamerWindow, RealtimeDatasetPackager, HlodMergeUtility, RealtimeTerrainBundleBuilder, BuildingLodPackUtility, DatasetFolderScanner, RealtimeStreamingController, HlodRingEvaluator, RuntimeGlbLoader, RuntimeTerrainBundleLoader, StreamingDatasetManifest
Utjecaj na arhitekturu
RealTime modul otvara drugi runtime put paralelan s Addressables streamom — brža iteracija na vanjskom datasetu bez rasta Unity projekta. HLOD piramida omogućuje prikaz velikog broja pločica oko kamere s kontroliranim VRAM troškom, što je ključni korak prema produkcijskoj skalabilnosti cijelog Zagreba.
Faza 15 — Tehnička projektna dokumentacija (2026-06-07)
Kontekst
Generiran je cross-linkani HTML dokumentacijski sustav pokrivajući C# i Python module, workflow stranice (priprema podataka, klasični import, realtime streaming), changelog i development pregled. generate_docs.py parsira izvorni kod u symbol-index.json; doc_common.py centralizira konvencije. Dokumentacija pokriva 91 C# i 20 Python skripti s potpisima, sažetcima i međuovisnostima.
Snage
- Jedinstveni HTML izlaz s navigacijom i breadcrumb-ovima
- Cross-linkovi između skripti, workflow-a i changelog faza
- symbol-index.json za pretragu simbola i call grafova
- Workflow stranice povezuju Python pripremu s Unity koracima
- validate_links.py za provjeru integriteta linkova
Slabosti
- Generiranje zahtijeva Python okruženje na dev mašini
- Dokumentacija treba ručni regen nakon većih refaktora
- Neki raniji moduli pokriveni rekonstrukcijom iz koda
- Nema automatskog CI koraka za docs build
Prilike
- timeline-entries.json za interaktivni development timeline
- Integracija docs builda u Unity pre-build hook
- API reference export u PDF za vanjske partnere
- Automatsko ažuriranje changelog-a iz git history-a
Rizici
- Zastarjeli HTML ako se zaboravi regeneracija
- Broken cross-linkovi nakon premještanja datoteka
- Symbol index veličina usporava preglednik na slabijim uređajima
- Divergencija između koda i dokumentiranog ponašanja
Donesene odluke
| Odluka | Opis |
|---|---|
| HTML kao primarni docs format | Staticki HTML s assets/style.css i nav.js; pregledavanje lokalno bez servera. |
| generate_docs.py iz izvornog koda | Automatski parser C# i Python datoteka generira stranice po simbolu. |
| Tri workflow dokumenta | 01-priprema-podataka, 02-klasicni-import, 03-realtime-streaming pokrivaju cijeli pipeline. |
| ZG Connect top-level Editor meni | Svi editor alati premješteni iz Tools dropdowna u ZG Connect root meni (ZGConnectEditorBranding). |
Implementirani artefakti
generate_docs, doc_common, validate_links, symbol-index, development, changelog, 01-priprema-podataka, 02-klasicni-import, 03-realtime-streaming, ZGConnectEditorBranding
Utjecaj na arhitekturu
Projekt je dobio održivu tehničku bazu znanja koja povezuje sve faze razvoja — od GeoTIFF pipelinea do Realtime HLOD streama. Dokumentacija smanjuje onboarding vrijeme, olakšava odluke o refaktoringu i služi kao referenca za buduće proširenje na druge gradove ili produkcijski deployment.