|
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); |
|
}; |
|
|