@zephyr3d/scene 0.9.26 → 0.9.27

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (95) hide show
  1. package/dist/animation/animationset.js +92 -30
  2. package/dist/animation/animationset.js.map +1 -1
  3. package/dist/animation/joint_dynamics/convex_collider.js +320 -0
  4. package/dist/animation/joint_dynamics/convex_collider.js.map +1 -0
  5. package/dist/animation/skeleton.js +21 -1
  6. package/dist/animation/skeleton.js.map +1 -1
  7. package/dist/asset/model.js +6 -2
  8. package/dist/asset/model.js.map +1 -1
  9. package/dist/camera/camera.js +75 -23
  10. package/dist/camera/camera.js.map +1 -1
  11. package/dist/index.d.ts +4764 -3600
  12. package/dist/index.js +2 -1
  13. package/dist/index.js.map +1 -1
  14. package/dist/material/hairstrand.js +235 -235
  15. package/dist/material/hairstrand.js.map +1 -1
  16. package/dist/material/material.js +296 -296
  17. package/dist/material/material.js.map +1 -1
  18. package/dist/material/mixins/lit.js +33 -1
  19. package/dist/material/mixins/lit.js.map +1 -1
  20. package/dist/material/shader/helper.js +404 -3
  21. package/dist/material/shader/helper.js.map +1 -1
  22. package/dist/material/water.js +2057 -72
  23. package/dist/material/water.js.map +1 -1
  24. package/dist/posteffect/motionblur.js +663 -58
  25. package/dist/posteffect/motionblur.js.map +1 -1
  26. package/dist/posteffect/posteffect.js +12 -1
  27. package/dist/posteffect/posteffect.js.map +1 -1
  28. package/dist/posteffect/sao.js +46 -44
  29. package/dist/posteffect/sao.js.map +1 -1
  30. package/dist/posteffect/sss.js +30 -2
  31. package/dist/posteffect/sss.js.map +1 -1
  32. package/dist/render/abuffer_oit.js +37 -37
  33. package/dist/render/abuffer_oit.js.map +1 -1
  34. package/dist/render/clipmap.js +156 -5
  35. package/dist/render/clipmap.js.map +1 -1
  36. package/dist/render/cull_visitor.js +1 -0
  37. package/dist/render/cull_visitor.js.map +1 -1
  38. package/dist/render/dualdepthpeeling_oit.js +49 -49
  39. package/dist/render/dualdepthpeeling_oit.js.map +1 -1
  40. package/dist/render/fbm_wavegenerator.js +3 -3
  41. package/dist/render/fbm_wavegenerator.js.map +1 -1
  42. package/dist/render/fft_wavegenerator.js +57 -15
  43. package/dist/render/fft_wavegenerator.js.map +1 -1
  44. package/dist/render/gerstner_wavegenerator.js +127 -20
  45. package/dist/render/gerstner_wavegenerator.js.map +1 -1
  46. package/dist/render/hzb.js +80 -22
  47. package/dist/render/hzb.js.map +1 -1
  48. package/dist/render/lightpass.js +6 -3
  49. package/dist/render/lightpass.js.map +1 -1
  50. package/dist/render/oit.js +11 -11
  51. package/dist/render/oit.js.map +1 -1
  52. package/dist/render/render_queue.js +36 -0
  53. package/dist/render/render_queue.js.map +1 -1
  54. package/dist/render/renderer.js +4 -0
  55. package/dist/render/renderer.js.map +1 -1
  56. package/dist/render/rendergraph/blackboard.js +1 -0
  57. package/dist/render/rendergraph/blackboard.js.map +1 -1
  58. package/dist/render/rendergraph/forward_plus_builder.js +318 -9
  59. package/dist/render/rendergraph/forward_plus_builder.js.map +1 -1
  60. package/dist/render/rendergraph/frame_resource_requirements.js +1 -0
  61. package/dist/render/rendergraph/frame_resource_requirements.js.map +1 -1
  62. package/dist/render/rendergraph/history_resources.js +8 -1
  63. package/dist/render/rendergraph/history_resources.js.map +1 -1
  64. package/dist/render/underwater.js +624 -0
  65. package/dist/render/underwater.js.map +1 -0
  66. package/dist/render/water_caustics.js +1380 -0
  67. package/dist/render/water_caustics.js.map +1 -0
  68. package/dist/render/weightedblended_oit.js +33 -33
  69. package/dist/render/weightedblended_oit.js.map +1 -1
  70. package/dist/scene/water.js +540 -4
  71. package/dist/scene/water.js.map +1 -1
  72. package/dist/shaders/water.js +22 -19
  73. package/dist/shaders/water.js.map +1 -1
  74. package/dist/shaders/water_medium.js +56 -0
  75. package/dist/shaders/water_medium.js.map +1 -0
  76. package/dist/shadow/shadow_region.js +49 -49
  77. package/dist/shadow/shadow_region.js.map +1 -1
  78. package/dist/utility/serialization/manager.js +3 -1
  79. package/dist/utility/serialization/manager.js.map +1 -1
  80. package/dist/utility/serialization/scene/animation.js +31 -2
  81. package/dist/utility/serialization/scene/animation.js.map +1 -1
  82. package/dist/utility/serialization/scene/camera.js +53 -25
  83. package/dist/utility/serialization/scene/camera.js.map +1 -1
  84. package/dist/utility/serialization/scene/light.js.map +1 -1
  85. package/dist/utility/serialization/scene/water.js +1101 -21
  86. package/dist/utility/serialization/scene/water.js.map +1 -1
  87. package/dist/utility/shprojector.js +87 -87
  88. package/dist/utility/shprojector.js.map +1 -1
  89. package/package.json +1 -1
  90. package/dist/render/rendergraph/frame_graph_context.js +0 -41
  91. package/dist/render/rendergraph/frame_graph_context.js.map +0 -1
  92. package/dist/shaders/ssgi.js +0 -63
  93. package/dist/shaders/ssgi.js.map +0 -1
  94. package/dist/shaders/ssgi_reprojection.js +0 -118
  95. package/dist/shaders/ssgi_reprojection.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"material.js","sources":["../../src/material/material.ts"],"sourcesContent":["import type { AbstractDevice, BindGroup, GPUProgram, RenderStateSet } from '@zephyr3d/device';\nimport { ProgramBuilder } from '@zephyr3d/device';\nimport type { Primitive } from '../render/primitive';\nimport type { DrawContext } from '../render/drawable';\nimport { QUEUE_OPAQUE } from '../values';\nimport { RenderBundleWrapper } from '../render/renderbundle_wrapper';\nimport { Disposable } from '@zephyr3d/base';\nimport type { Clonable, IDisposable, Nullable } from '@zephyr3d/base';\nimport { getEngine } from '../app/api';\nimport type { OIT } from '../render';\n\ntype MaterialState = {\n program: Nullable<GPUProgram>;\n bindGroup: Nullable<BindGroup>;\n bindGroupTag: string;\n renderStateSet: RenderStateSet;\n materialTag: number;\n OIT: Nullable<OIT>;\n oitUniformTag: number;\n};\n\ntype ProgramCacheEntry = {\n program: GPUProgram;\n refCount: number;\n};\n\n/**\n * Base class for all materials.\n *\n * Responsibilities:\n * - Defines a multi-pass rendering interface (`numPasses`, `apply`, `bind`, `draw`, `drawPrimitive`).\n * - Builds and caches GPU shader programs per pass and per-render-context hash.\n * - Manages a per-material bind group (typically at index 2) for uniforms and resources.\n * - Updates render states per pass (`updateRenderStates`) and uploads uniforms (`_applyUniforms`).\n * - Tracks \"option\" changes that affect shader variant hashing and render bundles.\n *\n * Caching and hashing:\n * - `createHash(pass)` produces a stable hash representing shader variant options for a pass.\n * Override `_createHash()` in subclasses to encode feature toggles (defines, keywords, macros).\n * - The global hash used to key `MaterialState` also includes `ctx.materialFlags` and\n * `ctx.shaderVariantHash` when provided, allowing context-sensitive variants without\n * coupling shader programs to runtime texture identities.\n * - GPU programs are additionally memoized in a global static `_programCache` across materials\n * by `constructor.name` + hash, to avoid recompilation of identical variants.\n *\n * Bind groups and uniforms:\n * - If a program declares a bind group layout at index 2 (i.e., `bindGroupLayouts.length > 2`),\n * `apply()` will allocate the group and keep it in the state. Subclasses should fill it in\n * `_applyUniforms()`.\n * - `applyUniforms()` only calls `_applyUniforms()` when `needUpdate` is true, based on\n * `_optionTag` changes (see `optionChanged()`).\n *\n * Lifecycle:\n * - Constructed materials register a persistent ID into a global registry for serialization.\n * - `apply(ctx)` prepares all passes: creates/gets state, programs, bind groups, render states,\n * and uploads uniforms as needed.\n * - `bind(device, pass)` binds the program, bind group (index 2), and render states.\n * - `draw(primitive, ctx, numInstances)` runs all passes, calling `bind()` and `drawPrimitive()`.\n * - `onDispose()` releases bind groups and registry entries.\n *\n * Extending:\n * - Override `_createProgram(pb, ctx, pass)` to build a shader.\n * - Override `_applyUniforms(bindGroup, ctx, pass)` to upload uniforms and resources.\n * - Override `updateRenderStates(pass, renderStates, ctx)` to set depth, blend, cull, etc.\n * - Override `_createHash()` to encode options that affect program compilation.\n * - Override `supportLighting`, `supportInstancing`, `isTransparentPass`, `getQueueType`, etc.\n *\n * Thread-safety:\n * - Intended for main-thread use in a renderer driving WebGPU/WebGL-like devices.\n *\n * @public\n */\nexport class Material extends Disposable implements Clonable<Material>, IDisposable {\n /**\n * Monotonic instance ID counter.\n * @internal\n */\n private static _nextId = 0;\n /**\n * Global program cache keyed by global hash\n */\n private static _programCache: { [hash: string]: ProgramCacheEntry } = {};\n /**\n * Per-material state cache keyed by global hash (material + context + pass).\n * @internal\n */\n private _states: { [hash: string]: MaterialState };\n /**\n * Number of rendering passes.\n * Subclasses can increase this to implement multi-pass rendering.\n * @internal\n */\n protected _numPasses: number;\n /**\n * Per-pass hash cached results. Length scales with `numPasses`.\n * @internal\n */\n protected _hash: Nullable<string>[];\n /**\n * Incremented each time options change (via `optionChanged`), used to decide whether\n * uniforms need update on next `apply()`.\n * @internal\n */\n private _optionTag: number;\n /**\n * Unique runtime instance ID.\n * @internal\n */\n protected readonly _id: number;\n /**\n * Latest computed global hash per pass, set during `apply()`, read in `bind()`.\n * @internal\n */\n private _currentHash: string[];\n /**\n * Incremented when material states affecting render bundles change (e.g., bind group id changes\n * or `optionChanged(true)`), used to trigger re-recording of render bundles.\n * @internal\n */\n private _changeTag: number;\n /**\n * Unique program id counter for naming compiled programs.\n * @internal\n */\n private _nextProgramId = 0;\n /**\n * Create a new material instance.\n *\n * - Initializes one pass by default.\n * - Prepares per-pass hash storage and change tracking.\n * - Registers a persistent ID in the global registry.\n */\n constructor() {\n super();\n this._id = ++Material._nextId;\n this._nextProgramId = 0;\n this._states = {};\n this._numPasses = 1;\n this._hash = [null];\n this._optionTag = 0;\n this._changeTag = 0;\n this._currentHash = [];\n }\n /**\n * Create a shallow clone of this material.\n *\n * Note: The base implementation returns a base `Material`. Subclasses should\n * override to return their own type and copy custom fields.\n */\n clone() {\n const other = new Material();\n other.copyFrom(this);\n return other;\n }\n /**\n * Copy basic properties from another material.\n *\n * Disposes existing bind groups/states, copies `numPasses`. Subclasses should\n * extend this to copy their own fields and call `optionChanged(true)` if\n * shader-affecting options differ.\n *\n * @param other - Source material.\n */\n copyFrom(other: this) {\n this.clearCache();\n this._numPasses = other._numPasses;\n getEngine().resourceManager.setAssetId(this, getEngine().resourceManager.getAssetId(other.coreMaterial));\n }\n /**\n * Incremented when the material’s GPU-relevant state changes and render bundles\n * may need to be rebuilt.\n */\n get changeTag() {\n return this._changeTag;\n }\n /**\n * Runtime-unique numeric identifier for the material instance.\n */\n get instanceId() {\n return this._id;\n }\n /**\n * Number of rendering passes this material uses.\n *\n * Increasing this will expand the per-pass hash cache; make sure to implement\n * `createHash(pass)`, `_createProgram(pb, ctx, pass)`, and `updateRenderStates(pass, ...)`\n * accordingly for each pass.\n */\n get numPasses() {\n return this._numPasses;\n }\n set numPasses(val) {\n while (this._hash.length < val) {\n this._hash.push(null);\n }\n this._numPasses = val;\n }\n /**\n * Get the number of passes this material will render for the given draw context.\n *\n * Default returns `numPasses`. Subclasses may override to skip passes based on context flags.\n * @param _ctx - Draw context (device, flags, pass hash, instance data, etc.).\n * @returns Number of passes to render for this context.\n */\n protected getNumPassesForRender(_ctx: DrawContext) {\n return this._numPasses;\n }\n /**\n * Get or compute the per-pass shader hash used for program caching.\n *\n * Calls `createHash(pass)` lazily and caches the result.\n * @internal\n */\n protected getHash(pass: number) {\n if (this._hash[pass] === null) {\n this._hash[pass] = this.createHash(pass);\n }\n return this._hash[pass];\n }\n /**\n * Return the queue type to which this material belongs.\n *\n * Override this in transparent or special materials (e.g., post-process).\n */\n getQueueType(): number {\n return QUEUE_OPAQUE;\n }\n /**\n * Whether the given pass is transparent.\n *\n * Used to place draw calls into appropriate render queues and set blending states.\n */\n isTransparentPass(_pass: number): boolean {\n return false;\n }\n /**\n * Whether this material's shading is affected by scene lights.\n *\n * Override and return `false` for unlit materials.\n */\n supportLighting(): boolean {\n return true;\n }\n /**\n * Whether this material supports hardware instancing.\n *\n * Override and return `false` if per-instance data is not supported in the shader.\n */\n supportInstancing(): boolean {\n return true;\n }\n /** Returns true if this is a instance of material */\n isBatchable(): boolean {\n return false;\n }\n\n /**\n * Whether this material requires the scene color texture (e.g., for refraction).\n */\n needSceneColor(): boolean {\n return false;\n }\n /**\n * Whether this material requires the linear scene depth texture (e.g., for depth-aware effects).\n */\n needSceneDepth(): boolean {\n return false;\n }\n /**\n * Create a material instance (instance-uniform-driven variant).\n *\n * Base returns `null`. Subclasses that support instancing can return a lightweight instance.\n */\n createInstance(): this {\n throw new Error('Abstract function call');\n }\n /**\n * Returns the core material that owns GPU state.\n *\n * Instances may delegate to a shared core to reuse compiled programs and caches.\n * @public\n */\n get coreMaterial(): this {\n return this;\n }\n /**\n * Prepare the material for drawing across all passes for the given draw context.\n *\n * Steps per pass:\n * - Compute global hash (material variant + context).\n * - Retrieve or build the GPU program, cache in `_programCache`.\n * - Create per-material bind group (index 2) if the program exposes it.\n * - Update uniforms if `_optionTag` indicates changes since last apply.\n * - Update and cache render states for the pass.\n * - Detect bind group GPU ID changes to bump `changeTag` and notify `RenderBundleWrapper`.\n *\n * @param ctx - Draw context (device, flags, pass hash, instance data, etc.).\n * @returns `true` if successful; `false` if any pass lacks a valid program.\n */\n apply(ctx: DrawContext) {\n const numPasses = this.getNumPassesForRender(ctx);\n for (let pass = 0; pass < numPasses; pass++) {\n const hash = this.calcGlobalHash(ctx, pass);\n let state = this._states[hash];\n if (!state) {\n let programEntry = Material._programCache[hash];\n let program = programEntry?.program;\n if (!program) {\n program = this.createProgram(ctx, pass) ?? null;\n if (!program) {\n console.error('[Material.apply] program build failed', {\n material: this.constructor.name,\n pass,\n renderPassType: ctx.renderPass?.type ?? null,\n materialFlags: ctx.materialFlags,\n queue: ctx.queue,\n lightBlending: ctx.lightBlending,\n hasOIT: !!ctx.oit,\n hasShadowLight: !!ctx.currentShadowLight,\n renderPassHash: ctx.renderPassHash\n });\n state = {\n program: null,\n bindGroup: null,\n bindGroupTag: '',\n renderStateSet: ctx.device.createRenderStateSet(),\n materialTag: -1,\n OIT: null,\n oitUniformTag: -1\n };\n this._states[hash] = state;\n return false;\n }\n program.name = `@${this.constructor.name}_program_${this._nextProgramId++}`;\n programEntry = { program, refCount: 0 };\n Material._programCache[hash] = programEntry;\n }\n programEntry!.refCount++;\n const bindGroup =\n program.bindGroupLayouts.length > 2\n ? ctx.device.createBindGroup(program.bindGroupLayouts[2])\n : null;\n state = {\n program,\n bindGroup,\n bindGroupTag: bindGroup?.getVersion() ?? '',\n renderStateSet: ctx.device.createRenderStateSet(),\n materialTag: -1,\n OIT: null,\n oitUniformTag: -1\n };\n this._states[hash] = state;\n }\n if (!state.program) {\n return false;\n }\n if (state.bindGroup) {\n if (ctx.oit && (state.OIT !== ctx.oit || state.oitUniformTag !== ctx.oit.uniformTag)) {\n state.OIT = ctx.oit;\n state.oitUniformTag = ctx.oit.uniformTag;\n ctx.oit.applyUniforms(ctx, state.bindGroup);\n }\n this.applyUniforms(state.bindGroup, ctx, state.materialTag !== this._optionTag, pass);\n }\n state.materialTag = this._optionTag;\n this.updateRenderStates(pass, state.renderStateSet, ctx);\n this._currentHash[pass] = hash;\n if (state.bindGroup) {\n const id = state.bindGroup.getVersion();\n if (id !== state.bindGroupTag) {\n state.bindGroupTag = id;\n this._changeTag++;\n RenderBundleWrapper.materialChanged(this.coreMaterial);\n }\n }\n }\n return true;\n }\n /**\n * Bind the program, bind group, and render states for the specified pass.\n *\n * Must be called after `apply(ctx)` for the same pass.\n *\n * @param device - Rendering device.\n * @param pass - Pass index to bind.\n * @returns `true` on success; `false` if state or program missing.\n * @internal\n */\n bind(device: AbstractDevice, pass: number) {\n const hash = this._currentHash[pass];\n const state = this._states[hash];\n if (!state) {\n console.error('Material.bind() failed: state not found');\n return false;\n }\n if (!state.program) {\n return false;\n }\n device.setProgram(state.program);\n if (state.bindGroup) {\n device.setBindGroup(2, state.bindGroup);\n }\n device.setRenderStates(state.renderStateSet);\n return true;\n }\n /**\n * Compute the global hash for the given pass and draw context.\n *\n * Includes:\n * - Per-pass material hash from `getHash(pass)`.\n * - `ctx.materialFlags` for context-dependent toggles.\n * - `ctx.shaderVariantHash` for shader layout/feature variants, falling back\n * to `ctx.renderPassHash` for passes without a shader-only hash.\n * @internal\n */\n private calcGlobalHash(ctx: DrawContext, pass: number) {\n const shaderVariantHash = ctx.shaderVariantHash ?? ctx.renderPassHash;\n return `${this.getHash(pass)}:${ctx.materialFlags}:${shaderVariantHash}:${\n ctx.drawEnvLight ? 1 : 0\n }:${ctx.currentShadowLight ? 1 : 0}:${ctx.lightBlending ? 1 : 0}`;\n }\n /**\n * Draw a primitive for all passes using this material.\n *\n * Calls `bind()` then `drawPrimitive()` per pass. If `numInstances` is zero,\n * and `ctx.instanceData` exists, uses `ctx.instanceData.numInstances`.\n *\n * @param primitive - Geometry to draw.\n * @param ctx - Draw context.\n * @param numInstances - Instance count; 0 means auto-detect from context.\n * @internal\n */\n draw(primitive: Primitive, ctx: DrawContext, numInstances = 0) {\n const numPasses = this.getNumPassesForRender(ctx);\n for (let pass = 0; pass < numPasses; pass++) {\n this.bind(ctx.device, pass);\n this.drawPrimitive(pass, primitive, ctx, numInstances);\n }\n }\n /**\n * Conditionally update uniforms/resources into the material bind group.\n *\n * Delegates to `_applyUniforms()` when `needUpdate` is true (based on `_optionTag` check).\n *\n * @param bindGroup - Material bind group at index 2 (may be `null` if program has no layout).\n * @param ctx - Draw context.\n * @param needUpdate - Whether uniforms need to be refreshed.\n * @param pass - Pass index.\n */\n applyUniforms(bindGroup: BindGroup, ctx: DrawContext, needUpdate: boolean, pass: number) {\n if (needUpdate) {\n this._applyUniforms(bindGroup, ctx, pass);\n }\n }\n /**\n * Notify the material that some option changed.\n *\n * - Always increments `_optionTag`. This will trigger uniforms update on next `apply()`.\n * - If `changeHash` is true, clears per-pass hashes so programs/states will be rebuilt,\n * increments `_changeTag`, and notifies `RenderBundleWrapper` to regenerate recorded bundles.\n *\n * @param changeHash - Set true if the change affects shader compilation or render states.\n * @internal\n */\n optionChanged(changeHash: boolean) {\n this._optionTag++;\n if (changeHash) {\n for (let i = 0; i < this._numPasses; i++) {\n this._hash[i] = null;\n }\n this._changeTag++;\n RenderBundleWrapper.materialChanged(this.coreMaterial);\n }\n }\n clearCache() {\n const hashes = Object.keys(this._states);\n if (hashes.length > 0) {\n this._changeTag++;\n RenderBundleWrapper.materialChanged(this.coreMaterial);\n }\n for (const k of hashes) {\n const state = this._states[k];\n state?.bindGroup?.dispose();\n const programEntry = Material._programCache[k];\n if (state?.program && programEntry?.program === state.program) {\n programEntry.refCount--;\n if (programEntry.refCount <= 0) {\n programEntry.program.dispose();\n delete Material._programCache[k];\n }\n }\n }\n this._states = {};\n }\n /**\n * Convert a pass index to a hash seed string.\n *\n * Subclasses may override to encode per-pass role (e.g., \"depth\", \"forward\", \"shadow\").\n *\n * @param pass - Pass number.\n * @returns String used when building full hash.\n */\n passToHash(pass: number) {\n return String(pass);\n }\n /**\n * Build the material hash for a pass (excluding context-dependent parts).\n *\n * Default formula: `${constructor.name}|${pass}|${_createHash()}`\n *\n * @param pass - Pass number.\n * @returns Hash string used in program caching.\n * @internal\n */\n createHash(pass: number) {\n return `${this.constructor.name}|${this.passToHash(pass)}|${this._createHash()}`;\n }\n /**\n * Issue the actual draw call for a pass.\n *\n * Override for custom per-pass draw behavior if necessary. The default implementation:\n * - Draws instanced if `numInstances > 0`.\n * - Else uses `ctx.instanceData.numInstances` if available.\n * - Else issues a non-instanced draw.\n *\n * @param pass - Pass number.\n * @param primitive - Primitive to draw.\n * @param ctx - Draw context.\n * @param numInstances - Explicit instance count (0 = auto).\n */\n drawPrimitive(pass: number, primitive: Primitive, ctx: DrawContext, numInstances: number) {\n if (numInstances > 0) {\n primitive.drawInstanced(numInstances);\n } else if (ctx.instanceData) {\n primitive.drawInstanced(ctx.instanceData.numInstances);\n } else {\n primitive.draw();\n }\n }\n /**\n * Dispose the material and release GPU-side resource references.\n *\n * - Unregisters from the global registry.\n * - Disposes the per-material bind groups kept in `_states`.\n */\n protected onDispose() {\n super.onDispose();\n this.clearCache();\n }\n /**\n * Build the GPU program for a pass.\n *\n * Default creates a `ProgramBuilder` and calls `_createProgram(pb, ctx, pass)`.\n * Subclasses should override `_createProgram` instead of this method unless\n * they need to replace builder instantiation.\n *\n * @param ctx - Draw context.\n * @param pass - Pass number.\n * @returns The compiled `GPUProgram`, or `null` on failure.\n * @internal\n */\n protected createProgram(ctx: DrawContext, pass: number) {\n const pb = new ProgramBuilder(ctx.device);\n return this._createProgram(pb, ctx, pass);\n }\n /**\n * Create and compile the shader program for this material/pass.\n *\n * Implement in subclasses:\n * - Define shader stages, entry points, macros/defines, and resource layouts.\n * - Return a compiled `GPUProgram`.\n *\n * @param pb - Program builder.\n * @param ctx - Draw context.\n * @param _pass - Pass number.\n * @returns The created program, or `null` on failure.\n */\n protected _createProgram(_pb: ProgramBuilder, _ctx: DrawContext, _pass: number): GPUProgram {\n throw new Error('Abstract function call');\n }\n /**\n * Upload uniforms and bind resources to the per-material bind group (index 2).\n *\n * Implement in subclasses to:\n * - Write uniform buffers/textures/samplers to the `bindGroup`.\n * - Respect the current `pass` and `ctx`.\n *\n * @param _bindGroup - The bind group to populate.\n * @param _ctx - Draw context.\n * @param _pass - Pass number.\n */\n protected _applyUniforms(_bindGroup: BindGroup, _ctx: DrawContext, _pass: number) {}\n /**\n * Update render states (depth/stencil, blending, rasterization) for the pass.\n *\n * Implement in subclasses based on transparency, double-sidedness, depth writes/tests,\n * color mask, stencil ops, etc., and any context flags in `ctx`.\n *\n * @param _pass - Current pass index.\n * @param _renderStates - Render state set to mutate.\n * @param _ctx - Draw context.\n */\n protected updateRenderStates(_pass: number, _renderStates: RenderStateSet, _ctx: DrawContext) {}\n /**\n * Compute the material-specific portion of the shader hash for the current options.\n *\n * Subclasses should override to include macro/define sets that influence program compilation.\n * Example return: `\"USE_NORMALMAP=1;ALPHA_MODE=BLEND;RECEIVE_SHADOWS=1\"`.\n *\n * @returns Hash fragment string (no context/pass info).\n */\n protected _createHash() {\n return '';\n }\n /**\n * Whether this is a lightweight instance of a core material.\n *\n * Instances typically share GPU programs with a core and only override instance uniforms.\n * @internal\n */\n get $isInstance(): boolean {\n return false;\n }\n /**\n * Instance-uniform buffer for material instances, if supported.\n *\n * Returned as a typed Float32 view over a backing ArrayBuffer.\n * @internal\n */\n get $instanceUniforms(): Float32Array<ArrayBuffer> {\n throw new Error('Abstract function call');\n }\n}\n"],"names":["Material","Disposable","_nextId","_programCache","_nextProgramId","_id","_states","_numPasses","_hash","_optionTag","_changeTag","_currentHash","clone","other","copyFrom","clearCache","getEngine","resourceManager","setAssetId","getAssetId","coreMaterial","changeTag","instanceId","numPasses","val","length","push","getNumPassesForRender","_ctx","getHash","pass","createHash","getQueueType","QUEUE_OPAQUE","isTransparentPass","_pass","supportLighting","supportInstancing","isBatchable","needSceneColor","needSceneDepth","createInstance","Error","apply","ctx","hash","calcGlobalHash","state","programEntry","program","createProgram","console","error","material","name","renderPassType","renderPass","type","materialFlags","queue","lightBlending","hasOIT","oit","hasShadowLight","currentShadowLight","renderPassHash","bindGroup","bindGroupTag","renderStateSet","device","createRenderStateSet","materialTag","OIT","oitUniformTag","refCount","bindGroupLayouts","createBindGroup","getVersion","uniformTag","applyUniforms","updateRenderStates","id","RenderBundleWrapper","materialChanged","bind","setProgram","setBindGroup","setRenderStates","shaderVariantHash","drawEnvLight","draw","primitive","numInstances","drawPrimitive","needUpdate","_applyUniforms","optionChanged","changeHash","i","hashes","Object","keys","k","dispose","passToHash","String","_createHash","drawInstanced","instanceData","onDispose","pb","ProgramBuilder","_createProgram","_pb","_bindGroup","_renderStates","$isInstance","$instanceUniforms"],"mappings":"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"}
1
+ {"version":3,"file":"material.js","sources":["../../src/material/material.ts"],"sourcesContent":["import type { AbstractDevice, BindGroup, GPUProgram, RenderStateSet } from '@zephyr3d/device';\r\nimport { ProgramBuilder } from '@zephyr3d/device';\r\nimport type { Primitive } from '../render/primitive';\r\nimport type { DrawContext } from '../render/drawable';\r\nimport { QUEUE_OPAQUE } from '../values';\r\nimport { RenderBundleWrapper } from '../render/renderbundle_wrapper';\r\nimport { Disposable } from '@zephyr3d/base';\r\nimport type { Clonable, IDisposable, Nullable } from '@zephyr3d/base';\r\nimport { getEngine } from '../app/api';\r\nimport type { OIT } from '../render';\r\n\r\ntype MaterialState = {\r\n program: Nullable<GPUProgram>;\r\n bindGroup: Nullable<BindGroup>;\r\n bindGroupTag: string;\r\n renderStateSet: RenderStateSet;\r\n materialTag: number;\r\n OIT: Nullable<OIT>;\r\n oitUniformTag: number;\r\n};\r\n\r\ntype ProgramCacheEntry = {\r\n program: GPUProgram;\r\n refCount: number;\r\n};\r\n\r\n/**\r\n * Base class for all materials.\r\n *\r\n * Responsibilities:\r\n * - Defines a multi-pass rendering interface (`numPasses`, `apply`, `bind`, `draw`, `drawPrimitive`).\r\n * - Builds and caches GPU shader programs per pass and per-render-context hash.\r\n * - Manages a per-material bind group (typically at index 2) for uniforms and resources.\r\n * - Updates render states per pass (`updateRenderStates`) and uploads uniforms (`_applyUniforms`).\r\n * - Tracks \"option\" changes that affect shader variant hashing and render bundles.\r\n *\r\n * Caching and hashing:\r\n * - `createHash(pass)` produces a stable hash representing shader variant options for a pass.\r\n * Override `_createHash()` in subclasses to encode feature toggles (defines, keywords, macros).\r\n * - The global hash used to key `MaterialState` also includes `ctx.materialFlags` and\r\n * `ctx.shaderVariantHash` when provided, allowing context-sensitive variants without\r\n * coupling shader programs to runtime texture identities.\r\n * - GPU programs are additionally memoized in a global static `_programCache` across materials\r\n * by `constructor.name` + hash, to avoid recompilation of identical variants.\r\n *\r\n * Bind groups and uniforms:\r\n * - If a program declares a bind group layout at index 2 (i.e., `bindGroupLayouts.length > 2`),\r\n * `apply()` will allocate the group and keep it in the state. Subclasses should fill it in\r\n * `_applyUniforms()`.\r\n * - `applyUniforms()` only calls `_applyUniforms()` when `needUpdate` is true, based on\r\n * `_optionTag` changes (see `optionChanged()`).\r\n *\r\n * Lifecycle:\r\n * - Constructed materials register a persistent ID into a global registry for serialization.\r\n * - `apply(ctx)` prepares all passes: creates/gets state, programs, bind groups, render states,\r\n * and uploads uniforms as needed.\r\n * - `bind(device, pass)` binds the program, bind group (index 2), and render states.\r\n * - `draw(primitive, ctx, numInstances)` runs all passes, calling `bind()` and `drawPrimitive()`.\r\n * - `onDispose()` releases bind groups and registry entries.\r\n *\r\n * Extending:\r\n * - Override `_createProgram(pb, ctx, pass)` to build a shader.\r\n * - Override `_applyUniforms(bindGroup, ctx, pass)` to upload uniforms and resources.\r\n * - Override `updateRenderStates(pass, renderStates, ctx)` to set depth, blend, cull, etc.\r\n * - Override `_createHash()` to encode options that affect program compilation.\r\n * - Override `supportLighting`, `supportInstancing`, `isTransparentPass`, `getQueueType`, etc.\r\n *\r\n * Thread-safety:\r\n * - Intended for main-thread use in a renderer driving WebGPU/WebGL-like devices.\r\n *\r\n * @public\r\n */\r\nexport class Material extends Disposable implements Clonable<Material>, IDisposable {\r\n /**\r\n * Monotonic instance ID counter.\r\n * @internal\r\n */\r\n private static _nextId = 0;\r\n /**\r\n * Global program cache keyed by global hash\r\n */\r\n private static _programCache: { [hash: string]: ProgramCacheEntry } = {};\r\n /**\r\n * Per-material state cache keyed by global hash (material + context + pass).\r\n * @internal\r\n */\r\n private _states: { [hash: string]: MaterialState };\r\n /**\r\n * Number of rendering passes.\r\n * Subclasses can increase this to implement multi-pass rendering.\r\n * @internal\r\n */\r\n protected _numPasses: number;\r\n /**\r\n * Per-pass hash cached results. Length scales with `numPasses`.\r\n * @internal\r\n */\r\n protected _hash: Nullable<string>[];\r\n /**\r\n * Incremented each time options change (via `optionChanged`), used to decide whether\r\n * uniforms need update on next `apply()`.\r\n * @internal\r\n */\r\n private _optionTag: number;\r\n /**\r\n * Unique runtime instance ID.\r\n * @internal\r\n */\r\n protected readonly _id: number;\r\n /**\r\n * Latest computed global hash per pass, set during `apply()`, read in `bind()`.\r\n * @internal\r\n */\r\n private _currentHash: string[];\r\n /**\r\n * Incremented when material states affecting render bundles change (e.g., bind group id changes\r\n * or `optionChanged(true)`), used to trigger re-recording of render bundles.\r\n * @internal\r\n */\r\n private _changeTag: number;\r\n /**\r\n * Unique program id counter for naming compiled programs.\r\n * @internal\r\n */\r\n private _nextProgramId = 0;\r\n /**\r\n * Create a new material instance.\r\n *\r\n * - Initializes one pass by default.\r\n * - Prepares per-pass hash storage and change tracking.\r\n * - Registers a persistent ID in the global registry.\r\n */\r\n constructor() {\r\n super();\r\n this._id = ++Material._nextId;\r\n this._nextProgramId = 0;\r\n this._states = {};\r\n this._numPasses = 1;\r\n this._hash = [null];\r\n this._optionTag = 0;\r\n this._changeTag = 0;\r\n this._currentHash = [];\r\n }\r\n /**\r\n * Create a shallow clone of this material.\r\n *\r\n * Note: The base implementation returns a base `Material`. Subclasses should\r\n * override to return their own type and copy custom fields.\r\n */\r\n clone() {\r\n const other = new Material();\r\n other.copyFrom(this);\r\n return other;\r\n }\r\n /**\r\n * Copy basic properties from another material.\r\n *\r\n * Disposes existing bind groups/states, copies `numPasses`. Subclasses should\r\n * extend this to copy their own fields and call `optionChanged(true)` if\r\n * shader-affecting options differ.\r\n *\r\n * @param other - Source material.\r\n */\r\n copyFrom(other: this) {\r\n this.clearCache();\r\n this._numPasses = other._numPasses;\r\n getEngine().resourceManager.setAssetId(this, getEngine().resourceManager.getAssetId(other.coreMaterial));\r\n }\r\n /**\r\n * Incremented when the material’s GPU-relevant state changes and render bundles\r\n * may need to be rebuilt.\r\n */\r\n get changeTag() {\r\n return this._changeTag;\r\n }\r\n /**\r\n * Runtime-unique numeric identifier for the material instance.\r\n */\r\n get instanceId() {\r\n return this._id;\r\n }\r\n /**\r\n * Number of rendering passes this material uses.\r\n *\r\n * Increasing this will expand the per-pass hash cache; make sure to implement\r\n * `createHash(pass)`, `_createProgram(pb, ctx, pass)`, and `updateRenderStates(pass, ...)`\r\n * accordingly for each pass.\r\n */\r\n get numPasses() {\r\n return this._numPasses;\r\n }\r\n set numPasses(val) {\r\n while (this._hash.length < val) {\r\n this._hash.push(null);\r\n }\r\n this._numPasses = val;\r\n }\r\n /**\r\n * Get the number of passes this material will render for the given draw context.\r\n *\r\n * Default returns `numPasses`. Subclasses may override to skip passes based on context flags.\r\n * @param _ctx - Draw context (device, flags, pass hash, instance data, etc.).\r\n * @returns Number of passes to render for this context.\r\n */\r\n protected getNumPassesForRender(_ctx: DrawContext) {\r\n return this._numPasses;\r\n }\r\n /**\r\n * Get or compute the per-pass shader hash used for program caching.\r\n *\r\n * Calls `createHash(pass)` lazily and caches the result.\r\n * @internal\r\n */\r\n protected getHash(pass: number) {\r\n if (this._hash[pass] === null) {\r\n this._hash[pass] = this.createHash(pass);\r\n }\r\n return this._hash[pass];\r\n }\r\n /**\r\n * Return the queue type to which this material belongs.\r\n *\r\n * Override this in transparent or special materials (e.g., post-process).\r\n */\r\n getQueueType(): number {\r\n return QUEUE_OPAQUE;\r\n }\r\n /**\r\n * Whether the given pass is transparent.\r\n *\r\n * Used to place draw calls into appropriate render queues and set blending states.\r\n */\r\n isTransparentPass(_pass: number): boolean {\r\n return false;\r\n }\r\n /**\r\n * Whether this material's shading is affected by scene lights.\r\n *\r\n * Override and return `false` for unlit materials.\r\n */\r\n supportLighting(): boolean {\r\n return true;\r\n }\r\n /**\r\n * Whether this material supports hardware instancing.\r\n *\r\n * Override and return `false` if per-instance data is not supported in the shader.\r\n */\r\n supportInstancing(): boolean {\r\n return true;\r\n }\r\n /** Returns true if this is a instance of material */\r\n isBatchable(): boolean {\r\n return false;\r\n }\r\n\r\n /**\r\n * Whether this material requires the scene color texture (e.g., for refraction).\r\n */\r\n needSceneColor(): boolean {\r\n return false;\r\n }\r\n /**\r\n * Whether this material requires the linear scene depth texture (e.g., for depth-aware effects).\r\n */\r\n needSceneDepth(): boolean {\r\n return false;\r\n }\r\n /**\r\n * Create a material instance (instance-uniform-driven variant).\r\n *\r\n * Base returns `null`. Subclasses that support instancing can return a lightweight instance.\r\n */\r\n createInstance(): this {\r\n throw new Error('Abstract function call');\r\n }\r\n /**\r\n * Returns the core material that owns GPU state.\r\n *\r\n * Instances may delegate to a shared core to reuse compiled programs and caches.\r\n * @public\r\n */\r\n get coreMaterial(): this {\r\n return this;\r\n }\r\n /**\r\n * Prepare the material for drawing across all passes for the given draw context.\r\n *\r\n * Steps per pass:\r\n * - Compute global hash (material variant + context).\r\n * - Retrieve or build the GPU program, cache in `_programCache`.\r\n * - Create per-material bind group (index 2) if the program exposes it.\r\n * - Update uniforms if `_optionTag` indicates changes since last apply.\r\n * - Update and cache render states for the pass.\r\n * - Detect bind group GPU ID changes to bump `changeTag` and notify `RenderBundleWrapper`.\r\n *\r\n * @param ctx - Draw context (device, flags, pass hash, instance data, etc.).\r\n * @returns `true` if successful; `false` if any pass lacks a valid program.\r\n */\r\n apply(ctx: DrawContext) {\r\n const numPasses = this.getNumPassesForRender(ctx);\r\n for (let pass = 0; pass < numPasses; pass++) {\r\n const hash = this.calcGlobalHash(ctx, pass);\r\n let state = this._states[hash];\r\n if (!state) {\r\n let programEntry = Material._programCache[hash];\r\n let program = programEntry?.program;\r\n if (!program) {\r\n program = this.createProgram(ctx, pass) ?? null;\r\n if (!program) {\r\n console.error('[Material.apply] program build failed', {\r\n material: this.constructor.name,\r\n pass,\r\n renderPassType: ctx.renderPass?.type ?? null,\r\n materialFlags: ctx.materialFlags,\r\n queue: ctx.queue,\r\n lightBlending: ctx.lightBlending,\r\n hasOIT: !!ctx.oit,\r\n hasShadowLight: !!ctx.currentShadowLight,\r\n renderPassHash: ctx.renderPassHash\r\n });\r\n state = {\r\n program: null,\r\n bindGroup: null,\r\n bindGroupTag: '',\r\n renderStateSet: ctx.device.createRenderStateSet(),\r\n materialTag: -1,\r\n OIT: null,\r\n oitUniformTag: -1\r\n };\r\n this._states[hash] = state;\r\n return false;\r\n }\r\n program.name = `@${this.constructor.name}_program_${this._nextProgramId++}`;\r\n programEntry = { program, refCount: 0 };\r\n Material._programCache[hash] = programEntry;\r\n }\r\n programEntry!.refCount++;\r\n const bindGroup =\r\n program.bindGroupLayouts.length > 2\r\n ? ctx.device.createBindGroup(program.bindGroupLayouts[2])\r\n : null;\r\n state = {\r\n program,\r\n bindGroup,\r\n bindGroupTag: bindGroup?.getVersion() ?? '',\r\n renderStateSet: ctx.device.createRenderStateSet(),\r\n materialTag: -1,\r\n OIT: null,\r\n oitUniformTag: -1\r\n };\r\n this._states[hash] = state;\r\n }\r\n if (!state.program) {\r\n return false;\r\n }\r\n if (state.bindGroup) {\r\n if (ctx.oit && (state.OIT !== ctx.oit || state.oitUniformTag !== ctx.oit.uniformTag)) {\r\n state.OIT = ctx.oit;\r\n state.oitUniformTag = ctx.oit.uniformTag;\r\n ctx.oit.applyUniforms(ctx, state.bindGroup);\r\n }\r\n this.applyUniforms(state.bindGroup, ctx, state.materialTag !== this._optionTag, pass);\r\n }\r\n state.materialTag = this._optionTag;\r\n this.updateRenderStates(pass, state.renderStateSet, ctx);\r\n this._currentHash[pass] = hash;\r\n if (state.bindGroup) {\r\n const id = state.bindGroup.getVersion();\r\n if (id !== state.bindGroupTag) {\r\n state.bindGroupTag = id;\r\n this._changeTag++;\r\n RenderBundleWrapper.materialChanged(this.coreMaterial);\r\n }\r\n }\r\n }\r\n return true;\r\n }\r\n /**\r\n * Bind the program, bind group, and render states for the specified pass.\r\n *\r\n * Must be called after `apply(ctx)` for the same pass.\r\n *\r\n * @param device - Rendering device.\r\n * @param pass - Pass index to bind.\r\n * @returns `true` on success; `false` if state or program missing.\r\n * @internal\r\n */\r\n bind(device: AbstractDevice, pass: number) {\r\n const hash = this._currentHash[pass];\r\n const state = this._states[hash];\r\n if (!state) {\r\n console.error('Material.bind() failed: state not found');\r\n return false;\r\n }\r\n if (!state.program) {\r\n return false;\r\n }\r\n device.setProgram(state.program);\r\n if (state.bindGroup) {\r\n device.setBindGroup(2, state.bindGroup);\r\n }\r\n device.setRenderStates(state.renderStateSet);\r\n return true;\r\n }\r\n /**\r\n * Compute the global hash for the given pass and draw context.\r\n *\r\n * Includes:\r\n * - Per-pass material hash from `getHash(pass)`.\r\n * - `ctx.materialFlags` for context-dependent toggles.\r\n * - `ctx.shaderVariantHash` for shader layout/feature variants, falling back\r\n * to `ctx.renderPassHash` for passes without a shader-only hash.\r\n * @internal\r\n */\r\n private calcGlobalHash(ctx: DrawContext, pass: number) {\r\n const shaderVariantHash = ctx.shaderVariantHash ?? ctx.renderPassHash;\r\n return `${this.getHash(pass)}:${ctx.materialFlags}:${shaderVariantHash}:${\r\n ctx.drawEnvLight ? 1 : 0\r\n }:${ctx.currentShadowLight ? 1 : 0}:${ctx.lightBlending ? 1 : 0}`;\r\n }\r\n /**\r\n * Draw a primitive for all passes using this material.\r\n *\r\n * Calls `bind()` then `drawPrimitive()` per pass. If `numInstances` is zero,\r\n * and `ctx.instanceData` exists, uses `ctx.instanceData.numInstances`.\r\n *\r\n * @param primitive - Geometry to draw.\r\n * @param ctx - Draw context.\r\n * @param numInstances - Instance count; 0 means auto-detect from context.\r\n * @internal\r\n */\r\n draw(primitive: Primitive, ctx: DrawContext, numInstances = 0) {\r\n const numPasses = this.getNumPassesForRender(ctx);\r\n for (let pass = 0; pass < numPasses; pass++) {\r\n this.bind(ctx.device, pass);\r\n this.drawPrimitive(pass, primitive, ctx, numInstances);\r\n }\r\n }\r\n /**\r\n * Conditionally update uniforms/resources into the material bind group.\r\n *\r\n * Delegates to `_applyUniforms()` when `needUpdate` is true (based on `_optionTag` check).\r\n *\r\n * @param bindGroup - Material bind group at index 2 (may be `null` if program has no layout).\r\n * @param ctx - Draw context.\r\n * @param needUpdate - Whether uniforms need to be refreshed.\r\n * @param pass - Pass index.\r\n */\r\n applyUniforms(bindGroup: BindGroup, ctx: DrawContext, needUpdate: boolean, pass: number) {\r\n if (needUpdate) {\r\n this._applyUniforms(bindGroup, ctx, pass);\r\n }\r\n }\r\n /**\r\n * Notify the material that some option changed.\r\n *\r\n * - Always increments `_optionTag`. This will trigger uniforms update on next `apply()`.\r\n * - If `changeHash` is true, clears per-pass hashes so programs/states will be rebuilt,\r\n * increments `_changeTag`, and notifies `RenderBundleWrapper` to regenerate recorded bundles.\r\n *\r\n * @param changeHash - Set true if the change affects shader compilation or render states.\r\n * @internal\r\n */\r\n optionChanged(changeHash: boolean) {\r\n this._optionTag++;\r\n if (changeHash) {\r\n for (let i = 0; i < this._numPasses; i++) {\r\n this._hash[i] = null;\r\n }\r\n this._changeTag++;\r\n RenderBundleWrapper.materialChanged(this.coreMaterial);\r\n }\r\n }\r\n clearCache() {\r\n const hashes = Object.keys(this._states);\r\n if (hashes.length > 0) {\r\n this._changeTag++;\r\n RenderBundleWrapper.materialChanged(this.coreMaterial);\r\n }\r\n for (const k of hashes) {\r\n const state = this._states[k];\r\n state?.bindGroup?.dispose();\r\n const programEntry = Material._programCache[k];\r\n if (state?.program && programEntry?.program === state.program) {\r\n programEntry.refCount--;\r\n if (programEntry.refCount <= 0) {\r\n programEntry.program.dispose();\r\n delete Material._programCache[k];\r\n }\r\n }\r\n }\r\n this._states = {};\r\n }\r\n /**\r\n * Convert a pass index to a hash seed string.\r\n *\r\n * Subclasses may override to encode per-pass role (e.g., \"depth\", \"forward\", \"shadow\").\r\n *\r\n * @param pass - Pass number.\r\n * @returns String used when building full hash.\r\n */\r\n passToHash(pass: number) {\r\n return String(pass);\r\n }\r\n /**\r\n * Build the material hash for a pass (excluding context-dependent parts).\r\n *\r\n * Default formula: `${constructor.name}|${pass}|${_createHash()}`\r\n *\r\n * @param pass - Pass number.\r\n * @returns Hash string used in program caching.\r\n * @internal\r\n */\r\n createHash(pass: number) {\r\n return `${this.constructor.name}|${this.passToHash(pass)}|${this._createHash()}`;\r\n }\r\n /**\r\n * Issue the actual draw call for a pass.\r\n *\r\n * Override for custom per-pass draw behavior if necessary. The default implementation:\r\n * - Draws instanced if `numInstances > 0`.\r\n * - Else uses `ctx.instanceData.numInstances` if available.\r\n * - Else issues a non-instanced draw.\r\n *\r\n * @param pass - Pass number.\r\n * @param primitive - Primitive to draw.\r\n * @param ctx - Draw context.\r\n * @param numInstances - Explicit instance count (0 = auto).\r\n */\r\n drawPrimitive(pass: number, primitive: Primitive, ctx: DrawContext, numInstances: number) {\r\n if (numInstances > 0) {\r\n primitive.drawInstanced(numInstances);\r\n } else if (ctx.instanceData) {\r\n primitive.drawInstanced(ctx.instanceData.numInstances);\r\n } else {\r\n primitive.draw();\r\n }\r\n }\r\n /**\r\n * Dispose the material and release GPU-side resource references.\r\n *\r\n * - Unregisters from the global registry.\r\n * - Disposes the per-material bind groups kept in `_states`.\r\n */\r\n protected onDispose() {\r\n super.onDispose();\r\n this.clearCache();\r\n }\r\n /**\r\n * Build the GPU program for a pass.\r\n *\r\n * Default creates a `ProgramBuilder` and calls `_createProgram(pb, ctx, pass)`.\r\n * Subclasses should override `_createProgram` instead of this method unless\r\n * they need to replace builder instantiation.\r\n *\r\n * @param ctx - Draw context.\r\n * @param pass - Pass number.\r\n * @returns The compiled `GPUProgram`, or `null` on failure.\r\n * @internal\r\n */\r\n protected createProgram(ctx: DrawContext, pass: number) {\r\n const pb = new ProgramBuilder(ctx.device);\r\n return this._createProgram(pb, ctx, pass);\r\n }\r\n /**\r\n * Create and compile the shader program for this material/pass.\r\n *\r\n * Implement in subclasses:\r\n * - Define shader stages, entry points, macros/defines, and resource layouts.\r\n * - Return a compiled `GPUProgram`.\r\n *\r\n * @param pb - Program builder.\r\n * @param ctx - Draw context.\r\n * @param _pass - Pass number.\r\n * @returns The created program, or `null` on failure.\r\n */\r\n protected _createProgram(_pb: ProgramBuilder, _ctx: DrawContext, _pass: number): GPUProgram {\r\n throw new Error('Abstract function call');\r\n }\r\n /**\r\n * Upload uniforms and bind resources to the per-material bind group (index 2).\r\n *\r\n * Implement in subclasses to:\r\n * - Write uniform buffers/textures/samplers to the `bindGroup`.\r\n * - Respect the current `pass` and `ctx`.\r\n *\r\n * @param _bindGroup - The bind group to populate.\r\n * @param _ctx - Draw context.\r\n * @param _pass - Pass number.\r\n */\r\n protected _applyUniforms(_bindGroup: BindGroup, _ctx: DrawContext, _pass: number) {}\r\n /**\r\n * Update render states (depth/stencil, blending, rasterization) for the pass.\r\n *\r\n * Implement in subclasses based on transparency, double-sidedness, depth writes/tests,\r\n * color mask, stencil ops, etc., and any context flags in `ctx`.\r\n *\r\n * @param _pass - Current pass index.\r\n * @param _renderStates - Render state set to mutate.\r\n * @param _ctx - Draw context.\r\n */\r\n protected updateRenderStates(_pass: number, _renderStates: RenderStateSet, _ctx: DrawContext) {}\r\n /**\r\n * Compute the material-specific portion of the shader hash for the current options.\r\n *\r\n * Subclasses should override to include macro/define sets that influence program compilation.\r\n * Example return: `\"USE_NORMALMAP=1;ALPHA_MODE=BLEND;RECEIVE_SHADOWS=1\"`.\r\n *\r\n * @returns Hash fragment string (no context/pass info).\r\n */\r\n protected _createHash() {\r\n return '';\r\n }\r\n /**\r\n * Whether this is a lightweight instance of a core material.\r\n *\r\n * Instances typically share GPU programs with a core and only override instance uniforms.\r\n * @internal\r\n */\r\n get $isInstance(): boolean {\r\n return false;\r\n }\r\n /**\r\n * Instance-uniform buffer for material instances, if supported.\r\n *\r\n * Returned as a typed Float32 view over a backing ArrayBuffer.\r\n * @internal\r\n */\r\n get $instanceUniforms(): Float32Array<ArrayBuffer> {\r\n throw new Error('Abstract function call');\r\n }\r\n}\r\n"],"names":["Material","Disposable","_nextId","_programCache","_nextProgramId","_id","_states","_numPasses","_hash","_optionTag","_changeTag","_currentHash","clone","other","copyFrom","clearCache","getEngine","resourceManager","setAssetId","getAssetId","coreMaterial","changeTag","instanceId","numPasses","val","length","push","getNumPassesForRender","_ctx","getHash","pass","createHash","getQueueType","QUEUE_OPAQUE","isTransparentPass","_pass","supportLighting","supportInstancing","isBatchable","needSceneColor","needSceneDepth","createInstance","Error","apply","ctx","hash","calcGlobalHash","state","programEntry","program","createProgram","console","error","material","name","renderPassType","renderPass","type","materialFlags","queue","lightBlending","hasOIT","oit","hasShadowLight","currentShadowLight","renderPassHash","bindGroup","bindGroupTag","renderStateSet","device","createRenderStateSet","materialTag","OIT","oitUniformTag","refCount","bindGroupLayouts","createBindGroup","getVersion","uniformTag","applyUniforms","updateRenderStates","id","RenderBundleWrapper","materialChanged","bind","setProgram","setBindGroup","setRenderStates","shaderVariantHash","drawEnvLight","draw","primitive","numInstances","drawPrimitive","needUpdate","_applyUniforms","optionChanged","changeHash","i","hashes","Object","keys","k","dispose","passToHash","String","_createHash","drawInstanced","instanceData","onDispose","pb","ProgramBuilder","_createProgram","_pb","_bindGroup","_renderStates","$isInstance","$instanceUniforms"],"mappings":"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"}
@@ -375,6 +375,29 @@ import { ShaderHelper } from '../shader/helper.js';
375
375
  }
376
376
  return ShaderHelper.calculateShadow(scope, worldPos, worldNormal, NoL, this.drawContext);
377
377
  }
378
+ /**
379
+ * Whether this material's fragments are lit through water and so pick up the
380
+ * water caustics.
381
+ *
382
+ * True for ordinary surfaces, which may sit under a water body. A water
383
+ * surface itself must override this to false: the caustic lookup decides
384
+ * whether a fragment is submerged by comparing its own height against the
385
+ * displaced surface height on its *sun ray*, and those are two different
386
+ * points on the water unless the sun is exactly overhead. Under a tilted sun
387
+ * every water fragment has some other part of the surface upstream of it, so
388
+ * a fragment in a trough is read as being under the crest up-sun of it and
389
+ * gets the caustic pattern - whose peaks are well above 1 - painted onto the
390
+ * water as bright blotches that swim with the waves.
391
+ *
392
+ * Only the sampling is gated, not the uniform declarations: the caustic
393
+ * uniforms live in the pass-wide global bind group, whose layout is built
394
+ * once per {@link DrawContext.renderPassHash} and shared by every material
395
+ * drawn in that pass, so it cannot vary per material.
396
+ *
397
+ * @returns True when the water caustics modulate this material's lighting.
398
+ */ receivesWaterCaustics() {
399
+ return true;
400
+ }
378
401
  getClusterIndex(scope, fragCoord) {
379
402
  const pb = scope.$builder;
380
403
  const funcName = 'lm_getClusterIndex';
@@ -447,7 +470,16 @@ import { ShaderHelper } from '../shader/helper.js';
447
470
  }
448
471
  calculateLightAttenuation(scope, type, worldPos, posRange, dirCutoff, extra) {
449
472
  const pb = scope.$builder;
450
- return scope.$choice(pb.equal(type, LIGHT_TYPE_DIRECTIONAL), pb.float(1), scope.$choice(pb.equal(type, LIGHT_TYPE_POINT), this.calculatePointLightAttenuation(scope, worldPos.xyz, posRange), scope.$choice(pb.equal(type, LIGHT_TYPE_RECT), this.calculatePointLightAttenuation(scope, worldPos.xyz, posRange), this.calculateSpotLightAttenuation(scope, worldPos.xyz, posRange, dirCutoff, extra?.xy))));
473
+ const attenuation = scope.$choice(pb.equal(type, LIGHT_TYPE_DIRECTIONAL), pb.float(1), scope.$choice(pb.equal(type, LIGHT_TYPE_POINT), this.calculatePointLightAttenuation(scope, worldPos.xyz, posRange), scope.$choice(pb.equal(type, LIGHT_TYPE_RECT), this.calculatePointLightAttenuation(scope, worldPos.xyz, posRange), this.calculateSpotLightAttenuation(scope, worldPos.xyz, posRange, dirCutoff, extra?.xy))));
474
+ // Water caustics ride here rather than on calculateShadow(): every light
475
+ // model already folds this value into its light colour and nothing else
476
+ // reads it, so a vec3 return applies the caustic tint everywhere without
477
+ // touching a single call site. It also covers both lighting paths, which
478
+ // matters because a shadow-casting sun goes through the clustered path
479
+ // when the screen-space shadow mask is on and through a per-light additive
480
+ // pass when it is off.
481
+ const caustic = this.receivesWaterCaustics() ? ShaderHelper.calculateWaterCaustic(scope, worldPos.xyz, type, dirCutoff.xyz, this.drawContext) : null;
482
+ return caustic ? pb.mul(caustic, attenuation) : attenuation;
451
483
  }
452
484
  calculateLightDirection(scope, type, worldPos, posRange, dirCutoff) {
453
485
  const pb = scope.$builder;
@@ -1 +1 @@
1
- {"version":3,"file":"lit.js","sources":["../../../src/material/mixins/lit.ts"],"sourcesContent":["import type { BindGroup, PBFunctionScope, PBInsideFunctionScope, PBShaderExp } from '@zephyr3d/device';\r\nimport {\r\n LIGHT_TYPE_DIRECTIONAL,\r\n LIGHT_TYPE_POINT,\r\n LIGHT_TYPE_RECT,\r\n // LIGHT_TYPE_SPOT,\r\n RENDER_PASS_TYPE_LIGHT\r\n} from '../../values';\r\nimport type { DrawContext } from '../../render';\r\nimport type { MeshMaterial } from '../meshmaterial';\r\nimport { applyMaterialMixins } from '../meshmaterial';\r\nimport type { TextureMixinInstanceTypes } from './texture';\r\nimport { mixinTextureProps } from './texture';\r\nimport type { IMixinAlbedoColor } from './albedocolor';\r\nimport { mixinAlbedoColor } from './albedocolor';\r\nimport { ShaderHelper } from '../shader/helper';\r\n\r\n/**\r\n * Interface for light mixin\r\n * @public\r\n */\r\nexport type IMixinLight = {\r\n normalScale: number;\r\n normalFlipY: boolean;\r\n normalMapMode: 'tangent-space' | 'object-space';\r\n doubleSidedLighting: boolean;\r\n needCalculateEnvLight(): boolean;\r\n getUniformNormalScale(scope: PBInsideFunctionScope): PBShaderExp;\r\n getEnvLightIrradiance(scope: PBInsideFunctionScope, normal: PBShaderExp): PBShaderExp;\r\n getEnvLightRadiance(\r\n scope: PBInsideFunctionScope,\r\n reflectVec: PBShaderExp,\r\n roughness: PBShaderExp\r\n ): PBShaderExp;\r\n calculateViewVector(scope: PBInsideFunctionScope, worldPos: PBShaderExp): PBShaderExp;\r\n calculateReflectionVector(\r\n scope: PBInsideFunctionScope,\r\n normal: PBShaderExp,\r\n viewVec: PBShaderExp\r\n ): PBShaderExp;\r\n calculateTBN(\r\n scope: PBInsideFunctionScope,\r\n worldPos: PBShaderExp,\r\n worldNormal?: PBShaderExp,\r\n worldTangent?: PBShaderExp,\r\n worldBinormal?: PBShaderExp\r\n ): PBShaderExp;\r\n calculateNormal(\r\n scope: PBInsideFunctionScope,\r\n worldPos: PBShaderExp,\r\n worldNormal?: PBShaderExp,\r\n worldTangent?: PBShaderExp,\r\n worldBinormal?: PBShaderExp\r\n ): PBShaderExp;\r\n calculateNormalAndTBN(\r\n scope: PBInsideFunctionScope,\r\n worldPos: PBShaderExp,\r\n worldNormal?: PBShaderExp,\r\n worldTangent?: PBShaderExp,\r\n worldBinormal?: PBShaderExp\r\n ): PBShaderExp;\r\n calculateLightAttenuation(\r\n scope: PBInsideFunctionScope,\r\n type: PBShaderExp,\r\n worldPos: PBShaderExp,\r\n posRange: PBShaderExp,\r\n dirCutoff: PBShaderExp,\r\n extra?: PBShaderExp\r\n ): PBShaderExp;\r\n calculateLightDirection(\r\n scope: PBInsideFunctionScope,\r\n type: PBShaderExp,\r\n worldPos: PBShaderExp,\r\n posRange: PBShaderExp,\r\n dirCutoff: PBShaderExp\r\n ): PBShaderExp;\r\n calculateShadow(\r\n scope: PBInsideFunctionScope,\r\n worldPos: PBShaderExp,\r\n worldNormal: PBShaderExp,\r\n NoL: PBShaderExp\r\n ): PBShaderExp;\r\n forEachLight(\r\n scope: PBInsideFunctionScope,\r\n callback: (\r\n this: PBInsideFunctionScope,\r\n type: PBShaderExp,\r\n posRange: PBShaderExp,\r\n dirCutoff: PBShaderExp,\r\n colorIntensity: PBShaderExp,\r\n extra: PBShaderExp,\r\n shadow: boolean\r\n ) => void\r\n ): void;\r\n} & TextureMixinInstanceTypes<['normal']> &\r\n IMixinAlbedoColor;\r\n\r\n/**\r\n * Light mixin\r\n * @param BaseCls - class to mix in\r\n * @returns Mixed class\r\n * @public\r\n */\r\nexport function mixinLight<T extends typeof MeshMaterial>(BaseCls: T) {\r\n if ((BaseCls as any).lightMixed) {\r\n return BaseCls as T & { new (...args: any[]): IMixinLight };\r\n }\r\n const S = applyMaterialMixins(BaseCls, mixinAlbedoColor, mixinTextureProps('normal'));\r\n let FEATURE_DOUBLE_SIDED_LIGHTING = 0;\r\n let FEATURE_OBJECT_SPACE_NORMALMAP = 0;\r\n const cls = class extends S {\r\n static readonly lightMixed = true;\r\n private _normalScale: number;\r\n private _normalFlipY: boolean;\r\n constructor() {\r\n super();\r\n this._normalScale = 1;\r\n this._normalFlipY = false;\r\n this.useFeature(FEATURE_DOUBLE_SIDED_LIGHTING, true);\r\n }\r\n copyFrom(other: this) {\r\n super.copyFrom(other);\r\n this.normalScale = other.normalScale;\r\n this.normalFlipY = other.normalFlipY;\r\n this.normalMapMode = other.normalMapMode;\r\n this.doubleSidedLighting = other.doubleSidedLighting;\r\n }\r\n get normalScale() {\r\n return this._normalScale;\r\n }\r\n set normalScale(val) {\r\n if (val !== this._normalScale) {\r\n this._normalScale = val;\r\n this.uniformChanged();\r\n }\r\n }\r\n get normalFlipY() {\r\n return this._normalFlipY;\r\n }\r\n set normalFlipY(val) {\r\n const flip = !!val;\r\n if (flip !== this._normalFlipY) {\r\n this._normalFlipY = flip;\r\n this.uniformChanged();\r\n }\r\n }\r\n get normalMapMode() {\r\n return this.featureUsed<'tangent-space' | 'object-space'>(FEATURE_OBJECT_SPACE_NORMALMAP);\r\n }\r\n set normalMapMode(val) {\r\n this.useFeature(FEATURE_OBJECT_SPACE_NORMALMAP, val);\r\n }\r\n /** true if double sided lighting is used */\r\n get doubleSidedLighting() {\r\n return this.featureUsed<boolean>(FEATURE_DOUBLE_SIDED_LIGHTING);\r\n }\r\n set doubleSidedLighting(val) {\r\n this.useFeature(FEATURE_DOUBLE_SIDED_LIGHTING, !!val);\r\n }\r\n /**\r\n * Calculates the normalized vector from world coordinates to the viewpoint.\r\n *\r\n * @param scope - Shader scope\r\n *\r\n * @returns The view vector\r\n */\r\n calculateViewVector(scope: PBInsideFunctionScope, worldPos: PBShaderExp) {\r\n const pb = scope.$builder;\r\n return pb.normalize(pb.sub(ShaderHelper.getCameraPosition(scope), worldPos.xyz));\r\n }\r\n /**\r\n * Calculate the reflection vector of the view vector with respect to the normal.\r\n *\r\n * @param scope - Shader scope\r\n * @param normal - Surface normal\r\n * @param viewVec - The view vector\r\n * @returns The reflection vector\r\n */\r\n calculateReflectionVector(scope: PBInsideFunctionScope, normal: PBShaderExp, viewVec: PBShaderExp) {\r\n const pb = scope.$builder;\r\n return pb.reflect(pb.neg(viewVec), normal);\r\n }\r\n /**\r\n * Calculate the normal vector for current fragment\r\n * @param scope - The shader scope\r\n * @returns Normal vector for current fragment\r\n */\r\n calculateNormal(\r\n scope: PBInsideFunctionScope,\r\n worldPos: PBShaderExp,\r\n worldNormal?: PBShaderExp,\r\n worldTangent?: PBShaderExp,\r\n worldBinormal?: PBShaderExp\r\n ) {\r\n const pb = scope.$builder;\r\n const that = this;\r\n const args: PBShaderExp[] = [worldPos];\r\n const params: PBShaderExp[] = [pb.vec3('worldPos')];\r\n let funcName = 'Z_calculateNormal';\r\n if (worldNormal) {\r\n params.push(pb.vec3('worldNormal'));\r\n args.push(worldNormal);\r\n funcName += '_N';\r\n if (worldTangent && worldBinormal) {\r\n params.push(pb.vec3('worldTangent'), pb.vec3('worldBinormal'));\r\n args.push(worldTangent, worldBinormal);\r\n funcName += '_T';\r\n }\r\n }\r\n pb.func(funcName, params, function () {\r\n this.$l.uv = that.hasNormalTexture()\r\n ? (that.getNormalTexCoord(this) ?? pb.vec2(0))\r\n : that.hasAlbedoTexture()\r\n ? (that.getAlbedoTexCoord(this) ?? pb.vec2(0))\r\n : pb.vec2(0);\r\n this.$l.TBN = that.calculateTBN(\r\n this,\r\n this.worldPos,\r\n this.worldNormal,\r\n this.worldTangent,\r\n this.worldBinormal\r\n );\r\n if (that.drawContext.renderPass!.type === RENDER_PASS_TYPE_LIGHT && that.hasNormalTexture()) {\r\n if (that.normalMapMode === 'object-space') {\r\n const pixel = pb.sub(\r\n pb.mul(pb.textureSample(that.getNormalTextureUniform(this), this.uv).rgb, 2),\r\n pb.vec3(1)\r\n );\r\n const normalTex = pb.mul(\r\n pixel,\r\n pb.vec3(this.zNormalScale, pb.mul(this.zNormalScale, this.zNormalYSign), 1)\r\n );\r\n this.$return(pb.normalize(normalTex));\r\n } else {\r\n const pixel = pb.sub(\r\n pb.mul(pb.textureSample(that.getNormalTextureUniform(this), this.uv).rgb, 2),\r\n pb.vec3(1)\r\n );\r\n const normalTex = pb.mul(\r\n pixel,\r\n pb.vec3(this.zNormalScale, pb.mul(this.zNormalScale, this.zNormalYSign), 1)\r\n );\r\n this.$return(pb.normalize(pb.mul(this.TBN, normalTex)));\r\n }\r\n } else {\r\n this.$return(this.TBN[2]);\r\n }\r\n });\r\n return pb.getGlobalScope()[funcName](...args) as PBShaderExp;\r\n }\r\n /**\r\n * Normal scale uniform\r\n * @return Normal scale uniform\r\n */\r\n getUniformNormalScale(scope: PBInsideFunctionScope) {\r\n return scope.zNormalScale as PBShaderExp;\r\n }\r\n /**\r\n * Calculate the normal vector for current fragment\r\n *\r\n * @param scope - The shader scope\r\n * @returns Structure that contains normal vector and TBN matrix\r\n */\r\n calculateNormalAndTBN(\r\n scope: PBInsideFunctionScope,\r\n worldPos: PBShaderExp,\r\n worldNormal?: PBShaderExp,\r\n worldTangent?: PBShaderExp,\r\n worldBinormal?: PBShaderExp\r\n ) {\r\n const pb = scope.$builder;\r\n const NormalStruct = pb.defineStruct([pb.mat3('TBN'), pb.vec3('normal')]);\r\n const that = this;\r\n const args: PBShaderExp[] = [worldPos.xyz];\r\n const params: PBShaderExp[] = [pb.vec3('worldPos')];\r\n let funcName = 'Z_calculateNormalAndTBN';\r\n if (worldNormal) {\r\n params.push(pb.vec3('worldNormal'));\r\n args.push(worldNormal);\r\n funcName += '_N';\r\n if (worldTangent && worldBinormal) {\r\n params.push(pb.vec3('worldTangent'), pb.vec3('worldBinormal'));\r\n args.push(worldTangent, worldBinormal);\r\n funcName += '_T';\r\n }\r\n }\r\n pb.func(funcName, params, function () {\r\n this.$l.uv = that.hasNormalTexture()\r\n ? (that.getNormalTexCoord(this) ?? pb.vec2(0))\r\n : that.hasAlbedoTexture()\r\n ? (that.getAlbedoTexCoord(this) ?? pb.vec2(0))\r\n : pb.vec2(0);\r\n this.$l.TBN = that.calculateTBN(\r\n this,\r\n this.worldPos,\r\n this.worldNormal,\r\n this.worldTangent,\r\n this.worldBinormal\r\n );\r\n if (that.drawContext.renderPass!.type === RENDER_PASS_TYPE_LIGHT && that.hasNormalTexture()) {\r\n if (that.normalMapMode === 'object-space') {\r\n const pixel = pb.sub(\r\n pb.mul(pb.textureSample(that.getNormalTextureUniform(this), this.uv).rgb, 2),\r\n pb.vec3(1)\r\n );\r\n const normalTex = pb.mul(\r\n pixel,\r\n pb.vec3(this.zNormalScale, pb.mul(this.zNormalScale, this.zNormalYSign), 1)\r\n );\r\n this.$return(NormalStruct(this.TBN, pb.normalize(normalTex)));\r\n } else {\r\n const pixel = pb.sub(\r\n pb.mul(pb.textureSample(that.getNormalTextureUniform(this), this.uv).rgb, 2),\r\n pb.vec3(1)\r\n );\r\n const normalTex = pb.mul(\r\n pixel,\r\n pb.vec3(this.zNormalScale, pb.mul(this.zNormalScale, this.zNormalYSign), 1)\r\n );\r\n this.$return(NormalStruct(this.TBN, pb.normalize(pb.mul(this.TBN, normalTex))));\r\n }\r\n } else {\r\n this.$return(NormalStruct(this.TBN, this.TBN[2]));\r\n }\r\n });\r\n return pb.getGlobalScope()[funcName](...args) as PBShaderExp;\r\n }\r\n /**\r\n * Calculate the TBN matrix\r\n *\r\n * @param scope - The shader scope\r\n * @returns TBN matrix\r\n */\r\n calculateTBN(\r\n scope: PBInsideFunctionScope,\r\n worldPos: PBShaderExp,\r\n worldNormal?: PBShaderExp,\r\n worldTangent?: PBShaderExp,\r\n worldBinormal?: PBShaderExp\r\n ) {\r\n const pb = scope.$builder;\r\n const that = this;\r\n const args: PBShaderExp[] = [worldPos.xyz];\r\n const params: PBShaderExp[] = [pb.vec3('worldPos')];\r\n let funcName = 'Z_calculateTBN';\r\n if (worldNormal) {\r\n params.push(pb.vec3('worldNormal'));\r\n args.push(worldNormal);\r\n funcName += '_N';\r\n if (worldTangent && worldBinormal) {\r\n params.push(pb.vec3('worldTangent'), pb.vec3('worldBinormal'));\r\n args.push(worldTangent, worldBinormal);\r\n funcName += '_T';\r\n }\r\n }\r\n pb.func(funcName, params, function () {\r\n const posW = this.worldPos;\r\n this.$l.uv = that.hasNormalTexture()\r\n ? (that.getNormalTexCoord(this) ?? pb.vec2(0))\r\n : that.hasAlbedoTexture()\r\n ? (that.getAlbedoTexCoord(this) ?? pb.vec2(0))\r\n : pb.vec2(0);\r\n this.$l.TBN = pb.mat3();\r\n if (!worldNormal) {\r\n this.$l.uv_dx = pb.dpdx(pb.vec3(this.uv, 0));\r\n this.$l.uv_dy = pb.dpdy(pb.vec3(this.uv, 0));\r\n this.$if(\r\n pb.lessThanEqual(pb.add(pb.length(this.uv_dx), pb.length(this.uv_dy)), 0.000001),\r\n function () {\r\n this.uv_dx = pb.vec3(1, 0, 0);\r\n this.uv_dy = pb.vec3(0, 1, 0);\r\n }\r\n );\r\n // t is normalized below, so any positive scale on t_ is irrelevant.\r\n // Multiplying by sign(det) instead of dividing by det yields the same\r\n // direction while staying finite when the screen space UV jacobian\r\n // degenerates (silhouettes, folds, collapsed UV shells), where the\r\n // division used to produce Inf and then NaN through the subtraction.\r\n this.$l.det = pb.sub(pb.mul(this.uv_dx.x, this.uv_dy.y), pb.mul(this.uv_dx.y, this.uv_dy.x));\r\n this.$l.t_ = pb.mul(\r\n pb.sub(pb.mul(pb.dpdx(posW), this.uv_dy.y), pb.mul(pb.dpdy(posW), this.uv_dx.y)),\r\n pb.sign(this.det)\r\n );\r\n this.$l.ng = pb.normalize(pb.cross(pb.dpdx(posW), pb.dpdy(posW)));\r\n // Normalize before the gram-schmidt step so the degeneracy test below\r\n // is scale independent: the rejection length is then sin(angle) of t_\r\n // against the normal.\r\n this.$l.tn = pb.div(this.t_, pb.max(pb.length(this.t_), 1e-20));\r\n this.$l.tRaw = pb.sub(this.tn, pb.mul(this.ng, pb.dot(this.ng, this.tn)));\r\n this.$l.tAxis = pb.vec3(1, 0, 0);\r\n this.$if(pb.greaterThan(pb.abs(this.ng.x), 0.9), function () {\r\n this.tAxis = pb.vec3(0, 1, 0);\r\n });\r\n this.$if(pb.lessThan(pb.dot(this.tRaw, this.tRaw), 1e-8), function () {\r\n // t_ vanished or is parallel to the normal: no tangent can be\r\n // recovered from the derivatives, so pick an arbitrary orthogonal\r\n // one. The normal map detail is misoriented on those few pixels,\r\n // but the frame stays finite instead of turning the fragment black.\r\n this.tRaw = pb.sub(this.tAxis, pb.mul(this.ng, pb.dot(this.ng, this.tAxis)));\r\n });\r\n this.$l.t = pb.normalize(this.tRaw);\r\n this.$l.b = pb.cross(this.ng, this.t);\r\n if (that.doubleSidedLighting && that.cullMode !== 'back') {\r\n this.$if(pb.not(this.$builtins.frontFacing), function () {\r\n this.t = pb.mul(this.t, -1);\r\n this.b = pb.mul(this.b, -1);\r\n this.ng = pb.mul(this.ng, -1);\r\n });\r\n }\r\n this.TBN = pb.mat3(this.t, this.b, this.ng);\r\n } else if (!worldTangent) {\r\n this.$l.uv_dx = pb.dpdx(pb.vec3(this.uv, 0));\r\n this.$l.uv_dy = pb.dpdy(pb.vec3(this.uv, 0));\r\n this.$if(\r\n pb.lessThanEqual(pb.add(pb.length(this.uv_dx), pb.length(this.uv_dy)), 0.000001),\r\n function () {\r\n this.uv_dx = pb.vec3(1, 0, 0);\r\n this.uv_dy = pb.vec3(0, 1, 0);\r\n }\r\n );\r\n // See the comment in the branch above: sign(det) replaces the\r\n // unguarded division that produced NaN tangents on degenerate screen\r\n // space UV jacobians.\r\n this.$l.det = pb.sub(pb.mul(this.uv_dx.x, this.uv_dy.y), pb.mul(this.uv_dx.y, this.uv_dy.x));\r\n this.$l.t_ = pb.mul(\r\n pb.sub(pb.mul(pb.dpdx(posW), this.uv_dy.y), pb.mul(pb.dpdy(posW), this.uv_dx.y)),\r\n pb.sign(this.det)\r\n );\r\n this.$l.ng = pb.normalize(this.worldNormal);\r\n this.$l.tn = pb.div(this.t_, pb.max(pb.length(this.t_), 1e-20));\r\n this.$l.tRaw = pb.sub(this.tn, pb.mul(this.ng, pb.dot(this.ng, this.tn)));\r\n this.$l.tAxis = pb.vec3(1, 0, 0);\r\n this.$if(pb.greaterThan(pb.abs(this.ng.x), 0.9), function () {\r\n this.tAxis = pb.vec3(0, 1, 0);\r\n });\r\n this.$if(pb.lessThan(pb.dot(this.tRaw, this.tRaw), 1e-8), function () {\r\n this.tRaw = pb.sub(this.tAxis, pb.mul(this.ng, pb.dot(this.ng, this.tAxis)));\r\n });\r\n this.$l.t = pb.normalize(this.tRaw);\r\n this.$l.b = pb.cross(this.ng, this.t);\r\n if (that.doubleSidedLighting && that.cullMode !== 'back') {\r\n this.$if(pb.not(this.$builtins.frontFacing), function () {\r\n this.t = pb.mul(this.t, -1);\r\n this.b = pb.mul(this.b, -1);\r\n this.ng = pb.mul(this.ng, -1);\r\n });\r\n }\r\n this.TBN = pb.mat3(this.t, this.b, this.ng);\r\n } else {\r\n this.$l.ng = pb.normalize(this.worldNormal);\r\n this.$l.t = pb.normalize(this.worldTangent);\r\n this.$l.b = pb.normalize(this.worldBinormal);\r\n if (that.doubleSidedLighting && that.cullMode !== 'back') {\r\n this.$if(pb.not(this.$builtins.frontFacing), function () {\r\n this.t = pb.mul(this.t, -1);\r\n this.b = pb.mul(this.b, -1);\r\n this.ng = pb.mul(this.ng, -1);\r\n });\r\n }\r\n this.TBN = pb.mat3(this.t, this.b, this.ng);\r\n }\r\n this.$return(this.TBN);\r\n });\r\n return pb.getGlobalScope()[funcName](...args) as PBShaderExp;\r\n }\r\n /**\r\n * {@inheritDoc MeshMaterial.applyUniformsValues}\r\n * @override\r\n */\r\n applyUniformValues(bindGroup: BindGroup, ctx: DrawContext, pass: number) {\r\n super.applyUniformValues(bindGroup, ctx, pass);\r\n if (ctx.renderPass!.type === RENDER_PASS_TYPE_LIGHT) {\r\n if (this.hasNormalTexture()) {\r\n bindGroup.setValue('zNormalScale', this._normalScale);\r\n bindGroup.setValue('zNormalYSign', this._normalFlipY ? -1 : 1);\r\n }\r\n }\r\n }\r\n /**\r\n * Check if the environment lighting should be calculated.\r\n *\r\n * @returns true Environment lighting should be calculated, otherwise false\r\n */\r\n needCalculateEnvLight() {\r\n return this.drawContext.renderPass!.type === RENDER_PASS_TYPE_LIGHT && this.drawContext.drawEnvLight;\r\n }\r\n /**\r\n * Get irradiance of current environment light\r\n *\r\n * @param scope - Shader scope\r\n * @param normal - Fragment normal vector\r\n *\r\n * @returns Irradiance of current environment light of type vec3\r\n */\r\n getEnvLightIrradiance(scope: PBInsideFunctionScope, normal: PBShaderExp) {\r\n if (!this.needCalculateEnvLight()) {\r\n console.warn('getEnvLightIrradiance(): No need to calculate environment lighting');\r\n return scope.$builder.vec3(0);\r\n }\r\n return this.drawContext.env!.light.envLight.hasIrradiance()\r\n ? ((this.drawContext.SSGI &&\r\n this.drawContext.SSGIIrradianceHistoryTexture &&\r\n this.drawContext.SSGISurfaceHistoryTexture &&\r\n (this.drawContext.device.type === 'webgl' || this.drawContext.motionVectorTexture)\r\n ? this.drawContext.env!.light.envLight.getIrradiance(scope, normal, this.drawContext).rgb\r\n : scope.$builder.mul(\r\n this.drawContext.env!.light.envLight.getIrradiance(scope, normal, this.drawContext).rgb,\r\n ShaderHelper.getEnvLightStrength(scope)\r\n )) as PBShaderExp)\r\n : scope.$builder.vec3(0);\r\n }\r\n /**\r\n * Get Radiance of current environment light\r\n *\r\n * @param scope - Shader scope\r\n * @param reflectVec - The reflection vector\r\n * @param roughness - Roughness value of current fragment\r\n *\r\n * @returns Radiance of current environment light of type vec3\r\n */\r\n getEnvLightRadiance(scope: PBInsideFunctionScope, reflectVec: PBShaderExp, roughness: PBShaderExp) {\r\n if (!this.needCalculateEnvLight()) {\r\n console.warn('getEnvLightRadiance(): No need to calculate environment lighting');\r\n return scope.$builder.vec3(0);\r\n }\r\n return this.drawContext.env!.light.envLight.hasRadiance()\r\n ? (scope.$builder.mul(\r\n this.drawContext.env!.light.envLight.getRadiance(scope, reflectVec, roughness)!.rgb,\r\n ShaderHelper.getEnvLightStrength(scope),\r\n ShaderHelper.getEnvLightSpecularStrength(scope)\r\n ) as PBShaderExp)\r\n : scope.$builder.vec3(0);\r\n }\r\n /**\r\n * Checks if shadow should be computed\r\n *\r\n * @returns true if shadow should be computed, other wise false\r\n */\r\n protected needCalculateShadow() {\r\n return (\r\n this.drawContext.renderPass!.type === RENDER_PASS_TYPE_LIGHT && !!this.drawContext.currentShadowLight\r\n );\r\n }\r\n /**\r\n * Calculates shadow of current fragment\r\n *\r\n * @param scope - Shader scope\r\n * @param worldPos - World space position of current fragment\r\n * @param worldNormal - World space normal of current fragment, used for normal\r\n * offset bias. Pass the interpolated vertex normal rather than the normal\r\n * mapped shading normal: a normal map would push the shadow lookup along\r\n * high frequency directions and reintroduce the noise the offset removes.\r\n * @param NoL - NdotL vector\r\n * @returns Shadow of current fragment, 1 means no shadow and 0 means full shadowed.\r\n */\r\n calculateShadow(\r\n scope: PBInsideFunctionScope,\r\n worldPos: PBShaderExp,\r\n worldNormal: PBShaderExp,\r\n NoL: PBShaderExp\r\n ) {\r\n const pb = scope.$builder;\r\n if (!this.needCalculateShadow()) {\r\n console.warn('calculateShadow(): No need to calculate shadow');\r\n return pb.float(1);\r\n }\r\n return ShaderHelper.calculateShadow(scope, worldPos, worldNormal, NoL, this.drawContext);\r\n }\r\n private getClusterIndex(scope: PBInsideFunctionScope, fragCoord: PBShaderExp) {\r\n const pb = scope.$builder;\r\n const funcName = 'lm_getClusterIndex';\r\n pb.func(funcName, [pb.vec3('fragCoord')], function () {\r\n const clusterParams = ShaderHelper.getClusterParams(this);\r\n const countParams = ShaderHelper.getCountParams(this);\r\n this.$l.zTile = pb.int(\r\n pb.max(\r\n pb.add(\r\n pb.mul(pb.log2(ShaderHelper.nonLinearDepthToLinear(this, this.fragCoord.z)), clusterParams.z),\r\n clusterParams.w\r\n ),\r\n 0\r\n )\r\n );\r\n this.$l.f = pb.vec2(this.fragCoord.x, pb.sub(clusterParams.y, pb.add(this.fragCoord.y, 1)));\r\n this.$l.xyTile = pb.ivec2(pb.div(this.f, pb.div(clusterParams.xy, pb.vec2(countParams.xy))));\r\n this.$return(pb.ivec3(this.xyTile, this.zTile));\r\n });\r\n return pb.getGlobalScope()[funcName](fragCoord);\r\n }\r\n protected calculatePointLightAttenuation(\r\n scope: PBInsideFunctionScope,\r\n worldPos: PBShaderExp,\r\n posRange: PBShaderExp\r\n ) {\r\n const pb = scope.$builder;\r\n const funcName = 'Z_calculatePointLightAttenuation';\r\n pb.func(funcName, [pb.vec3('worldPos'), pb.vec4('posRange')], function () {\r\n this.$l.d = pb.sub(this.worldPos, this.posRange.xyz);\r\n this.$l.dist2 = pb.dot(this.d, this.d);\r\n this.$l.lightAtten = pb.div(1, pb.max(this.dist2, 0.0001));\r\n this.$l.range2 = pb.mul(this.posRange.w, this.posRange.w);\r\n this.$l.f = pb.div(this.dist2, pb.max(this.range2, 0.0001));\r\n this.$l.f2 = pb.clamp(pb.sub(1, pb.mul(this.f, this.f)), 0, 1);\r\n this.$return(pb.mul(this.lightAtten, pb.mul(this.f2, this.f2)));\r\n });\r\n return pb.getGlobalScope()[funcName](worldPos, posRange);\r\n }\r\n protected calculateSpotLightAttenuation(\r\n scope: PBInsideFunctionScope,\r\n worldPos: PBShaderExp,\r\n posRange: PBShaderExp,\r\n dirCutoff: PBShaderExp,\r\n angleScaleOffset?: PBShaderExp\r\n ) {\r\n const pb = scope.$builder;\r\n const physical = this.drawContext.scene.lightingMode === 'physical';\r\n // The two modes emit different falloff and cone-attenuation bodies, so they must not share a\r\n // cached function under one name.\r\n const funcName = physical\r\n ? 'Z_calculateSpotLightAttenuationPhysical'\r\n : 'Z_calculateSpotLightAttenuation';\r\n pb.func(\r\n funcName,\r\n [pb.vec3('worldPos'), pb.vec4('posRange'), pb.vec4('dirCutoff'), pb.vec2('angleScaleOffset')],\r\n function () {\r\n this.$l.dist = pb.distance(this.posRange.xyz, this.worldPos);\r\n if (physical) {\r\n this.$l.dist2 = pb.mul(this.dist, this.dist);\r\n this.$l.lightAtten = pb.div(1, pb.max(this.dist2, 0.0001));\r\n this.$l.range2 = pb.mul(this.posRange.w, this.posRange.w);\r\n this.$l.f = pb.div(this.dist2, pb.max(this.range2, 0.0001));\r\n this.$l.f2 = pb.clamp(pb.sub(1, pb.mul(this.f, this.f)), 0, 1);\r\n this.$l.falloff = pb.mul(this.lightAtten, this.f2, this.f2);\r\n } else {\r\n this.$l.falloff = pb.max(0, pb.sub(1, pb.div(this.dist, this.posRange.w)));\r\n this.falloff = pb.mul(this.falloff, this.falloff);\r\n }\r\n this.$l.cd = pb.dot(pb.normalize(pb.sub(this.worldPos, this.posRange.xyz)), this.dirCutoff.xyz);\r\n if (physical) {\r\n // Filament's getAngleAttenuation: saturate(cd * scale + offset) squared. The scale/offset\r\n // pair is derived CPU-side from the cone half-angles and already guards inner == outer.\r\n this.$l.spotFactor = pb.clamp(\r\n pb.add(pb.mul(this.cd, this.angleScaleOffset.x), this.angleScaleOffset.y),\r\n 0,\r\n 1\r\n );\r\n this.spotFactor = pb.mul(this.spotFactor, this.spotFactor);\r\n } else {\r\n this.$l.spotFactor = pb.smoothStep(this.dirCutoff.w, pb.mix(this.dirCutoff.w, 1, 0.5), this.cd);\r\n }\r\n this.$return(pb.mul(this.spotFactor, this.falloff));\r\n }\r\n );\r\n const resolvedScaleOffset = physical && angleScaleOffset ? angleScaleOffset : pb.vec2(0);\r\n return pb.getGlobalScope()[funcName](worldPos, posRange, dirCutoff, resolvedScaleOffset);\r\n }\r\n calculateLightAttenuation(\r\n scope: PBInsideFunctionScope,\r\n type: PBShaderExp,\r\n worldPos: PBShaderExp,\r\n posRange: PBShaderExp,\r\n dirCutoff: PBShaderExp,\r\n extra?: PBShaderExp\r\n ) {\r\n const pb = scope.$builder;\r\n return scope.$choice(\r\n pb.equal(type, LIGHT_TYPE_DIRECTIONAL),\r\n pb.float(1),\r\n scope.$choice(\r\n pb.equal(type, LIGHT_TYPE_POINT),\r\n this.calculatePointLightAttenuation(scope, worldPos.xyz, posRange),\r\n scope.$choice(\r\n pb.equal(type, LIGHT_TYPE_RECT),\r\n this.calculatePointLightAttenuation(scope, worldPos.xyz, posRange),\r\n this.calculateSpotLightAttenuation(scope, worldPos.xyz, posRange, dirCutoff, extra?.xy)\r\n )\r\n )\r\n );\r\n }\r\n calculateLightDirection(\r\n scope: PBInsideFunctionScope,\r\n type: PBShaderExp,\r\n worldPos: PBShaderExp,\r\n posRange: PBShaderExp,\r\n dirCutoff: PBShaderExp\r\n ) {\r\n const pb = scope.$builder;\r\n return scope.$choice(\r\n pb.equal(type, LIGHT_TYPE_DIRECTIONAL),\r\n pb.neg(dirCutoff.xyz),\r\n pb.normalize(pb.sub(posRange.xyz, worldPos.xyz))\r\n );\r\n }\r\n forEachLight(\r\n scope: PBInsideFunctionScope,\r\n callback: (\r\n this: PBInsideFunctionScope,\r\n type: PBShaderExp,\r\n posRange: PBShaderExp,\r\n dirCutoff: PBShaderExp,\r\n colorIntensity: PBShaderExp,\r\n extra: PBShaderExp,\r\n shadow: boolean\r\n ) => void\r\n ) {\r\n const pb = scope.$builder;\r\n const that = this;\r\n if (that.drawContext.renderPass!.type !== RENDER_PASS_TYPE_LIGHT) {\r\n console.warn('LitMaterial.forEachLight(): must be called in forward render pass');\r\n return;\r\n }\r\n if (that.drawContext.currentShadowLight) {\r\n const posRange = scope.light.positionAndRange;\r\n const dirCutoff = scope.light.directionAndCutoff;\r\n const colorIntensity = scope.light.diffuseAndIntensity;\r\n const extra = scope.light.extraParams ?? pb.vec4(0);\r\n scope.$scope(function () {\r\n const lightType = pb.int(extra.w);\r\n callback.call(this, lightType, posRange, dirCutoff, colorIntensity, extra, true);\r\n });\r\n } else {\r\n scope.$scope(function () {\r\n const countParams = ShaderHelper.getCountParams(this);\r\n this.$l.cluster = that.getClusterIndex(this, this.$builtins.fragCoord.xyz);\r\n this.$l.clusterIndex = pb.add(\r\n this.cluster.x,\r\n pb.mul(this.cluster.y, countParams.x),\r\n pb.mul(this.cluster.z, countParams.x, countParams.y)\r\n );\r\n this.$l.texSize = scope.light.lightIndexTexSize;\r\n if (pb.getDevice().type === 'webgl') {\r\n this.$l.texCoordX = pb.div(\r\n pb.add(pb.mod(pb.float(this.clusterIndex), pb.float(this.texSize.x)), 0.5),\r\n pb.float(this.texSize.x)\r\n );\r\n this.$l.texCoordY = pb.div(\r\n pb.add(pb.float(pb.div(this.clusterIndex, this.texSize.x)), 0.5),\r\n pb.float(this.texSize.y)\r\n );\r\n this.$l.samp = pb.textureSample(\r\n ShaderHelper.getClusteredLightIndexTexture(this),\r\n pb.vec2(this.texCoordX, this.texCoordY)\r\n );\r\n } else {\r\n this.$l.texCoordX = pb.mod(this.clusterIndex, this.texSize.x);\r\n this.$l.texCoordY = pb.div(this.clusterIndex, this.texSize.x);\r\n this.$l.samp = pb.textureLoad(\r\n ShaderHelper.getClusteredLightIndexTexture(this),\r\n pb.ivec2(this.texCoordX, this.texCoordY),\r\n 0\r\n );\r\n }\r\n if (pb.getDevice().type === 'webgl') {\r\n this.$for(pb.int('i'), 0, 4, function () {\r\n this.$l.k = this.samp.at(this.i);\r\n this.$l.lights = pb.int[2]();\r\n this.$l.lights[0] = pb.int(pb.mod(this.k, 256));\r\n this.$l.lights[1] = pb.int(pb.div(this.k, 256));\r\n this.$for(pb.int('k'), 0, 2, function () {\r\n this.$l.li = this.lights.at(this.k);\r\n this.$if(pb.greaterThan(this.li, 0), function () {\r\n this.$for(pb.int('j'), 1, 256, function () {\r\n this.$if(pb.equal(this.j, this.li), function () {\r\n this.$l.positionRange = ShaderHelper.getLightPositionAndRange(this, this.j);\r\n this.$l.directionCutoff = ShaderHelper.getLightDirectionAndCutoff(this, this.j);\r\n this.$l.diffuseIntensity = ShaderHelper.getLightColorAndIntensity(this, this.j);\r\n this.$l.extra = ShaderHelper.getLightExtra(this, this.j);\r\n if (that.drawContext.screenSpaceShadowMask) {\r\n this.$l.shadowMask = ShaderHelper.sampleShadowMask(this, this.j);\r\n this.diffuseIntensity = pb.vec4(\r\n pb.mul(this.diffuseIntensity.rgb, this.shadowMask),\r\n this.diffuseIntensity.w\r\n );\r\n }\r\n this.$l.lightType = pb.int(this.extra.w);\r\n this.$scope(function () {\r\n callback.call(\r\n this,\r\n this.lightType,\r\n this.positionRange,\r\n this.directionCutoff,\r\n this.diffuseIntensity,\r\n this.extra,\r\n false\r\n );\r\n });\r\n this.$break();\r\n });\r\n });\r\n });\r\n });\r\n });\r\n } else {\r\n this.$for(pb.uint('i'), 0, 4, function () {\r\n this.$for(pb.uint('k'), 0, 4, function () {\r\n this.$l.c = pb.compAnd(pb.sar(this.samp.at(this.i), pb.mul(this.k, 8)), 0xff);\r\n this.$if(pb.greaterThan(this.c, 0), function () {\r\n this.$l.positionRange = ShaderHelper.getLightPositionAndRange(this, this.c);\r\n this.$l.directionCutoff = ShaderHelper.getLightDirectionAndCutoff(this, this.c);\r\n this.$l.diffuseIntensity = ShaderHelper.getLightColorAndIntensity(this, this.c);\r\n this.$l.extra = ShaderHelper.getLightExtra(this, this.c);\r\n if (that.drawContext.screenSpaceShadowMask) {\r\n // Shadow-casting lights (buffer index <= numShadowLights) attenuate\r\n // by the pre-rendered screen-space shadow mask; others return 1.0.\r\n this.$l.shadowMask = ShaderHelper.sampleShadowMask(this, pb.int(this.c));\r\n this.diffuseIntensity = pb.vec4(\r\n pb.mul(this.diffuseIntensity.rgb, this.shadowMask),\r\n this.diffuseIntensity.w\r\n );\r\n }\r\n this.$l.lightType = pb.int(this.extra.w);\r\n this.$scope(function () {\r\n callback.call(\r\n this,\r\n this.lightType,\r\n this.positionRange,\r\n this.directionCutoff,\r\n this.diffuseIntensity,\r\n this.extra,\r\n false\r\n );\r\n });\r\n });\r\n });\r\n });\r\n }\r\n });\r\n }\r\n }\r\n /**\r\n * Fragment shader implementation\r\n *\r\n * @param scope - Shader scope\r\n * @returns Calucated fragment color\r\n */\r\n fragmentShader(scope: PBFunctionScope) {\r\n super.fragmentShader(scope);\r\n const pb = scope.$builder;\r\n if (this.drawContext.renderPass!.type === RENDER_PASS_TYPE_LIGHT) {\r\n if (this.hasNormalTexture()) {\r\n scope.zNormalScale = pb.float().uniform(2);\r\n scope.zNormalYSign = pb.float().uniform(2);\r\n }\r\n }\r\n }\r\n /**\r\n * {@inheritDoc Material.supportLighting}\r\n * @override\r\n */\r\n supportLighting() {\r\n return true;\r\n }\r\n } as unknown as T & { new (...args: any[]): IMixinLight };\r\n FEATURE_DOUBLE_SIDED_LIGHTING = cls.defineFeature();\r\n FEATURE_OBJECT_SPACE_NORMALMAP = cls.defineFeature();\r\n return cls;\r\n}\r\n"],"names":["mixinLight","BaseCls","lightMixed","S","applyMaterialMixins","mixinAlbedoColor","mixinTextureProps","FEATURE_DOUBLE_SIDED_LIGHTING","FEATURE_OBJECT_SPACE_NORMALMAP","cls","_normalScale","_normalFlipY","useFeature","copyFrom","other","normalScale","normalFlipY","normalMapMode","doubleSidedLighting","val","uniformChanged","flip","featureUsed","calculateViewVector","scope","worldPos","pb","$builder","normalize","sub","ShaderHelper","getCameraPosition","xyz","calculateReflectionVector","normal","viewVec","reflect","neg","calculateNormal","worldNormal","worldTangent","worldBinormal","that","args","params","vec3","funcName","push","func","$l","uv","hasNormalTexture","getNormalTexCoord","vec2","hasAlbedoTexture","getAlbedoTexCoord","TBN","calculateTBN","drawContext","renderPass","type","RENDER_PASS_TYPE_LIGHT","pixel","mul","textureSample","getNormalTextureUniform","rgb","normalTex","zNormalScale","zNormalYSign","$return","getGlobalScope","getUniformNormalScale","calculateNormalAndTBN","NormalStruct","defineStruct","mat3","posW","uv_dx","dpdx","uv_dy","dpdy","$if","lessThanEqual","add","length","det","x","y","t_","sign","ng","cross","tn","div","max","tRaw","dot","tAxis","greaterThan","abs","lessThan","t","b","cullMode","not","$builtins","frontFacing","applyUniformValues","bindGroup","ctx","pass","setValue","needCalculateEnvLight","drawEnvLight","getEnvLightIrradiance","console","warn","env","light","envLight","hasIrradiance","SSGI","SSGIIrradianceHistoryTexture","SSGISurfaceHistoryTexture","device","motionVectorTexture","getIrradiance","getEnvLightStrength","getEnvLightRadiance","reflectVec","roughness","hasRadiance","getRadiance","getEnvLightSpecularStrength","currentShadowLight","calculateShadow","NoL","needCalculateShadow","float","getClusterIndex","fragCoord","clusterParams","getClusterParams","countParams","getCountParams","zTile","int","log2","nonLinearDepthToLinear","z","w","f","xyTile","ivec2","xy","ivec3","calculatePointLightAttenuation","posRange","vec4","d","dist2","lightAtten","range2","f2","clamp","calculateSpotLightAttenuation","dirCutoff","angleScaleOffset","physical","scene","lightingMode","dist","distance","falloff","cd","spotFactor","smoothStep","mix","resolvedScaleOffset","calculateLightAttenuation","extra","$choice","equal","LIGHT_TYPE_DIRECTIONAL","LIGHT_TYPE_POINT","LIGHT_TYPE_RECT","calculateLightDirection","forEachLight","callback","positionAndRange","directionAndCutoff","colorIntensity","diffuseAndIntensity","extraParams","$scope","lightType","call","cluster","clusterIndex","texSize","lightIndexTexSize","getDevice","texCoordX","mod","texCoordY","samp","getClusteredLightIndexTexture","textureLoad","$for","k","at","i","lights","li","j","positionRange","getLightPositionAndRange","directionCutoff","getLightDirectionAndCutoff","diffuseIntensity","getLightColorAndIntensity","getLightExtra","screenSpaceShadowMask","shadowMask","sampleShadowMask","$break","uint","c","compAnd","sar","fragmentShader","uniform","supportLighting","defineFeature"],"mappings":"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"}
1
+ {"version":3,"file":"lit.js","sources":["../../../src/material/mixins/lit.ts"],"sourcesContent":["import type { BindGroup, PBFunctionScope, PBInsideFunctionScope, PBShaderExp } from '@zephyr3d/device';\r\nimport {\r\n LIGHT_TYPE_DIRECTIONAL,\r\n LIGHT_TYPE_POINT,\r\n LIGHT_TYPE_RECT,\r\n // LIGHT_TYPE_SPOT,\r\n RENDER_PASS_TYPE_LIGHT\r\n} from '../../values';\r\nimport type { DrawContext } from '../../render';\r\nimport type { MeshMaterial } from '../meshmaterial';\r\nimport { applyMaterialMixins } from '../meshmaterial';\r\nimport type { TextureMixinInstanceTypes } from './texture';\r\nimport { mixinTextureProps } from './texture';\r\nimport type { IMixinAlbedoColor } from './albedocolor';\r\nimport { mixinAlbedoColor } from './albedocolor';\r\nimport { ShaderHelper } from '../shader/helper';\r\n\r\n/**\r\n * Interface for light mixin\r\n * @public\r\n */\r\nexport type IMixinLight = {\r\n normalScale: number;\r\n normalFlipY: boolean;\r\n normalMapMode: 'tangent-space' | 'object-space';\r\n doubleSidedLighting: boolean;\r\n receivesWaterCaustics(): boolean;\r\n needCalculateEnvLight(): boolean;\r\n getUniformNormalScale(scope: PBInsideFunctionScope): PBShaderExp;\r\n getEnvLightIrradiance(scope: PBInsideFunctionScope, normal: PBShaderExp): PBShaderExp;\r\n getEnvLightRadiance(\r\n scope: PBInsideFunctionScope,\r\n reflectVec: PBShaderExp,\r\n roughness: PBShaderExp\r\n ): PBShaderExp;\r\n calculateViewVector(scope: PBInsideFunctionScope, worldPos: PBShaderExp): PBShaderExp;\r\n calculateReflectionVector(\r\n scope: PBInsideFunctionScope,\r\n normal: PBShaderExp,\r\n viewVec: PBShaderExp\r\n ): PBShaderExp;\r\n calculateTBN(\r\n scope: PBInsideFunctionScope,\r\n worldPos: PBShaderExp,\r\n worldNormal?: PBShaderExp,\r\n worldTangent?: PBShaderExp,\r\n worldBinormal?: PBShaderExp\r\n ): PBShaderExp;\r\n calculateNormal(\r\n scope: PBInsideFunctionScope,\r\n worldPos: PBShaderExp,\r\n worldNormal?: PBShaderExp,\r\n worldTangent?: PBShaderExp,\r\n worldBinormal?: PBShaderExp\r\n ): PBShaderExp;\r\n calculateNormalAndTBN(\r\n scope: PBInsideFunctionScope,\r\n worldPos: PBShaderExp,\r\n worldNormal?: PBShaderExp,\r\n worldTangent?: PBShaderExp,\r\n worldBinormal?: PBShaderExp\r\n ): PBShaderExp;\r\n calculateLightAttenuation(\r\n scope: PBInsideFunctionScope,\r\n type: PBShaderExp,\r\n worldPos: PBShaderExp,\r\n posRange: PBShaderExp,\r\n dirCutoff: PBShaderExp,\r\n extra?: PBShaderExp\r\n ): PBShaderExp;\r\n calculateLightDirection(\r\n scope: PBInsideFunctionScope,\r\n type: PBShaderExp,\r\n worldPos: PBShaderExp,\r\n posRange: PBShaderExp,\r\n dirCutoff: PBShaderExp\r\n ): PBShaderExp;\r\n calculateShadow(\r\n scope: PBInsideFunctionScope,\r\n worldPos: PBShaderExp,\r\n worldNormal: PBShaderExp,\r\n NoL: PBShaderExp\r\n ): PBShaderExp;\r\n forEachLight(\r\n scope: PBInsideFunctionScope,\r\n callback: (\r\n this: PBInsideFunctionScope,\r\n type: PBShaderExp,\r\n posRange: PBShaderExp,\r\n dirCutoff: PBShaderExp,\r\n colorIntensity: PBShaderExp,\r\n extra: PBShaderExp,\r\n shadow: boolean\r\n ) => void\r\n ): void;\r\n} & TextureMixinInstanceTypes<['normal']> &\r\n IMixinAlbedoColor;\r\n\r\n/**\r\n * Light mixin\r\n * @param BaseCls - class to mix in\r\n * @returns Mixed class\r\n * @public\r\n */\r\nexport function mixinLight<T extends typeof MeshMaterial>(BaseCls: T) {\r\n if ((BaseCls as any).lightMixed) {\r\n return BaseCls as T & { new (...args: any[]): IMixinLight };\r\n }\r\n const S = applyMaterialMixins(BaseCls, mixinAlbedoColor, mixinTextureProps('normal'));\r\n let FEATURE_DOUBLE_SIDED_LIGHTING = 0;\r\n let FEATURE_OBJECT_SPACE_NORMALMAP = 0;\r\n const cls = class extends S {\r\n static readonly lightMixed = true;\r\n private _normalScale: number;\r\n private _normalFlipY: boolean;\r\n constructor() {\r\n super();\r\n this._normalScale = 1;\r\n this._normalFlipY = false;\r\n this.useFeature(FEATURE_DOUBLE_SIDED_LIGHTING, true);\r\n }\r\n copyFrom(other: this) {\r\n super.copyFrom(other);\r\n this.normalScale = other.normalScale;\r\n this.normalFlipY = other.normalFlipY;\r\n this.normalMapMode = other.normalMapMode;\r\n this.doubleSidedLighting = other.doubleSidedLighting;\r\n }\r\n get normalScale() {\r\n return this._normalScale;\r\n }\r\n set normalScale(val) {\r\n if (val !== this._normalScale) {\r\n this._normalScale = val;\r\n this.uniformChanged();\r\n }\r\n }\r\n get normalFlipY() {\r\n return this._normalFlipY;\r\n }\r\n set normalFlipY(val) {\r\n const flip = !!val;\r\n if (flip !== this._normalFlipY) {\r\n this._normalFlipY = flip;\r\n this.uniformChanged();\r\n }\r\n }\r\n get normalMapMode() {\r\n return this.featureUsed<'tangent-space' | 'object-space'>(FEATURE_OBJECT_SPACE_NORMALMAP);\r\n }\r\n set normalMapMode(val) {\r\n this.useFeature(FEATURE_OBJECT_SPACE_NORMALMAP, val);\r\n }\r\n /** true if double sided lighting is used */\r\n get doubleSidedLighting() {\r\n return this.featureUsed<boolean>(FEATURE_DOUBLE_SIDED_LIGHTING);\r\n }\r\n set doubleSidedLighting(val) {\r\n this.useFeature(FEATURE_DOUBLE_SIDED_LIGHTING, !!val);\r\n }\r\n /**\r\n * Calculates the normalized vector from world coordinates to the viewpoint.\r\n *\r\n * @param scope - Shader scope\r\n *\r\n * @returns The view vector\r\n */\r\n calculateViewVector(scope: PBInsideFunctionScope, worldPos: PBShaderExp) {\r\n const pb = scope.$builder;\r\n return pb.normalize(pb.sub(ShaderHelper.getCameraPosition(scope), worldPos.xyz));\r\n }\r\n /**\r\n * Calculate the reflection vector of the view vector with respect to the normal.\r\n *\r\n * @param scope - Shader scope\r\n * @param normal - Surface normal\r\n * @param viewVec - The view vector\r\n * @returns The reflection vector\r\n */\r\n calculateReflectionVector(scope: PBInsideFunctionScope, normal: PBShaderExp, viewVec: PBShaderExp) {\r\n const pb = scope.$builder;\r\n return pb.reflect(pb.neg(viewVec), normal);\r\n }\r\n /**\r\n * Calculate the normal vector for current fragment\r\n * @param scope - The shader scope\r\n * @returns Normal vector for current fragment\r\n */\r\n calculateNormal(\r\n scope: PBInsideFunctionScope,\r\n worldPos: PBShaderExp,\r\n worldNormal?: PBShaderExp,\r\n worldTangent?: PBShaderExp,\r\n worldBinormal?: PBShaderExp\r\n ) {\r\n const pb = scope.$builder;\r\n const that = this;\r\n const args: PBShaderExp[] = [worldPos];\r\n const params: PBShaderExp[] = [pb.vec3('worldPos')];\r\n let funcName = 'Z_calculateNormal';\r\n if (worldNormal) {\r\n params.push(pb.vec3('worldNormal'));\r\n args.push(worldNormal);\r\n funcName += '_N';\r\n if (worldTangent && worldBinormal) {\r\n params.push(pb.vec3('worldTangent'), pb.vec3('worldBinormal'));\r\n args.push(worldTangent, worldBinormal);\r\n funcName += '_T';\r\n }\r\n }\r\n pb.func(funcName, params, function () {\r\n this.$l.uv = that.hasNormalTexture()\r\n ? (that.getNormalTexCoord(this) ?? pb.vec2(0))\r\n : that.hasAlbedoTexture()\r\n ? (that.getAlbedoTexCoord(this) ?? pb.vec2(0))\r\n : pb.vec2(0);\r\n this.$l.TBN = that.calculateTBN(\r\n this,\r\n this.worldPos,\r\n this.worldNormal,\r\n this.worldTangent,\r\n this.worldBinormal\r\n );\r\n if (that.drawContext.renderPass!.type === RENDER_PASS_TYPE_LIGHT && that.hasNormalTexture()) {\r\n if (that.normalMapMode === 'object-space') {\r\n const pixel = pb.sub(\r\n pb.mul(pb.textureSample(that.getNormalTextureUniform(this), this.uv).rgb, 2),\r\n pb.vec3(1)\r\n );\r\n const normalTex = pb.mul(\r\n pixel,\r\n pb.vec3(this.zNormalScale, pb.mul(this.zNormalScale, this.zNormalYSign), 1)\r\n );\r\n this.$return(pb.normalize(normalTex));\r\n } else {\r\n const pixel = pb.sub(\r\n pb.mul(pb.textureSample(that.getNormalTextureUniform(this), this.uv).rgb, 2),\r\n pb.vec3(1)\r\n );\r\n const normalTex = pb.mul(\r\n pixel,\r\n pb.vec3(this.zNormalScale, pb.mul(this.zNormalScale, this.zNormalYSign), 1)\r\n );\r\n this.$return(pb.normalize(pb.mul(this.TBN, normalTex)));\r\n }\r\n } else {\r\n this.$return(this.TBN[2]);\r\n }\r\n });\r\n return pb.getGlobalScope()[funcName](...args) as PBShaderExp;\r\n }\r\n /**\r\n * Normal scale uniform\r\n * @return Normal scale uniform\r\n */\r\n getUniformNormalScale(scope: PBInsideFunctionScope) {\r\n return scope.zNormalScale as PBShaderExp;\r\n }\r\n /**\r\n * Calculate the normal vector for current fragment\r\n *\r\n * @param scope - The shader scope\r\n * @returns Structure that contains normal vector and TBN matrix\r\n */\r\n calculateNormalAndTBN(\r\n scope: PBInsideFunctionScope,\r\n worldPos: PBShaderExp,\r\n worldNormal?: PBShaderExp,\r\n worldTangent?: PBShaderExp,\r\n worldBinormal?: PBShaderExp\r\n ) {\r\n const pb = scope.$builder;\r\n const NormalStruct = pb.defineStruct([pb.mat3('TBN'), pb.vec3('normal')]);\r\n const that = this;\r\n const args: PBShaderExp[] = [worldPos.xyz];\r\n const params: PBShaderExp[] = [pb.vec3('worldPos')];\r\n let funcName = 'Z_calculateNormalAndTBN';\r\n if (worldNormal) {\r\n params.push(pb.vec3('worldNormal'));\r\n args.push(worldNormal);\r\n funcName += '_N';\r\n if (worldTangent && worldBinormal) {\r\n params.push(pb.vec3('worldTangent'), pb.vec3('worldBinormal'));\r\n args.push(worldTangent, worldBinormal);\r\n funcName += '_T';\r\n }\r\n }\r\n pb.func(funcName, params, function () {\r\n this.$l.uv = that.hasNormalTexture()\r\n ? (that.getNormalTexCoord(this) ?? pb.vec2(0))\r\n : that.hasAlbedoTexture()\r\n ? (that.getAlbedoTexCoord(this) ?? pb.vec2(0))\r\n : pb.vec2(0);\r\n this.$l.TBN = that.calculateTBN(\r\n this,\r\n this.worldPos,\r\n this.worldNormal,\r\n this.worldTangent,\r\n this.worldBinormal\r\n );\r\n if (that.drawContext.renderPass!.type === RENDER_PASS_TYPE_LIGHT && that.hasNormalTexture()) {\r\n if (that.normalMapMode === 'object-space') {\r\n const pixel = pb.sub(\r\n pb.mul(pb.textureSample(that.getNormalTextureUniform(this), this.uv).rgb, 2),\r\n pb.vec3(1)\r\n );\r\n const normalTex = pb.mul(\r\n pixel,\r\n pb.vec3(this.zNormalScale, pb.mul(this.zNormalScale, this.zNormalYSign), 1)\r\n );\r\n this.$return(NormalStruct(this.TBN, pb.normalize(normalTex)));\r\n } else {\r\n const pixel = pb.sub(\r\n pb.mul(pb.textureSample(that.getNormalTextureUniform(this), this.uv).rgb, 2),\r\n pb.vec3(1)\r\n );\r\n const normalTex = pb.mul(\r\n pixel,\r\n pb.vec3(this.zNormalScale, pb.mul(this.zNormalScale, this.zNormalYSign), 1)\r\n );\r\n this.$return(NormalStruct(this.TBN, pb.normalize(pb.mul(this.TBN, normalTex))));\r\n }\r\n } else {\r\n this.$return(NormalStruct(this.TBN, this.TBN[2]));\r\n }\r\n });\r\n return pb.getGlobalScope()[funcName](...args) as PBShaderExp;\r\n }\r\n /**\r\n * Calculate the TBN matrix\r\n *\r\n * @param scope - The shader scope\r\n * @returns TBN matrix\r\n */\r\n calculateTBN(\r\n scope: PBInsideFunctionScope,\r\n worldPos: PBShaderExp,\r\n worldNormal?: PBShaderExp,\r\n worldTangent?: PBShaderExp,\r\n worldBinormal?: PBShaderExp\r\n ) {\r\n const pb = scope.$builder;\r\n const that = this;\r\n const args: PBShaderExp[] = [worldPos.xyz];\r\n const params: PBShaderExp[] = [pb.vec3('worldPos')];\r\n let funcName = 'Z_calculateTBN';\r\n if (worldNormal) {\r\n params.push(pb.vec3('worldNormal'));\r\n args.push(worldNormal);\r\n funcName += '_N';\r\n if (worldTangent && worldBinormal) {\r\n params.push(pb.vec3('worldTangent'), pb.vec3('worldBinormal'));\r\n args.push(worldTangent, worldBinormal);\r\n funcName += '_T';\r\n }\r\n }\r\n pb.func(funcName, params, function () {\r\n const posW = this.worldPos;\r\n this.$l.uv = that.hasNormalTexture()\r\n ? (that.getNormalTexCoord(this) ?? pb.vec2(0))\r\n : that.hasAlbedoTexture()\r\n ? (that.getAlbedoTexCoord(this) ?? pb.vec2(0))\r\n : pb.vec2(0);\r\n this.$l.TBN = pb.mat3();\r\n if (!worldNormal) {\r\n this.$l.uv_dx = pb.dpdx(pb.vec3(this.uv, 0));\r\n this.$l.uv_dy = pb.dpdy(pb.vec3(this.uv, 0));\r\n this.$if(\r\n pb.lessThanEqual(pb.add(pb.length(this.uv_dx), pb.length(this.uv_dy)), 0.000001),\r\n function () {\r\n this.uv_dx = pb.vec3(1, 0, 0);\r\n this.uv_dy = pb.vec3(0, 1, 0);\r\n }\r\n );\r\n // t is normalized below, so any positive scale on t_ is irrelevant.\r\n // Multiplying by sign(det) instead of dividing by det yields the same\r\n // direction while staying finite when the screen space UV jacobian\r\n // degenerates (silhouettes, folds, collapsed UV shells), where the\r\n // division used to produce Inf and then NaN through the subtraction.\r\n this.$l.det = pb.sub(pb.mul(this.uv_dx.x, this.uv_dy.y), pb.mul(this.uv_dx.y, this.uv_dy.x));\r\n this.$l.t_ = pb.mul(\r\n pb.sub(pb.mul(pb.dpdx(posW), this.uv_dy.y), pb.mul(pb.dpdy(posW), this.uv_dx.y)),\r\n pb.sign(this.det)\r\n );\r\n this.$l.ng = pb.normalize(pb.cross(pb.dpdx(posW), pb.dpdy(posW)));\r\n // Normalize before the gram-schmidt step so the degeneracy test below\r\n // is scale independent: the rejection length is then sin(angle) of t_\r\n // against the normal.\r\n this.$l.tn = pb.div(this.t_, pb.max(pb.length(this.t_), 1e-20));\r\n this.$l.tRaw = pb.sub(this.tn, pb.mul(this.ng, pb.dot(this.ng, this.tn)));\r\n this.$l.tAxis = pb.vec3(1, 0, 0);\r\n this.$if(pb.greaterThan(pb.abs(this.ng.x), 0.9), function () {\r\n this.tAxis = pb.vec3(0, 1, 0);\r\n });\r\n this.$if(pb.lessThan(pb.dot(this.tRaw, this.tRaw), 1e-8), function () {\r\n // t_ vanished or is parallel to the normal: no tangent can be\r\n // recovered from the derivatives, so pick an arbitrary orthogonal\r\n // one. The normal map detail is misoriented on those few pixels,\r\n // but the frame stays finite instead of turning the fragment black.\r\n this.tRaw = pb.sub(this.tAxis, pb.mul(this.ng, pb.dot(this.ng, this.tAxis)));\r\n });\r\n this.$l.t = pb.normalize(this.tRaw);\r\n this.$l.b = pb.cross(this.ng, this.t);\r\n if (that.doubleSidedLighting && that.cullMode !== 'back') {\r\n this.$if(pb.not(this.$builtins.frontFacing), function () {\r\n this.t = pb.mul(this.t, -1);\r\n this.b = pb.mul(this.b, -1);\r\n this.ng = pb.mul(this.ng, -1);\r\n });\r\n }\r\n this.TBN = pb.mat3(this.t, this.b, this.ng);\r\n } else if (!worldTangent) {\r\n this.$l.uv_dx = pb.dpdx(pb.vec3(this.uv, 0));\r\n this.$l.uv_dy = pb.dpdy(pb.vec3(this.uv, 0));\r\n this.$if(\r\n pb.lessThanEqual(pb.add(pb.length(this.uv_dx), pb.length(this.uv_dy)), 0.000001),\r\n function () {\r\n this.uv_dx = pb.vec3(1, 0, 0);\r\n this.uv_dy = pb.vec3(0, 1, 0);\r\n }\r\n );\r\n // See the comment in the branch above: sign(det) replaces the\r\n // unguarded division that produced NaN tangents on degenerate screen\r\n // space UV jacobians.\r\n this.$l.det = pb.sub(pb.mul(this.uv_dx.x, this.uv_dy.y), pb.mul(this.uv_dx.y, this.uv_dy.x));\r\n this.$l.t_ = pb.mul(\r\n pb.sub(pb.mul(pb.dpdx(posW), this.uv_dy.y), pb.mul(pb.dpdy(posW), this.uv_dx.y)),\r\n pb.sign(this.det)\r\n );\r\n this.$l.ng = pb.normalize(this.worldNormal);\r\n this.$l.tn = pb.div(this.t_, pb.max(pb.length(this.t_), 1e-20));\r\n this.$l.tRaw = pb.sub(this.tn, pb.mul(this.ng, pb.dot(this.ng, this.tn)));\r\n this.$l.tAxis = pb.vec3(1, 0, 0);\r\n this.$if(pb.greaterThan(pb.abs(this.ng.x), 0.9), function () {\r\n this.tAxis = pb.vec3(0, 1, 0);\r\n });\r\n this.$if(pb.lessThan(pb.dot(this.tRaw, this.tRaw), 1e-8), function () {\r\n this.tRaw = pb.sub(this.tAxis, pb.mul(this.ng, pb.dot(this.ng, this.tAxis)));\r\n });\r\n this.$l.t = pb.normalize(this.tRaw);\r\n this.$l.b = pb.cross(this.ng, this.t);\r\n if (that.doubleSidedLighting && that.cullMode !== 'back') {\r\n this.$if(pb.not(this.$builtins.frontFacing), function () {\r\n this.t = pb.mul(this.t, -1);\r\n this.b = pb.mul(this.b, -1);\r\n this.ng = pb.mul(this.ng, -1);\r\n });\r\n }\r\n this.TBN = pb.mat3(this.t, this.b, this.ng);\r\n } else {\r\n this.$l.ng = pb.normalize(this.worldNormal);\r\n this.$l.t = pb.normalize(this.worldTangent);\r\n this.$l.b = pb.normalize(this.worldBinormal);\r\n if (that.doubleSidedLighting && that.cullMode !== 'back') {\r\n this.$if(pb.not(this.$builtins.frontFacing), function () {\r\n this.t = pb.mul(this.t, -1);\r\n this.b = pb.mul(this.b, -1);\r\n this.ng = pb.mul(this.ng, -1);\r\n });\r\n }\r\n this.TBN = pb.mat3(this.t, this.b, this.ng);\r\n }\r\n this.$return(this.TBN);\r\n });\r\n return pb.getGlobalScope()[funcName](...args) as PBShaderExp;\r\n }\r\n /**\r\n * {@inheritDoc MeshMaterial.applyUniformsValues}\r\n * @override\r\n */\r\n applyUniformValues(bindGroup: BindGroup, ctx: DrawContext, pass: number) {\r\n super.applyUniformValues(bindGroup, ctx, pass);\r\n if (ctx.renderPass!.type === RENDER_PASS_TYPE_LIGHT) {\r\n if (this.hasNormalTexture()) {\r\n bindGroup.setValue('zNormalScale', this._normalScale);\r\n bindGroup.setValue('zNormalYSign', this._normalFlipY ? -1 : 1);\r\n }\r\n }\r\n }\r\n /**\r\n * Check if the environment lighting should be calculated.\r\n *\r\n * @returns true Environment lighting should be calculated, otherwise false\r\n */\r\n needCalculateEnvLight() {\r\n return this.drawContext.renderPass!.type === RENDER_PASS_TYPE_LIGHT && this.drawContext.drawEnvLight;\r\n }\r\n /**\r\n * Get irradiance of current environment light\r\n *\r\n * @param scope - Shader scope\r\n * @param normal - Fragment normal vector\r\n *\r\n * @returns Irradiance of current environment light of type vec3\r\n */\r\n getEnvLightIrradiance(scope: PBInsideFunctionScope, normal: PBShaderExp) {\r\n if (!this.needCalculateEnvLight()) {\r\n console.warn('getEnvLightIrradiance(): No need to calculate environment lighting');\r\n return scope.$builder.vec3(0);\r\n }\r\n return this.drawContext.env!.light.envLight.hasIrradiance()\r\n ? ((this.drawContext.SSGI &&\r\n this.drawContext.SSGIIrradianceHistoryTexture &&\r\n this.drawContext.SSGISurfaceHistoryTexture &&\r\n (this.drawContext.device.type === 'webgl' || this.drawContext.motionVectorTexture)\r\n ? this.drawContext.env!.light.envLight.getIrradiance(scope, normal, this.drawContext).rgb\r\n : scope.$builder.mul(\r\n this.drawContext.env!.light.envLight.getIrradiance(scope, normal, this.drawContext).rgb,\r\n ShaderHelper.getEnvLightStrength(scope)\r\n )) as PBShaderExp)\r\n : scope.$builder.vec3(0);\r\n }\r\n /**\r\n * Get Radiance of current environment light\r\n *\r\n * @param scope - Shader scope\r\n * @param reflectVec - The reflection vector\r\n * @param roughness - Roughness value of current fragment\r\n *\r\n * @returns Radiance of current environment light of type vec3\r\n */\r\n getEnvLightRadiance(scope: PBInsideFunctionScope, reflectVec: PBShaderExp, roughness: PBShaderExp) {\r\n if (!this.needCalculateEnvLight()) {\r\n console.warn('getEnvLightRadiance(): No need to calculate environment lighting');\r\n return scope.$builder.vec3(0);\r\n }\r\n return this.drawContext.env!.light.envLight.hasRadiance()\r\n ? (scope.$builder.mul(\r\n this.drawContext.env!.light.envLight.getRadiance(scope, reflectVec, roughness)!.rgb,\r\n ShaderHelper.getEnvLightStrength(scope),\r\n ShaderHelper.getEnvLightSpecularStrength(scope)\r\n ) as PBShaderExp)\r\n : scope.$builder.vec3(0);\r\n }\r\n /**\r\n * Checks if shadow should be computed\r\n *\r\n * @returns true if shadow should be computed, other wise false\r\n */\r\n protected needCalculateShadow() {\r\n return (\r\n this.drawContext.renderPass!.type === RENDER_PASS_TYPE_LIGHT && !!this.drawContext.currentShadowLight\r\n );\r\n }\r\n /**\r\n * Calculates shadow of current fragment\r\n *\r\n * @param scope - Shader scope\r\n * @param worldPos - World space position of current fragment\r\n * @param worldNormal - World space normal of current fragment, used for normal\r\n * offset bias. Pass the interpolated vertex normal rather than the normal\r\n * mapped shading normal: a normal map would push the shadow lookup along\r\n * high frequency directions and reintroduce the noise the offset removes.\r\n * @param NoL - NdotL vector\r\n * @returns Shadow of current fragment, 1 means no shadow and 0 means full shadowed.\r\n */\r\n calculateShadow(\r\n scope: PBInsideFunctionScope,\r\n worldPos: PBShaderExp,\r\n worldNormal: PBShaderExp,\r\n NoL: PBShaderExp\r\n ) {\r\n const pb = scope.$builder;\r\n if (!this.needCalculateShadow()) {\r\n console.warn('calculateShadow(): No need to calculate shadow');\r\n return pb.float(1);\r\n }\r\n return ShaderHelper.calculateShadow(scope, worldPos, worldNormal, NoL, this.drawContext);\r\n }\r\n /**\r\n * Whether this material's fragments are lit through water and so pick up the\r\n * water caustics.\r\n *\r\n * True for ordinary surfaces, which may sit under a water body. A water\r\n * surface itself must override this to false: the caustic lookup decides\r\n * whether a fragment is submerged by comparing its own height against the\r\n * displaced surface height on its *sun ray*, and those are two different\r\n * points on the water unless the sun is exactly overhead. Under a tilted sun\r\n * every water fragment has some other part of the surface upstream of it, so\r\n * a fragment in a trough is read as being under the crest up-sun of it and\r\n * gets the caustic pattern - whose peaks are well above 1 - painted onto the\r\n * water as bright blotches that swim with the waves.\r\n *\r\n * Only the sampling is gated, not the uniform declarations: the caustic\r\n * uniforms live in the pass-wide global bind group, whose layout is built\r\n * once per {@link DrawContext.renderPassHash} and shared by every material\r\n * drawn in that pass, so it cannot vary per material.\r\n *\r\n * @returns True when the water caustics modulate this material's lighting.\r\n */\r\n receivesWaterCaustics(): boolean {\r\n return true;\r\n }\r\n private getClusterIndex(scope: PBInsideFunctionScope, fragCoord: PBShaderExp) {\r\n const pb = scope.$builder;\r\n const funcName = 'lm_getClusterIndex';\r\n pb.func(funcName, [pb.vec3('fragCoord')], function () {\r\n const clusterParams = ShaderHelper.getClusterParams(this);\r\n const countParams = ShaderHelper.getCountParams(this);\r\n this.$l.zTile = pb.int(\r\n pb.max(\r\n pb.add(\r\n pb.mul(pb.log2(ShaderHelper.nonLinearDepthToLinear(this, this.fragCoord.z)), clusterParams.z),\r\n clusterParams.w\r\n ),\r\n 0\r\n )\r\n );\r\n this.$l.f = pb.vec2(this.fragCoord.x, pb.sub(clusterParams.y, pb.add(this.fragCoord.y, 1)));\r\n this.$l.xyTile = pb.ivec2(pb.div(this.f, pb.div(clusterParams.xy, pb.vec2(countParams.xy))));\r\n this.$return(pb.ivec3(this.xyTile, this.zTile));\r\n });\r\n return pb.getGlobalScope()[funcName](fragCoord);\r\n }\r\n protected calculatePointLightAttenuation(\r\n scope: PBInsideFunctionScope,\r\n worldPos: PBShaderExp,\r\n posRange: PBShaderExp\r\n ) {\r\n const pb = scope.$builder;\r\n const funcName = 'Z_calculatePointLightAttenuation';\r\n pb.func(funcName, [pb.vec3('worldPos'), pb.vec4('posRange')], function () {\r\n this.$l.d = pb.sub(this.worldPos, this.posRange.xyz);\r\n this.$l.dist2 = pb.dot(this.d, this.d);\r\n this.$l.lightAtten = pb.div(1, pb.max(this.dist2, 0.0001));\r\n this.$l.range2 = pb.mul(this.posRange.w, this.posRange.w);\r\n this.$l.f = pb.div(this.dist2, pb.max(this.range2, 0.0001));\r\n this.$l.f2 = pb.clamp(pb.sub(1, pb.mul(this.f, this.f)), 0, 1);\r\n this.$return(pb.mul(this.lightAtten, pb.mul(this.f2, this.f2)));\r\n });\r\n return pb.getGlobalScope()[funcName](worldPos, posRange);\r\n }\r\n protected calculateSpotLightAttenuation(\r\n scope: PBInsideFunctionScope,\r\n worldPos: PBShaderExp,\r\n posRange: PBShaderExp,\r\n dirCutoff: PBShaderExp,\r\n angleScaleOffset?: PBShaderExp\r\n ) {\r\n const pb = scope.$builder;\r\n const physical = this.drawContext.scene.lightingMode === 'physical';\r\n // The two modes emit different falloff and cone-attenuation bodies, so they must not share a\r\n // cached function under one name.\r\n const funcName = physical\r\n ? 'Z_calculateSpotLightAttenuationPhysical'\r\n : 'Z_calculateSpotLightAttenuation';\r\n pb.func(\r\n funcName,\r\n [pb.vec3('worldPos'), pb.vec4('posRange'), pb.vec4('dirCutoff'), pb.vec2('angleScaleOffset')],\r\n function () {\r\n this.$l.dist = pb.distance(this.posRange.xyz, this.worldPos);\r\n if (physical) {\r\n this.$l.dist2 = pb.mul(this.dist, this.dist);\r\n this.$l.lightAtten = pb.div(1, pb.max(this.dist2, 0.0001));\r\n this.$l.range2 = pb.mul(this.posRange.w, this.posRange.w);\r\n this.$l.f = pb.div(this.dist2, pb.max(this.range2, 0.0001));\r\n this.$l.f2 = pb.clamp(pb.sub(1, pb.mul(this.f, this.f)), 0, 1);\r\n this.$l.falloff = pb.mul(this.lightAtten, this.f2, this.f2);\r\n } else {\r\n this.$l.falloff = pb.max(0, pb.sub(1, pb.div(this.dist, this.posRange.w)));\r\n this.falloff = pb.mul(this.falloff, this.falloff);\r\n }\r\n this.$l.cd = pb.dot(pb.normalize(pb.sub(this.worldPos, this.posRange.xyz)), this.dirCutoff.xyz);\r\n if (physical) {\r\n // Filament's getAngleAttenuation: saturate(cd * scale + offset) squared. The scale/offset\r\n // pair is derived CPU-side from the cone half-angles and already guards inner == outer.\r\n this.$l.spotFactor = pb.clamp(\r\n pb.add(pb.mul(this.cd, this.angleScaleOffset.x), this.angleScaleOffset.y),\r\n 0,\r\n 1\r\n );\r\n this.spotFactor = pb.mul(this.spotFactor, this.spotFactor);\r\n } else {\r\n this.$l.spotFactor = pb.smoothStep(this.dirCutoff.w, pb.mix(this.dirCutoff.w, 1, 0.5), this.cd);\r\n }\r\n this.$return(pb.mul(this.spotFactor, this.falloff));\r\n }\r\n );\r\n const resolvedScaleOffset = physical && angleScaleOffset ? angleScaleOffset : pb.vec2(0);\r\n return pb.getGlobalScope()[funcName](worldPos, posRange, dirCutoff, resolvedScaleOffset);\r\n }\r\n calculateLightAttenuation(\r\n scope: PBInsideFunctionScope,\r\n type: PBShaderExp,\r\n worldPos: PBShaderExp,\r\n posRange: PBShaderExp,\r\n dirCutoff: PBShaderExp,\r\n extra?: PBShaderExp\r\n ) {\r\n const pb = scope.$builder;\r\n const attenuation = scope.$choice(\r\n pb.equal(type, LIGHT_TYPE_DIRECTIONAL),\r\n pb.float(1),\r\n scope.$choice(\r\n pb.equal(type, LIGHT_TYPE_POINT),\r\n this.calculatePointLightAttenuation(scope, worldPos.xyz, posRange),\r\n scope.$choice(\r\n pb.equal(type, LIGHT_TYPE_RECT),\r\n this.calculatePointLightAttenuation(scope, worldPos.xyz, posRange),\r\n this.calculateSpotLightAttenuation(scope, worldPos.xyz, posRange, dirCutoff, extra?.xy)\r\n )\r\n )\r\n );\r\n // Water caustics ride here rather than on calculateShadow(): every light\r\n // model already folds this value into its light colour and nothing else\r\n // reads it, so a vec3 return applies the caustic tint everywhere without\r\n // touching a single call site. It also covers both lighting paths, which\r\n // matters because a shadow-casting sun goes through the clustered path\r\n // when the screen-space shadow mask is on and through a per-light additive\r\n // pass when it is off.\r\n const caustic = this.receivesWaterCaustics()\r\n ? ShaderHelper.calculateWaterCaustic(scope, worldPos.xyz, type, dirCutoff.xyz, this.drawContext)\r\n : null;\r\n return caustic ? pb.mul(caustic, attenuation) : attenuation;\r\n }\r\n calculateLightDirection(\r\n scope: PBInsideFunctionScope,\r\n type: PBShaderExp,\r\n worldPos: PBShaderExp,\r\n posRange: PBShaderExp,\r\n dirCutoff: PBShaderExp\r\n ) {\r\n const pb = scope.$builder;\r\n return scope.$choice(\r\n pb.equal(type, LIGHT_TYPE_DIRECTIONAL),\r\n pb.neg(dirCutoff.xyz),\r\n pb.normalize(pb.sub(posRange.xyz, worldPos.xyz))\r\n );\r\n }\r\n forEachLight(\r\n scope: PBInsideFunctionScope,\r\n callback: (\r\n this: PBInsideFunctionScope,\r\n type: PBShaderExp,\r\n posRange: PBShaderExp,\r\n dirCutoff: PBShaderExp,\r\n colorIntensity: PBShaderExp,\r\n extra: PBShaderExp,\r\n shadow: boolean\r\n ) => void\r\n ) {\r\n const pb = scope.$builder;\r\n const that = this;\r\n if (that.drawContext.renderPass!.type !== RENDER_PASS_TYPE_LIGHT) {\r\n console.warn('LitMaterial.forEachLight(): must be called in forward render pass');\r\n return;\r\n }\r\n if (that.drawContext.currentShadowLight) {\r\n const posRange = scope.light.positionAndRange;\r\n const dirCutoff = scope.light.directionAndCutoff;\r\n const colorIntensity = scope.light.diffuseAndIntensity;\r\n const extra = scope.light.extraParams ?? pb.vec4(0);\r\n scope.$scope(function () {\r\n const lightType = pb.int(extra.w);\r\n callback.call(this, lightType, posRange, dirCutoff, colorIntensity, extra, true);\r\n });\r\n } else {\r\n scope.$scope(function () {\r\n const countParams = ShaderHelper.getCountParams(this);\r\n this.$l.cluster = that.getClusterIndex(this, this.$builtins.fragCoord.xyz);\r\n this.$l.clusterIndex = pb.add(\r\n this.cluster.x,\r\n pb.mul(this.cluster.y, countParams.x),\r\n pb.mul(this.cluster.z, countParams.x, countParams.y)\r\n );\r\n this.$l.texSize = scope.light.lightIndexTexSize;\r\n if (pb.getDevice().type === 'webgl') {\r\n this.$l.texCoordX = pb.div(\r\n pb.add(pb.mod(pb.float(this.clusterIndex), pb.float(this.texSize.x)), 0.5),\r\n pb.float(this.texSize.x)\r\n );\r\n this.$l.texCoordY = pb.div(\r\n pb.add(pb.float(pb.div(this.clusterIndex, this.texSize.x)), 0.5),\r\n pb.float(this.texSize.y)\r\n );\r\n this.$l.samp = pb.textureSample(\r\n ShaderHelper.getClusteredLightIndexTexture(this),\r\n pb.vec2(this.texCoordX, this.texCoordY)\r\n );\r\n } else {\r\n this.$l.texCoordX = pb.mod(this.clusterIndex, this.texSize.x);\r\n this.$l.texCoordY = pb.div(this.clusterIndex, this.texSize.x);\r\n this.$l.samp = pb.textureLoad(\r\n ShaderHelper.getClusteredLightIndexTexture(this),\r\n pb.ivec2(this.texCoordX, this.texCoordY),\r\n 0\r\n );\r\n }\r\n if (pb.getDevice().type === 'webgl') {\r\n this.$for(pb.int('i'), 0, 4, function () {\r\n this.$l.k = this.samp.at(this.i);\r\n this.$l.lights = pb.int[2]();\r\n this.$l.lights[0] = pb.int(pb.mod(this.k, 256));\r\n this.$l.lights[1] = pb.int(pb.div(this.k, 256));\r\n this.$for(pb.int('k'), 0, 2, function () {\r\n this.$l.li = this.lights.at(this.k);\r\n this.$if(pb.greaterThan(this.li, 0), function () {\r\n this.$for(pb.int('j'), 1, 256, function () {\r\n this.$if(pb.equal(this.j, this.li), function () {\r\n this.$l.positionRange = ShaderHelper.getLightPositionAndRange(this, this.j);\r\n this.$l.directionCutoff = ShaderHelper.getLightDirectionAndCutoff(this, this.j);\r\n this.$l.diffuseIntensity = ShaderHelper.getLightColorAndIntensity(this, this.j);\r\n this.$l.extra = ShaderHelper.getLightExtra(this, this.j);\r\n if (that.drawContext.screenSpaceShadowMask) {\r\n this.$l.shadowMask = ShaderHelper.sampleShadowMask(this, this.j);\r\n this.diffuseIntensity = pb.vec4(\r\n pb.mul(this.diffuseIntensity.rgb, this.shadowMask),\r\n this.diffuseIntensity.w\r\n );\r\n }\r\n this.$l.lightType = pb.int(this.extra.w);\r\n this.$scope(function () {\r\n callback.call(\r\n this,\r\n this.lightType,\r\n this.positionRange,\r\n this.directionCutoff,\r\n this.diffuseIntensity,\r\n this.extra,\r\n false\r\n );\r\n });\r\n this.$break();\r\n });\r\n });\r\n });\r\n });\r\n });\r\n } else {\r\n this.$for(pb.uint('i'), 0, 4, function () {\r\n this.$for(pb.uint('k'), 0, 4, function () {\r\n this.$l.c = pb.compAnd(pb.sar(this.samp.at(this.i), pb.mul(this.k, 8)), 0xff);\r\n this.$if(pb.greaterThan(this.c, 0), function () {\r\n this.$l.positionRange = ShaderHelper.getLightPositionAndRange(this, this.c);\r\n this.$l.directionCutoff = ShaderHelper.getLightDirectionAndCutoff(this, this.c);\r\n this.$l.diffuseIntensity = ShaderHelper.getLightColorAndIntensity(this, this.c);\r\n this.$l.extra = ShaderHelper.getLightExtra(this, this.c);\r\n if (that.drawContext.screenSpaceShadowMask) {\r\n // Shadow-casting lights (buffer index <= numShadowLights) attenuate\r\n // by the pre-rendered screen-space shadow mask; others return 1.0.\r\n this.$l.shadowMask = ShaderHelper.sampleShadowMask(this, pb.int(this.c));\r\n this.diffuseIntensity = pb.vec4(\r\n pb.mul(this.diffuseIntensity.rgb, this.shadowMask),\r\n this.diffuseIntensity.w\r\n );\r\n }\r\n this.$l.lightType = pb.int(this.extra.w);\r\n this.$scope(function () {\r\n callback.call(\r\n this,\r\n this.lightType,\r\n this.positionRange,\r\n this.directionCutoff,\r\n this.diffuseIntensity,\r\n this.extra,\r\n false\r\n );\r\n });\r\n });\r\n });\r\n });\r\n }\r\n });\r\n }\r\n }\r\n /**\r\n * Fragment shader implementation\r\n *\r\n * @param scope - Shader scope\r\n * @returns Calucated fragment color\r\n */\r\n fragmentShader(scope: PBFunctionScope) {\r\n super.fragmentShader(scope);\r\n const pb = scope.$builder;\r\n if (this.drawContext.renderPass!.type === RENDER_PASS_TYPE_LIGHT) {\r\n if (this.hasNormalTexture()) {\r\n scope.zNormalScale = pb.float().uniform(2);\r\n scope.zNormalYSign = pb.float().uniform(2);\r\n }\r\n }\r\n }\r\n /**\r\n * {@inheritDoc Material.supportLighting}\r\n * @override\r\n */\r\n supportLighting() {\r\n return true;\r\n }\r\n } as unknown as T & { new (...args: any[]): IMixinLight };\r\n FEATURE_DOUBLE_SIDED_LIGHTING = cls.defineFeature();\r\n FEATURE_OBJECT_SPACE_NORMALMAP = cls.defineFeature();\r\n return cls;\r\n}\r\n"],"names":["mixinLight","BaseCls","lightMixed","S","applyMaterialMixins","mixinAlbedoColor","mixinTextureProps","FEATURE_DOUBLE_SIDED_LIGHTING","FEATURE_OBJECT_SPACE_NORMALMAP","cls","_normalScale","_normalFlipY","useFeature","copyFrom","other","normalScale","normalFlipY","normalMapMode","doubleSidedLighting","val","uniformChanged","flip","featureUsed","calculateViewVector","scope","worldPos","pb","$builder","normalize","sub","ShaderHelper","getCameraPosition","xyz","calculateReflectionVector","normal","viewVec","reflect","neg","calculateNormal","worldNormal","worldTangent","worldBinormal","that","args","params","vec3","funcName","push","func","$l","uv","hasNormalTexture","getNormalTexCoord","vec2","hasAlbedoTexture","getAlbedoTexCoord","TBN","calculateTBN","drawContext","renderPass","type","RENDER_PASS_TYPE_LIGHT","pixel","mul","textureSample","getNormalTextureUniform","rgb","normalTex","zNormalScale","zNormalYSign","$return","getGlobalScope","getUniformNormalScale","calculateNormalAndTBN","NormalStruct","defineStruct","mat3","posW","uv_dx","dpdx","uv_dy","dpdy","$if","lessThanEqual","add","length","det","x","y","t_","sign","ng","cross","tn","div","max","tRaw","dot","tAxis","greaterThan","abs","lessThan","t","b","cullMode","not","$builtins","frontFacing","applyUniformValues","bindGroup","ctx","pass","setValue","needCalculateEnvLight","drawEnvLight","getEnvLightIrradiance","console","warn","env","light","envLight","hasIrradiance","SSGI","SSGIIrradianceHistoryTexture","SSGISurfaceHistoryTexture","device","motionVectorTexture","getIrradiance","getEnvLightStrength","getEnvLightRadiance","reflectVec","roughness","hasRadiance","getRadiance","getEnvLightSpecularStrength","currentShadowLight","calculateShadow","NoL","needCalculateShadow","float","receivesWaterCaustics","getClusterIndex","fragCoord","clusterParams","getClusterParams","countParams","getCountParams","zTile","int","log2","nonLinearDepthToLinear","z","w","f","xyTile","ivec2","xy","ivec3","calculatePointLightAttenuation","posRange","vec4","d","dist2","lightAtten","range2","f2","clamp","calculateSpotLightAttenuation","dirCutoff","angleScaleOffset","physical","scene","lightingMode","dist","distance","falloff","cd","spotFactor","smoothStep","mix","resolvedScaleOffset","calculateLightAttenuation","extra","attenuation","$choice","equal","LIGHT_TYPE_DIRECTIONAL","LIGHT_TYPE_POINT","LIGHT_TYPE_RECT","caustic","calculateWaterCaustic","calculateLightDirection","forEachLight","callback","positionAndRange","directionAndCutoff","colorIntensity","diffuseAndIntensity","extraParams","$scope","lightType","call","cluster","clusterIndex","texSize","lightIndexTexSize","getDevice","texCoordX","mod","texCoordY","samp","getClusteredLightIndexTexture","textureLoad","$for","k","at","i","lights","li","j","positionRange","getLightPositionAndRange","directionCutoff","getLightDirectionAndCutoff","diffuseIntensity","getLightColorAndIntensity","getLightExtra","screenSpaceShadowMask","shadowMask","sampleShadowMask","$break","uint","c","compAnd","sar","fragmentShader","uniform","supportLighting","defineFeature"],"mappings":"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"}