import type { FileData } from "@gradio/client"; import * as BABYLON from "babylonjs"; const create_camera = ( scene: BABYLON.Scene, camera_position: [number | null, number | null, number | null], zoom_speed: number, pan_speed: number ): void => { scene.createDefaultCamera(true, true, true); var helperCamera = scene.activeCamera! as BABYLON.ArcRotateCamera; if (camera_position[0] !== null) { helperCamera.alpha = BABYLON.Tools.ToRadians(camera_position[0]); } if (camera_position[1] !== null) { helperCamera.beta = BABYLON.Tools.ToRadians(camera_position[1]); } if (camera_position[2] !== null) { helperCamera.radius = camera_position[2]; } helperCamera.lowerRadiusLimit = 0.1; const updateCameraSensibility = (): void => { helperCamera.wheelPrecision = 250 / (helperCamera.radius * zoom_speed); helperCamera.panningSensibility = (10000 * pan_speed) / helperCamera.radius; }; updateCameraSensibility(); helperCamera.attachControl(true); helperCamera.onAfterCheckInputsObservable.add(updateCameraSensibility); }; export const add_new_model = ( canvas: HTMLCanvasElement, scene: BABYLON.Scene, engine: BABYLON.Engine, value: FileData | null, clear_color: [number, number, number, number], camera_position: [number | null, number | null, number | null], zoom_speed: number, pan_speed: number ): BABYLON.Scene => { if (scene && !scene.isDisposed && engine) { scene.dispose(); engine.dispose(); } engine = new BABYLON.Engine(canvas, true); scene = new BABYLON.Scene(engine); scene.createDefaultCameraOrLight(); scene.clearColor = scene.clearColor = new BABYLON.Color4(...clear_color); engine.runRenderLoop(() => { scene.render(); }); window.addEventListener("resize", () => { engine.resize(); }); if (!value) return scene; let url: string; url = value.url!; BABYLON.SceneLoader.ShowLoadingScreen = false; BABYLON.SceneLoader.Append( url, "", scene, () => create_camera(scene, camera_position, zoom_speed, pan_speed), undefined, undefined, "." + value.path.split(".")[1] ); return scene; }; export const reset_camera_position = ( scene: BABYLON.Scene, camera_position: [number | null, number | null, number | null], zoom_speed: number, pan_speed: number ): void => { scene.removeCamera(scene.activeCamera!); create_camera(scene, camera_position, zoom_speed, pan_speed); };