@luma.gl/shadertools 9.3.0-alpha.9 → 9.3.1
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/dist.dev.js +1018 -188
- package/dist/dist.min.js +440 -145
- package/dist/index.cjs +913 -172
- package/dist/index.cjs.map +4 -4
- package/dist/index.d.ts +7 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -1
- package/dist/index.js.map +1 -1
- package/dist/lib/color/normalize-byte-colors.d.ts +23 -0
- package/dist/lib/color/normalize-byte-colors.d.ts.map +1 -0
- package/dist/lib/color/normalize-byte-colors.js +42 -0
- package/dist/lib/color/normalize-byte-colors.js.map +1 -0
- package/dist/lib/glsl-utils/shader-utils.js +4 -4
- package/dist/lib/glsl-utils/shader-utils.js.map +1 -1
- package/dist/lib/shader-assembly/assemble-shaders.d.ts.map +1 -1
- package/dist/lib/shader-assembly/assemble-shaders.js +102 -49
- package/dist/lib/shader-assembly/assemble-shaders.js.map +1 -1
- package/dist/lib/shader-assembly/wgsl-binding-debug.d.ts.map +1 -1
- package/dist/lib/shader-assembly/wgsl-binding-debug.js +7 -3
- package/dist/lib/shader-assembly/wgsl-binding-debug.js.map +1 -1
- package/dist/lib/shader-assembly/wgsl-binding-scan.d.ts +19 -0
- package/dist/lib/shader-assembly/wgsl-binding-scan.d.ts.map +1 -0
- package/dist/lib/shader-assembly/wgsl-binding-scan.js +151 -0
- package/dist/lib/shader-assembly/wgsl-binding-scan.js.map +1 -0
- package/dist/lib/shader-generator/glsl/generate-glsl.js +4 -4
- package/dist/lib/shader-generator/glsl/generate-glsl.js.map +1 -1
- package/dist/lib/shader-module/shader-module-uniform-layout.d.ts +69 -0
- package/dist/lib/shader-module/shader-module-uniform-layout.d.ts.map +1 -1
- package/dist/lib/shader-module/shader-module-uniform-layout.js +143 -3
- package/dist/lib/shader-module/shader-module-uniform-layout.js.map +1 -1
- package/dist/modules/color/float-colors.d.ts +26 -0
- package/dist/modules/color/float-colors.d.ts.map +1 -0
- package/dist/modules/color/float-colors.js +82 -0
- package/dist/modules/color/float-colors.js.map +1 -0
- package/dist/modules/engine/picking/picking.d.ts +8 -8
- package/dist/modules/engine/picking/picking.d.ts.map +1 -1
- package/dist/modules/engine/picking/picking.js +13 -15
- package/dist/modules/engine/picking/picking.js.map +1 -1
- package/dist/modules/engine/project/project.d.ts +1 -1
- package/dist/modules/engine/project/project.js +1 -1
- package/dist/modules/engine/skin/skin.d.ts +2 -2
- package/dist/modules/engine/skin/skin.d.ts.map +1 -1
- package/dist/modules/engine/skin/skin.js +1 -1
- package/dist/modules/lighting/gouraud-material/gouraud-material.d.ts +1 -0
- package/dist/modules/lighting/gouraud-material/gouraud-material.d.ts.map +1 -1
- package/dist/modules/lighting/gouraud-material/gouraud-material.js +6 -3
- package/dist/modules/lighting/gouraud-material/gouraud-material.js.map +1 -1
- package/dist/modules/lighting/lambert-material/lambert-shaders-glsl.d.ts +2 -2
- package/dist/modules/lighting/lambert-material/lambert-shaders-glsl.d.ts.map +1 -1
- package/dist/modules/lighting/lambert-material/lambert-shaders-glsl.js +2 -2
- package/dist/modules/lighting/lights/lighting-glsl.d.ts +1 -1
- package/dist/modules/lighting/lights/lighting-glsl.d.ts.map +1 -1
- package/dist/modules/lighting/lights/lighting-glsl.js +1 -1
- package/dist/modules/lighting/lights/lighting.d.ts +4 -2
- package/dist/modules/lighting/lights/lighting.d.ts.map +1 -1
- package/dist/modules/lighting/lights/lighting.js +17 -11
- package/dist/modules/lighting/lights/lighting.js.map +1 -1
- package/dist/modules/lighting/no-material/dirlight.d.ts +3 -3
- package/dist/modules/lighting/no-material/dirlight.d.ts.map +1 -1
- package/dist/modules/lighting/no-material/dirlight.js +2 -2
- package/dist/modules/lighting/pbr-material/pbr-material-glsl.d.ts +2 -2
- package/dist/modules/lighting/pbr-material/pbr-material-glsl.d.ts.map +1 -1
- package/dist/modules/lighting/pbr-material/pbr-material-glsl.js +138 -35
- package/dist/modules/lighting/pbr-material/pbr-material-glsl.js.map +1 -1
- package/dist/modules/lighting/pbr-material/pbr-material-wgsl.d.ts +1 -1
- package/dist/modules/lighting/pbr-material/pbr-material-wgsl.d.ts.map +1 -1
- package/dist/modules/lighting/pbr-material/pbr-material-wgsl.js +139 -35
- package/dist/modules/lighting/pbr-material/pbr-material-wgsl.js.map +1 -1
- package/dist/modules/lighting/pbr-material/pbr-material.d.ts +74 -6
- package/dist/modules/lighting/pbr-material/pbr-material.d.ts.map +1 -1
- package/dist/modules/lighting/pbr-material/pbr-material.js +70 -2
- package/dist/modules/lighting/pbr-material/pbr-material.js.map +1 -1
- package/dist/modules/lighting/pbr-material/pbr-projection.js +1 -1
- package/dist/modules/lighting/pbr-material/pbr-scene.d.ts +40 -0
- package/dist/modules/lighting/pbr-material/pbr-scene.d.ts.map +1 -0
- package/dist/modules/lighting/pbr-material/pbr-scene.js +67 -0
- package/dist/modules/lighting/pbr-material/pbr-scene.js.map +1 -0
- package/dist/modules/lighting/phong-material/phong-material.d.ts +1 -0
- package/dist/modules/lighting/phong-material/phong-material.d.ts.map +1 -1
- package/dist/modules/lighting/phong-material/phong-material.js +6 -3
- package/dist/modules/lighting/phong-material/phong-material.js.map +1 -1
- package/dist/modules/lighting/phong-material/phong-shaders-glsl.d.ts +2 -2
- package/dist/modules/lighting/phong-material/phong-shaders-glsl.d.ts.map +1 -1
- package/dist/modules/lighting/phong-material/phong-shaders-glsl.js +2 -2
- package/dist/modules/math/fp64/fp64-arithmetic-glsl.d.ts +1 -1
- package/dist/modules/math/fp64/fp64-arithmetic-glsl.d.ts.map +1 -1
- package/dist/modules/math/fp64/fp64-arithmetic-glsl.js +1 -1
- package/package.json +3 -3
- package/src/index.ts +17 -1
- package/src/lib/color/normalize-byte-colors.ts +57 -0
- package/src/lib/glsl-utils/shader-utils.ts +4 -4
- package/src/lib/shader-assembly/assemble-shaders.ts +197 -69
- package/src/lib/shader-assembly/wgsl-binding-debug.ts +14 -3
- package/src/lib/shader-assembly/wgsl-binding-scan.ts +228 -0
- package/src/lib/shader-generator/glsl/generate-glsl.ts +4 -4
- package/src/lib/shader-module/shader-module-uniform-layout.ts +233 -8
- package/src/modules/color/float-colors.ts +99 -0
- package/src/modules/engine/picking/picking.ts +17 -19
- package/src/modules/engine/project/project.ts +1 -1
- package/src/modules/engine/skin/skin.ts +1 -1
- package/src/modules/lighting/gouraud-material/gouraud-material.ts +10 -3
- package/src/modules/lighting/lambert-material/lambert-shaders-glsl.ts +2 -2
- package/src/modules/lighting/lights/lighting-glsl.ts +1 -1
- package/src/modules/lighting/lights/lighting.ts +20 -11
- package/src/modules/lighting/no-material/dirlight.ts +2 -2
- package/src/modules/lighting/pbr-material/pbr-material-glsl.ts +138 -35
- package/src/modules/lighting/pbr-material/pbr-material-wgsl.ts +139 -35
- package/src/modules/lighting/pbr-material/pbr-material.ts +110 -3
- package/src/modules/lighting/pbr-material/pbr-projection.ts +1 -1
- package/src/modules/lighting/pbr-material/pbr-scene.ts +91 -0
- package/src/modules/lighting/phong-material/phong-material.ts +10 -3
- package/src/modules/lighting/phong-material/phong-shaders-glsl.ts +2 -2
- package/src/modules/math/fp64/fp64-arithmetic-glsl.ts +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pbr-material.js","sourceRoot":"","sources":["../../../../src/modules/lighting/pbr-material/pbr-material.ts"],"names":[],"mappings":"AAAA,UAAU;AACV,+BAA+B;AAC/B,oCAAoC;
|
|
1
|
+
{"version":3,"file":"pbr-material.js","sourceRoot":"","sources":["../../../../src/modules/lighting/pbr-material/pbr-material.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { Texture } from '@luma.gl/core';
|
|
2
|
+
import type { NumberArray2, NumberArray16 } from '@math.gl/core';
|
|
3
|
+
export type PBRSceneBindings = {
|
|
4
|
+
pbr_transmissionFramebufferSampler?: Texture | null;
|
|
5
|
+
};
|
|
6
|
+
export type PBRSceneUniforms = {
|
|
7
|
+
exposure?: number;
|
|
8
|
+
toneMapMode?: number;
|
|
9
|
+
environmentIntensity?: number;
|
|
10
|
+
environmentRotation?: number;
|
|
11
|
+
framebufferSize?: NumberArray2;
|
|
12
|
+
viewMatrix?: NumberArray16;
|
|
13
|
+
projectionMatrix?: NumberArray16;
|
|
14
|
+
};
|
|
15
|
+
export type PBRSceneProps = PBRSceneBindings & PBRSceneUniforms;
|
|
16
|
+
export declare const pbrScene: {
|
|
17
|
+
readonly name: "pbrScene";
|
|
18
|
+
readonly bindingLayout: readonly [{
|
|
19
|
+
readonly name: "pbrScene";
|
|
20
|
+
readonly group: 1;
|
|
21
|
+
}, {
|
|
22
|
+
readonly name: "pbr_transmissionFramebufferSampler";
|
|
23
|
+
readonly group: 1;
|
|
24
|
+
}];
|
|
25
|
+
readonly source: "struct pbrSceneUniforms {\n exposure: f32,\n toneMapMode: i32,\n environmentIntensity: f32,\n environmentRotation: f32,\n framebufferSize: vec2<f32>,\n viewMatrix: mat4x4<f32>,\n projectionMatrix: mat4x4<f32>\n};\n\n@group(1) @binding(auto) var<uniform> pbrScene: pbrSceneUniforms;\n\n#ifdef USE_TRANSMISSION_FRAMEBUFFER\n@group(1) @binding(auto) var pbr_transmissionFramebufferSampler: texture_2d<f32>;\n@group(1) @binding(auto) var pbr_transmissionFramebufferSamplerSampler: sampler;\n#endif\n";
|
|
26
|
+
readonly vs: "layout(std140) uniform pbrSceneUniforms {\n float exposure;\n int toneMapMode;\n float environmentIntensity;\n float environmentRotation;\n vec2 framebufferSize;\n mat4 viewMatrix;\n mat4 projectionMatrix;\n} pbrScene;\n\n#ifdef USE_TRANSMISSION_FRAMEBUFFER\nuniform sampler2D pbr_transmissionFramebufferSampler;\n#endif\n";
|
|
27
|
+
readonly fs: "layout(std140) uniform pbrSceneUniforms {\n float exposure;\n int toneMapMode;\n float environmentIntensity;\n float environmentRotation;\n vec2 framebufferSize;\n mat4 viewMatrix;\n mat4 projectionMatrix;\n} pbrScene;\n\n#ifdef USE_TRANSMISSION_FRAMEBUFFER\nuniform sampler2D pbr_transmissionFramebufferSampler;\n#endif\n";
|
|
28
|
+
readonly getUniforms: (props: PBRSceneProps) => PBRSceneProps;
|
|
29
|
+
readonly uniformTypes: {
|
|
30
|
+
readonly exposure: "f32";
|
|
31
|
+
readonly toneMapMode: "i32";
|
|
32
|
+
readonly environmentIntensity: "f32";
|
|
33
|
+
readonly environmentRotation: "f32";
|
|
34
|
+
readonly framebufferSize: "vec2<f32>";
|
|
35
|
+
readonly viewMatrix: "mat4x4<f32>";
|
|
36
|
+
readonly projectionMatrix: "mat4x4<f32>";
|
|
37
|
+
};
|
|
38
|
+
readonly defaultUniforms: Required<PBRSceneUniforms>;
|
|
39
|
+
};
|
|
40
|
+
//# sourceMappingURL=pbr-scene.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pbr-scene.d.ts","sourceRoot":"","sources":["../../../../src/modules/lighting/pbr-material/pbr-scene.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAC,OAAO,EAAC,MAAM,eAAe,CAAC;AAC3C,OAAO,KAAK,EAAC,YAAY,EAAE,aAAa,EAAC,MAAM,eAAe,CAAC;AAI/D,MAAM,MAAM,gBAAgB,GAAG;IAC7B,kCAAkC,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;CACrD,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,eAAe,CAAC,EAAE,YAAY,CAAC;IAC/B,UAAU,CAAC,EAAE,aAAa,CAAC;IAC3B,gBAAgB,CAAC,EAAE,aAAa,CAAC;CAClC,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG,gBAAgB,GAAG,gBAAgB,CAAC;AAuChE,eAAO,MAAM,QAAQ;;;;;;;;;;;;kCASE,aAAa;;;;;;;;;;8BAkB7B,QAAQ,CAAC,gBAAgB,CAAC;CACmD,CAAC"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
// luma.gl
|
|
2
|
+
// SPDX-License-Identifier: MIT
|
|
3
|
+
// Copyright (c) vis.gl contributors
|
|
4
|
+
const IDENTITY_MATRIX = [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1];
|
|
5
|
+
const uniformBlock = /* glsl */ `\
|
|
6
|
+
layout(std140) uniform pbrSceneUniforms {
|
|
7
|
+
float exposure;
|
|
8
|
+
int toneMapMode;
|
|
9
|
+
float environmentIntensity;
|
|
10
|
+
float environmentRotation;
|
|
11
|
+
vec2 framebufferSize;
|
|
12
|
+
mat4 viewMatrix;
|
|
13
|
+
mat4 projectionMatrix;
|
|
14
|
+
} pbrScene;
|
|
15
|
+
|
|
16
|
+
#ifdef USE_TRANSMISSION_FRAMEBUFFER
|
|
17
|
+
uniform sampler2D pbr_transmissionFramebufferSampler;
|
|
18
|
+
#endif
|
|
19
|
+
`;
|
|
20
|
+
const wgslUniformBlock = /* wgsl */ `\
|
|
21
|
+
struct pbrSceneUniforms {
|
|
22
|
+
exposure: f32,
|
|
23
|
+
toneMapMode: i32,
|
|
24
|
+
environmentIntensity: f32,
|
|
25
|
+
environmentRotation: f32,
|
|
26
|
+
framebufferSize: vec2<f32>,
|
|
27
|
+
viewMatrix: mat4x4<f32>,
|
|
28
|
+
projectionMatrix: mat4x4<f32>
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
@group(1) @binding(auto) var<uniform> pbrScene: pbrSceneUniforms;
|
|
32
|
+
|
|
33
|
+
#ifdef USE_TRANSMISSION_FRAMEBUFFER
|
|
34
|
+
@group(1) @binding(auto) var pbr_transmissionFramebufferSampler: texture_2d<f32>;
|
|
35
|
+
@group(1) @binding(auto) var pbr_transmissionFramebufferSamplerSampler: sampler;
|
|
36
|
+
#endif
|
|
37
|
+
`;
|
|
38
|
+
export const pbrScene = {
|
|
39
|
+
name: 'pbrScene',
|
|
40
|
+
bindingLayout: [
|
|
41
|
+
{ name: 'pbrScene', group: 1 },
|
|
42
|
+
{ name: 'pbr_transmissionFramebufferSampler', group: 1 }
|
|
43
|
+
],
|
|
44
|
+
source: wgslUniformBlock,
|
|
45
|
+
vs: uniformBlock,
|
|
46
|
+
fs: uniformBlock,
|
|
47
|
+
getUniforms: (props) => props,
|
|
48
|
+
uniformTypes: {
|
|
49
|
+
exposure: 'f32',
|
|
50
|
+
toneMapMode: 'i32',
|
|
51
|
+
environmentIntensity: 'f32',
|
|
52
|
+
environmentRotation: 'f32',
|
|
53
|
+
framebufferSize: 'vec2<f32>',
|
|
54
|
+
viewMatrix: 'mat4x4<f32>',
|
|
55
|
+
projectionMatrix: 'mat4x4<f32>'
|
|
56
|
+
},
|
|
57
|
+
defaultUniforms: {
|
|
58
|
+
exposure: 1,
|
|
59
|
+
toneMapMode: 2,
|
|
60
|
+
environmentIntensity: 1,
|
|
61
|
+
environmentRotation: Math.PI * 0.5,
|
|
62
|
+
framebufferSize: [1, 1],
|
|
63
|
+
viewMatrix: IDENTITY_MATRIX,
|
|
64
|
+
projectionMatrix: IDENTITY_MATRIX
|
|
65
|
+
}
|
|
66
|
+
};
|
|
67
|
+
//# sourceMappingURL=pbr-scene.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pbr-scene.js","sourceRoot":"","sources":["../../../../src/modules/lighting/pbr-material/pbr-scene.ts"],"names":[],"mappings":"AAAA,UAAU;AACV,+BAA+B;AAC/B,oCAAoC;AAuBpC,MAAM,eAAe,GAAkB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;AAExF,MAAM,YAAY,GAAG,UAAU,CAAC;;;;;;;;;;;;;;CAc/B,CAAC;AAEF,MAAM,gBAAgB,GAAG,UAAU,CAAC;;;;;;;;;;;;;;;;;CAiBnC,CAAC;AAEF,MAAM,CAAC,MAAM,QAAQ,GAAG;IACtB,IAAI,EAAE,UAAU;IAChB,aAAa,EAAE;QACb,EAAC,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,EAAC;QAC5B,EAAC,IAAI,EAAE,oCAAoC,EAAE,KAAK,EAAE,CAAC,EAAC;KACvD;IACD,MAAM,EAAE,gBAAgB;IACxB,EAAE,EAAE,YAAY;IAChB,EAAE,EAAE,YAAY;IAChB,WAAW,EAAE,CAAC,KAAoB,EAAE,EAAE,CAAC,KAAK;IAC5C,YAAY,EAAE;QACZ,QAAQ,EAAE,KAAK;QACf,WAAW,EAAE,KAAK;QAClB,oBAAoB,EAAE,KAAK;QAC3B,mBAAmB,EAAE,KAAK;QAC1B,eAAe,EAAE,WAAW;QAC5B,UAAU,EAAE,aAAa;QACzB,gBAAgB,EAAE,aAAa;KAChC;IACD,eAAe,EAAE;QACf,QAAQ,EAAE,CAAC;QACX,WAAW,EAAE,CAAC;QACd,oBAAoB,EAAE,CAAC;QACvB,mBAAmB,EAAE,IAAI,CAAC,EAAE,GAAG,GAAG;QAClC,eAAe,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;QACvB,UAAU,EAAE,eAAe;QAC3B,gBAAgB,EAAE,eAAe;KACJ;CACmD,CAAC"}
|
|
@@ -7,6 +7,7 @@ export type PhongMaterialProps = {
|
|
|
7
7
|
/** Specularity exponent */
|
|
8
8
|
shininess?: number;
|
|
9
9
|
specularColor?: NumberArray3;
|
|
10
|
+
useByteColors?: boolean;
|
|
10
11
|
};
|
|
11
12
|
/** In Phong shading, the normal vector is linearly interpolated across the surface of the polygon from the polygon's vertex normals. */
|
|
12
13
|
export declare const phongMaterial: ShaderModule<PhongMaterialProps>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"phong-material.d.ts","sourceRoot":"","sources":["../../../../src/modules/lighting/phong-material/phong-material.ts"],"names":[],"mappings":"AAIA,OAAO,EAAC,YAAY,EAAC,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAC,YAAY,EAAC,oDAAiD;
|
|
1
|
+
{"version":3,"file":"phong-material.d.ts","sourceRoot":"","sources":["../../../../src/modules/lighting/phong-material/phong-material.ts"],"names":[],"mappings":"AAIA,OAAO,EAAC,YAAY,EAAC,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAC,YAAY,EAAC,oDAAiD;AAMtE,MAAM,MAAM,kBAAkB,GAAG;IAC/B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,2BAA2B;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,YAAY,CAAC;IAC7B,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB,CAAC;AAEF,wIAAwI;AACxI,eAAO,MAAM,aAAa,EAAE,YAAY,CAAC,kBAAkB,CAsC1D,CAAC"}
|
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
import { lighting } from "../lights/lighting.js";
|
|
5
5
|
import { PHONG_WGSL } from "./phong-shaders-wgsl.js";
|
|
6
6
|
import { PHONG_VS, PHONG_FS } from "./phong-shaders-glsl.js";
|
|
7
|
+
import { normalizeByteColor3, resolveUseByteColors } from "../../../lib/color/normalize-byte-colors.js";
|
|
7
8
|
/** In Phong shading, the normal vector is linearly interpolated across the surface of the polygon from the polygon's vertex normals. */
|
|
8
9
|
export const phongMaterial = {
|
|
9
10
|
name: 'phongMaterial',
|
|
@@ -22,19 +23,21 @@ export const phongMaterial = {
|
|
|
22
23
|
ambient: 'f32',
|
|
23
24
|
diffuse: 'f32',
|
|
24
25
|
shininess: 'f32',
|
|
25
|
-
specularColor: 'vec3<f32>'
|
|
26
|
+
specularColor: 'vec3<f32>',
|
|
27
|
+
useByteColors: 'i32'
|
|
26
28
|
},
|
|
27
29
|
defaultUniforms: {
|
|
28
30
|
unlit: false,
|
|
29
31
|
ambient: 0.35,
|
|
30
32
|
diffuse: 0.6,
|
|
31
33
|
shininess: 32,
|
|
32
|
-
specularColor: [0.15, 0.15, 0.15]
|
|
34
|
+
specularColor: [0.15, 0.15, 0.15],
|
|
35
|
+
useByteColors: true
|
|
33
36
|
},
|
|
34
37
|
getUniforms(props) {
|
|
35
38
|
const uniforms = { ...props };
|
|
36
39
|
if (uniforms.specularColor) {
|
|
37
|
-
uniforms.specularColor = uniforms.specularColor.
|
|
40
|
+
uniforms.specularColor = normalizeByteColor3(uniforms.specularColor, resolveUseByteColors(uniforms.useByteColors, true));
|
|
38
41
|
}
|
|
39
42
|
return { ...phongMaterial.defaultUniforms, ...uniforms };
|
|
40
43
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"phong-material.js","sourceRoot":"","sources":["../../../../src/modules/lighting/phong-material/phong-material.ts"],"names":[],"mappings":"AAAA,UAAU;AACV,+BAA+B;AAC/B,oCAAoC;AAIpC,OAAO,EAAC,QAAQ,EAAC,8BAA2B;AAC5C,OAAO,EAAC,UAAU,EAAC,gCAA6B;AAChD,OAAO,EAAC,QAAQ,EAAE,QAAQ,EAAC,gCAA6B;
|
|
1
|
+
{"version":3,"file":"phong-material.js","sourceRoot":"","sources":["../../../../src/modules/lighting/phong-material/phong-material.ts"],"names":[],"mappings":"AAAA,UAAU;AACV,+BAA+B;AAC/B,oCAAoC;AAIpC,OAAO,EAAC,QAAQ,EAAC,8BAA2B;AAC5C,OAAO,EAAC,UAAU,EAAC,gCAA6B;AAChD,OAAO,EAAC,QAAQ,EAAE,QAAQ,EAAC,gCAA6B;AACxD,OAAO,EAAC,mBAAmB,EAAE,oBAAoB,EAAC,oDAAiD;AAYnG,wIAAwI;AACxI,MAAM,CAAC,MAAM,aAAa,GAAqC;IAC7D,IAAI,EAAE,eAAe;IACrB,gBAAgB,EAAE,CAAC;IACnB,aAAa,EAAE,CAAC,EAAC,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,CAAC,EAAC,CAAC;IAClD,YAAY,EAAE,CAAC,QAAQ,CAAC;IACxB,oDAAoD;IACpD,MAAM,EAAE,UAAU;IAClB,EAAE,EAAE,QAAQ;IACZ,EAAE,EAAE,QAAQ;IACZ,OAAO,EAAE;QACP,iBAAiB,EAAE,IAAI;KACxB;IACD,YAAY,EAAE;QACZ,KAAK,EAAE,KAAK;QACZ,OAAO,EAAE,KAAK;QACd,OAAO,EAAE,KAAK;QACd,SAAS,EAAE,KAAK;QAChB,aAAa,EAAE,WAAW;QAC1B,aAAa,EAAE,KAAK;KACrB;IACD,eAAe,EAAE;QACf,KAAK,EAAE,KAAK;QACZ,OAAO,EAAE,IAAI;QACb,OAAO,EAAE,GAAG;QACZ,SAAS,EAAE,EAAE;QACb,aAAa,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC;QACjC,aAAa,EAAE,IAAI;KACpB;IACD,WAAW,CAAC,KAA0B;QACpC,MAAM,QAAQ,GAAG,EAAC,GAAG,KAAK,EAAC,CAAC;QAC5B,IAAI,QAAQ,CAAC,aAAa,EAAE,CAAC;YAC3B,QAAQ,CAAC,aAAa,GAAG,mBAAmB,CAC1C,QAAQ,CAAC,aAAa,EACtB,oBAAoB,CAAC,QAAQ,CAAC,aAAa,EAAE,IAAI,CAAC,CACnC,CAAC;QACpB,CAAC;QACD,OAAO,EAAC,GAAG,aAAa,CAAC,eAAe,EAAE,GAAG,QAAQ,EAAC,CAAC;IACzD,CAAC;CACF,CAAC"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export declare const PHONG_VS = "uniform phongMaterialUniforms {\n uniform bool unlit;\n uniform float ambient;\n uniform float diffuse;\n uniform float shininess;\n uniform vec3 specularColor;\n} material;\n";
|
|
2
|
-
export declare const PHONG_FS = "uniform phongMaterialUniforms {\n uniform bool unlit;\n uniform float ambient;\n uniform float diffuse;\n uniform float shininess;\n uniform vec3 specularColor;\n} material;\n\nvec3 lighting_getLightColor(vec3 surfaceColor, vec3 light_direction, vec3 view_direction, vec3 normal_worldspace, vec3 color) {\n vec3 halfway_direction = normalize(light_direction + view_direction);\n float lambertian = dot(light_direction, normal_worldspace);\n float specular = 0.0;\n if (lambertian > 0.0) {\n float specular_angle = max(dot(normal_worldspace, halfway_direction), 0.0);\n specular = pow(specular_angle, material.shininess);\n }\n lambertian = max(lambertian, 0.0);\n return (lambertian * material.diffuse * surfaceColor + specular * material.specularColor) * color;\n}\n\nvec3 lighting_getLightColor(vec3 surfaceColor, vec3 cameraPosition, vec3 position_worldspace, vec3 normal_worldspace) {\n vec3 lightColor = surfaceColor;\n\n if (material.unlit) {\n return surfaceColor;\n }\n\n if (lighting.enabled == 0) {\n return lightColor;\n }\n\n vec3 view_direction = normalize(cameraPosition - position_worldspace);\n lightColor = material.ambient * surfaceColor * lighting.ambientColor;\n\n for (int i = 0; i < lighting.pointLightCount; i++) {\n PointLight pointLight = lighting_getPointLight(i);\n vec3 light_position_worldspace = pointLight.position;\n vec3 light_direction = normalize(light_position_worldspace - position_worldspace);\n float light_attenuation = getPointLightAttenuation(pointLight, distance(light_position_worldspace, position_worldspace));\n lightColor += lighting_getLightColor(surfaceColor, light_direction, view_direction, normal_worldspace, pointLight.color / light_attenuation);\n }\n\n for (int i = 0; i < lighting.spotLightCount; i++) {\n SpotLight spotLight = lighting_getSpotLight(i);\n vec3 light_position_worldspace = spotLight.position;\n vec3 light_direction = normalize(light_position_worldspace - position_worldspace);\n float light_attenuation = getSpotLightAttenuation(spotLight, position_worldspace);\n lightColor += lighting_getLightColor(surfaceColor, light_direction, view_direction, normal_worldspace, spotLight.color / light_attenuation);\n }\n\n for (int i = 0; i < lighting.directionalLightCount; i++) {\n DirectionalLight directionalLight = lighting_getDirectionalLight(i);\n lightColor += lighting_getLightColor(surfaceColor, -directionalLight.direction, view_direction, normal_worldspace, directionalLight.color);\n }\n \n return lightColor;\n}\n";
|
|
1
|
+
export declare const PHONG_VS = "layout(std140) uniform phongMaterialUniforms {\n uniform bool unlit;\n uniform float ambient;\n uniform float diffuse;\n uniform float shininess;\n uniform vec3 specularColor;\n} material;\n";
|
|
2
|
+
export declare const PHONG_FS = "layout(std140) uniform phongMaterialUniforms {\n uniform bool unlit;\n uniform float ambient;\n uniform float diffuse;\n uniform float shininess;\n uniform vec3 specularColor;\n} material;\n\nvec3 lighting_getLightColor(vec3 surfaceColor, vec3 light_direction, vec3 view_direction, vec3 normal_worldspace, vec3 color) {\n vec3 halfway_direction = normalize(light_direction + view_direction);\n float lambertian = dot(light_direction, normal_worldspace);\n float specular = 0.0;\n if (lambertian > 0.0) {\n float specular_angle = max(dot(normal_worldspace, halfway_direction), 0.0);\n specular = pow(specular_angle, material.shininess);\n }\n lambertian = max(lambertian, 0.0);\n return (lambertian * material.diffuse * surfaceColor + specular * material.specularColor) * color;\n}\n\nvec3 lighting_getLightColor(vec3 surfaceColor, vec3 cameraPosition, vec3 position_worldspace, vec3 normal_worldspace) {\n vec3 lightColor = surfaceColor;\n\n if (material.unlit) {\n return surfaceColor;\n }\n\n if (lighting.enabled == 0) {\n return lightColor;\n }\n\n vec3 view_direction = normalize(cameraPosition - position_worldspace);\n lightColor = material.ambient * surfaceColor * lighting.ambientColor;\n\n for (int i = 0; i < lighting.pointLightCount; i++) {\n PointLight pointLight = lighting_getPointLight(i);\n vec3 light_position_worldspace = pointLight.position;\n vec3 light_direction = normalize(light_position_worldspace - position_worldspace);\n float light_attenuation = getPointLightAttenuation(pointLight, distance(light_position_worldspace, position_worldspace));\n lightColor += lighting_getLightColor(surfaceColor, light_direction, view_direction, normal_worldspace, pointLight.color / light_attenuation);\n }\n\n for (int i = 0; i < lighting.spotLightCount; i++) {\n SpotLight spotLight = lighting_getSpotLight(i);\n vec3 light_position_worldspace = spotLight.position;\n vec3 light_direction = normalize(light_position_worldspace - position_worldspace);\n float light_attenuation = getSpotLightAttenuation(spotLight, position_worldspace);\n lightColor += lighting_getLightColor(surfaceColor, light_direction, view_direction, normal_worldspace, spotLight.color / light_attenuation);\n }\n\n for (int i = 0; i < lighting.directionalLightCount; i++) {\n DirectionalLight directionalLight = lighting_getDirectionalLight(i);\n lightColor += lighting_getLightColor(surfaceColor, -directionalLight.direction, view_direction, normal_worldspace, directionalLight.color);\n }\n \n return lightColor;\n}\n";
|
|
3
3
|
//# sourceMappingURL=phong-shaders-glsl.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"phong-shaders-glsl.d.ts","sourceRoot":"","sources":["../../../../src/modules/lighting/phong-material/phong-shaders-glsl.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,QAAQ,
|
|
1
|
+
{"version":3,"file":"phong-shaders-glsl.d.ts","sourceRoot":"","sources":["../../../../src/modules/lighting/phong-material/phong-shaders-glsl.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,QAAQ,yMAQpB,CAAC;AAEF,eAAO,MAAM,QAAQ,0hFA0DpB,CAAC"}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
// SPDX-License-Identifier: MIT
|
|
3
3
|
// Copyright (c) vis.gl contributors
|
|
4
4
|
export const PHONG_VS = /* glsl */ `\
|
|
5
|
-
uniform phongMaterialUniforms {
|
|
5
|
+
layout(std140) uniform phongMaterialUniforms {
|
|
6
6
|
uniform bool unlit;
|
|
7
7
|
uniform float ambient;
|
|
8
8
|
uniform float diffuse;
|
|
@@ -11,7 +11,7 @@ uniform phongMaterialUniforms {
|
|
|
11
11
|
} material;
|
|
12
12
|
`;
|
|
13
13
|
export const PHONG_FS = /* glsl */ `\
|
|
14
|
-
uniform phongMaterialUniforms {
|
|
14
|
+
layout(std140) uniform phongMaterialUniforms {
|
|
15
15
|
uniform bool unlit;
|
|
16
16
|
uniform float ambient;
|
|
17
17
|
uniform float diffuse;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare const fp64arithmeticShader = "\
|
|
1
|
+
export declare const fp64arithmeticShader = "\nlayout(std140) uniform fp64arithmeticUniforms {\n uniform float ONE;\n uniform float SPLIT;\n} fp64;\n\n/*\nAbout LUMA_FP64_CODE_ELIMINATION_WORKAROUND\n\nThe purpose of this workaround is to prevent shader compilers from\noptimizing away necessary arithmetic operations by swapping their sequences\nor transform the equation to some 'equivalent' form.\n\nThese helpers implement Dekker/Veltkamp-style error tracking. If the compiler\nfolds constants or reassociates the arithmetic, the high/low split can stop\ntracking the rounding error correctly. That failure mode tends to look fine in\nsimple coordinate setup, but then breaks down inside iterative arithmetic such\nas fp64 Mandelbrot loops.\n\nThe method is to multiply an artifical variable, ONE, which will be known to\nthe compiler to be 1 only at runtime. The whole expression is then represented\nas a polynomial with respective to ONE. In the coefficients of all terms, only one a\nand one b should appear\n\nerr = (a + b) * ONE^6 - a * ONE^5 - (a + b) * ONE^4 + a * ONE^3 - b - (a + b) * ONE^2 + a * ONE\n*/\n\nfloat prevent_fp64_optimization(float value) {\n#if defined(LUMA_FP64_CODE_ELIMINATION_WORKAROUND)\n return value + fp64.ONE * 0.0;\n#else\n return value;\n#endif\n}\n\n// Divide float number to high and low floats to extend fraction bits\nvec2 split(float a) {\n // Keep SPLIT as a runtime uniform so the compiler cannot fold the Dekker\n // split into a constant expression and reassociate the recovery steps.\n float split = prevent_fp64_optimization(fp64.SPLIT);\n float t = prevent_fp64_optimization(a * split);\n float temp = t - a;\n float a_hi = t - temp;\n float a_lo = a - a_hi;\n return vec2(a_hi, a_lo);\n}\n\n// Divide float number again when high float uses too many fraction bits\nvec2 split2(vec2 a) {\n vec2 b = split(a.x);\n b.y += a.y;\n return b;\n}\n\n// Special sum operation when a > b\nvec2 quickTwoSum(float a, float b) {\n#if defined(LUMA_FP64_CODE_ELIMINATION_WORKAROUND)\n float sum = (a + b) * fp64.ONE;\n float err = b - (sum - a) * fp64.ONE;\n#else\n float sum = a + b;\n float err = b - (sum - a);\n#endif\n return vec2(sum, err);\n}\n\n// General sum operation\nvec2 twoSum(float a, float b) {\n float s = (a + b);\n#if defined(LUMA_FP64_CODE_ELIMINATION_WORKAROUND)\n float v = (s * fp64.ONE - a) * fp64.ONE;\n float err = (a - (s - v) * fp64.ONE) * fp64.ONE * fp64.ONE * fp64.ONE + (b - v);\n#else\n float v = s - a;\n float err = (a - (s - v)) + (b - v);\n#endif\n return vec2(s, err);\n}\n\nvec2 twoSub(float a, float b) {\n float s = (a - b);\n#if defined(LUMA_FP64_CODE_ELIMINATION_WORKAROUND)\n float v = (s * fp64.ONE - a) * fp64.ONE;\n float err = (a - (s - v) * fp64.ONE) * fp64.ONE * fp64.ONE * fp64.ONE - (b + v);\n#else\n float v = s - a;\n float err = (a - (s - v)) - (b + v);\n#endif\n return vec2(s, err);\n}\n\nvec2 twoSqr(float a) {\n float prod = a * a;\n vec2 a_fp64 = split(a);\n#if defined(LUMA_FP64_CODE_ELIMINATION_WORKAROUND)\n float err = ((a_fp64.x * a_fp64.x - prod) * fp64.ONE + 2.0 * a_fp64.x *\n a_fp64.y * fp64.ONE * fp64.ONE) + a_fp64.y * a_fp64.y * fp64.ONE * fp64.ONE * fp64.ONE;\n#else\n float err = ((a_fp64.x * a_fp64.x - prod) + 2.0 * a_fp64.x * a_fp64.y) + a_fp64.y * a_fp64.y;\n#endif\n return vec2(prod, err);\n}\n\nvec2 twoProd(float a, float b) {\n float prod = a * b;\n vec2 a_fp64 = split(a);\n vec2 b_fp64 = split(b);\n // twoProd is especially sensitive because mul_fp64 and div_fp64 both depend\n // on the split terms and cross terms staying in the original evaluation\n // order. If the compiler folds or reassociates them, the low part tends to\n // collapse to zero or NaN on some drivers.\n float highProduct = prevent_fp64_optimization(a_fp64.x * b_fp64.x);\n float crossProduct1 = prevent_fp64_optimization(a_fp64.x * b_fp64.y);\n float crossProduct2 = prevent_fp64_optimization(a_fp64.y * b_fp64.x);\n float lowProduct = prevent_fp64_optimization(a_fp64.y * b_fp64.y);\n#if defined(LUMA_FP64_CODE_ELIMINATION_WORKAROUND)\n float err1 = (highProduct - prod) * fp64.ONE;\n float err2 = crossProduct1 * fp64.ONE * fp64.ONE;\n float err3 = crossProduct2 * fp64.ONE * fp64.ONE * fp64.ONE;\n float err4 = lowProduct * fp64.ONE * fp64.ONE * fp64.ONE * fp64.ONE;\n#else\n float err1 = highProduct - prod;\n float err2 = crossProduct1;\n float err3 = crossProduct2;\n float err4 = lowProduct;\n#endif\n float err = ((err1 + err2) + err3) + err4;\n return vec2(prod, err);\n}\n\nvec2 sum_fp64(vec2 a, vec2 b) {\n vec2 s, t;\n s = twoSum(a.x, b.x);\n t = twoSum(a.y, b.y);\n s.y += t.x;\n s = quickTwoSum(s.x, s.y);\n s.y += t.y;\n s = quickTwoSum(s.x, s.y);\n return s;\n}\n\nvec2 sub_fp64(vec2 a, vec2 b) {\n vec2 s, t;\n s = twoSub(a.x, b.x);\n t = twoSub(a.y, b.y);\n s.y += t.x;\n s = quickTwoSum(s.x, s.y);\n s.y += t.y;\n s = quickTwoSum(s.x, s.y);\n return s;\n}\n\nvec2 mul_fp64(vec2 a, vec2 b) {\n vec2 prod = twoProd(a.x, b.x);\n // y component is for the error\n prod.y += a.x * b.y;\n#if defined(LUMA_FP64_HIGH_BITS_OVERFLOW_WORKAROUND)\n prod = split2(prod);\n#endif\n prod = quickTwoSum(prod.x, prod.y);\n prod.y += a.y * b.x;\n#if defined(LUMA_FP64_HIGH_BITS_OVERFLOW_WORKAROUND)\n prod = split2(prod);\n#endif\n prod = quickTwoSum(prod.x, prod.y);\n return prod;\n}\n\nvec2 div_fp64(vec2 a, vec2 b) {\n float xn = 1.0 / b.x;\n#if defined(LUMA_FP64_HIGH_BITS_OVERFLOW_WORKAROUND)\n vec2 yn = mul_fp64(a, vec2(xn, 0));\n#else\n vec2 yn = a * xn;\n#endif\n float diff = (sub_fp64(a, mul_fp64(b, yn))).x;\n vec2 prod = twoProd(xn, diff);\n return sum_fp64(yn, prod);\n}\n\nvec2 sqrt_fp64(vec2 a) {\n if (a.x == 0.0 && a.y == 0.0) return vec2(0.0, 0.0);\n if (a.x < 0.0) return vec2(0.0 / 0.0, 0.0 / 0.0);\n\n float x = 1.0 / sqrt(a.x);\n float yn = a.x * x;\n#if defined(LUMA_FP64_CODE_ELIMINATION_WORKAROUND)\n vec2 yn_sqr = twoSqr(yn) * fp64.ONE;\n#else\n vec2 yn_sqr = twoSqr(yn);\n#endif\n float diff = sub_fp64(a, yn_sqr).x;\n vec2 prod = twoProd(x * 0.5, diff);\n#if defined(LUMA_FP64_HIGH_BITS_OVERFLOW_WORKAROUND)\n return sum_fp64(split(yn), prod);\n#else\n return sum_fp64(vec2(yn, 0.0), prod);\n#endif\n}\n";
|
|
2
2
|
//# sourceMappingURL=fp64-arithmetic-glsl.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fp64-arithmetic-glsl.d.ts","sourceRoot":"","sources":["../../../../src/modules/math/fp64/fp64-arithmetic-glsl.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,oBAAoB,
|
|
1
|
+
{"version":3,"file":"fp64-arithmetic-glsl.d.ts","sourceRoot":"","sources":["../../../../src/modules/math/fp64/fp64-arithmetic-glsl.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,oBAAoB,ijMAwMhC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@luma.gl/shadertools",
|
|
3
|
-
"version": "9.3.
|
|
3
|
+
"version": "9.3.1",
|
|
4
4
|
"description": "Shader module system for luma.gl",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
@@ -46,11 +46,11 @@
|
|
|
46
46
|
"prepublishOnly": "npm run build-minified-bundle && npm run build-dev-bundle"
|
|
47
47
|
},
|
|
48
48
|
"peerDependencies": {
|
|
49
|
-
"@luma.gl/core": "9.3.0
|
|
49
|
+
"@luma.gl/core": "~9.3.0"
|
|
50
50
|
},
|
|
51
51
|
"dependencies": {
|
|
52
52
|
"@math.gl/core": "^4.1.0",
|
|
53
53
|
"@math.gl/types": "^4.1.0"
|
|
54
54
|
},
|
|
55
|
-
"gitHead": "
|
|
55
|
+
"gitHead": "c13ab4389f5616e6f7f21bfa4e113ac600e6ecab"
|
|
56
56
|
}
|
package/src/index.ts
CHANGED
|
@@ -22,14 +22,17 @@ export {getShaderModuleUniforms} from './lib/shader-module/shader-module';
|
|
|
22
22
|
export {getShaderModuleDependencies} from './lib/shader-module/shader-module-dependencies';
|
|
23
23
|
export {checkShaderModuleDeprecations} from './lib/shader-module/shader-module';
|
|
24
24
|
export type {
|
|
25
|
+
GLSLUniformBlockInfo,
|
|
25
26
|
ShaderModuleUniformLayoutStage,
|
|
26
27
|
ShaderModuleUniformLayoutValidationResult
|
|
27
28
|
} from './lib/shader-module/shader-module-uniform-layout';
|
|
28
29
|
export {
|
|
30
|
+
getGLSLUniformBlocks,
|
|
29
31
|
getShaderModuleUniformBlockFields,
|
|
30
32
|
getShaderModuleUniformBlockName,
|
|
31
33
|
getShaderModuleUniformLayoutValidationResult,
|
|
32
|
-
validateShaderModuleUniformLayout
|
|
34
|
+
validateShaderModuleUniformLayout,
|
|
35
|
+
warnIfGLSLUniformBlocksAreNotStd140
|
|
33
36
|
} from './lib/shader-module/shader-module-uniform-layout';
|
|
34
37
|
|
|
35
38
|
export {getShaderModuleSource} from './lib/shader-assembly/assemble-shaders';
|
|
@@ -67,12 +70,19 @@ export {combineInjects} from './lib/shader-assembly/shader-injections';
|
|
|
67
70
|
// data utils
|
|
68
71
|
export {toHalfFloat, fromHalfFloat} from './modules/math/fp16/fp16-utils';
|
|
69
72
|
export {fp64ify, fp64LowPart, fp64ifyMatrix4} from './modules/math/fp64/fp64-utils';
|
|
73
|
+
export {
|
|
74
|
+
normalizeByteColor3,
|
|
75
|
+
normalizeByteColor4,
|
|
76
|
+
resolveUseByteColors
|
|
77
|
+
} from './lib/color/normalize-byte-colors';
|
|
70
78
|
|
|
71
79
|
// math libraries
|
|
72
80
|
export {random} from './modules/math/random/random';
|
|
73
81
|
|
|
74
82
|
export {fp32} from './modules/math/fp32/fp32';
|
|
75
83
|
export {fp64, fp64arithmetic} from './modules/math/fp64/fp64';
|
|
84
|
+
export type {FloatColorsProps, FloatColorsUniforms} from './modules/color/float-colors';
|
|
85
|
+
export {floatColors} from './modules/color/float-colors';
|
|
76
86
|
|
|
77
87
|
// engine shader modules
|
|
78
88
|
|
|
@@ -109,6 +119,12 @@ export type {
|
|
|
109
119
|
PBRMaterialProps,
|
|
110
120
|
PBRMaterialUniforms
|
|
111
121
|
} from './modules/lighting/pbr-material/pbr-material';
|
|
122
|
+
export type {
|
|
123
|
+
PBRSceneBindings,
|
|
124
|
+
PBRSceneProps,
|
|
125
|
+
PBRSceneUniforms
|
|
126
|
+
} from './modules/lighting/pbr-material/pbr-scene';
|
|
112
127
|
export type {PBRProjectionProps} from './modules/lighting/pbr-material/pbr-projection';
|
|
113
128
|
|
|
114
129
|
export {pbrMaterial} from './modules/lighting/pbr-material/pbr-material';
|
|
130
|
+
export {pbrScene} from './modules/lighting/pbr-material/pbr-scene';
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
// luma.gl
|
|
2
|
+
// SPDX-License-Identifier: MIT
|
|
3
|
+
// Copyright (c) vis.gl contributors
|
|
4
|
+
|
|
5
|
+
import type {NumberArray3, NumberArray4} from '@math.gl/types';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Resolves whether semantic colors should be interpreted as byte-style `0..255` values.
|
|
9
|
+
* @param useByteColors - Explicit color interpretation flag.
|
|
10
|
+
* @param defaultUseByteColors - Fallback value when `useByteColors` is omitted.
|
|
11
|
+
* @returns `true` when semantic colors should be normalized from bytes, otherwise `false`.
|
|
12
|
+
*/
|
|
13
|
+
export function resolveUseByteColors(
|
|
14
|
+
useByteColors?: boolean,
|
|
15
|
+
defaultUseByteColors: boolean = true
|
|
16
|
+
): boolean {
|
|
17
|
+
return useByteColors ?? defaultUseByteColors;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Normalizes an RGB semantic color to float space when byte-style colors are enabled.
|
|
22
|
+
* @param color - Input RGB semantic color.
|
|
23
|
+
* @param useByteColors - When `true`, divide components by `255`.
|
|
24
|
+
* @returns The normalized RGB color.
|
|
25
|
+
*/
|
|
26
|
+
export function normalizeByteColor3(
|
|
27
|
+
color: Readonly<NumberArray3> = [0, 0, 0],
|
|
28
|
+
useByteColors: boolean = true
|
|
29
|
+
): NumberArray3 {
|
|
30
|
+
if (!useByteColors) {
|
|
31
|
+
return [...color] as NumberArray3;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
return color.map(component => component / 255) as NumberArray3;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Normalizes an RGBA semantic color to float space when byte-style colors are enabled.
|
|
39
|
+
* @param color - Input RGB or RGBA semantic color.
|
|
40
|
+
* @param useByteColors - When `true`, divide components by `255`.
|
|
41
|
+
* @returns The normalized RGBA color, adding an opaque alpha channel when needed.
|
|
42
|
+
*/
|
|
43
|
+
export function normalizeByteColor4(
|
|
44
|
+
color: Readonly<NumberArray4> | Readonly<NumberArray3>,
|
|
45
|
+
useByteColors: boolean = true
|
|
46
|
+
): NumberArray4 {
|
|
47
|
+
const normalizedColor = normalizeByteColor3(color.slice(0, 3) as NumberArray3, useByteColors);
|
|
48
|
+
const hasAlpha = Number.isFinite(color[3]);
|
|
49
|
+
const alpha = hasAlpha ? (color[3] as number) : 1;
|
|
50
|
+
|
|
51
|
+
return [
|
|
52
|
+
normalizedColor[0],
|
|
53
|
+
normalizedColor[1],
|
|
54
|
+
normalizedColor[2],
|
|
55
|
+
useByteColors && hasAlpha ? alpha / 255 : alpha
|
|
56
|
+
] as NumberArray4;
|
|
57
|
+
}
|
|
@@ -61,7 +61,7 @@ void main() {
|
|
|
61
61
|
|
|
62
62
|
/** convert glsl type to suffix */
|
|
63
63
|
export function typeToChannelSuffix(type: string): 'x' | 'xy' | 'xyz' | 'xyzw' {
|
|
64
|
-
//
|
|
64
|
+
// biome-ignore format: preserve layout
|
|
65
65
|
switch (type) {
|
|
66
66
|
case 'float': return 'x';
|
|
67
67
|
case 'vec2': return 'xy';
|
|
@@ -74,7 +74,7 @@ export function typeToChannelSuffix(type: string): 'x' | 'xy' | 'xyz' | 'xyzw' {
|
|
|
74
74
|
|
|
75
75
|
/** convert glsl type to channel count */
|
|
76
76
|
export function typeToChannelCount(type: string): 1 | 2 | 3 | 4 {
|
|
77
|
-
//
|
|
77
|
+
// biome-ignore format: preserve layout
|
|
78
78
|
switch (type) {
|
|
79
79
|
case 'float': return 1;
|
|
80
80
|
case 'vec2': return 2;
|
|
@@ -85,7 +85,7 @@ export function typeToChannelCount(type: string): 1 | 2 | 3 | 4 {
|
|
|
85
85
|
}
|
|
86
86
|
}
|
|
87
87
|
function channelCountToType(channels: 1 | 2 | 3 | 4): 'float' | 'vec2' | 'vec3' | 'vec4' {
|
|
88
|
-
//
|
|
88
|
+
// biome-ignore format: preserve layout
|
|
89
89
|
switch (channels) {
|
|
90
90
|
case 1: return 'float';
|
|
91
91
|
case 2: return 'vec2';
|
|
@@ -98,7 +98,7 @@ function channelCountToType(channels: 1 | 2 | 3 | 4): 'float' | 'vec2' | 'vec3'
|
|
|
98
98
|
|
|
99
99
|
/** Returns glsl instruction for converting to vec4 */
|
|
100
100
|
export function convertToVec4(variable: string, channels: 1 | 2 | 3 | 4): string {
|
|
101
|
-
//
|
|
101
|
+
// biome-ignore format: preserve layout
|
|
102
102
|
switch (channels) {
|
|
103
103
|
case 1: return `vec4(${variable}, 0.0, 0.0, 1.0)`;
|
|
104
104
|
case 2: return `vec4(${variable}, 0.0, 1.0)`;
|