diff --git a/package-lock.json b/package-lock.json index 02c6cfa..ccd9c69 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1311,9 +1311,9 @@ } }, "node_modules/@types/estree": { - "version": "0.0.45", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.45.tgz", - "integrity": "sha512-jnqIUKDUqJbDIUxm0Uj7bnlMnRm1T/eZ9N+AVMqhPgzrba2GhGG5o/jCTwmdPK709nEZsGoMzXEDUjcXHa3W0g==", + "version": "0.0.46", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.46.tgz", + "integrity": "sha512-laIjwTQaD+5DukBZaygQ79K1Z0jb1bPEMRrkXSLjtCcZm+abyp5YbrqpSLzD42FwWW6gK/aS4NYpJ804nG2brg==", "dev": true }, "node_modules/@types/glob": { @@ -1328,9 +1328,9 @@ } }, "node_modules/@types/json-schema": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.6.tgz", - "integrity": "sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw==", + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.7.tgz", + "integrity": "sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA==", "dev": true }, "node_modules/@types/minimatch": { @@ -1341,9 +1341,9 @@ "peer": true }, "node_modules/@types/node": { - "version": "14.14.20", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.20.tgz", - "integrity": "sha512-Y93R97Ouif9JEOWPIUyU+eyIdyRqQR0I8Ez1dzku4hDx34NWh4HbtIc3WNzwB1Y9ULvNGeu5B8h8bVL5cAk4/A==", + "version": "14.14.22", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.22.tgz", + "integrity": "sha512-g+f/qj/cNcqKkc3tFqlXOYjrmZA+jNBiDzbP3kH+B+otKFqAdPgVTGP1IeKRdMml/aE69as5S4FqtxAbl+LaMw==", "dev": true }, "node_modules/@webassemblyjs/ast": { @@ -1492,6 +1492,16 @@ "@xtuc/long": "4.2.2" } }, + "node_modules/@webpack-cli/configtest": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.0.0.tgz", + "integrity": "sha512-Un0SdBoN1h4ACnIO7EiCjWuyhNI0Jl96JC+63q6xi4HDUYRZn8Auluea9D+v9NWKc5J4sICVEltdBaVjLX39xw==", + "dev": true, + "peerDependencies": { + "webpack": "4.x.x || 5.x.x", + "webpack-cli": "4.x.x" + } + }, "node_modules/@webpack-cli/info": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.2.1.tgz", @@ -1505,9 +1515,9 @@ } }, "node_modules/@webpack-cli/serve": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.2.1.tgz", - "integrity": "sha512-Zj1z6AyS+vqV6Hfi7ngCjFGdHV5EwZNIHo6QfFTNe9PyW+zBU1zJ9BiOW1pmUEq950RC4+Dym6flyA/61/vhyw==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.2.2.tgz", + "integrity": "sha512-03GkWxcgFfm8+WIwcsqJb9agrSDNDDoxaNnexPnCCexP5SCE4IgFd9lNpSy+K2nFqVMpgTFw6SwbmVAVTndVew==", "dev": true, "peerDependencies": { "webpack-cli": "4.x.x" @@ -1531,9 +1541,9 @@ "dev": true }, "node_modules/acorn": { - "version": "8.0.4", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.0.4.tgz", - "integrity": "sha512-XNP0PqF1XD19ZlLKvB7cMmnZswW4C/03pRHgirB30uSJTaS3A3V1/P4sS3HPvFmjoriPCJQs+JDSbm4bL1TxGQ==", + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.0.5.tgz", + "integrity": "sha512-v+DieK/HJkJOpFBETDJioequtc3PfxsWMaxIdIwujtF7FEV/MAyDQLlm6/zPvr7Mix07mLh6ccVwIsloceodlg==", "dev": true, "bin": { "acorn": "bin/acorn" @@ -1705,9 +1715,9 @@ "dev": true }, "node_modules/call-bind": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.1.tgz", - "integrity": "sha512-tvAvUwNcRikl3RVF20X9lsYmmepsovzTWeJiXjO0PkJp15uy/6xKFZOQtuiSULwYW+6ToZBprphCgWXC2dSgcQ==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", "dev": true, "dependencies": { "function-bind": "^1.1.1", @@ -1730,9 +1740,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001174", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001174.tgz", - "integrity": "sha512-tqClL/4ThQq6cfFXH3oJL4rifFBeM6gTkphjao5kgwMaW9yn0tKgQLAEfKzDwj6HQWCB/aWo8kTFlSvIN8geEA==", + "version": "1.0.30001179", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001179.tgz", + "integrity": "sha512-blMmO0QQujuUWZKyVrD1msR4WNDAqb/UPO1Sw2WWsQ7deoM5bJiicKnWJ1Y0NS/aGINSnKPIWBMw5luX+NDUCA==", "dev": true }, "node_modules/chalk": { @@ -1881,12 +1891,12 @@ } }, "node_modules/core-js-compat": { - "version": "3.8.2", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.8.2.tgz", - "integrity": "sha512-LO8uL9lOIyRRrQmZxHZFl1RV+ZbcsAkFWTktn5SmH40WgLtSNYN4m4W2v9ONT147PxBY/XrRhrWq8TlvObyUjQ==", + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.8.3.tgz", + "integrity": "sha512-1sCb0wBXnBIL16pfFG1Gkvei6UzvKyTNYpiC41yrdjEv0UoJoq9E/abTMzyYJ6JpTkAj15dLjbqifIzEBDVvog==", "dev": true, "dependencies": { - "browserslist": "^4.16.0", + "browserslist": "^4.16.1", "semver": "7.0.0" }, "funding": { @@ -2080,9 +2090,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.3.635", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.635.tgz", - "integrity": "sha512-RRriZOLs9CpW6KTLmgBqyUdnY0QNqqWs0HOtuQGGEMizOTNNn1P7sGRBxARnUeLejOsgwjDyRqT3E/CSst02ZQ==", + "version": "1.3.645", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.645.tgz", + "integrity": "sha512-T7mYop3aDpRHIQaUYcmzmh6j9MAe560n6ukqjJMbVC6bVTau7dSpvB18bcsBPPtOSe10cKxhJFtlbEzLa0LL1g==", "dev": true }, "node_modules/emoji-regex": { @@ -2101,9 +2111,9 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.4.1.tgz", - "integrity": "sha512-4GbyIMzYktTFoRSmkbgZ1LU+RXwf4AQ8Z+rSuuh1dC8plp0PPeaWvx6+G4hh4KnUJ48VoxKbNyA1QQQIUpXjYA==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.7.0.tgz", + "integrity": "sha512-6njwt/NsZFUKhM6j9U8hzVyD4E4r0x7NQzhTCbcWOJ0IQjNSAoalWmb0AE51Wn+fwan5qVESWi7t2ToBxs9vrw==", "dev": true, "dependencies": { "graceful-fs": "^4.2.4", @@ -2160,6 +2170,12 @@ "is-arrayish": "^0.2.1" } }, + "node_modules/es-module-lexer": { + "version": "0.3.26", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.3.26.tgz", + "integrity": "sha512-Va0Q/xqtrss45hWzP8CZJwzGSZJjDM5/MJRE3IXXnUCcVLElR9BRaE9F62BopysASyc4nM3uwhSW7FFB9nlWAA==", + "dev": true + }, "node_modules/escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", @@ -2269,9 +2285,9 @@ "dev": true }, "node_modules/fast-glob": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.4.tgz", - "integrity": "sha512-kr/Oo6PX51265qeuCYsyGypiO5uJFgBS0jksyG7FUeCyQzNwYnzrNIMR1NXfkZXsMYXYLRAHgISHBz8gQcxKHQ==", + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.5.tgz", + "integrity": "sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg==", "dev": true, "peer": true, "dependencies": { @@ -2445,9 +2461,9 @@ } }, "node_modules/get-intrinsic": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.0.2.tgz", - "integrity": "sha512-aeX0vrFm21ILl3+JpFFRNe9aUvp6VFZb2/CTbgLb8j75kOhvoNYjt9d8KA/tJG4gSo8nzEDedRl0h7vDmBYRVg==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.0.tgz", + "integrity": "sha512-M11rgtQp5GZMZzDL7jLTNxbDfurpzuau5uqRWDPvlHjfvg3TdScAZo96GLvhMjImrmR8uAt0FS2RLoMrfWGKlg==", "dev": true, "dependencies": { "function-bind": "^1.1.1", @@ -2969,9 +2985,9 @@ } }, "node_modules/less-loader": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-7.2.1.tgz", - "integrity": "sha512-4v83WZ7KGbluOWPgk3iNjreAaJDNStfmmdfJbQIib3Jlc8mejV3w6A9xU+EkaivjBVqwQEK0y8cFthyNeGnrTQ==", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-7.3.0.tgz", + "integrity": "sha512-Mi8915g7NMaLlgi77mgTTQvK022xKRQBIVDSyfl3ErTuBhmZBQab0mjeJjNNqGbdR+qrfTleKXqbGI4uEFavxg==", "dev": true, "dependencies": { "klona": "^2.0.4", @@ -3228,9 +3244,9 @@ } }, "node_modules/mini-css-extract-plugin": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-1.3.3.tgz", - "integrity": "sha512-7lvliDSMiuZc81kI+5/qxvn47SCM7BehXex3f2c6l/pR3Goj58IQxZh9nuPQ3AkGQgoETyXuIqLDaO5Oa0TyBw==", + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-1.3.4.tgz", + "integrity": "sha512-dNjqyeogUd8ucUgw5sxm1ahvSfSUgef7smbmATRSbDm4EmNx5kQA6VdUEhEeCKSjX6CTYjb5vxgMUvRjqP3uHg==", "dev": true, "dependencies": { "loader-utils": "^2.0.0", @@ -3354,9 +3370,9 @@ "dev": true }, "node_modules/node-releases": { - "version": "1.1.69", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.69.tgz", - "integrity": "sha512-DGIjo79VDEyAnRlfSqYTsy+yoHd2IOjJiKUozD2MV2D85Vso6Bug56mb9tT/fY5Urt0iqk01H7x+llAruDR2zA==", + "version": "1.1.70", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.70.tgz", + "integrity": "sha512-Slf2s69+2/uAD79pVVQo8uSiC34+g8GWY8UH2Qtqv34ZfhYrxpYpfzs9Js9d6O0mbDmALuxaTlplnBTnSELcrw==", "dev": true }, "node_modules/normalize-package-data": { @@ -3698,9 +3714,9 @@ } }, "node_modules/proj4": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/proj4/-/proj4-2.6.3.tgz", - "integrity": "sha512-XRqnLmHWlvi7jqKNTqaOUrVy72JEtOUrnlLki99yZUOSvcSeBaZ1I/EGnQ2LzplSbjSrebGAdikqCLeCxC/YEg==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/proj4/-/proj4-2.7.0.tgz", + "integrity": "sha512-UVhulf8m70/dREOBrJagWq8cDYUgjQUWILRqys/gqo/+ZLeNB/04zbtPhJbz8+cCPzZNQMychfBaWUCP60U9mQ==", "dependencies": { "mgrs": "1.0.0", "wkt-parser": "^1.2.4" @@ -4515,20 +4531,21 @@ } }, "node_modules/webpack": { - "version": "5.12.3", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.12.3.tgz", - "integrity": "sha512-7tiQmcTnKhZwbf7X7sEfXe0pgkGjUZjT6JfYkZHvvIb4/ZsXl1rJu5PxsJoN7W3v5sNSP/8TgBoiOdDqVdvK5w==", + "version": "5.18.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.18.0.tgz", + "integrity": "sha512-RmiP/iy6ROvVe/S+u0TrvL/oOmvP+2+Bs8MWjvBwwY/j82Q51XJyDJ75m0QAGntL1Wx6B//Xc0+4VPP/hlNHmw==", "dev": true, "dependencies": { "@types/eslint-scope": "^3.7.0", - "@types/estree": "^0.0.45", + "@types/estree": "^0.0.46", "@webassemblyjs/ast": "1.11.0", "@webassemblyjs/wasm-edit": "1.11.0", "@webassemblyjs/wasm-parser": "1.11.0", "acorn": "^8.0.4", "browserslist": "^4.14.5", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.3.1", + "enhanced-resolve": "^5.7.0", + "es-module-lexer": "^0.3.26", "eslint-scope": "^5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", @@ -4561,14 +4578,15 @@ } }, "node_modules/webpack-cli": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.3.1.tgz", - "integrity": "sha512-/F4+9QNZM/qKzzL9/06Am8NXIkGV+/NqQ62Dx7DSqudxxpAgBqYn6V7+zp+0Y7JuWksKUbczRY3wMTd+7Uj6OA==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.4.0.tgz", + "integrity": "sha512-/Qh07CXfXEkMu5S8wEpjuaw2Zj/CC0hf/qbTDp6N8N7JjdGuaOjZ7kttz+zhuJO/J5m7alQEhNk9lsc4rC6xgQ==", "dev": true, "dependencies": { "@discoveryjs/json-ext": "^0.5.0", + "@webpack-cli/configtest": "^1.0.0", "@webpack-cli/info": "^1.2.1", - "@webpack-cli/serve": "^1.2.1", + "@webpack-cli/serve": "^1.2.2", "colorette": "^1.2.1", "commander": "^6.2.0", "enquirer": "^2.3.6", @@ -4578,7 +4596,7 @@ "interpret": "^2.2.0", "rechoir": "^0.7.0", "v8-compile-cache": "^2.2.0", - "webpack-merge": "^4.2.2" + "webpack-merge": "^5.7.3" }, "bin": { "webpack-cli": "bin/cli.js" @@ -4616,15 +4634,6 @@ "node": ">= 6" } }, - "node_modules/webpack-cli/node_modules/webpack-merge": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.2.2.tgz", - "integrity": "sha512-TUE1UGoTX2Cd42j3krGYqObZbOD+xF7u28WB7tfUordytSjbWTIjK/8V0amkBfTYN4/pB/GIDlJZZ657BGG19g==", - "dev": true, - "dependencies": { - "lodash": "^4.17.15" - } - }, "node_modules/webpack-merge": { "version": "5.7.3", "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.7.3.tgz", @@ -5992,9 +6001,9 @@ } }, "@types/estree": { - "version": "0.0.45", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.45.tgz", - "integrity": "sha512-jnqIUKDUqJbDIUxm0Uj7bnlMnRm1T/eZ9N+AVMqhPgzrba2GhGG5o/jCTwmdPK709nEZsGoMzXEDUjcXHa3W0g==", + "version": "0.0.46", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.46.tgz", + "integrity": "sha512-laIjwTQaD+5DukBZaygQ79K1Z0jb1bPEMRrkXSLjtCcZm+abyp5YbrqpSLzD42FwWW6gK/aS4NYpJ804nG2brg==", "dev": true }, "@types/glob": { @@ -6009,9 +6018,9 @@ } }, "@types/json-schema": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.6.tgz", - "integrity": "sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw==", + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.7.tgz", + "integrity": "sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA==", "dev": true }, "@types/minimatch": { @@ -6022,9 +6031,9 @@ "peer": true }, "@types/node": { - "version": "14.14.20", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.20.tgz", - "integrity": "sha512-Y93R97Ouif9JEOWPIUyU+eyIdyRqQR0I8Ez1dzku4hDx34NWh4HbtIc3WNzwB1Y9ULvNGeu5B8h8bVL5cAk4/A==", + "version": "14.14.22", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.22.tgz", + "integrity": "sha512-g+f/qj/cNcqKkc3tFqlXOYjrmZA+jNBiDzbP3kH+B+otKFqAdPgVTGP1IeKRdMml/aE69as5S4FqtxAbl+LaMw==", "dev": true }, "@webassemblyjs/ast": { @@ -6173,6 +6182,13 @@ "@xtuc/long": "4.2.2" } }, + "@webpack-cli/configtest": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.0.0.tgz", + "integrity": "sha512-Un0SdBoN1h4ACnIO7EiCjWuyhNI0Jl96JC+63q6xi4HDUYRZn8Auluea9D+v9NWKc5J4sICVEltdBaVjLX39xw==", + "dev": true, + "requires": {} + }, "@webpack-cli/info": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.2.1.tgz", @@ -6183,9 +6199,9 @@ } }, "@webpack-cli/serve": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.2.1.tgz", - "integrity": "sha512-Zj1z6AyS+vqV6Hfi7ngCjFGdHV5EwZNIHo6QfFTNe9PyW+zBU1zJ9BiOW1pmUEq950RC4+Dym6flyA/61/vhyw==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.2.2.tgz", + "integrity": "sha512-03GkWxcgFfm8+WIwcsqJb9agrSDNDDoxaNnexPnCCexP5SCE4IgFd9lNpSy+K2nFqVMpgTFw6SwbmVAVTndVew==", "dev": true, "requires": {} }, @@ -6202,9 +6218,9 @@ "dev": true }, "acorn": { - "version": "8.0.4", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.0.4.tgz", - "integrity": "sha512-XNP0PqF1XD19ZlLKvB7cMmnZswW4C/03pRHgirB30uSJTaS3A3V1/P4sS3HPvFmjoriPCJQs+JDSbm4bL1TxGQ==", + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.0.5.tgz", + "integrity": "sha512-v+DieK/HJkJOpFBETDJioequtc3PfxsWMaxIdIwujtF7FEV/MAyDQLlm6/zPvr7Mix07mLh6ccVwIsloceodlg==", "dev": true }, "ajv": { @@ -6329,9 +6345,9 @@ "dev": true }, "call-bind": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.1.tgz", - "integrity": "sha512-tvAvUwNcRikl3RVF20X9lsYmmepsovzTWeJiXjO0PkJp15uy/6xKFZOQtuiSULwYW+6ToZBprphCgWXC2dSgcQ==", + "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", @@ -6345,9 +6361,9 @@ "dev": true }, "caniuse-lite": { - "version": "1.0.30001174", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001174.tgz", - "integrity": "sha512-tqClL/4ThQq6cfFXH3oJL4rifFBeM6gTkphjao5kgwMaW9yn0tKgQLAEfKzDwj6HQWCB/aWo8kTFlSvIN8geEA==", + "version": "1.0.30001179", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001179.tgz", + "integrity": "sha512-blMmO0QQujuUWZKyVrD1msR4WNDAqb/UPO1Sw2WWsQ7deoM5bJiicKnWJ1Y0NS/aGINSnKPIWBMw5luX+NDUCA==", "dev": true }, "chalk": { @@ -6480,12 +6496,12 @@ } }, "core-js-compat": { - "version": "3.8.2", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.8.2.tgz", - "integrity": "sha512-LO8uL9lOIyRRrQmZxHZFl1RV+ZbcsAkFWTktn5SmH40WgLtSNYN4m4W2v9ONT147PxBY/XrRhrWq8TlvObyUjQ==", + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.8.3.tgz", + "integrity": "sha512-1sCb0wBXnBIL16pfFG1Gkvei6UzvKyTNYpiC41yrdjEv0UoJoq9E/abTMzyYJ6JpTkAj15dLjbqifIzEBDVvog==", "dev": true, "requires": { - "browserslist": "^4.16.0", + "browserslist": "^4.16.1", "semver": "7.0.0" }, "dependencies": { @@ -6614,9 +6630,9 @@ "dev": true }, "electron-to-chromium": { - "version": "1.3.635", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.635.tgz", - "integrity": "sha512-RRriZOLs9CpW6KTLmgBqyUdnY0QNqqWs0HOtuQGGEMizOTNNn1P7sGRBxARnUeLejOsgwjDyRqT3E/CSst02ZQ==", + "version": "1.3.645", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.645.tgz", + "integrity": "sha512-T7mYop3aDpRHIQaUYcmzmh6j9MAe560n6ukqjJMbVC6bVTau7dSpvB18bcsBPPtOSe10cKxhJFtlbEzLa0LL1g==", "dev": true }, "emoji-regex": { @@ -6632,9 +6648,9 @@ "dev": true }, "enhanced-resolve": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.4.1.tgz", - "integrity": "sha512-4GbyIMzYktTFoRSmkbgZ1LU+RXwf4AQ8Z+rSuuh1dC8plp0PPeaWvx6+G4hh4KnUJ48VoxKbNyA1QQQIUpXjYA==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.7.0.tgz", + "integrity": "sha512-6njwt/NsZFUKhM6j9U8hzVyD4E4r0x7NQzhTCbcWOJ0IQjNSAoalWmb0AE51Wn+fwan5qVESWi7t2ToBxs9vrw==", "dev": true, "requires": { "graceful-fs": "^4.2.4", @@ -6676,6 +6692,12 @@ "is-arrayish": "^0.2.1" } }, + "es-module-lexer": { + "version": "0.3.26", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.3.26.tgz", + "integrity": "sha512-Va0Q/xqtrss45hWzP8CZJwzGSZJjDM5/MJRE3IXXnUCcVLElR9BRaE9F62BopysASyc4nM3uwhSW7FFB9nlWAA==", + "dev": true + }, "escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", @@ -6757,9 +6779,9 @@ "dev": true }, "fast-glob": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.4.tgz", - "integrity": "sha512-kr/Oo6PX51265qeuCYsyGypiO5uJFgBS0jksyG7FUeCyQzNwYnzrNIMR1NXfkZXsMYXYLRAHgISHBz8gQcxKHQ==", + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.5.tgz", + "integrity": "sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg==", "dev": true, "peer": true, "requires": { @@ -6891,9 +6913,9 @@ "dev": true }, "get-intrinsic": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.0.2.tgz", - "integrity": "sha512-aeX0vrFm21ILl3+JpFFRNe9aUvp6VFZb2/CTbgLb8j75kOhvoNYjt9d8KA/tJG4gSo8nzEDedRl0h7vDmBYRVg==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.0.tgz", + "integrity": "sha512-M11rgtQp5GZMZzDL7jLTNxbDfurpzuau5uqRWDPvlHjfvg3TdScAZo96GLvhMjImrmR8uAt0FS2RLoMrfWGKlg==", "dev": true, "requires": { "function-bind": "^1.1.1", @@ -7307,9 +7329,9 @@ } }, "less-loader": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-7.2.1.tgz", - "integrity": "sha512-4v83WZ7KGbluOWPgk3iNjreAaJDNStfmmdfJbQIib3Jlc8mejV3w6A9xU+EkaivjBVqwQEK0y8cFthyNeGnrTQ==", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-7.3.0.tgz", + "integrity": "sha512-Mi8915g7NMaLlgi77mgTTQvK022xKRQBIVDSyfl3ErTuBhmZBQab0mjeJjNNqGbdR+qrfTleKXqbGI4uEFavxg==", "dev": true, "requires": { "klona": "^2.0.4", @@ -7469,9 +7491,9 @@ "dev": true }, "mini-css-extract-plugin": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-1.3.3.tgz", - "integrity": "sha512-7lvliDSMiuZc81kI+5/qxvn47SCM7BehXex3f2c6l/pR3Goj58IQxZh9nuPQ3AkGQgoETyXuIqLDaO5Oa0TyBw==", + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-1.3.4.tgz", + "integrity": "sha512-dNjqyeogUd8ucUgw5sxm1ahvSfSUgef7smbmATRSbDm4EmNx5kQA6VdUEhEeCKSjX6CTYjb5vxgMUvRjqP3uHg==", "dev": true, "requires": { "loader-utils": "^2.0.0", @@ -7564,9 +7586,9 @@ "dev": true }, "node-releases": { - "version": "1.1.69", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.69.tgz", - "integrity": "sha512-DGIjo79VDEyAnRlfSqYTsy+yoHd2IOjJiKUozD2MV2D85Vso6Bug56mb9tT/fY5Urt0iqk01H7x+llAruDR2zA==", + "version": "1.1.70", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.70.tgz", + "integrity": "sha512-Slf2s69+2/uAD79pVVQo8uSiC34+g8GWY8UH2Qtqv34ZfhYrxpYpfzs9Js9d6O0mbDmALuxaTlplnBTnSELcrw==", "dev": true }, "normalize-package-data": { @@ -7808,9 +7830,9 @@ "dev": true }, "proj4": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/proj4/-/proj4-2.6.3.tgz", - "integrity": "sha512-XRqnLmHWlvi7jqKNTqaOUrVy72JEtOUrnlLki99yZUOSvcSeBaZ1I/EGnQ2LzplSbjSrebGAdikqCLeCxC/YEg==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/proj4/-/proj4-2.7.0.tgz", + "integrity": "sha512-UVhulf8m70/dREOBrJagWq8cDYUgjQUWILRqys/gqo/+ZLeNB/04zbtPhJbz8+cCPzZNQMychfBaWUCP60U9mQ==", "requires": { "mgrs": "1.0.0", "wkt-parser": "^1.2.4" @@ -8432,20 +8454,21 @@ } }, "webpack": { - "version": "5.12.3", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.12.3.tgz", - "integrity": "sha512-7tiQmcTnKhZwbf7X7sEfXe0pgkGjUZjT6JfYkZHvvIb4/ZsXl1rJu5PxsJoN7W3v5sNSP/8TgBoiOdDqVdvK5w==", + "version": "5.18.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.18.0.tgz", + "integrity": "sha512-RmiP/iy6ROvVe/S+u0TrvL/oOmvP+2+Bs8MWjvBwwY/j82Q51XJyDJ75m0QAGntL1Wx6B//Xc0+4VPP/hlNHmw==", "dev": true, "requires": { "@types/eslint-scope": "^3.7.0", - "@types/estree": "^0.0.45", + "@types/estree": "^0.0.46", "@webassemblyjs/ast": "1.11.0", "@webassemblyjs/wasm-edit": "1.11.0", "@webassemblyjs/wasm-parser": "1.11.0", "acorn": "^8.0.4", "browserslist": "^4.14.5", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.3.1", + "enhanced-resolve": "^5.7.0", + "es-module-lexer": "^0.3.26", "eslint-scope": "^5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", @@ -8538,14 +8561,15 @@ } }, "webpack-cli": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.3.1.tgz", - "integrity": "sha512-/F4+9QNZM/qKzzL9/06Am8NXIkGV+/NqQ62Dx7DSqudxxpAgBqYn6V7+zp+0Y7JuWksKUbczRY3wMTd+7Uj6OA==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.4.0.tgz", + "integrity": "sha512-/Qh07CXfXEkMu5S8wEpjuaw2Zj/CC0hf/qbTDp6N8N7JjdGuaOjZ7kttz+zhuJO/J5m7alQEhNk9lsc4rC6xgQ==", "dev": true, "requires": { "@discoveryjs/json-ext": "^0.5.0", + "@webpack-cli/configtest": "^1.0.0", "@webpack-cli/info": "^1.2.1", - "@webpack-cli/serve": "^1.2.1", + "@webpack-cli/serve": "^1.2.2", "colorette": "^1.2.1", "commander": "^6.2.0", "enquirer": "^2.3.6", @@ -8555,7 +8579,7 @@ "interpret": "^2.2.0", "rechoir": "^0.7.0", "v8-compile-cache": "^2.2.0", - "webpack-merge": "^4.2.2" + "webpack-merge": "^5.7.3" }, "dependencies": { "commander": { @@ -8563,15 +8587,6 @@ "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", "dev": true - }, - "webpack-merge": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.2.2.tgz", - "integrity": "sha512-TUE1UGoTX2Cd42j3krGYqObZbOD+xF7u28WB7tfUordytSjbWTIjK/8V0amkBfTYN4/pB/GIDlJZZ657BGG19g==", - "dev": true, - "requires": { - "lodash": "^4.17.15" - } } } }, diff --git a/src/css/page.css b/src/css/page.css index 16d9ed5..87531f4 100644 --- a/src/css/page.css +++ b/src/css/page.css @@ -51,14 +51,13 @@ section { /* margin: 10px; */ } -.input-area { - /* flex: 1; +/*.input-area { + flex: 1; display: flex; flex-direction: column; align-items: center; - justify-content: center; */ - /* margin: 10px; */ -} + justify-content: center; +}*/ .btnDownloadMeme { margin-top: 10px; @@ -569,7 +568,6 @@ label>.label-body { color: #757575; background-color: white; border-bottom: 1px solid #dcdcdc; - /* border-bottom: 1px solid #dcdcdc; */ } .navigation ul { @@ -773,6 +771,8 @@ there. @media (min-width: 1200px) {} + + .tab-content { min-height: 390px; } @@ -813,4 +813,42 @@ ul.tab-nav li span.active.button { .tab-content .tab-pane.active { display: block; /* visibility: visible; */ +} + + + +.red-label { + color: #f00; + padding: 2px; + text-shadow: -1px -1px #FFF, 0 -1px #FFF, 1px -1px #FFF, -1px 0 #FFF, 1px 0 #FFF, -1px 1px #FFF, 0 1px #FFF, 1px 1px #FFF; + position: absolute; + pointer-events: none; + -moz-user-select: none; + -ms-user-select: none; + -webkit-user-select: none; + user-select: none; +} + +.green-label { + color: #7cfc00; + padding: 2px; + text-shadow: -1px -1px #FFF, 0 -1px #FFF, 1px -1px #FFF, -1px 0 #FFF, 1px 0 #FFF, -1px 1px #FFF, 0 1px #FFF, 1px 1px #FFF; + position: absolute; + pointer-events: none; + -moz-user-select: none; + -ms-user-select: none; + -webkit-user-select: none; + user-select: none; +} + +.blue-label { + color: #00bfff; + padding: 2px; + text-shadow: -1px -1px #FFF, 0 -1px #FFF, 1px -1px #FFF, -1px 0 #FFF, 1px 0 #FFF, -1px 1px #FFF, 0 1px #FFF, 1px 1px #FFF; + position: absolute; + pointer-events: none; + -moz-user-select: none; + -ms-user-select: none; + -webkit-user-select: none; + user-select: none; } \ No newline at end of file diff --git a/src/js/controls/NorthArrow.js b/src/js/controls/NorthArrow.js index 5533e86..f78cbe5 100644 --- a/src/js/controls/NorthArrow.js +++ b/src/js/controls/NorthArrow.js @@ -9,10 +9,6 @@ import { WebGLRenderer } from 'three/src/renderers/WebGLRenderer'; import { Scene } from 'three/src/scenes/Scene'; import { PerspectiveCamera } from 'three/src/cameras/PerspectiveCamera'; -// import { SphereGeometry } from 'three/src/geometries/SphereGeometry'; -// import { MeshLambertMaterial } from 'three/src/materials/MeshLambertMaterial'; -// import { Mesh } from 'three/src/objects/Mesh'; - import './NorthArrow.css'; export class NortArrow extends Control { diff --git a/src/js/core/Map.js b/src/js/core/Map.js index 095bd06..e870fa8 100644 --- a/src/js/core/Map.js +++ b/src/js/core/Map.js @@ -12,12 +12,17 @@ class Map extends OrbitControls { _controlContainer; _controls; - constructor(size, center, camera, scene, domElement, container) { + constructor(x, y, z, size, center, camera, scene, domElement, container) { // call parent constructor of OrbitControls super(size, center, camera, scene, domElement); this.camera = camera; this.container = container; + this.length = x.max - x.min; + this.width = y.max - y.min; + this.x = x; + this.y = y; + this.z = z; //init the control corners if (this._initControlPos) { diff --git a/src/js/layer/BoxLayer.js b/src/js/layer/BoxLayer.js index 6c08068..b003311 100644 --- a/src/js/layer/BoxLayer.js +++ b/src/js/layer/BoxLayer.js @@ -11,6 +11,7 @@ class BoxLayer extends Layer { this.visible = true; this.name = params.name; this.color = params.color; + this.center = params.center; this.geometry = new BoxGeometry(params.width, params.height, params.depth); this.material = new MeshBasicMaterial({ color: this.color @@ -18,9 +19,10 @@ class BoxLayer extends Layer { this.materials = []; this.materials.push(this.material); this.mesh = new Mesh(this.geometry, this.material); - this.mesh.position.x = 4282010; - this.mesh.position.y = 2302070; - this.mesh.position.z = -13616.3; + // this.mesh.position.x = 4282010; + // this.mesh.position.y = 2302070; + // this.mesh.position.z = -13616.3; + this.mesh.position.set(this.center.x, this.center.y, this.center.z); } setVisible(visible) { diff --git a/src/js/layer/GridLayer.js b/src/js/layer/GridLayer.js new file mode 100644 index 0000000..b263db3 --- /dev/null +++ b/src/js/layer/GridLayer.js @@ -0,0 +1,383 @@ +import { BufferGeometry } from 'three/src/core/BufferGeometry'; +import { Float32BufferAttribute } from 'three/src/core/BufferAttribute'; +import { LineBasicMaterial } from 'three/src/materials/LineBasicMaterial'; +import { PointsMaterial } from 'three/src/materials/PointsMaterial'; +import { LineSegments } from 'three/src/objects/LineSegments'; +import { Layer } from './Layer'; +import { Group } from 'three/src/objects/Group'; +// import { Color } from 'three/src/math/Color'; +import { Vector3 } from 'three/src/math/Vector3'; +import { Geometry } from 'three/src/core/Geometry'; +import { Line } from 'three/src/objects/Line'; +import { Points } from 'three/src/objects/Points'; + +export class GridLayer extends Layer { + + constructor(params) { + super(); + this.type = 'GridLayer'; + + //this.features = []; + this.visible = true; + this.opacity = 1; + this.materials = []; + for (var k in params) { + this[k] = params[k]; + } + this.objectGroup = new Group(); + this.labelConnectorGroup = new Group(); + + //for labeling + // this.l = { i: 0, v: 4.99999999998, ht: 3 };//ht:3, ht:1 an der Ebene + this.labelInfo = { i: 0, v: 100, ht: 3 };//ht:3, ht:1 an der Ebene + this.labels = []; + this.scale = 1; + } + + scaleZ(z) { + this.objectGroup.scale.z = z; + this.labelConnectorGroup.scale.z = z; + } + + setWireframeMode(wireframe) { + this.materials.forEach(function (mat) { + //if (m.w) return; + //m.mat.wireframe = wireframe; + mat.wireframe = wireframe; + }); + } + + setVisible(visible) { + this.visible = visible; + this.objectGroup.visible = visible; + this.labelConnectorGroup.visible = visible; + this.labelParentElement.style.display = (this.objectGroup.visible == true) ? "block" : "none"; + this.emit('visibility-change'); + } + + onRemove(map) { + this.getScene().remove(this.objectGroup); + } + + onAdd(map) { + let divisions = 5; + // let size = map.length / 10; + + + let gridXZ = this.build(map.length, divisions, map.center.y, map.width); + // gridXZ.position.set(this.center.x, this.center.y, this.center.z); + + // size = map.width / 10; + // let gridYZ = this.build(0, size, map.length / 2, map.width); + // gridYZ.rotation.z = Math.PI / 2; + // gridYZ.position.set(this.center.x, this.center.y, this.center.z); + + let gridY = this.buildY(map.width, divisions, map.center.z, map.width); + + //waagrechtes grid + // // let gridXY = this.build(map.length, divisions, 0, map.width); + // let gridXY = this.build(map.length, divisions, map.center.y, map.width); + // // gridXY.position.set(this.center.x, this.center.y, this.center.z); + // gridXY.rotation.x = Math.PI / 2; + + this.buildLabels(divisions); + + this.getScene().add(this.objectGroup); + this.getScene().add(this.labelConnectorGroup); + } + + buildY(size, divisions, constant, height) { + let step = size / divisions; + let vertices = []; + + for (let k = this._map.y.min; k <= this._map.y.max; k = k + step) { + vertices.push(this._map.x.min, k, constant, this._map.x.max, k, constant) + } + + let geometry = new BufferGeometry(); + let positions = new Float32BufferAttribute(vertices, 3); + geometry.setAttribute('position', positions); + let material = new LineBasicMaterial({ + linewidth: 1, + color: 0xA0A1A3 + }); + this.materials.push(material); + + //THREE.LineSegments.call(this, geometry, material); + let lineSegments = new LineSegments(geometry, material); + this.objectGroup.add(lineSegments); + return lineSegments; + } + + build(size, divisions, constant_position, height) { + let step = size / divisions; + let vertices = []; + + //for (var i = -size; i <= size; i += step) { + // vertices.push(i, position, height, i, position, -height);//senkrecht + //} + + // for (let k = - halfSize; k <= halfSize; k = k + step) { + for (let k = this._map.x.min; k <= this._map.x.max; k = k + step) { + vertices.push(k, constant_position, height / 2, k, constant_position, -height / 2);//senkrecht + // vertices.push(-halfSize, constant_position, k, halfSize, constant_position, k);//waagrecht + + } + + // // for (let j = -height; j <= height; j += step) { + // for (let j = this._map.z.min; j <= this._map.z.max; j += step) { + // // vertices.push(-halfSize, constant_position, j, halfSize, constant_position, j);//waagrecht + // vertices.push(this._map.x.min, constant_position, j, this._map.x.max, constant_position, j);//waagrecht + // } + + let geometry = new BufferGeometry(); + let positions = new Float32BufferAttribute(vertices, 3); + geometry.setAttribute('position', positions); + let material = new LineBasicMaterial({ + linewidth: 1, + color: 0xA0A1A3 + }); + this.materials.push(material); + + + //THREE.LineSegments.call(this, geometry, material); + let lineSegments = new LineSegments(geometry, material); + //this.visible = false; + //this.geometry.visible = this.visible; + + this.objectGroup.add(lineSegments); + return lineSegments; + } + + _round(value, decimals) { + return Number(Math.round(value + 'e' + decimals) + 'e-' + decimals); + } + + buildLabels(divisions = 5) { + let size = this._map.length; + let step = size / divisions; + + // this.parent = parent; + // this.parentElement = parentElement; + // var width = 80; + let labels = new Array(); + + // for (let k = - halfSize; k <= halfSize; k = k + step) { + for (let k = this._map.x.min; k <= this._map.x.max; k = k + step) { + if (k % 1 != 0) k = this._round(k, 2); + let info = { a: k, size: step, axis: "x", color: 0xff0000, cl: "red-label", h: 0.6, centroid: [[k, this._map.center.y, this._map.width / 2]] }; + labels.push(info); + } + + size = this._map.width; + step = size / divisions; + for (let k = this._map.y.min; k <= this._map.y.max; k = k + step) { + if (k % 1 != 0) k = this._round(k, 2); + let info = { a: k, size: step, axis: "y", color: 0x00ff00, cl: "green-label", h: 0.6, centroid: [[this._map.x.min, k, this._map.center.z]] }; + labels.push(info); + } + + //label + // this.f = [ + // { a: [i18n.widgets.gridlayer.east], cl: "red-label", h: 0.0, centroid: [[0, width / 2 + 15, this.height]], axis: true }, + // { a: [this._map.getMapX(-10)], cl: "red-label", h: 0.0, centroid: [[-10, width / 2, this.height]] }, + // { a: [this._map.getMapX(-20)], cl: "red-label", h: 0.6, centroid: [[-20, width / 2, this.height]] }, + // { a: [this._map.getMapX(-30)], cl: "red-label", h: 0.6, centroid: [[-30, width / 2, this.height]] }, + // { a: [this._map.getMapX(-40)], cl: "red-label", h: 0.6, centroid: [[-40, width / 2, this.height]] }, + // { a: [this._map.getMapX(-50)], cl: "red-label", h: 0.6, hs: 4, centroid: [[-50, width / 2, this.height]] }, + // { a: [this._map.getMapX(0)], cl: "red-label", h: 0.6, centroid: [[0, width / 2, this.height]] }, + // { a: [this._map.getMapX(10)], cl: "red-label", h: 0.6, centroid: [[10, width / 2, this.height]] }, + // { a: [this._map.getMapX(20)], cl: "red-label", h: 0.6, centroid: [[20, width / 2, this.height]] }, + // { a: [this._map.getMapX(30)], cl: "red-label", h: 0.6, centroid: [[30, width / 2, this.height]] }, + // { a: [this._map.getMapX(40)], cl: "red-label", h: 0.6, centroid: [[40, width / 2, this.height]] }, + // { a: [this._map.getMapX(50)], cl: "red-label", h: 0.6, centroid: [[50, width / 2, this.height]] } + // ]; + var getCentroidFunc = function (f) { return f.centroid; }; + + // Layer must belong to a project + let labelInfo = this.labelInfo; + if (labelInfo === undefined || getCentroidFunc === undefined) return; + + // // let line_mat = new LineBasicMaterial({ color: Gba3D.Options.label.connectorColor }); + // let line_mat = new LineBasicMaterial({ + // linewidth: 1, + // color: 0x80CCFF + // }); + // this.labelConnectorGroup = new Group(); + this.labelConnectorGroup.userData.layerId = this.index; + // if (parent) { + // parent.add(this.labelConnectorGroup); + // } + // this.getScene().add(this.labelConnectorGroup); + this.labelConnectorGroup.visible = this.objectGroup.visible; + + // create parent element for labels + this.labelParentElement = document.createElement("div"); + this._map.container.appendChild(this.labelParentElement); + this.labelParentElement.style.display = (this.objectGroup.visible) ? "block" : "none"; + + for (let i = 0, l = labels.length; i < l; i++) { + let f = labels[i]; + f.aElems = []; + f.aObjs = []; + let text = f.a; + if (text === null || text === "") continue; + + let classLabel = f.cl; + if (classLabel === undefined || classLabel === "") classLabel = "label"; + + let horizontalShiftLabel = f.hs; + if (horizontalShiftLabel === undefined || horizontalShiftLabel === "") horizontalShiftLabel = 0; + + // let line_mat = new LineBasicMaterial({ color: Gba3D.Options.label.connectorColor }); + let line_mat = new LineBasicMaterial({ + linewidth: 1, + color: f.color //0x80CCFF + }); + + let pts = getCentroidFunc(f); + for (let j = 0, m = pts.length; j < m; j++) { + let pt = pts[j]; + + // create div element for label + let e = document.createElement("div"); + e.appendChild(document.createTextNode(text)); + e.className = classLabel;// "label"; + this.labelParentElement.appendChild(e); + + // let z = labelHeightFunc(f, pt); + let pt0, pt1; + if (f.axis == "x") { + pt0 = new Vector3(pt[0], pt[1], pt[2]); // bottom + pt1 = new Vector3(pt[0] + horizontalShiftLabel, pt[1], pt[2] + f.size / 2); // top + } + else if (f.axis == "y") { + pt0 = new Vector3(pt[0], pt[1], pt[2]); + pt1 = new Vector3(pt[0] - horizontalShiftLabel - f.size, pt[1], pt[2]); + } + // create connector - not for axis + // if (f.axis !== true) { + let geom = new Geometry(); + geom.vertices.push(pt1, pt0); + + let line = new Line(geom, line_mat); + // line.position.set(this.center.x, this.center.y, this.center.z); + + line.userData.layerId = this.index; + line.userData.featureId = i; + this.labelConnectorGroup.add(line); + // } + + f.aElems.push(e); + ////f.labelDiv = e; + f.aObjs.push(line); + this.labels.push({ labelDiv: e, obj: line, pt: pt1 }); + } + } + + } + + animate() { + this._updateLabelPosition(); + } + + // update label position + _updateLabelPosition() { + if (this.labels.length === 0 || this.objectGroup.visible === false) return; + + let container = document.getElementById("webgl"); + // let widthHalf = 0.5 * container.clientWidth; + // let heightHalf = 0.5 * container.clientHeight; + + + // autosize = appSettings.Options.label.autoSize, + let autosize = true; + let camera = this._map.camera; + let camera_pos = camera.position; + let c2t = this._map.target.clone().sub(camera_pos); + let c2l = new Vector3(); + + //neu + // app.labels = app.controls.gridlayer.labels; + let scaleFactor = this.scale; + + // make a list of [label index, distance to camera] + let idx_dist = []; + for (var i = 0, l = this.labels.length; i < l; i++) { + // let firstLinePoint = this.labels[i].obj.geometry.vertices[0]; + idx_dist.push([i, camera_pos.distanceTo(this.labels[i].pt)]); + } + + // sort label indexes in descending order of distances + idx_dist.sort(function (a, b) { + if (a[1] < b[1]) return 1; + if (a[1] > b[1]) return -1; + return 0; + }); + + let label, labelDiv, x, y, dist, fontSize; + // var minFontSize = appSettings.Options.label.minFontSize; + for (let i = 0, l = idx_dist.length; i < l; i++) { + label = this.labels[idx_dist[i][0]]; + labelDiv = label.labelDiv; + if (c2l.subVectors(label.pt, camera_pos).dot(c2t) > 0) { + // label is in front + + // // calculate label position + // vector.copy(label.pt); + // vector.applyMatrix4(label.obj.matrixWorld); + // // map to normalized device coordinate (NDC) space + // camera.updateMatrixWorld(); + // vector.project(camera); + // if (scaleFactor > 1) { + // v.z = v.z * scaleFactor; + // } + // vector.x = (vector.x * widthHalf) + widthHalf; + // vector.y = - (vector.y * heightHalf) + heightHalf; + + let proj = this.toScreenPosition(label.obj, label.pt, camera); + // set label position + labelDiv.style.display = "block"; + labelDiv.style.left = proj.x + 'px'; + labelDiv.style.top = proj.y + 'px'; + labelDiv.style.zIndex = i + 1; + let minFontSize = 10; + // set font size + if (autosize) { + dist = idx_dist[i][1]; + if (dist < 12) dist = 12; + fontSize = Math.max(Math.round(1000 / dist), minFontSize); + labelDiv.style.fontSize = fontSize + "px"; + } + } else { + // label is in back + labelDiv.style.display = "none"; + } + } + } + + toScreenPosition(obj, pt, camera) { + let vector = new Vector3(); + // calculate label position + vector.copy(pt); + + // TODO: need to update this when resize window + let container = document.getElementById("webgl"); + let widthHalf = 0.5 * container.clientWidth; + let heightHalf = 0.5 * container.clientHeight; + + // obj.updateMatrixWorld(); + // vector.applyMatrix4(obj.matrixWorld); + vector.project(camera); + + vector.x = (vector.x * widthHalf) + widthHalf; + vector.y = - (vector.y * heightHalf) + heightHalf; + + return { + x: vector.x, + y: vector.y + }; + + } + +} \ No newline at end of file diff --git a/src/js/layer/TinLayer.js b/src/js/layer/TinLayer.js index 448cd7b..c81447f 100644 --- a/src/js/layer/TinLayer.js +++ b/src/js/layer/TinLayer.js @@ -53,7 +53,6 @@ class TinLayer extends Layer { async onAdd(map) { await this.build(this.getScene()); map.update(); - // this.emit('add'); } //build BufferGeometry with Index diff --git a/src/js/main.js b/src/js/main.js index ff8dd83..fe56940 100644 --- a/src/js/main.js +++ b/src/js/main.js @@ -5,11 +5,13 @@ import { PerspectiveCamera } from 'three/src/cameras/PerspectiveCamera'; import { Scene } from 'three/src/scenes/Scene'; import { Vector3 } from 'three/src/math/Vector3'; import { TinLayer } from './layer/TinLayer'; +import { GridLayer } from './layer/GridLayer'; +// import { BoxLayer } from './layer/BoxLayer'; import { DemLayer } from './layer/DemLayer'; import { Map } from './core/Map'; import * as domEvent from './core/domEvent'; import { Coordinates } from './controls/Coordinates'; -import { NortArrow } from './controls/NorthArrow'; +// import { NortArrow } from './controls/NorthArrow'; import { LayerControl } from './controls/LayerControl'; import { BasemapControl } from './controls/BasemapControl'; import { SliderControl } from './controls/SliderControl'; @@ -108,36 +110,32 @@ class Application { var aspect = this.width / this.height; var near = 0.1; //This is the distance at which the camera will start rendering scene objects var far = 2000; //Anything beyond this distance will not be rendered - this.camera = new PerspectiveCamera(angle, aspect, near, far); + // this.camera = new PerspectiveCamera(angle, aspect, near, far); // this.camera.position.set(0, -0.1, 150); // this.camera.lookAt(new Vector3(0, 0, 0)); this.camera = new PerspectiveCamera(30, this.width / this.height, 100, 100000); - // const dirLight = new DirectionalLight(0xffffff, 1); // dirLight.position.set(585000 + 10000, 6135000 + 10000, -500 + 5000); // this.camera.add(dirLight); - let x = { min: 3955850, max: 4527300, avg: 4282010 }; // let y = { min: 2183600, max: 2502700, avg: 2302070 }; let y = { min: 2182271.6538, max: 2504028.3462 , avg: 2302070 }; let z = { min: -60066, max: 3574.94, avg: -13616.3 }; - const center = new Vector3((x.min + x.max) / 2, (y.min + y.max) / 2, z.avg); + const center = new Vector3((x.min + x.max) / 2, (y.min + y.max) / 2, 0); // const center = new Vector3(x.avg, y.avg, z.avg); - const size = Math.max(x.max - x.min, y.max - y.min, z.max - z.min); - - + const size = Math.max(x.max - x.min, y.max - y.min, z.max - z.min); let baseExtent= { x: x, y: y }; const camDirection = new Vector3(-0.5, -Math.SQRT1_2, 0.5); + // const camDirection = new Vector3(0, 0, 1); const camOffset = camDirection.multiplyScalar(size * 2); - this.camera.position.copy(center); - this.camera.position.add(camOffset); - // this.camera.position.set(0, 0, 1500); + this.camera.position.copy(center); + this.camera.position.add(camOffset); this.camera.near = size * 0.1; this.camera.far = size * 25; this.camera.updateProjectionMatrix(); @@ -153,13 +151,13 @@ class Application { // this.camera.position.set(0, -0.1, 150); // this.camera.lookAt(new Vector3(0, 0, 0)); - // create map - this.map = new Map(size, center, this.camera, this.scene, this.renderer.domElement, this.container); + // create map + this.map = new Map(x, y, z, size, center, this.camera, this.scene, this.renderer.domElement, this.container); // this.map.minDistance = size*0.75; // this.map.maxDistance = size*15; // let boxLayer = new BoxLayer({ - // width: 10000, height: 10000, depth: 10000, name: 'test-box', color: 800080 + // width: 10000, height: 10000, depth: 10000, name: 'center-box', color: 800080 , center: center // }); // this.map.addLayer(boxLayer); @@ -173,9 +171,7 @@ class Application { // this.animate(); // }, this); } - this.northArrow = new NortArrow({ headLength: 1, headWidth: 1 }).addTo(this.map); - - // this.dialog = new MobileDialog("Help", { klass: "fm_about", parentDiv: 'basemap-control-parent' }).addTo(this.map); + // this.northArrow = new NortArrow({ headLength: 1, headWidth: 1 }).addTo(this.map); let demLayer = new DemLayer({ q: 0, shading: true, type: 'dem', name: 'DEM Layer', color: 16382457, "baseExtent": baseExtent, @@ -234,6 +230,9 @@ class Application { }); this.map.addLayer(dxf140Layer); + this.gridlayer = new GridLayer({ center: center, name: "coordinate grid", appWidth: this.width, appHeight: this.height }); + this.map.addLayer(this.gridlayer); + new LayerControl(this.map.layers, { collapsed: true, parentDiv: 'layer-control-parent-id' @@ -332,7 +331,8 @@ class Application { animate() { this.renderer.render(this.scene, this.camera); - this.northArrow.animate(); + // this.northArrow.animate(); + this.gridlayer.animate(); } addEventListeners() { @@ -464,5 +464,5 @@ class Application { } -var container = document.getElementById("webgl"); +let container = document.getElementById("webgl"); new Application(container);