41 lines
1.5 KiB
TypeScript
41 lines
1.5 KiB
TypeScript
import type { ImageDocument } from "@core/document";
|
|
import type { Layer } from "@core/layer";
|
|
import type { EditorState } from "@editor/state";
|
|
import { resolveTransformTargetBounds } from "@editor/transform-targets";
|
|
import type { ImageTextureRenderer } from "./image-textures";
|
|
import { documentRectToScreenRect } from "./screen-rect";
|
|
import type { WebGlRendererContext } from "./types";
|
|
|
|
const maskOverlayColor = [0.25, 0.65, 1, 0.35] as const;
|
|
|
|
export function renderMaskEditOverlay(
|
|
context: WebGlRendererContext,
|
|
document: ImageDocument,
|
|
editor: EditorState,
|
|
imageTextureRenderer: ImageTextureRenderer,
|
|
) {
|
|
const layerId = editor.maskEditLayerId;
|
|
if (!layerId) return;
|
|
|
|
const layer = findLayer(document.artboards.flatMap((artboard) => artboard.layers), layerId);
|
|
if (!layer || layer.type === "group") return;
|
|
|
|
const bounds = resolveTransformTargetBounds(document, { type: "layer", id: layer.id });
|
|
const asset = document.assets.find((candidate) => candidate.id === layer.assetId);
|
|
if (!bounds || !asset) return;
|
|
|
|
const rect = documentRectToScreenRect(context.canvas, bounds, editor.viewport);
|
|
imageTextureRenderer.renderTinted(asset, rect, maskOverlayColor);
|
|
}
|
|
|
|
function findLayer(layers: readonly Layer[], layerId: string): Layer | undefined {
|
|
for (const layer of layers) {
|
|
if (layer.id === layerId) return layer;
|
|
if (layer.type === "group") {
|
|
const child = findLayer(layer.children, layerId);
|
|
if (child) return child;
|
|
}
|
|
}
|
|
return undefined;
|
|
}
|