@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,587 @@
1
+ import * as THREE from 'three';
2
+
3
+ import { StylizedTree } from './stylizedTree.js';
4
+ import { resolveTreeSurfaceProfileId } from './treeSurfaceTextures.js';
5
+
6
+ export const BRANCH_TREE_DOCUMENT_TYPE = 'toonlab/branch-tree';
7
+ export const BRANCH_TREE_DOCUMENT_VERSION = 1;
8
+
9
+ /**
10
+ * BranchTree's architecture identity, used by the LOD compiler to pick its
11
+ * triangle envelope. BranchTree is not a legacy aggregate-card tree: it hard-
12
+ * sets the recursive `branching` generator and carries a four-level scaffold,
13
+ * so it budgets like the other recursive woody engines rather than like the
14
+ * legacy default.
15
+ */
16
+ export const BRANCH_TREE_ARCHITECTURE = Object.freeze({
17
+ id: 'branch-tree',
18
+ engine: 'branch-tree',
19
+ version: 1,
20
+ });
21
+
22
+ export const BRANCH_TREE_LEAF_SHAPES = Object.freeze([
23
+ 'teardrop',
24
+ 'round',
25
+ 'oak',
26
+ 'maple',
27
+ // Acer palmatum's deeply dissected seven-lobe leaf. 'maple' above is the
28
+ // blunt five-point sugar-maple star; the two are different species reads
29
+ // and a garden's hero maple needs the dissected one.
30
+ 'palmate',
31
+ 'gingko',
32
+ // Conifer organs. A needle-bearing BranchTree is not a contradiction: the
33
+ // architecture is a recursive woody skeleton with foliage at the tips,
34
+ // which is exactly how a cloud-pruned pine is built. What it must NOT do is
35
+ // set `skeleton.conifer`, which shortens children toward the leader and
36
+ // produces the excurrent cone a pruned garden pine is defined against.
37
+ 'needle',
38
+ 'needle-fascicle',
39
+ ]);
40
+
41
+ /**
42
+ * Canopy tuft architectures a BranchTree may select.
43
+ *
44
+ * `null` keeps StylizedTree's own choice, which is what every document
45
+ * authored before this field existed relies on.
46
+ */
47
+ export const BRANCH_TREE_CANOPY_ARCHITECTURES = Object.freeze([
48
+ 'cloud-cards',
49
+ 'layered-sprays',
50
+ 'needle-whorls',
51
+ ]);
52
+
53
+ export const DEFAULT_BRANCH_TREE_SETTINGS = Object.freeze({
54
+ seed: 1,
55
+ size: 1,
56
+ branches: Object.freeze({
57
+ angle: 54,
58
+ children: 5,
59
+ forceStrength: 0.018,
60
+ gnarliness: 0.16,
61
+ lengthRatio: 0.48,
62
+ levels: 3,
63
+ // Total branches the breadth-first skeleton may grow, and the ceiling on
64
+ // foliage attachments. null = the generator's historical 420 / 380.
65
+ //
66
+ // These are authorable because the fixed budget is a silent quality trap:
67
+ // the skeleton grows breadth-first, so at high `children` levels 1 and 2
68
+ // consume the whole allowance before the leaf-bearing level-3 twigs are
69
+ // ever queued and the tree ships nearly bare (D19-028 — measured 12
70
+ // children → 19 leaf cards). Raising the budget is also the only way to
71
+ // build a many-tipped structure such as a cloud-pruned pine, whose whole
72
+ // silhouette is the count and separation of its foliage pads.
73
+ maxAttachments: null,
74
+ maxBranches: null,
75
+ radialSegments: 8,
76
+ radiusRatio: 0.68,
77
+ start: 0.34,
78
+ }),
79
+ trunk: Object.freeze({
80
+ bend: 0.18,
81
+ // World heading of the trunk's bow, in radians. null = derived from the
82
+ // seed. Authoring it is what makes a coherent windswept stand possible:
83
+ // without it every seed leans a different way and a ridge of trees reads
84
+ // as damage rather than as wind.
85
+ bendDirection: null,
86
+ color: Object.freeze([0.48, 0.29, 0.16]),
87
+ gnarl: 0.18,
88
+ height: 2.1,
89
+ lean: 0.12,
90
+ // Lean heading relative to the bow, in radians. null = derived from the
91
+ // seed; 0 pins the lean along the bow, Math.PI pulls the top back against
92
+ // it for an S-curve.
93
+ leanOffset: null,
94
+ radialSegments: 10,
95
+ radiusBottom: 0.22,
96
+ radiusTop: 0.075,
97
+ // Whether the crown's own shadow map falls on the tree's wood. false is
98
+ // the anime read StylizedTree already documents for pale-limbed trees,
99
+ // and it matters most on a tips-placement tree, where bare limb crosses
100
+ // the canopy in full view: with it on, those limbs render as near-black
101
+ // scribbles inside the crown at close camera.
102
+ receiveShadow: true,
103
+ textureRef: null,
104
+ twist: 0.08,
105
+ }),
106
+ leaves: Object.freeze({
107
+ color: Object.freeze([0.19, 0.48, 0.22]),
108
+ coverageScale: 1,
109
+ // How one tuft of foliage is built at a branch tip. Every field is
110
+ // nullable and every null forwards nothing, so a document authored before
111
+ // this block existed resolves to exactly the geometry it always did.
112
+ //
113
+ // This is the lever the canopy actually needs. `coverageScale` saturates
114
+ // at `clamp(size × coverageScale, 0.4)²` capped at 9, so on any tree
115
+ // larger than size 3 it is inert; `density` only scales an already-fixed
116
+ // per-tuft count; and `branches.children` buys cards by adding wood.
117
+ // The tuft itself was the one thing an author could not reach.
118
+ cluster: Object.freeze({
119
+ // 'cloud-cards' (default): cards fill a small sphere at the tip.
120
+ // 'layered-sprays': cards fill a flattened disc across the tip, which
121
+ // is how a cloud-pruned pad or a horizontally layered maple tier
122
+ // reads. 'needle-whorls': cards align their long axis to the twig,
123
+ // for needle-bearing branchlets.
124
+ architecture: null,
125
+ cards: null, // cards per tuft
126
+ // Bare every tuft below this fraction of the crown's own height. A
127
+ // skeleton that forks low enough to read multi-stemmed also hangs
128
+ // foliage down that low wood and buries the trunk it just built; in a
129
+ // garden the bare trunk is as much of the subject as the canopy. This
130
+ // lifts the foliage skirt without touching `branches.start`, so the
131
+ // limb structure keeps its low fork and only the leaves move.
132
+ crownBase: null,
133
+ // Multiplies the card count of every tuft that SURVIVES pruning, so a
134
+ // crown can be restructured at an unchanged card total rather than
135
+ // simply losing the foliage that pruning removed.
136
+ densityBoost: null,
137
+ // Keep only this many well-separated tufts and bare every other branch
138
+ // tip. This is what makes a cloud-pruned pine possible at all: a
139
+ // recursive skeleton hangs foliage on every terminal twig, and terminal
140
+ // twigs fill the crown evenly, so without pruning the crown is a dome
141
+ // no matter how each individual tuft is shaped.
142
+ pads: null,
143
+ // Horizontal plates: { count, thickness, jitter }. `pads` spaces
144
+ // masses isotropically, which is a pine's 3D scatter and is not a
145
+ // layered broadleaf: an Acer palmatum's signature is flat tiers with
146
+ // sky and limb showing BETWEEN them, and no isotropic count produces an
147
+ // anisotropic structure. This keeps tufts inside `count` height bands
148
+ // and bares the tufts in the gaps.
149
+ plates: null,
150
+ // 0..1, `layered-sprays` only. 0 builds each spray disc across the
151
+ // twig, so a twig rising at 50 deg carries a disc tilted at 50 deg. 1
152
+ // builds it flat with the GROUND, which is what makes a tier read as a
153
+ // tier rather than as a thicket of tilted saucers.
154
+ plateAlignment: null,
155
+ // Drops each plate's outer rim as a fraction of its own radius. A
156
+ // perfectly flat tier is a machined shelf — the Cornus controversa /
157
+ // acacia read — and this is what makes it hang instead.
158
+ plateDroop: null,
159
+ radius: null, // tuft radius, tree-local units
160
+ sizeRange: null, // [min, max] card size multiplier
161
+ sprayLayers: null, // layered-sprays: tiers stacked along the twig
162
+ spraySpread: null, // layered-sprays: pad radius across the twig
163
+ sprayThickness: null, // layered-sprays: pad depth along the twig
164
+ whorlArms: null, // needle-whorls: branchlets per whorl
165
+ whorlRadius: null, // needle-whorls: whorl radius
166
+ }),
167
+ density: 1,
168
+ palette: Object.freeze({}),
169
+ shape: 'round',
170
+ textureRef: null,
171
+ }),
172
+ roots: 'small',
173
+ });
174
+
175
+ function plainObject(value) {
176
+ return value && typeof value === 'object' && !Array.isArray(value) ? value : {};
177
+ }
178
+
179
+ function finite(value, fallback, minimum = -Infinity, maximum = Infinity) {
180
+ const number = Number(value);
181
+ return Number.isFinite(number)
182
+ ? THREE.MathUtils.clamp(number, minimum, maximum)
183
+ : fallback;
184
+ }
185
+
186
+ function integer(value, fallback, minimum, maximum) {
187
+ return Math.round(finite(value, fallback, minimum, maximum));
188
+ }
189
+
190
+ function color(value, fallback) {
191
+ if (Array.isArray(value) && value.length >= 3) {
192
+ const channels = value.slice(0, 3).map(Number);
193
+ if (channels.every(Number.isFinite)) {
194
+ return channels.map((channel) => THREE.MathUtils.clamp(channel, 0, 1));
195
+ }
196
+ }
197
+ if (value?.isColor) return value.clone().convertLinearToSRGB().toArray();
198
+ if (typeof value === 'number' || typeof value === 'string') {
199
+ try {
200
+ return new THREE.Color(value).convertLinearToSRGB().toArray();
201
+ } catch {
202
+ // Fall through to the documented default.
203
+ }
204
+ }
205
+ return [...fallback];
206
+ }
207
+
208
+ function reference(value) {
209
+ return typeof value === 'string' && value.trim() ? value.trim() : null;
210
+ }
211
+
212
+ function nullableAngle(value, fallback) {
213
+ if (value === null) return null;
214
+ if (value === undefined) return fallback;
215
+ const number = Number(value);
216
+ return Number.isFinite(number)
217
+ ? THREE.MathUtils.euclideanModulo(number, Math.PI * 2)
218
+ : fallback;
219
+ }
220
+
221
+ function nullableFinite(value, minimum, maximum) {
222
+ if (value === null || value === undefined) return null;
223
+ const number = Number(value);
224
+ return Number.isFinite(number)
225
+ ? THREE.MathUtils.clamp(number, minimum, maximum)
226
+ : null;
227
+ }
228
+
229
+ function nullableInteger(value, minimum, maximum) {
230
+ const resolved = nullableFinite(value, minimum, maximum);
231
+ return resolved === null ? null : Math.round(resolved);
232
+ }
233
+
234
+ function nullableRange(value, minimum, maximum) {
235
+ if (!Array.isArray(value) || value.length < 2) return null;
236
+ const low = nullableFinite(value[0], minimum, maximum);
237
+ const high = nullableFinite(value[1], minimum, maximum);
238
+ if (low === null || high === null) return null;
239
+ return [Math.min(low, high), Math.max(low, high)];
240
+ }
241
+
242
+ // `leaves.cluster.plates`. A count below 2 is not a plate structure — one
243
+ // band is the whole crown — so it resolves to null rather than silently
244
+ // pruning the tree down to a single slab of foliage.
245
+ function leafPlates(value) {
246
+ if (value === null || value === undefined || typeof value !== 'object') return null;
247
+ const count = nullableInteger(value.count, 2, 24);
248
+ if (count === null) return null;
249
+ return {
250
+ count,
251
+ jitter: nullableFinite(value.jitter, 0, 1) ?? 0,
252
+ thickness: nullableFinite(value.thickness, 0.02, 1) ?? 0.5,
253
+ };
254
+ }
255
+
256
+ function leafCluster(value) {
257
+ const source = plainObject(value);
258
+ return {
259
+ architecture: BRANCH_TREE_CANOPY_ARCHITECTURES.includes(source.architecture)
260
+ ? source.architecture
261
+ : null,
262
+ cards: nullableInteger(source.cards, 1, 64),
263
+ crownBase: nullableFinite(source.crownBase, 0, 0.95),
264
+ densityBoost: nullableFinite(source.densityBoost, 0.1, 12),
265
+ pads: nullableInteger(source.pads, 1, 2000),
266
+ plates: leafPlates(source.plates),
267
+ plateAlignment: nullableFinite(source.plateAlignment, 0, 1),
268
+ plateDroop: nullableFinite(source.plateDroop, 0, 2),
269
+ radius: nullableFinite(source.radius, 0.01, 4),
270
+ sizeRange: nullableRange(source.sizeRange, 0.02, 6),
271
+ sprayLayers: nullableInteger(source.sprayLayers, 1, 12),
272
+ spraySpread: nullableFinite(source.spraySpread, 0.05, 4),
273
+ sprayThickness: nullableFinite(source.sprayThickness, 0, 2),
274
+ whorlArms: nullableInteger(source.whorlArms, 3, 24),
275
+ whorlRadius: nullableFinite(source.whorlRadius, 0.05, 3),
276
+ };
277
+ }
278
+
279
+ function canopyPalette(value) {
280
+ const source = plainObject(value);
281
+ const result = {};
282
+ for (const tone of ['lit', 'shadow', 'crown']) {
283
+ if (source[tone] === undefined) continue;
284
+ const resolved = color(source[tone], [NaN, NaN, NaN]);
285
+ if (resolved.every(Number.isFinite)) result[tone] = resolved;
286
+ }
287
+ return result;
288
+ }
289
+
290
+ /**
291
+ * Normalize the intentionally small supported BranchTree surface.
292
+ *
293
+ * `trunk.map` and `leaves.map` may be live THREE.Texture values. They are
294
+ * runtime inputs and are omitted from portable documents; use textureRef to
295
+ * retain the caller-owned asset identity beside the procedural recipe.
296
+ */
297
+ export function createBranchTreeSettings(options = {}) {
298
+ const source = plainObject(options);
299
+ const branches = plainObject(source.branches);
300
+ const trunk = plainObject(source.trunk);
301
+ const leaves = plainObject(source.leaves);
302
+ const defaults = DEFAULT_BRANCH_TREE_SETTINGS;
303
+ return {
304
+ seed: integer(source.seed, defaults.seed, -2147483648, 2147483647),
305
+ size: finite(source.size, defaults.size, 0.05, 100),
306
+ branches: {
307
+ angle: finite(branches.angle, defaults.branches.angle, 10, 120),
308
+ children: integer(branches.children, defaults.branches.children, 1, 12),
309
+ forceStrength: finite(
310
+ branches.forceStrength,
311
+ defaults.branches.forceStrength,
312
+ -0.08,
313
+ 0.15,
314
+ ),
315
+ gnarliness: finite(branches.gnarliness, defaults.branches.gnarliness, 0, 0.6),
316
+ lengthRatio: finite(branches.lengthRatio, defaults.branches.lengthRatio, 0.15, 0.9),
317
+ levels: integer(branches.levels, defaults.branches.levels, 1, 4),
318
+ maxAttachments: nullableInteger(branches.maxAttachments, 8, 4000),
319
+ maxBranches: nullableInteger(branches.maxBranches, 8, 6000),
320
+ radialSegments: integer(
321
+ branches.radialSegments,
322
+ defaults.branches.radialSegments,
323
+ 3,
324
+ 16,
325
+ ),
326
+ radiusRatio: finite(branches.radiusRatio, defaults.branches.radiusRatio, 0.3, 0.9),
327
+ start: finite(branches.start, defaults.branches.start, 0, 0.85),
328
+ },
329
+ trunk: {
330
+ bend: finite(trunk.bend, defaults.trunk.bend, -1.2, 1.2),
331
+ bendDirection: nullableAngle(trunk.bendDirection, defaults.trunk.bendDirection),
332
+ color: color(trunk.color, defaults.trunk.color),
333
+ gnarl: finite(trunk.gnarl, defaults.trunk.gnarl, 0, 1),
334
+ height: finite(trunk.height, defaults.trunk.height, 0.2, 30),
335
+ lean: finite(trunk.lean, defaults.trunk.lean, -1.2, 1.2),
336
+ leanOffset: nullableAngle(trunk.leanOffset, defaults.trunk.leanOffset),
337
+ map: trunk.map?.isTexture ? trunk.map : null,
338
+ radialSegments: integer(
339
+ trunk.radialSegments,
340
+ defaults.trunk.radialSegments,
341
+ 3,
342
+ 24,
343
+ ),
344
+ radiusBottom: finite(trunk.radiusBottom, defaults.trunk.radiusBottom, 0.01, 5),
345
+ radiusTop: finite(trunk.radiusTop, defaults.trunk.radiusTop, 0.002, 3),
346
+ receiveShadow: trunk.receiveShadow === undefined
347
+ ? defaults.trunk.receiveShadow
348
+ : Boolean(trunk.receiveShadow),
349
+ textureRef: reference(trunk.textureRef),
350
+ twist: finite(trunk.twist, defaults.trunk.twist, -Math.PI * 4, Math.PI * 4),
351
+ },
352
+ leaves: {
353
+ color: color(leaves.color, defaults.leaves.color),
354
+ cluster: leafCluster(leaves.cluster),
355
+ coverageScale: finite(
356
+ leaves.coverageScale,
357
+ defaults.leaves.coverageScale,
358
+ 0.25,
359
+ 4,
360
+ ),
361
+ density: finite(leaves.density, defaults.leaves.density, 0.1, 2),
362
+ map: leaves.map?.isTexture ? leaves.map : null,
363
+ palette: canopyPalette(leaves.palette),
364
+ shape: BRANCH_TREE_LEAF_SHAPES.includes(leaves.shape)
365
+ ? leaves.shape
366
+ : defaults.leaves.shape,
367
+ textureRef: reference(leaves.textureRef),
368
+ },
369
+ roots: ['none', 'small', 'medium', 'large'].includes(source.roots)
370
+ ? source.roots
371
+ : defaults.roots,
372
+ };
373
+ }
374
+
375
+ function portableSettings(options = {}) {
376
+ const settings = createBranchTreeSettings(options);
377
+ const { map: trunkMap, ...trunk } = settings.trunk;
378
+ const { map: leafMap, ...leaves } = settings.leaves;
379
+ void trunkMap;
380
+ void leafMap;
381
+ return {
382
+ ...settings,
383
+ branches: { ...settings.branches },
384
+ leaves,
385
+ trunk,
386
+ };
387
+ }
388
+
389
+ export function createBranchTreeDocument(options = {}) {
390
+ return {
391
+ type: BRANCH_TREE_DOCUMENT_TYPE,
392
+ version: BRANCH_TREE_DOCUMENT_VERSION,
393
+ settings: portableSettings(options),
394
+ };
395
+ }
396
+
397
+ export function parseBranchTreeDocument(input) {
398
+ let value = input;
399
+ if (typeof input === 'string') {
400
+ try {
401
+ value = JSON.parse(input);
402
+ } catch {
403
+ return { errors: ['BranchTree document is not valid JSON.'], ok: false, value: null };
404
+ }
405
+ }
406
+ if (!value || typeof value !== 'object' || Array.isArray(value)) {
407
+ return { errors: ['BranchTree document must be an object.'], ok: false, value: null };
408
+ }
409
+ if (value.type !== BRANCH_TREE_DOCUMENT_TYPE) {
410
+ return { errors: [`Expected type "${BRANCH_TREE_DOCUMENT_TYPE}".`], ok: false, value: null };
411
+ }
412
+ if (value.version !== BRANCH_TREE_DOCUMENT_VERSION) {
413
+ return {
414
+ errors: [`Unsupported BranchTree document version ${String(value.version)}.`],
415
+ ok: false,
416
+ value: null,
417
+ };
418
+ }
419
+ return {
420
+ errors: [],
421
+ ok: true,
422
+ value: createBranchTreeDocument(value.settings),
423
+ };
424
+ }
425
+
426
+ /**
427
+ * The StylizedTree option object a BranchTree builds from its settings.
428
+ *
429
+ * Shared by the constructor and by createBranchTreeRecipe so the LOD compiler
430
+ * meshes exactly the tree the runtime renders. Runtime-only inputs (live
431
+ * textures, foliage/wind state, shader profile) are layered on by the caller.
432
+ */
433
+ export function branchTreeStylizedOptions(settingsInput = {}) {
434
+ const settings = settingsInput?.branches && settingsInput?.leaves && settingsInput?.trunk
435
+ ? settingsInput
436
+ : createBranchTreeSettings(settingsInput);
437
+ // Only forward what was actually authored. StylizedTree keeps its
438
+ // tips-placement and branching-generator canopy presets unless a caller
439
+ // hands it a value that differs from the module default, so forwarding a
440
+ // resolved default here would silently overwrite those presets and move
441
+ // every existing document's geometry.
442
+ const cluster = settings.leaves.cluster ?? {};
443
+ const canopyCluster = {};
444
+ const forward = (key, value) => {
445
+ if (value !== null && value !== undefined) canopyCluster[key] = value;
446
+ };
447
+ forward('architecture', cluster.architecture);
448
+ forward('cardsPerCluster', cluster.cards);
449
+ forward('padCount', cluster.pads);
450
+ forward('crownBase', cluster.crownBase);
451
+ forward('padDensityBoost', cluster.densityBoost);
452
+ forward('padLayers', cluster.plates);
453
+ forward('plateAlignment', cluster.plateAlignment);
454
+ forward('plateDroop', cluster.plateDroop);
455
+ forward('clusterRadius', cluster.radius);
456
+ forward('cardSizeRange', cluster.sizeRange);
457
+ forward('sprayLayers', cluster.sprayLayers);
458
+ forward('spraySpread', cluster.spraySpread);
459
+ forward('sprayThickness', cluster.sprayThickness);
460
+ forward('whorlArms', cluster.whorlArms);
461
+ forward('whorlRadius', cluster.whorlRadius);
462
+
463
+ const skeletonBudget = {};
464
+ if (settings.branches.maxBranches !== null) {
465
+ skeletonBudget.maxBranches = settings.branches.maxBranches;
466
+ }
467
+ if (settings.branches.maxAttachments !== null) {
468
+ skeletonBudget.maxAttachments = settings.branches.maxAttachments;
469
+ }
470
+ return {
471
+ tree: {
472
+ canopyColor: settings.leaves.color,
473
+ canopyPalette: settings.leaves.palette,
474
+ canopyDepth: 0.92,
475
+ canopyScale: 1,
476
+ canopyWidth: 1.18,
477
+ leafDensity: settings.leaves.density,
478
+ leafPlacement: 'tips',
479
+ seed: settings.seed,
480
+ size: settings.size,
481
+ trunkColor: settings.trunk.color,
482
+ trunkReceiveShadow: settings.trunk.receiveShadow,
483
+ },
484
+ trunk: {
485
+ bend: settings.trunk.bend,
486
+ bendDirection: settings.trunk.bendDirection,
487
+ gnarl: settings.trunk.gnarl,
488
+ height: settings.trunk.height,
489
+ lean: settings.trunk.lean,
490
+ leanOffset: settings.trunk.leanOffset,
491
+ radialSegments: settings.trunk.radialSegments,
492
+ radiusBottom: settings.trunk.radiusBottom,
493
+ radiusTop: settings.trunk.radiusTop,
494
+ twist: settings.trunk.twist,
495
+ },
496
+ skeleton: {
497
+ branchAngle: settings.branches.angle,
498
+ branchStart: settings.branches.start,
499
+ childrenCount: settings.branches.children,
500
+ forceStrength: settings.branches.forceStrength,
501
+ generator: 'branching',
502
+ gnarliness: settings.branches.gnarliness,
503
+ lengthRatio: settings.branches.lengthRatio,
504
+ levels: settings.branches.levels,
505
+ radialSegments: settings.branches.radialSegments,
506
+ radiusRatio: settings.branches.radiusRatio,
507
+ ...skeletonBudget,
508
+ },
509
+ canopy: {
510
+ // Physical tree size still participates so leaf cards retain a useful
511
+ // world-space density. The explicit factor lets an author tune that
512
+ // coverage independently instead of enlarging the whole tree.
513
+ coverageScale: settings.size * settings.leaves.coverageScale,
514
+ ...canopyCluster,
515
+ // BranchTree knows exactly which tuft fields the author supplied,
516
+ // because every unauthored one is null. Declaring them keeps a value
517
+ // that happens to equal a module default from being mistaken for
518
+ // "unset" and quietly replaced by the branching-generator preset.
519
+ explicit: Object.keys(canopyCluster),
520
+ },
521
+ leafShape: settings.leaves.map ? null : { preset: settings.leaves.shape },
522
+ roots: { preset: settings.roots },
523
+ // A trunk textureRef that names a registered bark profile (or one of its
524
+ // short aliases, e.g. 'beech') selects that profile. An unrecognized ref
525
+ // stays caller-owned provenance and falls through to the style default,
526
+ // so existing documents keep working unchanged.
527
+ trunkSurfaceProfile: settings.trunk.map
528
+ ? null
529
+ : resolveTreeSurfaceProfileId(settings.trunk.textureRef),
530
+ };
531
+ }
532
+
533
+ /**
534
+ * Stable first-party procedural broadleaf tree.
535
+ *
536
+ * This deliberately exposes one branch architecture. Leaf silhouette/color/
537
+ * texture and trunk color/texture are inputs; botanical species claims are
538
+ * outside the 0.4.6 contract.
539
+ */
540
+ export class BranchTree extends StylizedTree {
541
+ constructor(options = {}) {
542
+ const settings = createBranchTreeSettings(options);
543
+ const source = plainObject(options);
544
+ super({
545
+ ...branchTreeStylizedOptions(settings),
546
+ foliage: {
547
+ ...plainObject(source.foliage),
548
+ ...(settings.leaves.map ? { leafMap: settings.leaves.map } : {}),
549
+ },
550
+ styleTarget: source.styleTarget ?? {},
551
+ trunkMap: settings.trunk.map,
552
+ vegetationShader: source.vegetationShader ?? null,
553
+ });
554
+ this.name = 'BranchTree';
555
+ this.branchTreeSettings = settings;
556
+ }
557
+
558
+ toJSON() {
559
+ return createBranchTreeDocument(this.branchTreeSettings);
560
+ }
561
+ }
562
+
563
+ /**
564
+ * Wrap BranchTree settings in the tree-recipe envelope the LOD compiler
565
+ * consumes, tagged with BranchTree's own architecture so it is budgeted
566
+ * against the BranchTree triangle envelope rather than the legacy default.
567
+ *
568
+ * The portable BranchTree document stays the asset's identity; this is the
569
+ * adapter that lets `compileTreeLodLevels` build its three LODs from it.
570
+ */
571
+ export function createBranchTreeRecipe(options = {}, { id = null, label = null } = {}) {
572
+ const settings = createBranchTreeSettings(options);
573
+ const recipe = {
574
+ schema: 'treeRecipe',
575
+ version: 3,
576
+ type: 'tree',
577
+ architecture: { ...BRANCH_TREE_ARCHITECTURE },
578
+ options: branchTreeStylizedOptions(settings),
579
+ };
580
+ if (id) recipe.id = id;
581
+ if (label) recipe.label = label;
582
+ return recipe;
583
+ }
584
+
585
+ export function createBranchTree(options = {}) {
586
+ return new BranchTree(options);
587
+ }