@call-me-sensei/toonlab 0.4.21 → 0.4.23

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 (129) hide show
  1. package/NPM-LIBRARY.md +87 -27
  2. package/README.md +11 -10
  3. package/agents/PROMPTS.md +17 -3
  4. package/agents/README.md +13 -3
  5. package/agents/claude/CLAUDE.md +3 -0
  6. package/agents/codex/AGENTS.md +112 -159
  7. package/agents/cursor/toonlab.mdc +7 -3
  8. package/agents/examples/game-foundation.mjs +104 -0
  9. package/agents/references/game-lifecycle.md +57 -0
  10. package/agents/references/runtime-entry-points.md +26 -0
  11. package/agents/references/style-bundles.md +4 -1
  12. package/agents/skills/claude/asset-sourcing/SKILL.md +7 -4
  13. package/agents/skills/claude/environment/SKILL.md +4 -0
  14. package/agents/skills/claude/game-dev/SKILL.md +63 -87
  15. package/agents/skills/claude/lighting/SKILL.md +36 -0
  16. package/agents/skills/claude/post-processing/SKILL.md +8 -3
  17. package/agents/skills/claude/rock-ground-shaders/SKILL.md +10 -15
  18. package/agents/skills/claude/rockgen/SKILL.md +52 -21
  19. package/agents/skills/claude/scene-style-application/SKILL.md +4 -0
  20. package/agents/skills/claude/style-presets/SKILL.md +11 -8
  21. package/agents/skills/claude/toon-shading/SKILL.md +4 -0
  22. package/agents/skills/claude/vegetation-sky/SKILL.md +13 -7
  23. package/agents/skills/claude/visual-verification/SKILL.md +45 -119
  24. package/agents/skills/claude/water/SKILL.md +6 -2
  25. package/agents/skills/codex/asset-sourcing/SKILL.md +7 -4
  26. package/agents/skills/codex/environment/SKILL.md +4 -0
  27. package/agents/skills/codex/game-dev/SKILL.md +63 -87
  28. package/agents/skills/codex/lighting/SKILL.md +36 -0
  29. package/agents/skills/codex/post-processing/SKILL.md +8 -3
  30. package/agents/skills/codex/rock-ground-shaders/SKILL.md +10 -15
  31. package/agents/skills/codex/rockgen/SKILL.md +52 -21
  32. package/agents/skills/codex/scene-style-application/SKILL.md +4 -0
  33. package/agents/skills/codex/style-presets/SKILL.md +11 -8
  34. package/agents/skills/codex/toon-shading/SKILL.md +4 -0
  35. package/agents/skills/codex/vegetation-sky/SKILL.md +13 -7
  36. package/agents/skills/codex/visual-verification/SKILL.md +45 -119
  37. package/agents/skills/codex/water/SKILL.md +6 -2
  38. package/database/apply-one-catalog-seed.mjs +63 -0
  39. package/database/providers.mjs +1 -0
  40. package/database/seeds/catalog/0005_2026-08-c8-first12.sql +1101 -0
  41. package/database/seeds/catalog/0006_2026-09-c8-first100.sql +14245 -0
  42. package/database/seeds/catalog/0007_2026-09-c8-first100-primary-model.sql +14845 -0
  43. package/mcp/lab-management.mjs +11 -8
  44. package/mcp/public-catalog.mjs +0 -16
  45. package/mcp/tree-lab-contract.mjs +2381 -0
  46. package/mcp/vite-plugin.mjs +5 -1
  47. package/package.json +29 -18
  48. package/src/catalog/officialCatalog.js +1 -0
  49. package/src/catalog/officialCatalogAssetRuntime.js +98 -1
  50. package/src/catalog/officialCatalogLod.js +160 -16
  51. package/src/catalog/officialCatalogPlacement.js +52 -12
  52. package/src/catalog/officialCatalogProvider.js +79 -8
  53. package/src/catalog/officialCatalogRockPackage.js +172 -0
  54. package/src/cloud/cloudReprojection.js +40 -7
  55. package/src/cloud/cloudVolume.js +44 -7
  56. package/src/cloud/noise/baseShapeVolume.js +8 -6
  57. package/src/cloud/noise/cirrusMap.js +2 -1
  58. package/src/cloud/noise/curlNoise.js +2 -1
  59. package/src/cloud/noise/erosionVolume.js +2 -1
  60. package/src/cloud/noise/textureCache.js +77 -0
  61. package/src/cloud/noise/weatherMap.js +2 -1
  62. package/src/core/sha256.js +83 -0
  63. package/src/ground-shader/groundShaderMaterial.js +12 -3
  64. package/src/rock-shader/rockMaterial.js +205 -28
  65. package/src/rock-shader/rockShaderRuntime.js +17 -1
  66. package/src/rock-shader/rockShaderSettings.js +16 -0
  67. package/src/rockgen/index.js +9 -0
  68. package/src/rockgen/lod/index.js +1 -0
  69. package/src/rockgen/lod/rockDenseFieldPolicy.js +143 -0
  70. package/src/rockgen/rockDocument.js +899 -35
  71. package/src/rockgen/surface/c7GeologySurface.js +39 -9
  72. package/src/rockgen/surface/naturalRockSurface.js +1948 -0
  73. package/src/shaders-tsl/chunks/projected-water-caustics.js +14 -2
  74. package/src/shaders-tsl/chunks/water-foam.js +6 -6
  75. package/src/shaders-tsl/chunks/water-lighting.js +28 -5
  76. package/src/shaders-tsl/chunks/water-shore-state.js +5 -2
  77. package/src/shaders-tsl/chunks/water-waves.js +10 -5
  78. package/src/shaders-tsl/flower.js +7 -4
  79. package/src/shaders-tsl/grass.js +4 -3
  80. package/src/shaders-tsl/water-shore-state-simulation.js +3 -2
  81. package/src/shaders-tsl/water.js +209 -41
  82. package/src/sky/skySystem.js +30 -7
  83. package/src/toon/settings/perspectiveRemovalSettings.js +1 -1
  84. package/src/toon/toonSettings.js +74 -0
  85. package/src/vegetation/stylizedFlower.js +6 -0
  86. package/src/version.js +1 -1
  87. package/src/water/waterDetailSpectrum.js +91 -0
  88. package/src/water/waterDynamics.js +422 -0
  89. package/src/water/waterFoamParticles.js +196 -0
  90. package/src/water/waterFoamTexture.js +57 -0
  91. package/src/water/waterHydrodynamics.js +209 -0
  92. package/src/water/waterMaterial.js +1 -0
  93. package/src/water/waterRenderExtension.js +107 -0
  94. package/src/water/waterScenePasses.js +14 -6
  95. package/src/water/waterSettings.js +53 -26
  96. package/src/water/waterShoreMaterial.js +38 -14
  97. package/src/water/waterSpectralOcean.js +137 -0
  98. package/src/water/waterStageSettings.js +19 -1
  99. package/src/water/waterSurface.js +62 -18
  100. package/src/water/waterUnderwaterAtmosphere.js +30 -3
  101. package/types/catalog/officialCatalog.d.ts +1 -0
  102. package/types/catalog/officialCatalogPlacement.d.ts +4 -0
  103. package/types/catalog/officialCatalogRockPackage.d.ts +68 -0
  104. package/types/cloud/noise/baseShapeVolume.d.ts +1 -1
  105. package/types/cloud/noise/textureCache.d.ts +12 -0
  106. package/types/core/sha256.d.ts +2 -0
  107. package/types/index.d.ts +30 -0
  108. package/types/rock-shader/rockMaterial.d.ts +3 -0
  109. package/types/rock-shader/rockShaderSettings.d.ts +2 -0
  110. package/types/rockgen/index.d.ts +1 -0
  111. package/types/rockgen/lod/index.d.ts +1 -0
  112. package/types/rockgen/lod/rockDenseFieldPolicy.d.ts +181 -0
  113. package/types/rockgen/rockDocument.d.ts +654 -71
  114. package/types/rockgen/surface/naturalRockSurface.d.ts +100 -0
  115. package/types/shaders-tsl/chunks/projected-water-caustics.d.ts +7 -1
  116. package/types/shaders-tsl/chunks/water-lighting.d.ts +4 -3
  117. package/types/shaders-tsl/water.d.ts +2 -1
  118. package/types/version.d.ts +1 -1
  119. package/types/water/waterDetailSpectrum.d.ts +13 -0
  120. package/types/water/waterDynamics.d.ts +89 -0
  121. package/types/water/waterFoamParticles.d.ts +32 -0
  122. package/types/water/waterFoamTexture.d.ts +1 -0
  123. package/types/water/waterHydrodynamics.d.ts +49 -0
  124. package/types/water/waterRenderExtension.d.ts +16 -0
  125. package/types/water/waterScenePasses.d.ts +1 -1
  126. package/types/water/waterSettings.d.ts +1 -0
  127. package/types/water/waterSpectralOcean.d.ts +17 -0
  128. package/types/water/waterStageSettings.d.ts +1 -1
  129. package/types/water/waterUnderwaterAtmosphere.d.ts +19 -4
@@ -39,11 +39,7 @@ import {
39
39
  createToonPresetDocument,
40
40
  TOON_SETTING_FIELD_SCHEMA,
41
41
  } from '../src/toon/index.js';
42
- import {
43
- recipeFromSettings,
44
- TREE_SETTING_DEFAULTS,
45
- TREE_SETTING_FIELD_SCHEMA,
46
- } from '../src/vegetation/treeRecipe.js';
42
+ import { treeContract } from './tree-lab-contract.mjs';
47
43
  import {
48
44
  createVegetationShaderScopePresetDocument,
49
45
  getVegetationShaderScopeFieldSchema,
@@ -100,7 +96,7 @@ const STARTER_DOCUMENTS = Object.freeze({
100
96
  'cloud-shader': createSkyParamsDocument(STARTER_ID, { label: STARTER_LABEL }),
101
97
  'sky-cloud': createSkyParamsDocument(STARTER_ID, { label: STARTER_LABEL }),
102
98
  rock: createRockDocument({ name: STARTER_LABEL, preset: 'boulder', seed: 0, style: 'default' }),
103
- tree: Object.assign(recipeFromSettings(TREE_SETTING_DEFAULTS), { id: STARTER_ID, label: STARTER_LABEL }),
99
+ tree: Object.assign(structuredClone(treeContract.starter), { id: STARTER_ID, label: STARTER_LABEL }),
104
100
  grass: createGrassPresetDocument(STARTER_ID, { label: STARTER_LABEL }),
105
101
  texture: Object.assign(createTextureRecipeDocument(undefined, { name: STARTER_LABEL }), { id: STARTER_ID }),
106
102
  });
@@ -306,7 +302,7 @@ const FEATURE_SCHEMAS = Object.freeze({
306
302
  'sky-cloud': Object.freeze(Object.fromEntries(['cloud', 'noise', 'sun', 'time']
307
303
  .flatMap((key) => SKY_PARAMS_FIELD_SCHEMA[key] ? [[key, SKY_PARAMS_FIELD_SCHEMA[key]]] : []))),
308
304
  rock: ROCKGEN_SETTING_FIELD_SCHEMA,
309
- tree: TREE_SETTING_FIELD_SCHEMA,
305
+ tree: treeContract.fields,
310
306
  grass: GRASS_SETTING_FIELD_SCHEMA,
311
307
  texture: TEXTURE_SETTING_FIELD_SCHEMA,
312
308
  });
@@ -384,6 +380,7 @@ export function createRockCatalogStartDocument(source, options = {}) {
384
380
  const variationIndex = Math.max(0, Math.round(Number(options.variation) || 0));
385
381
  const variationSeed = hash32(`${sourceId}:${variationIndex}`);
386
382
  const label = String(options.label ?? source.label ?? source.name ?? sourceId).trim();
383
+ const surfacePackage = sourceValue(source, 'surfacePackage');
387
384
  const document = createRockDocument({
388
385
  name: label,
389
386
  preset: 'boulder',
@@ -395,7 +392,8 @@ export function createRockCatalogStartDocument(source, options = {}) {
395
392
  role: Array.isArray(source.tags) ? String(source.tags[0] ?? 'rock') : 'rock',
396
393
  series: String(sourceValue(source, 'releaseWave') ?? ''),
397
394
  sourceMode: 'mesh-template',
398
- surfaceMode: 'source',
395
+ surfaceMode: surfacePackage ? 'generated' : 'source',
396
+ surfacePackage: surfacePackage ? structuredClone(surfacePackage) : null,
399
397
  topFinish: 'source',
400
398
  variation: Math.min(Math.max(Number(options.strength ?? 0.3) || 0, 0), 1),
401
399
  variationSeed,
@@ -403,6 +401,9 @@ export function createRockCatalogStartDocument(source, options = {}) {
403
401
  seed: variationSeed,
404
402
  style: 'call_me_sensei',
405
403
  });
404
+ if (surfacePackage && !document.reference?.surfacePackage) {
405
+ throw new Error("Catalog source has an invalid realistic surface recipe.");
406
+ }
406
407
  Object.assign(document.surface, {
407
408
  lichenCoverage: 0,
408
409
  mossCoverage: 0,
@@ -561,11 +562,13 @@ function applyRockOperation(document, operation, args) {
561
562
  `Rock mesh edits are limited to ${ROCKGEN_MAX_MESH_EDIT_OPERATIONS} operations and ${ROCKGEN_MAX_MESH_EDIT_DELTAS} vertex deltas per portable project.`,
562
563
  );
563
564
  }
565
+ next.reference.meshOperationOrder.push({ type: 'sculpt', index: next.reference.meshEdits.length });
564
566
  next.reference.meshEdits.push(edit);
565
567
  bumpDocumentRevision(next);
566
568
  } else if (operation === 'clear_mesh_edits') {
567
569
  if (next.reference?.sourceMode !== 'mesh-template') throw new Error('Mesh edits require a source-mesh rock project.');
568
570
  next.reference.meshEdits = [];
571
+ next.reference.meshOperationOrder = next.reference.meshOperationOrder.filter((entry) => entry.type !== 'sculpt');
569
572
  bumpDocumentRevision(next);
570
573
  } else if (operation === 'set_source') {
571
574
  return deserializeRockDocument(createRockCatalogStartDocument(args.source ?? args.value, args));
@@ -2,7 +2,6 @@
2
2
  // stable public domains only; repository-only generators and pre-beta systems
3
3
  // are never pulled into the npm tarball through the MCP dependency graph.
4
4
 
5
- import { BUILT_IN_DEBRIS_PRESETS } from '../src/debrisgen/debrisPresets.js';
6
5
  import { POST_PROCESSING_PRESETS } from '../src/post/postProcessing.js';
7
6
  import { getRockgenPresetOptions } from '../src/rockgen/rockgenPresets.js';
8
7
  import { getSkyPresetOptions } from '../src/sky/stylizedSky.js';
@@ -49,21 +48,6 @@ export function publicMcpCatalogEntries() {
49
48
  }));
50
49
  }
51
50
 
52
- for (const preset of BUILT_IN_DEBRIS_PRESETS) {
53
- const id = `debris/${slug(preset.id)}`;
54
- entries.push(entry({
55
- cluster: 'debrisgen',
56
- description: preset.description,
57
- id,
58
- kind: 'recipe',
59
- label: preset.label,
60
- recipe: { schema: 'debrisSettings', settings: preset.settings, version: 1 },
61
- spawn: 'createDebrisAsset(entry.recipe.settings)',
62
- tags: ['debris', preset.type, slug(preset.variant)],
63
- thumbnail: thumbnailFor(id),
64
- }));
65
- }
66
-
67
51
  for (const option of getWaterPresetOptions()) {
68
52
  entries.push(entry({
69
53
  cluster: 'water',