From 5eb2ed16891aa70a777ff027704748045b5a9007 Mon Sep 17 00:00:00 2001 From: Benjamin Date: Wed, 29 Sep 2021 23:41:51 -0400 Subject: [PATCH] hw01 --- .github/workflows/build-and-deploy.yml | 39 + .gitignore | 64 + README.md | 76 +- demo1.png | Bin 0 -> 88361 bytes demo2.png | Bin 0 -> 117374 bytes dist/index.html | 20 + package-lock.json | 3120 ++++++++++++++++++++++++ package.json | 22 + src/Camera.ts | 41 + src/geometry/Cube.ts | 100 + src/geometry/Icosphere.ts | 179 ++ src/geometry/Square.ts | 47 + src/globals.ts | 5 + src/main.ts | 150 ++ src/rendering/gl/Drawable.ts | 67 + src/rendering/gl/OpenGLRenderer.ts | 47 + src/rendering/gl/ShaderProgram.ts | 154 ++ src/shaders/biome-frag.glsl | 372 +++ src/shaders/biome-vert.glsl | 413 ++++ src/shaders/custom-frag.glsl | 138 ++ src/shaders/custom-vert.glsl | 83 + src/shaders/lambert-frag.glsl | 43 + src/shaders/lambert-vert.glsl | 53 + tsconfig.json | 11 + webpack.config.js | 37 + 25 files changed, 5213 insertions(+), 68 deletions(-) create mode 100644 .github/workflows/build-and-deploy.yml create mode 100644 .gitignore create mode 100644 demo1.png create mode 100644 demo2.png create mode 100644 dist/index.html create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 src/Camera.ts create mode 100644 src/geometry/Cube.ts create mode 100644 src/geometry/Icosphere.ts create mode 100644 src/geometry/Square.ts create mode 100644 src/globals.ts create mode 100644 src/main.ts create mode 100644 src/rendering/gl/Drawable.ts create mode 100644 src/rendering/gl/OpenGLRenderer.ts create mode 100644 src/rendering/gl/ShaderProgram.ts create mode 100644 src/shaders/biome-frag.glsl create mode 100644 src/shaders/biome-vert.glsl create mode 100644 src/shaders/custom-frag.glsl create mode 100644 src/shaders/custom-vert.glsl create mode 100644 src/shaders/lambert-frag.glsl create mode 100644 src/shaders/lambert-vert.glsl create mode 100644 tsconfig.json create mode 100644 webpack.config.js diff --git a/.github/workflows/build-and-deploy.yml b/.github/workflows/build-and-deploy.yml new file mode 100644 index 00000000..d35abd7b --- /dev/null +++ b/.github/workflows/build-and-deploy.yml @@ -0,0 +1,39 @@ + + +name: Build and Deploy +on: + push: + branches: + - master +jobs: + build-and-deploy: + runs-on: ubuntu-latest + steps: + - name: Checkout 🛎️ + uses: actions/checkout@v2.3.1 + with: + persist-credentials: false + + - uses: actions/setup-node@v2-beta + with: + node-version: "15.x" + + - uses: actions/cache@v2 + with: + # npm cache files are stored in `~/.npm` on Linux/macOS + path: ~/.npm + key: ${{ runner.os }}-build-${{ hashFiles('**/package-lock.json') }} + + - name: Install and Build 🔧 + run: | + npm ci + export NODE_ENV=production + npm run-script build + touch dist/.nojekyll + - name: Deploy 🚀 + uses: JamesIves/github-pages-deploy-action@3.6.2 + with: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + BRANCH: gh-pages + FOLDER: dist + CLEAN: true diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..30fd2a83 --- /dev/null +++ b/.gitignore @@ -0,0 +1,64 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ +jspm_packages/ + +# Typescript v1 declaration files +typings/ + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variables file +.env + +# next.js build output +.next + +dist/bundle.js +dist/bundle.js.map \ No newline at end of file diff --git a/README.md b/README.md index c89dda1c..3c9d0939 100644 --- a/README.md +++ b/README.md @@ -1,70 +1,10 @@ -# CIS 566 Project 1: Noisy Planets +# HW 0: Noisy Planet Part 2 +Name: Benjamin Sei +pennkey: bensei +External Resources: +https://iquilezles.org/ +https://gist.github.com/patriciogonzalezvivo/670c22f3966e662d2f83 -## Objective -- Continue practicing WebGL and Typescript -- Experiment with noise functions to procedurally generate the surface of a planet -- Review surface reflection models +This is a rotating planet. There are 4 biomes, whose locations are based on two noise functions and thresholding, the noise functions specifying to an extent the hotness and dryness. The terrain of the biomes is generated by various combinations of simplex noise, perlin noise, and fbm. The colors of these biomes use cosine color palettes and bis/gain functions the represent this. Lambert shading and Blinn-Phong was implemented (but the specular highlight is always present). Planet roates over time using trig functions, as well as the light vector. In the gui, you can modify the dryness and hotness thresholds to modify how much (or little) a biome shows up. You can also modify how many octaves the fbm noise functions use. -## Base Code -You'll be using the same base code as in homework 0. - -## Assignment Details -- Update the basic scene from your homework 0 implementation so that it renders -an icosphere once again. We recommend increasing the icosphere's subdivision -level to 6 so you have more vertices with which to work. -- Write a new GLSL shader program that incorporates various noise functions and -noise function permutations to offset the vertices on the surface of the icosphere and modify the color of the icosphere so that it looks like a planet with geographic -features. Your planet should have __at least four distinct "biomes"__ on its surface (they do not have to be Earth biomes). Try making formations like mountain ranges, oceans, rivers, lakes, canyons, volcanoes, ice caps, glaciers, or even forests. We recommend using 3D noise functions whenever possible so that you don't have UV distortion, though that effect may be desirable if you're trying to make the poles of your planet stand out more. -- Combined with your noise functions, use __at least four__ different functions from the Toolbox Functions slides. They should be used to either adjust your noise distribution, or animate elements on your planet's surface. -- Implement __at least two__ surface reflection model (e.g. Lambertian, Blinn-Phong, -Matcap/Lit Sphere, Raytraced Specular Reflection) besides on the planet's surface to -better distinguish the different formations (and perhaps even biomes) on the -surface of your planet. Make sure your planet has a "day" side and a "night" -side; you could even place small illuminated areas on the night side to -represent cities lit up at night. -- Add GUI elements via dat.GUI that allow the user to modify different -attributes of your planet. This can be as simple as changing the relative -location of the sun to as complex as redistributing biomes based on overall -planet temperature. You should have __at least three modifiable attributes__. -- Have fun experimenting with different features on your planet. If you want, -you can even try making multiple planets! Your score on this assignment is in -part dependent on how interesting you make your planet, so try to -experiment with as much as you can! - -Here are some examples of procedural planets: -- [Pixel Planet](https://deep-fold.itch.io/pixel-planet-generator) -- [Earthlike Planet](https://www.reddit.com/r/proceduralgeneration/comments/fqk56t/animation_procedural_planet_composition/) -- [Topographic Field](https://www.shadertoy.com/view/llscW7) -- [Dan's Final Project](https://vimeo.com/216265946) - -## Useful Links -- [Implicit Procedural Planet Generation](https://static1.squarespace.com/static/58a1bc3c3e00be6bfe6c228c/t/58a4d25146c3c4233fb15cc2/1487196929690/ImplicitProceduralPlanetGeneration-Report.pdf) -- [Curl Noise](https://petewerner.blogspot.com/2015/02/intro-to-curl-noise.html) -- [GPU Gems Chapter on Perlin Noise](http://developer.download.nvidia.com/books/HTML/gpugems/gpugems_ch05.html) -- [Worley Noise Implementations](https://thebookofshaders.com/12/) - - -## Submission -Commit and push to Github, then __make a pull request on the original Github repository__. Assignments will no longer be submitted on Canvas. - -For this assignment, and for all future assignments, modify this README file -so that it contains the following information: -- Your name and PennKey -- Citation of any external resources you found helpful when implementing this -assignment. -- A link to your live github.io demo -- At least one screenshot of your planet -- An explanation of the techniques you used to generate your planet features. -Please be as detailed as you can; not only will this help you explain your work -to recruiters, but it helps us understand your project when we grade it! - -## Extra Credit -Any or All of the following bonus items: -- Use a 4D noise function to modify the terrain over time, where time is the -fourth dimension that is updated each frame. A 3D function will work, too, but -the change in noise will look more "directional" than if you use 4D. -- Use music to animate aspects of your planet's terrain (e.g. mountain height, - brightness of emissive areas, water levels, etc.) -- Create a background for your planet using a raytraced sky box that includes -things like the sun, stars, or even nebulae. -- Add a textured moon that orbits your planet +Here is the live demo: https://ben-nin.github.io/hw00-webgl-intro/ \ No newline at end of file diff --git a/demo1.png b/demo1.png new file mode 100644 index 0000000000000000000000000000000000000000..9ba4ac82d6c1b2c64937c9fa417e859ce6a12f8d GIT binary patch literal 88361 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
    7oGV2Q>yv2cIKE;cbalzO{B!MK3;>unM*>g8 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�$L? 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

    !(fQLapYb)luPFpj4k<5VQH#@^CPg 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 Kv!!Qz?*1S5gcb4t literal 0 HcmV?d00001 diff --git a/demo2.png b/demo2.png new file mode 100644 index 0000000000000000000000000000000000000000..1e2a7b8eb7f5983cff53eb25325ff8c714fc1e86 GIT binary patch literal 117374 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�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%0A{znv*)O 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 literal 0 HcmV?d00001 diff --git a/dist/index.html b/dist/index.html new file mode 100644 index 00000000..062fed2f --- /dev/null +++ b/dist/index.html @@ -0,0 +1,20 @@ + + + + Project 0: Getting Started | CIS 566 + + + + + + + diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 00000000..e1a47a34 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,3120 @@ +{ + "requires": true, + "lockfileVersion": 1, + "dependencies": { + "3d-view": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/3d-view/-/3d-view-2.0.1.tgz", + "integrity": "sha512-YSLRHXNpSziaaiK2R0pI5+JKguoJVbtWmIv9YyBFtl0+q42kQwJB/JUulbFR/1zYFm58ifjKQ6kVdgZ6tyKtCA==", + "requires": { + "matrix-camera-controller": "^2.1.1", + "orbit-camera-controller": "^4.0.0", + "turntable-camera-controller": "^3.0.0" + } + }, + "3d-view-controls": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/3d-view-controls/-/3d-view-controls-2.2.2.tgz", + "integrity": "sha512-WL0u3PN41lEx/4qvKqV6bJlweUYoW18FXMshW/qHb41AVdZxDReLoJNGYsI7x6jf9bYelEF62BJPQmO7yEnG2w==", + "requires": { + "3d-view": "^2.0.0", + "has-passive-events": "^1.0.0", + "mouse-change": "^1.1.1", + "mouse-event-offset": "^3.0.2", + "mouse-wheel": "^1.0.2", + "right-now": "^1.0.0" + } + }, + "@discoveryjs/json-ext": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.3.tgz", + "integrity": "sha512-Fxt+AfXgjMoin2maPIYzFZnQjAXjAL0PHscM5pRTtatFqB+vZxAM9tLp2Optnuw3QOQC40jTNeGYFOMvyf7v9g==", + "dev": true + }, + "@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true + }, + "@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, + "@types/dat.gui": { + "version": "0.7.7", + "resolved": "https://registry.npmjs.org/@types/dat.gui/-/dat.gui-0.7.7.tgz", + "integrity": "sha512-CxLCme0He5Jk3uQwfO/fGZMyNhb/ypANzqX0yU9lviBQMlen5SOvQTBQ/Cd9x5mFlUAK5Tk8RgvTyLj1nYkz+w==", + "dev": true + }, + "@types/eslint": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.28.0.tgz", + "integrity": "sha512-07XlgzX0YJUn4iG1ocY4IX9DzKSmMGUs6ESKlxWhZRaa0fatIWaHWUVapcuGa8r5HFnTqzj+4OCjd5f7EZ/i/A==", + "dev": true, + "requires": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "@types/eslint-scope": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.1.tgz", + "integrity": "sha512-SCFeogqiptms4Fg29WpOTk5nHIzfpKCemSN63ksBQYKTcXoJEmJagV+DhVmbapZzY4/5YaOV1nZwrsU79fFm1g==", + "dev": true, + "requires": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "@types/estree": { + "version": "0.0.50", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.50.tgz", + "integrity": "sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw==", + "dev": true + }, + "@types/http-proxy": { + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.7.tgz", + "integrity": "sha512-9hdj6iXH64tHSLTY+Vt2eYOGzSogC+JQ2H7bdPWkuh7KXP5qLllWx++t+K9Wk556c3dkDdPws/SpMRi0sdCT1w==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/json-schema": { + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", + "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", + "dev": true + }, + "@types/node": { + "version": "9.6.61", + "resolved": "https://registry.npmjs.org/@types/node/-/node-9.6.61.tgz", + "integrity": "sha512-/aKAdg5c8n468cYLy2eQrcR5k6chlbNwZNGUj3TboyPa2hcO2QAJcfymlqPzMiRj8B6nYKXjzQz36minFE0RwQ==", + "dev": true + }, + "@types/retry": { + "version": "0.12.1", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.1.tgz", + "integrity": "sha512-xoDlM2S4ortawSWORYqsdU+2rxdh4LRW9ytc3zmT37RIKQh6IHyKwwtKhKis9ah8ol07DCkZxPt8BBvPjC6v4g==", + "dev": true + }, + "@types/webgl2": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/@types/webgl2/-/webgl2-0.0.6.tgz", + "integrity": "sha512-50GQhDVTq/herLMiqSQkdtRu+d5q/cWHn4VvKJtrj4DJAjo1MNkWYa2MA41BaBO1q1HgsUjuQvEOk0QHvlnAaQ==", + "dev": true + }, + "@webassemblyjs/ast": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", + "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", + "dev": true, + "requires": { + "@webassemblyjs/helper-numbers": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1" + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", + "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==", + "dev": true + }, + "@webassemblyjs/helper-api-error": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", + "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==", + "dev": true + }, + "@webassemblyjs/helper-buffer": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", + "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==", + "dev": true + }, + "@webassemblyjs/helper-numbers": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", + "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", + "dev": true, + "requires": { + "@webassemblyjs/floating-point-hex-parser": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", + "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==", + "dev": true + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", + "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1" + } + }, + "@webassemblyjs/ieee754": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", + "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", + "dev": true, + "requires": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "@webassemblyjs/leb128": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", + "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", + "dev": true, + "requires": { + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/utf8": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", + "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==", + "dev": true + }, + "@webassemblyjs/wasm-edit": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", + "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/helper-wasm-section": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-opt": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "@webassemblyjs/wast-printer": "1.11.1" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", + "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/ieee754": "1.11.1", + "@webassemblyjs/leb128": "1.11.1", + "@webassemblyjs/utf8": "1.11.1" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", + "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", + "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/ieee754": "1.11.1", + "@webassemblyjs/leb128": "1.11.1", + "@webassemblyjs/utf8": "1.11.1" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", + "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.1", + "@xtuc/long": "4.2.2" + } + }, + "@webpack-cli/configtest": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.0.4.tgz", + "integrity": "sha512-cs3XLy+UcxiP6bj0A6u7MLLuwdXJ1c3Dtc0RkKg+wiI1g/Ti1om8+/2hc2A2B60NbBNAbMgyBMHvyymWm/j4wQ==", + "dev": true + }, + "@webpack-cli/info": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.3.0.tgz", + "integrity": "sha512-ASiVB3t9LOKHs5DyVUcxpraBXDOKubYu/ihHhU+t1UPpxsivg6Od2E2qU4gJCekfEddzRBzHhzA/Acyw/mlK/w==", + "dev": true, + "requires": { + "envinfo": "^7.7.3" + } + }, + "@webpack-cli/serve": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.5.2.tgz", + "integrity": "sha512-vgJ5OLWadI8aKjDlOH3rb+dYyPd2GTZuQC/Tihjct6F9GpXGZINo3Y/IVuZVTM1eDQB+/AOsjPUWH/WySDaXvw==", + "dev": true + }, + "@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true + }, + "@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true + }, + "accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "dev": true, + "requires": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + } + }, + "acorn": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.5.0.tgz", + "integrity": "sha512-yXbYeFy+jUuYd3/CDcg2NkIYE991XYX/bje7LmjJigUciaeO1JR4XxXgCIV1/Zc/dRuFEyw1L0pbA+qynJkW5Q==", + "dev": true + }, + "acorn-import-assertions": { + "version": "1.7.6", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.7.6.tgz", + "integrity": "sha512-FlVvVFA1TX6l3lp8VjDnYYq7R1nyW6x3svAt4nDgrWQ9SBaSh9CnbwgSUTasgfNfOG5HlM1ehugCvM+hjo56LA==", + "dev": true + }, + "aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "requires": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + } + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true + }, + "ansi-html-community": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", + "dev": true + }, + "ansi-regex": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.0.tgz", + "integrity": "sha512-tAaOSrWCHF+1Ear1Z4wnJCXA9GGox4K6Ic85a5qalES2aeEwQGr7UC93mwef49536PkCYjzkp0zIxfFvexJ6zQ==", + "dev": true + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "array-flatten": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", + "dev": true + }, + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true + }, + "async": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "dev": true, + "requires": { + "lodash": "^4.17.14" + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", + "dev": true + }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true + }, + "binary-search-bounds": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/binary-search-bounds/-/binary-search-bounds-2.0.5.tgz", + "integrity": "sha512-H0ea4Fd3lS1+sTEB2TgcLoK21lLhwEJzlQv3IN47pJS976Gx4zoWe0ak3q+uYh60ppQxg9F16Ri4tS1sfD4+jA==" + }, + "body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "dev": true, + "requires": { + "bytes": "3.1.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" + }, + "dependencies": { + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "dev": true + } + } + }, + "bonjour": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", + "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", + "dev": true, + "requires": { + "array-flatten": "^2.1.0", + "deep-equal": "^1.0.1", + "dns-equal": "^1.0.0", + "dns-txt": "^2.0.2", + "multicast-dns": "^6.0.1", + "multicast-dns-service-types": "^1.1.0" + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "browserslist": { + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.17.0.tgz", + "integrity": "sha512-g2BJ2a0nEYvEFQC208q8mVAhfNwpZ5Mu8BwgtCdZKO3qx98HChmeg448fPdUzld8aFmfLgVh7yymqV+q1lJZ5g==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001254", + "colorette": "^1.3.0", + "electron-to-chromium": "^1.3.830", + "escalade": "^3.1.1", + "node-releases": "^1.1.75" + } + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "buffer-indexof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", + "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", + "dev": true + }, + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", + "dev": true + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "caniuse-lite": { + "version": "1.0.30001255", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001255.tgz", + "integrity": "sha512-F+A3N9jTZL882f/fg/WWVnKSu6IOo3ueLz4zwaOPbPYHNmM/ZaDUyzyJwS1mZhX7Ex5jqTyW599Gdelh5PDYLQ==", + "dev": true + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "chokidar": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", + "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==", + "dev": true, + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + } + }, + "chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "dev": true + }, + "clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true + }, + "clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "colorette": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz", + "integrity": "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==", + "dev": true + }, + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dev": true, + "requires": { + "mime-db": ">= 1.43.0 < 2" + } + }, + "compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "dev": true, + "requires": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + } + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "connect-history-api-fallback": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", + "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", + "dev": true + }, + "content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "dev": true, + "requires": { + "safe-buffer": "5.1.2" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + } + } + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "dev": true + }, + "cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", + "dev": true + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", + "dev": true + }, + "core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "cubic-hermite": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/cubic-hermite/-/cubic-hermite-1.0.0.tgz", + "integrity": "sha1-hOOy8nKzFFToOTuZu2rtRRaMFOU=" + }, + "dat.gui": { + "version": "0.7.7", + "resolved": "https://registry.npmjs.org/dat.gui/-/dat.gui-0.7.7.tgz", + "integrity": "sha512-sRl/28gF/XRC5ywC9I4zriATTsQcpSsRG7seXCPnTkK8/EQMIbCu5NPMpICLGxX9ZEUvcXR3ArLYCtgreFoMDw==" + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "deep-equal": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", + "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", + "dev": true, + "requires": { + "is-arguments": "^1.0.4", + "is-date-object": "^1.0.1", + "is-regex": "^1.0.4", + "object-is": "^1.0.1", + "object-keys": "^1.1.1", + "regexp.prototype.flags": "^1.2.0" + } + }, + "default-gateway": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", + "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", + "dev": true, + "requires": { + "execa": "^5.0.0" + } + }, + "define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "dev": true + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, + "del": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/del/-/del-6.0.0.tgz", + "integrity": "sha512-1shh9DQ23L16oXSZKB2JxpL7iMy2E0S9d517ptA1P8iw0alkPtQcrKH7ru31rYtKwF499HkTu+DRzq3TCKDFRQ==", + "dev": true, + "requires": { + "globby": "^11.0.1", + "graceful-fs": "^4.2.4", + "is-glob": "^4.0.1", + "is-path-cwd": "^2.2.0", + "is-path-inside": "^3.0.2", + "p-map": "^4.0.0", + "rimraf": "^3.0.2", + "slash": "^3.0.0" + } + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "dev": true + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", + "dev": true + }, + "detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "dev": true + }, + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "requires": { + "path-type": "^4.0.0" + } + }, + "dns-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", + "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=", + "dev": true + }, + "dns-packet": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.4.tgz", + "integrity": "sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA==", + "dev": true, + "requires": { + "ip": "^1.1.0", + "safe-buffer": "^5.0.1" + } + }, + "dns-txt": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", + "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", + "dev": true, + "requires": { + "buffer-indexof": "^1.0.0" + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", + "dev": true + }, + "electron-to-chromium": { + "version": "1.3.832", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.832.tgz", + "integrity": "sha512-x7lO8tGoW0CyV53qON4Lb5Rok9ipDelNdBIAiYUZ03dqy4u9vohMM1qV047+s/hiyJiqUWX/3PNwkX3kexX5ig==", + "dev": true + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "dev": true + }, + "enhanced-resolve": { + "version": "5.8.2", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.8.2.tgz", + "integrity": "sha512-F27oB3WuHDzvR2DOGNTaYy0D5o0cnrv8TeI482VM4kYgQd/FT9lUQwuNsJ0oOHtBUq7eiW5ytqzp7nBFknL+GA==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + } + }, + "envinfo": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz", + "integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==", + "dev": true + }, + "es-module-lexer": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.7.1.tgz", + "integrity": "sha512-MgtWFl5No+4S3TmhDmCz2ObFGm6lEpTnzbQi+Dd+pw4mlTIZTmM2iAs5gRlmx5zS9luzobCSBSI90JM/1/JgOw==", + "dev": true + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", + "dev": true + }, + "eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + } + }, + "esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "requires": { + "estraverse": "^5.2.0" + }, + "dependencies": { + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true + } + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "dev": true + }, + "eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true + }, + "events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true + }, + "execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + } + }, + "express": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "dev": true, + "requires": { + "accepts": "~1.3.7", + "array-flatten": "1.1.1", + "body-parser": "1.19.0", + "content-disposition": "0.5.3", + "content-type": "~1.0.4", + "cookie": "0.4.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.1.2", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.5", + "qs": "6.7.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.1.2", + "send": "0.17.1", + "serve-static": "1.14.1", + "setprototypeof": "1.1.1", + "statuses": "~1.5.0", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "dependencies": { + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", + "dev": true + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + } + } + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "fast-glob": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", + "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + } + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "fastest-levenshtein": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz", + "integrity": "sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow==", + "dev": true + }, + "fastq": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.12.0.tgz", + "integrity": "sha512-VNX0QkHK3RsXVKr9KrlUv/FoTa0NdbYoHHl7uXHv2rzyHSlxjdNAKug2twd9luJxpcyNeAgf5iPPMutJO67Dfg==", + "dev": true, + "requires": { + "reusify": "^1.0.4" + } + }, + "faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "dev": true, + "requires": { + "websocket-driver": ">=0.5.1" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "filtered-vector": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/filtered-vector/-/filtered-vector-1.2.5.tgz", + "integrity": "sha512-5Vu6wdtQJ1O2nRmz39dIr9m3hEDq1skYby5k1cJQdNWK4dMgvYcUEiA/9j7NcKfNZ5LGxn8w2LSLiigyH7pTAw==", + "requires": { + "binary-search-bounds": "^2.0.0", + "cubic-hermite": "^1.0.0" + } + }, + "finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "dev": true, + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + } + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "follow-redirects": { + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.3.tgz", + "integrity": "sha512-3MkHxknWMUtb23apkgz/83fDoe+y+qr0TdgacGIA7bew+QLBo3vdgEN2xEsuXNivpFy4CyDhBBZnNZOtalmenw==", + "dev": true + }, + "forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "dev": true + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "dev": true + }, + "fs": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/fs/-/fs-0.0.2.tgz", + "integrity": "sha1-4fJE7zkzwbKmS9R5kTYGDQ9ZFPg=", + "dev": true + }, + "fs-monkey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz", + "integrity": "sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==", + "dev": true + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "optional": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, + "get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true + }, + "gl-mat3": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gl-mat3/-/gl-mat3-1.0.0.tgz", + "integrity": "sha1-iWMyGcpCk3mha5GF2V1BcTRTuRI=" + }, + "gl-mat4": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gl-mat4/-/gl-mat4-1.2.0.tgz", + "integrity": "sha512-sT5C0pwB1/e9G9AvAoLsoaJtbMGjfd/jfxo8jMCKqYYEnjZuFvqV5rehqar0538EmssjdDeiEWnKyBSTw7quoA==" + }, + "gl-matrix": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/gl-matrix/-/gl-matrix-3.3.0.tgz", + "integrity": "sha512-COb7LDz+SXaHtl/h4LeaFcNdJdAQSDeVqjiIihSXNrkWObZLhDI4hIkZC11Aeqp7bcE72clzB0BnDXr2SmslRA==" + }, + "gl-quat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gl-quat/-/gl-quat-1.0.0.tgz", + "integrity": "sha1-CUXskjOG9FMpvl3DV7HIwtR1hsU=", + "requires": { + "gl-mat3": "^1.0.0", + "gl-vec3": "^1.0.3", + "gl-vec4": "^1.0.0" + } + }, + "gl-vec3": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/gl-vec3/-/gl-vec3-1.1.3.tgz", + "integrity": "sha512-jduKUqT0SGH02l8Yl+mV1yVsDfYgQAJyXGxkJQGyxPLHRiW25DwVIRPt6uvhrEMHftJfqhqKthRcyZqNEl9Xdw==" + }, + "gl-vec4": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gl-vec4/-/gl-vec4-1.0.1.tgz", + "integrity": "sha1-l9loeCgbFLUyy84QF4Xf0cs0CWQ=" + }, + "glob": { + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true + }, + "globby": { + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz", + "integrity": "sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==", + "dev": true, + "requires": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.1.1", + "ignore": "^5.1.4", + "merge2": "^1.3.0", + "slash": "^3.0.0" + } + }, + "graceful-fs": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", + "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", + "dev": true + }, + "handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", + "dev": true + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "has-passive-events": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-passive-events/-/has-passive-events-1.0.0.tgz", + "integrity": "sha512-2vSj6IeIsgvsRMyeQ0JaCX5Q3lX4zMn5HpoVc7MEhQ6pv8Iq9rsXjsp+E5ZwaT7T0xhMT0KmU8gtt1EFVdbJiw==", + "requires": { + "is-browser": "^2.0.1" + } + }, + "has-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", + "dev": true + }, + "has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "requires": { + "has-symbols": "^1.0.2" + } + }, + "hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + } + } + }, + "html-entities": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.2.tgz", + "integrity": "sha512-c3Ab/url5ksaT0WyleslpBEthOzWhrjQbg75y7XUsfSzi3Dgzt0l8w5e7DylRn15MTlMMD58dTfzddNS2kcAjQ==", + "dev": true + }, + "http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=", + "dev": true + }, + "http-errors": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + } + } + }, + "http-parser-js": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.3.tgz", + "integrity": "sha512-t7hjvef/5HEK7RWTdUzVUhl8zkEu+LlaE0IYzdMuvbSDipxBRpOn4Uhw8ZyECEa808iVT8XCjzo6xmYt4CiLZg==", + "dev": true + }, + "http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dev": true, + "requires": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + } + }, + "http-proxy-middleware": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.1.tgz", + "integrity": "sha512-cfaXRVoZxSed/BmkA7SwBVNI9Kj7HFltaE5rqYOub5kWzWZ+gofV2koVN1j2rMW7pEfSSlCHGJ31xmuyFyfLOg==", + "dev": true, + "requires": { + "@types/http-proxy": "^1.17.5", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" + } + }, + "human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore": { + "version": "5.1.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", + "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", + "dev": true + }, + "import-local": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.2.tgz", + "integrity": "sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA==", + "dev": true, + "requires": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + } + }, + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "internal-ip": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-6.2.0.tgz", + "integrity": "sha512-D8WGsR6yDt8uq7vDMu7mjcR+yRMm3dW8yufyChmszWRjcSHuxLBkR3GdS2HZAjodsaGuCvXeEJpueisXJULghg==", + "dev": true, + "requires": { + "default-gateway": "^6.0.0", + "ipaddr.js": "^1.9.1", + "is-ip": "^3.1.0", + "p-event": "^4.2.0" + }, + "dependencies": { + "ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true + } + } + }, + "interpret": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", + "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", + "dev": true + }, + "ip": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", + "dev": true + }, + "ip-regex": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-4.3.0.tgz", + "integrity": "sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q==", + "dev": true + }, + "ipaddr.js": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz", + "integrity": "sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==", + "dev": true + }, + "is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-browser": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-browser/-/is-browser-2.1.0.tgz", + "integrity": "sha512-F5rTJxDQ2sW81fcfOR1GnCXT6sVJC104fCyfj+mjpwNEwaPYSn5fte5jiHmBg3DHsIoL/l8Kvw5VN5SsTRcRFQ==" + }, + "is-core-module": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.6.0.tgz", + "integrity": "sha512-wShG8vs60jKfPWpF2KZRaAtvt3a20OAn7+IJ6hLPECpSABLcKtFKTTI4ZtH5QcBruBHlq+WsdHWyz0BCZW7svQ==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-ip": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-ip/-/is-ip-3.1.0.tgz", + "integrity": "sha512-35vd5necO7IitFPjd/YBeqwWnyDWbuLH9ZXQdMfDA8TEo7pv5X8yfrvVO3xbJbLUlERCMvf6X0hTUamQxCYJ9Q==", + "dev": true, + "requires": { + "ip-regex": "^4.0.0" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "is-path-cwd": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", + "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", + "dev": true + }, + "is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true + }, + "is-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "dev": true + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true + }, + "is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "requires": { + "is-docker": "^2.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "jest-worker": { + "version": "27.1.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.1.1.tgz", + "integrity": "sha512-XJKCL7tu+362IUYTWvw8+3S75U7qMiYiRU6u5yqscB48bTvzwN6i8L/7wVTXiFLwkRsxARNM7TISnTvcgv9hxA==", + "dev": true, + "requires": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "dependencies": { + "supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + }, + "loader-runner": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.2.0.tgz", + "integrity": "sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw==", + "dev": true + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "map-age-cleaner": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", + "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", + "dev": true, + "requires": { + "p-defer": "^1.0.0" + } + }, + "mat4-decompose": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mat4-decompose/-/mat4-decompose-1.0.4.tgz", + "integrity": "sha1-ZetP451wh496RE60Yk1S9+frL68=", + "requires": { + "gl-mat4": "^1.0.1", + "gl-vec3": "^1.0.2" + } + }, + "mat4-interpolate": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mat4-interpolate/-/mat4-interpolate-1.0.4.tgz", + "integrity": "sha1-Vf/p6zw1KV4sDVqfdyXZBoqJ/3Q=", + "requires": { + "gl-mat4": "^1.0.1", + "gl-vec3": "^1.0.2", + "mat4-decompose": "^1.0.3", + "mat4-recompose": "^1.0.3", + "quat-slerp": "^1.0.0" + } + }, + "mat4-recompose": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mat4-recompose/-/mat4-recompose-1.0.4.tgz", + "integrity": "sha1-OVPCMP8kc9x3LuAUpSySXPgbDk0=", + "requires": { + "gl-mat4": "^1.0.1" + } + }, + "matrix-camera-controller": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/matrix-camera-controller/-/matrix-camera-controller-2.1.4.tgz", + "integrity": "sha512-zsPGPONclrKSImNpqqKDTcqFpWLAIwMXEJtCde4IFPOw1dA9udzFg4HOFytOTosOFanchrx7+Hqq6glLATIxBA==", + "requires": { + "binary-search-bounds": "^2.0.0", + "gl-mat4": "^1.1.2", + "gl-vec3": "^1.0.3", + "mat4-interpolate": "^1.0.3" + } + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "dev": true + }, + "mem": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/mem/-/mem-8.1.1.tgz", + "integrity": "sha512-qFCFUDs7U3b8mBDPyz5EToEKoAkgCzqquIgi9nkkR9bixxOVOre+09lbuH7+9Kn2NFpm56M3GUWVbU2hQgdACA==", + "dev": true, + "requires": { + "map-age-cleaner": "^0.1.3", + "mimic-fn": "^3.1.0" + }, + "dependencies": { + "mimic-fn": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-3.1.0.tgz", + "integrity": "sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ==", + "dev": true + } + } + }, + "memfs": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.2.4.tgz", + "integrity": "sha512-2mDCPhuduRPOxlfgsXF9V+uqC6Jgz8zt/bNe4d4W7d5f6pCzHrWkxLNr17jKGXd4+j2kQNsAG2HARPnt74sqVQ==", + "dev": true, + "requires": { + "fs-monkey": "1.0.3" + } + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", + "dev": true + }, + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "dev": true + }, + "micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true + }, + "mime-db": { + "version": "1.49.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.49.0.tgz", + "integrity": "sha512-CIc8j9URtOVApSFCQIF+VBkX1RwXp/oMMOrqdyXSBXq5RWNEsRfyj1kiRnQgmNXmHxPoFIxOroKA3zcU9P+nAA==", + "dev": true + }, + "mime-types": { + "version": "2.1.32", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.32.tgz", + "integrity": "sha512-hJGaVS4G4c9TSMYh2n6SQAGrC4RnfU+daP8G7cSCmaqNjiOoUY0VHCMS42pxnQmVF1GWwFhbHWn3RIxCqTmZ9A==", + "dev": true, + "requires": { + "mime-db": "1.49.0" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "mouse-change": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/mouse-change/-/mouse-change-1.4.0.tgz", + "integrity": "sha1-wrd+W/o0pDzhRFyBV6Tk3JiVwU8=", + "requires": { + "mouse-event": "^1.0.0" + } + }, + "mouse-event": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/mouse-event/-/mouse-event-1.0.5.tgz", + "integrity": "sha1-s3ie23EJmX1aky0dAdqhVDpQFzI=" + }, + "mouse-event-offset": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mouse-event-offset/-/mouse-event-offset-3.0.2.tgz", + "integrity": "sha1-39hqbiSMa6jK1TuQXVA3ogY+mYQ=" + }, + "mouse-wheel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mouse-wheel/-/mouse-wheel-1.2.0.tgz", + "integrity": "sha1-bSkDseqPtI5h8bU7kDZ3PwQs21w=", + "requires": { + "right-now": "^1.0.0", + "signum": "^1.0.0", + "to-px": "^1.0.1" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "multicast-dns": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", + "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", + "dev": true, + "requires": { + "dns-packet": "^1.3.1", + "thunky": "^1.0.2" + } + }, + "multicast-dns-service-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", + "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", + "dev": true + }, + "negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", + "dev": true + }, + "neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true + }, + "node-forge": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz", + "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==", + "dev": true + }, + "node-releases": { + "version": "1.1.75", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.75.tgz", + "integrity": "sha512-Qe5OUajvqrqDSy6wrWFmMwfJ0jVgwiw4T3KqmbTcZ62qW0gQkheXYhcFM1+lOVcGUoRxcEcfyvFMAnDgaF1VWw==", + "dev": true + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "requires": { + "path-key": "^3.0.0" + } + }, + "object-is": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", + "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, + "obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "dev": true + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dev": true, + "requires": { + "ee-first": "1.1.1" + } + }, + "on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "dev": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "open": { + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/open/-/open-8.2.1.tgz", + "integrity": "sha512-rXILpcQlkF/QuFez2BJDf3GsqpjGKbkUUToAIGo9A0Q6ZkoSGogZJulrUdwRkrAsoQvoZsrjCYt8+zblOk7JQQ==", + "dev": true, + "requires": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + } + }, + "orbit-camera-controller": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/orbit-camera-controller/-/orbit-camera-controller-4.0.0.tgz", + "integrity": "sha1-bis28OeHhmPDMPUNqbfOaGwncAU=", + "requires": { + "filtered-vector": "^1.2.1", + "gl-mat4": "^1.0.3" + } + }, + "p-defer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", + "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", + "dev": true + }, + "p-event": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/p-event/-/p-event-4.2.0.tgz", + "integrity": "sha512-KXatOjCRXXkSePPb1Nbi0p0m+gQAwdlbhi4wQKJPI1HsMQS9g+Sqp2o+QHziPr7eYJyOZet836KoHEVM1mwOrQ==", + "dev": true, + "requires": { + "p-timeout": "^3.1.0" + } + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true + }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + }, + "dependencies": { + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + } + } + }, + "p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "requires": { + "aggregate-error": "^3.0.0" + } + }, + "p-retry": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.1.tgz", + "integrity": "sha512-e2xXGNhZOZ0lfgR9kL34iGlU8N/KO0xZnQxVEwdeOvpqNDQfdnxIYizvWtK8RglUa3bGqI8g0R/BdfzLMxRkiA==", + "dev": true, + "requires": { + "@types/retry": "^0.12.0", + "retry": "^0.13.1" + } + }, + "p-timeout": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", + "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", + "dev": true, + "requires": { + "p-finally": "^1.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "parse-unit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-unit/-/parse-unit-1.0.1.tgz", + "integrity": "sha1-fhu21b7zh0wo45JSaiVBFwKR7s8=" + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true + }, + "path": { + "version": "0.11.14", + "resolved": "https://registry.npmjs.org/path/-/path-0.11.14.tgz", + "integrity": "sha1-y8dWk1XLPIOv60rOQ+z/lSMeWn0=", + "dev": true + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", + "dev": true + }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true + }, + "picomatch": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", + "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", + "dev": true + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "requires": { + "find-up": "^4.0.0" + } + }, + "portfinder": { + "version": "1.0.28", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz", + "integrity": "sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA==", + "dev": true, + "requires": { + "async": "^2.6.2", + "debug": "^3.1.1", + "mkdirp": "^0.5.5" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + } + } + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dev": true, + "requires": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "dependencies": { + "ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true + } + } + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "dev": true + }, + "quat-slerp": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/quat-slerp/-/quat-slerp-1.0.1.tgz", + "integrity": "sha1-K6oVzjprvcMkHZcusXKDE57Wnyk=", + "requires": { + "gl-quat": "^1.0.0" + } + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "dev": true + }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true + }, + "raw-body": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "dev": true, + "requires": { + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "dependencies": { + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "dev": true + } + } + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "rechoir": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz", + "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==", + "dev": true, + "requires": { + "resolve": "^1.9.0" + } + }, + "regexp.prototype.flags": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz", + "integrity": "sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", + "dev": true + }, + "resolve": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "dev": true, + "requires": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + } + }, + "resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "requires": { + "resolve-from": "^5.0.0" + } + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + }, + "retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "dev": true + }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true + }, + "right-now": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/right-now/-/right-now-1.0.0.tgz", + "integrity": "sha1-bolgne69fc2vja7Mmuo5z1haCRg=" + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "requires": { + "queue-microtask": "^1.2.2" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + }, + "select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=", + "dev": true + }, + "selfsigned": { + "version": "1.10.11", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.11.tgz", + "integrity": "sha512-aVmbPOfViZqOZPgRBT0+3u4yZFHpmnIghLMlAcb5/xhp5ZtB/RVnKhz5vl2M32CLXAqR4kha9zfhNg0Lf/sxKA==", + "dev": true, + "requires": { + "node-forge": "^0.10.0" + } + }, + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "dev": true, + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.7.2", + "mime": "1.6.0", + "ms": "2.1.1", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "dependencies": { + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + } + } + }, + "serialize-javascript": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", + "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "dev": true, + "requires": { + "randombytes": "^2.1.0" + } + }, + "serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", + "dev": true, + "requires": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "dependencies": { + "http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + } + } + }, + "serve-static": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", + "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "dev": true, + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.1" + } + }, + "setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", + "dev": true + }, + "shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dev": true, + "requires": { + "kind-of": "^6.0.2" + } + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", + "dev": true + }, + "signum": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/signum/-/signum-1.0.0.tgz", + "integrity": "sha1-dKfSvyogtA66FqkrFSEk8dVZ+nc=" + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, + "sockjs": { + "version": "0.3.21", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.21.tgz", + "integrity": "sha512-DhbPFGpxjc6Z3I+uX07Id5ZO2XwYsWOrYjaSeieES78cq+JaJvVe5q/m1uvjIQhXinhIeCFRH6JgXe+mvVMyXw==", + "dev": true, + "requires": { + "faye-websocket": "^0.11.3", + "uuid": "^3.4.0", + "websocket-driver": "^0.7.4" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "source-map-support": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "dev": true, + "requires": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + }, + "dependencies": { + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "dev": true, + "requires": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + }, + "dependencies": { + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "stats-js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stats-js/-/stats-js-1.0.1.tgz", + "integrity": "sha512-EAwEFghGNv8mlYC4CZzI5kWghsnP8uBKXw6VLRHtXkOk5xySfUKLTqTkjgJFfDluIkf/O7eZwi5MXP50VeTbUg==" + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + } + } + }, + "strip-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.0.tgz", + "integrity": "sha512-UhDTSnGF1dc0DRbUqr1aXwNoY3RgVkSWG8BrpnuFIxhP57IqbS7IRta2Gfiavds4yCxc5+fEAVVOgBZWnYkvzg==", + "dev": true, + "requires": { + "ansi-regex": "^6.0.0" + } + }, + "strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "tapable": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.0.tgz", + "integrity": "sha512-FBk4IesMV1rBxX2tfiK8RAmogtWn53puLOQlvO8XuwlgxcYbP4mVPS9Ph4aeamSyyVjOl24aYWAuc8U5kCVwMw==", + "dev": true + }, + "terser": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.7.2.tgz", + "integrity": "sha512-0Omye+RD4X7X69O0eql3lC4Heh/5iLj3ggxR/B5ketZLOtLiOqukUgjw3q4PDnNQbsrkKr3UMypqStQG3XKRvw==", + "dev": true, + "requires": { + "commander": "^2.20.0", + "source-map": "~0.7.2", + "source-map-support": "~0.5.19" + }, + "dependencies": { + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true + } + } + }, + "terser-webpack-plugin": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.2.3.tgz", + "integrity": "sha512-eDbuaDlXhVaaoKuLD3DTNTozKqln6xOG6Us0SzlKG5tNlazG+/cdl8pm9qiF1Di89iWScTI0HcO+CDcf2dkXiw==", + "dev": true, + "requires": { + "jest-worker": "^27.0.6", + "p-limit": "^3.1.0", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.0", + "source-map": "^0.6.1", + "terser": "^5.7.2" + } + }, + "thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", + "dev": true + }, + "to-px": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/to-px/-/to-px-1.1.0.tgz", + "integrity": "sha512-bfg3GLYrGoEzrGoE05TAL/Uw+H/qrf2ptr9V3W7U0lkjjyYnIfgxmVLUfhQ1hZpIQwin81uxhDjvUkDYsC0xWw==", + "requires": { + "parse-unit": "^1.0.1" + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", + "dev": true + }, + "ts-loader": { + "version": "9.2.5", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.2.5.tgz", + "integrity": "sha512-al/ATFEffybdRMUIr5zMEWQdVnCGMUA9d3fXJ8dBVvBlzytPvIszoG9kZoR+94k6/i293RnVOXwMaWbXhNy9pQ==", + "dev": true, + "requires": { + "chalk": "^4.1.0", + "enhanced-resolve": "^5.0.0", + "micromatch": "^4.0.0", + "semver": "^7.3.4" + } + }, + "turntable-camera-controller": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/turntable-camera-controller/-/turntable-camera-controller-3.0.1.tgz", + "integrity": "sha1-jb0/4AVQGRxlFky4iJcQSVeK/Zk=", + "requires": { + "filtered-vector": "^1.2.1", + "gl-mat4": "^1.0.2", + "gl-vec3": "^1.0.2" + } + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "typescript": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.4.2.tgz", + "integrity": "sha512-gzP+t5W4hdy4c+68bfcv0t400HVJMMd2+H9B7gae1nQlBzCqvrXX+6GL/b3GAgyTH966pzrZ70/fRjwAtZksSQ==", + "dev": true + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "dev": true + }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "dev": true, + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "dev": true + } + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "dev": true + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true + }, + "v8-compile-cache": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", + "dev": true + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "dev": true + }, + "watchpack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.2.0.tgz", + "integrity": "sha512-up4YAn/XHgZHIxFBVCdlMiWDj6WaLKpwVeGQk2I5thdYxF/KmF0aaz6TfJZ/hfl1h/XlcDr7k1KH7ThDagpFaA==", + "dev": true, + "requires": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + } + }, + "wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "dev": true, + "requires": { + "minimalistic-assert": "^1.0.0" + } + }, + "webpack": { + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.52.0.tgz", + "integrity": "sha512-yRZOat8jWGwBwHpco3uKQhVU7HYaNunZiJ4AkAVQkPCUGoZk/tiIXiwG+8HIy/F+qsiZvSOa+GLQOj3q5RKRYg==", + "dev": true, + "requires": { + "@types/eslint-scope": "^3.7.0", + "@types/estree": "^0.0.50", + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/wasm-edit": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "acorn": "^8.4.1", + "acorn-import-assertions": "^1.7.6", + "browserslist": "^4.14.5", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.8.0", + "es-module-lexer": "^0.7.1", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.4", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.1.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.1.3", + "watchpack": "^2.2.0", + "webpack-sources": "^3.2.0" + } + }, + "webpack-cli": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.8.0.tgz", + "integrity": "sha512-+iBSWsX16uVna5aAYN6/wjhJy1q/GKk4KjKvfg90/6hykCTSgozbfz5iRgDTSJt/LgSbYxdBX3KBHeobIs+ZEw==", + "dev": true, + "requires": { + "@discoveryjs/json-ext": "^0.5.0", + "@webpack-cli/configtest": "^1.0.4", + "@webpack-cli/info": "^1.3.0", + "@webpack-cli/serve": "^1.5.2", + "colorette": "^1.2.1", + "commander": "^7.0.0", + "execa": "^5.0.0", + "fastest-levenshtein": "^1.0.12", + "import-local": "^3.0.2", + "interpret": "^2.2.0", + "rechoir": "^0.7.0", + "v8-compile-cache": "^2.2.0", + "webpack-merge": "^5.7.3" + }, + "dependencies": { + "commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true + } + } + }, + "webpack-dev-middleware": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.0.0.tgz", + "integrity": "sha512-9zng2Z60pm6A98YoRcA0wSxw1EYn7B7y5owX/Tckyt9KGyULTkLtiavjaXlWqOMkM0YtqGgL3PvMOFgyFLq8vw==", + "dev": true, + "requires": { + "colorette": "^1.2.2", + "mem": "^8.1.1", + "memfs": "^3.2.2", + "mime-types": "^2.1.31", + "range-parser": "^1.2.1", + "schema-utils": "^3.0.0" + } + }, + "webpack-dev-server": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.1.1.tgz", + "integrity": "sha512-Kl1mnCEw8Cy1Kw173gCxLIB242LfPKEOj9WoKhKz/MbryZTNrILzOJTk8kiczw/YUEPzn3gcltCQv6hDsLudRg==", + "dev": true, + "requires": { + "ansi-html-community": "^0.0.8", + "bonjour": "^3.5.0", + "chokidar": "^3.5.1", + "colorette": "^1.2.2", + "compression": "^1.7.4", + "connect-history-api-fallback": "^1.6.0", + "del": "^6.0.0", + "express": "^4.17.1", + "graceful-fs": "^4.2.6", + "html-entities": "^2.3.2", + "http-proxy-middleware": "^2.0.0", + "internal-ip": "^6.2.0", + "ipaddr.js": "^2.0.1", + "open": "^8.0.9", + "p-retry": "^4.5.0", + "portfinder": "^1.0.28", + "schema-utils": "^3.1.0", + "selfsigned": "^1.10.11", + "serve-index": "^1.9.1", + "sockjs": "^0.3.21", + "spdy": "^4.0.2", + "strip-ansi": "^7.0.0", + "url": "^0.11.0", + "webpack-dev-middleware": "^5.0.0", + "ws": "^8.1.0" + } + }, + "webpack-glsl-loader": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/webpack-glsl-loader/-/webpack-glsl-loader-1.0.1.tgz", + "integrity": "sha1-cqDjAZK9V5R9YNbVBckVvmgNCsw=", + "dev": true, + "requires": { + "fs": "0.0.2", + "path": "^0.11.14" + } + }, + "webpack-merge": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz", + "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==", + "dev": true, + "requires": { + "clone-deep": "^4.0.1", + "wildcard": "^2.0.0" + } + }, + "webpack-sources": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.0.tgz", + "integrity": "sha512-fahN08Et7P9trej8xz/Z7eRu8ltyiygEo/hnRi9KqBUs80KeDcnf96ZJo++ewWd84fEf3xSX9bp4ZS9hbw0OBw==", + "dev": true + }, + "websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "dev": true, + "requires": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + } + }, + "websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "dev": true + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "wildcard": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", + "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", + "dev": true + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "ws": { + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.2.tgz", + "integrity": "sha512-Q6B6H2oc8QY3llc3cB8kVmQ6pnJWVQbP7Q5algTcIxx7YEpc0oU4NBVHlztA7Ekzfhw2r0rPducMUiCGWKQRzw==", + "dev": true + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 00000000..16277910 --- /dev/null +++ b/package.json @@ -0,0 +1,22 @@ +{ + "scripts": { + "start": "webpack-dev-server --no-hot --live-reload", + "build": "webpack" + }, + "devDependencies": { + "@types/dat.gui": "^0.7.7", + "@types/webgl2": "0.0.6", + "ts-loader": "^9.2.5", + "typescript": "^4.4.2", + "webpack": "^5.52.0", + "webpack-cli": "^4.8.0", + "webpack-dev-server": "^4.1.1", + "webpack-glsl-loader": "^1.0.1" + }, + "dependencies": { + "3d-view-controls": "^2.2.2", + "dat.gui": "^0.7.7", + "gl-matrix": "^3.3.0", + "stats-js": "^1.0.1" + } +} diff --git a/src/Camera.ts b/src/Camera.ts new file mode 100644 index 00000000..77a76105 --- /dev/null +++ b/src/Camera.ts @@ -0,0 +1,41 @@ +var CameraControls = require('3d-view-controls'); +import {vec3, mat4} from 'gl-matrix'; + +class Camera { + controls: any; + projectionMatrix: mat4 = mat4.create(); + viewMatrix: mat4 = mat4.create(); + fovy: number = 45; + aspectRatio: number = 1; + near: number = 0.1; + far: number = 1000; + position: vec3 = vec3.create(); + direction: vec3 = vec3.create(); + target: vec3 = vec3.create(); + up: vec3 = vec3.create(); + + constructor(position: vec3, target: vec3) { + this.controls = CameraControls(document.getElementById('canvas'), { + eye: position, + center: target, + }); + vec3.add(this.target, this.position, this.direction); + mat4.lookAt(this.viewMatrix, this.controls.eye, this.controls.center, this.controls.up); + } + + setAspectRatio(aspectRatio: number) { + this.aspectRatio = aspectRatio; + } + + updateProjectionMatrix() { + mat4.perspective(this.projectionMatrix, this.fovy, this.aspectRatio, this.near, this.far); + } + + update() { + this.controls.tick(); + vec3.add(this.target, this.position, this.direction); + mat4.lookAt(this.viewMatrix, this.controls.eye, this.controls.center, this.controls.up); + } +}; + +export default Camera; diff --git a/src/geometry/Cube.ts b/src/geometry/Cube.ts new file mode 100644 index 00000000..f7339477 --- /dev/null +++ b/src/geometry/Cube.ts @@ -0,0 +1,100 @@ +import { vec3, vec4 } from 'gl-matrix'; +import Drawable from '../rendering/gl/Drawable'; +import { gl } from '../globals'; + +class Cube extends Drawable { + indices: Uint32Array; + positions: Float32Array; + normals: Float32Array; + center: vec4; + + constructor(center: vec3) { + super(); // Call the constructor of the super class. This is required. + this.center = vec4.fromValues(center[0], center[1], center[2], 1); + } + + create() { + this.positions = new Float32Array([-1, -1, 1, 1, + 1, -1, 1, 1, + 1, 1, 1, 1, + -1, 1, 1, 1, + + 1, -1, 1, 1, + 1, -1, -1, 1, + 1, 1, -1, 1, + 1, 1, 1, 1, + + 1, -1, -1, 1, + -1, -1, -1, 1, + -1, 1, -1, 1, + 1, 1, -1, 1, + + -1, -1, -1, 1, + -1, -1, 1, 1, + -1, 1, 1, 1, + -1, 1, -1, 1, + + 1, 1, 1, 1, + -1, 1, 1, 1, + -1, 1, -1, 1, + 1, 1, -1, 1, + + -1, -1, -1, 1, + 1, -1, -1, 1, + 1, -1, 1, 1, + -1, -1, 1, 1]); + this.normals = new Float32Array([0, 0, 1, 0, + 0, 0, 1, 0, + 0, 0, 1, 0, + 0, 0, 1, 0, + + 1, 0, 0, 0, + 1, 0, 0, 0, + 1, 0, 0, 0, + 1, 0, 0, 0, + + 0, 0, -1, 0, + 0, 0, -1, 0, + 0, 0, -1, 0, + 0, 0, -1, 0, + + -1, 0, 0, 0, + -1, 0, 0, 0, + -1, 0, 0, 0, + -1, 0, 0, 0, + + 0, 1, 0, 0, + 0, 1, 0, 0, + 0, 1, 0, 0, + 0, 1, 0, 0, + + 0, -1, 0, 0, + 0, -1, 0, 0, + 0, -1, 0, 0, + 0, -1, 0, 0]); + this.indices = new Uint32Array([0, 1, 2, 0, 2, 3, + 4, 5, 6, 4, 6, 7, + 8, 9, 10, 8, 10, 11, + 12, 13, 14, 12, 14, 15, + 16, 17, 18, 16, 18, 19, + 20, 21, 22, 20, 22, 23]); + + this.generateIdx(); + this.generatePos(); + this.generateNor(); + + this.count = this.indices.length; + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.bufIdx); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, this.indices, gl.STATIC_DRAW); + + gl.bindBuffer(gl.ARRAY_BUFFER, this.bufNor); + gl.bufferData(gl.ARRAY_BUFFER, this.normals, gl.STATIC_DRAW); + + gl.bindBuffer(gl.ARRAY_BUFFER, this.bufPos); + gl.bufferData(gl.ARRAY_BUFFER, this.positions, gl.STATIC_DRAW); + + console.log(`Created cube`); + } +} + +export default Cube; \ No newline at end of file diff --git a/src/geometry/Icosphere.ts b/src/geometry/Icosphere.ts new file mode 100644 index 00000000..412995ba --- /dev/null +++ b/src/geometry/Icosphere.ts @@ -0,0 +1,179 @@ +import {vec3, vec4} from 'gl-matrix'; +import Drawable from '../rendering/gl/Drawable'; +import {gl} from '../globals'; + +class Icosphere extends Drawable { + buffer: ArrayBuffer; + indices: Uint32Array; + positions: Float32Array; + normals: Float32Array; + center: vec4; + + constructor(center: vec3, public radius: number, public subdivisions: number) { + super(); // Call the constructor of the super class. This is required. + this.center = vec4.fromValues(center[0], center[1], center[2], 1); + } + + create() { + const X = 0.525731112119133606; + const Z = 0.850650808352039932; + const N = 0; + + let maxIndexCount = 20 * Math.pow(4, this.subdivisions); + let maxVertexCount = 10 * Math.pow(4, this.subdivisions) + 2; + + // Create buffers to back geometry data + // Index data will ping pong back and forth between buffer0 and buffer1 during creation + // All data will be in buffer0 at the end + const buffer0 = new ArrayBuffer( + maxIndexCount * 3 * Uint32Array.BYTES_PER_ELEMENT + + maxVertexCount * 4 * Float32Array.BYTES_PER_ELEMENT + + maxVertexCount * 4 * Float32Array.BYTES_PER_ELEMENT + ); + const buffer1 = new ArrayBuffer( + maxIndexCount * 3 * Uint32Array.BYTES_PER_ELEMENT + ); + const buffers = [buffer0, buffer1]; + let b = 0; + + const indexByteOffset = 0; + const vertexByteOffset = maxIndexCount * 3 * Uint32Array.BYTES_PER_ELEMENT; + const normalByteOffset = vertexByteOffset; + const positionByteOffset = vertexByteOffset + maxVertexCount * 4 * Float32Array.BYTES_PER_ELEMENT; + + // Create 3-uint buffer views into the backing buffer to represent triangles + // The C++ analogy to this would be something like: + // triangles[i] = reinterpret_cast*>(&buffer[offset]); + let triangles: Array = new Array(20); + let nextTriangles: Array = new Array(); + for (let i = 0; i < 20; ++i) { + triangles[i] = new Uint32Array(buffers[b], indexByteOffset + i * 3 * Uint32Array.BYTES_PER_ELEMENT, 3); + } + + // Create 3-float buffer views into the backing buffer to represent positions + let vertices: Array = new Array(12); + for (let i = 0; i < 12; ++i) { + vertices[i] =new Float32Array(buffer0, vertexByteOffset + i * 4 * Float32Array.BYTES_PER_ELEMENT, 4); + } + + // Initialize normals for a 20-sided icosahedron + vertices[0].set([ -X,N,Z,0 ]); + vertices[1].set([ X,N,Z,0 ]); + vertices[2].set([ -X,N,-Z,0 ]); + vertices[3].set([ X,N,-Z,0 ]); + vertices[4].set([ N,Z,X,0 ]); + vertices[5].set([ N,Z,-X,0 ]); + vertices[6].set([ N,-Z,X,0 ]); + vertices[7].set([ N,-Z,-X,0 ]); + vertices[8].set([ Z,X,N,0 ]); + vertices[9].set([ -Z,X, N,0 ]); + vertices[10].set([ Z,-X,N,0 ]); + vertices[11].set([ -Z,-X,N,0 ]); + + // Initialize indices for a 20-sided icosahedron + triangles[0].set([ 0,4,1 ]); + triangles[1].set([ 0,9,4 ]); + triangles[2].set([ 9,5,4 ]); + triangles[3].set([ 4,5,8 ]); + triangles[4].set([ 4,8,1 ]); + triangles[5].set([ 8,10,1 ]); + triangles[6].set([ 8,3,10 ]); + triangles[7].set([ 5,3,8 ]); + triangles[8].set([ 5,2,3 ]); + triangles[9].set([ 2,7,3 ]); + triangles[10].set([ 7,10,3 ]); + triangles[11].set([ 7,6,10 ]); + triangles[12].set([ 7,11,6 ]); + triangles[13].set([ 11,0,6 ]); + triangles[14].set([ 0,1,6 ],); + triangles[15].set([ 6,1,10 ]); + triangles[16].set([ 9,0,11 ]); + triangles[17].set([ 9,11,2 ]); + triangles[18].set([ 9,2,5 ]); + triangles[19].set([ 7,2,11 ]); + + // This loop subdivides the icosahedron + for (let s = 0; s < this.subdivisions; ++s) { + b = 1 - b; + nextTriangles.length = triangles.length * 4; + let triangleIdx = 0; + + // edgeMap maps a pair of vertex indices to a vertex index at their midpoint + // The function `mid` will get that midpoint vertex if it has already been created + // or it will create the vertex and add it to the map + let edgeMap: Map = new Map(); + function mid(v0: number, v1: number): number { + let key = [v0, v1].sort().join('_'); + if (!edgeMap.has(key)) { + let midpoint = new Float32Array(buffer0, vertexByteOffset + vertices.length * 4 * Float32Array.BYTES_PER_ELEMENT, 4); + vec4.add(midpoint, vertices[v0], vertices[v1]); + vec4.normalize(midpoint, midpoint); + edgeMap.set(key, vertices.length); + vertices.push(midpoint); + } + return edgeMap.get(key); + } + + for (let t = 0; t < triangles.length; ++t) { + let v0 = triangles[t][0]; + let v1 = triangles[t][1]; + let v2 = triangles[t][2]; + let v3 = mid(v0, v1); // Get or create a vertex between these two vertices + let v4 = mid(v1, v2); + let v5 = mid(v2, v0); + + let t0 = nextTriangles[triangleIdx] = new Uint32Array(buffers[b], indexByteOffset + (triangleIdx++) * 3 * Uint32Array.BYTES_PER_ELEMENT, 3); + let t1 = nextTriangles[triangleIdx] = new Uint32Array(buffers[b], indexByteOffset + (triangleIdx++) * 3 * Uint32Array.BYTES_PER_ELEMENT, 3); + let t2 = nextTriangles[triangleIdx] = new Uint32Array(buffers[b], indexByteOffset + (triangleIdx++) * 3 * Uint32Array.BYTES_PER_ELEMENT, 3); + let t3 = nextTriangles[triangleIdx] = new Uint32Array(buffers[b], indexByteOffset + (triangleIdx++) * 3 * Uint32Array.BYTES_PER_ELEMENT, 3); + + let triangleOffset = nextTriangles.length; + t0.set([v0, v3, v5]); + t1.set([v3, v4, v5]); + t2.set([v3, v1, v4]); + t3.set([v5, v4, v2]); + } + + // swap buffers + let temp = triangles; + triangles = nextTriangles; + nextTriangles = temp; + } + + if (b === 1) { + // if indices did not end up in buffer0, copy them there now + let temp0 = new Uint32Array(buffer0, 0, 3 * triangles.length); + let temp1 = new Uint32Array(buffer1, 0, 3 * triangles.length); + temp0.set(temp1); + } + + // Populate one position for each normal + for (let i = 0; i < vertices.length; ++i) { + let pos = new Float32Array(buffer0, positionByteOffset + i * 4 * Float32Array.BYTES_PER_ELEMENT, 4); + vec4.scaleAndAdd(pos, this.center, vertices[i], this.radius); + } + + this.buffer = buffer0; + this.indices = new Uint32Array(this.buffer, indexByteOffset, triangles.length * 3); + this.normals = new Float32Array(this.buffer, normalByteOffset, vertices.length * 4); + this.positions = new Float32Array(this.buffer, positionByteOffset, vertices.length * 4); + + this.generateIdx(); + this.generatePos(); + this.generateNor(); + + this.count = this.indices.length; + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.bufIdx); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, this.indices, gl.STATIC_DRAW); + + gl.bindBuffer(gl.ARRAY_BUFFER, this.bufNor); + gl.bufferData(gl.ARRAY_BUFFER, this.normals, gl.STATIC_DRAW); + + gl.bindBuffer(gl.ARRAY_BUFFER, this.bufPos); + gl.bufferData(gl.ARRAY_BUFFER, this.positions, gl.STATIC_DRAW); + + console.log(`Created icosphere with ${vertices.length} vertices`); + } +}; + +export default Icosphere; diff --git a/src/geometry/Square.ts b/src/geometry/Square.ts new file mode 100644 index 00000000..1a21a10d --- /dev/null +++ b/src/geometry/Square.ts @@ -0,0 +1,47 @@ +import {vec3, vec4} from 'gl-matrix'; +import Drawable from '../rendering/gl/Drawable'; +import {gl} from '../globals'; + +class Square extends Drawable { + indices: Uint32Array; + positions: Float32Array; + normals: Float32Array; + center: vec4; + + constructor(center: vec3) { + super(); // Call the constructor of the super class. This is required. + this.center = vec4.fromValues(center[0], center[1], center[2], 1); + } + + create() { + + this.indices = new Uint32Array([0, 1, 2, + 0, 2, 3]); + this.normals = new Float32Array([0, 0, 1, 0, + 0, 0, 1, 0, + 0, 0, 1, 0, + 0, 0, 1, 0]); + this.positions = new Float32Array([-1, -1, 0, 1, + 1, -1, 0, 1, + 1, 1, 0, 1, + -1, 1, 0, 1]); + + this.generateIdx(); + this.generatePos(); + this.generateNor(); + + this.count = this.indices.length; + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.bufIdx); + gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, this.indices, gl.STATIC_DRAW); + + gl.bindBuffer(gl.ARRAY_BUFFER, this.bufNor); + gl.bufferData(gl.ARRAY_BUFFER, this.normals, gl.STATIC_DRAW); + + gl.bindBuffer(gl.ARRAY_BUFFER, this.bufPos); + gl.bufferData(gl.ARRAY_BUFFER, this.positions, gl.STATIC_DRAW); + + console.log(`Created square`); + } +}; + +export default Square; diff --git a/src/globals.ts b/src/globals.ts new file mode 100644 index 00000000..cac5bf28 --- /dev/null +++ b/src/globals.ts @@ -0,0 +1,5 @@ + +export var gl: WebGL2RenderingContext; +export function setGL(_gl: WebGL2RenderingContext) { + gl = _gl; +} diff --git a/src/main.ts b/src/main.ts new file mode 100644 index 00000000..c719094e --- /dev/null +++ b/src/main.ts @@ -0,0 +1,150 @@ +import {vec3} from 'gl-matrix'; +const Stats = require('stats-js'); +import * as DAT from 'dat.gui'; +import Icosphere from './geometry/Icosphere'; +import Square from './geometry/Square'; +import Cube from './geometry/Cube'; +import OpenGLRenderer from './rendering/gl/OpenGLRenderer'; +import Camera from './Camera'; +import {setGL} from './globals'; +import ShaderProgram, {Shader} from './rendering/gl/ShaderProgram'; + +// Define an object with application parameters and button callbacks +// This will be referred to by dat.GUI's functions that add GUI elements. +const controls = { + tesselations: 6, + 'Load Scene': loadScene, // A function pointer, essentially + dryness: 15, + hotness: 25, + octavity: 10, +}; +var palette = { + color: [59, 100, 71], +}; +let icosphere: Icosphere; +let square: Square; +let cube: Cube; +let prevTesselations: number = 6; +let prevDryness = 15; +let prevHot = 25; +let prevOctavity = 10; + +function loadScene() { + icosphere = new Icosphere(vec3.fromValues(0, 0, 0), 1, controls.tesselations); + icosphere.create(); + square = new Square(vec3.fromValues(0, 0, 0)); + square.create(); + cube = new Cube(vec3.fromValues(0, 0, 0)); + cube.create(); +} + +function main() { + // Initial display for framerate + const stats = Stats(); + stats.setMode(0); + stats.domElement.style.position = 'absolute'; + stats.domElement.style.left = '0px'; + stats.domElement.style.top = '0px'; + document.body.appendChild(stats.domElement); + + // Add controls to the gui + const gui = new DAT.GUI(); + gui.add(controls, 'tesselations', 0, 8).step(1); + gui.add(controls, 'dryness', 0, 100); + gui.add(controls, 'hotness', 0, 100); + gui.add(controls, 'octavity', 0, 21); + gui.add(controls, 'Load Scene'); + gui.addColor(palette, 'color'); + + // get canvas and webgl context + const canvas = document.getElementById('canvas'); + const gl = canvas.getContext('webgl2'); + if (!gl) { + alert('WebGL 2 not supported!'); + } + // `setGL` is a function imported above which sets the value of `gl` in the `globals.ts` module. + // Later, we can import `gl` from `globals.ts` to access it + setGL(gl); + + // Initial call to load scene + loadScene(); + + const camera = new Camera(vec3.fromValues(0, 0, 5), vec3.fromValues(0, 0, 0)); + + const renderer = new OpenGLRenderer(canvas); + renderer.setClearColor(0.2, 0.2, 0.2, 1); + gl.enable(gl.DEPTH_TEST); + + const lambert = new ShaderProgram([ + new Shader(gl.VERTEX_SHADER, require('./shaders/lambert-vert.glsl')), + new Shader(gl.FRAGMENT_SHADER, require('./shaders/lambert-frag.glsl')), + ]); + + const customShader = new ShaderProgram([ + new Shader(gl.VERTEX_SHADER, require('./shaders/custom-vert.glsl')), + new Shader(gl.FRAGMENT_SHADER, require('./shaders/custom-frag.glsl')), + ]) + + const biomeShader = new ShaderProgram([ + new Shader(gl.VERTEX_SHADER, require('./shaders/biome-vert.glsl')), + new Shader(gl.FRAGMENT_SHADER, require('./shaders/biome-frag.glsl')), + ]) + + let time = 0; + // This function will be called every frame + function tick() { + time += .005; + camera.update(); + stats.begin(); + gl.viewport(0, 0, window.innerWidth, window.innerHeight); + renderer.clear(); + if(controls.tesselations != prevTesselations) + { + prevTesselations = controls.tesselations; + icosphere = new Icosphere(vec3.fromValues(0, 0, 0), 1, prevTesselations); + icosphere.create(); + } + if (controls.dryness != prevDryness) + { + prevDryness = controls.dryness; + } + if (controls.hotness != prevHot) + { + prevHot = controls.hotness; + } + if (controls.octavity != prevOctavity) + { + prevOctavity = controls.octavity; + } + // renderer.render(camera, customShader, palette['color'], time, [ + renderer.render(camera,biomeShader, palette['color'], + time, + controls.dryness, + controls.hotness, + controls.octavity, + [ + icosphere, + // square, + // cube, + ]); + stats.end(); + + // Tell the browser to call `tick` again whenever it renders a new frame + requestAnimationFrame(tick); + } + + window.addEventListener('resize', function() { + renderer.setSize(window.innerWidth, window.innerHeight); + camera.setAspectRatio(window.innerWidth / window.innerHeight); + camera.updateProjectionMatrix(); + }, false); + + renderer.setSize(window.innerWidth, window.innerHeight); + camera.setAspectRatio(window.innerWidth / window.innerHeight); + camera.updateProjectionMatrix(); + + // Start the render loop + tick(); +} + +main(); diff --git a/src/rendering/gl/Drawable.ts b/src/rendering/gl/Drawable.ts new file mode 100644 index 00000000..3006b5cd --- /dev/null +++ b/src/rendering/gl/Drawable.ts @@ -0,0 +1,67 @@ +import {gl} from '../../globals'; + +abstract class Drawable { + count: number = 0; + + bufIdx: WebGLBuffer; + bufPos: WebGLBuffer; + bufNor: WebGLBuffer; + + idxBound: boolean = false; + posBound: boolean = false; + norBound: boolean = false; + + abstract create() : void; + + destory() { + gl.deleteBuffer(this.bufIdx); + gl.deleteBuffer(this.bufPos); + gl.deleteBuffer(this.bufNor); + } + + generateIdx() { + this.idxBound = true; + this.bufIdx = gl.createBuffer(); + } + + generatePos() { + this.posBound = true; + this.bufPos = gl.createBuffer(); + } + + generateNor() { + this.norBound = true; + this.bufNor = gl.createBuffer(); + } + + bindIdx(): boolean { + if (this.idxBound) { + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.bufIdx); + } + return this.idxBound; + } + + bindPos(): boolean { + if (this.posBound) { + gl.bindBuffer(gl.ARRAY_BUFFER, this.bufPos); + } + return this.posBound; + } + + bindNor(): boolean { + if (this.norBound) { + gl.bindBuffer(gl.ARRAY_BUFFER, this.bufNor); + } + return this.norBound; + } + + elemCount(): number { + return this.count; + } + + drawMode(): GLenum { + return gl.TRIANGLES; + } +}; + +export default Drawable; diff --git a/src/rendering/gl/OpenGLRenderer.ts b/src/rendering/gl/OpenGLRenderer.ts new file mode 100644 index 00000000..d5016c29 --- /dev/null +++ b/src/rendering/gl/OpenGLRenderer.ts @@ -0,0 +1,47 @@ +import {mat4, vec4} from 'gl-matrix'; +import Drawable from './Drawable'; +import Camera from '../../Camera'; +import {gl} from '../../globals'; +import ShaderProgram from './ShaderProgram'; + +// In this file, `gl` is accessible because it is imported above +class OpenGLRenderer { + constructor(public canvas: HTMLCanvasElement) { + } + + setClearColor(r: number, g: number, b: number, a: number) { + gl.clearColor(r, g, b, a); + } + + setSize(width: number, height: number) { + this.canvas.width = width; + this.canvas.height = height; + } + + clear() { + gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT); + } + + render(camera: Camera, prog: ShaderProgram, color: Array, time: number, dry: number, hot: number, octaves: number, drawables: Array) { + let model = mat4.create(); + let viewProj = mat4.create(); + let colorVec = vec4.fromValues(color[0] / 255, color[1] / 255, color[2] / 255, 1); + + mat4.identity(model); + mat4.multiply(viewProj, camera.projectionMatrix, camera.viewMatrix); + prog.setModelMatrix(model); + prog.setViewProjMatrix(viewProj); + prog.setGeometryColor(colorVec); + prog.setTime(time); + prog.setDry(dry * 2.0 / 100 - 1); + prog.setHot(hot * 2.0 / 100 - 1); + prog.setOctavity(octaves * 1.0); + prog.setCamera(camera.direction); + + for (let drawable of drawables) { + prog.draw(drawable); + } + } +}; + +export default OpenGLRenderer; diff --git a/src/rendering/gl/ShaderProgram.ts b/src/rendering/gl/ShaderProgram.ts new file mode 100644 index 00000000..10c7057a --- /dev/null +++ b/src/rendering/gl/ShaderProgram.ts @@ -0,0 +1,154 @@ +import {vec3, vec4, mat4} from 'gl-matrix'; +import Drawable from './Drawable'; +import {gl} from '../../globals'; + +var activeProgram: WebGLProgram = null; + +export class Shader { + shader: WebGLShader; + + constructor(type: number, source: string) { + this.shader = gl.createShader(type); + gl.shaderSource(this.shader, source); + gl.compileShader(this.shader); + + if (!gl.getShaderParameter(this.shader, gl.COMPILE_STATUS)) { + throw gl.getShaderInfoLog(this.shader); + } + } +}; + +class ShaderProgram { + prog: WebGLProgram; + + attrPos: number; + attrNor: number; + attrCol: number; + + unifCamera: WebGLUniformLocation; + unifOctavity: WebGLUniformLocation; + unifHot: WebGLUniformLocation; + unifDry: WebGLUniformLocation; + unifTime: WebGLUniformLocation; + unifModel: WebGLUniformLocation; + unifModelInvTr: WebGLUniformLocation; + unifViewProj: WebGLUniformLocation; + unifColor: WebGLUniformLocation; + + constructor(shaders: Array) { + this.prog = gl.createProgram(); + + for (let shader of shaders) { + gl.attachShader(this.prog, shader.shader); + } + gl.linkProgram(this.prog); + if (!gl.getProgramParameter(this.prog, gl.LINK_STATUS)) { + throw gl.getProgramInfoLog(this.prog); + } + + this.attrPos = gl.getAttribLocation(this.prog, "vs_Pos"); + this.attrNor = gl.getAttribLocation(this.prog, "vs_Nor"); + this.attrCol = gl.getAttribLocation(this.prog, "vs_Col"); + this.unifCamera = gl.getUniformLocation(this.prog, "u_Camera"); + this.unifOctavity = gl.getUniformLocation(this.prog, "u_Octavity"); + this.unifHot = gl.getUniformLocation(this.prog, "u_Hot"); + this.unifDry = gl.getUniformLocation(this.prog, "u_Dry"); + this.unifTime = gl.getUniformLocation(this.prog, "u_Time"); + this.unifModel = gl.getUniformLocation(this.prog, "u_Model"); + this.unifModelInvTr = gl.getUniformLocation(this.prog, "u_ModelInvTr"); + this.unifViewProj = gl.getUniformLocation(this.prog, "u_ViewProj"); + this.unifColor = gl.getUniformLocation(this.prog, "u_Color"); + } + + use() { + if (activeProgram !== this.prog) { + gl.useProgram(this.prog); + activeProgram = this.prog; + } + } + + setModelMatrix(model: mat4) { + this.use(); + if (this.unifModel !== -1) { + gl.uniformMatrix4fv(this.unifModel, false, model); + } + + if (this.unifModelInvTr !== -1) { + let modelinvtr: mat4 = mat4.create(); + mat4.transpose(modelinvtr, model); + mat4.invert(modelinvtr, modelinvtr); + gl.uniformMatrix4fv(this.unifModelInvTr, false, modelinvtr); + } + } + + setViewProjMatrix(vp: mat4) { + this.use(); + if (this.unifViewProj !== -1) { + gl.uniformMatrix4fv(this.unifViewProj, false, vp); + } + } + + setGeometryColor(color: vec4) { + this.use(); + if (this.unifColor !== -1) { + gl.uniform4fv(this.unifColor, color); + } + } + + setTime(time: number) { + this.use(); + if (this.unifTime !== -1) { + gl.uniform1f(this.unifTime, time); + } + } + + setDry(dry: number) { + this.use(); + if (this.unifDry !== -1) { + gl.uniform1f(this.unifDry, dry); + } + } + + setHot(hot: number) { + this.use(); + if (this.unifDry !== -1) { + gl.uniform1f(this.unifHot, hot); + } + } + + setOctavity(octavity: number) { + this.use(); + if (this.unifOctavity !== -1) { + gl.uniform1f(this.unifOctavity, octavity); + } + } + + setCamera(camera: vec3) { + this.use(); + if (this.unifCamera !== -1) { + gl.uniform3fv(this.unifCamera, camera); + } + } + + draw(d: Drawable) { + this.use(); + + if (this.attrPos != -1 && d.bindPos()) { + gl.enableVertexAttribArray(this.attrPos); + gl.vertexAttribPointer(this.attrPos, 4, gl.FLOAT, false, 0, 0); + } + + if (this.attrNor != -1 && d.bindNor()) { + gl.enableVertexAttribArray(this.attrNor); + gl.vertexAttribPointer(this.attrNor, 4, gl.FLOAT, false, 0, 0); + } + + d.bindIdx(); + gl.drawElements(d.drawMode(), d.elemCount(), gl.UNSIGNED_INT, 0); + + if (this.attrPos != -1) gl.disableVertexAttribArray(this.attrPos); + if (this.attrNor != -1) gl.disableVertexAttribArray(this.attrNor); + } +}; + +export default ShaderProgram; diff --git a/src/shaders/biome-frag.glsl b/src/shaders/biome-frag.glsl new file mode 100644 index 00000000..99900962 --- /dev/null +++ b/src/shaders/biome-frag.glsl @@ -0,0 +1,372 @@ +#version 300 es + +precision highp float; + +uniform mat4 u_Model; +uniform vec4 u_Color; // The color with which to render this instance of geometry. +uniform float u_Hot; +uniform float u_Dry; +uniform float u_Octavity; +uniform vec3 u_Camera; +// These are the interpolated values out of the rasterizer, so you can't know +// their specific values without knowing the vertices that contributed to them +in vec4 fs_Pos; +in vec4 fs_Nor; +in vec4 fs_LightVec; +in vec4 fs_Col; + +out vec4 out_Col; // This is the final output color that you will see on your + // screen for the pixel that is currently being processed. + +vec3 rgb(float r, float g, float b) { + return vec3(r / 255.0, g / 255.0, b / 255.0); +} + +float random(vec3 st) { + float p1 = fract(sin(dot(st.xy, + vec2(12.9898,78.233))) + * 43758.5453123); + float p2 = fract(sin(dot(st.yz, + vec2(12.9898,78.233))) + * 43758.5453123);; + return fract(sin(dot(vec2(p1, p2), + vec2(12.9898,78.233))) + * 43758.5453123); +} +vec4 permute(vec4 x){return mod(((x*34.0)+1.0)*x, 289.0);} +vec4 taylorInvSqrt(vec4 r){return 1.79284291400159 - 0.85373472095314 * r;} + +float snoise(vec3 v){ + const vec2 C = vec2(1.0/6.0, 1.0/3.0) ; + const vec4 D = vec4(0.0, 0.5, 1.0, 2.0); + +// First corner + vec3 i = floor(v + dot(v, C.yyy) ); + vec3 x0 = v - i + dot(i, C.xxx) ; + +// Other corners + vec3 g = step(x0.yzx, x0.xyz); + vec3 l = 1.0 - g; + vec3 i1 = min( g.xyz, l.zxy ); + vec3 i2 = max( g.xyz, l.zxy ); + + // x0 = x0 - 0. + 0.0 * C + vec3 x1 = x0 - i1 + 1.0 * C.xxx; + vec3 x2 = x0 - i2 + 2.0 * C.xxx; + vec3 x3 = x0 - 1. + 3.0 * C.xxx; + +// Permutations + i = mod(i, 289.0 ); + vec4 p = permute( permute( permute( + i.z + vec4(0.0, i1.z, i2.z, 1.0 )) + + i.y + vec4(0.0, i1.y, i2.y, 1.0 )) + + i.x + vec4(0.0, i1.x, i2.x, 1.0 )); + +// Gradients +// ( N*N points uniformly over a square, mapped onto an octahedron.) + float n_ = 1.0/7.0; // N=7 + vec3 ns = n_ * D.wyz - D.xzx; + + vec4 j = p - 49.0 * floor(p * ns.z *ns.z); // mod(p,N*N) + + vec4 x_ = floor(j * ns.z); + vec4 y_ = floor(j - 7.0 * x_ ); // mod(j,N) + + vec4 x = x_ *ns.x + ns.yyyy; + vec4 y = y_ *ns.x + ns.yyyy; + vec4 h = 1.0 - abs(x) - abs(y); + + vec4 b0 = vec4( x.xy, y.xy ); + vec4 b1 = vec4( x.zw, y.zw ); + + vec4 s0 = floor(b0)*2.0 + 1.0; + vec4 s1 = floor(b1)*2.0 + 1.0; + vec4 sh = -step(h, vec4(0.0)); + + vec4 a0 = b0.xzyw + s0.xzyw*sh.xxyy ; + vec4 a1 = b1.xzyw + s1.xzyw*sh.zzww ; + + vec3 p0 = vec3(a0.xy,h.x); + vec3 p1 = vec3(a0.zw,h.y); + vec3 p2 = vec3(a1.xy,h.z); + vec3 p3 = vec3(a1.zw,h.w); + +//Normalise gradients + vec4 norm = taylorInvSqrt(vec4(dot(p0,p0), dot(p1,p1), dot(p2, p2), dot(p3,p3))); + p0 *= norm.x; + p1 *= norm.y; + p2 *= norm.z; + p3 *= norm.w; + +// Mix final noise value + vec4 m = max(0.6 - vec4(dot(x0,x0), dot(x1,x1), dot(x2,x2), dot(x3,x3)), 0.0); + m = m * m; + return 42.0 * dot( m*m, vec4( dot(p0,x0), dot(p1,x1), + dot(p2,x2), dot(p3,x3) ) ); + // return vec3(m.xyz); +} + +// Classic Perlin 3D Noise +// by Stefan Gustavson +// +vec3 fade(vec3 t) {return t*t*t*(t*(t*6.0-15.0)+10.0);} + +float cnoise(vec3 P){ + vec3 Pi0 = floor(P); // Integer part for indexing + vec3 Pi1 = Pi0 + vec3(1.0); // Integer part + 1 + Pi0 = mod(Pi0, 289.0); + Pi1 = mod(Pi1, 289.0); + vec3 Pf0 = fract(P); // Fractional part for interpolation + vec3 Pf1 = Pf0 - vec3(1.0); // Fractional part - 1.0 + vec4 ix = vec4(Pi0.x, Pi1.x, Pi0.x, Pi1.x); + vec4 iy = vec4(Pi0.yy, Pi1.yy); + vec4 iz0 = Pi0.zzzz; + vec4 iz1 = Pi1.zzzz; + + vec4 ixy = permute(permute(ix) + iy); + vec4 ixy0 = permute(ixy + iz0); + vec4 ixy1 = permute(ixy + iz1); + + vec4 gx0 = ixy0 / 7.0; + vec4 gy0 = fract(floor(gx0) / 7.0) - 0.5; + gx0 = fract(gx0); + vec4 gz0 = vec4(0.5) - abs(gx0) - abs(gy0); + vec4 sz0 = step(gz0, vec4(0.0)); + gx0 -= sz0 * (step(0.0, gx0) - 0.5); + gy0 -= sz0 * (step(0.0, gy0) - 0.5); + + vec4 gx1 = ixy1 / 7.0; + vec4 gy1 = fract(floor(gx1) / 7.0) - 0.5; + gx1 = fract(gx1); + vec4 gz1 = vec4(0.5) - abs(gx1) - abs(gy1); + vec4 sz1 = step(gz1, vec4(0.0)); + gx1 -= sz1 * (step(0.0, gx1) - 0.5); + gy1 -= sz1 * (step(0.0, gy1) - 0.5); + + vec3 g000 = vec3(gx0.x,gy0.x,gz0.x); + vec3 g100 = vec3(gx0.y,gy0.y,gz0.y); + vec3 g010 = vec3(gx0.z,gy0.z,gz0.z); + vec3 g110 = vec3(gx0.w,gy0.w,gz0.w); + vec3 g001 = vec3(gx1.x,gy1.x,gz1.x); + vec3 g101 = vec3(gx1.y,gy1.y,gz1.y); + vec3 g011 = vec3(gx1.z,gy1.z,gz1.z); + vec3 g111 = vec3(gx1.w,gy1.w,gz1.w); + + vec4 norm0 = taylorInvSqrt(vec4(dot(g000, g000), dot(g010, g010), dot(g100, g100), dot(g110, g110))); + g000 *= norm0.x; + g010 *= norm0.y; + g100 *= norm0.z; + g110 *= norm0.w; + vec4 norm1 = taylorInvSqrt(vec4(dot(g001, g001), dot(g011, g011), dot(g101, g101), dot(g111, g111))); + g001 *= norm1.x; + g011 *= norm1.y; + g101 *= norm1.z; + g111 *= norm1.w; + + float n000 = dot(g000, Pf0); + float n100 = dot(g100, vec3(Pf1.x, Pf0.yz)); + float n010 = dot(g010, vec3(Pf0.x, Pf1.y, Pf0.z)); + float n110 = dot(g110, vec3(Pf1.xy, Pf0.z)); + float n001 = dot(g001, vec3(Pf0.xy, Pf1.z)); + float n101 = dot(g101, vec3(Pf1.x, Pf0.y, Pf1.z)); + float n011 = dot(g011, vec3(Pf0.x, Pf1.yz)); + float n111 = dot(g111, Pf1); + + vec3 fade_xyz = fade(Pf0); + vec4 n_z = mix(vec4(n000, n100, n010, n110), vec4(n001, n101, n011, n111), fade_xyz.z); + vec2 n_yz = mix(n_z.xy, n_z.zw, fade_xyz.y); + float n_xyz = mix(n_yz.x, n_yz.y, fade_xyz.x); + return 2.2 * n_xyz; +} + +float getBias(float time, float bias) +{ + return (time / ((((1.0 / bias) - 2.0) * (1.0 - time)) + 1.0)); +} + +float getGain(float time, float gain) +{ + if (time < 0.5) + return getBias(time * 2.0, gain) / 2.0; + else + return getBias(time * 2.0 - 1.0,1.0 - gain) / 2.0 + 0.5; +} + +float hash(float p) { p = fract(p * 0.011); p *= p + 7.5; p *= p + p; return fract(p); } +float hash(vec2 p) {vec3 p3 = fract(vec3(p.xyx) * 0.13); p3 += dot(p3, p3.yzx + 3.333); return fract((p3.x + p3.y) * p3.z); } + +float noise1d(float x) { + float i = floor(x); + float f = fract(x); + float u = f * f * (3.0 - 2.0 * f); + return mix(hash(i), hash(i + 1.0), u); +} + +float mod289(float x){return x - floor(x * (1.0 / 289.0)) * 289.0;} +vec4 mod289(vec4 x){return x - floor(x * (1.0 / 289.0)) * 289.0;} +vec4 perm(vec4 x){return mod289(((x * 34.0) + 1.0) * x);} + +float noise3d(vec3 p){ + vec3 a = floor(p); + vec3 d = p - a; + d = d * d * (3.0 - 2.0 * d); + + vec4 b = a.xxyy + vec4(0.0, 1.0, 0.0, 1.0); + vec4 k1 = perm(b.xyxy); + vec4 k2 = perm(k1.xyxy + b.zzww); + + vec4 c = k2 + a.zzzz; + vec4 k3 = perm(c); + vec4 k4 = perm(c + 1.0); + + vec4 o1 = fract(k3 * (1.0 / 41.0)); + vec4 o2 = fract(k4 * (1.0 / 41.0)); + + vec4 o3 = o2 * d.z + o1 * (1.0 - d.z); + vec2 o4 = o3.yw * d.x + o3.xz * (1.0 - d.x); + + return o4.y * d.y + o4.x * (1.0 - d.y); +} + +const int NUM_NOISE_OCTAVES_S_BASE = 0; +const int NUM_NOISE_OCTAVES_C_BASE = 0; +const int NUM_NOISE_OCTAVES_N_BASE = 0; +const int NUM_NOISE_OCTAVES_1D_BASE = 0; + +float sfbm(vec3 x) { + int NUM_NOISE_OCTAVES_S = NUM_NOISE_OCTAVES_S_BASE + int(u_Octavity); + float v = 0.0; + float a = 0.5; + vec3 shift = vec3(100); + for (int i = 0; i < NUM_NOISE_OCTAVES_S; ++i) { + v += a * snoise(x); + x = x * 2.0 + shift; + a *= 0.5; + } + return v; +} +// perlin fbm +float cfbm(vec3 x) { + int NUM_NOISE_OCTAVES_C = NUM_NOISE_OCTAVES_C_BASE + int(u_Octavity); + float v = 0.0; + float a = 0.5; + vec3 shift = vec3(100); + for (int i = 0; i < NUM_NOISE_OCTAVES_C; ++i) { + v += a * cnoise(x); + x = x * 2.0 + shift; + a *= 0.5; + } + return v; +} + +float nfbm(vec3 x) { + int NUM_NOISE_OCTAVES_N = NUM_NOISE_OCTAVES_N_BASE + int(u_Octavity); + float v = 0.0; + float a = 0.5; + vec3 shift = vec3(100); + for (int i = 0; i < NUM_NOISE_OCTAVES_N; ++i) { + v += a * noise3d(x); + x = x * 2.0 + shift; + a *= 0.5; + } + return v; +} + +float fbm1d(float x) { + int NUM_NOISE_OCTAVES_1D = NUM_NOISE_OCTAVES_1D_BASE + int(u_Octavity); + float v = 0.0; + float a = 0.5; + float shift = float(100); + for (int i = 0; i < NUM_NOISE_OCTAVES_1D; ++i) { + v += a * noise1d(x); + x = x * 2.0 + shift; + a *= 0.5; + } + return v; +} + +vec3 palette( in float t, in vec3 a, in vec3 b, in vec3 c, in vec3 d ) +{ + return a + b*cos( 6.28318*(c*t+d) ); +} + +// bool inOcean(float height) { +// return height < u_Ocean; +// } + +void main() +{ + vec4 H = vec4(u_Camera.x, u_Camera.y, u_Camera.z, 1.0f) + fs_LightVec; + H /= 2.f; + + float specInt = max(pow(dot(normalize(H), normalize(fs_Nor)), 100.f), 0.f); + // float specInt = 0.f; + // Material base color (before shading) + vec4 diffuseColor = u_Color; + + // Calculate the diffuse term for Lambert shading + float diffuseTerm = dot(normalize(fs_Nor), normalize(fs_LightVec)); + // Avoid negative lighting values + diffuseTerm = clamp(diffuseTerm, 0.0, 1.0); + + float ambientTerm = 0.1; + + float lightIntensity = diffuseTerm + ambientTerm; //Add a small float value to the color multiplier + //to simulate ambient lighting. This ensures that faces that are not + //lit by our point light are not completely black. + + // Compute final shaded color + // out_Col = vec4(diffuseColor.rgb * lightIntensity, diffuseColor.a); + + vec3 bioNois1Input = fs_Pos.xyz * 0.5f; + vec3 bioNois2Input = fs_Pos.xyz * 0.5f; + + // figure out biomes by thresholds + float bioNois1 = snoise(bioNois1Input); + float bioNois2 = cnoise(bioNois2Input); + float bioNois1Thresh = u_Hot; + float bioNois2Thresh = u_Dry; + vec3 surfaceColor; + if (bioNois1 > bioNois1Thresh) { + if (bioNois2 > bioNois2Thresh) { + float t = getGain(bioNois1, 0.6); + vec3 a = vec3(0.500, 0.500, 0.000); + vec3 b = vec3(0.500, 0.500, 0.000); + vec3 c = vec3(0.500, 0.500, 0.000); + vec3 d = vec3(0.500, 0.000, 0.000); + + surfaceColor = palette(t, a, b, c, d); + } else { + float t = getGain(bioNois2, 0.75); + vec3 a = vec3(3.138, 0.500, 0.500); + vec3 b = vec3(0.500, 0.500, 0.500); + vec3 c = vec3(3.138, 0.448, 0.667); + vec3 d = vec3(0.800, 1.000, 0.333); + surfaceColor = palette(t, a, b, c, d); + } + } else { + if (bioNois2 > bioNois2Thresh) { + float t = getGain(bioNois1, 0.75); + vec3 a = vec3(0.938, 0.328, 0.718); + vec3 b = vec3(0.659, 0.438, 0.328); + vec3 c = vec3(0.388, 0.388, 0.296); + vec3 d = vec3(2.538, 2.478, 0.168); + surfaceColor = palette(t, a, b, c, d); + } else { + float t = getGain(bioNois2, 0.25); + vec3 a = vec3(0.660, 0.560, 0.680); + vec3 b = vec3(0.718, 0.438, 0.720); + vec3 c = vec3(0.520, 0.448, 0.520); + vec3 d = vec3(-0.430, -0.397, -0.083); + surfaceColor = palette(t, a, b, c, d); + } + } + + // vec4 modelposition = u_Model * fs_Pos; + // if (inOcean(length(modelposition.xyz))) { + // modelposition = u_Model * fs_Pos; + // } + // diffuseColor = surfaceColor; + out_Col = vec4(surfaceColor.rgb * surfaceColor.rgb * (lightIntensity + specInt), diffuseColor.a); + +} diff --git a/src/shaders/biome-vert.glsl b/src/shaders/biome-vert.glsl new file mode 100644 index 00000000..67c0e89c --- /dev/null +++ b/src/shaders/biome-vert.glsl @@ -0,0 +1,413 @@ +#version 300 es + +//This is a vertex shader. While it is called a "shader" due to outdated conventions, this file +//is used to apply matrix transformations to the arrays of vertex data passed to it. +//Since this code is run on your GPU, each vertex is transformed simultaneously. +//If it were run on your CPU, each vertex would have to be processed in a FOR loop, one at a time. +//This simultaneous transformation allows your program to run much faster, especially when rendering +//geometry with millions of vertices. + +uniform mat4 u_Model; // The matrix that defines the transformation of the + // object we're rendering. In this assignment, + // this will be the result of traversing your scene graph. + +uniform mat4 u_ModelInvTr; // The inverse transpose of the model matrix. + // This allows us to transform the object's normals properly + // if the object has been non-uniformly scaled. + +uniform mat4 u_ViewProj; // The matrix that defines the camera's transformation. + // We've written a static matrix for you to use for HW2, + // but in HW3 you'll have to generate one yourself + +uniform float u_Time; +uniform float u_Dry; +uniform float u_Hot; +uniform float u_Octavity; +uniform vec3 u_Camera; + +in vec4 vs_Pos; // The array of vertex positions passed to the shader + +in vec4 vs_Nor; // The array of vertex normals passed to the shader + +in vec4 vs_Col; // The array of vertex colors passed to the shader. + +out vec4 fs_Pos; +out vec4 fs_Nor; // The array of normals that has been transformed by u_ModelInvTr. This is implicitly passed to the fragment shader. +out vec4 fs_LightVec; // The direction in which our virtual light lies, relative to each vertex. This is implicitly passed to the fragment shader. +out vec4 fs_Col; // The color of each vertex. This is implicitly passed to the fragment shader. + +vec4 lightPos = vec4(3, 4, 6, 1); //The position of our virtual light, which is used to compute the shading of + //the geometry in the fragment shader. + + +mat4 rotationMatrix(vec3 axis, float angle) +{ + axis = normalize(axis); + float s = sin(angle); + float c = cos(angle); + float oc = 1.0 - c; + + return mat4(oc * axis.x * axis.x + c, oc * axis.x * axis.y - axis.z * s, oc * axis.z * axis.x + axis.y * s, 0.0, + oc * axis.x * axis.y + axis.z * s, oc * axis.y * axis.y + c, oc * axis.y * axis.z - axis.x * s, 0.0, + oc * axis.z * axis.x - axis.y * s, oc * axis.y * axis.z + axis.x * s, oc * axis.z * axis.z + c, 0.0, + 0.0, 0.0, 0.0, 1.0); +} + +vec2 rotatePoint2d(vec2 uv, vec2 center, float angle) +{ + vec2 rotatedPoint = vec2(uv.x - center.x, uv.y - center.y); + float newX = cos(angle) * rotatedPoint.x - sin(angle) * rotatedPoint.y; + rotatedPoint.y = sin(angle) * rotatedPoint.x + cos(angle) * rotatedPoint.y; + rotatedPoint.x = newX; + return rotatedPoint; +} + +vec3 rgb(float r, float g, float b) { + return vec3(r / 255.0, g / 255.0, b / 255.0); +} + +vec4 permute(vec4 x){return mod(((x*34.0)+1.0)*x, 289.0);} +vec4 taylorInvSqrt(vec4 r){return 1.79284291400159 - 0.85373472095314 * r;} + +float snoise(vec3 v){ + const vec2 C = vec2(1.0/6.0, 1.0/3.0) ; + const vec4 D = vec4(0.0, 0.5, 1.0, 2.0); + +// First corner + vec3 i = floor(v + dot(v, C.yyy) ); + vec3 x0 = v - i + dot(i, C.xxx) ; + +// Other corners + vec3 g = step(x0.yzx, x0.xyz); + vec3 l = 1.0 - g; + vec3 i1 = min( g.xyz, l.zxy ); + vec3 i2 = max( g.xyz, l.zxy ); + + // x0 = x0 - 0. + 0.0 * C + vec3 x1 = x0 - i1 + 1.0 * C.xxx; + vec3 x2 = x0 - i2 + 2.0 * C.xxx; + vec3 x3 = x0 - 1. + 3.0 * C.xxx; + +// Permutations + i = mod(i, 289.0 ); + vec4 p = permute( permute( permute( + i.z + vec4(0.0, i1.z, i2.z, 1.0 )) + + i.y + vec4(0.0, i1.y, i2.y, 1.0 )) + + i.x + vec4(0.0, i1.x, i2.x, 1.0 )); + +// Gradients +// ( N*N points uniformly over a square, mapped onto an octahedron.) + float n_ = 1.0/7.0; // N=7 + vec3 ns = n_ * D.wyz - D.xzx; + + vec4 j = p - 49.0 * floor(p * ns.z *ns.z); // mod(p,N*N) + + vec4 x_ = floor(j * ns.z); + vec4 y_ = floor(j - 7.0 * x_ ); // mod(j,N) + + vec4 x = x_ *ns.x + ns.yyyy; + vec4 y = y_ *ns.x + ns.yyyy; + vec4 h = 1.0 - abs(x) - abs(y); + + vec4 b0 = vec4( x.xy, y.xy ); + vec4 b1 = vec4( x.zw, y.zw ); + + vec4 s0 = floor(b0)*2.0 + 1.0; + vec4 s1 = floor(b1)*2.0 + 1.0; + vec4 sh = -step(h, vec4(0.0)); + + vec4 a0 = b0.xzyw + s0.xzyw*sh.xxyy ; + vec4 a1 = b1.xzyw + s1.xzyw*sh.zzww ; + + vec3 p0 = vec3(a0.xy,h.x); + vec3 p1 = vec3(a0.zw,h.y); + vec3 p2 = vec3(a1.xy,h.z); + vec3 p3 = vec3(a1.zw,h.w); + +//Normalise gradients + vec4 norm = taylorInvSqrt(vec4(dot(p0,p0), dot(p1,p1), dot(p2, p2), dot(p3,p3))); + p0 *= norm.x; + p1 *= norm.y; + p2 *= norm.z; + p3 *= norm.w; + +// Mix final noise value + vec4 m = max(0.6 - vec4(dot(x0,x0), dot(x1,x1), dot(x2,x2), dot(x3,x3)), 0.0); + m = m * m; + return 42.0 * dot( m*m, vec4( dot(p0,x0), dot(p1,x1), + dot(p2,x2), dot(p3,x3) ) ); + // return vec3(m.xyz); +} + +// Classic Perlin 3D Noise +// by Stefan Gustavson +// +vec3 fade(vec3 t) {return t*t*t*(t*(t*6.0-15.0)+10.0);} + +float cnoise(vec3 P){ + vec3 Pi0 = floor(P); // Integer part for indexing + vec3 Pi1 = Pi0 + vec3(1.0); // Integer part + 1 + Pi0 = mod(Pi0, 289.0); + Pi1 = mod(Pi1, 289.0); + vec3 Pf0 = fract(P); // Fractional part for interpolation + vec3 Pf1 = Pf0 - vec3(1.0); // Fractional part - 1.0 + vec4 ix = vec4(Pi0.x, Pi1.x, Pi0.x, Pi1.x); + vec4 iy = vec4(Pi0.yy, Pi1.yy); + vec4 iz0 = Pi0.zzzz; + vec4 iz1 = Pi1.zzzz; + + vec4 ixy = permute(permute(ix) + iy); + vec4 ixy0 = permute(ixy + iz0); + vec4 ixy1 = permute(ixy + iz1); + + vec4 gx0 = ixy0 / 7.0; + vec4 gy0 = fract(floor(gx0) / 7.0) - 0.5; + gx0 = fract(gx0); + vec4 gz0 = vec4(0.5) - abs(gx0) - abs(gy0); + vec4 sz0 = step(gz0, vec4(0.0)); + gx0 -= sz0 * (step(0.0, gx0) - 0.5); + gy0 -= sz0 * (step(0.0, gy0) - 0.5); + + vec4 gx1 = ixy1 / 7.0; + vec4 gy1 = fract(floor(gx1) / 7.0) - 0.5; + gx1 = fract(gx1); + vec4 gz1 = vec4(0.5) - abs(gx1) - abs(gy1); + vec4 sz1 = step(gz1, vec4(0.0)); + gx1 -= sz1 * (step(0.0, gx1) - 0.5); + gy1 -= sz1 * (step(0.0, gy1) - 0.5); + + vec3 g000 = vec3(gx0.x,gy0.x,gz0.x); + vec3 g100 = vec3(gx0.y,gy0.y,gz0.y); + vec3 g010 = vec3(gx0.z,gy0.z,gz0.z); + vec3 g110 = vec3(gx0.w,gy0.w,gz0.w); + vec3 g001 = vec3(gx1.x,gy1.x,gz1.x); + vec3 g101 = vec3(gx1.y,gy1.y,gz1.y); + vec3 g011 = vec3(gx1.z,gy1.z,gz1.z); + vec3 g111 = vec3(gx1.w,gy1.w,gz1.w); + + vec4 norm0 = taylorInvSqrt(vec4(dot(g000, g000), dot(g010, g010), dot(g100, g100), dot(g110, g110))); + g000 *= norm0.x; + g010 *= norm0.y; + g100 *= norm0.z; + g110 *= norm0.w; + vec4 norm1 = taylorInvSqrt(vec4(dot(g001, g001), dot(g011, g011), dot(g101, g101), dot(g111, g111))); + g001 *= norm1.x; + g011 *= norm1.y; + g101 *= norm1.z; + g111 *= norm1.w; + + float n000 = dot(g000, Pf0); + float n100 = dot(g100, vec3(Pf1.x, Pf0.yz)); + float n010 = dot(g010, vec3(Pf0.x, Pf1.y, Pf0.z)); + float n110 = dot(g110, vec3(Pf1.xy, Pf0.z)); + float n001 = dot(g001, vec3(Pf0.xy, Pf1.z)); + float n101 = dot(g101, vec3(Pf1.x, Pf0.y, Pf1.z)); + float n011 = dot(g011, vec3(Pf0.x, Pf1.yz)); + float n111 = dot(g111, Pf1); + + vec3 fade_xyz = fade(Pf0); + vec4 n_z = mix(vec4(n000, n100, n010, n110), vec4(n001, n101, n011, n111), fade_xyz.z); + vec2 n_yz = mix(n_z.xy, n_z.zw, fade_xyz.y); + float n_xyz = mix(n_yz.x, n_yz.y, fade_xyz.x); + return 2.2 * n_xyz; +} + +float getBias(float time, float bias) +{ + return (time / ((((1.0 / bias) - 2.0) * (1.0 - time)) + 1.0)); +} + +float getGain(float time, float gain) +{ + if (time < 0.5) + return getBias(time * 2.0, gain) / 2.0; + else + return getBias(time * 2.0 - 1.0,1.0 - gain) / 2.0 + 0.5; +} + +float hash(float p) { p = fract(p * 0.011); p *= p + 7.5; p *= p + p; return fract(p); } +float hash(vec2 p) {vec3 p3 = fract(vec3(p.xyx) * 0.13); p3 += dot(p3, p3.yzx + 3.333); return fract((p3.x + p3.y) * p3.z); } + +float noise1d(float x) { + float i = floor(x); + float f = fract(x); + float u = f * f * (3.0 - 2.0 * f); + return mix(hash(i), hash(i + 1.0), u); +} + +float mod289(float x){return x - floor(x * (1.0 / 289.0)) * 289.0;} +vec4 mod289(vec4 x){return x - floor(x * (1.0 / 289.0)) * 289.0;} +vec4 perm(vec4 x){return mod289(((x * 34.0) + 1.0) * x);} + +float noise3d(vec3 p){ + vec3 a = floor(p); + vec3 d = p - a; + d = d * d * (3.0 - 2.0 * d); + + vec4 b = a.xxyy + vec4(0.0, 1.0, 0.0, 1.0); + vec4 k1 = perm(b.xyxy); + vec4 k2 = perm(k1.xyxy + b.zzww); + + vec4 c = k2 + a.zzzz; + vec4 k3 = perm(c); + vec4 k4 = perm(c + 1.0); + + vec4 o1 = fract(k3 * (1.0 / 41.0)); + vec4 o2 = fract(k4 * (1.0 / 41.0)); + + vec4 o3 = o2 * d.z + o1 * (1.0 - d.z); + vec2 o4 = o3.yw * d.x + o3.xz * (1.0 - d.x); + + return o4.y * d.y + o4.x * (1.0 - d.y); +} + +const int NUM_NOISE_OCTAVES_S_BASE = 0; +const int NUM_NOISE_OCTAVES_C_BASE = 0; +const int NUM_NOISE_OCTAVES_N_BASE = 0; +const int NUM_NOISE_OCTAVES_1D_BASE = 0; + +float sfbm(vec3 x) { + int NUM_NOISE_OCTAVES_S = NUM_NOISE_OCTAVES_S_BASE + int(u_Octavity); + float v = 0.0; + float a = 0.5; + vec3 shift = vec3(100); + for (int i = 0; i < NUM_NOISE_OCTAVES_S; ++i) { + v += a * snoise(x); + x = x * 2.0 + shift; + a *= 0.5; + } + return v; +} +// perlin fbm +float cfbm(vec3 x) { + int NUM_NOISE_OCTAVES_C = NUM_NOISE_OCTAVES_C_BASE + int(u_Octavity); + float v = 0.0; + float a = 0.5; + vec3 shift = vec3(100); + for (int i = 0; i < NUM_NOISE_OCTAVES_C; ++i) { + v += a * cnoise(x); + x = x * 2.0 + shift; + a *= 0.5; + } + return v; +} + +float nfbm(vec3 x) { + int NUM_NOISE_OCTAVES_N = NUM_NOISE_OCTAVES_N_BASE + int(u_Octavity); + float v = 0.0; + float a = 0.5; + vec3 shift = vec3(100); + for (int i = 0; i < NUM_NOISE_OCTAVES_N; ++i) { + v += a * noise3d(x); + x = x * 2.0 + shift; + a *= 0.5; + } + return v; +} + +float fbm1d(float x) { + int NUM_NOISE_OCTAVES_1D = NUM_NOISE_OCTAVES_1D_BASE + int(u_Octavity); + float v = 0.0; + float a = 0.5; + float shift = float(100); + for (int i = 0; i < NUM_NOISE_OCTAVES_1D; ++i) { + v += a * noise1d(x); + x = x * 2.0 + shift; + a *= 0.5; + } + return v; +} + +// bool inOcean(float offset) { + // return offset <= u_Ocean; +// return false; +// } + +void main() +{ + fs_Col = vs_Col; // Pass the vertex colors to the fragment shader for interpolation + + mat3 invTranspose = mat3(u_ModelInvTr); + fs_Nor = vec4(invTranspose * vec3(vs_Nor), 0); // Pass the vertex normals to the fragment shader for interpolation. + // Transform the geometry's normals by the inverse transpose of the + // model matrix. This is necessary to ensure the normals remain + // perpendicular to the surface after the surface is transformed by + // the model matrix. + + + vec4 modelposition = u_Model * vs_Pos; // Temporarily store the transformed vertex positions for use below + + fs_LightVec = lightPos - modelposition; // Compute the direction in which the light source lies + fs_LightVec *= rotationMatrix(vec3(0.f, 1.f, 0.f), u_Time * 1.f); + // gl_Position = u_ViewProj * modelposition;// gl_Position is a built-in variable of OpenGL which is + // used to render the final positions of the geometry's vertices + + vec4 baseLvl = vs_Nor; + + vec3 bioNois1Input = vs_Pos.xyz * 0.5f; + vec3 bioNois2Input = vs_Pos.xyz * 0.5f; + + // figure out biomes by thresholds + float bioNois1 = snoise(bioNois1Input); // average temperature + float bioNois2 = cnoise(bioNois2Input); // level of dryness + float bioNois1Thresh = u_Hot; + float bioNois2Thresh = u_Dry; + if (bioNois1 > bioNois1Thresh) { + if (bioNois2 > bioNois2Thresh) { + vec3 noiseInput = vs_Pos.xyz; + float noise = sfbm(noiseInput.xyz); + // noise = smoothstep(length(baseLvl), 2.f, noise); + vec4 offAmt = noise * baseLvl; + // if (inOcean(offAmt.x)) { + // offAmt = vec4(u_Ocean) * baseLvl; + // } + modelposition += offAmt; + } else { + const float heightMax = 0.11f; + + vec3 noiseInput = vs_Pos.xyz; + float noise = nfbm(noiseInput.xyz); + // noise = noise - 0.5f; + // noise = mix(0.f, heightMax, noise); + // noise = smoothstep(-0.1f, heightMax, noise); + // getBias(noise, 0.01f); + vec4 offAmt = noise * baseLvl; + // if (inOcean(offAmt.x)) { + // offAmt = vec4(u_Ocean) * baseLvl; + // } + modelposition += offAmt; + } + } else { + if (bioNois2 > bioNois2Thresh) { + vec3 noiseInput = vs_Pos.xyz; + float noise = cfbm(noiseInput.xyz); + vec4 offAmt = noise * baseLvl; + // if (inOcean(offAmt.x)) { + // offAmt = vec4(u_Ocean) * baseLvl; + // } + modelposition += offAmt; + } else { + vec3 noiseInput = vs_Pos.xyz; + float noise = snoise(noiseInput); + vec4 offAmt = noise * baseLvl; + // if (inOcean(offAmt.x)) { + // offAmt = vec4(u_Ocean) * baseLvl; + // } + modelposition += offAmt; + } + } + + gl_Position = u_ViewProj * rotationMatrix(vec3(0.f, 1.f, 0.f), u_Time) * modelposition; + // vec3 noiseInput = vs_Pos.xyz; + // noiseInput *= 1.0f; + + // float noise = sfbm(noiseInput.xyz); + // float noise = cfbm(noiseInput.xyz); + + // offAmt = noise * baseLvl; + // modelposition += offAmt; + + // gl_Position = u_ViewProj * modelposition; + + fs_Pos = vs_Pos; +} diff --git a/src/shaders/custom-frag.glsl b/src/shaders/custom-frag.glsl new file mode 100644 index 00000000..56fac464 --- /dev/null +++ b/src/shaders/custom-frag.glsl @@ -0,0 +1,138 @@ +#version 300 es + +precision highp float; + +uniform vec4 u_Color; // The color with which to render this instance of geometry. + +// These are the interpolated values out of the rasterizer, so you can't know +// their specific values without knowing the vertices that contributed to them +in vec4 fs_Pos; +in vec4 fs_Nor; +in vec4 fs_LightVec; +in vec4 fs_Col; + +out vec4 out_Col; // This is the final output color that you will see on your + // screen for the pixel that is currently being processed. + +// Simplex 3D Noise +// by Ian McEwan, Ashima Arts +// +float random(vec3 st) { + float p1 = fract(sin(dot(st.xy, + vec2(12.9898,78.233))) + * 43758.5453123); + float p2 = fract(sin(dot(st.yz, + vec2(12.9898,78.233))) + * 43758.5453123);; + return fract(sin(dot(vec2(p1, p2), + vec2(12.9898,78.233))) + * 43758.5453123); +} +vec4 permute(vec4 x){return mod(((x*34.0)+1.0)*x, 289.0);} +vec4 taylorInvSqrt(vec4 r){return 1.79284291400159 - 0.85373472095314 * r;} + +float snoise(vec3 v){ + const vec2 C = vec2(1.0/6.0, 1.0/3.0) ; + const vec4 D = vec4(0.0, 0.5, 1.0, 2.0); + +// First corner + vec3 i = floor(v + dot(v, C.yyy) ); + vec3 x0 = v - i + dot(i, C.xxx) ; + +// Other corners + vec3 g = step(x0.yzx, x0.xyz); + vec3 l = 1.0 - g; + vec3 i1 = min( g.xyz, l.zxy ); + vec3 i2 = max( g.xyz, l.zxy ); + + // x0 = x0 - 0. + 0.0 * C + vec3 x1 = x0 - i1 + 1.0 * C.xxx; + vec3 x2 = x0 - i2 + 2.0 * C.xxx; + vec3 x3 = x0 - 1. + 3.0 * C.xxx; + +// Permutations + i = mod(i, 289.0 ); + vec4 p = permute( permute( permute( + i.z + vec4(0.0, i1.z, i2.z, 1.0 )) + + i.y + vec4(0.0, i1.y, i2.y, 1.0 )) + + i.x + vec4(0.0, i1.x, i2.x, 1.0 )); + +// Gradients +// ( N*N points uniformly over a square, mapped onto an octahedron.) + float n_ = 1.0/7.0; // N=7 + vec3 ns = n_ * D.wyz - D.xzx; + + vec4 j = p - 49.0 * floor(p * ns.z *ns.z); // mod(p,N*N) + + vec4 x_ = floor(j * ns.z); + vec4 y_ = floor(j - 7.0 * x_ ); // mod(j,N) + + vec4 x = x_ *ns.x + ns.yyyy; + vec4 y = y_ *ns.x + ns.yyyy; + vec4 h = 1.0 - abs(x) - abs(y); + + vec4 b0 = vec4( x.xy, y.xy ); + vec4 b1 = vec4( x.zw, y.zw ); + + vec4 s0 = floor(b0)*2.0 + 1.0; + vec4 s1 = floor(b1)*2.0 + 1.0; + vec4 sh = -step(h, vec4(0.0)); + + vec4 a0 = b0.xzyw + s0.xzyw*sh.xxyy ; + vec4 a1 = b1.xzyw + s1.xzyw*sh.zzww ; + + vec3 p0 = vec3(a0.xy,h.x); + vec3 p1 = vec3(a0.zw,h.y); + vec3 p2 = vec3(a1.xy,h.z); + vec3 p3 = vec3(a1.zw,h.w); + +//Normalise gradients + vec4 norm = taylorInvSqrt(vec4(dot(p0,p0), dot(p1,p1), dot(p2, p2), dot(p3,p3))); + p0 *= norm.x; + p1 *= norm.y; + p2 *= norm.z; + p3 *= norm.w; + +// Mix final noise value + vec4 m = max(0.6 - vec4(dot(x0,x0), dot(x1,x1), dot(x2,x2), dot(x3,x3)), 0.0); + m = m * m; + return 42.0 * dot( m*m, vec4( dot(p0,x0), dot(p1,x1), + dot(p2,x2), dot(p3,x3) ) ); +} +void main() +{ + vec4 col = u_Color; + float val = snoise(fs_Pos.xyz); + //if (val > 0.0 && val < 1000.0) { + //if (val < 0.0 && val > -0.245) { + if (false) { + out_Col = col; + } else { + float rand = random(fs_Pos.xyz); + float r; + if (col.r < 0.5) { + r = mix(col.r, 0.5, val); + } else { + r = mix(0.5, col.r, val); + } + float g; + if (col.g < 0.5) { + g = mix(col.g, 0.5, val); + } else { + g = mix(0.5, col.g, val); + } + float b; + if (col.b < 0.5) { + b = mix(col.b, 0.5, val); + } else { + b = mix(0.5, col.b, val); + } + //float r = col.r * val; + //float r = smoothstep(col.r, rand, val); + //float g = col.g * val; + //float g = smoothstep(col.g, rand, val); + //float b = col.b * val; + //float b = smoothstep(col.b, rand, val); + out_Col = vec4(r, g, b, 1); + } +} diff --git a/src/shaders/custom-vert.glsl b/src/shaders/custom-vert.glsl new file mode 100644 index 00000000..a5c66d4c --- /dev/null +++ b/src/shaders/custom-vert.glsl @@ -0,0 +1,83 @@ +#version 300 es + +//This is a vertex shader. While it is called a "shader" due to outdated conventions, this file +//is used to apply matrix transformations to the arrays of vertex data passed to it. +//Since this code is run on your GPU, each vertex is transformed simultaneously. +//If it were run on your CPU, each vertex would have to be processed in a FOR loop, one at a time. +//This simultaneous transformation allows your program to run much faster, especially when rendering +//geometry with millions of vertices. + +uniform mat4 u_Model; // The matrix that defines the transformation of the + // object we're rendering. In this assignment, + // this will be the result of traversing your scene graph. + +uniform mat4 u_ModelInvTr; // The inverse transpose of the model matrix. + // This allows us to transform the object's normals properly + // if the object has been non-uniformly scaled. + +uniform mat4 u_ViewProj; // The matrix that defines the camera's transformation. + // We've written a static matrix for you to use for HW2, + // but in HW3 you'll have to generate one yourself + +uniform float u_Time; + +in vec4 vs_Pos; // The array of vertex positions passed to the shader + +in vec4 vs_Nor; // The array of vertex normals passed to the shader + +in vec4 vs_Col; // The array of vertex colors passed to the shader. + +out vec4 fs_Pos; +out vec4 fs_Nor; // The array of normals that has been transformed by u_ModelInvTr. This is implicitly passed to the fragment shader. +out vec4 fs_LightVec; // The direction in which our virtual light lies, relative to each vertex. This is implicitly passed to the fragment shader. +out vec4 fs_Col; // The color of each vertex. This is implicitly passed to the fragment shader. + +const vec4 lightPos = vec4(5, 5, 3, 1); //The position of our virtual light, which is used to compute the shading of + //the geometry in the fragment shader. + +vec2 rotatePoint2d(vec2 uv, vec2 center, float angle) +{ + vec2 rotatedPoint = vec2(uv.x - center.x, uv.y - center.y); + float newX = cos(angle) * rotatedPoint.x - sin(angle) * rotatedPoint.y; + rotatedPoint.y = sin(angle) * rotatedPoint.x + cos(angle) * rotatedPoint.y; + rotatedPoint.x = newX; + return rotatedPoint; +} + +void main() +{ + fs_Pos = vs_Pos; + fs_Col = vs_Col; // Pass the vertex colors to the fragment shader for interpolation + + mat3 invTranspose = mat3(u_ModelInvTr); + fs_Nor = vec4(invTranspose * vec3(vs_Nor), 0); // Pass the vertex normals to the fragment shader for interpolation. + // Transform the geometry's normals by the inverse transpose of the + // model matrix. This is necessary to ensure the normals remain + // perpendicular to the surface after the surface is transformed by + // the model matrix. + + vec4 morph = sin(u_Time * 0.05) * vs_Pos - sin(u_Time * 0.05) + * ((cos(u_Time * 0.075) * normalize(vs_Pos) + + sin(u_Time * 0.075) * normalize(vs_Pos))); + morph.w = 1.0; + + vec4 modelposition = u_Model * vs_Pos; // Temporarily store the transformed vertex positions for use below + + //mat4 rotX = mat4(cos(u_Time), -sin(u_Time), 0., 0., + // sin(u_Time), cos(u_Time, 0., 0., + // 0., 0., 1., 0. + // 0., 0., 0., 1.)); + float r = length(vs_Pos); + vec2 rot = rotatePoint2d(vs_Pos.xy, vec2(0.f, 0.f), r * sin(r * cos(r + 10.0f) + u_Time) + u_Time); + + //modelposition.x = modelposition.x * (sin(u_Time * 0.05) + 2.0) * 0.5; + //modelposition.y = modelposition.y * (cos(u_Time * 0.05) + 2.0) * 0.5; + //modelposition.z = modelposition.z * (sin(u_Time * 0.05) + 2.0) * 0.5; + //modelposition = modelposition * rotX; + //modelposition = u_Model * morph; + modelposition = vec4(rot, modelposition.z, modelposition.w); + fs_LightVec = lightPos - modelposition; // Compute the direction in which the light source lies + //modelposition = u_Model * vs_Pos * u_Time; + gl_Position = u_ViewProj * modelposition;// gl_Position is a built-in variable of OpenGL which is + // used to render the final positions of the geometry's vertices +} diff --git a/src/shaders/lambert-frag.glsl b/src/shaders/lambert-frag.glsl new file mode 100644 index 00000000..2415b2b3 --- /dev/null +++ b/src/shaders/lambert-frag.glsl @@ -0,0 +1,43 @@ +#version 300 es + +// This is a fragment shader. If you've opened this file first, please +// open and read lambert.vert.glsl before reading on. +// Unlike the vertex shader, the fragment shader actually does compute +// the shading of geometry. For every pixel in your program's output +// screen, the fragment shader is run for every bit of geometry that +// particular pixel overlaps. By implicitly interpolating the position +// data passed into the fragment shader by the vertex shader, the fragment shader +// can compute what color to apply to its pixel based on things like vertex +// position, light position, and vertex color. +precision highp float; + +uniform vec4 u_Color; // The color with which to render this instance of geometry. + +// These are the interpolated values out of the rasterizer, so you can't know +// their specific values without knowing the vertices that contributed to them +in vec4 fs_Nor; +in vec4 fs_LightVec; +in vec4 fs_Col; + +out vec4 out_Col; // This is the final output color that you will see on your + // screen for the pixel that is currently being processed. + +void main() +{ + // Material base color (before shading) + vec4 diffuseColor = u_Color; + + // Calculate the diffuse term for Lambert shading + float diffuseTerm = dot(normalize(fs_Nor), normalize(fs_LightVec)); + // Avoid negative lighting values + diffuseTerm = clamp(diffuseTerm, 0.0, 1.0); + + float ambientTerm = 0.2; + + float lightIntensity = diffuseTerm + ambientTerm; //Add a small float value to the color multiplier + //to simulate ambient lighting. This ensures that faces that are not + //lit by our point light are not completely black. + + // Compute final shaded color + out_Col = vec4(diffuseColor.rgb * lightIntensity, diffuseColor.a); +} diff --git a/src/shaders/lambert-vert.glsl b/src/shaders/lambert-vert.glsl new file mode 100644 index 00000000..7f95a374 --- /dev/null +++ b/src/shaders/lambert-vert.glsl @@ -0,0 +1,53 @@ +#version 300 es + +//This is a vertex shader. While it is called a "shader" due to outdated conventions, this file +//is used to apply matrix transformations to the arrays of vertex data passed to it. +//Since this code is run on your GPU, each vertex is transformed simultaneously. +//If it were run on your CPU, each vertex would have to be processed in a FOR loop, one at a time. +//This simultaneous transformation allows your program to run much faster, especially when rendering +//geometry with millions of vertices. + +uniform mat4 u_Model; // The matrix that defines the transformation of the + // object we're rendering. In this assignment, + // this will be the result of traversing your scene graph. + +uniform mat4 u_ModelInvTr; // The inverse transpose of the model matrix. + // This allows us to transform the object's normals properly + // if the object has been non-uniformly scaled. + +uniform mat4 u_ViewProj; // The matrix that defines the camera's transformation. + // We've written a static matrix for you to use for HW2, + // but in HW3 you'll have to generate one yourself + +in vec4 vs_Pos; // The array of vertex positions passed to the shader + +in vec4 vs_Nor; // The array of vertex normals passed to the shader + +in vec4 vs_Col; // The array of vertex colors passed to the shader. + +out vec4 fs_Nor; // The array of normals that has been transformed by u_ModelInvTr. This is implicitly passed to the fragment shader. +out vec4 fs_LightVec; // The direction in which our virtual light lies, relative to each vertex. This is implicitly passed to the fragment shader. +out vec4 fs_Col; // The color of each vertex. This is implicitly passed to the fragment shader. + +const vec4 lightPos = vec4(5, 5, 3, 1); //The position of our virtual light, which is used to compute the shading of + //the geometry in the fragment shader. + +void main() +{ + fs_Col = vs_Col; // Pass the vertex colors to the fragment shader for interpolation + + mat3 invTranspose = mat3(u_ModelInvTr); + fs_Nor = vec4(invTranspose * vec3(vs_Nor), 0); // Pass the vertex normals to the fragment shader for interpolation. + // Transform the geometry's normals by the inverse transpose of the + // model matrix. This is necessary to ensure the normals remain + // perpendicular to the surface after the surface is transformed by + // the model matrix. + + + vec4 modelposition = u_Model * vs_Pos; // Temporarily store the transformed vertex positions for use below + + fs_LightVec = lightPos - modelposition; // Compute the direction in which the light source lies + + gl_Position = u_ViewProj * modelposition;// gl_Position is a built-in variable of OpenGL which is + // used to render the final positions of the geometry's vertices +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 00000000..79efea76 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,11 @@ +{ + "compilerOptions": { + "outDir": "./dist", + "sourceMap": true, + "noImplicitAny": true, + "module": "es6", + "target": "es6", + "allowJs": true, + "moduleResolution": "node" + } +} diff --git a/webpack.config.js b/webpack.config.js new file mode 100644 index 00000000..2cce33bb --- /dev/null +++ b/webpack.config.js @@ -0,0 +1,37 @@ +const path = require('path'); + +module.exports = { + mode: process.env.NODE_ENV === 'production' ? 'production' : 'development', + entry: path.resolve(__dirname, "src/main"), + output: { + path: path.resolve(__dirname, "dist"), + filename: "bundle.js", + publicPath: '/', + }, + module: { + rules: [ + { + test: /\.ts$/, + use: 'ts-loader', + exclude: /node_modules/ + }, + { + test: /\.glsl$/, + loader: 'webpack-glsl-loader' + }, + ] + }, + resolve: { + extensions: ['.ts', '.js' ], + }, + devtool: 'source-map', + devServer: { + port: 5660, + static: { + directory: path.join(__dirname, 'dist'), + }, + client: { + overlay: true, + } + }, +};