@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
@@ -0,0 +1,409 @@
1
+ /**
2
+ * Snapshot of everything the §11 contract requires to be equal across both
3
+ * halves: camera matrices, light transforms, exposure and render state, plus
4
+ * the animation clock of any registered mixer. Compared before and after a
5
+ * composite render — if the wipe moved any of them, the A/B is not honest.
6
+ */
7
+ export function captureComparisonFrameState({ camera, mixers, renderer, scene }: {
8
+ camera: any;
9
+ mixers?: any[];
10
+ renderer: any;
11
+ scene: any;
12
+ }): {
13
+ camera: {
14
+ far: number;
15
+ fov: number;
16
+ matrixWorld: any;
17
+ matrixWorldInverse: any;
18
+ near: number;
19
+ projectionMatrix: any;
20
+ zoom: number;
21
+ };
22
+ lights: any[];
23
+ mixers: {
24
+ time: number;
25
+ }[];
26
+ renderState: {
27
+ outputColorSpace: any;
28
+ shadowMapEnabled: boolean;
29
+ shadowMapType: any;
30
+ toneMapping: any;
31
+ toneMappingExposure: number;
32
+ };
33
+ scene: {
34
+ backgroundIntensity: number;
35
+ environmentIntensity: number;
36
+ };
37
+ };
38
+ /**
39
+ * Creates a single-load A/B comparison over one scene and one camera.
40
+ *
41
+ * @param {object} options
42
+ * @param {StyleComparisonRenderer} options.renderer
43
+ * @param {THREE.Scene} options.scene
44
+ * @param {THREE.Camera} options.camera
45
+ * @param {'vertical'|'horizontal'} [options.axis='vertical'] Divider orientation.
46
+ * `vertical` puts the `before` variant on the left; `horizontal` puts it on
47
+ * the bottom.
48
+ * @param {number} [options.split=0.5] Fraction of the frame showing `before`.
49
+ * @param {{after: string, before: string}} [options.variants]
50
+ * @param {boolean} [options.refreshRenderPasses=true] Call each tracked root's
51
+ * `userData.toonlabCharacterStyleIntegration.refresh()` after a swap so the
52
+ * depth prepass / self-shadow target binds the live materials.
53
+ */
54
+ export function createStyleComparison({ axis, camera, refreshRenderPasses, renderer, scene, split, variants, }?: {
55
+ renderer: StyleComparisonRenderer;
56
+ scene: THREE.Scene;
57
+ camera: THREE.Camera;
58
+ axis?: "vertical" | "horizontal";
59
+ split?: number;
60
+ variants?: {
61
+ after: string;
62
+ before: string;
63
+ };
64
+ refreshRenderPasses?: boolean;
65
+ }): {
66
+ activate: (variantId: string, { force }?: {
67
+ force?: boolean;
68
+ }) => object;
69
+ auditIdentity: () => {
70
+ axis: "vertical" | "horizontal";
71
+ exposureDrift: any;
72
+ frameState: {
73
+ camera: {
74
+ far: number;
75
+ fov: number;
76
+ matrixWorld: any;
77
+ matrixWorldInverse: any;
78
+ near: number;
79
+ projectionMatrix: any;
80
+ zoom: number;
81
+ };
82
+ lights: any[];
83
+ mixers: {
84
+ time: number;
85
+ }[];
86
+ renderState: {
87
+ outputColorSpace: any;
88
+ shadowMapEnabled: boolean;
89
+ shadowMapType: any;
90
+ toneMapping: any;
91
+ toneMappingExposure: number;
92
+ };
93
+ scene: {
94
+ backgroundIntensity: number;
95
+ environmentIntensity: number;
96
+ };
97
+ };
98
+ issues: string[];
99
+ mixerCount: number;
100
+ ok: boolean;
101
+ sharedGeometryNodes: number;
102
+ split: number;
103
+ trackedNodes: number;
104
+ trackedRoots: number;
105
+ variants: any[];
106
+ variantsWithDivergentMaterials: number;
107
+ };
108
+ capture: (variantId: string, { label }?: {
109
+ label?: string;
110
+ }) => {
111
+ id: string;
112
+ label: string;
113
+ materialCount: number;
114
+ nodeCount: number;
115
+ };
116
+ readonly activeVariant: any;
117
+ /** Non-null when exposure or tone mapping moved during the last composite. */
118
+ readonly exposureDrift: any;
119
+ readonly axis: "vertical" | "horizontal";
120
+ readonly camera: THREE.Camera;
121
+ readonly mixers: any[];
122
+ readonly renderer: StyleComparisonRenderer;
123
+ readonly roots: THREE.Object3D<THREE.Object3DEventMap>[];
124
+ readonly scene: THREE.Scene<THREE.Object3DEventMap>;
125
+ readonly split: number;
126
+ readonly variantIds: any[];
127
+ readonly variants: {
128
+ after: string;
129
+ before: string;
130
+ };
131
+ dispose(): void;
132
+ render: ({ split: splitOverride, target }?: StyleComparisonRenderOptions) => StyleComparisonRenderResult;
133
+ renderVariant: (variantId: string, { target }?: StyleComparisonVariantRenderOptions) => void;
134
+ /** @type {(fraction: number, size?: StyleComparisonSize) => StyleComparisonRect} */
135
+ scissorRectFor: (fraction: number, size?: StyleComparisonSize) => StyleComparisonRect;
136
+ /** @param {StyleComparisonAxis} next @returns {StyleComparisonAxis} */
137
+ setAxis(next: StyleComparisonAxis): StyleComparisonAxis;
138
+ /** @param {number} next @returns {number} */
139
+ setSplit(next: number): number;
140
+ /**
141
+ * @param {Partial<StyleComparisonVariantPair>} [pair]
142
+ * @returns {StyleComparisonVariantPair}
143
+ */
144
+ setVariants({ after, before }?: Partial<StyleComparisonVariantPair>): StyleComparisonVariantPair;
145
+ track: (root: THREE.Object3D, { mixer }?: {
146
+ mixer?: THREE.AnimationMixer | null;
147
+ }) => () => void;
148
+ trackState: (id: string, { apply, capture }: {
149
+ apply: (value: unknown) => void;
150
+ capture: () => unknown;
151
+ }) => () => void;
152
+ };
153
+ /**
154
+ * Proves that a comparison is a true renderer split of one framing, not two
155
+ * separately framed images — and that everything outside the treated subject
156
+ * is bit-identical between the halves.
157
+ *
158
+ * The five assertions:
159
+ *
160
+ * 1. `split = 0` is bit-identical to a full-frame render of the `after`
161
+ * variant.
162
+ * 2. `split = 1` is bit-identical to a full-frame render of the `before`
163
+ * variant.
164
+ * 3. At any intermediate split, the region inside the scissor is bit-identical
165
+ * to the SAME region of the `before` full frame, and the region outside it
166
+ * is bit-identical to the same region of the `after` full frame. A pixel at
167
+ * (x, y) in the wipe therefore equals that pixel in a full-frame render of
168
+ * its own variant — which is only possible if both halves share one camera.
169
+ * 4. Camera matrices, light transforms, exposure, tone mapping, shadow state
170
+ * and every registered animation clock are unchanged by the composite
171
+ * render.
172
+ * 5. Pixels that differ between the two variants lie inside the region the
173
+ * tracked subject affects (measured by rendering with the subject hidden),
174
+ * so nothing outside the intended material treatment moved.
175
+ *
176
+ * Deterministic and reusable: it renders into its own render target, so it does
177
+ * not depend on canvas size, page compositing or screenshot timing. This is the
178
+ * routine the filler register's equivalence test calls.
179
+ */
180
+ export function verifyStyleComparisonIdentity(comparison: any, { height, onStage, splits, tolerance, width, }?: {
181
+ height?: number;
182
+ onStage?: any;
183
+ splits?: number[];
184
+ tolerance?: number;
185
+ width?: number;
186
+ }): Promise<{
187
+ checks: ({
188
+ changedPixels: number;
189
+ description: string;
190
+ differingPixels: number;
191
+ id: string;
192
+ ok: boolean;
193
+ totalPixels: number;
194
+ treatedPixels: number;
195
+ differences?: undefined;
196
+ } | {
197
+ description: string;
198
+ differences: any;
199
+ id: string;
200
+ ok: any;
201
+ changedPixels?: undefined;
202
+ differingPixels?: undefined;
203
+ totalPixels?: undefined;
204
+ treatedPixels?: undefined;
205
+ })[];
206
+ ok: boolean;
207
+ resolution: {
208
+ height: number;
209
+ width: number;
210
+ };
211
+ structural: any;
212
+ variants: {
213
+ after: any;
214
+ before: any;
215
+ };
216
+ }>;
217
+ /** Split axes. `vertical` is a vertical divider; `horizontal` is a horizontal one. */
218
+ export const STYLE_COMPARISON_AXES: readonly string[];
219
+ /**
220
+ * The renderer surface this module needs. Declared structurally rather than as
221
+ * `WebGPURenderer`, because that class lives in the `three/webgpu` entry point
222
+ * and is not exported from `three` — naming it here would make the generated
223
+ * declaration unresolvable and silently demote this module to a permissive
224
+ * `any` contract. WebGPURenderer (either backend) and WebGLRenderer both
225
+ * satisfy it.
226
+ *
227
+ * @typedef {object} StyleComparisonRenderer
228
+ * @property {(scene: THREE.Object3D, camera: THREE.Camera) => unknown} render
229
+ * @property {(x: number, y: number, width: number, height: number) => void} setScissor
230
+ * @property {(enabled: boolean) => void} setScissorTest
231
+ * @property {(target: THREE.Vector4) => THREE.Vector4} getScissor
232
+ * @property {() => boolean} getScissorTest
233
+ * @property {(target: THREE.RenderTarget|null) => void} setRenderTarget
234
+ * @property {() => THREE.RenderTarget|null} getRenderTarget
235
+ * @property {(target: THREE.Vector2|THREE.Vector4) => unknown} getSize
236
+ * @property {(color: THREE.Color) => THREE.Color} getClearColor
237
+ * @property {boolean} autoClear
238
+ * @property {boolean} autoClearColor
239
+ * @property {boolean} autoClearDepth
240
+ * @property {boolean} autoClearStencil
241
+ * @property {number} toneMappingExposure
242
+ *
243
+ * @typedef {'horizontal'|'vertical'} StyleComparisonAxis
244
+ *
245
+ * @typedef {THREE.RenderTarget|null} StyleComparisonTarget
246
+ *
247
+ * @typedef {object} StyleComparisonRect
248
+ * @property {number} height
249
+ * @property {number} width
250
+ * @property {number} x
251
+ * @property {number} y
252
+ *
253
+ * @typedef {object} StyleComparisonSize
254
+ * @property {number} height
255
+ * @property {number} width
256
+ *
257
+ * @typedef {object} StyleComparisonVariantPair
258
+ * @property {string} after Variant rendered full-frame.
259
+ * @property {string} before Variant rendered into the scissored region.
260
+ *
261
+ * @typedef {object} StyleComparisonRenderOptions
262
+ * @property {number} [split] Fraction of the frame showing `before`, 0..1.
263
+ * Defaults to the comparison's current split.
264
+ * @property {StyleComparisonTarget} [target] Render into this target instead of
265
+ * the canvas. Omit for the canvas.
266
+ *
267
+ * @typedef {object} StyleComparisonVariantRenderOptions
268
+ * @property {StyleComparisonTarget} [target]
269
+ *
270
+ * @typedef {object} StyleComparisonRenderResult
271
+ * @property {number} fraction
272
+ * @property {StyleComparisonSize} size
273
+ */
274
+ /**
275
+ * Child meshes a style treatment generates on top of the subject. They exist
276
+ * only in the styled variant, so a variant captured before the style was
277
+ * applied does not know them and must hide — never remove — them.
278
+ */
279
+ export const STYLE_COMPARISON_GENERATED_NODE_FLAGS: readonly string[];
280
+ /**
281
+ * The renderer surface this module needs. Declared structurally rather than as
282
+ * `WebGPURenderer`, because that class lives in the `three/webgpu` entry point
283
+ * and is not exported from `three` — naming it here would make the generated
284
+ * declaration unresolvable and silently demote this module to a permissive
285
+ * `any` contract. WebGPURenderer (either backend) and WebGLRenderer both
286
+ * satisfy it.
287
+ */
288
+ export type StyleComparisonRenderer = {
289
+ render: (scene: THREE.Object3D, camera: THREE.Camera) => unknown;
290
+ setScissor: (x: number, y: number, width: number, height: number) => void;
291
+ setScissorTest: (enabled: boolean) => void;
292
+ getScissor: (target: THREE.Vector4) => THREE.Vector4;
293
+ getScissorTest: () => boolean;
294
+ setRenderTarget: (target: THREE.RenderTarget | null) => void;
295
+ getRenderTarget: () => THREE.RenderTarget | null;
296
+ getSize: (target: THREE.Vector2 | THREE.Vector4) => unknown;
297
+ getClearColor: (color: THREE.Color) => THREE.Color;
298
+ autoClear: boolean;
299
+ autoClearColor: boolean;
300
+ autoClearDepth: boolean;
301
+ autoClearStencil: boolean;
302
+ toneMappingExposure: number;
303
+ };
304
+ /**
305
+ * The renderer surface this module needs. Declared structurally rather than as
306
+ * `WebGPURenderer`, because that class lives in the `three/webgpu` entry point
307
+ * and is not exported from `three` — naming it here would make the generated
308
+ * declaration unresolvable and silently demote this module to a permissive
309
+ * `any` contract. WebGPURenderer (either backend) and WebGLRenderer both
310
+ * satisfy it.
311
+ */
312
+ export type StyleComparisonAxis = "horizontal" | "vertical";
313
+ /**
314
+ * The renderer surface this module needs. Declared structurally rather than as
315
+ * `WebGPURenderer`, because that class lives in the `three/webgpu` entry point
316
+ * and is not exported from `three` — naming it here would make the generated
317
+ * declaration unresolvable and silently demote this module to a permissive
318
+ * `any` contract. WebGPURenderer (either backend) and WebGLRenderer both
319
+ * satisfy it.
320
+ */
321
+ export type StyleComparisonTarget = THREE.RenderTarget | null;
322
+ /**
323
+ * The renderer surface this module needs. Declared structurally rather than as
324
+ * `WebGPURenderer`, because that class lives in the `three/webgpu` entry point
325
+ * and is not exported from `three` — naming it here would make the generated
326
+ * declaration unresolvable and silently demote this module to a permissive
327
+ * `any` contract. WebGPURenderer (either backend) and WebGLRenderer both
328
+ * satisfy it.
329
+ */
330
+ export type StyleComparisonRect = {
331
+ height: number;
332
+ width: number;
333
+ x: number;
334
+ y: number;
335
+ };
336
+ /**
337
+ * The renderer surface this module needs. Declared structurally rather than as
338
+ * `WebGPURenderer`, because that class lives in the `three/webgpu` entry point
339
+ * and is not exported from `three` — naming it here would make the generated
340
+ * declaration unresolvable and silently demote this module to a permissive
341
+ * `any` contract. WebGPURenderer (either backend) and WebGLRenderer both
342
+ * satisfy it.
343
+ */
344
+ export type StyleComparisonSize = {
345
+ height: number;
346
+ width: number;
347
+ };
348
+ /**
349
+ * The renderer surface this module needs. Declared structurally rather than as
350
+ * `WebGPURenderer`, because that class lives in the `three/webgpu` entry point
351
+ * and is not exported from `three` — naming it here would make the generated
352
+ * declaration unresolvable and silently demote this module to a permissive
353
+ * `any` contract. WebGPURenderer (either backend) and WebGLRenderer both
354
+ * satisfy it.
355
+ */
356
+ export type StyleComparisonVariantPair = {
357
+ /**
358
+ * Variant rendered full-frame.
359
+ */
360
+ after: string;
361
+ /**
362
+ * Variant rendered into the scissored region.
363
+ */
364
+ before: string;
365
+ };
366
+ /**
367
+ * The renderer surface this module needs. Declared structurally rather than as
368
+ * `WebGPURenderer`, because that class lives in the `three/webgpu` entry point
369
+ * and is not exported from `three` — naming it here would make the generated
370
+ * declaration unresolvable and silently demote this module to a permissive
371
+ * `any` contract. WebGPURenderer (either backend) and WebGLRenderer both
372
+ * satisfy it.
373
+ */
374
+ export type StyleComparisonRenderOptions = {
375
+ /**
376
+ * Fraction of the frame showing `before`, 0..1.
377
+ * Defaults to the comparison's current split.
378
+ */
379
+ split?: number;
380
+ /**
381
+ * Render into this target instead of
382
+ * the canvas. Omit for the canvas.
383
+ */
384
+ target?: StyleComparisonTarget;
385
+ };
386
+ /**
387
+ * The renderer surface this module needs. Declared structurally rather than as
388
+ * `WebGPURenderer`, because that class lives in the `three/webgpu` entry point
389
+ * and is not exported from `three` — naming it here would make the generated
390
+ * declaration unresolvable and silently demote this module to a permissive
391
+ * `any` contract. WebGPURenderer (either backend) and WebGLRenderer both
392
+ * satisfy it.
393
+ */
394
+ export type StyleComparisonVariantRenderOptions = {
395
+ target?: StyleComparisonTarget;
396
+ };
397
+ /**
398
+ * The renderer surface this module needs. Declared structurally rather than as
399
+ * `WebGPURenderer`, because that class lives in the `three/webgpu` entry point
400
+ * and is not exported from `three` — naming it here would make the generated
401
+ * declaration unresolvable and silently demote this module to a permissive
402
+ * `any` contract. WebGPURenderer (either backend) and WebGLRenderer both
403
+ * satisfy it.
404
+ */
405
+ export type StyleComparisonRenderResult = {
406
+ fraction: number;
407
+ size: StyleComparisonSize;
408
+ };
409
+ import * as THREE from 'three';
@@ -1,3 +1,8 @@
1
+ export * from "./rockGeometryDetail.js";
1
2
  export * from "./rockMaterial.js";
3
+ export * from "./rockSemanticMaterialRuntime.js";
4
+ export * from "./rockRegionRuntime.js";
2
5
  export * from "./rockShaderRuntime.js";
3
6
  export * from "./rockShaderSettings.js";
7
+ export * from "./rockTangentIntegrity.js";
8
+ export * from "./rockTextureIntegrity.js";