@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,174 @@
1
+ # Fauna cluster — integration diffs
2
+
3
+ The fauna cluster (`src/fauna/`) is self-contained; these are the EXACT
4
+ changes to shared files needed to publish it. Nothing else is required —
5
+ `examples/fauna-demo/` already runs today because it imports the cluster
6
+ relatively.
7
+
8
+ ## 1. `package.json` — exports entry
9
+
10
+ Insert after the `"./pathgen"` line:
11
+
12
+ ```json
13
+ "./fauna": "./src/fauna/index.js",
14
+ ```
15
+
16
+ ## 2. `vite.config.js` — alias
17
+
18
+ Add `'fauna'` to the subpath array (order within the array is irrelevant;
19
+ subpaths must stay before the bare root entry, which the array already
20
+ guarantees):
21
+
22
+ ```js
23
+ ...['toon', 'environment', 'water', 'vegetation', 'sky', 'post', 'rockgen',
24
+ 'debrisgen', 'pathgen', 'texgen', 'character', 'loaders', 'debug', 'fauna'].map((subpath) => ({
25
+ ```
26
+
27
+ Optionally add the demo to `build.rollupOptions.input`:
28
+
29
+ ```js
30
+ faunaDemo: resolve(__dirname, 'examples/fauna-demo/index.html'),
31
+ ```
32
+
33
+ After the alias lands, switch the demo import in `examples/fauna-demo/main.js`
34
+ from the relative path to the public specifier:
35
+
36
+ ```js
37
+ // before
38
+ import { createFauna } from '../../src/fauna/index.js';
39
+ // after
40
+ import { createFauna } from '@call-me-sensei/toonlab/fauna';
41
+ ```
42
+
43
+ ## 3. `src/index.js` — root export
44
+
45
+ Append:
46
+
47
+ ```js
48
+ export * from './fauna/index.js';
49
+ ```
50
+
51
+ (No name collisions: the cluster's exports are all `Fauna`/`fauna`-prefixed
52
+ except `createFauna`, `buildBird/Butterfly/Dragonfly/FishGeometry`,
53
+ `hashCombine` — none exist in the current root surface. `hashCombine` is
54
+ generic; if the root ever grows another, re-export the fauna one under an
55
+ alias instead.)
56
+
57
+ ## 4. `src/stylizedWorld.js` — `createStylizedWorld({ fauna })` wiring sketch
58
+
59
+ Add `fauna = false` to the options object, then after the forest block
60
+ (where `heightFogParams` and `environmentBox` are in scope):
61
+
62
+ ```js
63
+ import { createFauna } from './fauna/index.js';
64
+
65
+ // options: fauna = false,
66
+ let faunaSystem = null;
67
+ if (fauna) {
68
+ const faunaOptions = cleanObject(fauna);
69
+ faunaSystem = createFauna({
70
+ bounds: { x: width / 2 - 10, z: depth / 2 - 10 },
71
+ followTarget,
72
+ heightAt,
73
+ masks: { flowers: faunaOptions.flowerMask ?? masks?.vegetation ?? null },
74
+ preset: faunaOptions.preset ?? worldPreset.fauna?.preset ?? null,
75
+ seed: faunaOptions.seed ?? 1,
76
+ settings: faunaOptions.settings ?? {},
77
+ species: faunaOptions.species ?? {},
78
+ waterLevel: earlyWaterLevel,
79
+ });
80
+ // Same height-fog layer terrain/water/forest get — birds that skip it
81
+ // stay sharp saturated specks on hazed mountains.
82
+ faunaSystem.setDistanceFog({
83
+ color: heightFogParams.heightFogColor ?? [0.66, 0.8, 0.94],
84
+ density: Number(heightFogParams.heightFogDensity) || 0.0016,
85
+ falloff: Number(heightFogParams.heightFogFalloff) || 400,
86
+ floorY: environmentBox.min.y,
87
+ });
88
+ scene.add(faunaSystem.root);
89
+ }
90
+ ```
91
+
92
+ In `applyCloudShadow`: add `faunaSystem?.setCloudShadow(field);`
93
+ In `update(delta)`: add `faunaSystem?.update(delta);`
94
+ In `dispose()`: add `faunaSystem?.dispose();`
95
+ In the returned object: add `fauna: faunaSystem,`.
96
+
97
+ ## 5. `scripts/generate-settings-reference.mjs` — MODULES entry
98
+
99
+ ```js
100
+ {
101
+ title: 'Fauna',
102
+ subpath: 'toonlab/fauna',
103
+ module: '/src/fauna/faunaSettings.js',
104
+ groups: 'FAUNA_SETTING_GROUPS',
105
+ schema: 'FAUNA_SETTING_FIELD_SCHEMA',
106
+ note: 'Settings are nested per species group: `createFauna({ settings: { birds: { fleeRadius: 15 } } })`. Populations are passed separately: `createFauna({ species: { birds: 40, fish: 80 } })`.',
107
+ },
108
+ ```
109
+
110
+ ## 6. `package.json` — scripts entry
111
+
112
+ ```json
113
+ "verify:fauna": "node scripts/verify-fauna.mjs",
114
+ ```
115
+
116
+ ## 7. `AGENTS.md`
117
+
118
+ In "Subpath imports", extend the list: add `` `/fauna` `` after
119
+ `` `/pathgen` ``, and append to the root-adds list: `createFauna`.
120
+
121
+ Add one budget line under "Quality rules" (or beside the grass/tree budget
122
+ bullet):
123
+
124
+ ```
125
+ - Ambient fauna: `createFauna({ seed, heightAt, waterLevel, bounds, followTarget, species: { birds: 40, butterflies: 60, fish: 80 } })` —
126
+ one InstancedMesh per species-variant, steering staggered to ≤ 1/4 of
127
+ agents per frame, ≤ 1 ms CPU at defaults; birds cast NO shadows; fish get
128
+ `waterReflectionExclude` (refraction is how they're seen — never
129
+ `waterExclude`); airborne species get `waterGrabExclude`; everything joins
130
+ height fog via `fauna.setDistanceFog(...)`. Register roosts with
131
+ `fauna.addPerchPoints(points)`. URL-toggle populations per species when
132
+ perf-triaging.
133
+ ```
134
+
135
+ ## 8. `examples/outdoor-world/main.js` — demo wiring with URL toggles
136
+
137
+ Import:
138
+
139
+ ```js
140
+ import { createFauna } from '@call-me-sensei/toonlab/fauna';
141
+ ```
142
+
143
+ After `createStylizedWorld(...)` resolves (so `world.masks` exists), before
144
+ the render loop:
145
+
146
+ ```js
147
+ // ?birds=0&butterflies=0&fish=0 — per-species perf triage per AGENTS.md.
148
+ const faunaParams = new URLSearchParams(location.search);
149
+ const faunaCount = (key, fallback) => {
150
+ const value = Number.parseInt(faunaParams.get(key) ?? '', 10);
151
+ return Number.isFinite(value) ? value : fallback;
152
+ };
153
+ const fauna = createFauna({
154
+ bounds: WORLD.bounds,
155
+ followTarget: characterRoot,
156
+ heightAt,
157
+ masks: { flowers: world.masks?.vegetation ?? null },
158
+ seed: WORLD.seed,
159
+ species: {
160
+ birds: faunaCount('birds', 40),
161
+ butterflies: faunaCount('butterflies', 60),
162
+ dragonflies: faunaCount('dragonflies', 12),
163
+ fish: faunaCount('fish', 80),
164
+ },
165
+ waterLevel: WORLD.waterLevel,
166
+ });
167
+ fauna.setDistanceFog({ color: [0.63, 0.8, 0.98], density: 0.0014, falloff: 400, floorY: -30 });
168
+ fauna.setCloudShadow({ strength: 0.3 });
169
+ scene.add(fauna.root);
170
+ ```
171
+
172
+ In the frame loop: `fauna.update(delta);`
173
+ Once rocks are placed, register roosts: `fauna.addPerchPoints(rockTops)`
174
+ (any `[{ x, y, z }]`).