@thi.ng/shader-ast-stdlib 0.17.0 → 0.18.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/CHANGELOG.md +9 -1
- package/README.md +4 -2
- package/color/porter-duff.d.ts +23 -0
- package/controlflow/branches.d.ts +53 -0
- package/controlflow/branches.js +16 -0
- package/index.d.ts +2 -0
- package/index.js +2 -0
- package/math/pack-float.d.ts +20 -0
- package/math/pack-float.js +21 -0
- package/package.json +13 -5
- package/tex/normal.d.ts +13 -0
- package/tex/normal.js +24 -22
package/CHANGELOG.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Change Log
|
|
2
2
|
|
|
3
|
-
- **Last updated**: 2024-03-
|
|
3
|
+
- **Last updated**: 2024-03-09T09:18:17Z
|
|
4
4
|
- **Generator**: [thi.ng/monopub](https://thi.ng/monopub)
|
|
5
5
|
|
|
6
6
|
All notable changes to this project will be documented in this file.
|
|
@@ -9,6 +9,14 @@ See [Conventional Commits](https://conventionalcommits.org/) for commit guidelin
|
|
|
9
9
|
**Note:** Unlisted _patch_ versions only involve non-code or otherwise excluded changes
|
|
10
10
|
and/or version bumps of transitive dependencies.
|
|
11
11
|
|
|
12
|
+
## [0.18.0](https://github.com/thi-ng/umbrella/tree/@thi.ng/shader-ast-stdlib@0.18.0) (2024-03-07)
|
|
13
|
+
|
|
14
|
+
#### 🚀 Features
|
|
15
|
+
|
|
16
|
+
- add packFloat()/unpackFloat() ([23a6d7f](https://github.com/thi-ng/umbrella/commit/23a6d7f))
|
|
17
|
+
- add packedNormal2(), refactor normal2() ([6f6dc1d](https://github.com/thi-ng/umbrella/commit/6f6dc1d))
|
|
18
|
+
- add branches() n-ary helper fn & docs ([74f32ba](https://github.com/thi-ng/umbrella/commit/74f32ba))
|
|
19
|
+
|
|
12
20
|
## [0.17.0](https://github.com/thi-ng/umbrella/tree/@thi.ng/shader-ast-stdlib@0.17.0) (2024-03-06)
|
|
13
21
|
|
|
14
22
|
#### 🚀 Features
|
package/README.md
CHANGED
|
@@ -109,7 +109,7 @@ For Node.js REPL:
|
|
|
109
109
|
const shaderAstStdlib = await import("@thi.ng/shader-ast-stdlib");
|
|
110
110
|
```
|
|
111
111
|
|
|
112
|
-
Package sizes (brotli'd, pre-treeshake): ESM: 13.
|
|
112
|
+
Package sizes (brotli'd, pre-treeshake): ESM: 13.93 KB
|
|
113
113
|
|
|
114
114
|
## Dependencies
|
|
115
115
|
|
|
@@ -136,6 +136,7 @@ directory are using this package:
|
|
|
136
136
|
| | Minimal multi-pass / GPGPU example | [Demo](https://demo.thi.ng/umbrella/webgl-multipass/) | [Source](https://github.com/thi-ng/umbrella/tree/develop/examples/webgl-multipass) |
|
|
137
137
|
| <img src="https://raw.githubusercontent.com/thi-ng/umbrella/develop/assets/examples/webgl-shadertoy.jpg" width="240"/> | Shadertoy-like WebGL setup | [Demo](https://demo.thi.ng/umbrella/webgl-shadertoy/) | [Source](https://github.com/thi-ng/umbrella/tree/develop/examples/webgl-shadertoy) |
|
|
138
138
|
| <img src="https://raw.githubusercontent.com/thi-ng/umbrella/develop/assets/examples/webgl-ssao.jpg" width="240"/> | WebGL screenspace ambient occlusion | [Demo](https://demo.thi.ng/umbrella/webgl-ssao/) | [Source](https://github.com/thi-ng/umbrella/tree/develop/examples/webgl-ssao) |
|
|
139
|
+
| <img src="https://raw.githubusercontent.com/thi-ng/umbrella/develop/assets/examples/webgl-texture-paint.jpg" width="240"/> | TODO | [Demo](https://demo.thi.ng/umbrella/webgl-texture-paint/) | [Source](https://github.com/thi-ng/umbrella/tree/develop/examples/webgl-texture-paint) |
|
|
139
140
|
|
|
140
141
|
## API
|
|
141
142
|
|
|
@@ -408,6 +409,7 @@ Related:
|
|
|
408
409
|
- `minComp2` / `minComp3` / `minComp4`
|
|
409
410
|
- `perpendicularCCW` / `perpendicularCW`
|
|
410
411
|
- `orthogonal3`
|
|
412
|
+
- `packFloat` / `unpackFloat`
|
|
411
413
|
- `polar2` / `polar3`
|
|
412
414
|
- `sincos` / `cossin`
|
|
413
415
|
- `smootherStep` / `smootherStep2` / `smootherStep3` / `smootherStep4`
|
|
@@ -528,7 +530,7 @@ Related:
|
|
|
528
530
|
|
|
529
531
|
- `indexToCoord` / `coordToIndex`
|
|
530
532
|
- `indexToUV` / `uvToIndex`
|
|
531
|
-
- `normal2`
|
|
533
|
+
- `normal2` / `packedNormal2`
|
|
532
534
|
- `readIndex1` / `readIndex2` / `readIndex3` / `readIndex4`
|
|
533
535
|
|
|
534
536
|
### Visualization
|
package/color/porter-duff.d.ts
CHANGED
|
@@ -11,6 +11,17 @@ import type { FloatTerm, Vec4Sym } from "@thi.ng/shader-ast";
|
|
|
11
11
|
* functions are used to extract blending coefficients for src/dest colors and
|
|
12
12
|
* are called with the alpha components of both colors.
|
|
13
13
|
*
|
|
14
|
+
* - `blendSrcOver(src, dest)`
|
|
15
|
+
* - `blendDestOver(src, dest)`
|
|
16
|
+
* - `blendSrcIn(src, dest)`
|
|
17
|
+
* - `blendDestIn(src, dest)`
|
|
18
|
+
* - `blendSrcOut(src, dest)`
|
|
19
|
+
* - `blendDestOut(src, dest)`
|
|
20
|
+
* - `blendSrcAtop(src, dest)`
|
|
21
|
+
* - `blendDestAtop(src, dest)`
|
|
22
|
+
* - `blendXor(src, dest)`
|
|
23
|
+
* - `blendPlus(src, dest)`
|
|
24
|
+
*
|
|
14
25
|
* Optimization only happens for cases where either `fa` and/or `fb` are
|
|
15
26
|
* {@link ZERO} or {@link ONE}.
|
|
16
27
|
*
|
|
@@ -23,7 +34,19 @@ import type { FloatTerm, Vec4Sym } from "@thi.ng/shader-ast";
|
|
|
23
34
|
* @param fb - dest coeff fn
|
|
24
35
|
*/
|
|
25
36
|
export declare const porterDuff: (name: string, fa: Fn2<FloatTerm, FloatTerm, FloatTerm>, fb: Fn2<FloatTerm, FloatTerm, FloatTerm>) => import("@thi.ng/shader-ast").TaggedFn2<"vec4", "vec4", "vec4">;
|
|
37
|
+
/**
|
|
38
|
+
* Multiplies RGB channels by alpha. Returns `vec4(col.r*col.a, col.g*col.a,
|
|
39
|
+
* col.b*col.a, col.a)`. See {@link postmultiplyAlpha} for reverse op.
|
|
40
|
+
*
|
|
41
|
+
* @param col
|
|
42
|
+
*/
|
|
26
43
|
export declare const premultiplyAlpha: (col: Vec4Sym) => import("@thi.ng/shader-ast").Lit<"vec4">;
|
|
44
|
+
/**
|
|
45
|
+
* Divides RGB channels by alpha. Returns `vec4(col.r/col.a, col.g/col.a,
|
|
46
|
+
* col.b/col.a, col.a)`. See {@link premultiplyAlpha} for reverse op.
|
|
47
|
+
*
|
|
48
|
+
* @param col
|
|
49
|
+
*/
|
|
27
50
|
export declare const postmultiplyAlpha: (col: Vec4Sym) => import("@thi.ng/shader-ast").Lit<"vec4">;
|
|
28
51
|
export declare const ZERO: () => import("@thi.ng/shader-ast").Lit<"float">;
|
|
29
52
|
export declare const ONE: () => import("@thi.ng/shader-ast").Lit<"float">;
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import type { FloatTerm, Term, Type } from "@thi.ng/shader-ast";
|
|
2
|
+
/**
|
|
3
|
+
* Utility function to create an n-ary conditional based on given float value
|
|
4
|
+
* `x` in [0,1] range and any number of branch terms (at least 1). Returns a
|
|
5
|
+
* nested ternary expression.
|
|
6
|
+
*
|
|
7
|
+
* @remarks
|
|
8
|
+
* This function is useful for A/B testing of multiple versions of a shader,
|
|
9
|
+
* e.g. the popular technique of using columns based on the `gl_FragCoord.x` and
|
|
10
|
+
* dynamically computed column thresholds (defined by the number of given branch
|
|
11
|
+
* terms).
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* ```ts tangle:../../export/branches.ts
|
|
15
|
+
* import { float, sym, vec3 } from "@thi.ng/shader-ast";
|
|
16
|
+
* import { branches } from "@thi.ng/shader-ast-stdlib";
|
|
17
|
+
* import { targetGLSL } from "@thi.ng/shader-ast-glsl";
|
|
18
|
+
*
|
|
19
|
+
* // dummy "position" symbol (would be gl_FragCoord.x or similar)
|
|
20
|
+
* const pos = sym(float(0.11));
|
|
21
|
+
*
|
|
22
|
+
* // serialize expression to GLSL for better legibility
|
|
23
|
+
* console.log(
|
|
24
|
+
* targetGLSL()(
|
|
25
|
+
* branches(
|
|
26
|
+
* pos,
|
|
27
|
+
* // branch terms/options...
|
|
28
|
+
* // branch thresholds are automatically computed
|
|
29
|
+
* // making it trivial to add/remove terms
|
|
30
|
+
* vec3(1,0,0),
|
|
31
|
+
* vec3(1,1,0),
|
|
32
|
+
* vec3(0,1,0),
|
|
33
|
+
* vec3(0,0,1),
|
|
34
|
+
* )
|
|
35
|
+
* )
|
|
36
|
+
* );
|
|
37
|
+
*
|
|
38
|
+
* // re-formatted result:
|
|
39
|
+
* // ((_sf5 < 0.25)
|
|
40
|
+
* // ? vec3(1.0, 0.0, 0.0)
|
|
41
|
+
* // : ((_sf5 < 0.5)
|
|
42
|
+
* // ? vec3(1.0, 1.0, 0.0)
|
|
43
|
+
* // : ((_sf5 < 0.75)
|
|
44
|
+
* // ? vec3(0.0, 1.0, 0.0)
|
|
45
|
+
* // : vec3(0.0, 0.0, 1.0))))
|
|
46
|
+
* ```
|
|
47
|
+
*
|
|
48
|
+
* @param x
|
|
49
|
+
* @param a
|
|
50
|
+
* @param terms
|
|
51
|
+
*/
|
|
52
|
+
export declare const branches: <T extends Type>(x: FloatTerm, a: Term<T>, ...terms: Term<T>[]) => Term<T>;
|
|
53
|
+
//# sourceMappingURL=branches.d.ts.map
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { ternary } from "@thi.ng/shader-ast/ast/controlflow";
|
|
2
|
+
import { float } from "@thi.ng/shader-ast/ast/lit";
|
|
3
|
+
import { lt } from "@thi.ng/shader-ast/ast/ops";
|
|
4
|
+
const branches = (x, a, ...terms) => {
|
|
5
|
+
const n = terms.length + 1;
|
|
6
|
+
if (n < 2)
|
|
7
|
+
return a;
|
|
8
|
+
const delta = 1 / n;
|
|
9
|
+
terms = [a, ...terms];
|
|
10
|
+
return terms.reduceRight(
|
|
11
|
+
(acc, t, i) => ternary(lt(x, float((i + 1) * delta)), t, acc)
|
|
12
|
+
);
|
|
13
|
+
};
|
|
14
|
+
export {
|
|
15
|
+
branches
|
|
16
|
+
};
|
package/index.d.ts
CHANGED
|
@@ -6,6 +6,7 @@ export * from "./color/linear-srgb.js";
|
|
|
6
6
|
export * from "./color/luminance.js";
|
|
7
7
|
export * from "./color/porter-duff.js";
|
|
8
8
|
export * from "./color/rgbe.js";
|
|
9
|
+
export * from "./controlflow/branches.js";
|
|
9
10
|
export * from "./fog/exp.js";
|
|
10
11
|
export * from "./fog/exp2.js";
|
|
11
12
|
export * from "./fog/linear.js";
|
|
@@ -27,6 +28,7 @@ export * from "./math/mix-cubic.js";
|
|
|
27
28
|
export * from "./math/mix-quadratic.js";
|
|
28
29
|
export * from "./math/orthogonal.js";
|
|
29
30
|
export * from "./math/osc.js";
|
|
31
|
+
export * from "./math/pack-float.js";
|
|
30
32
|
export * from "./math/polar.js";
|
|
31
33
|
export * from "./math/sincos.js";
|
|
32
34
|
export * from "./math/smoother-step.js";
|
package/index.js
CHANGED
|
@@ -6,6 +6,7 @@ export * from "./color/linear-srgb.js";
|
|
|
6
6
|
export * from "./color/luminance.js";
|
|
7
7
|
export * from "./color/porter-duff.js";
|
|
8
8
|
export * from "./color/rgbe.js";
|
|
9
|
+
export * from "./controlflow/branches.js";
|
|
9
10
|
export * from "./fog/exp.js";
|
|
10
11
|
export * from "./fog/exp2.js";
|
|
11
12
|
export * from "./fog/linear.js";
|
|
@@ -27,6 +28,7 @@ export * from "./math/mix-cubic.js";
|
|
|
27
28
|
export * from "./math/mix-quadratic.js";
|
|
28
29
|
export * from "./math/orthogonal.js";
|
|
29
30
|
export * from "./math/osc.js";
|
|
31
|
+
export * from "./math/pack-float.js";
|
|
30
32
|
export * from "./math/polar.js";
|
|
31
33
|
export * from "./math/sincos.js";
|
|
32
34
|
export * from "./math/smoother-step.js";
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Encodes a float value in [0,1) interval to a vec4 suitable for a 8bit/channel
|
|
3
|
+
* render texture. Use {@link unpackFloat} for reverse op.
|
|
4
|
+
*
|
|
5
|
+
* @remarks
|
|
6
|
+
* Reference:
|
|
7
|
+
* https://aras-p.info/blog/2009/07/30/encoding-floats-to-rgba-the-final/
|
|
8
|
+
*/
|
|
9
|
+
export declare const packFloat: import("@thi.ng/shader-ast").TaggedFn1<"float", "vec4">;
|
|
10
|
+
/**
|
|
11
|
+
* Reverse op of {@link packFloat}.
|
|
12
|
+
*
|
|
13
|
+
* @remarks
|
|
14
|
+
* Also see {@link packedNormal2} for related functionality.
|
|
15
|
+
*
|
|
16
|
+
* Reference:
|
|
17
|
+
* https://aras-p.info/blog/2009/07/30/encoding-floats-to-rgba-the-final/
|
|
18
|
+
*/
|
|
19
|
+
export declare const unpackFloat: import("@thi.ng/shader-ast").TaggedFn1<"vec4", "float">;
|
|
20
|
+
//# sourceMappingURL=pack-float.d.ts.map
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { F, V4 } from "@thi.ng/shader-ast/api/types";
|
|
2
|
+
import { defn, ret } from "@thi.ng/shader-ast/ast/function";
|
|
3
|
+
import { vec4 } from "@thi.ng/shader-ast/ast/lit";
|
|
4
|
+
import { mul, sub } from "@thi.ng/shader-ast/ast/ops";
|
|
5
|
+
import { $ } from "@thi.ng/shader-ast/ast/swizzle";
|
|
6
|
+
import { sym } from "@thi.ng/shader-ast/ast/sym";
|
|
7
|
+
import { dot, fract } from "@thi.ng/shader-ast/builtin/math";
|
|
8
|
+
const packFloat = defn(V4, null, [F], (x) => {
|
|
9
|
+
let res;
|
|
10
|
+
return [
|
|
11
|
+
res = sym(fract(mul(vec4(1, 255, 65025, 16581375), x))),
|
|
12
|
+
ret(sub(res, mul($(res, "yzww"), vec4(1 / 255, 1 / 255, 1 / 255, 0))))
|
|
13
|
+
];
|
|
14
|
+
});
|
|
15
|
+
const unpackFloat = defn(F, null, [V4], (v) => [
|
|
16
|
+
ret(dot(v, vec4(1, 1 / 255, 1 / 65025, 1 / 16581375)))
|
|
17
|
+
]);
|
|
18
|
+
export {
|
|
19
|
+
packFloat,
|
|
20
|
+
unpackFloat
|
|
21
|
+
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@thi.ng/shader-ast-stdlib",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.18.1",
|
|
4
4
|
"description": "Function collection for modular GPGPU / shader programming with @thi.ng/shader-ast",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"module": "./index.js",
|
|
@@ -35,11 +35,12 @@
|
|
|
35
35
|
"doc:ae": "mkdir -p .ae/doc .ae/temp && api-extractor run --local --verbose",
|
|
36
36
|
"doc:readme": "bun ../../tools/src/module-stats.ts && bun ../../tools/src/readme.ts",
|
|
37
37
|
"pub": "yarn npm publish --access public",
|
|
38
|
-
"test": "bun test"
|
|
38
|
+
"test": "bun test",
|
|
39
|
+
"tool:tangle": "../../node_modules/.bin/tangle src/**/*.ts"
|
|
39
40
|
},
|
|
40
41
|
"dependencies": {
|
|
41
|
-
"@thi.ng/api": "^8.9.
|
|
42
|
-
"@thi.ng/shader-ast": "^0.
|
|
42
|
+
"@thi.ng/api": "^8.9.29",
|
|
43
|
+
"@thi.ng/shader-ast": "^0.15.1"
|
|
43
44
|
},
|
|
44
45
|
"devDependencies": {
|
|
45
46
|
"@microsoft/api-extractor": "^7.40.1",
|
|
@@ -85,6 +86,7 @@
|
|
|
85
86
|
"./*.js",
|
|
86
87
|
"./*.d.ts",
|
|
87
88
|
"color",
|
|
89
|
+
"controlflow",
|
|
88
90
|
"fog",
|
|
89
91
|
"isec",
|
|
90
92
|
"light",
|
|
@@ -125,6 +127,9 @@
|
|
|
125
127
|
"./color/rgbe": {
|
|
126
128
|
"default": "./color/rgbe.js"
|
|
127
129
|
},
|
|
130
|
+
"./controlflow/branches": {
|
|
131
|
+
"default": "./controlflow/branches.js"
|
|
132
|
+
},
|
|
128
133
|
"./fog/exp": {
|
|
129
134
|
"default": "./fog/exp.js"
|
|
130
135
|
},
|
|
@@ -191,6 +196,9 @@
|
|
|
191
196
|
"./math/osc": {
|
|
192
197
|
"default": "./math/osc.js"
|
|
193
198
|
},
|
|
199
|
+
"./math/pack-float": {
|
|
200
|
+
"default": "./math/pack-float.js"
|
|
201
|
+
},
|
|
194
202
|
"./math/polar": {
|
|
195
203
|
"default": "./math/polar.js"
|
|
196
204
|
},
|
|
@@ -363,5 +371,5 @@
|
|
|
363
371
|
],
|
|
364
372
|
"year": 2019
|
|
365
373
|
},
|
|
366
|
-
"gitHead": "
|
|
374
|
+
"gitHead": "69100942474942f7446ac645d59d91e7dfc352f9\n"
|
|
367
375
|
}
|
package/tex/normal.d.ts
CHANGED
|
@@ -15,4 +15,17 @@
|
|
|
15
15
|
* @param eps
|
|
16
16
|
*/
|
|
17
17
|
export declare const normal2: import("@thi.ng/shader-ast").TaggedFn5<"sampler2D", "vec2", "vec2", "float", "float", "vec3">;
|
|
18
|
+
/**
|
|
19
|
+
* Principally the same as {@link normal2}, but using a RGBA 8bit/channel
|
|
20
|
+
* texture storing float values encoded using {@link packFloat}. WHen
|
|
21
|
+
* `packedNormal2()` then samples this textures, each value will be
|
|
22
|
+
* automatically decoded using {@link unpackFloat}.
|
|
23
|
+
*
|
|
24
|
+
* @param tex
|
|
25
|
+
* @param uv
|
|
26
|
+
* @param step
|
|
27
|
+
* @param z
|
|
28
|
+
* @param eps
|
|
29
|
+
*/
|
|
30
|
+
export declare const packedNormal2: import("@thi.ng/shader-ast").TaggedFn5<"sampler2D", "vec2", "vec2", "float", "float", "vec3">;
|
|
18
31
|
//# sourceMappingURL=normal.d.ts.map
|
package/tex/normal.js
CHANGED
|
@@ -2,32 +2,34 @@ import { F, S2D, V2, V3 } from "@thi.ng/shader-ast/api/types";
|
|
|
2
2
|
import { defn, ret } from "@thi.ng/shader-ast/ast/function";
|
|
3
3
|
import { vec2, vec3 } from "@thi.ng/shader-ast/ast/lit";
|
|
4
4
|
import { add, sub } from "@thi.ng/shader-ast/ast/ops";
|
|
5
|
-
import { sym } from "@thi.ng/shader-ast/ast/sym";
|
|
6
5
|
import { $x, $y } from "@thi.ng/shader-ast/ast/swizzle";
|
|
6
|
+
import { sym } from "@thi.ng/shader-ast/ast/sym";
|
|
7
7
|
import { normalize } from "@thi.ng/shader-ast/builtin/math";
|
|
8
8
|
import { texture } from "@thi.ng/shader-ast/builtin/texture";
|
|
9
|
-
|
|
10
|
-
const
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
)
|
|
9
|
+
import { unpackFloat } from "../math/pack-float.js";
|
|
10
|
+
const __defNormal2 = (decode) => defn(V3, null, [S2D, V2, V2, F, F], (tex, uv, step, z, eps) => {
|
|
11
|
+
let sx;
|
|
12
|
+
let sy;
|
|
13
|
+
const sample1 = (tex2, uv2, unit) => sub(
|
|
14
|
+
decode(texture(tex2, sub(uv2, unit))),
|
|
15
|
+
decode(texture(tex2, add(uv2, unit)))
|
|
16
|
+
);
|
|
17
|
+
return [
|
|
18
|
+
sx = sym(vec2($x(step), 0)),
|
|
19
|
+
sy = sym(vec2(0, $y(step))),
|
|
20
|
+
ret(
|
|
21
|
+
normalize(
|
|
22
|
+
add(
|
|
23
|
+
vec3(sample1(tex, uv, sx), sample1(tex, uv, sy), z),
|
|
24
|
+
eps
|
|
26
25
|
)
|
|
27
26
|
)
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
);
|
|
27
|
+
)
|
|
28
|
+
];
|
|
29
|
+
});
|
|
30
|
+
const normal2 = __defNormal2($x);
|
|
31
|
+
const packedNormal2 = __defNormal2(unpackFloat);
|
|
31
32
|
export {
|
|
32
|
-
normal2
|
|
33
|
+
normal2,
|
|
34
|
+
packedNormal2
|
|
33
35
|
};
|