@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
package/src/version.js CHANGED
@@ -1,3 +1,3 @@
1
1
  // Single runtime source of truth for package consumers and ToonLab Pro/MCP.
2
2
  // Keep this value synchronized with package.json during release preparation.
3
- export const TOONLAB_VERSION = '0.4.21';
3
+ export const TOONLAB_VERSION = '0.4.22';
@@ -2,3 +2,4 @@ export * from "./officialCatalogProvider.js";
2
2
  export * from "./officialCatalogAssetRuntime.js";
3
3
  export * from "./officialCatalogLod.js";
4
4
  export * from "./officialCatalogPlacement.js";
5
+ export * from "./officialCatalogRockPackage.js";
@@ -18,6 +18,9 @@ export interface OfficialCatalogPlacementOptions {
18
18
  rotation?: CatalogVector3;
19
19
  scale?: CatalogVector3;
20
20
  targetId?: string | null;
21
+ textures?: Readonly<Record<string, unknown>>;
22
+ usePublishedRockSurface?: boolean;
23
+ variation?: number;
21
24
  }
22
25
  export interface OfficialCatalogPlacement {
23
26
  readonly asset: unknown;
@@ -32,6 +35,7 @@ export interface OfficialCatalogPlacement {
32
35
  };
33
36
  readonly normalization: Readonly<Record<string, unknown>>;
34
37
  readonly object: Object3D;
38
+ readonly publishedRockSurface: unknown;
35
39
  readonly quality: unknown;
36
40
  readonly released: boolean;
37
41
  readonly style: StyleApplicationResult;
@@ -0,0 +1,68 @@
1
+ import type { Texture, TextureLoader } from 'three';
2
+
3
+ export const OFFICIAL_ROCK_GALLERY_RECIPE_SCHEMA: 'toonlab/rock-gallery-recipe';
4
+ export const OFFICIAL_ROCK_MATERIAL_SCHEMA: 'toonlab.pro-rock-material';
5
+
6
+ export interface OfficialCatalogArtifact {
7
+ readonly byteSize: number;
8
+ readonly contentType: string;
9
+ readonly name: string;
10
+ readonly sha256: string;
11
+ readonly url: string | null;
12
+ }
13
+
14
+ export interface OfficialCatalogRockPackageFiles {
15
+ readonly collisionModelUrl: string | null;
16
+ readonly controlModelUrl: string | null;
17
+ readonly lodModelUrls: readonly (string | null)[];
18
+ readonly manifestUrl: string | null;
19
+ readonly materialConfigUrl: string | null;
20
+ readonly natureProvenanceUrl: string | null;
21
+ readonly natureReferenceUrl: string | null;
22
+ readonly realisticModelUrl: string;
23
+ readonly realisticPreviewUrl: string | null;
24
+ readonly recipeUrl: string | null;
25
+ readonly retainedHighModelUrl: string | null;
26
+ readonly stylizedModelUrl: string | null;
27
+ readonly stylizedPreviewUrl: string | null;
28
+ }
29
+
30
+ export interface OfficialCatalogRockPackage {
31
+ readonly asset: Readonly<Record<string, unknown>>;
32
+ readonly files: OfficialCatalogRockPackageFiles;
33
+ readonly manifest: Readonly<Record<string, unknown>> | null;
34
+ readonly materialConfig: Readonly<Record<string, unknown>> | null;
35
+ readonly natureProvenance: Readonly<Record<string, unknown>> | null;
36
+ readonly recipe: Readonly<Record<string, unknown>> | null;
37
+ }
38
+
39
+ export interface OfficialCatalogRockShaderInput {
40
+ readonly materialConfig: Readonly<Record<string, unknown>>;
41
+ readonly settings: Readonly<Record<string, unknown>>;
42
+ readonly textures: Readonly<Record<string, Texture>>;
43
+ }
44
+
45
+ export function findOfficialCatalogArtifact(
46
+ asset: { readonly artifacts?: readonly OfficialCatalogArtifact[] },
47
+ ...names: string[]
48
+ ): OfficialCatalogArtifact | null;
49
+ export function getOfficialCatalogArtifactUrl(
50
+ asset: { readonly artifacts?: readonly OfficialCatalogArtifact[] },
51
+ ...names: string[]
52
+ ): string | null;
53
+ export function loadOfficialCatalogRockPackage(
54
+ asset: Readonly<Record<string, unknown>>,
55
+ options?: {
56
+ readonly fetchImpl?: typeof globalThis.fetch;
57
+ readonly includeManifest?: boolean;
58
+ readonly includeNatureProvenance?: boolean;
59
+ },
60
+ ): Promise<OfficialCatalogRockPackage>;
61
+ export function loadOfficialCatalogRockShaderInput(
62
+ rockPackage: OfficialCatalogRockPackage,
63
+ options?: { readonly textureLoader?: TextureLoader },
64
+ ): Promise<OfficialCatalogRockShaderInput | null>;
65
+ export function createOfficialCatalogRockEditorDescriptor(
66
+ asset: Readonly<Record<string, unknown>>,
67
+ rockPackage?: OfficialCatalogRockPackage | null,
68
+ ): Readonly<Record<string, unknown>> | null;
package/types/index.d.ts CHANGED
@@ -243,6 +243,11 @@ export const DEFAULT_WATER_INTERACTION_CONFIG: any;
243
243
  export const DEFAULT_WATER_SCENARIO: any;
244
244
  export const DEFAULT_WATER_SETTINGS: any;
245
245
  export const DEFAULT_WATER_UNDERWATER_ATMOSPHERE: any;
246
+ export const DENSE_FIELD_ROCK_CULL_BELOW_PIXELS: any;
247
+ export const DENSE_FIELD_ROCK_LOD_LEVELS: any;
248
+ export const DENSE_FIELD_ROCK_PIXEL_THRESHOLDS: any;
249
+ export const DENSE_FIELD_ROCK_PRODUCTION_RULE: any;
250
+ export const DENSE_FIELD_ROCK_TRIANGLE_CEILINGS: any;
246
251
  export const ENVIRONMENT_DEBUG_MODES: any;
247
252
  export const ENVIRONMENT_MATERIAL_ROLES: any;
248
253
  export const ENVIRONMENT_PRESET_ALIASES: any;
@@ -371,6 +376,8 @@ export const NIGHT_SKY_PARAM_KEYS: any;
371
376
  export const NIGHT_SKY_PARAM_SCHEMA: any;
372
377
  export const OFFICIAL_CATALOG_ASSET_VERSION: any;
373
378
  export const OFFICIAL_CATALOG_PROVIDER_TRANSPORTS: any;
379
+ export const OFFICIAL_ROCK_GALLERY_RECIPE_SCHEMA: any;
380
+ export const OFFICIAL_ROCK_MATERIAL_SCHEMA: any;
374
381
  export class OfficialCatalogProviderError { constructor(...args: any[]); [key: string]: any; }
375
382
  export const POST_GENERATOR_DOMAIN: any;
376
383
  export const POST_PROCESSING_PRESETS: any;
@@ -777,6 +784,9 @@ export function createBranchTubeGeometry(...args: any[]): any;
777
784
  export function createBranchingTreeSkeleton(...args: any[]): any;
778
785
  export function createC7GeologyMapData(...args: any[]): any;
779
786
  export function createC7SurfaceSpecification(...args: any[]): any;
787
+ export function createC8ReferenceAuthoritySourceId(...args: any[]): any;
788
+ export function createC8ReferenceGeometrySourceId(...args: any[]): any;
789
+ export function createC8ReferenceSurfaceSourceId(...args: any[]): any;
780
790
  export function createCallMeSenseiGrassField(...args: any[]): any;
781
791
  export function createCallMeSenseiGrassMaterial(...args: any[]): any;
782
792
  export function createCallMeSenseiSkyLightProbe(...args: any[]): any;
@@ -809,6 +819,7 @@ export function createCurlNoiseVolume(...args: any[]): any;
809
819
  export function createCurveFrame(...args: any[]): any;
810
820
  export function createDebugEnvironmentMaterial(...args: any[]): any;
811
821
  export function createDefaultRockShaderTextureSet(...args: any[]): any;
822
+ export function createDenseFieldRockLodRuntime(...args: any[]): any;
812
823
  export function createDensityWeightMask(...args: any[]): any;
813
824
  export function createDirectionalLightDescriptor(...args: any[]): any;
814
825
  export function createDiscAreaLightDescriptor(...args: any[]): any;
@@ -900,6 +911,7 @@ export function createNightSky(...args: any[]): any;
900
911
  export function createNoisePatchMask(...args: any[]): any;
901
912
  export function createOfficialCatalogAssetRuntime(...args: any[]): any;
902
913
  export function createOfficialCatalogProvider(...args: any[]): any;
914
+ export function createOfficialCatalogRockEditorDescriptor(...args: any[]): any;
903
915
  export function createOrganLeafSpriteTexture(...args: any[]): any;
904
916
  export function createOssStyleBundleProvider(...args: any[]): any;
905
917
  export function createOutlineSettings(...args: any[]): any;
@@ -1031,6 +1043,7 @@ export function deriveCanopyPalette(...args: any[]): any;
1031
1043
  export function describeCatalogLicense(...args: any[]): any;
1032
1044
  export function describeNeutralStyleCoverage(...args: any[]): any;
1033
1045
  export function describeTexture(...args: any[]): any;
1046
+ export function describeToonLabDirectionalBeddingProjection(...args: any[]): any;
1034
1047
  export function deserializeLightingLook(...args: any[]): any;
1035
1048
  export function deserializeLightingLookPreset(...args: any[]): any;
1036
1049
  export function deserializeLightingRecipe(...args: any[]): any;
@@ -1059,6 +1072,7 @@ export const environmentStateUniforms: any;
1059
1072
  export function environmentUsesAlphaCutout(...args: any[]): any;
1060
1073
  export function erodeHeightfield(...args: any[]): any;
1061
1074
  export function erodeHeightfieldStylized(...args: any[]): any;
1075
+ export function estimateCatalogProjectedPixels(...args: any[]): any;
1062
1076
  export function estimateSurfaceNetsResolution(...args: any[]): any;
1063
1077
  export function evaluateAssetCandidate(...args: any[]): any;
1064
1078
  export function evaluateField(...args: any[]): any;
@@ -1073,6 +1087,7 @@ export const fallbackEnvironmentNormalTexture: any;
1073
1087
  export const fallbackEnvironmentWhiteTexture: any;
1074
1088
  export function fetchStyleBundle(...args: any[]): any;
1075
1089
  export function findCloudLayerCrossing(...args: any[]): any;
1090
+ export function findOfficialCatalogArtifact(...args: any[]): any;
1076
1091
  export function findPrimarySkinnedMesh(...args: any[]): any;
1077
1092
  export function finiteDepthWaveNumberRatio(...args: any[]): any;
1078
1093
  export function fitModelForController(...args: any[]): any;
@@ -1101,6 +1116,7 @@ export function getLightingStyleGeneratorFamilyOptions(...args: any[]): any;
1101
1116
  export function getLightingStylePresetOptions(...args: any[]): any;
1102
1117
  export function getLightingTypeCapability(...args: any[]): any;
1103
1118
  export function getMoonAlbedoTexture(...args: any[]): any;
1119
+ export function getOfficialCatalogArtifactUrl(...args: any[]): any;
1104
1120
  export function getPostGeneratorFamilyOptions(...args: any[]): any;
1105
1121
  export function getPostProcessingPresetOptions(...args: any[]): any;
1106
1122
  export function getRenderLayer(...args: any[]): any;
@@ -1133,6 +1149,7 @@ export function hashGeometry(...args: any[]): any;
1133
1149
  export function henyeyGreensteinPhaseNode(...args: any[]): any;
1134
1150
  export function heroCloudSkyOverrides(...args: any[]): any;
1135
1151
  export function hourFromDayCycleTime(...args: any[]): any;
1152
+ export function inferDenseFieldRockClass(...args: any[]): any;
1136
1153
  export function inferManufacturedObjectClass(...args: any[]): any;
1137
1154
  export function inspectRockGeometryTangents(...args: any[]): any;
1138
1155
  export function inspectRockRegionBinding(...args: any[]): any;
@@ -1147,6 +1164,7 @@ export function isEnvironmentShadowMesh(...args: any[]): any;
1147
1164
  export function isFoliageMaterial(...args: any[]): any;
1148
1165
  export function isPostProcessingEnabled(...args: any[]): any;
1149
1166
  export function isRockHelperPiece(...args: any[]): any;
1167
+ export function isRockSourceMeshReference(...args: any[]): any;
1150
1168
  export function isScanAssetMaterial(...args: any[]): any;
1151
1169
  export function isUtilityTextureLabel(...args: any[]): any;
1152
1170
  export function isVegetationSharedShaderGroup(...args: any[]): any;
@@ -1162,6 +1180,8 @@ export function loadEnvironmentTexture(...args: any[]): any;
1162
1180
  export function loadIdleClipForTarget(...args: any[]): any;
1163
1181
  export function loadJumpClipForTarget(...args: any[]): any;
1164
1182
  export function loadOfficialCatalogAsset(...args: any[]): any;
1183
+ export function loadOfficialCatalogRockPackage(...args: any[]): any;
1184
+ export function loadOfficialCatalogRockShaderInput(...args: any[]): any;
1165
1185
  export function loadPackagedLocomotionClipsForTarget(...args: any[]): any;
1166
1186
  export function loadRetargetedMixamoClipForTarget(...args: any[]): any;
1167
1187
  export function loadRunningClipForTarget(...args: any[]): any;
@@ -1432,6 +1452,7 @@ export function sceneCollisionRuntimeFor(...args: any[]): any;
1432
1452
  export function sculptEditBounds(...args: any[]): any;
1433
1453
  export function searchSurfaceNetsResolution(...args: any[]): any;
1434
1454
  export function selectCatalogLodLevel(...args: any[]): any;
1455
+ export function selectCatalogLodLevelByProjectedPixels(...args: any[]): any;
1435
1456
  export function serializableTreeOptions(...args: any[]): any;
1436
1457
  export function serializeGrassPreset(...args: any[]): any;
1437
1458
  export function serializeGroundShaderPreset(...args: any[]): any;
@@ -1520,6 +1541,8 @@ export function toMaterialArray(...args: any[]): any;
1520
1541
  export function toSerializableCloudStyleParams(...args: any[]): any;
1521
1542
  export function toSerializableSkyColorParams(...args: any[]): any;
1522
1543
  export function toSerializableSkyParams(...args: any[]): any;
1544
+ export function toonLabDirectionalBeddingColor(...args: any[]): any;
1545
+ export function toonLabDirectionalBeddingNormal(...args: any[]): any;
1523
1546
  export function toonLabMountainProfileFromResolvedMaterial(...args: any[]): any;
1524
1547
  export function toonLabRockProfileFromResolvedMaterial(...args: any[]): any;
1525
1548
  export function toonLabScalar(...args: any[]): any;
@@ -1542,6 +1565,7 @@ export function usesAlphaBlend(...args: any[]): any;
1542
1565
  export function validateAssetSourcingPolicy(...args: any[]): any;
1543
1566
  export function validateCollisionMetadata(...args: any[]): any;
1544
1567
  export function validateCompiledTreeManifest(...args: any[]): any;
1568
+ export function validateDenseFieldRockLodTargets(...args: any[]): any;
1545
1569
  export function validateEnvironmentPresetDocument(...args: any[]): any;
1546
1570
  export function validateGrassPresetDocument(...args: any[]): any;
1547
1571
  export function validateGroundShaderPresetDocument(...args: any[]): any;
@@ -9,12 +9,15 @@ export const TOONLAB_ROCK_PROFILE_DEFAULTS: any;
9
9
  export const TOONLAB_ROCK_SHADER_GUID: any;
10
10
  export function createToonLabMountainMaterial(...args: any[]): any;
11
11
  export function createToonRockMaterial(...args: any[]): any;
12
+ export function describeToonLabDirectionalBeddingProjection(...args: any[]): any;
12
13
  export function loadToonLabMountainMaterial(...args: any[]): any;
13
14
  export function loadToonRockMaterial(...args: any[]): any;
14
15
  export function loadToonRockMaterialInputs(...args: any[]): any;
15
16
  export function normalizeToonLabMountainProfile(...args: any[]): any;
16
17
  export function normalizeToonLabRockProfile(...args: any[]): any;
17
18
  export function tangentNormalToView(...args: any[]): any;
19
+ export function toonLabDirectionalBeddingColor(...args: any[]): any;
20
+ export function toonLabDirectionalBeddingNormal(...args: any[]): any;
18
21
  export function toonLabMountainProfileFromResolvedMaterial(...args: any[]): any;
19
22
  export function toonLabRockProfileFromResolvedMaterial(...args: any[]): any;
20
23
  export function toonLabTriplanarColor(...args: any[]): any;
@@ -70,6 +70,8 @@ export const DEFAULT_ROCK_SHADER_SETTINGS: Readonly<{
70
70
  }>;
71
71
  export const CALL_ME_SENSEI_ROCK_SHADER_SETTINGS: Readonly<{
72
72
  projection: Readonly<{
73
+ mode: "triplanar";
74
+ upAxis: "y";
73
75
  scale: 48;
74
76
  saturation: 1;
75
77
  contrast: 1;
@@ -1,4 +1,5 @@
1
1
  export * from "./rockLodMetrics.js";
2
+ export * from "./rockDenseFieldPolicy.js";
2
3
  export * from "./rockLodPlanner.js";
3
4
  export * from "./rockLodPolicy.js";
4
5
  export * from "./rockLodRuntime.js";
@@ -0,0 +1,181 @@
1
+ export function inferDenseFieldRockClass({ scaleClass, targetHeightMetres }?: {
2
+ scaleClass?: any;
3
+ targetHeightMetres?: any;
4
+ }): "landmark" | "formation" | "ordinary";
5
+ export function validateDenseFieldRockLodTargets(targets: any, { assetClass, }?: {
6
+ assetClass?: string;
7
+ }): Readonly<{
8
+ assetClass: string;
9
+ ceilings: any;
10
+ errors: readonly string[];
11
+ valid: boolean;
12
+ values: readonly number[];
13
+ }>;
14
+ /**
15
+ * Install the mandatory dense-field rock behavior on an authored LOD0-LOD4
16
+ * root. The final tier is geometry-only silhouette support; it never casts a
17
+ * shadow and the root is culled once its projected diameter drops below the
18
+ * production pixel threshold.
19
+ */
20
+ export function createDenseFieldRockLodRuntime(root: any, { cullBelowPixels, hysteresis, maxLevel, pixelThresholds, referenceDiameter, requireComplete, }?: {
21
+ cullBelowPixels?: number;
22
+ hysteresis?: number;
23
+ maxLevel?: number;
24
+ pixelThresholds?: readonly number[];
25
+ referenceDiameter?: any;
26
+ requireComplete?: boolean;
27
+ }): Readonly<{
28
+ policy: Readonly<{
29
+ cullBelowPixels: 5;
30
+ farShadowLastLevel: 2;
31
+ levelCount: 5;
32
+ levels: readonly (Readonly<{
33
+ id: "LOD0";
34
+ level: 0;
35
+ purpose: "hero-close";
36
+ }> | Readonly<{
37
+ id: "LOD1";
38
+ level: 1;
39
+ purpose: "near-gameplay";
40
+ }> | Readonly<{
41
+ id: "LOD2";
42
+ level: 2;
43
+ purpose: "mid-gameplay";
44
+ }> | Readonly<{
45
+ id: "LOD3";
46
+ level: 3;
47
+ purpose: "far-simplified";
48
+ }> | Readonly<{
49
+ id: "LOD4";
50
+ level: 4;
51
+ purpose: "very-far-silhouette";
52
+ }>)[];
53
+ pixelThresholds: readonly number[];
54
+ selectionBasis: "projected-object-diameter-pixels";
55
+ triangleCeilings: Readonly<{
56
+ ordinary: Readonly<{
57
+ LOD3: 1200;
58
+ LOD4: 350;
59
+ }>;
60
+ formation: Readonly<{
61
+ LOD3: 1800;
62
+ LOD4: 600;
63
+ }>;
64
+ landmark: Readonly<{
65
+ LOD3: 2500;
66
+ LOD4: 800;
67
+ }>;
68
+ }>;
69
+ veryFar: Readonly<{
70
+ allowedSurfaceChannels: readonly string[];
71
+ castShadow: false;
72
+ preserve: readonly string[];
73
+ remove: readonly string[];
74
+ silhouetteOnly: true;
75
+ }>;
76
+ }>;
77
+ dispose(): void;
78
+ availableLevels: readonly any[];
79
+ bindings: readonly any[];
80
+ disposed: boolean;
81
+ level: any;
82
+ setLevel: (level: any) => boolean;
83
+ cullBelowPixels: number;
84
+ pixelThresholds: readonly any[];
85
+ referenceDiameter: number;
86
+ thresholds: readonly any[];
87
+ hysteresis: number;
88
+ update: (options?: {}) => Readonly<{
89
+ changed: boolean;
90
+ culled: boolean;
91
+ distance: number;
92
+ level: any;
93
+ projectedPixels: number;
94
+ }>;
95
+ }>;
96
+ export const DENSE_FIELD_ROCK_LOD_LEVELS: readonly (Readonly<{
97
+ id: "LOD0";
98
+ level: 0;
99
+ purpose: "hero-close";
100
+ }> | Readonly<{
101
+ id: "LOD1";
102
+ level: 1;
103
+ purpose: "near-gameplay";
104
+ }> | Readonly<{
105
+ id: "LOD2";
106
+ level: 2;
107
+ purpose: "mid-gameplay";
108
+ }> | Readonly<{
109
+ id: "LOD3";
110
+ level: 3;
111
+ purpose: "far-simplified";
112
+ }> | Readonly<{
113
+ id: "LOD4";
114
+ level: 4;
115
+ purpose: "very-far-silhouette";
116
+ }>)[];
117
+ export const DENSE_FIELD_ROCK_PIXEL_THRESHOLDS: readonly number[];
118
+ export const DENSE_FIELD_ROCK_CULL_BELOW_PIXELS: 5;
119
+ export const DENSE_FIELD_ROCK_TRIANGLE_CEILINGS: Readonly<{
120
+ ordinary: Readonly<{
121
+ LOD3: 1200;
122
+ LOD4: 350;
123
+ }>;
124
+ formation: Readonly<{
125
+ LOD3: 1800;
126
+ LOD4: 600;
127
+ }>;
128
+ landmark: Readonly<{
129
+ LOD3: 2500;
130
+ LOD4: 800;
131
+ }>;
132
+ }>;
133
+ export const DENSE_FIELD_ROCK_PRODUCTION_RULE: Readonly<{
134
+ cullBelowPixels: 5;
135
+ farShadowLastLevel: 2;
136
+ levelCount: 5;
137
+ levels: readonly (Readonly<{
138
+ id: "LOD0";
139
+ level: 0;
140
+ purpose: "hero-close";
141
+ }> | Readonly<{
142
+ id: "LOD1";
143
+ level: 1;
144
+ purpose: "near-gameplay";
145
+ }> | Readonly<{
146
+ id: "LOD2";
147
+ level: 2;
148
+ purpose: "mid-gameplay";
149
+ }> | Readonly<{
150
+ id: "LOD3";
151
+ level: 3;
152
+ purpose: "far-simplified";
153
+ }> | Readonly<{
154
+ id: "LOD4";
155
+ level: 4;
156
+ purpose: "very-far-silhouette";
157
+ }>)[];
158
+ pixelThresholds: readonly number[];
159
+ selectionBasis: "projected-object-diameter-pixels";
160
+ triangleCeilings: Readonly<{
161
+ ordinary: Readonly<{
162
+ LOD3: 1200;
163
+ LOD4: 350;
164
+ }>;
165
+ formation: Readonly<{
166
+ LOD3: 1800;
167
+ LOD4: 600;
168
+ }>;
169
+ landmark: Readonly<{
170
+ LOD3: 2500;
171
+ LOD4: 800;
172
+ }>;
173
+ }>;
174
+ veryFar: Readonly<{
175
+ allowedSurfaceChannels: readonly string[];
176
+ castShadow: false;
177
+ preserve: readonly string[];
178
+ remove: readonly string[];
179
+ silhouetteOnly: true;
180
+ }>;
181
+ }>;