diff --git a/.changeset/clear-adults-fall.md b/.changeset/clear-adults-fall.md new file mode 100644 index 0000000000..c99be901d8 --- /dev/null +++ b/.changeset/clear-adults-fall.md @@ -0,0 +1,6 @@ +--- +"@gradio/model3d": patch +"gradio": patch +--- + +fix:Ensure camera settings only update when necessary in Model3D diff --git a/js/model3D/package.json b/js/model3D/package.json index b50624e4cd..e758a691d3 100644 --- a/js/model3D/package.json +++ b/js/model3D/package.json @@ -15,7 +15,8 @@ "@gradio/utils": "workspace:^", "@types/babylon": "^6.16.6", "babylonjs": "^4.2.1", - "babylonjs-loaders": "^4.2.1" + "babylonjs-loaders": "^4.2.1", + "dequal": "^2.0.2" }, "main_changeset": true, "main": "./Index.svelte", diff --git a/js/model3D/shared/Model3D.svelte b/js/model3D/shared/Model3D.svelte index 088a13d6af..8890fdb656 100644 --- a/js/model3D/shared/Model3D.svelte +++ b/js/model3D/shared/Model3D.svelte @@ -7,6 +7,7 @@ import * as BABYLON from "babylonjs"; import * as BABYLON_LOADERS from "babylonjs-loaders"; import type { I18nFormatter } from "@gradio/utils"; + import { dequal } from "dequal"; export let value: FileData | null; export let clear_color: [number, number, number, number] = [0, 0, 0, 0]; @@ -15,7 +16,6 @@ export let i18n: I18nFormatter; export let zoom_speed = 1; export let pan_speed = 1; - // alpha, beta, radius export let camera_position: [number | null, number | null, number | null] = [ null, @@ -23,6 +23,8 @@ null ]; + let current_settings = { camera_position, zoom_speed, pan_speed }; + $: { if ( BABYLON_LOADERS.OBJFileLoader != undefined && @@ -80,8 +82,17 @@ reset_camera_position(scene, camera_position, zoom_speed, pan_speed); } - $: if (scene) - reset_camera_position(scene, camera_position, zoom_speed, pan_speed); + $: { + if ( + scene && + (!dequal(current_settings.camera_position, camera_position) || + current_settings.zoom_speed !== zoom_speed || + current_settings.pan_speed !== pan_speed) + ) { + reset_camera_position(scene, camera_position, zoom_speed, pan_speed); + current_settings = { camera_position, zoom_speed, pan_speed }; + } + }