@call-me-sensei/toonlab 0.3.1 → 0.4.20

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 (761) hide show
  1. package/NPM-LIBRARY.md +225 -0
  2. package/README.md +588 -184
  3. package/agents/PROMPTS.md +87 -0
  4. package/agents/README.md +54 -0
  5. package/agents/claude/CLAUDE.md +8 -0
  6. package/agents/codex/AGENTS.md +159 -0
  7. package/agents/cursor/toonlab.mdc +37 -0
  8. package/agents/references/anime-art-direction.md +24 -0
  9. package/agents/references/asset-sourcing-policy.md +23 -0
  10. package/agents/references/custom-gap-report.md +16 -0
  11. package/agents/references/mcp-asset-discovery.md +104 -0
  12. package/agents/references/runtime-entry-points.md +175 -0
  13. package/agents/references/style-bundles.md +71 -0
  14. package/agents/skills/claude/asset-sourcing/SKILL.md +275 -0
  15. package/agents/skills/claude/environment/SKILL.md +59 -0
  16. package/agents/skills/claude/game-dev/SKILL.md +100 -0
  17. package/agents/skills/claude/post-processing/SKILL.md +44 -0
  18. package/agents/skills/claude/rock-ground-shaders/SKILL.md +134 -0
  19. package/agents/skills/claude/rockgen/SKILL.md +30 -0
  20. package/agents/skills/claude/scene-style-application/SKILL.md +74 -0
  21. package/agents/skills/claude/style-presets/SKILL.md +101 -0
  22. package/agents/skills/claude/toon-shading/SKILL.md +44 -0
  23. package/agents/skills/claude/vegetation-sky/SKILL.md +167 -0
  24. package/agents/skills/claude/visual-verification/SKILL.md +136 -0
  25. package/agents/skills/claude/water/SKILL.md +105 -0
  26. package/agents/skills/codex/asset-sourcing/SKILL.md +275 -0
  27. package/agents/skills/codex/environment/SKILL.md +59 -0
  28. package/agents/skills/codex/game-dev/SKILL.md +100 -0
  29. package/agents/skills/codex/post-processing/SKILL.md +44 -0
  30. package/agents/skills/codex/rock-ground-shaders/SKILL.md +134 -0
  31. package/agents/skills/codex/rockgen/SKILL.md +30 -0
  32. package/agents/skills/codex/scene-style-application/SKILL.md +74 -0
  33. package/agents/skills/codex/style-presets/SKILL.md +101 -0
  34. package/agents/skills/codex/toon-shading/SKILL.md +44 -0
  35. package/agents/skills/codex/vegetation-sky/SKILL.md +167 -0
  36. package/agents/skills/codex/visual-verification/SKILL.md +136 -0
  37. package/agents/skills/codex/water/SKILL.md +105 -0
  38. package/cli/toonlab.mjs +53 -0
  39. package/compose.yaml +20 -0
  40. package/database/apply-sql.mjs +141 -0
  41. package/database/client.mjs +39 -0
  42. package/database/creation-tags.mjs +23 -0
  43. package/database/env.mjs +16 -0
  44. package/database/fal-patina.mjs +131 -0
  45. package/database/generation-service.mjs +415 -0
  46. package/database/migrations/0001_local_workspace.sql +120 -0
  47. package/database/migrations/0002_file_ownership.sql +11 -0
  48. package/database/migrations/0003_remove_autosaves_from_library.sql +7 -0
  49. package/database/migrations/0004_catalog_asset_packs.sql +39 -0
  50. package/database/migrations/0005_creation_tag_discovery.sql +1 -0
  51. package/database/migrations/0006_normalize_creation_tags.sql +28 -0
  52. package/database/migrations/0007_creation_revisions.sql +80 -0
  53. package/database/migrations/0008_creation_revision_hardening.sql +98 -0
  54. package/database/migrations/0009_creation_revision_delete_integrity.sql +11 -0
  55. package/database/migrations/0010_external_catalog_assets.sql +28 -0
  56. package/database/providers.mjs +644 -0
  57. package/database/repository.mjs +1073 -0
  58. package/database/seeds/catalog/0001_empty_official_catalog.sql +4 -0
  59. package/database/seeds/catalog/0002_2026-08.sql +19454 -0
  60. package/database/seeds/catalog/0003_2026-08-open-assets.sql +159086 -0
  61. package/database/seeds/catalog/0004_2026-08-c7-rocks.sql +39405 -0
  62. package/mcp/lab-management.mjs +629 -0
  63. package/mcp/public-catalog.mjs +168 -0
  64. package/mcp/server.mjs +1044 -63
  65. package/mcp/vite-plugin.mjs +519 -26
  66. package/mcp/workspace.mjs +26 -1
  67. package/package.json +334 -46
  68. package/scripts/generate-catalog-seed.mjs +324 -0
  69. package/scripts/setup-local.mjs +128 -0
  70. package/src/agents/index.js +7 -0
  71. package/src/agents/sceneStyleOperations.js +169 -0
  72. package/src/asset-policy/catalogLicenses.js +102 -0
  73. package/src/asset-policy/index.js +315 -0
  74. package/src/assetlib/assetRef.js +1 -1
  75. package/src/assetlib/galleryMaterialFamily.js +165 -0
  76. package/src/assetlib/index.js +6 -2
  77. package/src/assetlib/loadImported.js +15 -1
  78. package/src/assetlib/plateau.js +188 -0
  79. package/src/assetlib/plateauLandmarks.js +144 -0
  80. package/src/assetlib/plateauViewer.js +348 -0
  81. package/src/assetlib/sources.js +16 -2
  82. package/src/catalog/manifest.js +11 -1
  83. package/src/catalog/officialCatalog.js +4 -0
  84. package/src/catalog/officialCatalogAssetRuntime.js +324 -0
  85. package/src/catalog/officialCatalogLod.js +183 -0
  86. package/src/catalog/officialCatalogPlacement.js +243 -0
  87. package/src/catalog/officialCatalogProvider.js +334 -0
  88. package/src/character/animationRetarget.js +1084 -0
  89. package/src/character/characterRig.js +6 -1
  90. package/src/character/characterRuntime.js +544 -0
  91. package/src/character/groundStabilizer.js +137 -0
  92. package/src/character/index.js +8 -0
  93. package/src/character/locomotionActions.js +74 -0
  94. package/src/character/locomotionStateMachine.js +241 -0
  95. package/src/character/mannequinAsset.js +15 -0
  96. package/src/character/mannequinAssetUrl.browser.js +4 -0
  97. package/src/character/mannequinAssetUrl.node.js +3 -0
  98. package/src/character/modelLoader.js +92 -12
  99. package/src/character/walkableCharacterRuntime.js +284 -0
  100. package/src/character/waterInteractionController.js +217 -0
  101. package/src/cloud/ambientSkyBaker.js +248 -0
  102. package/src/cloud/cloudLighting.js +1114 -0
  103. package/src/cloud/cloudParams.js +819 -0
  104. package/src/cloud/cloudReprojection.js +563 -0
  105. package/src/cloud/cloudStyle.js +780 -0
  106. package/src/cloud/cloudStyleSnapshots.js +387 -0
  107. package/src/cloud/cloudVolume.js +1903 -0
  108. package/src/cloud/heroCloudRecipe.js +404 -0
  109. package/src/cloud/index.js +42 -0
  110. package/src/cloud/noise/baseShapeVolume.js +331 -0
  111. package/src/cloud/noise/cirrusMap.js +131 -0
  112. package/src/cloud/noise/curlNoise.js +289 -0
  113. package/src/cloud/noise/erosionVolume.js +188 -0
  114. package/src/cloud/noise/noiseVolume.js +202 -0
  115. package/src/cloud/noise/periodicNoise3.js +295 -0
  116. package/src/cloud/noise/weatherMap.js +470 -0
  117. package/src/cloud/paramSchema.js +458 -0
  118. package/src/collisionMetadata.js +320 -0
  119. package/src/core/systemStylePolicy.js +32 -0
  120. package/src/environment/dayCurves.js +146 -0
  121. package/src/environment/environmentGroundFieldPass.js +354 -0
  122. package/src/environment/environmentMaterialAdapter.js +144 -6
  123. package/src/environment/environmentPresets.js +486 -90
  124. package/src/environment/environmentRigs.js +17 -2
  125. package/src/environment/environmentSettings.js +37 -1
  126. package/src/environment/environmentShaderMaterials.js +37 -6
  127. package/src/environment/environmentState.js +133 -0
  128. package/src/environment/environmentSunShadowPass.js +399 -6
  129. package/src/environment/environmentTextureResolver.js +7 -0
  130. package/src/environment/index.js +51 -0
  131. package/src/environment/manufacturedMaterialContract.js +837 -0
  132. package/src/environment/manufacturedReflectionProvider.js +114 -0
  133. package/src/environment/scanAssetStylize.js +4 -4
  134. package/src/environment/surfaceMaterialModes.js +71 -0
  135. package/src/environment/toonLabEnvironmentMaterials.js +353 -0
  136. package/src/environment/toonLabMaterialPassCoupling.js +347 -0
  137. package/src/environment/toonLabNormalIntegration.js +171 -0
  138. package/src/environment/toonLabRockMaterialResolver.js +592 -0
  139. package/src/environment/toonLabSourceDefaultLit.js +444 -0
  140. package/src/environment/toonLabSourceLibrary.js +762 -0
  141. package/src/environment/toonLabSourceMaterials.js +3718 -0
  142. package/src/environment/toonLabSourceSubsurfaceLighting.js +415 -0
  143. package/src/environment/toonLabSourceTemporal.js +717 -0
  144. package/src/environment/toonLabSurfaceLighting.js +462 -0
  145. package/src/environment/toonLabTextureReadiness.js +105 -0
  146. package/src/environment/toonLabTreeMaterials.js +450 -0
  147. package/src/environment/transparentMaterialProfile.js +87 -0
  148. package/src/environment/urbanPropMaterial.js +2976 -0
  149. package/src/ground-shader/groundPrintLayer.js +375 -0
  150. package/src/ground-shader/groundShaderMaterial.js +851 -0
  151. package/src/ground-shader/groundShaderSettings.js +468 -0
  152. package/src/ground-shader/index.js +3 -0
  153. package/src/index.js +52 -22
  154. package/src/lighting/callMeSenseiLightingContract.js +163 -0
  155. package/src/lighting/index.js +14 -7
  156. package/src/lighting/lightingCapabilities.js +2 -2
  157. package/src/lighting/lightingPresets.js +6 -3
  158. package/src/lighting/lightingStyle.js +41 -6
  159. package/src/lighting/lightingSystem.js +200 -6
  160. package/src/lighting/{unrealExport.js → toonLabExport.js} +40 -41
  161. package/src/post/postProcessing.js +71 -12
  162. package/src/react/index.js +66 -0
  163. package/src/renderer/index.js +16 -0
  164. package/src/renderer/rendererConfiguration.js +250 -0
  165. package/src/renderer/styleComparison.js +985 -0
  166. package/src/rock-shader/index.js +8 -0
  167. package/src/rock-shader/rockGeometryDetail.js +701 -0
  168. package/src/rock-shader/rockMaterial.js +2586 -0
  169. package/src/rock-shader/rockRegionRuntime.js +185 -0
  170. package/src/rock-shader/rockSemanticMaterialRuntime.js +337 -0
  171. package/src/rock-shader/rockShaderRuntime.js +781 -0
  172. package/src/rock-shader/rockShaderSettings.js +1099 -0
  173. package/src/rock-shader/rockTangentIntegrity.js +136 -0
  174. package/src/rock-shader/rockTextureIntegrity.js +115 -0
  175. package/src/rockgen/export/glbExport.js +104 -14
  176. package/src/rockgen/index.js +5 -3
  177. package/src/rockgen/lod/index.js +6 -0
  178. package/src/rockgen/lod/rockLodMetrics.js +168 -0
  179. package/src/rockgen/lod/rockLodPlanner.js +372 -0
  180. package/src/rockgen/lod/rockLodPolicy.js +235 -0
  181. package/src/rockgen/lod/rockLodRuntime.js +124 -0
  182. package/src/rockgen/lod/rockLodSimplifier.js +173 -0
  183. package/src/rockgen/lod/rockLodValidation.js +113 -0
  184. package/src/rockgen/mesh/meshAttributes.js +17 -0
  185. package/src/rockgen/mesh/meshDocument.js +6 -0
  186. package/src/rockgen/rockDocument.js +376 -9
  187. package/src/rockgen/rockgenPresets.js +114 -13
  188. package/src/rockgen/rockgenSettings.js +62 -11
  189. package/src/rockgen/surface/c7GeologySurface.js +372 -0
  190. package/src/runtime/index.js +14 -0
  191. package/src/runtime/sceneCollisionRuntime.js +317 -0
  192. package/src/runtime/sceneSurfaceRuntime.js +451 -0
  193. package/src/runtime/sceneUpdateScheduler.js +203 -0
  194. package/src/shaders-tsl/anime.js +9 -2
  195. package/src/shaders-tsl/chunks/environment-ground-field.js +174 -0
  196. package/src/shaders-tsl/chunks/environment-state.js +79 -0
  197. package/src/shaders-tsl/chunks/environment-sun-shadow.js +99 -32
  198. package/src/shaders-tsl/chunks/normalized-hue.js +41 -0
  199. package/src/shaders-tsl/chunks/pass-depth-color.js +4 -2
  200. package/src/shaders-tsl/chunks/scene-depth-color-pass.js +273 -0
  201. package/src/shaders-tsl/chunks/vegetation-style.js +116 -8
  202. package/src/shaders-tsl/chunks/water-color.js +19 -5
  203. package/src/shaders-tsl/chunks/water-shore-state.js +8 -1
  204. package/src/shaders-tsl/chunks/world-noise.js +30 -0
  205. package/src/shaders-tsl/environment.js +123 -17
  206. package/src/shaders-tsl/flower.js +51 -8
  207. package/src/shaders-tsl/grass.js +194 -29
  208. package/src/shaders-tsl/post-composite.js +83 -2
  209. package/src/shaders-tsl/tree-leaf.js +107 -16
  210. package/src/shaders-tsl/water-breaker.js +18 -4
  211. package/src/shaders-tsl/water.js +51 -3
  212. package/src/shaders-tsl/woody-surface.js +59 -7
  213. package/src/sky/atmosphereDome.js +193 -0
  214. package/src/sky/atmosphereParams.js +396 -0
  215. package/src/sky/atmosphereScattering.js +593 -0
  216. package/src/sky/atmosphereSky.js +371 -0
  217. package/src/sky/cloudShadow.js +379 -0
  218. package/src/sky/godRays.js +257 -0
  219. package/src/sky/index.js +55 -1
  220. package/src/sky/nightSky.js +1190 -0
  221. package/src/sky/renderLayers.js +120 -0
  222. package/src/sky/skyColor.js +582 -0
  223. package/src/sky/skyDayCycle.js +244 -0
  224. package/src/sky/skyParams.js +661 -0
  225. package/src/sky/skyPresets.js +772 -0
  226. package/src/sky/skyQualityTiers.js +383 -0
  227. package/src/sky/skyShaderSettings.js +699 -0
  228. package/src/sky/skyStyleSnapshots.js +211 -0
  229. package/src/sky/skySystem.js +1447 -0
  230. package/src/sky/skyTimeKeyframes.js +361 -0
  231. package/src/sky/stylizedSky.js +405 -116
  232. package/src/sky/sunDriver.js +499 -0
  233. package/src/sky/timeOfDay.js +335 -0
  234. package/src/styles/animeGameProfile.js +44 -0
  235. package/src/styles/index.js +157 -0
  236. package/src/styles/manufacturedStyleLabeling.js +204 -0
  237. package/src/styles/neutralStylePresets.js +712 -0
  238. package/src/styles/sceneLayerDocuments.js +185 -0
  239. package/src/styles/sceneLookComposition.js +156 -0
  240. package/src/styles/sceneQualityApplication.js +152 -0
  241. package/src/styles/sceneQualityProfiles.js +268 -0
  242. package/src/styles/sceneStyleAudit.js +512 -0
  243. package/src/styles/sceneStyleRuntime.js +923 -0
  244. package/src/styles/styleAdapters.js +177 -0
  245. package/src/styles/styleApplication.js +369 -0
  246. package/src/styles/styleBundle.js +445 -92
  247. package/src/styles/styleBundleProvider.js +83 -0
  248. package/src/styles/styleDomains.js +21 -0
  249. package/src/styles/styleInspector.js +262 -0
  250. package/src/styles/styleMaterialContract.js +375 -0
  251. package/src/styles/styleMetadata.js +73 -0
  252. package/src/styles/styleTargetDiscovery.js +162 -0
  253. package/src/styles/styleTargetLabels.js +206 -0
  254. package/src/styles/styleTargetMaterialCoverage.js +137 -0
  255. package/src/styles/styleTransaction.js +272 -0
  256. package/src/texgen/evaluateTexture.js +30 -3
  257. package/src/texgen/textureGenerators.js +83 -35
  258. package/src/texgen/textureSettings.js +25 -8
  259. package/src/toon/toonSettings.js +100 -2
  260. package/src/vegetation/branchTree.js +587 -0
  261. package/src/vegetation/callMeSenseiGrass.js +183 -0
  262. package/src/vegetation/compiledTree.js +506 -0
  263. package/src/vegetation/contactShadowField.js +107 -0
  264. package/src/vegetation/flowerSpecies.js +10 -2
  265. package/src/vegetation/grass.js +13 -0
  266. package/src/vegetation/grassClump.js +1179 -0
  267. package/src/vegetation/importedVegetationMaterial.js +183 -0
  268. package/src/vegetation/index.js +17 -1
  269. package/src/vegetation/legacyTreePresets.js +120 -0
  270. package/src/vegetation/scatter.js +688 -3
  271. package/src/vegetation/stylizedBush.js +14 -0
  272. package/src/vegetation/stylizedFlower.js +31 -0
  273. package/src/vegetation/stylizedFlowers.js +59 -7
  274. package/src/vegetation/stylizedForest.js +455 -147
  275. package/src/vegetation/stylizedGrass.js +188 -24
  276. package/src/vegetation/stylizedTree.js +676 -54
  277. package/src/vegetation/stylizedTreeFoliage.js +1111 -38
  278. package/src/vegetation/stylizedUnderstory.js +230 -0
  279. package/src/vegetation/treeExport.js +262 -47
  280. package/src/vegetation/treeSurfaceTextures.js +665 -0
  281. package/src/vegetation/vegetationShaders.js +617 -28
  282. package/src/version.js +3 -0
  283. package/src/water/water.js +2 -0
  284. package/src/water/waterBreakerSystem.js +2 -0
  285. package/src/water/waterCurrentField.js +1 -0
  286. package/src/water/waterMaterial.js +3 -0
  287. package/src/water/waterRain.js +2 -0
  288. package/src/water/waterScenePasses.js +170 -7
  289. package/src/water/waterSettings.js +250 -50
  290. package/src/water/waterShoreMaterial.js +16 -2
  291. package/src/water/waterShoreStateField.js +1 -1
  292. package/src/water/waterSplashSystem.js +2 -0
  293. package/src/water/waterStageSettings.js +60 -0
  294. package/src/water/waterSurface.js +144 -4
  295. package/src/water/waterUnderwaterAtmosphere.js +288 -0
  296. package/src/water/waterVegetation.js +20 -4
  297. package/src/worldCollision.js +64 -9
  298. package/types/agents/index.d.ts +1 -0
  299. package/types/agents/sceneStyleOperations.d.ts +484 -0
  300. package/types/asset-policy/catalogLicenses.d.ts +7 -0
  301. package/types/asset-policy/index.d.ts +20 -0
  302. package/types/assetlib/ambientcg.d.ts +81 -0
  303. package/types/assetlib/assetRef.d.ts +26 -0
  304. package/types/assetlib/galleryMaterialFamily.d.ts +13 -0
  305. package/types/assetlib/importedEntry.d.ts +18 -0
  306. package/types/assetlib/index.d.ts +16 -0
  307. package/types/assetlib/kaykit.d.ts +112 -0
  308. package/types/assetlib/kaykitStaticIndex.d.ts +38 -0
  309. package/types/assetlib/loadImported.d.ts +56 -0
  310. package/types/assetlib/opensource3d.d.ts +55 -0
  311. package/types/assetlib/plateau.d.ts +67 -0
  312. package/types/assetlib/plateauLandmarks.d.ts +238 -0
  313. package/types/assetlib/plateauViewer.d.ts +3 -0
  314. package/types/assetlib/polyhaven.d.ts +90 -0
  315. package/types/assetlib/polypizza.d.ts +10 -0
  316. package/types/assetlib/smithsonian.d.ts +9 -0
  317. package/types/assetlib/sources.d.ts +22 -0
  318. package/types/assetlib/zip.d.ts +8 -0
  319. package/types/catalog/manifest.d.ts +26 -0
  320. package/types/catalog/officialCatalog.d.ts +4 -0
  321. package/types/catalog/officialCatalogAssetRuntime.d.ts +2 -0
  322. package/types/catalog/officialCatalogLod.d.ts +63 -0
  323. package/types/catalog/officialCatalogPlacement.d.ts +49 -0
  324. package/types/catalog/officialCatalogProvider.d.ts +7 -0
  325. package/types/character/animationRetarget.d.ts +20 -0
  326. package/types/character/characterRig.d.ts +87 -0
  327. package/types/character/characterRuntime.d.ts +5 -0
  328. package/types/character/freestyleSwimClip.d.ts +5 -0
  329. package/types/character/groundStabilizer.d.ts +55 -0
  330. package/types/character/index.d.ts +10 -0
  331. package/types/character/locomotionActions.d.ts +4 -0
  332. package/types/character/locomotionStateMachine.d.ts +62 -0
  333. package/types/character/mannequinAsset.d.ts +12 -0
  334. package/types/character/mannequinAssetUrl.node.d.ts +1 -0
  335. package/types/character/modelLoader.d.ts +7 -0
  336. package/types/character/walkableCharacterRuntime.d.ts +343 -0
  337. package/types/character/waterInteractionController.d.ts +114 -0
  338. package/types/cloud/ambientSkyBaker.d.ts +18 -0
  339. package/types/cloud/cloudLighting.d.ts +38 -0
  340. package/types/cloud/cloudParams.d.ts +18 -0
  341. package/types/cloud/cloudReprojection.d.ts +15 -0
  342. package/types/cloud/cloudStyle.d.ts +1380 -0
  343. package/types/cloud/cloudStyleSnapshots.d.ts +10 -0
  344. package/types/cloud/cloudVolume.d.ts +43 -0
  345. package/types/cloud/heroCloudRecipe.d.ts +167 -0
  346. package/types/cloud/index.d.ts +12 -0
  347. package/types/cloud/noise/baseShapeVolume.d.ts +86 -0
  348. package/types/cloud/noise/cirrusMap.d.ts +24 -0
  349. package/types/cloud/noise/curlNoise.d.ts +106 -0
  350. package/types/cloud/noise/erosionVolume.d.ts +58 -0
  351. package/types/cloud/noise/noiseVolume.d.ts +63 -0
  352. package/types/cloud/noise/periodicNoise3.d.ts +75 -0
  353. package/types/cloud/noise/weatherMap.d.ts +227 -0
  354. package/types/cloud/paramSchema.d.ts +142 -0
  355. package/types/collisionMetadata.d.ts +11 -0
  356. package/types/core/generation.d.ts +95 -0
  357. package/types/core/materialRoles.d.ts +102 -0
  358. package/types/core/presetDocuments.d.ts +25 -0
  359. package/types/core/systemStylePolicy.d.ts +4 -0
  360. package/types/environment/dayCurves.d.ts +47 -0
  361. package/types/environment/environmentAmbientProbe.d.ts +2 -0
  362. package/types/environment/environmentGroundFieldPass.d.ts +2 -0
  363. package/types/environment/environmentMaterialAdapter.d.ts +44 -0
  364. package/types/environment/environmentMaterialClassifier.d.ts +26 -0
  365. package/types/environment/environmentPlanarReflection.d.ts +3 -0
  366. package/types/environment/environmentPresets.d.ts +171 -0
  367. package/types/environment/environmentRigs.d.ts +13 -0
  368. package/types/environment/environmentSettings.d.ts +161 -0
  369. package/types/environment/environmentShaderMaterials.d.ts +14 -0
  370. package/types/environment/environmentState.d.ts +6 -0
  371. package/types/environment/environmentSunShadowPass.d.ts +2 -0
  372. package/types/environment/environmentTextureResolver.d.ts +30 -0
  373. package/types/environment/environmentTimeOfDay.d.ts +25 -0
  374. package/types/environment/environmentVertexAo.d.ts +18 -0
  375. package/types/environment/index.d.ts +27 -0
  376. package/types/environment/manufacturedMaterialContract.d.ts +129 -0
  377. package/types/environment/manufacturedReflectionProvider.d.ts +3 -0
  378. package/types/environment/scanAssetStylize.d.ts +43 -0
  379. package/types/environment/surfaceMaterialModes.d.ts +14 -0
  380. package/types/environment/toonLabEnvironmentMaterials.d.ts +139 -0
  381. package/types/environment/toonLabMaterialPassCoupling.d.ts +7 -0
  382. package/types/environment/toonLabNormalIntegration.d.ts +29 -0
  383. package/types/environment/toonLabRockMaterialResolver.d.ts +270 -0
  384. package/types/environment/toonLabSourceDefaultLit.d.ts +136 -0
  385. package/types/environment/toonLabSourceLibrary.d.ts +19 -0
  386. package/types/environment/toonLabSourceMaterials.d.ts +14 -0
  387. package/types/environment/toonLabSourceSubsurfaceLighting.d.ts +85 -0
  388. package/types/environment/toonLabSourceTemporal.d.ts +20 -0
  389. package/types/environment/toonLabSurfaceLighting.d.ts +153 -0
  390. package/types/environment/toonLabTextureReadiness.d.ts +8 -0
  391. package/types/environment/toonLabTreeMaterials.d.ts +7 -0
  392. package/types/environment/transparentMaterialProfile.d.ts +76 -0
  393. package/types/environment/urbanPropMaterial.d.ts +25 -0
  394. package/types/ground-shader/groundPrintLayer.d.ts +4 -0
  395. package/types/ground-shader/groundShaderMaterial.d.ts +11 -0
  396. package/types/ground-shader/groundShaderSettings.d.ts +90 -0
  397. package/types/ground-shader/index.d.ts +3 -0
  398. package/types/index.d.ts +1591 -0
  399. package/types/lighting/callMeSenseiLightingContract.d.ts +14 -0
  400. package/types/lighting/colorIntensity.d.ts +44 -0
  401. package/types/lighting/index.d.ts +12 -0
  402. package/types/lighting/lightDescriptors.d.ts +803 -0
  403. package/types/lighting/lightingCapabilities.d.ts +85 -0
  404. package/types/lighting/lightingDocuments.d.ts +140 -0
  405. package/types/lighting/lightingFixtures.d.ts +171 -0
  406. package/types/lighting/lightingGenerator.d.ts +403 -0
  407. package/types/lighting/lightingPresets.d.ts +264 -0
  408. package/types/lighting/lightingRuntime.d.ts +401 -0
  409. package/types/lighting/lightingStyle.d.ts +156 -0
  410. package/types/lighting/lightingSystem.d.ts +440 -0
  411. package/types/lighting/toonLabExport.d.ts +46 -0
  412. package/types/lighting/utils.d.ts +18 -0
  413. package/types/loaders/index.d.ts +1 -0
  414. package/types/post/index.d.ts +2 -0
  415. package/types/post/postGenerator.d.ts +282 -0
  416. package/types/post/postProcessing.d.ts +16 -0
  417. package/types/react/index.d.ts +1785 -0
  418. package/types/renderer/index.d.ts +2 -0
  419. package/types/renderer/rendererConfiguration.d.ts +8 -0
  420. package/types/renderer/styleComparison.d.ts +409 -0
  421. package/types/rock-shader/index.d.ts +8 -0
  422. package/types/rock-shader/rockGeometryDetail.d.ts +300 -0
  423. package/types/rock-shader/rockMaterial.d.ts +21 -0
  424. package/types/rock-shader/rockRegionRuntime.d.ts +86 -0
  425. package/types/rock-shader/rockSemanticMaterialRuntime.d.ts +29 -0
  426. package/types/rock-shader/rockShaderRuntime.d.ts +10 -0
  427. package/types/rock-shader/rockShaderSettings.d.ts +184 -0
  428. package/types/rock-shader/rockTangentIntegrity.d.ts +51 -0
  429. package/types/rock-shader/rockTextureIntegrity.d.ts +61 -0
  430. package/types/rockgen/export/glbExport.d.ts +58 -0
  431. package/types/rockgen/heightfield/heightfieldErosion.d.ts +10 -0
  432. package/types/rockgen/heightfield/heightfieldPatch.d.ts +15 -0
  433. package/types/rockgen/heightfield/stylizedErosionSim.d.ts +41 -0
  434. package/types/rockgen/index.d.ts +12 -0
  435. package/types/rockgen/lod/index.d.ts +6 -0
  436. package/types/rockgen/lod/rockLodMetrics.d.ts +62 -0
  437. package/types/rockgen/lod/rockLodPlanner.d.ts +86 -0
  438. package/types/rockgen/lod/rockLodPolicy.d.ts +76 -0
  439. package/types/rockgen/lod/rockLodRuntime.d.ts +95 -0
  440. package/types/rockgen/lod/rockLodSimplifier.d.ts +15 -0
  441. package/types/rockgen/lod/rockLodValidation.d.ts +16 -0
  442. package/types/rockgen/mesh/meshAttributes.d.ts +32 -0
  443. package/types/rockgen/mesh/meshDocument.d.ts +40 -0
  444. package/types/rockgen/mesh/surfaceNets.d.ts +42 -0
  445. package/types/rockgen/noise/cellularNoise3.d.ts +24 -0
  446. package/types/rockgen/noise/prng.d.ts +16 -0
  447. package/types/rockgen/noise/simplexNoise3.d.ts +2 -0
  448. package/types/rockgen/noise/valueNoise3.d.ts +12 -0
  449. package/types/rockgen/rockDocument.d.ts +243 -0
  450. package/types/rockgen/rockHelpers.d.ts +2 -0
  451. package/types/rockgen/rockgenPresets.d.ts +10 -0
  452. package/types/rockgen/rockgenSettings.d.ts +531 -0
  453. package/types/rockgen/sdf/fieldCompiler.d.ts +20 -0
  454. package/types/rockgen/sdf/sculptEdits.d.ts +30 -0
  455. package/types/rockgen/sdf/sdfModifiers.d.ts +19 -0
  456. package/types/rockgen/sdf/sdfOps.d.ts +8 -0
  457. package/types/rockgen/sdf/sdfPrimitives.d.ts +22 -0
  458. package/types/rockgen/surface/c7GeologySurface.d.ts +8 -0
  459. package/types/runtime/index.d.ts +3 -0
  460. package/types/runtime/sceneCollisionRuntime.d.ts +94 -0
  461. package/types/runtime/sceneSurfaceRuntime.d.ts +90 -0
  462. package/types/runtime/sceneUpdateScheduler.d.ts +28 -0
  463. package/types/shaders-tsl/anime.d.ts +9 -0
  464. package/types/shaders-tsl/chunks/character-color.d.ts +6 -0
  465. package/types/shaders-tsl/chunks/character-highlights.d.ts +12 -0
  466. package/types/shaders-tsl/chunks/character-lighting.d.ts +20 -0
  467. package/types/shaders-tsl/chunks/character-material-maps.d.ts +18 -0
  468. package/types/shaders-tsl/chunks/character-roles.d.ts +21 -0
  469. package/types/shaders-tsl/chunks/character-scene-lights.d.ts +48 -0
  470. package/types/shaders-tsl/chunks/character-shadow-color.d.ts +5 -0
  471. package/types/shaders-tsl/chunks/character-skinning.d.ts +23 -0
  472. package/types/shaders-tsl/chunks/environment-color.d.ts +9 -0
  473. package/types/shaders-tsl/chunks/environment-debug.d.ts +24 -0
  474. package/types/shaders-tsl/chunks/environment-ground-field.d.ts +40 -0
  475. package/types/shaders-tsl/chunks/environment-lighting.d.ts +22 -0
  476. package/types/shaders-tsl/chunks/environment-state.d.ts +42 -0
  477. package/types/shaders-tsl/chunks/environment-sun-shadow.d.ts +19 -0
  478. package/types/shaders-tsl/chunks/foliage-fog.d.ts +21 -0
  479. package/types/shaders-tsl/chunks/normalized-hue.d.ts +1 -0
  480. package/types/shaders-tsl/chunks/pass-depth-color.d.ts +20 -0
  481. package/types/shaders-tsl/chunks/projected-water-caustics.d.ts +24 -0
  482. package/types/shaders-tsl/chunks/scene-depth-color-pass.d.ts +39 -0
  483. package/types/shaders-tsl/chunks/stylized-cloud-shadow.d.ts +9 -0
  484. package/types/shaders-tsl/chunks/vegetation-style.d.ts +60 -0
  485. package/types/shaders-tsl/chunks/water-color.d.ts +15 -0
  486. package/types/shaders-tsl/chunks/water-common.d.ts +9 -0
  487. package/types/shaders-tsl/chunks/water-foam.d.ts +8 -0
  488. package/types/shaders-tsl/chunks/water-lighting.d.ts +9 -0
  489. package/types/shaders-tsl/chunks/water-ripple.d.ts +8 -0
  490. package/types/shaders-tsl/chunks/water-shore-state.d.ts +7 -0
  491. package/types/shaders-tsl/chunks/water-waves.d.ts +18 -0
  492. package/types/shaders-tsl/chunks/world-noise.d.ts +4 -0
  493. package/types/shaders-tsl/environment-ao-overlay.d.ts +5 -0
  494. package/types/shaders-tsl/environment.d.ts +34 -0
  495. package/types/shaders-tsl/flower.d.ts +6 -0
  496. package/types/shaders-tsl/grass.d.ts +4 -0
  497. package/types/shaders-tsl/post-composite.d.ts +25 -0
  498. package/types/shaders-tsl/sky.d.ts +4 -0
  499. package/types/shaders-tsl/tree-leaf.d.ts +2 -0
  500. package/types/shaders-tsl/water-breaker.d.ts +15 -0
  501. package/types/shaders-tsl/water-kelp.d.ts +5 -0
  502. package/types/shaders-tsl/water-rain.d.ts +10 -0
  503. package/types/shaders-tsl/water-shore-state-simulation.d.ts +12 -0
  504. package/types/shaders-tsl/water-simulation.d.ts +5 -0
  505. package/types/shaders-tsl/water-splash.d.ts +12 -0
  506. package/types/shaders-tsl/water.d.ts +22 -0
  507. package/types/shaders-tsl/woody-surface.d.ts +3 -0
  508. package/types/sky/atmosphereDome.d.ts +2 -0
  509. package/types/sky/atmosphereParams.d.ts +185 -0
  510. package/types/sky/atmosphereScattering.d.ts +11 -0
  511. package/types/sky/atmosphereSky.d.ts +2 -0
  512. package/types/sky/cloudShadow.d.ts +69 -0
  513. package/types/sky/godRays.d.ts +5 -0
  514. package/types/sky/index.d.ts +18 -0
  515. package/types/sky/nightSky.d.ts +22 -0
  516. package/types/sky/renderLayers.d.ts +59 -0
  517. package/types/sky/sceneOverrideLayers.d.ts +10 -0
  518. package/types/sky/skyColor.d.ts +704 -0
  519. package/types/sky/skyDayCycle.d.ts +86 -0
  520. package/types/sky/skyParams.d.ts +3407 -0
  521. package/types/sky/skyPresets.d.ts +160 -0
  522. package/types/sky/skyQuality.d.ts +21 -0
  523. package/types/sky/skyQualityTiers.d.ts +223 -0
  524. package/types/sky/skyShaderSettings.d.ts +152 -0
  525. package/types/sky/skyStyleSnapshots.d.ts +11 -0
  526. package/types/sky/skySystem.d.ts +3 -0
  527. package/types/sky/skyTimeKeyframes.d.ts +230 -0
  528. package/types/sky/stylizedSky.d.ts +341 -0
  529. package/types/sky/sunDriver.d.ts +15 -0
  530. package/types/sky/timeOfDay.d.ts +145 -0
  531. package/types/styles/animeGameProfile.d.ts +27 -0
  532. package/types/styles/index.d.ts +18 -0
  533. package/types/styles/manufacturedStyleLabeling.d.ts +119 -0
  534. package/types/styles/neutralStylePresets.d.ts +944 -0
  535. package/types/styles/sceneLayerDocuments.d.ts +145 -0
  536. package/types/styles/sceneLookComposition.d.ts +53 -0
  537. package/types/styles/sceneQualityApplication.d.ts +34 -0
  538. package/types/styles/sceneQualityProfiles.d.ts +13 -0
  539. package/types/styles/sceneStyleAudit.d.ts +80 -0
  540. package/types/styles/sceneStyleRuntime.d.ts +1802 -0
  541. package/types/styles/styleAdapters.d.ts +14 -0
  542. package/types/styles/styleApplication.d.ts +47 -0
  543. package/types/styles/styleBundle.d.ts +19 -0
  544. package/types/styles/styleBundleProvider.d.ts +44 -0
  545. package/types/styles/styleDomains.d.ts +18 -0
  546. package/types/styles/styleInspector.d.ts +59 -0
  547. package/types/styles/styleMaterialContract.d.ts +46 -0
  548. package/types/styles/styleMetadata.d.ts +11 -0
  549. package/types/styles/styleTargetDiscovery.d.ts +48 -0
  550. package/types/styles/styleTargetLabels.d.ts +32 -0
  551. package/types/styles/styleTargetMaterialCoverage.d.ts +20 -0
  552. package/types/styles/styleTransaction.d.ts +10 -0
  553. package/types/styles/styleTypes.d.ts +66 -0
  554. package/types/texgen/evaluateTexture.d.ts +40 -0
  555. package/types/texgen/index.d.ts +7 -0
  556. package/types/texgen/noise2.d.ts +46 -0
  557. package/types/texgen/textureAi.d.ts +6 -0
  558. package/types/texgen/textureGenerators.d.ts +261 -0
  559. package/types/texgen/texturePresets.d.ts +45 -0
  560. package/types/texgen/textureSettings.d.ts +121 -0
  561. package/types/texgen/textureThree.d.ts +13 -0
  562. package/types/toon/characterRenderPasses.d.ts +3 -0
  563. package/types/toon/index.d.ts +3 -0
  564. package/types/toon/settings/alphaSettings.d.ts +125 -0
  565. package/types/toon/settings/averageShadowSettings.d.ts +39 -0
  566. package/types/toon/settings/baseTextureSettings.d.ts +39 -0
  567. package/types/toon/settings/celShadeSettings.d.ts +37 -0
  568. package/types/toon/settings/contactShadowSettings.d.ts +30 -0
  569. package/types/toon/settings/eyeHighlightSettings.d.ts +55 -0
  570. package/types/toon/settings/faceLightingSettings.d.ts +32 -0
  571. package/types/toon/settings/furSettings.d.ts +23 -0
  572. package/types/toon/settings/glitterSettings.d.ts +43 -0
  573. package/types/toon/settings/hairHighlightSettings.d.ts +89 -0
  574. package/types/toon/settings/indirectLightSettings.d.ts +43 -0
  575. package/types/toon/settings/localLightSettings.d.ts +46 -0
  576. package/types/toon/settings/materialMapSettings.d.ts +86 -0
  577. package/types/toon/settings/outlineSettings.d.ts +125 -0
  578. package/types/toon/settings/perspectiveRemovalSettings.d.ts +14 -0
  579. package/types/toon/settings/rimLightSettings.d.ts +79 -0
  580. package/types/toon/settings/sceneShadowSettings.d.ts +32 -0
  581. package/types/toon/settings/selfShadowSettings.d.ts +44 -0
  582. package/types/toon/settings/shadowColorSettings.d.ts +77 -0
  583. package/types/toon/settings/skinToneSettings.d.ts +30 -0
  584. package/types/toon/settings/specularSettings.d.ts +96 -0
  585. package/types/toon/settings/stickerSettings.d.ts +40 -0
  586. package/types/toon/toonMaterialAdapter.d.ts +883 -0
  587. package/types/toon/toonSettings.d.ts +1182 -0
  588. package/types/vegetation/branchTree.d.ts +14 -0
  589. package/types/vegetation/callMeSenseiGrass.d.ts +8 -0
  590. package/types/vegetation/compiledTree.d.ts +75 -0
  591. package/types/vegetation/contactShadowField.d.ts +26 -0
  592. package/types/vegetation/flowerSpecies.d.ts +107 -0
  593. package/types/vegetation/grass.d.ts +4 -0
  594. package/types/vegetation/grassClump.d.ts +7 -0
  595. package/types/vegetation/grassPalettes.d.ts +29 -0
  596. package/types/vegetation/importedVegetationMaterial.d.ts +13 -0
  597. package/types/vegetation/index.d.ts +225 -0
  598. package/types/vegetation/legacyTreePresets.d.ts +22 -0
  599. package/types/vegetation/scatter.d.ts +13 -0
  600. package/types/vegetation/stylizedBush.d.ts +2 -0
  601. package/types/vegetation/stylizedFlower.d.ts +2 -0
  602. package/types/vegetation/stylizedFlowers.d.ts +8 -0
  603. package/types/vegetation/stylizedForest.d.ts +3 -0
  604. package/types/vegetation/stylizedGrass.d.ts +21 -0
  605. package/types/vegetation/stylizedTree.d.ts +20 -0
  606. package/types/vegetation/stylizedTreeFoliage.d.ts +19 -0
  607. package/types/vegetation/stylizedUnderstory.d.ts +50 -0
  608. package/types/vegetation/treeExport.d.ts +6 -0
  609. package/types/vegetation/treeSurfaceTextures.d.ts +72 -0
  610. package/types/vegetation/vegetationShaders.d.ts +74 -0
  611. package/types/version.d.ts +1 -0
  612. package/types/water/index.d.ts +1 -0
  613. package/types/water/sceneOverrideLayers.d.ts +16 -0
  614. package/types/water/water.d.ts +17 -0
  615. package/types/water/waterBreakerSystem.d.ts +46 -0
  616. package/types/water/waterCurrentField.d.ts +115 -0
  617. package/types/water/waterInteraction.d.ts +21 -0
  618. package/types/water/waterMaterial.d.ts +60 -0
  619. package/types/water/waterNearshorePhase.d.ts +5 -0
  620. package/types/water/waterRain.d.ts +17 -0
  621. package/types/water/waterRippleSimulation.d.ts +52 -0
  622. package/types/water/waterScenePasses.d.ts +70 -0
  623. package/types/water/waterSettings.d.ts +648 -0
  624. package/types/water/waterShoreMaterial.d.ts +3 -0
  625. package/types/water/waterShoreStateField.d.ts +2 -0
  626. package/types/water/waterSplashSystem.d.ts +2 -0
  627. package/types/water/waterStageSettings.d.ts +9 -0
  628. package/types/water/waterSurface.d.ts +2 -0
  629. package/types/water/waterUnderwaterAtmosphere.d.ts +103 -0
  630. package/types/water/waterVegetation.d.ts +16 -0
  631. package/types/worldCollision.d.ts +22 -0
  632. package/AGENTS.md +0 -254
  633. package/ATTRIBUTION.md +0 -78
  634. package/docs/characters.md +0 -144
  635. package/docs/debug-panel.md +0 -126
  636. package/docs/docs.css +0 -589
  637. package/docs/environment.md +0 -186
  638. package/docs/getting-started.md +0 -180
  639. package/docs/index.html +0 -14
  640. package/docs/lab-architecture.md +0 -100
  641. package/docs/lighting.md +0 -825
  642. package/docs/main.jsx +0 -752
  643. package/docs/mcp.md +0 -97
  644. package/docs/post-processing.md +0 -98
  645. package/docs/settings-reference.md +0 -1878
  646. package/docs/shader-constants.md +0 -77
  647. package/docs/sky.md +0 -182
  648. package/docs/style-labs.md +0 -309
  649. package/docs/texture-lab.md +0 -135
  650. package/docs/toon-shading.md +0 -183
  651. package/docs/tsl-conventions.md +0 -167
  652. package/docs/vegetation-sky.md +0 -275
  653. package/docs/water.md +0 -430
  654. package/docs/weather.md +0 -200
  655. package/docs/world-scale.md +0 -111
  656. package/mcp/style-lab-tools.mjs +0 -371
  657. package/src/ambientfx/INTEGRATION.md +0 -164
  658. package/src/ambientfx/ambientFxPresets.js +0 -83
  659. package/src/ambientfx/ambientFxSettings.js +0 -368
  660. package/src/ambientfx/emitters.js +0 -169
  661. package/src/ambientfx/index.js +0 -5
  662. package/src/ambientfx/particleBackbone.js +0 -493
  663. package/src/ambientfx/stylizedAmbientFx.js +0 -450
  664. package/src/biome/biomeGenerator.js +0 -385
  665. package/src/biome/biomeRuntime.js +0 -299
  666. package/src/biome/index.js +0 -2
  667. package/src/buildinggen/buildingAsset.js +0 -44
  668. package/src/buildinggen/buildingGrammar.js +0 -311
  669. package/src/buildinggen/buildingMesh.js +0 -451
  670. package/src/buildinggen/buildingPresets.js +0 -46
  671. package/src/buildinggen/buildingRecipe.js +0 -100
  672. package/src/buildinggen/buildingSettings.js +0 -238
  673. package/src/buildinggen/index.js +0 -6
  674. package/src/camera/cameraDirector.js +0 -157
  675. package/src/camera/cameraGenerator.js +0 -367
  676. package/src/camera/cameraRig.js +0 -570
  677. package/src/camera/cameraSettings.js +0 -236
  678. package/src/camera/index.js +0 -7
  679. package/src/catalog/builtinEntries.js +0 -245
  680. package/src/catalog/catalog.js +0 -210
  681. package/src/catalog/index.js +0 -3
  682. package/src/core/shaderBackend.js +0 -24
  683. package/src/debrisgen/debrisFields.js +0 -544
  684. package/src/debrisgen/debrisGenerator.js +0 -1929
  685. package/src/debrisgen/debrisPalettes.js +0 -71
  686. package/src/debrisgen/debrisPhysics.js +0 -198
  687. package/src/debrisgen/debrisPresets.js +0 -162
  688. package/src/debrisgen/debrisSettings.js +0 -333
  689. package/src/debrisgen/debrisTextures.js +0 -380
  690. package/src/debrisgen/index.js +0 -5
  691. package/src/debug/fieldValues.js +0 -95
  692. package/src/debug/index.js +0 -7
  693. package/src/debug/settingsPanel.js +0 -170
  694. package/src/fauna/INTEGRATION.md +0 -174
  695. package/src/fauna/boids.js +0 -861
  696. package/src/fauna/faunaBodies.js +0 -492
  697. package/src/fauna/faunaPresets.js +0 -52
  698. package/src/fauna/faunaSettings.js +0 -525
  699. package/src/fauna/index.js +0 -5
  700. package/src/fauna/stylizedFauna.js +0 -395
  701. package/src/game-feel/gameFeelGenerator.js +0 -402
  702. package/src/game-feel/gameFeelRuntime.js +0 -549
  703. package/src/game-feel/index.js +0 -2
  704. package/src/motion/index.js +0 -5
  705. package/src/motion/motionClip.js +0 -441
  706. package/src/motion/motionController.js +0 -628
  707. package/src/motion/motionDocuments.js +0 -225
  708. package/src/motion/motionGraph.js +0 -307
  709. package/src/motion/motionSettings.js +0 -222
  710. package/src/pathgen/index.js +0 -7
  711. package/src/pathgen/pathBridge.js +0 -232
  712. package/src/pathgen/pathPresets.js +0 -35
  713. package/src/pathgen/pathRibbon.js +0 -410
  714. package/src/pathgen/pathRouter.js +0 -380
  715. package/src/pathgen/pathSettings.js +0 -335
  716. package/src/pathgen/pathTextures.js +0 -123
  717. package/src/pathgen/stylizedPaths.js +0 -453
  718. package/src/propgen/generatorsWave1.js +0 -379
  719. package/src/propgen/generatorsWave2.js +0 -462
  720. package/src/propgen/index.js +0 -5
  721. package/src/propgen/propAsset.js +0 -323
  722. package/src/propgen/propParts.js +0 -170
  723. package/src/propgen/propPlacement.js +0 -459
  724. package/src/propgen/propPresets.js +0 -82
  725. package/src/propgen/propSettings.js +0 -395
  726. package/src/soundscape/index.js +0 -4
  727. package/src/soundscape/soundscapeGenerator.js +0 -179
  728. package/src/soundscape/soundscapeRuntime.js +0 -806
  729. package/src/soundscape/soundscapeSettings.js +0 -292
  730. package/src/stylizedTerrain.js +0 -631
  731. package/src/stylizedWorld.js +0 -903
  732. package/src/vegetation/treeRecipe.js +0 -647
  733. package/src/vfxgen/INTEGRATION.md +0 -145
  734. package/src/vfxgen/core/burstBackbone.js +0 -380
  735. package/src/vfxgen/core/projectileCore.js +0 -92
  736. package/src/vfxgen/core/spriteShapes.js +0 -98
  737. package/src/vfxgen/core/trailRibbon.js +0 -272
  738. package/src/vfxgen/core/vfxRandom.js +0 -29
  739. package/src/vfxgen/effects/emitHelpers.js +0 -37
  740. package/src/vfxgen/effects/magicEffects.js +0 -162
  741. package/src/vfxgen/effects/movementEffects.js +0 -87
  742. package/src/vfxgen/effects/weaponEffects.js +0 -118
  743. package/src/vfxgen/index.js +0 -18
  744. package/src/vfxgen/moves/moveController.js +0 -146
  745. package/src/vfxgen/moves/moveLibrary.js +0 -335
  746. package/src/vfxgen/vfxPresets.js +0 -98
  747. package/src/vfxgen/vfxSettings.js +0 -384
  748. package/src/vfxgen/vfxSystem.js +0 -449
  749. package/src/vfxgen/weapons/stylizedWeapons.js +0 -137
  750. package/src/villagegen/index.js +0 -4
  751. package/src/villagegen/stylizedVillage.js +0 -490
  752. package/src/villagegen/villageArchetypes.js +0 -160
  753. package/src/villagegen/villageNames.js +0 -40
  754. package/src/villagegen/villageSites.js +0 -105
  755. package/src/weather/index.js +0 -6
  756. package/src/weather/weatherPrecipitation.js +0 -221
  757. package/src/weather/weatherPresets.js +0 -258
  758. package/src/weather/weatherSettings.js +0 -269
  759. package/src/weather/weatherSystem.js +0 -871
  760. package/src/worldMinimap.js +0 -214
  761. package/src/worldPresets.js +0 -125
@@ -1,145 +0,0 @@
1
- # Gameplay VFX (vfxgen) — integration notes
2
-
3
- The `src/vfxgen/` cluster is self-contained and ALREADY wired into the shared
4
- files (unlike the ambientfx handoff doc, nothing here is pending):
5
-
6
- - `src/index.js` — root re-export (`export * from './vfxgen/index.js'`)
7
- - `package.json` — `"./vfxgen"` subpath export + `verify:vfxgen` script
8
- (also folded into `verify:all`)
9
- - `vite.config.js` — `'vfxgen'` package alias + `vfxArena` build input
10
- - `scripts/generate-settings-reference.mjs` — Gameplay VFX module entry
11
- - `labs/shared/sceneHub.js` — `vfxLab` + `vfxArena` hub entries
12
- - Demo/reference app: `examples/vfx-arena/` (headless gates on
13
- `document.body.dataset`: `vfxArenaReady`, `vfxLiveGlow`, `vfxLivePuff`,
14
- `vfxDrawCalls`, `vfxSpawns`)
15
- - **Designer: VFX Lab at `/vfx-lab/`** (`labs/vfx-lab/`) — the interactive
16
- authoring surface: category rail (weapon / magic / movement / shared),
17
- schema-driven panels generated from `VFX_SETTING_FIELD_SCHEMA`, preset
18
- picker, gameplay trigger bar (hotkeys 1–5, click-to-aim fireballs, `L`
19
- loop, `R` reseed), and Export → recipe JSON / paste-ready
20
- `createVfxSystem` code. Share links carry the recipe in `?vfxRecipe=`.
21
- Headless gates: `vfxLabReady`, `uiReady`, plus the arena stats above.
22
-
23
- ## Layout (categorized)
24
-
25
- ```
26
- src/vfxgen/
27
- vfxSettings.js DEFAULT_VFX_SETTINGS + groups + field schema
28
- vfxPresets.js 'default' + 'call_me_sensei' + registerVfxPreset()
29
- vfxSystem.js createVfxSystem — event-driven runtime, pools, clock
30
- core/ rendering machinery (no gameplay knowledge)
31
- burstBackbone.js ring-buffer one-shot GPU particles, 2 draw calls
32
- (kinds: spark, ember, flash, ground ring, puff,
33
- camera-facing shockwave)
34
- trailRibbon.js swept-arc ribbon (slash trails, limb smears) —
35
- reference-style SOLID two-band surface (body +
36
- white leading edge), tail ERODES (hard dissolving
37
- cutoff, inner edge first) instead of alpha-fading,
38
- Catmull-Rom smoothed centerline (SUBDIV spline
39
- points per raw frame sample), charged-edge flash
40
- on the newest segments
41
- projectileCore.js pooled flame-core billboard
42
- spriteShapes.js TSL SDF sprite masks (zero textures)
43
- vfxRandom.js seeded PRNG trio (internal, not re-exported)
44
- effects/ PURE builders: (settings, rng, options) → records
45
- weaponEffects.js emitImpact, emitSlashSparkle
46
- magicEffects.js emitFireballEmbers, emitFireballExplosion
47
- movementEffects.js emitFootstep, emitLanding
48
- weapons/
49
- stylizedWeapons.js procedural weapons (sword, greatsword, spear,
50
- dagger, hammer): mesh + trail anchors + weight profile
51
- moves/
52
- moveLibrary.js PURE authored move data — phases + pose keys + VFX
53
- event tracks (slash, overhead, thrust, spin, plunge)
54
- moveController.js plays a move on a weapon, fires its events into vfx
55
- ```
56
-
57
- ## Weapons + moves (the batteries-included motion layer)
58
-
59
- The VFX rides real motion: a move is authored phase data (`windup → strike
60
- → recover`; the plunge is the full Dragoon decomposition `crouch → leap →
61
- apex → dive → landfall → recover`), each phase carrying its VFX beats
62
- (trail on/off, impact, landing, dust). Weapon `weight` scales timing and
63
- hit power — the same `overhead` reads as a dagger flick or a hammer commit.
64
-
65
- ```js
66
- import {
67
- createMoveController, createStylizedWeapon, createVfxSystem,
68
- } from '@call-me-sensei/toonlab/vfxgen';
69
-
70
- const weapon = createStylizedWeapon({ type: 'greatsword' });
71
- characterHand.add(weapon.root); // or an actor anchor group
72
- const attack = createMoveController({ weapon, vfx, groundY: 0 });
73
- attack.play('overhead'); // on the attack input
74
- attack.update(delta); // per frame, before vfx.update
75
- ```
76
-
77
- Own animations stay first-class: skip the controller and drive
78
- `vfx.spawn('slash', { follow: bone, base, tip })` from your clips — the
79
- move library is default motion, not a requirement. External weapon meshes
80
- slot in by providing the same `{ root, anchors, profile }` shape.
81
-
82
- Categories: **weapon** (`slash`, `impact`) · **magic** (`fireball`) ·
83
- **movement** (`footstep`, `landing`). `VFX_CATEGORIES` in vfxSettings.js is
84
- the canonical map; new effects should join a category (or add one) and keep
85
- their emission logic as a pure builder in `effects/`.
86
-
87
- ## Host usage (standalone — works in any Three.js scene)
88
-
89
- ```js
90
- import { createVfxSystem } from '@call-me-sensei/toonlab/vfxgen';
91
-
92
- const vfx = createVfxSystem({
93
- seed: 42,
94
- preset: 'call_me_sensei',
95
- heightAt: world?.collision?.groundHeight ?? terrain?.heightAt, // fireball ground hits
96
- });
97
- scene.add(vfx.root);
98
-
99
- // per frame, before render:
100
- vfx.update(delta, camera);
101
-
102
- // gameplay events:
103
- const trail = vfx.spawn('slash', { follow: weaponBone, base: [0, 0.5, 0], tip: [0, 1.3, 0] });
104
- trail.stop(); // when the swing anim ends
105
- vfx.spawn('impact', { at, normal, power: 1 });
106
- const bolt = vfx.spawn('fireball', { from, velocity, onHit });
107
- vfx.spawn('footstep', { at, dir: velocityXZ });
108
- vfx.spawn('landing', { at, power: fallSpeed / 6 });
109
-
110
- // world look integration:
111
- vfx.setDistanceFog({ color, density, falloff, floorY }); // same params as forest/water
112
- vfx.setTimeScale(0); // hit-stop
113
- ```
114
-
115
- Budgets: all one-shot bursts render in **two draw calls** (glow + puff ring
116
- buffers, `shared.maxParticles` instances total); each live slash ribbon and
117
- fireball core adds one small draw, bounded by `shared.maxTrails` /
118
- `shared.maxProjectiles`. Everything is `userData.waterExclude` — transient
119
- flashes are not worth re-rendering the water passes.
120
-
121
- ## Deferred follow-ups (deliberate)
122
-
123
- - **`createStylizedWorld({ vfx })` wiring** — mirror the ambientfx option:
124
- construct the system with the world's `heightAt` + follow target, call
125
- `vfx.setDistanceFog` from the world's height-fog params, tick it inside
126
- `world.update`. Waiting until a real consumer (mini-game / runtime spine)
127
- exists so the option surface is shaped by actual use.
128
- - **Limb smears** — `createTrailRibbon` already supports any Object3D +
129
- anchor pair; a character-side helper that arms ribbons from bone names
130
- belongs in `src/character/` when procedural animation lands.
131
- - **Catalog entries** — effects are runtime events, not spawnable assets;
132
- if the catalog ever grows an "effects" shelf, register preset spawns, not
133
- meshes.
134
-
135
- ## Verification
136
-
137
- - `npm run verify:vfxgen` — node-only: determinism (same seed + same spawn
138
- script → bit-identical buffers), ring-buffer budgets, lifecycle (expiry,
139
- ribbon pooling, ground detonation + onHit), look overrides, hit-stop, and
140
- the pure builders' geometry contracts.
141
- - Visual: drive `examples/vfx-arena/?hud=0` headlessly (Playwright,
142
- `--enable-unsafe-webgpu --enable-gpu`), wait for
143
- `dataset.vfxArenaReady === 'true'`, screenshot several beats, and LOOK at
144
- them (slash = crescent arc, impact = star + spark streaks, fireball =
145
- two-band flame + ember trail, detonation = ring + smoke column).
@@ -1,380 +0,0 @@
1
- // The ONE shared GPU system behind every one-shot burst in the VFX cluster
2
- // (sparks, embers, hit flashes, ground rings, dust puffs). Same architecture
3
- // as the ambientfx particle backbone: an InstancedBufferGeometry over a unit
4
- // quad and ALL motion computed in the TSL vertex shader as a pure function of
5
- // (uTime − birth) — after the spawn-time attribute write, a burst costs zero
6
- // CPU per frame, on WebGPU and the WebGL2 fallback alike.
7
- //
8
- // Where ambientfx re-emits a follow window, this is a RING BUFFER: spawns
9
- // write records at a cursor and expired instances collapse to degenerate
10
- // quads in the vertex shader (zero fragments) until overwritten. Draw calls:
11
- // every effect shares TWO meshes, grouped by blend state —
12
- // glow — sparks + embers + flashes + rings (additive, no depth write)
13
- // puff — dust/smoke puffs (alpha blend, no depth write)
14
- // Within a group the per-instance `kind` attribute selects the motion
15
- // program (ballistic / buoyant-wander / flash-pop / ground-ring / puff), so
16
- // adding an effect never adds a draw.
17
-
18
- import * as THREE from 'three';
19
- import { NodeMaterial } from 'three/webgpu';
20
- import {
21
- attribute, cameraPosition, cameraProjectionMatrix, cameraViewMatrix, clamp, cos, Discard,
22
- distance, exp, float, Fn, max, mix, normalize, positionLocal, pow, sin, smoothstep, step,
23
- uniform, uv, varying, vec2, vec3, vec4,
24
- } from 'three/tsl';
25
-
26
- import { emberDot, puffBlob, ringBand, softDot, starburst } from './spriteShapes.js';
27
-
28
- /** Backbone kind ids — the per-instance `iData.w` attribute. `ring` lies
29
- * flat on the ground (scorch); `shockwave` is the same expanding band but
30
- * camera-facing (the action-RPG hit circle). */
31
- export const BURST_KIND = Object.freeze({
32
- spark: 0, ember: 1, flash: 2, ring: 3, puff: 4, shockwave: 5,
33
- });
34
-
35
- /** Which blend-group mesh each kind renders in. */
36
- export const GROUP_FOR_BURST_KIND = Object.freeze({
37
- spark: 'glow', ember: 'glow', flash: 'glow', ring: 'glow', puff: 'puff', shockwave: 'glow',
38
- });
39
-
40
- // --- geometry ----------------------------------------------------------------
41
-
42
- const FLOATS_PER_INSTANCE = { iSpawn: 3, iVel: 3, iData: 4, iColor: 3, iAux: 4 };
43
-
44
- function createGroupGeometry(capacity) {
45
- const quad = new THREE.PlaneGeometry(1, 1);
46
- const geometry = new THREE.InstancedBufferGeometry();
47
- geometry.index = quad.index;
48
- geometry.setAttribute('position', quad.attributes.position);
49
- geometry.setAttribute('uv', quad.attributes.uv);
50
- for (const [name, itemSize] of Object.entries(FLOATS_PER_INSTANCE)) {
51
- geometry.setAttribute(name, new THREE.InstancedBufferAttribute(
52
- new Float32Array(Math.max(capacity, 1) * itemSize), itemSize));
53
- }
54
- geometry.instanceCount = 0;
55
- // Bursts happen anywhere in the world; never let culling clip a hit flash.
56
- geometry.boundingSphere = new THREE.Sphere(new THREE.Vector3(), 1e5);
57
- return geometry;
58
- }
59
-
60
- /**
61
- * Creates the two blend-group meshes plus their shared uniforms.
62
- *
63
- * Each group exposes `emit(records)` where a record is
64
- * `{ x, y, z, vx, vy, vz, seed, birth, lifetime, kind, r, g, b,
65
- * size0, size1, gravity, extra }` — the effects/ builders produce exactly
66
- * this shape. `extra` is kind-specific: spark → streak stretch, ember →
67
- * wander radius, flash → star spikes, ring → band thickness, puff → spin.
68
- */
69
- export function createBurstBackbone(settings) {
70
- const capacity = Math.max(settings?.shared?.maxParticles ?? 4096, 64);
71
- // Glow kinds outnumber puffs in practice (sparks + embers per burst vs a
72
- // handful of dust quads); split the budget accordingly.
73
- const glowCapacity = Math.ceil(capacity * 0.75);
74
- const puffCapacity = Math.max(capacity - glowCapacity, 32);
75
-
76
- const u = {
77
- uCamRight: uniform(new THREE.Vector3(1, 0, 0)),
78
- uCamUp: uniform(new THREE.Vector3(0, 1, 0)),
79
- uFogColor: uniform(new THREE.Color(0.66, 0.8, 0.94)),
80
- uFogDensity: uniform(0),
81
- uFogFalloff: uniform(400),
82
- uFogFloorY: uniform(0),
83
- uTime: uniform(0),
84
- };
85
-
86
- // Mirror of the environment shader's world-height fog (same formula as the
87
- // ambientfx backbone) so bursts haze out with the terrain. Density 0 = off.
88
- const heightFogFactor = (worldPos) => {
89
- const heightFalloff = exp(
90
- max(worldPos.y.sub(u.uFogFloorY), 0.0).div(max(u.uFogFalloff, 0.001)).negate());
91
- const depthTerm = exp(distance(worldPos, cameraPosition).mul(u.uFogDensity).negate()).oneMinus();
92
- return clamp(depthTerm.mul(heightFalloff), 0.0, 1.0);
93
- };
94
-
95
- // Shared per-instance lifecycle: progress 0..1 over the lifetime, and an
96
- // alive gate that multiplies into quad SIZE — a degenerate quad rasterizes
97
- // nothing, so expired ring-buffer slots cost zero fragments.
98
- const lifecycle = () => {
99
- const iData = attribute('iData', 'vec4');
100
- const age = u.uTime.sub(iData.y).toVar();
101
- const lifetime = max(iData.z, 1e-3);
102
- const progress = clamp(age.div(lifetime), 0.0, 1.0).toVar();
103
- // −5 ms tolerance: float32 rounding of birth vs the clock must never
104
- // hide a burst on its own spawn frame (hit flashes land THIS frame).
105
- const alive = step(-0.005, age)
106
- .mul(step(age.div(lifetime), 0.9995).toVar())
107
- .mul(step(1e-3, iData.z));
108
- return { age, alive, progress, seed: iData.x, kind: iData.w };
109
- };
110
-
111
- const buildMaterial = (name, build) => {
112
- const material = new NodeMaterial();
113
- material.name = name;
114
- build(material);
115
- material.uniforms = u; // GLSL-style named access, matching the grass idiom
116
- return material;
117
- };
118
-
119
- // ---- glow group: spark (ballistic) + ember (buoyant wander) + flash
120
- // (scale pop) + ring (ground expand) — additive, emissive by design -------
121
- const glowMaterial = buildMaterial('VfxBurstGlow', (material) => {
122
- material.transparent = true;
123
- material.blending = THREE.AdditiveBlending;
124
- material.depthWrite = false;
125
- material.fog = false; // both fog layers only DIM the glow (see ambientfx)
126
-
127
- const vUv = uv();
128
- const vColor = varying(vec3(), 'vVfxColor');
129
- const vSeed = varying(float(), 'vVfxSeed');
130
- const vKind = varying(float(), 'vVfxKind');
131
- const vProgress = varying(float(), 'vVfxProgress');
132
- const vExtra = varying(float(), 'vVfxExtra');
133
- const vWorldPos = varying(vec3(), 'vVfxWorldPos');
134
-
135
- material.vertexNode = Fn(() => {
136
- const iSpawn = attribute('iSpawn', 'vec3');
137
- const iVel = attribute('iVel', 'vec3');
138
- const iAux = attribute('iAux', 'vec4');
139
- const { age, alive, progress, seed, kind } = lifecycle();
140
- vSeed.assign(seed);
141
- vKind.assign(kind);
142
- vProgress.assign(progress);
143
- vExtra.assign(iAux.w);
144
- vColor.assign(attribute('iColor', 'vec3'));
145
-
146
- const isEmber = step(0.5, kind).mul(step(kind, 1.5));
147
- const isFlash = step(1.5, kind).mul(step(kind, 2.5));
148
- const isRing = step(2.5, kind).mul(step(kind, 3.5)); // ground scorch only
149
- const isShock = step(4.5, kind); // camera-facing hit circle
150
- const isRingLike = max(isRing, isShock);
151
- const isBallistic = step(kind, 1.5); // spark or ember
152
-
153
- // Ballistic center: p = p0 + v·t − ½g·t²ŷ. Ember "gravity" is negative
154
- // (buoyant), so the same program rises; its wander adds a curl-ish
155
- // drift that grows over life (extra = wander radius).
156
- const wander = vec3(
157
- sin(age.mul(3.1).add(seed.mul(41.0))),
158
- 0.0,
159
- cos(age.mul(2.6).add(seed.mul(23.0))),
160
- ).mul(iAux.w).mul(progress).mul(isEmber);
161
- const center = iSpawn
162
- .add(iVel.mul(age).mul(isBallistic))
163
- .sub(vec3(0.0, 1.0, 0.0).mul(iAux.z).mul(age).mul(age).mul(0.5).mul(isBallistic))
164
- .add(wander)
165
- .toVar();
166
-
167
- // Size envelope per kind. Flash pops out fast and dies before the end
168
- // of its lifetime; the ring eases outward (shockwave decelerating).
169
- const easeOut = progress.oneMinus().pow(3.0).oneMinus();
170
- const sizeBallistic = mix(iAux.x, iAux.y, progress);
171
- const sizeFlash = iAux.x
172
- .mul(smoothstep(0.0, 0.22, progress).mul(0.65).add(0.35))
173
- .mul(smoothstep(1.0, 0.55, progress));
174
- const sizeRing = mix(iAux.x, iAux.y, easeOut);
175
- const scale = mix(mix(sizeBallistic, sizeFlash, isFlash), sizeRing, isRingLike)
176
- .mul(alive)
177
- .toVar();
178
-
179
- // Sparks stretch into streaks along their CURRENT velocity projected
180
- // into the camera plane — rotation built from the normalized 2D vector,
181
- // no atan needed. Everything else keeps the plain billboard basis.
182
- const velNow = iVel.sub(vec3(0.0, iAux.z.mul(age), 0.0));
183
- const projected = vec2(velNow.dot(u.uCamRight), velNow.dot(u.uCamUp)).add(vec2(1e-4, 0.0));
184
- const isSpark = step(kind, 0.5);
185
- const dir = mix(vec2(1.0, 0.0), normalize(projected), isSpark).toVar();
186
- const stretch = mix(1.0, max(iAux.w, 1.0), isSpark);
187
- const local = vec2(positionLocal.x.mul(stretch), positionLocal.y).toVar();
188
- const rotated = vec2(
189
- local.x.mul(dir.x).sub(local.y.mul(dir.y)),
190
- local.x.mul(dir.y).add(local.y.mul(dir.x)),
191
- );
192
- const billboardOffset = u.uCamRight.mul(rotated.x).add(u.uCamUp.mul(rotated.y));
193
- // Scorch rings lie flat on the ground (quad local XY → world XZ);
194
- // shockwaves keep the camera-facing billboard basis.
195
- const flatOffset = vec3(positionLocal.x, 0.0, positionLocal.y.negate());
196
- const offset = mix(billboardOffset, flatOffset, isRing).mul(scale);
197
-
198
- const worldPosition = vec4(center.add(offset), 1.0);
199
- vWorldPos.assign(worldPosition.xyz);
200
- return cameraProjectionMatrix.mul(cameraViewMatrix).mul(worldPosition);
201
- })();
202
-
203
- material.fragmentNode = Fn(() => {
204
- const p = vUv.mul(2.0).sub(1.0).toVar();
205
- const isEmber = step(0.5, vKind).mul(step(vKind, 1.5));
206
- const isFlash = step(1.5, vKind).mul(step(vKind, 2.5));
207
- const isRing = step(2.5, vKind);
208
- const isSpark = step(vKind, 0.5);
209
-
210
- // Ring band thins as it expands (vExtra = starting thickness).
211
- const thickness = max(vExtra.mul(vProgress.mul(0.6).oneMinus()), 0.02);
212
- const mask = softDot(p, 2.2).mul(isSpark)
213
- .add(emberDot(p).mul(isEmber))
214
- .add(starburst(p, vExtra, 3.0).mul(isFlash))
215
- .add(ringBand(p, 0.72, thickness).mul(isRing))
216
- .toVar();
217
-
218
- // Brightness envelopes: sparks/embers cool, the flash dies fast, the
219
- // ring fades as it runs out of energy.
220
- const fade = vProgress.oneMinus();
221
- const brightness = pow(fade, 1.5).mul(isSpark)
222
- .add(fade.mul(isEmber))
223
- .add(smoothstep(1.0, 0.45, vProgress).mul(isFlash))
224
- .add(pow(fade, 1.2).mul(isRing));
225
-
226
- const rgb = vColor.mul(mask).mul(brightness)
227
- .mul(heightFogFactor(vWorldPos).oneMinus());
228
- return vec4(rgb, mask.mul(brightness));
229
- })();
230
- });
231
-
232
- // ---- puff group: chunky toon dust/smoke — alpha blend, matter not light --
233
- const puffMaterial = buildMaterial('VfxBurstPuff', (material) => {
234
- material.transparent = true;
235
- material.depthWrite = false;
236
- material.fog = true;
237
-
238
- const vUv = uv();
239
- const vColor = varying(vec3(), 'vVfxColor');
240
- const vSeed = varying(float(), 'vVfxSeed');
241
- const vProgress = varying(float(), 'vVfxProgress');
242
- const vSpin = varying(float(), 'vVfxSpin');
243
- const vAge = varying(float(), 'vVfxAge');
244
- const vWorldPos = varying(vec3(), 'vVfxWorldPos');
245
-
246
- material.vertexNode = Fn(() => {
247
- const iSpawn = attribute('iSpawn', 'vec3');
248
- const iVel = attribute('iVel', 'vec3');
249
- const iAux = attribute('iAux', 'vec4');
250
- const { age, alive, progress, seed } = lifecycle();
251
- vSeed.assign(seed);
252
- vProgress.assign(progress);
253
- vSpin.assign(iAux.w);
254
- vAge.assign(age);
255
- vColor.assign(attribute('iColor', 'vec3'));
256
-
257
- // Decelerating launch (dust loses momentum fast) + gravity term the
258
- // emitters use as gentle rise (negative) or settle (positive).
259
- const decel = progress.mul(0.55).oneMinus();
260
- const center = iSpawn
261
- .add(iVel.mul(age).mul(decel))
262
- .sub(vec3(0.0, 1.0, 0.0).mul(iAux.z).mul(age).mul(age).mul(0.5))
263
- .toVar();
264
-
265
- // Puffs GROW as they fade — the classic smoke read.
266
- const easeOut = progress.oneMinus().pow(2.0).oneMinus();
267
- const scale = mix(iAux.x, iAux.y, easeOut).mul(alive);
268
- const position = center
269
- .add(u.uCamRight.mul(positionLocal.x).mul(scale))
270
- .add(u.uCamUp.mul(positionLocal.y).mul(scale));
271
- const worldPosition = vec4(position, 1.0);
272
- vWorldPos.assign(worldPosition.xyz);
273
- return cameraProjectionMatrix.mul(cameraViewMatrix).mul(worldPosition);
274
- })();
275
-
276
- material.fragmentNode = Fn(() => {
277
- // Slow tumble sells hand-drawn smoke; rotate the sample space, not the
278
- // quad, so the billboard basis stays camera-true.
279
- const spinAngle = vAge.mul(vSpin).add(vSeed.mul(6.2831));
280
- const c = cos(spinAngle);
281
- const s = sin(spinAngle);
282
- const p0 = vUv.mul(2.0).sub(1.0).toVar();
283
- const p = vec2(p0.x.mul(c).sub(p0.y.mul(s)), p0.x.mul(s).add(p0.y.mul(c))).toVar();
284
-
285
- const blob = puffBlob(p, vSeed, 0.2);
286
- Discard(blob.lessThan(0.0));
287
- const coverage = smoothstep(0.0, 0.14, blob);
288
-
289
- // Two-tone toon shading (lit top, shaded belly) + a stepped-ish fade so
290
- // the dissolve reads as cel steps rather than an airbrush.
291
- const shade = mix(0.8, 1.12, smoothstep(-0.7, 0.7, p0.y));
292
- const fade = vProgress.oneMinus();
293
- const alpha = coverage
294
- .mul(smoothstep(0.0, 0.12, fade))
295
- .mul(pow(fade, 0.75))
296
- .mul(0.88);
297
-
298
- const lit = vColor.mul(shade);
299
- const fogged = mix(lit, u.uFogColor, heightFogFactor(vWorldPos));
300
- return vec4(fogged, alpha);
301
- })();
302
- });
303
-
304
- const buildGroup = (id, material, groupCapacity, renderOrder) => {
305
- const mesh = new THREE.Mesh(createGroupGeometry(groupCapacity), material);
306
- mesh.name = `VfxBurst${id[0].toUpperCase()}${id.slice(1)}`;
307
- mesh.frustumCulled = false;
308
- mesh.renderOrder = renderOrder;
309
- // CPU mirror of each slot's lifecycle so stats/verify can count live
310
- // instances without reading GPU state. Float64 on purpose: float32
311
- // rounding can push a birth a hair past the clock and make a just-spawned
312
- // instance read as unborn.
313
- const birth = new Float64Array(groupCapacity);
314
- const lifetime = new Float64Array(groupCapacity);
315
- const group = {
316
- capacity: groupCapacity,
317
- cursor: 0,
318
- highWater: 0,
319
- id,
320
- mesh,
321
- /** Writes records at the ring cursor; oldest slots recycle first. */
322
- emit(records) {
323
- const spawn = mesh.geometry.attributes.iSpawn;
324
- const vel = mesh.geometry.attributes.iVel;
325
- const data = mesh.geometry.attributes.iData;
326
- const color = mesh.geometry.attributes.iColor;
327
- const aux = mesh.geometry.attributes.iAux;
328
- for (const r of records) {
329
- const i = group.cursor;
330
- spawn.array[i * 3] = r.x; spawn.array[i * 3 + 1] = r.y; spawn.array[i * 3 + 2] = r.z;
331
- vel.array[i * 3] = r.vx ?? 0; vel.array[i * 3 + 1] = r.vy ?? 0; vel.array[i * 3 + 2] = r.vz ?? 0;
332
- data.array[i * 4] = r.seed; data.array[i * 4 + 1] = r.birth;
333
- data.array[i * 4 + 2] = r.lifetime; data.array[i * 4 + 3] = r.kind;
334
- color.array[i * 3] = r.r; color.array[i * 3 + 1] = r.g; color.array[i * 3 + 2] = r.b;
335
- aux.array[i * 4] = r.size0; aux.array[i * 4 + 1] = r.size1;
336
- aux.array[i * 4 + 2] = r.gravity ?? 0; aux.array[i * 4 + 3] = r.extra ?? 0;
337
- birth[i] = r.birth;
338
- lifetime[i] = r.lifetime;
339
- group.cursor = (i + 1) % group.capacity;
340
- group.highWater = Math.min(Math.max(group.highWater, i + 1), group.capacity);
341
- }
342
- if (records.length > 0) {
343
- spawn.needsUpdate = vel.needsUpdate = data.needsUpdate = true;
344
- color.needsUpdate = aux.needsUpdate = true;
345
- mesh.geometry.instanceCount = group.highWater;
346
- }
347
- },
348
- /** Instances still inside their lifetime at clock `now`. */
349
- liveCount(now) {
350
- let live = 0;
351
- for (let i = 0; i < group.highWater; i += 1) {
352
- if (lifetime[i] > 0 && now - birth[i] >= 0 && now - birth[i] < lifetime[i]) live += 1;
353
- }
354
- return live;
355
- },
356
- clear() {
357
- lifetime.fill(0);
358
- mesh.geometry.attributes.iData.array.fill(0);
359
- mesh.geometry.attributes.iData.needsUpdate = true;
360
- group.cursor = 0;
361
- group.highWater = 0;
362
- mesh.geometry.instanceCount = 0;
363
- },
364
- dispose() {
365
- mesh.geometry.dispose();
366
- material.dispose();
367
- },
368
- };
369
- return group;
370
- };
371
-
372
- return {
373
- groups: {
374
- // Dust under the glows so sparks and flashes shine THROUGH the smoke.
375
- puff: buildGroup('puff', puffMaterial, puffCapacity, 4),
376
- glow: buildGroup('glow', glowMaterial, glowCapacity, 5),
377
- },
378
- uniforms: u,
379
- };
380
- }
@@ -1,92 +0,0 @@
1
- // The fireball's flame-core billboard: one pooled quad per projectile in
2
- // flight, shaded by an analytic two-band toon flame (no texture, no noise
3
- // fetch — angular sine licks over an SDF body, same policy as spriteShapes).
4
- // vfxSystem moves the center uniform each frame; everything else is a pure
5
- // function of the shared clock.
6
-
7
- import * as THREE from 'three';
8
- import { NodeMaterial } from 'three/webgpu';
9
- import {
10
- cameraProjectionMatrix, cameraViewMatrix, clamp, Discard, Fn, length, mix, positionLocal,
11
- sin, smoothstep, step, uniform, uv, vec2, vec4,
12
- } from 'three/tsl';
13
-
14
- import { flameLicks } from './spriteShapes.js';
15
-
16
- /**
17
- * One pooled projectile core. `sharedUniforms` is the burst backbone's set
18
- * (uTime + camera billboard basis) so the flame animates on the same clock.
19
- */
20
- export function createProjectileCore({ sharedUniforms }) {
21
- const u = sharedUniforms;
22
- const look = {
23
- uCenter: uniform(new THREE.Vector3()),
24
- uCoreColor: uniform(new THREE.Color(1.0, 0.95, 0.6)),
25
- uFlameColor: uniform(new THREE.Color(1.0, 0.45, 0.12)),
26
- uIntensity: uniform(1.2),
27
- uSeed: uniform(0),
28
- uSize: uniform(0.42),
29
- };
30
-
31
- const material = new NodeMaterial();
32
- material.name = 'VfxProjectileCore';
33
- material.transparent = true;
34
- material.blending = THREE.AdditiveBlending;
35
- material.depthWrite = false;
36
- material.fog = false;
37
-
38
- material.vertexNode = Fn(() => {
39
- // Camera-facing billboard around the CPU-fed center; quad is 1×1 so the
40
- // world size is uSize · 2 across.
41
- const position = look.uCenter
42
- .add(u.uCamRight.mul(positionLocal.x).mul(look.uSize).mul(2.0))
43
- .add(u.uCamUp.mul(positionLocal.y).mul(look.uSize).mul(2.0));
44
- return cameraProjectionMatrix.mul(cameraViewMatrix).mul(vec4(position, 1.0));
45
- })();
46
-
47
- material.fragmentNode = Fn(() => {
48
- const p = uv().mul(2.0).sub(1.0).toVar();
49
- const t = u.uTime.add(look.uSeed.mul(37.0));
50
- const body = flameLicks(p, t, look.uSeed).toVar();
51
- Discard(body.lessThan(0.01));
52
-
53
- // Two hard toon bands: hot core inside, flame skin outside, plus a
54
- // flicker so the ball feels alive even in a straight throw.
55
- const hot = smoothstep(0.7, 0.15, length(p.mul(vec2(1.0, 0.9))));
56
- const banded = mix(look.uFlameColor, look.uCoreColor, step(0.55, hot));
57
- const flicker = sin(t.mul(11.0)).mul(0.06).add(0.97);
58
- const alpha = clamp(body, 0.0, 1.0).mul(look.uIntensity).mul(flicker);
59
- return vec4(banded.mul(alpha), alpha);
60
- })();
61
- material.uniforms = look;
62
-
63
- const mesh = new THREE.Mesh(new THREE.PlaneGeometry(1, 1), material);
64
- mesh.name = 'VfxProjectileCore';
65
- mesh.frustumCulled = false;
66
- mesh.renderOrder = 7;
67
- mesh.visible = false;
68
-
69
- return {
70
- mesh,
71
- uniforms: look,
72
- /** Re-tints and shows the core for a new projectile. */
73
- arm({ coreColor, flameColor, coreSize, intensity, seed } = {}) {
74
- if (Array.isArray(coreColor)) look.uCoreColor.value.setRGB(...coreColor, THREE.SRGBColorSpace);
75
- if (Array.isArray(flameColor)) look.uFlameColor.value.setRGB(...flameColor, THREE.SRGBColorSpace);
76
- if (Number.isFinite(coreSize)) look.uSize.value = Math.max(coreSize, 0.01);
77
- if (Number.isFinite(intensity)) look.uIntensity.value = Math.max(intensity, 0);
78
- if (Number.isFinite(seed)) look.uSeed.value = seed;
79
- mesh.visible = true;
80
- },
81
- setCenter(position) {
82
- look.uCenter.value.copy(position);
83
- },
84
- reset() {
85
- mesh.visible = false;
86
- },
87
- dispose() {
88
- mesh.geometry.dispose();
89
- material.dispose();
90
- },
91
- };
92
- }