import { Mat4, Vec3 } from '@quake2ts/shared'; import { Md3Model, Md3Surface } from '../assets/md3.js'; import { IndexBuffer, VertexArray, VertexBuffer } from './resources.js'; import { ShaderProgram } from './shaderProgram.js'; import { RenderModeConfig } from './frame.js'; export interface Md3DrawVertex { readonly vertexIndex: number; readonly texCoord: readonly [number, number]; } export interface Md3SurfaceGeometry { readonly vertices: readonly Md3DrawVertex[]; readonly indices: Uint16Array; } export interface Md3FrameBlend { readonly frame0: number; readonly frame1: number; readonly lerp: number; } export interface Md3DynamicLight { readonly origin: Vec3; readonly color: readonly [number, number, number]; readonly radius: number; } export interface Md3LightingOptions { readonly ambient?: readonly [number, number, number]; readonly directional?: { direction: Vec3; color: readonly [number, number, number]; }; readonly dynamicLights?: readonly Md3DynamicLight[]; readonly modelMatrix?: Mat4; } export interface Md3SurfaceMaterial { readonly diffuseSampler?: number; readonly tint?: readonly [number, number, number, number]; readonly renderMode?: RenderModeConfig; readonly brightness?: number; readonly gamma?: number; readonly fullbright?: boolean; readonly globalAmbient?: number; } export interface Md3TagTransform { readonly origin: Vec3; readonly axis: readonly [Vec3, Vec3, Vec3]; readonly matrix: Mat4; } export declare function buildMd3SurfaceGeometry(surface: Md3Surface): Md3SurfaceGeometry; export declare function buildMd3VertexData(surface: Md3Surface, geometry: Md3SurfaceGeometry, blend: Md3FrameBlend, lighting?: Md3LightingOptions): Float32Array; export declare function interpolateMd3Tag(model: Md3Model, blend: Md3FrameBlend, tagName: string): Md3TagTransform | null; export declare const MD3_VERTEX_SHADER = "#version 300 es\nprecision highp float;\n\nlayout(location = 0) in vec3 a_position;\nlayout(location = 1) in vec3 a_normal;\nlayout(location = 2) in vec2 a_texCoord;\nlayout(location = 3) in vec4 a_color;\n\nuniform mat4 u_modelViewProjection;\n\nout vec2 v_texCoord;\nout vec4 v_color;\nout vec3 v_position;\n\nvoid main() {\n v_texCoord = a_texCoord;\n v_color = a_color;\n v_position = a_position; // Model space, assuming single mesh pass\n gl_Position = u_modelViewProjection * vec4(a_position, 1.0);\n}"; export declare const MD3_FRAGMENT_SHADER = "#version 300 es\nprecision highp float;\n\nin vec2 v_texCoord;\nin vec4 v_color;\nin vec3 v_position;\n\nuniform sampler2D u_diffuseMap;\nuniform vec4 u_tint;\n\nuniform int u_renderMode; // 0: Textured, 1: Solid, 2: Solid Faceted\nuniform vec4 u_solidColor;\n\n// Lighting controls\nuniform float u_brightness;\nuniform float u_gamma;\nuniform bool u_fullbright;\nuniform float u_globalAmbient;\n\nout vec4 o_color;\n\nvoid main() {\n vec4 finalColor;\n\n if (u_renderMode == 0) {\n vec4 albedo = texture(u_diffuseMap, v_texCoord) * u_tint;\n\n vec3 light = v_color.rgb;\n if (u_fullbright) {\n light = vec3(1.0);\n }\n light = max(light, vec3(u_globalAmbient));\n light *= u_brightness;\n\n vec3 rgb = albedo.rgb * light;\n\n if (u_gamma != 1.0) {\n rgb = pow(rgb, vec3(1.0 / u_gamma));\n }\n\n finalColor = vec4(rgb, albedo.a * v_color.a);\n } else {\n vec3 color = u_solidColor.rgb;\n if (u_renderMode == 2) {\n // FACETED\n vec3 fdx = dFdx(v_position);\n vec3 fdy = dFdy(v_position);\n vec3 faceNormal = normalize(cross(fdx, fdy));\n vec3 lightDir = normalize(vec3(0.5, 0.5, 1.0));\n float diff = max(dot(faceNormal, lightDir), 0.2);\n color *= diff;\n }\n finalColor = vec4(color, u_solidColor.a * u_tint.a);\n }\n\n o_color = finalColor;\n}"; export declare class Md3SurfaceMesh { readonly gl: WebGL2RenderingContext; readonly geometry: Md3SurfaceGeometry; readonly vertexBuffer: VertexBuffer; readonly indexBuffer: IndexBuffer; readonly vertexArray: VertexArray; readonly indexCount: number; wireframeIndexBuffer?: IndexBuffer; wireframeIndexCount?: number; constructor(gl: WebGL2RenderingContext, surface: Md3Surface, blend: Md3FrameBlend, lighting?: Md3LightingOptions); update(surface: Md3Surface, blend: Md3FrameBlend, lighting?: Md3LightingOptions): void; bind(): void; dispose(): void; } export declare class Md3ModelMesh { readonly surfaces: Map; readonly gl: WebGL2RenderingContext; readonly model: Md3Model; blend: Md3FrameBlend; lighting?: Md3LightingOptions; constructor(gl: WebGL2RenderingContext, model: Md3Model, blend: Md3FrameBlend, lighting?: Md3LightingOptions); update(blend: Md3FrameBlend, lighting?: Md3LightingOptions): void; dispose(): void; } export declare class Md3Pipeline { readonly gl: WebGL2RenderingContext; readonly program: ShaderProgram; private readonly uniformMvp; private readonly uniformTint; private readonly uniformDiffuse; private readonly uniformRenderMode; private readonly uniformSolidColor; private readonly uniformBrightness; private readonly uniformGamma; private readonly uniformFullbright; private readonly uniformGlobalAmbient; constructor(gl: WebGL2RenderingContext); get shaderSize(): number; bind(modelViewProjection: Float32List, tint?: readonly [number, number, number, number], sampler?: number): void; drawSurface(mesh: Md3SurfaceMesh, material?: Md3SurfaceMaterial): void; dispose(): void; } //# sourceMappingURL=md3Pipeline.d.ts.map