├── .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 | [![npm version](https://img.shields.io/npm/v/glsl-rotate)](https://www.npmjs.com/package/glsl-rotate) 4 | [![stability-frozen](https://img.shields.io/badge/stability-frozen-brightgreen.svg)](https://www.npmjs.com/package/glsl-rotate) 5 | [![npm minzipped size](https://img.shields.io/bundlephobia/minzip/glsl-rotate)](https://bundlephobia.com/package/glsl-rotate) 6 | [![dependencies](https://img.shields.io/librariesio/release/npm/glsl-rotate)](https://github.com/dmnsgn/glsl-rotate/blob/main/package.json) 7 | [![types](https://img.shields.io/npm/types/glsl-rotate)](https://github.com/microsoft/TypeScript) 8 | [![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-fa6673.svg)](https://conventionalcommits.org) 9 | [![styled with prettier](https://img.shields.io/badge/styled_with-Prettier-f8bc45.svg?logo=prettier)](https://github.com/prettier/prettier) 10 | [![linted with eslint](https://img.shields.io/badge/linted_with-ES_Lint-4B32C3.svg?logo=eslint)](https://github.com/eslint/eslint) 11 | [![license](https://img.shields.io/github/license/dmnsgn/glsl-rotate)](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 | [![paypal](https://img.shields.io/badge/donate-paypal-informational?logo=paypal)](https://paypal.me/dmnsgn) 16 | [![coinbase](https://img.shields.io/badge/donate-coinbase-informational?logo=coinbase)](https://commerce.coinbase.com/checkout/56cbdf28-e323-48d8-9c98-7019e72c97f3) 17 | [![twitter](https://img.shields.io/twitter/follow/dmnsgn?style=social)](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 | --------------------------------------------------------------------------------