@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
package/docs/mcp.md
ADDED
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
# Local MCP and `.toonlab` workspace
|
|
2
|
+
|
|
3
|
+
The open-source ToonLab server is a local [Model Context Protocol](https://modelcontextprotocol.io/)
|
|
4
|
+
server that lets coding agents use the same assets and recipes as the browser
|
|
5
|
+
labs. It uses the stdio transport and does not require a ToonLab account,
|
|
6
|
+
OAuth, or a hosted service.
|
|
7
|
+
|
|
8
|
+
## Start and connect
|
|
9
|
+
|
|
10
|
+
```bash
|
|
11
|
+
npm install
|
|
12
|
+
npm run dev
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
Open `http://localhost:5175/settings/` and copy the generated JSON into your
|
|
16
|
+
client's local MCP configuration. The paths are absolute so the client can
|
|
17
|
+
start the server from any working directory.
|
|
18
|
+
|
|
19
|
+
You can also start the server directly:
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
npm run mcp -- --workspace /absolute/path/to/project/.toonlab
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
When installed from npm, the package exposes the `toonlab-mcp` binary:
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
npx -y @call-me-sensei/toonlab@latest --workspace /absolute/path/to/project/.toonlab
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
## Workspace layout
|
|
32
|
+
|
|
33
|
+
`.toonlab/` is the local source of truth and is ignored by Git by default.
|
|
34
|
+
|
|
35
|
+
```text
|
|
36
|
+
.toonlab/
|
|
37
|
+
assets/ # project-owned asset files
|
|
38
|
+
creations/ # MCP-created recipes and documents
|
|
39
|
+
exports/ # copies of files exported from browser labs
|
|
40
|
+
imports/ # downloaded CC0 bundles and attribution manifests
|
|
41
|
+
library/entries/ # catalog entries saved from any lab
|
|
42
|
+
presets/ # portable preset files
|
|
43
|
+
storage/ # browser lab documents mirrored as JSON
|
|
44
|
+
toonlab.json # workspace version and migration markers
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
Existing ToonLab `localStorage` and IndexedDB catalog data is imported the
|
|
48
|
+
first time the local Vite server sees it. After that, disk wins at startup and
|
|
49
|
+
browser changes are mirrored back to disk. The current synchronous lab stores
|
|
50
|
+
therefore keep working without hiding data from MCP.
|
|
51
|
+
|
|
52
|
+
Provider API keys are intentionally excluded from the workspace. They remain
|
|
53
|
+
in browser storage and are never made available to MCP.
|
|
54
|
+
|
|
55
|
+
## Tools
|
|
56
|
+
|
|
57
|
+
The OSS server currently exposes:
|
|
58
|
+
|
|
59
|
+
- `get_workspace_info` — workspace path, version, and migration status.
|
|
60
|
+
- `search_assets` / `get_asset` — built-in procedural catalog, saved library,
|
|
61
|
+
lab documents, presets, imports, and exports.
|
|
62
|
+
- `list_my_creations` / `get_my_creation` / `save_creation` — direct local
|
|
63
|
+
project persistence.
|
|
64
|
+
- `generate_asset` — deterministic seeded recipes from built-in catalog
|
|
65
|
+
entries, saved into `.toonlab/creations` by default.
|
|
66
|
+
- `search_cc0_assets` / `get_cc0_asset` / `import_cc0_asset` — public CC0
|
|
67
|
+
models, textures, and HDRIs from Poly Haven and ambientCG, including source
|
|
68
|
+
and attribution metadata.
|
|
69
|
+
- `get_generation_capabilities` — a machine-readable description of what is
|
|
70
|
+
local versus hosted-Pro functionality.
|
|
71
|
+
- `list_style_labs` — the seven open-ended style generators, browser paths,
|
|
72
|
+
npm runtime imports, extension families, and generation capabilities.
|
|
73
|
+
- `create_style_recipe` — create and optionally save a portable Post, Camera,
|
|
74
|
+
Motion, UI Theme, Biome, Soundscape, or Game Feel generator recipe.
|
|
75
|
+
- `generate_style_presets` — resolve and validate one to 64 deterministic
|
|
76
|
+
runtime presets from any style recipe; consecutive seeds make large design
|
|
77
|
+
searches efficient without a fixed catalog.
|
|
78
|
+
- `validate_style_document` — validate a generator recipe or resolved preset
|
|
79
|
+
against the selected lab schema.
|
|
80
|
+
|
|
81
|
+
The server also exposes assets as `toonlab://asset/...` MCP resources. Small
|
|
82
|
+
JSON/text files and binaries can be read inline; every disk file includes an
|
|
83
|
+
absolute path so local development tools can consume larger files directly.
|
|
84
|
+
|
|
85
|
+
Style generation is a design-time workflow. Labs and MCP author recipes and
|
|
86
|
+
resolve candidates; the `@call-me-sensei/toonlab/*` npm subpaths own the
|
|
87
|
+
shipping runtime that applies the selected flat preset. See
|
|
88
|
+
[Generative style labs](style-labs.md) for the shared recipe contract and all
|
|
89
|
+
seven runtime APIs.
|
|
90
|
+
|
|
91
|
+
## OSS and Pro boundary
|
|
92
|
+
|
|
93
|
+
Open source owns the local workflow: disk persistence, procedural generation,
|
|
94
|
+
CC0 discovery/import, and stdio MCP. ToonLab Pro can use the same conceptual
|
|
95
|
+
tool schemas with cloud adapters, adding remote Streamable HTTP + OAuth,
|
|
96
|
+
private cloud libraries, cross-device/team sync, and managed image/3D
|
|
97
|
+
generation providers.
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
# Post-processing
|
|
2
|
+
|
|
3
|
+
An optional single-pipeline compositor (`@call-me-sensei/toonlab/post`). Disabled by
|
|
4
|
+
default — the character shader stays responsible for face quality, and raw
|
|
5
|
+
shader output remains easy to evaluate. When disabled, the pipeline renders
|
|
6
|
+
the scene straight through with zero overhead.
|
|
7
|
+
|
|
8
|
+
The compositor targets the TSL renderer stack. Native WebGPU is the default;
|
|
9
|
+
`?renderer=webgl` exercises the WebGL2 fallback through the same node graph.
|
|
10
|
+
|
|
11
|
+
## Pipeline
|
|
12
|
+
|
|
13
|
+
```js
|
|
14
|
+
import { createPostProcessingPipeline } from '@call-me-sensei/toonlab/post';
|
|
15
|
+
|
|
16
|
+
const post = createPostProcessingPipeline({
|
|
17
|
+
renderer, scene, camera,
|
|
18
|
+
settings: { preset: 'softAnime' },
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
// render loop — replaces renderer.render(scene, camera):
|
|
22
|
+
post.render(delta);
|
|
23
|
+
|
|
24
|
+
// on resize:
|
|
25
|
+
post.setSize(window.innerWidth, window.innerHeight, window.devicePixelRatio);
|
|
26
|
+
|
|
27
|
+
// live re-tune:
|
|
28
|
+
post.setSettings({ features: { bloom: true }, parameters: { bloomStrength: 0.35 } });
|
|
29
|
+
|
|
30
|
+
// character-aware bloom (mask from createCharacterRenderPasses):
|
|
31
|
+
post.setCharacterMask(passes.characterMaskTexture);
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
(Inside this repo the labs import from `../../src/post/...`.)
|
|
35
|
+
|
|
36
|
+
The pipeline renders the scene into a color+depth target and composites in
|
|
37
|
+
one screen pass. `post.enabled` and `post.settings` are live getters;
|
|
38
|
+
`isPostProcessingEnabled(settings)` answers the same question for a plain
|
|
39
|
+
settings object.
|
|
40
|
+
|
|
41
|
+
## Features and parameters
|
|
42
|
+
|
|
43
|
+
Settings are `{ preset, features, parameters }`, normalized by
|
|
44
|
+
`createPostProcessingSettings(options)`. Features (all `false` by default):
|
|
45
|
+
|
|
46
|
+
| Feature | Parameters |
|
|
47
|
+
|---|---|
|
|
48
|
+
| `bloom` | `bloomStrength/Threshold/Radius`, `bloomMode` (`'single'` one-pass 9-tap, or `'pyramid'` dual-filter mip chain + `bloomLevels`), character-aware `bloomCharacterBoost` / `bloomBackgroundSuppress` |
|
|
49
|
+
| `colorGrade` | `exposure`, `contrast`, `saturation`, `warmth`, plus the LUT: `lutMap` (2D-strip texture), `lutSize`, `lutStrength` |
|
|
50
|
+
| `verticalGrade` | `topLight`, `bottomDark` |
|
|
51
|
+
| `vignette` | `vignetteStrength/Radius/Softness` |
|
|
52
|
+
| `screenOutline` | `outlineStrength`, `outlineDepthStrength`, `outlineLumaStrength`, `outlineColor` |
|
|
53
|
+
| `depthCue` | `depthCueStrength/Near/Far`, `depthCueColor` — distance haze tint |
|
|
54
|
+
| `motionBlur` | `motionBlurStrength` — camera-reprojection blur (camera movement only; there is no per-bone velocity buffer) |
|
|
55
|
+
| `enabled` | master switch; `strength` scales the whole composite |
|
|
56
|
+
|
|
57
|
+
All 37 fields with ranges and defaults:
|
|
58
|
+
[settings reference](settings-reference.md#post-processing)
|
|
59
|
+
(`POST_PROCESSING_SETTING_GROUPS` / `POST_PROCESSING_SETTING_FIELD_SCHEMA`).
|
|
60
|
+
`lutMap` is a runtime texture object and is not JSON-serializable.
|
|
61
|
+
|
|
62
|
+
## Presets and preset documents
|
|
63
|
+
|
|
64
|
+
Built-ins in `POST_PROCESSING_PRESETS`: `off`, `custom`, `softAnime` (subtle
|
|
65
|
+
presentation grade), `call_me_sensei` (studio-managed signature grade,
|
|
66
|
+
updated over releases), `showcase` (feature tour with demo values), and
|
|
67
|
+
`debugEdges` (outline diagnosis). Select with
|
|
68
|
+
`createPostProcessingSettings({ preset: 'softAnime' })`, or in the labs
|
|
69
|
+
`?post=1&postPreset=softAnime` (`?postAdvanced=1` exposes the raw controls).
|
|
70
|
+
|
|
71
|
+
Register your own, in code or as a versioned JSON document
|
|
72
|
+
(`toonlab/post-processing-preset`), matching the toon/water/environment
|
|
73
|
+
preset document pattern:
|
|
74
|
+
|
|
75
|
+
```js
|
|
76
|
+
import {
|
|
77
|
+
registerPostProcessingPreset,
|
|
78
|
+
createPostProcessingPresetDocument,
|
|
79
|
+
validatePostProcessingPresetDocument,
|
|
80
|
+
getPostProcessingPresetOptions,
|
|
81
|
+
} from '@call-me-sensei/toonlab/post';
|
|
82
|
+
|
|
83
|
+
registerPostProcessingPreset('filmicNight', {
|
|
84
|
+
label: 'Filmic Night',
|
|
85
|
+
features: { bloom: true, colorGrade: true, vignette: true },
|
|
86
|
+
parameters: { bloomStrength: 0.4, warmth: -0.08, vignetteStrength: 0.3 },
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
const document = createPostProcessingPresetDocument('filmicNight');
|
|
90
|
+
// share JSON.stringify(document); load elsewhere:
|
|
91
|
+
const result = validatePostProcessingPresetDocument(document);
|
|
92
|
+
if (result.ok) registerPostProcessingPreset(result.value.id, result.value, { overwrite: true });
|
|
93
|
+
|
|
94
|
+
getPostProcessingPresetOptions(); // [{ id, label, description }] for HUDs
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
`sanitizePostProcessingPresetSettings` clamps and filters a raw settings
|
|
98
|
+
object against the schema.
|