@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,81 @@
1
+ import type { EventHandler, FeatureSetId } from "@navaramap/core";
2
+ import type { Object3D } from "three";
3
+
4
+ import { ModelMesh, type ViewEvents } from "..";
5
+ import { FeatureEvaluator } from "../evaluations";
6
+ import { Layer } from "../layer";
7
+ import { LayersManager } from "../layersManager";
8
+
9
+ import type { FeatureHandler } from ".";
10
+
11
+ export const handleFeatureCreatedEventByLayerId = (
12
+ handler: FeatureHandler,
13
+ obj: Object3D,
14
+ viewEvents: EventHandler<ViewEvents>,
15
+ layersManager: LayersManager,
16
+ layerId: string,
17
+ featureSetId: FeatureSetId,
18
+ ) => {
19
+ const layer = layersManager.get(layerId);
20
+
21
+ // Create the evaluator
22
+ const evaluator = new FeatureEvaluator(handler, layerId, featureSetId, obj);
23
+
24
+ // Register the feature evaluator with the layer if it exists
25
+ if (layer && layer instanceof Layer) {
26
+ layer._registerFeatureEvaluator(featureSetId, evaluator);
27
+ }
28
+
29
+ let credit = undefined;
30
+ if (obj instanceof ModelMesh && obj.credit) {
31
+ credit = obj.credit;
32
+ }
33
+
34
+ // Emit the evaluator
35
+ viewEvents.emit("layer", "featureCreated", layerId, {
36
+ featureSetId,
37
+ evaluator,
38
+ credit,
39
+ });
40
+
41
+ return layer;
42
+ };
43
+
44
+ export const handleFeatureUpdatedEventByLayerId = (
45
+ viewEvents: EventHandler<ViewEvents>,
46
+ layersManager: LayersManager,
47
+ layerId: string,
48
+ featureSetId: FeatureSetId,
49
+ updatedAt: number,
50
+ ) => {
51
+ const layer = layersManager.get(layerId);
52
+
53
+ if (!layer) return;
54
+
55
+ // Get the existing evaluator or create a new one
56
+ if (!(layer instanceof Layer)) return;
57
+ const evaluator = layer._getFeatureEvaluator(featureSetId);
58
+ if (!evaluator) return;
59
+
60
+ // Emit the event with the evaluator
61
+ viewEvents.emit("layer", "featureUpdated", layerId, {
62
+ featureSetId,
63
+ evaluator,
64
+ updatedAt,
65
+ });
66
+ };
67
+
68
+ export const handleFeatureVisibilityChangedEventByLayerId = (
69
+ layersManager: LayersManager,
70
+ layerId: string,
71
+ featureSetId: FeatureSetId,
72
+ visible: boolean,
73
+ ) => {
74
+ const layer = layersManager.get(layerId);
75
+
76
+ if (!layer) return;
77
+ if (!(layer instanceof Layer)) return;
78
+
79
+ // Emit the visibility changed event
80
+ layer.emit("featureVisibilityChanged", { featureSetId, visible });
81
+ };
@@ -0,0 +1,30 @@
1
+ import type { BillboardMesh as NavaraBillboardMesh } from "@navaramap/engine";
2
+
3
+ import { InstancedSpriteMesh } from "../../mesh";
4
+ import { FEATURE_RENDER_ORDER } from "../../renderOrder";
5
+ import type { EventContext } from "../context";
6
+
7
+ export async function renderBillboard(
8
+ ctx: EventContext,
9
+ m: NavaraBillboardMesh,
10
+ ) {
11
+ if (!m.material.url) return;
12
+
13
+ const mesh = new InstancedSpriteMesh({
14
+ renderOrder: FEATURE_RENDER_ORDER,
15
+ ctx,
16
+ });
17
+ await mesh._init(m);
18
+ mesh.setActive(m.active);
19
+
20
+ return mesh;
21
+ }
22
+
23
+ export async function processBillboardChanged(
24
+ obj: InstancedSpriteMesh,
25
+ m: NavaraBillboardMesh,
26
+ active: boolean,
27
+ ) {
28
+ await obj._update(m);
29
+ obj.setActive(active);
30
+ }
@@ -0,0 +1,192 @@
1
+ import { ModelMesh as NavaraModelMesh } from "@navaramap/engine";
2
+ import { degreeToRadian } from "@navaramap/three_api";
3
+ import {
4
+ BufferGeometry,
5
+ Points,
6
+ Group,
7
+ Float32BufferAttribute,
8
+ PointsMaterial,
9
+ Box3,
10
+ Vector3,
11
+ Box3Helper,
12
+ Mesh,
13
+ Sphere,
14
+ } from "three";
15
+
16
+ import { ModelMesh } from "../../mesh/model";
17
+ import { toCreasedNormalsAsync } from "../../tasks/toCreasedNormalsAsync";
18
+ import type { EventContext } from "../context";
19
+ import {
20
+ initializeGltfLoader,
21
+ initializeDracoLoader,
22
+ decompressDraco,
23
+ } from "../loaders";
24
+
25
+ /**
26
+ * Recompute vertex normals via `toCreasedNormalsAsync` for every Mesh in the
27
+ * loaded scene. Awaited before the `ModelMesh` is constructed so downstream
28
+ * material/shadow setup observes the final geometry.
29
+ */
30
+ async function applyCreasedNormals(
31
+ scene: Group,
32
+ creaseAngle: number,
33
+ ): Promise<void> {
34
+ const geometries = new Set<BufferGeometry>();
35
+ scene.traverse((object) => {
36
+ if (object instanceof Mesh && object.geometry instanceof BufferGeometry) {
37
+ geometries.add(object.geometry);
38
+ }
39
+ });
40
+
41
+ await Promise.all(
42
+ [...geometries].map((geometry) =>
43
+ toCreasedNormalsAsync(geometry, creaseAngle),
44
+ ),
45
+ );
46
+ }
47
+
48
+ export async function renderModel(ctx: EventContext, m: NavaraModelMesh) {
49
+ const { rawScene, credit } = await (async () => {
50
+ if (m.bin) {
51
+ // buf.u8 returns a short-lived view into WASM memory; copy it since the
52
+ // bin is consumed asynchronously (Draco / GLTFLoader) via its `.buffer`.
53
+ const bin = ctx.buf.u8(m.bin)?.slice();
54
+ if (!bin) {
55
+ return {};
56
+ }
57
+
58
+ const internal = m.material.__internal__;
59
+ // PNTS legacy bin path: only the PNTS parser sets `pointCloud=true`, and the
60
+ // bin here is the extracted position buffer (Draco blob or raw f32), not glTF.
61
+ // 3D Tiles 1.1 glTF tiles (point cloud or not) take the GLTFLoader path below.
62
+ if (internal?.pointCloud) {
63
+ let geometry: BufferGeometry | undefined;
64
+ const material = new PointsMaterial({
65
+ size: m.material.pointSize,
66
+ vertexColors: true,
67
+ sizeAttenuation: false,
68
+ });
69
+
70
+ if (internal.dracoCompressed) {
71
+ const { decoder, dispose } = initializeDracoLoader();
72
+ geometry = await (async () => {
73
+ try {
74
+ return await decompressDraco(bin.buffer as ArrayBuffer, decoder);
75
+ } finally {
76
+ dispose();
77
+ }
78
+ })();
79
+ } else {
80
+ geometry = new BufferGeometry();
81
+ geometry.setAttribute(
82
+ "position",
83
+ new Float32BufferAttribute(new Float32Array(bin.buffer), 3),
84
+ );
85
+ }
86
+
87
+ const group = new Group();
88
+ if (geometry) {
89
+ const points: Points = new Points(geometry, material);
90
+ group.add(points);
91
+
92
+ // Add bounding box helper using the precomputed AABB
93
+ const aabb_center = new Vector3(
94
+ m.aabb.center.x,
95
+ m.aabb.center.y,
96
+ m.aabb.center.z,
97
+ );
98
+ const aabb_extent = new Vector3(
99
+ m.aabb.extent.x,
100
+ m.aabb.extent.y,
101
+ m.aabb.extent.z,
102
+ );
103
+
104
+ geometry.boundingBox = new Box3(
105
+ aabb_center.clone().sub(aabb_extent),
106
+ aabb_center.clone().add(aabb_extent),
107
+ );
108
+
109
+ geometry.boundingSphere = new Sphere(
110
+ aabb_center,
111
+ aabb_extent.length(),
112
+ );
113
+
114
+ if (m.material.showBoundingBox) {
115
+ const boxHelper = new Box3Helper(geometry.boundingBox, 0xff0000);
116
+ group.add(boxHelper);
117
+ }
118
+ }
119
+ return { rawScene: group };
120
+ }
121
+
122
+ const { loader, dispose } = initializeGltfLoader();
123
+ const model = await loader.parseAsync(bin.buffer as ArrayBuffer, "");
124
+ dispose();
125
+ if (m.material.showBoundingBox) {
126
+ model.scene.traverse((child) => {
127
+ if (child instanceof Mesh) {
128
+ const boxHelper = new Box3Helper(
129
+ child.geometry.boundingBox,
130
+ 0x0000ff,
131
+ );
132
+ child.add(boxHelper);
133
+ }
134
+ });
135
+ }
136
+
137
+ return {
138
+ rawScene: model.scene,
139
+ credit: model.asset.copyright,
140
+ };
141
+ } else {
142
+ if (!m.material.url) {
143
+ return {};
144
+ }
145
+ const { loader, dispose } = initializeGltfLoader();
146
+ let model;
147
+ try {
148
+ model = await loader.loadAsync(m.material.url);
149
+ } catch (e) {
150
+ console.warn(`Failed to load model: ${m.material.url}`, e);
151
+ return {};
152
+ } finally {
153
+ dispose();
154
+ }
155
+ if (m.material.showBoundingBox) {
156
+ model.scene.traverse((child) => {
157
+ if (child instanceof Mesh) {
158
+ const boxHelper = new Box3Helper(
159
+ child.geometry.boundingBox,
160
+ 0x0000ff,
161
+ );
162
+ child.add(boxHelper);
163
+ }
164
+ });
165
+ }
166
+ return { rawScene: model.scene };
167
+ }
168
+ })();
169
+
170
+ if (!rawScene) {
171
+ return;
172
+ }
173
+
174
+ if (m.material.normals) {
175
+ await applyCreasedNormals(
176
+ rawScene,
177
+ m.material.creaseNormalAngle ?? degreeToRadian(30),
178
+ );
179
+ }
180
+
181
+ const scene = new ModelMesh(ctx, { scene: rawScene, credit }, m);
182
+
183
+ return scene;
184
+ }
185
+
186
+ export function processModelChanged(
187
+ obj: ModelMesh,
188
+ m: NavaraModelMesh,
189
+ active: boolean,
190
+ ) {
191
+ obj._update(m.material, active);
192
+ }
@@ -0,0 +1,69 @@
1
+ import {
2
+ BufferGeometry,
3
+ Float32BufferAttribute,
4
+ Group,
5
+ Mesh,
6
+ MeshBasicMaterial,
7
+ Uint16BufferAttribute,
8
+ DataTexture,
9
+ } from "three";
10
+ import { describe, expect, it } from "vitest";
11
+
12
+ import { sumModelGpuBytes } from "./modelGpuBytes";
13
+
14
+ describe("sumModelGpuBytes", () => {
15
+ it("sums geometry attribute + index bytes across the object tree", () => {
16
+ const geometry = new BufferGeometry();
17
+ // 3 vertices × 3 floats × 4 bytes = 36 bytes.
18
+ geometry.setAttribute(
19
+ "position",
20
+ new Float32BufferAttribute([0, 0, 0, 1, 0, 0, 0, 1, 0], 3),
21
+ );
22
+ // 3 indices × 2 bytes = 6 bytes.
23
+ geometry.setIndex(new Uint16BufferAttribute([0, 1, 2], 1));
24
+
25
+ const group = new Group();
26
+ group.add(new Mesh(geometry, new MeshBasicMaterial()));
27
+
28
+ // Geometry is counted once (GPU_GEOMETRY_RESIDENCY_FACTOR = 1): the CPU
29
+ // typed arrays are released via onUpload after the first GPU upload, so
30
+ // only the GPU copy stays resident.
31
+ expect(sumModelGpuBytes(group)).toBe(36 + 6);
32
+ });
33
+
34
+ it("counts a shared texture only once, without the residency factor", () => {
35
+ // 2×2 RGBA DataTexture → image.data.byteLength = 16.
36
+ const tex = new DataTexture(new Uint8Array(16), 2, 2);
37
+ const matA = new MeshBasicMaterial({ map: tex });
38
+ const matB = new MeshBasicMaterial({ map: tex });
39
+
40
+ const group = new Group();
41
+ group.add(new Mesh(new BufferGeometry(), matA));
42
+ group.add(new Mesh(new BufferGeometry(), matB));
43
+
44
+ // The shared texture's 16 bytes are counted once, not twice, and textures
45
+ // are not scaled by the geometry residency factor.
46
+ expect(sumModelGpuBytes(group)).toBe(16);
47
+ });
48
+
49
+ it("counts geometry and textures once each when both are present", () => {
50
+ const geometry = new BufferGeometry();
51
+ // 3 vertices × 3 floats × 4 bytes = 36 bytes.
52
+ geometry.setAttribute(
53
+ "position",
54
+ new Float32BufferAttribute([0, 0, 0, 1, 0, 0, 0, 1, 0], 3),
55
+ );
56
+ // 2×2 RGBA DataTexture → 16 bytes.
57
+ const tex = new DataTexture(new Uint8Array(16), 2, 2);
58
+
59
+ const group = new Group();
60
+ group.add(new Mesh(geometry, new MeshBasicMaterial({ map: tex })));
61
+
62
+ // 36 geometry bytes × 1 + 16 texture bytes × 1 = 52.
63
+ expect(sumModelGpuBytes(group)).toBe(36 + 16);
64
+ });
65
+
66
+ it("returns 0 for an empty object", () => {
67
+ expect(sumModelGpuBytes(new Group())).toBe(0);
68
+ });
69
+ });
@@ -0,0 +1,87 @@
1
+ import {
2
+ BufferGeometry,
3
+ type Material,
4
+ type Mesh,
5
+ type Object3D,
6
+ type Points,
7
+ type Texture,
8
+ } from "three";
9
+
10
+ /** After the first GPU upload the model's geometry attributes drop their
11
+ * CPU-side typed arrays via `onUpload` (see mesh/model.ts →
12
+ * releaseGeometryArraysAfterUpload), so only the GPU copy stays resident and
13
+ * each geometry byte is counted once. Mirrors the Rust
14
+ * `GPU_GEOMETRY_RESIDENCY_FACTOR` used for terrain/vector geometry. */
15
+ const GPU_GEOMETRY_RESIDENCY_FACTOR = 1;
16
+
17
+ /** Approximate GPU bytes of a texture: `image.data.byteLength` when present
18
+ * (raw DataTexture), else `width*height*4` (RGBA). Ignores mipmaps.
19
+ *
20
+ * Not scaled by the residency factor: `ImageBitmap`-backed textures (the glTF
21
+ * loader default) hand their pixels to the GPU and keep no CPU copy, so unlike
22
+ * geometry they are resident only once. `DataTexture`s do keep a CPU copy, but
23
+ * models rarely use them, so we accept the small undercount for simplicity. */
24
+ function textureGpuBytes(tex: Texture): number {
25
+ const img = tex.image as
26
+ | { data?: { byteLength?: number }; width?: number; height?: number }
27
+ | undefined;
28
+ if (img?.data?.byteLength) return img.data.byteLength;
29
+ if (img?.width && img?.height) return img.width * img.height * 4;
30
+ return 0;
31
+ }
32
+
33
+ /**
34
+ * Sum the decoded GPU bytes of a rendered model: every geometry's vertex
35
+ * attributes + index, plus each unique material texture. This is measured
36
+ * AFTER glTF/Draco decode (which inflates geometry well beyond the compressed
37
+ * payload), so it is the accurate figure to report to the memory ledger.
38
+ *
39
+ * Kept dependency-free (only `three`) so it can be unit-tested without pulling
40
+ * in the GLTF/Draco loader module chain.
41
+ */
42
+ export function sumModelGpuBytes(obj: Object3D): number {
43
+ let geometryBytes = 0;
44
+ let textureBytes = 0;
45
+ const seenGeometries = new Set<BufferGeometry>();
46
+ const seenTextures = new Set<Texture>();
47
+ obj.traverse((node) => {
48
+ const geometry = (node as Mesh | Points).geometry;
49
+ // Dedupe geometries too, not just textures: glTF instancing reuses one
50
+ // BufferGeometry across many nodes, and its GPU buffers are uploaded once,
51
+ // so counting it per-node would over-report and trip eviction early.
52
+ if (geometry instanceof BufferGeometry && !seenGeometries.has(geometry)) {
53
+ seenGeometries.add(geometry);
54
+ for (const attr of Object.values(geometry.attributes)) {
55
+ const array = (attr as { array?: { byteLength?: number } }).array;
56
+ if (array?.byteLength) geometryBytes += array.byteLength;
57
+ }
58
+ if (geometry.index?.array?.byteLength) {
59
+ geometryBytes += geometry.index.array.byteLength;
60
+ }
61
+ }
62
+ const material = (node as Mesh | Points).material as
63
+ | Material
64
+ | Material[]
65
+ | undefined;
66
+ const materials = Array.isArray(material)
67
+ ? material
68
+ : material
69
+ ? [material]
70
+ : [];
71
+ for (const mat of materials) {
72
+ for (const value of Object.values(mat)) {
73
+ if (
74
+ value &&
75
+ typeof value === "object" &&
76
+ "isTexture" in value &&
77
+ (value as Texture).isTexture &&
78
+ !seenTextures.has(value as Texture)
79
+ ) {
80
+ seenTextures.add(value as Texture);
81
+ textureBytes += textureGpuBytes(value as Texture);
82
+ }
83
+ }
84
+ }
85
+ });
86
+ return geometryBytes * GPU_GEOMETRY_RESIDENCY_FACTOR + textureBytes;
87
+ }
@@ -0,0 +1,25 @@
1
+ import { PointMesh as NavaraPointMesh } from "@navaramap/engine";
2
+
3
+ import { InstancedSpriteMesh } from "../../mesh";
4
+ import { FEATURE_RENDER_ORDER } from "../../renderOrder";
5
+ import type { EventContext } from "../context";
6
+
7
+ export async function renderPoint(ctx: EventContext, m: NavaraPointMesh) {
8
+ const mesh = new InstancedSpriteMesh({
9
+ renderOrder: FEATURE_RENDER_ORDER,
10
+ ctx,
11
+ });
12
+ await mesh._init(m);
13
+ mesh.setActive(m.active);
14
+
15
+ return mesh;
16
+ }
17
+
18
+ export function processPointChanged(
19
+ obj: InstancedSpriteMesh,
20
+ m: NavaraPointMesh,
21
+ active: boolean,
22
+ ) {
23
+ obj._update(m);
24
+ obj.setActive(active);
25
+ }
@@ -0,0 +1,23 @@
1
+ import type { TileHandle } from "@navaramap/core";
2
+ import type { PolygonMesh as NavaraPolygonMesh } from "@navaramap/engine";
3
+
4
+ import { PolygonMesh } from "../../mesh";
5
+ import type { EventContext } from "../context";
6
+
7
+ export async function renderPolygon(
8
+ ctx: EventContext,
9
+ mesh: NavaraPolygonMesh,
10
+ tileHandle: TileHandle | undefined,
11
+ layerId: string,
12
+ ) {
13
+ return new PolygonMesh(ctx, layerId).init(mesh, tileHandle);
14
+ }
15
+
16
+ export function processPolygonChanged(
17
+ obj: PolygonMesh,
18
+ m: NavaraPolygonMesh,
19
+ active: boolean,
20
+ tileHandle: TileHandle | undefined,
21
+ ) {
22
+ obj._update(m.material, active, !!tileHandle);
23
+ }
@@ -0,0 +1,19 @@
1
+ import type { PolygonMesh as NavaraPolygonMesh } from "@navaramap/engine";
2
+
3
+ import { PolygonOutlineMesh } from "../../mesh";
4
+ import type { EventContext } from "../context";
5
+
6
+ export async function renderPolygonOutline(
7
+ ctx: EventContext,
8
+ mesh: NavaraPolygonMesh,
9
+ ) {
10
+ return new PolygonOutlineMesh(ctx, mesh);
11
+ }
12
+
13
+ export function processPolygonOutlineChanged(
14
+ obj: PolygonOutlineMesh,
15
+ m: NavaraPolygonMesh,
16
+ active: boolean,
17
+ ) {
18
+ obj._update(m.material, active);
19
+ }
@@ -0,0 +1,19 @@
1
+ import { PolylineMesh as NavaraPolylineMesh } from "@navaramap/engine";
2
+
3
+ import { PolylineMesh } from "../../mesh";
4
+ import type { EventContext } from "../context";
5
+
6
+ export async function renderPolyline(
7
+ ctx: EventContext,
8
+ mesh: NavaraPolylineMesh,
9
+ ) {
10
+ return new PolylineMesh(ctx).init(mesh);
11
+ }
12
+
13
+ export function processPolylineChanged(
14
+ obj: PolylineMesh,
15
+ m: NavaraPolylineMesh,
16
+ active: boolean,
17
+ ) {
18
+ obj._update(m.material, active);
19
+ }
@@ -0,0 +1,71 @@
1
+ import { type TextMesh as NavaraTextMesh } from "@navaramap/engine";
2
+
3
+ import { BatchedSdfTextMesh } from "../../mesh";
4
+ import { FEATURE_RENDER_ORDER } from "../../renderOrder";
5
+ import type { EventContext } from "../context";
6
+
7
+ export async function renderText(
8
+ ctx: EventContext,
9
+ m: NavaraTextMesh,
10
+ layerId: string,
11
+ ) {
12
+ const { fontManager } = ctx;
13
+ const fontUrl = m.material.font;
14
+ if (!fontUrl || fontUrl === "") {
15
+ console.warn(
16
+ "material.font is required for text rendering but was not set.",
17
+ );
18
+ return;
19
+ }
20
+
21
+ // Use SDF pipeline when a font URL is specified and FontManager is available
22
+ if (fontManager) {
23
+ try {
24
+ // Load font(s) then shape the text so the cache is populated before mesh construction.
25
+ // For font families, only the face URLs needed for `text` are loaded (lazy).
26
+ // For raw URLs, the single font file is loaded directly.
27
+ const text = m.material.text ?? "";
28
+ const highQuality = m.material.highQuality ?? false;
29
+ const loadedFaceUrls = new Set<string>();
30
+ if (fontManager.isFamily(fontUrl)) {
31
+ if (text)
32
+ await fontManager.prepareText(
33
+ fontUrl,
34
+ text,
35
+ highQuality,
36
+ loadedFaceUrls,
37
+ );
38
+ } else {
39
+ await fontManager.loadFont(fontUrl, highQuality);
40
+ if (text) await fontManager.prepareText(fontUrl, text, highQuality);
41
+ }
42
+
43
+ const textGroup = new BatchedSdfTextMesh(
44
+ ctx,
45
+ m,
46
+ fontUrl,
47
+ {
48
+ renderOrder: FEATURE_RENDER_ORDER,
49
+ layerId,
50
+ },
51
+ loadedFaceUrls,
52
+ );
53
+ textGroup.setActive(m.active);
54
+
55
+ return textGroup;
56
+ } catch (e) {
57
+ console.warn(`Failed to load or prepare font "${fontUrl}". Error:`, e);
58
+ }
59
+ }
60
+ }
61
+
62
+ export async function processTextChanged(
63
+ obj: BatchedSdfTextMesh,
64
+ m: NavaraTextMesh,
65
+ active: boolean,
66
+ ) {
67
+ await obj._update(m, () => {
68
+ obj.ctx.renderFlag.forceUpdate = true;
69
+ });
70
+ obj.setActive(active);
71
+ }