@call-me-sensei/toonlab 0.4.19 → 0.4.21

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 (123) hide show
  1. package/NPM-LIBRARY.md +230 -0
  2. package/README.md +78 -36
  3. package/agents/PROMPTS.md +91 -0
  4. package/agents/README.md +9 -14
  5. package/agents/claude/CLAUDE.md +8 -0
  6. package/agents/codex/AGENTS.md +161 -0
  7. package/agents/cursor/toonlab.mdc +37 -0
  8. package/agents/references/mcp-asset-discovery.md +12 -9
  9. package/agents/references/runtime-entry-points.md +5 -4
  10. package/agents/skills/claude/asset-sourcing/SKILL.md +9 -6
  11. package/agents/skills/claude/rock-ground-shaders/SKILL.md +16 -0
  12. package/agents/skills/claude/vegetation-sky/SKILL.md +7 -4
  13. package/agents/skills/codex/asset-sourcing/SKILL.md +9 -6
  14. package/agents/skills/codex/rock-ground-shaders/SKILL.md +16 -0
  15. package/agents/skills/codex/vegetation-sky/SKILL.md +7 -4
  16. package/cli/toonlab.mjs +3 -2
  17. package/database/fal-patina.mjs +131 -0
  18. package/database/generation-service.mjs +108 -7
  19. package/database/migrations/0007_creation_revisions.sql +80 -0
  20. package/database/migrations/0008_creation_revision_hardening.sql +98 -0
  21. package/database/migrations/0009_creation_revision_delete_integrity.sql +11 -0
  22. package/database/migrations/0010_external_catalog_assets.sql +28 -0
  23. package/database/providers.mjs +195 -16
  24. package/database/repository.mjs +518 -70
  25. package/database/seeds/catalog/0003_2026-08-open-assets.sql +159086 -0
  26. package/database/seeds/catalog/0004_2026-08-c7-rocks.sql +39405 -0
  27. package/mcp/public-catalog.mjs +4 -52
  28. package/mcp/server.mjs +175 -12
  29. package/mcp/vite-plugin.mjs +78 -2
  30. package/package.json +32 -12
  31. package/scripts/generate-catalog-seed.mjs +34 -7
  32. package/src/asset-policy/catalogLicenses.js +64 -6
  33. package/src/assetlib/loadImported.js +15 -1
  34. package/src/catalog/officialCatalogAssetRuntime.js +13 -2
  35. package/src/catalog/officialCatalogLod.js +34 -1
  36. package/src/catalog/officialCatalogPlacement.js +29 -14
  37. package/src/character/animationRetarget.js +2 -0
  38. package/src/character/characterRig.js +6 -1
  39. package/src/character/characterRuntime.js +175 -7
  40. package/src/environment/environmentMaterialAdapter.js +30 -0
  41. package/src/environment/environmentPresets.js +90 -0
  42. package/src/environment/environmentSunShadowPass.js +42 -0
  43. package/src/environment/toonLabSurfaceLighting.js +108 -10
  44. package/src/environment/urbanPropMaterial.js +104 -2
  45. package/src/lighting/lightingSystem.js +65 -10
  46. package/src/renderer/index.js +7 -0
  47. package/src/renderer/styleComparison.js +985 -0
  48. package/src/rock-shader/index.js +5 -0
  49. package/src/rock-shader/rockGeometryDetail.js +701 -0
  50. package/src/rock-shader/rockMaterial.js +782 -39
  51. package/src/rock-shader/rockRegionRuntime.js +185 -0
  52. package/src/rock-shader/rockSemanticMaterialRuntime.js +337 -0
  53. package/src/rock-shader/rockShaderRuntime.js +354 -67
  54. package/src/rock-shader/rockShaderSettings.js +246 -16
  55. package/src/rock-shader/rockTangentIntegrity.js +136 -0
  56. package/src/rock-shader/rockTextureIntegrity.js +115 -0
  57. package/src/rockgen/index.js +1 -0
  58. package/src/rockgen/rockDocument.js +27 -3
  59. package/src/rockgen/surface/c7GeologySurface.js +372 -0
  60. package/src/shaders-tsl/water.js +8 -0
  61. package/src/sky/cloudShadow.js +25 -1
  62. package/src/sky/skySystem.js +9 -0
  63. package/src/styles/index.js +23 -0
  64. package/src/styles/neutralStylePresets.js +712 -0
  65. package/src/styles/sceneStyleRuntime.js +51 -4
  66. package/src/styles/styleAdapters.js +13 -2
  67. package/src/styles/styleBundle.js +1 -1
  68. package/src/texgen/evaluateTexture.js +30 -3
  69. package/src/texgen/textureGenerators.js +63 -31
  70. package/src/texgen/textureSettings.js +25 -8
  71. package/src/toon/toonSettings.js +96 -2
  72. package/src/vegetation/branchTree.js +327 -42
  73. package/src/vegetation/index.js +24 -2
  74. package/src/vegetation/scatter.js +372 -1
  75. package/src/vegetation/stylizedTree.js +312 -126
  76. package/src/vegetation/stylizedTreeFoliage.js +229 -7
  77. package/src/vegetation/treeSurfaceTextures.js +328 -0
  78. package/src/version.js +1 -1
  79. package/src/water/waterSettings.js +15 -7
  80. package/types/asset-policy/catalogLicenses.d.ts +2 -0
  81. package/types/asset-policy/index.d.ts +2 -0
  82. package/types/assetlib/loadImported.d.ts +3 -1
  83. package/types/catalog/officialCatalogLod.d.ts +63 -5
  84. package/types/character/characterRig.d.ts +59 -0
  85. package/types/character/characterRuntime.d.ts +1 -0
  86. package/types/environment/environmentMaterialAdapter.d.ts +3 -1
  87. package/types/environment/toonLabSurfaceLighting.d.ts +20 -3
  88. package/types/index.d.ts +89 -7
  89. package/types/lighting/lightingSystem.d.ts +7 -0
  90. package/types/react/index.d.ts +20 -0
  91. package/types/renderer/index.d.ts +1 -0
  92. package/types/renderer/styleComparison.d.ts +409 -0
  93. package/types/rock-shader/index.d.ts +5 -0
  94. package/types/rock-shader/rockGeometryDetail.d.ts +300 -0
  95. package/types/rock-shader/rockMaterial.d.ts +3 -0
  96. package/types/rock-shader/rockRegionRuntime.d.ts +86 -0
  97. package/types/rock-shader/rockSemanticMaterialRuntime.d.ts +29 -0
  98. package/types/rock-shader/rockShaderRuntime.d.ts +2 -0
  99. package/types/rock-shader/rockShaderSettings.d.ts +19 -5
  100. package/types/rock-shader/rockTangentIntegrity.d.ts +51 -0
  101. package/types/rock-shader/rockTextureIntegrity.d.ts +61 -0
  102. package/types/rockgen/index.d.ts +1 -0
  103. package/types/rockgen/rockDocument.d.ts +29 -1
  104. package/types/rockgen/surface/c7GeologySurface.d.ts +8 -0
  105. package/types/sky/cloudShadow.d.ts +1 -0
  106. package/types/styles/index.d.ts +1 -0
  107. package/types/styles/neutralStylePresets.d.ts +944 -0
  108. package/types/styles/sceneStyleRuntime.d.ts +20 -0
  109. package/types/vegetation/branchTree.d.ts +4 -0
  110. package/types/vegetation/index.d.ts +9 -7
  111. package/types/vegetation/scatter.d.ts +1 -0
  112. package/types/vegetation/stylizedTree.d.ts +1 -2
  113. package/types/vegetation/stylizedTreeFoliage.d.ts +1 -0
  114. package/types/version.d.ts +1 -1
  115. package/agents/references/geology-playbook.md +0 -118
  116. package/agents/skills/claude/karst-cliff-construction/SKILL.md +0 -258
  117. package/agents/skills/claude/outdoor-world/SKILL.md +0 -492
  118. package/agents/skills/claude/outdoor-world/references/coastal-landform-formation.md +0 -100
  119. package/agents/skills/codex/karst-cliff-construction/SKILL.md +0 -258
  120. package/agents/skills/codex/outdoor-world/SKILL.md +0 -492
  121. package/agents/skills/codex/outdoor-world/references/coastal-landform-formation.md +0 -100
  122. package/src/vegetation/legacyTreePresets.js +0 -120
  123. package/types/vegetation/legacyTreePresets.d.ts +0 -22
@@ -597,6 +597,14 @@ export function createWaterSettings(options = {}) {
597
597
  const colorTone = resolveWaterColorToneName(source.colorTone ?? base.colorTone);
598
598
  // A chosen tone forces its palette (see WATER_COLOR_TONES).
599
599
  const tone = WATER_COLOR_TONES[colorTone];
600
+ // ...but only the *palette*. The tone's non-colour scalars (clarity
601
+ // distances, caustic/reflection/detail gains) are its recommended defaults,
602
+ // not a lock: an explicit caller value wins over them. Before this, passing
603
+ // `detailNormalStrength` or `reflectionStrength` alongside `colorTone:
604
+ // 'anime'` was silently inert, which is exactly what §6.4 of the launch spec
605
+ // asks for and could not get (D19-005). Callers that pass nothing are
606
+ // unaffected — they still resolve to the tone value, byte for byte.
607
+ const toneScalar = (key) => (source[key] === undefined ? tone[key] : source[key]);
600
608
 
601
609
  const quality = WATER_QUALITY_LEVELS.includes(String(source.quality).toLowerCase())
602
610
  ? String(source.quality).toLowerCase()
@@ -633,7 +641,7 @@ export function createWaterSettings(options = {}) {
633
641
  waveSetPeriod: clampedNumber(source.waveSetPeriod, base.waveSetPeriod, 8, 600),
634
642
  waveSetStrength: clampedNumber(source.waveSetStrength, base.waveSetStrength, 0, 1),
635
643
 
636
- detailNormalStrength: clampedNumber(tone.detailNormalStrength ?? source.detailNormalStrength, base.detailNormalStrength, 0, 2),
644
+ detailNormalStrength: clampedNumber(toneScalar('detailNormalStrength'), base.detailNormalStrength, 0, 2),
637
645
  detailScale: clampedNumber(source.detailScale, base.detailScale, 0.05, 12),
638
646
  flowDirection: vector2Array(source.flowDirection, base.flowDirection),
639
647
  flowSpeed: clampedNumber(source.flowSpeed, base.flowSpeed, 0, 8),
@@ -641,8 +649,8 @@ export function createWaterSettings(options = {}) {
641
649
  shallowColor: colorArray(tone.shallowColor ?? source.shallowColor, base.shallowColor),
642
650
  midColor: colorArray(tone.midColor ?? source.midColor, base.midColor),
643
651
  deepColor: colorArray(tone.deepColor ?? source.deepColor, base.deepColor),
644
- depthFadeDistance: clampedNumber(tone.depthFadeDistance ?? source.depthFadeDistance, base.depthFadeDistance, 0.01, 60),
645
- deepFadeDistance: clampedNumber(tone.deepFadeDistance ?? source.deepFadeDistance, base.deepFadeDistance, 0.01, 120),
652
+ depthFadeDistance: clampedNumber(toneScalar('depthFadeDistance'), base.depthFadeDistance, 0.01, 60),
653
+ deepFadeDistance: clampedNumber(toneScalar('deepFadeDistance'), base.deepFadeDistance, 0.01, 120),
646
654
  opacity: clampedNumber(source.opacity, base.opacity, 0, 1),
647
655
  refractionStrength: clampedNumber(source.refractionStrength, base.refractionStrength, 0, 3),
648
656
  indexOfRefraction: clampedNumber(
@@ -654,7 +662,7 @@ export function createWaterSettings(options = {}) {
654
662
  underwaterTintStrength: clampedNumber(
655
663
  source.underwaterTintStrength, base.underwaterTintStrength, 0, 1,
656
664
  ),
657
- causticsStrength: clampedNumber(tone.causticsStrength ?? source.causticsStrength, base.causticsStrength, 0, 4),
665
+ causticsStrength: clampedNumber(toneScalar('causticsStrength'), base.causticsStrength, 0, 4),
658
666
  causticsScale: clampedNumber(source.causticsScale, base.causticsScale, 0.02, 12),
659
667
  causticsSpeed: clampedNumber(source.causticsSpeed, base.causticsSpeed, 0, 8),
660
668
 
@@ -690,13 +698,13 @@ export function createWaterSettings(options = {}) {
690
698
  sceneShadowStrength: clampedNumber(source.sceneShadowStrength, base.sceneShadowStrength, 0, 1),
691
699
  fresnelStrength: clampedNumber(source.fresnelStrength, base.fresnelStrength, 0, 2),
692
700
  fresnelPower: clampedNumber(source.fresnelPower, base.fresnelPower, 0.5, 16),
693
- fresnelBias: clampedNumber(tone.fresnelBias ?? source.fresnelBias, base.fresnelBias, 0, 0.6),
701
+ fresnelBias: clampedNumber(toneScalar('fresnelBias'), base.fresnelBias, 0, 0.6),
694
702
  fresnelColor: colorArray(tone.fresnelColor ?? source.fresnelColor, base.fresnelColor),
695
703
  skyZenithColor: colorArray(source.skyZenithColor, base.skyZenithColor),
696
704
  skyHorizonColor: colorArray(source.skyHorizonColor, base.skyHorizonColor),
697
- reflectionStrength: clampedNumber(tone.reflectionStrength ?? source.reflectionStrength, base.reflectionStrength, 0, 1.5),
705
+ reflectionStrength: clampedNumber(toneScalar('reflectionStrength'), base.reflectionStrength, 0, 1.5),
698
706
  reflectionDistortion: clampedNumber(source.reflectionDistortion, base.reflectionDistortion, 0, 0.5),
699
- reflectionSoftness: clampedNumber(tone.reflectionSoftness ?? source.reflectionSoftness, base.reflectionSoftness, 0, 1),
707
+ reflectionSoftness: clampedNumber(toneScalar('reflectionSoftness'), base.reflectionSoftness, 0, 1),
700
708
 
701
709
  rippleStrength: clampedNumber(source.rippleStrength, base.rippleStrength, 0, 8),
702
710
  rippleDamping: clampedNumber(source.rippleDamping, base.rippleDamping, 0.8, 0.9995),
@@ -1,5 +1,7 @@
1
1
  // Source inference fallback: public names retained with permissive signatures.
2
2
  export const APPROVED_CATALOG_SPDX_LICENSES: any;
3
+ export const CATALOG_LICENSE_UNSPECIFIED: any;
3
4
  export const REVIEWED_CATALOG_LICENSES: any;
4
5
  export function assertCatalogLicenseRelease(...args: any[]): any;
6
+ export function describeCatalogLicense(...args: any[]): any;
5
7
  export function resolveCatalogLicense(...args: any[]): any;
@@ -7,11 +7,13 @@ export const ASSET_SOURCE_CLASSES: any;
7
7
  export const ASSET_SOURCING_POLICY_DOCUMENT_TYPE: any;
8
8
  export const ASSET_SOURCING_POLICY_SCHEMA_VERSION: any;
9
9
  export const CALL_ME_SENSEI_STRICT_ASSET_POLICY: any;
10
+ export const CATALOG_LICENSE_UNSPECIFIED: any;
10
11
  export const DEFAULT_ASSET_SOURCE_ORDER: any;
11
12
  export const REVIEWED_CATALOG_LICENSES: any;
12
13
  export function assertCatalogLicenseRelease(...args: any[]): any;
13
14
  export function createAssetGapRecord(...args: any[]): any;
14
15
  export function createAssetSourcingPolicy(...args: any[]): any;
16
+ export function describeCatalogLicense(...args: any[]): any;
15
17
  export function evaluateAssetCandidate(...args: any[]): any;
16
18
  export function renderAssetGapReport(...args: any[]): any;
17
19
  export function resolveCatalogLicense(...args: any[]): any;
@@ -5,10 +5,12 @@
5
5
  * LoadingManager URL modifier rewrites each request by suffix match, which
6
6
  * also covers URL-encoded variants.
7
7
  */
8
- export function loadImportedModel({ url, resources, dracoDecoderPath }: {
8
+ export function loadImportedModel({ url, resources, dracoDecoderPath, ktx2TranscoderPath, renderer, }: {
9
9
  url: any;
10
10
  resources?: {};
11
11
  dracoDecoderPath?: string;
12
+ ktx2TranscoderPath?: string;
13
+ renderer?: any;
12
14
  }): Promise<THREE.Group<THREE.Object3DEventMap>>;
13
15
  /**
14
16
  * PBR texture-set maps → a tiling MeshStandardMaterial. Prefers the packed
@@ -1,5 +1,63 @@
1
- // Source inference fallback: public names retained with permissive signatures.
2
- export function collectCatalogLodBindings(...args: any[]): any;
3
- export function createCatalogLodRuntime(...args: any[]): any;
4
- export function normalizeCatalogLodDistances(...args: any[]): any;
5
- export function selectCatalogLodLevel(...args: any[]): any;
1
+ import type { Camera, Mesh, Object3D } from 'three';
2
+
3
+ export interface CatalogLodBinding {
4
+ readonly level: number;
5
+ readonly mesh: Mesh;
6
+ readonly originalVisible: boolean;
7
+ }
8
+
9
+ export interface CatalogLodSelectionOptions {
10
+ readonly availableLevels?: readonly number[];
11
+ readonly distance?: number;
12
+ readonly distances?: readonly number[];
13
+ readonly maxLevel?: number;
14
+ readonly currentLevel?: number | null;
15
+ readonly hysteresis?: number;
16
+ }
17
+
18
+ export interface CatalogLodRuntimeOptions {
19
+ readonly distances?: readonly number[];
20
+ readonly hysteresis?: number;
21
+ readonly maxLevel?: number;
22
+ readonly namePattern?: RegExp;
23
+ }
24
+
25
+ export interface CatalogLodUpdateOptions {
26
+ readonly camera?: Camera | null;
27
+ readonly distance?: number | null;
28
+ }
29
+
30
+ export interface CatalogLodUpdateResult {
31
+ readonly changed: boolean;
32
+ readonly distance: number;
33
+ readonly level: number;
34
+ }
35
+
36
+ export interface CatalogLodRuntime {
37
+ readonly availableLevels: readonly number[];
38
+ readonly bindings: readonly Readonly<CatalogLodBinding>[];
39
+ readonly disposed: boolean;
40
+ readonly level: number | null;
41
+ readonly thresholds: readonly number[];
42
+ readonly hysteresis: number;
43
+ dispose(): void;
44
+ setLevel(level: number): boolean;
45
+ update(options?: CatalogLodUpdateOptions): Readonly<CatalogLodUpdateResult> | null;
46
+ }
47
+
48
+ export function collectCatalogLodBindings(
49
+ root: Object3D,
50
+ options?: Readonly<{ namePattern?: RegExp }>,
51
+ ): readonly Readonly<CatalogLodBinding>[];
52
+
53
+ export function normalizeCatalogLodDistances(
54
+ distances: readonly number[] | null | undefined,
55
+ levelCount?: number | null,
56
+ ): readonly number[];
57
+
58
+ export function selectCatalogLodLevel(options?: CatalogLodSelectionOptions): number | null;
59
+
60
+ export function createCatalogLodRuntime(
61
+ root: Object3D,
62
+ options?: CatalogLodRuntimeOptions,
63
+ ): Readonly<CatalogLodRuntime>;
@@ -9,6 +9,65 @@ export function resolveCharacterRig(targetMesh: any, { vrm }?: {
9
9
  };
10
10
  export function targetBoneNameForRole(rig: any, role: any): any;
11
11
  export function targetBoneNamesForRole(rig: any, role: any): any[];
12
+ /**
13
+ * The humanoid contract itself: role -> canonical Mixamo bone name. Exported so
14
+ * a host can audit a rig against it (which roles resolved, which are missing)
15
+ * rather than inferring the answer from a bone count.
16
+ */
17
+ export const MIXAMO_BONE_BY_ROLE: Readonly<{
18
+ hips: "mixamorigHips";
19
+ spine: "mixamorigSpine";
20
+ chest: "mixamorigSpine1";
21
+ upperChest: "mixamorigSpine2";
22
+ neck: "mixamorigNeck";
23
+ head: "mixamorigHead";
24
+ leftShoulder: "mixamorigLeftShoulder";
25
+ leftUpperArm: "mixamorigLeftArm";
26
+ leftLowerArm: "mixamorigLeftForeArm";
27
+ leftHand: "mixamorigLeftHand";
28
+ rightShoulder: "mixamorigRightShoulder";
29
+ rightUpperArm: "mixamorigRightArm";
30
+ rightLowerArm: "mixamorigRightForeArm";
31
+ rightHand: "mixamorigRightHand";
32
+ leftThumbMetacarpal: "mixamorigLeftHandThumb1";
33
+ leftThumbProximal: "mixamorigLeftHandThumb2";
34
+ leftThumbDistal: "mixamorigLeftHandThumb3";
35
+ leftIndexProximal: "mixamorigLeftHandIndex1";
36
+ leftIndexIntermediate: "mixamorigLeftHandIndex2";
37
+ leftIndexDistal: "mixamorigLeftHandIndex3";
38
+ leftMiddleProximal: "mixamorigLeftHandMiddle1";
39
+ leftMiddleIntermediate: "mixamorigLeftHandMiddle2";
40
+ leftMiddleDistal: "mixamorigLeftHandMiddle3";
41
+ leftRingProximal: "mixamorigLeftHandRing1";
42
+ leftRingIntermediate: "mixamorigLeftHandRing2";
43
+ leftRingDistal: "mixamorigLeftHandRing3";
44
+ leftLittleProximal: "mixamorigLeftHandPinky1";
45
+ leftLittleIntermediate: "mixamorigLeftHandPinky2";
46
+ leftLittleDistal: "mixamorigLeftHandPinky3";
47
+ rightThumbMetacarpal: "mixamorigRightHandThumb1";
48
+ rightThumbProximal: "mixamorigRightHandThumb2";
49
+ rightThumbDistal: "mixamorigRightHandThumb3";
50
+ rightIndexProximal: "mixamorigRightHandIndex1";
51
+ rightIndexIntermediate: "mixamorigRightHandIndex2";
52
+ rightIndexDistal: "mixamorigRightHandIndex3";
53
+ rightMiddleProximal: "mixamorigRightHandMiddle1";
54
+ rightMiddleIntermediate: "mixamorigRightHandMiddle2";
55
+ rightMiddleDistal: "mixamorigRightHandMiddle3";
56
+ rightRingProximal: "mixamorigRightHandRing1";
57
+ rightRingIntermediate: "mixamorigRightHandRing2";
58
+ rightRingDistal: "mixamorigRightHandRing3";
59
+ rightLittleProximal: "mixamorigRightHandPinky1";
60
+ rightLittleIntermediate: "mixamorigRightHandPinky2";
61
+ rightLittleDistal: "mixamorigRightHandPinky3";
62
+ leftUpperLeg: "mixamorigLeftUpLeg";
63
+ leftLowerLeg: "mixamorigLeftLeg";
64
+ leftFoot: "mixamorigLeftFoot";
65
+ leftToes: "mixamorigLeftToeBase";
66
+ rightUpperLeg: "mixamorigRightUpLeg";
67
+ rightLowerLeg: "mixamorigRightLeg";
68
+ rightFoot: "mixamorigRightFoot";
69
+ rightToes: "mixamorigRightToeBase";
70
+ }>;
12
71
  export const HUMANOID_ROLES: readonly string[];
13
72
  export const MIXAMO_CHAIN_CHILD: Readonly<{
14
73
  mixamorigLeftShoulder: "mixamorigLeftArm";
@@ -1,4 +1,5 @@
1
1
  // Source inference fallback: public names retained with permissive signatures.
2
+ export const CHARACTER_MATERIAL_MODES: any;
2
3
  export const CHARACTER_RUNTIME_STAGE: any;
3
4
  export const DEFAULT_CHARACTER_ANIMATION_ROLES: any;
4
5
  export function createCharacterRuntime(...args: any[]): any;
@@ -1,4 +1,4 @@
1
- export function applyEnvironmentShader(root: any, { assetId, bakeVertexAo, debugOutputMode, environmentBox, features, hasSun, materialLook, materialManifest, objectClass, parameters, preset, roleOverrides, scanStylize, scanStylizeParams, scenario, settings, shaderMode, openWindows, vertexAoOptions, }?: {
1
+ export function applyEnvironmentShader(root: any, { assetId, bakeVertexAo, debugOutputMode, environmentBox, features, hasSun, materialLook, materialManifest, objectClass, parameters, preset, roleOverrides, scanStylize, scanStylizeParams, scenario, settings, shaderMode, surfaceLighting, openWindows, vertexAoOptions, }?: {
2
2
  assetId?: string;
3
3
  bakeVertexAo?: string;
4
4
  debugOutputMode?: string;
@@ -16,12 +16,14 @@ export function applyEnvironmentShader(root: any, { assetId, bakeVertexAo, debug
16
16
  scenario?: any;
17
17
  settings?: {};
18
18
  shaderMode?: string;
19
+ surfaceLighting?: {};
19
20
  openWindows?: boolean;
20
21
  vertexAoOptions?: {};
21
22
  }): Promise<{
22
23
  aoOverlayMeshCount: number;
23
24
  classification: any[];
24
25
  convertedMeshCount: number;
26
+ surfaceLightingMaterialCount: number;
25
27
  manifestWarnings: any[];
26
28
  manufacturedAssetId: string;
27
29
  manufacturedObjectClass: any;
@@ -12,8 +12,9 @@ export function resolveToonLabSurfaceInputAdapter(inputAdapter?: "toonlab-stage"
12
12
  indirectNormalization: number;
13
13
  }>;
14
14
  /** CPU oracle for the diffuse-only direct/indirect input decomposition. */
15
- export function evaluateToonLabSurfaceDiffuseDecomposition({ brdfDiffuse, directInput, indirectInput, inputAdapter, nDotL, }?: {
15
+ export function evaluateToonLabSurfaceDiffuseDecomposition({ brdfDiffuse, directStrength, directInput, indirectInput, inputAdapter, nDotL, }?: {
16
16
  brdfDiffuse?: number[];
17
+ directStrength?: number;
17
18
  directInput?: number[];
18
19
  indirectInput?: number[];
19
20
  inputAdapter?: "toonlab-stage";
@@ -82,6 +83,7 @@ export const TOONLAB_SURFACE_LIGHTING_CONTRACT: Readonly<{
82
83
  directDiffuse: "radiance * BRDFData.diffuse (no 1/PI)";
83
84
  indirectDiffuse: "bakedGI * BRDFData.diffuse (no 1/PI)";
84
85
  directSpecular: "TOONLAB DirectBRDFSpecular optimized GGX";
86
+ shadowFill: "authored fraction of the sun retained where the package sun-shadow pass reports occlusion (0 = TOONLAB literal)";
85
87
  defaultInputAdapter: "toonlab-stage";
86
88
  inputNormalization: "direct radiance and cosine-convolved indirect irradiance are normalized independently";
87
89
  threeLightInputScaleInverse: number;
@@ -96,18 +98,30 @@ export const TOONLAB_SURFACE_LIGHTING_CONTRACT: Readonly<{
96
98
  }>;
97
99
  }>;
98
100
  export class ToonLabSurfaceLightingModel extends PhysicalLightingModel {
99
- constructor({ diffuseAlphaNode, indirectStrength, indirectTint, inputAdapter, perceptualRoughnessNode, specularF0Node, workflow, }?: {
101
+ constructor({ diffuseAlphaNode, directStrength, indirectStrength, indirectTint, indirectTintNode, indirectReplaceTintNode, indirectTintBlendNode, indirectTintMode, inputAdapter, perceptualRoughnessNode, shadowFill, shadowFillTint, useSharedSunShadow, specularF0Node, workflow, }?: {
100
102
  diffuseAlphaNode?: import("three/webgpu").VarNode<"float", import("three/webgpu").ConstNode<"float", number>>;
103
+ directStrength?: number;
101
104
  indirectStrength?: number;
102
105
  indirectTint?: number[];
106
+ indirectTintNode?: any;
107
+ indirectReplaceTintNode?: any;
108
+ indirectTintBlendNode?: any;
109
+ indirectTintMode?: string;
103
110
  inputAdapter?: "toonlab-stage";
104
111
  perceptualRoughnessNode?: import("three/webgpu").MaterialNode;
112
+ shadowFill?: number;
113
+ shadowFillTint?: number[];
114
+ useSharedSunShadow?: boolean;
105
115
  specularF0Node?: import("three/webgpu").MaterialNode;
106
116
  workflow?: string;
107
117
  });
108
118
  diffuseAlphaNode: import("three/webgpu").VarNode<"float", import("three/webgpu").ConstNode<"float", number>>;
119
+ directStrength: import("three/webgpu").VarNode<"float", import("three/webgpu").ConstNode<"float", number>>;
109
120
  indirectStrength: import("three/webgpu").VarNode<"float", import("three/webgpu").ConstNode<"float", number>>;
110
121
  indirectTint: import("three/webgpu").VarNode<"vec3", import("three/webgpu").ConstNode<"vec3", import("three").Vector3>>;
122
+ indirectReplaceTint: import("three/webgpu").VarNode<"vec3", import("three/webgpu").ConstNode<"vec3", import("three").Vector3>>;
123
+ indirectTintBlend: any;
124
+ indirectTintMode: string;
111
125
  inputAdapter: Readonly<{
112
126
  directInput: "ToonLab Light radiance pre-multiplied by PI for stock Three Lambert coexistence";
113
127
  directNormalization: number;
@@ -122,8 +136,11 @@ export class ToonLabSurfaceLightingModel extends PhysicalLightingModel {
122
136
  indirectNormalization: number;
123
137
  }>;
124
138
  perceptualRoughnessNode: import("three/webgpu").MaterialNode;
125
- specularF0Node: import("three/webgpu").MaterialNode;
139
+ shadowFill: number;
140
+ shadowFillTint: number[];
141
+ useSharedSunShadow: boolean;
126
142
  workflow: string;
143
+ specularF0Node: import("three/webgpu").MaterialNode;
127
144
  direct({ lightDirection, lightColor, lightNode, reflectedLight }: {
128
145
  lightDirection: any;
129
146
  lightColor: any;