192 lines
5.2 KiB
JavaScript
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");
|
|
}
|
|
}
|