add a couple of useful tools

This commit is contained in:
Yeicor
2024-02-18 19:46:47 +01:00
parent 0f46d06463
commit 76a636f400

View File

@@ -51,24 +51,23 @@ function centerCamera() {
} }
let selectionEnabled = ref(false); let selectionEnabled = ref(false);
let prevHighlightedMaterial: Material | null = null; let selectedMaterials: Array<Material> = []
let hasListener = false; let hasListener = false;
let selectionListener = (event: MouseEvent) => { let selectionListener = (event: MouseEvent) => {
if (!selectionEnabled.value) return; if (!selectionEnabled.value) return;
let viewer: ModelViewerElement = props.refSData.viewer; let viewer: ModelViewerElement = props.refSData.viewer;
const material = viewer.materialFromPoint(event.clientX, event.clientY); const material = viewer.materialFromPoint(event.clientX, event.clientY);
if (material !== null && prevHighlightedMaterial?.index === material.index) return if(material === null) return;
if (prevHighlightedMaterial) { const wasSelected = selectedMaterials.find((m) => m === material) !== undefined;
prevHighlightedMaterial.pbrMetallicRoughness.setBaseColorFactor( if (wasSelected) {
(prevHighlightedMaterial as any).__prevBaseColorFactor); selectedMaterials = selectedMaterials.filter((m) => m !== material);
} material.pbrMetallicRoughness.setBaseColorFactor(
if (!material) { (material as any).__prevBaseColorFactor);
prevHighlightedMaterial = null; } else {
return; selectedMaterials.push(material);
}
(material as any).__prevBaseColorFactor = [...material.pbrMetallicRoughness.baseColorFactor]; (material as any).__prevBaseColorFactor = [...material.pbrMetallicRoughness.baseColorFactor];
material.pbrMetallicRoughness.setBaseColorFactor([1, 0, 0, 1] as RGBA); material.pbrMetallicRoughness.setBaseColorFactor([1, 0, 0, 1] as RGBA);
prevHighlightedMaterial = material; }
}; };
function toggleSelection() { function toggleSelection() {
@@ -77,14 +76,14 @@ function toggleSelection() {
selectionEnabled.value = !selectionEnabled.value; selectionEnabled.value = !selectionEnabled.value;
if (selectionEnabled.value) { if (selectionEnabled.value) {
if (!hasListener) { if (!hasListener) {
viewer.addEventListener('mousemove', selectionListener); viewer.addEventListener('click', selectionListener);
hasListener = true; hasListener = true;
} }
} else { } else {
if (prevHighlightedMaterial) { for (let material of selectedMaterials) {
prevHighlightedMaterial.pbrMetallicRoughness.setBaseColorFactor( console.log("clearing selection", material);
(prevHighlightedMaterial as any).__prevBaseColorFactor); material.pbrMetallicRoughness.setBaseColorFactor(
prevHighlightedMaterial = null; (material as any).__prevBaseColorFactor);
} }
} }
} }