├── .editorconfig
├── .gitignore
├── .npmignore
├── CHANGELOG.md
├── LICENSE.MD
├── README.md
├── index.html
├── index.js
├── package-lock.json
├── package.json
├── test
└── index.glsl
├── when_and.glsl
├── when_and.glsl.js
├── when_eq.glsl
├── when_eq.glsl.js
├── when_ge.glsl
├── when_ge.glsl.js
├── when_gt.glsl
├── when_gt.glsl.js
├── when_le.glsl
├── when_le.glsl.js
├── when_lt.glsl
├── when_lt.glsl.js
├── when_neq.glsl
├── when_neq.glsl.js
├── when_not.glsl
├── when_not.glsl.js
├── when_or.glsl
├── when_or.glsl.js
├── when_xor.glsl
└── when_xor.glsl.js
/.editorconfig:
--------------------------------------------------------------------------------
1 | root = true
2 |
3 | [*]
4 | end_of_line = lf
5 | charset = utf-8
6 | indent_style = space
7 | indent_size = 2
8 | trim_trailing_whitespace = true
9 | insert_final_newline = true
10 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules
2 | .DS_Store
3 | /types
4 | /lib
5 |
--------------------------------------------------------------------------------
/.npmignore:
--------------------------------------------------------------------------------
1 | /web_modules
2 | /examples
3 | /docs
4 | /coverage
5 | /test
6 | /.github
7 | screenshot.*
8 | index.html
9 | tsconfig.json
10 | .editorconfig
11 | .nojekyll
12 |
--------------------------------------------------------------------------------
/CHANGELOG.md:
--------------------------------------------------------------------------------
1 | # Changelog
2 |
3 | All notable changes to this project will be documented in this file. See [commit-and-tag-version](https://github.com/absolute-version/commit-and-tag-version) for commit guidelines.
4 |
5 | ## [2.0.2](https://github.com/dmnsgn/glsl-conditionals/compare/v2.0.1...v2.0.2) (2024-07-06)
6 |
7 |
8 |
9 | ## [2.0.1](https://github.com/dmnsgn/glsl-conditionals/compare/v2.0.0...v2.0.1) (2022-06-14)
10 |
11 |
12 |
13 | # 2.0.0 (2022-06-13)
14 |
15 |
16 | ### Code Refactoring
17 |
18 | * use ES modules ([869a196](https://github.com/dmnsgn/glsl-conditionals/commit/869a1967ef9f42e4ef1e87fe99117173193c7fa6))
19 |
20 |
21 | ### BREAKING CHANGES
22 |
23 | * switch to type module
24 |
--------------------------------------------------------------------------------
/LICENSE.MD:
--------------------------------------------------------------------------------
1 | Copyright (C) 2013 by Damien Holden
2 | Copyright (C) 2016 Damien Seguin
3 |
4 | Permission is hereby granted, free of charge, to any person obtaining a copy
5 | of this software and associated documentation files (the "Software"), to deal
6 | in the Software without restriction, including without limitation the rights
7 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8 | copies of the Software, and to permit persons to whom the Software is
9 | furnished to do so, subject to the following conditions:
10 |
11 | The above copyright notice and this permission notice shall be included in
12 | all copies or substantial portions of the Software.
13 |
14 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
20 | THE SOFTWARE.
21 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # glsl-conditionals
2 |
3 | [](https://www.npmjs.com/package/glsl-conditionals)
4 | [](https://www.npmjs.com/package/glsl-conditionals)
5 | [](https://bundlephobia.com/package/glsl-conditionals)
6 | [](https://github.com/dmnsgn/glsl-conditionals/blob/main/package.json)
7 | [](https://github.com/microsoft/TypeScript)
8 | [](https://conventionalcommits.org)
9 | [](https://github.com/prettier/prettier)
10 | [](https://github.com/eslint/eslint)
11 | [](https://github.com/dmnsgn/glsl-conditionals/blob/main/LICENSE.md)
12 |
13 | [Daniel Holden's functions designed to avoid conditionals](https://theorangeduck.com/page/avoiding-shader-conditionals) in GLSL, available both as ES modules strings and as GLSL files for use with glslify.
14 |
15 | Disclaimer: you might not need this as it is highly hardware dependant and [branching might not equate more operations in modern GPUs](https://iquilezles.org/articles/gpuconditionals/). Also it can make your shader harder to visually parse.
16 |
17 | [](https://paypal.me/dmnsgn)
18 | [](https://commerce.coinbase.com/checkout/56cbdf28-e323-48d8-9c98-7019e72c97f3)
19 | [](https://twitter.com/dmnsgn)
20 |
21 | ## Installation
22 |
23 | ```bash
24 | npm install glsl-conditionals
25 | ```
26 |
27 | ## Usage
28 |
29 | ### ESM
30 |
31 | ```js
32 | import * as glslConditionals from "glsl-conditionals";
33 |
34 | const shader = /* glsl */ `
35 | // Comparisons
36 | ${glslConditionals.WHEN_EQ}
37 | ${glslConditionals.WHEN_NEQ}
38 |
39 | ${glslConditionals.WHEN_GT}
40 | ${glslConditionals.WHEN_LT}
41 |
42 | ${glslConditionals.WHEN_GE}
43 | ${glslConditionals.WHEN_LE}
44 |
45 | // Logical operators
46 | ${glslConditionals.WHEN_AND}
47 | ${glslConditionals.WHEN_OR}
48 | ${glslConditionals.WHEN_XOR}
49 | ${glslConditionals.WHEN_NOT}
50 |
51 | void main() {
52 | float x = 10.0;
53 | float y = 0.0;
54 |
55 | y += 5.0 * when_eq(x, 0.0);
56 | y += 5.0 * when_eq(x, 0.0);
57 | y += 5.0 * when_neq(x, 0.0);
58 | y += 5.0 * when_gt(x, 0.0);
59 | y += 5.0 * when_lt(x, 0.0);
60 | y += 5.0 * when_ge(x, 0.0);
61 | y += 5.0 * when_le(x, 0.0);
62 | y += 5.0 * when_and(x, 0.0);
63 | y += 5.0 * when_or(x, 0.0);
64 | y += 5.0 * when_xor(x, 0.0);
65 | y += 5.0 * when_not(x, 0.0);
66 |
67 | // ...
68 | }
69 | `;
70 | ```
71 |
72 | ### glslify
73 |
74 | ```glsl
75 | // Comparisons
76 | #pragma glslify: when_eq = require(glsl-conditionals/when_eq)
77 | #pragma glslify: when_neq = require(glsl-conditionals/when_neq)
78 |
79 | #pragma glslify: when_gt = require(glsl-conditionals/when_gt)
80 | #pragma glslify: when_lt = require(glsl-conditionals/when_lt)
81 |
82 | #pragma glslify: when_ge = require(glsl-conditionals/when_ge)
83 | #pragma glslify: when_le = require(glsl-conditionals/when_le)
84 |
85 | // Logical operators
86 | #pragma glslify: when_and = require(glsl-conditionals/when_and)
87 | #pragma glslify: when_or = require(glsl-conditionals/when_or)
88 | #pragma glslify: when_xor = require(glsl-conditionals/when_xor)
89 | #pragma glslify: when_not = require(glsl-conditionals/when_not)
90 |
91 | void main() {
92 | float x = 10.0;
93 | float y = 0.0;
94 |
95 | y += 5.0 * when_eq(x, 0.0);
96 | y += 5.0 * when_eq(x, 0.0);
97 | y += 5.0 * when_neq(x, 0.0);
98 | y += 5.0 * when_gt(x, 0.0);
99 | y += 5.0 * when_lt(x, 0.0);
100 | y += 5.0 * when_ge(x, 0.0);
101 | y += 5.0 * when_le(x, 0.0);
102 | y += 5.0 * when_and(x, 0.0);
103 | y += 5.0 * when_or(x, 0.0);
104 | y += 5.0 * when_xor(x, 0.0);
105 | y += 5.0 * when_not(x, 0.0);
106 |
107 | // ...
108 | }
109 | ```
110 |
111 | ## License
112 |
113 | MIT. See [license file](https://github.com/dmnsgn/glsl-conditionals/blob/main/LICENSE.md).
114 |
--------------------------------------------------------------------------------
/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 | glsl-conditionals by Damien Seguin (https://github.com/dmnsgn)
9 |
10 |
29 |
33 |
34 |
35 |
36 | glsl-conditionals
37 |
38 |
39 |
55 |
56 |
57 |
--------------------------------------------------------------------------------
/index.js:
--------------------------------------------------------------------------------
1 | export { default as WHEN_AND } from "./when_and.glsl.js";
2 |
3 | export { default as WHEN_EQ } from "./when_eq.glsl.js";
4 |
5 | export {
6 | default as WHEN_GE,
7 | dependencies as WHEN_GE_DEPENDENCIES,
8 | } from "./when_ge.glsl.js";
9 |
10 | export { default as WHEN_GT } from "./when_gt.glsl.js";
11 |
12 | export {
13 | default as WHEN_LE,
14 | dependencies as WHEN_LE_DEPENDENCIES,
15 | } from "./when_le.glsl.js";
16 |
17 | export { default as WHEN_LT } from "./when_lt.glsl.js";
18 |
19 | export { default as WHEN_NEQ } from "./when_neq.glsl.js";
20 |
21 | export { default as WHEN_NOT } from "./when_not.glsl.js";
22 |
23 | export { default as WHEN_OR } from "./when_or.glsl.js";
24 |
25 | export { default as WHEN_XOR } from "./when_xor.glsl.js";
26 |
--------------------------------------------------------------------------------
/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "glsl-conditionals",
3 | "version": "2.0.2",
4 | "lockfileVersion": 2,
5 | "requires": true,
6 | "packages": {
7 | "": {
8 | "name": "glsl-conditionals",
9 | "version": "2.0.2",
10 | "funding": [
11 | {
12 | "type": "individual",
13 | "url": "https://paypal.me/dmnsgn"
14 | },
15 | {
16 | "type": "individual",
17 | "url": "https://commerce.coinbase.com/checkout/56cbdf28-e323-48d8-9c98-7019e72c97f3"
18 | }
19 | ],
20 | "license": "MIT",
21 | "devDependencies": {
22 | "glslify": "^7.1.1"
23 | },
24 | "engines": {
25 | "node": ">=16.0.0",
26 | "npm": ">=7.0.0"
27 | }
28 | },
29 | "node_modules/@choojs/findup": {
30 | "version": "0.2.1",
31 | "resolved": "https://registry.npmjs.org/@choojs/findup/-/findup-0.2.1.tgz",
32 | "integrity": "sha512-YstAqNb0MCN8PjdLCDfRsBcGVRN41f3vgLvaI0IrIcBp4AqILRSS0DeWNGkicC+f/zRIPJLc+9RURVSepwvfBw==",
33 | "dev": true,
34 | "dependencies": {
35 | "commander": "^2.15.1"
36 | },
37 | "bin": {
38 | "findup": "bin/findup.js"
39 | }
40 | },
41 | "node_modules/acorn": {
42 | "version": "7.4.1",
43 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
44 | "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
45 | "dev": true,
46 | "bin": {
47 | "acorn": "bin/acorn"
48 | },
49 | "engines": {
50 | "node": ">=0.4.0"
51 | }
52 | },
53 | "node_modules/bl": {
54 | "version": "2.2.1",
55 | "resolved": "https://registry.npmjs.org/bl/-/bl-2.2.1.tgz",
56 | "integrity": "sha512-6Pesp1w0DEX1N550i/uGV/TqucVL4AM/pgThFSN/Qq9si1/DF9aIHs1BxD8V/QU0HoeHO6cQRTAuYnLPKq1e4g==",
57 | "dev": true,
58 | "dependencies": {
59 | "readable-stream": "^2.3.5",
60 | "safe-buffer": "^5.1.1"
61 | }
62 | },
63 | "node_modules/buffer-from": {
64 | "version": "1.1.2",
65 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
66 | "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
67 | "dev": true
68 | },
69 | "node_modules/commander": {
70 | "version": "2.20.3",
71 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
72 | "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
73 | "dev": true
74 | },
75 | "node_modules/concat-stream": {
76 | "version": "1.6.2",
77 | "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
78 | "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
79 | "dev": true,
80 | "engines": [
81 | "node >= 0.8"
82 | ],
83 | "dependencies": {
84 | "buffer-from": "^1.0.0",
85 | "inherits": "^2.0.3",
86 | "readable-stream": "^2.2.2",
87 | "typedarray": "^0.0.6"
88 | }
89 | },
90 | "node_modules/core-util-is": {
91 | "version": "1.0.3",
92 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
93 | "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==",
94 | "dev": true
95 | },
96 | "node_modules/deep-is": {
97 | "version": "0.1.4",
98 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
99 | "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
100 | "dev": true
101 | },
102 | "node_modules/duplexify": {
103 | "version": "3.7.1",
104 | "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz",
105 | "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==",
106 | "dev": true,
107 | "dependencies": {
108 | "end-of-stream": "^1.0.0",
109 | "inherits": "^2.0.1",
110 | "readable-stream": "^2.0.0",
111 | "stream-shift": "^1.0.0"
112 | }
113 | },
114 | "node_modules/end-of-stream": {
115 | "version": "1.4.4",
116 | "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
117 | "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
118 | "dev": true,
119 | "dependencies": {
120 | "once": "^1.4.0"
121 | }
122 | },
123 | "node_modules/escodegen": {
124 | "version": "1.14.3",
125 | "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz",
126 | "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==",
127 | "dev": true,
128 | "dependencies": {
129 | "esprima": "^4.0.1",
130 | "estraverse": "^4.2.0",
131 | "esutils": "^2.0.2",
132 | "optionator": "^0.8.1"
133 | },
134 | "bin": {
135 | "escodegen": "bin/escodegen.js",
136 | "esgenerate": "bin/esgenerate.js"
137 | },
138 | "engines": {
139 | "node": ">=4.0"
140 | },
141 | "optionalDependencies": {
142 | "source-map": "~0.6.1"
143 | }
144 | },
145 | "node_modules/esprima": {
146 | "version": "4.0.1",
147 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
148 | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
149 | "dev": true,
150 | "bin": {
151 | "esparse": "bin/esparse.js",
152 | "esvalidate": "bin/esvalidate.js"
153 | },
154 | "engines": {
155 | "node": ">=4"
156 | }
157 | },
158 | "node_modules/estraverse": {
159 | "version": "4.3.0",
160 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
161 | "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
162 | "dev": true,
163 | "engines": {
164 | "node": ">=4.0"
165 | }
166 | },
167 | "node_modules/esutils": {
168 | "version": "2.0.3",
169 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
170 | "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
171 | "dev": true,
172 | "engines": {
173 | "node": ">=0.10.0"
174 | }
175 | },
176 | "node_modules/events": {
177 | "version": "3.3.0",
178 | "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz",
179 | "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==",
180 | "dev": true,
181 | "engines": {
182 | "node": ">=0.8.x"
183 | }
184 | },
185 | "node_modules/falafel": {
186 | "version": "2.2.5",
187 | "resolved": "https://registry.npmjs.org/falafel/-/falafel-2.2.5.tgz",
188 | "integrity": "sha512-HuC1qF9iTnHDnML9YZAdCDQwT0yKl/U55K4XSUXqGAA2GLoafFgWRqdAbhWJxXaYD4pyoVxAJ8wH670jMpI9DQ==",
189 | "dev": true,
190 | "dependencies": {
191 | "acorn": "^7.1.1",
192 | "isarray": "^2.0.1"
193 | },
194 | "engines": {
195 | "node": ">=0.4.0"
196 | }
197 | },
198 | "node_modules/fast-levenshtein": {
199 | "version": "2.0.6",
200 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
201 | "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
202 | "dev": true
203 | },
204 | "node_modules/from2": {
205 | "version": "2.3.0",
206 | "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz",
207 | "integrity": "sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==",
208 | "dev": true,
209 | "dependencies": {
210 | "inherits": "^2.0.1",
211 | "readable-stream": "^2.0.0"
212 | }
213 | },
214 | "node_modules/function-bind": {
215 | "version": "1.1.1",
216 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
217 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
218 | "dev": true
219 | },
220 | "node_modules/glsl-inject-defines": {
221 | "version": "1.0.3",
222 | "resolved": "https://registry.npmjs.org/glsl-inject-defines/-/glsl-inject-defines-1.0.3.tgz",
223 | "integrity": "sha512-W49jIhuDtF6w+7wCMcClk27a2hq8znvHtlGnrYkSWEr8tHe9eA2dcnohlcAmxLYBSpSSdzOkRdyPTrx9fw49+A==",
224 | "dev": true,
225 | "dependencies": {
226 | "glsl-token-inject-block": "^1.0.0",
227 | "glsl-token-string": "^1.0.1",
228 | "glsl-tokenizer": "^2.0.2"
229 | }
230 | },
231 | "node_modules/glsl-resolve": {
232 | "version": "0.0.1",
233 | "resolved": "https://registry.npmjs.org/glsl-resolve/-/glsl-resolve-0.0.1.tgz",
234 | "integrity": "sha512-xxFNsfnhZTK9NBhzJjSBGX6IOqYpvBHxxmo+4vapiljyGNCY0Bekzn0firQkQrazK59c1hYxMDxYS8MDlhw4gA==",
235 | "dev": true,
236 | "dependencies": {
237 | "resolve": "^0.6.1",
238 | "xtend": "^2.1.2"
239 | }
240 | },
241 | "node_modules/glsl-resolve/node_modules/resolve": {
242 | "version": "0.6.3",
243 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-0.6.3.tgz",
244 | "integrity": "sha512-UHBY3viPlJKf85YijDUcikKX6tmF4SokIDp518ZDVT92JNDcG5uKIthaT/owt3Sar0lwtOafsQuwrg22/v2Dwg==",
245 | "dev": true
246 | },
247 | "node_modules/glsl-resolve/node_modules/xtend": {
248 | "version": "2.2.0",
249 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.2.0.tgz",
250 | "integrity": "sha512-SLt5uylT+4aoXxXuwtQp5ZnMMzhDb1Xkg4pEqc00WUJCQifPfV9Ub1VrNhp9kXkrjZD2I2Hl8WnjP37jzZLPZw==",
251 | "dev": true,
252 | "engines": {
253 | "node": ">=0.4"
254 | }
255 | },
256 | "node_modules/glsl-token-assignments": {
257 | "version": "2.0.2",
258 | "resolved": "https://registry.npmjs.org/glsl-token-assignments/-/glsl-token-assignments-2.0.2.tgz",
259 | "integrity": "sha512-OwXrxixCyHzzA0U2g4btSNAyB2Dx8XrztY5aVUCjRSh4/D0WoJn8Qdps7Xub3sz6zE73W3szLrmWtQ7QMpeHEQ==",
260 | "dev": true
261 | },
262 | "node_modules/glsl-token-defines": {
263 | "version": "1.0.0",
264 | "resolved": "https://registry.npmjs.org/glsl-token-defines/-/glsl-token-defines-1.0.0.tgz",
265 | "integrity": "sha512-Vb5QMVeLjmOwvvOJuPNg3vnRlffscq2/qvIuTpMzuO/7s5kT+63iL6Dfo2FYLWbzuiycWpbC0/KV0biqFwHxaQ==",
266 | "dev": true,
267 | "dependencies": {
268 | "glsl-tokenizer": "^2.0.0"
269 | }
270 | },
271 | "node_modules/glsl-token-depth": {
272 | "version": "1.1.2",
273 | "resolved": "https://registry.npmjs.org/glsl-token-depth/-/glsl-token-depth-1.1.2.tgz",
274 | "integrity": "sha512-eQnIBLc7vFf8axF9aoi/xW37LSWd2hCQr/3sZui8aBJnksq9C7zMeUYHVJWMhFzXrBU7fgIqni4EhXVW4/krpg==",
275 | "dev": true
276 | },
277 | "node_modules/glsl-token-descope": {
278 | "version": "1.0.2",
279 | "resolved": "https://registry.npmjs.org/glsl-token-descope/-/glsl-token-descope-1.0.2.tgz",
280 | "integrity": "sha512-kS2PTWkvi/YOeicVjXGgX5j7+8N7e56srNDEHDTVZ1dcESmbmpmgrnpjPcjxJjMxh56mSXYoFdZqb90gXkGjQw==",
281 | "dev": true,
282 | "dependencies": {
283 | "glsl-token-assignments": "^2.0.0",
284 | "glsl-token-depth": "^1.1.0",
285 | "glsl-token-properties": "^1.0.0",
286 | "glsl-token-scope": "^1.1.0"
287 | }
288 | },
289 | "node_modules/glsl-token-inject-block": {
290 | "version": "1.1.0",
291 | "resolved": "https://registry.npmjs.org/glsl-token-inject-block/-/glsl-token-inject-block-1.1.0.tgz",
292 | "integrity": "sha512-q/m+ukdUBuHCOtLhSr0uFb/qYQr4/oKrPSdIK2C4TD+qLaJvqM9wfXIF/OOBjuSA3pUoYHurVRNao6LTVVUPWA==",
293 | "dev": true
294 | },
295 | "node_modules/glsl-token-properties": {
296 | "version": "1.0.1",
297 | "resolved": "https://registry.npmjs.org/glsl-token-properties/-/glsl-token-properties-1.0.1.tgz",
298 | "integrity": "sha512-dSeW1cOIzbuUoYH0y+nxzwK9S9O3wsjttkq5ij9ZGw0OS41BirKJzzH48VLm8qLg+au6b0sINxGC0IrGwtQUcA==",
299 | "dev": true
300 | },
301 | "node_modules/glsl-token-scope": {
302 | "version": "1.1.2",
303 | "resolved": "https://registry.npmjs.org/glsl-token-scope/-/glsl-token-scope-1.1.2.tgz",
304 | "integrity": "sha512-YKyOMk1B/tz9BwYUdfDoHvMIYTGtVv2vbDSLh94PT4+f87z21FVdou1KNKgF+nECBTo0fJ20dpm0B1vZB1Q03A==",
305 | "dev": true
306 | },
307 | "node_modules/glsl-token-string": {
308 | "version": "1.0.1",
309 | "resolved": "https://registry.npmjs.org/glsl-token-string/-/glsl-token-string-1.0.1.tgz",
310 | "integrity": "sha512-1mtQ47Uxd47wrovl+T6RshKGkRRCYWhnELmkEcUAPALWGTFe2XZpH3r45XAwL2B6v+l0KNsCnoaZCSnhzKEksg==",
311 | "dev": true
312 | },
313 | "node_modules/glsl-token-whitespace-trim": {
314 | "version": "1.0.0",
315 | "resolved": "https://registry.npmjs.org/glsl-token-whitespace-trim/-/glsl-token-whitespace-trim-1.0.0.tgz",
316 | "integrity": "sha512-ZJtsPut/aDaUdLUNtmBYhaCmhIjpKNg7IgZSfX5wFReMc2vnj8zok+gB/3Quqs0TsBSX/fGnqUUYZDqyuc2xLQ==",
317 | "dev": true
318 | },
319 | "node_modules/glsl-tokenizer": {
320 | "version": "2.1.5",
321 | "resolved": "https://registry.npmjs.org/glsl-tokenizer/-/glsl-tokenizer-2.1.5.tgz",
322 | "integrity": "sha512-XSZEJ/i4dmz3Pmbnpsy3cKh7cotvFlBiZnDOwnj/05EwNp2XrhQ4XKJxT7/pDt4kp4YcpRSKz8eTV7S+mwV6MA==",
323 | "dev": true,
324 | "dependencies": {
325 | "through2": "^0.6.3"
326 | }
327 | },
328 | "node_modules/glsl-tokenizer/node_modules/isarray": {
329 | "version": "0.0.1",
330 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
331 | "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==",
332 | "dev": true
333 | },
334 | "node_modules/glsl-tokenizer/node_modules/readable-stream": {
335 | "version": "1.0.34",
336 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
337 | "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==",
338 | "dev": true,
339 | "dependencies": {
340 | "core-util-is": "~1.0.0",
341 | "inherits": "~2.0.1",
342 | "isarray": "0.0.1",
343 | "string_decoder": "~0.10.x"
344 | }
345 | },
346 | "node_modules/glsl-tokenizer/node_modules/string_decoder": {
347 | "version": "0.10.31",
348 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
349 | "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==",
350 | "dev": true
351 | },
352 | "node_modules/glsl-tokenizer/node_modules/through2": {
353 | "version": "0.6.5",
354 | "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz",
355 | "integrity": "sha512-RkK/CCESdTKQZHdmKICijdKKsCRVHs5KsLZ6pACAmF/1GPUQhonHSXWNERctxEp7RmvjdNbZTL5z9V7nSCXKcg==",
356 | "dev": true,
357 | "dependencies": {
358 | "readable-stream": ">=1.0.33-1 <1.1.0-0",
359 | "xtend": ">=4.0.0 <4.1.0-0"
360 | }
361 | },
362 | "node_modules/glslify": {
363 | "version": "7.1.1",
364 | "resolved": "https://registry.npmjs.org/glslify/-/glslify-7.1.1.tgz",
365 | "integrity": "sha512-bud98CJ6kGZcP9Yxcsi7Iz647wuDz3oN+IZsjCRi5X1PI7t/xPKeL0mOwXJjo+CRZMqvq0CkSJiywCcY7kVYog==",
366 | "dev": true,
367 | "dependencies": {
368 | "bl": "^2.2.1",
369 | "concat-stream": "^1.5.2",
370 | "duplexify": "^3.4.5",
371 | "falafel": "^2.1.0",
372 | "from2": "^2.3.0",
373 | "glsl-resolve": "0.0.1",
374 | "glsl-token-whitespace-trim": "^1.0.0",
375 | "glslify-bundle": "^5.0.0",
376 | "glslify-deps": "^1.2.5",
377 | "minimist": "^1.2.5",
378 | "resolve": "^1.1.5",
379 | "stack-trace": "0.0.9",
380 | "static-eval": "^2.0.5",
381 | "through2": "^2.0.1",
382 | "xtend": "^4.0.0"
383 | },
384 | "bin": {
385 | "glslify": "bin.js"
386 | }
387 | },
388 | "node_modules/glslify-bundle": {
389 | "version": "5.1.1",
390 | "resolved": "https://registry.npmjs.org/glslify-bundle/-/glslify-bundle-5.1.1.tgz",
391 | "integrity": "sha512-plaAOQPv62M1r3OsWf2UbjN0hUYAB7Aph5bfH58VxJZJhloRNbxOL9tl/7H71K7OLJoSJ2ZqWOKk3ttQ6wy24A==",
392 | "dev": true,
393 | "dependencies": {
394 | "glsl-inject-defines": "^1.0.1",
395 | "glsl-token-defines": "^1.0.0",
396 | "glsl-token-depth": "^1.1.1",
397 | "glsl-token-descope": "^1.0.2",
398 | "glsl-token-scope": "^1.1.1",
399 | "glsl-token-string": "^1.0.1",
400 | "glsl-token-whitespace-trim": "^1.0.0",
401 | "glsl-tokenizer": "^2.0.2",
402 | "murmurhash-js": "^1.0.0",
403 | "shallow-copy": "0.0.1"
404 | }
405 | },
406 | "node_modules/glslify-deps": {
407 | "version": "1.3.2",
408 | "resolved": "https://registry.npmjs.org/glslify-deps/-/glslify-deps-1.3.2.tgz",
409 | "integrity": "sha512-7S7IkHWygJRjcawveXQjRXLO2FTjijPDYC7QfZyAQanY+yGLCFHYnPtsGT9bdyHiwPTw/5a1m1M9hamT2aBpag==",
410 | "dev": true,
411 | "dependencies": {
412 | "@choojs/findup": "^0.2.0",
413 | "events": "^3.2.0",
414 | "glsl-resolve": "0.0.1",
415 | "glsl-tokenizer": "^2.0.0",
416 | "graceful-fs": "^4.1.2",
417 | "inherits": "^2.0.1",
418 | "map-limit": "0.0.1",
419 | "resolve": "^1.0.0"
420 | }
421 | },
422 | "node_modules/graceful-fs": {
423 | "version": "4.2.10",
424 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz",
425 | "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==",
426 | "dev": true
427 | },
428 | "node_modules/has": {
429 | "version": "1.0.3",
430 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
431 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
432 | "dev": true,
433 | "dependencies": {
434 | "function-bind": "^1.1.1"
435 | },
436 | "engines": {
437 | "node": ">= 0.4.0"
438 | }
439 | },
440 | "node_modules/inherits": {
441 | "version": "2.0.4",
442 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
443 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
444 | "dev": true
445 | },
446 | "node_modules/is-core-module": {
447 | "version": "2.9.0",
448 | "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz",
449 | "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==",
450 | "dev": true,
451 | "dependencies": {
452 | "has": "^1.0.3"
453 | },
454 | "funding": {
455 | "url": "https://github.com/sponsors/ljharb"
456 | }
457 | },
458 | "node_modules/isarray": {
459 | "version": "2.0.5",
460 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz",
461 | "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==",
462 | "dev": true
463 | },
464 | "node_modules/levn": {
465 | "version": "0.3.0",
466 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
467 | "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==",
468 | "dev": true,
469 | "dependencies": {
470 | "prelude-ls": "~1.1.2",
471 | "type-check": "~0.3.2"
472 | },
473 | "engines": {
474 | "node": ">= 0.8.0"
475 | }
476 | },
477 | "node_modules/map-limit": {
478 | "version": "0.0.1",
479 | "resolved": "https://registry.npmjs.org/map-limit/-/map-limit-0.0.1.tgz",
480 | "integrity": "sha512-pJpcfLPnIF/Sk3taPW21G/RQsEEirGaFpCW3oXRwH9dnFHPHNGjNyvh++rdmC2fNqEaTw2MhYJraoJWAHx8kEg==",
481 | "dev": true,
482 | "dependencies": {
483 | "once": "~1.3.0"
484 | }
485 | },
486 | "node_modules/map-limit/node_modules/once": {
487 | "version": "1.3.3",
488 | "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz",
489 | "integrity": "sha512-6vaNInhu+CHxtONf3zw3vq4SP2DOQhjBvIa3rNcG0+P7eKWlYH6Peu7rHizSloRU2EwMz6GraLieis9Ac9+p1w==",
490 | "dev": true,
491 | "dependencies": {
492 | "wrappy": "1"
493 | }
494 | },
495 | "node_modules/minimist": {
496 | "version": "1.2.6",
497 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz",
498 | "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==",
499 | "dev": true
500 | },
501 | "node_modules/murmurhash-js": {
502 | "version": "1.0.0",
503 | "resolved": "https://registry.npmjs.org/murmurhash-js/-/murmurhash-js-1.0.0.tgz",
504 | "integrity": "sha512-TvmkNhkv8yct0SVBSy+o8wYzXjE4Zz3PCesbfs8HiCXXdcTuocApFv11UWlNFWKYsP2okqrhb7JNlSm9InBhIw==",
505 | "dev": true
506 | },
507 | "node_modules/once": {
508 | "version": "1.4.0",
509 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
510 | "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
511 | "dev": true,
512 | "dependencies": {
513 | "wrappy": "1"
514 | }
515 | },
516 | "node_modules/optionator": {
517 | "version": "0.8.3",
518 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz",
519 | "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==",
520 | "dev": true,
521 | "dependencies": {
522 | "deep-is": "~0.1.3",
523 | "fast-levenshtein": "~2.0.6",
524 | "levn": "~0.3.0",
525 | "prelude-ls": "~1.1.2",
526 | "type-check": "~0.3.2",
527 | "word-wrap": "~1.2.3"
528 | },
529 | "engines": {
530 | "node": ">= 0.8.0"
531 | }
532 | },
533 | "node_modules/path-parse": {
534 | "version": "1.0.7",
535 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
536 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
537 | "dev": true
538 | },
539 | "node_modules/prelude-ls": {
540 | "version": "1.1.2",
541 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
542 | "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==",
543 | "dev": true,
544 | "engines": {
545 | "node": ">= 0.8.0"
546 | }
547 | },
548 | "node_modules/process-nextick-args": {
549 | "version": "2.0.1",
550 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
551 | "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
552 | "dev": true
553 | },
554 | "node_modules/readable-stream": {
555 | "version": "2.3.7",
556 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
557 | "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
558 | "dev": true,
559 | "dependencies": {
560 | "core-util-is": "~1.0.0",
561 | "inherits": "~2.0.3",
562 | "isarray": "~1.0.0",
563 | "process-nextick-args": "~2.0.0",
564 | "safe-buffer": "~5.1.1",
565 | "string_decoder": "~1.1.1",
566 | "util-deprecate": "~1.0.1"
567 | }
568 | },
569 | "node_modules/readable-stream/node_modules/isarray": {
570 | "version": "1.0.0",
571 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
572 | "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
573 | "dev": true
574 | },
575 | "node_modules/readable-stream/node_modules/safe-buffer": {
576 | "version": "5.1.2",
577 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
578 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
579 | "dev": true
580 | },
581 | "node_modules/resolve": {
582 | "version": "1.22.0",
583 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz",
584 | "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==",
585 | "dev": true,
586 | "dependencies": {
587 | "is-core-module": "^2.8.1",
588 | "path-parse": "^1.0.7",
589 | "supports-preserve-symlinks-flag": "^1.0.0"
590 | },
591 | "bin": {
592 | "resolve": "bin/resolve"
593 | },
594 | "funding": {
595 | "url": "https://github.com/sponsors/ljharb"
596 | }
597 | },
598 | "node_modules/safe-buffer": {
599 | "version": "5.2.1",
600 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
601 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
602 | "dev": true,
603 | "funding": [
604 | {
605 | "type": "github",
606 | "url": "https://github.com/sponsors/feross"
607 | },
608 | {
609 | "type": "patreon",
610 | "url": "https://www.patreon.com/feross"
611 | },
612 | {
613 | "type": "consulting",
614 | "url": "https://feross.org/support"
615 | }
616 | ]
617 | },
618 | "node_modules/shallow-copy": {
619 | "version": "0.0.1",
620 | "resolved": "https://registry.npmjs.org/shallow-copy/-/shallow-copy-0.0.1.tgz",
621 | "integrity": "sha512-b6i4ZpVuUxB9h5gfCxPiusKYkqTMOjEbBs4wMaFbkfia4yFv92UKZ6Df8WXcKbn08JNL/abvg3FnMAOfakDvUw==",
622 | "dev": true
623 | },
624 | "node_modules/source-map": {
625 | "version": "0.6.1",
626 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
627 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
628 | "dev": true,
629 | "optional": true,
630 | "engines": {
631 | "node": ">=0.10.0"
632 | }
633 | },
634 | "node_modules/stack-trace": {
635 | "version": "0.0.9",
636 | "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.9.tgz",
637 | "integrity": "sha512-vjUc6sfgtgY0dxCdnc40mK6Oftjo9+2K8H/NG81TMhgL392FtiPA9tn9RLyTxXmTLPJPjF3VyzFp6bsWFLisMQ==",
638 | "dev": true,
639 | "engines": {
640 | "node": "*"
641 | }
642 | },
643 | "node_modules/static-eval": {
644 | "version": "2.1.0",
645 | "resolved": "https://registry.npmjs.org/static-eval/-/static-eval-2.1.0.tgz",
646 | "integrity": "sha512-agtxZ/kWSsCkI5E4QifRwsaPs0P0JmZV6dkLz6ILYfFYQGn+5plctanRN+IC8dJRiFkyXHrwEE3W9Wmx67uDbw==",
647 | "dev": true,
648 | "dependencies": {
649 | "escodegen": "^1.11.1"
650 | }
651 | },
652 | "node_modules/stream-shift": {
653 | "version": "1.0.1",
654 | "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz",
655 | "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==",
656 | "dev": true
657 | },
658 | "node_modules/string_decoder": {
659 | "version": "1.1.1",
660 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
661 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
662 | "dev": true,
663 | "dependencies": {
664 | "safe-buffer": "~5.1.0"
665 | }
666 | },
667 | "node_modules/string_decoder/node_modules/safe-buffer": {
668 | "version": "5.1.2",
669 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
670 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
671 | "dev": true
672 | },
673 | "node_modules/supports-preserve-symlinks-flag": {
674 | "version": "1.0.0",
675 | "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
676 | "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
677 | "dev": true,
678 | "engines": {
679 | "node": ">= 0.4"
680 | },
681 | "funding": {
682 | "url": "https://github.com/sponsors/ljharb"
683 | }
684 | },
685 | "node_modules/through2": {
686 | "version": "2.0.5",
687 | "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz",
688 | "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==",
689 | "dev": true,
690 | "dependencies": {
691 | "readable-stream": "~2.3.6",
692 | "xtend": "~4.0.1"
693 | }
694 | },
695 | "node_modules/type-check": {
696 | "version": "0.3.2",
697 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
698 | "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==",
699 | "dev": true,
700 | "dependencies": {
701 | "prelude-ls": "~1.1.2"
702 | },
703 | "engines": {
704 | "node": ">= 0.8.0"
705 | }
706 | },
707 | "node_modules/typedarray": {
708 | "version": "0.0.6",
709 | "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
710 | "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==",
711 | "dev": true
712 | },
713 | "node_modules/util-deprecate": {
714 | "version": "1.0.2",
715 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
716 | "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
717 | "dev": true
718 | },
719 | "node_modules/word-wrap": {
720 | "version": "1.2.3",
721 | "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
722 | "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==",
723 | "dev": true,
724 | "engines": {
725 | "node": ">=0.10.0"
726 | }
727 | },
728 | "node_modules/wrappy": {
729 | "version": "1.0.2",
730 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
731 | "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
732 | "dev": true
733 | },
734 | "node_modules/xtend": {
735 | "version": "4.0.2",
736 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
737 | "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
738 | "dev": true,
739 | "engines": {
740 | "node": ">=0.4"
741 | }
742 | }
743 | },
744 | "dependencies": {
745 | "@choojs/findup": {
746 | "version": "0.2.1",
747 | "resolved": "https://registry.npmjs.org/@choojs/findup/-/findup-0.2.1.tgz",
748 | "integrity": "sha512-YstAqNb0MCN8PjdLCDfRsBcGVRN41f3vgLvaI0IrIcBp4AqILRSS0DeWNGkicC+f/zRIPJLc+9RURVSepwvfBw==",
749 | "dev": true,
750 | "requires": {
751 | "commander": "^2.15.1"
752 | }
753 | },
754 | "acorn": {
755 | "version": "7.4.1",
756 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
757 | "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
758 | "dev": true
759 | },
760 | "bl": {
761 | "version": "2.2.1",
762 | "resolved": "https://registry.npmjs.org/bl/-/bl-2.2.1.tgz",
763 | "integrity": "sha512-6Pesp1w0DEX1N550i/uGV/TqucVL4AM/pgThFSN/Qq9si1/DF9aIHs1BxD8V/QU0HoeHO6cQRTAuYnLPKq1e4g==",
764 | "dev": true,
765 | "requires": {
766 | "readable-stream": "^2.3.5",
767 | "safe-buffer": "^5.1.1"
768 | }
769 | },
770 | "buffer-from": {
771 | "version": "1.1.2",
772 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
773 | "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
774 | "dev": true
775 | },
776 | "commander": {
777 | "version": "2.20.3",
778 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
779 | "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
780 | "dev": true
781 | },
782 | "concat-stream": {
783 | "version": "1.6.2",
784 | "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
785 | "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
786 | "dev": true,
787 | "requires": {
788 | "buffer-from": "^1.0.0",
789 | "inherits": "^2.0.3",
790 | "readable-stream": "^2.2.2",
791 | "typedarray": "^0.0.6"
792 | }
793 | },
794 | "core-util-is": {
795 | "version": "1.0.3",
796 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
797 | "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==",
798 | "dev": true
799 | },
800 | "deep-is": {
801 | "version": "0.1.4",
802 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
803 | "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
804 | "dev": true
805 | },
806 | "duplexify": {
807 | "version": "3.7.1",
808 | "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz",
809 | "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==",
810 | "dev": true,
811 | "requires": {
812 | "end-of-stream": "^1.0.0",
813 | "inherits": "^2.0.1",
814 | "readable-stream": "^2.0.0",
815 | "stream-shift": "^1.0.0"
816 | }
817 | },
818 | "end-of-stream": {
819 | "version": "1.4.4",
820 | "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
821 | "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
822 | "dev": true,
823 | "requires": {
824 | "once": "^1.4.0"
825 | }
826 | },
827 | "escodegen": {
828 | "version": "1.14.3",
829 | "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz",
830 | "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==",
831 | "dev": true,
832 | "requires": {
833 | "esprima": "^4.0.1",
834 | "estraverse": "^4.2.0",
835 | "esutils": "^2.0.2",
836 | "optionator": "^0.8.1",
837 | "source-map": "~0.6.1"
838 | }
839 | },
840 | "esprima": {
841 | "version": "4.0.1",
842 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
843 | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
844 | "dev": true
845 | },
846 | "estraverse": {
847 | "version": "4.3.0",
848 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
849 | "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
850 | "dev": true
851 | },
852 | "esutils": {
853 | "version": "2.0.3",
854 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
855 | "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
856 | "dev": true
857 | },
858 | "events": {
859 | "version": "3.3.0",
860 | "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz",
861 | "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==",
862 | "dev": true
863 | },
864 | "falafel": {
865 | "version": "2.2.5",
866 | "resolved": "https://registry.npmjs.org/falafel/-/falafel-2.2.5.tgz",
867 | "integrity": "sha512-HuC1qF9iTnHDnML9YZAdCDQwT0yKl/U55K4XSUXqGAA2GLoafFgWRqdAbhWJxXaYD4pyoVxAJ8wH670jMpI9DQ==",
868 | "dev": true,
869 | "requires": {
870 | "acorn": "^7.1.1",
871 | "isarray": "^2.0.1"
872 | }
873 | },
874 | "fast-levenshtein": {
875 | "version": "2.0.6",
876 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
877 | "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
878 | "dev": true
879 | },
880 | "from2": {
881 | "version": "2.3.0",
882 | "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz",
883 | "integrity": "sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==",
884 | "dev": true,
885 | "requires": {
886 | "inherits": "^2.0.1",
887 | "readable-stream": "^2.0.0"
888 | }
889 | },
890 | "function-bind": {
891 | "version": "1.1.1",
892 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
893 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
894 | "dev": true
895 | },
896 | "glsl-inject-defines": {
897 | "version": "1.0.3",
898 | "resolved": "https://registry.npmjs.org/glsl-inject-defines/-/glsl-inject-defines-1.0.3.tgz",
899 | "integrity": "sha512-W49jIhuDtF6w+7wCMcClk27a2hq8znvHtlGnrYkSWEr8tHe9eA2dcnohlcAmxLYBSpSSdzOkRdyPTrx9fw49+A==",
900 | "dev": true,
901 | "requires": {
902 | "glsl-token-inject-block": "^1.0.0",
903 | "glsl-token-string": "^1.0.1",
904 | "glsl-tokenizer": "^2.0.2"
905 | }
906 | },
907 | "glsl-resolve": {
908 | "version": "0.0.1",
909 | "resolved": "https://registry.npmjs.org/glsl-resolve/-/glsl-resolve-0.0.1.tgz",
910 | "integrity": "sha512-xxFNsfnhZTK9NBhzJjSBGX6IOqYpvBHxxmo+4vapiljyGNCY0Bekzn0firQkQrazK59c1hYxMDxYS8MDlhw4gA==",
911 | "dev": true,
912 | "requires": {
913 | "resolve": "^0.6.1",
914 | "xtend": "^2.1.2"
915 | },
916 | "dependencies": {
917 | "resolve": {
918 | "version": "0.6.3",
919 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-0.6.3.tgz",
920 | "integrity": "sha512-UHBY3viPlJKf85YijDUcikKX6tmF4SokIDp518ZDVT92JNDcG5uKIthaT/owt3Sar0lwtOafsQuwrg22/v2Dwg==",
921 | "dev": true
922 | },
923 | "xtend": {
924 | "version": "2.2.0",
925 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.2.0.tgz",
926 | "integrity": "sha512-SLt5uylT+4aoXxXuwtQp5ZnMMzhDb1Xkg4pEqc00WUJCQifPfV9Ub1VrNhp9kXkrjZD2I2Hl8WnjP37jzZLPZw==",
927 | "dev": true
928 | }
929 | }
930 | },
931 | "glsl-token-assignments": {
932 | "version": "2.0.2",
933 | "resolved": "https://registry.npmjs.org/glsl-token-assignments/-/glsl-token-assignments-2.0.2.tgz",
934 | "integrity": "sha512-OwXrxixCyHzzA0U2g4btSNAyB2Dx8XrztY5aVUCjRSh4/D0WoJn8Qdps7Xub3sz6zE73W3szLrmWtQ7QMpeHEQ==",
935 | "dev": true
936 | },
937 | "glsl-token-defines": {
938 | "version": "1.0.0",
939 | "resolved": "https://registry.npmjs.org/glsl-token-defines/-/glsl-token-defines-1.0.0.tgz",
940 | "integrity": "sha512-Vb5QMVeLjmOwvvOJuPNg3vnRlffscq2/qvIuTpMzuO/7s5kT+63iL6Dfo2FYLWbzuiycWpbC0/KV0biqFwHxaQ==",
941 | "dev": true,
942 | "requires": {
943 | "glsl-tokenizer": "^2.0.0"
944 | }
945 | },
946 | "glsl-token-depth": {
947 | "version": "1.1.2",
948 | "resolved": "https://registry.npmjs.org/glsl-token-depth/-/glsl-token-depth-1.1.2.tgz",
949 | "integrity": "sha512-eQnIBLc7vFf8axF9aoi/xW37LSWd2hCQr/3sZui8aBJnksq9C7zMeUYHVJWMhFzXrBU7fgIqni4EhXVW4/krpg==",
950 | "dev": true
951 | },
952 | "glsl-token-descope": {
953 | "version": "1.0.2",
954 | "resolved": "https://registry.npmjs.org/glsl-token-descope/-/glsl-token-descope-1.0.2.tgz",
955 | "integrity": "sha512-kS2PTWkvi/YOeicVjXGgX5j7+8N7e56srNDEHDTVZ1dcESmbmpmgrnpjPcjxJjMxh56mSXYoFdZqb90gXkGjQw==",
956 | "dev": true,
957 | "requires": {
958 | "glsl-token-assignments": "^2.0.0",
959 | "glsl-token-depth": "^1.1.0",
960 | "glsl-token-properties": "^1.0.0",
961 | "glsl-token-scope": "^1.1.0"
962 | }
963 | },
964 | "glsl-token-inject-block": {
965 | "version": "1.1.0",
966 | "resolved": "https://registry.npmjs.org/glsl-token-inject-block/-/glsl-token-inject-block-1.1.0.tgz",
967 | "integrity": "sha512-q/m+ukdUBuHCOtLhSr0uFb/qYQr4/oKrPSdIK2C4TD+qLaJvqM9wfXIF/OOBjuSA3pUoYHurVRNao6LTVVUPWA==",
968 | "dev": true
969 | },
970 | "glsl-token-properties": {
971 | "version": "1.0.1",
972 | "resolved": "https://registry.npmjs.org/glsl-token-properties/-/glsl-token-properties-1.0.1.tgz",
973 | "integrity": "sha512-dSeW1cOIzbuUoYH0y+nxzwK9S9O3wsjttkq5ij9ZGw0OS41BirKJzzH48VLm8qLg+au6b0sINxGC0IrGwtQUcA==",
974 | "dev": true
975 | },
976 | "glsl-token-scope": {
977 | "version": "1.1.2",
978 | "resolved": "https://registry.npmjs.org/glsl-token-scope/-/glsl-token-scope-1.1.2.tgz",
979 | "integrity": "sha512-YKyOMk1B/tz9BwYUdfDoHvMIYTGtVv2vbDSLh94PT4+f87z21FVdou1KNKgF+nECBTo0fJ20dpm0B1vZB1Q03A==",
980 | "dev": true
981 | },
982 | "glsl-token-string": {
983 | "version": "1.0.1",
984 | "resolved": "https://registry.npmjs.org/glsl-token-string/-/glsl-token-string-1.0.1.tgz",
985 | "integrity": "sha512-1mtQ47Uxd47wrovl+T6RshKGkRRCYWhnELmkEcUAPALWGTFe2XZpH3r45XAwL2B6v+l0KNsCnoaZCSnhzKEksg==",
986 | "dev": true
987 | },
988 | "glsl-token-whitespace-trim": {
989 | "version": "1.0.0",
990 | "resolved": "https://registry.npmjs.org/glsl-token-whitespace-trim/-/glsl-token-whitespace-trim-1.0.0.tgz",
991 | "integrity": "sha512-ZJtsPut/aDaUdLUNtmBYhaCmhIjpKNg7IgZSfX5wFReMc2vnj8zok+gB/3Quqs0TsBSX/fGnqUUYZDqyuc2xLQ==",
992 | "dev": true
993 | },
994 | "glsl-tokenizer": {
995 | "version": "2.1.5",
996 | "resolved": "https://registry.npmjs.org/glsl-tokenizer/-/glsl-tokenizer-2.1.5.tgz",
997 | "integrity": "sha512-XSZEJ/i4dmz3Pmbnpsy3cKh7cotvFlBiZnDOwnj/05EwNp2XrhQ4XKJxT7/pDt4kp4YcpRSKz8eTV7S+mwV6MA==",
998 | "dev": true,
999 | "requires": {
1000 | "through2": "^0.6.3"
1001 | },
1002 | "dependencies": {
1003 | "isarray": {
1004 | "version": "0.0.1",
1005 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
1006 | "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==",
1007 | "dev": true
1008 | },
1009 | "readable-stream": {
1010 | "version": "1.0.34",
1011 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
1012 | "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==",
1013 | "dev": true,
1014 | "requires": {
1015 | "core-util-is": "~1.0.0",
1016 | "inherits": "~2.0.1",
1017 | "isarray": "0.0.1",
1018 | "string_decoder": "~0.10.x"
1019 | }
1020 | },
1021 | "string_decoder": {
1022 | "version": "0.10.31",
1023 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
1024 | "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==",
1025 | "dev": true
1026 | },
1027 | "through2": {
1028 | "version": "0.6.5",
1029 | "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz",
1030 | "integrity": "sha512-RkK/CCESdTKQZHdmKICijdKKsCRVHs5KsLZ6pACAmF/1GPUQhonHSXWNERctxEp7RmvjdNbZTL5z9V7nSCXKcg==",
1031 | "dev": true,
1032 | "requires": {
1033 | "readable-stream": ">=1.0.33-1 <1.1.0-0",
1034 | "xtend": ">=4.0.0 <4.1.0-0"
1035 | }
1036 | }
1037 | }
1038 | },
1039 | "glslify": {
1040 | "version": "7.1.1",
1041 | "resolved": "https://registry.npmjs.org/glslify/-/glslify-7.1.1.tgz",
1042 | "integrity": "sha512-bud98CJ6kGZcP9Yxcsi7Iz647wuDz3oN+IZsjCRi5X1PI7t/xPKeL0mOwXJjo+CRZMqvq0CkSJiywCcY7kVYog==",
1043 | "dev": true,
1044 | "requires": {
1045 | "bl": "^2.2.1",
1046 | "concat-stream": "^1.5.2",
1047 | "duplexify": "^3.4.5",
1048 | "falafel": "^2.1.0",
1049 | "from2": "^2.3.0",
1050 | "glsl-resolve": "0.0.1",
1051 | "glsl-token-whitespace-trim": "^1.0.0",
1052 | "glslify-bundle": "^5.0.0",
1053 | "glslify-deps": "^1.2.5",
1054 | "minimist": "^1.2.5",
1055 | "resolve": "^1.1.5",
1056 | "stack-trace": "0.0.9",
1057 | "static-eval": "^2.0.5",
1058 | "through2": "^2.0.1",
1059 | "xtend": "^4.0.0"
1060 | }
1061 | },
1062 | "glslify-bundle": {
1063 | "version": "5.1.1",
1064 | "resolved": "https://registry.npmjs.org/glslify-bundle/-/glslify-bundle-5.1.1.tgz",
1065 | "integrity": "sha512-plaAOQPv62M1r3OsWf2UbjN0hUYAB7Aph5bfH58VxJZJhloRNbxOL9tl/7H71K7OLJoSJ2ZqWOKk3ttQ6wy24A==",
1066 | "dev": true,
1067 | "requires": {
1068 | "glsl-inject-defines": "^1.0.1",
1069 | "glsl-token-defines": "^1.0.0",
1070 | "glsl-token-depth": "^1.1.1",
1071 | "glsl-token-descope": "^1.0.2",
1072 | "glsl-token-scope": "^1.1.1",
1073 | "glsl-token-string": "^1.0.1",
1074 | "glsl-token-whitespace-trim": "^1.0.0",
1075 | "glsl-tokenizer": "^2.0.2",
1076 | "murmurhash-js": "^1.0.0",
1077 | "shallow-copy": "0.0.1"
1078 | }
1079 | },
1080 | "glslify-deps": {
1081 | "version": "1.3.2",
1082 | "resolved": "https://registry.npmjs.org/glslify-deps/-/glslify-deps-1.3.2.tgz",
1083 | "integrity": "sha512-7S7IkHWygJRjcawveXQjRXLO2FTjijPDYC7QfZyAQanY+yGLCFHYnPtsGT9bdyHiwPTw/5a1m1M9hamT2aBpag==",
1084 | "dev": true,
1085 | "requires": {
1086 | "@choojs/findup": "^0.2.0",
1087 | "events": "^3.2.0",
1088 | "glsl-resolve": "0.0.1",
1089 | "glsl-tokenizer": "^2.0.0",
1090 | "graceful-fs": "^4.1.2",
1091 | "inherits": "^2.0.1",
1092 | "map-limit": "0.0.1",
1093 | "resolve": "^1.0.0"
1094 | }
1095 | },
1096 | "graceful-fs": {
1097 | "version": "4.2.10",
1098 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz",
1099 | "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==",
1100 | "dev": true
1101 | },
1102 | "has": {
1103 | "version": "1.0.3",
1104 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
1105 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
1106 | "dev": true,
1107 | "requires": {
1108 | "function-bind": "^1.1.1"
1109 | }
1110 | },
1111 | "inherits": {
1112 | "version": "2.0.4",
1113 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
1114 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
1115 | "dev": true
1116 | },
1117 | "is-core-module": {
1118 | "version": "2.9.0",
1119 | "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz",
1120 | "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==",
1121 | "dev": true,
1122 | "requires": {
1123 | "has": "^1.0.3"
1124 | }
1125 | },
1126 | "isarray": {
1127 | "version": "2.0.5",
1128 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz",
1129 | "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==",
1130 | "dev": true
1131 | },
1132 | "levn": {
1133 | "version": "0.3.0",
1134 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
1135 | "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==",
1136 | "dev": true,
1137 | "requires": {
1138 | "prelude-ls": "~1.1.2",
1139 | "type-check": "~0.3.2"
1140 | }
1141 | },
1142 | "map-limit": {
1143 | "version": "0.0.1",
1144 | "resolved": "https://registry.npmjs.org/map-limit/-/map-limit-0.0.1.tgz",
1145 | "integrity": "sha512-pJpcfLPnIF/Sk3taPW21G/RQsEEirGaFpCW3oXRwH9dnFHPHNGjNyvh++rdmC2fNqEaTw2MhYJraoJWAHx8kEg==",
1146 | "dev": true,
1147 | "requires": {
1148 | "once": "~1.3.0"
1149 | },
1150 | "dependencies": {
1151 | "once": {
1152 | "version": "1.3.3",
1153 | "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz",
1154 | "integrity": "sha512-6vaNInhu+CHxtONf3zw3vq4SP2DOQhjBvIa3rNcG0+P7eKWlYH6Peu7rHizSloRU2EwMz6GraLieis9Ac9+p1w==",
1155 | "dev": true,
1156 | "requires": {
1157 | "wrappy": "1"
1158 | }
1159 | }
1160 | }
1161 | },
1162 | "minimist": {
1163 | "version": "1.2.6",
1164 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz",
1165 | "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==",
1166 | "dev": true
1167 | },
1168 | "murmurhash-js": {
1169 | "version": "1.0.0",
1170 | "resolved": "https://registry.npmjs.org/murmurhash-js/-/murmurhash-js-1.0.0.tgz",
1171 | "integrity": "sha512-TvmkNhkv8yct0SVBSy+o8wYzXjE4Zz3PCesbfs8HiCXXdcTuocApFv11UWlNFWKYsP2okqrhb7JNlSm9InBhIw==",
1172 | "dev": true
1173 | },
1174 | "once": {
1175 | "version": "1.4.0",
1176 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
1177 | "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
1178 | "dev": true,
1179 | "requires": {
1180 | "wrappy": "1"
1181 | }
1182 | },
1183 | "optionator": {
1184 | "version": "0.8.3",
1185 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz",
1186 | "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==",
1187 | "dev": true,
1188 | "requires": {
1189 | "deep-is": "~0.1.3",
1190 | "fast-levenshtein": "~2.0.6",
1191 | "levn": "~0.3.0",
1192 | "prelude-ls": "~1.1.2",
1193 | "type-check": "~0.3.2",
1194 | "word-wrap": "~1.2.3"
1195 | }
1196 | },
1197 | "path-parse": {
1198 | "version": "1.0.7",
1199 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
1200 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
1201 | "dev": true
1202 | },
1203 | "prelude-ls": {
1204 | "version": "1.1.2",
1205 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
1206 | "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==",
1207 | "dev": true
1208 | },
1209 | "process-nextick-args": {
1210 | "version": "2.0.1",
1211 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
1212 | "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
1213 | "dev": true
1214 | },
1215 | "readable-stream": {
1216 | "version": "2.3.7",
1217 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
1218 | "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
1219 | "dev": true,
1220 | "requires": {
1221 | "core-util-is": "~1.0.0",
1222 | "inherits": "~2.0.3",
1223 | "isarray": "~1.0.0",
1224 | "process-nextick-args": "~2.0.0",
1225 | "safe-buffer": "~5.1.1",
1226 | "string_decoder": "~1.1.1",
1227 | "util-deprecate": "~1.0.1"
1228 | },
1229 | "dependencies": {
1230 | "isarray": {
1231 | "version": "1.0.0",
1232 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
1233 | "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
1234 | "dev": true
1235 | },
1236 | "safe-buffer": {
1237 | "version": "5.1.2",
1238 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
1239 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
1240 | "dev": true
1241 | }
1242 | }
1243 | },
1244 | "resolve": {
1245 | "version": "1.22.0",
1246 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz",
1247 | "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==",
1248 | "dev": true,
1249 | "requires": {
1250 | "is-core-module": "^2.8.1",
1251 | "path-parse": "^1.0.7",
1252 | "supports-preserve-symlinks-flag": "^1.0.0"
1253 | }
1254 | },
1255 | "safe-buffer": {
1256 | "version": "5.2.1",
1257 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
1258 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
1259 | "dev": true
1260 | },
1261 | "shallow-copy": {
1262 | "version": "0.0.1",
1263 | "resolved": "https://registry.npmjs.org/shallow-copy/-/shallow-copy-0.0.1.tgz",
1264 | "integrity": "sha512-b6i4ZpVuUxB9h5gfCxPiusKYkqTMOjEbBs4wMaFbkfia4yFv92UKZ6Df8WXcKbn08JNL/abvg3FnMAOfakDvUw==",
1265 | "dev": true
1266 | },
1267 | "source-map": {
1268 | "version": "0.6.1",
1269 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
1270 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
1271 | "dev": true,
1272 | "optional": true
1273 | },
1274 | "stack-trace": {
1275 | "version": "0.0.9",
1276 | "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.9.tgz",
1277 | "integrity": "sha512-vjUc6sfgtgY0dxCdnc40mK6Oftjo9+2K8H/NG81TMhgL392FtiPA9tn9RLyTxXmTLPJPjF3VyzFp6bsWFLisMQ==",
1278 | "dev": true
1279 | },
1280 | "static-eval": {
1281 | "version": "2.1.0",
1282 | "resolved": "https://registry.npmjs.org/static-eval/-/static-eval-2.1.0.tgz",
1283 | "integrity": "sha512-agtxZ/kWSsCkI5E4QifRwsaPs0P0JmZV6dkLz6ILYfFYQGn+5plctanRN+IC8dJRiFkyXHrwEE3W9Wmx67uDbw==",
1284 | "dev": true,
1285 | "requires": {
1286 | "escodegen": "^1.11.1"
1287 | }
1288 | },
1289 | "stream-shift": {
1290 | "version": "1.0.1",
1291 | "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz",
1292 | "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==",
1293 | "dev": true
1294 | },
1295 | "string_decoder": {
1296 | "version": "1.1.1",
1297 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
1298 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
1299 | "dev": true,
1300 | "requires": {
1301 | "safe-buffer": "~5.1.0"
1302 | },
1303 | "dependencies": {
1304 | "safe-buffer": {
1305 | "version": "5.1.2",
1306 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
1307 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
1308 | "dev": true
1309 | }
1310 | }
1311 | },
1312 | "supports-preserve-symlinks-flag": {
1313 | "version": "1.0.0",
1314 | "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
1315 | "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
1316 | "dev": true
1317 | },
1318 | "through2": {
1319 | "version": "2.0.5",
1320 | "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz",
1321 | "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==",
1322 | "dev": true,
1323 | "requires": {
1324 | "readable-stream": "~2.3.6",
1325 | "xtend": "~4.0.1"
1326 | }
1327 | },
1328 | "type-check": {
1329 | "version": "0.3.2",
1330 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
1331 | "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==",
1332 | "dev": true,
1333 | "requires": {
1334 | "prelude-ls": "~1.1.2"
1335 | }
1336 | },
1337 | "typedarray": {
1338 | "version": "0.0.6",
1339 | "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
1340 | "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==",
1341 | "dev": true
1342 | },
1343 | "util-deprecate": {
1344 | "version": "1.0.2",
1345 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
1346 | "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
1347 | "dev": true
1348 | },
1349 | "word-wrap": {
1350 | "version": "1.2.3",
1351 | "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
1352 | "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==",
1353 | "dev": true
1354 | },
1355 | "wrappy": {
1356 | "version": "1.0.2",
1357 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
1358 | "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
1359 | "dev": true
1360 | },
1361 | "xtend": {
1362 | "version": "4.0.2",
1363 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
1364 | "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
1365 | "dev": true
1366 | }
1367 | }
1368 | }
1369 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "glsl-conditionals",
3 | "version": "2.0.2",
4 | "description": "Daniel Holden's functions designed to avoid conditionals in GLSL, available both as ES modules strings and as GLSL files for use with glslify.",
5 | "keywords": [
6 | "glsl",
7 | "conditionals",
8 | "glslify",
9 | "webgl",
10 | "shader"
11 | ],
12 | "homepage": "https://github.com/dmnsgn/glsl-conditionals",
13 | "bugs": "https://github.com/dmnsgn/glsl-conditionals/issues",
14 | "repository": {
15 | "type": "git",
16 | "url": "git+https://github.com/dmnsgn/glsl-conditionals.git"
17 | },
18 | "funding": [
19 | {
20 | "type": "individual",
21 | "url": "https://paypal.me/dmnsgn"
22 | },
23 | {
24 | "type": "individual",
25 | "url": "https://commerce.coinbase.com/checkout/56cbdf28-e323-48d8-9c98-7019e72c97f3"
26 | }
27 | ],
28 | "license": "MIT",
29 | "author": "Damien Seguin (https://github.com/dmnsgn)",
30 | "sideEffects": false,
31 | "type": "module",
32 | "exports": {
33 | ".": {
34 | "types": "./types/index.d.ts",
35 | "default": "./index.js"
36 | }
37 | },
38 | "main": "index.js",
39 | "types": "types/index.d.ts",
40 | "scripts": {
41 | "test": "glslify test/index.glsl"
42 | },
43 | "devDependencies": {
44 | "glslify": "^7.1.1"
45 | },
46 | "engines": {
47 | "node": ">=16.0.0",
48 | "npm": ">=7.0.0"
49 | },
50 | "snowdev": {
51 | "dependencies": []
52 | }
53 | }
54 |
--------------------------------------------------------------------------------
/test/index.glsl:
--------------------------------------------------------------------------------
1 | // Comparisons
2 | #pragma glslify: when_eq = require(../when_eq)
3 | #pragma glslify: when_neq = require(../when_neq)
4 |
5 | #pragma glslify: when_gt = require(../when_gt)
6 | #pragma glslify: when_lt = require(../when_lt)
7 |
8 | #pragma glslify: when_ge = require(../when_ge)
9 | #pragma glslify: when_le = require(../when_le)
10 |
11 | // Logical operators
12 | #pragma glslify: when_and = require(../when_and)
13 | #pragma glslify: when_or = require(../when_or)
14 | #pragma glslify: when_xor = require(../when_xor)
15 | #pragma glslify: when_not = require(../when_not)
16 |
17 | void main() {
18 | float x = 10.0;
19 | float y = 0.0;
20 |
21 | y += 5.0 * when_eq(x, 0.0);
22 | y += 5.0 * when_eq(x, 0.0);
23 | y += 5.0 * when_neq(x, 0.0);
24 | y += 5.0 * when_gt(x, 0.0);
25 | y += 5.0 * when_lt(x, 0.0);
26 | y += 5.0 * when_ge(x, 0.0);
27 | y += 5.0 * when_le(x, 0.0);
28 | y += 5.0 * when_and(x, 0.0);
29 | y += 5.0 * when_or(x, 0.0);
30 | y += 5.0 * when_xor(x, 0.0);
31 | y += 5.0 * when_not(x, 0.0);
32 |
33 | // ...
34 | }
35 |
--------------------------------------------------------------------------------
/when_and.glsl:
--------------------------------------------------------------------------------
1 | float when_and(float a, float b) {
2 | return a * b;
3 | }
4 |
5 | vec2 when_and(vec2 a, vec2 b) {
6 | return a * b;
7 | }
8 |
9 | vec3 when_and(vec3 a, vec3 b) {
10 | return a * b;
11 | }
12 |
13 | vec4 when_and(vec4 a, vec4 b) {
14 | return a * b;
15 | }
16 |
17 | #pragma glslify: export(when_and)
18 |
--------------------------------------------------------------------------------
/when_and.glsl.js:
--------------------------------------------------------------------------------
1 | export default /* glsl */ `float when_and(float a, float b) {
2 | return a * b;
3 | }
4 |
5 | vec2 when_and(vec2 a, vec2 b) {
6 | return a * b;
7 | }
8 |
9 | vec3 when_and(vec3 a, vec3 b) {
10 | return a * b;
11 | }
12 |
13 | vec4 when_and(vec4 a, vec4 b) {
14 | return a * b;
15 | }
16 |
17 | `;
18 |
--------------------------------------------------------------------------------
/when_eq.glsl:
--------------------------------------------------------------------------------
1 | float when_eq(float x, float y) {
2 | return 1.0 - abs(sign(x - y));
3 | }
4 |
5 | vec2 when_eq(vec2 x, vec2 y) {
6 | return 1.0 - abs(sign(x - y));
7 | }
8 |
9 | vec3 when_eq(vec3 x, vec3 y) {
10 | return 1.0 - abs(sign(x - y));
11 | }
12 |
13 | vec4 when_eq(vec4 x, vec4 y) {
14 | return 1.0 - abs(sign(x - y));
15 | }
16 |
17 | #pragma glslify: export(when_eq)
18 |
--------------------------------------------------------------------------------
/when_eq.glsl.js:
--------------------------------------------------------------------------------
1 | export default /* glsl */ `float when_eq(float x, float y) {
2 | return 1.0 - abs(sign(x - y));
3 | }
4 |
5 | vec2 when_eq(vec2 x, vec2 y) {
6 | return 1.0 - abs(sign(x - y));
7 | }
8 |
9 | vec3 when_eq(vec3 x, vec3 y) {
10 | return 1.0 - abs(sign(x - y));
11 | }
12 |
13 | vec4 when_eq(vec4 x, vec4 y) {
14 | return 1.0 - abs(sign(x - y));
15 | }
16 |
17 | `;
18 |
--------------------------------------------------------------------------------
/when_ge.glsl:
--------------------------------------------------------------------------------
1 | #pragma glslify: when_lt = require('./when_lt')
2 |
3 | float when_ge(float x, float y) {
4 | return 1.0 - when_lt(x, y);
5 | }
6 |
7 | vec2 when_ge(vec2 x, vec2 y) {
8 | return 1.0 - when_lt(x, y);
9 | }
10 |
11 | vec3 when_ge(vec3 x, vec3 y) {
12 | return 1.0 - when_lt(x, y);
13 | }
14 |
15 | vec4 when_ge(vec4 x, vec4 y) {
16 | return 1.0 - when_lt(x, y);
17 | }
18 |
19 | #pragma glslify: export(when_ge)
20 |
--------------------------------------------------------------------------------
/when_ge.glsl.js:
--------------------------------------------------------------------------------
1 | export const dependencies = [new URL("./when_lt.glsl.js", import.meta.url)];
2 |
3 | export default /* glsl */ `
4 |
5 | float when_ge(float x, float y) {
6 | return 1.0 - when_lt(x, y);
7 | }
8 |
9 | vec2 when_ge(vec2 x, vec2 y) {
10 | return 1.0 - when_lt(x, y);
11 | }
12 |
13 | vec3 when_ge(vec3 x, vec3 y) {
14 | return 1.0 - when_lt(x, y);
15 | }
16 |
17 | vec4 when_ge(vec4 x, vec4 y) {
18 | return 1.0 - when_lt(x, y);
19 | }
20 |
21 | `;
22 |
--------------------------------------------------------------------------------
/when_gt.glsl:
--------------------------------------------------------------------------------
1 | float when_gt(float x, float y) {
2 | return max(sign(x - y), 0.0);
3 | }
4 |
5 | vec2 when_gt(vec2 x, vec2 y) {
6 | return max(sign(x - y), 0.0);
7 | }
8 |
9 | vec3 when_gt(vec3 x, vec3 y) {
10 | return max(sign(x - y), 0.0);
11 | }
12 |
13 | vec4 when_gt(vec4 x, vec4 y) {
14 | return max(sign(x - y), 0.0);
15 | }
16 |
17 | #pragma glslify: export(when_gt)
18 |
--------------------------------------------------------------------------------
/when_gt.glsl.js:
--------------------------------------------------------------------------------
1 | export default /* glsl */ `float when_gt(float x, float y) {
2 | return max(sign(x - y), 0.0);
3 | }
4 |
5 | vec2 when_gt(vec2 x, vec2 y) {
6 | return max(sign(x - y), 0.0);
7 | }
8 |
9 | vec3 when_gt(vec3 x, vec3 y) {
10 | return max(sign(x - y), 0.0);
11 | }
12 |
13 | vec4 when_gt(vec4 x, vec4 y) {
14 | return max(sign(x - y), 0.0);
15 | }
16 |
17 | `;
18 |
--------------------------------------------------------------------------------
/when_le.glsl:
--------------------------------------------------------------------------------
1 | #pragma glslify: when_gt = require('./when_gt')
2 |
3 | float when_le(float x, float y) {
4 | return 1.0 - when_gt(x, y);
5 | }
6 |
7 | vec2 when_le(vec2 x, vec2 y) {
8 | return 1.0 - when_gt(x, y);
9 | }
10 |
11 | vec3 when_le(vec3 x, vec3 y) {
12 | return 1.0 - when_gt(x, y);
13 | }
14 |
15 | vec4 when_le(vec4 x, vec4 y) {
16 | return 1.0 - when_gt(x, y);
17 | }
18 |
19 | #pragma glslify: export(when_le)
20 |
--------------------------------------------------------------------------------
/when_le.glsl.js:
--------------------------------------------------------------------------------
1 | export const dependencies = [new URL("./when_gt.glsl.js", import.meta.url)];
2 |
3 | export default /* glsl */ `
4 |
5 | float when_le(float x, float y) {
6 | return 1.0 - when_gt(x, y);
7 | }
8 |
9 | vec2 when_le(vec2 x, vec2 y) {
10 | return 1.0 - when_gt(x, y);
11 | }
12 |
13 | vec3 when_le(vec3 x, vec3 y) {
14 | return 1.0 - when_gt(x, y);
15 | }
16 |
17 | vec4 when_le(vec4 x, vec4 y) {
18 | return 1.0 - when_gt(x, y);
19 | }
20 |
21 | `;
22 |
--------------------------------------------------------------------------------
/when_lt.glsl:
--------------------------------------------------------------------------------
1 | float when_lt(float x, float y) {
2 | return max(sign(y - x), 0.0);
3 | }
4 |
5 | vec2 when_lt(vec2 x, vec2 y) {
6 | return max(sign(y - x), 0.0);
7 | }
8 |
9 | vec3 when_lt(vec3 x, vec3 y) {
10 | return max(sign(y - x), 0.0);
11 | }
12 |
13 | vec4 when_lt(vec4 x, vec4 y) {
14 | return max(sign(y - x), 0.0);
15 | }
16 |
17 | #pragma glslify: export(when_lt)
18 |
--------------------------------------------------------------------------------
/when_lt.glsl.js:
--------------------------------------------------------------------------------
1 | export default /* glsl */ `float when_lt(float x, float y) {
2 | return max(sign(y - x), 0.0);
3 | }
4 |
5 | vec2 when_lt(vec2 x, vec2 y) {
6 | return max(sign(y - x), 0.0);
7 | }
8 |
9 | vec3 when_lt(vec3 x, vec3 y) {
10 | return max(sign(y - x), 0.0);
11 | }
12 |
13 | vec4 when_lt(vec4 x, vec4 y) {
14 | return max(sign(y - x), 0.0);
15 | }
16 |
17 | `;
18 |
--------------------------------------------------------------------------------
/when_neq.glsl:
--------------------------------------------------------------------------------
1 | float when_neq(float x, float y) {
2 | return abs(sign(x - y));
3 | }
4 |
5 | vec2 when_neq(vec2 x, vec2 y) {
6 | return abs(sign(x - y));
7 | }
8 |
9 | vec3 when_neq(vec3 x, vec3 y) {
10 | return abs(sign(x - y));
11 | }
12 |
13 | vec4 when_neq(vec4 x, vec4 y) {
14 | return abs(sign(x - y));
15 | }
16 |
17 | #pragma glslify: export(when_neq)
18 |
--------------------------------------------------------------------------------
/when_neq.glsl.js:
--------------------------------------------------------------------------------
1 | export default /* glsl */ `float when_neq(float x, float y) {
2 | return abs(sign(x - y));
3 | }
4 |
5 | vec2 when_neq(vec2 x, vec2 y) {
6 | return abs(sign(x - y));
7 | }
8 |
9 | vec3 when_neq(vec3 x, vec3 y) {
10 | return abs(sign(x - y));
11 | }
12 |
13 | vec4 when_neq(vec4 x, vec4 y) {
14 | return abs(sign(x - y));
15 | }
16 |
17 | `;
18 |
--------------------------------------------------------------------------------
/when_not.glsl:
--------------------------------------------------------------------------------
1 | float when_not(float a, float b) {
2 | return 1.0 - a;
3 | }
4 |
5 | vec2 when_not(vec2 a, vec2 b) {
6 | return 1.0 - a;
7 | }
8 |
9 | vec3 when_not(vec3 a, vec3 b) {
10 | return 1.0 - a;
11 | }
12 |
13 | vec4 when_not(vec4 a, vec4 b) {
14 | return 1.0 - a;
15 | }
16 |
17 | #pragma glslify: export(when_not)
18 |
--------------------------------------------------------------------------------
/when_not.glsl.js:
--------------------------------------------------------------------------------
1 | export default /* glsl */ `float when_not(float a, float b) {
2 | return 1.0 - a;
3 | }
4 |
5 | vec2 when_not(vec2 a, vec2 b) {
6 | return 1.0 - a;
7 | }
8 |
9 | vec3 when_not(vec3 a, vec3 b) {
10 | return 1.0 - a;
11 | }
12 |
13 | vec4 when_not(vec4 a, vec4 b) {
14 | return 1.0 - a;
15 | }
16 |
17 | `;
18 |
--------------------------------------------------------------------------------
/when_or.glsl:
--------------------------------------------------------------------------------
1 | float when_or(float a, float b) {
2 | return min(a + b, 1.0);
3 | }
4 |
5 | vec2 when_or(vec2 a, vec2 b) {
6 | return min(a + b, 1.0);
7 | }
8 |
9 | vec3 when_or(vec3 a, vec3 b) {
10 | return min(a + b, 1.0);
11 | }
12 |
13 | vec4 when_or(vec4 a, vec4 b) {
14 | return min(a + b, 1.0);
15 | }
16 |
17 | #pragma glslify: export(when_or)
18 |
--------------------------------------------------------------------------------
/when_or.glsl.js:
--------------------------------------------------------------------------------
1 | export default /* glsl */ `float when_or(float a, float b) {
2 | return min(a + b, 1.0);
3 | }
4 |
5 | vec2 when_or(vec2 a, vec2 b) {
6 | return min(a + b, 1.0);
7 | }
8 |
9 | vec3 when_or(vec3 a, vec3 b) {
10 | return min(a + b, 1.0);
11 | }
12 |
13 | vec4 when_or(vec4 a, vec4 b) {
14 | return min(a + b, 1.0);
15 | }
16 |
17 | `;
18 |
--------------------------------------------------------------------------------
/when_xor.glsl:
--------------------------------------------------------------------------------
1 | float when_xor(float a, float b) {
2 | return (a + b) % 2.0;
3 | }
4 |
5 | vec2 when_xor(vec2 a, vec2 b) {
6 | return (a + b) % 2.0;
7 | }
8 |
9 | vec3 when_xor(vec3 a, vec3 b) {
10 | return (a + b) % 2.0;
11 | }
12 |
13 | vec4 when_xor(vec4 a, vec4 b) {
14 | return (a + b) % 2.0;
15 | }
16 |
17 | #pragma glslify: export(when_xor)
18 |
--------------------------------------------------------------------------------
/when_xor.glsl.js:
--------------------------------------------------------------------------------
1 | export default /* glsl */ `float when_xor(float a, float b) {
2 | return (a + b) % 2.0;
3 | }
4 |
5 | vec2 when_xor(vec2 a, vec2 b) {
6 | return (a + b) % 2.0;
7 | }
8 |
9 | vec3 when_xor(vec3 a, vec3 b) {
10 | return (a + b) % 2.0;
11 | }
12 |
13 | vec4 when_xor(vec4 a, vec4 b) {
14 | return (a + b) % 2.0;
15 | }
16 |
17 | `;
18 |
--------------------------------------------------------------------------------