@navaramap/three 0.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (350) hide show
  1. package/LICENSE +8 -0
  2. package/dist/assets/atmosphere/README.md +1 -0
  3. package/dist/assets/atmosphere/higher_order_scattering.bin +0 -0
  4. package/dist/assets/atmosphere/higher_order_scattering.exr +0 -0
  5. package/dist/assets/atmosphere/irradiance.bin +0 -0
  6. package/dist/assets/atmosphere/irradiance.exr +0 -0
  7. package/dist/assets/atmosphere/scattering.bin +0 -0
  8. package/dist/assets/atmosphere/scattering.exr +0 -0
  9. package/dist/assets/atmosphere/single_mie_scattering.bin +0 -0
  10. package/dist/assets/atmosphere/single_mie_scattering.exr +0 -0
  11. package/dist/assets/atmosphere/stars.bin +0 -0
  12. package/dist/assets/atmosphere/transmittance.bin +0 -0
  13. package/dist/assets/atmosphere/transmittance.exr +0 -0
  14. package/dist/assets/cloud/README.md +1 -0
  15. package/dist/assets/cloud/local_weather.png +0 -0
  16. package/dist/assets/cloud/shape.bin +1 -0
  17. package/dist/assets/cloud/shape_detail.bin +1 -0
  18. package/dist/assets/cloud/turbulence.png +0 -0
  19. package/dist/assets/fontWorker-CEJEfRpb.js +2 -0
  20. package/dist/assets/fontWorker-CEJEfRpb.js.map +1 -0
  21. package/dist/assets/index-BUB-ijMO.js +12 -0
  22. package/dist/assets/index-BUB-ijMO.js.map +1 -0
  23. package/dist/assets/navara_wasm_font_worker_bg-665OLxjy.wasm +0 -0
  24. package/dist/assets/navara_wasm_worker_bg-BXhKC5bE.wasm +0 -0
  25. package/dist/assets/noise/README.md +1 -0
  26. package/dist/assets/noise/stbn.bin +0 -0
  27. package/dist/assets/water/README.md +3 -0
  28. package/dist/assets/water/waternormals.jpg +0 -0
  29. package/dist/index.d.ts +10114 -0
  30. package/dist/index.js +34481 -0
  31. package/dist/index.js.map +1 -0
  32. package/dist/index.umd.cjs +6345 -0
  33. package/dist/index.umd.cjs.map +1 -0
  34. package/package.json +95 -0
  35. package/src/Color.ts +111 -0
  36. package/src/ShadowMapViewers.ts +49 -0
  37. package/src/atmosphere.test.ts +76 -0
  38. package/src/atmosphere.ts +364 -0
  39. package/src/bufferView.ts +90 -0
  40. package/src/camera.ts +182 -0
  41. package/src/concurrency.ts +15 -0
  42. package/src/constants/assets.ts +30 -0
  43. package/src/constants/decoder.ts +7 -0
  44. package/src/constants/index.ts +2 -0
  45. package/src/core/BaseDesc.ts +142 -0
  46. package/src/core/BaseHandle.ts +126 -0
  47. package/src/core/DescRegistry.ts +88 -0
  48. package/src/core/EffectDesc.ts +343 -0
  49. package/src/core/EffectDescRegistry.ts +31 -0
  50. package/src/core/InstancedMeshDesc.ts +413 -0
  51. package/src/core/LightDesc.ts +216 -0
  52. package/src/core/LightDescRegistry.ts +32 -0
  53. package/src/core/MeshDesc.ts +457 -0
  54. package/src/core/MeshDescRegistry.ts +32 -0
  55. package/src/core/MeshDescWithSelectiveEffect.ts +129 -0
  56. package/src/core/Registries.ts +59 -0
  57. package/src/core/SelectiveEffectRegistry.ts +90 -0
  58. package/src/core/ViewContext.ts +235 -0
  59. package/src/core/errors.ts +16 -0
  60. package/src/core/index.ts +50 -0
  61. package/src/device.ts +414 -0
  62. package/src/effects/CustomEffectPass.ts +28 -0
  63. package/src/effects/copy.ts +10 -0
  64. package/src/effects/effect.ts +87 -0
  65. package/src/effects/index.ts +4 -0
  66. package/src/effects/render.ts +10 -0
  67. package/src/evaluations/FeatureEvaluator.ts +529 -0
  68. package/src/evaluations/index.ts +1 -0
  69. package/src/event/HillshadeContext.test.ts +232 -0
  70. package/src/event/HillshadeContext.ts +299 -0
  71. package/src/event/context.ts +279 -0
  72. package/src/event/feature.ts +357 -0
  73. package/src/event/featureEvent.ts +81 -0
  74. package/src/event/features/billboard.ts +30 -0
  75. package/src/event/features/model.ts +192 -0
  76. package/src/event/features/modelGpuBytes.test.ts +69 -0
  77. package/src/event/features/modelGpuBytes.ts +87 -0
  78. package/src/event/features/point.ts +25 -0
  79. package/src/event/features/polygon.ts +23 -0
  80. package/src/event/features/polygonOutline.ts +19 -0
  81. package/src/event/features/polyline.ts +19 -0
  82. package/src/event/features/text.ts +71 -0
  83. package/src/event/hillshade.test.ts +842 -0
  84. package/src/event/hillshade.ts +588 -0
  85. package/src/event/index.ts +700 -0
  86. package/src/event/loaders.ts +53 -0
  87. package/src/event/tile.ts +19 -0
  88. package/src/event/worker.ts +999 -0
  89. package/src/event/workerTaskSettlement.test.ts +243 -0
  90. package/src/event/workerTaskSettlement.ts +128 -0
  91. package/src/inMemoryBufferStore.test.ts +60 -0
  92. package/src/inMemoryBufferStore.ts +67 -0
  93. package/src/index.iife.ts +11 -0
  94. package/src/index.ts +2556 -0
  95. package/src/input.ts +144 -0
  96. package/src/layer.ts +183 -0
  97. package/src/layers/effect/FinalCopyEffectDesc.ts +29 -0
  98. package/src/layers/effect/MRTPassEffectDesc.ts +105 -0
  99. package/src/layers/effect/README.md +9 -0
  100. package/src/layers/effect/SelectiveEffectDesc.ts +113 -0
  101. package/src/layers/effect/SkyEnvMapEffectDesc.ts +58 -0
  102. package/src/layers/effect/TransparentPassEffectDesc.ts +62 -0
  103. package/src/layers/effect/index.ts +5 -0
  104. package/src/layers/index.ts +1 -0
  105. package/src/layersManager.ts +63 -0
  106. package/src/light.ts +15 -0
  107. package/src/loaders/AbortableImageLoader.ts +203 -0
  108. package/src/loaders/AbortableTextureLoader.ts +74 -0
  109. package/src/loaders/index.ts +5 -0
  110. package/src/material/enhancer/DESIGN.md +300 -0
  111. package/src/material/enhancer/MaterialEnhancer.ts +112 -0
  112. package/src/material/enhancer/ShaderReplacer.test.ts +114 -0
  113. package/src/material/enhancer/ShaderReplacer.ts +97 -0
  114. package/src/material/enhancer/batchTexture.ts +8 -0
  115. package/src/material/enhancer/index.ts +46 -0
  116. package/src/material/enhancer/instancedSprite/index.ts +7 -0
  117. package/src/material/enhancer/instancedSprite/instancedSpriteBaseEnhancer/index.test.ts +214 -0
  118. package/src/material/enhancer/instancedSprite/instancedSpriteBaseEnhancer/index.ts +134 -0
  119. package/src/material/enhancer/instancedSprite/instancedSpriteBaseEnhancer/markers.ts +21 -0
  120. package/src/material/enhancer/instancedSprite/instancedSpriteBaseEnhancer/material.ts +32 -0
  121. package/src/material/enhancer/instancedSprite/instancedSpriteBaseEnhancer/mutates.test.ts +277 -0
  122. package/src/material/enhancer/instancedSprite/instancedSpriteBaseEnhancer/mutates.ts +151 -0
  123. package/src/material/enhancer/instancedSprite/instancedSpriteBaseEnhancer/shader.test.ts +114 -0
  124. package/src/material/enhancer/instancedSprite/instancedSpriteBaseEnhancer/shader.ts +49 -0
  125. package/src/material/enhancer/instancedSprite/instancedSpriteBaseEnhancer/state.test.ts +82 -0
  126. package/src/material/enhancer/instancedSprite/instancedSpriteBaseEnhancer/state.ts +80 -0
  127. package/src/material/enhancer/instancedSprite/instancedSpriteBaseEnhancer/types.ts +146 -0
  128. package/src/material/enhancer/instancedSprite/instancedSpriteMaterialEnhancer.ts +105 -0
  129. package/src/material/enhancer/model/index.ts +25 -0
  130. package/src/material/enhancer/model/modelBaseEnhancer/index.test.ts +74 -0
  131. package/src/material/enhancer/model/modelBaseEnhancer/index.ts +110 -0
  132. package/src/material/enhancer/model/modelBaseEnhancer/markers.ts +27 -0
  133. package/src/material/enhancer/model/modelBaseEnhancer/material.test.ts +66 -0
  134. package/src/material/enhancer/model/modelBaseEnhancer/material.ts +44 -0
  135. package/src/material/enhancer/model/modelBaseEnhancer/mutates.test.ts +84 -0
  136. package/src/material/enhancer/model/modelBaseEnhancer/mutates.ts +47 -0
  137. package/src/material/enhancer/model/modelBaseEnhancer/shader.test.ts +24 -0
  138. package/src/material/enhancer/model/modelBaseEnhancer/shader.ts +162 -0
  139. package/src/material/enhancer/model/modelBaseEnhancer/state.test.ts +103 -0
  140. package/src/material/enhancer/model/modelBaseEnhancer/state.ts +52 -0
  141. package/src/material/enhancer/model/modelBaseEnhancer/types.ts +89 -0
  142. package/src/material/enhancer/model/modelMaterialEnhancer.ts +91 -0
  143. package/src/material/enhancer/model/modelWaterEnhancer/index.test.ts +71 -0
  144. package/src/material/enhancer/model/modelWaterEnhancer/index.ts +175 -0
  145. package/src/material/enhancer/model/modelWaterEnhancer/material.test.ts +48 -0
  146. package/src/material/enhancer/model/modelWaterEnhancer/material.ts +25 -0
  147. package/src/material/enhancer/model/modelWaterEnhancer/mutates.test.ts +89 -0
  148. package/src/material/enhancer/model/modelWaterEnhancer/mutates.ts +89 -0
  149. package/src/material/enhancer/model/modelWaterEnhancer/shader.test.ts +34 -0
  150. package/src/material/enhancer/model/modelWaterEnhancer/shader.ts +111 -0
  151. package/src/material/enhancer/model/modelWaterEnhancer/state.test.ts +105 -0
  152. package/src/material/enhancer/model/modelWaterEnhancer/state.ts +59 -0
  153. package/src/material/enhancer/model/modelWaterEnhancer/types.ts +141 -0
  154. package/src/material/enhancer/model/pntsEnhancer/index.test.ts +96 -0
  155. package/src/material/enhancer/model/pntsEnhancer/index.ts +82 -0
  156. package/src/material/enhancer/model/pntsEnhancer/markers.ts +6 -0
  157. package/src/material/enhancer/model/pntsEnhancer/material.test.ts +37 -0
  158. package/src/material/enhancer/model/pntsEnhancer/material.ts +21 -0
  159. package/src/material/enhancer/model/pntsEnhancer/mutates.test.ts +80 -0
  160. package/src/material/enhancer/model/pntsEnhancer/mutates.ts +29 -0
  161. package/src/material/enhancer/model/pntsEnhancer/shader.test.ts +32 -0
  162. package/src/material/enhancer/model/pntsEnhancer/shader.ts +56 -0
  163. package/src/material/enhancer/model/pntsEnhancer/state.test.ts +87 -0
  164. package/src/material/enhancer/model/pntsEnhancer/state.ts +29 -0
  165. package/src/material/enhancer/model/pntsEnhancer/types.ts +38 -0
  166. package/src/material/enhancer/polygon/index.ts +22 -0
  167. package/src/material/enhancer/polygon/polygonBaseEnhancer/index.test.ts +101 -0
  168. package/src/material/enhancer/polygon/polygonBaseEnhancer/index.ts +130 -0
  169. package/src/material/enhancer/polygon/polygonBaseEnhancer/markers.ts +23 -0
  170. package/src/material/enhancer/polygon/polygonBaseEnhancer/material.test.ts +19 -0
  171. package/src/material/enhancer/polygon/polygonBaseEnhancer/material.ts +38 -0
  172. package/src/material/enhancer/polygon/polygonBaseEnhancer/mutates.test.ts +75 -0
  173. package/src/material/enhancer/polygon/polygonBaseEnhancer/mutates.ts +122 -0
  174. package/src/material/enhancer/polygon/polygonBaseEnhancer/shader.test.ts +25 -0
  175. package/src/material/enhancer/polygon/polygonBaseEnhancer/shader.ts +249 -0
  176. package/src/material/enhancer/polygon/polygonBaseEnhancer/state.test.ts +102 -0
  177. package/src/material/enhancer/polygon/polygonBaseEnhancer/state.ts +92 -0
  178. package/src/material/enhancer/polygon/polygonBaseEnhancer/types.ts +150 -0
  179. package/src/material/enhancer/polygon/polygonMaterialEnhancer.ts +97 -0
  180. package/src/material/enhancer/polygon/polygonWaterEnhancer/index.test.ts +72 -0
  181. package/src/material/enhancer/polygon/polygonWaterEnhancer/index.ts +164 -0
  182. package/src/material/enhancer/polygon/polygonWaterEnhancer/material.test.ts +48 -0
  183. package/src/material/enhancer/polygon/polygonWaterEnhancer/material.ts +35 -0
  184. package/src/material/enhancer/polygon/polygonWaterEnhancer/mutates.ts +61 -0
  185. package/src/material/enhancer/polygon/polygonWaterEnhancer/shader.test.ts +34 -0
  186. package/src/material/enhancer/polygon/polygonWaterEnhancer/shader.ts +96 -0
  187. package/src/material/enhancer/polygon/polygonWaterEnhancer/state.test.ts +98 -0
  188. package/src/material/enhancer/polygon/polygonWaterEnhancer/state.ts +57 -0
  189. package/src/material/enhancer/polygon/polygonWaterEnhancer/types.ts +115 -0
  190. package/src/material/enhancer/polyline/index.ts +7 -0
  191. package/src/material/enhancer/polyline/polylineBaseEnhancer/index.test.ts +157 -0
  192. package/src/material/enhancer/polyline/polylineBaseEnhancer/index.ts +154 -0
  193. package/src/material/enhancer/polyline/polylineBaseEnhancer/markers.ts +19 -0
  194. package/src/material/enhancer/polyline/polylineBaseEnhancer/material.test.ts +42 -0
  195. package/src/material/enhancer/polyline/polylineBaseEnhancer/material.ts +38 -0
  196. package/src/material/enhancer/polyline/polylineBaseEnhancer/mutates.test.ts +120 -0
  197. package/src/material/enhancer/polyline/polylineBaseEnhancer/mutates.ts +169 -0
  198. package/src/material/enhancer/polyline/polylineBaseEnhancer/shader.test.ts +67 -0
  199. package/src/material/enhancer/polyline/polylineBaseEnhancer/shader.ts +75 -0
  200. package/src/material/enhancer/polyline/polylineBaseEnhancer/state.test.ts +55 -0
  201. package/src/material/enhancer/polyline/polylineBaseEnhancer/state.ts +91 -0
  202. package/src/material/enhancer/polyline/polylineBaseEnhancer/types.ts +170 -0
  203. package/src/material/enhancer/polyline/polylineMaterialEnhancer.ts +102 -0
  204. package/src/material/enhancer/sdfText/index.ts +7 -0
  205. package/src/material/enhancer/sdfText/sdfTextBaseEnhancer/index.ts +125 -0
  206. package/src/material/enhancer/sdfText/sdfTextBaseEnhancer/markers.ts +19 -0
  207. package/src/material/enhancer/sdfText/sdfTextBaseEnhancer/material.test.ts +35 -0
  208. package/src/material/enhancer/sdfText/sdfTextBaseEnhancer/material.ts +32 -0
  209. package/src/material/enhancer/sdfText/sdfTextBaseEnhancer/mutates.test.ts +381 -0
  210. package/src/material/enhancer/sdfText/sdfTextBaseEnhancer/mutates.ts +232 -0
  211. package/src/material/enhancer/sdfText/sdfTextBaseEnhancer/shader.ts +36 -0
  212. package/src/material/enhancer/sdfText/sdfTextBaseEnhancer/state.test.ts +118 -0
  213. package/src/material/enhancer/sdfText/sdfTextBaseEnhancer/state.ts +107 -0
  214. package/src/material/enhancer/sdfText/sdfTextBaseEnhancer/types.ts +184 -0
  215. package/src/material/enhancer/sdfText/sdfTextMaterialEnhancer.ts +100 -0
  216. package/src/material/enhancer/shadowMap/index.ts +7 -0
  217. package/src/material/enhancer/shadowMap/shadowMapDepthEnhancer/index.ts +97 -0
  218. package/src/material/enhancer/shadowMap/shadowMapDepthEnhancer/markers.ts +10 -0
  219. package/src/material/enhancer/shadowMap/shadowMapDepthEnhancer/material.ts +31 -0
  220. package/src/material/enhancer/shadowMap/shadowMapDepthEnhancer/mutates.ts +8 -0
  221. package/src/material/enhancer/shadowMap/shadowMapDepthEnhancer/shader.test.ts +17 -0
  222. package/src/material/enhancer/shadowMap/shadowMapDepthEnhancer/shader.ts +53 -0
  223. package/src/material/enhancer/shadowMap/shadowMapDepthEnhancer/state.ts +17 -0
  224. package/src/material/enhancer/shadowMap/shadowMapDepthEnhancer/types.ts +26 -0
  225. package/src/material/enhancer/test-utils/shaderCompatibility.ts +124 -0
  226. package/src/material/enhancer/tileComposite/compose.test.ts +95 -0
  227. package/src/material/enhancer/tileComposite/compose.ts +112 -0
  228. package/src/material/enhancer/tileComposite/index.ts +23 -0
  229. package/src/material/enhancer/tileComposite/tileCompositeBaseEnhancer/index.ts +11 -0
  230. package/src/material/enhancer/tileComposite/tileCompositeBaseEnhancer/mutates.ts +132 -0
  231. package/src/material/enhancer/tileComposite/tileCompositeBaseEnhancer/shader.ts +245 -0
  232. package/src/material/enhancer/tileComposite/tileCompositeBaseEnhancer/types.ts +43 -0
  233. package/src/material/enhancer/tileComposite/tileElevationHeatmapEnhancer/index.ts +29 -0
  234. package/src/material/enhancer/tileComposite/tileElevationHeatmapEnhancer/mutates.ts +68 -0
  235. package/src/material/enhancer/tileComposite/tileElevationHeatmapEnhancer/shader.ts +24 -0
  236. package/src/material/enhancer/tileComposite/tileHillshadeEnhancer/index.ts +29 -0
  237. package/src/material/enhancer/tileComposite/tileHillshadeEnhancer/mutates.ts +34 -0
  238. package/src/material/enhancer/tileComposite/tileHillshadeEnhancer/shader.ts +36 -0
  239. package/src/material/enhancer/tileComposite/tileWaterEnhancer/index.ts +23 -0
  240. package/src/material/enhancer/tileComposite/tileWaterEnhancer/mutates.ts +23 -0
  241. package/src/material/enhancer/tileComposite/tileWaterEnhancer/shader.ts +8 -0
  242. package/src/material/enhancer/tileComposite/tileWatermaskEnhancer/index.ts +23 -0
  243. package/src/material/enhancer/tileComposite/tileWatermaskEnhancer/mutates.ts +34 -0
  244. package/src/material/enhancer/tileComposite/tileWatermaskEnhancer/shader.ts +13 -0
  245. package/src/material/enhancer/tileComposite/types.ts +58 -0
  246. package/src/material/index.ts +3 -0
  247. package/src/material/macro/index.ts +1 -0
  248. package/src/material/macro/tileShader.test.ts +136 -0
  249. package/src/material/macro/tileShader.ts +287 -0
  250. package/src/material/overrideMaterialsForMRT.ts +439 -0
  251. package/src/material/selectiveEffectMaterialSetup.test.ts +52 -0
  252. package/src/material/selectiveEffectMaterialSetup.ts +53 -0
  253. package/src/material/types/index.ts +1 -0
  254. package/src/material/types/uniform.ts +1 -0
  255. package/src/mesh/DrapedMesh.ts +101 -0
  256. package/src/mesh/batchTexture.test.ts +646 -0
  257. package/src/mesh/batchTexture.ts +437 -0
  258. package/src/mesh/batchedFeature.ts +186 -0
  259. package/src/mesh/batchedSdfText.ts +484 -0
  260. package/src/mesh/featureMesh.ts +43 -0
  261. package/src/mesh/index.ts +16 -0
  262. package/src/mesh/instanced.ts +117 -0
  263. package/src/mesh/model.ts +483 -0
  264. package/src/mesh/pickableMesh.ts +55 -0
  265. package/src/mesh/pickableMeshWrapper.ts +529 -0
  266. package/src/mesh/polygon.ts +699 -0
  267. package/src/mesh/polygonOutline.ts +393 -0
  268. package/src/mesh/polyline.ts +523 -0
  269. package/src/mesh/releaseGeometryArrays.ts +57 -0
  270. package/src/mesh/rtcRteHelper.ts +211 -0
  271. package/src/mesh/sdfText.test.ts +200 -0
  272. package/src/mesh/sdfText.ts +1019 -0
  273. package/src/mesh/sprite/billboardAtlas.test.ts +177 -0
  274. package/src/mesh/sprite/billboardAtlas.ts +210 -0
  275. package/src/mesh/sprite/billboardAtlasImageLoader.ts +29 -0
  276. package/src/mesh/sprite/index.ts +1 -0
  277. package/src/mesh/sprite/instancedSprite.ts +694 -0
  278. package/src/mesh/tile.test.ts +393 -0
  279. package/src/mesh/tile.ts +1790 -0
  280. package/src/object3DEvent.ts +6 -0
  281. package/src/orchestrators/RenderPassOrchestrator.ts +147 -0
  282. package/src/orchestrators/index.ts +1 -0
  283. package/src/passes/AllDepthCopyPass.ts +165 -0
  284. package/src/passes/CustomRenderPass.ts +279 -0
  285. package/src/passes/NormalCopyPass.ts +125 -0
  286. package/src/passes/RenderTargetCopyPass.ts +91 -0
  287. package/src/passes/SkyEnvMapPass.ts +58 -0
  288. package/src/passes/index.ts +5 -0
  289. package/src/pick/pickHelper.ts +273 -0
  290. package/src/pick/pickTerrain.ts +254 -0
  291. package/src/plugins/AttributionPlugin/AttributionPlugin.test.ts +210 -0
  292. package/src/plugins/AttributionPlugin/attribution.test.ts +225 -0
  293. package/src/plugins/AttributionPlugin/attribution.ts +355 -0
  294. package/src/plugins/AttributionPlugin/attributionStyles.ts +163 -0
  295. package/src/plugins/AttributionPlugin/index.ts +702 -0
  296. package/src/plugins/index.ts +1 -0
  297. package/src/quality.ts +1 -0
  298. package/src/renderOrder.ts +3 -0
  299. package/src/scene.test.ts +164 -0
  300. package/src/scene.ts +127 -0
  301. package/src/shaders/index.ts +1 -0
  302. package/src/solar.test.ts +81 -0
  303. package/src/solar.ts +101 -0
  304. package/src/source.ts +80 -0
  305. package/src/stats.ts +102 -0
  306. package/src/tasks/computeVertexNormalsAsync.ts +15 -0
  307. package/src/tasks/constructPolygonBatchedFeature.ts +34 -0
  308. package/src/tasks/constructPolylineBatchedFeature.ts +27 -0
  309. package/src/tasks/constructQuantizedMeshTerrainMesh.ts +24 -0
  310. package/src/tasks/constructTerrainMesh.ts +25 -0
  311. package/src/tasks/getImageDataFromBlob.ts +13 -0
  312. package/src/tasks/getImageDataFromImageBitmap.ts +12 -0
  313. package/src/tasks/parseMvtTile.ts +22 -0
  314. package/src/tasks/queueTask.ts +19 -0
  315. package/src/tasks/toCreasedNormalsAsync.ts +18 -0
  316. package/src/tasks/upsampleQuantizedMeshTerrainMesh.ts +44 -0
  317. package/src/tasks/upsampleTerrainMesh.ts +39 -0
  318. package/src/texture.ts +19 -0
  319. package/src/textures.ts +13 -0
  320. package/src/tileTexture/CompositeShader.snapshot.test.ts +59 -0
  321. package/src/tileTexture/CompositeShader.test.ts +168 -0
  322. package/src/tileTexture/CompositeShader.ts +53 -0
  323. package/src/tileTexture/SlotPlanner.test.ts +105 -0
  324. package/src/tileTexture/SlotPlanner.ts +102 -0
  325. package/src/tileTexture/TileTextureCache.test.ts +227 -0
  326. package/src/tileTexture/TileTextureCache.ts +192 -0
  327. package/src/tileTexture/TileTextureCompositor.test.ts +260 -0
  328. package/src/tileTexture/TileTextureCompositor.ts +421 -0
  329. package/src/tileTexture/__snapshots__/CompositeShader.snapshot.test.ts.snap +2649 -0
  330. package/src/tileTexture/index.ts +8 -0
  331. package/src/tileTexture/types.ts +150 -0
  332. package/src/type/index.ts +261 -0
  333. package/src/uniforms.ts +20 -0
  334. package/src/utils/arraysEqual.ts +9 -0
  335. package/src/utils/blendModes.ts +80 -0
  336. package/src/utils/geometry.ts +53 -0
  337. package/src/utils/hillshadeNormalMapGenerator.ts +193 -0
  338. package/src/utils/index.ts +8 -0
  339. package/src/utils/object.test.ts +14 -0
  340. package/src/utils/object.ts +7 -0
  341. package/src/utils/replacer.test.ts +42 -0
  342. package/src/utils/replacer.ts +89 -0
  343. package/src/utils/screen.ts +29 -0
  344. package/src/utils/textureFragmentIndex.test.ts +224 -0
  345. package/src/utils/textureFragmentIndex.ts +97 -0
  346. package/src/utils/worker.ts +3 -0
  347. package/src/vite-env.d.ts +2 -0
  348. package/src/worker/index.ts +13 -0
  349. package/src/worker/tasks/computeVertexNormals.ts +15 -0
  350. package/src/worker/tasks/toCreasedNormals.ts +22 -0
@@ -0,0 +1,90 @@
1
+ import type { WebGLRenderer, WebGLRenderTarget } from "three";
2
+
3
+ export class BufferView {
4
+ canvas: HTMLCanvasElement;
5
+ canvasForImage: HTMLCanvasElement;
6
+ constructor(
7
+ width: number,
8
+ height: number,
9
+ {
10
+ styleWidth = "300px",
11
+ styleHeight = "auto",
12
+ }: { styleWidth?: string; styleHeight?: string } = {},
13
+ ) {
14
+ this.canvas = document.createElement("canvas");
15
+ this.canvas.width = width;
16
+ this.canvas.height = height;
17
+ this.canvas.style.width = styleWidth;
18
+ this.canvas.style.height = styleHeight;
19
+ this.canvas.style.position = "absolute";
20
+ this.canvas.style.top = "0px";
21
+ this.canvas.style.left = "0px";
22
+ this.canvas.style.zIndex = "1000";
23
+ this.canvas.style.pointerEvents = "none";
24
+ document.body.appendChild(this.canvas);
25
+
26
+ this.canvasForImage = document.createElement("canvas");
27
+ this.canvasForImage.width = width;
28
+ this.canvasForImage.height = height;
29
+ }
30
+
31
+ render(renderer: WebGLRenderer, renderTarget: WebGLRenderTarget) {
32
+ const width = renderTarget.width;
33
+ const height = renderTarget.height;
34
+ const pixelBuffer = new Uint8Array(width * height * 4);
35
+ renderer.readRenderTargetPixels(
36
+ renderTarget,
37
+ 0,
38
+ 0,
39
+ width,
40
+ height,
41
+ pixelBuffer,
42
+ );
43
+ this.drawPixels(pixelBuffer, width, height);
44
+ }
45
+
46
+ /**
47
+ * Render from raw pixel data (Uint8Array RGBA).
48
+ * Use this for HalfFloat MRT attachments where readRenderTargetPixels doesn't work.
49
+ */
50
+ renderFromPixels(pixels: Uint8Array, width: number, height: number) {
51
+ this.drawPixels(pixels, width, height);
52
+ }
53
+
54
+ private drawPixels(pixelBuffer: Uint8Array, width: number, height: number) {
55
+ const ctx = this.canvas.getContext("2d");
56
+ if (!ctx) return;
57
+
58
+ // Clear canvas before drawing (fix for stale content from previous frames)
59
+ ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);
60
+
61
+ // Resize temp canvas to match source data
62
+ if (
63
+ this.canvasForImage.width !== width ||
64
+ this.canvasForImage.height !== height
65
+ ) {
66
+ this.canvasForImage.width = width;
67
+ this.canvasForImage.height = height;
68
+ }
69
+
70
+ const imageData = ctx.createImageData(width, height);
71
+ imageData.data.set(pixelBuffer);
72
+
73
+ const tempCtx = this.canvasForImage.getContext("2d");
74
+ if (!tempCtx) return;
75
+ tempCtx.putImageData(imageData, 0, 0);
76
+
77
+ // Flip Y and scale from source size to display canvas size
78
+ const cw = this.canvas.width;
79
+ const ch = this.canvas.height;
80
+ ctx.translate(0, ch);
81
+ ctx.scale(1, -1);
82
+ ctx.drawImage(this.canvasForImage, 0, 0, cw, ch);
83
+ ctx.setTransform(1, 0, 0, 1, 0, 0);
84
+ }
85
+
86
+ dispose() {
87
+ this.canvas.remove();
88
+ this.canvasForImage.remove();
89
+ }
90
+ }
package/src/camera.ts ADDED
@@ -0,0 +1,182 @@
1
+ import {
2
+ EventHandler,
3
+ type CameraOrientation,
4
+ type LatLngHeight,
5
+ type NormalizeWASMClass,
6
+ type XYZ,
7
+ } from "@navaramap/core";
8
+ import {
9
+ Core,
10
+ CameraStatus,
11
+ CameraStatusType,
12
+ CameraControlUpdateEvent,
13
+ } from "@navaramap/engine";
14
+ import { PerspectiveCamera } from "three";
15
+ import invariant from "tiny-invariant";
16
+
17
+ export type CameraEvent = {
18
+ movestart: () => void;
19
+ move: () => void;
20
+ moveend: () => void;
21
+ frustumChanged: () => void;
22
+ };
23
+
24
+ export type CameraOptions = NormalizeWASMClass<CameraControlUpdateEvent>;
25
+
26
+ export class ThreeViewCamera extends EventHandler<CameraEvent> {
27
+ raw: PerspectiveCamera;
28
+
29
+ private _core: Core | undefined;
30
+ private _status: CameraStatus | undefined;
31
+
32
+ constructor(cam?: PerspectiveCamera) {
33
+ super();
34
+ if (cam instanceof PerspectiveCamera) {
35
+ this.raw = cam;
36
+ } else {
37
+ this.raw = new PerspectiveCamera();
38
+ }
39
+ }
40
+
41
+ set core(core: Core | undefined) {
42
+ this._core = core;
43
+ }
44
+
45
+ updateStatus() {
46
+ this._status = this._core?.getCameraStatus();
47
+ if (!this._status) {
48
+ return;
49
+ }
50
+
51
+ for (const val of this._status.status) {
52
+ switch (val) {
53
+ case CameraStatusType.MoveStart:
54
+ this.emit("movestart");
55
+ break;
56
+ case CameraStatusType.Moving:
57
+ this.emit("move");
58
+ break;
59
+ case CameraStatusType.MoveEnd:
60
+ case CameraStatusType.LookAt:
61
+ case CameraStatusType.Rotate:
62
+ this.emit("moveend");
63
+ break;
64
+ default:
65
+ break;
66
+ }
67
+ }
68
+ }
69
+
70
+ get positionECEF(): XYZ {
71
+ const pos = this._core?.getCameraPositionECEF();
72
+ invariant(pos);
73
+ return {
74
+ x: pos[0],
75
+ y: pos[1],
76
+ z: pos[2],
77
+ };
78
+ }
79
+
80
+ get positionGeographic(): LatLngHeight {
81
+ const pos = this._core?.getCameraPositionLLE();
82
+ invariant(pos);
83
+ return {
84
+ lng: pos[0],
85
+ lat: pos[1],
86
+ height: pos[2],
87
+ };
88
+ }
89
+
90
+ get orientation(): CameraOrientation {
91
+ const orientation = this._core?.getCameraOrientation();
92
+ invariant(orientation);
93
+ return {
94
+ heading: orientation.heading,
95
+ pitch: orientation.pitch,
96
+ roll: orientation.roll,
97
+ };
98
+ }
99
+
100
+ get fovy(): number | undefined {
101
+ return this._core?.getCameraFOVY();
102
+ }
103
+
104
+ /**
105
+ * Effective Web Mercator zoom level the camera is viewing the surface at
106
+ * (fractional). Computed engine-side from the camera's ellipsoid height (not
107
+ * terrain), FOV and viewport.
108
+ */
109
+ get zoom(): number | undefined {
110
+ return this._core?.getZoomLevel();
111
+ }
112
+
113
+ set fov(val: number) {
114
+ if (val < 1 || val > 180) {
115
+ return;
116
+ }
117
+
118
+ this._core?.setFrustum(val, undefined, undefined);
119
+ }
120
+
121
+ set near(val: number) {
122
+ if (val <= 0) {
123
+ return;
124
+ }
125
+
126
+ this._core?.setFrustum(undefined, val, undefined);
127
+ }
128
+
129
+ get near() {
130
+ return this.raw.near;
131
+ }
132
+
133
+ set far(val: number) {
134
+ if (val <= this.raw.near) {
135
+ return;
136
+ }
137
+
138
+ this._core?.setFrustum(undefined, undefined, val);
139
+ }
140
+
141
+ get far() {
142
+ return this.raw.far;
143
+ }
144
+
145
+ set options(options: CameraOptions) {
146
+ const event = new CameraControlUpdateEvent();
147
+ if (options.autoAdjustNearFar !== undefined) {
148
+ event.autoAdjustNearFar = options.autoAdjustNearFar;
149
+ }
150
+ if (options.minimumZoomDistance !== undefined) {
151
+ event.minimumZoomDistance = options.minimumZoomDistance;
152
+ }
153
+ if (options.maximumZoomDistance !== undefined) {
154
+ event.maximumZoomDistance = options.maximumZoomDistance;
155
+ }
156
+ if (options.spinSpeed !== undefined) {
157
+ event.spinSpeed = options.spinSpeed;
158
+ }
159
+ if (options.zoomSpeed !== undefined) {
160
+ event.zoomSpeed = options.zoomSpeed;
161
+ }
162
+ if (options.spinDuration !== undefined) {
163
+ event.spinDuration = options.spinDuration;
164
+ }
165
+ if (options.zoomDuration !== undefined) {
166
+ event.zoomDuration = options.zoomDuration;
167
+ }
168
+ if (options.translateDuration !== undefined) {
169
+ event.translateDuration = options.translateDuration;
170
+ }
171
+ if (options.enableSpin !== undefined) {
172
+ event.enableSpin = options.enableSpin;
173
+ }
174
+ if (options.enableZoom !== undefined) {
175
+ event.enableZoom = options.enableZoom;
176
+ }
177
+ if (options.enableTilt !== undefined) {
178
+ event.enableTilt = options.enableTilt;
179
+ }
180
+ this._core?.setCameraControl(event);
181
+ }
182
+ }
@@ -0,0 +1,15 @@
1
+ import { createConcurrencyManager } from "@navaramap/worker";
2
+
3
+ /** Maximum workers on mobile: limits thermal throttling AND peak memory —
4
+ * every busy worker's WASM heap ratchets to its decode working set, so a
5
+ * camera-move burst costs up to `workers × maxWorkerHeapBytes`. Two workers
6
+ * halve that peak versus four at the cost of decode throughput. */
7
+ const MOBILE_MAX_WORKERS = 2;
8
+
9
+ export const createDefaultConcurrencyManager = (mobileOptimized: boolean) => {
10
+ const hardwareConcurrency = Math.max(navigator.hardwareConcurrency, 1);
11
+ const totalConcurrency = mobileOptimized
12
+ ? Math.min(hardwareConcurrency, MOBILE_MAX_WORKERS)
13
+ : hardwareConcurrency;
14
+ return createConcurrencyManager(totalConcurrency);
15
+ };
@@ -0,0 +1,30 @@
1
+ export const ATMOSPHERE_ASSETS_URL = new URL(
2
+ `${import.meta.env.BASE_URL}assets/atmosphere`,
3
+ import.meta.url,
4
+ ).toString();
5
+
6
+ export const CLOUD_ASSETS_URL = new URL(
7
+ `${import.meta.env.BASE_URL}assets/cloud`,
8
+ import.meta.url,
9
+ ).toString();
10
+
11
+ export const NOISE_ASSETS_URL = new URL(
12
+ `${import.meta.env.BASE_URL}assets/noise`,
13
+ import.meta.url,
14
+ ).toString();
15
+
16
+ export const RAIN_ASSETS_URL = new URL(
17
+ `${import.meta.env.BASE_URL}assets/rain`,
18
+ import.meta.url,
19
+ ).toString();
20
+
21
+ export const WATER_ASSETS_URL = new URL(
22
+ `${import.meta.env.BASE_URL}assets/water`,
23
+ import.meta.url,
24
+ ).toString();
25
+
26
+ export const STARS_ASSETS_URL = `${ATMOSPHERE_ASSETS_URL}/stars.bin`;
27
+
28
+ export const STBN_URL = `${NOISE_ASSETS_URL}/stbn.bin`;
29
+
30
+ export const WATER_NORMAL_URL = `${WATER_ASSETS_URL}/waternormals.jpg`;
@@ -0,0 +1,7 @@
1
+ import { ElevationDecoder } from "@navaramap/engine";
2
+
3
+ // Evaluate them lazily because we need to wait until WASM module is ready.
4
+ // If we can use top-level-await, we don't need to do it.
5
+ export const JAPAN_GSI_ELEVATION_DECODER = () => ElevationDecoder.japanGSI();
6
+ export const MAPBOX_ELEVATION_DECODER = () => ElevationDecoder.mapbox();
7
+ export const TERRARIUM_ELEVATION_DECODER = () => ElevationDecoder.terrarium();
@@ -0,0 +1,2 @@
1
+ export * from "./assets";
2
+ export * from "./decoder";
@@ -0,0 +1,142 @@
1
+ import { EventHandler, type BaseEventMap } from "@navaramap/core";
2
+ import { generateId } from "@navaramap/engine";
3
+
4
+ import type ThreeView from "../index";
5
+
6
+ import type { ViewContext } from "./ViewContext";
7
+
8
+ /**
9
+ * Base configuration options common to all descriptors.
10
+ */
11
+ export type BaseDescConfig = {
12
+ /** Optional custom ID. Auto-generated if not provided. */
13
+ id?: string;
14
+ /** Whether the descriptor is visible. Defaults to true. */
15
+ visible?: boolean;
16
+ };
17
+
18
+ /**
19
+ * Configuration properties that can be updated after creation.
20
+ */
21
+ export type BaseDescConfigUpdate = Pick<BaseDescConfig, "visible">;
22
+
23
+ /**
24
+ * Base interface for the underlying Three.js instance created by a descriptor.
25
+ */
26
+ export type BaseInstance = { visible: boolean };
27
+
28
+ /**
29
+ * Internal events emitted by BaseDesc.
30
+ */
31
+ export type BaseDescEvents = {
32
+ /** @internal Emitted when the descriptor needs to trigger a re-render. */
33
+ needsUpdate: () => void;
34
+ };
35
+
36
+ /**
37
+ * Abstract base class for descriptors (mesh, light, and effect descriptors).
38
+ * Extend this class to create custom descriptor types.
39
+ *
40
+ * Descriptors differ from resource layers in that they are purely client-side
41
+ * and don't load data from external sources. They create Three.js objects directly.
42
+ *
43
+ * @typeParam Config - Configuration type for the descriptor (extends BaseDescConfig)
44
+ * @typeParam UpdateConfig - Configuration properties that can be updated (extends BaseDescConfigUpdate)
45
+ * @typeParam Instance - The underlying Three.js object type created by the descriptor
46
+ * @typeParam CustomEvent - Additional custom events the descriptor can emit
47
+ *
48
+ * @example
49
+ * ```typescript
50
+ * // Creating a custom mesh desc
51
+ * class MyCustomMeshDesc extends BaseDesc<MyConfig, MyUpdateConfig, Mesh> {
52
+ * onCreate() {
53
+ * const geometry = new BoxGeometry(1, 1, 1);
54
+ * const material = new MeshBasicMaterial();
55
+ * this._instance = new Mesh(geometry, material);
56
+ * this.ctx.scenes.opaque.add(this._instance);
57
+ * }
58
+ * }
59
+ * ```
60
+ */
61
+ export abstract class BaseDesc<
62
+ Config extends BaseDescConfig = BaseDescConfig,
63
+ UpdateConfig extends BaseDescConfigUpdate = BaseDescConfigUpdate,
64
+ Instance extends BaseInstance = BaseInstance,
65
+ CustomEvent extends BaseEventMap = BaseEventMap,
66
+ > extends EventHandler<BaseDescEvents & CustomEvent> {
67
+ /** The unique identifier. */
68
+ public readonly id: string;
69
+
70
+ /** The ThreeView instance providing access to camera, atmosphere, globe, and other view state. */
71
+ protected view: ThreeView;
72
+ /** The view context providing access to scenes, passes, and rendering internals. */
73
+ protected ctx: ViewContext;
74
+ /** The underlying Three.js instance. */
75
+ protected _instance: Instance | undefined;
76
+
77
+ private _visible?: boolean;
78
+
79
+ constructor(
80
+ view: ThreeView,
81
+ ctx: ViewContext,
82
+ config: Config = {} as Config,
83
+ ) {
84
+ super();
85
+
86
+ this.id = config.id || generateId();
87
+ this._visible = config.visible ?? true;
88
+ this.view = view;
89
+ this.ctx = ctx;
90
+ }
91
+
92
+ /**
93
+ * Called when the this class is added to the scene. Override this to create the Three.js objects.
94
+ * This is where you should initialize `this._instance` and add it to the appropriate scene.
95
+ */
96
+ abstract onCreate(): void;
97
+
98
+ /**
99
+ * Called when the configuration is updated via `BaseHandle.update()`.
100
+ * Override this to handle custom configuration updates.
101
+ * @param updates - The configuration properties being updated
102
+ */
103
+ onUpdateConfig(updates: UpdateConfig) {
104
+ if (updates.visible !== undefined) {
105
+ this._visible = updates.visible;
106
+ if (this._instance) {
107
+ this._instance.visible = updates.visible;
108
+ }
109
+ }
110
+
111
+ this.requestUpdate();
112
+ }
113
+
114
+ protected requestUpdate(): void {
115
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
116
+ // @ts-ignore
117
+ this.emit("needsUpdate");
118
+ }
119
+
120
+ /**
121
+ * Called when deleted via `BaseHandle.delete()`.
122
+ * Override this to clean up resources. Remember to call `super.onDestroy()`.
123
+ */
124
+ onDestroy(): void {
125
+ this._instance = undefined;
126
+ }
127
+
128
+ /**
129
+ * Gets whether this is currently visible.
130
+ */
131
+ get visible() {
132
+ return !!this._visible;
133
+ }
134
+
135
+ /**
136
+ * Sets whether this should be visible.
137
+ */
138
+ set visible(v: boolean) {
139
+ this._visible = v;
140
+ this.onUpdateConfig({ visible: v } as UpdateConfig);
141
+ }
142
+ }
@@ -0,0 +1,126 @@
1
+ import { EventHandler } from "@navaramap/core";
2
+
3
+ import { BaseDesc, type BaseDescConfigUpdate } from "./BaseDesc";
4
+ import type { EffectDesc } from "./EffectDesc";
5
+ import type { LightDesc } from "./LightDesc";
6
+ import type { MeshDesc } from "./MeshDesc";
7
+
8
+ /** The mesh descriptor hierarchy. */
9
+ export type AnyMeshDesc = MeshDesc;
10
+
11
+ /**
12
+ * Events emitted by handles.
13
+ */
14
+ export type HandleEvent = {
15
+ /** Emitted when the descriptor is deleted. */
16
+ deleted: () => void;
17
+ };
18
+
19
+ /**
20
+ * Abstract base handle to control a descriptor after it has been added to the scene.
21
+ *
22
+ * Use the typed subclasses instead:
23
+ * - {@link MeshHandle} - returned by `ThreeView.addMesh()`
24
+ * - {@link LightHandle} - returned by `ThreeView.addLight()`
25
+ * - {@link EffectHandle} - returned by `ThreeView.addEffect()`
26
+ *
27
+ * @typeParam T - The specific descriptor type
28
+ */
29
+ export class BaseHandle<
30
+ T extends BaseDesc = BaseDesc,
31
+ > extends EventHandler<HandleEvent> {
32
+ constructor(private desc: T) {
33
+ super();
34
+ }
35
+
36
+ /**
37
+ * Updates the descriptor configuration with partial updates.
38
+ * Only the specified properties will be changed; others remain unchanged.
39
+ * @param updates - Partial configuration object with properties to update
40
+ */
41
+ update(
42
+ updates: T extends BaseDesc<infer _A, infer B> ? B : BaseDescConfigUpdate,
43
+ ): void {
44
+ this.desc.onUpdateConfig(updates);
45
+ }
46
+
47
+ /**
48
+ * Gets direct access to the underlying descriptor instance.
49
+ * Use this to access descriptor-specific methods and properties not exposed through the handle.
50
+ */
51
+ get ref(): T {
52
+ return this.desc;
53
+ }
54
+
55
+ /**
56
+ * Removes the descriptor from the scene and disposes its resources.
57
+ * After calling this, the handle should no longer be used.
58
+ */
59
+ delete(): void {
60
+ if (this._deleted) return;
61
+ this._deleted = true;
62
+ this.desc.onDestroy();
63
+ this.emit("deleted");
64
+ }
65
+
66
+ private _deleted = false;
67
+
68
+ /**
69
+ * Gets the unique identifier.
70
+ */
71
+ get id(): string {
72
+ return this.desc.id;
73
+ }
74
+
75
+ /**
76
+ * Gets whether the descriptor is currently visible in the scene.
77
+ */
78
+ get visible(): boolean {
79
+ return this.desc.visible;
80
+ }
81
+
82
+ /**
83
+ * Sets whether the descriptor should be visible in the scene.
84
+ * @param visible - True to show, false to hide
85
+ */
86
+ set visible(visible: boolean) {
87
+ this.desc.visible = visible;
88
+ }
89
+ }
90
+
91
+ /**
92
+ * A handle to control a mesh descriptor after it has been added to the scene.
93
+ * Returned by `ThreeView.addMesh()`.
94
+ *
95
+ * @typeParam T - The specific mesh descriptor type (e.g., BoxMeshDesc)
96
+ *
97
+ * @example
98
+ * ```typescript
99
+ * const handle = view.addMesh<BoxMeshDesc>({ box: { width: 100 } });
100
+ * handle.update({ box: { width: 200 } });
101
+ * handle.delete();
102
+ * ```
103
+ */
104
+ export class MeshHandle<
105
+ T extends AnyMeshDesc = AnyMeshDesc,
106
+ > extends BaseHandle<T> {}
107
+
108
+ /**
109
+ * A handle to control a light descriptor after it has been added to the scene.
110
+ * Returned by `ThreeView.addLight()`.
111
+ *
112
+ * @typeParam T - The specific light descriptor type (e.g., SunLightDesc)
113
+ */
114
+ export class LightHandle<
115
+ T extends LightDesc = LightDesc,
116
+ > extends BaseHandle<T> {}
117
+
118
+ /**
119
+ * A handle to control an effect descriptor after it has been added to the scene.
120
+ * Returned by `ThreeView.addEffect()`.
121
+ *
122
+ * @typeParam T - The specific effect descriptor type (e.g., SSAOEffectDesc)
123
+ */
124
+ export class EffectHandle<
125
+ T extends EffectDesc = EffectDesc,
126
+ > extends BaseHandle<T> {}
@@ -0,0 +1,88 @@
1
+ import type ThreeView from "../index";
2
+
3
+ import type { ViewContext } from "./ViewContext";
4
+
5
+ /**
6
+ * Base abstract class for all registry types in the Navara system.
7
+ * Provides common functionality for registering, creating, and managing different types of components.
8
+ */
9
+ export abstract class DescRegistry<
10
+ TConstructor,
11
+ TInstance,
12
+ TConfig extends Record<string, unknown> = Record<string, unknown>,
13
+ > {
14
+ protected registry = new Map<string, TConstructor>();
15
+
16
+ constructor(
17
+ public view: ThreeView,
18
+ public ctx: ViewContext,
19
+ ) {}
20
+
21
+ /**
22
+ * Register a new type with the given name and constructor
23
+ */
24
+ register(name: string, constructor: TConstructor): void {
25
+ this.registry.set(name, constructor);
26
+ }
27
+
28
+ /**
29
+ * Unregister a type by name
30
+ */
31
+ unregister(name: string): boolean {
32
+ return this.registry.delete(name);
33
+ }
34
+
35
+ /**
36
+ * Check if a type is registered
37
+ */
38
+ has(name: string): boolean {
39
+ return this.registry.has(name);
40
+ }
41
+
42
+ /**
43
+ * Get all registered type names
44
+ */
45
+ getRegisteredTypes(): string[] {
46
+ return Array.from(this.registry.keys());
47
+ }
48
+
49
+ /**
50
+ * Get the number of registered types
51
+ */
52
+ size(): number {
53
+ return this.registry.size;
54
+ }
55
+
56
+ /**
57
+ * Clear all registered types
58
+ */
59
+ clear(): void {
60
+ this.registry.clear();
61
+ }
62
+
63
+ /**
64
+ * Create an instance of the specified type with the given configuration
65
+ * Must be implemented by subclasses
66
+ */
67
+ abstract create(name: string, config: TConfig): TInstance;
68
+
69
+ /**
70
+ * Find a type name from a configuration object
71
+ * Useful for auto-detecting type from config keys
72
+ */
73
+ findTypeFromConfig(config: Record<string, unknown>): string | null {
74
+ for (const key of Object.keys(config)) {
75
+ if (this.registry.has(key)) {
76
+ return key;
77
+ }
78
+ }
79
+ return null;
80
+ }
81
+
82
+ /**
83
+ * Get constructor by name (protected method for subclasses)
84
+ */
85
+ protected getConstructor(name: string): TConstructor | undefined {
86
+ return this.registry.get(name);
87
+ }
88
+ }