mylingo3d
Version:
Lingo3D is a React/Vue 3d game development framework that ships with a complete visual editor
129 lines • 4.45 kB
JavaScript
import { LinearToneMapping, NoToneMapping } from "three";
import { getExposure } from "../../states/useExposure";
import { getResolution, setResolution } from "../../states/useResolution";
import { createEffect, createNestedEffect } from "@lincode/reactivity";
import { getWebXR } from "../../states/useWebXR";
import { getRenderer } from "../../states/useRenderer";
import { getPBR } from "../../states/usePBR";
import { getSecondaryCamera } from "../../states/useSecondaryCamera";
import { VRButton } from "./VRButton";
import { getAutoMount } from "../../states/useAutoMount";
import { debounce } from "@lincode/utils";
import { getEditorMounted } from "../../states/useEditorMounted";
import { getPixelRatio } from "../../states/usePixelRatio";
const rootContainer = document.createElement("div");
Object.assign(rootContainer.style, {
position: "absolute",
left: "0px",
top: "0px",
width: "100%",
height: "100%"
});
export const container = document.createElement("div");
Object.assign(container.style, {
position: "absolute",
left: "0px",
top: "0px",
width: "100%"
});
rootContainer.appendChild(container);
getSecondaryCamera((cam) => (container.style.height = cam ? "50%" : "100%"));
export const containerBounds = [container.getBoundingClientRect()];
const useResize = (el) => {
createNestedEffect(() => {
const handleResize = () => {
containerBounds[0] = container.getBoundingClientRect();
setResolution(el === document.body
? [window.innerWidth, window.innerHeight]
: [el.clientWidth, el.clientHeight]);
};
handleResize();
const handleResizeDebounced = debounce(handleResize, 100, "both");
window.addEventListener("resize", handleResizeDebounced);
const handle = getEditorMounted(handleResizeDebounced);
return () => {
window.removeEventListener("resize", handleResize);
handle.cancel();
};
}, [el]);
};
createEffect(() => {
const autoMount = getAutoMount();
if (!autoMount)
return;
if (typeof autoMount === "string") {
const el = document.querySelector(autoMount);
if (!el)
return;
el.prepend(rootContainer);
useResize(el);
return () => {
el.removeChild(rootContainer);
};
}
if (autoMount === true) {
document.body.prepend(rootContainer);
useResize(document.body);
return () => {
document.body.removeChild(rootContainer);
};
}
autoMount.prepend(rootContainer);
useResize(autoMount);
return () => {
autoMount.removeChild(rootContainer);
};
}, [getAutoMount]);
createEffect(() => {
const renderer = getRenderer();
if (!renderer)
return;
const canvas = renderer.domElement;
rootContainer.prepend(canvas);
Object.assign(canvas.style, {
position: "absolute",
left: "0px",
top: "0px"
});
return () => {
rootContainer.removeChild(canvas);
};
}, [getRenderer]);
createEffect(() => {
const renderer = getRenderer();
if (!renderer)
return;
const [w, h] = getResolution();
renderer.setSize(w, h);
renderer.setPixelRatio(Math.min(getPixelRatio(), devicePixelRatio));
}, [getRenderer, getResolution, getPixelRatio]);
createEffect(() => {
const renderer = getRenderer();
if (!renderer)
return;
renderer.physicallyCorrectLights = getPBR();
}, [getRenderer, getPBR]);
createEffect(() => {
const renderer = getRenderer();
if (!renderer)
return;
const exposure = getExposure();
renderer.toneMapping = exposure !== 1 ? LinearToneMapping : NoToneMapping;
renderer.toneMappingExposure = exposure;
}, [getExposure, getRenderer]);
createEffect(() => {
if (!getWebXR())
return;
const renderer = getRenderer();
if (!renderer)
return;
renderer.xr.enabled = true;
const button = VRButton.createButton(renderer);
container.appendChild(button);
button.ontouchstart = () => button.onclick?.(new MouseEvent("click"));
return () => {
renderer.xr.enabled = false;
container.removeChild(button);
};
}, [getWebXR, getRenderer]);
//# sourceMappingURL=renderSetup.js.map