@preference-sl/pref-viewer 2.10.0-beta.22 → 2.10.0-beta.23

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 (2) hide show
  1. package/package.json +1 -1
  2. package/src/index.js +65 -22
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@preference-sl/pref-viewer",
3
- "version": "2.10.0-beta.22",
3
+ "version": "2.10.0-beta.23",
4
4
  "description": "Web Component to preview GLTF models with Babylon.js",
5
5
  "author": "Alex Moreno Palacio <amoreno@preference.es>",
6
6
  "scripts": {
package/src/index.js CHANGED
@@ -381,9 +381,9 @@ class PrefViewer extends HTMLElement {
381
381
 
382
382
  #resetChangedFlags() {
383
383
  console.log("PrefViewer: #resetChangedFlags()");
384
- Object.values(this.#data.containers).forEach((container) => (container.changed = false));
385
- Object.values(this.#data.options.materials).forEach((material) => (material.changed = false));
386
- this.#data.options.camera.changed = false;
384
+ Object.values(this.#data.containers).forEach((container) => (container.changed.success = false));
385
+ Object.values(this.#data.options.materials).forEach((material) => (material.changed.success = false));
386
+ this.#data.options.camera.changed.success = false;
387
387
  }
388
388
 
389
389
  // Babylon.js
@@ -638,17 +638,23 @@ class PrefViewer extends HTMLElement {
638
638
  return false;
639
639
  }
640
640
 
641
- const material = this.#data.containers.materials.assetContainer?.materials.find((mat) => mat.name === optionMaterial.value) || null;
641
+ const material = this.#data.containers.materials.assetContainer?.materials
642
+ .find((mat) => mat.name === optionMaterial.value) || null;
643
+
642
644
  if (!material) {
643
645
  console.warn("PrefViewer: material not found", optionMaterial.value);
644
646
  return false;
645
647
  }
646
648
 
649
+ const hadExplicitChange = !!optionMaterial.changed;
650
+
647
651
  const containers = [];
648
- if (this.#data.containers.model.assetContainer && (this.#data.containers.model.changed || this.#data.containers.materials.changed || optionMaterial.changed)) {
652
+ if (this.#data.containers.model.assetContainer &&
653
+ (this.#data.containers.model.changed || this.#data.containers.materials.changed || optionMaterial.changed)) {
649
654
  containers.push(this.#data.containers.model.assetContainer);
650
655
  }
651
- if (this.#data.containers.environment.assetContainer && (this.#data.containers.environment.changed || this.#data.containers.materials.changed || optionMaterial.changed)) {
656
+ if (this.#data.containers.environment.assetContainer &&
657
+ (this.#data.containers.environment.changed || this.#data.containers.materials.changed || optionMaterial.changed)) {
652
658
  containers.push(this.#data.containers.environment.assetContainer);
653
659
  }
654
660
  if (containers.length === 0) {
@@ -666,11 +672,18 @@ class PrefViewer extends HTMLElement {
666
672
  })
667
673
  );
668
674
 
669
- console.log("PrefViewer: material assignment result", { prefix: optionMaterial.prefix, material: optionMaterial.value, someSetted });
675
+ console.log("PrefViewer: material assignment result", {
676
+ prefix: optionMaterial.prefix, material: optionMaterial.value, someSetted
677
+ });
670
678
 
671
679
  if (someSetted) {
680
+ // Asegura estructura si antes era `false`
681
+ if (!optionMaterial.changed) {
682
+ optionMaterial.changed = { oldValue: optionMaterial.value, success: false };
683
+ }
672
684
  optionMaterial.changed.success = true;
673
- } else {
685
+ } else if (hadExplicitChange) {
686
+ // Solo revertimos si el usuario pidió el cambio y falló
674
687
  optionMaterial.value = optionMaterial.changed.oldValue;
675
688
  }
676
689
 
@@ -695,29 +708,59 @@ class PrefViewer extends HTMLElement {
695
708
  modelChanged: this.#data.containers.model.changed,
696
709
  envChanged: this.#data.containers.environment.changed
697
710
  });
698
- if (!this.#data.options.camera.value || (!this.#data.options.camera.changed && !this.#data.containers.model.changed && !this.#data.containers.environment.changed)) {
711
+
712
+ const camState = this.#data.options.camera;
713
+
714
+ if (!camState.value && !camState.changed && !this.#data.containers.model.changed && !this.#data.containers.environment.changed) {
699
715
  return false;
700
716
  }
701
717
 
702
- let camera = this.#data.containers.model.assetContainer?.cameras.find((thisCamera) => thisCamera.name === this.#data.options.camera.value) || this.#data.containers.environment.assetContainer?.cameras.find((thisCamera) => thisCamera.name === this.#data.options.camera.value) || null;
718
+ const hadExplicitChange = !!camState.changed;
719
+
720
+ let camera =
721
+ this.#data.containers.model.assetContainer?.cameras.find(c => c.name === camState.value) ||
722
+ this.#data.containers.environment.assetContainer?.cameras.find(c => c.name === camState.value) ||
723
+ null;
724
+
703
725
  if (!camera) {
704
- if (this.#data.options.camera.changed?.oldValue && this.#data.options.camera.changed?.oldValue !== this.#data.options.camera.value) {
705
- camera = this.#data.containers.model.assetContainer?.cameras.find((thisCamera) => thisCamera.name === this.#data.options.camera.changed.oldValue) || this.#data.containers.environment.assetContainer?.cameras.find((thisCamera) => thisCamera.name === this.#data.options.camera.changed.oldValue) || null;
706
- }
707
- if (camera) {
708
- camera.metadata = { locked: this.#data.options.camera.changed.oldLocked };
709
- this.#data.options.camera.value = this.#data.options.camera.changed.oldValue;
710
- this.#data.options.camera.locked = this.#data.options.camera.changed.oldLocked;
726
+ // Si falló la cámara solicitada y hubo cambio explícito, intentamos volver a la anterior
727
+ if (hadExplicitChange && camState.changed.oldValue && camState.changed.oldValue !== camState.value) {
728
+ camera =
729
+ this.#data.containers.model.assetContainer?.cameras.find(c => c.name === camState.changed.oldValue) ||
730
+ this.#data.containers.environment.assetContainer?.cameras.find(c => c.name === camState.changed.oldValue) ||
731
+ null;
732
+
733
+ // Asegura estructura para escribir success
734
+ if (!camState.changed) camState.changed = { oldValue: camState.value, oldLocked: camState.locked, success: false };
735
+
736
+ if (camera) {
737
+ camera.metadata = { locked: camState.changed.oldLocked };
738
+ camState.value = camState.changed.oldValue;
739
+ camState.locked = camState.changed.oldLocked;
740
+ camState.changed.success = false;
741
+ } else {
742
+ // Fallback a la cámara por defecto del componente
743
+ camera = this.#camera;
744
+ camState.value = null;
745
+ camState.locked = this.#camera.metadata.locked;
746
+ camState.changed.success = false;
747
+ }
711
748
  } else {
749
+ // No hubo cambio explícito: usa fallback sin tocar changed
712
750
  camera = this.#camera;
713
- this.#data.options.camera.value = null;
714
- this.#data.options.camera.locked = this.#camera.metadata.locked;
751
+ camState.value = null;
752
+ camState.locked = this.#camera.metadata.locked;
715
753
  }
716
- this.#data.options.camera.changed.success = false;
717
754
  } else {
718
- camera.metadata = { locked: this.#data.options.camera.locked };
755
+ camera.metadata = { locked: camState.locked };
756
+ // Marca success si hubo cambio explícito
757
+ if (hadExplicitChange) {
758
+ if (!camState.changed) camState.changed = { oldValue: camState.value, oldLocked: camState.locked, success: false };
759
+ camState.changed.success = true;
760
+ }
719
761
  }
720
- if (!this.#data.options.camera.locked && this.#data.options.camera.value !== null) {
762
+
763
+ if (!camState.locked && camState.value !== null) {
721
764
  camera.attachControl(this.#canvas, true);
722
765
  }
723
766
  this.#scene.activeCamera = camera;