From 53879f93f65bafb0123f40123336e6b55dc0113a Mon Sep 17 00:00:00 2001 From: hli605 Date: Mon, 20 Sep 2021 21:15:17 -0400 Subject: [PATCH 1/5] merge with hw0 --- .gitignore | 64 + dist/index.html | 20 + package-lock.json | 3120 ++++++++++++++++++++++++++++ package.json | 22 + src/Camera.ts | 41 + src/geometry/Icosphere.ts | 179 ++ src/geometry/Square.ts | 47 + src/globals.ts | 5 + src/main.ts | 103 + src/rendering/gl/Drawable.ts | 67 + src/rendering/gl/OpenGLRenderer.ts | 42 + src/rendering/gl/ShaderProgram.ts | 109 + src/shaders/lambert-frag.glsl | 43 + src/shaders/lambert-vert.glsl | 53 + tsconfig.json | 11 + webpack.config.js | 37 + 16 files changed, 3963 insertions(+) create mode 100644 .gitignore 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/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/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/.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/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/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..65a9461c --- /dev/null +++ b/src/main.ts @@ -0,0 +1,103 @@ +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 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: 5, + 'Load Scene': loadScene, // A function pointer, essentially +}; + +let icosphere: Icosphere; +let square: Square; +let prevTesselations: number = 5; + +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(); +} + +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, 'Load Scene'); + + // 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')), + ]); + + // This function will be called every frame + function tick() { + 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(); + } + renderer.render(camera, lambert, [ + icosphere, + // square, + ]); + 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..7e527c25 --- /dev/null +++ b/src/rendering/gl/OpenGLRenderer.ts @@ -0,0 +1,42 @@ +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, drawables: Array) { + let model = mat4.create(); + let viewProj = mat4.create(); + let color = vec4.fromValues(1, 0, 0, 1); + + mat4.identity(model); + mat4.multiply(viewProj, camera.projectionMatrix, camera.viewMatrix); + prog.setModelMatrix(model); + prog.setViewProjMatrix(viewProj); + prog.setGeometryColor(color); + + 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..67fef40e --- /dev/null +++ b/src/rendering/gl/ShaderProgram.ts @@ -0,0 +1,109 @@ +import {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; + + 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.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); + } + } + + 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/lambert-frag.glsl b/src/shaders/lambert-frag.glsl new file mode 100644 index 00000000..2b8e11b4 --- /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, 1); + + 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, + } + }, +}; From 3572311e3659e0512b9499d179c6d23473c8280d Mon Sep 17 00:00:00 2001 From: hli605 Date: Mon, 20 Sep 2021 21:21:41 -0400 Subject: [PATCH 2/5] gh-pages --- .github/workflows/build-and-deploy.yml | 39 ++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 .github/workflows/build-and-deploy.yml 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 From 327e1fcd2e37c812f9bce54a3f598acd415501c4 Mon Sep 17 00:00:00 2001 From: hli605 Date: Mon, 20 Sep 2021 21:30:44 -0400 Subject: [PATCH 3/5] pages purpose --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index c89dda1c..2ad2199f 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,7 @@ # CIS 566 Project 1: Noisy Planets +Haowei Li + ## Objective - Continue practicing WebGL and Typescript - Experiment with noise functions to procedurally generate the surface of a planet From d3563912d98ad5f0963a407c9c551cae28e420e3 Mon Sep 17 00:00:00 2001 From: hli605 Date: Tue, 21 Sep 2021 20:41:28 -0400 Subject: [PATCH 4/5] Completed except lighting --- .vs/ProjectSettings.json | 3 + .vs/VSWorkspaceState.json | 11 ++ .vs/hw01-noisy-planet/v16/.suo | Bin 0 -> 39936 bytes .vs/slnx.sqlite | Bin 0 -> 90112 bytes src/geometry/Cube.ts | 134 ++++++++++++++++++ src/main.ts | 212 +++++++++++++++++++---------- src/rendering/gl/OpenGLRenderer.ts | 67 ++++----- src/rendering/gl/ShaderProgram.ts | 211 ++++++++++++++++++---------- src/shaders/custom-frag.glsl | 46 +++++++ src/shaders/custom-vert.glsl | 144 ++++++++++++++++++++ 10 files changed, 650 insertions(+), 178 deletions(-) create mode 100644 .vs/ProjectSettings.json create mode 100644 .vs/VSWorkspaceState.json create mode 100644 .vs/hw01-noisy-planet/v16/.suo create mode 100644 .vs/slnx.sqlite create mode 100644 src/geometry/Cube.ts create mode 100644 src/shaders/custom-frag.glsl create mode 100644 src/shaders/custom-vert.glsl diff --git a/.vs/ProjectSettings.json b/.vs/ProjectSettings.json new file mode 100644 index 00000000..f8b48885 --- /dev/null +++ b/.vs/ProjectSettings.json @@ -0,0 +1,3 @@ +{ + "CurrentProjectSetting": null +} \ No newline at end of file diff --git a/.vs/VSWorkspaceState.json b/.vs/VSWorkspaceState.json new file mode 100644 index 00000000..bddb00f5 --- /dev/null +++ b/.vs/VSWorkspaceState.json @@ -0,0 +1,11 @@ +{ + "ExpandedNodes": [ + "", + "\\src", + "\\src\\rendering", + "\\src\\rendering\\gl", + "\\src\\shaders" + ], + "SelectedNode": "\\src\\main.ts", + "PreviewInSolutionExplorer": false +} \ No newline at end of file diff --git a/.vs/hw01-noisy-planet/v16/.suo b/.vs/hw01-noisy-planet/v16/.suo new file mode 100644 index 0000000000000000000000000000000000000000..210765a60b34be74cf633563ee69949c38723ea8 GIT binary patch literal 39936 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 UGs){)gq&cX%j+j-m*0y22b#`K6951J literal 0 HcmV?d00001 diff --git a/.vs/slnx.sqlite b/.vs/slnx.sqlite new file mode 100644 index 0000000000000000000000000000000000000000..4ff63ca87801291d0a1332a6d0023f7910b38f22 GIT binary patch literal 90112 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 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')), - ]); - - // This function will be called every frame - function tick() { - 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(); + // 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, 'Load Scene'); + gui.addColor(controls, 'DesaturateColor').onChange(setAllGeometryColor); + gui.add(controls, "DesaturatePercent", 0.0, 1.0).step(0.01).onChange(setDesatPercent); + gui.add(controls, "LandscapeHeight", 0.0, 5.0).step(0.1).onChange(setLandscapeHeight); + gui.add(controls, "TimeScale", 0.0, 5.0).step(0.1).onChange(setTimeScale); + gui.add(controls, "SandHeight", 0.1, 0.3).step(0.01).onChange(setSandHeight); + gui.add(controls, "GrassHeight", 0.3, 0.6).step(0.01).onChange(setGrassHeight); + gui.add(controls, "StoneHeight", 0.6, 0.9).step(0.01).onChange(setStoneHeight); + + // get canvas and webgl context + const canvas = document.getElementById('canvas'); + const gl = canvas.getContext('webgl2'); + if (!gl) { + alert('WebGL 2 not supported!'); } - renderer.render(camera, lambert, [ - icosphere, - // square, + // `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')), + ]); + lambert.setGeometryColor(vec4.fromValues(0, 1, 0, 1)); + + const custom = new ShaderProgram([ + new Shader(gl.VERTEX_SHADER, require('./shaders/custom-vert.glsl')), + new Shader(gl.FRAGMENT_SHADER, require('./shaders/custom-frag.glsl')), ]); - stats.end(); + custom.setGeometryColor(vec4.fromValues(1, 1, 1, 1)); + custom.setHeightScale(1.5); + custom.setTimeScale(1.0); + custom.setSandHeight(0.2); + custom.setGrassHeight(0.4); + custom.setStoneHeight(0.75); + + // This function will be called every frame + function tick() { + 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(); + } + + // Render with custom shader + renderer.render(camera, custom, [ + icosphere, + ]); + + // Render with Lambert shader + //renderer.render(camera, lambert, [ + // icosphere, + // square, + // cube, + //]); + + stats.end(); + + // Tell the browser to call `tick` again whenever it renders a new frame + requestAnimationFrame(tick); + } - // 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); - 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(); + + // Help function + function setAllGeometryColor() { + // lambert.setGeometryColor(vec4.fromValues(controls.DesaturateColor[0] / 255.0, controls.DesaturateColor[1] / 255.0, controls.DesaturateColor[2] / 255.0, 1)); + custom.setGeometryColor(vec4.fromValues(controls.DesaturateColor[0] / 255.0, controls.DesaturateColor[1] / 255.0, controls.DesaturateColor[2] / 255.0, 1)); + } + + function setDesatPercent() { + custom.setDesatPercent(controls.DesaturatePercent); + } + + function setLandscapeHeight() { + custom.setHeightScale(controls.LandscapeHeight); + } + + function setTimeScale() { + custom.setTimeScale(controls.TimeScale); + } - // Start the render loop - tick(); + function setSandHeight() { + custom.setSandHeight(controls.SandHeight); + } + + function setGrassHeight() { + custom.setGrassHeight(controls.GrassHeight); + } + + function setStoneHeight() { + custom.setStoneHeight(controls.StoneHeight); + } } main(); diff --git a/src/rendering/gl/OpenGLRenderer.ts b/src/rendering/gl/OpenGLRenderer.ts index 7e527c25..2e2e45d5 100644 --- a/src/rendering/gl/OpenGLRenderer.ts +++ b/src/rendering/gl/OpenGLRenderer.ts @@ -1,42 +1,45 @@ -import {mat4, vec4} from 'gl-matrix'; +import { mat4, vec4 } from 'gl-matrix'; import Drawable from './Drawable'; import Camera from '../../Camera'; -import {gl} from '../../globals'; +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, drawables: Array) { - let model = mat4.create(); - let viewProj = mat4.create(); - let color = vec4.fromValues(1, 0, 0, 1); - - mat4.identity(model); - mat4.multiply(viewProj, camera.projectionMatrix, camera.viewMatrix); - prog.setModelMatrix(model); - prog.setViewProjMatrix(viewProj); - prog.setGeometryColor(color); - - for (let drawable of drawables) { - prog.draw(drawable); + time: number; + + constructor(public canvas: HTMLCanvasElement) { + this.time = 0.0; + } + + 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, drawables: Array) { + let model = mat4.create(); + let viewProj = mat4.create(); + + mat4.identity(model); + mat4.multiply(viewProj, camera.projectionMatrix, camera.viewMatrix); + prog.setModelMatrix(model); + prog.setViewProjMatrix(viewProj); + prog.setTime(this.time); + this.time += 0.01; + + 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 index 67fef40e..e63ea56a 100644 --- a/src/rendering/gl/ShaderProgram.ts +++ b/src/rendering/gl/ShaderProgram.ts @@ -1,109 +1,172 @@ -import {vec4, mat4} from 'gl-matrix'; +import { vec4, mat4 } from 'gl-matrix'; import Drawable from './Drawable'; -import {gl} from '../../globals'; +import { gl } from '../../globals'; var activeProgram: WebGLProgram = null; export class Shader { - shader: WebGLShader; + shader: WebGLShader; - constructor(type: number, source: string) { - this.shader = gl.createShader(type); - gl.shaderSource(this.shader, source); - gl.compileShader(this.shader); + 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); + if (!gl.getShaderParameter(this.shader, gl.COMPILE_STATUS)) { + throw gl.getShaderInfoLog(this.shader); + } } - } }; class ShaderProgram { - prog: WebGLProgram; - - attrPos: number; - attrNor: number; - attrCol: number; - - unifModel: WebGLUniformLocation; - unifModelInvTr: WebGLUniformLocation; - unifViewProj: WebGLUniformLocation; - unifColor: WebGLUniformLocation; + prog: WebGLProgram; + + attrPos: number; + attrNor: number; + attrCol: number; + + unifModel: WebGLUniformLocation; + unifModelInvTr: WebGLUniformLocation; + unifViewProj: WebGLUniformLocation; + unifColor: WebGLUniformLocation; + unifTime: WebGLUniformLocation; + unifColorDesatPercent: WebGLUniformLocation; + unifHeightScale: WebGLUniformLocation; + unifTimeScale: WebGLUniformLocation; + unifSandHeight: WebGLUniformLocation; + unifGrassHeight: WebGLUniformLocation; + unifStoneHeight: 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.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"); + this.unifTime = gl.getUniformLocation(this.prog, "u_Time"); + this.unifColorDesatPercent = gl.getUniformLocation(this.prog, "u_DesatPercent"); + this.unifHeightScale = gl.getUniformLocation(this.prog, "u_heightScale"); + this.unifTimeScale = gl.getUniformLocation(this.prog, "u_timeScale"); + this.unifSandHeight = gl.getUniformLocation(this.prog, "u_sandHeight"); + this.unifGrassHeight = gl.getUniformLocation(this.prog, "u_grassHeight"); + this.unifStoneHeight = gl.getUniformLocation(this.prog, "u_stoneHeight"); + } - constructor(shaders: Array) { - this.prog = gl.createProgram(); + use() { + if (activeProgram !== this.prog) { + gl.useProgram(this.prog); + activeProgram = this.prog; + } + } - for (let shader of shaders) { - gl.attachShader(this.prog, shader.shader); + 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); + } } - gl.linkProgram(this.prog); - if (!gl.getProgramParameter(this.prog, gl.LINK_STATUS)) { - throw gl.getProgramInfoLog(this.prog); + + setViewProjMatrix(vp: mat4) { + this.use(); + if (this.unifViewProj !== -1) { + gl.uniformMatrix4fv(this.unifViewProj, false, vp); + } } - 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.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; + setGeometryColor(color: vec4) { + this.use(); + if (this.unifColor !== -1) { + gl.uniform4fv(this.unifColor, color); + } } - } - setModelMatrix(model: mat4) { - this.use(); - if (this.unifModel !== -1) { - gl.uniformMatrix4fv(this.unifModel, false, model); + setTime(time: number) { + this.use(); + if (this.unifTime !== -1) { + gl.uniform1f(this.unifTime, time); + } } - if (this.unifModelInvTr !== -1) { - let modelinvtr: mat4 = mat4.create(); - mat4.transpose(modelinvtr, model); - mat4.invert(modelinvtr, modelinvtr); - gl.uniformMatrix4fv(this.unifModelInvTr, false, modelinvtr); + setDesatPercent(desatPercent: number) { + this.use(); + if (this.unifColorDesatPercent !== -1) { + gl.uniform1f(this.unifColorDesatPercent, desatPercent); + } } - } - setViewProjMatrix(vp: mat4) { - this.use(); - if (this.unifViewProj !== -1) { - gl.uniformMatrix4fv(this.unifViewProj, false, vp); + setHeightScale(heightScale: number) { + this.use(); + if (this.unifHeightScale !== -1) { + gl.uniform1f(this.unifHeightScale, heightScale); + } } - } - setGeometryColor(color: vec4) { - this.use(); - if (this.unifColor !== -1) { - gl.uniform4fv(this.unifColor, color); + setTimeScale(timeScale: number) { + this.use(); + if (this.unifTimeScale !== -1) { + gl.uniform1f(this.unifTimeScale, timeScale); + } } - } - draw(d: Drawable) { - this.use(); + setSandHeight(sandHeight: number) { + this.use(); + if (this.unifSandHeight !== -1) { + gl.uniform1f(this.unifSandHeight, sandHeight); + } + } - if (this.attrPos != -1 && d.bindPos()) { - gl.enableVertexAttribArray(this.attrPos); - gl.vertexAttribPointer(this.attrPos, 4, gl.FLOAT, false, 0, 0); + setGrassHeight(grassHeight: number) { + this.use(); + if (this.unifGrassHeight !== -1) { + gl.uniform1f(this.unifGrassHeight, grassHeight); + } } - if (this.attrNor != -1 && d.bindNor()) { - gl.enableVertexAttribArray(this.attrNor); - gl.vertexAttribPointer(this.attrNor, 4, gl.FLOAT, false, 0, 0); + setStoneHeight(stoneHeight: number) { + this.use(); + if (this.unifStoneHeight !== -1) { + gl.uniform1f(this.unifStoneHeight, stoneHeight); + } } - d.bindIdx(); - gl.drawElements(d.drawMode(), d.elemCount(), gl.UNSIGNED_INT, 0); + 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); + } - if (this.attrPos != -1) gl.disableVertexAttribArray(this.attrPos); - if (this.attrNor != -1) gl.disableVertexAttribArray(this.attrNor); - } + 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/custom-frag.glsl b/src/shaders/custom-frag.glsl new file mode 100644 index 00000000..7f6cfa07 --- /dev/null +++ b/src/shaders/custom-frag.glsl @@ -0,0 +1,46 @@ +#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. +uniform float u_DesatPercent; + +// 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; +in vec4 fs_Pos; + +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. + +float bias(float b, float t) { + return (t/((((1.0/b)-2.0)*(1.0-t))+1.0)); +} + +float gain(float g, float t){ + if (t < 0.5){ + return bias(1.0-g, 2.0*t)/2.0; + } + else{ + return 1.0 - bias(1.0-g, 2.0-2.0*t)/2.0; + } +} + +void main() +{ + vec4 m_color = fs_Col; + + m_color = mix(m_color, u_Color, gain(0.1, u_DesatPercent)); + out_Col = vec4(m_color); +} diff --git a/src/shaders/custom-vert.glsl b/src/shaders/custom-vert.glsl new file mode 100644 index 00000000..14078b4b --- /dev/null +++ b/src/shaders/custom-vert.glsl @@ -0,0 +1,144 @@ +#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_heightScale; +uniform float u_timeScale; +uniform float u_sandHeight; +uniform float u_grassHeight; +uniform float u_stoneHeight; + +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. +out vec4 fs_Pos; + +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. + +vec4 mod289(vec4 x){return x - floor(x * (1.0 / 289.0)) * 289.0;} +vec4 random(vec4 x){return mod289(((x * 34.0) + 1.0) * x);} + +// Refer to a simple noise function online +float noise(vec3 pos){ + vec3 i = floor(pos); + vec3 f = fract(pos); + f = f * f * (3.0 - 2.0 * f); + + vec4 a = i.xxyy + vec4(0.0, 1.0, 0.0, 1.0); + vec4 k1 = random(a.xyxy); + vec4 k2 = random(k1.xyxy + a.zzww); + vec4 b = k2 + i.zzzz; + vec4 k3 = random(b); + vec4 k4 = random(b + 1.0); + + vec4 o1 = fract(k3 * (1.0 / 41.0)); + vec4 o2 = fract(k4 * (1.0 / 41.0)); + vec4 o3 = o2 * f.z + o1 * (1.0 - f.z); + vec2 o4 = o3.yw * f.x + o3.xz * (1.0 - f.x); + + return o4.y * f.y + o4.x * (1.0 - f.y); +} + +float fbm(vec3 pos) { + float noiseOutput = 0.0; + float amplitude = 0.5; + for (int i = 0; i < 6; i++) { + noiseOutput += amplitude * noise(pos); + pos = 2.0 * pos + vec3(100); + amplitude *= 0.5; + } + return noiseOutput; +} + +float bias(float b, float t) { + return (t/((((1.0/b)-2.0)*(1.0-t))+1.0)); +} + +float gain(float g, float t){ + if (t < 0.5){ + return bias(1.0-g, 2.0*t)/2.0; + } + else{ + return 1.0 - bias(1.0-g, 2.0-2.0*t)/2.0; + } +} + +void main() +{ + fs_Col = vs_Col; // Pass the vertex colors to the fragment shader for interpolation + vec4 temp_vPos = vs_Pos; + float temp_time = u_timeScale * u_Time; + + float noiseOutput = clamp((2.0 * fbm(temp_vPos.xyz) - 1.0), 0.0, 1.0) * u_heightScale; + temp_vPos.xyz += vs_Nor.xyz * noiseOutput; + + // biomes height assign + float oceanHeight_low = 0.1; + float oceanHeight_high = 0.15; + float oceanHeight = mix(oceanHeight_low, oceanHeight_high, sin(temp_time)); + + vec4 oceanColor = vec4(0.0, 0.41, 0.58, clamp(bias(0.4, ((sin(temp_time)+1.0)/4.0)+0.5), 0.8, 1.0)); + vec4 sandColor = vec4(1.0, 0.93, 0.678, 1.0); + vec4 grassColor = vec4(0.494, 0.784, 0.314, 1.0); + vec4 stoneColor = vec4(0.533, 0.549, 0.553, 1.0); + vec4 snowColor = vec4(1.0, 0.98, 0.98, 1.0); + + if (noiseOutput <= oceanHeight){ + float oceanToSand = smoothstep(0.0, oceanHeight, noiseOutput); + fs_Col = mix(oceanColor, sandColor, oceanToSand); + } + else if (noiseOutput <= u_sandHeight){ + float sandToGrass = smoothstep(oceanHeight, u_sandHeight, noiseOutput); + fs_Col = mix(sandColor, grassColor, sandToGrass); + } + else if (noiseOutput <= u_grassHeight){ + float grassToStone = smoothstep(u_sandHeight, u_grassHeight, noiseOutput); + fs_Col = mix(grassColor, stoneColor, grassToStone); + } + else if (noiseOutput <= u_stoneHeight){ + float stoneToSnow = smoothstep(u_grassHeight, u_stoneHeight, noiseOutput); + fs_Col = mix(stoneColor, snowColor, stoneToSnow); + } + else { + fs_Col = snowColor; + } + + 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 * temp_vPos; + fs_Pos = modelposition; + + 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 +} From 3639d66c4c40a580a49492b9fdeb91e8df218ce0 Mon Sep 17 00:00:00 2001 From: hli605 Date: Wed, 22 Sep 2021 23:09:53 -0400 Subject: [PATCH 5/5] final push --- .vs/VSWorkspaceState.json | 2 +- .vs/hw01-noisy-planet/v16/.suo | Bin 39936 -> 46592 bytes .vs/slnx.sqlite | Bin 90112 -> 90112 bytes MyPlanet1.png | Bin 0 -> 106517 bytes MyPlanetDesat1.png | Bin 0 -> 75761 bytes MyPlanetLambert.png | Bin 0 -> 74162 bytes README.md | 29 ++++++++++++++++++- src/main.ts | 18 ++++++++++-- src/rendering/gl/OpenGLRenderer.ts | 2 ++ src/rendering/gl/ShaderProgram.ts | 20 ++++++++++++- src/shaders/custom-frag.glsl | 44 +++++++++++++++++++++++++++-- src/shaders/custom-vert.glsl | 10 +++++++ 12 files changed, 117 insertions(+), 8 deletions(-) create mode 100644 MyPlanet1.png create mode 100644 MyPlanetDesat1.png create mode 100644 MyPlanetLambert.png diff --git a/.vs/VSWorkspaceState.json b/.vs/VSWorkspaceState.json index bddb00f5..a32fb914 100644 --- a/.vs/VSWorkspaceState.json +++ b/.vs/VSWorkspaceState.json @@ -6,6 +6,6 @@ "\\src\\rendering\\gl", "\\src\\shaders" ], - "SelectedNode": "\\src\\main.ts", + "SelectedNode": "\\src\\rendering\\gl\\OpenGLRenderer.ts", "PreviewInSolutionExplorer": false } \ No newline at end of file diff --git a/.vs/hw01-noisy-planet/v16/.suo b/.vs/hw01-noisy-planet/v16/.suo index 210765a60b34be74cf633563ee69949c38723ea8..8406595cf335022ad22e04894dd7e680d3b2c118 100644 GIT binary patch delta 4782 zcmdT{dt6iZ6~Dijga8ThkQ6CG0_Z1bqBk!dVl`r9QWdqbsV$C|0Y&gZcvu8UTWYNj zgdFh!-Bz^iKHGetx3k!-YiR9f?dmGEFF$J4I`{Z|YFl--Q#;GfNpdlwwzm81j~)2l z`+Mh{^EXEoENLu+3oJipuhyUCV#5eu@{WQ$LC_CC#c-}3U!NNc*NeH{x``KJw z_eV@i)02dHNj+oj2unbzk^axqZj>_XpttqWpof6aPdcH_0zUkbEkHI7f1a zB4{1S7$`Sg6O9MR9l{p*OYX}oPtl>7gbZDlq46Vxc1*jwrwTr2Wp1p!s`;F>>Qr@AzX_Z1Bt3Q z@C=hGlW>ImQT$=qRqVV2b0$v*d-Q|@k*k;_VhGen<)|20BDsLL6s`=91bN&b=+(zIX!fxBmgf_30LBj%zIYYUCxp%#pQb8T6B=at+T1ZP;&Ax8OEG7P+&=g z24118D5@-WR8<>FtBT4X{J|9P=n~*;LGTbG7mEQb+MQCPJ^1@e8?()yH1m!nFK!AC zFOVj5_YIBs>JPcW4-5M$3np>s1yRsvz7ISpHn(PKgkQ(_V?H6GK-*LT&ldKobG>7} z#}oJ>_p~>{rH6U&Xl-DT9ob)KVLR0lckC1uBdsLhiUI9Z$Mz{Hl2RnQIXJRUN`Y9^ z40skug;k^8WGZ6he=hPk*DjZn4dwa929sIOH)I!8I2{$JU`J?%-jd<#Kkildii%M8 z=xK_WTeu&c2ZybC@NAdD)zQ=8^$`z%Ym8ksKC~V6;T6J2~^>+J9~ON9DQq&Tl=`u;X>_P05JCM(DE` z;;zIg`1Zvgo|w+XQKGsI+dilr8wpmL%wTFi z9Aa2eQMAlao$suI!p;@pi@Z|JM#+|QW%z^`OJ;~!pYCI(*{{xcXxo+|wd&0#$ThB! z@_J(iyk$va)q>4wyZ1Xuw8P=iyilE($KXwgUPk7X2iL|NRZw~s4NZOtJ4p<#>vL3` z2HT?oCZXCe%V)4714d;Y>>P({reA1(9aFyl(fW7auU%f>JT>UXFV6}48uxx$KTU{v z!PNdn&tac-dbe5J*6rHQnts*(Xvor+R^=S*EsdNt=2Y>K+|BQmtu4H8EcLg&r|%b4 znT(Mj99U{DggZ^(O5Le_Bja-RE9HChhV4G_oVMk7qr&si`K1RfcL_*a}ULOm^E`dGql+ zh9F})lr!VsBju;Meu8I5PTD9xee5AsLa-(4hSD7$B;ci0m*le=D5a7zwREO-7VO4EQq6CLuH!rqAs1 z{8;kCWB6k(RU3**L05v6@fxxP&@4#+^@GWnT6BzIQn`m9~5C z{41~2j(hT@4EE=jesR*8V3JEAyT^*N?1>e_bQpqLOR353=;3(#K zgT;|rVkjytN;jlBO4Eu=X{I!zgO_`+fo+D156>I0H-5DVFQ!#^_0cFM6tA{0shqRl zwj?_uFf)!Vt8iAZ5zeZTeCOh#MUEZS08N zI_$(GBC_^ObUyn68KwJB(;5qZ&Xpm?<|5Z(g7whD0jD25IdU zA=x8nLCuxXJfEGOW=+emn;LgB`*bqZ-Azk{ZDtM+}87Vu5&sEe$b~- z9jKZWaG~wcci(W=@=RbUrEsx>hX!XYzT<^*ry5gSV?%1X-sDfxO?Rv73`(p`jQ;G| zfUCytG%=_$nJD)vZ{}XcfyO;iG5;uif1+C7U6T&38XfGci(x@RZ_RY(O%`Qvu`c}f z`U5LjigC4=PRgJxB@7<#I34=;FrSj-oL7se@GNLuXk>f*+Q_`cGkX^Ag{y0i2bvih zd{L>;^E4Tz_Z;%xJ02Bvy9dueTctFlh`h~vX=*rC9)`h{$KV>t!7bw^;&-T5L!hlo z!kE@uHz~-kGib672TiBOtF|l?sttN;n!ts1&7E|%!K)|NmgBI}m^h$`yGD)u112Q; z=-qvAiu#UGWw17N!pV&}%)K;=%6?ehG9Ip0o*3l1pKO{1U3IgtJQxoLs)s>hUE)1S zT~%fOZYvQU?}%sa&1o1MvfxU~6bRP_54^u<9S7apW)B?{aq&~d5NhTF>%kPVXq_Ys zCTZli#u#BzTPgeQ0Mk`B9J1PP@i8cOuDkoS39c=*>>hQ|@2y!Xl0$7q^{GzH(;vT` rRp5HhlUR!_bAl7>*zrdKo%7`ol9Etd4bfH02Z^^4lq_*r z8UisAO`)Qz<3j;8Ye_6+bAnj$OjaaikKZ(t&T1bJ}O5!6G65UV~<@N ztxyanYp~DYWC_=+u$LlA5Dz1&5Lt*@xToBRf(fwzu@HuZ*#q@i5EDx1Vm#%muV=9* zUJ{Rqj&DRq8exI->DUVqY6S6|upvVbZ+XwjI?{;eNhu!Jp^PkO5>yhU5fxt(6Z3Ja zxlHJJCemWIvp6?~U=b$}#GhBOKZ!Vncn$Fj#A(Dd0{)q1v%ZDG?-74MoJ0H(@h8MM zf^0AsP$SFIP2t3Qh`%5%Bi=`RfFKJYEGr+VUlvt_==0E}=%Xj$nqrNFL@Lh4VNz|T zC!p)0RdRX}>PV>Ydgdq&TwGj6|KGh4C%s{BsJGIB=LOJ{Sp{zh?BWgRq?Ljj={@ur z=u#mMB-Kb@@jQsG;NTr(YAH;sbx|V&6KWfZ#sq8vA*UMA3dSVNmr(KvPL%A7hN00M*k7&y zWsnh(YpVfMunCmeQt%z}!c9Y;ybZN{+Xkz*c_EhVi@M4gl0Kw(@W$DYD?m#~+2A!& zVlIH7V0NMZzdQegP)pWxUPc2#wtMkeT0S74C{k5~l!)36zg|)TL)$Yz>o7p9)snKA zD#N;%8P#{0=nrKVZWdHl`p=uk2QR;=GHx~PIQ{17F>lusdkq`j{hY$YQp368c@We4 zqSh6>B?wsqu)<}98EdVaX3!KVuDmA@%BzDj0-K1`83sOck4s36<)_7?I5>m%@2Qg0 zMwAyK_(=$PYe|quW2n4@KsM%=$)Eopc$5>C;;xC;qZ;a3t6{fK1)`G87-QMsJDdfN zJy#62XOuAL$dNg%Zdb3rp|!JlJ4_VijQog>7VR_T{Pm>vz+`0Rs9Q7jk~?pN+9l0Qp~vd6 zCl$SD>a1z$>x0YNbc05AUFhd^>(g^xyZdGO3-+=16}vAEuIoF6hcNk!(#DWFQ zmfRpwY-Eq1P0lv-EjwWP*qjvn*$P|O#hq+gmuaeVWk@bEn~nEW>-TSn|jtijQdRbp92TJjf0NF7BJMc^MPO%(2l zo+gw#;o#>U`2a;OV=LB53>Kbs0KAF;qsx4cfyH^zN@XW{IS8jA-v9#-9!!%qj; z>%+%r%{>Rkvz6a{2;ZS1Si56Ne)q{uN6L~%N*uwS-1%7v*Qdf~+sa_oCPq#kPLiCY z45uXCOne|g67WF#OZgB18+`t=ei#A;o13elVcjcAP}&RNygHxU*Fe4u#@E=fRIeRR zo$H@cb|8(X}M1%)CC>N>u|(QIL-JJd8PBILr6PX+7^Mc6&-3usL@o}6z{6p9dE z9tsck3~va_Q@IpP!H2OGODk7=kltNOEDF2J>g6gtnoqoxYpE*!rF^io-698hce9cF zr}B;Xv>K7PB~A$?FXTh4dt>Ieo4PtfZ5#7iIvRrc!Pd^!-d;SyK+ueFsfF-U2jP=O zE%`)cnRdQ#xtv`b%WTz$mdGPFC5WaW){II4YE%cW&Q2k0aMxzc&?JbE=U6%X( z1HN27O8;Vu5R@MfnikEc+Xk|YSQaHkFlA8=(jTDU*jqIK;$L~1yxVW&ZmCjHSrZ2{l^O301HY`?=yc;)I2MUTeX;0ZEH)U6Dz`c}w-f-rgV*o{ z{0=^i3l;m#8SHLDOu#g{D5W1iQ7ERf39%@GSDa=h4%IFvY=hgC3*jjktlSB=v?A+0 z5U{?bH0>S|Y|Dc3MjW=-&aF(Zq?AB<9k^q?nye z%SGRoXdtwl%UD)V?notXAB_wkFtsr(G$+sJkLRSkIA8U6;eX&=fjlOBDzRv-Q^*;J`Vz6!XjxUvh5hDlTbz~NNqZw&%GXTNES2e5uGjs zwh@lU7sUCroRaeySv?I_-r#o^~l-DiY^92O@h-G{(Uszs9uQztI(R^7@p&DhuLg-4> zgb5DHXF+l`u0?V_^qD&BT8gvcVvYn=)4N&`=pyrEr2MQX6^te)Mqm?-H=WO>i}Hz@ zkIqv%U44S#jM2Y5%h2fe38tg43*lubfwcqsG2S4cwSyQ zB;}76bb|sXJ@<3!Y1U3tu`rj<9a_wU4j1w{9cQ;7&<02<8f zS$gEF*>NM1Q({;a=a$4wdL2)vne1!bwoS^r z5?m%F@g#l7boXo}g5K1)7CrqzKRX3BG8z&;z^wt+$wuo~Lsj&%lZ|?vpHP(a+cv;| z9k348U&m^7(Z!A!R0dDo(ci<4*Ae<|tiQ?nyVH{(l8zVBpOj7m*bT1HR%ZLZ&gB*=JTr?8RZ+7 zM=9|7H$SZW`f_qNA{}FlzeYBGl~e9~`UH$Cl4Y}wUJ*7(FUm{#8$hLdVO0mG)Upng9A-(_td5w$b|pJvOb>{Z_zfv5Sh z$4VV`l!s@4pu)$Xq|CVR)zwjGH?!p2jH>_G3-|C(m0PRCQ4n?7)i)m_>&_*i&s4@& zSCUX>9>q(*ixU7>@Z0zXzJ~uxdhkE-AIO2;kN--J_Zt2g{t@}hJ%_)GSID1k87Ihz z&f~o}jc4%FB;zdJix_AUz$^6S0x#2-9h{}v_Vra|Z&mi-X925WUeaDK;@@Z*0i35A a0i07;X5dZ-SwIzO2WK?46?JU}_WU2gl4~sh delta 1610 zcmY*ZZD?Cn7(OStIZd`CZ<5;PCh3+NYMFyBA1$jmrM68!EM}~3jIGcvx$SOmv)+8{ zCS4t@w$ncqgenKUKb%PMhl08>f{wYdc0Xhe1sNz(p`r*n2Y#>*6x`HvZko>idG6sn z&-=XZdEa}^{EBUU#rA5@f-b+-)Wh(6<`0p^fn!cJ?)7-yW{j`c)Pod;0~<85?q4?C|A5I83_1@btmr6 zYRZ9=rLvOimCLg1w^`e<5%J@CEYYRdb6Bd}iMc%lAtX6ppmkl{m59{g6dNUiLfAo) z(_>1sTmt**?4kQNCa%yoQW9BTUQUH-%e9Bge^TMOsz3@66k{HmoEua0@~#sMqN-NX z>T7ONaI<1Um(|URaDbp)%;UhMd{ohg^n$9(IaW~PhJ{$Q*jH5Y1F8K=p2_H$z4rAQ zf_{RUS$wZ9&&XpMKg&j_w~-((wi8wJ)!f7eg2FuA@o8D#bnwt41hp_`aJ*0|PAZ$p z#(Lf@J1Ln}mh8-K&TNFcn{{RLDyK}Q(OYeBPR{08Q5*XKHj4<$qiTgQSu6dY z@&iHJc)dy?rQHtS`?;C(Aias8!JHBxpCwM7!r2 zBDGEbR%Yd}lbM1(HK7$|N;QJweWCT9h8zU#Kn_wajTiD0Sv7jBRLIwKUOPech_yl= zuWkA3m?zWk@9XZ}+ZW9ptr0=Oddi5RJU%6>$|j$%jm`BTw@WLGPt9#o_ymF)Sf-=d zQn}{nwN|r7Pizz}T382|QB=*AvueJeD>ZQgW+Pw*oSB>+t8H)LcfoZR!9Dm1zJoz% zb=`Hx+(G!728VpKbEt`3kq=yzyQ3~kh-)E*;6D5bx8YZ~2|u!!Rrm_Nq|r<(Qwl&+ zg^$b&=31t8#TMFG?E0$9qxCw(Vx#I`EtknB^p21&J2$U@3-0!=s*AWTx(0yPxay>L?jOWqI{4r?_EauC&@p=$qW``ZuM69(7>gcb zEr$JAGVaB&Wa9_C&EA+#pk1&c?Bo#U;Nd_x*fzc%PB) z#W6f$yxohh3!@1p)cWwSjR{HIxZZ~soUtuj|K#ap8i@ve25ak2s@+&f;_$}<_?95_ z%PjD>XK{~vT0NXG6C_Z=?=>R5IBw)pSiQYiZp4A0-Cp;{X5v diff --git a/MyPlanet1.png b/MyPlanet1.png new file mode 100644 index 0000000000000000000000000000000000000000..354b259a169b56eb1d114c567ea071f71c43ae71 GIT binary patch literal 106517 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�?%Ce>_FG8(2oec=vOABZS?^AwMI4@}U9 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

ZH_R+BGR7@DtNjj%K3F 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 literal 0 HcmV?d00001 diff --git a/MyPlanetLambert.png b/MyPlanetLambert.png new file mode 100644 index 0000000000000000000000000000000000000000..e00d59a376ce89c41e39c7f3e066cc77f1a712b9 GIT binary patch literal 74162 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 { this.prog = gl.createProgram(); @@ -62,6 +64,8 @@ class ShaderProgram { this.unifSandHeight = gl.getUniformLocation(this.prog, "u_sandHeight"); this.unifGrassHeight = gl.getUniformLocation(this.prog, "u_grassHeight"); this.unifStoneHeight = gl.getUniformLocation(this.prog, "u_stoneHeight"); + this.unifShader = gl.getUniformLocation(this.prog, "u_Shader"); + this.unifCameraPos = gl.getUniformLocation(this.prog, "u_CameraPos"); } use() { @@ -148,6 +152,20 @@ class ShaderProgram { } } + setShader(Shader: number) { + this.use(); + if (this.unifShader !== -1) { + gl.uniform1i(this.unifShader, Shader); + } + } + + setCameraPos(cameraPos: vec3) { + this.use(); + if (this.unifCameraPos !== -1) { + gl.uniform3fv(this.unifCameraPos, cameraPos); + } + } + draw(d: Drawable) { this.use(); diff --git a/src/shaders/custom-frag.glsl b/src/shaders/custom-frag.glsl index 7f6cfa07..99f59c3e 100644 --- a/src/shaders/custom-frag.glsl +++ b/src/shaders/custom-frag.glsl @@ -13,13 +13,16 @@ precision highp float; uniform vec4 u_Color; // The color with which to render this instance of geometry. uniform float u_DesatPercent; +uniform int u_Shader; // 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_ViewVec; in vec4 fs_LightVec; in vec4 fs_Col; in vec4 fs_Pos; +in float fs_Biome; 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. @@ -39,8 +42,45 @@ float gain(float g, float t){ void main() { - vec4 m_color = fs_Col; + vec3 temp_Normal = normalize(cross(dFdx(fs_Pos.xyz), dFdy(fs_Pos.xyz))); + + float ocean_spec = 0.8; + float sand_spec = 0.05; + float grass_spec = 0.1; + float stone_spec = 0.2; + float snow_spec = 1.0; + float Spec_Coeff; + if (fs_Biome == 1.0){ + Spec_Coeff = ocean_spec; + } + else if (fs_Biome == 2.0){ + Spec_Coeff = sand_spec; + } + else if (fs_Biome == 3.0){ + Spec_Coeff = grass_spec; + } + else if (fs_Biome == 4.0){ + Spec_Coeff = stone_spec; + } + else if (fs_Biome == 5.0){ + Spec_Coeff = snow_spec; + } + vec4 m_color = fs_Col; m_color = mix(m_color, u_Color, gain(0.1, u_DesatPercent)); - out_Col = vec4(m_color); + + float lightIntensity; + float diffuseTerm = dot(normalize(temp_Normal), normalize(fs_LightVec.xyz)); + diffuseTerm = clamp(diffuseTerm, 0.0, 1.0); + float ambientTerm = 0.2; + lightIntensity = diffuseTerm + ambientTerm; + + if (u_Shader == 1){ + out_Col = vec4(m_color.rgb * lightIntensity, m_color.a); + } + else { + vec3 HalfVec = normalize(fs_ViewVec.xyz + fs_LightVec.xyz); + vec3 specularTerm = Spec_Coeff * vec3(pow(clamp(dot(temp_Normal, HalfVec), 0.0, 1.0), 32.0)) * vec3(1.0); + out_Col = vec4((m_color.rgb + specularTerm) * lightIntensity, 1.0); + } } diff --git a/src/shaders/custom-vert.glsl b/src/shaders/custom-vert.glsl index 14078b4b..b93adae2 100644 --- a/src/shaders/custom-vert.glsl +++ b/src/shaders/custom-vert.glsl @@ -19,6 +19,7 @@ uniform mat4 u_ViewProj; // The matrix that defines the camera's transformati // We've written a static matrix for you to use for HW2, // but in HW3 you'll have to generate one yourself +uniform vec3 u_CameraPos; uniform float u_Time; uniform float u_heightScale; uniform float u_timeScale; @@ -36,6 +37,8 @@ out vec4 fs_Nor; // The array of normals that has been transformed by 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. out vec4 fs_Pos; +out vec4 fs_ViewVec; +out float fs_Biome; 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. @@ -111,20 +114,25 @@ void main() if (noiseOutput <= oceanHeight){ float oceanToSand = smoothstep(0.0, oceanHeight, noiseOutput); fs_Col = mix(oceanColor, sandColor, oceanToSand); + fs_Biome = 1.0; } else if (noiseOutput <= u_sandHeight){ float sandToGrass = smoothstep(oceanHeight, u_sandHeight, noiseOutput); fs_Col = mix(sandColor, grassColor, sandToGrass); + fs_Biome = 2.0; } else if (noiseOutput <= u_grassHeight){ float grassToStone = smoothstep(u_sandHeight, u_grassHeight, noiseOutput); fs_Col = mix(grassColor, stoneColor, grassToStone); + fs_Biome = 3.0; } else if (noiseOutput <= u_stoneHeight){ float stoneToSnow = smoothstep(u_grassHeight, u_stoneHeight, noiseOutput); fs_Col = mix(stoneColor, snowColor, stoneToSnow); + fs_Biome = 4.0; } else { + fs_Biome = 5.0; fs_Col = snowColor; } @@ -139,6 +147,8 @@ void main() fs_LightVec = lightPos - modelposition; // Compute the direction in which the light source lies + fs_ViewVec = vec4(mat3(inverse(u_Model)) * normalize(u_CameraPos - modelposition.xyz), length(u_CameraPos.xyz)); + 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 }