import * as THREE from "three"; import GUI from "lil-gui"; export function serialiseCamera(component) { const { camera, controls } = component; const position = Object.values(camera.position); const extractXYZ = ({ _x, _y, _z }) => [_x, _y, _z]; const rotation = extractXYZ(camera.rotation); const fixed = (l) => l.map((x) => parseFloat(x.toPrecision(4))); return JSON.stringify({ type: "perspective", fov: camera.fov, near: camera.near, far: camera.far, position: fixed(position), rotation: fixed(rotation), zoom: camera.zoom, target: fixed(Object.values(controls.target)), }); } // Todo alllow isometric camera export function deserialiseCamera(component) { const { canvas, initial_camera_state } = component; const aspect = canvas.clientWidth / canvas.clientHeight; const camera = new THREE.PerspectiveCamera(30, aspect, 0.01, 40); if (!initial_camera_state) return; if (initial_camera_state.type !== "perspective") return; if (initial_camera_state.fov) camera.fov = initial_camera_state.fov; if (initial_camera_state.near) camera.near = initial_camera_state.near; if (initial_camera_state.far) camera.far = initial_camera_state.far; if (initial_camera_state.zoom) camera.zoom = initial_camera_state.zoom; if (initial_camera_state.position) camera.position.set(...initial_camera_state.position); if (initial_camera_state.rotation) camera.rotation.set(...initial_camera_state.rotation); camera.updateProjectionMatrix(); return camera; } export function deserialiseControls(component) { const { controls, initial_camera_state } = component; if (initial_camera_state.target && controls.target) controls.target.set(...initial_camera_state.target); } const saveBlob = (function () { const a = document.createElement("a"); document.body.appendChild(a); a.style.display = "none"; return function saveData(blob, fileName) { const url = window.URL.createObjectURL(blob); console.log(url); a.href = url; a.download = fileName; a.click(); }; })(); function takeScreenshot(component) { const { canvas, render } = component; render(); canvas.toBlob((blob) => { saveBlob(blob, `screencapture-${canvas.width}x${canvas.height}.png`); }); } function componentHTML(component_rect) { const { height } = component_rect; console.log("Height:", height); return `