@forgeax/engine-gltf 0.1.21 → 0.1.24
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.
- package/README.md +115 -3
- package/dist/__tests__/lod-import.integration.test.d.ts +2 -0
- package/dist/__tests__/lod-import.integration.test.d.ts.map +1 -0
- package/dist/__tests__/lod-meta-publication.integration.test.d.ts +2 -0
- package/dist/__tests__/lod-meta-publication.integration.test.d.ts.map +1 -0
- package/dist/__tests__/physical-clearcoat.unit.test.d.ts +2 -0
- package/dist/__tests__/physical-clearcoat.unit.test.d.ts.map +1 -0
- package/dist/__tests__/physical-material-import.integration.test.d.ts +2 -0
- package/dist/__tests__/physical-material-import.integration.test.d.ts.map +1 -0
- package/dist/bridge.d.ts +1 -0
- package/dist/bridge.d.ts.map +1 -1
- package/dist/check-extensions.d.ts +1 -1
- package/dist/check-extensions.d.ts.map +1 -1
- package/dist/cli-gltf.mjs +362 -14
- package/dist/cli-gltf.mjs.map +1 -1
- package/dist/errors.d.ts +13 -0
- package/dist/errors.d.ts.map +1 -1
- package/dist/gltf-importer.d.ts.map +1 -1
- package/dist/image-color-space.d.ts +12 -0
- package/dist/image-color-space.d.ts.map +1 -1
- package/dist/importer-entry.mjs +516 -25
- package/dist/importer-entry.mjs.map +1 -1
- package/dist/index.d.ts +4 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.mjs +609 -28
- package/dist/index.mjs.map +1 -1
- package/dist/lod/parse-lod.d.ts +15 -0
- package/dist/lod/parse-lod.d.ts.map +1 -0
- package/dist/lod/project-meta.d.ts +23 -0
- package/dist/lod/project-meta.d.ts.map +1 -0
- package/dist/material/parse-material.d.ts +66 -0
- package/dist/material/parse-material.d.ts.map +1 -1
- package/dist/node-file-entry.mjs +265 -8
- package/dist/node-file-entry.mjs.map +1 -1
- package/dist/parse-gltf.d.ts +3 -1
- package/dist/parse-gltf.d.ts.map +1 -1
- package/dist/reimport-reuse-meta.d.ts +1 -1
- package/dist/reimport-reuse-meta.d.ts.map +1 -1
- package/package.json +12 -12
- package/src/__tests__/bridge-material-values.unit.test.ts +84 -1
- package/src/__tests__/bridge-skin-stride.unit.test.ts +22 -0
- package/src/__tests__/fixtures/lod/core-only.gltf +1 -0
- package/src/__tests__/fixtures/lod/msft-lod-malformed.gltf +1 -0
- package/src/__tests__/fixtures/lod/msft-lod-multi-root.gltf +1 -0
- package/src/__tests__/fixtures/lod/msft-lod-node-extras.gltf +1 -0
- package/src/__tests__/fixtures/lod/msft-lod.gltf +1 -0
- package/src/__tests__/gltf-error-derived-views.test-d.ts +8 -0
- package/src/__tests__/gltf-error-migration.test.ts +3 -3
- package/src/__tests__/gltf.unit.test.ts +60 -5
- package/src/__tests__/lod-import.integration.test.ts +106 -0
- package/src/__tests__/lod-meta-publication.integration.test.ts +24 -0
- package/src/__tests__/material-pack-refs.integration.test.ts +53 -0
- package/src/__tests__/parse-gltf.unit.test.ts +50 -0
- package/src/__tests__/physical-clearcoat.unit.test.ts +110 -0
- package/src/__tests__/physical-material-import.integration.test.ts +239 -0
- package/src/__tests__/source-key-producer.integration.test.ts +6 -2
- package/src/bridge.ts +259 -14
- package/src/check-extensions.ts +16 -8
- package/src/errors.ts +32 -2
- package/src/gltf-importer.ts +122 -1
- package/src/image-color-space.ts +29 -4
- package/src/index.ts +10 -1
- package/src/lod/parse-lod.ts +129 -0
- package/src/lod/project-meta.ts +48 -0
- package/src/material/parse-material.ts +307 -0
- package/src/parse-gltf.ts +97 -1
- package/src/reimport-reuse-meta.ts +3 -1
- package/dist/.tsbuildinfo +0 -1
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { gltfErr, type Result } from '../errors.js';
|
|
2
|
+
export interface GltfLodRelation {
|
|
3
|
+
readonly rootNode: number;
|
|
4
|
+
readonly lodNodeIds: readonly number[];
|
|
5
|
+
readonly screenCoverages: readonly number[];
|
|
6
|
+
/** All node-level MSFT_lod groups, retained for multi-root scenes. */
|
|
7
|
+
readonly groups: readonly GltfLodGroup[];
|
|
8
|
+
}
|
|
9
|
+
export interface GltfLodGroup {
|
|
10
|
+
readonly rootNode: number;
|
|
11
|
+
readonly lodNodeIds: readonly number[];
|
|
12
|
+
readonly screenCoverages: readonly number[];
|
|
13
|
+
}
|
|
14
|
+
export declare function parseGltfLodExtension(json: unknown): Result<GltfLodRelation, ReturnType<typeof gltfErr<'gltf-lod-invalid'>>>;
|
|
15
|
+
//# sourceMappingURL=parse-lod.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse-lod.d.ts","sourceRoot":"","sources":["../../src/lod/parse-lod.ts"],"names":[],"mappings":"AAAA,OAAO,EAAO,OAAO,EAAM,KAAK,MAAM,EAAE,MAAM,cAAc,CAAC;AAE7D,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;IACvC,QAAQ,CAAC,eAAe,EAAE,SAAS,MAAM,EAAE,CAAC;IAC5C,sEAAsE;IACtE,QAAQ,CAAC,MAAM,EAAE,SAAS,YAAY,EAAE,CAAC;CAC1C;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;IACvC,QAAQ,CAAC,eAAe,EAAE,SAAS,MAAM,EAAE,CAAC;CAC7C;AAmBD,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,OAAO,GACZ,MAAM,CAAC,eAAe,EAAE,UAAU,CAAC,OAAO,OAAO,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAgEzE"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { type Result } from '@forgeax/engine-types';
|
|
2
|
+
export interface GltfLodMetaLevel {
|
|
3
|
+
readonly sourceKey: string;
|
|
4
|
+
readonly guid: string;
|
|
5
|
+
readonly screenCoverage?: number;
|
|
6
|
+
}
|
|
7
|
+
export interface GltfLodMetaCandidate {
|
|
8
|
+
readonly rootSourceKey: string;
|
|
9
|
+
readonly levels: readonly GltfLodMetaLevel[];
|
|
10
|
+
readonly previous?: readonly GltfLodMetaLevel[] | undefined;
|
|
11
|
+
}
|
|
12
|
+
export interface GltfLodMetaOutput {
|
|
13
|
+
readonly sourceKey: string;
|
|
14
|
+
readonly meshGuid: string;
|
|
15
|
+
readonly screenCoverage: number;
|
|
16
|
+
}
|
|
17
|
+
export declare function projectGltfLodMeta(input: GltfLodMetaCandidate): Result<{
|
|
18
|
+
readonly lods: readonly GltfLodMetaOutput[];
|
|
19
|
+
}, {
|
|
20
|
+
readonly code: string;
|
|
21
|
+
readonly reason: string;
|
|
22
|
+
}>;
|
|
23
|
+
//# sourceMappingURL=project-meta.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-meta.d.ts","sourceRoot":"","sources":["../../src/lod/project-meta.ts"],"names":[],"mappings":"AACA,OAAO,EAAW,KAAK,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAE7D,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;CAClC;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,MAAM,EAAE,SAAS,gBAAgB,EAAE,CAAC;IAC7C,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,gBAAgB,EAAE,GAAG,SAAS,CAAC;CAC7D;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;CACjC;AAED,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,oBAAoB,GAC1B,MAAM,CACP;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,iBAAiB,EAAE,CAAA;CAAE,EAC/C;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CACnD,CAqBA"}
|
|
@@ -82,6 +82,38 @@ export interface GltfMaterialJson {
|
|
|
82
82
|
readonly attenuationColor?: readonly number[];
|
|
83
83
|
readonly attenuationDistance?: number;
|
|
84
84
|
};
|
|
85
|
+
readonly KHR_materials_clearcoat?: {
|
|
86
|
+
readonly clearcoatFactor?: number;
|
|
87
|
+
readonly clearcoatTexture?: TextureInfoJson;
|
|
88
|
+
readonly clearcoatRoughnessFactor?: number;
|
|
89
|
+
readonly clearcoatRoughnessTexture?: TextureInfoJson;
|
|
90
|
+
readonly clearcoatNormalTexture?: NormalTextureInfoJson;
|
|
91
|
+
};
|
|
92
|
+
readonly KHR_materials_anisotropy?: {
|
|
93
|
+
readonly anisotropyStrength?: number;
|
|
94
|
+
readonly anisotropyRotation?: number;
|
|
95
|
+
readonly anisotropyTexture?: TextureInfoJson;
|
|
96
|
+
};
|
|
97
|
+
readonly KHR_materials_sheen?: {
|
|
98
|
+
readonly sheenColorFactor?: readonly number[];
|
|
99
|
+
readonly sheenColorTexture?: TextureInfoJson;
|
|
100
|
+
readonly sheenRoughnessFactor?: number;
|
|
101
|
+
readonly sheenRoughnessTexture?: TextureInfoJson;
|
|
102
|
+
};
|
|
103
|
+
readonly KHR_materials_iridescence?: {
|
|
104
|
+
readonly iridescenceFactor?: number;
|
|
105
|
+
readonly iridescenceIor?: number;
|
|
106
|
+
readonly iridescenceThicknessMinimum?: number;
|
|
107
|
+
readonly iridescenceThicknessMaximum?: number;
|
|
108
|
+
readonly iridescenceTexture?: TextureInfoJson;
|
|
109
|
+
readonly iridescenceThicknessTexture?: TextureInfoJson;
|
|
110
|
+
};
|
|
111
|
+
readonly KHR_materials_specular?: {
|
|
112
|
+
readonly specularFactor?: number;
|
|
113
|
+
readonly specularTexture?: TextureInfoJson;
|
|
114
|
+
readonly specularColorFactor?: readonly number[];
|
|
115
|
+
readonly specularColorTexture?: TextureInfoJson;
|
|
116
|
+
};
|
|
85
117
|
};
|
|
86
118
|
}
|
|
87
119
|
export interface GltfMaterialIr {
|
|
@@ -107,6 +139,40 @@ export interface GltfMaterialIr {
|
|
|
107
139
|
readonly thicknessChannel?: number;
|
|
108
140
|
readonly attenuationColor?: readonly [number, number, number];
|
|
109
141
|
readonly attenuationDistance?: number;
|
|
142
|
+
readonly clearcoatFactor?: number;
|
|
143
|
+
readonly clearcoatChannel?: number;
|
|
144
|
+
readonly clearcoatTexture?: GltfTextureInfoIr | number;
|
|
145
|
+
readonly clearcoatRoughnessFactor?: number;
|
|
146
|
+
readonly clearcoatRoughnessChannel?: number;
|
|
147
|
+
readonly clearcoatRoughnessTexture?: GltfTextureInfoIr | number;
|
|
148
|
+
readonly clearcoatNormalTexture?: GltfNormalTextureInfoIr | number;
|
|
149
|
+
readonly clearcoatNormalChannel?: readonly [number, number];
|
|
150
|
+
readonly anisotropyStrength?: number;
|
|
151
|
+
readonly anisotropyRotation?: number;
|
|
152
|
+
readonly anisotropyTexture?: GltfTextureInfoIr | number;
|
|
153
|
+
/** KHR_materials_anisotropy uses RG direction and B strength. */
|
|
154
|
+
readonly anisotropyChannel?: readonly [number, number, number];
|
|
155
|
+
readonly sheenColorFactor?: readonly [number, number, number];
|
|
156
|
+
readonly sheenColorTexture?: GltfTextureInfoIr | number;
|
|
157
|
+
readonly sheenColorChannel?: readonly [number, number, number];
|
|
158
|
+
readonly sheenRoughnessFactor?: number;
|
|
159
|
+
readonly sheenRoughnessTexture?: GltfTextureInfoIr | number;
|
|
160
|
+
readonly sheenRoughnessChannel?: number;
|
|
161
|
+
readonly iridescenceFactor?: number;
|
|
162
|
+
readonly iridescenceIor?: number;
|
|
163
|
+
readonly iridescenceThicknessMinimum?: number;
|
|
164
|
+
readonly iridescenceThicknessMaximum?: number;
|
|
165
|
+
readonly iridescenceTexture?: GltfTextureInfoIr | number;
|
|
166
|
+
readonly iridescenceChannel?: number;
|
|
167
|
+
readonly iridescenceThicknessTexture?: GltfTextureInfoIr | number;
|
|
168
|
+
readonly iridescenceThicknessChannel?: number;
|
|
169
|
+
readonly specularFactor?: number;
|
|
170
|
+
readonly specularTexture?: GltfTextureInfoIr | number;
|
|
171
|
+
/** KHR_materials_specular specularTexture uses the alpha channel. */
|
|
172
|
+
readonly specularChannel?: number;
|
|
173
|
+
readonly specularColorFactor?: readonly [number, number, number];
|
|
174
|
+
readonly specularColorTexture?: GltfTextureInfoIr | number;
|
|
175
|
+
readonly specularColorChannel?: readonly [number, number, number];
|
|
110
176
|
readonly alphaMode?: 'OPAQUE' | 'MASK' | 'BLEND';
|
|
111
177
|
readonly alphaCutoff?: number;
|
|
112
178
|
readonly doubleSided?: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parse-material.d.ts","sourceRoot":"","sources":["../../src/material/parse-material.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5C,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC5C;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,CAAC,EAAE,sBAAsB,CAAC;CAC7C;AAED,MAAM,WAAW,uBAAwB,SAAQ,iBAAiB;IAChE,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,0BAA2B,SAAQ,iBAAiB;IACnE,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,UAAU,CAAC,EAAE;QACpB,QAAQ,CAAC,qBAAqB,CAAC,EAAE,oBAAoB,CAAC;KACvD,CAAC;CACH;AAED,MAAM,WAAW,qBAAsB,SAAQ,eAAe;IAC5D,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,wBAAyB,SAAQ,eAAe;IAC/D,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,oBAAoB,CAAC,EAAE;QAC9B,QAAQ,CAAC,eAAe,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;QAC7C,QAAQ,CAAC,gBAAgB,CAAC,EAAE,eAAe,CAAC;QAC5C,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;QACjC,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;QAClC,QAAQ,CAAC,wBAAwB,CAAC,EAAE,eAAe,CAAC;KACrD,CAAC;IACF,QAAQ,CAAC,aAAa,CAAC,EAAE,qBAAqB,CAAC;IAC/C,QAAQ,CAAC,cAAc,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC5C,QAAQ,CAAC,eAAe,CAAC,EAAE,eAAe,CAAC;IAC3C,QAAQ,CAAC,gBAAgB,CAAC,EAAE,wBAAwB,CAAC;IACrD,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC;IAC/B,QAAQ,CAAC,UAAU,CAAC,EAAE;QACpB,QAAQ,CAAC,0BAA0B,CAAC,EAAE;YACpC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,MAAM,CAAC;YACrC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,eAAe,CAAC;SAChD,CAAC;QACF,QAAQ,CAAC,iBAAiB,CAAC,EAAE;YAC3B,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;SACvB,CAAC;QACF,QAAQ,CAAC,oBAAoB,CAAC,EAAE;YAC9B,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;YAClC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,eAAe,CAAC;YAC5C,QAAQ,CAAC,gBAAgB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;YAC9C,QAAQ,CAAC,mBAAmB,CAAC,EAAE,MAAM,CAAC;SACvC,CAAC;KACH,CAAC;CACH;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,eAAe,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACpE,qEAAqE;IACrE,QAAQ,CAAC,cAAc,CAAC,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5D,QAAQ,CAAC,gBAAgB,CAAC,EAAE,iBAAiB,GAAG,MAAM,CAAC;IACvD,QAAQ,CAAC,eAAe,CAAC,EAAE,iBAAiB,GAAG,MAAM,CAAC;IACtD,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,wBAAwB,CAAC,EAAE,iBAAiB,GAAG,MAAM,CAAC;IAC/D,QAAQ,CAAC,aAAa,CAAC,EAAE,uBAAuB,GAAG,MAAM,CAAC;IAC1D,QAAQ,CAAC,gBAAgB,CAAC,EAAE,0BAA0B,GAAG,MAAM,CAAC;IAChE,QAAQ,CAAC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,iBAAiB,GAAG,MAAM,CAAC;IAC1D,+DAA+D;IAC/D,QAAQ,CAAC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IACtC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,iBAAiB,GAAG,MAAM,CAAC;IACvD,2DAA2D;IAC3D,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9D,QAAQ,CAAC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IACtC,QAAQ,CAAC,SAAS,CAAC,EAAE,QAAQ,GAAG,MAAM,GAAG,OAAO,CAAC;IACjD,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC;IAC/B,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;CACrC;AAcD,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,eAAe,EACrB,QAAQ,EAAE,SAAS,aAAa,EAAE,GACjC,iBAAiB,CAqBnB;AAMD,wBAAgB,aAAa,CAC3B,OAAO,EAAE,gBAAgB,EACzB,QAAQ,EAAE,SAAS,aAAa,EAAE,GACjC,MAAM,CAAC,cAAc,EAAE,SAAS,CAAC,
|
|
1
|
+
{"version":3,"file":"parse-material.d.ts","sourceRoot":"","sources":["../../src/material/parse-material.ts"],"names":[],"mappings":"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"}
|
package/dist/node-file-entry.mjs
CHANGED
|
@@ -19,13 +19,21 @@ var gltfErrorPolicy = {
|
|
|
19
19
|
hint: "rebuild .gltf with valid bufferViews; check accessor index; ensure accessor.byteOffset + EFFECTIVE_STRIDE * (count - 1) + element_size <= bufferView.byteLength"
|
|
20
20
|
},
|
|
21
21
|
"gltf-extension-unsupported": {
|
|
22
|
-
expected: "extension listed in
|
|
23
|
-
hint: "
|
|
22
|
+
expected: "extension listed in the supported allowlist (see EXTENSION_ALLOWLIST in @forgeax/engine-gltf)",
|
|
23
|
+
hint: "remove the unsupported required extension or use a supported glTF extension; extensionsUsed-only entries remain diagnostic"
|
|
24
|
+
},
|
|
25
|
+
"gltf-lod-invalid": {
|
|
26
|
+
expected: "MSFT_lod ids to reference unique existing node indices with valid coverage",
|
|
27
|
+
hint: "repair the MSFT_lod node relation or remove it from extensionsRequired before re-importing"
|
|
24
28
|
},
|
|
25
29
|
"gltf-material-transmission-invalid": {
|
|
26
30
|
expected: "KHR transmission, IOR, and volume values are finite and within their glTF ranges",
|
|
27
31
|
hint: "repair the named glTF material extension value and re-import the source"
|
|
28
32
|
},
|
|
33
|
+
"gltf-material-physical-invalid": {
|
|
34
|
+
expected: "KHR clearcoat, anisotropy, sheen, iridescence, and specular values are finite and within their glTF ranges",
|
|
35
|
+
hint: "repair the named physical material extension value and re-import the source"
|
|
36
|
+
},
|
|
29
37
|
"gltf-accessor-type-mismatch": {
|
|
30
38
|
expected: "dense fixed-stride accessor with supported componentType",
|
|
31
39
|
hint: "sparse: see feat-future-gltf-sparse-accessor; morph: see feat-future-gltf-morph; interleaved: see feat-future-gltf-mesh-multi-section"
|
|
@@ -389,15 +397,22 @@ function decodeColorAccessor(input, flags = {}) {
|
|
|
389
397
|
// src/check-extensions.ts
|
|
390
398
|
var EXTENSION_ALLOWLIST = [
|
|
391
399
|
"EXT_mesh_gpu_instancing",
|
|
392
|
-
"EXT_meshopt_compression"
|
|
393
|
-
];
|
|
394
|
-
var SUPPORTED_EXTENSIONS = [
|
|
395
|
-
...EXTENSION_ALLOWLIST,
|
|
400
|
+
"EXT_meshopt_compression",
|
|
396
401
|
"KHR_lights_punctual",
|
|
397
402
|
"KHR_texture_transform",
|
|
398
403
|
"KHR_materials_transmission",
|
|
399
404
|
"KHR_materials_ior",
|
|
400
|
-
"KHR_materials_volume"
|
|
405
|
+
"KHR_materials_volume",
|
|
406
|
+
"KHR_materials_clearcoat",
|
|
407
|
+
"KHR_materials_anisotropy",
|
|
408
|
+
"KHR_materials_sheen",
|
|
409
|
+
"KHR_materials_iridescence",
|
|
410
|
+
"KHR_materials_specular"
|
|
411
|
+
];
|
|
412
|
+
var SUPPORTED_EXTENSIONS = [
|
|
413
|
+
...EXTENSION_ALLOWLIST,
|
|
414
|
+
"MSFT_lod",
|
|
415
|
+
"MSFT_screencoverage"
|
|
401
416
|
];
|
|
402
417
|
function checkExtensions(json) {
|
|
403
418
|
const required = json.extensionsRequired ?? [];
|
|
@@ -449,6 +464,81 @@ function decodeBase64(b64) {
|
|
|
449
464
|
return out;
|
|
450
465
|
}
|
|
451
466
|
|
|
467
|
+
// src/lod/parse-lod.ts
|
|
468
|
+
function parseGltfLodExtension(json) {
|
|
469
|
+
const doc = json;
|
|
470
|
+
const nodes = doc.nodes ?? [];
|
|
471
|
+
const rawCoverage = doc.extensions?.MSFT_screencoverage?.scales;
|
|
472
|
+
const groups = [];
|
|
473
|
+
for (let rootNode = 0; rootNode < nodes.length; rootNode += 1) {
|
|
474
|
+
if (nodes[rootNode]?.extensions?.MSFT_lod === void 0) continue;
|
|
475
|
+
const idsRaw = nodes[rootNode]?.extensions?.MSFT_lod?.ids;
|
|
476
|
+
if (!Array.isArray(idsRaw)) {
|
|
477
|
+
return err(gltfErr("gltf-lod-invalid", { rootNode, ids: [], reason: "not-integer" }));
|
|
478
|
+
}
|
|
479
|
+
const ids = idsRaw.filter((value) => typeof value === "number");
|
|
480
|
+
if (ids.length !== idsRaw.length || ids.some((id) => !Number.isInteger(id) || id < 0 || id >= nodes.length)) {
|
|
481
|
+
return err(gltfErr("gltf-lod-invalid", { rootNode, ids, reason: "missing-node" }));
|
|
482
|
+
}
|
|
483
|
+
if (new Set(ids).size !== ids.length || ids.includes(rootNode)) {
|
|
484
|
+
return err(gltfErr("gltf-lod-invalid", { rootNode, ids, reason: "duplicate-node" }));
|
|
485
|
+
}
|
|
486
|
+
const hasMesh = (node) => {
|
|
487
|
+
if (typeof node?.mesh !== "number" || !Number.isInteger(node.mesh) || node.mesh < 0) {
|
|
488
|
+
return false;
|
|
489
|
+
}
|
|
490
|
+
const mesh = doc.meshes?.[node.mesh];
|
|
491
|
+
return mesh !== void 0 && Array.isArray(mesh.primitives) && mesh.primitives.length > 0;
|
|
492
|
+
};
|
|
493
|
+
if (!hasMesh(nodes[rootNode]) || ids.some((id) => !hasMesh(nodes[id]))) {
|
|
494
|
+
return err(gltfErr("gltf-lod-invalid", { rootNode, ids, reason: "missing-node" }));
|
|
495
|
+
}
|
|
496
|
+
const nodeCoverage = nodes[rootNode]?.extras?.MSFT_screencoverage;
|
|
497
|
+
const coverage = normalizeScreenCoverages(
|
|
498
|
+
nodeCoverage === void 0 ? rawCoverage : nodeCoverage,
|
|
499
|
+
ids.length,
|
|
500
|
+
nodeCoverage !== void 0
|
|
501
|
+
);
|
|
502
|
+
if (coverage === "invalid") {
|
|
503
|
+
return err(gltfErr("gltf-lod-invalid", { rootNode, ids, reason: "coverage" }));
|
|
504
|
+
}
|
|
505
|
+
groups.push({
|
|
506
|
+
rootNode,
|
|
507
|
+
lodNodeIds: ids,
|
|
508
|
+
screenCoverages: coverage ?? []
|
|
509
|
+
});
|
|
510
|
+
}
|
|
511
|
+
const first = groups[0];
|
|
512
|
+
if (first === void 0) {
|
|
513
|
+
if (doc.extensionsRequired?.some((extension) => extension === "MSFT_lod")) {
|
|
514
|
+
return err(gltfErr("gltf-lod-invalid", { rootNode: 0, ids: [], reason: "missing-node" }));
|
|
515
|
+
}
|
|
516
|
+
return ok({ rootNode: 0, lodNodeIds: [], screenCoverages: [], groups: [] });
|
|
517
|
+
}
|
|
518
|
+
return ok({
|
|
519
|
+
rootNode: first.rootNode,
|
|
520
|
+
lodNodeIds: first.lodNodeIds,
|
|
521
|
+
screenCoverages: first.screenCoverages,
|
|
522
|
+
groups
|
|
523
|
+
});
|
|
524
|
+
}
|
|
525
|
+
function normalizeScreenCoverages(raw, lodCount, officialNodeForm) {
|
|
526
|
+
if (raw === void 0) return void 0;
|
|
527
|
+
if (!Array.isArray(raw)) return "invalid";
|
|
528
|
+
if (raw.some(
|
|
529
|
+
(value) => typeof value !== "number" || !Number.isFinite(value) || value <= 0 || value > 1
|
|
530
|
+
)) {
|
|
531
|
+
return "invalid";
|
|
532
|
+
}
|
|
533
|
+
const expectedLengths = officialNodeForm ? [lodCount + 1] : [lodCount, lodCount + 1];
|
|
534
|
+
if (!expectedLengths.includes(raw.length)) return "invalid";
|
|
535
|
+
const values = raw.slice(0, lodCount);
|
|
536
|
+
for (let index = 1; index < values.length; index += 1) {
|
|
537
|
+
if (values[index] >= values[index - 1]) return "invalid";
|
|
538
|
+
}
|
|
539
|
+
return values;
|
|
540
|
+
}
|
|
541
|
+
|
|
452
542
|
// src/material/parse-material.ts
|
|
453
543
|
function tuple2(values) {
|
|
454
544
|
if (values === void 0 || values.length < 2) return void 0;
|
|
@@ -493,6 +583,11 @@ function parseMaterial(matJson, textures) {
|
|
|
493
583
|
const transmission = matJson.extensions?.KHR_materials_transmission;
|
|
494
584
|
const ior = matJson.extensions?.KHR_materials_ior;
|
|
495
585
|
const volume = matJson.extensions?.KHR_materials_volume;
|
|
586
|
+
const clearcoat = matJson.extensions?.KHR_materials_clearcoat;
|
|
587
|
+
const anisotropy = matJson.extensions?.KHR_materials_anisotropy;
|
|
588
|
+
const sheen = matJson.extensions?.KHR_materials_sheen;
|
|
589
|
+
const iridescence = matJson.extensions?.KHR_materials_iridescence;
|
|
590
|
+
const specular = matJson.extensions?.KHR_materials_specular;
|
|
496
591
|
const attenuationColor = tuple3(volume?.attenuationColor);
|
|
497
592
|
const invalid = (extension, field, reason, actual) => err(
|
|
498
593
|
gltfErr("gltf-material-transmission-invalid", {
|
|
@@ -502,6 +597,14 @@ function parseMaterial(matJson, textures) {
|
|
|
502
597
|
...actual === void 0 ? {} : { actual }
|
|
503
598
|
})
|
|
504
599
|
);
|
|
600
|
+
const physicalInvalid = (extension, field, reason, actual) => err(
|
|
601
|
+
gltfErr("gltf-material-physical-invalid", {
|
|
602
|
+
extension,
|
|
603
|
+
field,
|
|
604
|
+
reason,
|
|
605
|
+
...actual === void 0 ? {} : { actual }
|
|
606
|
+
})
|
|
607
|
+
);
|
|
505
608
|
if (transmission?.transmissionFactor !== void 0 && (typeof transmission.transmissionFactor !== "number" || !Number.isFinite(transmission.transmissionFactor))) {
|
|
506
609
|
return invalid(
|
|
507
610
|
"KHR_materials_transmission",
|
|
@@ -552,6 +655,98 @@ function parseMaterial(matJson, textures) {
|
|
|
552
655
|
if (alphaMode === "BLEND" && (transmission?.transmissionFactor ?? 0) > 0) {
|
|
553
656
|
return invalid("KHR_materials_transmission", "alphaMode", "blend", alphaMode);
|
|
554
657
|
}
|
|
658
|
+
if (clearcoat?.clearcoatFactor !== void 0 && (typeof clearcoat.clearcoatFactor !== "number" || !Number.isFinite(clearcoat.clearcoatFactor))) {
|
|
659
|
+
return physicalInvalid(
|
|
660
|
+
"KHR_materials_clearcoat",
|
|
661
|
+
"clearcoatFactor",
|
|
662
|
+
"non-finite",
|
|
663
|
+
clearcoat.clearcoatFactor
|
|
664
|
+
);
|
|
665
|
+
}
|
|
666
|
+
if (clearcoat?.clearcoatFactor !== void 0 && (clearcoat.clearcoatFactor < 0 || clearcoat.clearcoatFactor > 1)) {
|
|
667
|
+
return physicalInvalid(
|
|
668
|
+
"KHR_materials_clearcoat",
|
|
669
|
+
"clearcoatFactor",
|
|
670
|
+
"range",
|
|
671
|
+
clearcoat.clearcoatFactor
|
|
672
|
+
);
|
|
673
|
+
}
|
|
674
|
+
if (clearcoat?.clearcoatRoughnessFactor !== void 0 && (typeof clearcoat.clearcoatRoughnessFactor !== "number" || !Number.isFinite(clearcoat.clearcoatRoughnessFactor))) {
|
|
675
|
+
return physicalInvalid(
|
|
676
|
+
"KHR_materials_clearcoat",
|
|
677
|
+
"clearcoatRoughnessFactor",
|
|
678
|
+
"non-finite",
|
|
679
|
+
clearcoat.clearcoatRoughnessFactor
|
|
680
|
+
);
|
|
681
|
+
}
|
|
682
|
+
if (clearcoat?.clearcoatRoughnessFactor !== void 0 && (clearcoat.clearcoatRoughnessFactor < 0 || clearcoat.clearcoatRoughnessFactor > 1)) {
|
|
683
|
+
return physicalInvalid(
|
|
684
|
+
"KHR_materials_clearcoat",
|
|
685
|
+
"clearcoatRoughnessFactor",
|
|
686
|
+
"range",
|
|
687
|
+
clearcoat.clearcoatRoughnessFactor
|
|
688
|
+
);
|
|
689
|
+
}
|
|
690
|
+
if (clearcoat?.clearcoatNormalTexture?.scale !== void 0 && (typeof clearcoat.clearcoatNormalTexture.scale !== "number" || !Number.isFinite(clearcoat.clearcoatNormalTexture.scale) || clearcoat.clearcoatNormalTexture.scale < 0)) {
|
|
691
|
+
return physicalInvalid(
|
|
692
|
+
"KHR_materials_clearcoat",
|
|
693
|
+
"clearcoatNormalTexture.scale",
|
|
694
|
+
"range",
|
|
695
|
+
clearcoat.clearcoatNormalTexture.scale
|
|
696
|
+
);
|
|
697
|
+
}
|
|
698
|
+
const validateUnit = (extension, field, value) => {
|
|
699
|
+
if (value === void 0) return void 0;
|
|
700
|
+
if (typeof value !== "number" || !Number.isFinite(value))
|
|
701
|
+
return physicalInvalid(extension, field, "non-finite", value);
|
|
702
|
+
if (value < 0 || value > 1) return physicalInvalid(extension, field, "range", value);
|
|
703
|
+
return void 0;
|
|
704
|
+
};
|
|
705
|
+
const validateFinite = (extension, field, value, minimum) => {
|
|
706
|
+
if (value === void 0) return void 0;
|
|
707
|
+
if (typeof value !== "number" || !Number.isFinite(value))
|
|
708
|
+
return physicalInvalid(extension, field, "non-finite", value);
|
|
709
|
+
if (minimum !== void 0 && value < minimum)
|
|
710
|
+
return physicalInvalid(extension, field, "range", value);
|
|
711
|
+
return void 0;
|
|
712
|
+
};
|
|
713
|
+
const validateColor = (extension, field, value) => {
|
|
714
|
+
if (value === void 0) return void 0;
|
|
715
|
+
if (value.length < 3 || value.slice(0, 3).some((channel) => typeof channel !== "number" || !Number.isFinite(channel))) {
|
|
716
|
+
return physicalInvalid(extension, field, "type", value);
|
|
717
|
+
}
|
|
718
|
+
if (value.slice(0, 3).some((channel) => channel < 0 || channel > 1)) {
|
|
719
|
+
return physicalInvalid(extension, field, "range", value);
|
|
720
|
+
}
|
|
721
|
+
return void 0;
|
|
722
|
+
};
|
|
723
|
+
const physicalChecks = [
|
|
724
|
+
validateUnit("KHR_materials_anisotropy", "anisotropyStrength", anisotropy?.anisotropyStrength),
|
|
725
|
+
validateFinite(
|
|
726
|
+
"KHR_materials_anisotropy",
|
|
727
|
+
"anisotropyRotation",
|
|
728
|
+
anisotropy?.anisotropyRotation
|
|
729
|
+
),
|
|
730
|
+
validateUnit("KHR_materials_sheen", "sheenRoughnessFactor", sheen?.sheenRoughnessFactor),
|
|
731
|
+
validateColor("KHR_materials_sheen", "sheenColorFactor", sheen?.sheenColorFactor),
|
|
732
|
+
validateUnit("KHR_materials_iridescence", "iridescenceFactor", iridescence?.iridescenceFactor),
|
|
733
|
+
validateFinite("KHR_materials_iridescence", "iridescenceIor", iridescence?.iridescenceIor, 1),
|
|
734
|
+
validateFinite(
|
|
735
|
+
"KHR_materials_iridescence",
|
|
736
|
+
"iridescenceThicknessMinimum",
|
|
737
|
+
iridescence?.iridescenceThicknessMinimum,
|
|
738
|
+
0
|
|
739
|
+
),
|
|
740
|
+
validateFinite(
|
|
741
|
+
"KHR_materials_iridescence",
|
|
742
|
+
"iridescenceThicknessMaximum",
|
|
743
|
+
iridescence?.iridescenceThicknessMaximum,
|
|
744
|
+
0
|
|
745
|
+
),
|
|
746
|
+
validateUnit("KHR_materials_specular", "specularFactor", specular?.specularFactor),
|
|
747
|
+
validateColor("KHR_materials_specular", "specularColorFactor", specular?.specularColorFactor)
|
|
748
|
+
];
|
|
749
|
+
for (const check of physicalChecks) if (check !== void 0) return check;
|
|
555
750
|
return ok({
|
|
556
751
|
...matJson.name === void 0 ? {} : { name: matJson.name },
|
|
557
752
|
baseColorFactor: baseColor4,
|
|
@@ -588,6 +783,65 @@ function parseMaterial(matJson, textures) {
|
|
|
588
783
|
...attenuationColor === void 0 ? {} : { attenuationColor },
|
|
589
784
|
...finiteOrUndefined(volume.attenuationDistance) === void 0 ? {} : { attenuationDistance: volume.attenuationDistance }
|
|
590
785
|
},
|
|
786
|
+
...clearcoat === void 0 ? {} : {
|
|
787
|
+
clearcoatFactor: clearcoat.clearcoatFactor ?? 0,
|
|
788
|
+
clearcoatChannel: 0,
|
|
789
|
+
clearcoatRoughnessFactor: clearcoat.clearcoatRoughnessFactor ?? 0,
|
|
790
|
+
clearcoatRoughnessChannel: 1,
|
|
791
|
+
clearcoatNormalChannel: [0, 1],
|
|
792
|
+
...clearcoat.clearcoatTexture === void 0 ? {} : { clearcoatTexture: parseTextureInfo(clearcoat.clearcoatTexture, textures) },
|
|
793
|
+
...clearcoat.clearcoatRoughnessTexture === void 0 ? {} : {
|
|
794
|
+
clearcoatRoughnessTexture: parseTextureInfo(
|
|
795
|
+
clearcoat.clearcoatRoughnessTexture,
|
|
796
|
+
textures
|
|
797
|
+
)
|
|
798
|
+
},
|
|
799
|
+
...clearcoat.clearcoatNormalTexture === void 0 ? {} : {
|
|
800
|
+
clearcoatNormalTexture: {
|
|
801
|
+
...parseTextureInfo(clearcoat.clearcoatNormalTexture, textures),
|
|
802
|
+
...clearcoat.clearcoatNormalTexture.scale === void 0 ? {} : { scale: clearcoat.clearcoatNormalTexture.scale }
|
|
803
|
+
}
|
|
804
|
+
}
|
|
805
|
+
},
|
|
806
|
+
...anisotropy === void 0 ? {} : {
|
|
807
|
+
anisotropyStrength: anisotropy.anisotropyStrength ?? 0,
|
|
808
|
+
anisotropyRotation: anisotropy.anisotropyRotation ?? 0,
|
|
809
|
+
anisotropyChannel: [0, 1, 2],
|
|
810
|
+
...anisotropy.anisotropyTexture === void 0 ? {} : { anisotropyTexture: parseTextureInfo(anisotropy.anisotropyTexture, textures) }
|
|
811
|
+
},
|
|
812
|
+
...sheen === void 0 ? {} : {
|
|
813
|
+
sheenColorFactor: tuple3(sheen.sheenColorFactor) ?? [0, 0, 0],
|
|
814
|
+
sheenColorChannel: [0, 1, 2],
|
|
815
|
+
sheenRoughnessFactor: sheen.sheenRoughnessFactor ?? 0,
|
|
816
|
+
sheenRoughnessChannel: 3,
|
|
817
|
+
...sheen.sheenColorTexture === void 0 ? {} : { sheenColorTexture: parseTextureInfo(sheen.sheenColorTexture, textures) },
|
|
818
|
+
...sheen.sheenRoughnessTexture === void 0 ? {} : { sheenRoughnessTexture: parseTextureInfo(sheen.sheenRoughnessTexture, textures) }
|
|
819
|
+
},
|
|
820
|
+
...iridescence === void 0 ? {} : {
|
|
821
|
+
iridescenceFactor: iridescence.iridescenceFactor ?? 0,
|
|
822
|
+
iridescenceIor: iridescence.iridescenceIor ?? 1.3,
|
|
823
|
+
iridescenceThicknessMinimum: iridescence.iridescenceThicknessMinimum ?? 100,
|
|
824
|
+
iridescenceThicknessMaximum: iridescence.iridescenceThicknessMaximum ?? 400,
|
|
825
|
+
iridescenceChannel: 0,
|
|
826
|
+
iridescenceThicknessChannel: 1,
|
|
827
|
+
...iridescence.iridescenceTexture === void 0 ? {} : { iridescenceTexture: parseTextureInfo(iridescence.iridescenceTexture, textures) },
|
|
828
|
+
...iridescence.iridescenceThicknessTexture === void 0 ? {} : {
|
|
829
|
+
iridescenceThicknessTexture: parseTextureInfo(
|
|
830
|
+
iridescence.iridescenceThicknessTexture,
|
|
831
|
+
textures
|
|
832
|
+
)
|
|
833
|
+
}
|
|
834
|
+
},
|
|
835
|
+
...specular === void 0 ? {} : {
|
|
836
|
+
specularFactor: specular.specularFactor ?? 1,
|
|
837
|
+
specularChannel: 3,
|
|
838
|
+
specularColorFactor: tuple3(specular.specularColorFactor) ?? [1, 1, 1],
|
|
839
|
+
specularColorChannel: [0, 1, 2],
|
|
840
|
+
...specular.specularTexture === void 0 ? {} : { specularTexture: parseTextureInfo(specular.specularTexture, textures) },
|
|
841
|
+
...specular.specularColorTexture === void 0 ? {} : {
|
|
842
|
+
specularColorTexture: parseTextureInfo(specular.specularColorTexture, textures)
|
|
843
|
+
}
|
|
844
|
+
},
|
|
591
845
|
...alphaMode === void 0 ? {} : { alphaMode },
|
|
592
846
|
...alphaCutoff === void 0 ? {} : { alphaCutoff },
|
|
593
847
|
...matJson.doubleSided === true ? { doubleSided: true } : {},
|
|
@@ -1374,6 +1628,8 @@ async function parseGltfWithBin(json, ctx) {
|
|
|
1374
1628
|
const extResult = checkExtensions(json);
|
|
1375
1629
|
if (!extResult.ok) return err(extResult.error);
|
|
1376
1630
|
const unsupportedExtensions = extResult.value.unsupportedUsed;
|
|
1631
|
+
const lodResult = parseGltfLodExtension(json);
|
|
1632
|
+
if (!lodResult.ok) return err(lodResult.error);
|
|
1377
1633
|
const lightsResult = parsePunctualLights(json, ctx.filePath);
|
|
1378
1634
|
if (!lightsResult.ok) return err(lightsResult.error);
|
|
1379
1635
|
const meshesJson = json.meshes ?? [];
|
|
@@ -1914,7 +2170,8 @@ async function parseGltfWithBin(json, ctx) {
|
|
|
1914
2170
|
matrixTrsCoexistNodes: diagnostics.matrixTrsCoexistNodes
|
|
1915
2171
|
},
|
|
1916
2172
|
meshPrimitiveCount,
|
|
1917
|
-
lights: lightsResult.value
|
|
2173
|
+
lights: lightsResult.value,
|
|
2174
|
+
...lodResult.value.lodNodeIds.length === 0 ? {} : { lod: lodResult.value }
|
|
1918
2175
|
});
|
|
1919
2176
|
}
|
|
1920
2177
|
async function parseGltfForImporter(json, externalLoader, filePath, options = {}) {
|