Skip to content

Commit 804b63d

Browse files
committed
Show a loader on top of the graph editor when waiting for the preview canvas
1 parent d1b871b commit 804b63d

File tree

4 files changed

+33
-13
lines changed

4 files changed

+33
-13
lines changed

packages/renderer/engine.ts

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { createContextProvider } from "@solid-primitives/context";
2+
import { createEmitter } from "@solid-primitives/event-bus";
23
import { onCleanup } from "solid-js";
34
import { unwrap } from "solid-js/store";
45
import { Material } from "../material/material";
@@ -8,13 +9,13 @@ import { useNodeBlueprintsStore } from "../stores/blueprints";
89
import { useMaterialStore } from "../stores/material";
910
import TextureFilterMethod from "../types/texture-filter";
1011
import { mapDictionary as mapMap } from "../utils/map";
12+
import createRenderCommandQueue, { RenderCommandQueue } from "./command-queue";
1113
import { RenderWorkerCommand, RenderWorkerResponse } from "./commands";
14+
import { PreviewMode } from "./preview";
15+
import { Preview2dSettings } from "./preview-2d";
1216
import { Preview3dSettings } from "./preview-3d";
1317
import { MaterialNodeSnapshot, MinimalMaterialNodeSnapshot, WebGL2RenderWorker } from "./types";
1418
import WebGL2RenderWorkerImpl from "./webgl2/worker?worker";
15-
import createRenderCommandQueue, { RenderCommandQueue } from "./command-queue";
16-
import { PreviewMode } from "./preview";
17-
import { Preview2dSettings } from "./preview-2d";
1819

1920
// A re-type of `Worker`, because the original doesn't support specifying message type...
2021
export interface RenderWorker extends Omit<Worker, "postMessage"> {
@@ -36,6 +37,7 @@ export interface RenderWorker extends Omit<Worker, "postMessage"> {
3637
* a re-render of the modified node and its entire chain.
3738
*/
3839
export const [RenderEngineProvider, useRenderEngine] = createContextProvider(() => {
40+
const events = createEmitter<{ previewCanvasReady: object }>();
3941
const materialStore = useMaterialStore()!;
4042
const blueprintStore = useNodeBlueprintsStore()!;
4143
let worker: RenderWorker | undefined;
@@ -227,6 +229,8 @@ export const [RenderEngineProvider, useRenderEngine] = createContextProvider(()
227229
},
228230
[canvas],
229231
);
232+
233+
events.emit("previewCanvasReady", {});
230234
},
231235

232236
async setPreviewMode(mode: PreviewMode) {
@@ -263,5 +267,7 @@ export const [RenderEngineProvider, useRenderEngine] = createContextProvider(()
263267
settings,
264268
});
265269
},
270+
271+
events,
266272
};
267273
});
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import { RiSystemLoader2Fill } from "solid-icons/ri";
2+
3+
export default function FillLoader() {
4+
return (
5+
<div
6+
class="absolute top-0 left-0 w-full h-full flex items-center justify-center bg-black bg-opacity-25 z-50"
7+
onPointerDown={(e) => e.stopPropagation()}
8+
>
9+
<RiSystemLoader2Fill class="animate-spin" size={24} />
10+
</div>
11+
);
12+
}

packages/ui/editor/canvas/node-thumbnails-canvas.tsx

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,25 @@
11
import { createResizeObserver } from "@solid-primitives/resize-observer";
2-
import { createEffect, onMount } from "solid-js";
2+
import { createEffect, createSignal, onMount } from "solid-js";
33
import { useRenderEngine } from "../../../renderer/engine";
4+
import { WebGL2RenderWorker } from "../../../renderer/types";
45
import { useWorkspaceStore } from "../../../stores/workspace";
6+
import FillLoader from "../../components/loader/fill-loader";
57
import { useEditorCameraState } from "./interaction/camera";
6-
import { WebGL2RenderWorker } from "../../../renderer/types";
78

89
export default function EditorNodeThumbnailsCanvas() {
910
const workspaceManager = useWorkspaceStore()!;
10-
const renderEngine = useRenderEngine()!;
11+
const renderer = useRenderEngine()!;
1112
const cameraState = useEditorCameraState()!;
13+
const [waitingForPreviewCanvas, setWaitingForPreviewCanvas] = createSignal(true);
1214
let sizeElement!: HTMLDivElement;
1315
let worker: WebGL2RenderWorker;
1416

1517
function initialize(canvasElement: HTMLCanvasElement) {
1618
const material = workspaceManager.getActiveMaterial()!;
1719

18-
renderEngine
20+
renderer.events.on("previewCanvasReady", () => setWaitingForPreviewCanvas(false));
21+
22+
renderer
1923
.initializeWebGLWorker(canvasElement.transferControlToOffscreen(), material, true)
2024
.then((w) => {
2125
worker = w;
@@ -47,6 +51,8 @@ export default function EditorNodeThumbnailsCanvas() {
4751
*/}
4852
<div ref={sizeElement} class="absolute w-full h-full" />
4953

54+
{waitingForPreviewCanvas() && <FillLoader />}
55+
5056
<canvas
5157
ref={(e) => onMount(() => initialize(e))}
5258
class="absolute z-10 pointer-events-none"

packages/ui/editor/preview/panel.tsx

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ import {
22
RiMediaFullscreenFill,
33
RiOthersBox3Fill,
44
RiOthersLightbulbFill,
5-
RiSystemLoader2Fill,
65
RiSystemRefreshLine,
76
} from "solid-icons/ri";
87
import { createSignal, onMount } from "solid-js";
@@ -20,6 +19,7 @@ import Button from "../../components/button/button";
2019
import ButtonGroup from "../../components/button/button-group";
2120
import MenuButton from "../../components/button/menu-button";
2221
import MenuButtonOption from "../../components/button/menu-button-option";
22+
import FillLoader from "../../components/loader/fill-loader";
2323
import PanelSection from "../../components/panel/section";
2424
import Preview2dCamera from "./2d-camera";
2525
import PreviewOrbitCamera from "./orbit-camera";
@@ -158,11 +158,7 @@ export default function PreviewPanel() {
158158
<Button icon={RiMediaFullscreenFill} size="small" onClick={toggleFullscreen} />,
159159
]}
160160
>
161-
{loading() && (
162-
<div class="absolute top-0 left-0 w-full h-full flex items-center justify-center z-10">
163-
<RiSystemLoader2Fill class="animate-spin" size={24} />
164-
</div>
165-
)}
161+
{loading() && <FillLoader />}
166162

167163
{!is3D() && resetCameraVisible() && (
168164
<div class="absolute top-12 right-0 m-3 z-10 animate-fade-in">

0 commit comments

Comments
 (0)