@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.
- package/package.json +1 -1
- package/src/index.js +65 -22
package/package.json
CHANGED
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
|
|
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 &&
|
|
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 &&
|
|
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", {
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
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
|
-
|
|
714
|
-
|
|
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:
|
|
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
|
-
|
|
762
|
+
|
|
763
|
+
if (!camState.locked && camState.value !== null) {
|
|
721
764
|
camera.attachControl(this.#canvas, true);
|
|
722
765
|
}
|
|
723
766
|
this.#scene.activeCamera = camera;
|