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