import type { Vector3 } from '@holoscript/core'; /** * AdvancedPBR.ts * * Advanced Physically-Based Rendering material model. * * Extends basic PBR (albedo + normal + roughness) with: * - Clearcoat layer (car paint, lacquer, wet surfaces) * - Anisotropy (brushed metal, hair, fabric warp) * - Sheen (velvet, cloth, microfibre) * - Iridescence (soap bubbles, oil slicks, beetle shells) * - Multi-layer material stack * - Metallic/roughness workflow helpers * * All calculations are CPU-side (can feed GPU uniforms or be used in * offline renderers). No WebGPU imports — fully testable in Vitest. * * @module rendering */ export type RGB = [number, number, number]; export interface ClearcoatConfig { /** 0–1, overall clearcoat presence */ intensity: number; /** 0–1, surface roughness of the clearcoat layer */ roughness: number; /** Index of refraction (default 1.5 for glass-like coat) */ ior: number; } export interface AnisotropyConfig { /** 0–1, anisotropy magnitude */ strength: number; /** Rotation angle of anisotropic tangent in radians */ angle: number; /** Anisotropy direction vector (must be unit) */ tangent: Vector3; } export interface SheenConfig { /** RGB tint for sheen reflection */ color: RGB; /** 0–1, surface roughness of sheen layer (velvet = low) */ roughness: number; } export interface IridescenceConfig { /** 0–1, how visible the iridescent effect is */ intensity: number; /** Index of refraction of thin film */ ior: number; /** Thin-film thickness in nanometres (400–1200 typical) */ thicknessNm: number; } export interface AdvancedPBRConfig { /** Base albedo (linear RGB) */ albedo: RGB; /** 0–1, 0 = dielectric, 1 = metal */ metallic: number; /** 0–1, microsurface roughness */ roughness: number; /** Ambient occlusion 0–1 */ ao: number; /** Emissive colour (HDR, can exceed 1) */ emissive: RGB; clearcoat?: ClearcoatConfig; anisotropy?: AnisotropyConfig; sheen?: SheenConfig; iridescence?: IridescenceConfig; } /** GGX / Trowbridge-Reitz normal distribution function */ export declare function distributionGGX(NdotH: number, roughness: number): number; /** Smith's geometry attenuation (Schlick-GGX) */ export declare function geometrySmith(NdotV: number, NdotL: number, roughness: number): number; /** Schlick Fresnel approximation */ export declare function fresnelSchlick(cosTheta: number, F0: RGB): RGB; /** Schlick Fresnel with roughness (for IBL) */ export declare function fresnelRoughness(cosTheta: number, F0: RGB, roughness: number): RGB; /** * Evaluate clearcoat layer BRDF contribution. * Uses a separate GGX lobe with IOR-derived F0 ≈ ((ior-1)/(ior+1))². */ export declare function evaluateClearcoat(NdotH: number, NdotV: number, NdotL: number, VdotH: number, config: ClearcoatConfig): number; /** * GGX NDF modified for anisotropic surfaces (Burley 2012). * alphaT and alphaB are per-axis roughness values. */ export declare function distributionGGXAnisotropic(NdotH: number, TdotH: number, BdotH: number, alphaT: number, alphaB: number): number; /** * Compute per-axis roughness values from isotropic roughness + anisotropy strength. * Returns [alphaT, alphaB]. */ export declare function anisotropicRoughness(roughness: number, strength: number): [number, number]; /** * Charlie sheen NDF (Estevez & Kulla 2017). * Produces the characteristic soft highlight at grazing angles. */ export declare function sheenDistribution(NdotH: number, roughness: number): number; /** Sheen visibility function (L(NdotV) * L(NdotL)) */ export declare function sheenVisibility(NdotV: number, NdotL: number): number; /** Evaluate full sheen BRDF contribution */ export declare function evaluateSheen(NdotH: number, NdotV: number, NdotL: number, config: SheenConfig): RGB; /** * Thin-film interference iridescence (McGuire & Skelton 2020). * Computes a wavelength-dependent phase shift and maps it to RGB. * wavelengths: [680, 550, 440] nm (R, G, B). */ export declare function evaluateIridescence(cosTheta: number, config: IridescenceConfig): RGB; /** * Compute F0 (reflectance at normal incidence) from albedo + metallic. * Dielectrics: F0 ≈ 0.04 (non-metals), metals: F0 = albedo. */ export declare function computeF0(albedo: RGB, metallic: number): RGB; /** * Compute diffuse albedo for metallic surfaces (metals have no diffuse). */ export declare function computeDiffuseAlbedo(albedo: RGB, metallic: number): RGB; export declare class AdvancedPBRMaterial { private config; constructor(config?: Partial); setAlbedo(r: number, g: number, b: number): void; setMetallic(v: number): void; setRoughness(v: number): void; setAO(v: number): void; setEmissive(r: number, g: number, b: number): void; setClearcoat(cc: ClearcoatConfig): void; setAnisotropy(an: AnisotropyConfig): void; setSheen(sh: SheenConfig): void; setIridescence(ir: IridescenceConfig): void; getConfig(): Readonly; getF0(): RGB; getDiffuse(): RGB; hasClearcoat(): boolean; hasAnisotropy(): boolean; hasSheen(): boolean; hasIridescence(): boolean; /** * Evaluate the full advanced PBR BRDF at a shading point. * * @param NdotL - dot(N, L), clamped [0,1] * @param NdotV - dot(N, V), clamped [0,1] * @param NdotH - dot(N, H), clamped [0,1] * @param VdotH - dot(V, H), clamped [0,1] * @param TdotH - dot(T, H) for anisotropy (0 if not anisotropic) * @param BdotH - dot(B, H) for anisotropy (0 if not anisotropic) * @returns RGB radiance contribution (direct light, no PI factor) */ evaluate(NdotL: number, NdotV: number, NdotH: number, VdotH: number, TdotH?: number, BdotH?: number): RGB; } /** Pre-configured material presets */ export declare const MATERIAL_PRESETS: { carPaintRed: () => AdvancedPBRMaterial; brushedAluminium: () => AdvancedPBRMaterial; velvet: () => AdvancedPBRMaterial; soapBubble: () => AdvancedPBRMaterial; }; //# sourceMappingURL=AdvancedPBR.d.ts.map