diff options
| author | Maze Winther <mazewinther@gmail.com> | 2026-04-13 04:41:17 +0200 |
|---|---|---|
| committer | Maze Winther <mazewinther@gmail.com> | 2026-04-13 05:08:29 +0200 |
| commit | cad88ee4d1c9e06e7529b88ef5e5d3fdf3f89149 (patch) | |
| tree | 0bfc1fcb18b3da4969afa2836bb65e6a5e25d123 /apps/web/src/services/renderer/nodes/sticker-node.ts | |
| parent | 36efdf66e707c818b81009acf8a00630a0309ca1 (diff) | |
| download | opencut-cad88ee4d1c9e06e7529b88ef5e5d3fdf3f89149.tar.gz | |
refactor: rendering pipeline
Made-with: Cursor
Diffstat (limited to 'apps/web/src/services/renderer/nodes/sticker-node.ts')
| -rw-r--r-- | apps/web/src/services/renderer/nodes/sticker-node.ts | 49 |
1 files changed, 14 insertions, 35 deletions
diff --git a/apps/web/src/services/renderer/nodes/sticker-node.ts b/apps/web/src/services/renderer/nodes/sticker-node.ts index 71cb37b5..3c155cb6 100644 --- a/apps/web/src/services/renderer/nodes/sticker-node.ts +++ b/apps/web/src/services/renderer/nodes/sticker-node.ts @@ -1,6 +1,9 @@ -import type { CanvasRenderer } from "../canvas-renderer"; import { resolveStickerId } from "@/lib/stickers"; -import { VisualNode, type VisualNodeParams } from "./visual-node"; +import { + VisualNode, + type ResolvedVisualSourceNodeState, + type VisualNodeParams, +} from "./visual-node"; export interface StickerNodeParams extends VisualNodeParams { stickerId: string; @@ -16,7 +19,11 @@ interface CachedStickerSource { const stickerSourceCache = new Map<string, Promise<CachedStickerSource>>(); -function loadStickerSource({ stickerId }: { stickerId: string }): Promise<CachedStickerSource> { +export function loadStickerSource({ + stickerId, +}: { + stickerId: string; +}): Promise<CachedStickerSource> { const cached = stickerSourceCache.get(stickerId); if (cached) return cached; @@ -42,35 +49,7 @@ function loadStickerSource({ stickerId }: { stickerId: string }): Promise<Cached return promise; } -export class StickerNode extends VisualNode<StickerNodeParams> { - private cachedSource: Promise<CachedStickerSource>; - - constructor(params: StickerNodeParams) { - super(params); - this.cachedSource = loadStickerSource({ stickerId: params.stickerId }); - } - - async render({ renderer, time }: { renderer: CanvasRenderer; time: number }) { - await super.render({ renderer, time }); - - if (!this.isInRange({ time })) { - return; - } - - const { source, width: loadedWidth, height: loadedHeight } = - await this.cachedSource; - - // Prefer element-stored intrinsic dimensions as the geometry authority. - // The loaded image is only the drawable source. - const sourceWidth = this.params.intrinsicWidth ?? loadedWidth; - const sourceHeight = this.params.intrinsicHeight ?? loadedHeight; - - this.renderVisual({ - renderer, - source, - sourceWidth, - sourceHeight, - timelineTime: time, - }); - } -} +export class StickerNode extends VisualNode< + StickerNodeParams, + ResolvedVisualSourceNodeState +> {} |
