From 521e2a4eb1d240ba4db28d4a92921b22105c46c1 Mon Sep 17 00:00:00 2001 From: Jim Richter Date: Wed, 10 Mar 2021 01:20:22 +0100 Subject: [PATCH] second day --- Makefile | 6 +- view/package-lock.json | 1238 +++++++++++++++++ view/package.json | 4 + view/public/index.html | 8 +- view/public/worker.js | 29 + view/rollup.config.js | 11 +- view/src/App.svelte | 25 +- view/src/components/Analyzer.svelte | 78 ++ view/src/components/DropZone/index.svelte | 25 +- view/src/components/Editor/Compass.svelte | 2 + view/src/components/Editor/CustomOrbit.ts | 331 +++++ view/src/components/Editor/Editor.svelte | 77 + view/src/components/Editor/Orb.frag | 8 + view/src/components/Editor/Orb.vert | 10 + view/src/components/Editor/OrbView.ts | 136 ++ view/src/components/Editor/Painter.svelte | 358 +++++ view/src/components/Editor/ToolBox.svelte | 26 + view/src/components/Editor/TopBar.svelte | 78 ++ view/src/components/Toast/Toast.svelte | 4 +- view/src/components/Toast/ToastWrapper.svelte | 1 + view/src/helpers/BuffToImg.ts | 8 + view/src/helpers/CountPixels.ts | 18 + view/src/helpers/FileToImage.ts | 25 + view/src/helpers/index.ts | 3 + view/src/icons/Cross.svelte | 1 + view/src/icons/index.ts | 1 + view/src/ogl.d.ts | 489 +++++++ view/src/routes/editor.svelte | 18 + view/src/routes/error.svelte | 2 + view/src/routes/list.svelte | 143 +- view/src/routes/main.svelte | 41 +- view/src/stores/activeImage.ts | 7 - view/src/stores/images.ts | 44 +- view/src/stores/route.ts | 18 +- view/src/types.d.ts | 22 + view/tsconfig.json | 3 + 36 files changed, 3187 insertions(+), 111 deletions(-) create mode 100644 view/public/worker.js create mode 100644 view/src/components/Analyzer.svelte create mode 100644 view/src/components/Editor/Compass.svelte create mode 100644 view/src/components/Editor/CustomOrbit.ts create mode 100644 view/src/components/Editor/Editor.svelte create mode 100644 view/src/components/Editor/Orb.frag create mode 100644 view/src/components/Editor/Orb.vert create mode 100644 view/src/components/Editor/OrbView.ts create mode 100644 view/src/components/Editor/Painter.svelte create mode 100644 view/src/components/Editor/ToolBox.svelte create mode 100644 view/src/components/Editor/TopBar.svelte create mode 100644 view/src/helpers/BuffToImg.ts create mode 100644 view/src/helpers/CountPixels.ts create mode 100644 view/src/helpers/FileToImage.ts create mode 100644 view/src/helpers/index.ts create mode 100644 view/src/icons/index.ts create mode 100644 view/src/ogl.d.ts create mode 100644 view/src/routes/editor.svelte create mode 100644 view/src/routes/error.svelte delete mode 100644 view/src/stores/activeImage.ts create mode 100644 view/src/types.d.ts diff --git a/Makefile b/Makefile index 88b14f9..5542252 100755 --- a/Makefile +++ b/Makefile @@ -8,4 +8,8 @@ dev-server: cd server && gin run main.go dev-view: cd view && npm run dev - \ No newline at end of file + +build: build-view + +build-view: + cd view && npm run build \ No newline at end of file diff --git a/view/package-lock.json b/view/package-lock.json index af366a5..c5696dc 100755 --- a/view/package-lock.json +++ b/view/package-lock.json @@ -8,10 +8,12 @@ "name": "svelte-app", "version": "1.0.0", "dependencies": { + "ogl": "^0.0.65", "sirv-cli": "^1.0.0", "svelte-file-dropzone": "^0.0.15" }, "devDependencies": { + "@rollup/plugin-alias": "^3.1.2", "@rollup/plugin-commonjs": "^17.0.0", "@rollup/plugin-node-resolve": "^11.0.0", "@rollup/plugin-typescript": "^8.0.0", @@ -19,6 +21,8 @@ "idb": "^6.0.0", "rollup": "^2.3.4", "rollup-plugin-css-only": "^3.1.0", + "rollup-plugin-glslify": "^1.2.0", + "rollup-plugin-includepaths": "^0.2.4", "rollup-plugin-livereload": "^2.0.0", "rollup-plugin-svelte": "^7.0.0", "rollup-plugin-terser": "^7.0.0", @@ -55,11 +59,38 @@ "js-tokens": "^4.0.0" } }, + "node_modules/@choojs/findup": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@choojs/findup/-/findup-0.2.1.tgz", + "integrity": "sha512-YstAqNb0MCN8PjdLCDfRsBcGVRN41f3vgLvaI0IrIcBp4AqILRSS0DeWNGkicC+f/zRIPJLc+9RURVSepwvfBw==", + "dev": true, + "dependencies": { + "commander": "^2.15.1" + }, + "bin": { + "findup": "bin/findup.js" + } + }, "node_modules/@polka/url": { "version": "1.0.0-next.11", "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.11.tgz", "integrity": "sha512-3NsZsJIA/22P3QUyrEDNA2D133H4j224twJrdipXN38dpnIOzAbUDtOwkcJ5pXmn75w7LSQDjA4tO9dm1XlqlA==" }, + "node_modules/@rollup/plugin-alias": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@rollup/plugin-alias/-/plugin-alias-3.1.2.tgz", + "integrity": "sha512-wzDnQ6v7CcoRzS0qVwFPrFdYA4Qlr+ookA217Y2Z3DPZE1R8jrFNM3jvGgOf6o6DMjbnQIn5lCIJgHPe1Bt3uw==", + "dev": true, + "dependencies": { + "slash": "^3.0.0" + }, + "engines": { + "node": ">=8.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0" + } + }, "node_modules/@rollup/plugin-commonjs": { "version": "17.1.0", "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-17.1.0.tgz", @@ -184,6 +215,18 @@ "@types/node": "*" } }, + "node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", @@ -224,6 +267,16 @@ "node": ">=8" } }, + "node_modules/bl": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/bl/-/bl-2.2.1.tgz", + "integrity": "sha512-6Pesp1w0DEX1N550i/uGV/TqucVL4AM/pgThFSN/Qq9si1/DF9aIHs1BxD8V/QU0HoeHO6cQRTAuYnLPKq1e4g==", + "dev": true, + "dependencies": { + "readable-stream": "^2.3.5", + "safe-buffer": "^5.1.1" + } + }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -341,6 +394,21 @@ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true }, + "node_modules/concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "engines": [ + "node >= 0.8" + ], + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, "node_modules/console-clear": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/console-clear/-/console-clear-1.1.1.tgz", @@ -349,6 +417,18 @@ "node": ">=4" } }, + "node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "node_modules/deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, "node_modules/deepmerge": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", @@ -367,6 +447,27 @@ "node": ">=8" } }, + "node_modules/duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "dependencies": { + "once": "^1.4.0" + } + }, "node_modules/escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", @@ -376,12 +477,105 @@ "node": ">=0.8.0" } }, + "node_modules/escodegen": { + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", + "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", + "dev": true, + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=4.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/escodegen/node_modules/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, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, "node_modules/estree-walker": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", "dev": true }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/falafel": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/falafel/-/falafel-2.2.4.tgz", + "integrity": "sha512-0HXjo8XASWRmsS0X1EkhwEMZaD3Qvp7FfURwjLKjG1ghfRm/MGZl2r4cWUTv41KdNghTw4OUMmVtdGQp3+H+uQ==", + "dev": true, + "dependencies": { + "acorn": "^7.1.1", + "foreach": "^2.0.5", + "isarray": "^2.0.1", + "object-keys": "^1.0.6" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, "node_modules/file-selector": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/file-selector/-/file-selector-0.2.4.tgz", @@ -405,6 +599,22 @@ "node": ">=8" } }, + "node_modules/foreach": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", + "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=", + "dev": true + }, + "node_modules/from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -471,6 +681,214 @@ "node": ">= 6" } }, + "node_modules/glsl-inject-defines": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/glsl-inject-defines/-/glsl-inject-defines-1.0.3.tgz", + "integrity": "sha1-3RqswsF/yyvT/DJBHGYz0Ne2D9Q=", + "dev": true, + "dependencies": { + "glsl-token-inject-block": "^1.0.0", + "glsl-token-string": "^1.0.1", + "glsl-tokenizer": "^2.0.2" + } + }, + "node_modules/glsl-resolve": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/glsl-resolve/-/glsl-resolve-0.0.1.tgz", + "integrity": "sha1-iUvvc5ENeSyBtRQxgANdCnivdtM=", + "dev": true, + "dependencies": { + "resolve": "^0.6.1", + "xtend": "^2.1.2" + } + }, + "node_modules/glsl-resolve/node_modules/resolve": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-0.6.3.tgz", + "integrity": "sha1-3ZV5gufnNt699TtYpN2RdUV13UY=", + "dev": true + }, + "node_modules/glsl-resolve/node_modules/xtend": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.2.0.tgz", + "integrity": "sha1-7vax8ZjByN6vrYsXZaBNrUoBxak=", + "dev": true, + "engines": { + "node": ">=0.4" + } + }, + "node_modules/glsl-token-assignments": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/glsl-token-assignments/-/glsl-token-assignments-2.0.2.tgz", + "integrity": "sha1-pdgqt4SZwuimuDy2lJXm5mXOAZ8=", + "dev": true + }, + "node_modules/glsl-token-defines": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/glsl-token-defines/-/glsl-token-defines-1.0.0.tgz", + "integrity": "sha1-y4kqqVmTYjFyhHDU90AySJaX+p0=", + "dev": true, + "dependencies": { + "glsl-tokenizer": "^2.0.0" + } + }, + "node_modules/glsl-token-depth": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/glsl-token-depth/-/glsl-token-depth-1.1.2.tgz", + "integrity": "sha1-I8XjDuK9JViEtKKLyFC495HpXYQ=", + "dev": true + }, + "node_modules/glsl-token-descope": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/glsl-token-descope/-/glsl-token-descope-1.0.2.tgz", + "integrity": "sha1-D8kKsyYYa4L1l7LnfcniHvzTIHY=", + "dev": true, + "dependencies": { + "glsl-token-assignments": "^2.0.0", + "glsl-token-depth": "^1.1.0", + "glsl-token-properties": "^1.0.0", + "glsl-token-scope": "^1.1.0" + } + }, + "node_modules/glsl-token-inject-block": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/glsl-token-inject-block/-/glsl-token-inject-block-1.1.0.tgz", + "integrity": "sha1-4QFfWYDBCRgkraomJfHf3ovQADQ=", + "dev": true + }, + "node_modules/glsl-token-properties": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/glsl-token-properties/-/glsl-token-properties-1.0.1.tgz", + "integrity": "sha1-SD3D2Dnw1LXGFx0VkfJJvlPCip4=", + "dev": true + }, + "node_modules/glsl-token-scope": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/glsl-token-scope/-/glsl-token-scope-1.1.2.tgz", + "integrity": "sha1-oXKOeN8kRE+cuT/RjvD3VQOmQ7E=", + "dev": true + }, + "node_modules/glsl-token-string": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/glsl-token-string/-/glsl-token-string-1.0.1.tgz", + "integrity": "sha1-WUQdL4V958NEnJRWZgIezjWOSOw=", + "dev": true + }, + "node_modules/glsl-token-whitespace-trim": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/glsl-token-whitespace-trim/-/glsl-token-whitespace-trim-1.0.0.tgz", + "integrity": "sha1-RtHf6Yx1vX1QTAXX0RsbPpzJOxA=", + "dev": true + }, + "node_modules/glsl-tokenizer": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/glsl-tokenizer/-/glsl-tokenizer-2.1.5.tgz", + "integrity": "sha512-XSZEJ/i4dmz3Pmbnpsy3cKh7cotvFlBiZnDOwnj/05EwNp2XrhQ4XKJxT7/pDt4kp4YcpRSKz8eTV7S+mwV6MA==", + "dev": true, + "dependencies": { + "through2": "^0.6.3" + } + }, + "node_modules/glsl-tokenizer/node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "node_modules/glsl-tokenizer/node_modules/readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "node_modules/glsl-tokenizer/node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + }, + "node_modules/glsl-tokenizer/node_modules/through2": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", + "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", + "dev": true, + "dependencies": { + "readable-stream": ">=1.0.33-1 <1.1.0-0", + "xtend": ">=4.0.0 <4.1.0-0" + } + }, + "node_modules/glslify": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/glslify/-/glslify-7.1.1.tgz", + "integrity": "sha512-bud98CJ6kGZcP9Yxcsi7Iz647wuDz3oN+IZsjCRi5X1PI7t/xPKeL0mOwXJjo+CRZMqvq0CkSJiywCcY7kVYog==", + "dev": true, + "dependencies": { + "bl": "^2.2.1", + "concat-stream": "^1.5.2", + "duplexify": "^3.4.5", + "falafel": "^2.1.0", + "from2": "^2.3.0", + "glsl-resolve": "0.0.1", + "glsl-token-whitespace-trim": "^1.0.0", + "glslify-bundle": "^5.0.0", + "glslify-deps": "^1.2.5", + "minimist": "^1.2.5", + "resolve": "^1.1.5", + "stack-trace": "0.0.9", + "static-eval": "^2.0.5", + "through2": "^2.0.1", + "xtend": "^4.0.0" + }, + "bin": { + "glslify": "bin.js" + } + }, + "node_modules/glslify-bundle": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/glslify-bundle/-/glslify-bundle-5.1.1.tgz", + "integrity": "sha512-plaAOQPv62M1r3OsWf2UbjN0hUYAB7Aph5bfH58VxJZJhloRNbxOL9tl/7H71K7OLJoSJ2ZqWOKk3ttQ6wy24A==", + "dev": true, + "dependencies": { + "glsl-inject-defines": "^1.0.1", + "glsl-token-defines": "^1.0.0", + "glsl-token-depth": "^1.1.1", + "glsl-token-descope": "^1.0.2", + "glsl-token-scope": "^1.1.1", + "glsl-token-string": "^1.0.1", + "glsl-token-whitespace-trim": "^1.0.0", + "glsl-tokenizer": "^2.0.2", + "murmurhash-js": "^1.0.0", + "shallow-copy": "0.0.1" + } + }, + "node_modules/glslify-deps": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/glslify-deps/-/glslify-deps-1.3.2.tgz", + "integrity": "sha512-7S7IkHWygJRjcawveXQjRXLO2FTjijPDYC7QfZyAQanY+yGLCFHYnPtsGT9bdyHiwPTw/5a1m1M9hamT2aBpag==", + "dev": true, + "dependencies": { + "@choojs/findup": "^0.2.0", + "events": "^3.2.0", + "glsl-resolve": "0.0.1", + "glsl-tokenizer": "^2.0.0", + "graceful-fs": "^4.1.2", + "inherits": "^2.0.1", + "map-limit": "0.0.1", + "resolve": "^1.0.0" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", + "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", + "dev": true + }, "node_modules/has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -599,6 +1017,12 @@ "@types/estree": "*" } }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, "node_modules/jest-worker": { "version": "26.6.2", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", @@ -648,6 +1072,19 @@ "node": ">=6" } }, + "node_modules/levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "dependencies": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/livereload": { "version": "0.9.2", "resolved": "https://registry.npmjs.org/livereload/-/livereload-0.9.2.tgz", @@ -689,6 +1126,24 @@ "sourcemap-codec": "^1.4.4" } }, + "node_modules/map-limit": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/map-limit/-/map-limit-0.0.1.tgz", + "integrity": "sha1-63lhAxwPDo0AG/LVb6toXViCLzg=", + "dev": true, + "dependencies": { + "once": "~1.3.0" + } + }, + "node_modules/map-limit/node_modules/once": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", + "integrity": "sha1-suJhVXzkwxTsgwTz+oJmPkKXyiA=", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, "node_modules/merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", @@ -741,6 +1196,12 @@ "node": ">=4" } }, + "node_modules/murmurhash-js": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/murmurhash-js/-/murmurhash-js-1.0.0.tgz", + "integrity": "sha1-sGJ44h/Gw3+lMTcysEEry2rhX1E=", + "dev": true + }, "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -750,6 +1211,20 @@ "node": ">=0.10.0" } }, + "node_modules/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, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ogl": { + "version": "0.0.65", + "resolved": "https://registry.npmjs.org/ogl/-/ogl-0.0.65.tgz", + "integrity": "sha512-3wFjuFYgPuJPk+Ar0YG+O8CLGstW0drr+DH1Zmjqlc3XdXTbD9gkHcjXm/3NTD8cj3Vmx7zTcHJyqw01yUNEzg==" + }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -759,6 +1234,23 @@ "wrappy": "1" } }, + "node_modules/optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dev": true, + "dependencies": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/opts": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/opts/-/opts-2.0.2.tgz", @@ -804,6 +1296,21 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/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 + }, "node_modules/randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", @@ -813,6 +1320,33 @@ "safe-buffer": "^5.1.0" } }, + "node_modules/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, + "dependencies": { + "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" + } + }, + "node_modules/readable-stream/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "node_modules/readable-stream/node_modules/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 + }, "node_modules/readdirp": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", @@ -899,6 +1433,22 @@ "rollup": "^1.20.0||^2.0.0" } }, + "node_modules/rollup-plugin-glslify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/rollup-plugin-glslify/-/rollup-plugin-glslify-1.2.0.tgz", + "integrity": "sha512-EqUFINMICD9U3MJ4jsxBcCRhzWNZJBWyAK2ol+2ClWIPaIWOuz0OY/Ml8rdT81F4aufwxJN5I9N7QvCth0OrUQ==", + "dev": true, + "dependencies": { + "glslify": "^7.0.0", + "rollup-pluginutils": "^2.8.2" + } + }, + "node_modules/rollup-plugin-includepaths": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/rollup-plugin-includepaths/-/rollup-plugin-includepaths-0.2.4.tgz", + "integrity": "sha512-iZen+XKVExeCzk7jeSZPJKL7B67slZNr8GXSC5ROBXtDGXDBH8wdjMfdNW5hf9kPt+tHyIvWh3wlE9bPrZL24g==", + "dev": true + }, "node_modules/rollup-plugin-livereload": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/rollup-plugin-livereload/-/rollup-plugin-livereload-2.0.0.tgz", @@ -1006,6 +1556,12 @@ "randombytes": "^2.1.0" } }, + "node_modules/shallow-copy": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/shallow-copy/-/shallow-copy-0.0.1.tgz", + "integrity": "sha1-QV9CcC1z2BAzApLMXuhurhoRoXA=", + "dev": true + }, "node_modules/sirv": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/sirv/-/sirv-1.0.11.tgz", @@ -1040,6 +1596,15 @@ "node": ">= 10" } }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/source-map": { "version": "0.7.3", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", @@ -1074,6 +1639,45 @@ "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", "dev": true }, + "node_modules/stack-trace": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.9.tgz", + "integrity": "sha1-qPbq7KkGdMMz58Q5U/J1tFFRBpU=", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/static-eval": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/static-eval/-/static-eval-2.1.0.tgz", + "integrity": "sha512-agtxZ/kWSsCkI5E4QifRwsaPs0P0JmZV6dkLz6ILYfFYQGn+5plctanRN+IC8dJRiFkyXHrwEE3W9Wmx67uDbw==", + "dev": true, + "dependencies": { + "escodegen": "^1.11.1" + } + }, + "node_modules/stream-shift": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", + "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", + "dev": true + }, + "node_modules/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, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string_decoder/node_modules/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 + }, "node_modules/strip-indent": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", @@ -1288,6 +1892,16 @@ "node": ">=10" } }, + "node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, "node_modules/tinydate": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/tinydate/-/tinydate-1.3.0.tgz", @@ -1321,6 +1935,24 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==" }, + "node_modules/type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, + "dependencies": { + "prelude-ls": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, "node_modules/typescript": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.2.3.tgz", @@ -1334,6 +1966,21 @@ "node": ">=4.2.0" } }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "node_modules/word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -1360,6 +2007,15 @@ "optional": true } } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true, + "engines": { + "node": ">=0.4" + } } }, "dependencies": { @@ -1389,11 +2045,29 @@ "js-tokens": "^4.0.0" } }, + "@choojs/findup": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@choojs/findup/-/findup-0.2.1.tgz", + "integrity": "sha512-YstAqNb0MCN8PjdLCDfRsBcGVRN41f3vgLvaI0IrIcBp4AqILRSS0DeWNGkicC+f/zRIPJLc+9RURVSepwvfBw==", + "dev": true, + "requires": { + "commander": "^2.15.1" + } + }, "@polka/url": { "version": "1.0.0-next.11", "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.11.tgz", "integrity": "sha512-3NsZsJIA/22P3QUyrEDNA2D133H4j224twJrdipXN38dpnIOzAbUDtOwkcJ5pXmn75w7LSQDjA4tO9dm1XlqlA==" }, + "@rollup/plugin-alias": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@rollup/plugin-alias/-/plugin-alias-3.1.2.tgz", + "integrity": "sha512-wzDnQ6v7CcoRzS0qVwFPrFdYA4Qlr+ookA217Y2Z3DPZE1R8jrFNM3jvGgOf6o6DMjbnQIn5lCIJgHPe1Bt3uw==", + "dev": true, + "requires": { + "slash": "^3.0.0" + } + }, "@rollup/plugin-commonjs": { "version": "17.1.0", "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-17.1.0.tgz", @@ -1494,6 +2168,12 @@ "@types/node": "*" } }, + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true + }, "ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", @@ -1525,6 +2205,16 @@ "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", "dev": true }, + "bl": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/bl/-/bl-2.2.1.tgz", + "integrity": "sha512-6Pesp1w0DEX1N550i/uGV/TqucVL4AM/pgThFSN/Qq9si1/DF9aIHs1BxD8V/QU0HoeHO6cQRTAuYnLPKq1e4g==", + "dev": true, + "requires": { + "readable-stream": "^2.3.5", + "safe-buffer": "^5.1.1" + } + }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -1622,11 +2312,35 @@ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, "console-clear": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/console-clear/-/console-clear-1.1.1.tgz", "integrity": "sha512-pMD+MVR538ipqkG5JXeOEbKWS5um1H4LUUccUQG68qpeqBYbzYy79Gh55jkd2TtPdRfUaLWdv6LPP//5Zt0aPQ==" }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, "deepmerge": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", @@ -1639,18 +2353,103 @@ "integrity": "sha512-oSyFlqaTHCItVRGK5RmrmjB+CmaMOW7IaNA/kdxqhoa6d17j/5ce9O9eWXmV/KEdRwqpQA+Vqe8a8Bsybu4YnA==", "dev": true }, + "duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "dev": true, + "requires": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "requires": { + "once": "^1.4.0" + } + }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", "dev": true }, + "escodegen": { + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", + "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", + "dev": true, + "requires": { + "esprima": "^4.0.1", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" + }, + "dependencies": { + "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, + "optional": true + } + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + }, "estree-walker": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", "dev": true }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "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 + }, + "falafel": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/falafel/-/falafel-2.2.4.tgz", + "integrity": "sha512-0HXjo8XASWRmsS0X1EkhwEMZaD3Qvp7FfURwjLKjG1ghfRm/MGZl2r4cWUTv41KdNghTw4OUMmVtdGQp3+H+uQ==", + "dev": true, + "requires": { + "acorn": "^7.1.1", + "foreach": "^2.0.5", + "isarray": "^2.0.1", + "object-keys": "^1.0.6" + } + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, "file-selector": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/file-selector/-/file-selector-0.2.4.tgz", @@ -1668,6 +2467,22 @@ "to-regex-range": "^5.0.1" } }, + "foreach": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", + "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=", + "dev": true + }, + "from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -1715,6 +2530,212 @@ "is-glob": "^4.0.1" } }, + "glsl-inject-defines": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/glsl-inject-defines/-/glsl-inject-defines-1.0.3.tgz", + "integrity": "sha1-3RqswsF/yyvT/DJBHGYz0Ne2D9Q=", + "dev": true, + "requires": { + "glsl-token-inject-block": "^1.0.0", + "glsl-token-string": "^1.0.1", + "glsl-tokenizer": "^2.0.2" + } + }, + "glsl-resolve": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/glsl-resolve/-/glsl-resolve-0.0.1.tgz", + "integrity": "sha1-iUvvc5ENeSyBtRQxgANdCnivdtM=", + "dev": true, + "requires": { + "resolve": "^0.6.1", + "xtend": "^2.1.2" + }, + "dependencies": { + "resolve": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-0.6.3.tgz", + "integrity": "sha1-3ZV5gufnNt699TtYpN2RdUV13UY=", + "dev": true + }, + "xtend": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.2.0.tgz", + "integrity": "sha1-7vax8ZjByN6vrYsXZaBNrUoBxak=", + "dev": true + } + } + }, + "glsl-token-assignments": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/glsl-token-assignments/-/glsl-token-assignments-2.0.2.tgz", + "integrity": "sha1-pdgqt4SZwuimuDy2lJXm5mXOAZ8=", + "dev": true + }, + "glsl-token-defines": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/glsl-token-defines/-/glsl-token-defines-1.0.0.tgz", + "integrity": "sha1-y4kqqVmTYjFyhHDU90AySJaX+p0=", + "dev": true, + "requires": { + "glsl-tokenizer": "^2.0.0" + } + }, + "glsl-token-depth": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/glsl-token-depth/-/glsl-token-depth-1.1.2.tgz", + "integrity": "sha1-I8XjDuK9JViEtKKLyFC495HpXYQ=", + "dev": true + }, + "glsl-token-descope": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/glsl-token-descope/-/glsl-token-descope-1.0.2.tgz", + "integrity": "sha1-D8kKsyYYa4L1l7LnfcniHvzTIHY=", + "dev": true, + "requires": { + "glsl-token-assignments": "^2.0.0", + "glsl-token-depth": "^1.1.0", + "glsl-token-properties": "^1.0.0", + "glsl-token-scope": "^1.1.0" + } + }, + "glsl-token-inject-block": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/glsl-token-inject-block/-/glsl-token-inject-block-1.1.0.tgz", + "integrity": "sha1-4QFfWYDBCRgkraomJfHf3ovQADQ=", + "dev": true + }, + "glsl-token-properties": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/glsl-token-properties/-/glsl-token-properties-1.0.1.tgz", + "integrity": "sha1-SD3D2Dnw1LXGFx0VkfJJvlPCip4=", + "dev": true + }, + "glsl-token-scope": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/glsl-token-scope/-/glsl-token-scope-1.1.2.tgz", + "integrity": "sha1-oXKOeN8kRE+cuT/RjvD3VQOmQ7E=", + "dev": true + }, + "glsl-token-string": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/glsl-token-string/-/glsl-token-string-1.0.1.tgz", + "integrity": "sha1-WUQdL4V958NEnJRWZgIezjWOSOw=", + "dev": true + }, + "glsl-token-whitespace-trim": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/glsl-token-whitespace-trim/-/glsl-token-whitespace-trim-1.0.0.tgz", + "integrity": "sha1-RtHf6Yx1vX1QTAXX0RsbPpzJOxA=", + "dev": true + }, + "glsl-tokenizer": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/glsl-tokenizer/-/glsl-tokenizer-2.1.5.tgz", + "integrity": "sha512-XSZEJ/i4dmz3Pmbnpsy3cKh7cotvFlBiZnDOwnj/05EwNp2XrhQ4XKJxT7/pDt4kp4YcpRSKz8eTV7S+mwV6MA==", + "dev": true, + "requires": { + "through2": "^0.6.3" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + }, + "through2": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", + "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", + "dev": true, + "requires": { + "readable-stream": ">=1.0.33-1 <1.1.0-0", + "xtend": ">=4.0.0 <4.1.0-0" + } + } + } + }, + "glslify": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/glslify/-/glslify-7.1.1.tgz", + "integrity": "sha512-bud98CJ6kGZcP9Yxcsi7Iz647wuDz3oN+IZsjCRi5X1PI7t/xPKeL0mOwXJjo+CRZMqvq0CkSJiywCcY7kVYog==", + "dev": true, + "requires": { + "bl": "^2.2.1", + "concat-stream": "^1.5.2", + "duplexify": "^3.4.5", + "falafel": "^2.1.0", + "from2": "^2.3.0", + "glsl-resolve": "0.0.1", + "glsl-token-whitespace-trim": "^1.0.0", + "glslify-bundle": "^5.0.0", + "glslify-deps": "^1.2.5", + "minimist": "^1.2.5", + "resolve": "^1.1.5", + "stack-trace": "0.0.9", + "static-eval": "^2.0.5", + "through2": "^2.0.1", + "xtend": "^4.0.0" + } + }, + "glslify-bundle": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/glslify-bundle/-/glslify-bundle-5.1.1.tgz", + "integrity": "sha512-plaAOQPv62M1r3OsWf2UbjN0hUYAB7Aph5bfH58VxJZJhloRNbxOL9tl/7H71K7OLJoSJ2ZqWOKk3ttQ6wy24A==", + "dev": true, + "requires": { + "glsl-inject-defines": "^1.0.1", + "glsl-token-defines": "^1.0.0", + "glsl-token-depth": "^1.1.1", + "glsl-token-descope": "^1.0.2", + "glsl-token-scope": "^1.1.1", + "glsl-token-string": "^1.0.1", + "glsl-token-whitespace-trim": "^1.0.0", + "glsl-tokenizer": "^2.0.2", + "murmurhash-js": "^1.0.0", + "shallow-copy": "0.0.1" + } + }, + "glslify-deps": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/glslify-deps/-/glslify-deps-1.3.2.tgz", + "integrity": "sha512-7S7IkHWygJRjcawveXQjRXLO2FTjijPDYC7QfZyAQanY+yGLCFHYnPtsGT9bdyHiwPTw/5a1m1M9hamT2aBpag==", + "dev": true, + "requires": { + "@choojs/findup": "^0.2.0", + "events": "^3.2.0", + "glsl-resolve": "0.0.1", + "glsl-tokenizer": "^2.0.0", + "graceful-fs": "^4.1.2", + "inherits": "^2.0.1", + "map-limit": "0.0.1", + "resolve": "^1.0.0" + } + }, + "graceful-fs": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", + "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", + "dev": true + }, "has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -1816,6 +2837,12 @@ "@types/estree": "*" } }, + "isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, "jest-worker": { "version": "26.6.2", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", @@ -1855,6 +2882,16 @@ "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==" }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, "livereload": { "version": "0.9.2", "resolved": "https://registry.npmjs.org/livereload/-/livereload-0.9.2.tgz", @@ -1887,6 +2924,26 @@ "sourcemap-codec": "^1.4.4" } }, + "map-limit": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/map-limit/-/map-limit-0.0.1.tgz", + "integrity": "sha1-63lhAxwPDo0AG/LVb6toXViCLzg=", + "dev": true, + "requires": { + "once": "~1.3.0" + }, + "dependencies": { + "once": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", + "integrity": "sha1-suJhVXzkwxTsgwTz+oJmPkKXyiA=", + "dev": true, + "requires": { + "wrappy": "1" + } + } + } + }, "merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", @@ -1924,12 +2981,29 @@ "resolved": "https://registry.npmjs.org/mri/-/mri-1.1.6.tgz", "integrity": "sha512-oi1b3MfbyGa7FJMP9GmLTttni5JoICpYBRlq+x5V16fZbLsnL9N3wFqqIm/nIG43FjUFkFh9Epzp/kzUGUnJxQ==" }, + "murmurhash-js": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/murmurhash-js/-/murmurhash-js-1.0.0.tgz", + "integrity": "sha1-sGJ44h/Gw3+lMTcysEEry2rhX1E=", + "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 }, + "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 + }, + "ogl": { + "version": "0.0.65", + "resolved": "https://registry.npmjs.org/ogl/-/ogl-0.0.65.tgz", + "integrity": "sha512-3wFjuFYgPuJPk+Ar0YG+O8CLGstW0drr+DH1Zmjqlc3XdXTbD9gkHcjXm/3NTD8cj3Vmx7zTcHJyqw01yUNEzg==" + }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -1939,6 +3013,20 @@ "wrappy": "1" } }, + "optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dev": true, + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + } + }, "opts": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/opts/-/opts-2.0.2.tgz", @@ -1972,6 +3060,18 @@ "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", "dev": true }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "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 + }, "randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", @@ -1981,6 +3081,35 @@ "safe-buffer": "^5.1.0" } }, + "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" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "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 + } + } + }, "readdirp": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", @@ -2042,6 +3171,22 @@ } } }, + "rollup-plugin-glslify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/rollup-plugin-glslify/-/rollup-plugin-glslify-1.2.0.tgz", + "integrity": "sha512-EqUFINMICD9U3MJ4jsxBcCRhzWNZJBWyAK2ol+2ClWIPaIWOuz0OY/Ml8rdT81F4aufwxJN5I9N7QvCth0OrUQ==", + "dev": true, + "requires": { + "glslify": "^7.0.0", + "rollup-pluginutils": "^2.8.2" + } + }, + "rollup-plugin-includepaths": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/rollup-plugin-includepaths/-/rollup-plugin-includepaths-0.2.4.tgz", + "integrity": "sha512-iZen+XKVExeCzk7jeSZPJKL7B67slZNr8GXSC5ROBXtDGXDBH8wdjMfdNW5hf9kPt+tHyIvWh3wlE9bPrZL24g==", + "dev": true + }, "rollup-plugin-livereload": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/rollup-plugin-livereload/-/rollup-plugin-livereload-2.0.0.tgz", @@ -2118,6 +3263,12 @@ "randombytes": "^2.1.0" } }, + "shallow-copy": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/shallow-copy/-/shallow-copy-0.0.1.tgz", + "integrity": "sha1-QV9CcC1z2BAzApLMXuhurhoRoXA=", + "dev": true + }, "sirv": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/sirv/-/sirv-1.0.11.tgz", @@ -2143,6 +3294,12 @@ "tinydate": "^1.0.0" } }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, "source-map": { "version": "0.7.3", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", @@ -2173,6 +3330,44 @@ "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", "dev": true }, + "stack-trace": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.9.tgz", + "integrity": "sha1-qPbq7KkGdMMz58Q5U/J1tFFRBpU=", + "dev": true + }, + "static-eval": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/static-eval/-/static-eval-2.1.0.tgz", + "integrity": "sha512-agtxZ/kWSsCkI5E4QifRwsaPs0P0JmZV6dkLz6ILYfFYQGn+5plctanRN+IC8dJRiFkyXHrwEE3W9Wmx67uDbw==", + "dev": true, + "requires": { + "escodegen": "^1.11.1" + } + }, + "stream-shift": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", + "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", + "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-indent": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", @@ -2295,6 +3490,16 @@ "source-map-support": "~0.5.19" } }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, "tinydate": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/tinydate/-/tinydate-1.3.0.tgz", @@ -2319,12 +3524,39 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==" }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2" + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, "typescript": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.2.3.tgz", "integrity": "sha512-qOcYwxaByStAWrBf4x0fibwZvMRG+r4cQoTjbPtUlrWjBHbmCAww1i448U0GJ+3cNNEtebDteo/cHOR3xJ4wEw==", "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 + }, + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true + }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -2337,6 +3569,12 @@ "integrity": "sha512-Qm8k8ojNQIMx7S+Zp8u/uHOx7Qazv3Yv4q68MiWWWOJhiwG5W3x7iqmRtJo8xxrciZUY4vRxUTJCKuRnF28ZZw==", "dev": true, "requires": {} + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true } } } diff --git a/view/package.json b/view/package.json index 85322bf..088ea72 100755 --- a/view/package.json +++ b/view/package.json @@ -9,6 +9,7 @@ "validate": "svelte-check" }, "devDependencies": { + "@rollup/plugin-alias": "^3.1.2", "@rollup/plugin-commonjs": "^17.0.0", "@rollup/plugin-node-resolve": "^11.0.0", "@rollup/plugin-typescript": "^8.0.0", @@ -16,6 +17,8 @@ "idb": "^6.0.0", "rollup": "^2.3.4", "rollup-plugin-css-only": "^3.1.0", + "rollup-plugin-glslify": "^1.2.0", + "rollup-plugin-includepaths": "^0.2.4", "rollup-plugin-livereload": "^2.0.0", "rollup-plugin-svelte": "^7.0.0", "rollup-plugin-terser": "^7.0.0", @@ -26,6 +29,7 @@ "typescript": "^4.0.0" }, "dependencies": { + "ogl": "^0.0.65", "sirv-cli": "^1.0.0", "svelte-file-dropzone": "^0.0.15" } diff --git a/view/public/index.html b/view/public/index.html index 39303b0..2f6256b 100755 --- a/view/public/index.html +++ b/view/public/index.html @@ -7,14 +7,14 @@ Karls Analyzer - - - + + + - + diff --git a/view/public/worker.js b/view/public/worker.js new file mode 100644 index 0000000..978b19c --- /dev/null +++ b/view/public/worker.js @@ -0,0 +1,29 @@ + + +self.addEventListener('message', function (e) { + + + const { data: { i, arr: pixels } } = e; + + let store = {}; + + let total = pixels.length / 4; + + const threshold = 200; + + for (let i = 0; i < total; i++) { + const r = pixels[i * 4 + 0] > threshold ? 1 : 0; + const g = pixels[i * 4 + 1] > threshold ? 1 : 0; + const b = pixels[i * 4 + 2] > threshold ? 1 : 0; + const id = r + "-" + g + "-" + b; + store[id] = store[id] + 1 || 1; + } + + + Object.keys(store).forEach(k => { + store[k] = store[k] / total; + }); + + + self.postMessage({ res: store, i }); +}, false); \ No newline at end of file diff --git a/view/rollup.config.js b/view/rollup.config.js index 48a1d58..597d702 100755 --- a/view/rollup.config.js +++ b/view/rollup.config.js @@ -5,7 +5,8 @@ import { terser } from 'rollup-plugin-terser'; import sveltePreprocess from 'svelte-preprocess'; import typescript from '@rollup/plugin-typescript'; import css from 'rollup-plugin-css-only'; - +import includePaths from 'rollup-plugin-includepaths'; +import glslify from 'rollup-plugin-glslify'; const production = !process.env.ROLLUP_WATCH; export default { @@ -17,6 +18,12 @@ export default { file: 'public/build/bundle.js' }, plugins: [ + + includePaths({ + paths: ["src"], + extensions: [".ts", ".svelte"] + }), + svelte({ preprocess: sveltePreprocess({ sourceMap: !production }), compilerOptions: { @@ -28,6 +35,8 @@ export default { // a separate file - better for performance css({ output: 'bundle.css' }), + glslify(), + // If you have external dependencies installed from // npm, you'll most likely need these plugins. In // some cases you'll need additional configuration - diff --git a/view/src/App.svelte b/view/src/App.svelte index ce45330..f645083 100755 --- a/view/src/App.svelte +++ b/view/src/App.svelte @@ -1,25 +1,14 @@ -
- {#if $currentRoute in routes} - - {/if} +{#if $currentRoute.startsWith("editor")} + +{:else if $currentRoute in routes} + +{/if} - -
- - + diff --git a/view/src/components/Analyzer.svelte b/view/src/components/Analyzer.svelte new file mode 100644 index 0000000..f327fe9 --- /dev/null +++ b/view/src/components/Analyzer.svelte @@ -0,0 +1,78 @@ + + +

ANALYZER

+ +{#await prom} +

Loading...

+{:then result} +
+ {#each result as color, i} +

+ {Math.floor(color.amount * 1000) / 10}% +

+
+ {/each} +
+{/await} + + diff --git a/view/src/components/DropZone/index.svelte b/view/src/components/DropZone/index.svelte index dbcff6b..08e008a 100755 --- a/view/src/components/DropZone/index.svelte +++ b/view/src/components/DropZone/index.svelte @@ -32,6 +32,7 @@ export let containerClasses = ""; export let containerStyles = ""; export let disableDefaultStyles = false; + export let disableClick = false; const dispatch = createEventDispatcher(); @@ -311,7 +312,7 @@ on:keydown={composeKeyboardHandler(onKeyDownCb)} on:focus={composeKeyboardHandler(onFocusCb)} on:blur={composeKeyboardHandler(onBlurCb)} - on:click={composeHandler(onClickCb)} + on:click={!disableClick && composeHandler(onClickCb)} on:dragenter={composeDragHandler(onDragEnterCb)} on:dragover={composeDragHandler(onDragOverCb)} on:dragleave={composeDragHandler(onDragLeaveCb)} @@ -324,27 +325,9 @@ autocomplete="off" tabindex="-1" on:change={onDropCb} - on:click={onInputElementClick} + on:click={!disableClick && onInputElementClick} bind:this={inputRef} style="display: none;" /> - -

Drag 'n' drop some files here, or click to select files

-
+
- - diff --git a/view/src/components/Editor/Compass.svelte b/view/src/components/Editor/Compass.svelte new file mode 100644 index 0000000..49f5fcd --- /dev/null +++ b/view/src/components/Editor/Compass.svelte @@ -0,0 +1,2 @@ + diff --git a/view/src/components/Editor/CustomOrbit.ts b/view/src/components/Editor/CustomOrbit.ts new file mode 100644 index 0000000..818b8fd --- /dev/null +++ b/view/src/components/Editor/CustomOrbit.ts @@ -0,0 +1,331 @@ +import { Vec2, Vec3 } from 'ogl'; + +const STATE = { NONE: -1, ROTATE: 0, DOLLY: 1, PAN: 2, DOLLY_PAN: 3 }; +const tempVec3 = new Vec3(); +const tempVec2a = new Vec2(); +const tempVec2b = new Vec2(); + +export function Orbit( + object, + { + element = document, + enabled = true, + target = new Vec3(), + ease = 0.25, + inertia = 0.85, + enableRotate = true, + rotateSpeed = 0.1, + autoRotate = false, + autoRotateSpeed = 1.0, + enableZoom = true, + zoomSpeed = 1, + enablePan = true, + panSpeed = 0.1, + minPolarAngle = 0, + maxPolarAngle = Math.PI, + minAzimuthAngle = -Infinity, + maxAzimuthAngle = Infinity, + minDistance = 0, + maxDistance = Infinity, + } = {} +) { + this.enabled = enabled; + this.target = target; + + // Catch attempts to disable - set to 1 so has no effect + ease = ease || 1; + inertia = inertia || 0; + + this.minDistance = minDistance; + this.maxDistance = maxDistance; + + // current position in sphericalTarget coordinates + const sphericalDelta = { radius: 1, phi: 0, theta: 0 }; + const sphericalTarget = { radius: 1, phi: 0, theta: 0 }; + const spherical = { radius: 1, phi: 0, theta: 0 }; + const panDelta = new Vec3(); + + // Grab initial position values + const offset = new Vec3(); + offset.copy(object.position).sub(this.target); + spherical.radius = sphericalTarget.radius = offset.distance(); + spherical.theta = sphericalTarget.theta = Math.atan2(offset.x, offset.z); + spherical.phi = sphericalTarget.phi = Math.acos(Math.min(Math.max(offset.y / sphericalTarget.radius, -1), 1)); + + this.offset = offset; + + this.update = () => { + if (autoRotate) { + handleAutoRotate(); + } + + // apply delta + sphericalTarget.radius *= sphericalDelta.radius; + sphericalTarget.theta += sphericalDelta.theta; + sphericalTarget.phi += sphericalDelta.phi; + + // apply boundaries + sphericalTarget.theta = Math.max(minAzimuthAngle, Math.min(maxAzimuthAngle, sphericalTarget.theta)); + sphericalTarget.phi = Math.max(minPolarAngle, Math.min(maxPolarAngle, sphericalTarget.phi)); + sphericalTarget.radius = Math.max(this.minDistance, Math.min(this.maxDistance, sphericalTarget.radius)); + + // ease values + spherical.phi += (sphericalTarget.phi - spherical.phi) * ease; + spherical.theta += (sphericalTarget.theta - spherical.theta) * ease; + spherical.radius += (sphericalTarget.radius - spherical.radius) * ease; + + // apply pan to target. As offset is relative to target, it also shifts + this.target.add(panDelta); + + // apply rotation to offset + let sinPhiRadius = spherical.radius * Math.sin(Math.max(0.000001, spherical.phi)); + offset.x = sinPhiRadius * Math.sin(spherical.theta); + offset.y = spherical.radius * Math.cos(spherical.phi); + offset.z = sinPhiRadius * Math.cos(spherical.theta); + + // Apply updated values to object + object.position.copy(this.target).add(offset); + object.lookAt(this.target); + + // Apply inertia to values + sphericalDelta.theta *= inertia; + sphericalDelta.phi *= inertia; + panDelta.multiply(inertia); + + // Reset scale every frame to avoid applying scale multiple times + sphericalDelta.radius = 1; + }; + + // Updates internals with new position + this.forcePosition = () => { + offset.copy(object.position).sub(this.target); + spherical.radius = sphericalTarget.radius = offset.distance(); + spherical.theta = sphericalTarget.theta = Math.atan2(offset.x, offset.z); + spherical.phi = sphericalTarget.phi = Math.acos(Math.min(Math.max(offset.y / sphericalTarget.radius, -1), 1)); + object.lookAt(this.target); + }; + + // Everything below here just updates panDelta and sphericalDelta + // Using those two objects' values, the orbit is calculated + + const rotateStart = new Vec2(); + const panStart = new Vec2(); + const dollyStart = new Vec2(); + + let state = STATE.NONE; + this.mouseButtons = { ORBIT: 0, ZOOM: 0, PAN: 0 }; + + function getZoomScale() { + return Math.pow(0.95, zoomSpeed); + } + + function panLeft(distance, m) { + tempVec3.set(m[0], m[1], m[2]); + tempVec3.multiply(-distance); + panDelta.add(tempVec3); + } + + function panUp(distance, m) { + tempVec3.set(m[4], m[5], m[6]); + tempVec3.multiply(distance); + panDelta.add(tempVec3); + } + + const pan = (deltaX, deltaY) => { + let el = element === document ? document.body : element; + tempVec3.copy(object.position).sub(this.target); + let targetDistance = tempVec3.distance(); + targetDistance *= Math.tan((((object.fov || 45) / 2) * Math.PI) / 180.0); + panLeft((2 * deltaX * targetDistance) / el.clientHeight, object.matrix); + panUp((2 * deltaY * targetDistance) / el.clientHeight, object.matrix); + }; + + function dolly(dollyScale) { + sphericalDelta.radius /= dollyScale; + } + + function handleAutoRotate() { + const angle = ((2 * Math.PI) / 60 / 60) * autoRotateSpeed; + sphericalDelta.theta -= angle; + } + + function handleMoveRotate(x, y) { + tempVec2a.set(x, y); + tempVec2b.sub(tempVec2a, rotateStart).multiply(rotateSpeed); + let el = element === document ? document.body : element; + sphericalDelta.theta -= (2 * Math.PI * tempVec2b.x) / el.clientHeight; + sphericalDelta.phi -= (2 * Math.PI * tempVec2b.y) / el.clientHeight; + rotateStart.copy(tempVec2a); + } + + function handleMouseMoveDolly(e) { + tempVec2a.set(e.clientX, e.clientY); + tempVec2b.sub(tempVec2a, dollyStart); + if (tempVec2b.y > 0) { + dolly(getZoomScale()); + } else if (tempVec2b.y < 0) { + dolly(1 / getZoomScale()); + } + dollyStart.copy(tempVec2a); + } + + function handleMovePan(x, y) { + tempVec2a.set(x, y); + tempVec2b.sub(tempVec2a, panStart).multiply(panSpeed); + pan(tempVec2b.x, tempVec2b.y); + panStart.copy(tempVec2a); + } + + function handleTouchStartDollyPan(e) { + if (enableZoom) { + let dx = e.touches[0].pageX - e.touches[1].pageX; + let dy = e.touches[0].pageY - e.touches[1].pageY; + let distance = Math.sqrt(dx * dx + dy * dy); + dollyStart.set(0, distance); + } + + if (enablePan) { + let x = 0.5 * (e.touches[0].pageX + e.touches[1].pageX); + let y = 0.5 * (e.touches[0].pageY + e.touches[1].pageY); + panStart.set(x, y); + } + } + + function handleTouchMoveDollyPan(e) { + if (enableZoom) { + let dx = e.touches[0].pageX - e.touches[1].pageX; + let dy = e.touches[0].pageY - e.touches[1].pageY; + let distance = Math.sqrt(dx * dx + dy * dy); + tempVec2a.set(0, distance); + tempVec2b.set(0, Math.pow(tempVec2a.y / dollyStart.y, zoomSpeed)); + dolly(tempVec2b.y); + dollyStart.copy(tempVec2a); + } + + if (enablePan) { + let x = 0.5 * (e.touches[0].pageX + e.touches[1].pageX); + let y = 0.5 * (e.touches[0].pageY + e.touches[1].pageY); + handleMovePan(x, y); + } + } + + const onMouseDown = (e) => { + if (!this.enabled) return; + + rotateStart.set(e.clientX, e.clientY); + state = STATE.ROTATE; + + if (state !== STATE.NONE) { + window.addEventListener('mousemove', onMouseMove, false); + window.addEventListener('mouseup', onMouseUp, false); + } + }; + + const onMouseMove = (e) => { + if (!this.enabled) return; + + switch (state) { + case STATE.ROTATE: + if (enableRotate === false) return; + handleMoveRotate(e.clientX, e.clientY); + break; + case STATE.DOLLY: + if (enableZoom === false) return; + handleMouseMoveDolly(e); + break; + case STATE.PAN: + if (enablePan === false) return; + handleMovePan(e.clientX, e.clientY); + break; + } + }; + + const onMouseUp = () => { + window.removeEventListener('mousemove', onMouseMove, false); + window.removeEventListener('mouseup', onMouseUp, false); + state = STATE.NONE; + }; + + const onMouseWheel = (e) => { + if (!this.enabled || !enableZoom || (state !== STATE.NONE && state !== STATE.ROTATE)) return; + e.stopPropagation(); + e.preventDefault(); + + if (e.deltaY < 0) { + dolly(1 / getZoomScale()); + } else if (e.deltaY > 0) { + dolly(getZoomScale()); + } + }; + + const onTouchStart = (e) => { + if (!this.enabled) return; + e.preventDefault(); + + switch (e.touches.length) { + case 1: + if (enableRotate === false) return; + rotateStart.set(e.touches[0].pageX, e.touches[0].pageY); + state = STATE.ROTATE; + break; + case 2: + if (enableZoom === false && enablePan === false) return; + handleTouchStartDollyPan(e); + state = STATE.DOLLY_PAN; + break; + default: + state = STATE.NONE; + } + }; + + const onTouchMove = (e) => { + if (!this.enabled) return; + e.preventDefault(); + e.stopPropagation(); + + switch (e.touches.length) { + case 1: + if (enableRotate === false) return; + handleMoveRotate(e.touches[0].pageX, e.touches[0].pageY); + break; + case 2: + if (enableZoom === false && enablePan === false) return; + handleTouchMoveDollyPan(e); + break; + default: + state = STATE.NONE; + } + }; + + const onTouchEnd = () => { + if (!this.enabled) return; + state = STATE.NONE; + }; + + const onContextMenu = (e) => { + if (!this.enabled) return; + e.preventDefault(); + }; + + function addHandlers() { + element.addEventListener('contextmenu', onContextMenu, false); + element.addEventListener('mousedown', onMouseDown, false); + element.addEventListener('wheel', onMouseWheel, { passive: false }); + element.addEventListener('touchstart', onTouchStart, { passive: false }); + element.addEventListener('touchend', onTouchEnd, false); + element.addEventListener('touchmove', onTouchMove, { passive: false }); + } + + this.remove = function () { + element.removeEventListener('contextmenu', onContextMenu); + element.removeEventListener('mousedown', onMouseDown); + element.removeEventListener('wheel', onMouseWheel); + element.removeEventListener('touchstart', onTouchStart); + element.removeEventListener('touchend', onTouchEnd); + element.removeEventListener('touchmove', onTouchMove); + window.removeEventListener('mousemove', onMouseMove); + window.removeEventListener('mouseup', onMouseUp); + }; + + addHandlers(); +} \ No newline at end of file diff --git a/view/src/components/Editor/Editor.svelte b/view/src/components/Editor/Editor.svelte new file mode 100644 index 0000000..6ea685b --- /dev/null +++ b/view/src/components/Editor/Editor.svelte @@ -0,0 +1,77 @@ + + +
+
+ +
+ +
+ +
+
+ +
+
+ +
+
+ + diff --git a/view/src/components/Editor/Orb.frag b/view/src/components/Editor/Orb.frag new file mode 100644 index 0000000..01538a3 --- /dev/null +++ b/view/src/components/Editor/Orb.frag @@ -0,0 +1,8 @@ + precision highp float; + uniform sampler2D tMap; + uniform float opacity; + varying vec2 vUv; + void main() { + gl_FragColor.rgba = texture2D(tMap, vUv).rgba; + gl_FragColor.a *= opacity; + } \ No newline at end of file diff --git a/view/src/components/Editor/Orb.vert b/view/src/components/Editor/Orb.vert new file mode 100644 index 0000000..f764343 --- /dev/null +++ b/view/src/components/Editor/Orb.vert @@ -0,0 +1,10 @@ +attribute vec2 uv; +attribute vec3 position; +attribute vec3 normal; +uniform mat4 modelViewMatrix; +uniform mat4 projectionMatrix; +varying vec2 vUv; +void main() { + vUv = uv; + gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0); +} \ No newline at end of file diff --git a/view/src/components/Editor/OrbView.ts b/view/src/components/Editor/OrbView.ts new file mode 100644 index 0000000..b630566 --- /dev/null +++ b/view/src/components/Editor/OrbView.ts @@ -0,0 +1,136 @@ +import { Renderer, Camera, Transform, Texture, Sphere, Program, Mesh } from "ogl" +import { Orbit } from "./CustomOrbit" +import { bufToImageUrl } from "helpers"; + + +import VertexShader from "./Orb.vert"; +import FragmentShader from "./Orb.frag"; +import Toast from "../Toast"; + +let hasConfirmed = false; + +export default (image: Image, canvas2D: CanvasRenderingContext2D, canvas3D: HTMLCanvasElement) => { + + const renderer = new Renderer({ dpr: 2, canvas: canvas3D }); + const gl = renderer.gl; + gl.clearColor(1, 1, 1, 1); + + const camera = new Camera(gl, { fov: 45 }); + camera.position.set(0, 0, 8); + + const controls = new Orbit(camera, { + enablePan: false, + enableZoom: false, + rotateSpeed: -0.1 + }); + + function resize() { + renderer.setSize(window.innerWidth, window.innerHeight); + camera.perspective({ aspect: gl.canvas.width / gl.canvas.height }); + } + window.addEventListener('resize', resize, false); + resize(); + + const scene = new Transform(); + + // Texture is equirectangular + const texture = new Texture(gl); + const img = new Image(); + img.onload = () => (texture.image = img); + img.src = bufToImageUrl(image.data, image.type); + + // Use Sphere geometry to render equirectangular textures + const geometry = new Sphere(gl, { radius: 1, widthSegments: 64 }); + + const program = new Program(gl, { + vertex: VertexShader, + fragment: FragmentShader, + uniforms: { + tMap: { value: texture }, + opacity: { value: 1 } + }, + + // Need inside of sphere to be visible + cullFace: null, + }); + + // Camera will dwell inside skybox + const skybox = new Mesh(gl, { geometry, program }); + skybox.scale.set(10); + skybox.scale.x = -10; + skybox.setParent(scene); + + + const overlayTexture = new Texture(gl, { + image: new Uint8Array(image.data), + width: image.width, + height: image.height, + }); + + // Use Sphere geometry to render equirectangular textures + const overlayGeometry = new Sphere(gl, { radius: 1, widthSegments: 64 }); + + const overlayProgram = new Program(gl, { + vertex: VertexShader, + fragment: FragmentShader, + uniforms: { + tMap: { value: overlayTexture }, + opacity: { value: 0.5 } + }, + transparent: true, + // Need inside of sphere to be visible + cullFace: null, + }); + // Camera will dwell inside skybox + const overlay = new Mesh(gl, { geometry: overlayGeometry, program: overlayProgram }); + overlay.scale.set(9.995); + overlay.scale.x = -9.995; + overlay.setParent(scene); + + + let activeTool = "pan"; + let shouldBeRendering = false; + function update() { + if (!shouldBeRendering) return; + + requestAnimationFrame(update); + + controls.update(); + renderer.render({ scene, camera }); + } + + + function start() { + !hasConfirmed && Toast.confirm("Drawing does not work correctly in 3D at the moment").then(c => { + hasConfirmed = c; + }) + if (shouldBeRendering) return; + + updateOverlay(); + + shouldBeRendering = true; + update(); + } + + function updateOverlay() { + overlayProgram.uniforms.tMap.value.image = canvas2D.getImageData(0, 0, image.width, image.height).data; + } + + function stop() { + shouldBeRendering = false; + } + + function setTool(t) { + activeTool = t; + controls.enabled = t === "pan"; + } + + function setOpacity(o) { + overlayProgram.uniforms.opacity.value = o / 100; + } + + return { + start, stop, setTool, updateOverlay, setOpacity + } + +} \ No newline at end of file diff --git a/view/src/components/Editor/Painter.svelte b/view/src/components/Editor/Painter.svelte new file mode 100644 index 0000000..e18297f --- /dev/null +++ b/view/src/components/Editor/Painter.svelte @@ -0,0 +1,358 @@ + + + + +
+ + + {#if activeTool === "brush" || activeTool === "erasor"} +
+ {/if} + + + + 0 ? 100 : -100 + }%)); opacity: ${(layerOpacity / 100) * 0.5};`} + /> + + + + +
+ + diff --git a/view/src/components/Editor/ToolBox.svelte b/view/src/components/Editor/ToolBox.svelte new file mode 100644 index 0000000..9008596 --- /dev/null +++ b/view/src/components/Editor/ToolBox.svelte @@ -0,0 +1,26 @@ + + +{#each tools as t} + +{/each} + + diff --git a/view/src/components/Editor/TopBar.svelte b/view/src/components/Editor/TopBar.svelte new file mode 100644 index 0000000..980834d --- /dev/null +++ b/view/src/components/Editor/TopBar.svelte @@ -0,0 +1,78 @@ + + + + +
+
+ {#each colors as c} +
(activeColor = c)} + class:active={activeColor === c} + style={`background-color: #${c};`} + /> + {/each} +
+ +
+ + + +
+
+ + diff --git a/view/src/components/Toast/Toast.svelte b/view/src/components/Toast/Toast.svelte index f675cc4..16f3541 100644 --- a/view/src/components/Toast/Toast.svelte +++ b/view/src/components/Toast/Toast.svelte @@ -1,7 +1,7 @@ + +{#await imagePromise} + Loading image +{:then image} + +{:catch err} +

Error loading image

+ {JSON.stringify(err)} +{/await} diff --git a/view/src/routes/error.svelte b/view/src/routes/error.svelte new file mode 100644 index 0000000..49f5fcd --- /dev/null +++ b/view/src/routes/error.svelte @@ -0,0 +1,2 @@ + diff --git a/view/src/routes/list.svelte b/view/src/routes/list.svelte index f092b47..bc942bf 100644 --- a/view/src/routes/list.svelte +++ b/view/src/routes/list.svelte @@ -1,24 +1,133 @@ -{#each images as img} -

{img.filename}

- -{/each} +
+

List

-

List

+ {#each $imageStore as img, i} +
+ {img.filename} route.set("editor/" + img.id)} + src={bufToImageUrl(img.data, img.type)} + /> +
+

handleFileChange(ev, img)}> + {img.name} +

+ + + + +
+
+ + {#if i === showAnalyzerIndex} +
+ +
+ {/if} + {/each} + +
route.set("main")}> + +

Add more images

+
+
+ + diff --git a/view/src/routes/main.svelte b/view/src/routes/main.svelte index c576d1b..409dd53 100755 --- a/view/src/routes/main.svelte +++ b/view/src/routes/main.svelte @@ -3,10 +3,13 @@ import AnimatedNumber from "../components/AnimatedNumber.svelte"; import Cross from "../icons/Cross.svelte"; import Toast from "../components/Toast"; - import { route as currentRoute, images } from "../stores"; + import { route as currentRoute, images, route } from "../stores"; + import { fileToImage } from "../helpers"; let acceptedFiles: File[] = []; let hovering = false; + const imageStore = images.store; + async function handleFilesSelect(e) { if (e.detail.acceptedFiles) { const addedFiles: File[] = e.detail.acceptedFiles; @@ -14,13 +17,15 @@ const newFiles: File[] = []; const dupes: File[] = []; + const allImages = [...$imageStore, ...acceptedFiles]; + addedFiles.forEach((f) => { - const isNew = !acceptedFiles.find((_f) => { + const isNew = !allImages.find((_f: Image) => { return ( _f.lastModified === f.lastModified && _f.name === f.name && _f.type === f.type && - _f.size === f.size + _f.data.byteLength === f.size ); }); @@ -35,9 +40,9 @@ if (dupes.length) { const loadDupes = await Toast.confirm( - `Add ${dupes.length} duplicate file${ - dupes.length > 1 ? "s" : "" - }?` + `Some images are already loaded. Add ${ + dupes.length + } duplicate${dupes.length > 1 ? "s" : ""}?` ); if (loadDupes) { @@ -53,17 +58,7 @@ e.stopImmediatePropagation(); e.stopPropagation(); - const img = await Promise.all( - acceptedFiles.map(async (f) => { - return { - name: f.name, - filename: f.name, - type: f.type, - lastModified: f.lastModified, - data: await f.arrayBuffer(), - }; - }) - ); + const img = await Promise.all(acceptedFiles.map(fileToImage)); images.add(img); @@ -78,7 +73,7 @@ } -
+
(hovering = false)} on:dragenter={() => (hovering = false)} > + {#if $imageStore.length} + + {/if} +
@@ -103,7 +104,8 @@