@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,439 @@
1
+ // Ref: https://github.com/takram-design-engineering/three-geospatial/blob/main/packages/effects/src/setupMaterialsForGeometryPass.ts
2
+
3
+ import { packing } from "@takram/three-geospatial/shaders";
4
+ import { ShaderLib, ShaderMaterial, type ShaderLibShader } from "three";
5
+ import { LineMaterial } from "three-stdlib";
6
+
7
+ import { createReplacer } from "../utils";
8
+
9
+ const SETUP = Symbol("SETUP");
10
+
11
+ declare module "three" {
12
+ // eslint-disable-next-line @typescript-eslint/consistent-type-definitions
13
+ interface ShaderLibShader {
14
+ [SETUP]?: boolean;
15
+ }
16
+ // eslint-disable-next-line @typescript-eslint/consistent-type-definitions
17
+ interface ShaderMaterial {
18
+ [SETUP]?: boolean;
19
+ }
20
+ }
21
+
22
+ function injectNormal(shader: ShaderLibShader): ShaderLibShader {
23
+ const vertexShader = createReplacer(shader.vertexShader)
24
+ .replace(
25
+ /* glsl */ `#include <fog_pars_vertex>`,
26
+ /* glsl */ `
27
+ #include <fog_pars_vertex>
28
+ #include <normal_pars_vertex>
29
+ `,
30
+ )
31
+ .replace(
32
+ /* glsl */ `#include <defaultnormal_vertex>`,
33
+ /* glsl */ `
34
+ #include <defaultnormal_vertex>
35
+ #include <normal_vertex>
36
+ `,
37
+ )
38
+ .replace(
39
+ /* glsl */ `#if defined ( USE_ENVMAP ) || defined ( USE_SKINNING )`,
40
+ /* glsl */ `#if 1`,
41
+ )
42
+ .replace(
43
+ /* glsl */ `#include <clipping_planes_vertex>`,
44
+ /* glsl */ `
45
+ #include <clipping_planes_vertex>
46
+ vViewPosition = - mvPosition.xyz;
47
+ `,
48
+ ).source;
49
+ shader.vertexShader = /* glsl */ `
50
+ #undef FLAT_SHADED
51
+ varying vec3 vViewPosition;
52
+ ${vertexShader}
53
+ `;
54
+
55
+ const fragmentShader = createReplacer(shader.fragmentShader)
56
+ .replace(
57
+ /#ifndef FLAT_SHADED\s+varying vec3 vNormal;\s+#endif/m,
58
+ /* glsl */ `#include <normal_pars_fragment>`,
59
+ )
60
+ .replace(
61
+ /* glsl */ `#include <common>`,
62
+ /* glsl */ `
63
+ #include <common>
64
+ #include <packing>
65
+ `,
66
+ )
67
+ .replace(
68
+ /* glsl */ `#include <specularmap_fragment>`,
69
+ /* glsl */ `
70
+ #include <specularmap_fragment>
71
+ #include <normal_fragment_begin>
72
+ #include <normal_fragment_maps>
73
+ `,
74
+ ).source;
75
+ shader.fragmentShader = /* glsl */ `
76
+ #undef FLAT_SHADED
77
+ varying vec3 vViewPosition;
78
+ ${fragmentShader}
79
+ `;
80
+
81
+ return shader;
82
+ }
83
+
84
+ function injectGBuffer(
85
+ shader: ShaderLibShader,
86
+ { type }: { type?: "basic" | "physical" } = {},
87
+ ): ShaderLibShader {
88
+ if (shader[SETUP] === true) {
89
+ return shader;
90
+ }
91
+ if (type === "basic") {
92
+ injectNormal(shader);
93
+ }
94
+ const normalBufferWrite =
95
+ type === "physical"
96
+ ? /* glsl */ `
97
+ normalBuffer = vec4(packNormalToVec2(normal), metalnessFactor, roughnessFactor)
98
+ `
99
+ : /* glsl */ `
100
+ #ifdef USE_ROUGHNESS
101
+ float roughnessFactor = roughness;
102
+ #else
103
+ float roughnessFactor = 0.0;
104
+ #endif
105
+ normalBuffer = vec4(packNormalToVec2(normal), reflectivity, roughnessFactor);
106
+ `;
107
+ shader.fragmentShader = /* glsl */ `
108
+ // MRT layout:
109
+ // location 0: gl_FragColor (color)
110
+ // location 1: normalBuffer (normal + material props)
111
+ // location 2: effectIdBuffer (effectIds: R=bitmask) — SelectiveEffect only
112
+ // location 3: emissiveBuffer (emissive: RGB=diffuseColor×intensity+emissive additive, A=unused) — SelectiveEffect only
113
+ #ifndef USE_SHADOWMAP_DEPTH
114
+ layout(location = 1) out vec4 normalBuffer;
115
+ layout(location = 2) out vec4 effectIdBuffer;
116
+ layout(location = 3) out vec4 emissiveBuffer;
117
+ #endif
118
+
119
+ #if !defined(USE_ENVMAP)
120
+ uniform float reflectivity;
121
+ #endif // !defined(USE_ENVMAP)
122
+
123
+ #ifdef USE_ROUGHNESS
124
+ uniform float roughness;
125
+ #endif // USE_ROUGHNESS
126
+
127
+ #ifdef USE_SELECTIVE_EFFECT
128
+ uniform float uEffectIdsMask;
129
+ uniform float uEmissiveIntensity;
130
+ #endif
131
+
132
+ ${packing}
133
+ ${
134
+ createReplacer(shader.fragmentShader).replace(
135
+ /}\s*$/, // Assume the last curly brace is of main()
136
+ /* glsl */ `
137
+ #ifndef USE_SHADOWMAP_DEPTH
138
+ ${normalBufferWrite};
139
+
140
+ #ifdef USE_SELECTIVE_EFFECT
141
+ effectIdBuffer = vec4(uEffectIdsMask, 0.0, 0.0, 1.0);
142
+ emissiveBuffer = vec4(diffuseColor.rgb * uEmissiveIntensity + emissive, 1.0);
143
+ #else
144
+ effectIdBuffer = vec4(0.0);
145
+ emissiveBuffer = vec4(0.0);
146
+ #endif
147
+ #endif
148
+ }
149
+ `,
150
+ ).source
151
+ }
152
+ `;
153
+ shader[SETUP] = true;
154
+ return shader;
155
+ }
156
+
157
+ function injectGBufferToSpriteMaterial(shader: ShaderLibShader) {
158
+ if (shader[SETUP] === true) {
159
+ return shader;
160
+ }
161
+
162
+ shader.vertexShader = /* glsl */ `
163
+ varying vec3 vViewPosition;
164
+ ${
165
+ createReplacer(shader.vertexShader).replace(
166
+ /}\s*$/,
167
+ `
168
+ vViewPosition = -mvPosition.xyz;
169
+ }
170
+ `,
171
+ ).source
172
+ }
173
+ `;
174
+
175
+ shader.fragmentShader = /* glsl */ `
176
+ layout(location = 1) out vec4 normalBuffer;
177
+ layout(location = 2) out vec4 effectIdBuffer;
178
+ layout(location = 3) out vec4 emissiveBuffer;
179
+
180
+ #ifdef USE_SELECTIVE_EFFECT
181
+ uniform float uEffectIdsMask;
182
+ #endif
183
+
184
+ varying vec3 vViewPosition;
185
+
186
+ ${packing}
187
+
188
+ ${
189
+ createReplacer(shader.fragmentShader).replace(
190
+ /}\s*$/, // Assume the last curly brace is of main()
191
+ /* glsl */ `
192
+ // Flat shading
193
+ vec3 fdx = dFdx( vViewPosition );
194
+ vec3 fdy = dFdy( vViewPosition );
195
+ vec3 normal = normalize( cross( fdx, fdy ) );
196
+ normalBuffer = vec4(
197
+ packNormalToVec2(normal),
198
+ 0.0,
199
+ 0.0
200
+ );
201
+
202
+ #ifdef USE_SELECTIVE_EFFECT
203
+ effectIdBuffer = vec4(uEffectIdsMask, 0.0, 0.0, 1.0);
204
+ emissiveBuffer = vec4(0.0);
205
+ #else
206
+ effectIdBuffer = vec4(0.0);
207
+ emissiveBuffer = vec4(0.0);
208
+ #endif
209
+ }
210
+ `,
211
+ ).source
212
+ }
213
+ `;
214
+
215
+ shader[SETUP] = true;
216
+
217
+ return shader;
218
+ }
219
+
220
+ /**
221
+ * @internal
222
+ * Patches all built-in Three.js `ShaderLib` materials (basic, lambert, phong,
223
+ * standard, physical, sprite, points) so they write to the MRT G-buffer.
224
+ * Called automatically when `@navaramap/three` is imported — application code
225
+ * never needs to call this. Custom `ShaderMaterial`/`LineMaterial` do not go
226
+ * through `ShaderLib`, so they must opt in via {@link setupMaterialForMRT}.
227
+ */
228
+ export function overrideMaterialsForMRT(): void {
229
+ injectGBuffer(ShaderLib.lambert);
230
+ injectGBuffer(ShaderLib.phong);
231
+ injectGBuffer(ShaderLib.basic, { type: "basic" });
232
+ injectGBuffer(ShaderLib.standard, { type: "physical" });
233
+ injectGBuffer(ShaderLib.physical, { type: "physical" });
234
+ injectGBufferToSpriteMaterial(ShaderLib.sprite);
235
+ injectGBufferToSpriteMaterial(ShaderLib.points);
236
+ }
237
+
238
+ // TODO: Use a parser to handle this.
239
+ function injectGBufferToShaderMaterial(
240
+ shader: ShaderMaterial,
241
+ normalVariableName = "normal",
242
+ ): ShaderLibShader {
243
+ if (shader[SETUP] === true) {
244
+ return shader;
245
+ }
246
+
247
+ // Vertex shader
248
+ const common = "#include <common>";
249
+
250
+ const logdepthParsVert = "#include <logdepthbuf_pars_vertex>";
251
+ const logdepthVert = "#include <logdepthbuf_vertex>";
252
+
253
+ shader.vertexShader = /* glsl */ `
254
+ ${shader.vertexShader.includes(common) ? "" : common}
255
+ ${shader.vertexShader.includes(logdepthParsVert) ? "" : logdepthParsVert}
256
+
257
+ ${
258
+ createReplacer(shader.vertexShader).replace(
259
+ /}\s*$/, // Assume the last curly brace is of main()
260
+ /* glsl */ `
261
+ ${shader.vertexShader.includes(logdepthVert) ? "" : logdepthVert}
262
+ }
263
+ `,
264
+ ).source
265
+ }
266
+ `;
267
+
268
+ // Fragment shader
269
+ const logdepthParsFrag = "#include <logdepthbuf_pars_fragment>";
270
+ const logdepthFrag = "#include <logdepthbuf_fragment>";
271
+ const normalBufferWrite = /* glsl */ `
272
+ vec4(
273
+ packNormalToVec2(${normalVariableName}),
274
+ 0.0,
275
+ 0.0
276
+ );
277
+ `;
278
+ shader.fragmentShader = /* glsl */ `
279
+ #ifndef USE_SHADOWMAP_DEPTH
280
+ layout(location = 1) out vec4 normalBuffer;
281
+ layout(location = 2) out vec4 effectIdBuffer;
282
+ layout(location = 3) out vec4 emissiveBuffer;
283
+
284
+ #ifdef USE_SELECTIVE_EFFECT
285
+ uniform float uEffectIdsMask;
286
+ uniform vec3 uEmissiveColor;
287
+ uniform float uEmissiveIntensity;
288
+ #endif
289
+ #endif
290
+
291
+ ${packing}
292
+
293
+ ${shader.fragmentShader.includes(logdepthParsFrag) ? "" : logdepthParsFrag}
294
+
295
+ ${
296
+ createReplacer(shader.fragmentShader).replace(
297
+ /}\s*$/, // Assume the last curly brace is of main()
298
+ /* glsl */ `
299
+ ${shader.fragmentShader.includes(logdepthFrag) ? "" : logdepthFrag}
300
+
301
+ #ifndef USE_SHADOWMAP_DEPTH
302
+ normalBuffer = ${normalBufferWrite};
303
+
304
+ #ifdef USE_SELECTIVE_EFFECT
305
+ effectIdBuffer = vec4(uEffectIdsMask, 0.0, 0.0, 1.0);
306
+ emissiveBuffer = vec4((gl_FragColor.rgb + uEmissiveColor) * uEmissiveIntensity, 1.0);
307
+ #else
308
+ effectIdBuffer = vec4(0.0);
309
+ emissiveBuffer = vec4(0.0);
310
+ #endif
311
+ #endif
312
+ }
313
+ `,
314
+ ).source
315
+ }
316
+ `;
317
+
318
+ shader[SETUP] = true;
319
+
320
+ return shader;
321
+ }
322
+
323
+ export type SetupMaterialForMRTOptions = {
324
+ /**
325
+ * Name of the GLSL variable holding the **view-space** normal in the
326
+ * fragment shader (it is packed with `packNormalToVec2`, which assumes
327
+ * view space). Defaults to `"normal"`. Shaders that expose their normal as
328
+ * a `varying vec3 vNormal` should pass `{ normal: "vNormal" }`.
329
+ *
330
+ * Ignored for `LineMaterial`, which derives a screen-space normal itself.
331
+ */
332
+ normal?: string;
333
+ };
334
+
335
+ // LineMaterial MRT Support. Injects normalBuffer, effectIdBuffer, emissiveBuffer outputs.
336
+ // When USE_SELECTIVE_EFFECT is defined, outputs effectIdsMask (emissive not supported for LineMaterial).
337
+ function injectGBufferToLineMaterial(lineMaterial: LineMaterial) {
338
+ if (lineMaterial[SETUP] === true) {
339
+ return lineMaterial;
340
+ }
341
+
342
+ // Check if this is actually a LineMaterial from three-stdlib
343
+ if (
344
+ !lineMaterial.fragmentShader ||
345
+ !lineMaterial.fragmentShader.includes("vLineDistance")
346
+ ) {
347
+ return lineMaterial;
348
+ }
349
+
350
+ // LineMaterial already has proper vertex shader setup, so we only modify fragment shader
351
+
352
+ lineMaterial.fragmentShader = /* glsl */ `
353
+ layout(location = 1) out vec4 normalBuffer;
354
+ layout(location = 2) out vec4 effectIdBuffer;
355
+ layout(location = 3) out vec4 emissiveBuffer;
356
+
357
+ #ifdef USE_SELECTIVE_EFFECT
358
+ uniform float uEffectIdsMask;
359
+ #endif
360
+
361
+ ${packing}
362
+
363
+ ${
364
+ createReplacer(lineMaterial.fragmentShader)
365
+ .replace(
366
+ "void main() {",
367
+ /* glsl */ `
368
+ void main() {
369
+ // Calculate screen-space normal for Line2 MRT compatibility
370
+ vec3 fdx = dFdx(gl_FragCoord.xyz);
371
+ vec3 fdy = dFdy(gl_FragCoord.xyz);
372
+ vec3 normal = normalize(cross(fdx, fdy));
373
+
374
+ // Ensure normal faces camera (positive Z in screen space)
375
+ if (normal.z < 0.0) normal = -normal;
376
+ `,
377
+ )
378
+ .replace(
379
+ /}\s*$/, // Assume the last curly brace is of main()
380
+ /* glsl */ `
381
+ normalBuffer = vec4(
382
+ packNormalToVec2(normal),
383
+ 0.0,
384
+ 0.0
385
+ );
386
+
387
+ #ifdef USE_SELECTIVE_EFFECT
388
+ effectIdBuffer = vec4(uEffectIdsMask, 0.0, 0.0, 1.0);
389
+ emissiveBuffer = vec4(0.0);
390
+ #else
391
+ effectIdBuffer = vec4(0.0);
392
+ emissiveBuffer = vec4(0.0);
393
+ #endif
394
+ }
395
+ `,
396
+ ).source
397
+ }
398
+ `;
399
+
400
+ lineMaterial[SETUP] = true;
401
+
402
+ return lineMaterial;
403
+ }
404
+
405
+ /**
406
+ * Wire a custom material into Navara's MRT G-buffer so depth/normal-based
407
+ * effects (SSAO, SSR, outline, aerial perspective, clouds) and SelectiveEffect
408
+ * (Bloom/Outline) work on the mesh that uses it.
409
+ *
410
+ * Built-in Three.js materials (`MeshStandardMaterial`, `MeshBasicMaterial`,
411
+ * `Sprite`, `Points`, …) are patched automatically on import and do **not**
412
+ * need this. Only custom `ShaderMaterial` and three-stdlib `LineMaterial`
413
+ * bypass `ShaderLib`, so they must opt in here.
414
+ *
415
+ * `LineMaterial` is detected and routed automatically; the `normal` option is
416
+ * only used for plain `ShaderMaterial`.
417
+ *
418
+ * Injects `normalBuffer` (location 1), `effectIdBuffer` (location 2), and
419
+ * `emissiveBuffer` (location 3). For `ShaderMaterial` it also injects the
420
+ * `logdepthbuf` modules; `LineMaterial` already has its own vertex setup, so
421
+ * those are not added. When `USE_SELECTIVE_EFFECT` is defined,
422
+ * `effectIdBuffer`/`emissiveBuffer` are populated (emissive is unsupported for
423
+ * `LineMaterial`). Idempotent — calling it more than once on the same material
424
+ * is a no-op.
425
+ *
426
+ * Requirements for `ShaderMaterial`: the fragment shader must expose a
427
+ * view-space normal (named by `options.normal`, default `"normal"`), and the
428
+ * last `}` in each shader is assumed to close `main()`.
429
+ */
430
+ export function setupMaterialForMRT(
431
+ material: ShaderMaterial,
432
+ options?: SetupMaterialForMRTOptions,
433
+ ): void {
434
+ if (material instanceof LineMaterial) {
435
+ injectGBufferToLineMaterial(material);
436
+ return;
437
+ }
438
+ injectGBufferToShaderMaterial(material, options?.normal);
439
+ }
@@ -0,0 +1,52 @@
1
+ import { MeshLambertMaterial } from "three";
2
+ import { describe, expect, it } from "vitest";
3
+
4
+ import { setupSelectiveEffectUniforms } from "./selectiveEffectMaterialSetup";
5
+
6
+ describe("setupSelectiveEffectUniforms", () => {
7
+ it("should link uEmissiveIntensity that auto-syncs with material.emissiveIntensity", () => {
8
+ const material = new MeshLambertMaterial();
9
+ material.emissiveIntensity = 0.5;
10
+ setupSelectiveEffectUniforms(material);
11
+
12
+ // Initial value should match material.emissiveIntensity
13
+ expect(material.userData.uEmissiveIntensity.value).toBe(0.5);
14
+
15
+ // Changing material.emissiveIntensity should be reflected via getter
16
+ material.emissiveIntensity = 0.8;
17
+ expect(material.userData.uEmissiveIntensity.value).toBe(0.8);
18
+ });
19
+
20
+ it("should link uEffectIdsMask uniform", () => {
21
+ const material = new MeshLambertMaterial();
22
+ setupSelectiveEffectUniforms(material);
23
+
24
+ expect(material.userData.uEffectIdsMask).toBeDefined();
25
+ expect(material.userData.uEffectIdsMask.value).toBe(0);
26
+ });
27
+
28
+ it("should set USE_SELECTIVE_EFFECT define", () => {
29
+ const material = new MeshLambertMaterial();
30
+ setupSelectiveEffectUniforms(material);
31
+
32
+ expect(material.defines?.USE_SELECTIVE_EFFECT).toBe(1);
33
+ });
34
+
35
+ it("should include SelectiveEffect in program cache key", () => {
36
+ const material = new MeshLambertMaterial();
37
+ setupSelectiveEffectUniforms(material);
38
+
39
+ const cacheKey = material.customProgramCacheKey();
40
+ expect(cacheKey).toContain("SelectiveEffect");
41
+ });
42
+
43
+ it("should be idempotent — second call is a no-op", () => {
44
+ const material = new MeshLambertMaterial();
45
+ setupSelectiveEffectUniforms(material);
46
+
47
+ const firstRef = material.userData.uEffectIdsMask;
48
+ setupSelectiveEffectUniforms(material);
49
+
50
+ expect(material.userData.uEffectIdsMask).toBe(firstRef);
51
+ });
52
+ });
@@ -0,0 +1,53 @@
1
+ import type { MeshLambertMaterial, MeshStandardMaterial } from "three";
2
+
3
+ const SELECTIVE_EFFECT_SETUP = Symbol("SELECTIVE_EFFECT_SETUP");
4
+
5
+ /**
6
+ * Set up Selective Effect defines and uniforms on a standard Three.js material.
7
+ * Sets USE_SELECTIVE_EFFECT define so the MRT shader writes effectIds + emissive.
8
+ * Emissive output uses additive blend: diffuseColor × emissiveIntensity + emissive.
9
+ * Used by non-enhancer meshes (Box, Sphere, etc.).
10
+ *
11
+ * Idempotent — calling multiple times on the same material is safe (no-op after first call).
12
+ */
13
+ export function setupSelectiveEffectUniforms(
14
+ material: MeshLambertMaterial | MeshStandardMaterial,
15
+ ): void {
16
+ // Guard: only set up once per material
17
+ if ((material as unknown as Record<symbol, boolean>)[SELECTIVE_EFFECT_SETUP])
18
+ return;
19
+ (material as unknown as Record<symbol, boolean>)[SELECTIVE_EFFECT_SETUP] =
20
+ true;
21
+
22
+ material.userData.uEffectIdsMask = { value: 0 };
23
+ // Getter-based uniform: auto-syncs with material.emissiveIntensity without manual updates
24
+ material.userData.uEmissiveIntensity = {
25
+ get value() {
26
+ return material.emissiveIntensity;
27
+ },
28
+ };
29
+
30
+ // Set define on material.defines so Three.js includes it in program cache key.
31
+ // This ensures SelectiveEffect and non-SelectiveEffect materials get separate compiled programs.
32
+ material.defines = material.defines ?? {};
33
+ material.defines.USE_SELECTIVE_EFFECT = 1;
34
+
35
+ // Include SelectiveEffect token in program cache key to prevent program sharing
36
+ const prevCacheKey = material.customProgramCacheKey;
37
+ material.customProgramCacheKey = () => {
38
+ const base = prevCacheKey ? prevCacheKey.call(material) : "";
39
+ return `${base}_SelectiveEffect`;
40
+ };
41
+
42
+ const prevOnBeforeCompile = material.onBeforeCompile;
43
+ material.onBeforeCompile = (shader, renderer) => {
44
+ prevOnBeforeCompile?.call(material, shader, renderer);
45
+
46
+ // Link SelectiveEffect uniforms for runtime value updates
47
+ shader.uniforms.uEffectIdsMask = material.userData.uEffectIdsMask;
48
+ shader.uniforms.uEmissiveIntensity = material.userData.uEmissiveIntensity;
49
+ };
50
+
51
+ // Force recompile if the material was already rendered with the old program
52
+ material.needsUpdate = true;
53
+ }
@@ -0,0 +1 @@
1
+ export * from "./uniform";
@@ -0,0 +1 @@
1
+ export type UniformValue<T> = { value: T };
@@ -0,0 +1,101 @@
1
+ import {
2
+ AlwaysStencilFunc,
3
+ BackSide,
4
+ DecrementWrapStencilOp,
5
+ FrontSide,
6
+ IncrementWrapStencilOp,
7
+ KeepStencilOp,
8
+ Mesh,
9
+ NotEqualStencilFunc,
10
+ ZeroStencilOp,
11
+ type BufferGeometry,
12
+ type Material,
13
+ type NormalBufferAttributes,
14
+ type Object3DEventMap,
15
+ } from "three";
16
+
17
+ export class DrapedMesh<
18
+ TGeometry extends BufferGeometry = BufferGeometry<NormalBufferAttributes>,
19
+ TMaterial extends Material | Material[] = Material | Material[],
20
+ TEventMap extends Object3DEventMap = Object3DEventMap,
21
+ > extends Mesh<TGeometry, TMaterial, TEventMap> {
22
+ drapedEnable: boolean;
23
+
24
+ constructor(geometry?: TGeometry, material?: TMaterial, enable = true) {
25
+ super(geometry, material);
26
+ this.drapedEnable = enable;
27
+ }
28
+
29
+ enabled() {
30
+ return this.drapedEnable && this.visible;
31
+ }
32
+
33
+ /**
34
+ * Run the stencil-test draping passes for this mesh.
35
+ * The caller supplies a `render` callback that performs the actual draw call
36
+ * (e.g. `renderer.render(scene, camera)`).
37
+ */
38
+ process(render: () => void): void {
39
+ if (!this.enabled()) return;
40
+
41
+ const run = (m: Material) => {
42
+ // Save original material state
43
+ const origStencilFunc = m.stencilFunc;
44
+ const origStencilFail = m.stencilFail;
45
+ const origStencilZPass = m.stencilZPass;
46
+ const origStencilZFail = m.stencilZFail;
47
+ const origSide = m.side;
48
+ const origColorWrite = m.colorWrite;
49
+ const origDepthWrite = m.depthWrite;
50
+ const origStencilWrite = m.stencilWrite;
51
+ const origDepthTest = m.depthTest;
52
+
53
+ // Back face pass
54
+ m.stencilFunc = AlwaysStencilFunc;
55
+ m.stencilFail = KeepStencilOp;
56
+ m.stencilZPass = KeepStencilOp;
57
+ m.stencilZFail = IncrementWrapStencilOp;
58
+ m.side = BackSide;
59
+ m.colorWrite = false;
60
+ m.depthWrite = false;
61
+ m.stencilWrite = true;
62
+ m.depthTest = true;
63
+
64
+ render();
65
+
66
+ // Front face pass
67
+ m.side = FrontSide;
68
+ m.stencilZFail = DecrementWrapStencilOp;
69
+
70
+ render();
71
+
72
+ // Final pass
73
+ m.stencilFunc = NotEqualStencilFunc;
74
+ m.stencilFail = ZeroStencilOp;
75
+ m.stencilZFail = ZeroStencilOp;
76
+ m.stencilZPass = ZeroStencilOp;
77
+ m.side = BackSide;
78
+ m.colorWrite = true;
79
+ m.depthTest = false;
80
+
81
+ render();
82
+
83
+ // Restore original material state
84
+ m.stencilFunc = origStencilFunc;
85
+ m.stencilFail = origStencilFail;
86
+ m.stencilZPass = origStencilZPass;
87
+ m.stencilZFail = origStencilZFail;
88
+ m.side = origSide;
89
+ m.colorWrite = origColorWrite;
90
+ m.depthWrite = origDepthWrite;
91
+ m.stencilWrite = origStencilWrite;
92
+ m.depthTest = origDepthTest;
93
+ };
94
+
95
+ if (Array.isArray(this.material)) {
96
+ this.material.map(run);
97
+ } else {
98
+ run(this.material);
99
+ }
100
+ }
101
+ }