@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,6 @@
1
+ import type { Object3DEventMap } from "three";
2
+
3
+ export type CustomObject3DEventMap = Object3DEventMap & {
4
+ removedFromWorld: undefined;
5
+ needsUpdate: undefined;
6
+ };
@@ -0,0 +1,147 @@
1
+ import { NamedIndexMap } from "@navaramap/core";
2
+ import { EffectComposer, Pass as PostProcessingPass } from "postprocessing";
3
+ import { HalfFloatType, Scene, WebGLRenderer, Group } from "three";
4
+
5
+ export type RenderPassOrchestratorOptions = {
6
+ halfFloat?: boolean;
7
+ multisampling?: number;
8
+ };
9
+
10
+ export type NamedPass = {
11
+ name: string;
12
+ pass: PostProcessingPass;
13
+ };
14
+
15
+ // Implementation policy:
16
+ // - Here we only manage Pass with an ordered Map mechanism.
17
+ // - When a Layer inserts with insertBefore/After, it inserts in the appropriate place.
18
+ // - If we render in order from the top, we can render while preserving dependencies.
19
+ // - As a preliminary step to the Layer mechanism, we want to be able to just freely add Pass from the ThreeView to the RenderPassOrchestrator.
20
+ // - Use NamedIndexMap for Pass management.
21
+
22
+ /**
23
+ * Orchestrate rendering passes with ordered management and flexible insertion.
24
+ */
25
+ export class RenderPassOrchestrator {
26
+ lights = new Group();
27
+ scenes = {
28
+ mrt: new Scene(),
29
+ globe: new Scene(),
30
+ draped: new Scene(),
31
+ opaque: new Scene(),
32
+ transparent: new Scene(),
33
+ skyEnvMap: new Scene(),
34
+ };
35
+ effectComposer: EffectComposer;
36
+
37
+ private passMap = new NamedIndexMap<NamedPass>();
38
+
39
+ constructor(renderer: WebGLRenderer, options: RenderPassOrchestratorOptions) {
40
+ // Setup render pass
41
+ this.effectComposer = new EffectComposer(renderer, {
42
+ stencilBuffer: true,
43
+ frameBufferType: (options.halfFloat ?? true) ? HalfFloatType : undefined,
44
+ multisampling: options.multisampling,
45
+ });
46
+ }
47
+
48
+ setSize(width: number, height: number) {
49
+ this.effectComposer.setSize(width, height);
50
+ }
51
+
52
+ render() {
53
+ this.effectComposer.render();
54
+ }
55
+
56
+ /**
57
+ * Add a named pass to the end of the pass list.
58
+ */
59
+ addPass(name: string, pass: PostProcessingPass): void {
60
+ const namedPass: NamedPass = { name, pass };
61
+ this.passMap.add(namedPass);
62
+ this.effectComposer.addPass(pass);
63
+ }
64
+
65
+ /**
66
+ * Insert a pass before the specified target pass.
67
+ */
68
+ insertPassBefore(
69
+ targetName: string,
70
+ name: string,
71
+ pass: PostProcessingPass,
72
+ ): void {
73
+ const namedPass: NamedPass = { name, pass };
74
+ const targetIndex = this.passMap.insertBefore(targetName, namedPass);
75
+ this.effectComposer.addPass(pass, targetIndex);
76
+ }
77
+
78
+ /**
79
+ * Insert a pass after the specified target pass.
80
+ */
81
+ insertPassAfter(
82
+ targetName: string,
83
+ name: string,
84
+ pass: PostProcessingPass,
85
+ ): void {
86
+ const namedPass: NamedPass = { name, pass };
87
+ const targetIndex = this.passMap.insertAfter(targetName, namedPass);
88
+ this.effectComposer.addPass(pass, targetIndex);
89
+ }
90
+
91
+ /**
92
+ * Remove a pass by name.
93
+ */
94
+ removePass(name: string): void {
95
+ const targetPass = this.passMap.list.find((p) => p.name === name);
96
+ if (!targetPass) {
97
+ throw new Error(`Pass not found: ${name}`);
98
+ }
99
+
100
+ this.effectComposer.removePass(targetPass.pass);
101
+ this.passMap.list = this.passMap.list.filter((p) => p.name !== name);
102
+ this.rebuildIndexMap();
103
+ }
104
+
105
+ /**
106
+ * Get a pass by name.
107
+ */
108
+ getPass(name: string): PostProcessingPass | undefined {
109
+ return this.passMap.list.find((p) => p.name === name)?.pass;
110
+ }
111
+
112
+ /**
113
+ * Get all pass names in order.
114
+ */
115
+ getPassNames(): string[] {
116
+ return this.passMap.list.map((p) => p.name);
117
+ }
118
+
119
+ /**
120
+ * Clear all passes.
121
+ */
122
+ clearPasses(): void {
123
+ for (const namedPass of this.passMap.list) {
124
+ this.effectComposer.removePass(namedPass.pass);
125
+ }
126
+ this.passMap.list = [];
127
+ this.passMap.indexMap = {};
128
+ }
129
+
130
+ /**
131
+ * Dispose all GPU resources held by the effect composer.
132
+ */
133
+ dispose(): void {
134
+ this.clearPasses();
135
+ this.effectComposer.dispose();
136
+ }
137
+
138
+ /**
139
+ * Rebuild the index map after manual list modification.
140
+ */
141
+ private rebuildIndexMap(): void {
142
+ this.passMap.indexMap = {};
143
+ for (let i = 0; i < this.passMap.list.length; i++) {
144
+ this.passMap.indexMap[this.passMap.list[i].name] = i;
145
+ }
146
+ }
147
+ }
@@ -0,0 +1 @@
1
+ export * from "./RenderPassOrchestrator";
@@ -0,0 +1,165 @@
1
+ import PostProcessingCommon from "@shaders/glsl/postprocessingCommon.vert.glsl";
2
+ import { CopyPass, Pass } from "postprocessing";
3
+ import {
4
+ BasicDepthPacking,
5
+ DepthTexture,
6
+ LinearFilter,
7
+ NoBlending,
8
+ RGBADepthPacking,
9
+ RGBAFormat,
10
+ ShaderMaterial,
11
+ Texture,
12
+ WebGLRenderTarget,
13
+ type DepthPackingStrategies,
14
+ type WebGLRenderer,
15
+ } from "three";
16
+
17
+ import { packing } from "../shaders";
18
+
19
+ const fragmentShader = `
20
+ #include <packing>
21
+
22
+ ${packing}
23
+
24
+ uniform sampler2D tDepth;
25
+ #ifdef MERGE_DEPTH
26
+ uniform sampler2D tExistingDepth;
27
+ #endif
28
+
29
+ varying vec2 vUv;
30
+
31
+ float readDepth() {
32
+ #if DEPTH_PACKING == 3201
33
+ return unpackRGBAToDepth(texture2D(tDepth, vUv));
34
+ #else
35
+ return texture2D(tDepth, vUv).r;
36
+ #endif
37
+ }
38
+
39
+ void main() {
40
+ float depth = readDepth();
41
+
42
+ #ifdef MERGE_DEPTH
43
+ float existingDepth = unpackRGBAToDepth(texture2D(tExistingDepth, vUv));
44
+ // Keep the minimum depth (closest to camera)
45
+ depth = min(depth, existingDepth);
46
+ #endif
47
+
48
+ gl_FragColor = packDepthToRGBA(depth);
49
+ }
50
+ `;
51
+
52
+ /**
53
+ * A pass that copies and optionally merges depth buffers.
54
+ * This is used to accumulate depths from multiple render stages.
55
+ */
56
+ export class AllDepthCopyPass extends Pass {
57
+ private _renderTarget: WebGLRenderTarget;
58
+ private _material: ShaderMaterial;
59
+ private _merge: boolean;
60
+
61
+ private _copyPassRenderTarget = new WebGLRenderTarget(1, 1, {
62
+ minFilter: LinearFilter,
63
+ magFilter: LinearFilter,
64
+ stencilBuffer: false,
65
+ depthBuffer: false,
66
+ });
67
+ private _copyPass = new CopyPass(this._copyPassRenderTarget);
68
+
69
+ constructor(renderTarget?: WebGLRenderTarget) {
70
+ super("AllDepthCopyPass");
71
+
72
+ this.needsSwap = false;
73
+
74
+ this._material = new ShaderMaterial({
75
+ uniforms: {
76
+ tDepth: { value: null },
77
+ tExistingDepth: { value: null },
78
+ },
79
+ vertexShader: PostProcessingCommon,
80
+ fragmentShader,
81
+ blending: NoBlending,
82
+ toneMapped: false,
83
+ depthWrite: false,
84
+ depthTest: false,
85
+ defines: {},
86
+ });
87
+
88
+ if (renderTarget) {
89
+ this._renderTarget = renderTarget;
90
+ } else {
91
+ this._renderTarget = new WebGLRenderTarget(1, 1, {
92
+ format: RGBAFormat,
93
+ minFilter: LinearFilter,
94
+ magFilter: LinearFilter,
95
+ generateMipmaps: false,
96
+ stencilBuffer: false,
97
+ depthBuffer: false,
98
+ });
99
+ }
100
+
101
+ this.fullscreenMaterial = this._material;
102
+ this._merge = false;
103
+ }
104
+
105
+ get texture(): Texture {
106
+ return this._renderTarget.texture;
107
+ }
108
+
109
+ get depthPacking(): DepthPackingStrategies {
110
+ return RGBADepthPacking; // This depth texture is always packed as RGBA.
111
+ }
112
+
113
+ /**
114
+ * Set the depth texture to copy from.
115
+ */
116
+ setDepthTexture(
117
+ texture: DepthTexture | Texture | null,
118
+ packing?: DepthPackingStrategies,
119
+ ): void {
120
+ this._material.uniforms.tDepth.value = texture;
121
+ this._material.defines.DEPTH_PACKING = packing ?? BasicDepthPacking;
122
+ }
123
+
124
+ /**
125
+ * Copy depth buffer, optionally merging with existing depth.
126
+ * @param merge - If true, merge with existing depth by keeping the minimum (closest) depth
127
+ */
128
+ copyDepth(merge = false): void {
129
+ this._merge = merge;
130
+ if (merge) {
131
+ // Store the current texture as the existing depth
132
+ this._material.uniforms.tExistingDepth.value = this._copyPass.texture;
133
+ this._material.defines.MERGE_DEPTH = "1";
134
+ } else {
135
+ delete this._material.defines.MERGE_DEPTH;
136
+ this._material.uniforms.tExistingDepth.value = null;
137
+ }
138
+ this._material.needsUpdate = true;
139
+ }
140
+
141
+ setSize(width: number, height: number): void {
142
+ this._renderTarget.setSize(width, height);
143
+ this._copyPass.setSize(width, height);
144
+ }
145
+
146
+ render(
147
+ renderer: WebGLRenderer,
148
+ _inputBuffer: WebGLRenderTarget | null,
149
+ _outputBuffer: WebGLRenderTarget | null,
150
+ ): void {
151
+ const renderTarget = this._renderTarget;
152
+
153
+ if (this._merge) {
154
+ this._copyPass.render(renderer, renderTarget, null);
155
+ }
156
+
157
+ renderer.setRenderTarget(renderTarget);
158
+ renderer.render(this.scene, this.camera);
159
+ }
160
+
161
+ dispose(): void {
162
+ this._renderTarget.dispose();
163
+ this._material.dispose();
164
+ }
165
+ }
@@ -0,0 +1,279 @@
1
+ import { Globe } from "@navaramap/core";
2
+ import { DepthCopyPass } from "postprocessing";
3
+ import {
4
+ Color,
5
+ DepthTexture,
6
+ HalfFloatType,
7
+ NearestFilter,
8
+ RGBADepthPacking,
9
+ Scene,
10
+ WebGLRenderTarget,
11
+ type PerspectiveCamera,
12
+ type WebGLRenderer,
13
+ } from "three";
14
+
15
+ import { RenderPass } from "../effects";
16
+ import { DrapedMesh } from "../mesh/DrapedMesh";
17
+ import type { Scenes } from "../scene";
18
+
19
+ import { AllDepthCopyPass, NormalCopyPass, RenderTargetCopyPass } from ".";
20
+
21
+ // Scratch color reused when re-asserting the clear color each frame.
22
+ const CLEAR_COLOR = new Color();
23
+
24
+ /**
25
+ * Options for CustomRenderPass
26
+ */
27
+ export type CustomRenderPassOptions = {
28
+ debugNormal?: boolean;
29
+ disableShadow?: boolean;
30
+ allowTransparent?: boolean;
31
+ };
32
+
33
+ export class CustomRenderPass extends RenderPass {
34
+ protected _camera: PerspectiveCamera;
35
+ protected _scenes: Scenes;
36
+ gbufferRenderTarget: WebGLRenderTarget;
37
+ private copyPass: RenderTargetCopyPass;
38
+ globeDepthCopyPass: DepthCopyPass;
39
+ globeNormalCopyPass: NormalCopyPass;
40
+ allDepthCopyPass: AllDepthCopyPass;
41
+ disableShadow: boolean;
42
+ private globe: Globe;
43
+ private combinedScene = new Scene();
44
+ private drapedTempScene = new Scene();
45
+
46
+ // Used to render only the shadow map
47
+ private shadowScene = new Scene();
48
+ private dummyShadowRenderTarget = new WebGLRenderTarget(1, 1, {
49
+ depthBuffer: true,
50
+ stencilBuffer: false,
51
+ });
52
+
53
+ private debugNormalCopyPass?: NormalCopyPass;
54
+ private allowTransparent: boolean;
55
+
56
+ constructor(
57
+ scenes: Scenes,
58
+ camera: PerspectiveCamera,
59
+ inputBuffer: WebGLRenderTarget,
60
+ globe: Globe,
61
+ options?: CustomRenderPassOptions,
62
+ ) {
63
+ super();
64
+
65
+ this.needsDepthTexture = true;
66
+
67
+ this.clearPass.setClearFlags(true, true, true);
68
+
69
+ this._scenes = scenes;
70
+ this._camera = camera;
71
+ this.globe = globe;
72
+
73
+ this.gbufferRenderTarget = inputBuffer.clone();
74
+ // attachment 1: normal buffer
75
+ this.gbufferRenderTarget.textures.push(
76
+ this.gbufferRenderTarget.texture.clone(),
77
+ );
78
+ // attachment 2: effectIds buffer
79
+ // HalfFloatType preserves integer masks up to 11 bits (0..2047) exactly.
80
+ // NearestFilter is required because this stores discrete bitmask data.
81
+ const effectIdsTexture = this.gbufferRenderTarget.texture.clone();
82
+ effectIdsTexture.type = HalfFloatType;
83
+ effectIdsTexture.minFilter = NearestFilter;
84
+ effectIdsTexture.magFilter = NearestFilter;
85
+ effectIdsTexture.generateMipmaps = false;
86
+ this.gbufferRenderTarget.textures.push(effectIdsTexture);
87
+ // attachment 3: emissive buffer (RGB=diffuseColor×intensity+emissive additive, A=unused)
88
+ // HalfFloatType preserves HDR emissive values for bloom extraction.
89
+ const emissiveTexture = this.gbufferRenderTarget.texture.clone();
90
+ emissiveTexture.type = HalfFloatType;
91
+ this.gbufferRenderTarget.textures.push(emissiveTexture);
92
+
93
+ this.copyPass = new RenderTargetCopyPass(this.gbufferRenderTarget);
94
+
95
+ this.globeDepthCopyPass = new DepthCopyPass({
96
+ depthPacking: RGBADepthPacking,
97
+ });
98
+
99
+ this.allDepthCopyPass = new AllDepthCopyPass();
100
+
101
+ this.disableShadow = !!options?.disableShadow;
102
+ this.allowTransparent = options?.allowTransparent ?? true;
103
+
104
+ this.globeNormalCopyPass = new NormalCopyPass();
105
+ this.globeNormalCopyPass.setNormalTexture(
106
+ this.gbufferRenderTarget.textures[1],
107
+ );
108
+ if (options?.debugNormal) {
109
+ this.debugNormalCopyPass = new NormalCopyPass();
110
+ this.debugNormalCopyPass.unpackNormal = true;
111
+ this.debugNormalCopyPass.setNormalTexture(
112
+ this.gbufferRenderTarget.textures[1],
113
+ );
114
+ }
115
+ }
116
+
117
+ // Render the scene with world scene that includes user setting object like a light.
118
+ protected _renderWithLight(renderer: WebGLRenderer, scene: Scene) {
119
+ if (this.disableShadow) {
120
+ renderer.render(scene, this._camera);
121
+ return;
122
+ }
123
+ scene.add(this._scenes.light);
124
+ renderer.render(scene, this._camera);
125
+ scene.remove(this._scenes.light);
126
+ }
127
+
128
+ render(
129
+ renderer: WebGLRenderer,
130
+ inputBuffer: WebGLRenderTarget | null,
131
+ _outputBuffer: WebGLRenderTarget | null,
132
+ ) {
133
+ const shouldDrapeByStencilTest = this._scenes.draped.children.length !== 0;
134
+
135
+ const renderTarget = this.gbufferRenderTarget;
136
+
137
+ if (this.clearPass.enabled) {
138
+ this.clearPass.render(renderer, inputBuffer, null);
139
+ }
140
+
141
+ // Render shadow map
142
+ if (renderer.shadowMap.enabled && !this.disableShadow) {
143
+ renderer.setRenderTarget(this.dummyShadowRenderTarget);
144
+ this.shadowScene.add(this._scenes.globe);
145
+ this.shadowScene.add(this._scenes.mrt);
146
+ this.shadowScene.add(this._scenes.opaque);
147
+ renderer.shadowMap.needsUpdate = true;
148
+ this._renderWithLight(renderer, this.shadowScene);
149
+ this.shadowScene.clear();
150
+ }
151
+
152
+ const clearDepth =
153
+ !this.globe.hideUnderground ||
154
+ // If transparent isn't allowed, show the underground. For example, the picking process doesn't need transparency.
155
+ // The underground should be shown when `transparent` is true to pick the underground object.
156
+ (!this.allowTransparent && this.globe.transparent);
157
+
158
+ renderer.setRenderTarget(renderTarget);
159
+ renderer.setClearColor(
160
+ renderer.getClearColor(CLEAR_COLOR),
161
+ renderer.getClearAlpha(),
162
+ );
163
+ renderer.clear();
164
+
165
+ this._renderWithLight(renderer, this._scenes.globe);
166
+
167
+ // Set normal texture for copy pass
168
+ this.globeNormalCopyPass.render(renderer, null, null);
169
+
170
+ this.globeDepthCopyPass.setDepthTexture(
171
+ renderTarget.depthTexture as DepthTexture,
172
+ );
173
+ this.globeDepthCopyPass.render(renderer, null, null);
174
+
175
+ if (clearDepth) {
176
+ // Copy globe depth to the all depth buffer
177
+ this.allDepthCopyPass.setDepthTexture(
178
+ this.globeDepthCopyPass.texture,
179
+ RGBADepthPacking,
180
+ );
181
+ this.allDepthCopyPass.copyDepth(false);
182
+ this.allDepthCopyPass.render(renderer, null, null);
183
+ }
184
+
185
+ // Set actual renderTarget again because it's changed in copy passes
186
+ renderer.setRenderTarget(renderTarget);
187
+
188
+ if (clearDepth) {
189
+ // Clear depth if hideUnderground is false.
190
+ renderer.clearDepth();
191
+ }
192
+
193
+ const shouldBlend =
194
+ !clearDepth &&
195
+ this.allowTransparent &&
196
+ this.globe.transparent &&
197
+ this.globe.hideUnderground;
198
+
199
+ if (shouldBlend) {
200
+ // Clear just color for blending.
201
+ // Also avoid to reset depth before draping by stencil buffer.
202
+ renderer.clearColor();
203
+ }
204
+
205
+ if (shouldDrapeByStencilTest) {
206
+ this._renderDrapedMesh(renderer);
207
+ }
208
+
209
+ if (shouldBlend) {
210
+ // Clear depth as well after stencil buffer draping.
211
+ renderer.clearDepth();
212
+ }
213
+
214
+ // If globe can be transparent, need to render all scene in same scene to blend them.
215
+ // Currently, blending is supported only with MRT scene.
216
+ if (shouldBlend) {
217
+ this.combinedScene.clear();
218
+ this.combinedScene.add(this._scenes.globe);
219
+ this.combinedScene.add(this._scenes.mrt);
220
+ this._renderWithLight(renderer, this.combinedScene);
221
+ } else {
222
+ this._renderWithLight(renderer, this._scenes.mrt);
223
+ }
224
+
225
+ this.debugNormalCopyPass?.render(renderer, null, null);
226
+
227
+ const finalTarget = this.renderToScreen ? null : inputBuffer;
228
+
229
+ if (this.debugNormalCopyPass) {
230
+ this.copyPass.setTexture(this.debugNormalCopyPass.texture);
231
+ }
232
+ this.copyPass.render(renderer, finalTarget, null);
233
+
234
+ this._renderWithLight(renderer, this._scenes.opaque);
235
+
236
+ // Copy all depth (globe + MRT + opaque) to the all depth buffer.
237
+ // The renderTarget's depth texture now contains all rendered depth.
238
+ this.allDepthCopyPass.setDepthTexture(finalTarget?.depthTexture ?? null);
239
+ this.allDepthCopyPass.copyDepth(clearDepth);
240
+ this.allDepthCopyPass.render(renderer, null, null);
241
+ }
242
+
243
+ setDepthTexture(depthTexture: DepthTexture): void {
244
+ this.gbufferRenderTarget.depthTexture = depthTexture;
245
+ this.globeDepthCopyPass.setDepthTexture(depthTexture.clone());
246
+ this.copyPass.setDepthTexture(depthTexture);
247
+ }
248
+
249
+ setSize(width: number, height: number) {
250
+ this.gbufferRenderTarget.setSize(width, height);
251
+ this.globeDepthCopyPass.setSize(width, height);
252
+ this.allDepthCopyPass.setSize(width, height);
253
+ this.globeNormalCopyPass.setSize(width, height);
254
+ this.debugNormalCopyPass?.setSize(width, height);
255
+ }
256
+
257
+ // Drape a feature on the terrain by stencil test.
258
+ // Refs
259
+ // - https://www.isprs.org/proceedings/XXXVII/congress/2_pdf/5_WG-II-5/06.pdf
260
+ // - http://wscg.zcu.cz/WSCG2007/Papers_2007/journal/B17-full.pdf
261
+ protected _renderDrapedMesh(renderer: WebGLRenderer) {
262
+ const drapedScene = this._scenes.draped;
263
+ const children = [...drapedScene.children];
264
+
265
+ for (const child of children) {
266
+ if (!(child instanceof DrapedMesh) || !child.enabled()) continue;
267
+
268
+ drapedScene.remove(child);
269
+ this.drapedTempScene.add(child);
270
+
271
+ child.process(() =>
272
+ this._renderWithLight(renderer, this.drapedTempScene),
273
+ );
274
+
275
+ this.drapedTempScene.remove(child);
276
+ drapedScene.add(child);
277
+ }
278
+ }
279
+ }