@inweb/viewer-three 27.4.2 → 27.4.3
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/dist/viewer-three.js +145 -52
- package/dist/viewer-three.js.map +1 -1
- package/dist/viewer-three.min.js +3 -3
- package/dist/viewer-three.module.js +146 -53
- package/dist/viewer-three.module.js.map +1 -1
- package/package.json +5 -5
- package/src/Viewer/loaders/DynamicGltfLoader/DynamicGltfLoader.js +19 -40
- package/src/Viewer/loaders/DynamicGltfLoader/GltfStructure.js +164 -34
package/dist/viewer-three.js
CHANGED
|
@@ -38259,6 +38259,19 @@ void main() {
|
|
|
38259
38259
|
}
|
|
38260
38260
|
}
|
|
38261
38261
|
|
|
38262
|
+
const GL_TO_THREE_WRAP = {
|
|
38263
|
+
33071: ClampToEdgeWrapping,
|
|
38264
|
+
33648: MirroredRepeatWrapping,
|
|
38265
|
+
10497: RepeatWrapping,
|
|
38266
|
+
};
|
|
38267
|
+
const GL_TO_THREE_FILTER = {
|
|
38268
|
+
9728: NearestFilter,
|
|
38269
|
+
9729: LinearFilter,
|
|
38270
|
+
9984: NearestMipmapNearestFilter,
|
|
38271
|
+
9985: LinearMipmapNearestFilter,
|
|
38272
|
+
9986: NearestMipmapLinearFilter,
|
|
38273
|
+
9987: LinearMipmapLinearFilter,
|
|
38274
|
+
};
|
|
38262
38275
|
const GL_COMPONENT_TYPES = {
|
|
38263
38276
|
5120: Int8Array,
|
|
38264
38277
|
5121: Uint8Array,
|
|
@@ -38301,6 +38314,7 @@ void main() {
|
|
|
38301
38314
|
this.pendingRequests = [];
|
|
38302
38315
|
this.batchTimeout = null;
|
|
38303
38316
|
this.textureLoader = new TextureLoader();
|
|
38317
|
+
this.textureLoader.crossOrigin = "anonymous";
|
|
38304
38318
|
this.materials = new Map();
|
|
38305
38319
|
this.textureCache = new Map();
|
|
38306
38320
|
this.materialCache = new Map();
|
|
@@ -38312,7 +38326,7 @@ void main() {
|
|
|
38312
38326
|
async initialize(loader) {
|
|
38313
38327
|
const json = await this.loadController.loadJson();
|
|
38314
38328
|
if (json.asset === undefined || json.asset.version[0] < 2) {
|
|
38315
|
-
throw new Error("
|
|
38329
|
+
throw new Error("DynamicLoader: Unsupported asset. glTF versions >=2.0 are supported.");
|
|
38316
38330
|
}
|
|
38317
38331
|
this.json = json;
|
|
38318
38332
|
this.loader = loader;
|
|
@@ -38340,7 +38354,9 @@ void main() {
|
|
|
38340
38354
|
scheduleRequest(request) {
|
|
38341
38355
|
return new Promise((resolve, reject) => {
|
|
38342
38356
|
if (this.loadingAborted) {
|
|
38343
|
-
reject(
|
|
38357
|
+
reject(
|
|
38358
|
+
this.criticalError || new Error("DynamicLoader: Structure loading has been aborted due to critical error")
|
|
38359
|
+
);
|
|
38344
38360
|
return;
|
|
38345
38361
|
}
|
|
38346
38362
|
this.pendingRequests.push({
|
|
@@ -38379,7 +38395,7 @@ void main() {
|
|
|
38379
38395
|
}
|
|
38380
38396
|
}
|
|
38381
38397
|
console.error(
|
|
38382
|
-
|
|
38398
|
+
`DynamicLoader: Critical error for structure "${this.id}". All further loading aborted.`,
|
|
38383
38399
|
`\n Error: ${error.message || error}`,
|
|
38384
38400
|
`\n Rejected ${requests.length} pending chunk requests.`
|
|
38385
38401
|
);
|
|
@@ -38449,7 +38465,7 @@ void main() {
|
|
|
38449
38465
|
const promises = finalRanges.map(async (range, index) => {
|
|
38450
38466
|
if (this.loadingAborted) {
|
|
38451
38467
|
for (const req of range.requests) {
|
|
38452
|
-
req._reject(this.criticalError || new Error("Structure loading aborted"));
|
|
38468
|
+
req._reject(this.criticalError || new Error("DynamicLoader: Structure loading aborted"));
|
|
38453
38469
|
}
|
|
38454
38470
|
return;
|
|
38455
38471
|
}
|
|
@@ -38472,7 +38488,10 @@ void main() {
|
|
|
38472
38488
|
if (this.isCriticalHttpError(error)) {
|
|
38473
38489
|
this.abortLoading(error);
|
|
38474
38490
|
} else {
|
|
38475
|
-
console.warn(
|
|
38491
|
+
console.warn(
|
|
38492
|
+
`DynamicLoader: Failed to load chunk ${index + 1}/${finalRanges.length} (${range.start}-${range.end}):`,
|
|
38493
|
+
error
|
|
38494
|
+
);
|
|
38476
38495
|
}
|
|
38477
38496
|
} finally {
|
|
38478
38497
|
this.loader.releaseChunkSlot();
|
|
@@ -38491,7 +38510,7 @@ void main() {
|
|
|
38491
38510
|
createTypedArray(buffer, offset, length, componentType) {
|
|
38492
38511
|
try {
|
|
38493
38512
|
if (!buffer || !(buffer instanceof ArrayBuffer)) {
|
|
38494
|
-
throw new Error("Invalid buffer");
|
|
38513
|
+
throw new Error("DynamicLoader: Invalid buffer");
|
|
38495
38514
|
}
|
|
38496
38515
|
let elementSize;
|
|
38497
38516
|
switch (componentType) {
|
|
@@ -38508,20 +38527,22 @@ void main() {
|
|
|
38508
38527
|
elementSize = 4;
|
|
38509
38528
|
break;
|
|
38510
38529
|
default:
|
|
38511
|
-
throw new Error(`Unsupported component type: ${componentType}`);
|
|
38530
|
+
throw new Error(`DynamicLoader: Unsupported component type: ${componentType}`);
|
|
38512
38531
|
}
|
|
38513
38532
|
const numElements = length / elementSize;
|
|
38514
38533
|
if (!Number.isInteger(numElements)) {
|
|
38515
|
-
throw new Error(`Invalid length ${length} for component type ${componentType}`);
|
|
38534
|
+
throw new Error(`DynamicLoader: Invalid length ${length} for component type ${componentType}`);
|
|
38516
38535
|
}
|
|
38517
38536
|
if (length > buffer.byteLength) {
|
|
38518
|
-
throw new Error(
|
|
38537
|
+
throw new Error(
|
|
38538
|
+
`DynamicLoader: Buffer too small: need ${length} bytes, but buffer is ${buffer.byteLength} bytes`
|
|
38539
|
+
);
|
|
38519
38540
|
}
|
|
38520
38541
|
const ArrayType = GL_COMPONENT_TYPES[componentType];
|
|
38521
38542
|
return new ArrayType(buffer, offset, numElements);
|
|
38522
38543
|
} catch (error) {
|
|
38523
38544
|
if (error.name !== "AbortError") {
|
|
38524
|
-
console.
|
|
38545
|
+
console.warn("DynamicLoader: Error creating typed array:", {
|
|
38525
38546
|
bufferSize: buffer?.byteLength,
|
|
38526
38547
|
offset,
|
|
38527
38548
|
length,
|
|
@@ -38534,7 +38555,7 @@ void main() {
|
|
|
38534
38555
|
}
|
|
38535
38556
|
async createBufferAttribute(accessorIndex) {
|
|
38536
38557
|
if (!this.json) {
|
|
38537
|
-
throw new Error("No GLTF structure loaded");
|
|
38558
|
+
throw new Error("DynamicLoader: No GLTF structure loaded");
|
|
38538
38559
|
}
|
|
38539
38560
|
const gltf = this.json;
|
|
38540
38561
|
const accessor = gltf.accessors[accessorIndex];
|
|
@@ -38551,7 +38572,7 @@ void main() {
|
|
|
38551
38572
|
return attribute;
|
|
38552
38573
|
} catch (error) {
|
|
38553
38574
|
if (error.name !== "AbortError") {
|
|
38554
|
-
console.
|
|
38575
|
+
console.warn("DynamicLoader: Error creating buffer attribute:", {
|
|
38555
38576
|
error,
|
|
38556
38577
|
accessor,
|
|
38557
38578
|
bufferView,
|
|
@@ -38572,7 +38593,7 @@ void main() {
|
|
|
38572
38593
|
case 5126:
|
|
38573
38594
|
return 4;
|
|
38574
38595
|
default:
|
|
38575
|
-
throw new Error(`Unknown component type: ${componentType}`);
|
|
38596
|
+
throw new Error(`DynamicLoader: Unknown component type: ${componentType}`);
|
|
38576
38597
|
}
|
|
38577
38598
|
}
|
|
38578
38599
|
getNumComponents(type) {
|
|
@@ -38592,31 +38613,50 @@ void main() {
|
|
|
38592
38613
|
case "MAT4":
|
|
38593
38614
|
return 16;
|
|
38594
38615
|
default:
|
|
38595
|
-
throw new Error(`Unknown type: ${type}`);
|
|
38616
|
+
throw new Error(`DynamicLoader: Unknown type: ${type}`);
|
|
38596
38617
|
}
|
|
38597
38618
|
}
|
|
38598
38619
|
async loadTextures() {
|
|
38599
38620
|
if (!this.json.textures) return;
|
|
38600
38621
|
const loadTexture = async (imageIndex) => {
|
|
38601
|
-
|
|
38602
|
-
|
|
38603
|
-
const
|
|
38604
|
-
|
|
38605
|
-
|
|
38606
|
-
|
|
38607
|
-
|
|
38608
|
-
|
|
38609
|
-
|
|
38610
|
-
|
|
38611
|
-
|
|
38612
|
-
|
|
38613
|
-
|
|
38622
|
+
let textureName = `index_${imageIndex}`;
|
|
38623
|
+
try {
|
|
38624
|
+
const image = this.json.images[imageIndex];
|
|
38625
|
+
textureName = image.uri || image.name || textureName;
|
|
38626
|
+
if (image.uri) {
|
|
38627
|
+
const fullUrl = await this.loadController.resolveURL(image.uri);
|
|
38628
|
+
return await this.textureLoader.loadAsync(fullUrl);
|
|
38629
|
+
} else if (image.bufferView !== undefined) {
|
|
38630
|
+
const bufferView = this.json.bufferViews[image.bufferView];
|
|
38631
|
+
const array = await this.getBufferView(bufferView.byteOffset || 0, bufferView.byteLength, 5121);
|
|
38632
|
+
const blob = new Blob([array], { type: image.mimeType });
|
|
38633
|
+
const url = URL.createObjectURL(blob);
|
|
38634
|
+
const texture = await this.textureLoader.loadAsync(url);
|
|
38635
|
+
URL.revokeObjectURL(url);
|
|
38636
|
+
return texture;
|
|
38637
|
+
}
|
|
38638
|
+
} catch {
|
|
38639
|
+
console.warn(`DynamicLoader: Error loading texture ${textureName}`);
|
|
38614
38640
|
}
|
|
38615
38641
|
};
|
|
38616
38642
|
const texturePromises = [];
|
|
38617
38643
|
for (let i = 0; i < this.json.textures.length; i++) {
|
|
38618
38644
|
texturePromises.push(
|
|
38619
|
-
loadTexture(this.json.textures[i].source).then((texture) =>
|
|
38645
|
+
loadTexture(this.json.textures[i].source).then((texture) => {
|
|
38646
|
+
if (texture) {
|
|
38647
|
+
const samplerDef =
|
|
38648
|
+
this.json.textures[i].sampler !== undefined && this.json.samplers
|
|
38649
|
+
? this.json.samplers[this.json.textures[i].sampler]
|
|
38650
|
+
: {};
|
|
38651
|
+
texture.magFilter = GL_TO_THREE_FILTER[samplerDef.magFilter] || LinearFilter;
|
|
38652
|
+
texture.minFilter = GL_TO_THREE_FILTER[samplerDef.minFilter] || LinearMipmapLinearFilter;
|
|
38653
|
+
texture.wrapS = GL_TO_THREE_WRAP[samplerDef.wrapS] || RepeatWrapping;
|
|
38654
|
+
texture.wrapT = GL_TO_THREE_WRAP[samplerDef.wrapT] || RepeatWrapping;
|
|
38655
|
+
texture.flipY = false;
|
|
38656
|
+
texture.needsUpdate = true;
|
|
38657
|
+
}
|
|
38658
|
+
this.textureCache.set(i, texture);
|
|
38659
|
+
})
|
|
38620
38660
|
);
|
|
38621
38661
|
}
|
|
38622
38662
|
await Promise.all(texturePromises);
|
|
@@ -38647,8 +38687,14 @@ void main() {
|
|
|
38647
38687
|
params.opacity = pbr.baseColorFactor[3];
|
|
38648
38688
|
if (params.opacity < 1.0) params.transparent = true;
|
|
38649
38689
|
}
|
|
38650
|
-
if (pbr.baseColorTexture) {
|
|
38651
|
-
|
|
38690
|
+
if (pbr.baseColorTexture !== undefined) {
|
|
38691
|
+
const texture = this.textureCache.get(pbr.baseColorTexture.index);
|
|
38692
|
+
if (texture) {
|
|
38693
|
+
params.map = texture;
|
|
38694
|
+
if (!pbr.baseColorFactor) {
|
|
38695
|
+
params.color = new Color(0xffffff);
|
|
38696
|
+
}
|
|
38697
|
+
}
|
|
38652
38698
|
}
|
|
38653
38699
|
}
|
|
38654
38700
|
if (materialDef.emissiveFactor) {
|
|
@@ -38678,10 +38724,58 @@ void main() {
|
|
|
38678
38724
|
params.polygonOffset = true;
|
|
38679
38725
|
params.polygonOffsetFactor = 1;
|
|
38680
38726
|
params.polygonOffsetUnits = 1;
|
|
38681
|
-
if (materialDef.
|
|
38682
|
-
params.
|
|
38727
|
+
if (params.map && !materialDef.pbrMetallicRoughness?.baseColorFactor) {
|
|
38728
|
+
params.color = new Color(0xffffff);
|
|
38729
|
+
}
|
|
38730
|
+
if (materialDef.normalTexture !== undefined) {
|
|
38731
|
+
const normalMap = this.textureCache.get(materialDef.normalTexture.index);
|
|
38732
|
+
if (normalMap) {
|
|
38733
|
+
params.normalMap = normalMap;
|
|
38734
|
+
}
|
|
38735
|
+
}
|
|
38736
|
+
if (materialDef.emissiveTexture !== undefined) {
|
|
38737
|
+
const emissiveMap = this.textureCache.get(materialDef.emissiveTexture.index);
|
|
38738
|
+
if (emissiveMap) {
|
|
38739
|
+
params.emissiveMap = emissiveMap;
|
|
38740
|
+
}
|
|
38741
|
+
}
|
|
38742
|
+
const usePBR = materialDef.pbrMetallicRoughness?.metallicRoughnessTexture !== undefined;
|
|
38743
|
+
if (usePBR) {
|
|
38744
|
+
params.metalness =
|
|
38745
|
+
materialDef.pbrMetallicRoughness?.metallicFactor !== undefined
|
|
38746
|
+
? materialDef.pbrMetallicRoughness.metallicFactor
|
|
38747
|
+
: 1.0;
|
|
38748
|
+
params.roughness =
|
|
38749
|
+
materialDef.pbrMetallicRoughness?.roughnessFactor !== undefined
|
|
38750
|
+
? materialDef.pbrMetallicRoughness.roughnessFactor
|
|
38751
|
+
: 1.0;
|
|
38752
|
+
if (materialDef.pbrMetallicRoughness?.metallicRoughnessTexture !== undefined) {
|
|
38753
|
+
const map = this.textureCache.get(materialDef.pbrMetallicRoughness.metallicRoughnessTexture.index);
|
|
38754
|
+
if (map) {
|
|
38755
|
+
params.metalnessMap = map;
|
|
38756
|
+
params.roughnessMap = map;
|
|
38757
|
+
}
|
|
38758
|
+
}
|
|
38759
|
+
material = new MeshStandardMaterial(params);
|
|
38760
|
+
} else {
|
|
38761
|
+
material = new MeshPhongMaterial(params);
|
|
38762
|
+
}
|
|
38763
|
+
if (material.map) material.map.colorSpace = SRGBColorSpace;
|
|
38764
|
+
if (material.emissiveMap) material.emissiveMap.colorSpace = SRGBColorSpace;
|
|
38765
|
+
if (material.normalMap) {
|
|
38766
|
+
if (materialDef.normalTexture?.scale !== undefined) {
|
|
38767
|
+
material.normalScale.set(materialDef.normalTexture.scale, materialDef.normalTexture.scale);
|
|
38768
|
+
}
|
|
38769
|
+
}
|
|
38770
|
+
if (materialDef.occlusionTexture !== undefined) {
|
|
38771
|
+
const aoMap = this.textureCache.get(materialDef.occlusionTexture.index);
|
|
38772
|
+
if (aoMap) {
|
|
38773
|
+
material.aoMap = aoMap;
|
|
38774
|
+
if (materialDef.occlusionTexture.strength !== undefined) {
|
|
38775
|
+
material.aoMapIntensity = materialDef.occlusionTexture.strength;
|
|
38776
|
+
}
|
|
38777
|
+
}
|
|
38683
38778
|
}
|
|
38684
|
-
material = new MeshPhongMaterial(params);
|
|
38685
38779
|
}
|
|
38686
38780
|
return material;
|
|
38687
38781
|
}
|
|
@@ -39085,7 +39179,7 @@ void main() {
|
|
|
39085
39179
|
memoryLimit = Math.max(memoryLimit, 2 * 1024 * 1024 * 1024);
|
|
39086
39180
|
console.log(`Available memory set to ${Math.round(memoryLimit / (1024 * 1024 * 1024))}GB`);
|
|
39087
39181
|
} catch (error) {
|
|
39088
|
-
console.warn("Error detecting available memory:", error);
|
|
39182
|
+
console.warn("DynamicLoader: Error detecting available memory:", error);
|
|
39089
39183
|
}
|
|
39090
39184
|
return memoryLimit;
|
|
39091
39185
|
}
|
|
@@ -39250,7 +39344,7 @@ void main() {
|
|
|
39250
39344
|
if (entry?.lines?.uuid) uniqueMaterialIds.add(entry.lines.uuid);
|
|
39251
39345
|
}
|
|
39252
39346
|
} catch (exp) {
|
|
39253
|
-
console.
|
|
39347
|
+
console.warn("DynamicLoader: Error collecting material stats", exp);
|
|
39254
39348
|
}
|
|
39255
39349
|
}
|
|
39256
39350
|
}
|
|
@@ -39271,7 +39365,7 @@ void main() {
|
|
|
39271
39365
|
this._webglInfoCache = { renderer: null, vendor: null };
|
|
39272
39366
|
}
|
|
39273
39367
|
} catch (e) {
|
|
39274
|
-
console.
|
|
39368
|
+
console.warn("DynamicLoader: Error getting webgl info", e);
|
|
39275
39369
|
this._webglInfoCache = { renderer: null, vendor: null };
|
|
39276
39370
|
}
|
|
39277
39371
|
}
|
|
@@ -39528,7 +39622,7 @@ void main() {
|
|
|
39528
39622
|
if (node.structure && node.structure.loadingAborted) {
|
|
39529
39623
|
return;
|
|
39530
39624
|
}
|
|
39531
|
-
console.
|
|
39625
|
+
console.warn(`DynamicLoader: Error loading node ${nodeId}:`, error);
|
|
39532
39626
|
}
|
|
39533
39627
|
}
|
|
39534
39628
|
unloadNode(nodeId) {
|
|
@@ -39581,7 +39675,7 @@ void main() {
|
|
|
39581
39675
|
await structure.loadTextures();
|
|
39582
39676
|
await structure.loadMaterials();
|
|
39583
39677
|
} catch (error) {
|
|
39584
|
-
console.error("Error loading materials:", error);
|
|
39678
|
+
console.error("DynamicLoader: Error loading materials:", error);
|
|
39585
39679
|
throw error;
|
|
39586
39680
|
}
|
|
39587
39681
|
}
|
|
@@ -39589,14 +39683,14 @@ void main() {
|
|
|
39589
39683
|
}
|
|
39590
39684
|
async processSceneHierarchy() {
|
|
39591
39685
|
if (this.structures.length === 0) {
|
|
39592
|
-
throw new Error("No GLTF structures loaded");
|
|
39686
|
+
throw new Error("DynamicLoader: No GLTF structures loaded");
|
|
39593
39687
|
}
|
|
39594
39688
|
this.nodesToLoad = [];
|
|
39595
39689
|
let estimatedSize = 0;
|
|
39596
39690
|
for (const structure of this.structures) {
|
|
39597
39691
|
const gltf = structure.getJson();
|
|
39598
39692
|
if (!gltf.scenes || !gltf.scenes.length) {
|
|
39599
|
-
console.warn("No scenes found in GLTF structure");
|
|
39693
|
+
console.warn("DynamicLoader: No scenes found in GLTF structure");
|
|
39600
39694
|
continue;
|
|
39601
39695
|
}
|
|
39602
39696
|
estimatedSize += gltf.buffers[0].byteLength;
|
|
@@ -40309,7 +40403,6 @@ void main() {
|
|
|
40309
40403
|
}
|
|
40310
40404
|
});
|
|
40311
40405
|
if (totalObjectsToMerge > 0) {
|
|
40312
|
-
console.log(`Pre-allocating transform texture for ${totalObjectsToMerge} objects`);
|
|
40313
40406
|
this.maxObjectId = totalObjectsToMerge;
|
|
40314
40407
|
this.initTransformTexture();
|
|
40315
40408
|
this.initializeObjectVisibility();
|
|
@@ -40372,7 +40465,7 @@ void main() {
|
|
|
40372
40465
|
let processedGroups = 0;
|
|
40373
40466
|
for (const group of materialGroups) {
|
|
40374
40467
|
if (!group.material) {
|
|
40375
|
-
console.warn("Skipping mesh group with null material");
|
|
40468
|
+
console.warn("DynamicLoader: Skipping mesh group with null material");
|
|
40376
40469
|
continue;
|
|
40377
40470
|
}
|
|
40378
40471
|
try {
|
|
@@ -40457,7 +40550,7 @@ void main() {
|
|
|
40457
40550
|
await this.yieldToUI();
|
|
40458
40551
|
}
|
|
40459
40552
|
} catch (error) {
|
|
40460
|
-
console.
|
|
40553
|
+
console.warn("DynamicLoader: Failed to merge meshes for material:", error);
|
|
40461
40554
|
group.objects.forEach((mesh) => {
|
|
40462
40555
|
mesh.visible = true;
|
|
40463
40556
|
});
|
|
@@ -40469,7 +40562,7 @@ void main() {
|
|
|
40469
40562
|
for (const group of materialGroups) {
|
|
40470
40563
|
if (group.objects.length === 0) continue;
|
|
40471
40564
|
if (!group.material) {
|
|
40472
|
-
console.warn("Skipping line group with null material");
|
|
40565
|
+
console.warn("DynamicLoader: Skipping line group with null material");
|
|
40473
40566
|
continue;
|
|
40474
40567
|
}
|
|
40475
40568
|
const handles = new Set();
|
|
@@ -40579,7 +40672,7 @@ void main() {
|
|
|
40579
40672
|
let processedGroups = 0;
|
|
40580
40673
|
for (const group of materialGroups) {
|
|
40581
40674
|
if (!group.material) {
|
|
40582
|
-
console.warn("Skipping line segment group with null material");
|
|
40675
|
+
console.warn("DynamicLoader: Skipping line segment group with null material");
|
|
40583
40676
|
continue;
|
|
40584
40677
|
}
|
|
40585
40678
|
try {
|
|
@@ -40667,7 +40760,7 @@ void main() {
|
|
|
40667
40760
|
await this.yieldToUI();
|
|
40668
40761
|
}
|
|
40669
40762
|
} catch (error) {
|
|
40670
|
-
console.warn("Failed to merge line segments for material:", error);
|
|
40763
|
+
console.warn("DynamicLoader: Failed to merge line segments for material:", error);
|
|
40671
40764
|
group.objects.forEach((line) => {
|
|
40672
40765
|
line.visible = true;
|
|
40673
40766
|
});
|
|
@@ -40678,7 +40771,7 @@ void main() {
|
|
|
40678
40771
|
let processedGroups = 0;
|
|
40679
40772
|
for (const group of materialGroups) {
|
|
40680
40773
|
if (!group.material) {
|
|
40681
|
-
console.warn("Skipping points group with null material");
|
|
40774
|
+
console.warn("DynamicLoader: Skipping points group with null material");
|
|
40682
40775
|
continue;
|
|
40683
40776
|
}
|
|
40684
40777
|
try {
|
|
@@ -40750,7 +40843,7 @@ void main() {
|
|
|
40750
40843
|
await this.yieldToUI();
|
|
40751
40844
|
}
|
|
40752
40845
|
} catch (error) {
|
|
40753
|
-
console.warn("Failed to merge points for material:", error);
|
|
40846
|
+
console.warn("DynamicLoader: Failed to merge points for material:", error);
|
|
40754
40847
|
group.objects.forEach((points) => {
|
|
40755
40848
|
points.visible = true;
|
|
40756
40849
|
});
|
|
@@ -40830,7 +40923,7 @@ void main() {
|
|
|
40830
40923
|
obj.geometry.dispose();
|
|
40831
40924
|
});
|
|
40832
40925
|
} catch (error) {
|
|
40833
|
-
console.
|
|
40926
|
+
console.warn("DynamicLoader: Failed to merge geometries:", error);
|
|
40834
40927
|
lineSegmentsArray.forEach((obj) => {
|
|
40835
40928
|
obj.visible = true;
|
|
40836
40929
|
rootGroup.add(obj);
|
|
@@ -40934,11 +41027,11 @@ void main() {
|
|
|
40934
41027
|
}
|
|
40935
41028
|
applyObjectTransforms(objectTransformMap) {
|
|
40936
41029
|
if (this.mergedObjectMap.size === 0) {
|
|
40937
|
-
console.warn("No merged objects to transform");
|
|
41030
|
+
console.warn("DynamicLoader: No merged objects to transform");
|
|
40938
41031
|
return;
|
|
40939
41032
|
}
|
|
40940
41033
|
if (!this.transformData) {
|
|
40941
|
-
console.warn("Transform texture not initialized");
|
|
41034
|
+
console.warn("DynamicLoader: Transform texture not initialized");
|
|
40942
41035
|
return;
|
|
40943
41036
|
}
|
|
40944
41037
|
this.objectTransforms = objectTransformMap;
|
|
@@ -41121,7 +41214,7 @@ void main() {
|
|
|
41121
41214
|
}
|
|
41122
41215
|
syncHiddenObjects() {
|
|
41123
41216
|
if (this.mergedObjectMap.size === 0) {
|
|
41124
|
-
console.
|
|
41217
|
+
console.warn("DynamicLoader: No merged objects to sync");
|
|
41125
41218
|
return;
|
|
41126
41219
|
}
|
|
41127
41220
|
if (this.objectVisibility.length > 0) {
|