@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.
- package/AGENTS.md +127 -4
- package/ATTRIBUTION.md +41 -3
- package/README.md +234 -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 +739 -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,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`).
|