--- name: patchies-rendering description: Use when changing Patchies rendering pipeline, render graph, image generation preview capture, GLSystem, render workers, FBO rendering, output sizing, render-node types, or video previews. --- # Patchies Rendering ## Architecture Rendering changes usually cross the main thread, render worker, object modules, and tests. - `ui/src/lib/canvas/GLSystem.ts` owns the main-thread bridge to the render worker, node/edge graph updates, preview canvas delivery, output sizing, worker requests, VFS shader invalidation, and capture-preview requests. - `ui/src/workers/rendering/renderWorker.ts` dispatches worker messages and delegates rendering work to `FBORenderer`. - `ui/src/workers/rendering/fboRenderer.ts` owns FBO allocation, renderer creation, render graph execution, preview readback, feedback textures, output sizing, and capture bitmaps. - `ui/src/lib/rendering/graphUtils.ts` builds the render graph, parses video handles, detects back-edges, and identifies `bg.out`. - `ui/src/lib/rendering/types.ts` is the shared registry/primitives file for render graph types. ## Render-Node Ownership Object-specific render-node discriminated unions belong in `ui/src/objects//render-types.ts`. Keep `ui/src/lib/rendering/types.ts` as a registry and shared primitive surface: - Import object-owned render types into the central `RenderNode` union. - Keep shared renderer primitives there, such as `FBOFormat`, `FBOResolution`, `RenderGraph`, `FBONode`, worker message types, and render params. - Do not author object-specific variants like `type: 'glsl'` or `type: 'hydra'` directly in the shared file. ## Capture And Preview Image-generation and export-style capture flows coordinate across: - `generateImageWithGemini` - `capturePreviewFrame` - `GLSystem.send('capturePreview', ...)` - `renderWorker`'s `capturePreview` handler - `FBORenderer.capturePreviewBitmap()` Preserve the `customSize?: [number, number]` pattern across this path. Preview performance work usually touches `FlowCanvasInner.svelte`, preview visibility stores, `GLSystem.setVisibleNodes()`, `GLSystem.setPreviewScaleMultiplier()`, `PreviewRenderer`, and `FBORenderer`. ## Change Strategy - Trace the full render path before patching one file. - Keep object-specific rendering behavior in the owning object module when possible. - Update focused tests for the affected layer. Common rendering checks include `src/workers/rendering/cooking/policies.test.ts`, `src/workers/rendering/renderEligibility.test.ts`, and `src/lib/rendering/graphUtils.test.ts`. - Run `git diff --check` after edits.