hmb's picture
hmb HF Staff
Upload folder using huggingface_hub
a296c4d
import type { FileData } from "@gradio/client";
import BABYLON from "babylonjs";
const light_types = {
DirectionalLight: BABYLON.DirectionalLight,
PointLight: BABYLON.PointLight,
HemiLight: BABYLON.HemisphericLight,
};
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 change_camera_position = (
scene: BABYLON.Scene,
camera_position: [number | null, number | null, number | null],
zoom_speed: number
): void => {
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.wheelPrecision = 2500 / zoom_speed;
};
export const change_light = (
scene: BABYLON.Scene,
light_type: string,
light_position: [number, number, number],
index: number
): void => {
var light = scene.lights[index];
light.dispose();
switch (light_type) {
case "DirectionalLight":
light = new BABYLON.DirectionalLight(
light_type,
new BABYLON.Vector3(...light_position),
scene
);
break;
case "PointLight":
light = new BABYLON.PointLight(
light_type,
new BABYLON.Vector3(...light_position),
scene
);
break;
case "HemiLight":
light = new BABYLON.HemisphericLight(
light_type,
new BABYLON.Vector3(...light_position),
scene
);
break;
}
scene.addLight(light);
};
export const add_new_light = (
scene: BABYLON.Scene,
light_position: [number, number, number]
): void => {
const newLight = new BABYLON.HemisphericLight(
"HemiLight",
new BABYLON.Vector3(...light_position),
scene
);
scene.addLight(newLight);
};
export const change_show_axes = (
scene: BABYLON.Scene,
show_axes: boolean
): void => {
if (show_axes) {
const axes = new BABYLON.Debug.AxesViewer(scene, 5);
}
};
export const zoom = (
inOrOut: "in" | "out",
scene: BABYLON.Scene,
zoom_speed: number
): void => {
var helperCamera = scene.activeCamera! as BABYLON.ArcRotateCamera;
helperCamera.wheelPrecision = 2500 / zoom_speed;
if (inOrOut === "in") {
helperCamera.radius = helperCamera.radius / 2;
} else {
helperCamera.radius = helperCamera.radius * 2;
}
};
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);
};