@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.
@@ -23,7 +23,7 @@
23
23
 
24
24
  import { draggersRegistry, commandsRegistry, Options, componentsRegistry, Info, Loader, loadersRegistry, CANVAS_EVENTS } from '@inweb/viewer-core';
25
25
  export * from '@inweb/viewer-core';
26
- import { EventDispatcher, Vector3, MOUSE, TOUCH, Spherical, Quaternion, Vector2, Object3D, BufferGeometry, Float32BufferAttribute, Line, LineBasicMaterial, Mesh, MeshBasicMaterial, DoubleSide, Line3, Raycaster, MathUtils, EdgesGeometry, Plane, Matrix4, Vector4, Controls, Box3, Clock, Color, PerspectiveCamera, OrthographicCamera, AmbientLight, DirectionalLight, HemisphereLight, REVISION, MeshPhongMaterial, WebGLRenderTarget, UnsignedByteType, RGBAFormat, CylinderGeometry, Sprite, CanvasTexture, SRGBColorSpace, SpriteMaterial, TextureLoader, BufferAttribute, PointsMaterial, DataTexture, FloatType, NearestFilter, Points, TriangleStripDrawMode, TriangleFanDrawMode, LineSegments, LineLoop, Group, NormalBlending, LoadingManager, LoaderUtils, FileLoader, UniformsUtils, ShaderMaterial, AdditiveBlending, HalfFloatType, Scene, WebGLRenderer, LinearSRGBColorSpace } from 'three';
26
+ import { EventDispatcher, Vector3, MOUSE, TOUCH, Spherical, Quaternion, Vector2, Object3D, BufferGeometry, Float32BufferAttribute, Line, LineBasicMaterial, Mesh, MeshBasicMaterial, DoubleSide, Line3, Raycaster, MathUtils, EdgesGeometry, Plane, Matrix4, Vector4, Controls, Box3, Clock, Color, PerspectiveCamera, OrthographicCamera, AmbientLight, DirectionalLight, HemisphereLight, REVISION, MeshPhongMaterial, WebGLRenderTarget, UnsignedByteType, RGBAFormat, CylinderGeometry, Sprite, CanvasTexture, SRGBColorSpace, SpriteMaterial, TextureLoader, BufferAttribute, LinearMipmapLinearFilter, NearestMipmapLinearFilter, LinearMipmapNearestFilter, NearestMipmapNearestFilter, LinearFilter, NearestFilter, RepeatWrapping, MirroredRepeatWrapping, ClampToEdgeWrapping, PointsMaterial, MeshStandardMaterial, DataTexture, FloatType, Points, TriangleStripDrawMode, TriangleFanDrawMode, LineSegments, LineLoop, Group, NormalBlending, LoadingManager, LoaderUtils, FileLoader, UniformsUtils, ShaderMaterial, AdditiveBlending, HalfFloatType, Scene, WebGLRenderer, LinearSRGBColorSpace } from 'three';
27
27
  import { TransformControls } from 'three/examples/jsm/controls/TransformControls.js';
28
28
  import { LineSegmentsGeometry } from 'three/examples/jsm/lines/LineSegmentsGeometry.js';
29
29
  import { Wireframe } from 'three/examples/jsm/lines/Wireframe.js';
@@ -4017,6 +4017,19 @@ class DynamicModelImpl extends ModelImpl {
4017
4017
  }
4018
4018
  }
4019
4019
 
4020
+ const GL_TO_THREE_WRAP = {
4021
+ 33071: ClampToEdgeWrapping,
4022
+ 33648: MirroredRepeatWrapping,
4023
+ 10497: RepeatWrapping,
4024
+ };
4025
+ const GL_TO_THREE_FILTER = {
4026
+ 9728: NearestFilter,
4027
+ 9729: LinearFilter,
4028
+ 9984: NearestMipmapNearestFilter,
4029
+ 9985: LinearMipmapNearestFilter,
4030
+ 9986: NearestMipmapLinearFilter,
4031
+ 9987: LinearMipmapLinearFilter,
4032
+ };
4020
4033
  const GL_COMPONENT_TYPES = {
4021
4034
  5120: Int8Array,
4022
4035
  5121: Uint8Array,
@@ -4059,6 +4072,7 @@ class GltfStructure {
4059
4072
  this.pendingRequests = [];
4060
4073
  this.batchTimeout = null;
4061
4074
  this.textureLoader = new TextureLoader();
4075
+ this.textureLoader.crossOrigin = "anonymous";
4062
4076
  this.materials = new Map();
4063
4077
  this.textureCache = new Map();
4064
4078
  this.materialCache = new Map();
@@ -4070,7 +4084,7 @@ class GltfStructure {
4070
4084
  async initialize(loader) {
4071
4085
  const json = await this.loadController.loadJson();
4072
4086
  if (json.asset === undefined || json.asset.version[0] < 2) {
4073
- throw new Error("GltfStructure: Unsupported asset. glTF versions >=2.0 are supported.");
4087
+ throw new Error("DynamicLoader: Unsupported asset. glTF versions >=2.0 are supported.");
4074
4088
  }
4075
4089
  this.json = json;
4076
4090
  this.loader = loader;
@@ -4098,7 +4112,9 @@ class GltfStructure {
4098
4112
  scheduleRequest(request) {
4099
4113
  return new Promise((resolve, reject) => {
4100
4114
  if (this.loadingAborted) {
4101
- reject(this.criticalError || new Error("Structure loading has been aborted due to critical error"));
4115
+ reject(
4116
+ this.criticalError || new Error("DynamicLoader: Structure loading has been aborted due to critical error")
4117
+ );
4102
4118
  return;
4103
4119
  }
4104
4120
  this.pendingRequests.push({
@@ -4137,7 +4153,7 @@ class GltfStructure {
4137
4153
  }
4138
4154
  }
4139
4155
  console.error(
4140
- `❌ Critical error for structure "${this.id}". All further loading aborted.`,
4156
+ `DynamicLoader: Critical error for structure "${this.id}". All further loading aborted.`,
4141
4157
  `\n Error: ${error.message || error}`,
4142
4158
  `\n Rejected ${requests.length} pending chunk requests.`
4143
4159
  );
@@ -4207,7 +4223,7 @@ class GltfStructure {
4207
4223
  const promises = finalRanges.map(async (range, index) => {
4208
4224
  if (this.loadingAborted) {
4209
4225
  for (const req of range.requests) {
4210
- req._reject(this.criticalError || new Error("Structure loading aborted"));
4226
+ req._reject(this.criticalError || new Error("DynamicLoader: Structure loading aborted"));
4211
4227
  }
4212
4228
  return;
4213
4229
  }
@@ -4230,7 +4246,10 @@ class GltfStructure {
4230
4246
  if (this.isCriticalHttpError(error)) {
4231
4247
  this.abortLoading(error);
4232
4248
  } else {
4233
- console.warn(`Failed to load chunk ${index + 1}/${finalRanges.length} (${range.start}-${range.end}):`, error);
4249
+ console.warn(
4250
+ `DynamicLoader: Failed to load chunk ${index + 1}/${finalRanges.length} (${range.start}-${range.end}):`,
4251
+ error
4252
+ );
4234
4253
  }
4235
4254
  } finally {
4236
4255
  this.loader.releaseChunkSlot();
@@ -4249,7 +4268,7 @@ class GltfStructure {
4249
4268
  createTypedArray(buffer, offset, length, componentType) {
4250
4269
  try {
4251
4270
  if (!buffer || !(buffer instanceof ArrayBuffer)) {
4252
- throw new Error("Invalid buffer");
4271
+ throw new Error("DynamicLoader: Invalid buffer");
4253
4272
  }
4254
4273
  let elementSize;
4255
4274
  switch (componentType) {
@@ -4266,20 +4285,22 @@ class GltfStructure {
4266
4285
  elementSize = 4;
4267
4286
  break;
4268
4287
  default:
4269
- throw new Error(`Unsupported component type: ${componentType}`);
4288
+ throw new Error(`DynamicLoader: Unsupported component type: ${componentType}`);
4270
4289
  }
4271
4290
  const numElements = length / elementSize;
4272
4291
  if (!Number.isInteger(numElements)) {
4273
- throw new Error(`Invalid length ${length} for component type ${componentType}`);
4292
+ throw new Error(`DynamicLoader: Invalid length ${length} for component type ${componentType}`);
4274
4293
  }
4275
4294
  if (length > buffer.byteLength) {
4276
- throw new Error(`Buffer too small: need ${length} bytes, but buffer is ${buffer.byteLength} bytes`);
4295
+ throw new Error(
4296
+ `DynamicLoader: Buffer too small: need ${length} bytes, but buffer is ${buffer.byteLength} bytes`
4297
+ );
4277
4298
  }
4278
4299
  const ArrayType = GL_COMPONENT_TYPES[componentType];
4279
4300
  return new ArrayType(buffer, offset, numElements);
4280
4301
  } catch (error) {
4281
4302
  if (error.name !== "AbortError") {
4282
- console.error("Error creating typed array:", {
4303
+ console.warn("DynamicLoader: Error creating typed array:", {
4283
4304
  bufferSize: buffer?.byteLength,
4284
4305
  offset,
4285
4306
  length,
@@ -4292,7 +4313,7 @@ class GltfStructure {
4292
4313
  }
4293
4314
  async createBufferAttribute(accessorIndex) {
4294
4315
  if (!this.json) {
4295
- throw new Error("No GLTF structure loaded");
4316
+ throw new Error("DynamicLoader: No GLTF structure loaded");
4296
4317
  }
4297
4318
  const gltf = this.json;
4298
4319
  const accessor = gltf.accessors[accessorIndex];
@@ -4309,7 +4330,7 @@ class GltfStructure {
4309
4330
  return attribute;
4310
4331
  } catch (error) {
4311
4332
  if (error.name !== "AbortError") {
4312
- console.error("Error creating buffer attribute:", {
4333
+ console.warn("DynamicLoader: Error creating buffer attribute:", {
4313
4334
  error,
4314
4335
  accessor,
4315
4336
  bufferView,
@@ -4330,7 +4351,7 @@ class GltfStructure {
4330
4351
  case 5126:
4331
4352
  return 4;
4332
4353
  default:
4333
- throw new Error(`Unknown component type: ${componentType}`);
4354
+ throw new Error(`DynamicLoader: Unknown component type: ${componentType}`);
4334
4355
  }
4335
4356
  }
4336
4357
  getNumComponents(type) {
@@ -4350,31 +4371,50 @@ class GltfStructure {
4350
4371
  case "MAT4":
4351
4372
  return 16;
4352
4373
  default:
4353
- throw new Error(`Unknown type: ${type}`);
4374
+ throw new Error(`DynamicLoader: Unknown type: ${type}`);
4354
4375
  }
4355
4376
  }
4356
4377
  async loadTextures() {
4357
4378
  if (!this.json.textures) return;
4358
4379
  const loadTexture = async (imageIndex) => {
4359
- const image = this.json.images[imageIndex];
4360
- if (image.uri) {
4361
- const fullUrl = await this.loadController.resolveURL(image.uri);
4362
- return this.textureLoader.loadAsync(fullUrl);
4363
- } else if (image.bufferView !== undefined) {
4364
- const bufferView = this.json.bufferViews[image.bufferView];
4365
- const array = await this.getBufferView(bufferView.byteOffset || 0, bufferView.byteLength, 5121);
4366
- const blob = new Blob([array], { type: image.mimeType });
4367
- const url = URL.createObjectURL(blob);
4368
- const texture = await this.textureLoader.loadAsync(url);
4369
- URL.revokeObjectURL(url);
4370
- texture.flipY = false;
4371
- return texture;
4380
+ let textureName = `index_${imageIndex}`;
4381
+ try {
4382
+ const image = this.json.images[imageIndex];
4383
+ textureName = image.uri || image.name || textureName;
4384
+ if (image.uri) {
4385
+ const fullUrl = await this.loadController.resolveURL(image.uri);
4386
+ return await this.textureLoader.loadAsync(fullUrl);
4387
+ } else if (image.bufferView !== undefined) {
4388
+ const bufferView = this.json.bufferViews[image.bufferView];
4389
+ const array = await this.getBufferView(bufferView.byteOffset || 0, bufferView.byteLength, 5121);
4390
+ const blob = new Blob([array], { type: image.mimeType });
4391
+ const url = URL.createObjectURL(blob);
4392
+ const texture = await this.textureLoader.loadAsync(url);
4393
+ URL.revokeObjectURL(url);
4394
+ return texture;
4395
+ }
4396
+ } catch {
4397
+ console.warn(`DynamicLoader: Error loading texture ${textureName}`);
4372
4398
  }
4373
4399
  };
4374
4400
  const texturePromises = [];
4375
4401
  for (let i = 0; i < this.json.textures.length; i++) {
4376
4402
  texturePromises.push(
4377
- loadTexture(this.json.textures[i].source).then((texture) => this.textureCache.set(i, texture))
4403
+ loadTexture(this.json.textures[i].source).then((texture) => {
4404
+ if (texture) {
4405
+ const samplerDef =
4406
+ this.json.textures[i].sampler !== undefined && this.json.samplers
4407
+ ? this.json.samplers[this.json.textures[i].sampler]
4408
+ : {};
4409
+ texture.magFilter = GL_TO_THREE_FILTER[samplerDef.magFilter] || LinearFilter;
4410
+ texture.minFilter = GL_TO_THREE_FILTER[samplerDef.minFilter] || LinearMipmapLinearFilter;
4411
+ texture.wrapS = GL_TO_THREE_WRAP[samplerDef.wrapS] || RepeatWrapping;
4412
+ texture.wrapT = GL_TO_THREE_WRAP[samplerDef.wrapT] || RepeatWrapping;
4413
+ texture.flipY = false;
4414
+ texture.needsUpdate = true;
4415
+ }
4416
+ this.textureCache.set(i, texture);
4417
+ })
4378
4418
  );
4379
4419
  }
4380
4420
  await Promise.all(texturePromises);
@@ -4405,8 +4445,14 @@ class GltfStructure {
4405
4445
  params.opacity = pbr.baseColorFactor[3];
4406
4446
  if (params.opacity < 1.0) params.transparent = true;
4407
4447
  }
4408
- if (pbr.baseColorTexture) {
4409
- params.map = this.textureCache.get(pbr.baseColorTexture.index);
4448
+ if (pbr.baseColorTexture !== undefined) {
4449
+ const texture = this.textureCache.get(pbr.baseColorTexture.index);
4450
+ if (texture) {
4451
+ params.map = texture;
4452
+ if (!pbr.baseColorFactor) {
4453
+ params.color = new Color(0xffffff);
4454
+ }
4455
+ }
4410
4456
  }
4411
4457
  }
4412
4458
  if (materialDef.emissiveFactor) {
@@ -4436,10 +4482,58 @@ class GltfStructure {
4436
4482
  params.polygonOffset = true;
4437
4483
  params.polygonOffsetFactor = 1;
4438
4484
  params.polygonOffsetUnits = 1;
4439
- if (materialDef.normalTexture) {
4440
- params.normalMap = this.textureCache.get(materialDef.normalTexture.index);
4485
+ if (params.map && !materialDef.pbrMetallicRoughness?.baseColorFactor) {
4486
+ params.color = new Color(0xffffff);
4487
+ }
4488
+ if (materialDef.normalTexture !== undefined) {
4489
+ const normalMap = this.textureCache.get(materialDef.normalTexture.index);
4490
+ if (normalMap) {
4491
+ params.normalMap = normalMap;
4492
+ }
4493
+ }
4494
+ if (materialDef.emissiveTexture !== undefined) {
4495
+ const emissiveMap = this.textureCache.get(materialDef.emissiveTexture.index);
4496
+ if (emissiveMap) {
4497
+ params.emissiveMap = emissiveMap;
4498
+ }
4499
+ }
4500
+ const usePBR = materialDef.pbrMetallicRoughness?.metallicRoughnessTexture !== undefined;
4501
+ if (usePBR) {
4502
+ params.metalness =
4503
+ materialDef.pbrMetallicRoughness?.metallicFactor !== undefined
4504
+ ? materialDef.pbrMetallicRoughness.metallicFactor
4505
+ : 1.0;
4506
+ params.roughness =
4507
+ materialDef.pbrMetallicRoughness?.roughnessFactor !== undefined
4508
+ ? materialDef.pbrMetallicRoughness.roughnessFactor
4509
+ : 1.0;
4510
+ if (materialDef.pbrMetallicRoughness?.metallicRoughnessTexture !== undefined) {
4511
+ const map = this.textureCache.get(materialDef.pbrMetallicRoughness.metallicRoughnessTexture.index);
4512
+ if (map) {
4513
+ params.metalnessMap = map;
4514
+ params.roughnessMap = map;
4515
+ }
4516
+ }
4517
+ material = new MeshStandardMaterial(params);
4518
+ } else {
4519
+ material = new MeshPhongMaterial(params);
4520
+ }
4521
+ if (material.map) material.map.colorSpace = SRGBColorSpace;
4522
+ if (material.emissiveMap) material.emissiveMap.colorSpace = SRGBColorSpace;
4523
+ if (material.normalMap) {
4524
+ if (materialDef.normalTexture?.scale !== undefined) {
4525
+ material.normalScale.set(materialDef.normalTexture.scale, materialDef.normalTexture.scale);
4526
+ }
4527
+ }
4528
+ if (materialDef.occlusionTexture !== undefined) {
4529
+ const aoMap = this.textureCache.get(materialDef.occlusionTexture.index);
4530
+ if (aoMap) {
4531
+ material.aoMap = aoMap;
4532
+ if (materialDef.occlusionTexture.strength !== undefined) {
4533
+ material.aoMapIntensity = materialDef.occlusionTexture.strength;
4534
+ }
4535
+ }
4441
4536
  }
4442
- material = new MeshPhongMaterial(params);
4443
4537
  }
4444
4538
  return material;
4445
4539
  }
@@ -4694,7 +4788,7 @@ class DynamicGltfLoader {
4694
4788
  memoryLimit = Math.max(memoryLimit, 2 * 1024 * 1024 * 1024);
4695
4789
  console.log(`Available memory set to ${Math.round(memoryLimit / (1024 * 1024 * 1024))}GB`);
4696
4790
  } catch (error) {
4697
- console.warn("Error detecting available memory:", error);
4791
+ console.warn("DynamicLoader: Error detecting available memory:", error);
4698
4792
  }
4699
4793
  return memoryLimit;
4700
4794
  }
@@ -4859,7 +4953,7 @@ class DynamicGltfLoader {
4859
4953
  if (entry?.lines?.uuid) uniqueMaterialIds.add(entry.lines.uuid);
4860
4954
  }
4861
4955
  } catch (exp) {
4862
- console.error("Error adding material to uniqueMaterialIds", exp);
4956
+ console.warn("DynamicLoader: Error collecting material stats", exp);
4863
4957
  }
4864
4958
  }
4865
4959
  }
@@ -4880,7 +4974,7 @@ class DynamicGltfLoader {
4880
4974
  this._webglInfoCache = { renderer: null, vendor: null };
4881
4975
  }
4882
4976
  } catch (e) {
4883
- console.error("Error getting webgl info", e);
4977
+ console.warn("DynamicLoader: Error getting webgl info", e);
4884
4978
  this._webglInfoCache = { renderer: null, vendor: null };
4885
4979
  }
4886
4980
  }
@@ -5137,7 +5231,7 @@ class DynamicGltfLoader {
5137
5231
  if (node.structure && node.structure.loadingAborted) {
5138
5232
  return;
5139
5233
  }
5140
- console.error(`Error loading node ${nodeId}:`, error);
5234
+ console.warn(`DynamicLoader: Error loading node ${nodeId}:`, error);
5141
5235
  }
5142
5236
  }
5143
5237
  unloadNode(nodeId) {
@@ -5190,7 +5284,7 @@ class DynamicGltfLoader {
5190
5284
  await structure.loadTextures();
5191
5285
  await structure.loadMaterials();
5192
5286
  } catch (error) {
5193
- console.error("Error loading materials:", error);
5287
+ console.error("DynamicLoader: Error loading materials:", error);
5194
5288
  throw error;
5195
5289
  }
5196
5290
  }
@@ -5198,14 +5292,14 @@ class DynamicGltfLoader {
5198
5292
  }
5199
5293
  async processSceneHierarchy() {
5200
5294
  if (this.structures.length === 0) {
5201
- throw new Error("No GLTF structures loaded");
5295
+ throw new Error("DynamicLoader: No GLTF structures loaded");
5202
5296
  }
5203
5297
  this.nodesToLoad = [];
5204
5298
  let estimatedSize = 0;
5205
5299
  for (const structure of this.structures) {
5206
5300
  const gltf = structure.getJson();
5207
5301
  if (!gltf.scenes || !gltf.scenes.length) {
5208
- console.warn("No scenes found in GLTF structure");
5302
+ console.warn("DynamicLoader: No scenes found in GLTF structure");
5209
5303
  continue;
5210
5304
  }
5211
5305
  estimatedSize += gltf.buffers[0].byteLength;
@@ -5918,7 +6012,6 @@ class DynamicGltfLoader {
5918
6012
  }
5919
6013
  });
5920
6014
  if (totalObjectsToMerge > 0) {
5921
- console.log(`Pre-allocating transform texture for ${totalObjectsToMerge} objects`);
5922
6015
  this.maxObjectId = totalObjectsToMerge;
5923
6016
  this.initTransformTexture();
5924
6017
  this.initializeObjectVisibility();
@@ -5981,7 +6074,7 @@ class DynamicGltfLoader {
5981
6074
  let processedGroups = 0;
5982
6075
  for (const group of materialGroups) {
5983
6076
  if (!group.material) {
5984
- console.warn("Skipping mesh group with null material");
6077
+ console.warn("DynamicLoader: Skipping mesh group with null material");
5985
6078
  continue;
5986
6079
  }
5987
6080
  try {
@@ -6066,7 +6159,7 @@ class DynamicGltfLoader {
6066
6159
  await this.yieldToUI();
6067
6160
  }
6068
6161
  } catch (error) {
6069
- console.error("Failed to merge meshes for material:", error);
6162
+ console.warn("DynamicLoader: Failed to merge meshes for material:", error);
6070
6163
  group.objects.forEach((mesh) => {
6071
6164
  mesh.visible = true;
6072
6165
  });
@@ -6078,7 +6171,7 @@ class DynamicGltfLoader {
6078
6171
  for (const group of materialGroups) {
6079
6172
  if (group.objects.length === 0) continue;
6080
6173
  if (!group.material) {
6081
- console.warn("Skipping line group with null material");
6174
+ console.warn("DynamicLoader: Skipping line group with null material");
6082
6175
  continue;
6083
6176
  }
6084
6177
  const handles = new Set();
@@ -6188,7 +6281,7 @@ class DynamicGltfLoader {
6188
6281
  let processedGroups = 0;
6189
6282
  for (const group of materialGroups) {
6190
6283
  if (!group.material) {
6191
- console.warn("Skipping line segment group with null material");
6284
+ console.warn("DynamicLoader: Skipping line segment group with null material");
6192
6285
  continue;
6193
6286
  }
6194
6287
  try {
@@ -6276,7 +6369,7 @@ class DynamicGltfLoader {
6276
6369
  await this.yieldToUI();
6277
6370
  }
6278
6371
  } catch (error) {
6279
- console.warn("Failed to merge line segments for material:", error);
6372
+ console.warn("DynamicLoader: Failed to merge line segments for material:", error);
6280
6373
  group.objects.forEach((line) => {
6281
6374
  line.visible = true;
6282
6375
  });
@@ -6287,7 +6380,7 @@ class DynamicGltfLoader {
6287
6380
  let processedGroups = 0;
6288
6381
  for (const group of materialGroups) {
6289
6382
  if (!group.material) {
6290
- console.warn("Skipping points group with null material");
6383
+ console.warn("DynamicLoader: Skipping points group with null material");
6291
6384
  continue;
6292
6385
  }
6293
6386
  try {
@@ -6359,7 +6452,7 @@ class DynamicGltfLoader {
6359
6452
  await this.yieldToUI();
6360
6453
  }
6361
6454
  } catch (error) {
6362
- console.warn("Failed to merge points for material:", error);
6455
+ console.warn("DynamicLoader: Failed to merge points for material:", error);
6363
6456
  group.objects.forEach((points) => {
6364
6457
  points.visible = true;
6365
6458
  });
@@ -6439,7 +6532,7 @@ class DynamicGltfLoader {
6439
6532
  obj.geometry.dispose();
6440
6533
  });
6441
6534
  } catch (error) {
6442
- console.error("Failed to merge geometries:", error);
6535
+ console.warn("DynamicLoader: Failed to merge geometries:", error);
6443
6536
  lineSegmentsArray.forEach((obj) => {
6444
6537
  obj.visible = true;
6445
6538
  rootGroup.add(obj);
@@ -6543,11 +6636,11 @@ class DynamicGltfLoader {
6543
6636
  }
6544
6637
  applyObjectTransforms(objectTransformMap) {
6545
6638
  if (this.mergedObjectMap.size === 0) {
6546
- console.warn("No merged objects to transform");
6639
+ console.warn("DynamicLoader: No merged objects to transform");
6547
6640
  return;
6548
6641
  }
6549
6642
  if (!this.transformData) {
6550
- console.warn("Transform texture not initialized");
6643
+ console.warn("DynamicLoader: Transform texture not initialized");
6551
6644
  return;
6552
6645
  }
6553
6646
  this.objectTransforms = objectTransformMap;
@@ -6730,7 +6823,7 @@ class DynamicGltfLoader {
6730
6823
  }
6731
6824
  syncHiddenObjects() {
6732
6825
  if (this.mergedObjectMap.size === 0) {
6733
- console.log("No merged objects to sync");
6826
+ console.warn("DynamicLoader: No merged objects to sync");
6734
6827
  return;
6735
6828
  }
6736
6829
  if (this.objectVisibility.length > 0) {