@call-me-sensei/toonlab 0.3.0 → 0.4.19

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 (736) hide show
  1. package/README.md +549 -184
  2. package/agents/README.md +59 -0
  3. package/agents/references/anime-art-direction.md +24 -0
  4. package/agents/references/asset-sourcing-policy.md +23 -0
  5. package/agents/references/custom-gap-report.md +16 -0
  6. package/agents/references/geology-playbook.md +118 -0
  7. package/agents/references/mcp-asset-discovery.md +104 -0
  8. package/agents/references/runtime-entry-points.md +174 -0
  9. package/agents/references/style-bundles.md +71 -0
  10. package/agents/skills/claude/asset-sourcing/SKILL.md +275 -0
  11. package/agents/skills/claude/environment/SKILL.md +59 -0
  12. package/agents/skills/claude/game-dev/SKILL.md +100 -0
  13. package/agents/skills/claude/karst-cliff-construction/SKILL.md +258 -0
  14. package/agents/skills/claude/outdoor-world/SKILL.md +492 -0
  15. package/agents/skills/claude/outdoor-world/references/coastal-landform-formation.md +100 -0
  16. package/agents/skills/claude/post-processing/SKILL.md +44 -0
  17. package/agents/skills/claude/rock-ground-shaders/SKILL.md +118 -0
  18. package/agents/skills/claude/rockgen/SKILL.md +30 -0
  19. package/agents/skills/claude/scene-style-application/SKILL.md +74 -0
  20. package/agents/skills/claude/style-presets/SKILL.md +101 -0
  21. package/agents/skills/claude/toon-shading/SKILL.md +44 -0
  22. package/agents/skills/claude/vegetation-sky/SKILL.md +167 -0
  23. package/agents/skills/claude/visual-verification/SKILL.md +136 -0
  24. package/agents/skills/claude/water/SKILL.md +105 -0
  25. package/agents/skills/codex/asset-sourcing/SKILL.md +275 -0
  26. package/agents/skills/codex/environment/SKILL.md +59 -0
  27. package/agents/skills/codex/game-dev/SKILL.md +100 -0
  28. package/agents/skills/codex/karst-cliff-construction/SKILL.md +258 -0
  29. package/agents/skills/codex/outdoor-world/SKILL.md +492 -0
  30. package/agents/skills/codex/outdoor-world/references/coastal-landform-formation.md +100 -0
  31. package/agents/skills/codex/post-processing/SKILL.md +44 -0
  32. package/agents/skills/codex/rock-ground-shaders/SKILL.md +118 -0
  33. package/agents/skills/codex/rockgen/SKILL.md +30 -0
  34. package/agents/skills/codex/scene-style-application/SKILL.md +74 -0
  35. package/agents/skills/codex/style-presets/SKILL.md +101 -0
  36. package/agents/skills/codex/toon-shading/SKILL.md +44 -0
  37. package/agents/skills/codex/vegetation-sky/SKILL.md +167 -0
  38. package/agents/skills/codex/visual-verification/SKILL.md +136 -0
  39. package/agents/skills/codex/water/SKILL.md +105 -0
  40. package/cli/toonlab.mjs +52 -0
  41. package/compose.yaml +20 -0
  42. package/database/apply-sql.mjs +141 -0
  43. package/database/client.mjs +39 -0
  44. package/database/creation-tags.mjs +23 -0
  45. package/database/env.mjs +16 -0
  46. package/database/generation-service.mjs +314 -0
  47. package/database/migrations/0001_local_workspace.sql +120 -0
  48. package/database/migrations/0002_file_ownership.sql +11 -0
  49. package/database/migrations/0003_remove_autosaves_from_library.sql +7 -0
  50. package/database/migrations/0004_catalog_asset_packs.sql +39 -0
  51. package/database/migrations/0005_creation_tag_discovery.sql +1 -0
  52. package/database/migrations/0006_normalize_creation_tags.sql +28 -0
  53. package/database/providers.mjs +465 -0
  54. package/database/repository.mjs +625 -0
  55. package/database/seeds/catalog/0001_empty_official_catalog.sql +4 -0
  56. package/database/seeds/catalog/0002_2026-08.sql +19454 -0
  57. package/mcp/lab-management.mjs +629 -0
  58. package/mcp/public-catalog.mjs +168 -0
  59. package/mcp/server.mjs +1026 -63
  60. package/mcp/vite-plugin.mjs +443 -26
  61. package/mcp/workspace.mjs +26 -1
  62. package/package.json +312 -45
  63. package/scripts/generate-catalog-seed.mjs +297 -0
  64. package/scripts/setup-local.mjs +128 -0
  65. package/src/agents/index.js +7 -0
  66. package/src/agents/sceneStyleOperations.js +169 -0
  67. package/src/asset-policy/catalogLicenses.js +44 -0
  68. package/src/asset-policy/index.js +315 -0
  69. package/src/assetlib/assetRef.js +1 -1
  70. package/src/assetlib/galleryMaterialFamily.js +165 -0
  71. package/src/assetlib/index.js +6 -2
  72. package/src/assetlib/plateau.js +188 -0
  73. package/src/assetlib/plateauLandmarks.js +144 -0
  74. package/src/assetlib/plateauViewer.js +348 -0
  75. package/src/assetlib/sources.js +16 -2
  76. package/src/catalog/manifest.js +11 -1
  77. package/src/catalog/officialCatalog.js +4 -0
  78. package/src/catalog/officialCatalogAssetRuntime.js +313 -0
  79. package/src/catalog/officialCatalogLod.js +150 -0
  80. package/src/catalog/officialCatalogPlacement.js +228 -0
  81. package/src/catalog/officialCatalogProvider.js +334 -0
  82. package/src/character/animationRetarget.js +1082 -0
  83. package/src/character/characterRuntime.js +376 -0
  84. package/src/character/groundStabilizer.js +137 -0
  85. package/src/character/index.js +8 -0
  86. package/src/character/locomotionActions.js +74 -0
  87. package/src/character/locomotionStateMachine.js +241 -0
  88. package/src/character/mannequinAsset.js +15 -0
  89. package/src/character/mannequinAssetUrl.browser.js +4 -0
  90. package/src/character/mannequinAssetUrl.node.js +3 -0
  91. package/src/character/modelLoader.js +92 -12
  92. package/src/character/walkableCharacterRuntime.js +284 -0
  93. package/src/character/waterInteractionController.js +217 -0
  94. package/src/cloud/ambientSkyBaker.js +248 -0
  95. package/src/cloud/cloudLighting.js +1114 -0
  96. package/src/cloud/cloudParams.js +819 -0
  97. package/src/cloud/cloudReprojection.js +563 -0
  98. package/src/cloud/cloudStyle.js +780 -0
  99. package/src/cloud/cloudStyleSnapshots.js +387 -0
  100. package/src/cloud/cloudVolume.js +1903 -0
  101. package/src/cloud/heroCloudRecipe.js +404 -0
  102. package/src/cloud/index.js +42 -0
  103. package/src/cloud/noise/baseShapeVolume.js +331 -0
  104. package/src/cloud/noise/cirrusMap.js +131 -0
  105. package/src/cloud/noise/curlNoise.js +289 -0
  106. package/src/cloud/noise/erosionVolume.js +188 -0
  107. package/src/cloud/noise/noiseVolume.js +202 -0
  108. package/src/cloud/noise/periodicNoise3.js +295 -0
  109. package/src/cloud/noise/weatherMap.js +470 -0
  110. package/src/cloud/paramSchema.js +458 -0
  111. package/src/collisionMetadata.js +320 -0
  112. package/src/core/systemStylePolicy.js +32 -0
  113. package/src/environment/dayCurves.js +146 -0
  114. package/src/environment/environmentGroundFieldPass.js +354 -0
  115. package/src/environment/environmentMaterialAdapter.js +114 -6
  116. package/src/environment/environmentPresets.js +396 -90
  117. package/src/environment/environmentRigs.js +17 -2
  118. package/src/environment/environmentSettings.js +37 -1
  119. package/src/environment/environmentShaderMaterials.js +37 -6
  120. package/src/environment/environmentState.js +133 -0
  121. package/src/environment/environmentSunShadowPass.js +357 -6
  122. package/src/environment/environmentTextureResolver.js +7 -0
  123. package/src/environment/index.js +51 -0
  124. package/src/environment/manufacturedMaterialContract.js +837 -0
  125. package/src/environment/manufacturedReflectionProvider.js +114 -0
  126. package/src/environment/scanAssetStylize.js +4 -4
  127. package/src/environment/surfaceMaterialModes.js +71 -0
  128. package/src/environment/toonLabEnvironmentMaterials.js +353 -0
  129. package/src/environment/toonLabMaterialPassCoupling.js +347 -0
  130. package/src/environment/toonLabNormalIntegration.js +171 -0
  131. package/src/environment/toonLabRockMaterialResolver.js +592 -0
  132. package/src/environment/toonLabSourceDefaultLit.js +444 -0
  133. package/src/environment/toonLabSourceLibrary.js +762 -0
  134. package/src/environment/toonLabSourceMaterials.js +3718 -0
  135. package/src/environment/toonLabSourceSubsurfaceLighting.js +415 -0
  136. package/src/environment/toonLabSourceTemporal.js +717 -0
  137. package/src/environment/toonLabSurfaceLighting.js +364 -0
  138. package/src/environment/toonLabTextureReadiness.js +105 -0
  139. package/src/environment/toonLabTreeMaterials.js +450 -0
  140. package/src/environment/transparentMaterialProfile.js +87 -0
  141. package/src/environment/urbanPropMaterial.js +2874 -0
  142. package/src/ground-shader/groundPrintLayer.js +375 -0
  143. package/src/ground-shader/groundShaderMaterial.js +851 -0
  144. package/src/ground-shader/groundShaderSettings.js +468 -0
  145. package/src/ground-shader/index.js +3 -0
  146. package/src/index.js +52 -22
  147. package/src/lighting/callMeSenseiLightingContract.js +163 -0
  148. package/src/lighting/index.js +14 -7
  149. package/src/lighting/lightingCapabilities.js +2 -2
  150. package/src/lighting/lightingPresets.js +6 -3
  151. package/src/lighting/lightingStyle.js +41 -6
  152. package/src/lighting/lightingSystem.js +140 -1
  153. package/src/lighting/{unrealExport.js → toonLabExport.js} +40 -41
  154. package/src/post/postProcessing.js +71 -12
  155. package/src/react/index.js +66 -0
  156. package/src/renderer/index.js +9 -0
  157. package/src/renderer/rendererConfiguration.js +250 -0
  158. package/src/rock-shader/index.js +3 -0
  159. package/src/rock-shader/rockMaterial.js +1843 -0
  160. package/src/rock-shader/rockShaderRuntime.js +494 -0
  161. package/src/rock-shader/rockShaderSettings.js +869 -0
  162. package/src/rockgen/export/glbExport.js +104 -14
  163. package/src/rockgen/index.js +4 -3
  164. package/src/rockgen/lod/index.js +6 -0
  165. package/src/rockgen/lod/rockLodMetrics.js +168 -0
  166. package/src/rockgen/lod/rockLodPlanner.js +372 -0
  167. package/src/rockgen/lod/rockLodPolicy.js +235 -0
  168. package/src/rockgen/lod/rockLodRuntime.js +124 -0
  169. package/src/rockgen/lod/rockLodSimplifier.js +173 -0
  170. package/src/rockgen/lod/rockLodValidation.js +113 -0
  171. package/src/rockgen/mesh/meshAttributes.js +17 -0
  172. package/src/rockgen/mesh/meshDocument.js +6 -0
  173. package/src/rockgen/rockDocument.js +352 -9
  174. package/src/rockgen/rockgenPresets.js +114 -13
  175. package/src/rockgen/rockgenSettings.js +62 -11
  176. package/src/runtime/index.js +14 -0
  177. package/src/runtime/sceneCollisionRuntime.js +317 -0
  178. package/src/runtime/sceneSurfaceRuntime.js +451 -0
  179. package/src/runtime/sceneUpdateScheduler.js +203 -0
  180. package/src/shaders-tsl/anime.js +9 -2
  181. package/src/shaders-tsl/chunks/environment-ground-field.js +174 -0
  182. package/src/shaders-tsl/chunks/environment-state.js +79 -0
  183. package/src/shaders-tsl/chunks/environment-sun-shadow.js +99 -32
  184. package/src/shaders-tsl/chunks/normalized-hue.js +41 -0
  185. package/src/shaders-tsl/chunks/pass-depth-color.js +4 -2
  186. package/src/shaders-tsl/chunks/scene-depth-color-pass.js +273 -0
  187. package/src/shaders-tsl/chunks/vegetation-style.js +116 -8
  188. package/src/shaders-tsl/chunks/water-color.js +19 -5
  189. package/src/shaders-tsl/chunks/water-shore-state.js +8 -1
  190. package/src/shaders-tsl/chunks/world-noise.js +30 -0
  191. package/src/shaders-tsl/environment.js +123 -17
  192. package/src/shaders-tsl/flower.js +51 -8
  193. package/src/shaders-tsl/grass.js +194 -29
  194. package/src/shaders-tsl/post-composite.js +83 -2
  195. package/src/shaders-tsl/tree-leaf.js +107 -16
  196. package/src/shaders-tsl/water-breaker.js +18 -4
  197. package/src/shaders-tsl/water.js +43 -3
  198. package/src/shaders-tsl/woody-surface.js +59 -7
  199. package/src/sky/atmosphereDome.js +193 -0
  200. package/src/sky/atmosphereParams.js +396 -0
  201. package/src/sky/atmosphereScattering.js +593 -0
  202. package/src/sky/atmosphereSky.js +371 -0
  203. package/src/sky/cloudShadow.js +355 -0
  204. package/src/sky/godRays.js +257 -0
  205. package/src/sky/index.js +55 -1
  206. package/src/sky/nightSky.js +1190 -0
  207. package/src/sky/renderLayers.js +120 -0
  208. package/src/sky/skyColor.js +582 -0
  209. package/src/sky/skyDayCycle.js +244 -0
  210. package/src/sky/skyParams.js +661 -0
  211. package/src/sky/skyPresets.js +772 -0
  212. package/src/sky/skyQualityTiers.js +383 -0
  213. package/src/sky/skyShaderSettings.js +699 -0
  214. package/src/sky/skyStyleSnapshots.js +211 -0
  215. package/src/sky/skySystem.js +1438 -0
  216. package/src/sky/skyTimeKeyframes.js +361 -0
  217. package/src/sky/stylizedSky.js +405 -116
  218. package/src/sky/sunDriver.js +499 -0
  219. package/src/sky/timeOfDay.js +335 -0
  220. package/src/styles/animeGameProfile.js +44 -0
  221. package/src/styles/index.js +134 -0
  222. package/src/styles/manufacturedStyleLabeling.js +204 -0
  223. package/src/styles/sceneLayerDocuments.js +185 -0
  224. package/src/styles/sceneLookComposition.js +156 -0
  225. package/src/styles/sceneQualityApplication.js +152 -0
  226. package/src/styles/sceneQualityProfiles.js +268 -0
  227. package/src/styles/sceneStyleAudit.js +512 -0
  228. package/src/styles/sceneStyleRuntime.js +876 -0
  229. package/src/styles/styleAdapters.js +166 -0
  230. package/src/styles/styleApplication.js +369 -0
  231. package/src/styles/styleBundle.js +444 -91
  232. package/src/styles/styleBundleProvider.js +83 -0
  233. package/src/styles/styleDomains.js +21 -0
  234. package/src/styles/styleInspector.js +262 -0
  235. package/src/styles/styleMaterialContract.js +375 -0
  236. package/src/styles/styleMetadata.js +73 -0
  237. package/src/styles/styleTargetDiscovery.js +162 -0
  238. package/src/styles/styleTargetLabels.js +206 -0
  239. package/src/styles/styleTargetMaterialCoverage.js +137 -0
  240. package/src/styles/styleTransaction.js +272 -0
  241. package/src/texgen/textureGenerators.js +21 -5
  242. package/src/toon/toonSettings.js +4 -0
  243. package/src/vegetation/branchTree.js +302 -0
  244. package/src/vegetation/callMeSenseiGrass.js +183 -0
  245. package/src/vegetation/compiledTree.js +506 -0
  246. package/src/vegetation/contactShadowField.js +107 -0
  247. package/src/vegetation/flowerSpecies.js +10 -2
  248. package/src/vegetation/grass.js +13 -0
  249. package/src/vegetation/grassClump.js +1179 -0
  250. package/src/vegetation/importedVegetationMaterial.js +183 -0
  251. package/src/vegetation/index.js +15 -1
  252. package/src/vegetation/legacyTreePresets.js +120 -0
  253. package/src/vegetation/scatter.js +322 -3
  254. package/src/vegetation/stylizedBush.js +14 -0
  255. package/src/vegetation/stylizedFlower.js +31 -0
  256. package/src/vegetation/stylizedFlowers.js +59 -7
  257. package/src/vegetation/stylizedForest.js +455 -147
  258. package/src/vegetation/stylizedGrass.js +188 -24
  259. package/src/vegetation/stylizedTree.js +378 -46
  260. package/src/vegetation/stylizedTreeFoliage.js +889 -38
  261. package/src/vegetation/stylizedUnderstory.js +230 -0
  262. package/src/vegetation/treeExport.js +262 -47
  263. package/src/vegetation/treeSurfaceTextures.js +337 -0
  264. package/src/vegetation/vegetationShaders.js +617 -28
  265. package/src/version.js +3 -0
  266. package/src/water/water.js +2 -0
  267. package/src/water/waterBreakerSystem.js +2 -0
  268. package/src/water/waterCurrentField.js +1 -0
  269. package/src/water/waterMaterial.js +3 -0
  270. package/src/water/waterRain.js +2 -0
  271. package/src/water/waterScenePasses.js +170 -7
  272. package/src/water/waterSettings.js +235 -43
  273. package/src/water/waterShoreMaterial.js +16 -2
  274. package/src/water/waterShoreStateField.js +1 -1
  275. package/src/water/waterSplashSystem.js +2 -0
  276. package/src/water/waterStageSettings.js +60 -0
  277. package/src/water/waterSurface.js +144 -4
  278. package/src/water/waterUnderwaterAtmosphere.js +288 -0
  279. package/src/water/waterVegetation.js +20 -4
  280. package/src/worldCollision.js +64 -9
  281. package/types/agents/index.d.ts +1 -0
  282. package/types/agents/sceneStyleOperations.d.ts +484 -0
  283. package/types/asset-policy/catalogLicenses.d.ts +5 -0
  284. package/types/asset-policy/index.d.ts +18 -0
  285. package/types/assetlib/ambientcg.d.ts +81 -0
  286. package/types/assetlib/assetRef.d.ts +26 -0
  287. package/types/assetlib/galleryMaterialFamily.d.ts +13 -0
  288. package/types/assetlib/importedEntry.d.ts +18 -0
  289. package/types/assetlib/index.d.ts +16 -0
  290. package/types/assetlib/kaykit.d.ts +112 -0
  291. package/types/assetlib/kaykitStaticIndex.d.ts +38 -0
  292. package/types/assetlib/loadImported.d.ts +54 -0
  293. package/types/assetlib/opensource3d.d.ts +55 -0
  294. package/types/assetlib/plateau.d.ts +67 -0
  295. package/types/assetlib/plateauLandmarks.d.ts +238 -0
  296. package/types/assetlib/plateauViewer.d.ts +3 -0
  297. package/types/assetlib/polyhaven.d.ts +90 -0
  298. package/types/assetlib/polypizza.d.ts +10 -0
  299. package/types/assetlib/smithsonian.d.ts +9 -0
  300. package/types/assetlib/sources.d.ts +22 -0
  301. package/types/assetlib/zip.d.ts +8 -0
  302. package/types/catalog/manifest.d.ts +26 -0
  303. package/types/catalog/officialCatalog.d.ts +4 -0
  304. package/types/catalog/officialCatalogAssetRuntime.d.ts +2 -0
  305. package/types/catalog/officialCatalogLod.d.ts +5 -0
  306. package/types/catalog/officialCatalogPlacement.d.ts +49 -0
  307. package/types/catalog/officialCatalogProvider.d.ts +7 -0
  308. package/types/character/animationRetarget.d.ts +20 -0
  309. package/types/character/characterRig.d.ts +28 -0
  310. package/types/character/characterRuntime.d.ts +4 -0
  311. package/types/character/freestyleSwimClip.d.ts +5 -0
  312. package/types/character/groundStabilizer.d.ts +55 -0
  313. package/types/character/index.d.ts +10 -0
  314. package/types/character/locomotionActions.d.ts +4 -0
  315. package/types/character/locomotionStateMachine.d.ts +62 -0
  316. package/types/character/mannequinAsset.d.ts +12 -0
  317. package/types/character/mannequinAssetUrl.node.d.ts +1 -0
  318. package/types/character/modelLoader.d.ts +7 -0
  319. package/types/character/walkableCharacterRuntime.d.ts +343 -0
  320. package/types/character/waterInteractionController.d.ts +114 -0
  321. package/types/cloud/ambientSkyBaker.d.ts +18 -0
  322. package/types/cloud/cloudLighting.d.ts +38 -0
  323. package/types/cloud/cloudParams.d.ts +18 -0
  324. package/types/cloud/cloudReprojection.d.ts +15 -0
  325. package/types/cloud/cloudStyle.d.ts +1380 -0
  326. package/types/cloud/cloudStyleSnapshots.d.ts +10 -0
  327. package/types/cloud/cloudVolume.d.ts +43 -0
  328. package/types/cloud/heroCloudRecipe.d.ts +167 -0
  329. package/types/cloud/index.d.ts +12 -0
  330. package/types/cloud/noise/baseShapeVolume.d.ts +86 -0
  331. package/types/cloud/noise/cirrusMap.d.ts +24 -0
  332. package/types/cloud/noise/curlNoise.d.ts +106 -0
  333. package/types/cloud/noise/erosionVolume.d.ts +58 -0
  334. package/types/cloud/noise/noiseVolume.d.ts +63 -0
  335. package/types/cloud/noise/periodicNoise3.d.ts +75 -0
  336. package/types/cloud/noise/weatherMap.d.ts +227 -0
  337. package/types/cloud/paramSchema.d.ts +142 -0
  338. package/types/collisionMetadata.d.ts +11 -0
  339. package/types/core/generation.d.ts +95 -0
  340. package/types/core/materialRoles.d.ts +102 -0
  341. package/types/core/presetDocuments.d.ts +25 -0
  342. package/types/core/systemStylePolicy.d.ts +4 -0
  343. package/types/environment/dayCurves.d.ts +47 -0
  344. package/types/environment/environmentAmbientProbe.d.ts +2 -0
  345. package/types/environment/environmentGroundFieldPass.d.ts +2 -0
  346. package/types/environment/environmentMaterialAdapter.d.ts +42 -0
  347. package/types/environment/environmentMaterialClassifier.d.ts +26 -0
  348. package/types/environment/environmentPlanarReflection.d.ts +3 -0
  349. package/types/environment/environmentPresets.d.ts +171 -0
  350. package/types/environment/environmentRigs.d.ts +13 -0
  351. package/types/environment/environmentSettings.d.ts +161 -0
  352. package/types/environment/environmentShaderMaterials.d.ts +14 -0
  353. package/types/environment/environmentState.d.ts +6 -0
  354. package/types/environment/environmentSunShadowPass.d.ts +2 -0
  355. package/types/environment/environmentTextureResolver.d.ts +30 -0
  356. package/types/environment/environmentTimeOfDay.d.ts +25 -0
  357. package/types/environment/environmentVertexAo.d.ts +18 -0
  358. package/types/environment/index.d.ts +27 -0
  359. package/types/environment/manufacturedMaterialContract.d.ts +129 -0
  360. package/types/environment/manufacturedReflectionProvider.d.ts +3 -0
  361. package/types/environment/scanAssetStylize.d.ts +43 -0
  362. package/types/environment/surfaceMaterialModes.d.ts +14 -0
  363. package/types/environment/toonLabEnvironmentMaterials.d.ts +139 -0
  364. package/types/environment/toonLabMaterialPassCoupling.d.ts +7 -0
  365. package/types/environment/toonLabNormalIntegration.d.ts +29 -0
  366. package/types/environment/toonLabRockMaterialResolver.d.ts +270 -0
  367. package/types/environment/toonLabSourceDefaultLit.d.ts +136 -0
  368. package/types/environment/toonLabSourceLibrary.d.ts +19 -0
  369. package/types/environment/toonLabSourceMaterials.d.ts +14 -0
  370. package/types/environment/toonLabSourceSubsurfaceLighting.d.ts +85 -0
  371. package/types/environment/toonLabSourceTemporal.d.ts +20 -0
  372. package/types/environment/toonLabSurfaceLighting.d.ts +136 -0
  373. package/types/environment/toonLabTextureReadiness.d.ts +8 -0
  374. package/types/environment/toonLabTreeMaterials.d.ts +7 -0
  375. package/types/environment/transparentMaterialProfile.d.ts +76 -0
  376. package/types/environment/urbanPropMaterial.d.ts +25 -0
  377. package/types/ground-shader/groundPrintLayer.d.ts +4 -0
  378. package/types/ground-shader/groundShaderMaterial.d.ts +11 -0
  379. package/types/ground-shader/groundShaderSettings.d.ts +90 -0
  380. package/types/ground-shader/index.d.ts +3 -0
  381. package/types/index.d.ts +1502 -0
  382. package/types/lighting/callMeSenseiLightingContract.d.ts +14 -0
  383. package/types/lighting/colorIntensity.d.ts +44 -0
  384. package/types/lighting/index.d.ts +12 -0
  385. package/types/lighting/lightDescriptors.d.ts +803 -0
  386. package/types/lighting/lightingCapabilities.d.ts +85 -0
  387. package/types/lighting/lightingDocuments.d.ts +140 -0
  388. package/types/lighting/lightingFixtures.d.ts +171 -0
  389. package/types/lighting/lightingGenerator.d.ts +403 -0
  390. package/types/lighting/lightingPresets.d.ts +264 -0
  391. package/types/lighting/lightingRuntime.d.ts +401 -0
  392. package/types/lighting/lightingStyle.d.ts +156 -0
  393. package/types/lighting/lightingSystem.d.ts +433 -0
  394. package/types/lighting/toonLabExport.d.ts +46 -0
  395. package/types/lighting/utils.d.ts +18 -0
  396. package/types/loaders/index.d.ts +1 -0
  397. package/types/post/index.d.ts +2 -0
  398. package/types/post/postGenerator.d.ts +282 -0
  399. package/types/post/postProcessing.d.ts +16 -0
  400. package/types/react/index.d.ts +1765 -0
  401. package/types/renderer/index.d.ts +1 -0
  402. package/types/renderer/rendererConfiguration.d.ts +8 -0
  403. package/types/rock-shader/index.d.ts +3 -0
  404. package/types/rock-shader/rockMaterial.d.ts +18 -0
  405. package/types/rock-shader/rockShaderRuntime.d.ts +8 -0
  406. package/types/rock-shader/rockShaderSettings.d.ts +170 -0
  407. package/types/rockgen/export/glbExport.d.ts +58 -0
  408. package/types/rockgen/heightfield/heightfieldErosion.d.ts +10 -0
  409. package/types/rockgen/heightfield/heightfieldPatch.d.ts +15 -0
  410. package/types/rockgen/heightfield/stylizedErosionSim.d.ts +41 -0
  411. package/types/rockgen/index.d.ts +11 -0
  412. package/types/rockgen/lod/index.d.ts +6 -0
  413. package/types/rockgen/lod/rockLodMetrics.d.ts +62 -0
  414. package/types/rockgen/lod/rockLodPlanner.d.ts +86 -0
  415. package/types/rockgen/lod/rockLodPolicy.d.ts +76 -0
  416. package/types/rockgen/lod/rockLodRuntime.d.ts +95 -0
  417. package/types/rockgen/lod/rockLodSimplifier.d.ts +15 -0
  418. package/types/rockgen/lod/rockLodValidation.d.ts +16 -0
  419. package/types/rockgen/mesh/meshAttributes.d.ts +32 -0
  420. package/types/rockgen/mesh/meshDocument.d.ts +40 -0
  421. package/types/rockgen/mesh/surfaceNets.d.ts +42 -0
  422. package/types/rockgen/noise/cellularNoise3.d.ts +24 -0
  423. package/types/rockgen/noise/prng.d.ts +16 -0
  424. package/types/rockgen/noise/simplexNoise3.d.ts +2 -0
  425. package/types/rockgen/noise/valueNoise3.d.ts +12 -0
  426. package/types/rockgen/rockDocument.d.ts +215 -0
  427. package/types/rockgen/rockHelpers.d.ts +2 -0
  428. package/types/rockgen/rockgenPresets.d.ts +10 -0
  429. package/types/rockgen/rockgenSettings.d.ts +531 -0
  430. package/types/rockgen/sdf/fieldCompiler.d.ts +20 -0
  431. package/types/rockgen/sdf/sculptEdits.d.ts +30 -0
  432. package/types/rockgen/sdf/sdfModifiers.d.ts +19 -0
  433. package/types/rockgen/sdf/sdfOps.d.ts +8 -0
  434. package/types/rockgen/sdf/sdfPrimitives.d.ts +22 -0
  435. package/types/runtime/index.d.ts +3 -0
  436. package/types/runtime/sceneCollisionRuntime.d.ts +94 -0
  437. package/types/runtime/sceneSurfaceRuntime.d.ts +90 -0
  438. package/types/runtime/sceneUpdateScheduler.d.ts +28 -0
  439. package/types/shaders-tsl/anime.d.ts +9 -0
  440. package/types/shaders-tsl/chunks/character-color.d.ts +6 -0
  441. package/types/shaders-tsl/chunks/character-highlights.d.ts +12 -0
  442. package/types/shaders-tsl/chunks/character-lighting.d.ts +20 -0
  443. package/types/shaders-tsl/chunks/character-material-maps.d.ts +18 -0
  444. package/types/shaders-tsl/chunks/character-roles.d.ts +21 -0
  445. package/types/shaders-tsl/chunks/character-scene-lights.d.ts +48 -0
  446. package/types/shaders-tsl/chunks/character-shadow-color.d.ts +5 -0
  447. package/types/shaders-tsl/chunks/character-skinning.d.ts +23 -0
  448. package/types/shaders-tsl/chunks/environment-color.d.ts +9 -0
  449. package/types/shaders-tsl/chunks/environment-debug.d.ts +24 -0
  450. package/types/shaders-tsl/chunks/environment-ground-field.d.ts +40 -0
  451. package/types/shaders-tsl/chunks/environment-lighting.d.ts +22 -0
  452. package/types/shaders-tsl/chunks/environment-state.d.ts +42 -0
  453. package/types/shaders-tsl/chunks/environment-sun-shadow.d.ts +19 -0
  454. package/types/shaders-tsl/chunks/foliage-fog.d.ts +21 -0
  455. package/types/shaders-tsl/chunks/normalized-hue.d.ts +1 -0
  456. package/types/shaders-tsl/chunks/pass-depth-color.d.ts +20 -0
  457. package/types/shaders-tsl/chunks/projected-water-caustics.d.ts +24 -0
  458. package/types/shaders-tsl/chunks/scene-depth-color-pass.d.ts +39 -0
  459. package/types/shaders-tsl/chunks/stylized-cloud-shadow.d.ts +9 -0
  460. package/types/shaders-tsl/chunks/vegetation-style.d.ts +60 -0
  461. package/types/shaders-tsl/chunks/water-color.d.ts +15 -0
  462. package/types/shaders-tsl/chunks/water-common.d.ts +9 -0
  463. package/types/shaders-tsl/chunks/water-foam.d.ts +8 -0
  464. package/types/shaders-tsl/chunks/water-lighting.d.ts +9 -0
  465. package/types/shaders-tsl/chunks/water-ripple.d.ts +8 -0
  466. package/types/shaders-tsl/chunks/water-shore-state.d.ts +7 -0
  467. package/types/shaders-tsl/chunks/water-waves.d.ts +18 -0
  468. package/types/shaders-tsl/chunks/world-noise.d.ts +4 -0
  469. package/types/shaders-tsl/environment-ao-overlay.d.ts +5 -0
  470. package/types/shaders-tsl/environment.d.ts +34 -0
  471. package/types/shaders-tsl/flower.d.ts +6 -0
  472. package/types/shaders-tsl/grass.d.ts +4 -0
  473. package/types/shaders-tsl/post-composite.d.ts +25 -0
  474. package/types/shaders-tsl/sky.d.ts +4 -0
  475. package/types/shaders-tsl/tree-leaf.d.ts +2 -0
  476. package/types/shaders-tsl/water-breaker.d.ts +15 -0
  477. package/types/shaders-tsl/water-kelp.d.ts +5 -0
  478. package/types/shaders-tsl/water-rain.d.ts +10 -0
  479. package/types/shaders-tsl/water-shore-state-simulation.d.ts +12 -0
  480. package/types/shaders-tsl/water-simulation.d.ts +5 -0
  481. package/types/shaders-tsl/water-splash.d.ts +12 -0
  482. package/types/shaders-tsl/water.d.ts +22 -0
  483. package/types/shaders-tsl/woody-surface.d.ts +3 -0
  484. package/types/sky/atmosphereDome.d.ts +2 -0
  485. package/types/sky/atmosphereParams.d.ts +185 -0
  486. package/types/sky/atmosphereScattering.d.ts +11 -0
  487. package/types/sky/atmosphereSky.d.ts +2 -0
  488. package/types/sky/cloudShadow.d.ts +68 -0
  489. package/types/sky/godRays.d.ts +5 -0
  490. package/types/sky/index.d.ts +18 -0
  491. package/types/sky/nightSky.d.ts +22 -0
  492. package/types/sky/renderLayers.d.ts +59 -0
  493. package/types/sky/sceneOverrideLayers.d.ts +10 -0
  494. package/types/sky/skyColor.d.ts +704 -0
  495. package/types/sky/skyDayCycle.d.ts +86 -0
  496. package/types/sky/skyParams.d.ts +3407 -0
  497. package/types/sky/skyPresets.d.ts +160 -0
  498. package/types/sky/skyQuality.d.ts +21 -0
  499. package/types/sky/skyQualityTiers.d.ts +223 -0
  500. package/types/sky/skyShaderSettings.d.ts +152 -0
  501. package/types/sky/skyStyleSnapshots.d.ts +11 -0
  502. package/types/sky/skySystem.d.ts +3 -0
  503. package/types/sky/skyTimeKeyframes.d.ts +230 -0
  504. package/types/sky/stylizedSky.d.ts +341 -0
  505. package/types/sky/sunDriver.d.ts +15 -0
  506. package/types/sky/timeOfDay.d.ts +145 -0
  507. package/types/styles/animeGameProfile.d.ts +27 -0
  508. package/types/styles/index.d.ts +17 -0
  509. package/types/styles/manufacturedStyleLabeling.d.ts +119 -0
  510. package/types/styles/sceneLayerDocuments.d.ts +145 -0
  511. package/types/styles/sceneLookComposition.d.ts +53 -0
  512. package/types/styles/sceneQualityApplication.d.ts +34 -0
  513. package/types/styles/sceneQualityProfiles.d.ts +13 -0
  514. package/types/styles/sceneStyleAudit.d.ts +80 -0
  515. package/types/styles/sceneStyleRuntime.d.ts +1782 -0
  516. package/types/styles/styleAdapters.d.ts +14 -0
  517. package/types/styles/styleApplication.d.ts +47 -0
  518. package/types/styles/styleBundle.d.ts +19 -0
  519. package/types/styles/styleBundleProvider.d.ts +44 -0
  520. package/types/styles/styleDomains.d.ts +18 -0
  521. package/types/styles/styleInspector.d.ts +59 -0
  522. package/types/styles/styleMaterialContract.d.ts +46 -0
  523. package/types/styles/styleMetadata.d.ts +11 -0
  524. package/types/styles/styleTargetDiscovery.d.ts +48 -0
  525. package/types/styles/styleTargetLabels.d.ts +32 -0
  526. package/types/styles/styleTargetMaterialCoverage.d.ts +20 -0
  527. package/types/styles/styleTransaction.d.ts +10 -0
  528. package/types/styles/styleTypes.d.ts +66 -0
  529. package/types/texgen/evaluateTexture.d.ts +40 -0
  530. package/types/texgen/index.d.ts +7 -0
  531. package/types/texgen/noise2.d.ts +46 -0
  532. package/types/texgen/textureAi.d.ts +6 -0
  533. package/types/texgen/textureGenerators.d.ts +261 -0
  534. package/types/texgen/texturePresets.d.ts +45 -0
  535. package/types/texgen/textureSettings.d.ts +121 -0
  536. package/types/texgen/textureThree.d.ts +13 -0
  537. package/types/toon/characterRenderPasses.d.ts +3 -0
  538. package/types/toon/index.d.ts +3 -0
  539. package/types/toon/settings/alphaSettings.d.ts +125 -0
  540. package/types/toon/settings/averageShadowSettings.d.ts +39 -0
  541. package/types/toon/settings/baseTextureSettings.d.ts +39 -0
  542. package/types/toon/settings/celShadeSettings.d.ts +37 -0
  543. package/types/toon/settings/contactShadowSettings.d.ts +30 -0
  544. package/types/toon/settings/eyeHighlightSettings.d.ts +55 -0
  545. package/types/toon/settings/faceLightingSettings.d.ts +32 -0
  546. package/types/toon/settings/furSettings.d.ts +23 -0
  547. package/types/toon/settings/glitterSettings.d.ts +43 -0
  548. package/types/toon/settings/hairHighlightSettings.d.ts +89 -0
  549. package/types/toon/settings/indirectLightSettings.d.ts +43 -0
  550. package/types/toon/settings/localLightSettings.d.ts +46 -0
  551. package/types/toon/settings/materialMapSettings.d.ts +86 -0
  552. package/types/toon/settings/outlineSettings.d.ts +125 -0
  553. package/types/toon/settings/perspectiveRemovalSettings.d.ts +14 -0
  554. package/types/toon/settings/rimLightSettings.d.ts +79 -0
  555. package/types/toon/settings/sceneShadowSettings.d.ts +32 -0
  556. package/types/toon/settings/selfShadowSettings.d.ts +44 -0
  557. package/types/toon/settings/shadowColorSettings.d.ts +77 -0
  558. package/types/toon/settings/skinToneSettings.d.ts +30 -0
  559. package/types/toon/settings/specularSettings.d.ts +96 -0
  560. package/types/toon/settings/stickerSettings.d.ts +40 -0
  561. package/types/toon/toonMaterialAdapter.d.ts +883 -0
  562. package/types/toon/toonSettings.d.ts +1182 -0
  563. package/types/vegetation/branchTree.d.ts +10 -0
  564. package/types/vegetation/callMeSenseiGrass.d.ts +8 -0
  565. package/types/vegetation/compiledTree.d.ts +75 -0
  566. package/types/vegetation/contactShadowField.d.ts +26 -0
  567. package/types/vegetation/flowerSpecies.d.ts +107 -0
  568. package/types/vegetation/grass.d.ts +4 -0
  569. package/types/vegetation/grassClump.d.ts +7 -0
  570. package/types/vegetation/grassPalettes.d.ts +29 -0
  571. package/types/vegetation/importedVegetationMaterial.d.ts +13 -0
  572. package/types/vegetation/index.d.ts +216 -0
  573. package/types/vegetation/legacyTreePresets.d.ts +22 -0
  574. package/types/vegetation/scatter.d.ts +12 -0
  575. package/types/vegetation/stylizedBush.d.ts +2 -0
  576. package/types/vegetation/stylizedFlower.d.ts +2 -0
  577. package/types/vegetation/stylizedFlowers.d.ts +8 -0
  578. package/types/vegetation/stylizedForest.d.ts +3 -0
  579. package/types/vegetation/stylizedGrass.d.ts +21 -0
  580. package/types/vegetation/stylizedTree.d.ts +19 -0
  581. package/types/vegetation/stylizedTreeFoliage.d.ts +18 -0
  582. package/types/vegetation/stylizedUnderstory.d.ts +50 -0
  583. package/types/vegetation/treeExport.d.ts +6 -0
  584. package/types/vegetation/treeSurfaceTextures.d.ts +72 -0
  585. package/types/vegetation/vegetationShaders.d.ts +74 -0
  586. package/types/version.d.ts +1 -0
  587. package/types/water/index.d.ts +1 -0
  588. package/types/water/sceneOverrideLayers.d.ts +16 -0
  589. package/types/water/water.d.ts +17 -0
  590. package/types/water/waterBreakerSystem.d.ts +46 -0
  591. package/types/water/waterCurrentField.d.ts +115 -0
  592. package/types/water/waterInteraction.d.ts +21 -0
  593. package/types/water/waterMaterial.d.ts +60 -0
  594. package/types/water/waterNearshorePhase.d.ts +5 -0
  595. package/types/water/waterRain.d.ts +17 -0
  596. package/types/water/waterRippleSimulation.d.ts +52 -0
  597. package/types/water/waterScenePasses.d.ts +70 -0
  598. package/types/water/waterSettings.d.ts +648 -0
  599. package/types/water/waterShoreMaterial.d.ts +3 -0
  600. package/types/water/waterShoreStateField.d.ts +2 -0
  601. package/types/water/waterSplashSystem.d.ts +2 -0
  602. package/types/water/waterStageSettings.d.ts +9 -0
  603. package/types/water/waterSurface.d.ts +2 -0
  604. package/types/water/waterUnderwaterAtmosphere.d.ts +103 -0
  605. package/types/water/waterVegetation.d.ts +16 -0
  606. package/types/worldCollision.d.ts +22 -0
  607. package/AGENTS.md +0 -254
  608. package/ATTRIBUTION.md +0 -78
  609. package/docs/characters.md +0 -144
  610. package/docs/debug-panel.md +0 -126
  611. package/docs/docs.css +0 -589
  612. package/docs/environment.md +0 -186
  613. package/docs/getting-started.md +0 -180
  614. package/docs/index.html +0 -14
  615. package/docs/lab-architecture.md +0 -100
  616. package/docs/lighting.md +0 -825
  617. package/docs/main.jsx +0 -739
  618. package/docs/mcp.md +0 -97
  619. package/docs/post-processing.md +0 -98
  620. package/docs/settings-reference.md +0 -1878
  621. package/docs/shader-constants.md +0 -77
  622. package/docs/sky.md +0 -182
  623. package/docs/style-labs.md +0 -309
  624. package/docs/texture-lab.md +0 -135
  625. package/docs/toon-shading.md +0 -183
  626. package/docs/tsl-conventions.md +0 -167
  627. package/docs/vegetation-sky.md +0 -275
  628. package/docs/water.md +0 -430
  629. package/docs/weather.md +0 -200
  630. package/docs/world-scale.md +0 -111
  631. package/mcp/style-lab-tools.mjs +0 -371
  632. package/src/ambientfx/INTEGRATION.md +0 -164
  633. package/src/ambientfx/ambientFxPresets.js +0 -83
  634. package/src/ambientfx/ambientFxSettings.js +0 -368
  635. package/src/ambientfx/emitters.js +0 -169
  636. package/src/ambientfx/index.js +0 -5
  637. package/src/ambientfx/particleBackbone.js +0 -493
  638. package/src/ambientfx/stylizedAmbientFx.js +0 -450
  639. package/src/biome/biomeGenerator.js +0 -385
  640. package/src/biome/biomeRuntime.js +0 -299
  641. package/src/biome/index.js +0 -2
  642. package/src/buildinggen/buildingAsset.js +0 -44
  643. package/src/buildinggen/buildingGrammar.js +0 -311
  644. package/src/buildinggen/buildingMesh.js +0 -451
  645. package/src/buildinggen/buildingPresets.js +0 -46
  646. package/src/buildinggen/buildingRecipe.js +0 -100
  647. package/src/buildinggen/buildingSettings.js +0 -238
  648. package/src/buildinggen/index.js +0 -6
  649. package/src/camera/cameraDirector.js +0 -157
  650. package/src/camera/cameraGenerator.js +0 -367
  651. package/src/camera/cameraRig.js +0 -570
  652. package/src/camera/cameraSettings.js +0 -236
  653. package/src/camera/index.js +0 -7
  654. package/src/catalog/builtinEntries.js +0 -245
  655. package/src/catalog/catalog.js +0 -210
  656. package/src/catalog/index.js +0 -3
  657. package/src/core/shaderBackend.js +0 -24
  658. package/src/debrisgen/debrisFields.js +0 -544
  659. package/src/debrisgen/debrisGenerator.js +0 -1929
  660. package/src/debrisgen/debrisPalettes.js +0 -71
  661. package/src/debrisgen/debrisPhysics.js +0 -198
  662. package/src/debrisgen/debrisPresets.js +0 -162
  663. package/src/debrisgen/debrisSettings.js +0 -333
  664. package/src/debrisgen/debrisTextures.js +0 -380
  665. package/src/debrisgen/index.js +0 -5
  666. package/src/debug/fieldValues.js +0 -95
  667. package/src/debug/index.js +0 -7
  668. package/src/debug/settingsPanel.js +0 -170
  669. package/src/fauna/INTEGRATION.md +0 -174
  670. package/src/fauna/boids.js +0 -861
  671. package/src/fauna/faunaBodies.js +0 -492
  672. package/src/fauna/faunaPresets.js +0 -52
  673. package/src/fauna/faunaSettings.js +0 -525
  674. package/src/fauna/index.js +0 -5
  675. package/src/fauna/stylizedFauna.js +0 -395
  676. package/src/game-feel/gameFeelGenerator.js +0 -402
  677. package/src/game-feel/gameFeelRuntime.js +0 -549
  678. package/src/game-feel/index.js +0 -2
  679. package/src/motion/index.js +0 -5
  680. package/src/motion/motionClip.js +0 -441
  681. package/src/motion/motionController.js +0 -628
  682. package/src/motion/motionDocuments.js +0 -225
  683. package/src/motion/motionGraph.js +0 -307
  684. package/src/motion/motionSettings.js +0 -222
  685. package/src/pathgen/index.js +0 -7
  686. package/src/pathgen/pathBridge.js +0 -232
  687. package/src/pathgen/pathPresets.js +0 -35
  688. package/src/pathgen/pathRibbon.js +0 -410
  689. package/src/pathgen/pathRouter.js +0 -380
  690. package/src/pathgen/pathSettings.js +0 -335
  691. package/src/pathgen/pathTextures.js +0 -123
  692. package/src/pathgen/stylizedPaths.js +0 -453
  693. package/src/propgen/generatorsWave1.js +0 -379
  694. package/src/propgen/generatorsWave2.js +0 -462
  695. package/src/propgen/index.js +0 -5
  696. package/src/propgen/propAsset.js +0 -323
  697. package/src/propgen/propParts.js +0 -170
  698. package/src/propgen/propPlacement.js +0 -459
  699. package/src/propgen/propPresets.js +0 -82
  700. package/src/propgen/propSettings.js +0 -395
  701. package/src/soundscape/index.js +0 -4
  702. package/src/soundscape/soundscapeGenerator.js +0 -179
  703. package/src/soundscape/soundscapeRuntime.js +0 -806
  704. package/src/soundscape/soundscapeSettings.js +0 -292
  705. package/src/stylizedTerrain.js +0 -631
  706. package/src/stylizedWorld.js +0 -903
  707. package/src/vegetation/treeRecipe.js +0 -647
  708. package/src/vfxgen/INTEGRATION.md +0 -145
  709. package/src/vfxgen/core/burstBackbone.js +0 -380
  710. package/src/vfxgen/core/projectileCore.js +0 -92
  711. package/src/vfxgen/core/spriteShapes.js +0 -98
  712. package/src/vfxgen/core/trailRibbon.js +0 -272
  713. package/src/vfxgen/core/vfxRandom.js +0 -29
  714. package/src/vfxgen/effects/emitHelpers.js +0 -37
  715. package/src/vfxgen/effects/magicEffects.js +0 -162
  716. package/src/vfxgen/effects/movementEffects.js +0 -87
  717. package/src/vfxgen/effects/weaponEffects.js +0 -118
  718. package/src/vfxgen/index.js +0 -18
  719. package/src/vfxgen/moves/moveController.js +0 -146
  720. package/src/vfxgen/moves/moveLibrary.js +0 -335
  721. package/src/vfxgen/vfxPresets.js +0 -98
  722. package/src/vfxgen/vfxSettings.js +0 -384
  723. package/src/vfxgen/vfxSystem.js +0 -449
  724. package/src/vfxgen/weapons/stylizedWeapons.js +0 -137
  725. package/src/villagegen/index.js +0 -4
  726. package/src/villagegen/stylizedVillage.js +0 -490
  727. package/src/villagegen/villageArchetypes.js +0 -160
  728. package/src/villagegen/villageNames.js +0 -40
  729. package/src/villagegen/villageSites.js +0 -105
  730. package/src/weather/index.js +0 -6
  731. package/src/weather/weatherPrecipitation.js +0 -221
  732. package/src/weather/weatherPresets.js +0 -258
  733. package/src/weather/weatherSettings.js +0 -269
  734. package/src/weather/weatherSystem.js +0 -871
  735. package/src/worldMinimap.js +0 -214
  736. package/src/worldPresets.js +0 -125
@@ -1,493 +0,0 @@
1
- // The ONE shared GPU particle system behind every ambient effect. Same
2
- // architecture as StylizedGrassField: an InstancedBufferGeometry over a unit
3
- // quad, per-instance attributes filled once per (rare) window re-emission,
4
- // and ALL motion computed in the TSL vertex shader as a pure function of
5
- // time — zero per-frame CPU work per particle, works on WebGPU and the
6
- // WebGL2 fallback alike.
7
- //
8
- // Draw calls: the five effects share THREE meshes, grouped by blend state —
9
- // that is the real GPU boundary, not the effect:
10
- // cutout — petals + leaves (alpha-test, depth-writing, double-sided)
11
- // glow — fireflies + pollen (additive, no depth write, emissive/unlit)
12
- // soft — mist (alpha blend, no depth write)
13
- // Within a group the per-instance `kind` attribute selects the motion
14
- // program (flutter-fall / tumble-fall / hover-blink / curl-drift / scroll),
15
- // so adding an effect never adds a draw. A single backbone draw for all five
16
- // was rejected: cutout needs depth writes that would occlude through the
17
- // additive glows, and mist's alpha blend cannot share either state.
18
- //
19
- // Budget: ≤ 20k instances of 2 triangles with trig-only vertex work and
20
- // mostly-discard flat fragments — far under the 0.5 ms cluster budget.
21
-
22
- import * as THREE from 'three';
23
- import { NodeMaterial } from 'three/webgpu';
24
- import {
25
- abs, attribute, cameraPosition, cameraProjectionMatrix, cameraViewMatrix, clamp, cos, Discard,
26
- distance, exp, float, Fn, fract, length, max, mix, modelWorldMatrix, normalize, positionLocal,
27
- pow, rotate, sin, smoothstep, step, uniform, uv, varying, vec2, vec3, vec4,
28
- } from 'three/tsl';
29
-
30
- // --- deterministic randomness (shared with emitters + verify script) --------
31
-
32
- /** Chris Wellons' lowbias32: uint32 -> well-mixed uint32. */
33
- export function lowbias32(x) {
34
- let h = x >>> 0;
35
- h = Math.imul(h ^ (h >>> 16), 0x7feb352d) >>> 0;
36
- h = Math.imul(h ^ (h >>> 15), 0x846ca68b) >>> 0;
37
- return (h ^ (h >>> 16)) >>> 0;
38
- }
39
-
40
- /** Mixes two uint32 seeds into one (order-sensitive). */
41
- export function hashCombine(a, b) {
42
- return lowbias32((a >>> 0) ^ (Math.imul(b >>> 0, 0x9e3779b9) >>> 0));
43
- }
44
-
45
- /** mulberry32 PRNG: uint32 seed -> () => [0, 1). No Math.random anywhere. */
46
- export function mulberry32(seed) {
47
- let state = (Math.trunc(seed) || 1) >>> 0;
48
- return () => {
49
- state = (state + 0x6d2b79f5) >>> 0;
50
- let t = state;
51
- t = Math.imul(t ^ (t >>> 15), t | 1);
52
- t ^= t + Math.imul(t ^ (t >>> 7), t | 61);
53
- return ((t ^ (t >>> 14)) >>> 0) / 4294967296;
54
- };
55
- }
56
-
57
- // --- effect/window constants -------------------------------------------------
58
-
59
- /** Backbone kind ids — the per-instance `iData.w` attribute. */
60
- export const EFFECT_KIND = Object.freeze({ petals: 0, leaves: 1, fireflies: 2, pollen: 3, mist: 4 });
61
-
62
- /** Which blend-group mesh each kind renders in. */
63
- export const GROUP_FOR_KIND = Object.freeze({
64
- petals: 'cutout', leaves: 'cutout', fireflies: 'glow', pollen: 'glow', mist: 'soft',
65
- });
66
-
67
- // Follow-window geometry. Emission fills the full windowRadius disk; the
68
- // visual fade ends before (radius − recenter·radius), so by the time the
69
- // window re-centers, every cell that appears or drops is already past the
70
- // fade — mathematically no pop is possible (see stylizedAmbientFx).
71
- export const FADE_START_FRACTION = 0.55;
72
- export const FADE_END_FRACTION = 0.8;
73
- export const RECENTER_FRACTION = 0.18;
74
-
75
- /** CPU mirror of the shader's wind drift heading (for hosts and verify). */
76
- export function windDriftVector(windDirection) {
77
- const x = Number(windDirection?.[0]) || 0;
78
- const z = Number(windDirection?.[1]) || 0;
79
- const len = Math.hypot(x, z) || 1;
80
- return [x / len, z / len];
81
- }
82
-
83
- // --- geometry helpers --------------------------------------------------------
84
-
85
- const FLOATS_PER_INSTANCE = { iSpawn: 3, iData: 4, iColor: 3, iAux: 4 };
86
-
87
- function createGroupGeometry(capacity) {
88
- const quad = new THREE.PlaneGeometry(1, 1);
89
- const geometry = new THREE.InstancedBufferGeometry();
90
- geometry.index = quad.index;
91
- geometry.setAttribute('position', quad.attributes.position);
92
- geometry.setAttribute('uv', quad.attributes.uv);
93
- for (const [name, itemSize] of Object.entries(FLOATS_PER_INSTANCE)) {
94
- geometry.setAttribute(name, new THREE.InstancedBufferAttribute(
95
- new Float32Array(Math.max(capacity, 1) * itemSize), itemSize));
96
- }
97
- geometry.instanceCount = 0;
98
- // Instances span the whole follow window wherever it goes.
99
- geometry.boundingSphere = new THREE.Sphere(new THREE.Vector3(), 1e5);
100
- return geometry;
101
- }
102
-
103
- /**
104
- * Creates the three blend-group meshes plus their shared uniforms.
105
- * `settings` is a createAmbientFxSettings() result — only uniform-backed
106
- * values are read here; emission is the caller's job (see emitters.js).
107
- *
108
- * Returned groups expose `setInstances(records)` where each record is
109
- * `{ x, y, z, seed, phase, size, kind, r, g, b, range, rate, gateJitter,
110
- * windResponse }` — the emitters produce exactly this shape.
111
- */
112
- export function createParticleBackbone(settings) {
113
- const shared = settings.shared;
114
- const u = {
115
- uCamRight: uniform(new THREE.Vector3(1, 0, 0)),
116
- uCamUp: uniform(new THREE.Vector3(0, 1, 0)),
117
- uCenter: uniform(new THREE.Vector2(0, 0)),
118
- uFireflyIntensity: uniform(settings.fireflies.intensity),
119
- uFogColor: uniform(new THREE.Color(0.66, 0.8, 0.94)),
120
- uFogDensity: uniform(0),
121
- uFogFalloff: uniform(400),
122
- uFogFloorY: uniform(0),
123
- uGateFireflies: uniform(1),
124
- uGateLeaves: uniform(1),
125
- uGateMist: uniform(1),
126
- uGatePetals: uniform(1),
127
- uGatePollen: uniform(1),
128
- uMistOpacity: uniform(settings.mist.opacity),
129
- uPollenBacklit: uniform(settings.pollen.backlitStrength),
130
- uSunDirection: uniform(new THREE.Vector3(...shared.sunDirection).normalize()),
131
- uTime: uniform(0),
132
- uWindDir: uniform(new THREE.Vector2(shared.windDirection[0], shared.windDirection[1])),
133
- uWindSpeed: uniform(shared.windSpeed),
134
- uWindStrength: uniform(shared.windStrength),
135
- uWindowRadius: uniform(shared.windowRadius),
136
- };
137
-
138
- // Mirror of the environment shader's world-height fog (same formula as the
139
- // forest impostors' _fogUniforms): dense near the world floor, thinning
140
- // with altitude, exponential in view distance. Density 0 disables.
141
- const heightFogFactor = (worldPos) => {
142
- const heightFalloff = exp(
143
- max(worldPos.y.sub(u.uFogFloorY), 0.0).div(max(u.uFogFalloff, 0.001)).negate());
144
- const depthTerm = exp(distance(worldPos, cameraPosition).mul(u.uFogDensity).negate()).oneMinus();
145
- return clamp(depthTerm.mul(heightFalloff), 0.0, 1.0);
146
- };
147
-
148
- // Shared per-instance plumbing: window edge fade around the live follow
149
- // center + staggered time-gate fade (each particle owns a threshold, so a
150
- // gate ramping 0→1 pops particles in one by one instead of all at once).
151
- const windowFade = (worldSpawnXZ) => {
152
- const dist = length(worldSpawnXZ.sub(u.uCenter));
153
- return smoothstep(
154
- u.uWindowRadius.mul(FADE_START_FRACTION),
155
- u.uWindowRadius.mul(FADE_END_FRACTION),
156
- dist,
157
- ).oneMinus();
158
- };
159
- const gateFade = (weight, jitter) =>
160
- clamp(weight.mul(1.15).sub(jitter.mul(0.96)).div(0.12), 0.0, 1.0);
161
-
162
- const buildMaterial = (name, build) => {
163
- const material = new NodeMaterial();
164
- material.name = name;
165
- build(material);
166
- material.uniforms = u; // GLSL-style named access, matching the grass idiom
167
- return material;
168
- };
169
-
170
- // ---- cutout group: petals (flutter-fall) + leaves (tumble-fall) ----------
171
- const cutoutMaterial = buildMaterial('AmbientFxCutout', (material) => {
172
- material.side = THREE.DoubleSide;
173
- material.fog = true; // scene.fog linear layer; height fog added below
174
-
175
- const vUv = uv();
176
- const vColor = varying(vec3(), 'vFxColor');
177
- const vSeed = varying(float(), 'vFxSeed');
178
- const vKind = varying(float(), 'vFxKind');
179
- const vWorldPos = varying(vec3(), 'vFxWorldPos');
180
-
181
- material.vertexNode = Fn(() => {
182
- const iSpawn = attribute('iSpawn', 'vec3');
183
- const iData = attribute('iData', 'vec4');
184
- const iAux = attribute('iAux', 'vec4');
185
- const seed = iData.x;
186
- const isLeaf = step(0.5, iData.w).toVar();
187
- vSeed.assign(seed);
188
- vKind.assign(iData.w);
189
- vColor.assign(attribute('iColor', 'vec3'));
190
-
191
- const t = u.uTime;
192
- const windDir = normalize(u.uWindDir.add(vec2(1e-4, 0.0))).toVar();
193
- const windAmp = u.uWindStrength.mul(iAux.w).toVar();
194
-
195
- // Looping fall: each particle forever re-falls its own span (spawn
196
- // height → ground, precomputed by the emitter). The loop ends collapse
197
- // the quad so respawns at the top are invisible, never a pop.
198
- const fallSpan = max(iAux.x, 0.5);
199
- const fallSpeed = mix(0.5, 1.0, fract(seed.mul(19.7))).mul(mix(1.0, 1.4, isLeaf));
200
- const progress = fract(iData.y.add(t.mul(fallSpeed).div(fallSpan))).toVar();
201
- const drop = progress.mul(fallSpan).toVar();
202
-
203
- // Side-to-side flutter (petals rock, leaves slide) + downwind advection
204
- // that accumulates over the fall + a traveling gust kick for leaves.
205
- const ph = t.mul(mix(1.4, 2.3, fract(seed.mul(7.7)))).add(seed.mul(41.0)).toVar();
206
- const amp = iAux.y.mul(mix(0.32, 0.5, fract(seed.mul(3.3)))).toVar();
207
- const perp = vec2(windDir.y.negate(), windDir.x);
208
- const sway = perp.mul(sin(ph).mul(amp))
209
- .add(windDir.mul(sin(ph.mul(0.77).add(1.3)).mul(amp).mul(0.6)))
210
- .toVar();
211
- const gust = sin(iSpawn.xz.dot(windDir).mul(0.15).sub(t.mul(u.uWindSpeed).mul(1.5)))
212
- .mul(0.5).add(0.5);
213
- const advect = windDir.mul(
214
- windAmp.mul(drop).mul(1.6).add(gust.mul(windAmp).mul(isLeaf).mul(1.4)),
215
- );
216
-
217
- // Orientation: petals rock around a lazy yaw; leaves tumble end over
218
- // end — this rotation is what makes tiny quads read as leaves/petals.
219
- const yaw = seed.mul(6.2831).add(t.mul(iAux.y).mul(mix(0.6, 1.1, isLeaf)));
220
- const pitch = mix(
221
- sin(ph.mul(1.13)).mul(0.8).mul(iAux.y).add(1.1),
222
- t.mul(iAux.y).mul(2.4).add(seed.mul(6.2831)),
223
- isLeaf,
224
- );
225
- const roll = sin(ph.mul(0.71).add(seed.mul(9.0))).mul(0.6);
226
-
227
- // Fades multiply into the quad SIZE: a degenerate quad rasterizes
228
- // nothing, so gated/out-of-window particles cost zero fragments.
229
- const worldSpawn = modelWorldMatrix.mul(vec4(iSpawn, 1.0)).xyz.toVar();
230
- const endFade = smoothstep(0.0, 0.06, progress)
231
- .mul(smoothstep(0.92, 1.0, progress).oneMinus());
232
- const gateW = mix(u.uGatePetals, u.uGateLeaves, isLeaf);
233
- const scale = iData.z
234
- .mul(endFade)
235
- .mul(windowFade(worldSpawn.xz))
236
- .mul(gateFade(gateW, iAux.z))
237
- .toVar();
238
-
239
- // PlaneGeometry corners live in local XY; rotate the scaled quad.
240
- const offset = rotate(positionLocal.mul(scale), vec3(pitch, yaw, roll));
241
- const position = vec3(
242
- iSpawn.x.add(sway.x).add(advect.x),
243
- iSpawn.y.sub(drop),
244
- iSpawn.z.add(sway.y).add(advect.y),
245
- ).add(offset);
246
- const worldPosition = modelWorldMatrix.mul(vec4(position, 1.0));
247
- vWorldPos.assign(worldPosition.xyz);
248
- return cameraProjectionMatrix.mul(cameraViewMatrix).mul(worldPosition);
249
- })();
250
-
251
- material.fragmentNode = Fn(() => {
252
- const isLeaf = step(0.5, vKind);
253
- const p = vUv.mul(2.0).sub(1.0).toVar();
254
- // Petal: ellipse with a notch at the outer edge (the classic sakura
255
- // dimple). Leaf: narrower pointed ellipse with a midrib.
256
- const petalMask = length(p.mul(vec2(1.0, 1.12)))
257
- .add(smoothstep(0.35, 0.0, abs(p.x)).mul(max(p.y, 0.0)).mul(0.45));
258
- const leafMask = length(p.mul(vec2(1.5, 1.0)));
259
- Discard(mix(petalMask, leafMask, isLeaf).greaterThan(1.0));
260
-
261
- const color = vColor.mul(fract(vSeed.mul(5.1)).mul(0.16).add(0.92)).toVar();
262
- color.mulAssign(smoothstep(0.12, 0.0, abs(p.x)).mul(isLeaf).mul(0.16).oneMinus());
263
- // Backlit translucency toward the sun — same trick as the grass tips.
264
- const viewDirection = normalize(cameraPosition.sub(vWorldPos));
265
- const backlit = pow(clamp(viewDirection.dot(normalize(u.uSunDirection).negate()), 0.0, 1.0), 3.0);
266
- color.addAssign(color.mul(backlit).mul(0.3));
267
-
268
- const fogged = mix(color, u.uFogColor, heightFogFactor(vWorldPos));
269
- return vec4(fogged, 1.0);
270
- })();
271
- });
272
-
273
- // ---- glow group: fireflies (hover-blink) + pollen (curl drift) ----------
274
- // Emissive/unlit by design (fireflies ARE light sources) and additive, so
275
- // scene fog must not tint them toward the fog color — a fog-colored glow
276
- // quad ADDS fog-colored light. Instead both fog layers only DIM the glow.
277
- const glowMaterial = buildMaterial('AmbientFxGlow', (material) => {
278
- material.transparent = true;
279
- material.blending = THREE.AdditiveBlending;
280
- material.depthWrite = false;
281
- material.fog = false;
282
-
283
- const vUv = uv();
284
- const vColor = varying(vec3(), 'vFxColor');
285
- const vSeed = varying(float(), 'vFxSeed');
286
- const vKind = varying(float(), 'vFxKind');
287
- const vRate = varying(float(), 'vFxRate');
288
- const vFade = varying(float(), 'vFxFade');
289
- const vWorldPos = varying(vec3(), 'vFxWorldPos');
290
-
291
- material.vertexNode = Fn(() => {
292
- const iSpawn = attribute('iSpawn', 'vec3');
293
- const iData = attribute('iData', 'vec4');
294
- const iAux = attribute('iAux', 'vec4');
295
- const seed = iData.x;
296
- const isPollen = step(2.5, iData.w).toVar();
297
- vSeed.assign(seed);
298
- vKind.assign(iData.w);
299
- vRate.assign(iAux.y);
300
- vColor.assign(attribute('iColor', 'vec3'));
301
-
302
- const t = u.uTime;
303
- // Layered-sine wander: fireflies patrol a small pocket of air, pollen
304
- // swirls in a lazier, larger orbit keyed to its position (reads as a
305
- // shared drift field without paying for real curl noise).
306
- const a = mix(0.7, 1.3, fract(seed.mul(3.1)));
307
- const b = mix(0.7, 1.3, fract(seed.mul(5.7)));
308
- const c = mix(0.7, 1.3, fract(seed.mul(9.3)));
309
- const speed = mix(0.5, 0.24, isPollen);
310
- const wander = vec3(
311
- sin(t.mul(speed).mul(a).add(seed.mul(40.0)).add(iSpawn.z.mul(isPollen).mul(0.4))),
312
- sin(t.mul(speed).mul(0.8).mul(b).add(seed.mul(71.0))).mul(0.55),
313
- cos(t.mul(speed).mul(0.9).mul(c).add(seed.mul(23.0)).add(iSpawn.x.mul(isPollen).mul(0.35))),
314
- ).mul(iAux.x).toVar();
315
- // Bounded, oscillating downwind slide — never walks off the window.
316
- const windDir = normalize(u.uWindDir.add(vec2(1e-4, 0.0)));
317
- const slide = sin(t.mul(0.22).add(iData.y.mul(6.2831))).mul(0.5).add(0.5)
318
- .mul(u.uWindStrength).mul(iAux.w).mul(6.0);
319
- wander.x.addAssign(windDir.x.mul(slide));
320
- wander.z.addAssign(windDir.y.mul(slide));
321
-
322
- const anchor = iSpawn.add(wander).toVar();
323
- const worldSpawn = modelWorldMatrix.mul(vec4(iSpawn, 1.0)).xyz;
324
- const gateW = mix(u.uGateFireflies, u.uGatePollen, isPollen);
325
- const fade = windowFade(worldSpawn.xz).mul(gateFade(gateW, iAux.z)).toVar();
326
- vFade.assign(fade);
327
-
328
- // Camera-facing billboard from CPU-fed basis vectors (backend-safe).
329
- const scale = iData.z.mul(step(0.001, fade)).mul(fade.mul(0.35).add(0.65));
330
- const position = anchor
331
- .add(u.uCamRight.mul(positionLocal.x).mul(scale))
332
- .add(u.uCamUp.mul(positionLocal.y).mul(scale));
333
- const worldPosition = modelWorldMatrix.mul(vec4(position, 1.0));
334
- vWorldPos.assign(worldPosition.xyz);
335
- return cameraProjectionMatrix.mul(cameraViewMatrix).mul(worldPosition);
336
- })();
337
-
338
- material.fragmentNode = Fn(() => {
339
- const isPollen = step(2.5, vKind);
340
- const t = u.uTime;
341
- const d = length(vUv.mul(2.0).sub(1.0)).toVar();
342
- const halo = pow(clamp(d.oneMinus(), 0.0, 1.0), 1.8).toVar();
343
- const core = pow(clamp(d.oneMinus(), 0.0, 1.0), 6.0).toVar();
344
-
345
- // Blink: the product of two incommensurate sines thresholded gives the
346
- // irregular firefly pulse; a small floor keeps a faint ember between
347
- // blinks so motes never teleport visually.
348
- const blinkT = sin(t.mul(vRate).mul(1.1).add(vSeed.mul(251.0))).mul(0.5).add(0.5)
349
- .mul(sin(t.mul(vRate).mul(0.37).add(vSeed.mul(97.0))).mul(0.5).add(0.5));
350
- const blink = smoothstep(0.22, 0.55, blinkT).mul(0.94).add(0.06);
351
-
352
- // Pollen: steady soft twinkle + strong boost looking toward the sun.
353
- const viewDirection = normalize(cameraPosition.sub(vWorldPos));
354
- const backlit = pow(clamp(viewDirection.dot(normalize(u.uSunDirection).negate()), 0.0, 1.0), 2.5);
355
- const twinkle = sin(t.mul(vRate).add(vSeed.mul(151.0))).mul(0.18).add(0.82);
356
- // Base bright enough to sparkle over sunlit grass; backlit doubles it.
357
- const pollenBrightness = twinkle.mul(backlit.mul(u.uPollenBacklit).mul(2.2).add(0.85));
358
-
359
- const brightness = mix(blink.mul(u.uFireflyIntensity).mul(2.0), pollenBrightness, isPollen);
360
- const rgb = vColor.mul(halo).add(vec3(1.0).mul(core).mul(mix(0.8, 0.25, isPollen)))
361
- .mul(brightness)
362
- .mul(vFade)
363
- .mul(heightFogFactor(vWorldPos).oneMinus());
364
- return vec4(rgb, halo);
365
- })();
366
- });
367
-
368
- // ---- soft group: mist wisps (horizontal scroll) ---------------------------
369
- const softMaterial = buildMaterial('AmbientFxSoft', (material) => {
370
- material.transparent = true;
371
- material.depthWrite = false;
372
- material.fog = true;
373
-
374
- const vUv = uv();
375
- const vColor = varying(vec3(), 'vFxColor');
376
- const vSeed = varying(float(), 'vFxSeed');
377
- const vFade = varying(float(), 'vFxFade');
378
- const vWorldPos = varying(vec3(), 'vFxWorldPos');
379
-
380
- material.vertexNode = Fn(() => {
381
- const iSpawn = attribute('iSpawn', 'vec3');
382
- const iData = attribute('iData', 'vec4');
383
- const iAux = attribute('iAux', 'vec4');
384
- const seed = iData.x;
385
- vSeed.assign(seed);
386
- vColor.assign(attribute('iColor', 'vec3'));
387
-
388
- const t = u.uTime;
389
- const windDir = normalize(u.uWindDir.add(vec2(1e-4, 0.0)));
390
- // Scroll a wisp downwind across its span, wrap, fade at both ends.
391
- const s = fract(iData.y.add(t.mul(u.uWindSpeed).mul(iAux.w).mul(0.02))).toVar();
392
- const travel = s.sub(0.5).mul(iAux.x);
393
- const bob = sin(t.mul(iAux.y).add(seed.mul(37.0))).mul(0.22);
394
- const anchor = vec3(
395
- iSpawn.x.add(windDir.x.mul(travel)),
396
- iSpawn.y.add(bob),
397
- iSpawn.z.add(windDir.y.mul(travel)),
398
- ).toVar();
399
-
400
- const worldSpawn = modelWorldMatrix.mul(vec4(iSpawn, 1.0)).xyz;
401
- const endFade = smoothstep(0.0, 0.18, s).mul(smoothstep(0.82, 1.0, s).oneMinus());
402
- const fade = windowFade(worldSpawn.xz)
403
- .mul(gateFade(u.uGateMist, iAux.z))
404
- .mul(endFade)
405
- .toVar();
406
- vFade.assign(fade);
407
-
408
- // Y-axis billboard: wisps stay upright and face the camera in plan
409
- // only, so they read as layers of ground haze from any walk-height view.
410
- const toCam = cameraPosition.sub(anchor);
411
- const right = normalize(vec3(toCam.z, 0.0, toCam.x.negate()).add(vec3(1e-4, 0.0, 0.0)));
412
- const width = iData.z.mul(fract(seed.mul(2.7)).mul(2.6).add(4.0));
413
- const grow = step(0.001, fade);
414
- const position = anchor
415
- .add(right.mul(positionLocal.x).mul(width).mul(grow))
416
- .add(vec3(0.0, 1.0, 0.0).mul(positionLocal.y.add(0.35)).mul(iData.z).mul(grow));
417
- const worldPosition = modelWorldMatrix.mul(vec4(position, 1.0));
418
- vWorldPos.assign(worldPosition.xyz);
419
- return cameraProjectionMatrix.mul(cameraViewMatrix).mul(worldPosition);
420
- })();
421
-
422
- material.fragmentNode = Fn(() => {
423
- const t = u.uTime;
424
- const p = vUv.mul(2.0).sub(1.0);
425
- const body = pow(clamp(length(p.mul(vec2(1.0, 1.2))).oneMinus(), 0.0, 1.0), 1.5);
426
- // Two drifting ripples across the quad break the "airbrushed ellipse"
427
- // read into something wispy without a noise texture.
428
- const ripple = sin(vUv.x.mul(9.0).add(t.mul(0.4)).add(vSeed.mul(63.0))).mul(0.5).add(0.5)
429
- .mul(sin(vUv.x.mul(4.0).sub(t.mul(0.23)).add(vSeed.mul(29.0))).mul(0.5).add(0.5));
430
- const alpha = body
431
- .mul(ripple.mul(0.5).add(0.62))
432
- .mul(u.uMistOpacity)
433
- .mul(fract(vSeed.mul(9.3)).mul(0.3).add(0.7))
434
- .mul(vFade);
435
-
436
- const lit = mix(vColor.mul(0.94), vColor.mul(1.08), vUv.y);
437
- const fogged = mix(lit, u.uFogColor, heightFogFactor(vWorldPos));
438
- return vec4(fogged, alpha);
439
- })();
440
- });
441
-
442
- const buildGroup = (id, material, capacity, renderOrder) => {
443
- const mesh = new THREE.Mesh(createGroupGeometry(capacity), material);
444
- mesh.name = `AmbientFx${id[0].toUpperCase()}${id.slice(1)}`;
445
- mesh.frustumCulled = false;
446
- mesh.renderOrder = renderOrder;
447
- const group = {
448
- capacity: Math.max(capacity, 1),
449
- count: 0,
450
- id,
451
- mesh,
452
- setInstances(records) {
453
- if (records.length > group.capacity) {
454
- group.capacity = Math.ceil(records.length * 1.3);
455
- for (const [name, itemSize] of Object.entries(FLOATS_PER_INSTANCE)) {
456
- mesh.geometry.setAttribute(name, new THREE.InstancedBufferAttribute(
457
- new Float32Array(group.capacity * itemSize), itemSize));
458
- }
459
- }
460
- const spawn = mesh.geometry.attributes.iSpawn;
461
- const data = mesh.geometry.attributes.iData;
462
- const color = mesh.geometry.attributes.iColor;
463
- const aux = mesh.geometry.attributes.iAux;
464
- records.forEach((r, i) => {
465
- spawn.array[i * 3] = r.x; spawn.array[i * 3 + 1] = r.y; spawn.array[i * 3 + 2] = r.z;
466
- data.array[i * 4] = r.seed; data.array[i * 4 + 1] = r.phase;
467
- data.array[i * 4 + 2] = r.size; data.array[i * 4 + 3] = r.kind;
468
- color.array[i * 3] = r.r; color.array[i * 3 + 1] = r.g; color.array[i * 3 + 2] = r.b;
469
- aux.array[i * 4] = r.range; aux.array[i * 4 + 1] = r.rate;
470
- aux.array[i * 4 + 2] = r.gateJitter; aux.array[i * 4 + 3] = r.windResponse;
471
- });
472
- spawn.needsUpdate = data.needsUpdate = color.needsUpdate = aux.needsUpdate = true;
473
- mesh.geometry.instanceCount = records.length;
474
- group.count = records.length;
475
- },
476
- dispose() {
477
- mesh.geometry.dispose();
478
- material.dispose();
479
- },
480
- };
481
- return group;
482
- };
483
-
484
- return {
485
- groups: {
486
- cutout: buildGroup('cutout', cutoutMaterial, 2048, 1),
487
- // Mist under the glows so fireflies shine THROUGH the haze layer.
488
- soft: buildGroup('soft', softMaterial, 64, 2),
489
- glow: buildGroup('glow', glowMaterial, 1024, 3),
490
- },
491
- uniforms: u,
492
- };
493
- }