@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,57 @@
|
|
|
1
|
+
import { unpackColorToLinear } from '@flighthq/color';
|
|
2
|
+
import { SubsurfacePbrMaterialKind } from '@flighthq/types';
|
|
3
|
+
import { bindGlMeshLightBlock } from './glLitProgram';
|
|
4
|
+
import { registerGlMeshMaterialRenderer } from './glMeshMaterialRegistry';
|
|
5
|
+
import { beginGlMeshDraw, drawGlMeshSubset, setGlMeshCameraPosition, setGlMeshViewProjection } from './glMeshProgram';
|
|
6
|
+
import { ensureGlPbrProgram } from './glPbrProgramCache';
|
|
7
|
+
import { bindGlPbrStandardBlock, buildGlPbrStandardDefineKey } from './glPbrStandardBlock';
|
|
8
|
+
import { getGlScene3DRuntime } from './glScene3DRuntime';
|
|
9
|
+
// The built-in Subsurface forward-lit mesh-material renderer (Flight extension; flagged non-interop
|
|
10
|
+
// — there is no glTF equivalent). It approximates subsurface scattering with a wrapped-diffuse term:
|
|
11
|
+
// light wrapping past the terminator re-emerges tinted by `subsurfaceColor`, scaled by `subsurface`
|
|
12
|
+
// strength and inversely by `thickness` (thinner material = more translucency). This is a cheap
|
|
13
|
+
// stand-in for true diffusion-profile SSS — plausible for skin, wax, marble, foliage at forward-pass
|
|
14
|
+
// cost — and lives behind `#define SUBSURFACE` in the PBR uber-shader. bind composes the material's
|
|
15
|
+
// `standard` block through the shared bindGlPbrStandardBlock and uploads the subsurface scalars +
|
|
16
|
+
// linear-decoded subsurfaceColor. The subsurface/thickness maps are reserved but not yet sampled.
|
|
17
|
+
// See registerSubsurfacePbrGlMaterial.
|
|
18
|
+
export const subsurfacePbrGlMeshMaterialRenderer = {
|
|
19
|
+
bind(state, material, lights, camera) {
|
|
20
|
+
const gl = state.gl;
|
|
21
|
+
const subsurface = material;
|
|
22
|
+
const standard = subsurface !== null ? subsurface.standard : null;
|
|
23
|
+
const key = buildGlPbrStandardDefineKey(standard, subsurface);
|
|
24
|
+
key.subsurfaceEnabled = true;
|
|
25
|
+
const program = ensureGlPbrProgram(state, key);
|
|
26
|
+
beginGlMeshDraw(state, program, subsurface !== null && subsurface.doubleSided);
|
|
27
|
+
setGlMeshViewProjection(gl, program.locViewProjection, camera);
|
|
28
|
+
setGlMeshCameraPosition(gl, program.locCameraPosition, camera);
|
|
29
|
+
bindGlMeshLightBlock(state, program, lights);
|
|
30
|
+
bindGlPbrStandardBlock(state, program, standard);
|
|
31
|
+
gl.uniform1f(program.locAlphaCutoff, subsurface !== null ? subsurface.alphaCutoff : 0.5);
|
|
32
|
+
if (subsurface !== null) {
|
|
33
|
+
unpackColorToLinear(scratchRgba, subsurface.subsurfaceColor);
|
|
34
|
+
gl.uniform1f(program.locSubsurface, subsurface.subsurface);
|
|
35
|
+
gl.uniform3f(program.locSubsurfaceColor, scratchRgba[0], scratchRgba[1], scratchRgba[2]);
|
|
36
|
+
gl.uniform1f(program.locThickness, subsurface.thickness);
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
gl.uniform1f(program.locSubsurface, 0);
|
|
40
|
+
gl.uniform3f(program.locSubsurfaceColor, 1, 1, 1);
|
|
41
|
+
gl.uniform1f(program.locThickness, 0);
|
|
42
|
+
}
|
|
43
|
+
},
|
|
44
|
+
draw(state, proxy, geometry) {
|
|
45
|
+
const program = getGlScene3DRuntime(state).activeMeshProgram;
|
|
46
|
+
if (program === null)
|
|
47
|
+
return;
|
|
48
|
+
drawGlMeshSubset(state, program, proxy, geometry);
|
|
49
|
+
},
|
|
50
|
+
};
|
|
51
|
+
// Installs the built-in Subsurface renderer for SubsurfacePbrMaterialKind on this state. Opt-in (no
|
|
52
|
+
// top-level side effect): drawScene3D only draws Subsurface subsets once this is called.
|
|
53
|
+
export function registerSubsurfacePbrGlMaterial(state) {
|
|
54
|
+
registerGlMeshMaterialRenderer(state, SubsurfacePbrMaterialKind, subsurfacePbrGlMeshMaterialRenderer);
|
|
55
|
+
}
|
|
56
|
+
const scratchRgba = [0, 0, 0, 0];
|
|
57
|
+
//# sourceMappingURL=subsurfacePbrGlMeshMaterialRenderer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subsurfacePbrGlMeshMaterialRenderer.js","sourceRoot":"","sources":["../src/subsurfacePbrGlMeshMaterialRenderer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { GlMeshMaterialRenderer, GlRenderState } from '@flighthq/types';
|
|
2
|
+
export declare const toonGlMeshMaterialRenderer: GlMeshMaterialRenderer;
|
|
3
|
+
export declare function registerToonGlMaterial(state: GlRenderState): void;
|
|
4
|
+
//# sourceMappingURL=toonGlMeshMaterialRenderer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toonGlMeshMaterialRenderer.d.ts","sourceRoot":"","sources":["../src/toonGlMeshMaterialRenderer.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAGV,sBAAsB,EACtB,aAAa,EAQd,MAAM,iBAAiB,CAAC;AA0BzB,eAAO,MAAM,0BAA0B,EAAE,sBAuBxC,CAAC;AAIF,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI,CAEjE"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { unpackColorToLinear } from '@flighthq/color';
|
|
2
|
+
import { hasImageResourcePixels } from '@flighthq/image';
|
|
3
|
+
import { bindGlImageResourceTexture } from '@flighthq/render-gl';
|
|
4
|
+
import { ToonMaterialKind } from '@flighthq/types';
|
|
5
|
+
import { bindGlMeshLightBlock } from './glLitProgram';
|
|
6
|
+
import { registerGlMeshMaterialRenderer } from './glMeshMaterialRegistry';
|
|
7
|
+
import { beginGlMeshDraw, bindGlUvTransform, drawGlMeshSubset, hasGlUvTransform, setGlMeshCameraPosition, setGlMeshViewProjection, } from './glMeshProgram';
|
|
8
|
+
import { getGlScene3DRuntime } from './glScene3DRuntime';
|
|
9
|
+
import { ensureGlToonProgram } from './glToonPrelude';
|
|
10
|
+
// The built-in Toon (cel-shading) forward-lit mesh-material renderer (GlMeshMaterialRenderer for
|
|
11
|
+
// ToonMaterialKind). bind selects the uber-shader variant for the material's base-color map / ramp /
|
|
12
|
+
// alpha mode, uploads the shared per-run uniforms (camera view-projection + position, the packed
|
|
13
|
+
// light block), and the material's base color, step count, cutoff, and textures. The diffuse N·L is
|
|
14
|
+
// quantized into stepped cel bands in the fragment scene2d (ramp lookup when a ramp is bound, else a
|
|
15
|
+
// stepped floor over `steps`); output is LINEAR color for the rgba16f scene target. draw uploads the
|
|
16
|
+
// geometry's GPU buffers lazily (cached by geometry.version), sets the per-draw model + normal
|
|
17
|
+
// matrices from the proxy, and issues the indexed draw over the proxy's subset with depth-test LESS +
|
|
18
|
+
// depth-write on and back-face culling unless the material is double-sided. See registerToonGlMaterial
|
|
19
|
+
// to install it.
|
|
20
|
+
export const toonGlMeshMaterialRenderer = {
|
|
21
|
+
bind(state, material, lights, camera) {
|
|
22
|
+
const gl = state.gl;
|
|
23
|
+
const toon = material;
|
|
24
|
+
const program = ensureGlToonProgram(state, defineKeyForMaterial(toon));
|
|
25
|
+
beginGlMeshDraw(state, program, toon !== null && toon.doubleSided);
|
|
26
|
+
setGlMeshViewProjection(gl, program.locViewProjection, camera);
|
|
27
|
+
setGlMeshCameraPosition(gl, program.locCameraPosition, camera);
|
|
28
|
+
bindGlMeshLightBlock(state, program, lights);
|
|
29
|
+
bindGlToonMaterialUniforms(state, program, toon);
|
|
30
|
+
},
|
|
31
|
+
draw(state, proxy, geometry) {
|
|
32
|
+
const program = getGlScene3DRuntime(state).activeMeshProgram;
|
|
33
|
+
if (program === null)
|
|
34
|
+
return;
|
|
35
|
+
drawGlMeshSubset(state, program, proxy, geometry);
|
|
36
|
+
},
|
|
37
|
+
};
|
|
38
|
+
// Registers the built-in Toon renderer for ToonMaterialKind on this state. Opt-in (no top-level side
|
|
39
|
+
// effect); call once per GlRenderState before drawScene3D so meshes with ToonMaterials draw.
|
|
40
|
+
export function registerToonGlMaterial(state) {
|
|
41
|
+
registerGlMeshMaterialRenderer(state, ToonMaterialKind, toonGlMeshMaterialRenderer);
|
|
42
|
+
}
|
|
43
|
+
// The feature define key for a Toon material: which optional textures are present and whether alpha-
|
|
44
|
+
// mask cutoff is active. Drives both the program-cache variant and the bound textures. The ramp
|
|
45
|
+
// switches the fragment quantizer from a stepped floor to a 1D ramp lookup.
|
|
46
|
+
function defineKeyForMaterial(material) {
|
|
47
|
+
return {
|
|
48
|
+
alphaMaskEnabled: material !== null && material.alphaMode === 'mask',
|
|
49
|
+
hasBaseColorMap: material !== null && material.baseColorMap !== null && material.baseColorMap.image !== null,
|
|
50
|
+
hasRamp: material !== null && material.ramp !== null && material.ramp.image !== null,
|
|
51
|
+
hasUvTransform: hasGlUvTransform(material !== null ? material.baseColorMap : null),
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
function bindGlToonMaterialUniforms(state, program, material) {
|
|
55
|
+
const gl = state.gl;
|
|
56
|
+
if (material === null) {
|
|
57
|
+
gl.uniform4f(program.locBaseColor, 1, 1, 1, 1);
|
|
58
|
+
gl.uniform1f(program.locSteps, 3);
|
|
59
|
+
gl.uniform1f(program.locAlphaCutoff, 0.5);
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
unpackColorToLinear(scratchRgba, material.baseColor);
|
|
63
|
+
gl.uniform4f(program.locBaseColor, scratchRgba[0], scratchRgba[1], scratchRgba[2], scratchRgba[3]);
|
|
64
|
+
gl.uniform1f(program.locSteps, material.steps);
|
|
65
|
+
gl.uniform1f(program.locAlphaCutoff, material.alphaCutoff);
|
|
66
|
+
const baseColorMap = material.baseColorMap;
|
|
67
|
+
if (baseColorMap !== null && baseColorMap.image !== null && hasImageResourcePixels(baseColorMap.image)) {
|
|
68
|
+
gl.activeTexture(gl.TEXTURE0);
|
|
69
|
+
bindGlImageResourceTexture(state, baseColorMap.image, baseColorMap.sampler);
|
|
70
|
+
gl.uniform1i(program.locBaseColorMap, 0);
|
|
71
|
+
}
|
|
72
|
+
const ramp = material.ramp;
|
|
73
|
+
if (ramp !== null && ramp.image !== null && hasImageResourcePixels(ramp.image)) {
|
|
74
|
+
gl.activeTexture(gl.TEXTURE1);
|
|
75
|
+
bindGlImageResourceTexture(state, ramp.image, ramp.sampler);
|
|
76
|
+
gl.uniform1i(program.locRamp, 1);
|
|
77
|
+
}
|
|
78
|
+
bindGlUvTransform(gl, program, baseColorMap);
|
|
79
|
+
}
|
|
80
|
+
const scratchRgba = [0, 0, 0, 0];
|
|
81
|
+
//# sourceMappingURL=toonGlMeshMaterialRenderer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toonGlMeshMaterialRenderer.js","sourceRoot":"","sources":["../src/toonGlMeshMaterialRenderer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { GlMeshMaterialRenderer, GlRenderState } from '@flighthq/types';
|
|
2
|
+
export declare const transmissionVolumePbrGlMeshMaterialRenderer: GlMeshMaterialRenderer;
|
|
3
|
+
export declare function registerTransmissionVolumePbrGlMaterial(state: GlRenderState): void;
|
|
4
|
+
//# sourceMappingURL=transmissionVolumePbrGlMeshMaterialRenderer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transmissionVolumePbrGlMeshMaterialRenderer.d.ts","sourceRoot":"","sources":["../src/transmissionVolumePbrGlMeshMaterialRenderer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAGV,sBAAsB,EACtB,aAAa,EAMd,MAAM,iBAAiB,CAAC;AAyBzB,eAAO,MAAM,2CAA2C,EAAE,sBAoCzD,CAAC;AAKF,wBAAgB,uCAAuC,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI,CAElF"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { unpackColorToLinear } from '@flighthq/color';
|
|
2
|
+
import { TransmissionVolumePbrMaterialKind } from '@flighthq/types';
|
|
3
|
+
import { bindGlMeshLightBlock } from './glLitProgram';
|
|
4
|
+
import { registerGlMeshMaterialRenderer } from './glMeshMaterialRegistry';
|
|
5
|
+
import { beginGlMeshDraw, drawGlMeshSubset, setGlMeshCameraPosition, setGlMeshViewProjection } from './glMeshProgram';
|
|
6
|
+
import { ensureGlPbrProgram } from './glPbrProgramCache';
|
|
7
|
+
import { bindGlPbrStandardBlock, buildGlPbrStandardDefineKey } from './glPbrStandardBlock';
|
|
8
|
+
import { getGlScene3DRuntime } from './glScene3DRuntime';
|
|
9
|
+
// The built-in TransmissionVolume (KHR_materials_transmission + KHR_materials_volume) forward-lit
|
|
10
|
+
// mesh-material renderer for refractive, see-through surfaces (glass, liquid).
|
|
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 `#define 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
|
|
18
|
+
// lit shell rather than a refracting lens. `thickness`, `attenuationDistance`, and `ior` are accepted
|
|
19
|
+
// on the material but only `transmission`/`attenuationColor` drive the current shader.
|
|
20
|
+
//
|
|
21
|
+
// bind composes the material's `standard` block through the shared bindGlPbrStandardBlock and uploads
|
|
22
|
+
// the transmission factor + linear-decoded attenuationColor. The transmission/thickness maps are
|
|
23
|
+
// reserved but not yet sampled. See registerTransmissionVolumePbrGlMaterial.
|
|
24
|
+
export const transmissionVolumePbrGlMeshMaterialRenderer = {
|
|
25
|
+
bind(state, material, lights, camera) {
|
|
26
|
+
const gl = state.gl;
|
|
27
|
+
const transmission = material;
|
|
28
|
+
const standard = transmission !== null ? transmission.standard : null;
|
|
29
|
+
const key = buildGlPbrStandardDefineKey(standard, transmission);
|
|
30
|
+
key.transmissionEnabled = true;
|
|
31
|
+
const program = ensureGlPbrProgram(state, key);
|
|
32
|
+
beginGlMeshDraw(state, program, transmission !== null && transmission.doubleSided);
|
|
33
|
+
setGlMeshViewProjection(gl, program.locViewProjection, camera);
|
|
34
|
+
setGlMeshCameraPosition(gl, program.locCameraPosition, camera);
|
|
35
|
+
bindGlMeshLightBlock(state, program, lights);
|
|
36
|
+
bindGlPbrStandardBlock(state, program, standard);
|
|
37
|
+
gl.uniform1f(program.locAlphaCutoff, transmission !== null ? transmission.alphaCutoff : 0.5);
|
|
38
|
+
if (transmission !== null) {
|
|
39
|
+
unpackColorToLinear(scratchRgba, transmission.attenuationColor);
|
|
40
|
+
gl.uniform1f(program.locTransmission, transmission.transmission);
|
|
41
|
+
gl.uniform3f(program.locAttenuationColor, scratchRgba[0], scratchRgba[1], scratchRgba[2]);
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
gl.uniform1f(program.locTransmission, 0);
|
|
45
|
+
gl.uniform3f(program.locAttenuationColor, 1, 1, 1);
|
|
46
|
+
}
|
|
47
|
+
},
|
|
48
|
+
draw(state, proxy, geometry) {
|
|
49
|
+
const program = getGlScene3DRuntime(state).activeMeshProgram;
|
|
50
|
+
if (program === null)
|
|
51
|
+
return;
|
|
52
|
+
drawGlMeshSubset(state, program, proxy, geometry);
|
|
53
|
+
},
|
|
54
|
+
};
|
|
55
|
+
// Installs the built-in TransmissionVolume renderer for TransmissionVolumePbrMaterialKind on this
|
|
56
|
+
// state. Opt-in (no top-level side effect): drawScene3D only draws TransmissionVolume subsets once
|
|
57
|
+
// this is called.
|
|
58
|
+
export function registerTransmissionVolumePbrGlMaterial(state) {
|
|
59
|
+
registerGlMeshMaterialRenderer(state, TransmissionVolumePbrMaterialKind, transmissionVolumePbrGlMeshMaterialRenderer);
|
|
60
|
+
}
|
|
61
|
+
const scratchRgba = [0, 0, 0, 0];
|
|
62
|
+
//# sourceMappingURL=transmissionVolumePbrGlMeshMaterialRenderer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transmissionVolumePbrGlMeshMaterialRenderer.js","sourceRoot":"","sources":["../src/transmissionVolumePbrGlMeshMaterialRenderer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { GlMeshMaterialRenderer, GlRenderState } from '@flighthq/types';
|
|
2
|
+
export declare const unlitGlMeshMaterialRenderer: GlMeshMaterialRenderer;
|
|
3
|
+
export declare function registerUnlitGlMaterial(state: GlRenderState): void;
|
|
4
|
+
//# sourceMappingURL=unlitGlMeshMaterialRenderer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"unlitGlMeshMaterialRenderer.d.ts","sourceRoot":"","sources":["../src/unlitGlMeshMaterialRenderer.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAGV,sBAAsB,EACtB,aAAa,EAOd,MAAM,iBAAiB,CAAC;AAkBzB,eAAO,MAAM,2BAA2B,EAAE,sBAiCzC,CAAC;AAIF,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI,CAElE"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { unpackColorToLinear } from '@flighthq/color';
|
|
2
|
+
import { isVideoTextureFrameReady } from '@flighthq/texture';
|
|
3
|
+
import { UnlitMaterialKind } from '@flighthq/types';
|
|
4
|
+
import { registerGlMeshMaterialRenderer } from './glMeshMaterialRegistry';
|
|
5
|
+
import { beginGlMeshDraw, bindGlUvTransform, drawGlMeshSubset, hasGlUvTransform, setGlMeshViewProjection, } from './glMeshProgram';
|
|
6
|
+
import { getGlScene3DRuntime } from './glScene3DRuntime';
|
|
7
|
+
import { bindGlUnlitSurface, bindGlUnlitVideoSurface, ensureGlUnlitProgram } from './glUnlitPrelude';
|
|
8
|
+
// The built-in Unlit forward renderer (GlMeshMaterialRenderer for UnlitMaterialKind). Lighting-
|
|
9
|
+
// independent flat color: bind selects the unlit variant for the material's base-color map / alpha
|
|
10
|
+
// mode, uploads the camera view-projection and the linear base color, and draw issues the indexed
|
|
11
|
+
// draw. Lights are ignored. See registerUnlitGlMaterial to install it.
|
|
12
|
+
export const unlitGlMeshMaterialRenderer = {
|
|
13
|
+
bind(state, material, _lights, camera) {
|
|
14
|
+
const gl = state.gl;
|
|
15
|
+
const unlit = material;
|
|
16
|
+
const program = ensureGlUnlitProgram(state, defineKeyForMaterial(unlit));
|
|
17
|
+
beginGlMeshDraw(state, program, unlit !== null && unlit.doubleSided);
|
|
18
|
+
setGlMeshViewProjection(gl, program.locViewProjection, camera);
|
|
19
|
+
if (unlit === null) {
|
|
20
|
+
bindGlUnlitSurface(state, program, WHITE, 1, null, 0.5);
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
unpackColorToLinear(scratchRgba, unlit.baseColor);
|
|
24
|
+
const videoMap = unlit.baseColorVideoMap;
|
|
25
|
+
if (videoMap !== null && isVideoTextureFrameReady(videoMap)) {
|
|
26
|
+
bindGlUnlitVideoSurface(state, program, scratchRgba, 1, videoMap, unlit.alphaCutoff);
|
|
27
|
+
bindGlUvTransform(gl, program, videoMap);
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
bindGlUnlitSurface(state, program, scratchRgba, 1, unlit.baseColorMap, unlit.alphaCutoff);
|
|
31
|
+
bindGlUvTransform(gl, program, unlit.baseColorMap);
|
|
32
|
+
}
|
|
33
|
+
},
|
|
34
|
+
draw(state, proxy, geometry) {
|
|
35
|
+
const program = getGlScene3DRuntime(state).activeMeshProgram;
|
|
36
|
+
if (program === null)
|
|
37
|
+
return;
|
|
38
|
+
drawGlMeshSubset(state, program, proxy, geometry);
|
|
39
|
+
},
|
|
40
|
+
};
|
|
41
|
+
// Registers the built-in Unlit renderer for UnlitMaterialKind on this state. Opt-in (no top-level
|
|
42
|
+
// side effect); call once per GlRenderState before drawScene3D so meshes with UnlitMaterials draw.
|
|
43
|
+
export function registerUnlitGlMaterial(state) {
|
|
44
|
+
registerGlMeshMaterialRenderer(state, UnlitMaterialKind, unlitGlMeshMaterialRenderer);
|
|
45
|
+
}
|
|
46
|
+
function defineKeyForMaterial(material) {
|
|
47
|
+
return {
|
|
48
|
+
alphaMaskEnabled: material !== null && material.alphaMode === 'mask',
|
|
49
|
+
hasColorMap: material !== null &&
|
|
50
|
+
((material.baseColorVideoMap !== null && isVideoTextureFrameReady(material.baseColorVideoMap)) ||
|
|
51
|
+
(material.baseColorMap !== null && material.baseColorMap.image !== null)),
|
|
52
|
+
hasUvTransform: material !== null &&
|
|
53
|
+
hasGlUvTransform(material.baseColorVideoMap !== null && isVideoTextureFrameReady(material.baseColorVideoMap)
|
|
54
|
+
? material.baseColorVideoMap
|
|
55
|
+
: material.baseColorMap),
|
|
56
|
+
vertexColor: false,
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
const scratchRgba = [0, 0, 0, 0];
|
|
60
|
+
const WHITE = [1, 1, 1, 1];
|
|
61
|
+
//# sourceMappingURL=unlitGlMeshMaterialRenderer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"unlitGlMeshMaterialRenderer.js","sourceRoot":"","sources":["../src/unlitGlMeshMaterialRenderer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { GlMeshMaterialRenderer, GlRenderState } from '@flighthq/types';
|
|
2
|
+
export declare const vertexColorGlMeshMaterialRenderer: GlMeshMaterialRenderer;
|
|
3
|
+
export declare function registerVertexColorGlMaterial(state: GlRenderState): void;
|
|
4
|
+
//# sourceMappingURL=vertexColorGlMeshMaterialRenderer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vertexColorGlMeshMaterialRenderer.d.ts","sourceRoot":"","sources":["../src/vertexColorGlMeshMaterialRenderer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAGV,sBAAsB,EACtB,aAAa,EAOd,MAAM,iBAAiB,CAAC;AAazB,eAAO,MAAM,iCAAiC,EAAE,sBA+B/C,CAAC;AAKF,wBAAgB,6BAA6B,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI,CAExE"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { unpackColorToLinear } from '@flighthq/color';
|
|
2
|
+
import { VertexColorMaterialKind } from '@flighthq/types';
|
|
3
|
+
import { registerGlMeshMaterialRenderer } from './glMeshMaterialRegistry';
|
|
4
|
+
import { beginGlMeshDraw, drawGlMeshSubset, setGlMeshViewProjection } from './glMeshProgram';
|
|
5
|
+
import { getGlScene3DRuntime } from './glScene3DRuntime';
|
|
6
|
+
import { bindGlUnlitSurface, ensureGlUnlitProgram } from './glUnlitPrelude';
|
|
7
|
+
// The built-in VertexColor forward renderer (GlMeshMaterialRenderer for VertexColorMaterialKind).
|
|
8
|
+
// Lighting-independent: the unlit shader's VERTEX_COLOR variant multiplies the mesh's interpolated
|
|
9
|
+
// color0 attribute by the linear tint. Geometry without a color0 attribute leaves the attribute
|
|
10
|
+
// unbound (its default), so a tinted black surface results — author color0 (or import it via glTF)
|
|
11
|
+
// to drive this material. Lights are ignored. See registerVertexColorGlMaterial to install it.
|
|
12
|
+
export const vertexColorGlMeshMaterialRenderer = {
|
|
13
|
+
bind(state, material, _lights, camera) {
|
|
14
|
+
const gl = state.gl;
|
|
15
|
+
const vertexColor = material;
|
|
16
|
+
const program = ensureGlUnlitProgram(state, defineKeyForMaterial(vertexColor));
|
|
17
|
+
beginGlMeshDraw(state, program, vertexColor !== null && vertexColor.doubleSided);
|
|
18
|
+
setGlMeshViewProjection(gl, program.locViewProjection, camera);
|
|
19
|
+
// Default the color0 generic vertex attribute to opaque white so a mesh WITHOUT a color0 attribute
|
|
20
|
+
// renders the tint alone (matching the wgpu path) instead of multiplying by the (0,0,0,1) default,
|
|
21
|
+
// which would render black. A mesh that DOES carry color0 enables the array and overrides this.
|
|
22
|
+
gl.vertexAttrib4f(4, 1, 1, 1, 1);
|
|
23
|
+
if (vertexColor === null) {
|
|
24
|
+
bindGlUnlitSurface(state, program, WHITE, 1, null, 0.5);
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
unpackColorToLinear(scratchRgba, vertexColor.tint);
|
|
28
|
+
bindGlUnlitSurface(state, program, scratchRgba, 1, null, vertexColor.alphaCutoff);
|
|
29
|
+
},
|
|
30
|
+
draw(state, proxy, geometry) {
|
|
31
|
+
const program = getGlScene3DRuntime(state).activeMeshProgram;
|
|
32
|
+
if (program === null)
|
|
33
|
+
return;
|
|
34
|
+
drawGlMeshSubset(state, program, proxy, geometry);
|
|
35
|
+
},
|
|
36
|
+
};
|
|
37
|
+
// Registers the built-in VertexColor renderer for VertexColorMaterialKind on this state. Opt-in (no
|
|
38
|
+
// top-level side effect); call once per GlRenderState before drawScene3D so meshes with
|
|
39
|
+
// VertexColorMaterials draw.
|
|
40
|
+
export function registerVertexColorGlMaterial(state) {
|
|
41
|
+
registerGlMeshMaterialRenderer(state, VertexColorMaterialKind, vertexColorGlMeshMaterialRenderer);
|
|
42
|
+
}
|
|
43
|
+
function defineKeyForMaterial(material) {
|
|
44
|
+
return {
|
|
45
|
+
alphaMaskEnabled: material !== null && material.alphaMode === 'mask',
|
|
46
|
+
hasColorMap: false,
|
|
47
|
+
// VertexColor samples no map, so the uv transform never applies.
|
|
48
|
+
hasUvTransform: false,
|
|
49
|
+
vertexColor: true,
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
const scratchRgba = [0, 0, 0, 0];
|
|
53
|
+
const WHITE = [1, 1, 1, 1];
|
|
54
|
+
//# sourceMappingURL=vertexColorGlMeshMaterialRenderer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vertexColorGlMeshMaterialRenderer.js","sourceRoot":"","sources":["../src/vertexColorGlMeshMaterialRenderer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAatD,OAAO,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAE1D,OAAO,EAAE,8BAA8B,EAAE,MAAM,0BAA0B,CAAC;AAC1E,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAC7F,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAE5E,kGAAkG;AAClG,mGAAmG;AACnG,gGAAgG;AAChG,mGAAmG;AACnG,+FAA+F;AAC/F,MAAM,CAAC,MAAM,iCAAiC,GAA2B;IACvE,IAAI,CACF,KAAoB,EACpB,QAAmC,EACnC,OAAoC,EACpC,MAA0B;QAE1B,MAAM,EAAE,GAAG,KAAK,CAAC,EAAE,CAAC;QACpB,MAAM,WAAW,GAAG,QAAgD,CAAC;QACrE,MAAM,OAAO,GAAG,oBAAoB,CAAC,KAAK,EAAE,oBAAoB,CAAC,WAAW,CAAC,CAAC,CAAC;QAC/E,eAAe,CAAC,KAAK,EAAE,OAAO,EAAE,WAAW,KAAK,IAAI,IAAI,WAAW,CAAC,WAAW,CAAC,CAAC;QACjF,uBAAuB,CAAC,EAAE,EAAE,OAAO,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAC;QAE/D,mGAAmG;QACnG,mGAAmG;QACnG,gGAAgG;QAChG,EAAE,CAAC,cAAc,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAEjC,IAAI,WAAW,KAAK,IAAI,EAAE,CAAC;YACzB,kBAAkB,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;YACxD,OAAO;QACT,CAAC;QACD,mBAAmB,CAAC,WAAW,EAAE,WAAW,CAAC,IAAI,CAAC,CAAC;QACnD,kBAAkB,CAAC,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,EAAE,IAAI,EAAE,WAAW,CAAC,WAAW,CAAC,CAAC;IACpF,CAAC;IAED,IAAI,CAAC,KAAoB,EAAE,KAAmC,EAAE,QAAgC;QAC9F,MAAM,OAAO,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC,iBAAiB,CAAC;QAC7D,IAAI,OAAO,KAAK,IAAI;YAAE,OAAO;QAC7B,gBAAgB,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;IACpD,CAAC;CACF,CAAC;AAEF,oGAAoG;AACpG,wFAAwF;AACxF,6BAA6B;AAC7B,MAAM,UAAU,6BAA6B,CAAC,KAAoB;IAChE,8BAA8B,CAAC,KAAK,EAAE,uBAAuB,EAAE,iCAAiC,CAAC,CAAC;AACpG,CAAC;AAED,SAAS,oBAAoB,CAAC,QAA8C;IAC1E,OAAO;QACL,gBAAgB,EAAE,QAAQ,KAAK,IAAI,IAAI,QAAQ,CAAC,SAAS,KAAK,MAAM;QACpE,WAAW,EAAE,KAAK;QAClB,iEAAiE;QACjE,cAAc,EAAE,KAAK;QACrB,WAAW,EAAE,IAAI;KAClB,CAAC;AACJ,CAAC;AAED,MAAM,WAAW,GAAgB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;AAC9C,MAAM,KAAK,GAAgB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { GlMeshMaterialRenderer, GlRenderState } from '@flighthq/types';
|
|
2
|
+
export declare const wireframeGlMeshMaterialRenderer: GlMeshMaterialRenderer;
|
|
3
|
+
export declare function registerWireframeGlMaterial(state: GlRenderState): void;
|
|
4
|
+
//# sourceMappingURL=wireframeGlMeshMaterialRenderer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wireframeGlMeshMaterialRenderer.d.ts","sourceRoot":"","sources":["../src/wireframeGlMeshMaterialRenderer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAGV,sBAAsB,EACtB,aAAa,EAMd,MAAM,iBAAiB,CAAC;AAezB,eAAO,MAAM,+BAA+B,EAAE,sBAoC7C,CAAC;AAKF,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI,CAEtE"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { unpackColorToLinear } from '@flighthq/color';
|
|
2
|
+
import { WireframeMaterialKind } from '@flighthq/types';
|
|
3
|
+
import { registerGlMeshMaterialRenderer } from './glMeshMaterialRegistry';
|
|
4
|
+
import { beginGlMeshDraw, setGlMeshViewProjection } from './glMeshProgram';
|
|
5
|
+
import { getGlScene3DRuntime } from './glScene3DRuntime';
|
|
6
|
+
import { ensureGlWireframeProgram } from './glWireframePrelude';
|
|
7
|
+
import { ensureGlWireframeUpload } from './glWireframeUpload';
|
|
8
|
+
// The built-in Wireframe forward renderer (GlMeshMaterialRenderer for WireframeMaterialKind). Draws
|
|
9
|
+
// the mesh's triangle edges as GL lines in a single flat linear color. Unlike the triangle families
|
|
10
|
+
// it does not use drawGlMeshSubset: draw binds the wireframe line-index VAO (see glWireframeUpload)
|
|
11
|
+
// and issues a gl.LINES draw over the subset's derived line range. `thickness` > 1 is not honored —
|
|
12
|
+
// WebGL2 fixes line width at 1px on virtually all drivers; the field is documented as best-effort and
|
|
13
|
+
// ignored here. Lights are ignored. See registerWireframeGlMaterial to install it.
|
|
14
|
+
export const wireframeGlMeshMaterialRenderer = {
|
|
15
|
+
bind(state, material, _lights, camera) {
|
|
16
|
+
const gl = state.gl;
|
|
17
|
+
const wireframe = material;
|
|
18
|
+
const program = ensureGlWireframeProgram(state);
|
|
19
|
+
// doubleSided = true: lines have no winding, so back-face culling must be off.
|
|
20
|
+
beginGlMeshDraw(state, program, true);
|
|
21
|
+
setGlMeshViewProjection(gl, program.locViewProjection, camera);
|
|
22
|
+
if (wireframe === null) {
|
|
23
|
+
gl.uniform4f(program.locColor, 1, 1, 1, 1);
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
unpackColorToLinear(scratchRgba, wireframe.color);
|
|
27
|
+
gl.uniform4f(program.locColor, scratchRgba[0], scratchRgba[1], scratchRgba[2], scratchRgba[3]);
|
|
28
|
+
},
|
|
29
|
+
draw(state, proxy, geometry) {
|
|
30
|
+
const gl = state.gl;
|
|
31
|
+
const program = getGlScene3DRuntime(state).activeMeshProgram;
|
|
32
|
+
if (program === null)
|
|
33
|
+
return;
|
|
34
|
+
gl.uniformMatrix4fv(program.locModel, false, proxy.worldMatrix.m);
|
|
35
|
+
const upload = ensureGlWireframeUpload(state, geometry);
|
|
36
|
+
const subset = proxy.subset;
|
|
37
|
+
// Each triangle index contributes two line indices, so the subset's line range is its triangle
|
|
38
|
+
// range scaled by 2.
|
|
39
|
+
const elementSize = upload.indexType === gl.UNSIGNED_INT ? 4 : 2;
|
|
40
|
+
gl.drawElements(gl.LINES, subset.indexCount * 2, upload.indexType, subset.indexOffset * 2 * elementSize);
|
|
41
|
+
},
|
|
42
|
+
};
|
|
43
|
+
// Registers the built-in Wireframe renderer for WireframeMaterialKind on this state. Opt-in (no
|
|
44
|
+
// top-level side effect); call once per GlRenderState before drawScene3D so meshes with
|
|
45
|
+
// WireframeMaterials draw.
|
|
46
|
+
export function registerWireframeGlMaterial(state) {
|
|
47
|
+
registerGlMeshMaterialRenderer(state, WireframeMaterialKind, wireframeGlMeshMaterialRenderer);
|
|
48
|
+
}
|
|
49
|
+
const scratchRgba = [0, 0, 0, 0];
|
|
50
|
+
//# sourceMappingURL=wireframeGlMeshMaterialRenderer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wireframeGlMeshMaterialRenderer.js","sourceRoot":"","sources":["../src/wireframeGlMeshMaterialRenderer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAYtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAExD,OAAO,EAAE,8BAA8B,EAAE,MAAM,0BAA0B,CAAC;AAC1E,OAAO,EAAE,eAAe,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAC3E,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAC;AAChE,OAAO,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AAE9D,oGAAoG;AACpG,oGAAoG;AACpG,oGAAoG;AACpG,oGAAoG;AACpG,sGAAsG;AACtG,mFAAmF;AACnF,MAAM,CAAC,MAAM,+BAA+B,GAA2B;IACrE,IAAI,CACF,KAAoB,EACpB,QAAmC,EACnC,OAAoC,EACpC,MAA0B;QAE1B,MAAM,EAAE,GAAG,KAAK,CAAC,EAAE,CAAC;QACpB,MAAM,SAAS,GAAG,QAA8C,CAAC;QACjE,MAAM,OAAO,GAAG,wBAAwB,CAAC,KAAK,CAAC,CAAC;QAChD,+EAA+E;QAC/E,eAAe,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;QACtC,uBAAuB,CAAC,EAAE,EAAE,OAAO,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAC;QAE/D,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;YACvB,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YAC3C,OAAO;QACT,CAAC;QACD,mBAAmB,CAAC,WAAW,EAAE,SAAS,CAAC,KAAK,CAAC,CAAC;QAClD,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;IACjG,CAAC;IAED,IAAI,CAAC,KAAoB,EAAE,KAAmC,EAAE,QAAgC;QAC9F,MAAM,EAAE,GAAG,KAAK,CAAC,EAAE,CAAC;QACpB,MAAM,OAAO,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC,iBAAiB,CAAC;QAC7D,IAAI,OAAO,KAAK,IAAI;YAAE,OAAO;QAE7B,EAAE,CAAC,gBAAgB,CAAC,OAAO,CAAC,QAAQ,EAAE,KAAK,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;QAElE,MAAM,MAAM,GAAG,uBAAuB,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QACxD,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;QAC5B,+FAA+F;QAC/F,qBAAqB;QACrB,MAAM,WAAW,GAAG,MAAM,CAAC,SAAS,KAAK,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACjE,EAAE,CAAC,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,UAAU,GAAG,CAAC,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,WAAW,GAAG,CAAC,GAAG,WAAW,CAAC,CAAC;IAC3G,CAAC;CACF,CAAC;AAEF,gGAAgG;AAChG,wFAAwF;AACxF,2BAA2B;AAC3B,MAAM,UAAU,2BAA2B,CAAC,KAAoB;IAC9D,8BAA8B,CAAC,KAAK,EAAE,qBAAqB,EAAE,+BAA+B,CAAC,CAAC;AAChG,CAAC;AAED,MAAM,WAAW,GAAgB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@flighthq/scene3d-gl",
|
|
3
|
+
"version": "0.2.1-next.840.857425c",
|
|
4
|
+
"repository": {
|
|
5
|
+
"type": "git",
|
|
6
|
+
"url": "https://github.com/flighthq/flight.git",
|
|
7
|
+
"directory": "packages/scene3d-gl"
|
|
8
|
+
},
|
|
9
|
+
"type": "module",
|
|
10
|
+
"main": "dist/index.js",
|
|
11
|
+
"types": "dist/index.d.ts",
|
|
12
|
+
"exports": {
|
|
13
|
+
".": {
|
|
14
|
+
"types": "./dist/index.d.ts",
|
|
15
|
+
"default": "./dist/index.js"
|
|
16
|
+
}
|
|
17
|
+
},
|
|
18
|
+
"files": [
|
|
19
|
+
"dist",
|
|
20
|
+
"src/**/*.test.ts",
|
|
21
|
+
"!dist/**/*.test.js",
|
|
22
|
+
"!dist/**/*.test.d.ts",
|
|
23
|
+
"!dist/**/*.test.js.map",
|
|
24
|
+
"!dist/**/*.test.d.ts.map"
|
|
25
|
+
],
|
|
26
|
+
"scripts": {
|
|
27
|
+
"build": "tsc -b",
|
|
28
|
+
"clean": "tsc -b --clean",
|
|
29
|
+
"test": "vitest run --config vitest.config.ts",
|
|
30
|
+
"test:watch": "vitest --watch --config vitest.config.ts",
|
|
31
|
+
"prepack": "npm run clean && npm run clean:dist && npm run build",
|
|
32
|
+
"clean:dist": "tsx ../../scripts/clean-package-dist.ts"
|
|
33
|
+
},
|
|
34
|
+
"dependencies": {
|
|
35
|
+
"@flighthq/camera": "0.2.1-next.840.857425c",
|
|
36
|
+
"@flighthq/color": "0.2.1-next.840.857425c",
|
|
37
|
+
"@flighthq/geometry": "0.2.1-next.840.857425c",
|
|
38
|
+
"@flighthq/image": "0.2.1-next.840.857425c",
|
|
39
|
+
"@flighthq/lighting": "0.2.1-next.840.857425c",
|
|
40
|
+
"@flighthq/log": "0.2.1-next.840.857425c",
|
|
41
|
+
"@flighthq/materials": "0.2.1-next.840.857425c",
|
|
42
|
+
"@flighthq/mesh": "0.2.1-next.840.857425c",
|
|
43
|
+
"@flighthq/node": "0.2.1-next.840.857425c",
|
|
44
|
+
"@flighthq/render": "0.2.1-next.840.857425c",
|
|
45
|
+
"@flighthq/render-gl": "0.2.1-next.840.857425c",
|
|
46
|
+
"@flighthq/scene3d": "0.2.1-next.840.857425c",
|
|
47
|
+
"@flighthq/shading": "0.2.1-next.840.857425c",
|
|
48
|
+
"@flighthq/texture": "0.2.1-next.840.857425c",
|
|
49
|
+
"@flighthq/types": "0.2.1-next.840.857425c"
|
|
50
|
+
},
|
|
51
|
+
"devDependencies": {
|
|
52
|
+
"@flighthq/particleemitter": "*",
|
|
53
|
+
"@flighthq/skeleton3d": "*",
|
|
54
|
+
"typescript": "^5.3.0"
|
|
55
|
+
},
|
|
56
|
+
"description": "WebGL2 3D scene renderer",
|
|
57
|
+
"sideEffects": false
|
|
58
|
+
}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { createCamera3D } from '@flighthq/camera';
|
|
2
|
+
import { createMatrix3, createMatrix4 } from '@flighthq/geometry';
|
|
3
|
+
import { createAnisotropyPbrMaterial } from '@flighthq/materials';
|
|
4
|
+
import { createBoxMeshGeometry } from '@flighthq/mesh';
|
|
5
|
+
import type { Camera3D, Matrix3, Matrix4, Scene3DLightBlock, Scene3DRenderProxy } from '@flighthq/types';
|
|
6
|
+
import { AnisotropyPbrMaterialKind } from '@flighthq/types';
|
|
7
|
+
|
|
8
|
+
import {
|
|
9
|
+
anisotropyPbrGlMeshMaterialRenderer,
|
|
10
|
+
registerAnisotropyPbrGlMaterial,
|
|
11
|
+
} from './anisotropyPbrGlMeshMaterialRenderer';
|
|
12
|
+
import { getGlMeshMaterialRenderer } from './glMeshMaterialRegistry';
|
|
13
|
+
import { getGlScene3DRuntime } from './glScene3DRuntime';
|
|
14
|
+
import { makeGlScene3DState } from './glScene3DTestHelper';
|
|
15
|
+
|
|
16
|
+
function makeCamera(): Camera3D {
|
|
17
|
+
return createCamera3D({ far: 100, near: 0.1, projection: { aspect: 1, fovY: Math.PI / 3, kind: 'perspective' } });
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
function makeLights(): Scene3DLightBlock {
|
|
21
|
+
const data = new Float32Array(12);
|
|
22
|
+
data[1] = -1;
|
|
23
|
+
data[4] = 1;
|
|
24
|
+
data[5] = 1;
|
|
25
|
+
data[6] = 1;
|
|
26
|
+
data[8] = 0.1;
|
|
27
|
+
data[9] = 0.1;
|
|
28
|
+
data[10] = 0.1;
|
|
29
|
+
return { ambientCount: 1, data, directionalCount: 1, hemisphereCount: 0, pointCount: 0, spotCount: 0, version: 1 };
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
function makeProxy(): Scene3DRenderProxy {
|
|
33
|
+
const geometry = createBoxMeshGeometry();
|
|
34
|
+
return {
|
|
35
|
+
material: createAnisotropyPbrMaterial(),
|
|
36
|
+
normalMatrix: createMatrix3() as Matrix3,
|
|
37
|
+
subset: geometry.subsets[0],
|
|
38
|
+
worldMatrix: createMatrix4() as Matrix4,
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
describe('anisotropyPbrGlMeshMaterialRenderer', () => {
|
|
43
|
+
it('bind uploads the light block, standard block, and anisotropy uniforms', () => {
|
|
44
|
+
const { state, gl } = makeGlScene3DState();
|
|
45
|
+
anisotropyPbrGlMeshMaterialRenderer.bind(
|
|
46
|
+
state,
|
|
47
|
+
createAnisotropyPbrMaterial({ anisotropyRotation: 0.5, anisotropyStrength: 0.7 }),
|
|
48
|
+
makeLights(),
|
|
49
|
+
makeCamera(),
|
|
50
|
+
);
|
|
51
|
+
expect(gl.calls.some((c) => c.name === 'useProgram')).toBe(true);
|
|
52
|
+
expect(gl.calls.some((c) => c.name === 'uniform4f')).toBe(true);
|
|
53
|
+
expect(gl.calls.some((c) => c.name === 'uniformMatrix4fv')).toBe(true);
|
|
54
|
+
expect(gl.calls.filter((c) => c.name === 'uniform1f').length).toBeGreaterThanOrEqual(2);
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
it('caches the anisotropy program under the pbr: namespace', () => {
|
|
58
|
+
const { state } = makeGlScene3DState();
|
|
59
|
+
anisotropyPbrGlMeshMaterialRenderer.bind(state, createAnisotropyPbrMaterial(), makeLights(), makeCamera());
|
|
60
|
+
const cache = getGlScene3DRuntime(state).programCache;
|
|
61
|
+
expect(cache.size).toBe(1);
|
|
62
|
+
expect([...cache.keys()][0].startsWith('pbr:')).toBe(true);
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
it('draw issues an indexed draw after bind', () => {
|
|
66
|
+
const { state, gl } = makeGlScene3DState();
|
|
67
|
+
const proxy = makeProxy();
|
|
68
|
+
anisotropyPbrGlMeshMaterialRenderer.bind(state, proxy.material, makeLights(), makeCamera());
|
|
69
|
+
anisotropyPbrGlMeshMaterialRenderer.draw(state, proxy, createBoxMeshGeometry());
|
|
70
|
+
expect(gl.calls.some((c) => c.name === 'drawElements')).toBe(true);
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
it('draw is a no-op before bind', () => {
|
|
74
|
+
const { state, gl } = makeGlScene3DState();
|
|
75
|
+
anisotropyPbrGlMeshMaterialRenderer.draw(state, makeProxy(), createBoxMeshGeometry());
|
|
76
|
+
expect(gl.calls.some((c) => c.name === 'drawElements')).toBe(false);
|
|
77
|
+
});
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
describe('registerAnisotropyPbrGlMaterial', () => {
|
|
81
|
+
it('installs the renderer for AnisotropyPbrMaterialKind', () => {
|
|
82
|
+
const { state } = makeGlScene3DState();
|
|
83
|
+
registerAnisotropyPbrGlMaterial(state);
|
|
84
|
+
expect(getGlMeshMaterialRenderer(state, AnisotropyPbrMaterialKind)).toBe(anisotropyPbrGlMeshMaterialRenderer);
|
|
85
|
+
});
|
|
86
|
+
});
|