@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
@@ -0,0 +1,781 @@
1
+ import * as THREE from 'three';
2
+ import {
3
+ createToonRockMaterial,
4
+ normalizeToonLabRockProfile,
5
+ } from './rockMaterial.js';
6
+ import { applyRockGeometryDetail } from './rockGeometryDetail.js';
7
+
8
+ /**
9
+ * Weight of the concavity channel in the moss moisture term.
10
+ *
11
+ * `moisture = clamp(slope + cavity * strength)`. At 1.6 a fully concave crevice
12
+ * reaches saturation on its own, so moss grows in a vertical cleft that the
13
+ * slope term scores at zero, while an exposed convex face still depends on
14
+ * slope alone and stays bare.
15
+ */
16
+ export const ROCK_MOSS_CAVITY_STRENGTH = 1.6;
17
+ import { createRockShaderSettings } from './rockShaderSettings.js';
18
+ import { markFactoryStyleMaterial } from '../styles/styleMetadata.js';
19
+ import { withoutDegenerateDetailMaps } from './rockTextureIntegrity.js';
20
+ import { inspectRockRegionBindings } from './rockRegionRuntime.js';
21
+ import { sanitizeRockTangents } from './rockTangentIntegrity.js';
22
+
23
+ const ORIGINAL_MATERIALS = new WeakMap();
24
+ const ORIGINAL_SHADOW_FLAGS = new WeakMap();
25
+ const textureSetsByVariation = new Map();
26
+
27
+ function clamp01(value) {
28
+ return Math.min(1, Math.max(0, Number(value) || 0));
29
+ }
30
+
31
+ function seededNoise(x, y, seed) {
32
+ const value = Math.sin((x * 127.1) + (y * 311.7) + (seed * 74.7)) * 43758.5453;
33
+ return value - Math.floor(value);
34
+ }
35
+
36
+ function makeProceduralTexture({
37
+ seed,
38
+ color,
39
+ variation = 0.12,
40
+ size = 256,
41
+ colorSpace = THREE.SRGBColorSpace,
42
+ channel = 'color',
43
+ }) {
44
+ const data = new Uint8Array(size * size * 4);
45
+
46
+ for (let y = 0; y < size; y += 1) {
47
+ for (let x = 0; x < size; x += 1) {
48
+ const index = ((y * size) + x) * 4;
49
+ const broad = seededNoise(Math.floor(x / 8), Math.floor(y / 8), seed);
50
+ const fine = seededNoise(x, y, seed + 11);
51
+ const noise = ((broad * 0.65) + (fine * 0.35) - 0.5) * variation;
52
+
53
+ if (channel === 'normal') {
54
+ const nx = (seededNoise(x + 1, y, seed) - seededNoise(x - 1, y, seed)) * 0.22;
55
+ const ny = (seededNoise(x, y + 1, seed) - seededNoise(x, y - 1, seed)) * 0.22;
56
+ data[index] = Math.round((nx * 0.5 + 0.5) * 255);
57
+ data[index + 1] = Math.round((ny * 0.5 + 0.5) * 255);
58
+ data[index + 2] = 255;
59
+ } else if (channel === 'mask') {
60
+ const value = Math.round(clamp01(color[0] + noise) * 255);
61
+ data[index] = value;
62
+ data[index + 1] = value;
63
+ data[index + 2] = value;
64
+ } else {
65
+ data[index] = Math.round(clamp01(color[0] + noise) * 255);
66
+ data[index + 1] = Math.round(clamp01(color[1] + noise) * 255);
67
+ data[index + 2] = Math.round(clamp01(color[2] + noise) * 255);
68
+ }
69
+ data[index + 3] = 255;
70
+ }
71
+ }
72
+
73
+ const texture = new THREE.DataTexture(
74
+ data,
75
+ size,
76
+ size,
77
+ THREE.RGBAFormat,
78
+ THREE.UnsignedByteType,
79
+ );
80
+ texture.name = `ToonLabRockFallback_${seed}`;
81
+ texture.wrapS = THREE.RepeatWrapping;
82
+ texture.wrapT = THREE.RepeatWrapping;
83
+ texture.magFilter = THREE.LinearFilter;
84
+ texture.minFilter = THREE.LinearMipmapLinearFilter;
85
+ texture.colorSpace = colorSpace;
86
+ texture.flipY = false;
87
+ texture.generateMipmaps = true;
88
+ texture.needsUpdate = true;
89
+ texture.userData.toonLabGeneratedRockShaderTexture = true;
90
+ return texture;
91
+ }
92
+
93
+ /**
94
+ * Offsets every fallback map's seed by a variation index.
95
+ *
96
+ * Two rocks that resolve to the same fallback maps render with identical
97
+ * surface breakup. That reads as one rock duplicated — the failure §13 calls a
98
+ * "repeated prop pattern" — so a scene placing several rocks from one family
99
+ * needs a way to decorrelate them without authoring bespoke textures for each.
100
+ * Seed 0 reproduces the reviewed first-party set exactly.
101
+ */
102
+ function variationSeed(base, variation) {
103
+ return base + (variation * 101);
104
+ }
105
+
106
+ function buildRockShaderTextureSet(variation) {
107
+ return Object.freeze({
108
+ rock: makeProceduralTexture({
109
+ seed: variationSeed(3, variation),
110
+ // Measured sRGB mean of the captured first-party T_RockClassic_BC input
111
+ // (179.70, 179.92, 178.98). Keeping the deterministic fallback anchored
112
+ // to that source lets the shader produce its reviewed grey sun face and
113
+ // cool sky-probe back face even when an imported rock has no usable map.
114
+ color: [0.705, 0.706, 0.702],
115
+ // Preserve readable macro breakup while keeping the measured mean fixed;
116
+ // flattening variation to 0.06 makes untextured rocks look bare.
117
+ variation: 0.18,
118
+ }),
119
+ rockNormal: makeProceduralTexture({
120
+ seed: variationSeed(5, variation),
121
+ color: [0.5, 0.5, 1],
122
+ variation: 0,
123
+ colorSpace: THREE.NoColorSpace,
124
+ channel: 'normal',
125
+ }),
126
+ smoothness: makeProceduralTexture({
127
+ seed: variationSeed(7, variation),
128
+ color: [0.33, 0.33, 0.33],
129
+ variation: 0.12,
130
+ colorSpace: THREE.NoColorSpace,
131
+ channel: 'mask',
132
+ }),
133
+ stripe: makeProceduralTexture({
134
+ seed: variationSeed(13, variation),
135
+ color: [0.58, 0.55, 0.5],
136
+ variation: 0.2,
137
+ }),
138
+ moss: makeProceduralTexture({
139
+ seed: variationSeed(17, variation),
140
+ color: [0.3, 0.42, 0.2],
141
+ variation: 0.16,
142
+ }),
143
+ grass: makeProceduralTexture({
144
+ seed: variationSeed(19, variation),
145
+ color: [0.32, 0.48, 0.19],
146
+ variation: 0.14,
147
+ }),
148
+ snow: makeProceduralTexture({
149
+ seed: variationSeed(23, variation),
150
+ color: [0.88, 0.91, 0.94],
151
+ variation: 0.06,
152
+ }),
153
+ sand: makeProceduralTexture({
154
+ seed: variationSeed(29, variation),
155
+ color: [0.7, 0.58, 0.39],
156
+ variation: 0.1,
157
+ }),
158
+ sandNormal: makeProceduralTexture({
159
+ seed: variationSeed(31, variation),
160
+ color: [0.5, 0.5, 1],
161
+ variation: 0,
162
+ colorSpace: THREE.NoColorSpace,
163
+ channel: 'normal',
164
+ }),
165
+ topMask: makeProceduralTexture({
166
+ seed: variationSeed(37, variation),
167
+ color: [0.56, 0.56, 0.56],
168
+ variation: 0.3,
169
+ colorSpace: THREE.NoColorSpace,
170
+ channel: 'mask',
171
+ }),
172
+ });
173
+ }
174
+
175
+ /**
176
+ * Creates the neutral, deterministic fallback texture set used by the
177
+ * Call Me Sensei rock shader. Applications can replace any map with authored
178
+ * or licensed textures without changing the shader preset.
179
+ *
180
+ * `variation` decorrelates the generated maps so several rocks sharing one
181
+ * catalog family do not render with identical surface breakup. Sets are
182
+ * memoized per variation index and are deterministic: the same index always
183
+ * yields the same maps. Index 0 is the reviewed first-party set.
184
+ *
185
+ * @param {{variation?: number}} [options]
186
+ */
187
+ export function createRockShaderTextureSet({ variation = 0 } = {}) {
188
+ const index = Number.isFinite(Number(variation)) ? Math.trunc(Number(variation)) : 0;
189
+ const existing = textureSetsByVariation.get(index);
190
+ if (existing) return existing;
191
+ const set = buildRockShaderTextureSet(index);
192
+ textureSetsByVariation.set(index, set);
193
+ return set;
194
+ }
195
+
196
+ /** The reviewed first-party fallback set (`variation: 0`). */
197
+ export function createDefaultRockShaderTextureSet() {
198
+ return createRockShaderTextureSet({ variation: 0 });
199
+ }
200
+
201
+ function tintArray(value, fallback) {
202
+ const source = Array.isArray(value) ? value : fallback;
203
+ return source.slice(0, 3).map((channel) => clamp01(channel));
204
+ }
205
+
206
+ /**
207
+ * Converts the stable, editor-facing rock shader schema into the lower-level
208
+ * material profile consumed by the TSL implementation.
209
+ */
210
+ export function rockShaderSettingsToProfile(input = {}) {
211
+ const settings = createRockShaderSettings(input);
212
+ const {
213
+ projection,
214
+ material,
215
+ lighting,
216
+ shoreline,
217
+ distanceTint,
218
+ normals,
219
+ striping,
220
+ moss,
221
+ layerMask,
222
+ grassLayer,
223
+ snowLayer,
224
+ sandLayer,
225
+ } = settings;
226
+
227
+ return normalizeToonLabRockProfile({
228
+ base: {
229
+ scale: projection.scale,
230
+ projectionContrast: projection.projectionContrast,
231
+ sideOnly: projection.sideOnly,
232
+ saturation: projection.saturation,
233
+ contrast: projection.contrast,
234
+ brightness: projection.brightness,
235
+ nearDetailScale: projection.nearDetailScale,
236
+ nearDetailStrength: projection.nearDetailStrength,
237
+ nearDetailDistance: projection.nearDetailDistance,
238
+ tint: tintArray(material.tint, [1, 1, 1]),
239
+ metallic: material.metallic,
240
+ smoothness: material.smoothness,
241
+ useSmoothnessTexture: material.useSmoothnessTexture,
242
+ smoothnessContrast: material.smoothnessContrast,
243
+ emissiveStrength: material.emissiveStrength,
244
+ closeTintDistance: distanceTint.closeDistance,
245
+ farTintDistance: distanceTint.farDistance,
246
+ distantTint: tintArray(distanceTint.color, [0.6, 0.67, 0.72]),
247
+ distantTintMix: distanceTint.strength,
248
+ striping: {
249
+ enabled: striping.enabled,
250
+ scale: striping.scale,
251
+ contrast: striping.contrast,
252
+ color: tintArray(striping.color, [0.7, 0.68, 0.64]),
253
+ },
254
+ },
255
+ lighting: {
256
+ exposure: lighting.exposure,
257
+ ambientFloor: lighting.ambientFloor,
258
+ skyColorInfluence: lighting.skyColorInfluence,
259
+ skyFillStrength: lighting.skyFillStrength,
260
+ skyFillTint: tintArray(lighting.skyFillTint, [1, 1, 1]),
261
+ shadowFill: lighting.shadowFill,
262
+ shadowFillTint: tintArray(lighting.shadowFillTint, [1, 1, 1]),
263
+ },
264
+ // SPREAD, not an allow-list — the same trap the moss group was carrying.
265
+ // These two settings groups map onto identically named profile groups, so
266
+ // naming each field bought nothing and cost a silent drop for any field
267
+ // added later. See the longer note on `moss` below.
268
+ shoreline: { ...shoreline },
269
+ normals: { ...normals },
270
+ moss: {
271
+ // SPREAD, not an allow-list. This mapping used to name every field, so
272
+ // a field added to the settings schema was silently dropped here —
273
+ // between validation and the shader — with no error anywhere. Adding a
274
+ // moss capability then required edits in four separate files and failed
275
+ // invisibly if you missed one. The settings object is already
276
+ // schema-validated and clamped by `createRockShaderSettings`, so
277
+ // forwarding it wholesale is both safer and correct; the entries below
278
+ // exist only to coerce types the profile wants in a different shape.
279
+ // `scripts/verify-rock-shader.mjs` asserts schema/profile parity so this
280
+ // cannot silently regress.
281
+ ...moss,
282
+ lowColor: tintArray(moss.lowColor, [0.18, 0.28, 0.09]),
283
+ highColor: tintArray(moss.highColor, [0.42, 0.55, 0.2]),
284
+ },
285
+ // The layer groups DO get renamed on the way through — the settings schema
286
+ // exposes `layerMask` / `grassLayer` / `snowLayer` / `sandLayer` and the
287
+ // profile wants `layers.{maskEnabled, sharpness, offset, grass, snow,
288
+ // sand}` — so the group names are mapped explicitly. The FIELDS inside each
289
+ // group are spread, because those names are shared and an allow-list there
290
+ // is the same silent-drop trap the moss group was carrying: a new sand or
291
+ // grass field would pass validation, be clamped, and then vanish before the
292
+ // shader with no error at any layer. Only `useAssetMask` -> `maskEnabled`
293
+ // is genuinely renamed, and the `tint` entries coerce a shape the profile
294
+ // wants differently. `scripts/verify-rock-shader.mjs` asserts parity for
295
+ // every group so this cannot silently regress again.
296
+ layers: {
297
+ sharpness: layerMask.sharpness,
298
+ offset: layerMask.offset,
299
+ maskEnabled: layerMask.useAssetMask,
300
+ grass: {
301
+ ...grassLayer,
302
+ tint: tintArray(grassLayer.tint, [0.48, 0.65, 0.3]),
303
+ },
304
+ snow: {
305
+ ...snowLayer,
306
+ tint: tintArray(snowLayer.tint, [0.9, 0.93, 0.96]),
307
+ },
308
+ sand: {
309
+ ...sandLayer,
310
+ tint: tintArray(sandLayer.tint, [0.72, 0.59, 0.4]),
311
+ },
312
+ },
313
+ });
314
+ }
315
+
316
+ function ensureScalarAttribute(geometry, name, value) {
317
+ if (!geometry?.attributes || geometry.getAttribute(name)) return;
318
+ const count = geometry.getAttribute('position')?.count ?? 0;
319
+ const values = new Float32Array(count);
320
+ values.fill(value);
321
+ geometry.setAttribute(name, new THREE.BufferAttribute(values, 1));
322
+ }
323
+
324
+ function ensureColorAttribute(geometry) {
325
+ if (!geometry?.attributes || geometry.getAttribute('color')) return;
326
+ const count = geometry.getAttribute('position')?.count ?? 0;
327
+ const values = new Float32Array(count * 3);
328
+ values.fill(1);
329
+ geometry.setAttribute('color', new THREE.BufferAttribute(values, 3));
330
+ }
331
+
332
+ function disposeOwnedMaterial(material) {
333
+ const materials = Array.isArray(material) ? material : [material];
334
+ for (const candidate of materials) {
335
+ if (candidate?.userData?.toonLabRockShaderOwned) candidate.dispose();
336
+ }
337
+ }
338
+
339
+ function createMaterialForSource({
340
+ vertexCavityStrength = 0,
341
+ rockRegionEnabled = false,
342
+ sourceMaterial,
343
+ settings,
344
+ profile,
345
+ textures,
346
+ name,
347
+ variation = 0,
348
+ degenerateMaps = null,
349
+ surfaceState = 'source',
350
+ }) {
351
+ const semantic = sourceMaterial?.userData?.toonlabRockSemanticMaterial ?? null;
352
+ const fallback = semantic ? {} : createRockShaderTextureSet({ variation });
353
+ // A placeholder in a real slot is worse than an empty slot: it silently
354
+ // displaces the deterministic fallback, which is a usable surface. Drop
355
+ // degenerate maps here so every consumer of the shader is protected, not
356
+ // only the ones that remembered to filter before calling.
357
+ const provided = withoutDegenerateDetailMaps(textures);
358
+ if (degenerateMaps && provided.rejected.length > 0) {
359
+ degenerateMaps.push(...provided.rejected);
360
+ }
361
+ const textureSet = {
362
+ ...fallback,
363
+ ...(semantic?.textures ?? {}),
364
+ ...provided.textures,
365
+ };
366
+
367
+ let materialProfile = profile;
368
+ if (semantic) {
369
+ materialProfile = structuredClone(semantic.profile);
370
+ // Scene state and coordinated lighting remain style-owned; source material
371
+ // identity (projection, PBR, masks, and layer inputs) remains set-owned.
372
+ materialProfile.lighting = structuredClone(profile.lighting);
373
+ materialProfile.shoreline = structuredClone(profile.shoreline);
374
+ materialProfile.base = {
375
+ ...materialProfile.base,
376
+ closeTintDistance: profile.base.closeTintDistance,
377
+ distantTint: profile.base.distantTint,
378
+ distantTintMix: profile.base.distantTintMix,
379
+ farTintDistance: profile.base.farTintDistance,
380
+ nearDetailDistance: profile.base.nearDetailDistance,
381
+ nearDetailScale: profile.base.nearDetailScale,
382
+ nearDetailStrength: profile.base.nearDetailStrength,
383
+ };
384
+ const selected = surfaceState === 'source'
385
+ ? null
386
+ : ['none', 'grass', 'sand', 'snow'].includes(surfaceState)
387
+ ? surfaceState
388
+ : (() => { throw new TypeError(`Unknown rock surface state: ${surfaceState}`); })();
389
+ if (selected !== null) {
390
+ for (const role of ['grass', 'sand', 'snow']) {
391
+ materialProfile.layers[role].enabled = selected === role;
392
+ }
393
+ if (selected !== 'none') {
394
+ // An explicit replacement state is a ToonLab-authored cap, not the
395
+ // source graph's often-disabled top-layer default. Keep all four mask
396
+ // signals active while using a production-visible coverage range.
397
+ materialProfile.layers.maskEnabled = true;
398
+ materialProfile.layers.offset = 0.2;
399
+ materialProfile.layers.sharpness = 4;
400
+ materialProfile.layers.heightStart = 0.15;
401
+ materialProfile.layers.heightEnd = 0.7;
402
+ materialProfile.layers.cavityStrength = Math.max(
403
+ 0.2,
404
+ Number(materialProfile.layers.cavityStrength ?? 0),
405
+ );
406
+ materialProfile.layers.exposureStrength = Math.max(
407
+ 0.2,
408
+ Number(materialProfile.layers.exposureStrength ?? 0),
409
+ );
410
+ materialProfile.layers.semanticMaskStrength = Math.max(
411
+ 0.15,
412
+ Number(materialProfile.layers.semanticMaskStrength ?? 0),
413
+ );
414
+ }
415
+ if (selected !== 'none' && !textureSet[selected]?.isTexture) {
416
+ throw new Error(
417
+ `Rock material set ${semantic.materialSetId} has no faithful ${selected} layer input.`,
418
+ );
419
+ }
420
+ }
421
+ }
422
+
423
+ const sourceAlbedoMode = settings.assetIntegration.sourceAlbedoMode;
424
+ const sourceAlbedoStrength = semantic ? 0 : sourceAlbedoMode === 'retain'
425
+ ? 1
426
+ : sourceAlbedoMode === 'blend'
427
+ ? settings.assetIntegration.sourceAlbedoStrength
428
+ : 0;
429
+ if (sourceMaterial?.map && sourceAlbedoStrength > 0) {
430
+ textureSet.sourceRock = sourceMaterial.map;
431
+ }
432
+ if (settings.assetIntegration.sourceNormalStrength > 0 && sourceMaterial?.normalMap) {
433
+ const sourceNormals = withoutDegenerateDetailMaps({
434
+ sourceNormal: sourceMaterial.normalMap,
435
+ });
436
+ if (sourceNormals.textures.sourceNormal) {
437
+ textureSet.sourceNormal = sourceNormals.textures.sourceNormal;
438
+ } else if (degenerateMaps) {
439
+ degenerateMaps.push(...sourceNormals.rejected);
440
+ }
441
+ }
442
+ if (sourceAlbedoStrength > 0 && sourceMaterial?.roughnessMap) {
443
+ textureSet.sourceRoughness = sourceMaterial.roughnessMap;
444
+ }
445
+ if (sourceAlbedoStrength > 0 && sourceMaterial?.metalnessMap) {
446
+ textureSet.sourceMetalness = sourceMaterial.metalnessMap;
447
+ }
448
+ if (sourceAlbedoStrength > 0 && sourceMaterial?.specularIntensityMap) {
449
+ textureSet.sourceSpecular = sourceMaterial.specularIntensityMap;
450
+ }
451
+ if (sourceAlbedoStrength > 0 && sourceMaterial?.emissiveMap) {
452
+ textureSet.sourceEmissive = sourceMaterial.emissiveMap;
453
+ }
454
+ if (settings.assetIntegration.sourceAoStrength > 0 && sourceMaterial?.aoMap) {
455
+ textureSet.sourceAo = sourceMaterial.aoMap;
456
+ }
457
+
458
+ const rockMaterial = createToonRockMaterial({
459
+ assetIntegration: {
460
+ ...settings.assetIntegration,
461
+ sourceAlbedoStrength,
462
+ sourceColor: sourceMaterial?.color?.toArray?.() ?? [1, 1, 1],
463
+ sourceEmissive: sourceMaterial?.emissive?.toArray?.() ?? [0, 0, 0],
464
+ sourceEmissiveIntensity: Number(sourceMaterial?.emissiveIntensity ?? 1),
465
+ sourceOpacity: Number(sourceMaterial?.opacity ?? 1),
466
+ sourceAlphaTest: Number(sourceMaterial?.alphaTest ?? 0),
467
+ sourceTransparent: Boolean(sourceMaterial?.transparent),
468
+ sourceDepthWrite: sourceMaterial?.depthWrite !== false,
469
+ sourceSide: Number.isInteger(sourceMaterial?.side) ? sourceMaterial.side : null,
470
+ sourceMetalnessFactor: Number(sourceMaterial?.metalness ?? 0),
471
+ sourceRoughnessFactor: Number(sourceMaterial?.roughness ?? 1),
472
+ sourceSpecularFactor: Number(sourceMaterial?.specularIntensity ?? 1),
473
+ primaryNormalStrength: Number(
474
+ semantic?.binding?.materialVariation?.normalGain ?? 1,
475
+ ),
476
+ primarySpecularStrength: Number(
477
+ semantic?.binding?.materialVariation?.specularGain ?? 1,
478
+ ),
479
+ semanticMaskAttributes: Boolean(semantic),
480
+ rockRegionAttributes: rockRegionEnabled,
481
+ regionTintStrength: settings.assetIntegration.regionTintStrength,
482
+ regionBaseTint: settings.assetIntegration.regionBaseTint,
483
+ regionShaftTint: settings.assetIntegration.regionShaftTint,
484
+ regionNeckTint: settings.assetIntegration.regionNeckTint,
485
+ regionCapTint: settings.assetIntegration.regionCapTint,
486
+ regionNeckOverlayStrength: settings.assetIntegration.regionNeckOverlayStrength,
487
+ vertexCavityStrength,
488
+ },
489
+ profile: materialProfile,
490
+ textures: textureSet,
491
+ name,
492
+ });
493
+ rockMaterial.userData.toonLabRockShaderOwned = true;
494
+ rockMaterial.userData.toonLabRockShaderPreset = settings.preset;
495
+ rockMaterial.userData.toonLabRockTextureSource = textures?.rock
496
+ ? 'provided'
497
+ : semantic
498
+ ? 'shared-semantic-material-set'
499
+ : 'first-party-generated';
500
+ rockMaterial.userData.toonlabSourceTextureIds = [...new Set([
501
+ ...Object.values(semantic?.textures ?? {}),
502
+ textureSet.sourceRock,
503
+ textureSet.sourceNormal,
504
+ textureSet.sourceRoughness,
505
+ textureSet.sourceMetalness,
506
+ textureSet.sourceSpecular,
507
+ textureSet.sourceEmissive,
508
+ textureSet.sourceAo,
509
+ ].filter((texture) => texture?.isTexture && texture.uuid).map((texture) => texture.uuid))];
510
+ rockMaterial.userData.toonLabRockTextureComposition = {
511
+ base: textures?.rock
512
+ ? 'provided'
513
+ : semantic
514
+ ? 'shared-semantic-material-set'
515
+ : 'first-party-generated',
516
+ sourceAlbedoMode,
517
+ sourceAlbedoStrength,
518
+ sourceNormalStrength: settings.assetIntegration.sourceNormalStrength,
519
+ sourceAoStrength: settings.assetIntegration.sourceAoStrength,
520
+ sourcePbrChannels: {
521
+ primaryAo: Boolean(textureSet.rockAo),
522
+ albedo: Boolean(textureSet.sourceRock),
523
+ alphaCutout: Boolean(textureSet.sourceRock && sourceMaterial?.alphaTest > 0),
524
+ emissive: Boolean(textureSet.sourceEmissive),
525
+ metallicRoughness: Boolean(textureSet.sourceMetalness || textureSet.sourceRoughness),
526
+ normal: Boolean(textureSet.sourceNormal),
527
+ occlusion: Boolean(textureSet.sourceAo),
528
+ specular: Boolean(textureSet.sourceSpecular),
529
+ },
530
+ sourceTextureCount: rockMaterial.userData.toonlabSourceTextureIds.length,
531
+ };
532
+ if (semantic) {
533
+ rockMaterial.userData.toonLabRockTextureComposition.materialSetId = semantic.materialSetId;
534
+ rockMaterial.userData.toonLabRockTextureComposition.surfaceState = surfaceState;
535
+ rockMaterial.userData.toonLabRockTextureComposition.sourcePbrChannels = {
536
+ albedo: Boolean(textureSet.rock),
537
+ normal: Boolean(textureSet.rockNormal),
538
+ smoothness: Boolean(textureSet.smoothness),
539
+ topMask: Boolean(textureSet.topMask),
540
+ grass: Boolean(textureSet.grass),
541
+ grassRoughness: Boolean(textureSet.grassRoughness),
542
+ sand: Boolean(textureSet.sand),
543
+ sandNormal: Boolean(textureSet.sandNormal),
544
+ snow: Boolean(textureSet.snow),
545
+ moss: Boolean(textureSet.moss),
546
+ };
547
+ const activeLayer = ['grass', 'snow', 'sand']
548
+ .filter((role) => materialProfile.layers?.[role]?.enabled)
549
+ .at(-1) ?? 'rock';
550
+ rockMaterial.userData.toonlabRockActiveSurfaceResponse = {
551
+ activeLayer,
552
+ color: activeLayer === 'rock' ? textureSet.rock?.uuid : textureSet[activeLayer]?.uuid,
553
+ normal: activeLayer === 'sand' && materialProfile.layers.sand.normalStrength > 0
554
+ ? textureSet.sandNormal?.uuid
555
+ : activeLayer === 'rock'
556
+ ? textureSet.rockNormal?.uuid
557
+ : null,
558
+ roughness: activeLayer === 'grass' && textureSet.grassRoughness
559
+ ? textureSet.grassRoughness.uuid
560
+ : materialProfile.layers?.[activeLayer]?.roughness ?? null,
561
+ };
562
+ rockMaterial.userData.toonlabRockProjectionContract = {
563
+ normalBlend: 'whiteout-world-to-tangent',
564
+ primary: 'world-space-triplanar',
565
+ scaleCompensation: 'absolute-world-position',
566
+ texelDensityInvariantUnderNonUniformScale: true,
567
+ };
568
+ }
569
+ rockMaterial.userData.environmentShaderExclude = true;
570
+ return markFactoryStyleMaterial(rockMaterial, 'RockSurface');
571
+ }
572
+
573
+ export function createRockShaderMaterial({
574
+ settings: input = {},
575
+ textures = {},
576
+ sourceMaterial = null,
577
+ name = 'Call Me Sensei Rock',
578
+ variation = 0,
579
+ surfaceState = 'source',
580
+ } = {}) {
581
+ const settings = createRockShaderSettings(input);
582
+ return createMaterialForSource({
583
+ sourceMaterial,
584
+ settings,
585
+ profile: rockShaderSettingsToProfile(settings),
586
+ textures,
587
+ variation,
588
+ surfaceState,
589
+ name,
590
+ });
591
+ }
592
+
593
+ /**
594
+ * Applies a rock shader preset to meshes without coupling the shader document
595
+ * to procedural asset generation. Geometry can contribute optional `color`
596
+ * and `envVertexAo` channels; missing channels receive neutral defaults.
597
+ */
598
+ export function applyRockShader(root, input = {}, {
599
+ textures = {},
600
+ include = null,
601
+ name = 'Call Me Sensei Rock',
602
+ castShadow = true,
603
+ receiveShadow = true,
604
+ variation = 0,
605
+ surfaceState = 'source',
606
+ detail = null,
607
+ } = {}) {
608
+ const settings = createRockShaderSettings(input);
609
+ const rockRegionEnabled = settings.assetIntegration.regionTintStrength > 0;
610
+ if (rockRegionEnabled && detail) {
611
+ throw new Error('Rock-region styling cannot run with geometry detail; rebuild semantic masks after geometry changes.');
612
+ }
613
+ const rockRegionInspection = rockRegionEnabled
614
+ ? inspectRockRegionBindings(root, { requireEveryMesh: true, sampleValues: true })
615
+ : null;
616
+ // Geometry detail runs before anything reads or writes vertex attributes:
617
+ // subdivision replaces every buffer, so a color/AO attribute built first
618
+ // would be sized to the old vertex count. Opt-in — most placements are not
619
+ // close enough to need it, and it multiplies triangles by 4^subdivisions.
620
+ const geometryDetail = detail
621
+ ? applyRockGeometryDetail(root, { variation, ...(detail === true ? {} : detail) })
622
+ : null;
623
+ // A present-but-zero tangent attribute is worse than no tangent attribute:
624
+ // TSL trusts it, builds an invalid TBN frame, and normal-mapped facets become
625
+ // literal black. Removing only invalid tangent attributes lets Three derive
626
+ // its guarded derivative frame while leaving geometry and UVs unchanged.
627
+ const tangentIntegrity = sanitizeRockTangents(root);
628
+ // Only bind the moss cavity channel when EVERY enriched mesh actually carries
629
+ // the attribute. A material sampling an attribute that some geometry lacks is
630
+ // a hard shader failure, so this stays off unless the write is complete.
631
+ const vertexCavityStrength = geometryDetail
632
+ && geometryDetail.meshes > 0
633
+ && geometryDetail.cavity === geometryDetail.meshes
634
+ ? ROCK_MOSS_CAVITY_STRENGTH
635
+ : 0;
636
+ const profile = rockShaderSettingsToProfile(settings);
637
+ const retainedSourceTextureIds = new Set();
638
+ const degenerateMaps = [];
639
+ const report = {
640
+ preset: settings.preset,
641
+ matched: 0,
642
+ applied: 0,
643
+ skipped: 0,
644
+ textureSource: textures?.rock ? 'provided' : 'first-party-generated',
645
+ usedGeneratedTextures: false,
646
+ shadowDefaultsApplied: 0,
647
+ retainedSourceTextures: 0,
648
+ variation,
649
+ // Slots dropped because the supplied map was too small to carry detail.
650
+ // Surfaced rather than silenced: a dropped map changes the render.
651
+ rejectedTextures: degenerateMaps,
652
+ // Tessellation/displacement actually applied, or null when not requested.
653
+ // Reported because it changes the triangle budget by up to 64x.
654
+ geometryDetail,
655
+ tangentIntegrity,
656
+ rockRegions: rockRegionInspection ? {
657
+ meshCount: rockRegionInspection.meshCount,
658
+ totalVertices: rockRegionInspection.totalVertices,
659
+ totalBytes: rockRegionInspection.totalBytes,
660
+ attribute: '_tl_rock_region',
661
+ } : null,
662
+ surfaceState,
663
+ };
664
+
665
+ root?.traverse?.((object) => {
666
+ if (!object?.isMesh) return;
667
+ if (object.userData?.rockShaderExclude === true) {
668
+ report.skipped += 1;
669
+ return;
670
+ }
671
+ if (typeof include === 'function' && include(object) !== true) {
672
+ report.skipped += 1;
673
+ return;
674
+ }
675
+
676
+ report.matched += 1;
677
+ if (!ORIGINAL_MATERIALS.has(object)) ORIGINAL_MATERIALS.set(object, object.material);
678
+ if (!ORIGINAL_SHADOW_FLAGS.has(object)) {
679
+ ORIGINAL_SHADOW_FLAGS.set(object, {
680
+ castShadow: object.castShadow,
681
+ receiveShadow: object.receiveShadow,
682
+ });
683
+ }
684
+ const originalMaterial = ORIGINAL_MATERIALS.get(object);
685
+
686
+ if (settings.assetIntegration.vertexColorStrength > 0) ensureColorAttribute(object.geometry);
687
+ if (settings.assetIntegration.vertexAoStrength > 0) {
688
+ ensureScalarAttribute(object.geometry, 'envVertexAo', 1);
689
+ }
690
+
691
+ disposeOwnedMaterial(object.material);
692
+ const sourceMaterials = Array.isArray(originalMaterial) ? originalMaterial : [originalMaterial];
693
+ const nextMaterials = sourceMaterials.map((sourceMaterial, index) => createMaterialForSource({
694
+ degenerateMaps,
695
+ vertexCavityStrength,
696
+ rockRegionEnabled,
697
+ sourceMaterial,
698
+ settings,
699
+ profile,
700
+ textures,
701
+ variation,
702
+ surfaceState,
703
+ name: sourceMaterials.length > 1 ? `${name} ${index + 1}` : name,
704
+ }));
705
+ for (const material of nextMaterials) {
706
+ const baseSource = material.userData.toonLabRockTextureComposition?.base;
707
+ if (baseSource === 'first-party-generated') {
708
+ report.usedGeneratedTextures = true;
709
+ } else if (baseSource === 'shared-semantic-material-set') {
710
+ report.textureSource = 'shared-semantic-material-set';
711
+ }
712
+ for (const textureId of material.userData.toonlabSourceTextureIds ?? []) {
713
+ retainedSourceTextureIds.add(textureId);
714
+ }
715
+ }
716
+ object.material = Array.isArray(originalMaterial) ? nextMaterials : nextMaterials[0];
717
+ object.castShadow = Boolean(castShadow);
718
+ object.receiveShadow = Boolean(receiveShadow);
719
+ report.shadowDefaultsApplied += 1;
720
+ object.userData.rockShaderPreset = settings.preset;
721
+ report.applied += 1;
722
+ });
723
+
724
+ report.retainedSourceTextures = retainedSourceTextureIds.size;
725
+
726
+ return report;
727
+ }
728
+
729
+ export function restoreRockShader(root) {
730
+ let restored = 0;
731
+ root?.traverse?.((object) => {
732
+ if (!object?.isMesh || !ORIGINAL_MATERIALS.has(object)) return;
733
+ disposeOwnedMaterial(object.material);
734
+ object.material = ORIGINAL_MATERIALS.get(object);
735
+ const flags = ORIGINAL_SHADOW_FLAGS.get(object);
736
+ if (flags) {
737
+ object.castShadow = flags.castShadow;
738
+ object.receiveShadow = flags.receiveShadow;
739
+ ORIGINAL_SHADOW_FLAGS.delete(object);
740
+ }
741
+ ORIGINAL_MATERIALS.delete(object);
742
+ delete object.userData.rockShaderPreset;
743
+ restored += 1;
744
+ });
745
+ return restored;
746
+ }
747
+
748
+ /** Updates current scene inputs without changing the portable rock preset. */
749
+ export function setRockShaderSceneState(root, { skyColor, waterLevel } = {}) {
750
+ let updated = 0;
751
+ root?.traverse?.((object) => {
752
+ if (!object?.isMesh) return;
753
+ const materials = Array.isArray(object.material) ? object.material : [object.material];
754
+ for (const material of materials) {
755
+ const state = material?.userData?.toonLabRockSceneState;
756
+ if (!state) continue;
757
+ if (skyColor !== undefined) state.setSkyColor(skyColor);
758
+ if (Number.isFinite(Number(waterLevel))) state.setWaterLevel(Number(waterLevel));
759
+ updated += 1;
760
+ }
761
+ });
762
+ const resolvedSkyColor = Array.isArray(skyColor) || ArrayBuffer.isView(skyColor)
763
+ ? Array.from(skyColor).slice(0, 3).map(Number)
764
+ : skyColor?.isColor
765
+ ? [skyColor.r, skyColor.g, skyColor.b]
766
+ : null;
767
+ return {
768
+ skyColor: resolvedSkyColor?.length === 3 && resolvedSkyColor.every(Number.isFinite)
769
+ ? resolvedSkyColor
770
+ : null,
771
+ updated,
772
+ waterLevel: Number.isFinite(Number(waterLevel)) ? Number(waterLevel) : null,
773
+ };
774
+ }
775
+
776
+ export function disposeDefaultRockShaderTextures() {
777
+ for (const set of textureSetsByVariation.values()) {
778
+ for (const texture of Object.values(set)) texture.dispose();
779
+ }
780
+ textureSetsByVariation.clear();
781
+ }