import { Md2Model } from '../assets/md2.js'; import { IndexBuffer, VertexArray, VertexBuffer } from './resources.js'; import { ShaderProgram } from './shaderProgram.js'; import { DLight } from './dlight.js'; import { RenderModeConfig } from './frame.js'; export interface Md2DrawVertex { readonly vertexIndex: number; readonly texCoord: readonly [number, number]; } export interface Md2Geometry { readonly vertices: readonly Md2DrawVertex[]; readonly indices: Uint16Array; } export interface Md2FrameBlend { readonly frame0: number; readonly frame1: number; readonly lerp: number; } export interface Md2BindOptions { readonly modelViewProjection: Float32List; readonly lightDirection?: readonly [number, number, number]; readonly ambientLight?: number; readonly tint?: readonly [number, number, number, number]; readonly diffuseSampler?: number; readonly dlights?: readonly DLight[]; readonly modelMatrix?: Float32List; readonly renderMode?: RenderModeConfig; readonly brightness?: number; readonly gamma?: number; readonly fullbright?: boolean; readonly ambient?: number; } export declare const MD2_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;\n\nstruct DLight {\n vec3 position;\n vec3 color;\n float intensity;\n};\n\nconst int MAX_DLIGHTS = 32;\n\nuniform mat4 u_modelViewProjection;\nuniform mat4 u_modelMatrix;\nuniform vec3 u_lightDir;\nuniform float u_ambient;\n\nuniform int u_numDlights;\nuniform DLight u_dlights[MAX_DLIGHTS];\n\nout vec2 v_texCoord;\nout vec3 v_lightColor;\nout vec3 v_position; // For faceted shading\n\nvoid main() {\n vec3 normal = normalize(a_normal);\n\n // Directional Light (simple Lambert)\n float dotL = max(dot(normal, normalize(u_lightDir)), 0.0);\n vec3 lightAcc = vec3(min(1.0, u_ambient + dotL)); // White light assumed for directional/ambient\n\n // Dynamic Lights\n vec4 worldPos = u_modelMatrix * vec4(a_position, 1.0);\n\n for (int i = 0; i < MAX_DLIGHTS; i++) {\n if (i >= u_numDlights) break;\n DLight dlight = u_dlights[i];\n\n float dist = distance(worldPos.xyz, dlight.position);\n if (dist < dlight.intensity) {\n float intensity = (dlight.intensity - dist) / dlight.intensity;\n lightAcc += dlight.color * intensity;\n }\n }\n\n v_lightColor = lightAcc;\n v_texCoord = a_texCoord;\n v_position = worldPos.xyz;\n gl_Position = u_modelViewProjection * vec4(a_position, 1.0);\n}"; export declare const MD2_FRAGMENT_SHADER = "#version 300 es\nprecision highp float;\n\nin vec2 v_texCoord;\nin vec3 v_lightColor;\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_lightColor;\n\n if (u_fullbright) {\n light = vec3(1.0);\n }\n\n // Apply global ambient min\n light = max(light, vec3(u_globalAmbient));\n\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);\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 function buildMd2Geometry(model: Md2Model): Md2Geometry; export declare function buildMd2VertexData(model: Md2Model, geometry: Md2Geometry, blend: Md2FrameBlend): Float32Array; export declare class Md2MeshBuffers { readonly gl: WebGL2RenderingContext; readonly geometry: Md2Geometry; readonly vertexBuffer: VertexBuffer; readonly indexBuffer: IndexBuffer; readonly vertexArray: VertexArray; readonly indexCount: number; wireframeIndexBuffer?: IndexBuffer; wireframeIndexCount?: number; constructor(gl: WebGL2RenderingContext, model: Md2Model, blend: Md2FrameBlend); update(model: Md2Model, blend: Md2FrameBlend): void; bind(): void; dispose(): void; } export declare class Md2Pipeline { readonly gl: WebGL2RenderingContext; readonly program: ShaderProgram; private readonly uniformMvp; private readonly uniformModelMatrix; private readonly uniformLightDir; private readonly uniformAmbient; private readonly uniformTint; private readonly uniformDiffuse; private readonly uniformRenderMode; private readonly uniformSolidColor; private readonly uniformNumDlights; private readonly uniformDlights; private readonly uniformBrightness; private readonly uniformGamma; private readonly uniformFullbright; private readonly uniformGlobalAmbient; constructor(gl: WebGL2RenderingContext); get shaderSize(): number; bind(options: Md2BindOptions): void; draw(mesh: Md2MeshBuffers, renderMode?: RenderModeConfig): void; dispose(): void; } //# sourceMappingURL=md2Pipeline.d.ts.map