feat(web): complete portable Blender feature gaps
This commit is contained in:
@@ -3,19 +3,22 @@ import type { ShaderNodeType } from "./shader-graph";
|
||||
|
||||
export type RenderBackend = "WEBGL2" | "WEBGPU";
|
||||
export type PostProcessPass = "FXAA" | "BLOOM" | "SSAO" | "SSR" | "TAA" | "DOF" | "MOTION_BLUR";
|
||||
export type RenderPassName = "COMBINED" | "Z" | "MIST" | "NORMAL" | "VECTOR" | "UV" | "OBJECT_INDEX" | "MATERIAL_INDEX" | "SHADOW" | "AO" | "EMISSION" | "ENVIRONMENT" | "DIFFUSE_DIRECT" | "DIFFUSE_INDIRECT" | "GLOSSY_DIRECT" | "GLOSSY_INDIRECT" | "TRANSMISSION_DIRECT" | "TRANSMISSION_INDIRECT" | "VOLUME_DIRECT" | "VOLUME_INDIRECT" | "CRYPTOMATTE_OBJECT" | "CRYPTOMATTE_MATERIAL" | "CRYPTOMATTE_ASSET";
|
||||
|
||||
export type RenderCapabilityRequest =
|
||||
| { kind: "ARBITRARY_SHADER"; nodeTypes: string[] }
|
||||
| { kind: "VOLUME" }
|
||||
| { kind: "SUBSURFACE" }
|
||||
| { kind: "WEBGPU_BACKEND" }
|
||||
| { kind: "POSTPROCESS"; passes: PostProcessPass[] };
|
||||
| { kind: "POSTPROCESS"; passes: PostProcessPass[] }
|
||||
| { kind: "RENDER_PASSES"; passes: RenderPassName[] };
|
||||
|
||||
export interface RenderCapabilityContext {
|
||||
webgpuAvailable?: boolean;
|
||||
webgpuRendererBundled?: boolean;
|
||||
supportedShaderNodes?: ReadonlySet<ShaderNodeType>;
|
||||
supportedPostProcessPasses?: ReadonlySet<PostProcessPass>;
|
||||
supportedRenderPasses?: ReadonlySet<RenderPassName>;
|
||||
volumeRendererAvailable?: boolean;
|
||||
subsurfaceRendererAvailable?: boolean;
|
||||
}
|
||||
@@ -57,6 +60,13 @@ export function gateRenderCapability(
|
||||
const reason = context.webgpuAvailable ? "The WebGPU renderer bundle is not installed" : "WebGPU is unavailable in this browser or device";
|
||||
return blockedGate("PBR-012", "WEBGPU_BACKEND", [capabilityIssue("WEBGPU_RENDERER_UNAVAILABLE", reason)]);
|
||||
}
|
||||
if (request.kind === "RENDER_PASSES") {
|
||||
const supported = context.supportedRenderPasses ?? new Set<RenderPassName>(["COMBINED", "Z", "MIST", "NORMAL", "VECTOR", "UV", "OBJECT_INDEX", "MATERIAL_INDEX", "SHADOW", "AO", "EMISSION", "ENVIRONMENT", "DIFFUSE_DIRECT", "DIFFUSE_INDIRECT", "GLOSSY_DIRECT", "GLOSSY_INDIRECT", "TRANSMISSION_DIRECT", "TRANSMISSION_INDIRECT", "VOLUME_DIRECT", "VOLUME_INDIRECT", "CRYPTOMATTE_OBJECT", "CRYPTOMATTE_MATERIAL", "CRYPTOMATTE_ASSET"]);
|
||||
const unsupported = [...new Set(request.passes.filter((pass) => !supported.has(pass)))];
|
||||
return unsupported.length === 0
|
||||
? readyGate("PBR-012", "RENDER_PASSES")
|
||||
: blockedGate("PBR-012", "RENDER_PASSES", [capabilityIssue("RENDER_PASS_UNAVAILABLE", `Unsupported render passes: ${unsupported.join(", ")}`, "passes")]);
|
||||
}
|
||||
const supported = context.supportedPostProcessPasses ?? new Set<PostProcessPass>();
|
||||
const unsupported = [...new Set(request.passes.filter((pass) => !supported.has(pass)))];
|
||||
return unsupported.length === 0
|
||||
|
||||
Reference in New Issue
Block a user