@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,82 @@
|
|
|
1
|
+
import { createCamera3D } from '@flighthq/camera';
|
|
2
|
+
import { createMatrix3, createMatrix4 } from '@flighthq/geometry';
|
|
3
|
+
import { createBlinnPhongMaterial } from '@flighthq/materials';
|
|
4
|
+
import { createBoxMeshGeometry } from '@flighthq/mesh';
|
|
5
|
+
import type { Camera3D, Matrix3, Matrix4, Scene3DLightBlock, Scene3DRenderProxy } from '@flighthq/types';
|
|
6
|
+
import { BlinnPhongMaterialKind } from '@flighthq/types';
|
|
7
|
+
|
|
8
|
+
import {
|
|
9
|
+
blinnPhongWgpuMeshMaterialRenderer,
|
|
10
|
+
registerBlinnPhongWgpuMaterial,
|
|
11
|
+
} from './blinnPhongWgpuMeshMaterialRenderer';
|
|
12
|
+
import { getWgpuMeshMaterialRenderer } from './wgpuMeshMaterialRegistry';
|
|
13
|
+
import { makeWgpuScene3DState } from './wgpuScene3DTestHelper';
|
|
14
|
+
|
|
15
|
+
function makeCamera(): Camera3D {
|
|
16
|
+
return createCamera3D({ far: 100, near: 0.1, projection: { aspect: 1, fovY: Math.PI / 3, kind: 'perspective' } });
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
function makeLights(): Scene3DLightBlock {
|
|
20
|
+
const data = new Float32Array(12);
|
|
21
|
+
data[0] = 0;
|
|
22
|
+
data[1] = -1;
|
|
23
|
+
data[2] = 0;
|
|
24
|
+
data[4] = 1;
|
|
25
|
+
data[5] = 1;
|
|
26
|
+
data[6] = 1;
|
|
27
|
+
data[8] = 0.1;
|
|
28
|
+
data[9] = 0.1;
|
|
29
|
+
data[10] = 0.1;
|
|
30
|
+
return { ambientCount: 1, data, directionalCount: 1, hemisphereCount: 0, pointCount: 0, spotCount: 0, version: 1 };
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
function makeProxy(): Scene3DRenderProxy {
|
|
34
|
+
const geometry = createBoxMeshGeometry();
|
|
35
|
+
return {
|
|
36
|
+
material: createBlinnPhongMaterial(),
|
|
37
|
+
normalMatrix: createMatrix3() as Matrix3,
|
|
38
|
+
subset: geometry.subsets[0],
|
|
39
|
+
worldMatrix: createMatrix4() as Matrix4,
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
describe('blinnPhongWgpuMeshMaterialRenderer', () => {
|
|
44
|
+
it('bind selects a blinnphong pipeline and binds frame + material groups + uploads uniforms', () => {
|
|
45
|
+
const { fake, state } = makeWgpuScene3DState();
|
|
46
|
+
blinnPhongWgpuMeshMaterialRenderer.bind(state, createBlinnPhongMaterial(), makeLights(), makeCamera());
|
|
47
|
+
|
|
48
|
+
const moduleCall = fake.calls.find((c) => c.name === 'createShaderModule');
|
|
49
|
+
const code = (moduleCall!.args[0] as { code: string }).code;
|
|
50
|
+
expect(code).toContain('const LIGHTING_BLINNPHONG : bool = true;');
|
|
51
|
+
expect(fake.calls.some((c) => c.name === 'setPipeline')).toBe(true);
|
|
52
|
+
expect(fake.calls.filter((c) => c.name === 'setBindGroup').length).toBeGreaterThanOrEqual(2);
|
|
53
|
+
expect(fake.calls.some((c) => c.name === 'writeBuffer')).toBe(true);
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
it('draw uploads geometry and issues an indexed draw over the subset range', () => {
|
|
57
|
+
const { fake, state } = makeWgpuScene3DState();
|
|
58
|
+
const proxy = makeProxy();
|
|
59
|
+
const geometry = createBoxMeshGeometry();
|
|
60
|
+
blinnPhongWgpuMeshMaterialRenderer.bind(state, proxy.material, makeLights(), makeCamera());
|
|
61
|
+
blinnPhongWgpuMeshMaterialRenderer.draw(state, proxy, geometry);
|
|
62
|
+
|
|
63
|
+
const drawCall = fake.calls.find((c) => c.name === 'drawIndexed');
|
|
64
|
+
expect(drawCall).toBeDefined();
|
|
65
|
+
expect(drawCall!.args[0]).toBe(proxy.subset.indexCount);
|
|
66
|
+
expect(drawCall!.args[2]).toBe(proxy.subset.indexOffset);
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
it('draw is a no-op when bind has not selected a pipeline', () => {
|
|
70
|
+
const { fake, state } = makeWgpuScene3DState();
|
|
71
|
+
blinnPhongWgpuMeshMaterialRenderer.draw(state, makeProxy(), createBoxMeshGeometry());
|
|
72
|
+
expect(fake.calls.some((c) => c.name === 'drawIndexed')).toBe(false);
|
|
73
|
+
});
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
describe('registerBlinnPhongWgpuMaterial', () => {
|
|
77
|
+
it('installs the renderer for BlinnPhongMaterialKind', () => {
|
|
78
|
+
const { state } = makeWgpuScene3DState();
|
|
79
|
+
registerBlinnPhongWgpuMaterial(state);
|
|
80
|
+
expect(getWgpuMeshMaterialRenderer(state, BlinnPhongMaterialKind)).toBe(blinnPhongWgpuMeshMaterialRenderer);
|
|
81
|
+
});
|
|
82
|
+
});
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { createCamera3D } from '@flighthq/camera';
|
|
2
|
+
import { createMatrix3, createMatrix4 } from '@flighthq/geometry';
|
|
3
|
+
import { createClearcoatPbrMaterial } from '@flighthq/materials';
|
|
4
|
+
import { createBoxMeshGeometry } from '@flighthq/mesh';
|
|
5
|
+
import type { Camera3D, Matrix3, Matrix4, Scene3DLightBlock, Scene3DRenderProxy } from '@flighthq/types';
|
|
6
|
+
import { ClearcoatPbrMaterialKind } from '@flighthq/types';
|
|
7
|
+
|
|
8
|
+
import {
|
|
9
|
+
clearcoatPbrWgpuMeshMaterialRenderer,
|
|
10
|
+
registerClearcoatPbrWgpuMaterial,
|
|
11
|
+
} from './clearcoatPbrWgpuMeshMaterialRenderer';
|
|
12
|
+
import { getWgpuMeshMaterialRenderer } from './wgpuMeshMaterialRegistry';
|
|
13
|
+
import { makeWgpuScene3DState } from './wgpuScene3DTestHelper';
|
|
14
|
+
|
|
15
|
+
function makeCamera(): Camera3D {
|
|
16
|
+
return createCamera3D({ far: 100, near: 0.1, projection: { aspect: 1, fovY: Math.PI / 3, kind: 'perspective' } });
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
function makeLights(): Scene3DLightBlock {
|
|
20
|
+
const data = new Float32Array(12);
|
|
21
|
+
data[1] = -1;
|
|
22
|
+
data[4] = 1;
|
|
23
|
+
data[5] = 1;
|
|
24
|
+
data[6] = 1;
|
|
25
|
+
data[8] = 0.1;
|
|
26
|
+
data[9] = 0.1;
|
|
27
|
+
data[10] = 0.1;
|
|
28
|
+
return { ambientCount: 1, data, directionalCount: 1, hemisphereCount: 0, pointCount: 0, spotCount: 0, version: 1 };
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
function makeProxy(): Scene3DRenderProxy {
|
|
32
|
+
const geometry = createBoxMeshGeometry();
|
|
33
|
+
return {
|
|
34
|
+
material: createClearcoatPbrMaterial({ clearcoat: 1 }),
|
|
35
|
+
normalMatrix: createMatrix3() as Matrix3,
|
|
36
|
+
subset: geometry.subsets[0],
|
|
37
|
+
worldMatrix: createMatrix4() as Matrix4,
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
describe('clearcoatPbrWgpuMeshMaterialRenderer', () => {
|
|
42
|
+
it('bind selects a pipeline and binds frame + material groups + uploads uniforms', () => {
|
|
43
|
+
const { fake, state } = makeWgpuScene3DState();
|
|
44
|
+
clearcoatPbrWgpuMeshMaterialRenderer.bind(
|
|
45
|
+
state,
|
|
46
|
+
createClearcoatPbrMaterial({ clearcoat: 1 }),
|
|
47
|
+
makeLights(),
|
|
48
|
+
makeCamera(),
|
|
49
|
+
);
|
|
50
|
+
|
|
51
|
+
expect(fake.calls.some((c) => c.name === 'createRenderPipeline')).toBe(true);
|
|
52
|
+
expect(fake.calls.some((c) => c.name === 'setPipeline')).toBe(true);
|
|
53
|
+
expect(fake.calls.filter((c) => c.name === 'setBindGroup').length).toBeGreaterThanOrEqual(2);
|
|
54
|
+
expect(fake.calls.some((c) => c.name === 'writeBuffer')).toBe(true);
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
it('bind compiles the CLEARCOAT extension variant', () => {
|
|
58
|
+
const { fake, state } = makeWgpuScene3DState();
|
|
59
|
+
clearcoatPbrWgpuMeshMaterialRenderer.bind(state, createClearcoatPbrMaterial(), makeLights(), makeCamera());
|
|
60
|
+
const moduleCall = fake.calls.find((c) => c.name === 'createShaderModule');
|
|
61
|
+
const code = (moduleCall!.args[0] as { code: string }).code;
|
|
62
|
+
expect(code).toContain('const CLEARCOAT : bool = true;');
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
it('draw uploads geometry and issues an indexed draw over the subset range', () => {
|
|
66
|
+
const { fake, state } = makeWgpuScene3DState();
|
|
67
|
+
const proxy = makeProxy();
|
|
68
|
+
clearcoatPbrWgpuMeshMaterialRenderer.bind(state, proxy.material, makeLights(), makeCamera());
|
|
69
|
+
clearcoatPbrWgpuMeshMaterialRenderer.draw(state, proxy, createBoxMeshGeometry());
|
|
70
|
+
|
|
71
|
+
const drawCall = fake.calls.find((c) => c.name === 'drawIndexed');
|
|
72
|
+
expect(drawCall).toBeDefined();
|
|
73
|
+
expect(drawCall!.args[0]).toBe(proxy.subset.indexCount);
|
|
74
|
+
expect(drawCall!.args[2]).toBe(proxy.subset.indexOffset);
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
it('draw is a no-op when bind has not selected a pipeline', () => {
|
|
78
|
+
const { fake, state } = makeWgpuScene3DState();
|
|
79
|
+
clearcoatPbrWgpuMeshMaterialRenderer.draw(state, makeProxy(), createBoxMeshGeometry());
|
|
80
|
+
expect(fake.calls.some((c) => c.name === 'drawIndexed')).toBe(false);
|
|
81
|
+
});
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
describe('registerClearcoatPbrWgpuMaterial', () => {
|
|
85
|
+
it('installs the renderer for ClearcoatPbrMaterialKind', () => {
|
|
86
|
+
const { state } = makeWgpuScene3DState();
|
|
87
|
+
registerClearcoatPbrWgpuMaterial(state);
|
|
88
|
+
expect(getWgpuMeshMaterialRenderer(state, ClearcoatPbrMaterialKind)).toBe(clearcoatPbrWgpuMeshMaterialRenderer);
|
|
89
|
+
});
|
|
90
|
+
});
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
import { createCamera3D } from '@flighthq/camera';
|
|
2
|
+
import { createMatrix3, createMatrix4 } from '@flighthq/geometry';
|
|
3
|
+
import { createCustomShaderMaterial } from '@flighthq/materials';
|
|
4
|
+
import { createBoxMeshGeometry } from '@flighthq/mesh';
|
|
5
|
+
import { createTexture } from '@flighthq/texture';
|
|
6
|
+
import type { Camera3D, ImageResource, Scene3DLightBlock, Scene3DRenderProxy } from '@flighthq/types';
|
|
7
|
+
import { CustomShaderMaterialKind } from '@flighthq/types';
|
|
8
|
+
|
|
9
|
+
import {
|
|
10
|
+
customShaderWgpuMeshMaterialRenderer,
|
|
11
|
+
getWgpuCustomMaterialShaderSource,
|
|
12
|
+
registerCustomShaderWgpuMaterial,
|
|
13
|
+
registerWgpuCustomMaterialShader,
|
|
14
|
+
} from './customShaderWgpuMeshMaterialRenderer';
|
|
15
|
+
import { getWgpuMeshMaterialRenderer } from './wgpuMeshMaterialRegistry';
|
|
16
|
+
import { makeWgpuScene3DState } from './wgpuScene3DTestHelper';
|
|
17
|
+
|
|
18
|
+
const SOURCE = `
|
|
19
|
+
@group(0) @binding(0) var<uniform> frame: vec4f;
|
|
20
|
+
@group(1) @binding(0) var<uniform> draw: vec4f;
|
|
21
|
+
@group(2) @binding(0) var<uniform> user: vec4f;
|
|
22
|
+
@vertex fn vs_main(@location(0) position: vec3f) -> @builtin(position) vec4f {
|
|
23
|
+
return vec4f(position, 1.0);
|
|
24
|
+
}
|
|
25
|
+
@fragment fn fs_main() -> @location(0) vec4f { return user; }
|
|
26
|
+
`;
|
|
27
|
+
|
|
28
|
+
const NO_LIGHTS: Scene3DLightBlock = {
|
|
29
|
+
ambientCount: 0,
|
|
30
|
+
data: new Float32Array(12),
|
|
31
|
+
directionalCount: 0,
|
|
32
|
+
hemisphereCount: 0,
|
|
33
|
+
pointCount: 0,
|
|
34
|
+
spotCount: 0,
|
|
35
|
+
version: 1,
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
function makeCamera(): Camera3D {
|
|
39
|
+
return createCamera3D({
|
|
40
|
+
far: 100,
|
|
41
|
+
near: 0.1,
|
|
42
|
+
projection: { aspect: 1, fovY: Math.PI / 3, kind: 'perspective' },
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
function makeProxy(): Scene3DRenderProxy {
|
|
47
|
+
const geometry = createBoxMeshGeometry();
|
|
48
|
+
return {
|
|
49
|
+
material: createCustomShaderMaterial({ shaderKey: 'test' }),
|
|
50
|
+
normalMatrix: createMatrix3(),
|
|
51
|
+
subset: geometry.subsets[0],
|
|
52
|
+
worldMatrix: createMatrix4(),
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
describe('customShaderWgpuMeshMaterialRenderer', () => {
|
|
57
|
+
it('reuses Frame/Draw layouts and binds reserved user + texture groups', () => {
|
|
58
|
+
const { fake, state } = makeWgpuScene3DState();
|
|
59
|
+
registerWgpuCustomMaterialShader(state, 'test', SOURCE);
|
|
60
|
+
customShaderWgpuMeshMaterialRenderer.bind(
|
|
61
|
+
state,
|
|
62
|
+
createCustomShaderMaterial({ shaderKey: 'test' }),
|
|
63
|
+
NO_LIGHTS,
|
|
64
|
+
makeCamera(),
|
|
65
|
+
);
|
|
66
|
+
|
|
67
|
+
const layoutCall = fake.calls.find((call) => call.name === 'createPipelineLayout');
|
|
68
|
+
const descriptor = layoutCall?.args[0] as GPUPipelineLayoutDescriptor;
|
|
69
|
+
expect(descriptor.bindGroupLayouts).toHaveLength(4);
|
|
70
|
+
expect(fake.calls.filter((call) => call.name === 'setBindGroup').map((call) => call.args[0])).toEqual([0, 2, 3]);
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
it('packs logical values into alphabetically sorted vec4 slots', () => {
|
|
74
|
+
const { fake, state } = makeWgpuScene3DState();
|
|
75
|
+
registerWgpuCustomMaterialShader(state, 'test', SOURCE);
|
|
76
|
+
customShaderWgpuMeshMaterialRenderer.bind(
|
|
77
|
+
state,
|
|
78
|
+
createCustomShaderMaterial({
|
|
79
|
+
shaderKey: 'test',
|
|
80
|
+
uniforms: { zeta: [5, 6], alpha: 2 },
|
|
81
|
+
}),
|
|
82
|
+
NO_LIGHTS,
|
|
83
|
+
makeCamera(),
|
|
84
|
+
);
|
|
85
|
+
|
|
86
|
+
const write = fake.calls.find((call) => call.name === 'writeBuffer');
|
|
87
|
+
const packed = new Float32Array(write!.args[2] as ArrayBuffer);
|
|
88
|
+
expect(Array.from(packed.slice(0, 8))).toEqual([2, 0, 0, 0, 5, 6, 0, 0]);
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
it('reuses the group(3) bind group when the texture bag is unchanged', () => {
|
|
92
|
+
const { fake, state } = makeWgpuScene3DState();
|
|
93
|
+
const material = createCustomShaderMaterial({
|
|
94
|
+
shaderKey: 'test',
|
|
95
|
+
textures: { map: createTexture() },
|
|
96
|
+
});
|
|
97
|
+
registerWgpuCustomMaterialShader(state, 'test', SOURCE);
|
|
98
|
+
customShaderWgpuMeshMaterialRenderer.bind(state, material, NO_LIGHTS, makeCamera());
|
|
99
|
+
const firstCount = fake.calls.filter((call) => call.name === 'createBindGroup').length;
|
|
100
|
+
|
|
101
|
+
customShaderWgpuMeshMaterialRenderer.bind(state, material, NO_LIGHTS, makeCamera());
|
|
102
|
+
expect(fake.calls.filter((call) => call.name === 'createBindGroup')).toHaveLength(firstCount);
|
|
103
|
+
});
|
|
104
|
+
|
|
105
|
+
it('rebuilds group(3) for readiness, replacement, sampler, key, and bag-order changes', () => {
|
|
106
|
+
const { fake, state } = makeWgpuScene3DState();
|
|
107
|
+
state.device.createSampler = ((descriptor: GPUSamplerDescriptor) => {
|
|
108
|
+
fake.calls.push({ name: 'createSampler', args: [descriptor] });
|
|
109
|
+
return { descriptor } as unknown as GPUSampler;
|
|
110
|
+
}) as GPUDevice['createSampler'];
|
|
111
|
+
const first = createTexture();
|
|
112
|
+
const second = createTexture();
|
|
113
|
+
const material = createCustomShaderMaterial({
|
|
114
|
+
shaderKey: 'test',
|
|
115
|
+
textures: { first, second },
|
|
116
|
+
});
|
|
117
|
+
registerWgpuCustomMaterialShader(state, 'test', SOURCE);
|
|
118
|
+
const bindGroupCount = () => fake.calls.filter((call) => call.name === 'createBindGroup').length;
|
|
119
|
+
const bindAndExpectRebuild = (previous: number): number => {
|
|
120
|
+
customShaderWgpuMeshMaterialRenderer.bind(state, material, NO_LIGHTS, makeCamera());
|
|
121
|
+
const next = bindGroupCount();
|
|
122
|
+
expect(next).toBeGreaterThan(previous);
|
|
123
|
+
return next;
|
|
124
|
+
};
|
|
125
|
+
|
|
126
|
+
let count = bindAndExpectRebuild(0);
|
|
127
|
+
first.sampler.wrapU = 'repeat';
|
|
128
|
+
count = bindAndExpectRebuild(count);
|
|
129
|
+
|
|
130
|
+
first.image = makeImageResource(1);
|
|
131
|
+
count = bindAndExpectRebuild(count);
|
|
132
|
+
first.image = makeImageResource(2);
|
|
133
|
+
count = bindAndExpectRebuild(count);
|
|
134
|
+
|
|
135
|
+
material.textures = { renamed: first, second };
|
|
136
|
+
count = bindAndExpectRebuild(count);
|
|
137
|
+
material.textures = { second, renamed: first };
|
|
138
|
+
bindAndExpectRebuild(count);
|
|
139
|
+
});
|
|
140
|
+
|
|
141
|
+
it('draws an indexed subset after a valid bind and skips a missing shader', () => {
|
|
142
|
+
const { fake, state } = makeWgpuScene3DState();
|
|
143
|
+
const geometry = createBoxMeshGeometry();
|
|
144
|
+
const proxy = makeProxy();
|
|
145
|
+
customShaderWgpuMeshMaterialRenderer.bind(state, proxy.material, NO_LIGHTS, makeCamera());
|
|
146
|
+
customShaderWgpuMeshMaterialRenderer.draw(state, proxy, geometry);
|
|
147
|
+
expect(fake.calls.some((call) => call.name === 'drawIndexed')).toBe(false);
|
|
148
|
+
|
|
149
|
+
registerWgpuCustomMaterialShader(state, 'test', SOURCE);
|
|
150
|
+
customShaderWgpuMeshMaterialRenderer.bind(state, proxy.material, NO_LIGHTS, makeCamera());
|
|
151
|
+
customShaderWgpuMeshMaterialRenderer.draw(state, proxy, geometry);
|
|
152
|
+
expect(fake.calls.some((call) => call.name === 'drawIndexed')).toBe(true);
|
|
153
|
+
});
|
|
154
|
+
|
|
155
|
+
it('skips a user block that exceeds the fixed packing capacity', () => {
|
|
156
|
+
const { fake, state } = makeWgpuScene3DState();
|
|
157
|
+
registerWgpuCustomMaterialShader(state, 'test', SOURCE);
|
|
158
|
+
const uniforms: Record<string, number> = {};
|
|
159
|
+
for (let i = 0; i < 33; i++) uniforms[`value${i}`] = i;
|
|
160
|
+
customShaderWgpuMeshMaterialRenderer.bind(
|
|
161
|
+
state,
|
|
162
|
+
createCustomShaderMaterial({ shaderKey: 'test', uniforms }),
|
|
163
|
+
NO_LIGHTS,
|
|
164
|
+
makeCamera(),
|
|
165
|
+
);
|
|
166
|
+
expect(fake.calls.some((call) => call.name === 'createRenderPipeline')).toBe(false);
|
|
167
|
+
});
|
|
168
|
+
});
|
|
169
|
+
|
|
170
|
+
function makeImageResource(version: number): ImageResource {
|
|
171
|
+
return {
|
|
172
|
+
alphaType: 'straight',
|
|
173
|
+
compressed: null,
|
|
174
|
+
data: null,
|
|
175
|
+
format: 'rgba8unorm',
|
|
176
|
+
height: 1,
|
|
177
|
+
source: {} as CanvasImageSource,
|
|
178
|
+
version,
|
|
179
|
+
width: 1,
|
|
180
|
+
} as ImageResource;
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
describe('getWgpuCustomMaterialShaderSource', () => {
|
|
184
|
+
it('returns null for an unknown key', () => {
|
|
185
|
+
const { state } = makeWgpuScene3DState();
|
|
186
|
+
expect(getWgpuCustomMaterialShaderSource(state, 'unknown')).toBeNull();
|
|
187
|
+
});
|
|
188
|
+
});
|
|
189
|
+
|
|
190
|
+
describe('registerCustomShaderWgpuMaterial', () => {
|
|
191
|
+
it('installs the renderer for CustomShaderMaterialKind', () => {
|
|
192
|
+
const { state } = makeWgpuScene3DState();
|
|
193
|
+
registerCustomShaderWgpuMaterial(state);
|
|
194
|
+
expect(getWgpuMeshMaterialRenderer(state, CustomShaderMaterialKind)).toBe(customShaderWgpuMeshMaterialRenderer);
|
|
195
|
+
});
|
|
196
|
+
});
|
|
197
|
+
|
|
198
|
+
describe('registerWgpuCustomMaterialShader', () => {
|
|
199
|
+
it('registers WGSL by key with last-write-wins lookup', () => {
|
|
200
|
+
const { state } = makeWgpuScene3DState();
|
|
201
|
+
registerWgpuCustomMaterialShader(state, 'ripple', SOURCE);
|
|
202
|
+
expect(getWgpuCustomMaterialShaderSource(state, 'ripple')).toBe(SOURCE);
|
|
203
|
+
registerWgpuCustomMaterialShader(state, 'ripple', `${SOURCE}\n// edited`);
|
|
204
|
+
expect(getWgpuCustomMaterialShaderSource(state, 'ripple')).toContain('edited');
|
|
205
|
+
expect(getWgpuCustomMaterialShaderSource(state, 'missing')).toBeNull();
|
|
206
|
+
});
|
|
207
|
+
});
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { createCamera3D } from '@flighthq/camera';
|
|
2
|
+
import { createMatrix3, createMatrix4 } from '@flighthq/geometry';
|
|
3
|
+
import { createDepthMaterial } from '@flighthq/materials';
|
|
4
|
+
import { createBoxMeshGeometry } from '@flighthq/mesh';
|
|
5
|
+
import type { Camera3D, Scene3DLightBlock, Scene3DRenderProxy } from '@flighthq/types';
|
|
6
|
+
import { DepthMaterialKind } from '@flighthq/types';
|
|
7
|
+
|
|
8
|
+
import { depthWgpuMeshMaterialRenderer, registerDepthWgpuMaterial } from './depthWgpuMeshMaterialRenderer';
|
|
9
|
+
import { getWgpuMeshMaterialRenderer } from './wgpuMeshMaterialRegistry';
|
|
10
|
+
import { makeWgpuScene3DState } from './wgpuScene3DTestHelper';
|
|
11
|
+
|
|
12
|
+
function makeCamera(): Camera3D {
|
|
13
|
+
return createCamera3D({ far: 100, near: 0.1, projection: { aspect: 1, fovY: Math.PI / 3, kind: 'perspective' } });
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
const NO_LIGHTS: Scene3DLightBlock = {
|
|
17
|
+
ambientCount: 0,
|
|
18
|
+
data: new Float32Array(12),
|
|
19
|
+
directionalCount: 0,
|
|
20
|
+
hemisphereCount: 0,
|
|
21
|
+
pointCount: 0,
|
|
22
|
+
spotCount: 0,
|
|
23
|
+
version: 1,
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
function makeProxy(): Scene3DRenderProxy {
|
|
27
|
+
const geometry = createBoxMeshGeometry();
|
|
28
|
+
return {
|
|
29
|
+
material: createDepthMaterial(),
|
|
30
|
+
normalMatrix: createMatrix3(),
|
|
31
|
+
subset: geometry.subsets[0],
|
|
32
|
+
worldMatrix: createMatrix4(),
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
describe('depthWgpuMeshMaterialRenderer', () => {
|
|
37
|
+
it('bind selects the depth pipeline and writes the frame + material uniforms', () => {
|
|
38
|
+
const { fake, state } = makeWgpuScene3DState();
|
|
39
|
+
depthWgpuMeshMaterialRenderer.bind(state, createDepthMaterial({ far: 50, near: 1 }), NO_LIGHTS, makeCamera());
|
|
40
|
+
expect(fake.calls.some((c) => c.name === 'createRenderPipeline')).toBe(true);
|
|
41
|
+
expect(fake.calls.some((c) => c.name === 'setPipeline')).toBe(true);
|
|
42
|
+
expect(fake.calls.some((c) => c.name === 'writeBuffer')).toBe(true);
|
|
43
|
+
expect(fake.calls.filter((c) => c.name === 'setBindGroup').length).toBeGreaterThanOrEqual(2);
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
it('draw issues an indexed draw over the subset after bind', () => {
|
|
47
|
+
const { fake, state } = makeWgpuScene3DState();
|
|
48
|
+
const proxy = makeProxy();
|
|
49
|
+
depthWgpuMeshMaterialRenderer.bind(state, proxy.material, NO_LIGHTS, makeCamera());
|
|
50
|
+
depthWgpuMeshMaterialRenderer.draw(state, proxy, createBoxMeshGeometry());
|
|
51
|
+
const drawCall = fake.calls.find((c) => c.name === 'drawIndexed');
|
|
52
|
+
expect(drawCall).toBeDefined();
|
|
53
|
+
expect(drawCall!.args[0]).toBe(proxy.subset.indexCount);
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
it('draw is a no-op when bind has not selected a pipeline', () => {
|
|
57
|
+
const { fake, state } = makeWgpuScene3DState();
|
|
58
|
+
depthWgpuMeshMaterialRenderer.draw(state, makeProxy(), createBoxMeshGeometry());
|
|
59
|
+
expect(fake.calls.some((c) => c.name === 'drawIndexed')).toBe(false);
|
|
60
|
+
});
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
describe('registerDepthWgpuMaterial', () => {
|
|
64
|
+
it('installs the renderer for DepthMaterialKind', () => {
|
|
65
|
+
const { state } = makeWgpuScene3DState();
|
|
66
|
+
registerDepthWgpuMaterial(state);
|
|
67
|
+
expect(getWgpuMeshMaterialRenderer(state, DepthMaterialKind)).toBe(depthWgpuMeshMaterialRenderer);
|
|
68
|
+
});
|
|
69
|
+
});
|