Skip to content

Commit

Permalink
Fix Canvas3D/Canvas3DGS async imports (#7511)
Browse files Browse the repository at this point in the history
* Fix Model3D and Model3DUpload to handle async-imports and access the child component's exported method

* Refactoring: reorder the lines to put the related snippets together

* add changeset

* Refactoring

* Disable the undo buttons for Canvas3DGS

* add changeset

* Refactoring to use optional chaining

---------

Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com>
  • Loading branch information
whitphx and gradio-pr-bot committed Feb 22, 2024
1 parent 16fbe9c commit 33f68cb
Show file tree
Hide file tree
Showing 3 changed files with 64 additions and 51 deletions.
6 changes: 6 additions & 0 deletions .changeset/yummy-states-wink.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
---
"@gradio/model3d": patch
"gradio": patch
---

fix:Fix Canvas3D/Canvas3DGS async imports
55 changes: 29 additions & 26 deletions js/model3D/shared/Model3D.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@
import { File, Download, Undo } from "@gradio/icons";
import type { I18nFormatter } from "@gradio/utils";
import { dequal } from "dequal";
import type Canvas3DGS from "./Canvas3DGS.svelte";
import type Canvas3D from "./Canvas3D.svelte";
export let value: FileData | null;
export let clear_color: [number, number, number, number] = [0, 0, 0, 0];
Expand All @@ -21,23 +23,33 @@
let current_settings = { camera_position, zoom_speed, pan_speed };
let canvas3dgs: any;
let canvas3d: any;
let use_3dgs = false;
let resolved_url: string | undefined;
async function loadCanvas3D(): Promise<any> {
let Canvas3DGSComponent: typeof Canvas3DGS;
let Canvas3DComponent: typeof Canvas3D;
async function loadCanvas3D(): Promise<typeof Canvas3D> {
const module = await import("./Canvas3D.svelte");
return module.default;
}
async function loadCanvas3DGS(): Promise<any> {
async function loadCanvas3DGS(): Promise<typeof Canvas3DGS> {
const module = await import("./Canvas3DGS.svelte");
return module.default;
}
$: if (value) {
use_3dgs = value.path.endsWith(".splat") || value.path.endsWith(".ply");
if (use_3dgs) {
loadCanvas3DGS().then((component) => {
Canvas3DGSComponent = component;
});
} else {
loadCanvas3D().then((component) => {
Canvas3DComponent = component;
});
}
}
let canvas3d: Canvas3D | undefined;
function handle_undo(): void {
canvas3d.reset_camera_position(camera_position, zoom_speed, pan_speed);
canvas3d?.reset_camera_position(camera_position, zoom_speed, pan_speed);
}
$: {
Expand All @@ -46,25 +58,12 @@
current_settings.zoom_speed !== zoom_speed ||
current_settings.pan_speed !== pan_speed
) {
canvas3d.reset_camera_position(camera_position, zoom_speed, pan_speed);
canvas3d?.reset_camera_position(camera_position, zoom_speed, pan_speed);
current_settings = { camera_position, zoom_speed, pan_speed };
}
}
$: {
if (value) {
use_3dgs = value?.path.endsWith(".splat") || value?.path.endsWith(".ply");
if (use_3dgs) {
loadCanvas3DGS().then((module) => {
canvas3dgs = module;
});
} else {
loadCanvas3D().then((module) => {
canvas3d = module;
});
}
}
}
let resolved_url: string | undefined;
</script>

<BlockLabel
Expand All @@ -75,7 +74,10 @@
{#if value}
<div class="model3D">
<div class="buttons">
<IconButton Icon={Undo} label="Undo" on:click={() => handle_undo()} />
{#if !use_3dgs}
<!-- Canvas3DGS doesn't implement the undo method (reset_camera_position) -->
<IconButton Icon={Undo} label="Undo" on:click={() => handle_undo()} />
{/if}
<a
href={resolved_url}
target={window.__is_colab__ ? "_blank" : null}
Expand All @@ -87,15 +89,16 @@

{#if use_3dgs}
<svelte:component
this={canvas3dgs}
this={Canvas3DGSComponent}
bind:resolved_url
{value}
{zoom_speed}
{pan_speed}
/>
{:else}
<svelte:component
this={canvas3d}
this={Canvas3DComponent}
bind:this={canvas3d}
bind:resolved_url
{value}
{clear_color}
Expand Down
54 changes: 29 additions & 25 deletions js/model3D/shared/Model3DUpload.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@
import { BlockLabel } from "@gradio/atoms";
import { File } from "@gradio/icons";
import type { I18nFormatter } from "@gradio/utils";
import type Canvas3DGS from "./Canvas3DGS.svelte";
import type Canvas3D from "./Canvas3D.svelte";
export let value: null | FileData;
export let clear_color: [number, number, number, number] = [0, 0, 0, 0];
Expand Down Expand Up @@ -38,22 +40,33 @@
dispatch("change");
}
let canvas3d: any;
let canvas3dgs: any;
let use_3dgs = false;
async function loadCanvas3D(): Promise<any> {
let Canvas3DGSComponent: typeof Canvas3DGS;
let Canvas3DComponent: typeof Canvas3D;
async function loadCanvas3D(): Promise<typeof Canvas3D> {
const module = await import("./Canvas3D.svelte");
return module.default;
}
async function loadCanvas3DGS(): Promise<any> {
async function loadCanvas3DGS(): Promise<typeof Canvas3DGS> {
const module = await import("./Canvas3DGS.svelte");
return module.default;
}
$: if (value) {
use_3dgs = value.path.endsWith(".splat") || value.path.endsWith(".ply");
if (use_3dgs) {
loadCanvas3DGS().then((component) => {
Canvas3DGSComponent = component;
});
} else {
loadCanvas3D().then((component) => {
Canvas3DComponent = component;
});
}
}
let canvas3d: Canvas3D | undefined;
async function handle_undo(): Promise<void> {
canvas3d.reset_camera_position(camera_position, zoom_speed, pan_speed);
canvas3d?.reset_camera_position(camera_position, zoom_speed, pan_speed);
}
const dispatch = createEventDispatcher<{
Expand All @@ -66,21 +79,6 @@
let dragging = false;
$: dispatch("drag", dragging);
$: {
if (value) {
use_3dgs = value?.path.endsWith(".splat") || value?.path.endsWith(".ply");
if (use_3dgs) {
loadCanvas3DGS().then((module) => {
canvas3dgs = module;
});
} else {
loadCanvas3D().then((module) => {
canvas3d = module;
});
}
}
}
</script>

<BlockLabel {show_label} Icon={File} label={label || "3D Model"} />
Expand All @@ -97,18 +95,24 @@
{:else}
<div class="input-model">
<ModifyUpload
undoable
undoable={!use_3dgs}
on:clear={handle_clear}
{i18n}
on:undo={handle_undo}
absolute
/>

{#if use_3dgs}
<svelte:component this={canvas3dgs} {value} {zoom_speed} {pan_speed} />
<svelte:component
this={Canvas3DGSComponent}
{value}
{zoom_speed}
{pan_speed}
/>
{:else}
<svelte:component
this={canvas3d}
this={Canvas3DComponent}
bind:this={canvas3d}
{value}
{clear_color}
{camera_position}
Expand Down

0 comments on commit 33f68cb

Please sign in to comment.