import type { ShaderLike } from '../../shared'; import type { WebGLRenderer } from '../WebGLRenderer'; import type { GlProgram } from './GlProgram'; import { UniformGroup } from '../../shared/shader'; import { GlSystem } from '../system'; import { GlProgramData } from './GlProgramData'; export declare class GlShaderSystem extends GlSystem { install(renderer: WebGLRenderer): void; readonly glProgramDatas: Map; currentProgram: GlProgram | null; /** * Global uniforms (projection/view) shared by every shader. Held as a * UniformGroup so each program only re-uploads them when they actually change * (tracked via the group's `_dirtyId`). Call {@link markGlobalUniformsDirty} * after mutating `uniforms.projectionMatrix` / `uniforms.viewMatrix`. */ readonly globalUniforms: UniformGroup<{ projectionMatrix: Float32Array; viewMatrix: Float32Array; }>; /** Backwards-compatible accessor for the global uniform values. */ get uniforms(): { projectionMatrix: Float32Array; viewMatrix: Float32Array; }; /** Flag the global uniforms as changed so they are re-uploaded on next use. */ markGlobalUniformsDirty(): void; bind(source: ShaderLike | null): void; useProgram(glProgram: GlProgram | null): void; getGlProgramData(source: GlProgram): GlProgramData; protected _createGlProgramData(glProgram: GlProgram): GlProgramData; protected _createGlShader(source: string, target: number): WebGLShader; updateUniforms(source: ShaderLike): void; /** * Upload a shared uniform group to a program, skipping the work entirely when * the group has not changed since it was last synced to this program. */ updateUniformGroup(group: UniformGroup, glProgram: GlProgram): void; protected _uploadUniforms(glProgramData: GlProgramData, uniforms: Record): void; reset(): void; destroy(): void; }