import type { Blending, DataBounds, Lazy, RenderPassMode, StorageSource, TextureSource, UniformAttribute, UseGPURenderContext, VectorLike } from '@use-gpu/core'; import type { LiveComponent, ArrowFunction, Ref } from '@use-gpu/live'; import type { ShaderModule, ShaderSource } from '@use-gpu/shader'; import type { Update } from '@use-gpu/state'; import type { BoundLight } from '../light/types.d.cts'; import { vec3 } from 'gl-matrix'; export type PassOptions = { oit?: boolean | Partial; ssao?: boolean | number | Partial; overscan?: number | Partial; outline?: boolean | number | Partial; } & Pick; export type PassFlags = { lights?: boolean; shadows?: boolean; picking?: boolean; facets?: boolean; oit?: OITOptions; ssao?: SSAOOptions; overscan?: OverscanOptions; outline?: OutlineOptions; color?: boolean; overlay?: boolean | OverlayFlags; merge?: boolean; }; export type OverlayFlags = { color?: boolean; picking?: boolean; }; export type ExtendedPassFlags = PassFlags & { normals?: boolean; motion?: boolean; }; export type OITOptions = { _unused?: boolean; }; export type SSAOOptions = { opacity: number; indirect: number; radius: number; depthRamp: number; normalRamp: number; temporalBlend: number; }; export type OverscanOptions = { range: number; all: boolean; }; export type OutlineOptions = { inner: number; outer: number; color: VectorLike; blend: Blending | GPUBlendState; depthRamp: number; normalRamp: number; }; export type PassResources = { targets: Record; bindings: Record; dispatches: ArrowFunction[]; views: Record; }; export type PassView = { cull: Culler; uniforms: Record; }; export type PassEnv = { light?: LightEnv; }; export type LightEnv = { lights: Map; shadows: Map; order: number[]; subranges: Map; sources: { lightData: StorageSource; shadowMap: TextureSource | null; }; }; export type PassBinding = { module: ShaderModule; visibility?: 'vertex' | 'fragment'; bind?: (env: PassEnv) => (ShaderSource | null | undefined)[]; }; export type PassBindGroup = { key: string | number; layout: GPUBindGroupLayout; attributes: (UniformAttribute | null)[]; bind?: (env: PassEnv) => (ShaderSource | null | undefined)[]; }; export type PassApplyBindGroup = (passEncoder: GPURenderPassEncoder | GPUComputePassEncoder) => void; export type Culler = (center: vec3, radius: number) => number | boolean; export type Renderable = { draw: RenderToPass; bounds?: Lazy; }; export type RenderComponents = { modes: Record>; renders: Record>>; }; export type RenderCounter = (v: number, t: number) => void; export type RenderToPass = (passEncoder: GPURenderPassEncoder, countGeometry: RenderCounter, uniforms: Record>, flip?: boolean) => void; export type ComputeCounter = (w: number, s: number) => void; export type ComputeToPass = (passEncoder: GPUComputePassEncoder, countDispatch: ComputeCounter) => void; export type CommandToBuffer = () => GPUCommandBuffer | GPUCommandBuffer[]; export type AggregatedCalls = { env?: any[]; dispatch?: ArrowFunction[]; pre?: CommandToBuffer[]; compute?: ComputeToPass[]; opaque?: Renderable[]; transparent?: Renderable[]; debug?: Renderable[]; picking?: Renderable[]; stencil?: Renderable[]; light?: Renderable[]; shadow?: Renderable[]; post?: CommandToBuffer[]; readback?: ArrowFunction[]; }; export type VirtualDraw = { pipeline: Update; defines: Record; mode: RenderPassMode | string; renderer: string; label?: string; vertexCount?: Lazy; instanceCount?: Lazy; firstVertex?: Lazy; firstInstance?: Lazy; bounds?: Lazy | null; indirect?: StorageSource; links: Record; shouldDispatch?: (u: Record) => boolean | number | null | undefined; onDispatch?: (u: Record) => void; };