@flighthq/scene3d-wgpu 0.2.1-next.840.857425c
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.
- package/dist/anisotropyPbrWgpuMeshMaterialRenderer.d.ts +4 -0
- package/dist/anisotropyPbrWgpuMeshMaterialRenderer.d.ts.map +1 -0
- package/dist/anisotropyPbrWgpuMeshMaterialRenderer.js +52 -0
- package/dist/anisotropyPbrWgpuMeshMaterialRenderer.js.map +1 -0
- package/dist/blinnPhongWgpuMeshMaterialRenderer.d.ts +4 -0
- package/dist/blinnPhongWgpuMeshMaterialRenderer.d.ts.map +1 -0
- package/dist/blinnPhongWgpuMeshMaterialRenderer.js +66 -0
- package/dist/blinnPhongWgpuMeshMaterialRenderer.js.map +1 -0
- package/dist/clearcoatPbrWgpuMeshMaterialRenderer.d.ts +4 -0
- package/dist/clearcoatPbrWgpuMeshMaterialRenderer.d.ts.map +1 -0
- package/dist/clearcoatPbrWgpuMeshMaterialRenderer.js +52 -0
- package/dist/clearcoatPbrWgpuMeshMaterialRenderer.js.map +1 -0
- package/dist/customShaderWgpuMeshMaterialRenderer.d.ts +7 -0
- package/dist/customShaderWgpuMeshMaterialRenderer.d.ts.map +1 -0
- package/dist/customShaderWgpuMeshMaterialRenderer.js +225 -0
- package/dist/customShaderWgpuMeshMaterialRenderer.js.map +1 -0
- package/dist/depthWgpuMeshMaterialRenderer.d.ts +4 -0
- package/dist/depthWgpuMeshMaterialRenderer.d.ts.map +1 -0
- package/dist/depthWgpuMeshMaterialRenderer.js +42 -0
- package/dist/depthWgpuMeshMaterialRenderer.js.map +1 -0
- package/dist/drawWgpuScene3D.d.ts +4 -0
- package/dist/drawWgpuScene3D.d.ts.map +1 -0
- package/dist/drawWgpuScene3D.js +171 -0
- package/dist/drawWgpuScene3D.js.map +1 -0
- package/dist/emissiveWgpuMeshMaterialRenderer.d.ts +4 -0
- package/dist/emissiveWgpuMeshMaterialRenderer.d.ts.map +1 -0
- package/dist/emissiveWgpuMeshMaterialRenderer.js +51 -0
- package/dist/emissiveWgpuMeshMaterialRenderer.js.map +1 -0
- package/dist/enableWgpuScene3DCustomShaderGuards.d.ts +5 -0
- package/dist/enableWgpuScene3DCustomShaderGuards.d.ts.map +1 -0
- package/dist/enableWgpuScene3DCustomShaderGuards.js +56 -0
- package/dist/enableWgpuScene3DCustomShaderGuards.js.map +1 -0
- package/dist/enableWgpuScene3DForwardLightSelectionGuards.d.ts +4 -0
- package/dist/enableWgpuScene3DForwardLightSelectionGuards.d.ts.map +1 -0
- package/dist/enableWgpuScene3DForwardLightSelectionGuards.js +17 -0
- package/dist/enableWgpuScene3DForwardLightSelectionGuards.js.map +1 -0
- package/dist/explainWgpuScene3DForwardLightSelection.d.ts +3 -0
- package/dist/explainWgpuScene3DForwardLightSelection.d.ts.map +1 -0
- package/dist/explainWgpuScene3DForwardLightSelection.js +18 -0
- package/dist/explainWgpuScene3DForwardLightSelection.js.map +1 -0
- package/dist/index.d.ts +51 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +51 -0
- package/dist/index.js.map +1 -0
- package/dist/iridescencePbrWgpuMeshMaterialRenderer.d.ts +4 -0
- package/dist/iridescencePbrWgpuMeshMaterialRenderer.d.ts.map +1 -0
- package/dist/iridescencePbrWgpuMeshMaterialRenderer.js +60 -0
- package/dist/iridescencePbrWgpuMeshMaterialRenderer.js.map +1 -0
- package/dist/lambertWgpuMeshMaterialRenderer.d.ts +4 -0
- package/dist/lambertWgpuMeshMaterialRenderer.d.ts.map +1 -0
- package/dist/lambertWgpuMeshMaterialRenderer.js +61 -0
- package/dist/lambertWgpuMeshMaterialRenderer.js.map +1 -0
- package/dist/matcapWgpuMeshMaterialRenderer.d.ts +4 -0
- package/dist/matcapWgpuMeshMaterialRenderer.d.ts.map +1 -0
- package/dist/matcapWgpuMeshMaterialRenderer.js +54 -0
- package/dist/matcapWgpuMeshMaterialRenderer.js.map +1 -0
- package/dist/normalWgpuMeshMaterialRenderer.d.ts +4 -0
- package/dist/normalWgpuMeshMaterialRenderer.d.ts.map +1 -0
- package/dist/normalWgpuMeshMaterialRenderer.js +47 -0
- package/dist/normalWgpuMeshMaterialRenderer.js.map +1 -0
- package/dist/phongWgpuMeshMaterialRenderer.d.ts +4 -0
- package/dist/phongWgpuMeshMaterialRenderer.d.ts.map +1 -0
- package/dist/phongWgpuMeshMaterialRenderer.js +63 -0
- package/dist/phongWgpuMeshMaterialRenderer.js.map +1 -0
- package/dist/prepareWgpuScene3DForwardLights.d.ts +3 -0
- package/dist/prepareWgpuScene3DForwardLights.d.ts.map +1 -0
- package/dist/prepareWgpuScene3DForwardLights.js +110 -0
- package/dist/prepareWgpuScene3DForwardLights.js.map +1 -0
- package/dist/registerStandardPbrWgpuMaterial.d.ts +3 -0
- package/dist/registerStandardPbrWgpuMaterial.d.ts.map +1 -0
- package/dist/registerStandardPbrWgpuMaterial.js +11 -0
- package/dist/registerStandardPbrWgpuMaterial.js.map +1 -0
- package/dist/shadedWgpuMeshMaterialRenderer.d.ts +11 -0
- package/dist/shadedWgpuMeshMaterialRenderer.d.ts.map +1 -0
- package/dist/shadedWgpuMeshMaterialRenderer.js +47 -0
- package/dist/shadedWgpuMeshMaterialRenderer.js.map +1 -0
- package/dist/sheenPbrWgpuMeshMaterialRenderer.d.ts +4 -0
- package/dist/sheenPbrWgpuMeshMaterialRenderer.d.ts.map +1 -0
- package/dist/sheenPbrWgpuMeshMaterialRenderer.js +58 -0
- package/dist/sheenPbrWgpuMeshMaterialRenderer.js.map +1 -0
- package/dist/specularGlossinessPbrWgpuMeshMaterialRenderer.d.ts +4 -0
- package/dist/specularGlossinessPbrWgpuMeshMaterialRenderer.d.ts.map +1 -0
- package/dist/specularGlossinessPbrWgpuMeshMaterialRenderer.js +126 -0
- package/dist/specularGlossinessPbrWgpuMeshMaterialRenderer.js.map +1 -0
- package/dist/specularPbrWgpuMeshMaterialRenderer.d.ts +4 -0
- package/dist/specularPbrWgpuMeshMaterialRenderer.d.ts.map +1 -0
- package/dist/specularPbrWgpuMeshMaterialRenderer.js +65 -0
- package/dist/specularPbrWgpuMeshMaterialRenderer.js.map +1 -0
- package/dist/standardPbrWgpuMeshMaterialRenderer.d.ts +9 -0
- package/dist/standardPbrWgpuMeshMaterialRenderer.d.ts.map +1 -0
- package/dist/standardPbrWgpuMeshMaterialRenderer.js +174 -0
- package/dist/standardPbrWgpuMeshMaterialRenderer.js.map +1 -0
- package/dist/subsurfacePbrWgpuMeshMaterialRenderer.d.ts +4 -0
- package/dist/subsurfacePbrWgpuMeshMaterialRenderer.d.ts.map +1 -0
- package/dist/subsurfacePbrWgpuMeshMaterialRenderer.js +68 -0
- package/dist/subsurfacePbrWgpuMeshMaterialRenderer.js.map +1 -0
- package/dist/toonWgpuMeshMaterialRenderer.d.ts +4 -0
- package/dist/toonWgpuMeshMaterialRenderer.d.ts.map +1 -0
- package/dist/toonWgpuMeshMaterialRenderer.js +71 -0
- package/dist/toonWgpuMeshMaterialRenderer.js.map +1 -0
- package/dist/transmissionVolumePbrWgpuMeshMaterialRenderer.d.ts +4 -0
- package/dist/transmissionVolumePbrWgpuMeshMaterialRenderer.d.ts.map +1 -0
- package/dist/transmissionVolumePbrWgpuMeshMaterialRenderer.js +74 -0
- package/dist/transmissionVolumePbrWgpuMeshMaterialRenderer.js.map +1 -0
- package/dist/unlitWgpuMeshMaterialRenderer.d.ts +4 -0
- package/dist/unlitWgpuMeshMaterialRenderer.d.ts.map +1 -0
- package/dist/unlitWgpuMeshMaterialRenderer.js +57 -0
- package/dist/unlitWgpuMeshMaterialRenderer.js.map +1 -0
- package/dist/vertexColorWgpuMeshMaterialRenderer.d.ts +4 -0
- package/dist/vertexColorWgpuMeshMaterialRenderer.d.ts.map +1 -0
- package/dist/vertexColorWgpuMeshMaterialRenderer.js +55 -0
- package/dist/vertexColorWgpuMeshMaterialRenderer.js.map +1 -0
- package/dist/wgpuClassicPrelude.d.ts +8 -0
- package/dist/wgpuClassicPrelude.d.ts.map +1 -0
- package/dist/wgpuClassicPrelude.js +319 -0
- package/dist/wgpuClassicPrelude.js.map +1 -0
- package/dist/wgpuCustomMaterialAbi.d.ts +3 -0
- package/dist/wgpuCustomMaterialAbi.d.ts.map +1 -0
- package/dist/wgpuCustomMaterialAbi.js +5 -0
- package/dist/wgpuCustomMaterialAbi.js.map +1 -0
- package/dist/wgpuDebugPrelude.d.ts +7 -0
- package/dist/wgpuDebugPrelude.d.ts.map +1 -0
- package/dist/wgpuDebugPrelude.js +133 -0
- package/dist/wgpuDebugPrelude.js.map +1 -0
- package/dist/wgpuEnvironmentCube.d.ts +4 -0
- package/dist/wgpuEnvironmentCube.d.ts.map +1 -0
- package/dist/wgpuEnvironmentCube.js +66 -0
- package/dist/wgpuEnvironmentCube.js.map +1 -0
- package/dist/wgpuEnvironmentIblBake.d.ts +4 -0
- package/dist/wgpuEnvironmentIblBake.d.ts.map +1 -0
- package/dist/wgpuEnvironmentIblBake.js +458 -0
- package/dist/wgpuEnvironmentIblBake.js.map +1 -0
- package/dist/wgpuEnvironmentSkybox.d.ts +3 -0
- package/dist/wgpuEnvironmentSkybox.d.ts.map +1 -0
- package/dist/wgpuEnvironmentSkybox.js +159 -0
- package/dist/wgpuEnvironmentSkybox.js.map +1 -0
- package/dist/wgpuMatcapPrelude.d.ts +7 -0
- package/dist/wgpuMatcapPrelude.d.ts.map +1 -0
- package/dist/wgpuMatcapPrelude.js +134 -0
- package/dist/wgpuMatcapPrelude.js.map +1 -0
- package/dist/wgpuMeshMaterialRegistry.d.ts +5 -0
- package/dist/wgpuMeshMaterialRegistry.d.ts.map +1 -0
- package/dist/wgpuMeshMaterialRegistry.js +29 -0
- package/dist/wgpuMeshMaterialRegistry.js.map +1 -0
- package/dist/wgpuMeshPipeline.d.ts +43 -0
- package/dist/wgpuMeshPipeline.d.ts.map +1 -0
- package/dist/wgpuMeshPipeline.js +1007 -0
- package/dist/wgpuMeshPipeline.js.map +1 -0
- package/dist/wgpuMeshUpload.d.ts +3 -0
- package/dist/wgpuMeshUpload.d.ts.map +1 -0
- package/dist/wgpuMeshUpload.js +58 -0
- package/dist/wgpuMeshUpload.js.map +1 -0
- package/dist/wgpuParticleEmitter3D.d.ts +4 -0
- package/dist/wgpuParticleEmitter3D.d.ts.map +1 -0
- package/dist/wgpuParticleEmitter3D.js +403 -0
- package/dist/wgpuParticleEmitter3D.js.map +1 -0
- package/dist/wgpuPbrPipelineCache.d.ts +4 -0
- package/dist/wgpuPbrPipelineCache.d.ts.map +1 -0
- package/dist/wgpuPbrPipelineCache.js +52 -0
- package/dist/wgpuPbrPipelineCache.js.map +1 -0
- package/dist/wgpuPbrPrelude.d.ts +7 -0
- package/dist/wgpuPbrPrelude.d.ts.map +1 -0
- package/dist/wgpuPbrPrelude.js +551 -0
- package/dist/wgpuPbrPrelude.js.map +1 -0
- package/dist/wgpuScene3DRuntime.d.ts +5 -0
- package/dist/wgpuScene3DRuntime.d.ts.map +1 -0
- package/dist/wgpuScene3DRuntime.js +81 -0
- package/dist/wgpuScene3DRuntime.js.map +1 -0
- package/dist/wgpuScene3DTestHelper.d.ts +14 -0
- package/dist/wgpuScene3DTestHelper.d.ts.map +1 -0
- package/dist/wgpuScene3DTestHelper.js +121 -0
- package/dist/wgpuScene3DTestHelper.js.map +1 -0
- package/dist/wgpuScene3DTime.d.ts +4 -0
- package/dist/wgpuScene3DTime.d.ts.map +1 -0
- package/dist/wgpuScene3DTime.js +11 -0
- package/dist/wgpuScene3DTime.js.map +1 -0
- package/dist/wgpuShadedModifierSnippet.d.ts +4 -0
- package/dist/wgpuShadedModifierSnippet.d.ts.map +1 -0
- package/dist/wgpuShadedModifierSnippet.js +18 -0
- package/dist/wgpuShadedModifierSnippet.js.map +1 -0
- package/dist/wgpuShadedPrelude.d.ts +16 -0
- package/dist/wgpuShadedPrelude.d.ts.map +1 -0
- package/dist/wgpuShadedPrelude.js +625 -0
- package/dist/wgpuShadedPrelude.js.map +1 -0
- package/dist/wgpuShadowMap.d.ts +4 -0
- package/dist/wgpuShadowMap.d.ts.map +1 -0
- package/dist/wgpuShadowMap.js +155 -0
- package/dist/wgpuShadowMap.js.map +1 -0
- package/dist/wgpuSkinPalette.d.ts +7 -0
- package/dist/wgpuSkinPalette.d.ts.map +1 -0
- package/dist/wgpuSkinPalette.js +173 -0
- package/dist/wgpuSkinPalette.js.map +1 -0
- package/dist/wgpuToonPrelude.d.ts +8 -0
- package/dist/wgpuToonPrelude.d.ts.map +1 -0
- package/dist/wgpuToonPrelude.js +192 -0
- package/dist/wgpuToonPrelude.js.map +1 -0
- package/dist/wgpuUnlitPrelude.d.ts +9 -0
- package/dist/wgpuUnlitPrelude.d.ts.map +1 -0
- package/dist/wgpuUnlitPrelude.js +142 -0
- package/dist/wgpuUnlitPrelude.js.map +1 -0
- package/dist/wgpuWireframePrelude.d.ts +6 -0
- package/dist/wgpuWireframePrelude.d.ts.map +1 -0
- package/dist/wgpuWireframePrelude.js +77 -0
- package/dist/wgpuWireframePrelude.js.map +1 -0
- package/dist/wgpuWireframeUpload.d.ts +3 -0
- package/dist/wgpuWireframeUpload.d.ts.map +1 -0
- package/dist/wgpuWireframeUpload.js +68 -0
- package/dist/wgpuWireframeUpload.js.map +1 -0
- package/dist/wireframeWgpuMeshMaterialRenderer.d.ts +4 -0
- package/dist/wireframeWgpuMeshMaterialRenderer.d.ts.map +1 -0
- package/dist/wireframeWgpuMeshMaterialRenderer.js +69 -0
- package/dist/wireframeWgpuMeshMaterialRenderer.js.map +1 -0
- package/package.json +57 -0
- package/src/anisotropyPbrWgpuMeshMaterialRenderer.test.ts +90 -0
- package/src/blinnPhongWgpuMeshMaterialRenderer.test.ts +82 -0
- package/src/clearcoatPbrWgpuMeshMaterialRenderer.test.ts +90 -0
- package/src/customShaderWgpuMeshMaterialRenderer.test.ts +207 -0
- package/src/depthWgpuMeshMaterialRenderer.test.ts +69 -0
- package/src/drawWgpuScene3D.test.ts +247 -0
- package/src/emissiveWgpuMeshMaterialRenderer.test.ts +64 -0
- package/src/enableWgpuScene3DCustomShaderGuards.test.ts +73 -0
- package/src/enableWgpuScene3DForwardLightSelectionGuards.test.ts +39 -0
- package/src/explainWgpuScene3DForwardLightSelection.test.ts +15 -0
- package/src/iridescencePbrWgpuMeshMaterialRenderer.test.ts +90 -0
- package/src/lambertWgpuMeshMaterialRenderer.test.ts +77 -0
- package/src/matcapWgpuMeshMaterialRenderer.test.ts +69 -0
- package/src/normalWgpuMeshMaterialRenderer.test.ts +69 -0
- package/src/phongWgpuMeshMaterialRenderer.test.ts +79 -0
- package/src/prepareWgpuScene3DForwardLights.test.ts +84 -0
- package/src/registerStandardPbrWgpuMaterial.test.ts +15 -0
- package/src/shadedWgpuMeshMaterialRenderer.test.ts +63 -0
- package/src/sheenPbrWgpuMeshMaterialRenderer.test.ts +87 -0
- package/src/specularGlossinessPbrWgpuMeshMaterialRenderer.test.ts +100 -0
- package/src/specularPbrWgpuMeshMaterialRenderer.test.ts +90 -0
- package/src/standardPbrWgpuMeshMaterialRenderer.test.ts +172 -0
- package/src/subsurfacePbrWgpuMeshMaterialRenderer.test.ts +90 -0
- package/src/toonWgpuMeshMaterialRenderer.test.ts +89 -0
- package/src/transmissionVolumePbrWgpuMeshMaterialRenderer.test.ts +97 -0
- package/src/unlitWgpuMeshMaterialRenderer.test.ts +94 -0
- package/src/vertexColorWgpuMeshMaterialRenderer.test.ts +62 -0
- package/src/wgpuClassicPrelude.test.ts +176 -0
- package/src/wgpuDebugPrelude.test.ts +79 -0
- package/src/wgpuEnvironmentCube.test.ts +86 -0
- package/src/wgpuEnvironmentIblBake.test.ts +79 -0
- package/src/wgpuEnvironmentSkybox.test.ts +56 -0
- package/src/wgpuMatcapPrelude.test.ts +70 -0
- package/src/wgpuMeshMaterialRegistry.test.ts +55 -0
- package/src/wgpuMeshPipeline.test.ts +844 -0
- package/src/wgpuMeshUpload.test.ts +177 -0
- package/src/wgpuParticleEmitter3D.test.ts +200 -0
- package/src/wgpuPbrPipelineCache.test.ts +67 -0
- package/src/wgpuPbrPrelude.test.ts +162 -0
- package/src/wgpuScene3DRuntime.test.ts +35 -0
- package/src/wgpuScene3DTime.test.ts +20 -0
- package/src/wgpuShadedModifierSnippet.test.ts +33 -0
- package/src/wgpuShadedPrelude.test.ts +394 -0
- package/src/wgpuShadowMap.test.ts +169 -0
- package/src/wgpuSkinPalette.test.ts +88 -0
- package/src/wgpuToonPrelude.test.ts +93 -0
- package/src/wgpuUnlitPrelude.test.ts +102 -0
- package/src/wgpuWireframePrelude.test.ts +54 -0
- package/src/wgpuWireframeUpload.test.ts +36 -0
- package/src/wireframeWgpuMeshMaterialRenderer.test.ts +69 -0
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import { unpackColorToLinear } from '@flighthq/color';
|
|
2
|
+
import { getWgpuRenderStateRuntime } from '@flighthq/render-wgpu';
|
|
3
|
+
import { SpecularGlossinessPbrMaterialKind } from '@flighthq/types';
|
|
4
|
+
import { buildWgpuPbrStandardDefineKey, ensureWgpuPbrMaterialBindGroup, getWgpuPbrMaterialScratch, writeWgpuPbrMaterialUniform, writeWgpuPbrStandardBlock, } from './standardPbrWgpuMeshMaterialRenderer';
|
|
5
|
+
import { registerWgpuMeshMaterialRenderer } from './wgpuMeshMaterialRegistry';
|
|
6
|
+
import { beginWgpuMeshDraw, drawWgpuMeshSubset, writeWgpuFrameUniform } from './wgpuMeshPipeline';
|
|
7
|
+
import { ensureWgpuPbrPipeline } from './wgpuPbrPipelineCache';
|
|
8
|
+
// The built-in SpecularGlossiness forward-lit mesh-material renderer (legacy KHR_materials_
|
|
9
|
+
// pbrSpecularGlossiness workflow) — the WGSL mirror of specularGlossinessPbrGlMeshMaterialRenderer.
|
|
10
|
+
// There is no spec-gloss path in the shader: this renderer converts the material to a
|
|
11
|
+
// StandardPbrMaterialProperties block on the CPU at bind time and drives the SAME base PBR program (no
|
|
12
|
+
// extension flag), so spec-gloss assets render through the one metallic-roughness uber-shader.
|
|
13
|
+
//
|
|
14
|
+
// CONVERSION (Khronos glTF spec-gloss → metallic-roughness):
|
|
15
|
+
// - roughness = 1 - glossiness (glossiness is the inverse of roughness)
|
|
16
|
+
// - metallic = solveMetallic(diffuseBrightness, specularBrightness): the quadratic that recovers
|
|
17
|
+
// the metallic factor from how far the specular reflectance sits above the 0.04
|
|
18
|
+
// dielectric floor. Fully dielectric specular → 0; albedo-bright specular → 1.
|
|
19
|
+
// - baseColor = lerp from the dielectric estimate (diffuse / (1 - 0.04)) toward the specular color
|
|
20
|
+
// by metallic, so a dielectric keeps its diffuse albedo and a conductor takes its
|
|
21
|
+
// specular tint as F0.
|
|
22
|
+
// The conversion is an approximation — spec-gloss can express specular tints a single metallic-
|
|
23
|
+
// roughness baseColor cannot reproduce exactly — but it matches the reference converter and is stable
|
|
24
|
+
// for typical assets. The specularGlossinessMap is NOT remapped to a metallic-roughness map here
|
|
25
|
+
// (different packing) and maps are not sampled on wgpu yet regardless; only the scalar conversion is
|
|
26
|
+
// applied, while diffuse/emissive/normal/occlusion maps pass straight through to the standard block
|
|
27
|
+
// (reserved, NOT sampled on wgpu yet — maps deferred).
|
|
28
|
+
//
|
|
29
|
+
// Colors are decoded to linear on the CPU before the conversion math; the converted standard block
|
|
30
|
+
// re-packs baseColor/emissive to RGBA8 so writeWgpuPbrStandardBlock's CPU decode round-trips. See
|
|
31
|
+
// registerSpecularGlossinessPbrWgpuMaterial.
|
|
32
|
+
export const specularGlossinessPbrWgpuMeshMaterialRenderer = {
|
|
33
|
+
bind(state, material, lights, camera) {
|
|
34
|
+
const stateRuntime = getWgpuRenderStateRuntime(state);
|
|
35
|
+
const pass = stateRuntime.renderPass;
|
|
36
|
+
if (pass === null)
|
|
37
|
+
return;
|
|
38
|
+
const specGloss = material;
|
|
39
|
+
const standard = specGloss !== null ? convertSpecularGlossinessToStandard(specGloss) : null;
|
|
40
|
+
const key = buildWgpuPbrStandardDefineKey(standard, specGloss);
|
|
41
|
+
const format = stateRuntime.currentColorFormat ?? state.format;
|
|
42
|
+
const pipeline = ensureWgpuPbrPipeline(state, key, format);
|
|
43
|
+
writeWgpuFrameUniform(state, camera, lights);
|
|
44
|
+
const binding = ensureWgpuPbrMaterialBindGroup(state, pipeline, specGloss ?? FALLBACK_MATERIAL, standard);
|
|
45
|
+
const out = getWgpuPbrMaterialScratch();
|
|
46
|
+
writeWgpuPbrStandardBlock(out, standard, specGloss !== null ? specGloss.alphaCutoff : 0.5);
|
|
47
|
+
out.fill(0, 16);
|
|
48
|
+
writeWgpuPbrMaterialUniform(state, binding);
|
|
49
|
+
beginWgpuMeshDraw(state, pipeline);
|
|
50
|
+
pass.setBindGroup(2, binding.bindGroup);
|
|
51
|
+
},
|
|
52
|
+
draw(state, proxy, geometry) {
|
|
53
|
+
drawWgpuMeshSubset(state, proxy, geometry);
|
|
54
|
+
},
|
|
55
|
+
};
|
|
56
|
+
// Installs the built-in SpecularGlossiness renderer for SpecularGlossinessPbrMaterialKind on this
|
|
57
|
+
// state. Opt-in (no top-level side effect): drawScene3D only draws SpecularGlossiness subsets once this
|
|
58
|
+
// is called.
|
|
59
|
+
export function registerSpecularGlossinessPbrWgpuMaterial(state) {
|
|
60
|
+
registerWgpuMeshMaterialRenderer(state, SpecularGlossinessPbrMaterialKind, specularGlossinessPbrWgpuMeshMaterialRenderer);
|
|
61
|
+
}
|
|
62
|
+
// Builds a StandardPbrMaterialProperties block from a spec-gloss material via the Khronos reference
|
|
63
|
+
// conversion. Writes a packed RGBA baseColor/emissive (writeWgpuPbrStandardBlock re-decodes them), so
|
|
64
|
+
// the downstream standard-block path stays identical to a native StandardPbr material. The returned
|
|
65
|
+
// object is a fresh per-bind block (not pooled) — bind is not a hot inner loop, and reusing a scratch
|
|
66
|
+
// block would alias across draws. Mirrors scene-gl's convertSpecularGlossinessToStandard.
|
|
67
|
+
function convertSpecularGlossinessToStandard(material) {
|
|
68
|
+
unpackColorToLinear(_diffuseScratch, material.diffuse);
|
|
69
|
+
unpackColorToLinear(_specularScratch, material.specular);
|
|
70
|
+
const specularBrightness = Math.max(_specularScratch[0], _specularScratch[1], _specularScratch[2]);
|
|
71
|
+
const oneMinusSpecularStrength = 1 - specularBrightness;
|
|
72
|
+
const diffuseBrightness = Math.max(_diffuseScratch[0], _diffuseScratch[1], _diffuseScratch[2]);
|
|
73
|
+
const metallic = solveMetallic(diffuseBrightness, specularBrightness, oneMinusSpecularStrength);
|
|
74
|
+
// baseColor: blend the dielectric diffuse estimate and the specular tint by metallic, per the
|
|
75
|
+
// reference converter, then re-pack to RGBA8 for the standard block to decode.
|
|
76
|
+
const denom = Math.max(1 - DIELECTRIC_SPECULAR, 1e-4);
|
|
77
|
+
const r = lerp((_diffuseScratch[0] * oneMinusSpecularStrength) / denom, _specularScratch[0], metallic);
|
|
78
|
+
const g = lerp((_diffuseScratch[1] * oneMinusSpecularStrength) / denom, _specularScratch[1], metallic);
|
|
79
|
+
const b = lerp((_diffuseScratch[2] * oneMinusSpecularStrength) / denom, _specularScratch[2], metallic);
|
|
80
|
+
return {
|
|
81
|
+
alphaMap: null,
|
|
82
|
+
baseColor: packLinearRgba(r, g, b, _diffuseScratch[3]),
|
|
83
|
+
baseColorMap: material.diffuseMap,
|
|
84
|
+
emissive: material.emissive,
|
|
85
|
+
emissiveMap: material.emissiveMap,
|
|
86
|
+
emissiveStrength: material.emissiveStrength,
|
|
87
|
+
metallic,
|
|
88
|
+
metallicRoughnessMap: null,
|
|
89
|
+
normalMap: material.normalMap,
|
|
90
|
+
normalScale: material.normalScale,
|
|
91
|
+
occlusionMap: material.occlusionMap,
|
|
92
|
+
occlusionStrength: material.occlusionStrength,
|
|
93
|
+
roughness: 1 - material.glossiness,
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
function lerp(a, b, t) {
|
|
97
|
+
return a + (b - a) * t;
|
|
98
|
+
}
|
|
99
|
+
// Re-encodes a linear RGBA color (components in [0,1]) back to a packed 0xRRGGBBAA integer with the
|
|
100
|
+
// sRgb transfer, the inverse of unpackColorToLinear, so the standard block's CPU decode round-trips.
|
|
101
|
+
function packLinearRgba(r, g, b, a) {
|
|
102
|
+
const toByte = (linear) => {
|
|
103
|
+
const clamped = Math.min(Math.max(linear, 0), 1);
|
|
104
|
+
const srgb = clamped <= 0.0031308 ? clamped * 12.92 : 1.055 * Math.pow(clamped, 1 / 2.4) - 0.055;
|
|
105
|
+
return Math.round(srgb * 255) & 0xff;
|
|
106
|
+
};
|
|
107
|
+
const alpha = Math.round(Math.min(Math.max(a, 0), 1) * 255) & 0xff;
|
|
108
|
+
return ((toByte(r) << 24) | (toByte(g) << 16) | (toByte(b) << 8) | alpha) >>> 0;
|
|
109
|
+
}
|
|
110
|
+
// The Khronos spec-gloss → metallic solver: recovers the metallic factor from the diffuse and specular
|
|
111
|
+
// reflectances by solving the quadratic that the metallic-roughness F0 model implies. Below the 0.04
|
|
112
|
+
// dielectric floor the surface is fully dielectric (metallic 0).
|
|
113
|
+
function solveMetallic(diffuse, specular, oneMinusSpecularStrength) {
|
|
114
|
+
if (specular < DIELECTRIC_SPECULAR)
|
|
115
|
+
return 0;
|
|
116
|
+
const a = DIELECTRIC_SPECULAR;
|
|
117
|
+
const b = (diffuse * oneMinusSpecularStrength) / (1 - DIELECTRIC_SPECULAR) + specular - 2 * DIELECTRIC_SPECULAR;
|
|
118
|
+
const c = DIELECTRIC_SPECULAR - specular;
|
|
119
|
+
const discriminant = Math.max(b * b - 4 * a * c, 0);
|
|
120
|
+
return Math.min(Math.max((-b + Math.sqrt(discriminant)) / (2 * a), 0), 1);
|
|
121
|
+
}
|
|
122
|
+
const DIELECTRIC_SPECULAR = 0.04;
|
|
123
|
+
const FALLBACK_MATERIAL = {};
|
|
124
|
+
const _diffuseScratch = [0, 0, 0, 0];
|
|
125
|
+
const _specularScratch = [0, 0, 0, 0];
|
|
126
|
+
//# sourceMappingURL=specularGlossinessPbrWgpuMeshMaterialRenderer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"specularGlossinessPbrWgpuMeshMaterialRenderer.js","sourceRoot":"","sources":["../src/specularGlossinessPbrWgpuMeshMaterialRenderer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { WgpuMeshMaterialRenderer, WgpuRenderState } from '@flighthq/types';
|
|
2
|
+
export declare const specularPbrWgpuMeshMaterialRenderer: WgpuMeshMaterialRenderer;
|
|
3
|
+
export declare function registerSpecularPbrWgpuMaterial(state: WgpuRenderState): void;
|
|
4
|
+
//# sourceMappingURL=specularPbrWgpuMeshMaterialRenderer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"specularPbrWgpuMeshMaterialRenderer.d.ts","sourceRoot":"","sources":["../src/specularPbrWgpuMeshMaterialRenderer.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAQV,wBAAwB,EACxB,eAAe,EAChB,MAAM,iBAAiB,CAAC;AAyBzB,eAAO,MAAM,mCAAmC,EAAE,wBA6CjD,CAAC;AAIF,wBAAgB,+BAA+B,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI,CAE5E"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { unpackColorToLinear } from '@flighthq/color';
|
|
2
|
+
import { getWgpuRenderStateRuntime } from '@flighthq/render-wgpu';
|
|
3
|
+
import { SpecularPbrMaterialKind } from '@flighthq/types';
|
|
4
|
+
import { buildWgpuPbrStandardDefineKey, ensureWgpuPbrMaterialBindGroup, getWgpuPbrMaterialScratch, writeWgpuPbrMaterialUniform, writeWgpuPbrStandardBlock, } from './standardPbrWgpuMeshMaterialRenderer';
|
|
5
|
+
import { registerWgpuMeshMaterialRenderer } from './wgpuMeshMaterialRegistry';
|
|
6
|
+
import { beginWgpuMeshDraw, drawWgpuMeshSubset, writeWgpuFrameUniform } from './wgpuMeshPipeline';
|
|
7
|
+
import { ensureWgpuPbrPipeline } from './wgpuPbrPipelineCache';
|
|
8
|
+
// The built-in Specular (KHR_materials_specular) forward-lit mesh-material renderer — the WGSL mirror
|
|
9
|
+
// of specularPbrGlMeshMaterialRenderer. This extension gives independent control of a dielectric's
|
|
10
|
+
// specular reflection: `specular` scales the base reflectance and `specularColor` tints F0, letting a
|
|
11
|
+
// surface be more or less reflective than the fixed 0.04 dielectric default without changing its diffuse
|
|
12
|
+
// albedo (metals keep their albedo-tinted F0). The shader recomputes F0 = mix(min(0.04 * specularColor,
|
|
13
|
+
// 1) * specular, albedo, metallic) behind `const SPECULAR_EXT`. bind builds the standard define key from
|
|
14
|
+
// `material.standard` + the surface trailer, sets the SPECULAR_EXT flag, selects/compiles that pipeline
|
|
15
|
+
// variant for the current color format, writes the shared Frame uniform, then writes the base block +
|
|
16
|
+
// the specular scale / linear-decoded specularColor into the one MaterialBlock uniform and binds it at
|
|
17
|
+
// group(2). The specular strength/color maps are reserved but NOT sampled on wgpu yet (maps deferred).
|
|
18
|
+
// See registerSpecularPbrWgpuMaterial.
|
|
19
|
+
export const specularPbrWgpuMeshMaterialRenderer = {
|
|
20
|
+
bind(state, material, lights, camera) {
|
|
21
|
+
const stateRuntime = getWgpuRenderStateRuntime(state);
|
|
22
|
+
const pass = stateRuntime.renderPass;
|
|
23
|
+
if (pass === null)
|
|
24
|
+
return;
|
|
25
|
+
const specular = material;
|
|
26
|
+
const standard = specular !== null ? specular.standard : null;
|
|
27
|
+
const key = buildWgpuPbrStandardDefineKey(standard, specular);
|
|
28
|
+
key.specularEnabled = true;
|
|
29
|
+
const format = stateRuntime.currentColorFormat ?? state.format;
|
|
30
|
+
const pipeline = ensureWgpuPbrPipeline(state, key, format);
|
|
31
|
+
writeWgpuFrameUniform(state, camera, lights);
|
|
32
|
+
const binding = ensureWgpuPbrMaterialBindGroup(state, pipeline, specular ?? FALLBACK_MATERIAL, standard);
|
|
33
|
+
const out = getWgpuPbrMaterialScratch();
|
|
34
|
+
writeWgpuPbrStandardBlock(out, standard, specular !== null ? specular.alphaCutoff : 0.5);
|
|
35
|
+
out.fill(0, 16);
|
|
36
|
+
// specular group (floats 32..35): specular scale, specularColor.rgb (linear).
|
|
37
|
+
if (specular !== null) {
|
|
38
|
+
unpackColorToLinear(_colorScratch, specular.specularColor);
|
|
39
|
+
out[32] = specular.specular;
|
|
40
|
+
out[33] = _colorScratch[0];
|
|
41
|
+
out[34] = _colorScratch[1];
|
|
42
|
+
out[35] = _colorScratch[2];
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
out[32] = 1;
|
|
46
|
+
out[33] = 1;
|
|
47
|
+
out[34] = 1;
|
|
48
|
+
out[35] = 1;
|
|
49
|
+
}
|
|
50
|
+
writeWgpuPbrMaterialUniform(state, binding);
|
|
51
|
+
beginWgpuMeshDraw(state, pipeline);
|
|
52
|
+
pass.setBindGroup(2, binding.bindGroup);
|
|
53
|
+
},
|
|
54
|
+
draw(state, proxy, geometry) {
|
|
55
|
+
drawWgpuMeshSubset(state, proxy, geometry);
|
|
56
|
+
},
|
|
57
|
+
};
|
|
58
|
+
// Installs the built-in Specular renderer for SpecularPbrMaterialKind on this state. Opt-in (no
|
|
59
|
+
// top-level side effect): drawScene3D only draws Specular subsets once this is called.
|
|
60
|
+
export function registerSpecularPbrWgpuMaterial(state) {
|
|
61
|
+
registerWgpuMeshMaterialRenderer(state, SpecularPbrMaterialKind, specularPbrWgpuMeshMaterialRenderer);
|
|
62
|
+
}
|
|
63
|
+
const FALLBACK_MATERIAL = {};
|
|
64
|
+
const _colorScratch = [0, 0, 0, 0];
|
|
65
|
+
//# sourceMappingURL=specularPbrWgpuMeshMaterialRenderer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"specularPbrWgpuMeshMaterialRenderer.js","sourceRoot":"","sources":["../src/specularPbrWgpuMeshMaterialRenderer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { StandardPbrMaterialProperties, SurfaceMaterial, WgpuMeshMaterialRenderer, WgpuRenderState, WgpuPbrPipeline, WgpuPbrDefineKey, WgpuMaterialBinding } from '@flighthq/types';
|
|
2
|
+
export declare const WGPU_PBR_MATERIAL_UNIFORM_FLOATS = 48;
|
|
3
|
+
export declare function buildWgpuPbrStandardDefineKey(standard: Readonly<StandardPbrMaterialProperties> | null, surface: Readonly<SurfaceMaterial> | null): WgpuPbrDefineKey;
|
|
4
|
+
export declare function ensureWgpuPbrMaterialBindGroup(state: WgpuRenderState, pipeline: Readonly<WgpuPbrPipeline>, key: object, standard: Readonly<StandardPbrMaterialProperties> | null): WgpuMaterialBinding;
|
|
5
|
+
export declare function getWgpuPbrMaterialScratch(): Float32Array;
|
|
6
|
+
export declare function writeWgpuPbrMaterialUniform(state: WgpuRenderState, binding: Readonly<WgpuMaterialBinding>): void;
|
|
7
|
+
export declare function writeWgpuPbrStandardBlock(out: Float32Array, standard: Readonly<StandardPbrMaterialProperties> | null, alphaCutoff: number): void;
|
|
8
|
+
export declare const standardPbrWgpuMeshMaterialRenderer: WgpuMeshMaterialRenderer;
|
|
9
|
+
//# sourceMappingURL=standardPbrWgpuMeshMaterialRenderer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"standardPbrWgpuMeshMaterialRenderer.d.ts","sourceRoot":"","sources":["../src/standardPbrWgpuMeshMaterialRenderer.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAQV,6BAA6B,EAC7B,eAAe,EACf,wBAAwB,EACxB,eAAe,EACf,eAAe,EACf,gBAAgB,EAChB,mBAAmB,EACpB,MAAM,iBAAiB,CAAC;AAiBzB,eAAO,MAAM,gCAAgC,KAAK,CAAC;AAQnD,wBAAgB,6BAA6B,CAC3C,QAAQ,EAAE,QAAQ,CAAC,6BAA6B,CAAC,GAAG,IAAI,EACxD,OAAO,EAAE,QAAQ,CAAC,eAAe,CAAC,GAAG,IAAI,GACxC,gBAAgB,CAoBlB;AAWD,wBAAgB,8BAA8B,CAC5C,KAAK,EAAE,eAAe,EACtB,QAAQ,EAAE,QAAQ,CAAC,eAAe,CAAC,EACnC,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,QAAQ,CAAC,6BAA6B,CAAC,GAAG,IAAI,GACvD,mBAAmB,CA8BrB;AAMD,wBAAgB,yBAAyB,IAAI,YAAY,CAExD;AAID,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,eAAe,EAAE,OAAO,EAAE,QAAQ,CAAC,mBAAmB,CAAC,GAAG,IAAI,CAEhH;AAQD,wBAAgB,yBAAyB,CACvC,GAAG,EAAE,YAAY,EACjB,QAAQ,EAAE,QAAQ,CAAC,6BAA6B,CAAC,GAAG,IAAI,EACxD,WAAW,EAAE,MAAM,GAClB,IAAI,CA2CN;AAkBD,eAAO,MAAM,mCAAmC,EAAE,wBA4BjD,CAAC"}
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
import { unpackColorToLinear } from '@flighthq/color';
|
|
2
|
+
import { getWgpuRenderStateRuntime } from '@flighthq/render-wgpu';
|
|
3
|
+
import { beginWgpuMeshDraw, drawWgpuMeshSubset, ensureWgpuPerMapMaterialBinding, getWgpuMaterialSampler, isWgpuTextureReady, resolveWgpuMaterialTextureView, stashWgpuUvTransform, writeWgpuFrameUniform, } from './wgpuMeshPipeline';
|
|
4
|
+
import { ensureWgpuPbrPipeline } from './wgpuPbrPipelineCache';
|
|
5
|
+
// The Material uniform float count (MaterialBlock = 48 floats / 192 bytes). Exported so the extension
|
|
6
|
+
// renderers, which write extension factors into the shared scratch through the helpers here, agree on
|
|
7
|
+
// the buffer size when they allocate + write their material bind groups.
|
|
8
|
+
export const WGPU_PBR_MATERIAL_UNIFORM_FLOATS = 48;
|
|
9
|
+
// The shared define key for a PBR material: the alpha-mask cutoff + double-sidedness from the surface
|
|
10
|
+
// trailer, the five standard `has*Map` flags derived from the material's bound maps, and every extension
|
|
11
|
+
// flag false. StandardPbr passes its own properties (it is a StandardPbrMaterialProperties) as `standard`;
|
|
12
|
+
// each extension renderer passes its `material.standard` + surface trailer and then sets exactly one
|
|
13
|
+
// extension flag. Keeps the one place that decides the standard flags so the compiled variant and the
|
|
14
|
+
// bound resources never disagree. Mirrors scene-gl's buildGlPbrStandardDefineKey.
|
|
15
|
+
export function buildWgpuPbrStandardDefineKey(standard, surface) {
|
|
16
|
+
return {
|
|
17
|
+
alphaMaskEnabled: surface !== null && surface.alphaMode === 'mask',
|
|
18
|
+
anisotropyEnabled: false,
|
|
19
|
+
clearcoatEnabled: false,
|
|
20
|
+
doubleSided: surface !== null && surface.doubleSided,
|
|
21
|
+
// Opaque materials ignore coverage (SurfaceMaterial contract) — only 'mask'/'blend' sample the map.
|
|
22
|
+
hasAlphaMap: surface !== null && surface.alphaMode !== 'opaque' && standard !== null && isWgpuTextureReady(standard.alphaMap),
|
|
23
|
+
hasBaseColorMap: standard !== null && isWgpuTextureReady(standard.baseColorMap),
|
|
24
|
+
hasEmissiveMap: standard !== null && isWgpuTextureReady(standard.emissiveMap),
|
|
25
|
+
hasMetallicRoughnessMap: standard !== null && isWgpuTextureReady(standard.metallicRoughnessMap),
|
|
26
|
+
hasNormalMap: standard !== null && isWgpuTextureReady(standard.normalMap),
|
|
27
|
+
hasOcclusionMap: standard !== null && isWgpuTextureReady(standard.occlusionMap),
|
|
28
|
+
iridescenceEnabled: false,
|
|
29
|
+
sheenEnabled: false,
|
|
30
|
+
specularEnabled: false,
|
|
31
|
+
subsurfaceEnabled: false,
|
|
32
|
+
transmissionEnabled: false,
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
// Allocates (once per material reference) the Material uniform buffer + bind group for a PBR material
|
|
36
|
+
// and binds the material's five standard maps (base color, metallic-roughness, normal, occlusion,
|
|
37
|
+
// emissive) into the map slots — each resolved to its real uploaded view, or the shared 1x1 placeholder
|
|
38
|
+
// when the slot is unbound, so the layout is satisfied either way. The same path serves StandardPbr and
|
|
39
|
+
// every extension — the extension factors ride in the one MaterialBlock uniform, so no extra bindings
|
|
40
|
+
// are needed. The caller writes `material` (a fresh per-call key for the WeakMap, or the FALLBACK key
|
|
41
|
+
// for a null material) into the scratch and uploads it before this returns. The bind group is cached by
|
|
42
|
+
// `key`; the resolved views are captured at creation, so a static textured material binds its maps once.
|
|
43
|
+
// Returns the bind group to set at group(2).
|
|
44
|
+
export function ensureWgpuPbrMaterialBindGroup(state, pipeline, key, standard) {
|
|
45
|
+
const baseColorMap = standard !== null ? standard.baseColorMap : null;
|
|
46
|
+
// Re-resolve the primary (base-color) sampler + the six standard-block map views every bind (base-color,
|
|
47
|
+
// metallic-roughness, normal, occlusion, emissive, alpha) into a REUSED module scratch — no per-bind
|
|
48
|
+
// allocation — so ensureWgpuPerMapMaterialBinding can rebuild the bind group only when one differs.
|
|
49
|
+
// Each view is paired with its own cached sampler, matching GL's per-Texture sampler contract.
|
|
50
|
+
_samplerScratch[0] = getWgpuMaterialSampler(state, baseColorMap);
|
|
51
|
+
_samplerScratch[1] = getWgpuMaterialSampler(state, standard !== null ? standard.metallicRoughnessMap : null);
|
|
52
|
+
_samplerScratch[2] = getWgpuMaterialSampler(state, standard !== null ? standard.normalMap : null);
|
|
53
|
+
_samplerScratch[3] = getWgpuMaterialSampler(state, standard !== null ? standard.occlusionMap : null);
|
|
54
|
+
_samplerScratch[4] = getWgpuMaterialSampler(state, standard !== null ? standard.emissiveMap : null);
|
|
55
|
+
_samplerScratch[5] = getWgpuMaterialSampler(state, standard !== null ? standard.alphaMap : null);
|
|
56
|
+
_viewScratch[0] = resolveWgpuMaterialTextureView(state, baseColorMap);
|
|
57
|
+
_viewScratch[1] = resolveWgpuMaterialTextureView(state, standard !== null ? standard.metallicRoughnessMap : null);
|
|
58
|
+
_viewScratch[2] = resolveWgpuMaterialTextureView(state, standard !== null ? standard.normalMap : null);
|
|
59
|
+
_viewScratch[3] = resolveWgpuMaterialTextureView(state, standard !== null ? standard.occlusionMap : null);
|
|
60
|
+
_viewScratch[4] = resolveWgpuMaterialTextureView(state, standard !== null ? standard.emissiveMap : null);
|
|
61
|
+
_viewScratch[5] = resolveWgpuMaterialTextureView(state, standard !== null ? standard.alphaMap : null);
|
|
62
|
+
const binding = ensureWgpuPerMapMaterialBinding(state, key, pipeline.materialBindGroupLayout, WGPU_PBR_MATERIAL_UNIFORM_FLOATS * 4, _samplerScratch, _viewScratch);
|
|
63
|
+
// The base-color map's uv transform drives the shared vertex-scene2d uv every standard map samples.
|
|
64
|
+
// Runs every bind (standard + each extension routes through here), so the stash is always fresh.
|
|
65
|
+
stashWgpuUvTransform(state, standard !== null ? standard.baseColorMap : null);
|
|
66
|
+
return binding;
|
|
67
|
+
}
|
|
68
|
+
// Returns the shared MaterialBlock scratch the standard + extension packers write into. The extension
|
|
69
|
+
// renderers fill the base block via writeWgpuPbrStandardBlock and their own factors via index into the
|
|
70
|
+
// returned array, then upload it. Reused across binds (bind is not a hot inner loop, and one draw is
|
|
71
|
+
// recorded before the next bind overwrites it).
|
|
72
|
+
export function getWgpuPbrMaterialScratch() {
|
|
73
|
+
return _materialScratch;
|
|
74
|
+
}
|
|
75
|
+
// Writes the MaterialBlock scratch (192 bytes) into a material binding's uniform buffer. Call after
|
|
76
|
+
// writeWgpuPbrStandardBlock + any extension packer has filled the scratch.
|
|
77
|
+
export function writeWgpuPbrMaterialUniform(state, binding) {
|
|
78
|
+
state.device.queue.writeBuffer(binding.buffer, 0, _materialScratch.buffer, 0, WGPU_PBR_MATERIAL_UNIFORM_FLOATS * 4);
|
|
79
|
+
}
|
|
80
|
+
// Packs the StandardPbr base block (the first 16 floats of the MaterialBlock) into the shared material
|
|
81
|
+
// scratch: baseColor.rgba (linear), emissive.rgb*strength, factors (metallic, roughness, normalScale,
|
|
82
|
+
// occlusionStrength), flags (alphaCutoff, _, _, _). baseColor/emissive are sRgb-packed and converted to
|
|
83
|
+
// linear here so the shader stays in linear space. The extension factor slots (floats 16..47) are left
|
|
84
|
+
// to the caller (the extension packers) or zeroed by writeWgpuPbrMaterialBlock for StandardPbr. A null
|
|
85
|
+
// block uses neutral defaults (white, dielectric, fully rough). Mirrors scene-gl's bindGlPbrStandardBlock.
|
|
86
|
+
export function writeWgpuPbrStandardBlock(out, standard, alphaCutoff) {
|
|
87
|
+
if (standard === null) {
|
|
88
|
+
out[0] = 1;
|
|
89
|
+
out[1] = 1;
|
|
90
|
+
out[2] = 1;
|
|
91
|
+
out[3] = 1;
|
|
92
|
+
out[4] = 0;
|
|
93
|
+
out[5] = 0;
|
|
94
|
+
out[6] = 0;
|
|
95
|
+
out[7] = 0;
|
|
96
|
+
out[8] = 0;
|
|
97
|
+
out[9] = 1;
|
|
98
|
+
out[10] = 1;
|
|
99
|
+
out[11] = 1;
|
|
100
|
+
out[12] = alphaCutoff;
|
|
101
|
+
out[13] = 0;
|
|
102
|
+
out[14] = 0;
|
|
103
|
+
out[15] = 0;
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
unpackColorToLinear(_colorScratch, standard.baseColor);
|
|
107
|
+
out[0] = _colorScratch[0];
|
|
108
|
+
out[1] = _colorScratch[1];
|
|
109
|
+
out[2] = _colorScratch[2];
|
|
110
|
+
out[3] = _colorScratch[3];
|
|
111
|
+
unpackColorToLinear(_colorScratch, standard.emissive);
|
|
112
|
+
const strength = standard.emissiveStrength;
|
|
113
|
+
out[4] = _colorScratch[0] * strength;
|
|
114
|
+
out[5] = _colorScratch[1] * strength;
|
|
115
|
+
out[6] = _colorScratch[2] * strength;
|
|
116
|
+
out[7] = 0;
|
|
117
|
+
out[8] = standard.metallic;
|
|
118
|
+
out[9] = standard.roughness;
|
|
119
|
+
out[10] = standard.normalScale;
|
|
120
|
+
out[11] = standard.occlusionStrength;
|
|
121
|
+
out[12] = alphaCutoff;
|
|
122
|
+
out[13] = 0;
|
|
123
|
+
out[14] = 0;
|
|
124
|
+
out[15] = 0;
|
|
125
|
+
}
|
|
126
|
+
// The built-in StandardPbr forward-lit mesh-material renderer (WgpuMeshMaterialRenderer for
|
|
127
|
+
// StandardPbrMaterialKind) — the WGSL mirror of standardPbrGlMeshMaterialRenderer. bind selects the
|
|
128
|
+
// pipeline variant for the material's alpha mode / double-sidedness + the current color-attachment
|
|
129
|
+
// format (no extension flag), writes the shared Frame uniform (camera view-projection + position, the
|
|
130
|
+
// packed light block), binds the pipeline + Frame bind group (beginWgpuMeshDraw), then writes + binds
|
|
131
|
+
// the material's uniform/texture bind group at group(2). draw uploads the geometry's GPU buffers lazily
|
|
132
|
+
// (cached by geometry.version), writes the per-draw model + normal matrices into the render-state's
|
|
133
|
+
// uniform ring buffer (group(1), dynamic offset), and issues the indexed draw over the proxy's subset.
|
|
134
|
+
// Depth-test LESS + depth-write on and back-face culling (unless double-sided) are baked on the
|
|
135
|
+
// pipeline. The five standard maps (base color, metallic-roughness, normal, occlusion, emissive) are
|
|
136
|
+
// sampled when bound — the textured pipeline variant compiles per the `has*Map` flags and the real
|
|
137
|
+
// uploaded views bind into the map slots; an unbound slot falls back to the placeholder. See
|
|
138
|
+
// registerStandardPbrWgpuMaterial to install it.
|
|
139
|
+
//
|
|
140
|
+
// Cannot be visually captured in JSDOM (no GPU adapter); the unit test asserts the pipeline/bind/draw
|
|
141
|
+
// call shape against the mock device, mirrored against the verified GL result.
|
|
142
|
+
export const standardPbrWgpuMeshMaterialRenderer = {
|
|
143
|
+
bind(state, material, lights, camera) {
|
|
144
|
+
const stateRuntime = getWgpuRenderStateRuntime(state);
|
|
145
|
+
const pass = stateRuntime.renderPass;
|
|
146
|
+
if (pass === null)
|
|
147
|
+
return;
|
|
148
|
+
const pbr = material;
|
|
149
|
+
const format = stateRuntime.currentColorFormat ?? state.format;
|
|
150
|
+
const pipeline = ensureWgpuPbrPipeline(state, buildWgpuPbrStandardDefineKey(pbr, pbr), format);
|
|
151
|
+
writeWgpuFrameUniform(state, camera, lights);
|
|
152
|
+
const binding = ensureWgpuPbrMaterialBindGroup(state, pipeline, pbr ?? FALLBACK_MATERIAL, pbr);
|
|
153
|
+
writeWgpuPbrStandardBlock(_materialScratch, pbr, pbr !== null ? pbr.alphaCutoff : 0.5);
|
|
154
|
+
_materialScratch.fill(0, 16);
|
|
155
|
+
writeWgpuPbrMaterialUniform(state, binding);
|
|
156
|
+
beginWgpuMeshDraw(state, pipeline);
|
|
157
|
+
pass.setBindGroup(2, binding.bindGroup);
|
|
158
|
+
},
|
|
159
|
+
draw(state, proxy, geometry) {
|
|
160
|
+
drawWgpuMeshSubset(state, proxy, geometry);
|
|
161
|
+
},
|
|
162
|
+
};
|
|
163
|
+
// A StandardPbrMaterial-shaped stand-in used as the material-bind-group cache key when bind is called
|
|
164
|
+
// with a null material (the DefaultMaterialKind fallback). Plain neutral PBR defaults; only used for
|
|
165
|
+
// identity in the WeakMap.
|
|
166
|
+
const FALLBACK_MATERIAL = {};
|
|
167
|
+
const _colorScratch = [0, 0, 0, 0];
|
|
168
|
+
const _materialScratch = new Float32Array(WGPU_PBR_MATERIAL_UNIFORM_FLOATS);
|
|
169
|
+
const _samplerScratch = new Array(6);
|
|
170
|
+
// Reused per-bind resolved-view scratch (base-color, metallic-roughness, normal, occlusion, emissive,
|
|
171
|
+
// alpha) so a steady-state re-bind allocates nothing; ensureWgpuPerMapMaterialBinding copies it only on
|
|
172
|
+
// create/rebuild.
|
|
173
|
+
const _viewScratch = new Array(6);
|
|
174
|
+
//# sourceMappingURL=standardPbrWgpuMeshMaterialRenderer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"standardPbrWgpuMeshMaterialRenderer.js","sourceRoot":"","sources":["../src/standardPbrWgpuMeshMaterialRenderer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { WgpuMeshMaterialRenderer, WgpuRenderState } from '@flighthq/types';
|
|
2
|
+
export declare const subsurfacePbrWgpuMeshMaterialRenderer: WgpuMeshMaterialRenderer;
|
|
3
|
+
export declare function registerSubsurfacePbrWgpuMaterial(state: WgpuRenderState): void;
|
|
4
|
+
//# sourceMappingURL=subsurfacePbrWgpuMeshMaterialRenderer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subsurfacePbrWgpuMeshMaterialRenderer.d.ts","sourceRoot":"","sources":["../src/subsurfacePbrWgpuMeshMaterialRenderer.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAQV,wBAAwB,EACxB,eAAe,EAChB,MAAM,iBAAiB,CAAC;AA0BzB,eAAO,MAAM,qCAAqC,EAAE,wBA+CnD,CAAC;AAIF,wBAAgB,iCAAiC,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI,CAE9E"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { unpackColorToLinear } from '@flighthq/color';
|
|
2
|
+
import { getWgpuRenderStateRuntime } from '@flighthq/render-wgpu';
|
|
3
|
+
import { SubsurfacePbrMaterialKind } from '@flighthq/types';
|
|
4
|
+
import { buildWgpuPbrStandardDefineKey, ensureWgpuPbrMaterialBindGroup, getWgpuPbrMaterialScratch, writeWgpuPbrMaterialUniform, writeWgpuPbrStandardBlock, } from './standardPbrWgpuMeshMaterialRenderer';
|
|
5
|
+
import { registerWgpuMeshMaterialRenderer } from './wgpuMeshMaterialRegistry';
|
|
6
|
+
import { beginWgpuMeshDraw, drawWgpuMeshSubset, writeWgpuFrameUniform } from './wgpuMeshPipeline';
|
|
7
|
+
import { ensureWgpuPbrPipeline } from './wgpuPbrPipelineCache';
|
|
8
|
+
// The built-in Subsurface forward-lit mesh-material renderer (Flight extension; flagged non-interop —
|
|
9
|
+
// there is no glTF equivalent) — the WGSL mirror of subsurfacePbrGlMeshMaterialRenderer. It
|
|
10
|
+
// approximates subsurface scattering with a wrapped-diffuse term: light wrapping past the terminator
|
|
11
|
+
// re-emerges tinted by `subsurfaceColor`, scaled by `subsurface` strength and inversely by `thickness`
|
|
12
|
+
// (thinner material = more translucency). This is a cheap stand-in for true diffusion-profile SSS —
|
|
13
|
+
// plausible for skin, wax, marble, foliage at forward-pass cost — and lives behind `const SUBSURFACE` in
|
|
14
|
+
// the PBR uber-shader. bind builds the standard define key from `material.standard` + the surface
|
|
15
|
+
// trailer, sets the SUBSURFACE flag, selects/compiles that pipeline variant for the current color
|
|
16
|
+
// format, writes the shared Frame uniform, then writes the base block + the subsurface scalars /
|
|
17
|
+
// linear-decoded subsurfaceColor into the one MaterialBlock uniform and binds it at group(2). The
|
|
18
|
+
// subsurface/thickness maps are reserved but NOT sampled on wgpu yet (maps deferred). See
|
|
19
|
+
// registerSubsurfacePbrWgpuMaterial.
|
|
20
|
+
export const subsurfacePbrWgpuMeshMaterialRenderer = {
|
|
21
|
+
bind(state, material, lights, camera) {
|
|
22
|
+
const stateRuntime = getWgpuRenderStateRuntime(state);
|
|
23
|
+
const pass = stateRuntime.renderPass;
|
|
24
|
+
if (pass === null)
|
|
25
|
+
return;
|
|
26
|
+
const subsurface = material;
|
|
27
|
+
const standard = subsurface !== null ? subsurface.standard : null;
|
|
28
|
+
const key = buildWgpuPbrStandardDefineKey(standard, subsurface);
|
|
29
|
+
key.subsurfaceEnabled = true;
|
|
30
|
+
const format = stateRuntime.currentColorFormat ?? state.format;
|
|
31
|
+
const pipeline = ensureWgpuPbrPipeline(state, key, format);
|
|
32
|
+
writeWgpuFrameUniform(state, camera, lights);
|
|
33
|
+
const binding = ensureWgpuPbrMaterialBindGroup(state, pipeline, subsurface ?? FALLBACK_MATERIAL, standard);
|
|
34
|
+
const out = getWgpuPbrMaterialScratch();
|
|
35
|
+
writeWgpuPbrStandardBlock(out, standard, subsurface !== null ? subsurface.alphaCutoff : 0.5);
|
|
36
|
+
out.fill(0, 16);
|
|
37
|
+
// subsurface group (floats 36..39): strength, subsurfaceColor.rgb (linear); extra (float 40): thickness.
|
|
38
|
+
if (subsurface !== null) {
|
|
39
|
+
unpackColorToLinear(_colorScratch, subsurface.subsurfaceColor);
|
|
40
|
+
out[36] = subsurface.subsurface;
|
|
41
|
+
out[37] = _colorScratch[0];
|
|
42
|
+
out[38] = _colorScratch[1];
|
|
43
|
+
out[39] = _colorScratch[2];
|
|
44
|
+
out[40] = subsurface.thickness;
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
out[36] = 0;
|
|
48
|
+
out[37] = 1;
|
|
49
|
+
out[38] = 1;
|
|
50
|
+
out[39] = 1;
|
|
51
|
+
out[40] = 0;
|
|
52
|
+
}
|
|
53
|
+
writeWgpuPbrMaterialUniform(state, binding);
|
|
54
|
+
beginWgpuMeshDraw(state, pipeline);
|
|
55
|
+
pass.setBindGroup(2, binding.bindGroup);
|
|
56
|
+
},
|
|
57
|
+
draw(state, proxy, geometry) {
|
|
58
|
+
drawWgpuMeshSubset(state, proxy, geometry);
|
|
59
|
+
},
|
|
60
|
+
};
|
|
61
|
+
// Installs the built-in Subsurface renderer for SubsurfacePbrMaterialKind on this state. Opt-in (no
|
|
62
|
+
// top-level side effect): drawScene3D only draws Subsurface subsets once this is called.
|
|
63
|
+
export function registerSubsurfacePbrWgpuMaterial(state) {
|
|
64
|
+
registerWgpuMeshMaterialRenderer(state, SubsurfacePbrMaterialKind, subsurfacePbrWgpuMeshMaterialRenderer);
|
|
65
|
+
}
|
|
66
|
+
const FALLBACK_MATERIAL = {};
|
|
67
|
+
const _colorScratch = [0, 0, 0, 0];
|
|
68
|
+
//# sourceMappingURL=subsurfacePbrWgpuMeshMaterialRenderer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subsurfacePbrWgpuMeshMaterialRenderer.js","sourceRoot":"","sources":["../src/subsurfacePbrWgpuMeshMaterialRenderer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { WgpuMeshMaterialRenderer, WgpuRenderState } from '@flighthq/types';
|
|
2
|
+
export declare const toonWgpuMeshMaterialRenderer: WgpuMeshMaterialRenderer;
|
|
3
|
+
export declare function registerToonWgpuMaterial(state: WgpuRenderState): void;
|
|
4
|
+
//# sourceMappingURL=toonWgpuMeshMaterialRenderer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toonWgpuMeshMaterialRenderer.d.ts","sourceRoot":"","sources":["../src/toonWgpuMeshMaterialRenderer.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAQV,wBAAwB,EACxB,eAAe,EAEhB,MAAM,iBAAiB,CAAC;AA2BzB,eAAO,MAAM,4BAA4B,EAAE,wBA+B1C,CAAC;AAIF,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI,CAErE"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { unpackColorToLinear } from '@flighthq/color';
|
|
2
|
+
import { getWgpuRenderStateRuntime } from '@flighthq/render-wgpu';
|
|
3
|
+
import { ToonMaterialKind } from '@flighthq/types';
|
|
4
|
+
import { registerWgpuMeshMaterialRenderer } from './wgpuMeshMaterialRegistry';
|
|
5
|
+
import { beginWgpuMeshDraw, drawWgpuMeshSubset, writeWgpuFrameUniform } from './wgpuMeshPipeline';
|
|
6
|
+
import { bindWgpuToonSurface, ensureWgpuToonPipeline } from './wgpuToonPrelude';
|
|
7
|
+
// The built-in Toon (cel-shading) forward-lit mesh-material renderer (WgpuMeshMaterialRenderer for
|
|
8
|
+
// ToonMaterialKind) — the WGSL mirror of toonGlMeshMaterialRenderer. bind selects the pipeline variant
|
|
9
|
+
// for the material's alpha mode + double-sidedness + the current color-attachment format, writes the
|
|
10
|
+
// shared Frame uniform (camera view-projection + position, the packed light block), binds the pipeline
|
|
11
|
+
// + Frame bind group (beginWgpuMeshDraw), then writes + binds the material's uniform/texture bind group
|
|
12
|
+
// (linear base color, step count, alpha cutoff) at group(2). The diffuse N·L is quantized into stepped
|
|
13
|
+
// cel bands in the fragment scene2d (a stepped floor over `steps`); output is LINEAR color for the
|
|
14
|
+
// rgba16float scene target. draw uploads the geometry's GPU buffers lazily (cached by geometry.version),
|
|
15
|
+
// writes the per-draw model + normal matrices into the render-state's uniform ring buffer (group(1),
|
|
16
|
+
// dynamic offset), and issues the indexed draw over the proxy's subset. Depth-test LESS + depth-write
|
|
17
|
+
// on and back-face culling (unless double-sided) are baked on the pipeline. See registerToonWgpuMaterial
|
|
18
|
+
// to install it.
|
|
19
|
+
//
|
|
20
|
+
// MAPS NOT SAMPLED YET: baseColorMap and ramp are not uploaded on wgpu, so the define key keeps
|
|
21
|
+
// hasBaseColorMap / hasRamp false (placeholder textures bound, scalar `steps` quantizer used). This
|
|
22
|
+
// mirrors the documented gap on the Unlit/StandardPbr wgpu paths — the GL Toon renderer samples both;
|
|
23
|
+
// wgpu lights up the same shader branches once texture upload arrives. See wgpuToonPrelude.
|
|
24
|
+
//
|
|
25
|
+
// Cannot be visually captured in JSDOM (no GPU adapter); the unit test asserts the pipeline/bind/draw
|
|
26
|
+
// call shape against the mock device, mirrored against the verified GL result.
|
|
27
|
+
export const toonWgpuMeshMaterialRenderer = {
|
|
28
|
+
bind(state, material, lights, camera) {
|
|
29
|
+
const stateRuntime = getWgpuRenderStateRuntime(state);
|
|
30
|
+
const pass = stateRuntime.renderPass;
|
|
31
|
+
if (pass === null)
|
|
32
|
+
return;
|
|
33
|
+
const toon = material;
|
|
34
|
+
const format = stateRuntime.currentColorFormat ?? state.format;
|
|
35
|
+
const pipeline = ensureWgpuToonPipeline(state, defineKeyForMaterial(toon), format);
|
|
36
|
+
writeWgpuFrameUniform(state, camera, lights);
|
|
37
|
+
let group;
|
|
38
|
+
if (toon === null) {
|
|
39
|
+
group = bindWgpuToonSurface(state, pipeline, FALLBACK_MATERIAL, WHITE, 3, 0.5);
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
unpackColorToLinear(_scratch, toon.baseColor);
|
|
43
|
+
group = bindWgpuToonSurface(state, pipeline, toon, _scratch, toon.steps, toon.alphaCutoff);
|
|
44
|
+
}
|
|
45
|
+
beginWgpuMeshDraw(state, pipeline);
|
|
46
|
+
pass.setBindGroup(2, group);
|
|
47
|
+
},
|
|
48
|
+
draw(state, proxy, geometry) {
|
|
49
|
+
drawWgpuMeshSubset(state, proxy, geometry);
|
|
50
|
+
},
|
|
51
|
+
};
|
|
52
|
+
// Registers the built-in Toon renderer for ToonMaterialKind on this state. Opt-in (no top-level side
|
|
53
|
+
// effect); call once per WgpuRenderState before drawWgpuScene3D so meshes with ToonMaterials draw.
|
|
54
|
+
export function registerToonWgpuMaterial(state) {
|
|
55
|
+
registerWgpuMeshMaterialRenderer(state, ToonMaterialKind, toonWgpuMeshMaterialRenderer);
|
|
56
|
+
}
|
|
57
|
+
// The feature define key for a Toon material: the alpha-mask cutoff and double-sidedness. The map flags
|
|
58
|
+
// stay false on wgpu (texture upload not yet wired — see the renderer's maps note), so the quantizer is
|
|
59
|
+
// always the scalar `steps` stepped floor and placeholder textures are bound.
|
|
60
|
+
function defineKeyForMaterial(material) {
|
|
61
|
+
return {
|
|
62
|
+
alphaMaskEnabled: material !== null && material.alphaMode === 'mask',
|
|
63
|
+
doubleSided: material !== null && material.doubleSided,
|
|
64
|
+
hasBaseColorMap: false,
|
|
65
|
+
hasRamp: false,
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
const _scratch = [0, 0, 0, 0];
|
|
69
|
+
const WHITE = [1, 1, 1, 1];
|
|
70
|
+
const FALLBACK_MATERIAL = {};
|
|
71
|
+
//# sourceMappingURL=toonWgpuMeshMaterialRenderer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toonWgpuMeshMaterialRenderer.js","sourceRoot":"","sources":["../src/toonWgpuMeshMaterialRenderer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { WgpuMeshMaterialRenderer, WgpuRenderState } from '@flighthq/types';
|
|
2
|
+
export declare const transmissionVolumePbrWgpuMeshMaterialRenderer: WgpuMeshMaterialRenderer;
|
|
3
|
+
export declare function registerTransmissionVolumePbrWgpuMaterial(state: WgpuRenderState): void;
|
|
4
|
+
//# sourceMappingURL=transmissionVolumePbrWgpuMeshMaterialRenderer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transmissionVolumePbrWgpuMeshMaterialRenderer.d.ts","sourceRoot":"","sources":["../src/transmissionVolumePbrWgpuMeshMaterialRenderer.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAQV,wBAAwB,EACxB,eAAe,EAChB,MAAM,iBAAiB,CAAC;AAiCzB,eAAO,MAAM,6CAA6C,EAAE,wBA6C3D,CAAC;AAKF,wBAAgB,yCAAyC,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI,CAMtF"}
|