@call-me-sensei/toonlab 0.2.0 → 0.3.0

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 (205) hide show
  1. package/AGENTS.md +127 -4
  2. package/ATTRIBUTION.md +41 -3
  3. package/README.md +234 -34
  4. package/docs/characters.md +144 -0
  5. package/docs/debug-panel.md +126 -0
  6. package/docs/docs.css +589 -0
  7. package/docs/environment.md +186 -0
  8. package/docs/getting-started.md +180 -0
  9. package/docs/index.html +14 -0
  10. package/docs/lab-architecture.md +100 -0
  11. package/docs/lighting.md +825 -0
  12. package/docs/main.jsx +739 -0
  13. package/docs/mcp.md +97 -0
  14. package/docs/post-processing.md +98 -0
  15. package/docs/settings-reference.md +1878 -0
  16. package/docs/shader-constants.md +77 -0
  17. package/docs/sky.md +182 -0
  18. package/docs/style-labs.md +309 -0
  19. package/docs/texture-lab.md +135 -0
  20. package/docs/toon-shading.md +183 -0
  21. package/docs/tsl-conventions.md +167 -0
  22. package/docs/vegetation-sky.md +275 -0
  23. package/docs/water.md +430 -0
  24. package/docs/weather.md +200 -0
  25. package/docs/world-scale.md +111 -0
  26. package/mcp/server.mjs +610 -0
  27. package/mcp/style-lab-tools.mjs +371 -0
  28. package/mcp/vite-plugin.mjs +174 -0
  29. package/mcp/workspace.mjs +397 -0
  30. package/package.json +64 -5
  31. package/src/ambientfx/INTEGRATION.md +164 -0
  32. package/src/ambientfx/ambientFxPresets.js +83 -0
  33. package/src/ambientfx/ambientFxSettings.js +368 -0
  34. package/src/ambientfx/emitters.js +169 -0
  35. package/src/ambientfx/index.js +5 -0
  36. package/src/ambientfx/particleBackbone.js +493 -0
  37. package/src/ambientfx/stylizedAmbientFx.js +450 -0
  38. package/src/assetlib/ambientcg.js +117 -0
  39. package/src/assetlib/assetRef.js +91 -0
  40. package/src/assetlib/importedEntry.js +40 -0
  41. package/src/assetlib/index.js +23 -0
  42. package/src/assetlib/kaykit.js +192 -0
  43. package/src/assetlib/kaykitStaticIndex.js +700 -0
  44. package/src/assetlib/loadImported.js +143 -0
  45. package/src/assetlib/opensource3d.js +113 -0
  46. package/src/assetlib/polyhaven.js +182 -0
  47. package/src/assetlib/polypizza.js +115 -0
  48. package/src/assetlib/smithsonian.js +214 -0
  49. package/src/assetlib/sources.js +279 -0
  50. package/src/assetlib/zip.js +58 -0
  51. package/src/biome/biomeGenerator.js +385 -0
  52. package/src/biome/biomeRuntime.js +299 -0
  53. package/src/biome/index.js +2 -0
  54. package/src/buildinggen/buildingAsset.js +44 -0
  55. package/src/buildinggen/buildingGrammar.js +311 -0
  56. package/src/buildinggen/buildingMesh.js +451 -0
  57. package/src/buildinggen/buildingPresets.js +46 -0
  58. package/src/buildinggen/buildingRecipe.js +100 -0
  59. package/src/buildinggen/buildingSettings.js +238 -0
  60. package/src/buildinggen/index.js +6 -0
  61. package/src/camera/cameraDirector.js +157 -0
  62. package/src/camera/cameraGenerator.js +367 -0
  63. package/src/camera/cameraRig.js +570 -0
  64. package/src/camera/cameraSettings.js +236 -0
  65. package/src/camera/index.js +7 -0
  66. package/src/catalog/builtinEntries.js +245 -0
  67. package/src/catalog/catalog.js +210 -0
  68. package/src/catalog/index.js +3 -0
  69. package/src/catalog/manifest.js +84 -0
  70. package/src/core/generation.js +529 -0
  71. package/src/environment/environmentRigs.js +21 -1
  72. package/src/environment/environmentSettings.js +4 -0
  73. package/src/environment/environmentSunShadowPass.js +8 -0
  74. package/src/fauna/INTEGRATION.md +174 -0
  75. package/src/fauna/boids.js +861 -0
  76. package/src/fauna/faunaBodies.js +492 -0
  77. package/src/fauna/faunaPresets.js +52 -0
  78. package/src/fauna/faunaSettings.js +525 -0
  79. package/src/fauna/index.js +5 -0
  80. package/src/fauna/stylizedFauna.js +395 -0
  81. package/src/game-feel/gameFeelGenerator.js +402 -0
  82. package/src/game-feel/gameFeelRuntime.js +549 -0
  83. package/src/game-feel/index.js +2 -0
  84. package/src/index.js +17 -6
  85. package/src/lighting/colorIntensity.js +177 -0
  86. package/src/lighting/index.js +161 -0
  87. package/src/lighting/lightDescriptors.js +249 -0
  88. package/src/lighting/lightingCapabilities.js +79 -0
  89. package/src/lighting/lightingDocuments.js +247 -0
  90. package/src/lighting/lightingFixtures.js +446 -0
  91. package/src/lighting/lightingGenerator.js +449 -0
  92. package/src/lighting/lightingPresets.js +319 -0
  93. package/src/lighting/lightingRuntime.js +723 -0
  94. package/src/lighting/lightingStyle.js +386 -0
  95. package/src/lighting/lightingSystem.js +774 -0
  96. package/src/lighting/unrealExport.js +186 -0
  97. package/src/lighting/utils.js +87 -0
  98. package/src/motion/index.js +5 -0
  99. package/src/motion/motionClip.js +441 -0
  100. package/src/motion/motionController.js +628 -0
  101. package/src/motion/motionDocuments.js +225 -0
  102. package/src/motion/motionGraph.js +307 -0
  103. package/src/motion/motionSettings.js +222 -0
  104. package/src/pathgen/index.js +7 -0
  105. package/src/pathgen/pathBridge.js +232 -0
  106. package/src/pathgen/pathPresets.js +35 -0
  107. package/src/pathgen/pathRibbon.js +410 -0
  108. package/src/pathgen/pathRouter.js +380 -0
  109. package/src/pathgen/pathSettings.js +335 -0
  110. package/src/pathgen/pathTextures.js +123 -0
  111. package/src/pathgen/stylizedPaths.js +453 -0
  112. package/src/post/index.js +1 -0
  113. package/src/post/postGenerator.js +177 -0
  114. package/src/post/postProcessing.js +41 -0
  115. package/src/propgen/generatorsWave1.js +379 -0
  116. package/src/propgen/generatorsWave2.js +462 -0
  117. package/src/propgen/index.js +5 -0
  118. package/src/propgen/propAsset.js +323 -0
  119. package/src/propgen/propParts.js +170 -0
  120. package/src/propgen/propPlacement.js +459 -0
  121. package/src/propgen/propPresets.js +82 -0
  122. package/src/propgen/propSettings.js +395 -0
  123. package/src/shaders-tsl/chunks/projected-water-caustics.js +242 -0
  124. package/src/shaders-tsl/chunks/vegetation-style.js +360 -0
  125. package/src/shaders-tsl/chunks/water-shore-state.js +31 -0
  126. package/src/shaders-tsl/chunks/water-waves.js +90 -11
  127. package/src/shaders-tsl/environment.js +15 -1
  128. package/src/shaders-tsl/flower.js +279 -30
  129. package/src/shaders-tsl/grass.js +60 -33
  130. package/src/shaders-tsl/sky.js +125 -31
  131. package/src/shaders-tsl/tree-leaf.js +61 -25
  132. package/src/shaders-tsl/water-breaker.js +7 -4
  133. package/src/shaders-tsl/water-shore-state-simulation.js +523 -0
  134. package/src/shaders-tsl/water.js +439 -49
  135. package/src/shaders-tsl/woody-surface.js +154 -0
  136. package/src/sky/sceneOverrideLayers.js +10 -0
  137. package/src/sky/skyQuality.js +26 -0
  138. package/src/sky/stylizedSky.js +753 -45
  139. package/src/soundscape/index.js +4 -0
  140. package/src/soundscape/soundscapeGenerator.js +179 -0
  141. package/src/soundscape/soundscapeRuntime.js +806 -0
  142. package/src/soundscape/soundscapeSettings.js +292 -0
  143. package/src/styles/index.js +13 -0
  144. package/src/styles/styleBundle.js +325 -0
  145. package/src/stylizedTerrain.js +32 -2
  146. package/src/stylizedWorld.js +423 -20
  147. package/src/texgen/evaluateTexture.js +675 -0
  148. package/src/texgen/index.js +60 -0
  149. package/src/texgen/noise2.js +210 -0
  150. package/src/texgen/textureAi.js +436 -0
  151. package/src/texgen/textureGenerators.js +516 -0
  152. package/src/texgen/texturePresets.js +490 -0
  153. package/src/texgen/textureSettings.js +342 -0
  154. package/src/texgen/textureThree.js +59 -0
  155. package/src/vegetation/flowerSpecies.js +15 -3
  156. package/src/vegetation/grassPalettes.js +153 -0
  157. package/src/vegetation/index.js +6 -0
  158. package/src/vegetation/stylizedBush.js +2 -0
  159. package/src/vegetation/stylizedFlower.js +82 -0
  160. package/src/vegetation/stylizedFlowers.js +48 -7
  161. package/src/vegetation/stylizedForest.js +29 -1
  162. package/src/vegetation/stylizedGrass.js +291 -56
  163. package/src/vegetation/stylizedTree.js +38 -2
  164. package/src/vegetation/stylizedTreeFoliage.js +2 -1
  165. package/src/vegetation/vegetationShaders.js +1110 -0
  166. package/src/vfxgen/INTEGRATION.md +145 -0
  167. package/src/vfxgen/core/burstBackbone.js +380 -0
  168. package/src/vfxgen/core/projectileCore.js +92 -0
  169. package/src/vfxgen/core/spriteShapes.js +98 -0
  170. package/src/vfxgen/core/trailRibbon.js +272 -0
  171. package/src/vfxgen/core/vfxRandom.js +29 -0
  172. package/src/vfxgen/effects/emitHelpers.js +37 -0
  173. package/src/vfxgen/effects/magicEffects.js +162 -0
  174. package/src/vfxgen/effects/movementEffects.js +87 -0
  175. package/src/vfxgen/effects/weaponEffects.js +118 -0
  176. package/src/vfxgen/index.js +18 -0
  177. package/src/vfxgen/moves/moveController.js +146 -0
  178. package/src/vfxgen/moves/moveLibrary.js +335 -0
  179. package/src/vfxgen/vfxPresets.js +98 -0
  180. package/src/vfxgen/vfxSettings.js +384 -0
  181. package/src/vfxgen/vfxSystem.js +449 -0
  182. package/src/vfxgen/weapons/stylizedWeapons.js +137 -0
  183. package/src/villagegen/index.js +4 -0
  184. package/src/villagegen/stylizedVillage.js +490 -0
  185. package/src/villagegen/villageArchetypes.js +160 -0
  186. package/src/villagegen/villageNames.js +40 -0
  187. package/src/villagegen/villageSites.js +105 -0
  188. package/src/water/sceneOverrideLayers.js +23 -0
  189. package/src/water/water.js +5 -0
  190. package/src/water/waterBreakerSystem.js +15 -1
  191. package/src/water/waterCurrentField.js +447 -0
  192. package/src/water/waterMaterial.js +12 -0
  193. package/src/water/waterNearshorePhase.js +320 -0
  194. package/src/water/waterScenePasses.js +83 -30
  195. package/src/water/waterSettings.js +325 -13
  196. package/src/water/waterShoreMaterial.js +322 -0
  197. package/src/water/waterShoreStateField.js +605 -0
  198. package/src/water/waterSurface.js +797 -28
  199. package/src/weather/index.js +6 -0
  200. package/src/weather/weatherPrecipitation.js +221 -0
  201. package/src/weather/weatherPresets.js +258 -0
  202. package/src/weather/weatherSettings.js +269 -0
  203. package/src/weather/weatherSystem.js +871 -0
  204. package/src/worldMinimap.js +62 -0
  205. package/src/worldPresets.js +4 -1
@@ -0,0 +1,111 @@
1
+ # World scale and world presets
2
+
3
+ ToonLab uses **1 world unit = 1 meter** everywhere: rocks, trees, grass,
4
+ water, characters, fog distances, and camera planes. Every generator's
5
+ defaults are authored at *asset-lab scale* — one tree or rock filling the
6
+ frame at a 3–15 m camera. An open-world gameplay camera reads the world at
7
+ 50–160 m, and at that range asset-lab values read wrong: default-size trees
8
+ and ankle-height grass disappear, while flat-normal rocks go near-black. Sky
9
+ dome vertices are pinned to the camera far plane, so its compatibility
10
+ `radius` does not participate in world-scale tuning.
11
+
12
+ The pieces that must agree at a given scale:
13
+
14
+ | System | Asset-lab default | Outdoor gameplay scale |
15
+ |---|---|---|
16
+ | Camera | any | `near 0.3`, `far 600`, `fov 45` |
17
+ | Trees (`size`, 1 ≈ 3 m) | 1.7–2.0 (≈ 5–6 m) | 2.5–4 (≈ 8–12 m) |
18
+ | Grass blades | 0.16–0.42 m | 0.35–0.7 m, wider blades |
19
+ | Rock meshing | `hero`-ish, shape-preset normals | `gameplayHigh` (gradient normals — flat facets read near-black at range) |
20
+ | Height fog | interior-scale density (0.006+) | 0.002, falloff 9 |
21
+
22
+ ## World presets
23
+
24
+ `resolveWorldPreset(name)` (root import) returns one named starting point
25
+ that couples all of the above as plain data the host spreads into each
26
+ system. Built-in: `outdoorGameplay`. Register your own with
27
+ `registerWorldPreset`; list them with `getWorldPresetOptions`.
28
+
29
+ ```js
30
+ import { resolveWorldPreset } from '@call-me-sensei/toonlab';
31
+
32
+ const world = resolveWorldPreset('outdoorGameplay');
33
+
34
+ const camera = new THREE.PerspectiveCamera(
35
+ world.camera.fov, aspect, world.camera.near, world.camera.far);
36
+
37
+ const sky = new StylizedSky({ preset: world.sky.preset, ...world.sky.settings });
38
+ const water = new WaterSurface({ preset: world.water.preset, width: 400, depth: 400 });
39
+
40
+ const rock = resolveRockgenPreset(world.rocks.preset);
41
+ rock.meshing = { ...rock.meshing, ...resolveRockgenQuality(world.rocks.quality) };
42
+
43
+ await applyEnvironmentShader(root, {
44
+ ...resolveEnvironmentPreset(world.environment.preset),
45
+ ...world.environment.overrides,
46
+ });
47
+ ```
48
+
49
+ Every cluster reference in a world preset points at a named cluster preset
50
+ (`call_me_sensei` by default), so re-tuning the studio look in one cluster
51
+ flows through automatically.
52
+
53
+ ## Rock quality tiers
54
+
55
+ `resolveRockgenQuality(name)` couples meshing resolution and normal mode per
56
+ viewing context (`ROCKGEN_QUALITY_PRESETS` / `ROCKGEN_QUALITY_LEVELS`):
57
+
58
+ | Tier | Preview / export res | Normals | For |
59
+ |---|---|---|---|
60
+ | `hero` | 128 / 288 | `flat` (faceted) | Close-up set pieces (< 20 m) |
61
+ | `gameplayHigh` | 96 / 224 | `gradient` | 50–160 m gameplay cameras |
62
+ | `mobile` | 56 / 128, LODs off | `gradient` | Low-end targets |
63
+
64
+ ```js
65
+ const preset = resolveRockgenPreset('call_me_sensei');
66
+ preset.meshing = { ...preset.meshing, ...resolveRockgenQuality('gameplayHigh') };
67
+ ```
68
+
69
+ ## Distribution helpers
70
+
71
+ `@call-me-sensei/toonlab/vegetation` exports deterministic, dependency-free
72
+ scatter helpers so hosts stop authoring placement logic by hand. All of them
73
+ take a `heightAt(x, z)` terrain sampler (placements land at y = 0 without
74
+ one) and an optional `mask`:
75
+
76
+ ```js
77
+ import {
78
+ scatterForest,
79
+ scatterGrassAround,
80
+ scatterInRect,
81
+ createSlopeMask,
82
+ createWaterMask,
83
+ combineMasks,
84
+ } from '@call-me-sensei/toonlab/vegetation';
85
+
86
+ const mask = combineMasks(
87
+ createSlopeMask({ heightAt, maxSlope: 0.6 }), // rise/run; 0.6 ≈ 31°
88
+ createWaterMask({ heightAt, waterLevel: waterY, margin: 0.2 }),
89
+ );
90
+
91
+ // Trees: jittered grid — predictable density, no unnatural clumps, and a
92
+ // deterministic per-tree seed for silhouette variation.
93
+ for (const p of scatterForest({ center, radius: 120, spacing: 9, keepChance: 0.85, seed: 1, heightAt, mask })) {
94
+ const tree = new StylizedTree({ preset: 'call_me_sensei', seed: p.seed, size: 3.2 });
95
+ tree.position.set(p.x, p.y, p.z);
96
+ scene.add(tree);
97
+ }
98
+
99
+ // Grass: density-based disc (blades per m²), so the same call reads
100
+ // correctly at any radius.
101
+ const grass = new StylizedGrassField({
102
+ placements: scatterGrassAround({ center, radius: 45, density: 6, seed: 1, heightAt, mask }),
103
+ });
104
+
105
+ // Generic rectangle scatter with minimum spacing (rocks, debris, props):
106
+ const rockSpots = scatterInRect({ min, max, count: 24, minSpacing: 6, seed: 2, heightAt, mask });
107
+ ```
108
+
109
+ Same seed, same inputs → same world, so captures and multiplayer stay
110
+ deterministic. The world presets carry recommended scatter parameters per
111
+ scale (`world.trees.scatter`, `world.grass.scatter`).