@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,74 @@
|
|
|
1
|
+
import { unpackColorToLinear } from '@flighthq/color';
|
|
2
|
+
import { getWgpuRenderStateRuntime } from '@flighthq/render-wgpu';
|
|
3
|
+
import { TransmissionVolumePbrMaterialKind } 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 TransmissionVolume (KHR_materials_transmission + KHR_materials_volume) forward-lit
|
|
9
|
+
// mesh-material renderer for refractive, see-through surfaces (glass, liquid) — the WGSL mirror of
|
|
10
|
+
// transmissionVolumePbrGlMeshMaterialRenderer.
|
|
11
|
+
//
|
|
12
|
+
// APPROXIMATION (not physically refractive yet): a true transmission path needs the Phase-5
|
|
13
|
+
// opaque-scene-color capture pass to sample what lies behind the surface and refract it through the
|
|
14
|
+
// surface IOR, with Beer-Lambert absorption over the volume `thickness`. Until that pass exists, this
|
|
15
|
+
// renderer models transmission cheaply behind `const TRANSMISSION`: it attenuates the fragment's
|
|
16
|
+
// coverage (alpha) by the `transmission` factor so the surface reads as translucent, and tints the lit
|
|
17
|
+
// radiance by `attenuationColor`. The surface is therefore drawn as a tinted, partially transparent lit
|
|
18
|
+
// shell rather than a refracting lens. `thickness`, `attenuationDistance`, and `ior` are accepted on the
|
|
19
|
+
// material but only `transmission`/`attenuationColor` drive the current shader.
|
|
20
|
+
//
|
|
21
|
+
// bind builds the standard define key from `material.standard` + the surface trailer, sets the
|
|
22
|
+
// TRANSMISSION flag, selects/compiles that pipeline variant for the current color format, writes the
|
|
23
|
+
// shared Frame uniform, then writes the base block + the transmission factor / linear-decoded
|
|
24
|
+
// attenuationColor into the one MaterialBlock uniform and binds it at group(2). The transmission/
|
|
25
|
+
// thickness maps are reserved but NOT sampled on wgpu yet (maps deferred). See
|
|
26
|
+
// registerTransmissionVolumePbrWgpuMaterial.
|
|
27
|
+
export const transmissionVolumePbrWgpuMeshMaterialRenderer = {
|
|
28
|
+
bind(state, material, lights, camera) {
|
|
29
|
+
const stateRuntime = getWgpuRenderStateRuntime(state);
|
|
30
|
+
const pass = stateRuntime.renderPass;
|
|
31
|
+
if (pass === null)
|
|
32
|
+
return;
|
|
33
|
+
const transmission = material;
|
|
34
|
+
const standard = transmission !== null ? transmission.standard : null;
|
|
35
|
+
const key = buildWgpuPbrStandardDefineKey(standard, transmission);
|
|
36
|
+
key.transmissionEnabled = true;
|
|
37
|
+
const format = stateRuntime.currentColorFormat ?? state.format;
|
|
38
|
+
const pipeline = ensureWgpuPbrPipeline(state, key, format);
|
|
39
|
+
writeWgpuFrameUniform(state, camera, lights);
|
|
40
|
+
const binding = ensureWgpuPbrMaterialBindGroup(state, pipeline, transmission ?? FALLBACK_MATERIAL, standard);
|
|
41
|
+
const out = getWgpuPbrMaterialScratch();
|
|
42
|
+
writeWgpuPbrStandardBlock(out, standard, transmission !== null ? transmission.alphaCutoff : 0.5);
|
|
43
|
+
out.fill(0, 16);
|
|
44
|
+
// transmission group (floats 44..47): transmission factor, attenuationColor.rgb (linear).
|
|
45
|
+
if (transmission !== null) {
|
|
46
|
+
unpackColorToLinear(_colorScratch, transmission.attenuationColor);
|
|
47
|
+
out[44] = transmission.transmission;
|
|
48
|
+
out[45] = _colorScratch[0];
|
|
49
|
+
out[46] = _colorScratch[1];
|
|
50
|
+
out[47] = _colorScratch[2];
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
out[44] = 0;
|
|
54
|
+
out[45] = 1;
|
|
55
|
+
out[46] = 1;
|
|
56
|
+
out[47] = 1;
|
|
57
|
+
}
|
|
58
|
+
writeWgpuPbrMaterialUniform(state, binding);
|
|
59
|
+
beginWgpuMeshDraw(state, pipeline);
|
|
60
|
+
pass.setBindGroup(2, binding.bindGroup);
|
|
61
|
+
},
|
|
62
|
+
draw(state, proxy, geometry) {
|
|
63
|
+
drawWgpuMeshSubset(state, proxy, geometry);
|
|
64
|
+
},
|
|
65
|
+
};
|
|
66
|
+
// Installs the built-in TransmissionVolume renderer for TransmissionVolumePbrMaterialKind on this
|
|
67
|
+
// state. Opt-in (no top-level side effect): drawScene3D only draws TransmissionVolume subsets once this
|
|
68
|
+
// is called.
|
|
69
|
+
export function registerTransmissionVolumePbrWgpuMaterial(state) {
|
|
70
|
+
registerWgpuMeshMaterialRenderer(state, TransmissionVolumePbrMaterialKind, transmissionVolumePbrWgpuMeshMaterialRenderer);
|
|
71
|
+
}
|
|
72
|
+
const FALLBACK_MATERIAL = {};
|
|
73
|
+
const _colorScratch = [0, 0, 0, 0];
|
|
74
|
+
//# sourceMappingURL=transmissionVolumePbrWgpuMeshMaterialRenderer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transmissionVolumePbrWgpuMeshMaterialRenderer.js","sourceRoot":"","sources":["../src/transmissionVolumePbrWgpuMeshMaterialRenderer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,EAAE,yBAAyB,EAAE,MAAM,uBAAuB,CAAC;AAYlE,OAAO,EAAE,iCAAiC,EAAE,MAAM,iBAAiB,CAAC;AAEpE,OAAO,EACL,6BAA6B,EAC7B,8BAA8B,EAC9B,yBAAyB,EACzB,2BAA2B,EAC3B,yBAAyB,GAC1B,MAAM,uCAAuC,CAAC;AAC/C,OAAO,EAAE,gCAAgC,EAAE,MAAM,4BAA4B,CAAC;AAC9E,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAClG,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAE/D,kGAAkG;AAClG,mGAAmG;AACnG,+CAA+C;AAC/C,EAAE;AACF,4FAA4F;AAC5F,oGAAoG;AACpG,sGAAsG;AACtG,iGAAiG;AACjG,uGAAuG;AACvG,wGAAwG;AACxG,yGAAyG;AACzG,gFAAgF;AAChF,EAAE;AACF,+FAA+F;AAC/F,qGAAqG;AACrG,8FAA8F;AAC9F,kGAAkG;AAClG,+EAA+E;AAC/E,6CAA6C;AAC7C,MAAM,CAAC,MAAM,6CAA6C,GAA6B;IACrF,IAAI,CACF,KAAsB,EACtB,QAAmC,EACnC,MAAmC,EACnC,MAA0B;QAE1B,MAAM,YAAY,GAAG,yBAAyB,CAAC,KAAK,CAAC,CAAC;QACtD,MAAM,IAAI,GAAG,YAAY,CAAC,UAAU,CAAC;QACrC,IAAI,IAAI,KAAK,IAAI;YAAE,OAAO;QAE1B,MAAM,YAAY,GAAG,QAA0D,CAAC;QAChF,MAAM,QAAQ,GAAG,YAAY,KAAK,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC;QACtE,MAAM,GAAG,GAAG,6BAA6B,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;QAClE,GAAG,CAAC,mBAAmB,GAAG,IAAI,CAAC;QAC/B,MAAM,MAAM,GAAG,YAAY,CAAC,kBAAkB,IAAI,KAAK,CAAC,MAAM,CAAC;QAC/D,MAAM,QAAQ,GAAG,qBAAqB,CAAC,KAAK,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;QAE3D,qBAAqB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QAC7C,MAAM,OAAO,GAAG,8BAA8B,CAAC,KAAK,EAAE,QAAQ,EAAE,YAAY,IAAI,iBAAiB,EAAE,QAAQ,CAAC,CAAC;QAC7G,MAAM,GAAG,GAAG,yBAAyB,EAAE,CAAC;QACxC,yBAAyB,CAAC,GAAG,EAAE,QAAQ,EAAE,YAAY,KAAK,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QACjG,GAAG,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAChB,0FAA0F;QAC1F,IAAI,YAAY,KAAK,IAAI,EAAE,CAAC;YAC1B,mBAAmB,CAAC,aAAa,EAAE,YAAY,CAAC,gBAAgB,CAAC,CAAC;YAClE,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,CAAC,YAAY,CAAC;YACpC,GAAG,CAAC,EAAE,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;YAC3B,GAAG,CAAC,EAAE,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;YAC3B,GAAG,CAAC,EAAE,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;QAC7B,CAAC;aAAM,CAAC;YACN,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;YACZ,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;YACZ,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;YACZ,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;QACd,CAAC;QACD,2BAA2B,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAE5C,iBAAiB,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QACnC,IAAI,CAAC,YAAY,CAAC,CAAC,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;IAC1C,CAAC;IAED,IAAI,CAAC,KAAsB,EAAE,KAAmC,EAAE,QAAgC;QAChG,kBAAkB,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;IAC7C,CAAC;CACF,CAAC;AAEF,kGAAkG;AAClG,wGAAwG;AACxG,aAAa;AACb,MAAM,UAAU,yCAAyC,CAAC,KAAsB;IAC9E,gCAAgC,CAC9B,KAAK,EACL,iCAAiC,EACjC,6CAA6C,CAC9C,CAAC;AACJ,CAAC;AAED,MAAM,iBAAiB,GAAG,EAA6C,CAAC;AACxE,MAAM,aAAa,GAAgB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { WgpuMeshMaterialRenderer, WgpuRenderState } from '@flighthq/types';
|
|
2
|
+
export declare const unlitWgpuMeshMaterialRenderer: WgpuMeshMaterialRenderer;
|
|
3
|
+
export declare function registerUnlitWgpuMaterial(state: WgpuRenderState): void;
|
|
4
|
+
//# sourceMappingURL=unlitWgpuMeshMaterialRenderer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"unlitWgpuMeshMaterialRenderer.d.ts","sourceRoot":"","sources":["../src/unlitWgpuMeshMaterialRenderer.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAQV,wBAAwB,EACxB,eAAe,EAEhB,MAAM,iBAAiB,CAAC;AAWzB,eAAO,MAAM,6BAA6B,EAAE,wBAkC3C,CAAC;AAIF,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI,CAEtE"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { unpackColorToLinear } from '@flighthq/color';
|
|
2
|
+
import { getWgpuRenderStateRuntime } from '@flighthq/render-wgpu';
|
|
3
|
+
import { isVideoTextureFrameReady } from '@flighthq/texture';
|
|
4
|
+
import { UnlitMaterialKind } from '@flighthq/types';
|
|
5
|
+
import { registerWgpuMeshMaterialRenderer } from './wgpuMeshMaterialRegistry';
|
|
6
|
+
import { beginWgpuMeshDraw, drawWgpuMeshSubset, isWgpuTextureReady, writeWgpuFrameUniform } from './wgpuMeshPipeline';
|
|
7
|
+
import { bindWgpuUnlitSurface, bindWgpuUnlitVideoSurface, ensureWgpuUnlitPipeline } from './wgpuUnlitPrelude';
|
|
8
|
+
// The built-in Unlit forward renderer (WgpuMeshMaterialRenderer for UnlitMaterialKind) — the WGSL
|
|
9
|
+
// mirror of unlitGlMeshMaterialRenderer. Lighting-independent flat color: bind selects the unlit
|
|
10
|
+
// pipeline variant for the alpha mode + color format, writes the shared Frame uniform (lights ignored),
|
|
11
|
+
// and binds the linear base color; draw issues the indexed draw. See registerUnlitWgpuMaterial.
|
|
12
|
+
export const unlitWgpuMeshMaterialRenderer = {
|
|
13
|
+
bind(state, material, _lights, camera) {
|
|
14
|
+
const stateRuntime = getWgpuRenderStateRuntime(state);
|
|
15
|
+
const pass = stateRuntime.renderPass;
|
|
16
|
+
if (pass === null)
|
|
17
|
+
return;
|
|
18
|
+
const unlit = material;
|
|
19
|
+
const format = stateRuntime.currentColorFormat ?? state.format;
|
|
20
|
+
const pipeline = ensureWgpuUnlitPipeline(state, defineKeyForMaterial(unlit), format);
|
|
21
|
+
writeWgpuFrameUniform(state, camera, _lights);
|
|
22
|
+
let group;
|
|
23
|
+
if (unlit === null) {
|
|
24
|
+
group = bindWgpuUnlitSurface(state, pipeline, FALLBACK_MATERIAL, WHITE, 1, 0.5, null);
|
|
25
|
+
}
|
|
26
|
+
else {
|
|
27
|
+
unpackColorToLinear(_scratch, unlit.baseColor);
|
|
28
|
+
group =
|
|
29
|
+
unlit.baseColorVideoMap !== null && isVideoTextureFrameReady(unlit.baseColorVideoMap)
|
|
30
|
+
? bindWgpuUnlitVideoSurface(state, pipeline, unlit, _scratch, 1, unlit.alphaCutoff, unlit.baseColorVideoMap)
|
|
31
|
+
: bindWgpuUnlitSurface(state, pipeline, unlit, _scratch, 1, unlit.alphaCutoff, unlit.baseColorMap);
|
|
32
|
+
}
|
|
33
|
+
beginWgpuMeshDraw(state, pipeline);
|
|
34
|
+
pass.setBindGroup(2, group);
|
|
35
|
+
},
|
|
36
|
+
draw(state, proxy, geometry) {
|
|
37
|
+
drawWgpuMeshSubset(state, proxy, geometry);
|
|
38
|
+
},
|
|
39
|
+
};
|
|
40
|
+
// Registers the built-in Unlit renderer for UnlitMaterialKind on this state. Opt-in (no top-level side
|
|
41
|
+
// effect); call once per WgpuRenderState before drawWgpuScene3D so meshes with UnlitMaterials draw.
|
|
42
|
+
export function registerUnlitWgpuMaterial(state) {
|
|
43
|
+
registerWgpuMeshMaterialRenderer(state, UnlitMaterialKind, unlitWgpuMeshMaterialRenderer);
|
|
44
|
+
}
|
|
45
|
+
function defineKeyForMaterial(material) {
|
|
46
|
+
return {
|
|
47
|
+
alphaMaskEnabled: material !== null && material.alphaMode === 'mask',
|
|
48
|
+
doubleSided: material !== null && material.doubleSided,
|
|
49
|
+
hasColorMap: material !== null &&
|
|
50
|
+
((material.baseColorVideoMap !== null && isVideoTextureFrameReady(material.baseColorVideoMap)) ||
|
|
51
|
+
isWgpuTextureReady(material.baseColorMap)),
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
const _scratch = [0, 0, 0, 0];
|
|
55
|
+
const WHITE = [1, 1, 1, 1];
|
|
56
|
+
const FALLBACK_MATERIAL = {};
|
|
57
|
+
//# sourceMappingURL=unlitWgpuMeshMaterialRenderer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"unlitWgpuMeshMaterialRenderer.js","sourceRoot":"","sources":["../src/unlitWgpuMeshMaterialRenderer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { WgpuMeshMaterialRenderer, WgpuRenderState } from '@flighthq/types';
|
|
2
|
+
export declare const vertexColorWgpuMeshMaterialRenderer: WgpuMeshMaterialRenderer;
|
|
3
|
+
export declare function registerVertexColorWgpuMaterial(state: WgpuRenderState): void;
|
|
4
|
+
//# sourceMappingURL=vertexColorWgpuMeshMaterialRenderer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vertexColorWgpuMeshMaterialRenderer.d.ts","sourceRoot":"","sources":["../src/vertexColorWgpuMeshMaterialRenderer.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAQV,wBAAwB,EACxB,eAAe,EAEhB,MAAM,iBAAiB,CAAC;AAYzB,eAAO,MAAM,mCAAmC,EAAE,wBAiCjD,CAAC;AAKF,wBAAgB,+BAA+B,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI,CAE5E"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { unpackColorToLinear } from '@flighthq/color';
|
|
2
|
+
import { getWgpuRenderStateRuntime } from '@flighthq/render-wgpu';
|
|
3
|
+
import { VertexColorMaterialKind } from '@flighthq/types';
|
|
4
|
+
import { registerWgpuMeshMaterialRenderer } from './wgpuMeshMaterialRegistry';
|
|
5
|
+
import { beginWgpuMeshDraw, drawWgpuMeshSubset, writeWgpuFrameUniform } from './wgpuMeshPipeline';
|
|
6
|
+
import { bindWgpuUnlitSurface, ensureWgpuUnlitPipeline } from './wgpuUnlitPrelude';
|
|
7
|
+
// The built-in VertexColor forward renderer (WgpuMeshMaterialRenderer for VertexColorMaterialKind) —
|
|
8
|
+
// the WGSL mirror of vertexColorGlMeshMaterialRenderer. Lighting-independent: renders the material's
|
|
9
|
+
// linear tint through the shared unlit pipeline. The canonical 48-byte vertex layout has no color0
|
|
10
|
+
// slot on wgpu, so (unlike the GL path) the mesh color0 attribute is not yet multiplied in — the tint
|
|
11
|
+
// alone drives the surface until color0 vertex support lands. See registerVertexColorWgpuMaterial.
|
|
12
|
+
export const vertexColorWgpuMeshMaterialRenderer = {
|
|
13
|
+
bind(state, material, _lights, camera) {
|
|
14
|
+
const stateRuntime = getWgpuRenderStateRuntime(state);
|
|
15
|
+
const pass = stateRuntime.renderPass;
|
|
16
|
+
if (pass === null)
|
|
17
|
+
return;
|
|
18
|
+
const vertexColor = material;
|
|
19
|
+
const format = stateRuntime.currentColorFormat ?? state.format;
|
|
20
|
+
const pipeline = ensureWgpuUnlitPipeline(state, defineKeyForMaterial(vertexColor), format);
|
|
21
|
+
writeWgpuFrameUniform(state, camera, _lights);
|
|
22
|
+
let group;
|
|
23
|
+
if (vertexColor === null) {
|
|
24
|
+
group = bindWgpuUnlitSurface(state, pipeline, FALLBACK_MATERIAL, WHITE, 1, 0.5, null);
|
|
25
|
+
}
|
|
26
|
+
else {
|
|
27
|
+
unpackColorToLinear(_scratch, vertexColor.tint);
|
|
28
|
+
// VertexColor carries no map texture; color0 (the per-vertex tint) is the absent vertex attribute,
|
|
29
|
+
// not a material map. Pass null so the placeholder satisfies the color slot.
|
|
30
|
+
group = bindWgpuUnlitSurface(state, pipeline, vertexColor, _scratch, 1, vertexColor.alphaCutoff, null);
|
|
31
|
+
}
|
|
32
|
+
beginWgpuMeshDraw(state, pipeline);
|
|
33
|
+
pass.setBindGroup(2, group);
|
|
34
|
+
},
|
|
35
|
+
draw(state, proxy, geometry) {
|
|
36
|
+
drawWgpuMeshSubset(state, proxy, geometry);
|
|
37
|
+
},
|
|
38
|
+
};
|
|
39
|
+
// Registers the built-in VertexColor renderer for VertexColorMaterialKind on this state. Opt-in (no
|
|
40
|
+
// top-level side effect); call once per WgpuRenderState before drawWgpuScene3D so meshes with
|
|
41
|
+
// VertexColorMaterials draw.
|
|
42
|
+
export function registerVertexColorWgpuMaterial(state) {
|
|
43
|
+
registerWgpuMeshMaterialRenderer(state, VertexColorMaterialKind, vertexColorWgpuMeshMaterialRenderer);
|
|
44
|
+
}
|
|
45
|
+
function defineKeyForMaterial(material) {
|
|
46
|
+
return {
|
|
47
|
+
alphaMaskEnabled: material !== null && material.alphaMode === 'mask',
|
|
48
|
+
doubleSided: material !== null && material.doubleSided,
|
|
49
|
+
hasColorMap: false,
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
const _scratch = [0, 0, 0, 0];
|
|
53
|
+
const WHITE = [1, 1, 1, 1];
|
|
54
|
+
const FALLBACK_MATERIAL = {};
|
|
55
|
+
//# sourceMappingURL=vertexColorWgpuMeshMaterialRenderer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vertexColorWgpuMeshMaterialRenderer.js","sourceRoot":"","sources":["../src/vertexColorWgpuMeshMaterialRenderer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,EAAE,yBAAyB,EAAE,MAAM,uBAAuB,CAAC;AAalE,OAAO,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAE1D,OAAO,EAAE,gCAAgC,EAAE,MAAM,4BAA4B,CAAC;AAC9E,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAClG,OAAO,EAAE,oBAAoB,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAEnF,qGAAqG;AACrG,qGAAqG;AACrG,mGAAmG;AACnG,sGAAsG;AACtG,mGAAmG;AACnG,MAAM,CAAC,MAAM,mCAAmC,GAA6B;IAC3E,IAAI,CACF,KAAsB,EACtB,QAAmC,EACnC,OAAoC,EACpC,MAA0B;QAE1B,MAAM,YAAY,GAAG,yBAAyB,CAAC,KAAK,CAAC,CAAC;QACtD,MAAM,IAAI,GAAG,YAAY,CAAC,UAAU,CAAC;QACrC,IAAI,IAAI,KAAK,IAAI;YAAE,OAAO;QAE1B,MAAM,WAAW,GAAG,QAAgD,CAAC;QACrE,MAAM,MAAM,GAAG,YAAY,CAAC,kBAAkB,IAAI,KAAK,CAAC,MAAM,CAAC;QAC/D,MAAM,QAAQ,GAAG,uBAAuB,CAAC,KAAK,EAAE,oBAAoB,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC,CAAC;QAC3F,qBAAqB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;QAE9C,IAAI,KAAmB,CAAC;QACxB,IAAI,WAAW,KAAK,IAAI,EAAE,CAAC;YACzB,KAAK,GAAG,oBAAoB,CAAC,KAAK,EAAE,QAAQ,EAAE,iBAAiB,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;QACxF,CAAC;aAAM,CAAC;YACN,mBAAmB,CAAC,QAAQ,EAAE,WAAW,CAAC,IAAI,CAAC,CAAC;YAChD,mGAAmG;YACnG,6EAA6E;YAC7E,KAAK,GAAG,oBAAoB,CAAC,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC,EAAE,WAAW,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;QACzG,CAAC;QAED,iBAAiB,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QACnC,IAAI,CAAC,YAAY,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IAC9B,CAAC;IAED,IAAI,CAAC,KAAsB,EAAE,KAAmC,EAAE,QAAgC;QAChG,kBAAkB,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;IAC7C,CAAC;CACF,CAAC;AAEF,oGAAoG;AACpG,8FAA8F;AAC9F,6BAA6B;AAC7B,MAAM,UAAU,+BAA+B,CAAC,KAAsB;IACpE,gCAAgC,CAAC,KAAK,EAAE,uBAAuB,EAAE,mCAAmC,CAAC,CAAC;AACxG,CAAC;AAED,SAAS,oBAAoB,CAAC,QAA8C;IAC1E,OAAO;QACL,gBAAgB,EAAE,QAAQ,KAAK,IAAI,IAAI,QAAQ,CAAC,SAAS,KAAK,MAAM;QACpE,WAAW,EAAE,QAAQ,KAAK,IAAI,IAAI,QAAQ,CAAC,WAAW;QACtD,WAAW,EAAE,KAAK;KACnB,CAAC;AACJ,CAAC;AAED,MAAM,QAAQ,GAAgB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;AAC3C,MAAM,KAAK,GAAgB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;AACxC,MAAM,iBAAiB,GAAG,EAAmC,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { LinearColor, Texture, WgpuClassicDefineKey, WgpuClassicPipeline, WgpuRenderState, WgpuSkinningAdapter } from '@flighthq/types';
|
|
2
|
+
export declare function bindWgpuClassicSurface(state: WgpuRenderState, pipeline: Readonly<WgpuClassicPipeline>, materialKey: object, diffuse: Readonly<LinearColor>, specular: Readonly<LinearColor>, shininess: number, alphaCutoff: number, diffuseMap: Readonly<Texture> | null, specularMap: Readonly<Texture> | null, normalMap: Readonly<Texture> | null, alphaMap: Readonly<Texture> | null): GPUBindGroup;
|
|
3
|
+
export declare function buildWgpuClassicDefineKey(key: Readonly<WgpuClassicDefineKey>): string;
|
|
4
|
+
export declare function compileWgpuClassicPipeline(state: WgpuRenderState, key: Readonly<WgpuClassicDefineKey>, format: GPUTextureFormat, blended?: boolean, skinned?: boolean): WgpuClassicPipeline;
|
|
5
|
+
export declare function ensureWgpuClassicPipeline(state: WgpuRenderState, key: Readonly<WgpuClassicDefineKey>, format: GPUTextureFormat): WgpuClassicPipeline;
|
|
6
|
+
export declare function getWgpuClassicModuleSourceForKey(key: Readonly<WgpuClassicDefineKey>, skinned?: boolean, skinning?: Readonly<WgpuSkinningAdapter> | null): string;
|
|
7
|
+
export declare function getWgpuClassicSharedSamplerModuleSourceForKey(key: Readonly<WgpuClassicDefineKey>, skinned?: boolean, skinning?: Readonly<WgpuSkinningAdapter> | null): string;
|
|
8
|
+
//# sourceMappingURL=wgpuClassicPrelude.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wgpuClassicPrelude.d.ts","sourceRoot":"","sources":["../src/wgpuClassicPrelude.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,WAAW,EACX,OAAO,EACP,oBAAoB,EACpB,mBAAmB,EACnB,eAAe,EACf,mBAAmB,EACpB,MAAM,iBAAiB,CAAC;AAkBzB,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,eAAe,EACtB,QAAQ,EAAE,QAAQ,CAAC,mBAAmB,CAAC,EACvC,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,QAAQ,CAAC,WAAW,CAAC,EAC9B,QAAQ,EAAE,QAAQ,CAAC,WAAW,CAAC,EAC/B,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,IAAI,EACpC,WAAW,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,IAAI,EACrC,SAAS,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,IAAI,EACnC,QAAQ,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,IAAI,GACjC,YAAY,CAsCd;AAMD,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,QAAQ,CAAC,oBAAoB,CAAC,GAAG,MAAM,CAKrF;AAMD,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,eAAe,EACtB,GAAG,EAAE,QAAQ,CAAC,oBAAoB,CAAC,EACnC,MAAM,EAAE,gBAAgB,EACxB,OAAO,UAAQ,EACf,OAAO,UAAQ,GACd,mBAAmB,CA8BrB;AAKD,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,eAAe,EACtB,GAAG,EAAE,QAAQ,CAAC,oBAAoB,CAAC,EACnC,MAAM,EAAE,gBAAgB,GACvB,mBAAmB,CAIrB;AAID,wBAAgB,gCAAgC,CAC9C,GAAG,EAAE,QAAQ,CAAC,oBAAoB,CAAC,EACnC,OAAO,UAAQ,EACf,QAAQ,GAAE,QAAQ,CAAC,mBAAmB,CAAC,GAAG,IAAW,GACpD,MAAM,CAER;AAMD,wBAAgB,6CAA6C,CAC3D,GAAG,EAAE,QAAQ,CAAC,oBAAoB,CAAC,EACnC,OAAO,UAAQ,EACf,QAAQ,GAAE,QAAQ,CAAC,mBAAmB,CAAC,GAAG,IAAW,GACpD,MAAM,CAER"}
|
|
@@ -0,0 +1,319 @@
|
|
|
1
|
+
import { createWgpuMeshPipeline, ensureWgpuPerMapMaterialBinding, ensureWgpuScene3DPipeline, ensureWgpuShadowSampleLayout, getWgpuMeshPreludeWgsl, getWgpuMaterialSampler, resolveWgpuMaterialTextureView, stashWgpuUvTransform, } from './wgpuMeshPipeline';
|
|
2
|
+
import { getWgpuSkinningAdapter } from './wgpuScene3DRuntime';
|
|
3
|
+
// Ensures (and caches per material reference) the classic Material bind group — a uniform buffer + the
|
|
4
|
+
// shared sampler + the placeholder diffuse/specular/normal textures — and rewrites its uniform with
|
|
5
|
+
// this surface's linear diffuse + specular colors, shininess, and alpha cutoff. Mirrors scene-gl's
|
|
6
|
+
// bindGl{Lambert,Phong,BlinnPhong}MaterialUniforms. Returns the bind group for the caller to set at
|
|
7
|
+
// group(2).
|
|
8
|
+
export function bindWgpuClassicSurface(state, pipeline, materialKey, diffuse, specular, shininess, alphaCutoff, diffuseMap, specularMap, normalMap, alphaMap) {
|
|
9
|
+
// Re-resolve the primary sampler + map views every bind so a live material-map mutation (swap,
|
|
10
|
+
// unready→ready, image replacement, version bump, primary-sampler change) is picked up; the views land
|
|
11
|
+
// in a REUSED module scratch so the steady-state re-bind of an unchanged material allocates nothing.
|
|
12
|
+
// ensureWgpuPerMapMaterialBinding rebuilds the bind group only when a view/sampler actually differs.
|
|
13
|
+
_samplerScratch[0] = getWgpuMaterialSampler(state, diffuseMap);
|
|
14
|
+
_samplerScratch[1] = getWgpuMaterialSampler(state, specularMap);
|
|
15
|
+
_samplerScratch[2] = getWgpuMaterialSampler(state, normalMap);
|
|
16
|
+
_samplerScratch[3] = getWgpuMaterialSampler(state, alphaMap);
|
|
17
|
+
_viewScratch[0] = resolveWgpuMaterialTextureView(state, diffuseMap);
|
|
18
|
+
_viewScratch[1] = resolveWgpuMaterialTextureView(state, specularMap);
|
|
19
|
+
_viewScratch[2] = resolveWgpuMaterialTextureView(state, normalMap);
|
|
20
|
+
_viewScratch[3] = resolveWgpuMaterialTextureView(state, alphaMap);
|
|
21
|
+
const binding = ensureWgpuPerMapMaterialBinding(state, materialKey, pipeline.materialBindGroupLayout, CLASSIC_UNIFORM_BYTES, _samplerScratch, _viewScratch);
|
|
22
|
+
_scratch[0] = diffuse[0];
|
|
23
|
+
_scratch[1] = diffuse[1];
|
|
24
|
+
_scratch[2] = diffuse[2];
|
|
25
|
+
_scratch[3] = diffuse[3];
|
|
26
|
+
_scratch[4] = specular[0];
|
|
27
|
+
_scratch[5] = specular[1];
|
|
28
|
+
_scratch[6] = specular[2];
|
|
29
|
+
_scratch[7] = specular[3];
|
|
30
|
+
_scratch[8] = shininess;
|
|
31
|
+
_scratch[9] = alphaCutoff;
|
|
32
|
+
_scratch[10] = 0;
|
|
33
|
+
_scratch[11] = 0;
|
|
34
|
+
state.device.queue.writeBuffer(binding.buffer, 0, _scratch.buffer, 0, CLASSIC_UNIFORM_BYTES);
|
|
35
|
+
// The diffuse map's uv transform drives the shared vertex-scene2d uv the classic maps sample.
|
|
36
|
+
stashWgpuUvTransform(state, diffuseMap);
|
|
37
|
+
return binding.bindGroup;
|
|
38
|
+
}
|
|
39
|
+
// A short, stable, order-independent string identity for a classic define key, used as the pipeline-
|
|
40
|
+
// cache key (combined with the color format). The lighting model is encoded first (l/p/b) so the three
|
|
41
|
+
// models never collide, followed by the feature flags. Two keys with the same model + flags produce
|
|
42
|
+
// the same string and so share a compiled pipeline.
|
|
43
|
+
export function buildWgpuClassicDefineKey(key) {
|
|
44
|
+
const model = key.lightingModel === 'phong' ? 'p' : key.lightingModel === 'blinnphong' ? 'b' : 'l';
|
|
45
|
+
return `${model}${key.alphaMaskEnabled ? 'm' : '-'}${key.doubleSided ? 'd' : '-'}${key.hasDiffuseMap ? 'd' : '-'}${key.hasSpecularMap ? 's' : '-'}${key.hasNormalMap ? 'n' : '-'}${key.hasAlphaMap ? 'a' : '-'}`;
|
|
46
|
+
}
|
|
47
|
+
// Compiles the classic module for a define key and builds the render pipeline for the given color
|
|
48
|
+
// format, with the group(2) material bind-group layout (uniform + one sampler per map +
|
|
49
|
+
// diffuse/specular/normal/alpha textures). Pure GPU work — no caching — used by
|
|
50
|
+
// ensureWgpuClassicPipeline.
|
|
51
|
+
export function compileWgpuClassicPipeline(state, key, format, blended = false, skinned = false) {
|
|
52
|
+
const device = state.device;
|
|
53
|
+
const module = device.createShaderModule({
|
|
54
|
+
code: getWgpuClassicModuleSourceForKey(key, skinned, getWgpuSkinningAdapter(state)),
|
|
55
|
+
});
|
|
56
|
+
const materialBindGroupLayout = device.createBindGroupLayout({
|
|
57
|
+
entries: [
|
|
58
|
+
{ binding: 0, visibility: GPUShaderStage.FRAGMENT, buffer: { type: 'uniform' } },
|
|
59
|
+
{ binding: 1, visibility: GPUShaderStage.FRAGMENT, sampler: { type: 'filtering' } },
|
|
60
|
+
{ binding: 2, visibility: GPUShaderStage.FRAGMENT, sampler: { type: 'filtering' } },
|
|
61
|
+
{ binding: 3, visibility: GPUShaderStage.FRAGMENT, sampler: { type: 'filtering' } },
|
|
62
|
+
{ binding: 4, visibility: GPUShaderStage.FRAGMENT, sampler: { type: 'filtering' } },
|
|
63
|
+
{ binding: 5, visibility: GPUShaderStage.FRAGMENT, texture: { sampleType: 'float' } },
|
|
64
|
+
{ binding: 6, visibility: GPUShaderStage.FRAGMENT, texture: { sampleType: 'float' } },
|
|
65
|
+
{ binding: 7, visibility: GPUShaderStage.FRAGMENT, texture: { sampleType: 'float' } },
|
|
66
|
+
{ binding: 8, visibility: GPUShaderStage.FRAGMENT, texture: { sampleType: 'float' } },
|
|
67
|
+
],
|
|
68
|
+
});
|
|
69
|
+
// The group(3) shadow-sample layout opts this pipeline into directional shadow reception: the pipeline
|
|
70
|
+
// layout gains [Frame, Draw, Material, Shadow] and beginWgpuMeshDraw binds the shared shadow group each
|
|
71
|
+
// draw (the real depth map when drawWgpuScene3DShadowMap ran this frame, else a gated-off 1x1 dummy).
|
|
72
|
+
return createWgpuMeshPipeline(state, {
|
|
73
|
+
blended,
|
|
74
|
+
doubleSided: key.doubleSided,
|
|
75
|
+
format,
|
|
76
|
+
materialBindGroupLayout,
|
|
77
|
+
module,
|
|
78
|
+
shadowBindGroupLayout: ensureWgpuShadowSampleLayout(state),
|
|
79
|
+
skinned,
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
// Resolves the classic pipeline for a define key + color format, compiling and caching it on first use
|
|
83
|
+
// through the shared scene pipeline cache under the `classic:` family namespace, so each model +
|
|
84
|
+
// feature/format variant is compiled at most once per state and reused every frame.
|
|
85
|
+
export function ensureWgpuClassicPipeline(state, key, format) {
|
|
86
|
+
return ensureWgpuScene3DPipeline(state, `classic:${format}|${buildWgpuClassicDefineKey(key)}`, (blended, skinned) => compileWgpuClassicPipeline(state, key, format, blended, skinned));
|
|
87
|
+
}
|
|
88
|
+
// The full WGSL module source for a define key: the const-flag block (lighting model first) + the
|
|
89
|
+
// shared mesh prelude (Frame/Draw/vs_main/srgbToLinear) + the classic material block + fs_main.
|
|
90
|
+
export function getWgpuClassicModuleSourceForKey(key, skinned = false, skinning = null) {
|
|
91
|
+
return assembleWgpuClassicModuleSource(key, skinned, skinning, CLASSIC_WGSL_BODY);
|
|
92
|
+
}
|
|
93
|
+
// ShadedMaterial composes modifier declarations and contributions into the classic WGSL, but retains
|
|
94
|
+
// its intentionally extensible legacy group(2) layout: one sampler at binding 1, base textures at 2..5,
|
|
95
|
+
// and modifier textures at 6+. Keep that source contract separate from the per-map classic pipeline so
|
|
96
|
+
// changing classic's sampler layout cannot collide with shaded modifier bindings.
|
|
97
|
+
export function getWgpuClassicSharedSamplerModuleSourceForKey(key, skinned = false, skinning = null) {
|
|
98
|
+
return assembleWgpuClassicModuleSource(key, skinned, skinning, CLASSIC_SHARED_SAMPLER_WGSL_BODY);
|
|
99
|
+
}
|
|
100
|
+
function assembleWgpuClassicModuleSource(key, skinned, skinning, body) {
|
|
101
|
+
return (`const LIGHTING_PHONG : bool = ${key.lightingModel === 'phong' ? 'true' : 'false'};\n` +
|
|
102
|
+
`const LIGHTING_BLINNPHONG : bool = ${key.lightingModel === 'blinnphong' ? 'true' : 'false'};\n` +
|
|
103
|
+
`const ALPHA_MASK : bool = ${key.alphaMaskEnabled ? 'true' : 'false'};\n` +
|
|
104
|
+
`const DOUBLE_SIDED : bool = ${key.doubleSided ? 'true' : 'false'};\n` +
|
|
105
|
+
`const HAS_DIFFUSE_MAP : bool = ${key.hasDiffuseMap ? 'true' : 'false'};\n` +
|
|
106
|
+
`const HAS_SPECULAR_MAP : bool = ${key.hasSpecularMap ? 'true' : 'false'};\n` +
|
|
107
|
+
`const HAS_NORMAL_MAP : bool = ${key.hasNormalMap ? 'true' : 'false'};\n` +
|
|
108
|
+
`const HAS_ALPHA_MAP : bool = ${key.hasAlphaMap ? 'true' : 'false'};\n` +
|
|
109
|
+
getWgpuMeshPreludeWgsl(skinned, skinning) +
|
|
110
|
+
body);
|
|
111
|
+
}
|
|
112
|
+
// Classic material uniform: diffuse vec4f (16) + specular vec4f (16) + params vec4f (16) = 48 bytes /
|
|
113
|
+
// 12 floats. params.x = shininess, params.y = alphaCutoff.
|
|
114
|
+
const CLASSIC_UNIFORM_BYTES = 48;
|
|
115
|
+
const CLASSIC_WGSL_BODY = /* wgsl */ `
|
|
116
|
+
struct ClassicMaterial {
|
|
117
|
+
diffuse : vec4f, // linear rgba
|
|
118
|
+
specular : vec4f, // linear rgb; a unused
|
|
119
|
+
params : vec4f, // x = shininess, y = alphaCutoff
|
|
120
|
+
};
|
|
121
|
+
|
|
122
|
+
@group(2) @binding(0) var<uniform> material : ClassicMaterial;
|
|
123
|
+
@group(2) @binding(1) var diffuseSampler : sampler;
|
|
124
|
+
@group(2) @binding(2) var specularSampler : sampler;
|
|
125
|
+
@group(2) @binding(3) var normalSampler : sampler;
|
|
126
|
+
@group(2) @binding(4) var alphaSampler : sampler;
|
|
127
|
+
@group(2) @binding(5) var diffuseTexture : texture_2d<f32>;
|
|
128
|
+
@group(2) @binding(6) var specularTexture : texture_2d<f32>;
|
|
129
|
+
@group(2) @binding(7) var normalTexture : texture_2d<f32>;
|
|
130
|
+
@group(2) @binding(8) var alphaTexture : texture_2d<f32>;
|
|
131
|
+
|
|
132
|
+
// The directional shadow inputs (group 3), the shared shadow-sample layout ensureWgpuShadowSampleLayout
|
|
133
|
+
// builds and beginWgpuMeshDraw binds. matrix is the light view-projection (world -> shadow clip);
|
|
134
|
+
// params.x is the enabled flag (0 or 1). The WGSL mirror of scene-gl's u_shadowMap / u_shadowMatrix /
|
|
135
|
+
// u_shadowEnabled and wgpuPbrPrelude's Shadow.
|
|
136
|
+
struct Shadow {
|
|
137
|
+
matrix : mat4x4f,
|
|
138
|
+
params : vec4f, // x = enabled (0 or 1)
|
|
139
|
+
};
|
|
140
|
+
|
|
141
|
+
@group(3) @binding(0) var<uniform> shadow : Shadow;
|
|
142
|
+
@group(3) @binding(1) var shadowMap : texture_depth_2d;
|
|
143
|
+
@group(3) @binding(2) var shadowSampler : sampler_comparison;
|
|
144
|
+
|
|
145
|
+
// Directional shadow factor at a world position: 1.0 fully lit, 0.0 fully shadowed, with 3x3 PCF —
|
|
146
|
+
// identical to wgpuPbrPrelude's copy. UV flips Y (WebGPU top-left origin), depthRef remaps GL-convention
|
|
147
|
+
// clip Z (-1..1) into WebGPU's 0..1 range; the comparison sampler ('less-equal') yields "current <=
|
|
148
|
+
// closest" per tap. Fragments outside the shadow frustum, or when no map is bound, read as lit.
|
|
149
|
+
fn sampleDirectionalShadow(worldPos : vec3f) -> f32 {
|
|
150
|
+
if (shadow.params.x < 0.5) {
|
|
151
|
+
return 1.0;
|
|
152
|
+
}
|
|
153
|
+
let clip = shadow.matrix * vec4f(worldPos, 1.0);
|
|
154
|
+
let ndc = clip.xyz / clip.w;
|
|
155
|
+
let uv = vec2f(ndc.x * 0.5 + 0.5, 1.0 - (ndc.y * 0.5 + 0.5));
|
|
156
|
+
let depthRef = ndc.z * 0.5 + 0.5 - 0.0025;
|
|
157
|
+
if (uv.x < 0.0 || uv.x > 1.0 || uv.y < 0.0 || uv.y > 1.0 || depthRef > 1.0) {
|
|
158
|
+
return 1.0;
|
|
159
|
+
}
|
|
160
|
+
let texel = 1.0 / vec2f(textureDimensions(shadowMap, 0));
|
|
161
|
+
var sum = 0.0;
|
|
162
|
+
for (var x = -1; x <= 1; x = x + 1) {
|
|
163
|
+
for (var y = -1; y <= 1; y = y + 1) {
|
|
164
|
+
let offset = vec2f(f32(x), f32(y)) * texel;
|
|
165
|
+
sum = sum + textureSampleCompareLevel(shadowMap, shadowSampler, uv + offset, depthRef);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
return sum / 9.0;
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
// Smooth finite-range window over inverse-square falloff. A non-positive inverse range means
|
|
172
|
+
// unlimited range, matching packScene3DLightBlock and the GL classic/PBR preludes.
|
|
173
|
+
fn rangeWindow(dist2 : f32, invSqrRange : f32) -> f32 {
|
|
174
|
+
if (invSqrRange <= 0.0) {
|
|
175
|
+
return 1.0;
|
|
176
|
+
}
|
|
177
|
+
let factor = clamp(1.0 - dist2 * invSqrRange, 0.0, 1.0);
|
|
178
|
+
return factor * factor;
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
// One classic-light contribution shared by directional, point, and spot lights. Keeping the BRDF in
|
|
182
|
+
// one function prevents the positional families from drifting from the directional model.
|
|
183
|
+
fn shadeClassicLight(normal : vec3f, lightDir : vec3f, lightColor : vec3f, diffuseRgb : vec3f,
|
|
184
|
+
specularColor : vec3f, worldPosition : vec3f) -> vec3f {
|
|
185
|
+
let nDotL = max(dot(normal, lightDir), 0.0);
|
|
186
|
+
var result = diffuseRgb * nDotL * lightColor;
|
|
187
|
+
if ((LIGHTING_PHONG || LIGHTING_BLINNPHONG) && nDotL > 0.0) {
|
|
188
|
+
let viewDir = normalize(frame.cameraPosition.xyz - worldPosition);
|
|
189
|
+
var specAngle = 0.0;
|
|
190
|
+
if (LIGHTING_PHONG) {
|
|
191
|
+
specAngle = max(dot(reflect(-lightDir, normal), viewDir), 0.0);
|
|
192
|
+
} else {
|
|
193
|
+
specAngle = max(dot(normal, normalize(lightDir + viewDir)), 0.0);
|
|
194
|
+
}
|
|
195
|
+
let specular = pow(specAngle, max(material.params.x, 1.0));
|
|
196
|
+
result = result + specular * specularColor * lightColor;
|
|
197
|
+
}
|
|
198
|
+
return result;
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
@fragment fn fs_main(in : VertexOutput, @builtin(front_facing) isFront : bool) -> @location(0) vec4f {
|
|
202
|
+
var diffuse = material.diffuse;
|
|
203
|
+
if (HAS_DIFFUSE_MAP) {
|
|
204
|
+
let sampled = textureSample(diffuseTexture, diffuseSampler, in.uv);
|
|
205
|
+
diffuse = vec4f(diffuse.rgb * srgbToLinear(sampled.rgb), diffuse.a * sampled.a);
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
// Dedicated coverage (opacity) map: its green channel is linear data, multiplied into alpha before
|
|
209
|
+
// the alpha-mask cutoff so 'mask' cutout and 'blend' transparency both see the combined coverage.
|
|
210
|
+
if (HAS_ALPHA_MAP) {
|
|
211
|
+
diffuse.a = diffuse.a * textureSample(alphaTexture, alphaSampler, in.uv).g;
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
if (ALPHA_MASK && diffuse.a < material.params.y) {
|
|
215
|
+
discard;
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
var geometricNormal = normalize(in.worldNormal);
|
|
219
|
+
// Double-sided materials flip the normal for back faces so both sides shade correctly.
|
|
220
|
+
if (DOUBLE_SIDED && !isFront) {
|
|
221
|
+
geometricNormal = -geometricNormal;
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
var normal = geometricNormal;
|
|
225
|
+
if (HAS_NORMAL_MAP) {
|
|
226
|
+
let tangent = normalize(in.worldTangent.xyz);
|
|
227
|
+
let bitangent = cross(geometricNormal, tangent) * in.worldTangent.w;
|
|
228
|
+
var tangentNormal = textureSample(normalTexture, normalSampler, in.uv).xyz * 2.0 - vec3f(1.0);
|
|
229
|
+
let tbn = mat3x3f(tangent, bitangent, geometricNormal);
|
|
230
|
+
normal = normalize(tbn * tangentNormal);
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
// Specular color is resolved here in UNIFORM control flow. WGSL forbids textureSample inside the
|
|
234
|
+
// per-pixel lighting branch below (it depends on nDotL, a non-uniform value), so the map sample is
|
|
235
|
+
// hoisted out. It starts at the material specular; when a specular map is present its sampled value
|
|
236
|
+
// multiplies in just below (an absent map binds a placeholder view and this stays the flat specular).
|
|
237
|
+
var specularColor = material.specular.rgb;
|
|
238
|
+
if (HAS_SPECULAR_MAP) {
|
|
239
|
+
let sampledSpecular = textureSample(specularTexture, specularSampler, in.uv);
|
|
240
|
+
specularColor = specularColor * srgbToLinear(sampledSpecular.rgb);
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
var radiance = vec3f(0.0);
|
|
244
|
+
|
|
245
|
+
// Directional light: -direction is the surface-to-light vector (light travels along direction).
|
|
246
|
+
// The whole directional contribution (diffuse + specular) is PCF shadow-mapped, mirroring the PBR path;
|
|
247
|
+
// sampleDirectionalShadow returns 1.0 when no shadow map is bound, so an unshadowed scene is unchanged.
|
|
248
|
+
if (frame.lightDirection.w > 0.5) {
|
|
249
|
+
let lightDir = normalize(-frame.lightDirection.xyz);
|
|
250
|
+
let direct = shadeClassicLight(normal, lightDir, frame.directionalRadiance.rgb, diffuse.rgb,
|
|
251
|
+
specularColor, in.worldPosition);
|
|
252
|
+
radiance = radiance + direct * sampleDirectionalShadow(in.worldPosition);
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
// Point lights: surface-to-light direction with smooth inverse-square range falloff.
|
|
256
|
+
let pointCount = u32(frame.punctualCounts.x);
|
|
257
|
+
for (var point = 0u; point < 4u; point = point + 1u) {
|
|
258
|
+
if (point >= pointCount) { break; }
|
|
259
|
+
let toLight = frame.pointLights[point * 2u].xyz - in.worldPosition;
|
|
260
|
+
let dist2 = dot(toLight, toLight);
|
|
261
|
+
let lightDir = toLight * inverseSqrt(max(dist2, 1e-8));
|
|
262
|
+
let atten = rangeWindow(dist2, frame.pointLights[point * 2u + 1u].w) / max(dist2, 1e-4);
|
|
263
|
+
radiance = radiance + shadeClassicLight(normal, lightDir,
|
|
264
|
+
frame.pointLights[point * 2u + 1u].xyz * atten, diffuse.rgb, specularColor, in.worldPosition);
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
// Spot lights: point attenuation multiplied by the smooth inner/outer cone window.
|
|
268
|
+
let spotCount = u32(frame.punctualCounts.y);
|
|
269
|
+
for (var spot = 0u; spot < 4u; spot = spot + 1u) {
|
|
270
|
+
if (spot >= spotCount) { break; }
|
|
271
|
+
let toLight = frame.spotLights[spot * 4u].xyz - in.worldPosition;
|
|
272
|
+
let dist2 = dot(toLight, toLight);
|
|
273
|
+
let lightDir = toLight * inverseSqrt(max(dist2, 1e-8));
|
|
274
|
+
let atten = rangeWindow(dist2, frame.spotLights[spot * 4u + 1u].w) / max(dist2, 1e-4);
|
|
275
|
+
let cone = smoothstep(frame.spotLights[spot * 4u + 3u].y, frame.spotLights[spot * 4u + 3u].x,
|
|
276
|
+
dot(normalize(frame.spotLights[spot * 4u + 2u].xyz), -lightDir));
|
|
277
|
+
radiance = radiance + shadeClassicLight(normal, lightDir,
|
|
278
|
+
frame.spotLights[spot * 4u + 1u].xyz * atten * cone, diffuse.rgb, specularColor, in.worldPosition);
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
// Ambient term: flat irradiance over the diffuse albedo.
|
|
282
|
+
if (frame.ambientRadiance.w > 0.5) {
|
|
283
|
+
radiance = radiance + diffuse.rgb * frame.ambientRadiance.rgb;
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
// Hemisphere fill: sky/ground gradient blended by the normal's up-axis alignment.
|
|
287
|
+
let hemisphereCount = u32(frame.punctualCounts.z);
|
|
288
|
+
for (var hemisphere = 0u; hemisphere < 4u; hemisphere = hemisphere + 1u) {
|
|
289
|
+
if (hemisphere >= hemisphereCount) { break; }
|
|
290
|
+
let factor = 0.5 + 0.5 * dot(normal, frame.hemisphereLights[hemisphere * 3u + 2u].xyz);
|
|
291
|
+
radiance = radiance + mix(frame.hemisphereLights[hemisphere * 3u + 1u].xyz,
|
|
292
|
+
frame.hemisphereLights[hemisphere * 3u].xyz, factor) * diffuse.rgb;
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
return vec4f(radiance, diffuse.a * in.objectAlpha);
|
|
296
|
+
}
|
|
297
|
+
`;
|
|
298
|
+
const CLASSIC_SHARED_SAMPLER_WGSL_BODY = CLASSIC_WGSL_BODY.replace(`@group(2) @binding(1) var diffuseSampler : sampler;
|
|
299
|
+
@group(2) @binding(2) var specularSampler : sampler;
|
|
300
|
+
@group(2) @binding(3) var normalSampler : sampler;
|
|
301
|
+
@group(2) @binding(4) var alphaSampler : sampler;
|
|
302
|
+
@group(2) @binding(5) var diffuseTexture : texture_2d<f32>;
|
|
303
|
+
@group(2) @binding(6) var specularTexture : texture_2d<f32>;
|
|
304
|
+
@group(2) @binding(7) var normalTexture : texture_2d<f32>;
|
|
305
|
+
@group(2) @binding(8) var alphaTexture : texture_2d<f32>;`, `@group(2) @binding(1) var materialSampler : sampler;
|
|
306
|
+
@group(2) @binding(2) var diffuseTexture : texture_2d<f32>;
|
|
307
|
+
@group(2) @binding(3) var specularTexture : texture_2d<f32>;
|
|
308
|
+
@group(2) @binding(4) var normalTexture : texture_2d<f32>;
|
|
309
|
+
@group(2) @binding(5) var alphaTexture : texture_2d<f32>;`)
|
|
310
|
+
.replaceAll('diffuseSampler', 'materialSampler')
|
|
311
|
+
.replaceAll('specularSampler', 'materialSampler')
|
|
312
|
+
.replaceAll('normalSampler', 'materialSampler')
|
|
313
|
+
.replaceAll('alphaSampler', 'materialSampler');
|
|
314
|
+
const _scratch = new Float32Array(CLASSIC_UNIFORM_BYTES / 4);
|
|
315
|
+
const _samplerScratch = new Array(4);
|
|
316
|
+
// Reused per-bind resolved-view scratch (diffuse, specular, normal, alpha) so a steady-state re-bind
|
|
317
|
+
// allocates nothing; ensureWgpuPerMapMaterialBinding copies it into the binding only on create/rebuild.
|
|
318
|
+
const _viewScratch = new Array(4);
|
|
319
|
+
//# sourceMappingURL=wgpuClassicPrelude.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wgpuClassicPrelude.js","sourceRoot":"","sources":["../src/wgpuClassicPrelude.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wgpuCustomMaterialAbi.d.ts","sourceRoot":"","sources":["../src/wgpuCustomMaterialAbi.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,qCAAqC,KAAK,CAAC;AACxD,eAAO,MAAM,mCAAmC,IAAI,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
// Fixed WebGPU custom-material ABI capacities. Every logical scalar/vector uniform consumes one
|
|
2
|
+
// vec4-aligned slot; every texture consumes sampler(binding 2N) + texture(binding 2N+1) in group(3).
|
|
3
|
+
export const WGPU_CUSTOM_SHADER_USER_VEC4_CAPACITY = 32;
|
|
4
|
+
export const WGPU_CUSTOM_SHADER_TEXTURE_CAPACITY = 8;
|
|
5
|
+
//# sourceMappingURL=wgpuCustomMaterialAbi.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wgpuCustomMaterialAbi.js","sourceRoot":"","sources":["../src/wgpuCustomMaterialAbi.ts"],"names":[],"mappings":"AAAA,gGAAgG;AAChG,qGAAqG;AACrG,MAAM,CAAC,MAAM,qCAAqC,GAAG,EAAE,CAAC;AACxD,MAAM,CAAC,MAAM,mCAAmC,GAAG,CAAC,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { WgpuDebugDefineKey, WgpuDebugPipeline, WgpuRenderState } from '@flighthq/types';
|
|
2
|
+
export declare function bindWgpuDebugSurface(state: WgpuRenderState, pipeline: Readonly<WgpuDebugPipeline>, materialKey: object, near: number, far: number, normalScale: number): GPUBindGroup;
|
|
3
|
+
export declare function buildWgpuDebugDefineKey(key: Readonly<WgpuDebugDefineKey>): string;
|
|
4
|
+
export declare function compileWgpuDebugPipeline(state: WgpuRenderState, key: Readonly<WgpuDebugDefineKey>, format: GPUTextureFormat, blended?: boolean): WgpuDebugPipeline;
|
|
5
|
+
export declare function ensureWgpuDebugPipeline(state: WgpuRenderState, key: Readonly<WgpuDebugDefineKey>, format: GPUTextureFormat): WgpuDebugPipeline;
|
|
6
|
+
export declare function getWgpuDebugModuleSourceForKey(key: Readonly<WgpuDebugDefineKey>): string;
|
|
7
|
+
//# sourceMappingURL=wgpuDebugPrelude.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wgpuDebugPrelude.d.ts","sourceRoot":"","sources":["../src/wgpuDebugPrelude.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,eAAe,EAAuB,MAAM,iBAAiB,CAAC;AAgBnH,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,eAAe,EACtB,QAAQ,EAAE,QAAQ,CAAC,iBAAiB,CAAC,EACrC,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,MAAM,EACX,WAAW,EAAE,MAAM,GAClB,YAAY,CA8Bd;AAKD,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,QAAQ,CAAC,kBAAkB,CAAC,GAAG,MAAM,CAEjF;AAMD,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,eAAe,EACtB,GAAG,EAAE,QAAQ,CAAC,kBAAkB,CAAC,EACjC,MAAM,EAAE,gBAAgB,EACxB,OAAO,UAAQ,GACd,iBAAiB,CAanB;AAKD,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,eAAe,EACtB,GAAG,EAAE,QAAQ,CAAC,kBAAkB,CAAC,EACjC,MAAM,EAAE,gBAAgB,GACvB,iBAAiB,CAInB;AAKD,wBAAgB,8BAA8B,CAAC,GAAG,EAAE,QAAQ,CAAC,kBAAkB,CAAC,GAAG,MAAM,CAQxF"}
|