@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,372 @@
1
+ import { meshDocument } from '../mesh/meshDocument.js';
2
+ import { getGeometryTriangleCount } from './rockLodMetrics.js';
3
+ import {
4
+ createReferenceRockLodPolicyForDocument,
5
+ createRockLodTriangleTargets,
6
+ resolveReferenceRockLodPolicy,
7
+ } from './rockLodPolicy.js';
8
+ import {
9
+ matchRockGeometryBounds,
10
+ simplifyRockGeometryToTriangleBudget,
11
+ } from './rockLodSimplifier.js';
12
+ import { validateRockLodLevels } from './rockLodValidation.js';
13
+
14
+ function clampInteger(value, min, max) {
15
+ return Math.min(Math.max(Math.round(Number(value)), min), max);
16
+ }
17
+
18
+ /**
19
+ * Surface meshes scale approximately with resolution squared, so a triangle
20
+ * target uses sqrt(target/reference) rather than the exporter's historical
21
+ * direct half/quarter resolution convention.
22
+ */
23
+ export function estimateSurfaceNetsResolution({
24
+ maxResolution = 320,
25
+ minResolution = 8,
26
+ referenceResolution,
27
+ referenceTriangles,
28
+ targetTriangles,
29
+ }) {
30
+ const min = clampInteger(minResolution, 8, 320);
31
+ const max = clampInteger(maxResolution, min, 320);
32
+ const resolution = clampInteger(referenceResolution, min, max);
33
+ const triangles = Math.max(Number(referenceTriangles) || 1, 1);
34
+ const target = Math.max(Number(targetTriangles) || 1, 1);
35
+ return clampInteger(resolution * Math.sqrt(target / triangles), min, max);
36
+ }
37
+
38
+ function selectMeasurement(measurements, target, preference) {
39
+ const candidates = [...measurements.values()].filter((entry) => !entry.invalid);
40
+ if (candidates.length === 0) return null;
41
+ const under = candidates.filter((entry) => entry.triangleCount <= target);
42
+ if (preference === 'under' && under.length > 0) {
43
+ under.sort((left, right) => (
44
+ right.triangleCount - left.triangleCount
45
+ || right.resolution - left.resolution
46
+ ));
47
+ return under[0];
48
+ }
49
+ candidates.sort((left, right) => (
50
+ Math.abs(left.triangleCount - target) - Math.abs(right.triangleCount - target)
51
+ || Number(left.triangleCount > target) - Number(right.triangleCount > target)
52
+ || left.resolution - right.resolution
53
+ ));
54
+ return candidates[0];
55
+ }
56
+
57
+ /**
58
+ * Searches integer grid resolutions around the Surface Nets sqrt estimate.
59
+ * The callback may return either a triangle count or `{ triangleCount, ... }`.
60
+ * Results include every sampled resolution for diagnostics and reuse.
61
+ */
62
+ export function searchSurfaceNetsResolution({
63
+ maxResolution = 320,
64
+ measureTriangles,
65
+ minResolution = 8,
66
+ neighborhood = 2,
67
+ preference = 'under',
68
+ reference = null,
69
+ targetTriangles,
70
+ }) {
71
+ if (typeof measureTriangles !== 'function') {
72
+ throw new TypeError('searchSurfaceNetsResolution requires a measureTriangles callback.');
73
+ }
74
+ const min = clampInteger(minResolution, 8, 320);
75
+ const max = clampInteger(maxResolution, min, 320);
76
+ const target = Math.max(Math.round(Number(targetTriangles) || 1), 1);
77
+ const measurements = new Map();
78
+ const measure = (value) => {
79
+ const resolution = clampInteger(value, min, max);
80
+ if (measurements.has(resolution)) return measurements.get(resolution);
81
+ const raw = measureTriangles(resolution);
82
+ const data = typeof raw === 'number' ? { triangleCount: raw } : raw;
83
+ const triangleCount = Math.max(Math.round(Number(data?.triangleCount) || 0), 0);
84
+ const measured = { ...data, resolution, triangleCount };
85
+ measurements.set(resolution, measured);
86
+ return measured;
87
+ };
88
+
89
+ const minimum = measure(min);
90
+ if (min === max) {
91
+ if (minimum.invalid) {
92
+ throw new Error(`No non-empty Surface Nets mesh exists at resolution ${min}.`);
93
+ }
94
+ return {
95
+ ...minimum,
96
+ limitedByMinimum: minimum.triangleCount > target,
97
+ samples: [...measurements.values()],
98
+ targetTriangles: target,
99
+ };
100
+ }
101
+
102
+ const referenceResolution = Number.isFinite(reference?.resolution)
103
+ ? Math.round(reference.resolution)
104
+ : Math.round((min + max) * 0.5);
105
+ const referenceTriangles = Number.isFinite(reference?.triangleCount)
106
+ ? Math.max(Math.round(reference.triangleCount), 1)
107
+ : measure(clampInteger(referenceResolution, min, max)).triangleCount;
108
+ const estimate = estimateSurfaceNetsResolution({
109
+ maxResolution: max,
110
+ minResolution: min,
111
+ referenceResolution,
112
+ referenceTriangles,
113
+ targetTriangles: target,
114
+ });
115
+ const estimated = measure(estimate);
116
+
117
+ let lower = estimated.triangleCount <= target ? estimated.resolution : null;
118
+ let upper = estimated.triangleCount > target ? estimated.resolution : null;
119
+ let cursor = estimated.resolution;
120
+ let step = 1;
121
+ if (lower !== null) {
122
+ while (cursor < max && upper === null) {
123
+ const next = Math.min(cursor + step, max);
124
+ const measured = measure(next);
125
+ if (measured.triangleCount <= target) lower = next;
126
+ else upper = next;
127
+ if (next === max) break;
128
+ cursor = next;
129
+ step *= 2;
130
+ }
131
+ } else {
132
+ while (cursor > min && lower === null) {
133
+ const next = Math.max(cursor - step, min);
134
+ const measured = measure(next);
135
+ if (measured.triangleCount <= target) lower = next;
136
+ else upper = next;
137
+ if (next === min) break;
138
+ cursor = next;
139
+ step *= 2;
140
+ }
141
+ }
142
+
143
+ if (lower !== null && upper !== null) {
144
+ let low = Math.min(lower, upper);
145
+ let high = Math.max(lower, upper);
146
+ while (high - low > 1) {
147
+ const middle = Math.floor((low + high) / 2);
148
+ const measured = measure(middle);
149
+ if (measured.triangleCount <= target) low = middle;
150
+ else high = middle;
151
+ }
152
+ lower = low;
153
+ upper = high;
154
+ }
155
+
156
+ const anchors = new Set([min, estimate]);
157
+ if (lower !== null) anchors.add(lower);
158
+ if (upper !== null) anchors.add(upper);
159
+ for (const anchor of anchors) {
160
+ for (let offset = -neighborhood; offset <= neighborhood; offset += 1) {
161
+ const resolution = anchor + offset;
162
+ if (resolution >= min && resolution <= max) measure(resolution);
163
+ }
164
+ }
165
+
166
+ let selected = selectMeasurement(measurements, target, preference);
167
+ if (!selected) {
168
+ for (let resolution = min; resolution <= max && !selected; resolution += 1) {
169
+ measure(resolution);
170
+ selected = selectMeasurement(measurements, target, preference);
171
+ }
172
+ }
173
+ if (!selected) {
174
+ throw new Error(`No non-empty Surface Nets mesh exists between resolutions ${min} and ${max}.`);
175
+ }
176
+ return {
177
+ ...selected,
178
+ limitedByMinimum: selected.resolution === min && selected.triangleCount > target,
179
+ samples: [...measurements.values()].sort((left, right) => left.resolution - right.resolution),
180
+ targetTriangles: target,
181
+ };
182
+ }
183
+
184
+ /**
185
+ * Meshes and plans a deterministic LOD set for a legacy procedural document.
186
+ * Returned geometries can be passed straight to an exporter; callers that
187
+ * only need resolutions may set `keepGeometries: false` after validation.
188
+ * Source-mesh reference documents deliberately fail through meshDocument;
189
+ * their exact authored LODs are loaded by referenceAssetLoader instead.
190
+ */
191
+ export function planRockLodMeshes(document, {
192
+ includeHelpers = false,
193
+ keepGeometries = true,
194
+ maxResolution = null,
195
+ mesh = meshDocument,
196
+ meshOptions = {},
197
+ policy: policyOption = null,
198
+ validate = true,
199
+ } = {}) {
200
+ if (!document || typeof document !== 'object') {
201
+ throw new TypeError('planRockLodMeshes requires a rock document.');
202
+ }
203
+ if (typeof mesh !== 'function') throw new TypeError('The rock LOD mesh callback must be a function.');
204
+ const policyHasExplicitBudget = policyOption && typeof policyOption === 'object'
205
+ && (Object.hasOwn(policyOption, 'triangleBudgets')
206
+ || Object.hasOwn(policyOption, 'targetTriangles'));
207
+ let policy = policyOption === null
208
+ ? createReferenceRockLodPolicyForDocument(document)
209
+ : resolveReferenceRockLodPolicy(policyOption, {
210
+ ...(!policyHasExplicitBudget && Number.isFinite(Number(document.reference?.targetTriangles))
211
+ ? { targetTriangles: Number(document.reference.targetTriangles) }
212
+ : {}),
213
+ });
214
+ const maximum = clampInteger(
215
+ maxResolution ?? document.meshing?.exportResolution ?? policy.maxResolution,
216
+ policy.minResolution,
217
+ policy.maxResolution,
218
+ );
219
+ const geometries = new Map();
220
+ const invalidResolutions = new Set();
221
+ const measureTriangles = (resolution) => {
222
+ if (invalidResolutions.has(resolution)) {
223
+ return { geometry: null, invalid: true, triangleCount: 0 };
224
+ }
225
+ if (!geometries.has(resolution)) {
226
+ try {
227
+ const geometry = mesh(document, {
228
+ ...meshOptions,
229
+ includeHelpers,
230
+ resolution,
231
+ });
232
+ geometries.set(resolution, geometry);
233
+ } catch (error) {
234
+ if (!String(error?.message ?? error).includes('produced an empty surface')) throw error;
235
+ invalidResolutions.add(resolution);
236
+ return { geometry: null, invalid: true, triangleCount: 0 };
237
+ }
238
+ }
239
+ const geometry = geometries.get(resolution);
240
+ return { geometry, triangleCount: getGeometryTriangleCount(geometry) };
241
+ };
242
+
243
+ // Very thin or strongly elongated rocks can fall entirely between the
244
+ // samples of an 8-cell grid. That is a grid limitation, not an empty rock.
245
+ // If the nominal minimum is empty, scan through the probe neighborhood and
246
+ // choose the first resolution after the last aliasing gap. Thin shapes can
247
+ // briefly appear and disappear again (for example at grids 9 and 16), so
248
+ // stopping at the first non-empty sample is not sufficient.
249
+ let viableMinimum = policy.minResolution;
250
+ if (measureTriangles(viableMinimum).invalid) {
251
+ let lastEmpty = viableMinimum;
252
+ let consecutiveSurfaces = 0;
253
+ const scanFloor = Math.min(
254
+ maximum,
255
+ Math.max(policy.probeResolution, policy.minResolution + 8),
256
+ );
257
+ for (let resolution = policy.minResolution + 1;
258
+ resolution <= maximum;
259
+ resolution += 1) {
260
+ const measurement = measureTriangles(resolution);
261
+ if (!measurement.invalid) {
262
+ consecutiveSurfaces += 1;
263
+ } else {
264
+ lastEmpty = resolution;
265
+ consecutiveSurfaces = 0;
266
+ }
267
+ if (resolution >= scanFloor && consecutiveSurfaces >= 4) break;
268
+ }
269
+ viableMinimum = lastEmpty + 1;
270
+ }
271
+ if (viableMinimum > maximum) {
272
+ throw new Error(
273
+ `Rock LOD planning could not find a non-empty mesh between resolutions ${policy.minResolution} and ${maximum}.`,
274
+ );
275
+ }
276
+ if (viableMinimum !== policy.minResolution) {
277
+ policy = resolveReferenceRockLodPolicy({
278
+ ...policy,
279
+ minResolution: viableMinimum,
280
+ probeResolution: Math.max(policy.probeResolution, viableMinimum),
281
+ });
282
+ }
283
+
284
+ const probeResolution = Math.min(policy.probeResolution, maximum);
285
+ const probe = measureTriangles(probeResolution);
286
+ const baseSearch = searchSurfaceNetsResolution({
287
+ maxResolution: maximum,
288
+ measureTriangles,
289
+ minResolution: policy.minResolution,
290
+ reference: { resolution: probeResolution, triangleCount: probe.triangleCount },
291
+ targetTriangles: policy.triangleBudgets[0],
292
+ });
293
+ // Author LOD0 from a stable probe-or-better surface, then edge-collapse to
294
+ // the audited budget. Selecting a raw 8-cell mesh merely because it is
295
+ // under budget can already destroy thin shelves before LOD reduction starts.
296
+ let sourceResolution = Math.max(probeResolution, baseSearch.resolution);
297
+ let sourceMeasurement = measureTriangles(sourceResolution);
298
+ while (sourceMeasurement.invalid && sourceResolution < maximum) {
299
+ sourceResolution += 1;
300
+ sourceMeasurement = measureTriangles(sourceResolution);
301
+ }
302
+ if (sourceMeasurement.invalid) {
303
+ sourceResolution = baseSearch.resolution;
304
+ sourceMeasurement = baseSearch;
305
+ }
306
+ const authoredBase = simplifyRockGeometryToTriangleBudget(
307
+ sourceMeasurement.geometry,
308
+ policy.triangleBudgets[0],
309
+ );
310
+ const baseLevel = {
311
+ actualRatio: 1,
312
+ geometry: authoredBase.geometry,
313
+ level: 0,
314
+ limitedByMinimum: authoredBase.triangleCount > policy.triangleBudgets[0],
315
+ method: authoredBase.retainedSource ? 'surface-nets' : 'simplified',
316
+ removedVertices: authoredBase.removedVertices,
317
+ reducible: false,
318
+ resolution: sourceResolution,
319
+ retainedTopology: false,
320
+ retentionReason: null,
321
+ targetRatio: 1,
322
+ targetTriangles: policy.triangleBudgets[0],
323
+ triangleBudget: policy.triangleBudgets[0],
324
+ triangleCount: authoredBase.triangleCount,
325
+ };
326
+ const targets = createRockLodTriangleTargets(baseLevel.triangleCount, policy);
327
+ const levels = [baseLevel];
328
+
329
+ for (let index = 1; index < policy.levelCount; index += 1) {
330
+ const previous = levels[index - 1];
331
+ const target = targets[index];
332
+ const simplified = simplifyRockGeometryToTriangleBudget(
333
+ sourceMeasurement.geometry,
334
+ target.targetTriangles,
335
+ );
336
+ if (!simplified.retainedSource) {
337
+ matchRockGeometryBounds(simplified.geometry, baseLevel.geometry);
338
+ }
339
+ const retainedTopology = simplified.triangleCount >= previous.triangleCount;
340
+ levels.push({
341
+ actualRatio: simplified.triangleCount / baseLevel.triangleCount,
342
+ geometry: simplified.geometry,
343
+ level: index,
344
+ limitedByMinimum: simplified.retainedSource && baseLevel.limitedByMinimum,
345
+ method: simplified.retainedSource ? 'retained' : 'simplified',
346
+ removedVertices: simplified.removedVertices,
347
+ reducible: !retainedTopology,
348
+ resolution: baseLevel.resolution,
349
+ retainedTopology,
350
+ retentionReason: retainedTopology
351
+ ? simplified.retainedSource ? 'minimum-topology' : 'topology-plateau'
352
+ : null,
353
+ targetRatio: target.ratio,
354
+ targetTriangles: target.targetTriangles,
355
+ triangleBudget: target.triangleBudget,
356
+ triangleCount: simplified.triangleCount,
357
+ });
358
+ }
359
+
360
+ const validation = validate
361
+ ? validateRockLodLevels(levels, { policy })
362
+ : null;
363
+ const resultLevels = keepGeometries
364
+ ? levels
365
+ : levels.map(({ geometry, ...level }) => level);
366
+ return {
367
+ levels: resultLevels,
368
+ policy,
369
+ sampledResolutions: [...geometries.keys()].sort((left, right) => left - right),
370
+ validation,
371
+ };
372
+ }
@@ -0,0 +1,235 @@
1
+ // Legacy procedural-rock LOD policy, calibrated from the reference inventory.
2
+ // Actual source-mesh references bypass this policy and preserve every exact
3
+ // authored LOD; Surface Nets generation uses it only for retained old presets.
4
+
5
+ export const REFERENCE_ROCK_LOD_RATIOS = Object.freeze([1, 0.5, 0.25]);
6
+
7
+ // LOD0 ceilings are rounded, modest-headroom versions of the studied asset
8
+ // roles: single boulders peak near 290 triangles, clumps near 850, and the
9
+ // representative cliff near 430. Landmark and hero roles are explicit escape
10
+ // hatches for authored silhouettes that genuinely need more geometry.
11
+ const ROLE_LOD0_BUDGETS = Object.freeze({
12
+ boulder: 320,
13
+ cliff: 512,
14
+ cluster: 960,
15
+ hero: 4096,
16
+ landmark: 2048,
17
+ });
18
+
19
+ function budgetsFromLod0(lod0) {
20
+ return Object.freeze(REFERENCE_ROCK_LOD_RATIOS.map((ratio) => (
21
+ Math.max(Math.round(lod0 * ratio), 1)
22
+ )));
23
+ }
24
+
25
+ export const REFERENCE_ROCK_LOD_ROLE_BUDGETS = Object.freeze(Object.fromEntries(
26
+ Object.entries(ROLE_LOD0_BUDGETS).map(([role, lod0]) => [role, budgetsFromLod0(lod0)]),
27
+ ));
28
+
29
+ export const REFERENCE_ROCK_LOD_ROLES = Object.freeze(
30
+ Object.keys(REFERENCE_ROCK_LOD_ROLE_BUDGETS),
31
+ );
32
+
33
+ const ROLE_ALIASES = Object.freeze({
34
+ boulderClump: 'cluster',
35
+ 'boulder-clump': 'cluster',
36
+ clump: 'cluster',
37
+ 'cliff-piece': 'cliff',
38
+ cliffFace: 'cliff',
39
+ 'column-piece': 'cliff',
40
+ 'column-rock': 'cliff',
41
+ 'hoodoo-cliff': 'cliff',
42
+ hoodoo: 'cliff',
43
+ 'layered-rock': 'boulder',
44
+ 'metric-block': 'boulder',
45
+ 'mountain-backdrop': 'landmark',
46
+ platform: 'cluster',
47
+ 'ridge-clump': 'cluster',
48
+ rock: 'boulder',
49
+ 'rock-clump': 'cluster',
50
+ setPiece: 'landmark',
51
+ shelf: 'cluster',
52
+ 'slanted-rock': 'boulder',
53
+ spire: 'landmark',
54
+ 'vertical-clump': 'cluster',
55
+ });
56
+
57
+ function finiteInteger(value, fallback, { max = Infinity, min = -Infinity } = {}) {
58
+ const number = Number(value);
59
+ if (!Number.isFinite(number)) return fallback;
60
+ return Math.min(Math.max(Math.round(number), min), max);
61
+ }
62
+
63
+ function finiteNumber(value, fallback, { max = Infinity, min = -Infinity } = {}) {
64
+ const number = Number(value);
65
+ if (!Number.isFinite(number)) return fallback;
66
+ return Math.min(Math.max(number, min), max);
67
+ }
68
+
69
+ function normalizeRole(value) {
70
+ const requested = String(value ?? 'boulder').trim();
71
+ const role = ROLE_ALIASES[requested] ?? requested;
72
+ if (!Object.hasOwn(REFERENCE_ROCK_LOD_ROLE_BUDGETS, role)) {
73
+ throw new Error(
74
+ `Unknown rock LOD role "${requested}" (expected ${REFERENCE_ROCK_LOD_ROLES.join(', ')}).`,
75
+ );
76
+ }
77
+ return role;
78
+ }
79
+
80
+ function normalizeRatios(value) {
81
+ if (!Array.isArray(value) || value.length !== 3) return [...REFERENCE_ROCK_LOD_RATIOS];
82
+ const ratios = value.map((entry, index) => finiteNumber(
83
+ entry,
84
+ REFERENCE_ROCK_LOD_RATIOS[index],
85
+ { max: 1, min: 0.001 },
86
+ ));
87
+ ratios[0] = 1;
88
+ for (let index = 1; index < ratios.length; index += 1) {
89
+ ratios[index] = Math.min(ratios[index], ratios[index - 1]);
90
+ }
91
+ return ratios;
92
+ }
93
+
94
+ function normalizeBudgets(value, role, ratios) {
95
+ const roleBudgets = REFERENCE_ROCK_LOD_ROLE_BUDGETS[role];
96
+ if (!Array.isArray(value) || value.length !== 3) return [...roleBudgets];
97
+ const budgets = value.map((entry, index) => finiteInteger(
98
+ entry,
99
+ roleBudgets[index],
100
+ { min: 1 },
101
+ ));
102
+ for (let index = 1; index < budgets.length; index += 1) {
103
+ budgets[index] = Math.min(budgets[index], budgets[index - 1]);
104
+ }
105
+ // A custom LOD0-only budget can be expressed by passing [N, null, null].
106
+ for (let index = 1; index < budgets.length; index += 1) {
107
+ if (value[index] === null || value[index] === undefined) {
108
+ budgets[index] = Math.max(Math.round(budgets[0] * ratios[index]), 1);
109
+ }
110
+ }
111
+ return budgets;
112
+ }
113
+
114
+ /**
115
+ * Creates a normalized procedural-rock LOD policy with up to three levels.
116
+ *
117
+ * Role budgets are hard ceilings when an integer Surface Nets resolution can
118
+ * attain them. `minResolution` mirrors meshDocument's hard minimum of 8; a
119
+ * budget below what that grid can represent is reported as minimum-limited,
120
+ * rather than pretending that the cap was met.
121
+ */
122
+ export function createReferenceRockLodPolicy(options = {}) {
123
+ const role = normalizeRole(options.role);
124
+ const ratios = normalizeRatios(options.ratios);
125
+ const targetTriangles = Number(options.targetTriangles);
126
+ const requestedBudgets = options.triangleBudgets ?? (
127
+ Number.isFinite(targetTriangles) && targetTriangles > 0
128
+ ? [targetTriangles, null, null]
129
+ : null
130
+ );
131
+ const triangleBudgets = normalizeBudgets(requestedBudgets, role, ratios);
132
+ const minResolution = finiteInteger(options.minResolution, 8, { max: 320, min: 8 });
133
+ const maxResolution = finiteInteger(options.maxResolution, 320, {
134
+ max: 320,
135
+ min: minResolution,
136
+ });
137
+ const probeResolution = finiteInteger(options.probeResolution, 24, {
138
+ max: maxResolution,
139
+ min: minResolution,
140
+ });
141
+ const silhouetteThreshold = finiteNumber(options.silhouetteThreshold, 0.72, { max: 1, min: 0 });
142
+ const silhouetteThresholds = Array.isArray(options.silhouetteThresholds)
143
+ && options.silhouetteThresholds.length === 3
144
+ ? options.silhouetteThresholds.map((entry, level) => finiteNumber(
145
+ entry,
146
+ level === 2 ? Math.max(silhouetteThreshold - 0.02, 0) : silhouetteThreshold,
147
+ { max: 1, min: 0 },
148
+ ))
149
+ : [1, silhouetteThreshold, Math.max(silhouetteThreshold - 0.02, 0)];
150
+
151
+ return Object.freeze({
152
+ allowTinyTopologyRetention: options.allowTinyTopologyRetention !== false,
153
+ boundsCenterTolerance: finiteNumber(options.boundsCenterTolerance, 0.1, { max: 1, min: 0 }),
154
+ boundsSizeTolerance: finiteNumber(options.boundsSizeTolerance, 0.18, { max: 1, min: 0 }),
155
+ levelCount: finiteInteger(options.levelCount, 3, { max: 3, min: 1 }),
156
+ maxResolution,
157
+ minResolution,
158
+ probeResolution,
159
+ ratioTolerance: finiteNumber(options.ratioTolerance, 0.4, { max: 2, min: 0 }),
160
+ ratios: Object.freeze(ratios),
161
+ role,
162
+ silhouetteGridSize: finiteInteger(options.silhouetteGridSize, 40, { max: 128, min: 12 }),
163
+ silhouetteThreshold,
164
+ silhouetteThresholds: Object.freeze(silhouetteThresholds),
165
+ tinyTriangleThreshold: finiteInteger(options.tinyTriangleThreshold, 96, { min: 0 }),
166
+ triangleBudgets: Object.freeze(triangleBudgets),
167
+ });
168
+ }
169
+
170
+ export function resolveReferenceRockLodPolicy(roleOrPolicy = 'boulder', overrides = {}) {
171
+ if (typeof roleOrPolicy === 'string' || roleOrPolicy === null || roleOrPolicy === undefined) {
172
+ return createReferenceRockLodPolicy({ ...overrides, role: roleOrPolicy ?? 'boulder' });
173
+ }
174
+ if (typeof roleOrPolicy !== 'object' || Array.isArray(roleOrPolicy)) {
175
+ throw new TypeError('Rock LOD policy must be a role name or an options object.');
176
+ }
177
+ return createReferenceRockLodPolicy({ ...roleOrPolicy, ...overrides });
178
+ }
179
+
180
+ /**
181
+ * Resolves catalog/reference metadata without coupling the planner to a
182
+ * catalog schema. Explicit options win; otherwise `reference.targetTriangles`
183
+ * becomes LOD0 and the policy derives its half/quarter budgets.
184
+ */
185
+ export function createReferenceRockLodPolicyForDocument(document, options = {}) {
186
+ const reference = document?.reference && typeof document.reference === 'object'
187
+ ? document.reference
188
+ : {};
189
+ const explicitBudgets = Object.hasOwn(options, 'triangleBudgets')
190
+ || Object.hasOwn(options, 'targetTriangles');
191
+ const referenceLevels = Array.isArray(reference.lodTriangles)
192
+ ? reference.lodTriangles
193
+ .slice(0, 3)
194
+ .map((entry) => finiteInteger(entry, 0, { min: 0 }))
195
+ .filter((entry) => entry > 0)
196
+ : [];
197
+ const exactLevelCount = referenceLevels.length;
198
+ const exactBudgets = [...referenceLevels];
199
+ const exactRatios = referenceLevels.map((entry) => entry / referenceLevels[0]);
200
+ while (exactBudgets.length > 0 && exactBudgets.length < 3) {
201
+ const level = exactBudgets.length;
202
+ exactBudgets.push(Math.max(Math.round(exactBudgets[0] * REFERENCE_ROCK_LOD_RATIOS[level]), 1));
203
+ exactRatios.push(exactBudgets[level] / exactBudgets[0]);
204
+ }
205
+ return createReferenceRockLodPolicy({
206
+ ...(!explicitBudgets && exactLevelCount > 0 ? {
207
+ levelCount: exactLevelCount,
208
+ ratios: exactRatios,
209
+ triangleBudgets: exactBudgets,
210
+ } : {}),
211
+ ...options,
212
+ // Catalog `role` describes inventory use (core form / metric utility /
213
+ // backdrop); `archetype` describes the geometry budget class. Older
214
+ // callers may still put the geometry role directly in `reference.role`.
215
+ role: options.role ?? reference.archetype ?? reference.role ?? 'boulder',
216
+ ...(!explicitBudgets && exactLevelCount === 0
217
+ && Number.isFinite(Number(reference.targetTriangles))
218
+ ? { targetTriangles: Number(reference.targetTriangles) }
219
+ : {}),
220
+ });
221
+ }
222
+
223
+ /** Returns actual triangle targets for a measured LOD0 mesh. */
224
+ export function createRockLodTriangleTargets(lod0Triangles, roleOrPolicy = 'boulder') {
225
+ const policy = resolveReferenceRockLodPolicy(roleOrPolicy);
226
+ const base = finiteInteger(lod0Triangles, 1, { min: 1 });
227
+ return Object.freeze(policy.ratios.map((ratio, level) => Object.freeze({
228
+ level,
229
+ ratio,
230
+ triangleBudget: policy.triangleBudgets[level],
231
+ targetTriangles: level === 0
232
+ ? Math.min(base, policy.triangleBudgets[0])
233
+ : Math.min(Math.max(Math.round(base * ratio), 1), policy.triangleBudgets[level]),
234
+ })));
235
+ }