@call-me-sensei/toonlab 0.4.21 → 0.4.22

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 (31) hide show
  1. package/NPM-LIBRARY.md +51 -2
  2. package/README.md +4 -3
  3. package/agents/PROMPTS.md +1 -1
  4. package/database/apply-one-catalog-seed.mjs +63 -0
  5. package/database/seeds/catalog/0005_2026-08-c8-first12.sql +1101 -0
  6. package/database/seeds/catalog/0006_2026-09-c8-first100.sql +14245 -0
  7. package/database/seeds/catalog/0007_2026-09-c8-first100-primary-model.sql +14845 -0
  8. package/package.json +4 -2
  9. package/src/catalog/officialCatalog.js +1 -0
  10. package/src/catalog/officialCatalogAssetRuntime.js +98 -1
  11. package/src/catalog/officialCatalogLod.js +160 -16
  12. package/src/catalog/officialCatalogPlacement.js +52 -12
  13. package/src/catalog/officialCatalogProvider.js +79 -8
  14. package/src/catalog/officialCatalogRockPackage.js +172 -0
  15. package/src/rock-shader/rockMaterial.js +205 -28
  16. package/src/rock-shader/rockShaderRuntime.js +17 -1
  17. package/src/rock-shader/rockShaderSettings.js +16 -0
  18. package/src/rockgen/lod/index.js +1 -0
  19. package/src/rockgen/lod/rockDenseFieldPolicy.js +143 -0
  20. package/src/rockgen/rockDocument.js +604 -26
  21. package/src/version.js +1 -1
  22. package/types/catalog/officialCatalog.d.ts +1 -0
  23. package/types/catalog/officialCatalogPlacement.d.ts +4 -0
  24. package/types/catalog/officialCatalogRockPackage.d.ts +68 -0
  25. package/types/index.d.ts +24 -0
  26. package/types/rock-shader/rockMaterial.d.ts +3 -0
  27. package/types/rock-shader/rockShaderSettings.d.ts +2 -0
  28. package/types/rockgen/lod/index.d.ts +1 -0
  29. package/types/rockgen/lod/rockDenseFieldPolicy.d.ts +181 -0
  30. package/types/rockgen/rockDocument.d.ts +579 -68
  31. package/types/version.d.ts +1 -1
@@ -1,35 +1,168 @@
1
+ export function isRockSourceMeshReference(reference: any): boolean;
2
+ /** Deterministic browser-safe identity for the complete saved C8 control/high/semantic authority. */
3
+ export function createC8ReferenceAuthoritySourceId(reference: any): string;
4
+ /** Deterministic browser-safe identity for the exact live C8 control geometry. */
5
+ export function createC8ReferenceGeometrySourceId(reference: any): string;
6
+ /** Surface derivative identity, separate from geometry and explicit about the C7 recipe. */
7
+ export function createC8ReferenceSurfaceSourceId(reference: any): string;
1
8
  /**
2
9
  * Portable identity for a source-GLB project. Geometry stays outside the JSON
3
- * document; the document stores only the stable catalog id, deterministic
4
- * generation/deformation seed, and exact LOD contract needed to rebuild and
5
- * decode the first-party GLB source.
10
+ * document; the document stores either the stable catalog id or the exact C8
11
+ * control/high hashes, plus deterministic edit state needed to rebuild and
12
+ * decode the source GLB.
6
13
  */
7
14
  export function createRockReferenceIdentity(options?: any): {
8
- archetype: string;
9
- catalogVersion: number;
10
- family: string;
11
- id: string;
12
- lodRatios: any;
13
- lodTriangles: any;
14
- meshEdits: {
15
- deltas: any;
16
- meshIndex: number;
17
- }[];
18
15
  role: string;
19
16
  series: string;
20
17
  sourceMode: string;
21
- surfacePackage: {
18
+ surfacePackage: any;
19
+ surfaceMode: string;
20
+ targetTriangles: number;
21
+ topFinish: any;
22
+ variation: number;
23
+ variationSeed: number;
24
+ authoritySourceId?: string;
25
+ customMeshSource?: {
26
+ authority: string;
27
+ control: {
28
+ boundsMetres: {
29
+ max: any[];
30
+ min: any[];
31
+ };
32
+ byteLength: number;
33
+ contentHash: any;
34
+ coordinateSystem: string;
35
+ dimensionsMetres: any[];
36
+ geometryAudit: {
37
+ topologyHash: any;
38
+ meshVertexCounts: any;
39
+ triangleCount: number;
40
+ vertexCount: number;
41
+ };
42
+ id: string;
43
+ metreUnitScale: number;
44
+ mimeType: string;
45
+ role: any;
46
+ sourceRevision: number;
47
+ topologyHash: any;
48
+ unit: string;
49
+ uri: string;
50
+ };
51
+ editEnvelope: {
52
+ maximumDisplacementMetres: number;
53
+ maximumVariationStrength: number;
54
+ mode: string;
55
+ };
56
+ highDetail: {
57
+ boundsMetres: {
58
+ max: any[];
59
+ min: any[];
60
+ };
61
+ byteLength: number;
62
+ contentHash: any;
63
+ coordinateSystem: string;
64
+ dimensionsMetres: any[];
65
+ geometryAudit: {
66
+ topologyHash: any;
67
+ meshVertexCounts: any;
68
+ triangleCount: number;
69
+ vertexCount: number;
70
+ };
71
+ id: string;
72
+ metreUnitScale: number;
73
+ mimeType: string;
74
+ role: any;
75
+ sourceRevision: number;
76
+ topologyHash: any;
77
+ unit: string;
78
+ uri: string;
79
+ };
80
+ schema: string;
81
+ semanticRegions: {
82
+ id: string;
83
+ label: string;
84
+ landmarkIds: any;
85
+ role: string;
86
+ selector: {
87
+ attribute: string;
88
+ kind: string;
89
+ value: number;
90
+ };
91
+ }[];
92
+ version: number;
93
+ };
94
+ derivedArtifactState?: {
95
+ surfaceReprojection: {
96
+ authoritySourceId: any;
97
+ contentHash: any;
98
+ geometrySourceId: any;
99
+ method: any;
100
+ sourceRevision: any;
101
+ status: string;
102
+ surfaceSourceId: any;
103
+ trueHighToLowBake: boolean;
104
+ reason?: undefined;
105
+ } | {
106
+ authoritySourceId: any;
107
+ contentHash: any;
108
+ geometrySourceId: any;
109
+ reason: string;
110
+ sourceRevision: any;
111
+ status: string;
112
+ surfaceSourceId: any;
113
+ trueHighToLowBake: boolean;
114
+ method?: undefined;
115
+ };
116
+ };
117
+ geology?: string;
118
+ geometrySourceId?: string;
119
+ identityLandmarks?: {
120
+ id: string;
121
+ positionMetres: any[];
122
+ role: string;
123
+ }[];
124
+ label?: string;
125
+ sourceRevision?: number;
126
+ surfaceSourceId?: string;
127
+ surfaceReprojection?: {
128
+ reprojectionContentId: string;
129
+ authoritySourceId: any;
130
+ controlContentHash: any;
131
+ dimensionsMetres: any[];
132
+ editOperationCount: any;
22
133
  geology: string;
134
+ geometrySourceId: any;
23
135
  mapResolution: number;
136
+ method: string;
137
+ projection: Readonly<{
138
+ characteristicMetres: number;
139
+ dimensionsMetres: readonly number[];
140
+ mode: "world-metre-triplanar-isotropic";
141
+ nearDetailScaleMetres: number;
142
+ scaleMetres: number;
143
+ axisScale: readonly number[];
144
+ tileSpan: readonly number[];
145
+ }>;
24
146
  schema: string;
25
147
  seed: number;
148
+ sourceContentId: any;
149
+ sourceId: any;
150
+ sourceRevision: any;
151
+ surfaceSourceId: any;
152
+ trueHighToLowBake: boolean;
26
153
  version: number;
27
154
  };
28
- surfaceMode: string;
29
- targetTriangles: number;
30
- topFinish: any;
31
- variation: number;
32
- variationSeed: number;
155
+ thumbnailUrl?: string;
156
+ archetype: string;
157
+ catalogVersion: number;
158
+ family: string;
159
+ id: string;
160
+ lodRatios: any;
161
+ lodTriangles: any;
162
+ meshEdits: {
163
+ deltas: any;
164
+ meshIndex: any;
165
+ }[];
33
166
  };
34
167
  /**
35
168
  * Creates one rock piece. Accepts a registered piece-preset name, or a
@@ -79,31 +212,157 @@ export function createRockDocument(options?: any): {
79
212
  pieces: any[];
80
213
  preset: string;
81
214
  reference: {
82
- archetype: string;
83
- catalogVersion: number;
84
- family: string;
85
- id: string;
86
- lodRatios: any;
87
- lodTriangles: any;
88
- meshEdits: {
89
- deltas: any;
90
- meshIndex: number;
91
- }[];
92
215
  role: string;
93
216
  series: string;
94
217
  sourceMode: string;
95
- surfacePackage: {
218
+ surfacePackage: any;
219
+ surfaceMode: string;
220
+ targetTriangles: number;
221
+ topFinish: any;
222
+ variation: number;
223
+ variationSeed: number;
224
+ authoritySourceId?: string;
225
+ customMeshSource?: {
226
+ authority: string;
227
+ control: {
228
+ boundsMetres: {
229
+ max: any[];
230
+ min: any[];
231
+ };
232
+ byteLength: number;
233
+ contentHash: any;
234
+ coordinateSystem: string;
235
+ dimensionsMetres: any[];
236
+ geometryAudit: {
237
+ topologyHash: any;
238
+ meshVertexCounts: any;
239
+ triangleCount: number;
240
+ vertexCount: number;
241
+ };
242
+ id: string;
243
+ metreUnitScale: number;
244
+ mimeType: string;
245
+ role: any;
246
+ sourceRevision: number;
247
+ topologyHash: any;
248
+ unit: string;
249
+ uri: string;
250
+ };
251
+ editEnvelope: {
252
+ maximumDisplacementMetres: number;
253
+ maximumVariationStrength: number;
254
+ mode: string;
255
+ };
256
+ highDetail: {
257
+ boundsMetres: {
258
+ max: any[];
259
+ min: any[];
260
+ };
261
+ byteLength: number;
262
+ contentHash: any;
263
+ coordinateSystem: string;
264
+ dimensionsMetres: any[];
265
+ geometryAudit: {
266
+ topologyHash: any;
267
+ meshVertexCounts: any;
268
+ triangleCount: number;
269
+ vertexCount: number;
270
+ };
271
+ id: string;
272
+ metreUnitScale: number;
273
+ mimeType: string;
274
+ role: any;
275
+ sourceRevision: number;
276
+ topologyHash: any;
277
+ unit: string;
278
+ uri: string;
279
+ };
280
+ schema: string;
281
+ semanticRegions: {
282
+ id: string;
283
+ label: string;
284
+ landmarkIds: any;
285
+ role: string;
286
+ selector: {
287
+ attribute: string;
288
+ kind: string;
289
+ value: number;
290
+ };
291
+ }[];
292
+ version: number;
293
+ };
294
+ derivedArtifactState?: {
295
+ surfaceReprojection: {
296
+ authoritySourceId: any;
297
+ contentHash: any;
298
+ geometrySourceId: any;
299
+ method: any;
300
+ sourceRevision: any;
301
+ status: string;
302
+ surfaceSourceId: any;
303
+ trueHighToLowBake: boolean;
304
+ reason?: undefined;
305
+ } | {
306
+ authoritySourceId: any;
307
+ contentHash: any;
308
+ geometrySourceId: any;
309
+ reason: string;
310
+ sourceRevision: any;
311
+ status: string;
312
+ surfaceSourceId: any;
313
+ trueHighToLowBake: boolean;
314
+ method?: undefined;
315
+ };
316
+ };
317
+ geology?: string;
318
+ geometrySourceId?: string;
319
+ identityLandmarks?: {
320
+ id: string;
321
+ positionMetres: any[];
322
+ role: string;
323
+ }[];
324
+ label?: string;
325
+ sourceRevision?: number;
326
+ surfaceSourceId?: string;
327
+ surfaceReprojection?: {
328
+ reprojectionContentId: string;
329
+ authoritySourceId: any;
330
+ controlContentHash: any;
331
+ dimensionsMetres: any[];
332
+ editOperationCount: any;
96
333
  geology: string;
334
+ geometrySourceId: any;
97
335
  mapResolution: number;
336
+ method: string;
337
+ projection: Readonly<{
338
+ characteristicMetres: number;
339
+ dimensionsMetres: readonly number[];
340
+ mode: "world-metre-triplanar-isotropic";
341
+ nearDetailScaleMetres: number;
342
+ scaleMetres: number;
343
+ axisScale: readonly number[];
344
+ tileSpan: readonly number[];
345
+ }>;
98
346
  schema: string;
99
347
  seed: number;
348
+ sourceContentId: any;
349
+ sourceId: any;
350
+ sourceRevision: any;
351
+ surfaceSourceId: any;
352
+ trueHighToLowBake: boolean;
100
353
  version: number;
101
354
  };
102
- surfaceMode: string;
103
- targetTriangles: number;
104
- topFinish: any;
105
- variation: number;
106
- variationSeed: number;
355
+ thumbnailUrl?: string;
356
+ archetype: string;
357
+ catalogVersion: number;
358
+ family: string;
359
+ id: string;
360
+ lodRatios: any;
361
+ lodTriangles: any;
362
+ meshEdits: {
363
+ deltas: any;
364
+ meshIndex: any;
365
+ }[];
107
366
  };
108
367
  revision: number;
109
368
  schemaVersion: number;
@@ -124,31 +383,157 @@ export function rebaseRockDocumentStyle(document: any, style?: string): {
124
383
  pieces: any[];
125
384
  preset: string;
126
385
  reference: {
127
- archetype: string;
128
- catalogVersion: number;
129
- family: string;
130
- id: string;
131
- lodRatios: any;
132
- lodTriangles: any;
133
- meshEdits: {
134
- deltas: any;
135
- meshIndex: number;
136
- }[];
137
386
  role: string;
138
387
  series: string;
139
388
  sourceMode: string;
140
- surfacePackage: {
389
+ surfacePackage: any;
390
+ surfaceMode: string;
391
+ targetTriangles: number;
392
+ topFinish: any;
393
+ variation: number;
394
+ variationSeed: number;
395
+ authoritySourceId?: string;
396
+ customMeshSource?: {
397
+ authority: string;
398
+ control: {
399
+ boundsMetres: {
400
+ max: any[];
401
+ min: any[];
402
+ };
403
+ byteLength: number;
404
+ contentHash: any;
405
+ coordinateSystem: string;
406
+ dimensionsMetres: any[];
407
+ geometryAudit: {
408
+ topologyHash: any;
409
+ meshVertexCounts: any;
410
+ triangleCount: number;
411
+ vertexCount: number;
412
+ };
413
+ id: string;
414
+ metreUnitScale: number;
415
+ mimeType: string;
416
+ role: any;
417
+ sourceRevision: number;
418
+ topologyHash: any;
419
+ unit: string;
420
+ uri: string;
421
+ };
422
+ editEnvelope: {
423
+ maximumDisplacementMetres: number;
424
+ maximumVariationStrength: number;
425
+ mode: string;
426
+ };
427
+ highDetail: {
428
+ boundsMetres: {
429
+ max: any[];
430
+ min: any[];
431
+ };
432
+ byteLength: number;
433
+ contentHash: any;
434
+ coordinateSystem: string;
435
+ dimensionsMetres: any[];
436
+ geometryAudit: {
437
+ topologyHash: any;
438
+ meshVertexCounts: any;
439
+ triangleCount: number;
440
+ vertexCount: number;
441
+ };
442
+ id: string;
443
+ metreUnitScale: number;
444
+ mimeType: string;
445
+ role: any;
446
+ sourceRevision: number;
447
+ topologyHash: any;
448
+ unit: string;
449
+ uri: string;
450
+ };
451
+ schema: string;
452
+ semanticRegions: {
453
+ id: string;
454
+ label: string;
455
+ landmarkIds: any;
456
+ role: string;
457
+ selector: {
458
+ attribute: string;
459
+ kind: string;
460
+ value: number;
461
+ };
462
+ }[];
463
+ version: number;
464
+ };
465
+ derivedArtifactState?: {
466
+ surfaceReprojection: {
467
+ authoritySourceId: any;
468
+ contentHash: any;
469
+ geometrySourceId: any;
470
+ method: any;
471
+ sourceRevision: any;
472
+ status: string;
473
+ surfaceSourceId: any;
474
+ trueHighToLowBake: boolean;
475
+ reason?: undefined;
476
+ } | {
477
+ authoritySourceId: any;
478
+ contentHash: any;
479
+ geometrySourceId: any;
480
+ reason: string;
481
+ sourceRevision: any;
482
+ status: string;
483
+ surfaceSourceId: any;
484
+ trueHighToLowBake: boolean;
485
+ method?: undefined;
486
+ };
487
+ };
488
+ geology?: string;
489
+ geometrySourceId?: string;
490
+ identityLandmarks?: {
491
+ id: string;
492
+ positionMetres: any[];
493
+ role: string;
494
+ }[];
495
+ label?: string;
496
+ sourceRevision?: number;
497
+ surfaceSourceId?: string;
498
+ surfaceReprojection?: {
499
+ reprojectionContentId: string;
500
+ authoritySourceId: any;
501
+ controlContentHash: any;
502
+ dimensionsMetres: any[];
503
+ editOperationCount: any;
141
504
  geology: string;
505
+ geometrySourceId: any;
142
506
  mapResolution: number;
507
+ method: string;
508
+ projection: Readonly<{
509
+ characteristicMetres: number;
510
+ dimensionsMetres: readonly number[];
511
+ mode: "world-metre-triplanar-isotropic";
512
+ nearDetailScaleMetres: number;
513
+ scaleMetres: number;
514
+ axisScale: readonly number[];
515
+ tileSpan: readonly number[];
516
+ }>;
143
517
  schema: string;
144
518
  seed: number;
519
+ sourceContentId: any;
520
+ sourceId: any;
521
+ sourceRevision: any;
522
+ surfaceSourceId: any;
523
+ trueHighToLowBake: boolean;
145
524
  version: number;
146
525
  };
147
- surfaceMode: string;
148
- targetTriangles: number;
149
- topFinish: any;
150
- variation: number;
151
- variationSeed: number;
526
+ thumbnailUrl?: string;
527
+ archetype: string;
528
+ catalogVersion: number;
529
+ family: string;
530
+ id: string;
531
+ lodRatios: any;
532
+ lodTriangles: any;
533
+ meshEdits: {
534
+ deltas: any;
535
+ meshIndex: any;
536
+ }[];
152
537
  };
153
538
  revision: number;
154
539
  schemaVersion: number;
@@ -197,31 +582,157 @@ export function deserializeRockDocument(jsonOrObject: any): {
197
582
  pieces: any[];
198
583
  preset: string;
199
584
  reference: {
200
- archetype: string;
201
- catalogVersion: number;
202
- family: string;
203
- id: string;
204
- lodRatios: any;
205
- lodTriangles: any;
206
- meshEdits: {
207
- deltas: any;
208
- meshIndex: number;
209
- }[];
210
585
  role: string;
211
586
  series: string;
212
587
  sourceMode: string;
213
- surfacePackage: {
588
+ surfacePackage: any;
589
+ surfaceMode: string;
590
+ targetTriangles: number;
591
+ topFinish: any;
592
+ variation: number;
593
+ variationSeed: number;
594
+ authoritySourceId?: string;
595
+ customMeshSource?: {
596
+ authority: string;
597
+ control: {
598
+ boundsMetres: {
599
+ max: any[];
600
+ min: any[];
601
+ };
602
+ byteLength: number;
603
+ contentHash: any;
604
+ coordinateSystem: string;
605
+ dimensionsMetres: any[];
606
+ geometryAudit: {
607
+ topologyHash: any;
608
+ meshVertexCounts: any;
609
+ triangleCount: number;
610
+ vertexCount: number;
611
+ };
612
+ id: string;
613
+ metreUnitScale: number;
614
+ mimeType: string;
615
+ role: any;
616
+ sourceRevision: number;
617
+ topologyHash: any;
618
+ unit: string;
619
+ uri: string;
620
+ };
621
+ editEnvelope: {
622
+ maximumDisplacementMetres: number;
623
+ maximumVariationStrength: number;
624
+ mode: string;
625
+ };
626
+ highDetail: {
627
+ boundsMetres: {
628
+ max: any[];
629
+ min: any[];
630
+ };
631
+ byteLength: number;
632
+ contentHash: any;
633
+ coordinateSystem: string;
634
+ dimensionsMetres: any[];
635
+ geometryAudit: {
636
+ topologyHash: any;
637
+ meshVertexCounts: any;
638
+ triangleCount: number;
639
+ vertexCount: number;
640
+ };
641
+ id: string;
642
+ metreUnitScale: number;
643
+ mimeType: string;
644
+ role: any;
645
+ sourceRevision: number;
646
+ topologyHash: any;
647
+ unit: string;
648
+ uri: string;
649
+ };
650
+ schema: string;
651
+ semanticRegions: {
652
+ id: string;
653
+ label: string;
654
+ landmarkIds: any;
655
+ role: string;
656
+ selector: {
657
+ attribute: string;
658
+ kind: string;
659
+ value: number;
660
+ };
661
+ }[];
662
+ version: number;
663
+ };
664
+ derivedArtifactState?: {
665
+ surfaceReprojection: {
666
+ authoritySourceId: any;
667
+ contentHash: any;
668
+ geometrySourceId: any;
669
+ method: any;
670
+ sourceRevision: any;
671
+ status: string;
672
+ surfaceSourceId: any;
673
+ trueHighToLowBake: boolean;
674
+ reason?: undefined;
675
+ } | {
676
+ authoritySourceId: any;
677
+ contentHash: any;
678
+ geometrySourceId: any;
679
+ reason: string;
680
+ sourceRevision: any;
681
+ status: string;
682
+ surfaceSourceId: any;
683
+ trueHighToLowBake: boolean;
684
+ method?: undefined;
685
+ };
686
+ };
687
+ geology?: string;
688
+ geometrySourceId?: string;
689
+ identityLandmarks?: {
690
+ id: string;
691
+ positionMetres: any[];
692
+ role: string;
693
+ }[];
694
+ label?: string;
695
+ sourceRevision?: number;
696
+ surfaceSourceId?: string;
697
+ surfaceReprojection?: {
698
+ reprojectionContentId: string;
699
+ authoritySourceId: any;
700
+ controlContentHash: any;
701
+ dimensionsMetres: any[];
702
+ editOperationCount: any;
214
703
  geology: string;
704
+ geometrySourceId: any;
215
705
  mapResolution: number;
706
+ method: string;
707
+ projection: Readonly<{
708
+ characteristicMetres: number;
709
+ dimensionsMetres: readonly number[];
710
+ mode: "world-metre-triplanar-isotropic";
711
+ nearDetailScaleMetres: number;
712
+ scaleMetres: number;
713
+ axisScale: readonly number[];
714
+ tileSpan: readonly number[];
715
+ }>;
216
716
  schema: string;
217
717
  seed: number;
718
+ sourceContentId: any;
719
+ sourceId: any;
720
+ sourceRevision: any;
721
+ surfaceSourceId: any;
722
+ trueHighToLowBake: boolean;
218
723
  version: number;
219
724
  };
220
- surfaceMode: string;
221
- targetTriangles: number;
222
- topFinish: any;
223
- variation: number;
224
- variationSeed: number;
725
+ thumbnailUrl?: string;
726
+ archetype: string;
727
+ catalogVersion: number;
728
+ family: string;
729
+ id: string;
730
+ lodRatios: any;
731
+ lodTriangles: any;
732
+ meshEdits: {
733
+ deltas: any;
734
+ meshIndex: any;
735
+ }[];
225
736
  };
226
737
  revision: number;
227
738
  schemaVersion: number;
@@ -234,7 +745,7 @@ export function deserializeRockDocument(jsonOrObject: any): {
234
745
  /** Document type tag stamped on saved rockgen project JSON. */
235
746
  export const ROCKGEN_PROJECT_DOCUMENT_TYPE: "toonlab/rockgen-project";
236
747
  /** Current schema version for rockgen project documents. */
237
- export const ROCKGEN_PROJECT_SCHEMA_VERSION: 6;
748
+ export const ROCKGEN_PROJECT_SCHEMA_VERSION: 7;
238
749
  /** Sparse source-mesh edits are packed into the portable document so normal
239
750
  * sculpting remains below the hosted creation-document limit. Runtime state
240
751
  * is still the convenient array form consumed by the editor and compiler. */