@call-me-sensei/toonlab 0.2.0 → 0.3.1
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.
- package/AGENTS.md +127 -4
- package/ATTRIBUTION.md +41 -3
- package/README.md +231 -34
- package/docs/characters.md +144 -0
- package/docs/debug-panel.md +126 -0
- package/docs/docs.css +589 -0
- package/docs/environment.md +186 -0
- package/docs/getting-started.md +180 -0
- package/docs/index.html +14 -0
- package/docs/lab-architecture.md +100 -0
- package/docs/lighting.md +825 -0
- package/docs/main.jsx +752 -0
- package/docs/mcp.md +97 -0
- package/docs/post-processing.md +98 -0
- package/docs/settings-reference.md +1878 -0
- package/docs/shader-constants.md +77 -0
- package/docs/sky.md +182 -0
- package/docs/style-labs.md +309 -0
- package/docs/texture-lab.md +135 -0
- package/docs/toon-shading.md +183 -0
- package/docs/tsl-conventions.md +167 -0
- package/docs/vegetation-sky.md +275 -0
- package/docs/water.md +430 -0
- package/docs/weather.md +200 -0
- package/docs/world-scale.md +111 -0
- package/mcp/server.mjs +610 -0
- package/mcp/style-lab-tools.mjs +371 -0
- package/mcp/vite-plugin.mjs +174 -0
- package/mcp/workspace.mjs +397 -0
- package/package.json +64 -5
- package/src/ambientfx/INTEGRATION.md +164 -0
- package/src/ambientfx/ambientFxPresets.js +83 -0
- package/src/ambientfx/ambientFxSettings.js +368 -0
- package/src/ambientfx/emitters.js +169 -0
- package/src/ambientfx/index.js +5 -0
- package/src/ambientfx/particleBackbone.js +493 -0
- package/src/ambientfx/stylizedAmbientFx.js +450 -0
- package/src/assetlib/ambientcg.js +117 -0
- package/src/assetlib/assetRef.js +91 -0
- package/src/assetlib/importedEntry.js +40 -0
- package/src/assetlib/index.js +23 -0
- package/src/assetlib/kaykit.js +192 -0
- package/src/assetlib/kaykitStaticIndex.js +700 -0
- package/src/assetlib/loadImported.js +143 -0
- package/src/assetlib/opensource3d.js +113 -0
- package/src/assetlib/polyhaven.js +182 -0
- package/src/assetlib/polypizza.js +115 -0
- package/src/assetlib/smithsonian.js +214 -0
- package/src/assetlib/sources.js +279 -0
- package/src/assetlib/zip.js +58 -0
- package/src/biome/biomeGenerator.js +385 -0
- package/src/biome/biomeRuntime.js +299 -0
- package/src/biome/index.js +2 -0
- package/src/buildinggen/buildingAsset.js +44 -0
- package/src/buildinggen/buildingGrammar.js +311 -0
- package/src/buildinggen/buildingMesh.js +451 -0
- package/src/buildinggen/buildingPresets.js +46 -0
- package/src/buildinggen/buildingRecipe.js +100 -0
- package/src/buildinggen/buildingSettings.js +238 -0
- package/src/buildinggen/index.js +6 -0
- package/src/camera/cameraDirector.js +157 -0
- package/src/camera/cameraGenerator.js +367 -0
- package/src/camera/cameraRig.js +570 -0
- package/src/camera/cameraSettings.js +236 -0
- package/src/camera/index.js +7 -0
- package/src/catalog/builtinEntries.js +245 -0
- package/src/catalog/catalog.js +210 -0
- package/src/catalog/index.js +3 -0
- package/src/catalog/manifest.js +84 -0
- package/src/core/generation.js +529 -0
- package/src/environment/environmentRigs.js +21 -1
- package/src/environment/environmentSettings.js +4 -0
- package/src/environment/environmentSunShadowPass.js +8 -0
- package/src/fauna/INTEGRATION.md +174 -0
- package/src/fauna/boids.js +861 -0
- package/src/fauna/faunaBodies.js +492 -0
- package/src/fauna/faunaPresets.js +52 -0
- package/src/fauna/faunaSettings.js +525 -0
- package/src/fauna/index.js +5 -0
- package/src/fauna/stylizedFauna.js +395 -0
- package/src/game-feel/gameFeelGenerator.js +402 -0
- package/src/game-feel/gameFeelRuntime.js +549 -0
- package/src/game-feel/index.js +2 -0
- package/src/index.js +17 -6
- package/src/lighting/colorIntensity.js +177 -0
- package/src/lighting/index.js +161 -0
- package/src/lighting/lightDescriptors.js +249 -0
- package/src/lighting/lightingCapabilities.js +79 -0
- package/src/lighting/lightingDocuments.js +247 -0
- package/src/lighting/lightingFixtures.js +446 -0
- package/src/lighting/lightingGenerator.js +449 -0
- package/src/lighting/lightingPresets.js +319 -0
- package/src/lighting/lightingRuntime.js +723 -0
- package/src/lighting/lightingStyle.js +386 -0
- package/src/lighting/lightingSystem.js +774 -0
- package/src/lighting/unrealExport.js +186 -0
- package/src/lighting/utils.js +87 -0
- package/src/motion/index.js +5 -0
- package/src/motion/motionClip.js +441 -0
- package/src/motion/motionController.js +628 -0
- package/src/motion/motionDocuments.js +225 -0
- package/src/motion/motionGraph.js +307 -0
- package/src/motion/motionSettings.js +222 -0
- package/src/pathgen/index.js +7 -0
- package/src/pathgen/pathBridge.js +232 -0
- package/src/pathgen/pathPresets.js +35 -0
- package/src/pathgen/pathRibbon.js +410 -0
- package/src/pathgen/pathRouter.js +380 -0
- package/src/pathgen/pathSettings.js +335 -0
- package/src/pathgen/pathTextures.js +123 -0
- package/src/pathgen/stylizedPaths.js +453 -0
- package/src/post/index.js +1 -0
- package/src/post/postGenerator.js +177 -0
- package/src/post/postProcessing.js +41 -0
- package/src/propgen/generatorsWave1.js +379 -0
- package/src/propgen/generatorsWave2.js +462 -0
- package/src/propgen/index.js +5 -0
- package/src/propgen/propAsset.js +323 -0
- package/src/propgen/propParts.js +170 -0
- package/src/propgen/propPlacement.js +459 -0
- package/src/propgen/propPresets.js +82 -0
- package/src/propgen/propSettings.js +395 -0
- package/src/shaders-tsl/chunks/projected-water-caustics.js +242 -0
- package/src/shaders-tsl/chunks/vegetation-style.js +360 -0
- package/src/shaders-tsl/chunks/water-shore-state.js +31 -0
- package/src/shaders-tsl/chunks/water-waves.js +90 -11
- package/src/shaders-tsl/environment.js +15 -1
- package/src/shaders-tsl/flower.js +279 -30
- package/src/shaders-tsl/grass.js +60 -33
- package/src/shaders-tsl/sky.js +125 -31
- package/src/shaders-tsl/tree-leaf.js +61 -25
- package/src/shaders-tsl/water-breaker.js +7 -4
- package/src/shaders-tsl/water-shore-state-simulation.js +523 -0
- package/src/shaders-tsl/water.js +439 -49
- package/src/shaders-tsl/woody-surface.js +154 -0
- package/src/sky/sceneOverrideLayers.js +10 -0
- package/src/sky/skyQuality.js +26 -0
- package/src/sky/stylizedSky.js +753 -45
- package/src/soundscape/index.js +4 -0
- package/src/soundscape/soundscapeGenerator.js +179 -0
- package/src/soundscape/soundscapeRuntime.js +806 -0
- package/src/soundscape/soundscapeSettings.js +292 -0
- package/src/styles/index.js +13 -0
- package/src/styles/styleBundle.js +325 -0
- package/src/stylizedTerrain.js +32 -2
- package/src/stylizedWorld.js +423 -20
- package/src/texgen/evaluateTexture.js +675 -0
- package/src/texgen/index.js +60 -0
- package/src/texgen/noise2.js +210 -0
- package/src/texgen/textureAi.js +436 -0
- package/src/texgen/textureGenerators.js +516 -0
- package/src/texgen/texturePresets.js +490 -0
- package/src/texgen/textureSettings.js +342 -0
- package/src/texgen/textureThree.js +59 -0
- package/src/vegetation/flowerSpecies.js +15 -3
- package/src/vegetation/grassPalettes.js +153 -0
- package/src/vegetation/index.js +6 -0
- package/src/vegetation/stylizedBush.js +2 -0
- package/src/vegetation/stylizedFlower.js +82 -0
- package/src/vegetation/stylizedFlowers.js +48 -7
- package/src/vegetation/stylizedForest.js +29 -1
- package/src/vegetation/stylizedGrass.js +291 -56
- package/src/vegetation/stylizedTree.js +38 -2
- package/src/vegetation/stylizedTreeFoliage.js +2 -1
- package/src/vegetation/vegetationShaders.js +1110 -0
- package/src/vfxgen/INTEGRATION.md +145 -0
- package/src/vfxgen/core/burstBackbone.js +380 -0
- package/src/vfxgen/core/projectileCore.js +92 -0
- package/src/vfxgen/core/spriteShapes.js +98 -0
- package/src/vfxgen/core/trailRibbon.js +272 -0
- package/src/vfxgen/core/vfxRandom.js +29 -0
- package/src/vfxgen/effects/emitHelpers.js +37 -0
- package/src/vfxgen/effects/magicEffects.js +162 -0
- package/src/vfxgen/effects/movementEffects.js +87 -0
- package/src/vfxgen/effects/weaponEffects.js +118 -0
- package/src/vfxgen/index.js +18 -0
- package/src/vfxgen/moves/moveController.js +146 -0
- package/src/vfxgen/moves/moveLibrary.js +335 -0
- package/src/vfxgen/vfxPresets.js +98 -0
- package/src/vfxgen/vfxSettings.js +384 -0
- package/src/vfxgen/vfxSystem.js +449 -0
- package/src/vfxgen/weapons/stylizedWeapons.js +137 -0
- package/src/villagegen/index.js +4 -0
- package/src/villagegen/stylizedVillage.js +490 -0
- package/src/villagegen/villageArchetypes.js +160 -0
- package/src/villagegen/villageNames.js +40 -0
- package/src/villagegen/villageSites.js +105 -0
- package/src/water/sceneOverrideLayers.js +23 -0
- package/src/water/water.js +5 -0
- package/src/water/waterBreakerSystem.js +15 -1
- package/src/water/waterCurrentField.js +447 -0
- package/src/water/waterMaterial.js +12 -0
- package/src/water/waterNearshorePhase.js +320 -0
- package/src/water/waterScenePasses.js +83 -30
- package/src/water/waterSettings.js +325 -13
- package/src/water/waterShoreMaterial.js +322 -0
- package/src/water/waterShoreStateField.js +605 -0
- package/src/water/waterSurface.js +797 -28
- package/src/weather/index.js +6 -0
- package/src/weather/weatherPrecipitation.js +221 -0
- package/src/weather/weatherPresets.js +258 -0
- package/src/weather/weatherSettings.js +269 -0
- package/src/weather/weatherSystem.js +871 -0
- package/src/worldMinimap.js +62 -0
- 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 }]`).
|