import { Behaviour, Camera, Context, GameObject } from "@needle-tools/engine"; import { EditorModification } from "./types"; import { Object3D } from "three"; const $sceneCamera = Symbol("sceneCamera"); function createSceneCamera(context: Context) { if (context[$sceneCamera]) return context[$sceneCamera] as SceneCamera; const cameraObject = new Object3D(); context.scene.add(cameraObject) const cam = GameObject.addNewComponent(cameraObject, SceneCamera, false); cam.sourceId = "editor-live-sync"; context[$sceneCamera] = cam; return cam; } export function onCameraChanged(mod: EditorModification) { const context = Context.Current; if (!context) return; let cam = context[$sceneCamera] as SceneCamera; if (!cam) { cam = createSceneCamera(context); if (!cam) return; } const go = cam.gameObject as unknown as Object3D; switch (mod.propertyName) { case "enabled": go.visible = mod.value; break; case "position": go.position.copy(mod.value) break; case "rotation": go.quaternion.copy(mod.value) break; case "fov": cam.setFov(mod.value) break; } } export class SceneCamera extends Behaviour { private _camera!: Camera; setFov(fov: number) { this._camera.fieldOfView = fov; } awake(): void { this._camera = this.gameObject.addNewComponent(Camera)!; } onEnable(): void { this.context.setCurrentCamera(this._camera); } onDisable(): void { this.context.removeCamera(this._camera); } update(): void { this.context.setCurrentCamera(this._camera); } }