dfg_3dviewer_js_library/viewer/editor/metadata-persistence.js
2026-06-25 09:11:23 +02:00

192 lines
5.2 KiB
JavaScript

import THREE from "../init.js";
import { core } from "../core.js";
import { toastHelper } from "../viewer-utils.js";
function pickMetadataValue(save, current, original) {
return save ? current : original;
}
export function buildEditorMetadata(viewer, rotateMetadata) {
const originalMetadata = viewer.originalMetadata;
const saveProperties = viewer.saveProperties;
const metadata = {};
metadata.objPosition = pickMetadataValue(
saveProperties.Position,
[
core.helperObjects[0].position.x,
core.helperObjects[0].position.y,
core.helperObjects[0].position.z
],
originalMetadata.objPosition
);
metadata.objRotation = pickMetadataValue(
saveProperties.Rotation,
[rotateMetadata.x, rotateMetadata.y, rotateMetadata.z],
originalMetadata.objRotation
);
metadata.objScale = pickMetadataValue(
saveProperties.Scale,
[
core.helperObjects[0].scale.x,
core.helperObjects[0].scale.y,
core.helperObjects[0].scale.z
],
originalMetadata.objScale
);
metadata.cameraPosition = pickMetadataValue(
saveProperties.Camera,
[
core.camera.position.x,
core.camera.position.y,
core.camera.position.z
],
originalMetadata.cameraPosition
);
metadata.controlsTarget = pickMetadataValue(
saveProperties.Camera,
[
core.controls.target.x,
core.controls.target.y,
core.controls.target.z
],
originalMetadata.controlsTarget
);
metadata.controlsZoom = pickMetadataValue(
saveProperties.Camera,
[
core.camera.position.distanceTo(core.controls.target)
],
originalMetadata.controlsZoom
);
metadata.lightPosition = pickMetadataValue(
saveProperties.DirectionalLight,
[
core.dirLight.position.x,
core.dirLight.position.y,
core.dirLight.position.z
],
originalMetadata.lightPosition
);
metadata.lightTarget = pickMetadataValue(
saveProperties.DirectionalLight,
[
core.dirLight.rotation._x,
core.dirLight.rotation._y,
core.dirLight.rotation._z
],
originalMetadata.lightTarget
);
metadata.lightColor = pickMetadataValue(
saveProperties.DirectionalLight,
["#" + core.dirLight.color.getHexString().toUpperCase()],
originalMetadata.lightColor
);
metadata.lightIntensity = pickMetadataValue(
saveProperties.DirectionalLight,
[core.dirLight.intensity],
originalMetadata.lightIntensity
);
metadata.lightAmbientColor = pickMetadataValue(
saveProperties.AmbientLight,
["#" + core.ambientLight.color.getHexString().toUpperCase()],
originalMetadata.lightAmbientColor
);
metadata.lightAmbientIntensity = pickMetadataValue(
saveProperties.AmbientLight,
[core.ambientLight.intensity],
originalMetadata.lightAmbientIntensity
);
metadata.lightCameraColor = pickMetadataValue(
saveProperties.CameraLight,
["#" + core.cameraLight.color.getHexString().toUpperCase()],
originalMetadata.lightCameraColor
);
metadata.lightCameraIntensity = pickMetadataValue(
saveProperties.CameraLight,
[core.cameraLight.intensity],
originalMetadata.lightCameraIntensity
);
metadata.background = saveProperties.BackgroundColor
? [window.getComputedStyle(viewer.mainCanvas).background]
: originalMetadata.background;
metadata.annotationEntries = viewer.getAnnotationEntriesForPersistence();
metadata.iiifAnnotationsXml = viewer.exportAnnotationsToIIIFXml();
return metadata;
}
export async function saveEditorMetadata(viewer) {
if (!core.EDITOR || core.isLightweight || !core.helperObjects?.[0]) return;
const rotateMetadata = new THREE.Vector3(
THREE.MathUtils.radToDeg(core.helperObjects[0].rotation.x),
THREE.MathUtils.radToDeg(core.helperObjects[0].rotation.y),
THREE.MathUtils.radToDeg(core.helperObjects[0].rotation.z)
);
if (core.CONFIG.entity.proxyPath !== undefined) {
core.CONFIG.metadataUrl = core.getProxyPath(core.CONFIG.metadataUrl);
}
let fetchedMetadata = {};
try {
if (core.CONFIG?.metadataUrl) {
const response = await fetch(core.CONFIG.metadataUrl, { cache: "no-cache" });
if (response.ok) {
fetchedMetadata = await response.json();
}
}
} catch (err) {
console.warn("Metadata fetch failed, continuing with save", err);
}
viewer.originalMetadata = {
...viewer.originalMetadata,
...fetchedMetadata
};
const newMetadata = buildEditorMetadata(viewer, rotateMetadata);
try {
const token = await fetch("/session/token").then((response) => response.text());
await fetch(core.CONFIG.mainUrl + "/api/editor/save-metadata", {
method: "POST",
credentials: "same-origin",
headers: {
"Content-Type": "application/json",
"X-CSRF-Token": token
},
body: JSON.stringify({
filename: core.fileObject.filename,
path:
viewer.archiveType !== ""
? core.fileObject.relativePath + core.fileObject.basename + core.loadedFile
: core.fileObject.relativePath,
content: JSON.stringify(newMetadata, null, "\t")
})
});
toastHelper("settingsSaved", "success");
} catch (err) {
console.error(err);
toastHelper("settingsSaveError", "error");
}
}