From 2e5b17f44fd02f54e2312628ea13dd3b298699c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A5kon=20Flatval?= <70905152+haakonflatval-cognite@users.noreply.github.com> Date: Fri, 30 Jun 2023 09:24:30 +0200 Subject: [PATCH 1/9] chore: fix lib-check errors in examples (#3370) * chore: fix lib-check errors in examples --- examples/package.json | 8 +- examples/tsconfig.json | 2 +- examples/yarn.lock | 270 ++++++++---------- .../utilities/src/three/VariableWidthLine.ts | 4 +- 4 files changed, 122 insertions(+), 162 deletions(-) diff --git a/examples/package.json b/examples/package.json index 86d0b8435cb..f57f4e1c1ae 100644 --- a/examples/package.json +++ b/examples/package.json @@ -28,7 +28,6 @@ "lodash": "^4.17.21", "react": "18.2.0", "react-dom": "18.2.0", - "react-router-dom": "6.11.1", "stats.js": "0.17.0", "styled-components": "5.3.10", "three-stdlib": "2.23.10" @@ -37,10 +36,9 @@ "@testing-library/jest-dom": "^5.11.5", "@types/dat.gui": "^0.7.5", "@types/lodash": "^4.14.190", - "@types/react": "18.2.6", + "@types/react": "18.2.8", "@types/react-dom": "18.2.4", - "@types/react-router-dom": "5.3.3", - "@types/stats": "^0.16.30", + "@types/stats.js": "^0.17.0", "@types/styled-components": "^5.1.26", "@types/three": "0.152.0", "css-loader": "^6.7.1", @@ -48,7 +46,7 @@ "html-webpack-plugin": "^5.5.0", "prettier": "^2.8.4", "three": "0.152.2", - "ts-loader": "^9.3.1", + "ts-loader": "9.4.4", "typescript": "^5.0.4", "webpack": "^5.76.0", "webpack-cli": "^4.10.0", diff --git a/examples/tsconfig.json b/examples/tsconfig.json index c7786dfc7ee..64cb7b02729 100644 --- a/examples/tsconfig.json +++ b/examples/tsconfig.json @@ -1,6 +1,6 @@ { "compilerOptions": { - "target": "es5", + "target": "es6", "lib": ["dom", "dom.iterable", "esnext"], "allowJs": true, "skipLibCheck": false, diff --git a/examples/yarn.lock b/examples/yarn.lock index d442cc3a3ed..21eb21dda9d 100644 --- a/examples/yarn.lock +++ b/examples/yarn.lock @@ -23,27 +23,27 @@ dependencies: "@babel/highlight" "^7.18.6" -"@babel/generator@^7.21.5": - version "7.21.5" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.21.5.tgz#c0c0e5449504c7b7de8236d99338c3e2a340745f" - integrity sha512-SrKK/sRv8GesIW1bDagf9cCG38IOMYZusoe1dfg0D8aiUe3Amvoj1QtjTPAWcfrZFvIwlleLb0gxzQidL9w14w== +"@babel/generator@^7.22.3": + version "7.22.3" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.22.3.tgz#0ff675d2edb93d7596c5f6728b52615cfc0df01e" + integrity sha512-C17MW4wlk//ES/CJDL51kPNwl+qiBQyN7b9SKyVp11BLGFeSPoVaHrv+MNt8jwQFhQWowW88z1eeBx3pFz9v8A== dependencies: - "@babel/types" "^7.21.5" + "@babel/types" "^7.22.3" "@jridgewell/gen-mapping" "^0.3.2" "@jridgewell/trace-mapping" "^0.3.17" jsesc "^2.5.1" -"@babel/helper-annotate-as-pure@^7.16.0": +"@babel/helper-annotate-as-pure@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz#eaa49f6f80d5a33f9a5dd2276e6d6e451be0a6bb" integrity sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA== dependencies: "@babel/types" "^7.18.6" -"@babel/helper-environment-visitor@^7.21.5": - version "7.21.5" - resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.21.5.tgz#c769afefd41d171836f7cb63e295bedf689d48ba" - integrity sha512-IYl4gZ3ETsWocUWgsFZLM5i1BYx9SoemminVEXadgLBa9TdeorzgLKm8wWLA6J1N/kT3Kch8XIk1laNzYoHKvQ== +"@babel/helper-environment-visitor@^7.22.1": + version "7.22.1" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.1.tgz#ac3a56dbada59ed969d712cf527bd8271fe3eba8" + integrity sha512-Z2tgopurB/kTbidvzeBrc2To3PUP/9i5MUe+fU6QJCQDyPwSH2oRapkLw3KGECDYSjhQZCNxEvNvZlLw8JjGwA== "@babel/helper-function-name@^7.21.0": version "7.21.0" @@ -60,7 +60,7 @@ dependencies: "@babel/types" "^7.18.6" -"@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.16.0": +"@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.21.4": version "7.21.4" resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.21.4.tgz#ac88b2f76093637489e718a90cec6cf8a9b029af" integrity sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg== @@ -93,11 +93,16 @@ chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.20.7", "@babel/parser@^7.21.5": +"@babel/parser@^7.20.7": version "7.21.8" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.21.8.tgz#642af7d0333eab9c0ad70b14ac5e76dbde7bfdf8" integrity sha512-6zavDGdzG3gUqAdWvlLFfk+36RilI+Pwyuuh7HItyeScCWP3k6i8vKclAQ0bM/0y/Kz/xiwvxhMv9MgTJP5gmA== +"@babel/parser@^7.22.4": + version "7.22.4" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.22.4.tgz#a770e98fd785c231af9d93f6459d36770993fb32" + integrity sha512-VLLsx06XkEYqBtE5YGPwfSGwfrjnyPP5oiGty3S8pQLFDFLaS8VwWSIxkTXpcvr5zeYLE6+MBNl2npl/YnfofA== + "@babel/runtime-corejs3@^7.10.2": version "7.14.9" resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.14.9.tgz#fb21b1cf11650dcb8fcf4de2e6b3b8cf411da3f3" @@ -123,22 +128,22 @@ "@babel/types" "^7.20.7" "@babel/traverse@^7.4.5": - version "7.21.5" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.21.5.tgz#ad22361d352a5154b498299d523cf72998a4b133" - integrity sha512-AhQoI3YjWi6u/y/ntv7k48mcrCXmus0t79J9qPNlk/lAsFlCiJ047RmbfMOawySTHtywXhbXgpx/8nXMYd+oFw== + version "7.22.4" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.22.4.tgz#c3cf96c5c290bd13b55e29d025274057727664c0" + integrity sha512-Tn1pDsjIcI+JcLKq1AVlZEr4226gpuAQTsLMorsYg9tuS/kG7nuwwJ4AB8jfQuEgb/COBwR/DqJxmoiYFu5/rQ== dependencies: "@babel/code-frame" "^7.21.4" - "@babel/generator" "^7.21.5" - "@babel/helper-environment-visitor" "^7.21.5" + "@babel/generator" "^7.22.3" + "@babel/helper-environment-visitor" "^7.22.1" "@babel/helper-function-name" "^7.21.0" "@babel/helper-hoist-variables" "^7.18.6" "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/parser" "^7.21.5" - "@babel/types" "^7.21.5" + "@babel/parser" "^7.22.4" + "@babel/types" "^7.22.4" debug "^4.1.0" globals "^11.1.0" -"@babel/types@^7.18.6", "@babel/types@^7.20.7", "@babel/types@^7.21.0", "@babel/types@^7.21.4", "@babel/types@^7.21.5": +"@babel/types@^7.18.6", "@babel/types@^7.20.7", "@babel/types@^7.21.0", "@babel/types@^7.21.4": version "7.21.5" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.21.5.tgz#18dfbd47c39d3904d5db3d3dc2cc80bedb60e5b6" integrity sha512-m4AfNvVF2mVC/F7fDEdH2El3HzUg9It/XsCxZiOTTA3m3qYfcSVSbTfM6Q9xG+hYDniZssYhlXKKUMD5m8tF4Q== @@ -147,32 +152,41 @@ "@babel/helper-validator-identifier" "^7.19.1" to-fast-properties "^2.0.0" -"@chevrotain/cst-dts-gen@10.4.0": - version "10.4.0" - resolved "https://registry.yarnpkg.com/@chevrotain/cst-dts-gen/-/cst-dts-gen-10.4.0.tgz#4e7f57e697b3a4204508ddff05367befae874b95" - integrity sha512-8c+1t+lCWT1HSqIa5nbRwhqeTC4IEgBE6+UQJt1DIM8VdxiRlbEM57TxMq5VoF5PJWXsLSCUR0YCUFc/Rxy8kQ== +"@babel/types@^7.22.3", "@babel/types@^7.22.4": + version "7.22.4" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.22.4.tgz#56a2653ae7e7591365dabf20b76295410684c071" + integrity sha512-Tx9x3UBHTTsMSW85WB2kphxYQVvrZ/t1FxD88IpSgIjiUJlCm9z+xWIDwyo1vffTwSqteqyznB8ZE9vYYk16zA== dependencies: - "@chevrotain/gast" "10.4.0" - "@chevrotain/types" "10.4.0" + "@babel/helper-string-parser" "^7.21.5" + "@babel/helper-validator-identifier" "^7.19.1" + to-fast-properties "^2.0.0" + +"@chevrotain/cst-dts-gen@10.5.0": + version "10.5.0" + resolved "https://registry.yarnpkg.com/@chevrotain/cst-dts-gen/-/cst-dts-gen-10.5.0.tgz#922ebd8cc59d97241bb01b1b17561a5c1ae0124e" + integrity sha512-lhmC/FyqQ2o7pGK4Om+hzuDrm9rhFYIJ/AXoQBeongmn870Xeb0L6oGEiuR8nohFNL5sMaQEJWCxr1oIVIVXrw== + dependencies: + "@chevrotain/gast" "10.5.0" + "@chevrotain/types" "10.5.0" lodash "4.17.21" -"@chevrotain/gast@10.4.0": - version "10.4.0" - resolved "https://registry.yarnpkg.com/@chevrotain/gast/-/gast-10.4.0.tgz#e963f894b16281300c8d61603f5de5f2511ee8f0" - integrity sha512-B7rqMo5w/gVhOXSWhb9DC/c/ISjJpjZ6l6V7iwT+Qx0C1nAIDb4eqxtl0vnJBQ8i8epwfFxZmyRs7uViW3VlHg== +"@chevrotain/gast@10.5.0": + version "10.5.0" + resolved "https://registry.yarnpkg.com/@chevrotain/gast/-/gast-10.5.0.tgz#e4e614bc46d17a8892742f38e56cd33f1f3ad162" + integrity sha512-pXdMJ9XeDAbgOWKuD1Fldz4ieCs6+nLNmyVhe2gZVqoO7v8HXuHYs5OV2EzUtbuai37TlOAQHrTDvxMnvMJz3A== dependencies: - "@chevrotain/types" "10.4.0" + "@chevrotain/types" "10.5.0" lodash "4.17.21" -"@chevrotain/types@10.4.0": - version "10.4.0" - resolved "https://registry.yarnpkg.com/@chevrotain/types/-/types-10.4.0.tgz#cb486482b9d6e494a9371e3144fc127a96e3745f" - integrity sha512-sGN/VC1zChYkP7aALPbMU3snjP19psY7wqpBstN5by1pFPi49gYUzHFqBFwPE6MJ35SNZRCVSGgMfPCjhAIuxg== +"@chevrotain/types@10.5.0": + version "10.5.0" + resolved "https://registry.yarnpkg.com/@chevrotain/types/-/types-10.5.0.tgz#52a97d74a8cfbc197f054636d93ecd8912d33d21" + integrity sha512-f1MAia0x/pAVPWH/T73BJVyO2XU5tI4/iE7cnxb7tqdNTNhQI3Uq3XkqcoteTmD4t1aM0LbHCJOhgIDn07kl2A== -"@chevrotain/utils@10.4.0": - version "10.4.0" - resolved "https://registry.yarnpkg.com/@chevrotain/utils/-/utils-10.4.0.tgz#9c511dac4445cd0e246d577ce2e329579a897657" - integrity sha512-WdE+5vP7xbGdpk4VEXlLaGE/swO/BoXTToAQVvjNRYRbvDcJnBRidN/au2ibWMFvxzgXC8kFi8UEINwwTpGA1A== +"@chevrotain/utils@10.5.0": + version "10.5.0" + resolved "https://registry.yarnpkg.com/@chevrotain/utils/-/utils-10.5.0.tgz#0ee36f65b49b447fbac71b9e5af5c5c6c98ac057" + integrity sha512-hBzuU5+JjB2cqNZyszkDHZgOSrUUT8V3dhgRl8Q9Gp6dAj/H5+KILGjbhDpc3Iy9qmqlm/akuOI2ut9VUtzJxQ== "@choojs/findup@^0.2.0": version "0.2.1" @@ -308,11 +322,6 @@ resolved "https://registry.yarnpkg.com/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz#b2ac626d6cb9c8718ab459166d4bb405b8ffa78b" integrity sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A== -"@remix-run/router@1.6.1": - version "1.6.1" - resolved "https://registry.yarnpkg.com/@remix-run/router/-/router-1.6.1.tgz#3a3a408481a3796f45223a549c2571517bc8af2d" - integrity sha512-YUkWj+xs0oOzBe74OgErsuR3wVn+efrFhXBWrit50kOiED+pvQe2r6MWY0iJMQU/mSVKxvNzL4ZaYvjdX+G7ZA== - "@testing-library/jest-dom@^5.11.5": version "5.14.1" resolved "https://registry.yarnpkg.com/@testing-library/jest-dom/-/jest-dom-5.14.1.tgz#8501e16f1e55a55d675fe73eecee32cdaddb9766" @@ -423,16 +432,6 @@ resolved "https://registry.yarnpkg.com/@types/geojson/-/geojson-7946.0.10.tgz#6dfbf5ea17142f7f9a043809f1cd4c448cb68249" integrity sha512-Nmh0K3iWQJzniTuPRcJn5hxXkfB1T1pgB89SBig5PlJQU5yocazeu4jATJlaA0GYFKWMqDdvYemoSnF2pXgLVA== -"@types/history@*": - version "4.7.9" - resolved "https://registry.yarnpkg.com/@types/history/-/history-4.7.9.tgz#1cfb6d60ef3822c589f18e70f8b12f9a28ce8724" - integrity sha512-MUc6zSmU3tEVnkQ78q0peeEjKWPUADMlC/t++2bI8WnAG2tvYRPIgHG8lWkXwqc8MsUF6Z2MOf+Mh5sazOmhiQ== - -"@types/history@^4.7.11": - version "4.7.11" - resolved "https://registry.yarnpkg.com/@types/history/-/history-4.7.11.tgz#56588b17ae8f50c53983a524fc3cc47437969d64" - integrity sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA== - "@types/hoist-non-react-statics@*": version "3.3.1" resolved "https://registry.yarnpkg.com/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz#1124aafe5118cb591977aeb1ceaaed1070eb039f" @@ -501,9 +500,9 @@ integrity sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA== "@types/node@*": - version "16.4.12" - resolved "https://registry.yarnpkg.com/@types/node/-/node-16.4.12.tgz#961e3091f263e6345d2d84afab4e047a60b4b11b" - integrity sha512-zxrTNFl9Z8boMJXs6ieqZP0wAhvkdzmHSxTlJabM16cf5G9xBc1uPRH5Bbv2omEDDiM8MzTfqTJXBf0Ba4xFWA== + version "20.2.5" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.2.5.tgz#26d295f3570323b2837d322180dfbf1ba156fefb" + integrity sha512-JJulVEQXmiY9Px5axXHeYGLSjhkZEnD+MDPDGbCbIAbMslkKwmygtZFy1X6s/075Yo94sf8GuSlFfPzysQrWZQ== "@types/offscreencanvas@^2019.6.4": version "2019.7.0" @@ -532,36 +531,10 @@ dependencies: "@types/react" "*" -"@types/react-router-dom@5.3.3": - version "5.3.3" - resolved "https://registry.yarnpkg.com/@types/react-router-dom/-/react-router-dom-5.3.3.tgz#e9d6b4a66fcdbd651a5f106c2656a30088cc1e83" - integrity sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw== - dependencies: - "@types/history" "^4.7.11" - "@types/react" "*" - "@types/react-router" "*" - -"@types/react-router@*": - version "5.1.16" - resolved "https://registry.yarnpkg.com/@types/react-router/-/react-router-5.1.16.tgz#f3ba045fb96634e38b21531c482f9aeb37608a99" - integrity sha512-8d7nR/fNSqlTFGHti0R3F9WwIertOaaA1UEB8/jr5l5mDMOs4CidEgvvYMw4ivqrBK+vtVLxyTj2P+Pr/dtgzg== - dependencies: - "@types/history" "*" - "@types/react" "*" - -"@types/react@*": - version "17.0.15" - resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.15.tgz#c7533dc38025677e312606502df7656a6ea626d0" - integrity sha512-uTKHDK9STXFHLaKv6IMnwp52fm0hwU+N89w/p9grdUqcFA6WuqDyPhaWopbNyE1k/VhgzmHl8pu1L4wITtmlLw== - dependencies: - "@types/prop-types" "*" - "@types/scheduler" "*" - csstype "^3.0.2" - -"@types/react@18.2.6": - version "18.2.6" - resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.6.tgz#5cd53ee0d30ffc193b159d3516c8c8ad2f19d571" - integrity sha512-wRZClXn//zxCFW+ye/D2qY65UsYP1Fpex2YXorHc8awoNamkMZSvBxwxdYVInsHOZZd2Ppq8isnSzJL5Mpf8OA== +"@types/react@*", "@types/react@18.2.8": + version "18.2.8" + resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.8.tgz#a77dcffe4e9af148ca4aa8000c51a1e8ed99e2c8" + integrity sha512-lTyWUNrd8ntVkqycEEplasWy2OxNlShj3zqS0LuB1ENUGis5HodmhM7DtCoUGbxj3VW/WsGA0DUhpG6XrM7gPA== dependencies: "@types/prop-types" "*" "@types/scheduler" "*" @@ -599,16 +572,11 @@ dependencies: "@types/node" "*" -"@types/stats.js@*": +"@types/stats.js@*", "@types/stats.js@^0.17.0": version "0.17.0" resolved "https://registry.yarnpkg.com/@types/stats.js/-/stats.js-0.17.0.tgz#0ed81d48e03b590c24da85540c1d952077a9fe20" integrity sha512-9w+a7bR8PeB0dCT/HBULU2fMqf6BAzvKbxFboYhmDtDkKPiyXYbjoe2auwsXlEFI7CFNMF1dCv3dFH5Poy9R1w== -"@types/stats@^0.16.30": - version "0.16.30" - resolved "https://registry.yarnpkg.com/@types/stats/-/stats-0.16.30.tgz#deb5fa6e59c6d67bd6e0f61a51ef630a83a84ce9" - integrity sha512-ihuaNKhVjTQ8UNLJu7Kx96ywf0bSBday/K//HHvO9LKha07Ezxdm6HkazOKUIdayp0EmGEIPBQSL7eLxm8rX0w== - "@types/styled-components@^5.1.26": version "5.1.26" resolved "https://registry.yarnpkg.com/@types/styled-components/-/styled-components-5.1.26.tgz#5627e6812ee96d755028a98dae61d28e57c233af" @@ -636,20 +604,15 @@ fflate "~0.6.9" lil-gui "~0.17.0" -"@types/webxr@*": - version "0.4.0" - resolved "https://registry.yarnpkg.com/@types/webxr/-/webxr-0.4.0.tgz#ad06c96a324293e0d5175d13dd5ded5931f90ba3" - integrity sha512-LQvrACV3Pj17GpkwHwXuTd733gfY+D7b9mKdrTmLdO7vo7P/o6209Qqtk63y/FCv/lspdmi0pWz6Qe/ull9kQg== - -"@types/webxr@^0.5.2": +"@types/webxr@*", "@types/webxr@^0.5.2": version "0.5.2" resolved "https://registry.yarnpkg.com/@types/webxr/-/webxr-0.5.2.tgz#5d9627b0ffe223aa3b166de7112ac8a9460dc54f" integrity sha512-szL74BnIcok9m7QwYtVmQ+EdIKwbjPANudfuvDrAF8Cljg9MKUlIoc1w5tjj9PMpeSH3U1Xnx//czQybJ0EfSw== -"@types/ws@^8.5.1": - version "8.5.3" - resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.3.tgz#7d25a1ffbecd3c4f2d35068d0b283c037003274d" - integrity sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w== +"@types/ws@^8.5.5": + version "8.5.5" + resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.5.tgz#af587964aa06682702ee6dcbc7be41a80e4b28eb" + integrity sha512-lwhs8hktwxSjf9UaZ9tG5M03PGogvFaH8gUgLNbN9HKIg0dvv6q+gkSuJ8HN4/VbyxkuLzCjlN7GquQ0gUJfIg== dependencies: "@types/node" "*" @@ -953,15 +916,15 @@ available-typed-arrays@^1.0.5: integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== "babel-plugin-styled-components@>= 1.12.0": - version "2.1.1" - resolved "https://registry.yarnpkg.com/babel-plugin-styled-components/-/babel-plugin-styled-components-2.1.1.tgz#cd977cc0ff8410d5cbfdd142e42576e9c8794b87" - integrity sha512-c8lJlszObVQPguHkI+akXv8+Jgb9Ccujx0EetL7oIvwU100LxO6XAGe45qry37wUL40a5U9f23SYrivro2XKhA== + version "2.1.3" + resolved "https://registry.yarnpkg.com/babel-plugin-styled-components/-/babel-plugin-styled-components-2.1.3.tgz#f5616bee99efca6685e500fe45db87f26cb42ba7" + integrity sha512-jBioLwBVHpOMU4NsueH/ADcHrjS0Y/WTpt2eGVmmuSFNEv2DF3XhcMncuZlbbjxQ4vzxg+yEr6E6TNjrIQbsJQ== dependencies: - "@babel/helper-annotate-as-pure" "^7.16.0" - "@babel/helper-module-imports" "^7.16.0" + "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-module-imports" "^7.21.4" babel-plugin-syntax-jsx "^6.18.0" lodash "^4.17.21" - picomatch "^2.3.0" + picomatch "^2.3.1" babel-plugin-syntax-jsx@^6.18.0: version "6.18.0" @@ -1135,14 +1098,14 @@ chalk@^4.0.0, chalk@^4.1.0: supports-color "^7.1.0" chevrotain@^10.1.2: - version "10.4.0" - resolved "https://registry.yarnpkg.com/chevrotain/-/chevrotain-10.4.0.tgz#9626ae47c8bde16f6c93577e81df7d63f1fcc3f4" - integrity sha512-sQ+lPBEEwL9b0ytcB4jgzKHnejedIoyknDuEIPdZN7aATvNMjYALvui3l84IQ7EyKd5s+Kyz3oVhvPzM7/609g== - dependencies: - "@chevrotain/cst-dts-gen" "10.4.0" - "@chevrotain/gast" "10.4.0" - "@chevrotain/types" "10.4.0" - "@chevrotain/utils" "10.4.0" + version "10.5.0" + resolved "https://registry.yarnpkg.com/chevrotain/-/chevrotain-10.5.0.tgz#9c1dc62ef0753bb562dbe521b5f72d041bad624e" + integrity sha512-Pkv5rBY3+CsHOYfV5g/Vs5JY9WTHHDEKOlohI2XeygaZhUeqhAlldZ8Hz9cRmxu709bvS08YzxHdTPHhffc13A== + dependencies: + "@chevrotain/cst-dts-gen" "10.5.0" + "@chevrotain/gast" "10.5.0" + "@chevrotain/types" "10.5.0" + "@chevrotain/utils" "10.5.0" lodash "4.17.21" regexp-to-ast "0.5.0" @@ -1545,9 +1508,9 @@ dotenv@^8.2.0: integrity sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g== draco3d@^1.4.1: - version "1.5.5" - resolved "https://registry.yarnpkg.com/draco3d/-/draco3d-1.5.5.tgz#6bf4bbdd65950e6153e991cb0dcb8a10323f610e" - integrity sha512-JVuNV0EJzD3LBYhGyIXJLeBID/EVtmFO1ZNhAYflTgiMiAJlbhXQmRRda/azjc8MRVMHh0gqGhiqHUo5dIXM8Q== + version "1.5.6" + resolved "https://registry.yarnpkg.com/draco3d/-/draco3d-1.5.6.tgz#0d570a9792e3a3a9fafbfea065b692940441c626" + integrity sha512-+3NaRjWktb5r61ZFoDejlykPEFKT5N/LkbXsaddlw6xNSXBanUYpFc2AXXpbJDilPHazcSreU/DpQIaxfX0NfQ== duplexify@^3.4.5: version "3.7.1" @@ -2631,6 +2594,14 @@ ktx-parse@^0.4.5: resolved "https://registry.yarnpkg.com/ktx-parse/-/ktx-parse-0.4.5.tgz#79905e22281a9d3e602b2ff522df1ee7d1813aa6" integrity sha512-MK3FOody4TXbFf8Yqv7EBbySw7aPvEcPX++Ipt6Sox+/YMFvR5xaTyhfNSk1AEmMy+RYIw81ctN4IMxCB8OAlg== +launch-editor@^2.6.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/launch-editor/-/launch-editor-2.6.0.tgz#4c0c1a6ac126c572bd9ff9a30da1d2cae66defd7" + integrity sha512-JpDCcQnyAAzZZaZ7vEiSqL690w7dAEyLao+KC96zBplnYbJS7TYNjvM3M7y3dGz+v7aIsJk3hllWuc0kWAjyRQ== + dependencies: + picocolors "^1.0.0" + shell-quote "^1.7.3" + levn@~0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" @@ -3068,7 +3039,7 @@ picocolors@^1.0.0: resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== -picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.0, picomatch@^2.3.1: +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== @@ -3259,21 +3230,6 @@ react-is@^17.0.1: resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== -react-router-dom@6.11.1: - version "6.11.1" - resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-6.11.1.tgz#af226bae950deb437208a606a47cf5c2d72c55dc" - integrity sha512-dPC2MhoPeTQ1YUOt5uIK376SMNWbwUxYRWk2ZmTT4fZfwlOvabF8uduRKKJIyfkCZvMgiF0GSCQckmkGGijIrg== - dependencies: - "@remix-run/router" "1.6.1" - react-router "6.11.1" - -react-router@6.11.1: - version "6.11.1" - resolved "https://registry.yarnpkg.com/react-router/-/react-router-6.11.1.tgz#6e58458c03e16834dda2b433c6adb9e7c2b1d7a8" - integrity sha512-OZINSdjJ2WgvAi7hgNLazrEV8SGn6xrKA+MkJe9wVDMZ3zQ6fdJocUjpCUCI0cNrelWjcvon0S/QK/j0NzL3KA== - dependencies: - "@remix-run/router" "1.6.1" - react@18.2.0: version "18.2.0" resolved "https://registry.yarnpkg.com/react/-/react-18.2.0.tgz#555bd98592883255fa00de14f1151a917b5d77d5" @@ -3471,10 +3427,10 @@ select-hose@^2.0.0: resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" integrity sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg== -selfsigned@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-2.0.1.tgz#8b2df7fa56bf014d19b6007655fff209c0ef0a56" - integrity sha512-LmME957M1zOsUhG+67rAjKfiWFox3SBxE/yymatMZsAx+oMrJ0YQ8AToOnyCm7xbeg2ep37IHLxdu0o2MavQOQ== +selfsigned@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-2.1.1.tgz#18a7613d714c0cd3385c48af0075abf3f266af61" + integrity sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ== dependencies: node-forge "^1" @@ -3573,6 +3529,11 @@ shebang-regex@^3.0.0: resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== +shell-quote@^1.7.3: + version "1.8.1" + resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.1.tgz#6dbf4db75515ad5bac63b4f1894c3a154c766680" + integrity sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA== + side-channel@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" @@ -3898,10 +3859,10 @@ tr46@~0.0.3: resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== -ts-loader@^9.3.1: - version "9.3.1" - resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-9.3.1.tgz#fe25cca56e3e71c1087fe48dc67f4df8c59b22d4" - integrity sha512-OkyShkcZTsTwyS3Kt7a4rsT/t2qvEVQuKCTg4LJmpj9fhFR7ukGdZwV6Qq3tRUkqcXtfGpPR7+hFKHCG/0d3Lw== +ts-loader@9.4.4: + version "9.4.4" + resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-9.4.4.tgz#6ceaf4d58dcc6979f84125335904920884b7cee4" + integrity sha512-MLukxDHBl8OJ5Dk3y69IsKVFRA/6MwzEqBgh+OXMPB/OD01KQuWPFd1WAQP8a5PeSCAxfnkhiuWqfmFJzJQt9w== dependencies: chalk "^4.1.0" enhanced-resolve "^5.0.0" @@ -4062,9 +4023,9 @@ webpack-dev-middleware@^5.3.1: schema-utils "^4.0.0" webpack-dev-server@^4.10.0: - version "4.10.0" - resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-4.10.0.tgz#de270d0009eba050546912be90116e7fd740a9ca" - integrity sha512-7dezwAs+k6yXVFZ+MaL8VnE+APobiO3zvpp3rBHe/HmWQ+avwh0Q3d0xxacOiBybZZ3syTZw9HXzpa3YNbAZDQ== + version "4.15.1" + resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-4.15.1.tgz#8944b29c12760b3a45bdaa70799b17cb91b03df7" + integrity sha512-5hbAst3h3C3L8w6W4P96L5vaV0PxSmJhxZvWKYIdgxOQm8pNZ5dEOmmSLBVpP85ReeyRt6AS1QJNyo/oFFPeVA== dependencies: "@types/bonjour" "^3.5.9" "@types/connect-history-api-fallback" "^1.3.5" @@ -4072,7 +4033,7 @@ webpack-dev-server@^4.10.0: "@types/serve-index" "^1.9.1" "@types/serve-static" "^1.13.10" "@types/sockjs" "^0.3.33" - "@types/ws" "^8.5.1" + "@types/ws" "^8.5.5" ansi-html-community "^0.0.8" bonjour-service "^1.0.11" chokidar "^3.5.3" @@ -4085,16 +4046,17 @@ webpack-dev-server@^4.10.0: html-entities "^2.3.2" http-proxy-middleware "^2.0.3" ipaddr.js "^2.0.1" + launch-editor "^2.6.0" open "^8.0.9" p-retry "^4.5.0" rimraf "^3.0.2" schema-utils "^4.0.0" - selfsigned "^2.0.1" + selfsigned "^2.1.1" serve-index "^1.9.1" sockjs "^0.3.24" spdy "^4.0.2" webpack-dev-middleware "^5.3.1" - ws "^8.4.2" + ws "^8.13.0" webpack-log@^3.0.2: version "3.0.2" @@ -4215,10 +4177,10 @@ wrappy@1: resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= -ws@^8.4.2: - version "8.8.1" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.8.1.tgz#5dbad0feb7ade8ecc99b830c1d77c913d4955ff0" - integrity sha512-bGy2JzvzkPowEJV++hF07hAD6niYSr0JzBNo/J29WsB57A2r7Wlc1UFcTR9IzrPvuNVO4B8LGqF8qcpsVOhJCA== +ws@^8.13.0: + version "8.13.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.13.0.tgz#9a9fb92f93cf41512a0735c8f4dd09b8a1211cd0" + integrity sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA== "xtend@>=4.0.0 <4.1.0-0", xtend@^4.0.0, xtend@~4.0.1: version "4.0.2" diff --git a/viewer/packages/utilities/src/three/VariableWidthLine.ts b/viewer/packages/utilities/src/three/VariableWidthLine.ts index acdc10f69dc..43bee12dde7 100644 --- a/viewer/packages/utilities/src/three/VariableWidthLine.ts +++ b/viewer/packages/utilities/src/three/VariableWidthLine.ts @@ -2,7 +2,7 @@ * Copyright 2023 Cognite AS */ -import { Color, Vector3 } from 'three'; +import { Color, Object3D, Vector3 } from 'three'; import { Line2 } from 'three/examples/jsm/lines/Line2'; import { LineMaterial } from 'three/examples/jsm/lines/LineMaterial'; import { LineGeometry } from 'three/examples/jsm/lines/LineGeometry'; @@ -27,7 +27,7 @@ export class VariableWidthLine { this._mesh.renderOrder = 100; } - get mesh(): Line2 { + get mesh(): Object3D { return this._mesh; } From 7d021f1bd8d5b04e4a3242e8ff624a864006a2bd Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 30 Jun 2023 09:57:26 +0000 Subject: [PATCH 2/9] fix(deps): update dependency @uiw/codemirror-theme-material to v4.21.5 (#3438) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- documentation/package.json | 2 +- documentation/yarn.lock | 20 ++++++++++---------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/documentation/package.json b/documentation/package.json index 06822263c43..613da98f8df 100644 --- a/documentation/package.json +++ b/documentation/package.json @@ -29,7 +29,7 @@ "@docusaurus/core": "2.4.1", "@docusaurus/preset-classic": "2.4.1", "@docusaurus/remark-plugin-npm2yarn": "2.4.1", - "@uiw/codemirror-theme-material": "4.21.4", + "@uiw/codemirror-theme-material": "4.21.5", "@uiw/react-codemirror": "4.21.5", "clsx": "1.2.1", "cross-env": "7.0.3", diff --git a/documentation/yarn.lock b/documentation/yarn.lock index b28e08c4f69..0e45d651a55 100644 --- a/documentation/yarn.lock +++ b/documentation/yarn.lock @@ -2144,7 +2144,7 @@ __metadata: "@docusaurus/remark-plugin-npm2yarn": 2.4.1 "@types/react": 18.2.12 "@types/styled-components": 5.1.26 - "@uiw/codemirror-theme-material": 4.21.4 + "@uiw/codemirror-theme-material": 4.21.5 "@uiw/react-codemirror": 4.21.5 clsx: 1.2.1 copyfiles: 2.4.1 @@ -3915,18 +3915,18 @@ __metadata: languageName: node linkType: hard -"@uiw/codemirror-theme-material@npm:4.21.4": - version: 4.21.4 - resolution: "@uiw/codemirror-theme-material@npm:4.21.4" +"@uiw/codemirror-theme-material@npm:4.21.5": + version: 4.21.5 + resolution: "@uiw/codemirror-theme-material@npm:4.21.5" dependencies: - "@uiw/codemirror-themes": 4.21.4 - checksum: 154312c5410309b03315fad2c685256b8475931451f74081a0454c0615d04717d5886d11ef75f341fa87c8286264e04e247f2d6200b9b73c2b0a62db3a66f571 + "@uiw/codemirror-themes": 4.21.5 + checksum: 4ad197072b8214ca10f3f52e954e7d927a7726a945c52aaa925caa77de76077b5f60dd06c8e7beea6b003e389773947798c9d55b35370d9307ba42d8e9cd26da languageName: node linkType: hard -"@uiw/codemirror-themes@npm:4.21.4": - version: 4.21.4 - resolution: "@uiw/codemirror-themes@npm:4.21.4" +"@uiw/codemirror-themes@npm:4.21.5": + version: 4.21.5 + resolution: "@uiw/codemirror-themes@npm:4.21.5" dependencies: "@codemirror/language": ^6.0.0 "@codemirror/state": ^6.0.0 @@ -3935,7 +3935,7 @@ __metadata: "@codemirror/language": ">=6.0.0" "@codemirror/state": ">=6.0.0" "@codemirror/view": ">=6.0.0" - checksum: c115eec5e71d14ea728b772fd2089a18da783d3f17edc36f771d39750f5066b92f6a9188090c7ca0854bc5c88c8c1da32b34a239d5d9dc02d7ea5f3e73ced024 + checksum: 486c9cc46159dec668fc578795c2dbaf36031e791001cefd9c07d3935da1b6912018a049b7fb74ccd02f921c3b93eb3090f91d2fa24951658710b697df06bfce languageName: node linkType: hard From 2f03ec8230a099bc6eae15db6e8bc39fcf3de1b2 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 30 Jun 2023 10:33:38 +0000 Subject: [PATCH 3/9] chore(deps): update dependency eslint-plugin-jsdoc to v46.3.0 (#3442) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- viewer/package.json | 2 +- viewer/yarn.lock | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/viewer/package.json b/viewer/package.json index 6a76229a2e3..9cacfa27294 100644 --- a/viewer/package.json +++ b/viewer/package.json @@ -104,7 +104,7 @@ "eslint": "8.43.0", "eslint-config-prettier": "8.8.0", "eslint-plugin-header": "3.1.1", - "eslint-plugin-jsdoc": "46.2.6", + "eslint-plugin-jsdoc": "46.3.0", "eslint-plugin-lodash": "7.4.0", "eslint-plugin-prettier": "4.2.1", "eslint-plugin-unused-imports": "2.0.0", diff --git a/viewer/yarn.lock b/viewer/yarn.lock index 59ee177fed8..181c15d74d8 100644 --- a/viewer/yarn.lock +++ b/viewer/yarn.lock @@ -768,7 +768,7 @@ __metadata: eslint: 8.43.0 eslint-config-prettier: 8.8.0 eslint-plugin-header: 3.1.1 - eslint-plugin-jsdoc: 46.2.6 + eslint-plugin-jsdoc: 46.3.0 eslint-plugin-lodash: 7.4.0 eslint-plugin-prettier: 4.2.1 eslint-plugin-unused-imports: 2.0.0 @@ -4981,9 +4981,9 @@ __metadata: languageName: node linkType: hard -"eslint-plugin-jsdoc@npm:46.2.6": - version: 46.2.6 - resolution: "eslint-plugin-jsdoc@npm:46.2.6" +"eslint-plugin-jsdoc@npm:46.3.0": + version: 46.3.0 + resolution: "eslint-plugin-jsdoc@npm:46.3.0" dependencies: "@es-joy/jsdoccomment": ~0.39.4 are-docs-informative: ^0.0.2 @@ -4996,7 +4996,7 @@ __metadata: spdx-expression-parse: ^3.0.1 peerDependencies: eslint: ^7.0.0 || ^8.0.0 - checksum: e082c3e88843521e121cdcad1999407a9c586bd55549b40b72865af8af853b06b7e883f80875930615796be71d79cf9d9a73d0e910b2fb67e9934f05400a34b8 + checksum: 1c59aef78a20d273a3b759498bca87da85ff4a495110a6b28035aa5572962856e651d51887df2ed7873b3c8f967ac27fcf742ab5ef3a95cb24691774a33dba26 languageName: node linkType: hard From 7c6c34aa1ea699a482279a1ba94b81e1fcaed7b5 Mon Sep 17 00:00:00 2001 From: "Christopher J. Tannum" Date: Fri, 30 Jun 2023 13:00:04 +0200 Subject: [PATCH 4/9] fix: wrong conditional CI run for deploy doc (#3444) --- .github/workflows/ci.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 21cf14c01f6..f097356f761 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -314,6 +314,7 @@ jobs: yarn build:fast - name: Upload documentation artifact + if: ${{ contains(github.event.pull_request.labels.*.name, 'preview-docs') }} uses: actions/upload-artifact@v3 with: name: preview-docs @@ -321,7 +322,7 @@ jobs: deploy-preview-documentation: needs: [changes, build-preview-documentation] - if: ${{ needs.changes.outputs.should-run == 'true' || contains(github.event.pull_request.labels.*.name, 'preview-docs') }} + if: ${{ needs.changes.outputs.should-run == 'true' && contains(github.event.pull_request.labels.*.name, 'preview-docs') }} name: Publish documentation preview # Ensures that there only will be executed one "instance" of this operation # across all ongoing Github Action executions From 7a2fba0710ada0b847cf6eaf0dda0b86ffebafba Mon Sep 17 00:00:00 2001 From: "Christopher J. Tannum" Date: Fri, 30 Jun 2023 13:57:05 +0200 Subject: [PATCH 5/9] fix(CI): ci crashing when running from a push event (#3445) * fix: wrong conditional CI run for deploy doc * fix: crashing when running from a push event --- .github/workflows/ci.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index f097356f761..acf2c257bc6 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -20,11 +20,12 @@ jobs: permissions: pull-requests: read outputs: - should-run: ${{ steps.filter.outputs.should-run }} + should-run: ${{ github.event_name != 'pull_request' || steps.filter.outputs.should-run }} steps: # For pull requests it's not necessary to checkout the code - uses: dorny/paths-filter@v2 id: filter + if: ${{ github.event_name == 'pull_request' }} with: filters: | should-run: From e932bffbb6ec448f045480733fe9467f28672771 Mon Sep 17 00:00:00 2001 From: eiriklegernaes <115703748+eiriklegernaes@users.noreply.github.com> Date: Fri, 30 Jun 2023 14:07:04 +0200 Subject: [PATCH 6/9] Recompute sector bounds when nodes are transformed (#3391) * Initial structure for dynamic sector bounds * Improve CustomSectorBounds implementation * Fix error in bookkeeping * Initial test setup * Improve testing * Add test for TreeIndexToSectorsMap * Fix doc typo * Minor cleanup * Update reveal.api.md * Make node bounding box optional, and update tests * Minor refactor and cleanup --------- Co-authored-by: Christopher J. Tannum --- .../visual-tests/NodeTransform.VisualTest.ts | 18 +- .../cad-geometry-loaders/package.json | 1 + .../cad-geometry-loaders/src/CadManager.ts | 23 + .../MultiBufferBatchingManager.test.ts | 10 +- .../batching/MultiBufferBatchingManager.ts | 26 +- .../src/utilities/CustomSectorBounds.test.ts | 408 ++++++++++++++++++ .../src/utilities/CustomSectorBounds.ts | 254 +++++++++++ .../utilities/TreeIndexToSectorsMap.test.ts | 41 ++ .../src/utilities/TreeIndexToSectorsMap.ts | 73 ++++ .../cad-model/src/wrappers/CadNode.ts | 6 +- .../cad-model/src/wrappers/CogniteCadModel.ts | 54 ++- viewer/reveal.api.md | 2 +- viewer/yarn.lock | 1 + 13 files changed, 900 insertions(+), 17 deletions(-) create mode 100644 viewer/packages/cad-model/src/utilities/CustomSectorBounds.test.ts create mode 100644 viewer/packages/cad-model/src/utilities/CustomSectorBounds.ts create mode 100644 viewer/packages/cad-model/src/utilities/TreeIndexToSectorsMap.test.ts create mode 100644 viewer/packages/cad-model/src/utilities/TreeIndexToSectorsMap.ts diff --git a/viewer/packages/api/visual-tests/NodeTransform.VisualTest.ts b/viewer/packages/api/visual-tests/NodeTransform.VisualTest.ts index 23dbb9d27c9..6355b1f4bc5 100644 --- a/viewer/packages/api/visual-tests/NodeTransform.VisualTest.ts +++ b/viewer/packages/api/visual-tests/NodeTransform.VisualTest.ts @@ -8,6 +8,7 @@ import { ViewerTestFixtureComponents, ViewerVisualTestFixture } from '../../../visual-tests/test-fixtures/ViewerVisualTestFixture'; +import { NumericRange } from '@reveal/utilities'; export default class NodeTransformVisualTest extends ViewerVisualTestFixture { public async setup(testFixtureComponents: ViewerTestFixtureComponents): Promise { @@ -21,17 +22,14 @@ export default class NodeTransformVisualTest extends ViewerVisualTestFixture { const translation = new THREE.Matrix4().makeTranslation(12, 10, -12); const transform = translation.multiply(rotation.multiply(scale)); - await model.setNodeTransformByTreeIndex(1, transform, false); + model.setNodeTransform(new NumericRange(1, 1), transform); - await Promise.all( - Array.from({ length: 80 - 2 }, (_, k) => k + 2).map(i => { - return model.setNodeTransformByTreeIndex( - i, - new THREE.Matrix4().makeTranslation(0, ((i % 2) * 2 - 1) * 2, 0), - false - ); - }) - ); + Array.from({ length: 80 - 2 }, (_, k) => k + 2).map(i => { + return model.setNodeTransform( + new NumericRange(i, 1), + new THREE.Matrix4().makeTranslation(0, ((i % 2) * 2 - 1) * 2, 0) + ); + }); } return Promise.resolve(); diff --git a/viewer/packages/cad-geometry-loaders/package.json b/viewer/packages/cad-geometry-loaders/package.json index b2979467416..48b826c1ed0 100644 --- a/viewer/packages/cad-geometry-loaders/package.json +++ b/viewer/packages/cad-geometry-loaders/package.json @@ -17,6 +17,7 @@ "@reveal/model-base": "workspace:*", "@reveal/rendering": "workspace:*", "@reveal/sector-loader": "workspace:*", + "@reveal/sector-parser": "workspace:*", "@reveal/utilities": "workspace:*" } } diff --git a/viewer/packages/cad-geometry-loaders/src/CadManager.ts b/viewer/packages/cad-geometry-loaders/src/CadManager.ts index 2ccc8833916..cdf559fca3e 100644 --- a/viewer/packages/cad-geometry-loaders/src/CadManager.ts +++ b/viewer/packages/cad-geometry-loaders/src/CadManager.ts @@ -14,6 +14,7 @@ import { File3dFormat, ModelIdentifier } from '@reveal/data-providers'; import { MetricsLogger } from '@reveal/metrics'; import { CadModelBudget, defaultDesktopCadModelBudget } from './CadModelBudget'; import { CadModelFactory, CadModelSectorLoadStatistics, CadNode, GeometryFilter } from '@reveal/cad-model'; +import { RevealGeometryCollectionType } from '@reveal/sector-parser'; export class CadManager { private readonly _materialManager: CadMaterialManager; @@ -102,6 +103,8 @@ export class CadManager { } this.markNeedsRedraw(); + + this.updateTreeIndexToSectorsMap(cadModel, sector); }; this._subscription.add( @@ -215,4 +218,24 @@ export class CadManager { private handleMaterialsChanged() { this.requestRedraw(); } + + private updateTreeIndexToSectorsMap(cadModel: CadNode, sector: ConsumedSector): void { + if (cadModel.treeIndexToSectorsMap.isCompleted(sector.metadata.id, RevealGeometryCollectionType.TriangleMesh)) { + return; + } + + if (sector.group?.children.length !== 1) { + return; + } + + const treeIndices = sector.group.children[0].userData?.treeIndices as Map | undefined; + if (!treeIndices) { + return; + } + + for (const treeIndex of treeIndices.keys()) { + cadModel.treeIndexToSectorsMap.set(treeIndex, sector.metadata.id); + } + cadModel.treeIndexToSectorsMap.markCompleted(sector.metadata.id, RevealGeometryCollectionType.TriangleMesh); + } } diff --git a/viewer/packages/cad-model/src/batching/MultiBufferBatchingManager.test.ts b/viewer/packages/cad-model/src/batching/MultiBufferBatchingManager.test.ts index 8e38b2b13af..5172d6692f0 100644 --- a/viewer/packages/cad-model/src/batching/MultiBufferBatchingManager.test.ts +++ b/viewer/packages/cad-model/src/batching/MultiBufferBatchingManager.test.ts @@ -6,6 +6,7 @@ import * as THREE from 'three'; import { Mock } from 'moq.ts'; import { Materials, StyledTreeIndexSets } from '@reveal/rendering'; import { MultiBufferBatchingManager } from './MultiBufferBatchingManager'; +import { TreeIndexToSectorsMap } from '../utilities/TreeIndexToSectorsMap'; import sum from 'lodash/sum'; import { IndexSet } from '@reveal/utilities'; @@ -22,7 +23,14 @@ describe(MultiBufferBatchingManager.name, () => { inFront: new IndexSet(), visible: new IndexSet() }; - manager = new MultiBufferBatchingManager(geometryGroup, materials, styledIndexSets, 1024, numberOfInstanceBuffers); + manager = new MultiBufferBatchingManager( + geometryGroup, + materials, + styledIndexSets, + new TreeIndexToSectorsMap(), + 1024, + numberOfInstanceBuffers + ); }); test('batchGeometries() first time adds new geometry to group', () => { diff --git a/viewer/packages/cad-model/src/batching/MultiBufferBatchingManager.ts b/viewer/packages/cad-model/src/batching/MultiBufferBatchingManager.ts index 339c183aad1..50d0f0e43b3 100644 --- a/viewer/packages/cad-model/src/batching/MultiBufferBatchingManager.ts +++ b/viewer/packages/cad-model/src/batching/MultiBufferBatchingManager.ts @@ -14,6 +14,7 @@ import { } from '@reveal/utilities'; import { GeometryBufferUtils } from '../utilities/GeometryBufferUtils'; import { getShaderMaterial } from '../utilities/getShaderMaterial'; +import { TreeIndexToSectorsMap } from '../utilities/TreeIndexToSectorsMap'; import { DrawCallBatchingManager } from './DrawCallBatchingManager'; /** @@ -68,6 +69,7 @@ export class MultiBufferBatchingManager implements DrawCallBatchingManager { batchGroup: Group, materials: Materials, styleTreeIndexSets: StyledTreeIndexSets, + private readonly treeIndexToSectorsMap: TreeIndexToSectorsMap, private readonly initialBufferSize = 1024, private readonly numberOfInstanceBatches = 2 ) { @@ -89,7 +91,7 @@ export class MultiBufferBatchingManager implements DrawCallBatchingManager { if (parsedGeometry.instanceId === undefined) { return; } - this.processGeometries(parsedGeometry as Required, sectorBatch); + this.processGeometries(parsedGeometry as Required, sectorBatch, sectorId); }); } @@ -160,9 +162,10 @@ export class MultiBufferBatchingManager implements DrawCallBatchingManager { } } - private processGeometries(parsedGeometry: Required, sectorBatch: SectorBatch) { + private processGeometries(parsedGeometry: Required, sectorBatch: SectorBatch, sectorId: number) { const instanceBatch = this.getOrCreateInstanceBatch(parsedGeometry); this.batchInstanceAttributes(parsedGeometry.geometryBuffer, parsedGeometry.instanceId, instanceBatch, sectorBatch); + this.updateTreeIndexToSectorsMap(parsedGeometry, sectorId); } private batchInstanceAttributes( @@ -220,6 +223,25 @@ export class MultiBufferBatchingManager implements DrawCallBatchingManager { } } + private updateTreeIndexToSectorsMap(parsedGeometry: ParsedGeometry, sectorId: number) { + const sourceInstanceAttributes = GeometryBufferUtils.getAttributes( + parsedGeometry.geometryBuffer, + InterleavedBufferAttribute + ); + const treeIndexInterleavedAttribute = this.getTreeIndexAttribute(sourceInstanceAttributes); + + if (this.treeIndexToSectorsMap.isCompleted(sectorId, parsedGeometry.type)) { + return; + } + + // Update mapping from tree indices to sector ids + for (let i = 0; i < treeIndexInterleavedAttribute.count; i++) { + const treeIndex = treeIndexInterleavedAttribute.getX(i); + this.treeIndexToSectorsMap.set(treeIndex, sectorId); + } + this.treeIndexToSectorsMap.markCompleted(sectorId, parsedGeometry.type); + } + private reallocateBufferGeometry({ buffer, mesh }: BatchBuffer) { const defragmentedBufferGeometry = this.createDefragmentedBufferGeometry(mesh.geometry, buffer); mesh.geometry.dispose(); diff --git a/viewer/packages/cad-model/src/utilities/CustomSectorBounds.test.ts b/viewer/packages/cad-model/src/utilities/CustomSectorBounds.test.ts new file mode 100644 index 00000000000..062ed3e2376 --- /dev/null +++ b/viewer/packages/cad-model/src/utilities/CustomSectorBounds.test.ts @@ -0,0 +1,408 @@ +/*! + * Copyright 2023 Cognite AS + */ + +import * as THREE from 'three'; +import { CustomSectorBounds } from './CustomSectorBounds'; +import { CadNode } from '../wrappers/CadNode'; +import { Mock } from 'moq.ts'; +import { createV9SectorMetadata } from '../../../../test-utilities'; +import { SectorMetadata } from '@reveal/cad-parsers'; +import { traverseDepthFirst } from '@reveal/utilities'; + +/* + +The following drawing shows the sectors and nodes used in this test. The layout is "2D": All sectors and nodes span z from 0 to 1, and all transforms +are simple translations in x and y. This shouldn't decrease the likelihood of discovering a logical error in the code under test by much, but it makes +it much easier to reason about the expected result of any given test. + +(0,0) (8,0) + ┌───────────────┬───────────────┬─────────────────────────────┬────────────────────────────────────────────────────────────────┐ + │ │ │ │ │ + │ │ │ │ │ + │ │ │ │ │ + │ │ │ │ │ + │ node A │ │ │ │ + │ │ │ │ │ + │ │ │ │ │ + │ │ │ │ │ + │ │ │ │ │ + ├───────────────┘ │ ┌──────────────┤ │ + │ │ │ │ │ + │ │ │ │ │ + │ │ │ │ │ + │ │ │ node B │ │ + │ │ │ │ │ + │ │ │ │ │ + │ │ │ │ │ + │ sector 2 │ │ │ │ + ├───────────────────────────────┘ └──────────────┤ │ + │ │ │ + │ │ │ + │ │ │ + │ ┌──────────────┐ │ │ + │ │ │ │ │ + │ │ │ │ │ + │ │ node C │ │ │ + │ ┌──────┼──────────────┼───────┼────────────────────────────────────────────────────────────────┤ + │ │ │ │ │ sector 3 │ + │ │ │ │ │ │ + │ │ │ │ │ │ + │ │ └──────────────┘ │ │ + │ │ │ │ + │ │ │ │ + │ sector 1 │ │ │ + ├───────────────────────────────┼─────────────────────────────┘ ┌───────────────────────────────────┤ + │ │ │sector 5 │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ ┌───────────────────────────────────────────┼───────────────────────────────────┤ + │ │ │sector 4 │ │ + │ │ │ │ │ + │ │ │ │ │ + │ │ │ │ │ + │ │ │ ┌──────────────┼────────────────┐ │ + │ │ │ │ │ │ │ + │ │ │ │ │ │ │ + │ │ │ │ node D │ │ + │ │ │ │ │ │ │ + │ │ │ │ │ │ │ + │ │ │ └──────────────┼────────────────┘ │ + │ │ │ │ │ + │ │ │ │ │ + │ sector 0 │ │ │ │ + └───────────────────────────────┴──────────────┴───────────────────────────────────────────┴───────────────────────────────────┘ +(0,8) (8,8) + +*/ + +type DummyNode = { + treeIndex: number; + originalBoundingBox: THREE.Box3; +}; + +describe('CustomSectorBounds', () => { + let customSectorBounds: CustomSectorBounds; + let cadNodeMock: Mock; + let sectorMetadataRoot: SectorMetadata; + let sectorMetadataById: Map; + let originalSectorBounds: Map; + + const nodeA: DummyNode = { treeIndex: 1000, originalBoundingBox: boundsFrom(0, 0, 1, 1) }; + const nodeB: DummyNode = { treeIndex: 1001, originalBoundingBox: boundsFrom(3, 1, 4, 2) }; + const nodeC: DummyNode = { treeIndex: 1002, originalBoundingBox: boundsFrom(2.5, 2.5, 3.5, 3.5) }; + const nodeD: DummyNode = { treeIndex: 1003, originalBoundingBox: boundsFrom(5, 6.5, 7, 7.5) }; + + beforeEach(() => { + // Define sectors + sectorMetadataRoot = createV9SectorMetadata([ + 0, + [ + [1, [[2, [], boundsFrom(0, 0, 2, 2)]], boundsFrom(0, 0, 4, 4)], + [ + 3, + [ + [4, [], boundsFrom(3, 6, 8, 8)], + [5, [], boundsFrom(6, 4, 8, 8)] + ], + boundsFrom(2, 3, 8, 8) + ] + ], + boundsFrom(0, 0, 8, 8) + ]); + + // Collect sector metadata into map + sectorMetadataById = new Map(); + traverseDepthFirst(sectorMetadataRoot, x => { + sectorMetadataById.set(x.id, x); + return true; + }); + + // Store copy of sector bounds + originalSectorBounds = new Map(); + for (const [sectorId, sectorMetadata] of sectorMetadataById) { + originalSectorBounds.set(sectorId, sectorMetadata.subtreeBoundingBox.clone()); + } + + // Setup CadNode mock + cadNodeMock = new Mock(); + cadNodeMock.setup(x => x.sectorScene.getSectorById).returns((sectorId: number) => sectorMetadataById.get(sectorId)); + cadNodeMock.setup(x => x.sectorScene.getAllSectors).returns(() => [...sectorMetadataById.values()]); + + customSectorBounds = new CustomSectorBounds(cadNodeMock.object()); + }); + + test('Transform single node', () => { + expect(customSectorBounds.isRegistered(nodeA.treeIndex)).toBeFalse(); + + // Register node A + customSectorBounds.registerTransformedNode(nodeA.treeIndex, nodeA.originalBoundingBox); + customSectorBounds.recomputeSectorBounds(); // Missing sectors and transform, nothing should happen + + expect(customSectorBounds.isRegistered(nodeA.treeIndex)).toBeTrue(); + [0, 1, 2, 3, 4, 5].forEach(i => expectOriginalBounds(i)); + + // Set transform + customSectorBounds.updateNodeTransform(nodeA.treeIndex, translation(-1, 0)); + customSectorBounds.recomputeSectorBounds(); // Still missing sectors, nothing should happen + + [0, 1, 2, 3, 4, 5].forEach(i => expectOriginalBounds(i)); + + // Set sectors + customSectorBounds.updateNodeSectors(nodeA.treeIndex, [2]); + customSectorBounds.recomputeSectorBounds(); // Bounds will be changed now + + expectBoundsApproximatelyEqual(2, boundsFrom(-1, 0, 2, 2)); // Contains the node + expectBoundsApproximatelyEqual(1, boundsFrom(-1, 0, 4, 4)); // Should expand to contain child + expectBoundsApproximatelyEqual(0, boundsFrom(-1, 0, 8, 8)); // Should expand to contain child + [3, 4, 5].forEach(i => expectOriginalBounds(i)); + + // The transform is reset, and everything should revert back to the original values + customSectorBounds.unregisterTransformedNode(nodeA.treeIndex); + customSectorBounds.recomputeSectorBounds(); + + expect(customSectorBounds.isRegistered(nodeA.treeIndex)).toBeFalse(); + [0, 1, 2, 3, 4, 5].forEach(i => expectOriginalBounds(i)); + }); + + test('Transform two nodes that share a sector', () => { + // Transform node A and B, in sector 1 + customSectorBounds.registerTransformedNode(nodeA.treeIndex, nodeA.originalBoundingBox); + customSectorBounds.registerTransformedNode(nodeB.treeIndex, nodeB.originalBoundingBox); + customSectorBounds.updateNodeSectors(nodeA.treeIndex, [1]); + customSectorBounds.updateNodeSectors(nodeB.treeIndex, [1]); + customSectorBounds.updateNodeTransform(nodeA.treeIndex, translation(-1, 0)); + customSectorBounds.updateNodeTransform(nodeB.treeIndex, translation(1, 0)); + customSectorBounds.recomputeSectorBounds(); + + expectBoundsApproximatelyEqual(1, boundsFrom(-1, 0, 5, 4)); // Contains the nodes + expectBoundsApproximatelyEqual(0, boundsFrom(-1, 0, 8, 8)); // Should expand to contain child + [2, 3, 4, 5].forEach(i => expectOriginalBounds(i)); + + // Transform of node A is reset + customSectorBounds.unregisterTransformedNode(nodeA.treeIndex); + customSectorBounds.recomputeSectorBounds(); + + expectBoundsApproximatelyEqual(1, boundsFrom(0, 0, 5, 4)); // Still contains node B + [0, 2, 3, 4, 5].forEach(i => expectOriginalBounds(i)); + + // Transform of node B is reset + customSectorBounds.unregisterTransformedNode(nodeB.treeIndex); + customSectorBounds.recomputeSectorBounds(); + + [0, 1, 2, 3, 4, 5].forEach(i => expectOriginalBounds(i)); + }); + + test('Transform two nodes at different depths, affecting a sector both directly and indirectly', () => { + // Transform node A, which is known to be in sector 2 + customSectorBounds.registerTransformedNode(nodeA.treeIndex, nodeA.originalBoundingBox); + customSectorBounds.updateNodeSectors(nodeA.treeIndex, [2]); + customSectorBounds.updateNodeTransform(nodeA.treeIndex, translation(-1, 0)); + + // Transform node B, which is known to be in sector 1 + customSectorBounds.registerTransformedNode(nodeB.treeIndex, nodeB.originalBoundingBox); + customSectorBounds.updateNodeSectors(nodeB.treeIndex, [1]); + customSectorBounds.updateNodeTransform(nodeB.treeIndex, translation(1, 0)); + customSectorBounds.recomputeSectorBounds(); + + expectBoundsApproximatelyEqual(2, boundsFrom(-1, 0, 2, 2)); // Contains node A + expectBoundsApproximatelyEqual(1, boundsFrom(-1, 0, 5, 4)); // Affected directly by node B, and indirectly by node A (which is in a child sector) + expectBoundsApproximatelyEqual(0, boundsFrom(-1, 0, 8, 8)); // Should expand to contain child + [3, 4, 5].forEach(i => expectOriginalBounds(i)); + + // Transform of node B is reset + customSectorBounds.unregisterTransformedNode(nodeB.treeIndex); + customSectorBounds.recomputeSectorBounds(); + + expectBoundsApproximatelyEqual(2, boundsFrom(-1, 0, 2, 2)); // Contains node A + expectBoundsApproximatelyEqual(1, boundsFrom(-1, 0, 4, 4)); // Should expand to contain child + expectBoundsApproximatelyEqual(0, boundsFrom(-1, 0, 8, 8)); // Should expand to contain child + [3, 4, 5].forEach(i => expectOriginalBounds(i)); + + // Transform of node A is reset + customSectorBounds.unregisterTransformedNode(nodeA.treeIndex); + customSectorBounds.recomputeSectorBounds(); + + [0, 1, 2, 3, 4, 5].forEach(i => expectOriginalBounds(i)); + }); + + test('Sector with no overlap with node bounding box should never be affected', () => { + // Transform node A, wrongfully said to contain geometry in sector 3 + customSectorBounds.registerTransformedNode(nodeA.treeIndex, nodeA.originalBoundingBox); + customSectorBounds.updateNodeSectors(nodeA.treeIndex, [3]); + customSectorBounds.updateNodeTransform(nodeA.treeIndex, translation(100, 0)); + customSectorBounds.recomputeSectorBounds(); + + [0, 1, 2, 3, 4, 5].forEach(i => expectOriginalBounds(i)); + }); + + test('Sector with partial overlap with node bounding box should only be affect by intersection', () => { + // Transform node C, which is only partially inside sector 3 + customSectorBounds.registerTransformedNode(nodeC.treeIndex, nodeC.originalBoundingBox); + customSectorBounds.updateNodeSectors(nodeC.treeIndex, [3]); + customSectorBounds.updateNodeTransform(nodeC.treeIndex, translation(0, -1)); + customSectorBounds.recomputeSectorBounds(); + + expectBoundsApproximatelyEqual(3, boundsFrom(2, 2, 8, 8)); // Contains part of node C + [0, 1, 2, 4, 5].forEach(i => expectOriginalBounds(i)); + }); + + test('Transform node present in both parent and child sector', () => { + // Transform node A, in sector 1 and 2 + customSectorBounds.registerTransformedNode(nodeA.treeIndex, nodeA.originalBoundingBox); + customSectorBounds.updateNodeSectors(nodeA.treeIndex, [1, 2]); + customSectorBounds.updateNodeTransform(nodeA.treeIndex, translation(-1, 0)); + customSectorBounds.recomputeSectorBounds(); + + expectBoundsApproximatelyEqual(2, boundsFrom(-1, 0, 2, 2)); // Contains node A + expectBoundsApproximatelyEqual(1, boundsFrom(-1, 0, 4, 4)); // Contains node A + expectBoundsApproximatelyEqual(0, boundsFrom(-1, 0, 8, 8)); // Should expand to contain child + [3, 4, 5].forEach(i => expectOriginalBounds(i)); + }); + + test('Transform node present in two sibling sectors', () => { + // Transform node D, in sector 4 and 5 + customSectorBounds.registerTransformedNode(nodeD.treeIndex, nodeD.originalBoundingBox); + customSectorBounds.updateNodeSectors(nodeD.treeIndex, [4, 5]); + customSectorBounds.updateNodeTransform(nodeD.treeIndex, translation(-4, 0)); + customSectorBounds.recomputeSectorBounds(); + + expectBoundsApproximatelyEqual(5, boundsFrom(2, 4, 8, 8)); // Contains node D + expectBoundsApproximatelyEqual(4, boundsFrom(1, 6, 8, 8)); // Contains node D + expectBoundsApproximatelyEqual(3, boundsFrom(1, 3, 8, 8)); // Should expand to contain children + [0, 1, 2].forEach(i => expectOriginalBounds(i)); + }); + + test('Transform node before knowledge of which sectors the node has geometry in', () => { + // Register node A with empty sector set + customSectorBounds.registerTransformedNode(nodeA.treeIndex, nodeA.originalBoundingBox); + customSectorBounds.updateNodeTransform(nodeA.treeIndex, translation(-1, 0)); + customSectorBounds.updateNodeSectors(nodeA.treeIndex, []); + customSectorBounds.recomputeSectorBounds(); + + [0, 1, 2, 3, 4, 5].forEach(i => expectOriginalBounds(i)); + + // Update knowledge of sectors for node A + customSectorBounds.updateNodeSectors(nodeA.treeIndex, [2]); + customSectorBounds.recomputeSectorBounds(); + + expectBoundsApproximatelyEqual(2, boundsFrom(-1, 0, 2, 2)); // Contains the node + expectBoundsApproximatelyEqual(1, boundsFrom(-1, 0, 4, 4)); // Should expand to contain child + expectBoundsApproximatelyEqual(0, boundsFrom(-1, 0, 8, 8)); // Should expand to contain child + [3, 4, 5].forEach(i => expectOriginalBounds(i)); + }); + + test('Complex sequence with multiple transforms and nodes', () => { + // Transform node A + customSectorBounds.registerTransformedNode(nodeA.treeIndex, nodeA.originalBoundingBox); + customSectorBounds.updateNodeSectors(nodeA.treeIndex, [1, 2]); + customSectorBounds.updateNodeTransform(nodeA.treeIndex, translation(0, -0.5)); + + // Transform node B + customSectorBounds.registerTransformedNode(nodeB.treeIndex, nodeB.originalBoundingBox); + customSectorBounds.updateNodeSectors(nodeB.treeIndex, [1]); + customSectorBounds.updateNodeTransform(nodeB.treeIndex, translation(0, -2)); + + // Transform node C + customSectorBounds.registerTransformedNode(nodeC.treeIndex, nodeC.originalBoundingBox); + customSectorBounds.updateNodeSectors(nodeC.treeIndex, [1]); + customSectorBounds.updateNodeTransform(nodeC.treeIndex, translation(0, -1)); + customSectorBounds.recomputeSectorBounds(); + + expectBoundsApproximatelyEqual(2, boundsFrom(0, -0.5, 2, 2)); // Driven by node A + expectBoundsApproximatelyEqual(1, boundsFrom(0, -1, 4, 4)); // Driven by node B + expectBoundsApproximatelyEqual(0, boundsFrom(0, -1, 8, 8)); // Shold expand to contain sector 1 + [3, 4, 5].forEach(i => expectOriginalBounds(i)); + + // Transform node B again, making sector 1 contract slightly + customSectorBounds.updateNodeTransform(nodeB.treeIndex, translation(0, -1)); + customSectorBounds.recomputeSectorBounds(); + expectBoundsApproximatelyEqual(1, boundsFrom(0, -0.5, 4, 4)); // Should contract because node B is no longer pushing + expectBoundsApproximatelyEqual(0, boundsFrom(0, -0.5, 8, 8)); // Should contract because it can + + // Node C is disovered to have geometry in sector 3 + customSectorBounds.updateNodeSectors(nodeC.treeIndex, [3]); + customSectorBounds.recomputeSectorBounds(); + expectBoundsApproximatelyEqual(3, boundsFrom(2, 2, 8, 8)); // Contains part of node C + + // Transform node D + customSectorBounds.registerTransformedNode(nodeD.treeIndex, nodeD.originalBoundingBox); + customSectorBounds.updateNodeSectors(nodeD.treeIndex, [5]); + customSectorBounds.updateNodeTransform(nodeD.treeIndex, translation(2, 0)); + customSectorBounds.recomputeSectorBounds(); + + expectBoundsApproximatelyEqual(5, boundsFrom(6, 4, 9, 8)); // Contains node D + expectBoundsApproximatelyEqual(3, boundsFrom(2, 2, 9, 8)); // Affected by node C and D + expectBoundsApproximatelyEqual(0, boundsFrom(0, -0.5, 9, 8)); // Shold expand to contain sector 3 (and 1 from before) + + // Node D is disovered to have geometry in sector 4 + customSectorBounds.updateNodeSectors(nodeD.treeIndex, [4]); + customSectorBounds.recomputeSectorBounds(); + + expectBoundsApproximatelyEqual(4, boundsFrom(3, 6, 9, 8)); + + // Unregister all nodes + customSectorBounds.unregisterTransformedNode(nodeA.treeIndex); + customSectorBounds.unregisterTransformedNode(nodeB.treeIndex); + customSectorBounds.unregisterTransformedNode(nodeC.treeIndex); + customSectorBounds.unregisterTransformedNode(nodeD.treeIndex); + customSectorBounds.recomputeSectorBounds(); + + [0, 1, 2, 3, 4, 5].forEach(i => expectOriginalBounds(i)); + }); + + test('Transform node without knowledge of node bounds', () => { + // Transform node A, without giving node bounds + customSectorBounds.registerTransformedNode(nodeA.treeIndex, undefined); + customSectorBounds.updateNodeSectors(nodeA.treeIndex, [2]); + customSectorBounds.updateNodeTransform(nodeA.treeIndex, translation(1, 0)); + customSectorBounds.recomputeSectorBounds(); + + expectBoundsApproximatelyEqual(2, boundsFrom(0, 0, 3, 2)); // Should expand to guaranteed contain node A, no matter where node A was in the sector + [0, 1, 3, 4, 5].forEach(i => expectOriginalBounds(i)); + }); + + function translation(x: number, y: number): THREE.Matrix4 { + return new THREE.Matrix4().setPosition(x, y, 0); + } + + function boundsFrom(minX: number, minY: number, maxX: number, maxY: number): THREE.Box3 { + return new THREE.Box3().setFromArray([minX, minY, 0, maxX, maxY, 1]); + } + + function expectOriginalBounds(sectorId: number) { + const sectorBounds = sectorMetadataById.get(sectorId)?.subtreeBoundingBox; + const originalBounds = originalSectorBounds.get(sectorId); + if (!sectorBounds || !originalBounds) { + fail(`Failed to get metadata or original bounds for sector ${sectorId}`); + } + + expect(sectorBounds.equals(originalBounds)).toBeTrue(); + } + + function expectBoundsApproximatelyEqual(sectorId: number, expected: THREE.Box3, precision = 3) { + const sectorBounds = sectorMetadataById.get(sectorId)?.subtreeBoundingBox; + if (!sectorBounds) { + fail(`Failed to get metadata for sector ${sectorId}`); + } + + expect(sectorBounds.min.x).toBeCloseTo(expected.min.x, precision); + expect(sectorBounds.min.y).toBeCloseTo(expected.min.y, precision); + expect(sectorBounds.min.z).toBeCloseTo(expected.min.z, precision); + expect(sectorBounds.max.x).toBeCloseTo(expected.max.x, precision); + expect(sectorBounds.max.y).toBeCloseTo(expected.max.y, precision); + expect(sectorBounds.max.z).toBeCloseTo(expected.max.z, precision); + } +}); diff --git a/viewer/packages/cad-model/src/utilities/CustomSectorBounds.ts b/viewer/packages/cad-model/src/utilities/CustomSectorBounds.ts new file mode 100644 index 00000000000..c23f62aeffd --- /dev/null +++ b/viewer/packages/cad-model/src/utilities/CustomSectorBounds.ts @@ -0,0 +1,254 @@ +/*! + * Copyright 2023 Cognite AS + */ + +import * as THREE from 'three'; +import { SectorMetadata } from '@reveal/cad-parsers'; +import { CadNode } from '../wrappers/CadNode'; + +type TransformedNode = { + currentTransform: THREE.Matrix4; + originalBoundingBox?: THREE.Box3; + inSectors: Set; +}; + +/** + * An instance of this class is used to dynamically alter the sector bounding boxes to adapt to custom node transforms. + * The bounding box of a sector is kept equal to its original value, unless: + * - A node with geometry in the sector is transformed such that the original bounds would not fully contain the node geometry + * - Descendants of the sector have grown, and are no longer contained within the original bounds. + * The set of sectors a tree index has geometry in does not need to be known upfront. This set of sectors, and the node transform, + * are set independently of each other. + */ +export class CustomSectorBounds { + private readonly _treeIndexToTransformedNodeMap = new Map(); + private readonly _sectorIdToTransformedNodesMap = new Map>(); + private readonly _originalSectorBounds = new Map(); + private readonly _sectorsWithInvalidBounds = new Set(); + private readonly _allSectorsSortedByDepth: SectorMetadata[]; + + constructor(private readonly cadNode: CadNode) { + // Store all sectors by descending depth, used to iterate over all sectors in a "child before parent"-fashion. + this._allSectorsSortedByDepth = this.cadNode.sectorScene.getAllSectors(); + this._allSectorsSortedByDepth.sort((a, b) => b.depth - a.depth); + } + + /** + * Returns whether or not the given node is registered + * @param treeIndex Tree index of the node to check + * @returns True if node is registered, false otherwise + */ + isRegistered(treeIndex: number): boolean { + return this._treeIndexToTransformedNodeMap.has(treeIndex); + } + + /** + * Registers a node as transformed, meaning it'll be taken into account when sector bounds are recomputed + * @param treeIndex Tree index of the transformed node + * @param originalBoundingBox The original bounding box of this node + */ + registerTransformedNode(treeIndex: number, originalBoundingBox?: THREE.Box3): void { + if (this.isRegistered(treeIndex)) { + throw new Error(`Attempted to register already registered node (tree index ${treeIndex})`); + } + + // Update mapping from tree index to transformed node + this._treeIndexToTransformedNodeMap.set(treeIndex, { + currentTransform: new THREE.Matrix4(), + originalBoundingBox: originalBoundingBox?.clone(), + inSectors: new Set() + }); + } + + /** + * Updates the transform for a registered node. Sector bounds will not be changed until recomputeSectorBounds() is called + * @param treeIndex Tree index of the transformed node + * @param newTransform The transform + */ + updateNodeTransform(treeIndex: number, newTransform: THREE.Matrix4): void { + const transformedNode = this._treeIndexToTransformedNodeMap.get(treeIndex); + if (!transformedNode) { + throw new Error(`Attempted to update transform for non-registered node (tree index ${treeIndex})`); + } + + if (!transformedNode.currentTransform.equals(newTransform)) { + // Update transform + transformedNode.currentTransform.copy(newTransform); + + // Mark affected sectors as dirty, to be updated during the next recomputeSectorBounds() call + transformedNode.inSectors.forEach(sectorId => this._sectorsWithInvalidBounds.add(sectorId)); + } + } + + /** + * Updates the set of sectors a node is known to have geometry in. Addition of new sectors is the only possible operation. + * Sector bounds will not be changed until recomputeSectorBounds() is called + * @param treeIndex Tree index of the transformed node + * @param newSectors The new sector(s) that this node is discovered to have geometry in + */ + updateNodeSectors(treeIndex: number, newSectors: number[]): void { + const transformedNode = this._treeIndexToTransformedNodeMap.get(treeIndex); + if (!transformedNode) { + throw new Error(`Attempted to update node sectors for non-registered node (tree index ${treeIndex})`); + } + + for (const newSector of newSectors) { + if (transformedNode.inSectors.has(newSector)) { + continue; + } + + // Add sector to transformed node + transformedNode.inSectors.add(newSector); + + // Update mapping from sector to transformed nodes + const transformedNodesForSector = this._sectorIdToTransformedNodesMap.get(newSector); + if (transformedNodesForSector) { + transformedNodesForSector.add(transformedNode); + } else { + this._sectorIdToTransformedNodesMap.set(newSector, new Set([transformedNode])); + } + + // Mark sector as dirty, to be updated during the next recomputeSectorBounds() call + this._sectorsWithInvalidBounds.add(newSector); + } + } + + /** + * Unregisters a node, meaning it will no longer be taken into account when sector bounds are recomputed + * @param treeIndex Tree index of the node to be unregistered + */ + unregisterTransformedNode(treeIndex: number): void { + const transformedNode = this._treeIndexToTransformedNodeMap.get(treeIndex); + if (!transformedNode) { + throw new Error(`Attempted to unregister non-registered node (tree index ${treeIndex})`); + } + + // Update mapping from sector id to transformed nodes + transformedNode.inSectors.forEach(sectorId => { + this._sectorIdToTransformedNodesMap.get(sectorId)?.delete(transformedNode); + + // Mark sector as dirty + this._sectorsWithInvalidBounds.add(sectorId); + }); + + // Update mapping from tree index to transformed node + this._treeIndexToTransformedNodeMap.delete(treeIndex); + } + + /** + * Recomputes the sector bounds making all registered nodes fully contained in their respective sectors. This + * is the only time the sector bounds are actually altered. + */ + recomputeSectorBounds(): void { + this._sectorsWithInvalidBounds.forEach(sectorId => { + // Compute the bounding boxes for the transformed nodes in this sector + const boundingBoxes: THREE.Box3[] = []; + this._sectorIdToTransformedNodesMap.get(sectorId)?.forEach(transformedNode => { + // Compute the intersection between the original sector bounds and the original node bounds if available, + // otherwise just assume the node has geometry in the entire sector + const originalSectorBounds = this.getOriginalSectorBounds(sectorId); + const originalBoundingBoxInSector = + transformedNode.originalBoundingBox?.clone().intersect(originalSectorBounds) ?? originalSectorBounds.clone(); + + if (!originalBoundingBoxInSector.isEmpty()) { + // Apply the current transform to this box, giving us the relevant bounds that the sector should currently contain + const effectiveBoundingBox = originalBoundingBoxInSector + .clone() + .applyMatrix4(transformedNode.currentTransform); + + boundingBoxes.push(effectiveBoundingBox); + } + }); + + this.updateSector(sectorId, boundingBoxes); + }); + + this._sectorsWithInvalidBounds.clear(); + + // Iterate over all sectors by descending depth + for (const sector of this._allSectorsSortedByDepth) { + const containsTransformedNodes = !!this._sectorIdToTransformedNodesMap.get(sector.id)?.size; + const originalBoundingBox = this.getOriginalSectorBounds(sector.id); + const minimumBounds = containsTransformedNodes ? sector.subtreeBoundingBox.clone() : originalBoundingBox.clone(); + + sector.children.forEach(child => { + minimumBounds.expandByPoint(child.subtreeBoundingBox.min); + minimumBounds.expandByPoint(child.subtreeBoundingBox.max); + }); + + if (!minimumBounds.equals(originalBoundingBox)) { + this.setCustomSectorBounds(sector.id, minimumBounds); + } else { + this.clearCustomSectorBounds(sector.id); + } + } + } + + /** + * Sets the bounding box of a given sector by expanding the original bounds to include the given custom bounding boxes + * @param sectorId The sector id + * @param customBoundingBoxes An array of bounding boxes this sector should contain + * @returns True if the new sector bounds are different from the original values. False otherwise + */ + private updateSector(sectorId: number, customBoundingBoxes: THREE.Box3[]): void { + const originalSectorBounds = this.getOriginalSectorBounds(sectorId); + + if (customBoundingBoxes.length) { + const newSectorBounds = originalSectorBounds.clone(); + + // Expand to fit all transformed nodes that belong to this sector + customBoundingBoxes.forEach(boundingBox => { + newSectorBounds.expandByPoint(boundingBox.min); + newSectorBounds.expandByPoint(boundingBox.max); + }); + + if (!newSectorBounds.equals(originalSectorBounds)) { + this.setCustomSectorBounds(sectorId, newSectorBounds); + return; + } + } + + // Reset sector bounds back to the original bounds + this.clearCustomSectorBounds(sectorId); + } + + private getOriginalSectorBounds(sectorId: number): THREE.Box3 { + let originalSectorBounds = this._originalSectorBounds.get(sectorId); + if (!originalSectorBounds) { + originalSectorBounds = this.sectorMetadata(sectorId).subtreeBoundingBox.clone(); + } + return originalSectorBounds; + } + + private setCustomSectorBounds(sectorId: number, customBounds: THREE.Box3): void { + const sectorMetadata = this.sectorMetadata(sectorId); + + const existingOriginal = this._originalSectorBounds.get(sectorId); + if (!existingOriginal) { + // If no original is stored, the sector must currently have original bounds + this._originalSectorBounds.set(sectorId, sectorMetadata.subtreeBoundingBox.clone()); + } + + // Modify sector bounds + sectorMetadata.subtreeBoundingBox.copy(customBounds); + } + + private clearCustomSectorBounds(sectorId: number): void { + const originalBounds = this._originalSectorBounds.get(sectorId); + if (originalBounds) { + // Modify sector bounds + this.sectorMetadata(sectorId).subtreeBoundingBox.copy(originalBounds); + + // Remove copy of original bounds + this._originalSectorBounds.delete(sectorId); + } + } + + private sectorMetadata(sectorId: number): SectorMetadata { + const sectorMetadata = this.cadNode.sectorScene.getSectorById(sectorId); + if (!sectorMetadata) { + throw new Error(`Failed to get sector metadata for sector with id ${sectorId}`); + } + return sectorMetadata; + } +} diff --git a/viewer/packages/cad-model/src/utilities/TreeIndexToSectorsMap.test.ts b/viewer/packages/cad-model/src/utilities/TreeIndexToSectorsMap.test.ts new file mode 100644 index 00000000000..4ae00e25aac --- /dev/null +++ b/viewer/packages/cad-model/src/utilities/TreeIndexToSectorsMap.test.ts @@ -0,0 +1,41 @@ +/*! + * Copyright 2023 Cognite AS + */ + +import { RevealGeometryCollectionType } from '@reveal/sector-parser'; +import { TreeIndexToSectorsMap } from './TreeIndexToSectorsMap'; +import { jest } from '@jest/globals'; + +describe('TreeIndexToSectorsMap', () => { + let map: TreeIndexToSectorsMap; + + beforeEach(() => { + map = new TreeIndexToSectorsMap(); + map.onChange = jest.fn(); + }); + + test('maps from tree index to set of sectors', () => { + expect(Array.from(map.getSectorIdsForTreeIndex(100))).toIncludeSameMembers([]); + + map.set(100, 1); + map.set(100, 2); + map.set(100, 3); + + expect(Array.from(map.getSectorIdsForTreeIndex(100))).toIncludeSameMembers([1, 2, 3]); + }); + + test('fires callback when tree index is found in a new sector', () => { + map.set(100, 1); // New + expect(map.onChange).toHaveBeenLastCalledWith(100, 1); + map.set(100, 1); // Not new + expect(map.onChange).toHaveBeenCalledTimes(1); + map.set(100, 2); // New + expect(map.onChange).toHaveBeenLastCalledWith(100, 2); + }); + + test('should keep track of which geometry types that are completed for each sector', () => { + expect(map.isCompleted(1, RevealGeometryCollectionType.BoxCollection)).toBeFalse(); + map.markCompleted(1, RevealGeometryCollectionType.BoxCollection); + expect(map.isCompleted(1, RevealGeometryCollectionType.BoxCollection)).toBeTrue(); + }); +}); diff --git a/viewer/packages/cad-model/src/utilities/TreeIndexToSectorsMap.ts b/viewer/packages/cad-model/src/utilities/TreeIndexToSectorsMap.ts new file mode 100644 index 00000000000..bb1e115b69b --- /dev/null +++ b/viewer/packages/cad-model/src/utilities/TreeIndexToSectorsMap.ts @@ -0,0 +1,73 @@ +/*! + * Copyright 2023 Cognite AS + */ + +import { RevealGeometryCollectionType } from '@reveal/sector-parser'; + +/** + * Map between a tree index and the set of sectors it has geometry in. Also contains helper functions to keep track of whether or not + * a given sector has had all its tree indices added to the map. This means iterating over all tree indices in a sector will only be + * done on first load. + */ +export class TreeIndexToSectorsMap { + public onChange?: (treeIndex: number, newSectorId: number) => void; + private readonly _treeIndexToSectorIds = new Map>(); + private readonly _parsedSectors = new Map>(); + + /** + * Store the fact that a tree index is found to have geometry in a certain sector + * @param treeIndex Tree index + * @param sectorId The sector id where the tree index was found + */ + set(treeIndex: number, sectorId: number): void { + const existingSet = this._treeIndexToSectorIds.get(treeIndex); + if (!existingSet) { + this._treeIndexToSectorIds.set(treeIndex, new Set([sectorId])); + this.onChange?.(treeIndex, sectorId); + return; + } + + if (!existingSet.has(sectorId)) { + existingSet.add(sectorId); + this.onChange?.(treeIndex, sectorId); + } + } + + /** + * Get the set of sectors a tree index is known to have geometry in + * @param treeIndex Tree index + * @returns The set of sectors + */ + getSectorIdsForTreeIndex(treeIndex: number): Set { + return this._treeIndexToSectorIds.get(treeIndex) ?? new Set(); + } + + /** + * Mark a sector as completed for a given geometry type. This will make subsequent calls to isCompleted + * for this geometry type return true + * @param sectorId The sector id + * @param type The geometry type + */ + markCompleted(sectorId: number, type: RevealGeometryCollectionType): void { + const existingSet = this._parsedSectors.get(sectorId); + if (existingSet) { + existingSet.add(sectorId); + } else { + this._parsedSectors.set(sectorId, new Set([type])); + } + } + + /** + * Check whether or not a sector is completely processed, for a given geometry type + * @param sectorId The sector id + * @param type The geometry type + * @returns True if completed, false otherwise + */ + isCompleted(sectorId: number, type: RevealGeometryCollectionType): boolean { + const parsedTypes = this._parsedSectors.get(sectorId); + if (parsedTypes) { + return parsedTypes.has(type); + } + return false; + } +} diff --git a/viewer/packages/cad-model/src/wrappers/CadNode.ts b/viewer/packages/cad-model/src/wrappers/CadNode.ts index eb27ba4e1c5..d16ac0fe4da 100644 --- a/viewer/packages/cad-model/src/wrappers/CadNode.ts +++ b/viewer/packages/cad-model/src/wrappers/CadNode.ts @@ -17,6 +17,7 @@ import { import { Group, Object3D, Plane, Matrix4 } from 'three'; import { DrawCallBatchingManager } from '../batching/DrawCallBatchingManager'; import { MultiBufferBatchingManager } from '../batching/MultiBufferBatchingManager'; +import { TreeIndexToSectorsMap } from '../utilities/TreeIndexToSectorsMap'; export class CadNode extends Object3D { private readonly _cadModelMetadata: CadModelMetadata; @@ -38,6 +39,8 @@ export class CadNode extends Object3D { private _needsRedraw: boolean = false; + public readonly treeIndexToSectorsMap = new TreeIndexToSectorsMap(); + public readonly type = 'CadNode'; constructor(model: CadModelMetadata, materialManager: CadMaterialManager, sectorRepository: SectorRepository) { @@ -65,7 +68,8 @@ export class CadNode extends Object3D { this._geometryBatchingManager = new MultiBufferBatchingManager( this._batchedGeometryMeshGroup, materials, - this._styledTreeIndexSets + this._styledTreeIndexSets, + this.treeIndexToSectorsMap ); this._rootSector = new RootSectorNode(model); diff --git a/viewer/packages/cad-model/src/wrappers/CogniteCadModel.ts b/viewer/packages/cad-model/src/wrappers/CogniteCadModel.ts index 3406be34c13..69f66bf3739 100644 --- a/viewer/packages/cad-model/src/wrappers/CogniteCadModel.ts +++ b/viewer/packages/cad-model/src/wrappers/CogniteCadModel.ts @@ -16,6 +16,7 @@ import { NodeAppearance, NodeCollection, CdfModelNodeCollectionDataProvider } fr import { NodeIdAndTreeIndexMaps } from '../utilities/NodeIdAndTreeIndexMaps'; import { CadNode } from './CadNode'; import { WellKnownUnit } from '../types'; +import { CustomSectorBounds } from '../utilities/CustomSectorBounds'; /** * Represents a single 3D CAD model loaded from CDF. @@ -84,6 +85,7 @@ export class CogniteCadModel implements CdfModelNodeCollectionDataProvider { private readonly nodesApiClient: NodesApiClient; private readonly nodeIdAndTreeIndexMaps: NodeIdAndTreeIndexMaps; private readonly _styledNodeCollections: { nodeCollection: NodeCollection; appearance: NodeAppearance }[] = []; + private readonly customSectorBounds: CustomSectorBounds; /** * @param modelId @@ -100,6 +102,12 @@ export class CogniteCadModel implements CdfModelNodeCollectionDataProvider { this.nodeIdAndTreeIndexMaps = new NodeIdAndTreeIndexMaps(modelId, revisionId, this.nodesApiClient); this.cadNode = cadNode; + this.customSectorBounds = new CustomSectorBounds(this.cadNode); + this.cadNode.treeIndexToSectorsMap.onChange = (treeIndex: number, newSectorId: number) => { + if (this.customSectorBounds.isRegistered(treeIndex)) { + this.customSectorBounds.updateNodeSectors(treeIndex, [newSectorId]); + } + }; } /** @@ -200,10 +208,47 @@ export class CogniteCadModel implements CdfModelNodeCollectionDataProvider { * node isn't supported and might lead to undefined results. * @param treeIndices Tree indices of nodes to apply the transformation to. * @param transformMatrix Transformation to apply. + * @param boundingBox Optional bounding box for the nodes before any transformation is applied. If given, it is assumed that all the nodes' geometry fit inside. */ - setNodeTransform(treeIndices: NumericRange, transformMatrix: THREE.Matrix4): void { + setNodeTransform(treeIndices: NumericRange, transformMatrix: THREE.Matrix4, boundingBox?: THREE.Box3): void { MetricsLogger.trackCadNodeTransformOverridden(treeIndices.count, transformMatrix); this.nodeTransformProvider.setNodeTransform(treeIndices, transformMatrix); + + // Metadata bounding boxes are in CDF space. Precompute the necessary transformations once. + const cdfToModelTransform = this.getModelTransformation() + .clone() + .multiply(this.getCdfToDefaultModelTransformation()); + const modelToCdfTransform = cdfToModelTransform.clone().invert(); + + // Convert the transform to CDF space + const transformMatrixCdf = modelToCdfTransform.clone().multiply(transformMatrix).multiply(cdfToModelTransform); + + // Transform bounding box to CDF space, if given + let nodeBoundingBox: THREE.Box3 | undefined; + if (boundingBox) { + nodeBoundingBox = boundingBox.clone(); + nodeBoundingBox.applyMatrix4(modelToCdfTransform); + } + + // Update sector bounds + for (const treeIndex of treeIndices.toArray()) { + if (!this.customSectorBounds.isRegistered(treeIndex)) { + // Register node as transformed + this.customSectorBounds.registerTransformedNode(treeIndex, nodeBoundingBox); + + // Get the sectors that this node is currently known to have geometry in. As the mapping from tree index to sectors is built + // when sectors are loaded, this node may have geometry in more sectors than what is currently known. If new sectors with geometry + // from this node are discovered at a later point, customSectorBounds.updateNodeSectors will be called through the + // treeIndexToSectorsMap.onChange callback, which is setup in the constructor. + const sectorIds = this.cadNode.treeIndexToSectorsMap.getSectorIdsForTreeIndex(treeIndex); + if (sectorIds.size) { + this.customSectorBounds.updateNodeSectors(treeIndex, Array.from(sectorIds)); + } + } + + this.customSectorBounds.updateNodeTransform(treeIndex, transformMatrixCdf); + } + this.customSectorBounds.recomputeSectorBounds(); } /** @@ -218,7 +263,8 @@ export class CogniteCadModel implements CdfModelNodeCollectionDataProvider { applyToChildren = true ): Promise { const treeIndices = await this.determineTreeIndices(treeIndex, applyToChildren); - this.setNodeTransform(treeIndices, transform); + const boundingBox = await this.getBoundingBoxByTreeIndex(treeIndex); + await this.setNodeTransform(treeIndices, transform, boundingBox); return treeIndices.count; } @@ -228,6 +274,10 @@ export class CogniteCadModel implements CdfModelNodeCollectionDataProvider { */ resetNodeTransform(treeIndices: NumericRange): void { this.nodeTransformProvider.resetNodeTransform(treeIndices); + + // Update sector bounds + treeIndices.forEach(treeIndex => this.customSectorBounds.unregisterTransformedNode(treeIndex)); + this.customSectorBounds.recomputeSectorBounds(); } /** diff --git a/viewer/reveal.api.md b/viewer/reveal.api.md index fb5757c4143..23088e5fdec 100644 --- a/viewer/reveal.api.md +++ b/viewer/reveal.api.md @@ -473,7 +473,7 @@ export class CogniteCadModel implements CdfModelNodeCollectionDataProvider { setDefaultNodeAppearance(appearance: NodeAppearance): void; setModelClippingPlanes(clippingPlanes: THREE_2.Plane[]): void; setModelTransformation(matrix: THREE_2.Matrix4): void; - setNodeTransform(treeIndices: NumericRange, transformMatrix: THREE_2.Matrix4): void; + setNodeTransform(treeIndices: NumericRange, transformMatrix: THREE_2.Matrix4, boundingBox?: THREE_2.Box3): void; setNodeTransformByTreeIndex(treeIndex: number, transform: THREE_2.Matrix4, applyToChildren?: boolean): Promise; get styledNodeCollections(): { nodeCollection: NodeCollection; diff --git a/viewer/yarn.lock b/viewer/yarn.lock index 181c15d74d8..5be404471af 100644 --- a/viewer/yarn.lock +++ b/viewer/yarn.lock @@ -1622,6 +1622,7 @@ __metadata: "@reveal/model-base": "workspace:*" "@reveal/rendering": "workspace:*" "@reveal/sector-loader": "workspace:*" + "@reveal/sector-parser": "workspace:*" "@reveal/utilities": "workspace:*" languageName: unknown linkType: soft From 78b9bea5aa4db3e6a176a89afb5effe9abe1c8df Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 3 Jul 2023 10:54:27 +0000 Subject: [PATCH 7/9] chore(deps): update dependency glob to v10.3.1 (#3447) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- viewer/package.json | 2 +- viewer/yarn.lock | 39 ++++++++++++++++----------------------- 2 files changed, 17 insertions(+), 24 deletions(-) diff --git a/viewer/package.json b/viewer/package.json index 9cacfa27294..2740eedebc3 100644 --- a/viewer/package.json +++ b/viewer/package.json @@ -110,7 +110,7 @@ "eslint-plugin-unused-imports": "2.0.0", "file-loader": "6.2.0", "gl": "6.0.2", - "glob": "10.3.0", + "glob": "10.3.1", "glslify-loader": "2.0.0", "html-webpack-plugin": "5.5.3", "jest": "29.5.0", diff --git a/viewer/yarn.lock b/viewer/yarn.lock index 5be404471af..5ffd1bcac98 100644 --- a/viewer/yarn.lock +++ b/viewer/yarn.lock @@ -774,7 +774,7 @@ __metadata: eslint-plugin-unused-imports: 2.0.0 file-loader: 6.2.0 gl: 6.0.2 - glob: 10.3.0 + glob: 10.3.1 glslify: 7.1.1 glslify-import: 3.1.0 glslify-loader: 2.0.0 @@ -5891,18 +5891,18 @@ __metadata: languageName: node linkType: hard -"glob@npm:10.3.0": - version: 10.3.0 - resolution: "glob@npm:10.3.0" +"glob@npm:10.3.1": + version: 10.3.1 + resolution: "glob@npm:10.3.1" dependencies: foreground-child: ^3.1.0 jackspeak: ^2.0.3 minimatch: ^9.0.1 minipass: ^5.0.0 || ^6.0.2 - path-scurry: ^1.7.0 + path-scurry: ^1.10.0 bin: glob: dist/cjs/src/bin.js - checksum: 6fa4ac0a86ffec1c5715a2e6fbdd63e1e7f1c2c8f5db08cc3256cdfcb81093678e7c80a3d100b502a1b9d141369ecf87bc24fe2bcb72acec7b14626d358a4eb0 + checksum: 19c8c2805658b1002fecf0722cd609a33153d756a0d5260676bd0e9c5e6ef889ec9cce6d3dac0411aa90bce8de3d14f25b6f5589a3292582cccbfeddd0e98cc4 languageName: node linkType: hard @@ -8277,10 +8277,10 @@ __metadata: languageName: node linkType: hard -"lru-cache@npm:^9.0.0": - version: 9.1.0 - resolution: "lru-cache@npm:9.1.0" - checksum: 97b46faa2e8195b75b1c48a5515f8e458b8f6a0d0933c0484a4e45b6aa67406dcc5f6c8774fef206fd918dce6a4b4a6f627541fbdf74f8e6b3c71f688f43041e +"lru-cache@npm:^9.1.1 || ^10.0.0": + version: 10.0.0 + resolution: "lru-cache@npm:10.0.0" + checksum: 18f101675fe283bc09cda0ef1e3cc83781aeb8373b439f086f758d1d91b28730950db785999cd060d3c825a8571c03073e8c14512b6655af2188d623031baf50 languageName: node linkType: hard @@ -8616,13 +8616,6 @@ __metadata: languageName: node linkType: hard -"minipass@npm:^5.0.0": - version: 5.0.0 - resolution: "minipass@npm:5.0.0" - checksum: 425dab288738853fded43da3314a0b5c035844d6f3097a8e3b5b29b328da8f3c1af6fc70618b32c29ff906284cf6406b6841376f21caaadd0793c1d5a6a620ea - languageName: node - linkType: hard - "minipass@npm:^5.0.0 || ^6.0.2": version: 6.0.2 resolution: "minipass@npm:6.0.2" @@ -9403,13 +9396,13 @@ __metadata: languageName: node linkType: hard -"path-scurry@npm:^1.7.0": - version: 1.7.0 - resolution: "path-scurry@npm:1.7.0" +"path-scurry@npm:^1.10.0": + version: 1.10.0 + resolution: "path-scurry@npm:1.10.0" dependencies: - lru-cache: ^9.0.0 - minipass: ^5.0.0 - checksum: 4e86df0fa6848cef1ba672d4a332b8dbd0297c42d5123bcc419d714c34b25ee6775b0d2e66dd5e698a38e9bcd808f8fc47333e3a3357307cada98e16bfae8b98 + lru-cache: ^9.1.1 || ^10.0.0 + minipass: ^5.0.0 || ^6.0.2 + checksum: 3b66a4a6ab66e45755b577c966ecf0da92d3e068b3c992d8f69aa2cc908ef4eda9358253e9b4f86cad43d3ad810ec445be164105975f5cb3fdab68459c59dc6e languageName: node linkType: hard From d63966bacd5880f3ecefea94050c45e236651b98 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 3 Jul 2023 13:34:28 +0000 Subject: [PATCH 8/9] chore(deps): update dependency jest-canvas-mock to v2.5.2 (#3448) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- viewer/package.json | 2 +- viewer/yarn.lock | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/viewer/package.json b/viewer/package.json index 2740eedebc3..9214848e535 100644 --- a/viewer/package.json +++ b/viewer/package.json @@ -114,7 +114,7 @@ "glslify-loader": "2.0.0", "html-webpack-plugin": "5.5.3", "jest": "29.5.0", - "jest-canvas-mock": "2.5.1", + "jest-canvas-mock": "2.5.2", "jest-environment-jsdom": "29.5.0", "jest-extended": "4.0.0", "jest-image-snapshot": "6.1.0", diff --git a/viewer/yarn.lock b/viewer/yarn.lock index 5ffd1bcac98..a72dbd7e8a7 100644 --- a/viewer/yarn.lock +++ b/viewer/yarn.lock @@ -781,7 +781,7 @@ __metadata: html-webpack-plugin: 5.5.3 html2canvas: ^1.4.1 jest: 29.5.0 - jest-canvas-mock: 2.5.1 + jest-canvas-mock: 2.5.2 jest-environment-jsdom: 29.5.0 jest-extended: 4.0.0 jest-image-snapshot: 6.1.0 @@ -7162,13 +7162,13 @@ __metadata: languageName: node linkType: hard -"jest-canvas-mock@npm:2.5.1": - version: 2.5.1 - resolution: "jest-canvas-mock@npm:2.5.1" +"jest-canvas-mock@npm:2.5.2": + version: 2.5.2 + resolution: "jest-canvas-mock@npm:2.5.2" dependencies: cssfontparser: ^1.2.1 moo-color: ^1.0.2 - checksum: b8ff56c1b7b7feb6d33b7914dbfac21f19a5a33db0bc092f0426e500e80e67df1286bf817eb780e378b648c9130d7b8ca20cd46e45520657996273a948a7c198 + checksum: a3004d2e96473049045e49dcf98e5ea6011494048ab42b5422b3089d9ff406aaca8353e79587055d840fa145541668eb8f78613765f252ad5901a8217e91ea5d languageName: node linkType: hard From 4aa4c1c1a99ed4f31fcd11d9361fe600d13d9e9f Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 3 Jul 2023 13:58:46 +0000 Subject: [PATCH 9/9] chore(deps): update dependency typescript to v5.1.6 (#3450) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- documentation/package.json | 2 +- documentation/yarn.lock | 18 +++++++++--------- react-components/package.json | 2 +- react-components/yarn.lock | 18 +++++++++--------- viewer/package.json | 2 +- viewer/yarn.lock | 18 +++++++++--------- 6 files changed, 30 insertions(+), 30 deletions(-) diff --git a/documentation/package.json b/documentation/package.json index 613da98f8df..e0a26c4ee72 100644 --- a/documentation/package.json +++ b/documentation/package.json @@ -49,7 +49,7 @@ "typedoc": "0.24.8", "typedoc-plugin-markdown": "3.15.3", "typedoc-plugin-no-inherit": "1.4.0", - "typescript": "5.1.3" + "typescript": "5.1.6" }, "browserslist": { "production": [ diff --git a/documentation/yarn.lock b/documentation/yarn.lock index 0e45d651a55..a2b5fb29228 100644 --- a/documentation/yarn.lock +++ b/documentation/yarn.lock @@ -2160,7 +2160,7 @@ __metadata: typedoc: 0.24.8 typedoc-plugin-markdown: 3.15.3 typedoc-plugin-no-inherit: 1.4.0 - typescript: 5.1.3 + typescript: 5.1.6 languageName: unknown linkType: soft @@ -12553,23 +12553,23 @@ __metadata: languageName: node linkType: hard -"typescript@npm:5.1.3": - version: 5.1.3 - resolution: "typescript@npm:5.1.3" +"typescript@npm:5.1.6": + version: 5.1.6 + resolution: "typescript@npm:5.1.6" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: d9d51862d98efa46534f2800a1071a613751b1585dc78884807d0c179bcd93d6e9d4012a508e276742f5f33c480adefc52ffcafaf9e0e00ab641a14cde9a31c7 + checksum: b2f2c35096035fe1f5facd1e38922ccb8558996331405eb00a5111cc948b2e733163cc22fab5db46992aba7dd520fff637f2c1df4996ff0e134e77d3249a7350 languageName: node linkType: hard -"typescript@patch:typescript@5.1.3#~builtin": - version: 5.1.3 - resolution: "typescript@patch:typescript@npm%3A5.1.3#~builtin::version=5.1.3&hash=7ad353" +"typescript@patch:typescript@5.1.6#~builtin": + version: 5.1.6 + resolution: "typescript@patch:typescript@npm%3A5.1.6#~builtin::version=5.1.6&hash=7ad353" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: 32a25b2e128a4616f999d4ee502aabb1525d5647bc8955e6edf05d7fbc53af8aa98252e2f6ba80bcedfc0260c982b885f3c09cfac8bb65d2924f3133ad1e1e62 + checksum: 21e88b0a0c0226f9cb9fd25b9626fb05b4c0f3fddac521844a13e1f30beb8f14e90bd409a9ac43c812c5946d714d6e0dee12d5d02dfc1c562c5aacfa1f49b606 languageName: node linkType: hard diff --git a/react-components/package.json b/react-components/package.json index 1c2618166c7..f002213ac79 100644 --- a/react-components/package.json +++ b/react-components/package.json @@ -59,7 +59,7 @@ "styled-components": "5.3.11", "three": "0.152.2", "ts-loader": "9.4.3", - "typescript": "5.1.3", + "typescript": "5.1.6", "webpack": "5.88.0", "webpack-cli": "5.1.4", "webpack-node-externals": "3.0.0" diff --git a/react-components/yarn.lock b/react-components/yarn.lock index a6f63af0c33..5db65f3b555 100644 --- a/react-components/yarn.lock +++ b/react-components/yarn.lock @@ -2127,7 +2127,7 @@ __metadata: styled-components: 5.3.11 three: 0.152.2 ts-loader: 9.4.3 - typescript: 5.1.3 + typescript: 5.1.6 webpack: 5.88.0 webpack-cli: 5.1.4 webpack-node-externals: 3.0.0 @@ -13697,23 +13697,23 @@ __metadata: languageName: node linkType: hard -"typescript@npm:5.1.3": - version: 5.1.3 - resolution: "typescript@npm:5.1.3" +"typescript@npm:5.1.6": + version: 5.1.6 + resolution: "typescript@npm:5.1.6" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: d9d51862d98efa46534f2800a1071a613751b1585dc78884807d0c179bcd93d6e9d4012a508e276742f5f33c480adefc52ffcafaf9e0e00ab641a14cde9a31c7 + checksum: b2f2c35096035fe1f5facd1e38922ccb8558996331405eb00a5111cc948b2e733163cc22fab5db46992aba7dd520fff637f2c1df4996ff0e134e77d3249a7350 languageName: node linkType: hard -"typescript@patch:typescript@5.1.3#~builtin": - version: 5.1.3 - resolution: "typescript@patch:typescript@npm%3A5.1.3#~builtin::version=5.1.3&hash=5da071" +"typescript@patch:typescript@5.1.6#~builtin": + version: 5.1.6 + resolution: "typescript@patch:typescript@npm%3A5.1.6#~builtin::version=5.1.6&hash=5da071" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: 6f0a9dca6bf4ce9dcaf4e282aade55ef4c56ecb5fb98d0a4a5c0113398815aea66d871b5611e83353e5953a19ed9ef103cf5a76ac0f276d550d1e7cd5344f61e + checksum: f53bfe97f7c8b2b6d23cf572750d4e7d1e0c5fff1c36d859d0ec84556a827b8785077bc27676bf7e71fae538e517c3ecc0f37e7f593be913d884805d931bc8be languageName: node linkType: hard diff --git a/viewer/package.json b/viewer/package.json index 9214848e535..2dd70efcb70 100644 --- a/viewer/package.json +++ b/viewer/package.json @@ -135,7 +135,7 @@ "ts-jest": "29.1.0", "ts-loader": "9.4.3", "tsc-alias": "1.8.6", - "typescript": "5.1.3", + "typescript": "5.1.6", "wasm-pack": "0.12.0", "webpack": "5.88.0", "webpack-cli": "5.1.4", diff --git a/viewer/yarn.lock b/viewer/yarn.lock index a72dbd7e8a7..104c6d0f28c 100644 --- a/viewer/yarn.lock +++ b/viewer/yarn.lock @@ -809,7 +809,7 @@ __metadata: ts-jest: 29.1.0 ts-loader: 9.4.3 tsc-alias: 1.8.6 - typescript: 5.1.3 + typescript: 5.1.6 wasm-pack: 0.12.0 webpack: 5.88.0 webpack-cli: 5.1.4 @@ -11666,23 +11666,23 @@ resolve@~1.19.0: languageName: node linkType: hard -"typescript@npm:5.1.3": - version: 5.1.3 - resolution: "typescript@npm:5.1.3" +"typescript@npm:5.1.6": + version: 5.1.6 + resolution: "typescript@npm:5.1.6" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: d9d51862d98efa46534f2800a1071a613751b1585dc78884807d0c179bcd93d6e9d4012a508e276742f5f33c480adefc52ffcafaf9e0e00ab641a14cde9a31c7 + checksum: b2f2c35096035fe1f5facd1e38922ccb8558996331405eb00a5111cc948b2e733163cc22fab5db46992aba7dd520fff637f2c1df4996ff0e134e77d3249a7350 languageName: node linkType: hard -"typescript@patch:typescript@5.1.3#~builtin": - version: 5.1.3 - resolution: "typescript@patch:typescript@npm%3A5.1.3#~builtin::version=5.1.3&hash=5da071" +"typescript@patch:typescript@5.1.6#~builtin": + version: 5.1.6 + resolution: "typescript@patch:typescript@npm%3A5.1.6#~builtin::version=5.1.6&hash=5da071" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: 6f0a9dca6bf4ce9dcaf4e282aade55ef4c56ecb5fb98d0a4a5c0113398815aea66d871b5611e83353e5953a19ed9ef103cf5a76ac0f276d550d1e7cd5344f61e + checksum: f53bfe97f7c8b2b6d23cf572750d4e7d1e0c5fff1c36d859d0ec84556a827b8785077bc27676bf7e71fae538e517c3ecc0f37e7f593be913d884805d931bc8be languageName: node linkType: hard