@flighthq/scene3d-gl 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/anisotropyPbrGlMeshMaterialRenderer.d.ts +4 -0
- package/dist/anisotropyPbrGlMeshMaterialRenderer.d.ts.map +1 -0
- package/dist/anisotropyPbrGlMeshMaterialRenderer.js +45 -0
- package/dist/anisotropyPbrGlMeshMaterialRenderer.js.map +1 -0
- package/dist/blinnPhongGlMeshMaterialRenderer.d.ts +4 -0
- package/dist/blinnPhongGlMeshMaterialRenderer.d.ts.map +1 -0
- package/dist/blinnPhongGlMeshMaterialRenderer.js +102 -0
- package/dist/blinnPhongGlMeshMaterialRenderer.js.map +1 -0
- package/dist/clearcoatPbrGlMeshMaterialRenderer.d.ts +4 -0
- package/dist/clearcoatPbrGlMeshMaterialRenderer.d.ts.map +1 -0
- package/dist/clearcoatPbrGlMeshMaterialRenderer.js +45 -0
- package/dist/clearcoatPbrGlMeshMaterialRenderer.js.map +1 -0
- package/dist/customShaderGlMeshMaterialRenderer.d.ts +6 -0
- package/dist/customShaderGlMeshMaterialRenderer.d.ts.map +1 -0
- package/dist/customShaderGlMeshMaterialRenderer.js +136 -0
- package/dist/customShaderGlMeshMaterialRenderer.js.map +1 -0
- package/dist/depthGlMeshMaterialRenderer.d.ts +4 -0
- package/dist/depthGlMeshMaterialRenderer.d.ts.map +1 -0
- package/dist/depthGlMeshMaterialRenderer.js +36 -0
- package/dist/depthGlMeshMaterialRenderer.js.map +1 -0
- package/dist/drawGlScene3D.d.ts +3 -0
- package/dist/drawGlScene3D.d.ts.map +1 -0
- package/dist/drawGlScene3D.js +251 -0
- package/dist/drawGlScene3D.js.map +1 -0
- package/dist/emissiveGlMeshMaterialRenderer.d.ts +4 -0
- package/dist/emissiveGlMeshMaterialRenderer.d.ts.map +1 -0
- package/dist/emissiveGlMeshMaterialRenderer.js +49 -0
- package/dist/emissiveGlMeshMaterialRenderer.js.map +1 -0
- package/dist/enableGlScene3DColorSpaceGuards.d.ts +4 -0
- package/dist/enableGlScene3DColorSpaceGuards.d.ts.map +1 -0
- package/dist/enableGlScene3DColorSpaceGuards.js +22 -0
- package/dist/enableGlScene3DColorSpaceGuards.js.map +1 -0
- package/dist/enableGlScene3DCustomShaderGuards.d.ts +4 -0
- package/dist/enableGlScene3DCustomShaderGuards.d.ts.map +1 -0
- package/dist/enableGlScene3DCustomShaderGuards.js +71 -0
- package/dist/enableGlScene3DCustomShaderGuards.js.map +1 -0
- package/dist/enableGlScene3DDeformGuards.d.ts +4 -0
- package/dist/enableGlScene3DDeformGuards.d.ts.map +1 -0
- package/dist/enableGlScene3DDeformGuards.js +42 -0
- package/dist/enableGlScene3DDeformGuards.js.map +1 -0
- package/dist/enableGlScene3DForwardLightSelectionGuards.d.ts +4 -0
- package/dist/enableGlScene3DForwardLightSelectionGuards.d.ts.map +1 -0
- package/dist/enableGlScene3DForwardLightSelectionGuards.js +21 -0
- package/dist/enableGlScene3DForwardLightSelectionGuards.js.map +1 -0
- package/dist/explainGlScene3DForwardLightSelection.d.ts +3 -0
- package/dist/explainGlScene3DForwardLightSelection.d.ts.map +1 -0
- package/dist/explainGlScene3DForwardLightSelection.js +19 -0
- package/dist/explainGlScene3DForwardLightSelection.js.map +1 -0
- package/dist/glClassicPrelude.d.ts +9 -0
- package/dist/glClassicPrelude.d.ts.map +1 -0
- package/dist/glClassicPrelude.js +288 -0
- package/dist/glClassicPrelude.js.map +1 -0
- package/dist/glDebugPrelude.d.ts +9 -0
- package/dist/glDebugPrelude.d.ts.map +1 -0
- package/dist/glDebugPrelude.js +143 -0
- package/dist/glDebugPrelude.js.map +1 -0
- package/dist/glEnvironmentCube.d.ts +5 -0
- package/dist/glEnvironmentCube.d.ts.map +1 -0
- package/dist/glEnvironmentCube.js +65 -0
- package/dist/glEnvironmentCube.js.map +1 -0
- package/dist/glEnvironmentIblBake.d.ts +4 -0
- package/dist/glEnvironmentIblBake.d.ts.map +1 -0
- package/dist/glEnvironmentIblBake.js +365 -0
- package/dist/glEnvironmentIblBake.js.map +1 -0
- package/dist/glEnvironmentSkybox.d.ts +3 -0
- package/dist/glEnvironmentSkybox.d.ts.map +1 -0
- package/dist/glEnvironmentSkybox.js +95 -0
- package/dist/glEnvironmentSkybox.js.map +1 -0
- package/dist/glLitProgram.d.ts +5 -0
- package/dist/glLitProgram.d.ts.map +1 -0
- package/dist/glLitProgram.js +211 -0
- package/dist/glLitProgram.js.map +1 -0
- package/dist/glMatcapPrelude.d.ts +8 -0
- package/dist/glMatcapPrelude.d.ts.map +1 -0
- package/dist/glMatcapPrelude.js +118 -0
- package/dist/glMatcapPrelude.js.map +1 -0
- package/dist/glMeshMaterialRegistry.d.ts +5 -0
- package/dist/glMeshMaterialRegistry.d.ts.map +1 -0
- package/dist/glMeshMaterialRegistry.js +29 -0
- package/dist/glMeshMaterialRegistry.js.map +1 -0
- package/dist/glMeshProgram.d.ts +14 -0
- package/dist/glMeshProgram.d.ts.map +1 -0
- package/dist/glMeshProgram.js +193 -0
- package/dist/glMeshProgram.js.map +1 -0
- package/dist/glMeshUpload.d.ts +4 -0
- package/dist/glMeshUpload.d.ts.map +1 -0
- package/dist/glMeshUpload.js +190 -0
- package/dist/glMeshUpload.js.map +1 -0
- package/dist/glParticleEmitter3D.d.ts +4 -0
- package/dist/glParticleEmitter3D.d.ts.map +1 -0
- package/dist/glParticleEmitter3D.js +342 -0
- package/dist/glParticleEmitter3D.js.map +1 -0
- package/dist/glPbrPrelude.d.ts +8 -0
- package/dist/glPbrPrelude.d.ts.map +1 -0
- package/dist/glPbrPrelude.js +569 -0
- package/dist/glPbrPrelude.js.map +1 -0
- package/dist/glPbrProgramCache.d.ts +4 -0
- package/dist/glPbrProgramCache.d.ts.map +1 -0
- package/dist/glPbrProgramCache.js +63 -0
- package/dist/glPbrProgramCache.js.map +1 -0
- package/dist/glPbrStandardBlock.d.ts +13 -0
- package/dist/glPbrStandardBlock.d.ts.map +1 -0
- package/dist/glPbrStandardBlock.js +107 -0
- package/dist/glPbrStandardBlock.js.map +1 -0
- package/dist/glScene3DRuntime.d.ts +5 -0
- package/dist/glScene3DRuntime.d.ts.map +1 -0
- package/dist/glScene3DRuntime.js +99 -0
- package/dist/glScene3DRuntime.js.map +1 -0
- package/dist/glScene3DTestHelper.d.ts +20 -0
- package/dist/glScene3DTestHelper.d.ts.map +1 -0
- package/dist/glScene3DTestHelper.js +178 -0
- package/dist/glScene3DTestHelper.js.map +1 -0
- package/dist/glScene3DTime.d.ts +4 -0
- package/dist/glScene3DTime.d.ts.map +1 -0
- package/dist/glScene3DTime.js +18 -0
- package/dist/glScene3DTime.js.map +1 -0
- package/dist/glShadedBuiltInModifiers.d.ts +11 -0
- package/dist/glShadedBuiltInModifiers.d.ts.map +1 -0
- package/dist/glShadedBuiltInModifiers.js +386 -0
- package/dist/glShadedBuiltInModifiers.js.map +1 -0
- package/dist/glShadedModifierSnippet.d.ts +4 -0
- package/dist/glShadedModifierSnippet.d.ts.map +1 -0
- package/dist/glShadedModifierSnippet.js +24 -0
- package/dist/glShadedModifierSnippet.js.map +1 -0
- package/dist/glShadedPrelude.d.ts +5 -0
- package/dist/glShadedPrelude.d.ts.map +1 -0
- package/dist/glShadedPrelude.js +393 -0
- package/dist/glShadedPrelude.js.map +1 -0
- package/dist/glShadowMap.d.ts +3 -0
- package/dist/glShadowMap.d.ts.map +1 -0
- package/dist/glShadowMap.js +150 -0
- package/dist/glShadowMap.js.map +1 -0
- package/dist/glToonPrelude.d.ts +7 -0
- package/dist/glToonPrelude.d.ts.map +1 -0
- package/dist/glToonPrelude.js +172 -0
- package/dist/glToonPrelude.js.map +1 -0
- package/dist/glUnlitPrelude.d.ts +9 -0
- package/dist/glUnlitPrelude.d.ts.map +1 -0
- package/dist/glUnlitPrelude.js +160 -0
- package/dist/glUnlitPrelude.js.map +1 -0
- package/dist/glWireframePrelude.d.ts +6 -0
- package/dist/glWireframePrelude.d.ts.map +1 -0
- package/dist/glWireframePrelude.js +56 -0
- package/dist/glWireframePrelude.js.map +1 -0
- package/dist/glWireframeUpload.d.ts +4 -0
- package/dist/glWireframeUpload.d.ts.map +1 -0
- package/dist/glWireframeUpload.js +85 -0
- package/dist/glWireframeUpload.js.map +1 -0
- package/dist/index.d.ts +56 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +56 -0
- package/dist/index.js.map +1 -0
- package/dist/iridescencePbrGlMeshMaterialRenderer.d.ts +4 -0
- package/dist/iridescencePbrGlMeshMaterialRenderer.d.ts.map +1 -0
- package/dist/iridescencePbrGlMeshMaterialRenderer.js +54 -0
- package/dist/iridescencePbrGlMeshMaterialRenderer.js.map +1 -0
- package/dist/lambertGlMeshMaterialRenderer.d.ts +4 -0
- package/dist/lambertGlMeshMaterialRenderer.d.ts.map +1 -0
- package/dist/lambertGlMeshMaterialRenderer.js +70 -0
- package/dist/lambertGlMeshMaterialRenderer.js.map +1 -0
- package/dist/matcapGlMeshMaterialRenderer.d.ts +4 -0
- package/dist/matcapGlMeshMaterialRenderer.d.ts.map +1 -0
- package/dist/matcapGlMeshMaterialRenderer.js +49 -0
- package/dist/matcapGlMeshMaterialRenderer.js.map +1 -0
- package/dist/normalGlMeshMaterialRenderer.d.ts +4 -0
- package/dist/normalGlMeshMaterialRenderer.d.ts.map +1 -0
- package/dist/normalGlMeshMaterialRenderer.js +39 -0
- package/dist/normalGlMeshMaterialRenderer.js.map +1 -0
- package/dist/phongGlMeshMaterialRenderer.d.ts +4 -0
- package/dist/phongGlMeshMaterialRenderer.d.ts.map +1 -0
- package/dist/phongGlMeshMaterialRenderer.js +90 -0
- package/dist/phongGlMeshMaterialRenderer.js.map +1 -0
- package/dist/prepareGlScene3DForwardLights.d.ts +3 -0
- package/dist/prepareGlScene3DForwardLights.d.ts.map +1 -0
- package/dist/prepareGlScene3DForwardLights.js +117 -0
- package/dist/prepareGlScene3DForwardLights.js.map +1 -0
- package/dist/presentGlScene3D.d.ts +3 -0
- package/dist/presentGlScene3D.d.ts.map +1 -0
- package/dist/presentGlScene3D.js +21 -0
- package/dist/presentGlScene3D.js.map +1 -0
- package/dist/registerStandardPbrGlMaterial.d.ts +3 -0
- package/dist/registerStandardPbrGlMaterial.d.ts.map +1 -0
- package/dist/registerStandardPbrGlMaterial.js +11 -0
- package/dist/registerStandardPbrGlMaterial.js.map +1 -0
- package/dist/shadedGlMeshMaterialRenderer.d.ts +4 -0
- package/dist/shadedGlMeshMaterialRenderer.d.ts.map +1 -0
- package/dist/shadedGlMeshMaterialRenderer.js +135 -0
- package/dist/shadedGlMeshMaterialRenderer.js.map +1 -0
- package/dist/sheenPbrGlMeshMaterialRenderer.d.ts +4 -0
- package/dist/sheenPbrGlMeshMaterialRenderer.d.ts.map +1 -0
- package/dist/sheenPbrGlMeshMaterialRenderer.js +54 -0
- package/dist/sheenPbrGlMeshMaterialRenderer.js.map +1 -0
- package/dist/specularGlossinessPbrGlMeshMaterialRenderer.d.ts +4 -0
- package/dist/specularGlossinessPbrGlMeshMaterialRenderer.d.ts.map +1 -0
- package/dist/specularGlossinessPbrGlMeshMaterialRenderer.js +121 -0
- package/dist/specularGlossinessPbrGlMeshMaterialRenderer.js.map +1 -0
- package/dist/specularPbrGlMeshMaterialRenderer.d.ts +4 -0
- package/dist/specularPbrGlMeshMaterialRenderer.d.ts.map +1 -0
- package/dist/specularPbrGlMeshMaterialRenderer.js +55 -0
- package/dist/specularPbrGlMeshMaterialRenderer.js.map +1 -0
- package/dist/standardPbrGlMeshMaterialRenderer.d.ts +3 -0
- package/dist/standardPbrGlMeshMaterialRenderer.d.ts.map +1 -0
- package/dist/standardPbrGlMeshMaterialRenderer.js +35 -0
- package/dist/standardPbrGlMeshMaterialRenderer.js.map +1 -0
- package/dist/subsurfacePbrGlMeshMaterialRenderer.d.ts +4 -0
- package/dist/subsurfacePbrGlMeshMaterialRenderer.d.ts.map +1 -0
- package/dist/subsurfacePbrGlMeshMaterialRenderer.js +57 -0
- package/dist/subsurfacePbrGlMeshMaterialRenderer.js.map +1 -0
- package/dist/toonGlMeshMaterialRenderer.d.ts +4 -0
- package/dist/toonGlMeshMaterialRenderer.d.ts.map +1 -0
- package/dist/toonGlMeshMaterialRenderer.js +81 -0
- package/dist/toonGlMeshMaterialRenderer.js.map +1 -0
- package/dist/transmissionVolumePbrGlMeshMaterialRenderer.d.ts +4 -0
- package/dist/transmissionVolumePbrGlMeshMaterialRenderer.d.ts.map +1 -0
- package/dist/transmissionVolumePbrGlMeshMaterialRenderer.js +62 -0
- package/dist/transmissionVolumePbrGlMeshMaterialRenderer.js.map +1 -0
- package/dist/unlitGlMeshMaterialRenderer.d.ts +4 -0
- package/dist/unlitGlMeshMaterialRenderer.d.ts.map +1 -0
- package/dist/unlitGlMeshMaterialRenderer.js +61 -0
- package/dist/unlitGlMeshMaterialRenderer.js.map +1 -0
- package/dist/vertexColorGlMeshMaterialRenderer.d.ts +4 -0
- package/dist/vertexColorGlMeshMaterialRenderer.d.ts.map +1 -0
- package/dist/vertexColorGlMeshMaterialRenderer.js +54 -0
- package/dist/vertexColorGlMeshMaterialRenderer.js.map +1 -0
- package/dist/wireframeGlMeshMaterialRenderer.d.ts +4 -0
- package/dist/wireframeGlMeshMaterialRenderer.d.ts.map +1 -0
- package/dist/wireframeGlMeshMaterialRenderer.js +50 -0
- package/dist/wireframeGlMeshMaterialRenderer.js.map +1 -0
- package/package.json +58 -0
- package/src/anisotropyPbrGlMeshMaterialRenderer.test.ts +86 -0
- package/src/blinnPhongGlMeshMaterialRenderer.test.ts +94 -0
- package/src/clearcoatPbrGlMeshMaterialRenderer.test.ts +81 -0
- package/src/customShaderGlMeshMaterialRenderer.test.ts +169 -0
- package/src/depthGlMeshMaterialRenderer.test.ts +69 -0
- package/src/drawGlScene3D.test.ts +304 -0
- package/src/emissiveGlMeshMaterialRenderer.test.ts +60 -0
- package/src/enableGlScene3DColorSpaceGuards.test.ts +63 -0
- package/src/enableGlScene3DCustomShaderGuards.test.ts +85 -0
- package/src/enableGlScene3DDeformGuards.test.ts +98 -0
- package/src/enableGlScene3DForwardLightSelectionGuards.test.ts +84 -0
- package/src/explainGlScene3DForwardLightSelection.test.ts +32 -0
- package/src/glClassicPrelude.test.ts +214 -0
- package/src/glDebugPrelude.test.ts +94 -0
- package/src/glEnvironmentCube.test.ts +71 -0
- package/src/glEnvironmentIblBake.test.ts +31 -0
- package/src/glEnvironmentSkybox.test.ts +24 -0
- package/src/glLitProgram.test.ts +181 -0
- package/src/glMatcapPrelude.test.ts +74 -0
- package/src/glMeshMaterialRegistry.test.ts +52 -0
- package/src/glMeshProgram.test.ts +406 -0
- package/src/glMeshUpload.test.ts +311 -0
- package/src/glParticleEmitter3D.test.ts +280 -0
- package/src/glPbrPrelude.test.ts +178 -0
- package/src/glPbrProgramCache.test.ts +116 -0
- package/src/glPbrStandardBlock.test.ts +85 -0
- package/src/glScene3DRuntime.test.ts +108 -0
- package/src/glScene3DTime.test.ts +31 -0
- package/src/glShadedBuiltInModifiers.test.ts +377 -0
- package/src/glShadedModifierSnippet.test.ts +46 -0
- package/src/glShadedPrelude.test.ts +177 -0
- package/src/glShadowMap.test.ts +219 -0
- package/src/glToonPrelude.test.ts +118 -0
- package/src/glUnlitPrelude.test.ts +156 -0
- package/src/glWireframePrelude.test.ts +46 -0
- package/src/glWireframeUpload.test.ts +50 -0
- package/src/iridescencePbrGlMeshMaterialRenderer.test.ts +86 -0
- package/src/lambertGlMeshMaterialRenderer.test.ts +92 -0
- package/src/matcapGlMeshMaterialRenderer.test.ts +70 -0
- package/src/normalGlMeshMaterialRenderer.test.ts +69 -0
- package/src/phongGlMeshMaterialRenderer.test.ts +94 -0
- package/src/prepareGlScene3DForwardLights.test.ts +106 -0
- package/src/presentGlScene3D.test.ts +98 -0
- package/src/registerStandardPbrGlMaterial.test.ts +14 -0
- package/src/shadedGlMeshMaterialRenderer.test.ts +106 -0
- package/src/sheenPbrGlMeshMaterialRenderer.test.ts +83 -0
- package/src/specularGlossinessPbrGlMeshMaterialRenderer.test.ts +96 -0
- package/src/specularPbrGlMeshMaterialRenderer.test.ts +83 -0
- package/src/standardPbrGlMeshMaterialRenderer.test.ts +88 -0
- package/src/subsurfacePbrGlMeshMaterialRenderer.test.ts +86 -0
- package/src/toonGlMeshMaterialRenderer.test.ts +92 -0
- package/src/transmissionVolumePbrGlMeshMaterialRenderer.test.ts +93 -0
- package/src/unlitGlMeshMaterialRenderer.test.ts +88 -0
- package/src/vertexColorGlMeshMaterialRenderer.test.ts +60 -0
- package/src/wireframeGlMeshMaterialRenderer.test.ts +69 -0
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
import type { GlRenderState, GlLitProgram } from '@flighthq/types';
|
|
2
|
+
import { EntityRuntimeKey, SCENE_LIGHT_BLOCK_FLOATS } from '@flighthq/types';
|
|
3
|
+
|
|
4
|
+
import { bindGlMeshLightBlock, GL_MESH_LIGHT_BLOCK_GLSL, resolveGlLitLocations } from './glLitProgram';
|
|
5
|
+
import { makeFakeGl2 } from './glScene3DTestHelper';
|
|
6
|
+
|
|
7
|
+
function makeLitProgram(): GlLitProgram {
|
|
8
|
+
const loc = (name: string): WebGLUniformLocation => ({ name }) as WebGLUniformLocation;
|
|
9
|
+
return {
|
|
10
|
+
locAmbientCount: loc('u_ambientCount'),
|
|
11
|
+
locAmbientRadiance: loc('u_ambientRadiance'),
|
|
12
|
+
locCameraPosition: loc('u_cameraPosition'),
|
|
13
|
+
locDirectional: loc('u_directional'),
|
|
14
|
+
locDirectionalCount: loc('u_directionalCount'),
|
|
15
|
+
locDirectionalRadiance: loc('u_directionalRadiance'),
|
|
16
|
+
locHemisphereCount: loc('u_hemisphereCount'),
|
|
17
|
+
locHemisphereLights: loc('u_hemisphereLights'),
|
|
18
|
+
locIblBrdf: loc('u_iblBrdf'),
|
|
19
|
+
locIblEnabled: loc('u_iblEnabled'),
|
|
20
|
+
locIblIntensity: loc('u_iblIntensity'),
|
|
21
|
+
locIblIrradiance: loc('u_iblIrradiance'),
|
|
22
|
+
locIblMaxMip: loc('u_iblMaxMip'),
|
|
23
|
+
locIblPrefiltered: loc('u_iblPrefiltered'),
|
|
24
|
+
locModel: loc('u_model'),
|
|
25
|
+
locNormalMatrix: loc('u_normalMatrix'),
|
|
26
|
+
locPointCount: loc('u_pointCount'),
|
|
27
|
+
locPointLights: loc('u_pointLights'),
|
|
28
|
+
locShadowEnabled: loc('u_shadowEnabled'),
|
|
29
|
+
locShadowMap: loc('u_shadowMap'),
|
|
30
|
+
locShadowMatrix: loc('u_shadowMatrix'),
|
|
31
|
+
locSpotCount: loc('u_spotCount'),
|
|
32
|
+
locSpotLights: loc('u_spotLights'),
|
|
33
|
+
locViewProjection: loc('u_viewProjection'),
|
|
34
|
+
program: {} as WebGLProgram,
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
function makeState(gl: ReturnType<typeof makeFakeGl2>): GlRenderState {
|
|
39
|
+
return { [EntityRuntimeKey]: {}, gl } as unknown as GlRenderState;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
describe('bindGlMeshLightBlock', () => {
|
|
43
|
+
it('uploads the directional, ambient, count, shadow-gate, and ibl-gate uniforms from the packed block', () => {
|
|
44
|
+
const gl = makeFakeGl2();
|
|
45
|
+
const data = new Float32Array(SCENE_LIGHT_BLOCK_FLOATS);
|
|
46
|
+
data[0] = 0;
|
|
47
|
+
data[1] = -1;
|
|
48
|
+
data[4] = 1;
|
|
49
|
+
data[5] = 1;
|
|
50
|
+
data[6] = 1;
|
|
51
|
+
data[8] = 0.2;
|
|
52
|
+
bindGlMeshLightBlock(makeState(gl), makeLitProgram(), {
|
|
53
|
+
ambientCount: 1,
|
|
54
|
+
data,
|
|
55
|
+
directionalCount: 1,
|
|
56
|
+
hemisphereCount: 0,
|
|
57
|
+
pointCount: 0,
|
|
58
|
+
spotCount: 0,
|
|
59
|
+
version: 1,
|
|
60
|
+
});
|
|
61
|
+
expect(gl.calls.filter((c) => c.name === 'uniform4f').length).toBe(2);
|
|
62
|
+
expect(gl.calls.filter((c) => c.name === 'uniform3f').length).toBe(1);
|
|
63
|
+
// directionalCount + ambientCount + shadowEnabled (0, no active shadow) + iblEnabled (0, no IBL).
|
|
64
|
+
expect(gl.calls.filter((c) => c.name === 'uniform1f').length).toBe(4);
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
it('skips the light uniform upload when the program already holds the block version', () => {
|
|
68
|
+
const gl = makeFakeGl2();
|
|
69
|
+
const program = makeLitProgram();
|
|
70
|
+
const state = makeState(gl);
|
|
71
|
+
const block = {
|
|
72
|
+
ambientCount: 1,
|
|
73
|
+
data: new Float32Array(SCENE_LIGHT_BLOCK_FLOATS),
|
|
74
|
+
directionalCount: 1,
|
|
75
|
+
hemisphereCount: 0,
|
|
76
|
+
pointCount: 0,
|
|
77
|
+
spotCount: 0,
|
|
78
|
+
version: 7,
|
|
79
|
+
};
|
|
80
|
+
bindGlMeshLightBlock(state, program, block);
|
|
81
|
+
bindGlMeshLightBlock(state, program, block);
|
|
82
|
+
// Two binds, one program, one version: locDirectional/locDirectionalRadiance (uniform4f) and
|
|
83
|
+
// locAmbientRadiance (uniform3f) upload exactly once — only the light block is gated.
|
|
84
|
+
expect(gl.calls.filter((c) => c.name === 'uniform4f').length).toBe(2);
|
|
85
|
+
expect(gl.calls.filter((c) => c.name === 'uniform3f').length).toBe(1);
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
it('re-uploads the light uniforms when the block version changes', () => {
|
|
89
|
+
const gl = makeFakeGl2();
|
|
90
|
+
const program = makeLitProgram();
|
|
91
|
+
const state = makeState(gl);
|
|
92
|
+
const data = new Float32Array(SCENE_LIGHT_BLOCK_FLOATS);
|
|
93
|
+
const block = { ambientCount: 1, data, directionalCount: 1, hemisphereCount: 0, pointCount: 0, spotCount: 0 };
|
|
94
|
+
bindGlMeshLightBlock(state, program, { ...block, version: 1 });
|
|
95
|
+
bindGlMeshLightBlock(state, program, { ...block, version: 2 });
|
|
96
|
+
expect(gl.calls.filter((c) => c.name === 'uniform4f').length).toBe(4);
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
it('re-uploads when a different per-object block has the same version', () => {
|
|
100
|
+
const gl = makeFakeGl2();
|
|
101
|
+
const program = makeLitProgram();
|
|
102
|
+
const state = makeState(gl);
|
|
103
|
+
const common = {
|
|
104
|
+
ambientCount: 0,
|
|
105
|
+
directionalCount: 0,
|
|
106
|
+
hemisphereCount: 0,
|
|
107
|
+
pointCount: 1,
|
|
108
|
+
spotCount: 0,
|
|
109
|
+
version: 1,
|
|
110
|
+
};
|
|
111
|
+
bindGlMeshLightBlock(state, program, { ...common, data: new Float32Array(SCENE_LIGHT_BLOCK_FLOATS) });
|
|
112
|
+
bindGlMeshLightBlock(state, program, { ...common, data: new Float32Array(SCENE_LIGHT_BLOCK_FLOATS) });
|
|
113
|
+
expect(gl.calls.filter((c) => c.name === 'uniform4f')).toHaveLength(4);
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
it('uploads the punctual light arrays and their int counts from the packed block', () => {
|
|
117
|
+
const gl = makeFakeGl2();
|
|
118
|
+
bindGlMeshLightBlock(makeState(gl), makeLitProgram(), {
|
|
119
|
+
ambientCount: 0,
|
|
120
|
+
data: new Float32Array(SCENE_LIGHT_BLOCK_FLOATS),
|
|
121
|
+
directionalCount: 0,
|
|
122
|
+
hemisphereCount: 3,
|
|
123
|
+
pointCount: 2,
|
|
124
|
+
spotCount: 1,
|
|
125
|
+
version: 1,
|
|
126
|
+
});
|
|
127
|
+
// Three vec4 arrays uploaded: point, spot, hemisphere.
|
|
128
|
+
const arrayUploads = gl.calls.filter((c) => c.name === 'uniform4fv');
|
|
129
|
+
expect(arrayUploads.length).toBe(3);
|
|
130
|
+
// Each count uploads as an int uniform (u_pointCount / u_spotCount / u_hemisphereCount).
|
|
131
|
+
const intUploads = gl.calls.filter(
|
|
132
|
+
(c) =>
|
|
133
|
+
c.name === 'uniform1i' &&
|
|
134
|
+
typeof (c.args[0] as { name?: string })?.name === 'string' &&
|
|
135
|
+
(c.args[0] as { name: string }).name.endsWith('Count'),
|
|
136
|
+
);
|
|
137
|
+
expect(intUploads.map((c) => (c.args[0] as { name: string }).name).sort()).toEqual([
|
|
138
|
+
'u_hemisphereCount',
|
|
139
|
+
'u_pointCount',
|
|
140
|
+
'u_spotCount',
|
|
141
|
+
]);
|
|
142
|
+
expect(intUploads.find((c) => (c.args[0] as { name: string }).name === 'u_pointCount')?.args[1]).toBe(2);
|
|
143
|
+
expect(intUploads.find((c) => (c.args[0] as { name: string }).name === 'u_spotCount')?.args[1]).toBe(1);
|
|
144
|
+
expect(intUploads.find((c) => (c.args[0] as { name: string }).name === 'u_hemisphereCount')?.args[1]).toBe(3);
|
|
145
|
+
});
|
|
146
|
+
});
|
|
147
|
+
|
|
148
|
+
describe('GL_MESH_LIGHT_BLOCK_GLSL', () => {
|
|
149
|
+
it('declares every uniform the CPU upload sets', () => {
|
|
150
|
+
for (const name of [
|
|
151
|
+
'u_directional',
|
|
152
|
+
'u_directionalRadiance',
|
|
153
|
+
'u_ambientRadiance',
|
|
154
|
+
'u_directionalCount',
|
|
155
|
+
'u_ambientCount',
|
|
156
|
+
'u_cameraPosition',
|
|
157
|
+
'u_shadowMap',
|
|
158
|
+
'u_shadowMatrix',
|
|
159
|
+
'u_shadowEnabled',
|
|
160
|
+
'u_pointLights',
|
|
161
|
+
'u_spotLights',
|
|
162
|
+
'u_hemisphereLights',
|
|
163
|
+
'u_pointCount',
|
|
164
|
+
'u_spotCount',
|
|
165
|
+
'u_hemisphereCount',
|
|
166
|
+
]) {
|
|
167
|
+
expect(GL_MESH_LIGHT_BLOCK_GLSL).toContain(name);
|
|
168
|
+
}
|
|
169
|
+
});
|
|
170
|
+
});
|
|
171
|
+
|
|
172
|
+
describe('resolveGlLitLocations', () => {
|
|
173
|
+
it('resolves the standard lit uniform locations', () => {
|
|
174
|
+
const gl = makeFakeGl2();
|
|
175
|
+
const locations = resolveGlLitLocations(gl, {} as WebGLProgram);
|
|
176
|
+
expect(locations.locDirectional).not.toBeNull();
|
|
177
|
+
expect(locations.locAmbientRadiance).not.toBeNull();
|
|
178
|
+
expect(locations.locCameraPosition).not.toBeNull();
|
|
179
|
+
expect(locations.locShadowMap).not.toBeNull();
|
|
180
|
+
});
|
|
181
|
+
});
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import type { LinearColor, GlMatcapDefineKey } from '@flighthq/types';
|
|
2
|
+
|
|
3
|
+
import {
|
|
4
|
+
bindGlMatcapSurface,
|
|
5
|
+
buildGlMatcapDefineKey,
|
|
6
|
+
compileGlMatcapProgram,
|
|
7
|
+
ensureGlMatcapProgram,
|
|
8
|
+
getGlMatcapFragmentSourceForKey,
|
|
9
|
+
getGlMatcapVertexSourceForKey,
|
|
10
|
+
} from './glMatcapPrelude';
|
|
11
|
+
import { getGlScene3DRuntime } from './glScene3DRuntime';
|
|
12
|
+
import { makeFakeGl2, makeGlScene3DState } from './glScene3DTestHelper';
|
|
13
|
+
|
|
14
|
+
const FLAT: GlMatcapDefineKey = { alphaMaskEnabled: false, hasMatcap: false };
|
|
15
|
+
const TINT: LinearColor = [0.5, 0.25, 0.1, 1];
|
|
16
|
+
|
|
17
|
+
describe('bindGlMatcapSurface', () => {
|
|
18
|
+
it('uploads the tint and alpha cutoff with no texture bind when the matcap is absent', () => {
|
|
19
|
+
const { state, gl } = makeGlScene3DState();
|
|
20
|
+
const program = compileGlMatcapProgram(gl, FLAT);
|
|
21
|
+
bindGlMatcapSurface(state, program, TINT, null, 0.5);
|
|
22
|
+
expect(gl.calls.some((c) => c.name === 'uniform4f')).toBe(true);
|
|
23
|
+
expect(gl.calls.some((c) => c.name === 'uniform1f')).toBe(true);
|
|
24
|
+
// No matcap → no texture bind.
|
|
25
|
+
expect(gl.calls.some((c) => c.name === 'bindTexture')).toBe(false);
|
|
26
|
+
});
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
describe('buildGlMatcapDefineKey', () => {
|
|
30
|
+
it('produces distinct stable strings per flag set', () => {
|
|
31
|
+
expect(buildGlMatcapDefineKey(FLAT)).toBe('--');
|
|
32
|
+
expect(buildGlMatcapDefineKey({ alphaMaskEnabled: true, hasMatcap: true })).toBe('mt');
|
|
33
|
+
expect(buildGlMatcapDefineKey({ ...FLAT, hasMatcap: true })).toBe('-t');
|
|
34
|
+
});
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
describe('compileGlMatcapProgram', () => {
|
|
38
|
+
it('compiles, links, and resolves the matcap uniforms including the normal matrix and view', () => {
|
|
39
|
+
const gl = makeFakeGl2();
|
|
40
|
+
const program = compileGlMatcapProgram(gl, FLAT);
|
|
41
|
+
expect(program.locTint).not.toBeNull();
|
|
42
|
+
expect(program.locView).not.toBeNull();
|
|
43
|
+
expect(program.locNormalMatrix).not.toBeNull();
|
|
44
|
+
expect(gl.calls.some((c) => c.name === 'linkProgram')).toBe(true);
|
|
45
|
+
});
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
describe('ensureGlMatcapProgram', () => {
|
|
49
|
+
it('caches a variant under the matcap namespace and reuses it', () => {
|
|
50
|
+
const { state, gl } = makeGlScene3DState();
|
|
51
|
+
const first = ensureGlMatcapProgram(state, FLAT);
|
|
52
|
+
const links = gl.calls.filter((c) => c.name === 'linkProgram').length;
|
|
53
|
+
const second = ensureGlMatcapProgram(state, FLAT);
|
|
54
|
+
expect(second).toBe(first);
|
|
55
|
+
expect(gl.calls.filter((c) => c.name === 'linkProgram').length).toBe(links);
|
|
56
|
+
expect([...getGlScene3DRuntime(state).programCache.keys()].some((k) => k.startsWith('matcap:'))).toBe(true);
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
describe('getGlMatcapFragmentSourceForKey', () => {
|
|
61
|
+
it('includes feature defines only when their flag is set', () => {
|
|
62
|
+
expect(getGlMatcapFragmentSourceForKey(FLAT)).not.toContain('#define HAS_MATCAP');
|
|
63
|
+
expect(getGlMatcapFragmentSourceForKey({ ...FLAT, hasMatcap: true })).toContain('#define HAS_MATCAP');
|
|
64
|
+
expect(getGlMatcapFragmentSourceForKey({ ...FLAT, alphaMaskEnabled: true })).toContain('#define ALPHA_MASK');
|
|
65
|
+
});
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
describe('getGlMatcapVertexSourceForKey', () => {
|
|
69
|
+
it('builds the view-space normal from u_view and the normal matrix', () => {
|
|
70
|
+
const src = getGlMatcapVertexSourceForKey(FLAT);
|
|
71
|
+
expect(src).toContain('layout(location = 1) in vec3 a_normal');
|
|
72
|
+
expect(src).toContain('mat3(u_view) * (u_normalMatrix * a_normal)');
|
|
73
|
+
});
|
|
74
|
+
});
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import type { GlMeshMaterialRenderer, Material } from '@flighthq/types';
|
|
2
|
+
import { DefaultMaterialKind } from '@flighthq/types';
|
|
3
|
+
|
|
4
|
+
import {
|
|
5
|
+
getGlMeshMaterialRenderer,
|
|
6
|
+
registerGlMeshMaterialRenderer,
|
|
7
|
+
resolveGlMeshMaterialRenderer,
|
|
8
|
+
} from './glMeshMaterialRegistry';
|
|
9
|
+
import { makeGlScene3DState } from './glScene3DTestHelper';
|
|
10
|
+
|
|
11
|
+
const TestKind = 'TestMeshMaterial';
|
|
12
|
+
const renderer: GlMeshMaterialRenderer = { bind() {}, draw() {} };
|
|
13
|
+
|
|
14
|
+
function makeMaterial(kind: string): Material {
|
|
15
|
+
return { kind } as Material;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
describe('getGlMeshMaterialRenderer', () => {
|
|
19
|
+
it('returns null when nothing is registered for the kind', () => {
|
|
20
|
+
const { state } = makeGlScene3DState();
|
|
21
|
+
expect(getGlMeshMaterialRenderer(state, TestKind)).toBeNull();
|
|
22
|
+
});
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
describe('registerGlMeshMaterialRenderer', () => {
|
|
26
|
+
it('registers a renderer retrievable by kind', () => {
|
|
27
|
+
const { state } = makeGlScene3DState();
|
|
28
|
+
registerGlMeshMaterialRenderer(state, TestKind, renderer);
|
|
29
|
+
expect(getGlMeshMaterialRenderer(state, TestKind)).toBe(renderer);
|
|
30
|
+
});
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
describe('resolveGlMeshMaterialRenderer', () => {
|
|
34
|
+
it('returns null when nothing is registered — no built-in fallback', () => {
|
|
35
|
+
const { state } = makeGlScene3DState();
|
|
36
|
+
expect(resolveGlMeshMaterialRenderer(state, null)).toBeNull();
|
|
37
|
+
expect(resolveGlMeshMaterialRenderer(state, makeMaterial(TestKind))).toBeNull();
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
it('resolves by the material kind', () => {
|
|
41
|
+
const { state } = makeGlScene3DState();
|
|
42
|
+
registerGlMeshMaterialRenderer(state, TestKind, renderer);
|
|
43
|
+
expect(resolveGlMeshMaterialRenderer(state, makeMaterial(TestKind))).toBe(renderer);
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
it('falls back to the DefaultMaterialKind renderer', () => {
|
|
47
|
+
const { state } = makeGlScene3DState();
|
|
48
|
+
registerGlMeshMaterialRenderer(state, DefaultMaterialKind, renderer);
|
|
49
|
+
expect(resolveGlMeshMaterialRenderer(state, makeMaterial('Other'))).toBe(renderer);
|
|
50
|
+
expect(resolveGlMeshMaterialRenderer(state, null)).toBe(renderer);
|
|
51
|
+
});
|
|
52
|
+
});
|