@gradio/model3d 0.15.1-dev.0 → 0.15.1-dev.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,89 +1,110 @@
1
- <script>import { onMount } from "svelte";
2
- let BABYLON_VIEWER;
3
- export let value;
4
- export let display_mode;
5
- export let clear_color;
6
- export let camera_position;
7
- export let zoom_speed;
8
- export let pan_speed;
9
- $: url = value.url;
10
- let canvas;
11
- let viewer;
12
- let viewerDetails;
13
- let mounted = false;
14
- onMount(() => {
15
- const initViewer = async () => {
16
- BABYLON_VIEWER = await import("@babylonjs/viewer");
17
- BABYLON_VIEWER.createViewerForCanvas(canvas, {
18
- clearColor: clear_color,
19
- useRightHandedSystem: true,
20
- animationAutoPlay: true,
21
- cameraAutoOrbit: { enabled: false },
22
- onInitialized: (details) => {
23
- viewerDetails = details;
24
- }
25
- }).then((promiseViewer) => {
26
- viewer = promiseViewer;
27
- mounted = true;
28
- });
29
- };
30
- initViewer();
31
- return () => {
32
- viewer?.dispose();
33
- };
34
- });
35
- $: mounted && load_model(url);
36
- function setRenderingMode(pointsCloud, wireframe) {
37
- viewerDetails.scene.forcePointsCloud = pointsCloud;
38
- viewerDetails.scene.forceWireframe = wireframe;
39
- }
40
- function load_model(url2) {
41
- if (viewer) {
42
- if (url2) {
43
- viewer.loadModel(url2, {
44
- pluginOptions: {
45
- obj: {
46
- importVertexColors: true
47
- }
48
- }
49
- }).then(() => {
50
- if (display_mode === "point_cloud") {
51
- setRenderingMode(true, false);
52
- } else if (display_mode === "wireframe") {
53
- setRenderingMode(false, true);
54
- } else {
55
- update_camera(camera_position, zoom_speed, pan_speed);
56
- }
57
- });
58
- } else {
59
- viewer.resetModel();
60
- }
61
- }
62
- }
63
- export function update_camera(camera_position2, zoom_speed2, pan_speed2) {
64
- const camera = viewerDetails.camera;
65
- if (camera_position2[0] !== null) {
66
- camera.alpha = camera_position2[0] * Math.PI / 180;
67
- }
68
- if (camera_position2[1] !== null) {
69
- camera.beta = camera_position2[1] * Math.PI / 180;
70
- }
71
- if (camera_position2[2] !== null) {
72
- camera.radius = camera_position2[2];
73
- }
74
- camera.lowerRadiusLimit = 0.1;
75
- const updateCameraSensibility = () => {
76
- camera.wheelPrecision = 250 / (camera.radius * zoom_speed2);
77
- camera.panningSensibility = 1e4 * pan_speed2 / camera.radius;
78
- };
79
- updateCameraSensibility();
80
- camera.onAfterCheckInputsObservable.add(updateCameraSensibility);
81
- }
82
- export function reset_camera_position() {
83
- if (viewerDetails) {
84
- viewer.resetCamera();
85
- }
86
- }
1
+ <script lang="ts">
2
+ import { onMount } from "svelte";
3
+ import type { FileData } from "@gradio/client";
4
+ import type { Viewer, ViewerDetails } from "@babylonjs/viewer";
5
+
6
+ let BABYLON_VIEWER: typeof import("@babylonjs/viewer");
7
+
8
+ export let value: FileData;
9
+ export let display_mode: "solid" | "point_cloud" | "wireframe";
10
+ export let clear_color: [number, number, number, number];
11
+ export let camera_position: [number | null, number | null, number | null];
12
+ export let zoom_speed: number;
13
+ export let pan_speed: number;
14
+
15
+ $: url = value.url;
16
+
17
+ let canvas: HTMLCanvasElement;
18
+ let viewer: Viewer;
19
+ let viewerDetails: Readonly<ViewerDetails>;
20
+ let mounted = false;
21
+
22
+ onMount(() => {
23
+ const initViewer = async (): Promise<void> => {
24
+ BABYLON_VIEWER = await import("@babylonjs/viewer");
25
+ BABYLON_VIEWER.CreateViewerForCanvas(canvas, {
26
+ clearColor: clear_color,
27
+ useRightHandedSystem: true,
28
+ animationAutoPlay: true,
29
+ cameraAutoOrbit: { enabled: false },
30
+ onInitialized: (details: any) => {
31
+ viewerDetails = details;
32
+ }
33
+ }).then((promiseViewer: any) => {
34
+ viewer = promiseViewer;
35
+ mounted = true;
36
+ });
37
+ };
38
+
39
+ initViewer();
40
+
41
+ return () => {
42
+ viewer?.dispose();
43
+ };
44
+ });
45
+
46
+ $: mounted && load_model(url);
47
+
48
+ function setRenderingMode(pointsCloud: boolean, wireframe: boolean): void {
49
+ viewerDetails.scene.forcePointsCloud = pointsCloud;
50
+ viewerDetails.scene.forceWireframe = wireframe;
51
+ }
52
+
53
+ function load_model(url: string | undefined): void {
54
+ if (viewer) {
55
+ if (url) {
56
+ viewer
57
+ .loadModel(url, {
58
+ pluginOptions: {
59
+ obj: {
60
+ importVertexColors: true
61
+ }
62
+ }
63
+ })
64
+ .then(() => {
65
+ if (display_mode === "point_cloud") {
66
+ setRenderingMode(true, false);
67
+ } else if (display_mode === "wireframe") {
68
+ setRenderingMode(false, true);
69
+ } else {
70
+ update_camera(camera_position, zoom_speed, pan_speed);
71
+ }
72
+ });
73
+ } else {
74
+ viewer.resetModel();
75
+ }
76
+ }
77
+ }
78
+
79
+ export function update_camera(
80
+ camera_position: [number | null, number | null, number | null],
81
+ zoom_speed: number,
82
+ pan_speed: number
83
+ ): void {
84
+ const camera = viewerDetails.camera;
85
+ if (camera_position[0] !== null) {
86
+ camera.alpha = (camera_position[0] * Math.PI) / 180;
87
+ }
88
+ if (camera_position[1] !== null) {
89
+ camera.beta = (camera_position[1] * Math.PI) / 180;
90
+ }
91
+ if (camera_position[2] !== null) {
92
+ camera.radius = camera_position[2];
93
+ }
94
+ camera.lowerRadiusLimit = 0.1;
95
+ const updateCameraSensibility = (): void => {
96
+ camera.wheelPrecision = 250 / (camera.radius * zoom_speed);
97
+ camera.panningSensibility = (10000 * pan_speed) / camera.radius;
98
+ };
99
+ updateCameraSensibility();
100
+ camera.onAfterCheckInputsObservable.add(updateCameraSensibility);
101
+ }
102
+
103
+ export function reset_camera_position(): void {
104
+ if (viewerDetails) {
105
+ viewer.resetCamera();
106
+ }
107
+ }
87
108
  </script>
88
109
 
89
110
  <canvas bind:this={canvas}></canvas>
@@ -1,28 +1,31 @@
1
- import { SvelteComponent } from "svelte";
2
1
  import type { FileData } from "@gradio/client";
3
- declare const __propDef: {
4
- props: {
5
- value: FileData;
6
- display_mode: "solid" | "point_cloud" | "wireframe";
7
- clear_color: [number, number, number, number];
8
- camera_position: [number | null, number | null, number | null];
9
- zoom_speed: number;
10
- pan_speed: number;
11
- update_camera?: (camera_position: [number | null, number | null, number | null], zoom_speed: number, pan_speed: number) => void;
12
- reset_camera_position?: () => void;
2
+ interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
3
+ new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
4
+ $$bindings?: Bindings;
5
+ } & Exports;
6
+ (internal: unknown, props: Props & {
7
+ $$events?: Events;
8
+ $$slots?: Slots;
9
+ }): Exports & {
10
+ $set?: any;
11
+ $on?: any;
13
12
  };
14
- events: {
15
- [evt: string]: CustomEvent<any>;
16
- };
17
- slots: {};
18
- exports?: {} | undefined;
19
- bindings?: string | undefined;
20
- };
21
- export type Canvas3DProps = typeof __propDef.props;
22
- export type Canvas3DEvents = typeof __propDef.events;
23
- export type Canvas3DSlots = typeof __propDef.slots;
24
- export default class Canvas3D extends SvelteComponent<Canvas3DProps, Canvas3DEvents, Canvas3DSlots> {
25
- get update_camera(): (camera_position: [number | null, number | null, number | null], zoom_speed: number, pan_speed: number) => void;
26
- get reset_camera_position(): () => void;
13
+ z_$$bindings?: Bindings;
27
14
  }
28
- export {};
15
+ declare const Canvas3D: $$__sveltets_2_IsomorphicComponent<{
16
+ value: FileData;
17
+ display_mode: "solid" | "point_cloud" | "wireframe";
18
+ clear_color: [number, number, number, number];
19
+ camera_position: [number | null, number | null, number | null];
20
+ zoom_speed: number;
21
+ pan_speed: number;
22
+ update_camera?: (camera_position: [number | null, number | null, number | null], zoom_speed: number, pan_speed: number) => void;
23
+ reset_camera_position?: () => void;
24
+ }, {
25
+ [evt: string]: CustomEvent<any>;
26
+ }, {}, {
27
+ update_camera: (camera_position: [number | null, number | null, number | null], zoom_speed: number, pan_speed: number) => void;
28
+ reset_camera_position: () => void;
29
+ }, string>;
30
+ type Canvas3D = InstanceType<typeof Canvas3D>;
31
+ export default Canvas3D;
@@ -1,83 +1,102 @@
1
- <script>import { onMount } from "svelte";
2
- import * as SPLAT from "gsplat";
3
- export let value;
4
- export let zoom_speed;
5
- export let pan_speed;
6
- $: url = value.url;
7
- let canvas;
8
- let scene;
9
- let camera;
10
- let renderer = null;
11
- let controls;
12
- let mounted = false;
13
- let frameId = null;
14
- function reset_scene() {
15
- if (frameId !== null) {
16
- cancelAnimationFrame(frameId);
17
- frameId = null;
18
- }
19
- if (renderer !== null) {
20
- renderer.dispose();
21
- renderer = null;
22
- }
23
- scene = new SPLAT.Scene();
24
- camera = new SPLAT.Camera();
25
- renderer = new SPLAT.WebGLRenderer(canvas);
26
- controls = new SPLAT.OrbitControls(camera, canvas);
27
- controls.zoomSpeed = zoom_speed;
28
- controls.panSpeed = pan_speed;
29
- if (!value) {
30
- return;
31
- }
32
- let loading = false;
33
- const load = async () => {
34
- if (loading) {
35
- console.error("Already loading");
36
- return;
37
- }
38
- if (!url) {
39
- throw new Error("No resolved URL");
40
- }
41
- loading = true;
42
- if (url.endsWith(".ply")) {
43
- await SPLAT.PLYLoader.LoadAsync(url, scene, void 0);
44
- } else if (url.endsWith(".splat")) {
45
- await SPLAT.Loader.LoadAsync(url, scene, void 0);
46
- } else {
47
- throw new Error("Unsupported file type");
48
- }
49
- loading = false;
50
- };
51
- const frame = () => {
52
- if (!renderer) {
53
- return;
54
- }
55
- if (loading) {
56
- frameId = requestAnimationFrame(frame);
57
- return;
58
- }
59
- controls.update();
60
- renderer.render(scene, camera);
61
- frameId = requestAnimationFrame(frame);
62
- };
63
- load();
64
- frameId = requestAnimationFrame(frame);
65
- }
66
- onMount(() => {
67
- if (value != null) {
68
- reset_scene();
69
- }
70
- mounted = true;
71
- return () => {
72
- if (renderer) {
73
- renderer.dispose();
74
- }
75
- };
76
- });
77
- $: ({ path } = value || {
78
- path: void 0
79
- });
80
- $: canvas && mounted && path && reset_scene();
1
+ <script lang="ts">
2
+ import { onMount } from "svelte";
3
+ import * as SPLAT from "gsplat";
4
+ import type { FileData } from "@gradio/client";
5
+
6
+ export let value: FileData;
7
+ export let zoom_speed: number;
8
+ export let pan_speed: number;
9
+
10
+ $: url = value.url;
11
+
12
+ let canvas: HTMLCanvasElement;
13
+ let scene: SPLAT.Scene;
14
+ let camera: SPLAT.Camera;
15
+ let renderer: SPLAT.WebGLRenderer | null = null;
16
+ let controls: SPLAT.OrbitControls;
17
+ let mounted = false;
18
+ let frameId: number | null = null;
19
+
20
+ function reset_scene(): void {
21
+ if (frameId !== null) {
22
+ cancelAnimationFrame(frameId);
23
+ frameId = null;
24
+ }
25
+
26
+ if (renderer !== null) {
27
+ renderer.dispose();
28
+ renderer = null;
29
+ }
30
+
31
+ scene = new SPLAT.Scene();
32
+ camera = new SPLAT.Camera();
33
+ renderer = new SPLAT.WebGLRenderer(canvas);
34
+ controls = new SPLAT.OrbitControls(camera, canvas);
35
+ controls.zoomSpeed = zoom_speed;
36
+ controls.panSpeed = pan_speed;
37
+
38
+ if (!value) {
39
+ return;
40
+ }
41
+
42
+ let loading = false;
43
+ const load = async (): Promise<void> => {
44
+ if (loading) {
45
+ console.error("Already loading");
46
+ return;
47
+ }
48
+ if (!url) {
49
+ throw new Error("No resolved URL");
50
+ }
51
+ loading = true;
52
+ if (url.endsWith(".ply")) {
53
+ await SPLAT.PLYLoader.LoadAsync(url, scene, undefined);
54
+ } else if (url.endsWith(".splat")) {
55
+ await SPLAT.Loader.LoadAsync(url, scene, undefined);
56
+ } else {
57
+ throw new Error("Unsupported file type");
58
+ }
59
+ loading = false;
60
+ };
61
+
62
+ const frame = (): void => {
63
+ if (!renderer) {
64
+ return;
65
+ }
66
+
67
+ if (loading) {
68
+ frameId = requestAnimationFrame(frame);
69
+ return;
70
+ }
71
+
72
+ controls.update();
73
+ renderer.render(scene, camera);
74
+
75
+ frameId = requestAnimationFrame(frame);
76
+ };
77
+
78
+ load();
79
+ frameId = requestAnimationFrame(frame);
80
+ }
81
+
82
+ onMount(() => {
83
+ if (value != null) {
84
+ reset_scene();
85
+ }
86
+ mounted = true;
87
+
88
+ return () => {
89
+ if (renderer) {
90
+ renderer.dispose();
91
+ }
92
+ };
93
+ });
94
+
95
+ $: ({ path } = value || {
96
+ path: undefined
97
+ });
98
+
99
+ $: canvas && mounted && path && reset_scene();
81
100
  </script>
82
101
 
83
102
  <canvas bind:this={canvas}></canvas>
@@ -1,21 +1,23 @@
1
- import { SvelteComponent } from "svelte";
2
1
  import type { FileData } from "@gradio/client";
3
- declare const __propDef: {
4
- props: {
5
- value: FileData;
6
- zoom_speed: number;
7
- pan_speed: number;
2
+ interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
3
+ new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
4
+ $$bindings?: Bindings;
5
+ } & Exports;
6
+ (internal: unknown, props: Props & {
7
+ $$events?: Events;
8
+ $$slots?: Slots;
9
+ }): Exports & {
10
+ $set?: any;
11
+ $on?: any;
8
12
  };
9
- events: {
10
- [evt: string]: CustomEvent<any>;
11
- };
12
- slots: {};
13
- exports?: {} | undefined;
14
- bindings?: string | undefined;
15
- };
16
- export type Canvas3DgsProps = typeof __propDef.props;
17
- export type Canvas3DgsEvents = typeof __propDef.events;
18
- export type Canvas3DgsSlots = typeof __propDef.slots;
19
- export default class Canvas3Dgs extends SvelteComponent<Canvas3DgsProps, Canvas3DgsEvents, Canvas3DgsSlots> {
13
+ z_$$bindings?: Bindings;
20
14
  }
21
- export {};
15
+ declare const Canvas3DGS: $$__sveltets_2_IsomorphicComponent<{
16
+ value: FileData;
17
+ zoom_speed: number;
18
+ pan_speed: number;
19
+ }, {
20
+ [evt: string]: CustomEvent<any>;
21
+ }, {}, {}, string>;
22
+ type Canvas3DGS = InstanceType<typeof Canvas3DGS>;
23
+ export default Canvas3DGS;
@@ -1,54 +1,69 @@
1
- <script>import { BlockLabel, IconButton, IconButtonWrapper } from "@gradio/atoms";
2
- import { File, Download, Undo } from "@gradio/icons";
3
- import { dequal } from "dequal";
4
- export let value;
5
- export let display_mode = "solid";
6
- export let clear_color = [0, 0, 0, 0];
7
- export let label = "";
8
- export let show_label;
9
- export let i18n;
10
- export let zoom_speed = 1;
11
- export let pan_speed = 1;
12
- export let camera_position = [
13
- null,
14
- null,
15
- null
16
- ];
17
- export let has_change_history = false;
18
- let current_settings = { camera_position, zoom_speed, pan_speed };
19
- let use_3dgs = false;
20
- let Canvas3DGSComponent;
21
- let Canvas3DComponent;
22
- async function loadCanvas3D() {
23
- const module = await import("./Canvas3D.svelte");
24
- return module.default;
25
- }
26
- async function loadCanvas3DGS() {
27
- const module = await import("./Canvas3DGS.svelte");
28
- return module.default;
29
- }
30
- $: if (value) {
31
- use_3dgs = value.path.endsWith(".splat") || value.path.endsWith(".ply");
32
- if (use_3dgs) {
33
- loadCanvas3DGS().then((component) => {
34
- Canvas3DGSComponent = component;
35
- });
36
- } else {
37
- loadCanvas3D().then((component) => {
38
- Canvas3DComponent = component;
39
- });
40
- }
41
- }
42
- let canvas3d;
43
- function handle_undo() {
44
- canvas3d?.reset_camera_position();
45
- }
46
- $: {
47
- if (!dequal(current_settings.camera_position, camera_position) || current_settings.zoom_speed !== zoom_speed || current_settings.pan_speed !== pan_speed) {
48
- canvas3d?.update_camera(camera_position, zoom_speed, pan_speed);
49
- current_settings = { camera_position, zoom_speed, pan_speed };
50
- }
51
- }
1
+ <script lang="ts">
2
+ import type { FileData } from "@gradio/client";
3
+ import { BlockLabel, IconButton, IconButtonWrapper } from "@gradio/atoms";
4
+ import { File, Download, Undo } from "@gradio/icons";
5
+ import type { I18nFormatter } from "@gradio/utils";
6
+ import { dequal } from "dequal";
7
+ import type Canvas3DGS from "./Canvas3DGS.svelte";
8
+ import type Canvas3D from "./Canvas3D.svelte";
9
+
10
+ export let value: FileData | null;
11
+ export let display_mode: "solid" | "point_cloud" | "wireframe" = "solid";
12
+ export let clear_color: [number, number, number, number] = [0, 0, 0, 0];
13
+ export let label = "";
14
+ export let show_label: boolean;
15
+ export let i18n: I18nFormatter;
16
+ export let zoom_speed = 1;
17
+ export let pan_speed = 1;
18
+ // alpha, beta, radius
19
+ export let camera_position: [number | null, number | null, number | null] = [
20
+ null,
21
+ null,
22
+ null
23
+ ];
24
+ export let has_change_history = false;
25
+
26
+ let current_settings = { camera_position, zoom_speed, pan_speed };
27
+
28
+ let use_3dgs = false;
29
+ let Canvas3DGSComponent: typeof Canvas3DGS;
30
+ let Canvas3DComponent: typeof Canvas3D;
31
+ async function loadCanvas3D(): Promise<typeof Canvas3D> {
32
+ const module = await import("./Canvas3D.svelte");
33
+ return module.default;
34
+ }
35
+ async function loadCanvas3DGS(): Promise<typeof Canvas3DGS> {
36
+ const module = await import("./Canvas3DGS.svelte");
37
+ return module.default;
38
+ }
39
+ $: if (value) {
40
+ use_3dgs = value.path.endsWith(".splat") || value.path.endsWith(".ply");
41
+ if (use_3dgs) {
42
+ loadCanvas3DGS().then((component) => {
43
+ Canvas3DGSComponent = component;
44
+ });
45
+ } else {
46
+ loadCanvas3D().then((component) => {
47
+ Canvas3DComponent = component;
48
+ });
49
+ }
50
+ }
51
+
52
+ let canvas3d: Canvas3D | undefined;
53
+ function handle_undo(): void {
54
+ canvas3d?.reset_camera_position();
55
+ }
56
+
57
+ $: {
58
+ if (
59
+ !dequal(current_settings.camera_position, camera_position) ||
60
+ current_settings.zoom_speed !== zoom_speed ||
61
+ current_settings.pan_speed !== pan_speed
62
+ ) {
63
+ canvas3d?.update_camera(camera_position, zoom_speed, pan_speed);
64
+ current_settings = { camera_position, zoom_speed, pan_speed };
65
+ }
66
+ }
52
67
  </script>
53
68
 
54
69
  <BlockLabel
@@ -1,29 +1,31 @@
1
- import { SvelteComponent } from "svelte";
2
1
  import type { FileData } from "@gradio/client";
3
2
  import type { I18nFormatter } from "@gradio/utils";
4
- declare const __propDef: {
5
- props: {
6
- value: FileData | null;
7
- display_mode?: "solid" | "point_cloud" | "wireframe";
8
- clear_color?: [number, number, number, number];
9
- label?: string;
10
- show_label: boolean;
11
- i18n: I18nFormatter;
12
- zoom_speed?: number;
13
- pan_speed?: number;
14
- camera_position?: [number | null, number | null, number | null];
15
- has_change_history?: boolean;
3
+ interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
4
+ new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
5
+ $$bindings?: Bindings;
6
+ } & Exports;
7
+ (internal: unknown, props: Props & {
8
+ $$events?: Events;
9
+ $$slots?: Slots;
10
+ }): Exports & {
11
+ $set?: any;
12
+ $on?: any;
16
13
  };
17
- events: {
18
- [evt: string]: CustomEvent<any>;
19
- };
20
- slots: {};
21
- exports?: {} | undefined;
22
- bindings?: string | undefined;
23
- };
24
- export type Model3DProps = typeof __propDef.props;
25
- export type Model3DEvents = typeof __propDef.events;
26
- export type Model3DSlots = typeof __propDef.slots;
27
- export default class Model3D extends SvelteComponent<Model3DProps, Model3DEvents, Model3DSlots> {
14
+ z_$$bindings?: Bindings;
28
15
  }
29
- export {};
16
+ declare const Model3D: $$__sveltets_2_IsomorphicComponent<{
17
+ value: FileData | null;
18
+ display_mode?: "solid" | "point_cloud" | "wireframe";
19
+ clear_color?: [number, number, number, number];
20
+ label?: string;
21
+ show_label: boolean;
22
+ i18n: I18nFormatter;
23
+ zoom_speed?: number;
24
+ pan_speed?: number;
25
+ camera_position?: [number | null, number | null, number | null];
26
+ has_change_history?: boolean;
27
+ }, {
28
+ [evt: string]: CustomEvent<any>;
29
+ }, {}, {}, string>;
30
+ type Model3D = InstanceType<typeof Model3D>;
31
+ export default Model3D;