UNPKG

mylingo3d

Version:

Lingo3D is a React/Vue 3d game development framework that ships with a complete visual editor

93 lines 3.74 kB
import { Cancellable } from "@lincode/promiselikes"; import { createEffect } from "@lincode/reactivity"; import { last } from "@lincode/utils"; import { EquirectangularReflectionMapping, WebGLCubeRenderTarget, CubeCamera } from "three"; import { appendableRoot } from "../api/core/Appendable"; import Environment from "../display/Environment"; import loadTexture from "../display/utils/loaders/loadTexture"; import { onRenderSlow } from "../events/onRenderSlow"; import { FAR, NEAR, TEXTURES_URL } from "../globals"; import { getCentripetal } from "../states/useCentripetal"; import { getDefaultLight } from "../states/useDefaultLight"; import { getEnvironmentStack } from "../states/useEnvironmentStack"; import { getRenderer } from "../states/useRenderer"; import scene from "./scene"; const defaultEnvironment = new Environment(); defaultEnvironment.texture = undefined; appendableRoot.delete(defaultEnvironment); defaultEnvironment.helper = false; const cubeRenderTarget = new WebGLCubeRenderTarget(256); const cubeCamera = new CubeCamera(NEAR, FAR, cubeRenderTarget); createEffect(() => { const environment = last(getEnvironmentStack()); const renderer = getRenderer(); if (!environment?.texture || !renderer) return; if (environment.texture === "dynamic") { const handle = onRenderSlow(() => { cubeCamera.position.copy(environment.outerObject3d.position); cubeCamera.matrixWorld.copy(environment.outerObject3d.matrixWorld); cubeCamera.update(renderer, scene); }); scene.environment = cubeRenderTarget.texture; return () => { handle.cancel(); scene.environment = null; }; } let proceed = true; const texture = loadTexture(environment.texture === "studio" ? TEXTURES_URL + "studio.jpg" : environment.texture, () => proceed && (scene.environment = texture)); texture.mapping = EquirectangularReflectionMapping; return () => { proceed = false; scene.environment = null; }; }, [getEnvironmentStack, getRenderer]); createEffect(() => { const defaultLight = getDefaultLight(); if (!defaultLight) return; if (typeof defaultLight === "string" && defaultLight !== "default") { if (defaultLight === "dynamic") defaultEnvironment.texture = "dynamic"; else defaultEnvironment.texture = defaultLight; return () => { defaultEnvironment.texture = undefined; }; } const handle = new Cancellable(); import("../display/lights/SkyLight").then((module) => { const SkyLight = module.default; const light = new SkyLight(); appendableRoot.delete(light); light.helper = false; light.groundColor = "#666666"; handle.then(() => light.dispose()); }); import("../display/lights/DirectionalLight").then((module) => { const DirectionalLight = module.default; const light = new DirectionalLight(); appendableRoot.delete(light); light.helper = false; light.y = FAR; light.z = FAR; light.intensity = 0.5; handle.then(() => light.dispose()); if (!getCentripetal()) return; const light2 = new DirectionalLight(); appendableRoot.delete(light2); light2.helper = false; light2.y = -FAR; light2.z = -FAR; light2.intensity = 0.5; handle.then(() => light2.dispose()); }); return () => { handle.cancel(); }; }, [getDefaultLight, getCentripetal]); //# sourceMappingURL=defaultLight.js.map