@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.
Files changed (205) hide show
  1. package/AGENTS.md +127 -4
  2. package/ATTRIBUTION.md +41 -3
  3. package/README.md +231 -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 +752 -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
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.