diff --git a/.vscode/settings.json b/.vscode/settings.json index 154c14fc5..59588cb92 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -112,7 +112,8 @@ "__verbose_abort": "cpp", "coroutine": "cpp", "expected": "cpp", - "source_location": "cpp" + "source_location": "cpp", + "booleanutils": "cpp" }, "cmake.configureOnOpen": true, "C_Cpp.default.configurationProvider": "ms-vscode.cmake-tools", diff --git a/package-lock.json b/package-lock.json index 536518d6a..f848764b0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,7 +12,7 @@ }, "devDependencies": { "@types/jest": "^29.5.14", - "@types/three": "^0.175.0", + "@types/three": "^0.176.0", "adm-zip": "^0.5.10", "cpy-cli": "^5.0.0", "esbuild": "^0.25.0", @@ -21,7 +21,7 @@ "make-dir-cli": "^4.0.0", "monaco-editor": "^0.52.0", "rimraf": "^6.0.0", - "three": "^0.175.0", + "three": "^0.176.0", "ts-jest": "^29.3.2", "ts-node": "^10.9.2", "typedoc": "^0.28.3", @@ -58,24 +58,24 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.26.2", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", - "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.25.9", + "@babel/helper-validator-identifier": "^7.27.1", "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" + "picocolors": "^1.1.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/compat-data": { - "version": "7.26.8", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.8.tgz", - "integrity": "sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==", + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.27.2.tgz", + "integrity": "sha512-TUtMJYRPyUb/9aU8f3K0mjmjf6M9N5Woshn2CS6nqJSeJtTtQcpLUXjGt9vbF8ZGff0El99sWkLgzwW3VXnxZQ==", "dev": true, "license": "MIT", "engines": { @@ -83,22 +83,22 @@ } }, "node_modules/@babel/core": { - "version": "7.26.10", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.10.tgz", - "integrity": "sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.27.1.tgz", + "integrity": "sha512-IaaGWsQqfsQWVLqMn9OB92MNN7zukfVA4s7KKAI0KfrrDsZ0yhi5uV4baBuLuN7n3vsZpwP8asPPcVwApxvjBQ==", "dev": true, "license": "MIT", "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.26.2", - "@babel/generator": "^7.26.10", - "@babel/helper-compilation-targets": "^7.26.5", - "@babel/helper-module-transforms": "^7.26.0", - "@babel/helpers": "^7.26.10", - "@babel/parser": "^7.26.10", - "@babel/template": "^7.26.9", - "@babel/traverse": "^7.26.10", - "@babel/types": "^7.26.10", + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.27.1", + "@babel/helper-compilation-targets": "^7.27.1", + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helpers": "^7.27.1", + "@babel/parser": "^7.27.1", + "@babel/template": "^7.27.1", + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -114,14 +114,14 @@ } }, "node_modules/@babel/generator": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.0.tgz", - "integrity": "sha512-VybsKvpiN1gU1sdMZIp7FcqphVVKEwcuj02x73uvcHE0PTihx1nlBcowYWhDwjpoAXRv43+gDzyggGnn1XZhVw==", + "version": "7.27.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.5.tgz", + "integrity": "sha512-ZGhA37l0e/g2s1Cnzdix0O3aLYm66eF8aufiVteOgnwxgnRP8GoyMj7VWsgWnQbVKXyge7hqrFh2K2TQM6t1Hw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.27.0", - "@babel/types": "^7.27.0", + "@babel/parser": "^7.27.5", + "@babel/types": "^7.27.3", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^3.0.2" @@ -131,14 +131,14 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.0.tgz", - "integrity": "sha512-LVk7fbXml0H2xH34dFzKQ7TDZ2G4/rVTOrq9V+icbbadjbVxxeFeDsNHv2SrZeWoA+6ZiTyWYWtScEIW07EAcA==", + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", + "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.26.8", - "@babel/helper-validator-option": "^7.25.9", + "@babel/compat-data": "^7.27.2", + "@babel/helper-validator-option": "^7.27.1", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" @@ -148,29 +148,29 @@ } }, "node_modules/@babel/helper-module-imports": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz", - "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", + "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", "dev": true, "license": "MIT", "dependencies": { - "@babel/traverse": "^7.25.9", - "@babel/types": "^7.25.9" + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz", - "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==", + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.27.3.tgz", + "integrity": "sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.25.9", - "@babel/helper-validator-identifier": "^7.25.9", - "@babel/traverse": "^7.25.9" + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.27.3" }, "engines": { "node": ">=6.9.0" @@ -180,9 +180,9 @@ } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.26.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz", - "integrity": "sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", + "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", "dev": true, "license": "MIT", "engines": { @@ -190,9 +190,9 @@ } }, "node_modules/@babel/helper-string-parser": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", - "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", "dev": true, "license": "MIT", "engines": { @@ -200,9 +200,9 @@ } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", - "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", + "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", "dev": true, "license": "MIT", "engines": { @@ -210,9 +210,9 @@ } }, "node_modules/@babel/helper-validator-option": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz", - "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", "dev": true, "license": "MIT", "engines": { @@ -220,27 +220,27 @@ } }, "node_modules/@babel/helpers": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.0.tgz", - "integrity": "sha512-U5eyP/CTFPuNE3qk+WZMxFkp/4zUzdceQlfzf7DdGdhp+Fezd7HD+i8Y24ZuTMKX3wQBld449jijbGq6OdGNQg==", + "version": "7.27.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.6.tgz", + "integrity": "sha512-muE8Tt8M22638HU31A3CgfSUciwz1fhATfoVai05aPXGor//CdWDCbnlY1yvBPo07njuVOCNGCSp/GTt12lIug==", "dev": true, "license": "MIT", "dependencies": { - "@babel/template": "^7.27.0", - "@babel/types": "^7.27.0" + "@babel/template": "^7.27.2", + "@babel/types": "^7.27.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.0.tgz", - "integrity": "sha512-iaepho73/2Pz7w2eMS0Q5f83+0RKI7i4xmiYeBmDzfRVbQtTOG7Ts0S4HzJVsTMGI9keU8rNfuZr8DKfSt7Yyg==", + "version": "7.27.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.5.tgz", + "integrity": "sha512-OsQd175SxWkGlzbny8J3K8TnnDD0N3lrIUtB92xwyRpzaenGZhxDvxN/JgU00U3CDZNj9tPuDJ5H0WS4Nt3vKg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.27.0" + "@babel/types": "^7.27.3" }, "bin": { "parser": "bin/babel-parser.js" @@ -305,13 +305,13 @@ } }, "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.26.0.tgz", - "integrity": "sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.27.1.tgz", + "integrity": "sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -347,13 +347,13 @@ } }, "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.9.tgz", - "integrity": "sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.27.1.tgz", + "integrity": "sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -473,13 +473,13 @@ } }, "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.9.tgz", - "integrity": "sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.27.1.tgz", + "integrity": "sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -489,32 +489,32 @@ } }, "node_modules/@babel/template": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.0.tgz", - "integrity": "sha512-2ncevenBqXI6qRMukPlXwHKHchC7RyMuu4xv5JBXRfOGVcTy1mXCD12qrp7Jsoxll1EV3+9sE4GugBVRjT2jFA==", + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.26.2", - "@babel/parser": "^7.27.0", - "@babel/types": "^7.27.0" + "@babel/code-frame": "^7.27.1", + "@babel/parser": "^7.27.2", + "@babel/types": "^7.27.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.0.tgz", - "integrity": "sha512-19lYZFzYVQkkHkl4Cy4WrAVcqBkgvV2YM2TU3xG6DIwO7O3ecbDPfW3yM3bjAGcqcQHi+CCtjMR3dIEHxsd6bA==", + "version": "7.27.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.4.tgz", + "integrity": "sha512-oNcu2QbHqts9BtOWJosOVJapWjBDSxGCpFvikNR5TGDYDQf3JwpIoMzIKrvfoti93cLfPJEG4tH9SPVeyCGgdA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.26.2", - "@babel/generator": "^7.27.0", - "@babel/parser": "^7.27.0", - "@babel/template": "^7.27.0", - "@babel/types": "^7.27.0", + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.27.3", + "@babel/parser": "^7.27.4", + "@babel/template": "^7.27.2", + "@babel/types": "^7.27.3", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -523,14 +523,14 @@ } }, "node_modules/@babel/types": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.0.tgz", - "integrity": "sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg==", + "version": "7.27.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.6.tgz", + "integrity": "sha512-ETyHEk2VHHvl9b9jZP5IHPavHYk57EhanlRRuae9XCpb/j5bDCbPPMOBfCWhnl/7EDJz0jEMCi/RhccCE8r1+Q==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.25.9", - "@babel/helper-validator-identifier": "^7.25.9" + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -567,10 +567,17 @@ "@jridgewell/sourcemap-codec": "^1.4.10" } }, + "node_modules/@dimforge/rapier3d-compat": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@dimforge/rapier3d-compat/-/rapier3d-compat-0.12.0.tgz", + "integrity": "sha512-uekIGetywIgopfD97oDL5PfeezkFpNhwlzlaEYNOA0N6ghdsOvh/HYjSMek5Q2O1PYvRSDFcqFVJl4r4ZBwOow==", + "dev": true, + "license": "Apache-2.0" + }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.3.tgz", - "integrity": "sha512-W8bFfPA8DowP8l//sxjJLSLkD8iEjMc7cBVyP+u4cEv9sM7mdUCkgsj+t0n/BWPFtv7WWCN5Yzj0N6FJNUUqBQ==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.5.tgz", + "integrity": "sha512-9o3TMmpmftaCMepOdA5k/yDw8SfInyzWWTjYTFCX3kPSDJMROQTb8jg+h9Cnwnmm1vOzvxN7gIfB5V2ewpjtGA==", "cpu": [ "ppc64" ], @@ -585,9 +592,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.3.tgz", - "integrity": "sha512-PuwVXbnP87Tcff5I9ngV0lmiSu40xw1At6i3GsU77U7cjDDB4s0X2cyFuBiDa1SBk9DnvWwnGvVaGBqoFWPb7A==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.5.tgz", + "integrity": "sha512-AdJKSPeEHgi7/ZhuIPtcQKr5RQdo6OO2IL87JkianiMYMPbCtot9fxPbrMiBADOWWm3T2si9stAiVsGbTQFkbA==", "cpu": [ "arm" ], @@ -602,9 +609,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.3.tgz", - "integrity": "sha512-XelR6MzjlZuBM4f5z2IQHK6LkK34Cvv6Rj2EntER3lwCBFdg6h2lKbtRjpTTsdEjD/WSe1q8UyPBXP1x3i/wYQ==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.5.tgz", + "integrity": "sha512-VGzGhj4lJO+TVGV1v8ntCZWJktV7SGCs3Pn1GRWI1SBFtRALoomm8k5E9Pmwg3HOAal2VDc2F9+PM/rEY6oIDg==", "cpu": [ "arm64" ], @@ -619,9 +626,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.3.tgz", - "integrity": "sha512-ogtTpYHT/g1GWS/zKM0cc/tIebFjm1F9Aw1boQ2Y0eUQ+J89d0jFY//s9ei9jVIlkYi8AfOjiixcLJSGNSOAdQ==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.5.tgz", + "integrity": "sha512-D2GyJT1kjvO//drbRT3Hib9XPwQeWd9vZoBJn+bu/lVsOZ13cqNdDeqIF/xQ5/VmWvMduP6AmXvylO/PIc2isw==", "cpu": [ "x64" ], @@ -636,9 +643,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.3.tgz", - "integrity": "sha512-eESK5yfPNTqpAmDfFWNsOhmIOaQA59tAcF/EfYvo5/QWQCzXn5iUSOnqt3ra3UdzBv073ykTtmeLJZGt3HhA+w==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.5.tgz", + "integrity": "sha512-GtaBgammVvdF7aPIgH2jxMDdivezgFu6iKpmT+48+F8Hhg5J/sfnDieg0aeG/jfSvkYQU2/pceFPDKlqZzwnfQ==", "cpu": [ "arm64" ], @@ -653,9 +660,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.3.tgz", - "integrity": "sha512-Kd8glo7sIZtwOLcPbW0yLpKmBNWMANZhrC1r6K++uDR2zyzb6AeOYtI6udbtabmQpFaxJ8uduXMAo1gs5ozz8A==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.5.tgz", + "integrity": "sha512-1iT4FVL0dJ76/q1wd7XDsXrSW+oLoquptvh4CLR4kITDtqi2e/xwXwdCVH8hVHU43wgJdsq7Gxuzcs6Iq/7bxQ==", "cpu": [ "x64" ], @@ -670,9 +677,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.3.tgz", - "integrity": "sha512-EJiyS70BYybOBpJth3M0KLOus0n+RRMKTYzhYhFeMwp7e/RaajXvP+BWlmEXNk6uk+KAu46j/kaQzr6au+JcIw==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.5.tgz", + "integrity": "sha512-nk4tGP3JThz4La38Uy/gzyXtpkPW8zSAmoUhK9xKKXdBCzKODMc2adkB2+8om9BDYugz+uGV7sLmpTYzvmz6Sw==", "cpu": [ "arm64" ], @@ -687,9 +694,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.3.tgz", - "integrity": "sha512-Q+wSjaLpGxYf7zC0kL0nDlhsfuFkoN+EXrx2KSB33RhinWzejOd6AvgmP5JbkgXKmjhmpfgKZq24pneodYqE8Q==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.5.tgz", + "integrity": "sha512-PrikaNjiXdR2laW6OIjlbeuCPrPaAl0IwPIaRv+SMV8CiM8i2LqVUHFC1+8eORgWyY7yhQY+2U2fA55mBzReaw==", "cpu": [ "x64" ], @@ -704,9 +711,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.3.tgz", - "integrity": "sha512-dUOVmAUzuHy2ZOKIHIKHCm58HKzFqd+puLaS424h6I85GlSDRZIA5ycBixb3mFgM0Jdh+ZOSB6KptX30DD8YOQ==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.5.tgz", + "integrity": "sha512-cPzojwW2okgh7ZlRpcBEtsX7WBuqbLrNXqLU89GxWbNt6uIg78ET82qifUy3W6OVww6ZWobWub5oqZOVtwolfw==", "cpu": [ "arm" ], @@ -721,9 +728,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.3.tgz", - "integrity": "sha512-xCUgnNYhRD5bb1C1nqrDV1PfkwgbswTTBRbAd8aH5PhYzikdf/ddtsYyMXFfGSsb/6t6QaPSzxtbfAZr9uox4A==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.5.tgz", + "integrity": "sha512-Z9kfb1v6ZlGbWj8EJk9T6czVEjjq2ntSYLY2cw6pAZl4oKtfgQuS4HOq41M/BcoLPzrUbNd+R4BXFyH//nHxVg==", "cpu": [ "arm64" ], @@ -738,9 +745,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.3.tgz", - "integrity": "sha512-yplPOpczHOO4jTYKmuYuANI3WhvIPSVANGcNUeMlxH4twz/TeXuzEP41tGKNGWJjuMhotpGabeFYGAOU2ummBw==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.5.tgz", + "integrity": "sha512-sQ7l00M8bSv36GLV95BVAdhJ2QsIbCuCjh/uYrWiMQSUuV+LpXwIqhgJDcvMTj+VsQmqAHL2yYaasENvJ7CDKA==", "cpu": [ "ia32" ], @@ -755,9 +762,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.3.tgz", - "integrity": "sha512-P4BLP5/fjyihmXCELRGrLd793q/lBtKMQl8ARGpDxgzgIKJDRJ/u4r1A/HgpBpKpKZelGct2PGI4T+axcedf6g==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.5.tgz", + "integrity": "sha512-0ur7ae16hDUC4OL5iEnDb0tZHDxYmuQyhKhsPBV8f99f6Z9KQM02g33f93rNH5A30agMS46u2HP6qTdEt6Q1kg==", "cpu": [ "loong64" ], @@ -772,9 +779,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.3.tgz", - "integrity": "sha512-eRAOV2ODpu6P5divMEMa26RRqb2yUoYsuQQOuFUexUoQndm4MdpXXDBbUoKIc0iPa4aCO7gIhtnYomkn2x+bag==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.5.tgz", + "integrity": "sha512-kB/66P1OsHO5zLz0i6X0RxlQ+3cu0mkxS3TKFvkb5lin6uwZ/ttOkP3Z8lfR9mJOBk14ZwZ9182SIIWFGNmqmg==", "cpu": [ "mips64el" ], @@ -789,9 +796,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.3.tgz", - "integrity": "sha512-ZC4jV2p7VbzTlnl8nZKLcBkfzIf4Yad1SJM4ZMKYnJqZFD4rTI+pBG65u8ev4jk3/MPwY9DvGn50wi3uhdaghg==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.5.tgz", + "integrity": "sha512-UZCmJ7r9X2fe2D6jBmkLBMQetXPXIsZjQJCjgwpVDz+YMcS6oFR27alkgGv3Oqkv07bxdvw7fyB71/olceJhkQ==", "cpu": [ "ppc64" ], @@ -806,9 +813,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.3.tgz", - "integrity": "sha512-LDDODcFzNtECTrUUbVCs6j9/bDVqy7DDRsuIXJg6so+mFksgwG7ZVnTruYi5V+z3eE5y+BJZw7VvUadkbfg7QA==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.5.tgz", + "integrity": "sha512-kTxwu4mLyeOlsVIFPfQo+fQJAV9mh24xL+y+Bm6ej067sYANjyEw1dNHmvoqxJUCMnkBdKpvOn0Ahql6+4VyeA==", "cpu": [ "riscv64" ], @@ -823,9 +830,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.3.tgz", - "integrity": "sha512-s+w/NOY2k0yC2p9SLen+ymflgcpRkvwwa02fqmAwhBRI3SC12uiS10edHHXlVWwfAagYSY5UpmT/zISXPMW3tQ==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.5.tgz", + "integrity": "sha512-K2dSKTKfmdh78uJ3NcWFiqyRrimfdinS5ErLSn3vluHNeHVnBAFWC8a4X5N+7FgVE1EjXS1QDZbpqZBjfrqMTQ==", "cpu": [ "s390x" ], @@ -840,9 +847,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.3.tgz", - "integrity": "sha512-nQHDz4pXjSDC6UfOE1Fw9Q8d6GCAd9KdvMZpfVGWSJztYCarRgSDfOVBY5xwhQXseiyxapkiSJi/5/ja8mRFFA==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.5.tgz", + "integrity": "sha512-uhj8N2obKTE6pSZ+aMUbqq+1nXxNjZIIjCjGLfsWvVpy7gKCOL6rsY1MhRh9zLtUtAI7vpgLMK6DxjO8Qm9lJw==", "cpu": [ "x64" ], @@ -857,9 +864,9 @@ } }, "node_modules/@esbuild/netbsd-arm64": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.3.tgz", - "integrity": "sha512-1QaLtOWq0mzK6tzzp0jRN3eccmN3hezey7mhLnzC6oNlJoUJz4nym5ZD7mDnS/LZQgkrhEbEiTn515lPeLpgWA==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.5.tgz", + "integrity": "sha512-pwHtMP9viAy1oHPvgxtOv+OkduK5ugofNTVDilIzBLpoWAM16r7b/mxBvfpuQDpRQFMfuVr5aLcn4yveGvBZvw==", "cpu": [ "arm64" ], @@ -874,9 +881,9 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.3.tgz", - "integrity": "sha512-i5Hm68HXHdgv8wkrt+10Bc50zM0/eonPb/a/OFVfB6Qvpiirco5gBA5bz7S2SHuU+Y4LWn/zehzNX14Sp4r27g==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.5.tgz", + "integrity": "sha512-WOb5fKrvVTRMfWFNCroYWWklbnXH0Q5rZppjq0vQIdlsQKuw6mdSihwSo4RV/YdQ5UCKKvBy7/0ZZYLBZKIbwQ==", "cpu": [ "x64" ], @@ -891,9 +898,9 @@ } }, "node_modules/@esbuild/openbsd-arm64": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.3.tgz", - "integrity": "sha512-zGAVApJEYTbOC6H/3QBr2mq3upG/LBEXr85/pTtKiv2IXcgKV0RT0QA/hSXZqSvLEpXeIxah7LczB4lkiYhTAQ==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.5.tgz", + "integrity": "sha512-7A208+uQKgTxHd0G0uqZO8UjK2R0DDb4fDmERtARjSHWxqMTye4Erz4zZafx7Di9Cv+lNHYuncAkiGFySoD+Mw==", "cpu": [ "arm64" ], @@ -908,9 +915,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.3.tgz", - "integrity": "sha512-fpqctI45NnCIDKBH5AXQBsD0NDPbEFczK98hk/aa6HJxbl+UtLkJV2+Bvy5hLSLk3LHmqt0NTkKNso1A9y1a4w==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.5.tgz", + "integrity": "sha512-G4hE405ErTWraiZ8UiSoesH8DaCsMm0Cay4fsFWOOUcz8b8rC6uCvnagr+gnioEjWn0wC+o1/TAHt+It+MpIMg==", "cpu": [ "x64" ], @@ -925,9 +932,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.3.tgz", - "integrity": "sha512-ROJhm7d8bk9dMCUZjkS8fgzsPAZEjtRJqCAmVgB0gMrvG7hfmPmz9k1rwO4jSiblFjYmNvbECL9uhaPzONMfgA==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.5.tgz", + "integrity": "sha512-l+azKShMy7FxzY0Rj4RCt5VD/q8mG/e+mDivgspo+yL8zW7qEwctQ6YqKX34DTEleFAvCIUviCFX1SDZRSyMQA==", "cpu": [ "x64" ], @@ -942,9 +949,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.3.tgz", - "integrity": "sha512-YWcow8peiHpNBiIXHwaswPnAXLsLVygFwCB3A7Bh5jRkIBFWHGmNQ48AlX4xDvQNoMZlPYzjVOQDYEzWCqufMQ==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.5.tgz", + "integrity": "sha512-O2S7SNZzdcFG7eFKgvwUEZ2VG9D/sn/eIiz8XRZ1Q/DO5a3s76Xv0mdBzVM5j5R639lXQmPmSo0iRpHqUUrsxw==", "cpu": [ "arm64" ], @@ -959,9 +966,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.3.tgz", - "integrity": "sha512-qspTZOIGoXVS4DpNqUYUs9UxVb04khS1Degaw/MnfMe7goQ3lTfQ13Vw4qY/Nj0979BGvMRpAYbs/BAxEvU8ew==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.5.tgz", + "integrity": "sha512-onOJ02pqs9h1iMJ1PQphR+VZv8qBMQ77Klcsqv9CNW2w6yLqoURLcgERAIurY6QE63bbLuqgP9ATqajFLK5AMQ==", "cpu": [ "ia32" ], @@ -976,9 +983,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.3.tgz", - "integrity": "sha512-ICgUR+kPimx0vvRzf+N/7L7tVSQeE3BYY+NhHRHXS1kBuPO7z2+7ea2HbhDyZdTephgvNvKrlDDKUexuCVBVvg==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.5.tgz", + "integrity": "sha512-TXv6YnJ8ZMVdX+SXWVBo/0p8LTcrUYngpWjvm91TMjjBQii7Oz11Lw5lbDV5Y0TzuhSJHwiH4hEtC1I42mMS0g==", "cpu": [ "x64" ], @@ -993,16 +1000,16 @@ } }, "node_modules/@gerrit0/mini-shiki": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@gerrit0/mini-shiki/-/mini-shiki-3.3.0.tgz", - "integrity": "sha512-frvArO0+s5Viq68uSod5SieLPVM2cLpXoQ1e07lURwgADXpL/MOypM7jPz9otks0g2DIe2YedDAeVrDyYJZRxA==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@gerrit0/mini-shiki/-/mini-shiki-3.4.2.tgz", + "integrity": "sha512-3jXo5bNjvvimvdbIhKGfFxSnKCX+MA8wzHv55ptzk/cx8wOzT+BRcYgj8aFN3yTiTs+zvQQiaZFr7Jce1ZG3fw==", "dev": true, "license": "MIT", "dependencies": { - "@shikijs/engine-oniguruma": "^3.3.0", - "@shikijs/langs": "^3.3.0", - "@shikijs/themes": "^3.3.0", - "@shikijs/types": "^3.3.0", + "@shikijs/engine-oniguruma": "^3.4.2", + "@shikijs/langs": "^3.4.2", + "@shikijs/themes": "^3.4.2", + "@shikijs/types": "^3.4.2", "@shikijs/vscode-textmate": "^10.0.2" } }, @@ -1590,40 +1597,40 @@ } }, "node_modules/@shikijs/engine-oniguruma": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-3.3.0.tgz", - "integrity": "sha512-l0vIw+GxeNU7uGnsu6B+Crpeqf+WTQ2Va71cHb5ZYWEVEPdfYwY5kXwYqRJwHrxz9WH+pjSpXQz+TJgAsrkA5A==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-3.6.0.tgz", + "integrity": "sha512-nmOhIZ9yT3Grd+2plmW/d8+vZ2pcQmo/UnVwXMUXAKTXdi+LK0S08Ancrz5tQQPkxvjBalpMW2aKvwXfelauvA==", "dev": true, "license": "MIT", "dependencies": { - "@shikijs/types": "3.3.0", + "@shikijs/types": "3.6.0", "@shikijs/vscode-textmate": "^10.0.2" } }, "node_modules/@shikijs/langs": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-3.3.0.tgz", - "integrity": "sha512-zt6Kf/7XpBQKSI9eqku+arLkAcDQ3NHJO6zFjiChI8w0Oz6Jjjay7pToottjQGjSDCFk++R85643WbyINcuL+g==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-3.6.0.tgz", + "integrity": "sha512-IdZkQJaLBu1LCYCwkr30hNuSDfllOT8RWYVZK1tD2J03DkiagYKRxj/pDSl8Didml3xxuyzUjgtioInwEQM/TA==", "dev": true, "license": "MIT", "dependencies": { - "@shikijs/types": "3.3.0" + "@shikijs/types": "3.6.0" } }, "node_modules/@shikijs/themes": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-3.3.0.tgz", - "integrity": "sha512-tXeCvLXBnqq34B0YZUEaAD1lD4lmN6TOHAhnHacj4Owh7Ptb/rf5XCDeROZt2rEOk5yuka3OOW2zLqClV7/SOg==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-3.6.0.tgz", + "integrity": "sha512-Fq2j4nWr1DF4drvmhqKq8x5vVQ27VncF8XZMBuHuQMZvUSS3NBgpqfwz/FoGe36+W6PvniZ1yDlg2d4kmYDU6w==", "dev": true, "license": "MIT", "dependencies": { - "@shikijs/types": "3.3.0" + "@shikijs/types": "3.6.0" } }, "node_modules/@shikijs/types": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-3.3.0.tgz", - "integrity": "sha512-KPCGnHG6k06QG/2pnYGbFtFvpVJmC3uIpXrAiPrawETifujPBv0Se2oUxm5qYgjCvGJS9InKvjytOdN+bGuX+Q==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-3.6.0.tgz", + "integrity": "sha512-cLWFiToxYu0aAzJqhXTQsFiJRTFDAGl93IrMSBNaGSzs7ixkLfdG6pH11HipuWFGW5vyx4X47W8HDQ7eSrmBUg==", "dev": true, "license": "MIT", "dependencies": { @@ -1814,9 +1821,9 @@ } }, "node_modules/@types/node": { - "version": "22.15.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.15.3.tgz", - "integrity": "sha512-lX7HFZeHf4QG/J7tBZqrCAXwz9J5RD56Y6MpP0eJkka8p+K0RY/yBTW7CYFJ4VGCclxqOLKmiGP5juQc6MKgcw==", + "version": "22.15.30", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.15.30.tgz", + "integrity": "sha512-6Q7lr06bEHdlfplU6YRbgG1SFBdlsfNC4/lX+SkhiTs0cpJkOElmWls8PxDFv4yY/xKb8Y6SO0OmSX4wgqTZbA==", "dev": true, "license": "MIT", "dependencies": { @@ -1831,19 +1838,20 @@ "license": "MIT" }, "node_modules/@types/stats.js": { - "version": "0.17.3", - "resolved": "https://registry.npmjs.org/@types/stats.js/-/stats.js-0.17.3.tgz", - "integrity": "sha512-pXNfAD3KHOdif9EQXZ9deK82HVNaXP5ZIF5RP2QG6OQFNTaY2YIetfrE9t528vEreGQvEPRDDc8muaoYeK0SxQ==", + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@types/stats.js/-/stats.js-0.17.4.tgz", + "integrity": "sha512-jIBvWWShCvlBqBNIZt0KAshWpvSjhkwkEu4ZUcASoAvhmrgAUI2t1dXrjSL4xXVLB4FznPrIsX3nKXFl/Dt4vA==", "dev": true, "license": "MIT" }, "node_modules/@types/three": { - "version": "0.175.0", - "resolved": "https://registry.npmjs.org/@types/three/-/three-0.175.0.tgz", - "integrity": "sha512-ldMSBgtZOZ3g9kJ3kOZSEtZIEITmJOzu8eKVpkhf036GuNkM4mt0NXecrjCn5tMm1OblOF7dZehlaDypBfNokw==", + "version": "0.176.0", + "resolved": "https://registry.npmjs.org/@types/three/-/three-0.176.0.tgz", + "integrity": "sha512-FwfPXxCqOtP7EdYMagCFePNKoG1AGBDUEVKtluv2BTVRpSt7b+X27xNsirPCTCqY1pGYsPUzaM3jgWP7dXSxlw==", "dev": true, "license": "MIT", "dependencies": { + "@dimforge/rapier3d-compat": "^0.12.0", "@tweenjs/tween.js": "~23.1.3", "@types/stats.js": "*", "@types/webxr": "*", @@ -1891,9 +1899,9 @@ "license": "MIT" }, "node_modules/@webgpu/types": { - "version": "0.1.60", - "resolved": "https://registry.npmjs.org/@webgpu/types/-/types-0.1.60.tgz", - "integrity": "sha512-8B/tdfRFKdrnejqmvq95ogp8tf52oZ51p3f4QD5m5Paey/qlX4Rhhy5Y8tgFMi7Ms70HzcMMw3EQjH/jdhTwlA==", + "version": "0.1.61", + "resolved": "https://registry.npmjs.org/@webgpu/types/-/types-0.1.61.tgz", + "integrity": "sha512-w2HbBvH+qO19SB5pJOJFKs533CdZqxl3fcGonqL321VHkW7W/iBo6H8bjDy6pr/+pbMwIu5dnuaAxH7NxBqUrQ==", "dev": true, "license": "BSD-3-Clause" }, @@ -1912,9 +1920,9 @@ } }, "node_modules/acorn": { - "version": "8.14.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz", - "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==", + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "dev": true, "license": "MIT", "bin": { @@ -2262,9 +2270,9 @@ "license": "MIT" }, "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, "license": "MIT", "dependencies": { @@ -2286,9 +2294,9 @@ } }, "node_modules/browserslist": { - "version": "4.24.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz", - "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==", + "version": "4.24.5", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.5.tgz", + "integrity": "sha512-FDToo4Wo82hIdgc1CQ+NQD0hEhmpPjrZ3hiUgwgOG6IuTdlpr8jdjyG24P6cNP1yJpTLzS5OcGgSw0xmDU1/Tw==", "dev": true, "funding": [ { @@ -2306,10 +2314,10 @@ ], "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001688", - "electron-to-chromium": "^1.5.73", + "caniuse-lite": "^1.0.30001716", + "electron-to-chromium": "^1.5.149", "node-releases": "^2.0.19", - "update-browserslist-db": "^1.1.1" + "update-browserslist-db": "^1.1.3" }, "bin": { "browserslist": "cli.js" @@ -2442,9 +2450,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001716", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001716.tgz", - "integrity": "sha512-49/c1+x3Kwz7ZIWt+4DvK3aMJy9oYXXG6/97JKsnjdCk/6n9vVyWL8NAwVt95Lwt9eigI10Hl782kDfZUUlRXw==", + "version": "1.0.30001723", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001723.tgz", + "integrity": "sha512-1R/elMjtehrFejxwmexeXAtae5UO9iSyFn6G/I806CYC/BLyyBk1EPhrKBkWhy6wM6Xnm47dSJQec+tLJ39WHw==", "dev": true, "funding": [ { @@ -2902,9 +2910,9 @@ } }, "node_modules/dedent": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.3.tgz", - "integrity": "sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.6.0.tgz", + "integrity": "sha512-F1Z+5UCFpmQUzJa11agbyPVMbpgT/qA3/SKyJ1jyBgm7dUcUEa8v9JwDkerSQXfakBwFljIxhOJqGkjUwZ9FSA==", "dev": true, "license": "MIT", "peerDependencies": { @@ -3060,9 +3068,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.148", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.148.tgz", - "integrity": "sha512-8uc1QXwwqayD4mblcsQYZqoi+cOc97A2XmKSBOIRbEAvbp6vrqmSYs4dHD2qVygUgn7Mi0qdKgPaJ9WC8cv63A==", + "version": "1.5.165", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.165.tgz", + "integrity": "sha512-naiMx1Z6Nb2TxPU6fiFrUrDTjyPMLdTtaOd2oLmG8zVSg2hCWGkhPyxwk+qRmZ1ytwVqUv0u7ZcDA5+ALhaUtw==", "dev": true, "license": "ISC" }, @@ -3153,9 +3161,9 @@ } }, "node_modules/esbuild": { - "version": "0.25.3", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.3.tgz", - "integrity": "sha512-qKA6Pvai73+M2FtftpNKRxJ78GIjmFXFxd/1DVBqGo/qNhLSfv+G12n9pNoWdytJC8U00TrViOwpjT0zgqQS8Q==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.5.tgz", + "integrity": "sha512-P8OtKZRv/5J5hhz0cUAdu/cLuPIKXpQl1R9pZtvmHWQvrAUVd0UNIPT4IB4W3rNOqVO0rlqHmCIbSwxh/c9yUQ==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -3166,31 +3174,31 @@ "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.25.3", - "@esbuild/android-arm": "0.25.3", - "@esbuild/android-arm64": "0.25.3", - "@esbuild/android-x64": "0.25.3", - "@esbuild/darwin-arm64": "0.25.3", - "@esbuild/darwin-x64": "0.25.3", - "@esbuild/freebsd-arm64": "0.25.3", - "@esbuild/freebsd-x64": "0.25.3", - "@esbuild/linux-arm": "0.25.3", - "@esbuild/linux-arm64": "0.25.3", - "@esbuild/linux-ia32": "0.25.3", - "@esbuild/linux-loong64": "0.25.3", - "@esbuild/linux-mips64el": "0.25.3", - "@esbuild/linux-ppc64": "0.25.3", - "@esbuild/linux-riscv64": "0.25.3", - "@esbuild/linux-s390x": "0.25.3", - "@esbuild/linux-x64": "0.25.3", - "@esbuild/netbsd-arm64": "0.25.3", - "@esbuild/netbsd-x64": "0.25.3", - "@esbuild/openbsd-arm64": "0.25.3", - "@esbuild/openbsd-x64": "0.25.3", - "@esbuild/sunos-x64": "0.25.3", - "@esbuild/win32-arm64": "0.25.3", - "@esbuild/win32-ia32": "0.25.3", - "@esbuild/win32-x64": "0.25.3" + "@esbuild/aix-ppc64": "0.25.5", + "@esbuild/android-arm": "0.25.5", + "@esbuild/android-arm64": "0.25.5", + "@esbuild/android-x64": "0.25.5", + "@esbuild/darwin-arm64": "0.25.5", + "@esbuild/darwin-x64": "0.25.5", + "@esbuild/freebsd-arm64": "0.25.5", + "@esbuild/freebsd-x64": "0.25.5", + "@esbuild/linux-arm": "0.25.5", + "@esbuild/linux-arm64": "0.25.5", + "@esbuild/linux-ia32": "0.25.5", + "@esbuild/linux-loong64": "0.25.5", + "@esbuild/linux-mips64el": "0.25.5", + "@esbuild/linux-ppc64": "0.25.5", + "@esbuild/linux-riscv64": "0.25.5", + "@esbuild/linux-s390x": "0.25.5", + "@esbuild/linux-x64": "0.25.5", + "@esbuild/netbsd-arm64": "0.25.5", + "@esbuild/netbsd-x64": "0.25.5", + "@esbuild/openbsd-arm64": "0.25.5", + "@esbuild/openbsd-x64": "0.25.5", + "@esbuild/sunos-x64": "0.25.5", + "@esbuild/win32-arm64": "0.25.5", + "@esbuild/win32-ia32": "0.25.5", + "@esbuild/win32-x64": "0.25.5" } }, "node_modules/escalade": { @@ -3405,9 +3413,9 @@ } }, "node_modules/filelist/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, "license": "MIT", "dependencies": { @@ -4208,9 +4216,9 @@ } }, "node_modules/jackspeak": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.1.0.tgz", - "integrity": "sha512-9DDdhb5j6cpeitCbvLO7n7J4IxnbM6hoF6O1g4HQ5TfhvvKN8ywDM7668ZhMHRqVmxqhps/F6syWK2KcPxYlkw==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.1.1.tgz", + "integrity": "sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { @@ -6774,9 +6782,9 @@ } }, "node_modules/rimraf/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, "license": "MIT", "dependencies": { @@ -7464,9 +7472,9 @@ } }, "node_modules/three": { - "version": "0.175.0", - "resolved": "https://registry.npmjs.org/three/-/three-0.175.0.tgz", - "integrity": "sha512-nNE3pnTHxXN/Phw768u0Grr7W4+rumGg/H6PgeseNJojkJtmeHJfZWi41Gp2mpXl1pg1pf1zjwR4McM1jTqkpg==", + "version": "0.176.0", + "resolved": "https://registry.npmjs.org/three/-/three-0.176.0.tgz", + "integrity": "sha512-PWRKYWQo23ojf9oZSlRGH8K09q7nRSWx6LY/HF/UUrMdYgN9i1e2OwJYHoQjwc6HF/4lvvYLC5YC1X8UJL2ZpA==", "dev": true, "license": "MIT" }, @@ -7521,21 +7529,20 @@ } }, "node_modules/ts-jest": { - "version": "29.3.2", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.3.2.tgz", - "integrity": "sha512-bJJkrWc6PjFVz5g2DGCNUo8z7oFEYaz1xP1NpeDU7KNLMWPpEyV8Chbpkn8xjzgRDpQhnGMyvyldoL7h8JXyug==", + "version": "29.4.0", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.4.0.tgz", + "integrity": "sha512-d423TJMnJGu80/eSgfQ5w/R+0zFJvdtTxwtF9KzFFunOpSeD+79lHJQIiAhluJoyGRbvj9NZJsl9WjCUo0ND7Q==", "dev": true, "license": "MIT", "dependencies": { "bs-logger": "^0.2.6", "ejs": "^3.1.10", "fast-json-stable-stringify": "^2.1.0", - "jest-util": "^29.0.0", "json5": "^2.2.3", "lodash.memoize": "^4.1.2", "make-error": "^1.3.6", - "semver": "^7.7.1", - "type-fest": "^4.39.1", + "semver": "^7.7.2", + "type-fest": "^4.41.0", "yargs-parser": "^21.1.1" }, "bin": { @@ -7546,10 +7553,11 @@ }, "peerDependencies": { "@babel/core": ">=7.0.0-beta.0 <8", - "@jest/transform": "^29.0.0", - "@jest/types": "^29.0.0", - "babel-jest": "^29.0.0", - "jest": "^29.0.0", + "@jest/transform": "^29.0.0 || ^30.0.0", + "@jest/types": "^29.0.0 || ^30.0.0", + "babel-jest": "^29.0.0 || ^30.0.0", + "jest": "^29.0.0 || ^30.0.0", + "jest-util": "^29.0.0 || ^30.0.0", "typescript": ">=4.3 <6" }, "peerDependenciesMeta": { @@ -7567,13 +7575,16 @@ }, "esbuild": { "optional": true + }, + "jest-util": { + "optional": true } } }, "node_modules/ts-jest/node_modules/semver": { - "version": "7.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", - "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", "dev": true, "license": "ISC", "bin": { @@ -7584,9 +7595,9 @@ } }, "node_modules/ts-jest/node_modules/type-fest": { - "version": "4.40.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.40.1.tgz", - "integrity": "sha512-9YvLNnORDpI+vghLU/Nf+zSv0kL47KbVJ1o3sKgoTefl6i+zebxbiDQWoe/oWWqPhIgQdRZRT1KA9sCPL810SA==", + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", + "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", "dev": true, "license": "(MIT OR CC0-1.0)", "engines": { @@ -7688,9 +7699,9 @@ } }, "node_modules/typedoc": { - "version": "0.28.3", - "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.28.3.tgz", - "integrity": "sha512-5svOCTfXvVSh6zbZKSQluZhR8yN2tKpTeHZxlmWpE6N5vc3R8k/jhg9nnD6n5tN9/ObuQTojkONrOxFdUFUG9w==", + "version": "0.28.5", + "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.28.5.tgz", + "integrity": "sha512-5PzUddaA9FbaarUzIsEc4wNXCiO4Ot3bJNeMF2qKpYlTmM9TTaSHQ7162w756ERCkXER/+o2purRG6YOAv6EMA==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -7712,9 +7723,9 @@ } }, "node_modules/typedoc/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, "license": "MIT", "dependencies": { @@ -7989,16 +8000,16 @@ "license": "ISC" }, "node_modules/yaml": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.7.1.tgz", - "integrity": "sha512-10ULxpnOCQXxJvBgxsn9ptjq6uviG/htZKk9veJGhlqn3w/DxQ631zFF+nlQXLwmImeS5amR2dl2U8sg6U9jsQ==", + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.0.tgz", + "integrity": "sha512-4lLa/EcQCB0cJkyts+FpIRx5G/llPxfP6VQU5KByHEhLxY3IJCH0f0Hy1MHI8sClTvsIb8qwRJ6R/ZdlDJ/leQ==", "dev": true, "license": "ISC", "bin": { "yaml": "bin.mjs" }, "engines": { - "node": ">= 14" + "node": ">= 14.6" } }, "node_modules/yargs": { diff --git a/package.json b/package.json index 5f938e14b..0fc3461a1 100644 --- a/package.json +++ b/package.json @@ -66,7 +66,7 @@ ], "devDependencies": { "@types/jest": "^29.5.14", - "@types/three": "^0.175.0", + "@types/three": "^0.176.0", "adm-zip": "^0.5.10", "cpy-cli": "^5.0.0", "esbuild": "^0.25.0", @@ -75,7 +75,7 @@ "make-dir-cli": "^4.0.0", "monaco-editor": "^0.52.0", "rimraf": "^6.0.0", - "three": "^0.175.0", + "three": "^0.176.0", "ts-jest": "^29.3.2", "ts-node": "^10.9.2", "typedoc": "^0.28.3", diff --git a/src/cpp/test/io_helpers.cpp b/src/cpp/test/io_helpers.cpp index 3b4627ab9..dab808c05 100644 --- a/src/cpp/test/io_helpers.cpp +++ b/src/cpp/test/io_helpers.cpp @@ -160,7 +160,7 @@ namespace webifc::io for (uint32_t i = 0; i < geom.numFaces; i++) { - webifc::geometry::Face f = geom.GetFace(i); + bimGeometry::Face f = geom.GetFace(i); obj << "f " << (f.i0 + 1 + offset) << "// " << (f.i1 + 1 + offset) << "// " << (f.i2 + 1 + offset) << "//\n"; } @@ -231,7 +231,7 @@ namespace webifc::io for (uint32_t i = 0; i < geom.numFaces; i++) { - webifc::geometry::Face f = geom.GetFace(i); + bimGeometry::Face f = geom.GetFace(i); obj << "f " << (f.i0 + 1 + offset) << "// " << (f.i1 + 1 + offset) << "// " << (f.i2 + 1 + offset) << "//\n"; } diff --git a/src/cpp/test/web-ifc-test.cpp b/src/cpp/test/web-ifc-test.cpp index 2b0c59d4e..006db4a2f 100644 --- a/src/cpp/test/web-ifc-test.cpp +++ b/src/cpp/test/web-ifc-test.cpp @@ -462,7 +462,7 @@ int main() // std::string content = ReadFile("C:/Users/qmoya/Desktop/MODELS/15.ifc"); // std::string content = ReadFile("C:/Users/qmoya/Desktop/MODELS/F_MA_160_ALT3.ifc"); // std::string content = ReadFile("C:/Users/qmoya/Desktop/MODELS/1256.ifc"); - std::string content = ReadFile("C:/Users/qmoya/Desktop/MODELS/15.ifc"); + std::string content = ReadFile("C:/Users/qmoya/Desktop/MODELS/1092_A.ifc"); struct LoaderSettings { @@ -501,8 +501,8 @@ int main() start = ms(); - SpecificLoadTest(loader, geometryLoader, 211736); - // auto meshes = LoadAllTest(loader, geometryLoader, -1); + // SpecificLoadTest(loader, geometryLoader, 3994); + auto meshes = LoadAllTest(loader, geometryLoader, -1); // auto rebars = GetAllRebars(loader, geometryLoader); // std::cout << GetLine(loader, 225) << std::endl; // auto alignments = GetAlignments(loader, geometryLoader); diff --git a/src/cpp/wasm/web-ifc-wasm.cpp b/src/cpp/wasm/web-ifc-wasm.cpp index 7653d224c..9d2e7c999 100644 --- a/src/cpp/wasm/web-ifc-wasm.cpp +++ b/src/cpp/wasm/web-ifc-wasm.cpp @@ -14,6 +14,7 @@ #include "../version.h" #include "../web-ifc/geometry/operations/bim-geometry/extrusion.h" #include "../web-ifc/geometry/operations/bim-geometry/sweep.h" +#include "../web-ifc/geometry/operations/bim-geometry/circularSweep.h" #include "../web-ifc/geometry/operations/bim-geometry/revolution.h" #include "../web-ifc/geometry/operations/bim-geometry/cylindricalRevolution.h" #include "../web-ifc/geometry/operations/bim-geometry/parabola.h" @@ -21,6 +22,8 @@ #include "../web-ifc/geometry/operations/bim-geometry/arc.h" #include "../web-ifc/geometry/operations/bim-geometry/alignment.h" #include "../web-ifc/geometry/operations/bim-geometry/utils.h" +#include "../web-ifc/geometry/operations/bim-geometry/boolean.h" +#include "../web-ifc/geometry/operations/bim-geometry/Profile.h" namespace webifc::parsing { void p21encode(std::string_view input, std::ostringstream &output); @@ -800,6 +803,12 @@ bimGeometry::Sweep CreateSweep() return bimGeometry::Sweep(); } +bimGeometry::CircularSweep CreateCircularSweep() +{ + return bimGeometry::CircularSweep(); +} + + bimGeometry::Revolve CreateRevolution() { return bimGeometry::Revolve(); @@ -830,6 +839,15 @@ bimGeometry::Alignment CreateAlignment() return bimGeometry::Alignment(); } +bimGeometry::Boolean CreateBoolean() +{ + return bimGeometry::Boolean(); +} + +bimGeometry::Profile CreateProfile() +{ + return bimGeometry::Profile(); +} EMSCRIPTEN_BINDINGS(my_module) { @@ -842,8 +860,6 @@ EMSCRIPTEN_BINDINGS(my_module) { .function("GetSweptDiskSolid", &webifc::geometry::IfcGeometry::GetSweptDiskSolid) ; - - emscripten::value_object("dvec4") .field("x", &glm::dvec4::x) .field("y", &glm::dvec4::y) @@ -962,12 +978,13 @@ EMSCRIPTEN_BINDINGS(my_module) { .function("GetBuffers", &bimGeometry::AABB::GetBuffers) .function("SetValues", &bimGeometry::AABB::SetValues) ; - emscripten::class_("Extrusion") .constructor<>() .function("GetBuffers", &bimGeometry::Extrusion::GetBuffers) .function("SetValues", &bimGeometry::Extrusion::SetValues) + .function("SetHoles", &bimGeometry::Extrusion::SetHoles) + .function("ClearHoles", &bimGeometry::Extrusion::ClearHoles) ; emscripten::class_("Sweep") @@ -975,6 +992,12 @@ EMSCRIPTEN_BINDINGS(my_module) { .function("GetBuffers", &bimGeometry::Sweep::GetBuffers) .function("SetValues", &bimGeometry::Sweep::SetValues) ; + + emscripten::class_("CircularSweep") + .constructor<>() + .function("GetBuffers", &bimGeometry::CircularSweep::GetBuffers) + .function("SetValues", &bimGeometry::CircularSweep::SetValues) + ; emscripten::class_("Revolution") .constructor<>() @@ -1011,16 +1034,33 @@ EMSCRIPTEN_BINDINGS(my_module) { .function("GetBuffers", &bimGeometry::Alignment::GetBuffers) .function("SetValues", &bimGeometry::Alignment::SetValues) ; + + emscripten::class_("BooleanOperator") + .constructor<>() + .function("GetBuffers", &bimGeometry::Boolean::GetBuffers) + .function("SetValues", &bimGeometry::Boolean::SetValues) + .function("SetSecond", &bimGeometry::Boolean::SetSecond) + .function("clear", &bimGeometry::Boolean::clear) + ; + + emscripten::class_("Profile") + .constructor<>() + .function("GetBuffers", &bimGeometry::Profile::GetBuffers) + .function("SetValues", &bimGeometry::Profile::SetValues) + ; emscripten::function("CreateAABB", &CreateAABB); emscripten::function("CreateExtrusion", &CreateExtrusion); emscripten::function("CreateSweep", &CreateSweep); + emscripten::function("CreateCircularSweep", &CreateCircularSweep); emscripten::function("CreateRevolution", &CreateRevolution); emscripten::function("CreateCylindricalRevolution", &CreateCylindricalRevolution); emscripten::function("CreateParabola", &CreateParabola); emscripten::function("CreateClothoid", &CreateClothoid); emscripten::function("CreateArc", &CreateArc); emscripten::function("CreateAlignment", &CreateAlignment); + emscripten::function("CreateBooleanOperator", &CreateBoolean); + emscripten::function("CreateProfile", &CreateProfile); emscripten::function("LoadAllGeometry", &LoadAllGeometry); emscripten::function("GetAllCrossSections", &GetAllCrossSections); emscripten::function("GetAllAlignments", &GetAllAlignments); diff --git a/src/cpp/web-ifc/geometry/IfcGeometryLoader.cpp b/src/cpp/web-ifc/geometry/IfcGeometryLoader.cpp index b524e83b4..3fe919892 100644 --- a/src/cpp/web-ifc/geometry/IfcGeometryLoader.cpp +++ b/src/cpp/web-ifc/geometry/IfcGeometryLoader.cpp @@ -2995,16 +2995,16 @@ IfcProfile IfcGeometryLoader::GetProfile(uint32_t expressID) const IfcCurve IfcGeometryLoader::GetLocalCurve(uint32_t expressID) const { spdlog::debug("[GetLocalCurve({})]",expressID); - for (uint32_t i = 0; i < LocalcurvesIndices.size(); i++) + for (uint32_t i = 0; i < _localcurvesIndices.size(); i++) { - if (LocalcurvesIndices[i] == expressID) + if (_localcurvesIndices[i] == expressID) { - return LocalCurvesList[i]; + return _localCurvesList[i]; } } IfcCurve curve = GetCurve(expressID, 3, false); - LocalcurvesIndices.push_back(expressID); - LocalCurvesList.push_back(curve); + _localcurvesIndices.push_back(expressID); + _localCurvesList.push_back(curve); return curve; } @@ -3638,8 +3638,9 @@ IfcProfile IfcGeometryLoader::GetProfile(uint32_t expressID) const _loader.GetTokenType(); return _loader.GetDoubleArgument(); } - spdlog::warn("[ReadLengthMeasure()] Unrecognised type {}", LengthMeasureLabel); + spdlog::warn("[ReadLenghtMeasure()] Unrecognised type {}", LengthMeasureLabel); } + return 0.0; } std::vector IfcGeometryLoader::ReadCurveIndices() const @@ -3685,4 +3686,15 @@ IfcProfile IfcGeometryLoader::GetProfile(uint32_t expressID) const return result; } + IfcGeometryLoader* IfcGeometryLoader::Clone(const webifc::parsing::IfcLoader &newLoader) const { + IfcGeometryLoader * newGeomLoader = new IfcGeometryLoader(newLoader, _schemaManager, _relVoids, _relNests, _relAggregates, _styledItems, _relMaterials, _materialDefinitions, _linearScalingFactor, _squaredScalingFactor, _cubicScalingFactor, _angularScalingFactor, _angleUnits, _circleSegments, _localCurvesList, _localcurvesIndices, _expressIDToPlacement); + return newGeomLoader; + } + + + IfcGeometryLoader::IfcGeometryLoader(const webifc::parsing::IfcLoader &loader, const webifc::schema::IfcSchemaManager &schemaManager, const std::unordered_map> &relVoids, const std::unordered_map> &relNests, const std::unordered_map> &relAggregates, const std::unordered_map>> &styledItems, const std::unordered_map>> &relMaterials, const std::unordered_map>> &materialDefinitions, double linearScalingFactor, double squaredScalingFactor, double cubicScalingFactor, double angularScalingFactor, std::string angleUnits, uint16_t circleSegments, std::vector &localCurvesList, std::vector &localcurvesIndices, std::unordered_map expressIDToPlacement) + : _loader(loader),_schemaManager(schemaManager),_relVoids(relVoids),_relNests(relNests),_relAggregates(relAggregates),_styledItems(styledItems),_relMaterials(relMaterials), _materialDefinitions(materialDefinitions), _linearScalingFactor(linearScalingFactor), _squaredScalingFactor(squaredScalingFactor), _cubicScalingFactor(cubicScalingFactor), _angularScalingFactor(angularScalingFactor), _angleUnits(angleUnits), _circleSegments(circleSegments),_localCurvesList(localCurvesList), _localcurvesIndices(localcurvesIndices), _expressIDToPlacement(expressIDToPlacement) + {} + + } \ No newline at end of file diff --git a/src/cpp/web-ifc/geometry/IfcGeometryLoader.h b/src/cpp/web-ifc/geometry/IfcGeometryLoader.h index 51ad50617..4079cb718 100644 --- a/src/cpp/web-ifc/geometry/IfcGeometryLoader.h +++ b/src/cpp/web-ifc/geometry/IfcGeometryLoader.h @@ -56,7 +56,9 @@ namespace webifc::geometry double GetLinearScalingFactor() const; std::string GetAngleUnits() const; void Clear() const; + IfcGeometryLoader* Clone(const webifc::parsing::IfcLoader &loader) const; private: + IfcGeometryLoader(const webifc::parsing::IfcLoader &loader, const webifc::schema::IfcSchemaManager &schemaManager, const std::unordered_map> &relVoids, const std::unordered_map> &relNests, const std::unordered_map> &relAggregates, const std::unordered_map>> &styledItems, const std::unordered_map>> &relMaterials, const std::unordered_map>> &materialDefinitions, double linearScalingFactor, double squaredScalingFactor, double cubicScalingFactor, double angularScalingFactor, std::string angleUnits, uint16_t circleSegments, std::vector &localCurvesList, std::vector &localcurvesIndices, std::unordered_map expressIDToPlacement); IfcCurve GetAlignmentCurve(uint32_t expressID, uint32_t parentExpressID = -1) const; IfcProfile GetProfileByLine(uint32_t expressID) const; glm::dvec3 GetVertexPoint(uint32_t expressID) const; @@ -79,8 +81,8 @@ namespace webifc::geometry double _angularScalingFactor = 1; std::string _angleUnits; uint16_t _circleSegments; - mutable std::vector LocalCurvesList; - mutable std::vector LocalcurvesIndices; + mutable std::vector _localCurvesList; + mutable std::vector _localcurvesIndices; std::unordered_map> PopulateRelVoidsMap(); std::unordered_map> PopulateRelNestsMap(); std::unordered_map> PopulateRelAggregatesMap(); diff --git a/src/cpp/web-ifc/geometry/IfcGeometryProcessor.cpp b/src/cpp/web-ifc/geometry/IfcGeometryProcessor.cpp index 14dbe492b..09b1e1d43 100644 --- a/src/cpp/web-ifc/geometry/IfcGeometryProcessor.cpp +++ b/src/cpp/web-ifc/geometry/IfcGeometryProcessor.cpp @@ -1650,7 +1650,7 @@ namespace webifc::geometry IfcGeometry IfcGeometryProcessor::BoolProcess(const std::vector &firstGeoms, std::vector &secondGeoms, std::string op) { - return boolEngine.BoolProcess(firstGeoms, secondGeoms, op); + return _boolEngine.BoolProcess(firstGeoms, secondGeoms, op); } std::vector IfcGeometryProcessor::Read2DArrayOfThreeIndices() @@ -1990,4 +1990,14 @@ namespace webifc::geometry return convertToWebIfc(fuzzybools::Subtract(firstEngGeom, secondEngGeom)); } + IfcGeometryProcessor * IfcGeometryProcessor::Clone(const webifc::parsing::IfcLoader &newLoader) const { + IfcGeometryProcessor *newProcessor = new IfcGeometryProcessor(_settings,_expressIDToGeometry,*_geometryLoader.Clone(newLoader),_transformation, newLoader, _boolEngine, _schemaManager, _isCoordinated, _expressIdCyl, _expressIdRect, _coordinationMatrix, _predefinedCylinder, _predefinedCube); + return newProcessor; + } + + IfcGeometryProcessor::IfcGeometryProcessor(const IfcGeometrySettings &settings,std::unordered_map expressIDToGeometry,const IfcGeometryLoader &geometryLoader,glm::dmat4 transformation, const parsing::IfcLoader &loader, booleanManager boolEngine, const schema::IfcSchemaManager &schemaManager, bool isCoordinated, uint32_t expressIdCyl, uint32_t expressIdRect, glm::dmat4 coordinationMatrix, IfcGeometry predefinedCylinder, IfcGeometry predefinedCube) + : _settings(settings), _expressIDToGeometry(expressIDToGeometry), _geometryLoader(geometryLoader), _transformation(transformation), _loader(loader), _boolEngine(boolEngine), _schemaManager(schemaManager), _isCoordinated(isCoordinated), _expressIdCyl(expressIdCyl), _expressIdRect(expressIdRect), _coordinationMatrix(coordinationMatrix), _predefinedCylinder(predefinedCylinder), _predefinedCube(predefinedCube) + {} + + } \ No newline at end of file diff --git a/src/cpp/web-ifc/geometry/IfcGeometryProcessor.h b/src/cpp/web-ifc/geometry/IfcGeometryProcessor.h index bc8faad5f..eee9a8e57 100644 --- a/src/cpp/web-ifc/geometry/IfcGeometryProcessor.h +++ b/src/cpp/web-ifc/geometry/IfcGeometryProcessor.h @@ -53,9 +53,12 @@ namespace webifc::geometry std::array GetFlatCoordinationMatrix() const; glm::dmat4 GetCoordinationMatrix() const; void Clear(); - IfcGeometrySettings _settings; - - protected: + IfcGeometryProcessor * Clone(const webifc::parsing::IfcLoader &loader) const; + + private: + IfcGeometryProcessor(const IfcGeometrySettings &settings,std::unordered_map expressIDToGeometry,const IfcGeometryLoader &geometryLoader,glm::dmat4 transformation, const parsing::IfcLoader &loader, booleanManager boolEngine, const schema::IfcSchemaManager &schemaManager, bool isCoordinated, uint32_t expressIdCyl, uint32_t expressIdRect, glm::dmat4 coordinationMatrix, IfcGeometry predefinedCylinder, IfcGeometry predefinedCube); + IfcGeometrySettings _settings; + std::optional GetStyleItemFromExpressId(uint32_t expressID); void AddFaceToGeometry(uint32_t expressID, IfcGeometry &geometry); IfcGeometry GetBrep(uint32_t expressID); @@ -65,16 +68,16 @@ namespace webifc::geometry const IfcGeometryLoader _geometryLoader; glm::dmat4 _transformation = glm::dmat4(1.0); const parsing::IfcLoader &_loader; - booleanManager boolEngine; + booleanManager _boolEngine; const schema::IfcSchemaManager &_schemaManager; bool _isCoordinated = false; - uint32_t expressIdCyl = 0; - uint32_t expressIdRect = 0; + uint32_t _expressIdCyl = 0; + uint32_t _expressIdRect = 0; glm::dmat4 _coordinationMatrix = glm::dmat4(1.0); void AddComposedMeshToFlatMesh(IfcFlatMesh &flatMesh, const IfcComposedMesh &composedMesh, const glm::dmat4 &parentMatrix = glm::dmat4(1), const glm::dvec4 &color = glm::dvec4(1, 1, 1, 1), bool hasColor = false); std::vector Read2DArrayOfThreeIndices(); void ReadIndexedPolygonalFace(uint32_t expressID, std::vector &bounds, const std::vector &points); - IfcGeometry predefinedCylinder; - IfcGeometry predefinedCube; + IfcGeometry _predefinedCylinder; + IfcGeometry _predefinedCube; }; } \ No newline at end of file diff --git a/src/cpp/web-ifc/geometry/operations/bim-geometry/boolean.cpp b/src/cpp/web-ifc/geometry/operations/bim-geometry/boolean.cpp new file mode 100644 index 000000000..0d3aca221 --- /dev/null +++ b/src/cpp/web-ifc/geometry/operations/bim-geometry/boolean.cpp @@ -0,0 +1,61 @@ +#include +#include +#include +#include "boolean.h" +#include "epsilons.h" +#include "geometry.h" +#include "utils.h" +#include "booleanUtils.h" + +using Vec = glm::dvec3; + +namespace bimGeometry { + + Buffers Boolean::GetBuffers() + { + Buffers buffers; + + Geometry geom = BoolProcess(geometry, seconds, op); + + for (int r = 0; r < geom.numFaces; r++) + { + bimGeometry::Face f = geom.GetFace(r); + buffers.AddTri(geom.GetPoint(f.i0), geom.GetPoint(f.i1), geom.GetPoint(f.i2)); + } + + return buffers; + } + + void Boolean::SetValues(std::vector triangles_, std::string op_) { + op = op_; + geometry = Geometry(); + for (size_t i = 0; i + 8 < triangles_.size(); i += 9) { + geometry.AddFace( + glm::dvec3(triangles_[i], triangles_[i + 1], triangles_[i + 2]), + glm::dvec3(triangles_[i + 3], triangles_[i + 4], triangles_[i + 5]), + glm::dvec3(triangles_[i + 6], triangles_[i + 7], triangles_[i + 8]) + ); + } + geometry.buildPlanes(); + } + + void Boolean::SetSecond(std::vector triangles_) { + Geometry newGeometry = Geometry(); + for (size_t i = 0; i + 8 < triangles_.size(); i += 9) { + newGeometry.AddFace( + glm::dvec3(triangles_[i], triangles_[i + 1], triangles_[i + 2]), + glm::dvec3(triangles_[i + 3], triangles_[i + 4], triangles_[i + 5]), + glm::dvec3(triangles_[i + 6], triangles_[i + 7], triangles_[i + 8]) + ); + } + newGeometry.buildPlanes(); + seconds.push_back(newGeometry); + } + + void Boolean::clear() + { + geometry = Geometry(); + seconds.clear(); + op = ""; + } +} diff --git a/src/cpp/web-ifc/geometry/operations/bim-geometry/boolean.h b/src/cpp/web-ifc/geometry/operations/bim-geometry/boolean.h new file mode 100644 index 000000000..27f212540 --- /dev/null +++ b/src/cpp/web-ifc/geometry/operations/bim-geometry/boolean.h @@ -0,0 +1,27 @@ +#include +#include +#include +#include "geometry.h" +#include "buffers.h" +#include + +using Vec = glm::dvec3; + +#pragma once + +namespace bimGeometry { + + struct Boolean + { + int type; + std::string op; + Geometry geometry; + std::vector seconds; + std::vector> triangles; + + Buffers GetBuffers(); + void clear(); + void SetValues(std::vector triangles_, std::string op_); + void SetSecond(std::vector triangles_); + }; +} \ No newline at end of file diff --git a/src/cpp/web-ifc/geometry/operations/bim-geometry/booleanUtils.h b/src/cpp/web-ifc/geometry/operations/bim-geometry/booleanUtils.h new file mode 100644 index 000000000..186e93dac --- /dev/null +++ b/src/cpp/web-ifc/geometry/operations/bim-geometry/booleanUtils.h @@ -0,0 +1,109 @@ +#include "../boolean-utils/fuzzy-bools.h" +#include "geometry.h" + +#pragma once + +namespace bimGeometry +{ + fuzzybools::Geometry convertToEngine(Geometry geom) + { + fuzzybools::Geometry newGeom; + newGeom.fvertexData = geom.fvertexData; + newGeom.vertexData = geom.vertexData; + newGeom.indexData = geom.indexData; + newGeom.planeData = geom.planeData; + newGeom.numPoints = geom.numPoints; + newGeom.numFaces = geom.numFaces; + for(auto plane: geom.planes) + { + fuzzybools::SimplePlane newPlane; + newPlane.distance = plane.distance; + newPlane.normal = plane.normal; + newGeom.planes.push_back(newPlane); + } + newGeom.hasPlanes = geom.hasPlanes; + return newGeom; + } + + Geometry convertToBim(fuzzybools::Geometry geom) + { + Geometry newGeom; + newGeom.fvertexData = geom.fvertexData; + newGeom.vertexData = geom.vertexData; + newGeom.indexData = geom.indexData; + newGeom.planeData = geom.planeData; + newGeom.numPoints = geom.numPoints; + newGeom.numFaces = geom.numFaces; + uint32_t id = 0; + for(auto plane: geom.planes) + { + Plane newPlane; + newPlane.id = id; + newPlane.distance = plane.distance; + newPlane.normal = plane.normal; + newGeom.planes.push_back(newPlane); + id++; + } + newGeom.hasPlanes = geom.hasPlanes; + return newGeom; + } + + Geometry Union(Geometry firstOperator, Geometry secondOperator) + { + fuzzybools::Geometry firstEngGeom = convertToEngine(firstOperator); + fuzzybools::Geometry secondEngGeom = convertToEngine(secondOperator); + return convertToBim(fuzzybools::Union(firstEngGeom, secondEngGeom)); + } + + Geometry Subtract(Geometry firstOperator, Geometry secondOperator) + { + fuzzybools::Geometry firstEngGeom = convertToEngine(firstOperator); + fuzzybools::Geometry secondEngGeom = convertToEngine(secondOperator); + return convertToBim(fuzzybools::Subtract(firstEngGeom, secondEngGeom)); + } + + Geometry BoolProcess(Geometry firstOperator, std::vector &secondGeoms, std::string op) + { + Geometry finalResult; + + for (auto &secondGeom : secondGeoms) + { + bool doit = true; + if (secondGeom.numFaces == 0) + { + + // bail out because we will get strange meshes + // if this happens, probably there's an issue parsing the mesh that occurred earlier + doit = false; + } + + if (firstOperator.numFaces == 0 && op != "UNION") + { + + // bail out because we will get strange meshes + // if this happens, probably there's an issue parsing the mesh that occurred earlier + break; + } + + if (doit) + { + Geometry secondOperator; + secondOperator = secondGeom; + firstOperator.buildPlanes(); + secondOperator.buildPlanes(); + + if (op == "DIFFERENCE") + { + firstOperator = Subtract(firstOperator, secondOperator); + } + else if (op == "UNION") + { + firstOperator = Union(firstOperator, secondOperator); + } + } + } + finalResult.AddGeometry(firstOperator); + + return finalResult; + } +} \ No newline at end of file diff --git a/src/cpp/web-ifc/geometry/operations/bim-geometry/circularSweep.cpp b/src/cpp/web-ifc/geometry/operations/bim-geometry/circularSweep.cpp new file mode 100644 index 000000000..83252bc6f --- /dev/null +++ b/src/cpp/web-ifc/geometry/operations/bim-geometry/circularSweep.cpp @@ -0,0 +1,44 @@ +#include +#include +#include +#include "circularSweep.h" +#include "epsilons.h" +#include "geometry.h" +#include "utils.h" + +using Vec = glm::dvec3; + +namespace bimGeometry { + + Buffers CircularSweep::GetBuffers() + { + Buffers buffers; + + // Canviar la funcio revolution + Geometry geom = SweepCircular(scaling, closed, profilePoints, radius, directrix, initialDirectrixNormal, rotate90); + + for (int r = 0; r < geom.numFaces; r++) + { + bimGeometry::Face f = geom.GetFace(r); + buffers.AddTri(geom.GetPoint(f.i0), geom.GetPoint(f.i1), geom.GetPoint(f.i2)); + } + + return buffers; + } + + void CircularSweep::SetValues(double scaling_, bool closed_, std::vector profilePoints_, double radius_, std::vector directrix_, std::vector initialDirectrixNormal_, bool rotate90_) { + profilePoints.clear(); + for (size_t i = 0; i + 2 < profilePoints_.size(); i += 3) { + profilePoints.emplace_back(profilePoints_[i], profilePoints_[i + 1], profilePoints_[i + 2]); + } + directrix.clear(); + for (size_t i = 0; i + 2 < directrix_.size(); i += 3) { + directrix.emplace_back(directrix_[i], directrix_[i + 1], directrix_[i + 2]); + } + initialDirectrixNormal = glm::dvec3(initialDirectrixNormal_[0], initialDirectrixNormal_[1], initialDirectrixNormal_[2]); + scaling = scaling_; + closed = closed_; + radius = radius_; + rotate90 = rotate90_; + } +} diff --git a/src/cpp/web-ifc/geometry/operations/bim-geometry/circularSweep.h b/src/cpp/web-ifc/geometry/operations/bim-geometry/circularSweep.h new file mode 100644 index 000000000..0fd236359 --- /dev/null +++ b/src/cpp/web-ifc/geometry/operations/bim-geometry/circularSweep.h @@ -0,0 +1,26 @@ +#include +#include +#include +#include "buffers.h" + +using Vec = glm::dvec3; + +#pragma once + +namespace bimGeometry { + + struct CircularSweep + { + double scaling; + bool closed; + std::vector profilePoints; + double radius; + std::vector directrix; + glm::dvec3 initialDirectrixNormal; + bool rotate90; + + + void SetValues(double scaling_, bool closed_, std::vector profilePoints_, double radius_, std::vector directrix_, std::vector initialDirectrixNormal_, bool rotate90_); + Buffers GetBuffers(); + }; +} \ No newline at end of file diff --git a/src/cpp/web-ifc/geometry/operations/bim-geometry/epsilons.h b/src/cpp/web-ifc/geometry/operations/bim-geometry/epsilons.h index 7a854392b..c05118c19 100644 --- a/src/cpp/web-ifc/geometry/operations/bim-geometry/epsilons.h +++ b/src/cpp/web-ifc/geometry/operations/bim-geometry/epsilons.h @@ -2,7 +2,7 @@ namespace bimGeometry { - constexpr double EPS_TINY_CURVE = 1e-9; + constexpr double EPS_TINY_CURVE = 1e-9; constexpr double EPS_NONZERO = 1.0E-20; constexpr double EPS_MINISCULE = 1.0E-12; constexpr double EPS_TINY = 1.0E-04; @@ -15,5 +15,6 @@ namespace bimGeometry Constants used in function AddFace in geometry.h */ constexpr double toleranceAddFace = 1.0E-10; - + constexpr double toleranceVectorEquality = 1.0E-04; + constexpr double toleranceScalarEquality = 1.0E-04; } \ No newline at end of file diff --git a/src/cpp/web-ifc/geometry/operations/bim-geometry/extrusion.cpp b/src/cpp/web-ifc/geometry/operations/bim-geometry/extrusion.cpp index ca2cb3f26..eb25428ef 100644 --- a/src/cpp/web-ifc/geometry/operations/bim-geometry/extrusion.cpp +++ b/src/cpp/web-ifc/geometry/operations/bim-geometry/extrusion.cpp @@ -14,7 +14,28 @@ namespace bimGeometry { { Buffers buffers; - Geometry geom = Extrude(profile, dir, len); + Geometry geom; + if(!cap) + { + geom = Extrude(profile, dir, len); + } + else + { + uint32_t profileNumber = 1 + holes.size(); + std::vector> profiles(profileNumber); + + for (size_t i = 0; i < profile.size(); i++) { + profiles[0].emplace_back(profile[i].x, profile[i].y, profile[i].z); + } + + for (size_t i = 0; i < holes.size(); i++) { + for (size_t j = 0; j < holes[i].size(); j++) { + profiles[i + 1].emplace_back(holes[i][j].x, holes[i][j].y, holes[i][j].z); + } + } + + geom = Extrude(profiles, dir, len, cuttingPlaneNormal, cuttingPlanePos); + } for (int r = 0; r < geom.numFaces; r++) { @@ -25,7 +46,7 @@ namespace bimGeometry { return buffers; } - void Extrusion::SetValues(std::vector profile_, std::vector dir_, double len_) { + void Extrusion::SetValues(std::vector profile_, std::vector dir_, double len_, std::vector cuttingPlaneNormal_, std::vector cuttingPlanePos_, bool cap_) { profile.clear(); for (size_t i = 0; i + 2 < profile_.size(); i += 3) { profile.emplace_back(profile_[i], profile_[i + 1], profile_[i + 2]); @@ -34,5 +55,20 @@ namespace bimGeometry { dir = glm::dvec3(dir_[0], dir_[1], dir_[2]); } len = len_; + cap = cap_; + cuttingPlanePos = glm::dvec3(cuttingPlanePos_[0], cuttingPlanePos_[1], cuttingPlanePos_[2]); + cuttingPlaneNormal = glm::dvec3(cuttingPlaneNormal_[0], cuttingPlaneNormal_[1], cuttingPlaneNormal_[2]); + } + + void Extrusion::SetHoles(std::vector hole_) { + std::vector hole; + for (size_t i = 0; i + 2 < hole_.size(); i += 3) { + hole.emplace_back(hole_[i], hole_[i + 1], hole_[i + 2]); + } + holes.push_back(hole); + } + + void Extrusion::ClearHoles() { + holes.clear(); } } diff --git a/src/cpp/web-ifc/geometry/operations/bim-geometry/extrusion.h b/src/cpp/web-ifc/geometry/operations/bim-geometry/extrusion.h index 16e8cba00..e1bfb8faf 100644 --- a/src/cpp/web-ifc/geometry/operations/bim-geometry/extrusion.h +++ b/src/cpp/web-ifc/geometry/operations/bim-geometry/extrusion.h @@ -11,11 +11,17 @@ namespace bimGeometry { struct Extrusion { + bool cap; double len; - glm::dvec3 dir; + glm::dvec3 dir; + glm::dvec3 cuttingPlanePos; + glm::dvec3 cuttingPlaneNormal; std::vector profile; + std::vector> holes; - void SetValues(std::vector profile_, std::vector dir_, double len_); + void SetValues(std::vector profile_, std::vector dir_, double len_, std::vector cuttingPlaneNormal_, std::vector cuttingPlanePos_, bool cap_); + void SetHoles(std::vector hole_); + void ClearHoles(); Buffers GetBuffers(); }; } \ No newline at end of file diff --git a/src/cpp/web-ifc/geometry/operations/bim-geometry/face.h b/src/cpp/web-ifc/geometry/operations/bim-geometry/face.h index c889c240f..be35fa692 100644 --- a/src/cpp/web-ifc/geometry/operations/bim-geometry/face.h +++ b/src/cpp/web-ifc/geometry/operations/bim-geometry/face.h @@ -11,5 +11,6 @@ namespace bimGeometry { int i0; int i1; int i2; + int pId; }; } \ No newline at end of file diff --git a/src/cpp/web-ifc/geometry/operations/bim-geometry/geometry.cpp b/src/cpp/web-ifc/geometry/operations/bim-geometry/geometry.cpp index 00d6cc6f3..2a300dff2 100644 --- a/src/cpp/web-ifc/geometry/operations/bim-geometry/geometry.cpp +++ b/src/cpp/web-ifc/geometry/operations/bim-geometry/geometry.cpp @@ -6,6 +6,7 @@ #include "utils.h" #include "face.h" +#pragma once namespace bimGeometry { void Geometry::AddPoint(glm::dvec4& pt, glm::dvec3& n) @@ -63,6 +64,7 @@ namespace bimGeometry f.i0 = indexData[index * 3 + 0]; f.i1 = indexData[index * 3 + 1]; f.i2 = indexData[index * 3 + 2]; + f.pId = planeData[index]; return f; } @@ -81,10 +83,10 @@ namespace bimGeometry AddPoint(b, normal); AddPoint(c, normal); - AddFace(numPoints - 3, numPoints - 2, numPoints - 1); + AddFace(numPoints - 3, numPoints - 2, numPoints - 1, -1); } - void Geometry::AddFace(uint32_t a, uint32_t b, uint32_t c) + void Geometry::AddFace(uint32_t a, uint32_t b, uint32_t c, uint32_t pId) { indexData.push_back(a); indexData.push_back(b); @@ -93,5 +95,113 @@ namespace bimGeometry double area = areaOfTriangle(GetPoint(a), GetPoint(b), GetPoint(c)); numFaces++; + + planeData.push_back(pId); + } + + size_t Geometry::AddPlane(const glm::dvec3 &normal, double d) + { + for (auto &plane : planes) + { + if (plane.IsEqualTo(normal, d)) + { + return plane.id; + } + } + + Plane p; + p.id = planes.size(); + p.normal = glm::normalize(normal); + p.distance = d; + + planes.push_back(p); + + return p.id; + } + + void Geometry::buildPlanes() + { + if(!hasPlanes) + { + planes.clear(); + planeData.clear(); + + for (size_t i = 0; i < numFaces; i++) + { + planeData.push_back(-1); + } + + Vec centroid = Vec(0,0,0); + + for (size_t i = 0; i < numFaces; i++) + { + Face f = GetFace(i); + + auto a = GetPoint(f.i0); + auto b = GetPoint(f.i1); + auto c = GetPoint(f.i2); + + centroid = centroid + (a + b + c) / 3.0; + } + + for (size_t i = 0; i < numFaces; i++) + { + Face f = GetFace(i); + + auto a = GetPoint(f.i0); + auto b = GetPoint(f.i1); + auto c = GetPoint(f.i2); + + glm::dvec3 norm; + + if (computeSafeNormal(a, b, c, norm, EPS_SMALL)) + { + double da = glm::dot(norm, a - centroid); + + size_t id = AddPlane(norm, da); + planeData[i] = id; + hasPlanes = true; + } + } + + for (size_t i = 0; i < numFaces; i++) + { + Face f = GetFace(i); + + if(f.pId > -1) + { + auto a = GetPoint(f.i0); + auto b = GetPoint(f.i1); + auto c = GetPoint(f.i2); + + double da = glm::dot(planes[f.pId].normal, a); + + planes[f.pId].distance = da; + } + } + } + // TODO: Remove unused planes } + + void Geometry::AddGeometry(Geometry geom) + { + for (uint32_t i = 0; i < geom.numFaces; i++) + { + Face f = geom.GetFace(i); + glm::dvec3 a = geom.GetPoint(f.i0); + glm::dvec3 b = geom.GetPoint(f.i1); + glm::dvec3 c = geom.GetPoint(f.i2); + AddFace(a, b, c); + } + uint32_t planeDataOffset = geom.planes.size(); + for (uint32_t i = 0; i < geom.planeData.size(); i++) + { + planeData.push_back(planeDataOffset + geom.planeData[i]); + } + + for (uint32_t i = 0; i < geom.planes.size(); i++) + { + planes.push_back(geom.planes[i]); + } + } } \ No newline at end of file diff --git a/src/cpp/web-ifc/geometry/operations/bim-geometry/geometry.h b/src/cpp/web-ifc/geometry/operations/bim-geometry/geometry.h index f2f20e8b8..13738909e 100644 --- a/src/cpp/web-ifc/geometry/operations/bim-geometry/geometry.h +++ b/src/cpp/web-ifc/geometry/operations/bim-geometry/geometry.h @@ -3,6 +3,7 @@ #include #include "aabb.h" #include "face.h" +#include "plane.h" #pragma once @@ -10,18 +11,24 @@ namespace bimGeometry { struct Geometry { + bool hasPlanes = false; + uint32_t numPoints = 0; + uint32_t numFaces = 0; std::vector fvertexData; std::vector vertexData; std::vector indexData; - uint32_t numPoints = 0; - uint32_t numFaces = 0; + std::vector planeData; + std::vector planes; AABB GetAABB() const; Vec GetPoint(size_t index) const; Face GetFace(size_t index) const; + void buildPlanes(); + size_t AddPlane(const glm::dvec3 &normal, double d); void AddFace(glm::dvec3 a, glm::dvec3 b, glm::dvec3 c); - void AddFace(uint32_t a, uint32_t b, uint32_t c); + void AddFace(uint32_t a, uint32_t b, uint32_t c, uint32_t pId); void AddPoint(glm::dvec4& pt, glm::dvec3& n); void AddPoint(glm::dvec3& pt, glm::dvec3& n); + void AddGeometry(Geometry geom); }; } \ No newline at end of file diff --git a/src/cpp/web-ifc/geometry/operations/bim-geometry/plane.cpp b/src/cpp/web-ifc/geometry/operations/bim-geometry/plane.cpp new file mode 100644 index 000000000..f1771ee57 --- /dev/null +++ b/src/cpp/web-ifc/geometry/operations/bim-geometry/plane.cpp @@ -0,0 +1,17 @@ +#include +#include +#include +#include "geometry.h" +#include "epsilons.h" +#include "utils.h" +#include "plane.h" + +#pragma once + +namespace bimGeometry +{ + bool Plane::IsEqualTo(const Vec &n, double d) + { + return (equals(normal, n, toleranceVectorEquality) && equals(distance, d, toleranceScalarEquality)); + } +} \ No newline at end of file diff --git a/src/cpp/web-ifc/geometry/operations/bim-geometry/plane.h b/src/cpp/web-ifc/geometry/operations/bim-geometry/plane.h new file mode 100644 index 000000000..b98e25de9 --- /dev/null +++ b/src/cpp/web-ifc/geometry/operations/bim-geometry/plane.h @@ -0,0 +1,13 @@ +#pragma once + +namespace bimGeometry +{ + struct Plane + { + double distance; + Vec normal; + size_t id; + + bool IsEqualTo(const Vec &n, double d); + }; +} \ No newline at end of file diff --git a/src/cpp/web-ifc/geometry/operations/bim-geometry/profile.cpp b/src/cpp/web-ifc/geometry/operations/bim-geometry/profile.cpp new file mode 100644 index 000000000..920832d4c --- /dev/null +++ b/src/cpp/web-ifc/geometry/operations/bim-geometry/profile.cpp @@ -0,0 +1,64 @@ +#include +#include +#include +#include "profile.h" +#include "utils.h" +#include "epsilons.h" + +namespace bimGeometry +{ + void Profile::SetValues(uint16_t _pType, double _width, double _depth, double _webThickness, double _flangeThickness, bool _hasFillet, double _filletRadius, double _radius, double _slope, std::vector _placement) { + pType = _pType; + width = _width; + depth = _depth; + thickness = _webThickness; + flangeThickness = _flangeThickness; + hasFillet = _hasFillet; + filletRadius = _filletRadius; + radius = _radius; + slope = _slope; + placement = _placement; + } + + Buffers Profile::GetBuffers() + { + Buffers buffers; + glm::dmat4 _placement = glm::dmat4(glm::dvec4(placement[0],placement[1],placement[2], 1), + glm::dvec4(placement[3],placement[4],placement[5], 1), + glm::dvec4(placement[6],placement[7],placement[8], 1), + glm::dvec4(placement[9],placement[10],placement[11], 1)); + + if(pType == 0) + { + profile = bimGeometry::GetIShapedCurve(width, depth, thickness, flangeThickness, hasFillet, filletRadius, _placement); + } + if(pType == 1) + { + profile = bimGeometry::GetCShapedCurve(width, depth, thickness, flangeThickness, hasFillet, filletRadius, _placement); + } + if(pType == 2) + { + profile = bimGeometry::GetZShapedCurve(width, depth, thickness, flangeThickness, hasFillet, filletRadius, _placement); + } + if(pType == 3) + { + profile = bimGeometry::GetTShapedCurve(width, depth, thickness, hasFillet, filletRadius, radius, slope, _placement); + } + if(pType == 4) + { + profile = bimGeometry::GetLShapedCurve(width, depth, thickness, hasFillet, filletRadius, radius, slope, _placement); + } + if(pType == 5) + { + profile = bimGeometry::GetUShapedCurve(width, depth, thickness, flangeThickness, filletRadius, radius, slope, _placement); + } + + + for (int r = 0; r < profile.points.size(); r++) + { + buffers.AddPoint( profile.points[r]); + } + + return buffers; + } +} \ No newline at end of file diff --git a/src/cpp/web-ifc/geometry/operations/bim-geometry/profile.h b/src/cpp/web-ifc/geometry/operations/bim-geometry/profile.h new file mode 100644 index 000000000..833ebfcb0 --- /dev/null +++ b/src/cpp/web-ifc/geometry/operations/bim-geometry/profile.h @@ -0,0 +1,27 @@ +#include +#include +#include +#include "curve.h" +#include "buffers.h" + +#pragma once + +namespace bimGeometry { + struct Profile + { + uint16_t pType; + double width; + double depth; + double thickness; + double flangeThickness; + bool hasFillet; + double filletRadius; + double radius; + double slope; + std::vector placement; + Curve profile; + + void SetValues(uint16_t _pType, double _width, double _depth, double _webThickness, double _flangeThickness, bool _hasFillet, double _filletRadius, double _radius, double _slope, std::vector _placement); + Buffers GetBuffers(); + }; +} \ No newline at end of file diff --git a/src/cpp/web-ifc/geometry/operations/bim-geometry/utils.h b/src/cpp/web-ifc/geometry/operations/bim-geometry/utils.h index c56f7307b..d536a6434 100644 --- a/src/cpp/web-ifc/geometry/operations/bim-geometry/utils.h +++ b/src/cpp/web-ifc/geometry/operations/bim-geometry/utils.h @@ -1,9 +1,11 @@ +#include #include #include #include #include "geometry.h" #include "epsilons.h" #include "curve.h" +#include #pragma once @@ -18,11 +20,16 @@ namespace bimGeometry return point1.x * point2.y - point1.y * point2.x; } - inline bool equals(glm::dvec3 A, glm::dvec3 B, double eps = 0) + inline bool equals(glm::dvec3 A, glm::dvec3 B, double eps = 0) { return std::fabs(A.x - B.x) <= eps && std::fabs(A.y - B.y) <= eps && std::fabs(A.z - B.z) <= eps; } + inline bool equals(double A, double B, double eps = 0) + { + return std::fabs(A - B) <= eps; + } + inline double areaOfTriangle(glm::dvec3 a, glm::dvec3 b, glm::dvec3 c) { glm::dvec3 ab = b - a; @@ -92,6 +99,15 @@ namespace bimGeometry return (angle / (2 * CONST_PI)) * 360; } + inline bool GetWindingOfTriangle(const glm::dvec3 &a, const glm::dvec3 &b, const glm::dvec3 &c) + { + glm::dvec3 v12(b - a); + glm::dvec3 v13(c - a); + + glm::dvec3 norm = glm::normalize(glm::cross(v12, v13)); + return glm::dot(norm, glm::dvec3(0, 0, 1)) > 0.0; + } + inline Geometry Revolution(glm::dmat4 transform, double startDegrees, double endDegrees, std::vector Profile, double numRots) { Geometry geometry; @@ -509,30 +525,229 @@ namespace bimGeometry double npx = points[j].x + dir.x * len; double npy = points[j].y + dir.y * len; - double npz = dir.z * len; + double npz = points[j].z + dir.z * len; glm::dvec3 nptj1 = glm::dvec3( npx, npy, npz); npx = points[j2].x + dir.x * len; npy = points[j2].y + dir.y * len; - npz = dir.z * len; + npz = points[j2].z + dir.z * len; glm::dvec3 nptj2 = glm::dvec3( npx, npy, npz); geom.AddFace( - glm::dvec3(points[j].x, points[j].y, 0), - glm::dvec3(points[j2].x, points[j2].y, 0), + glm::dvec3(points[j].x, points[j].y, points[j].z), + glm::dvec3(points[j2].x, points[j2].y, points[j2].z), nptj1); geom.AddFace( - glm::dvec3(points[j2].x, points[j2].y, 0), + glm::dvec3(points[j2].x, points[j2].y, points[j2].z), nptj2, nptj1); } return geom; } + enum class Projection { XY, XZ, YZ }; + using Point = std::array; + + // Projecta el polígon a 2D segons la millor vista + inline Projection bestProjection(const std::vector& poly) { + auto area2D = [](const std::vector& p, int i1, int i2) { + double area = 0.0; + for (size_t i = 0; i < p.size(); ++i) { + const auto& a = p[i]; + const auto& b = p[(i + 1) % p.size()]; + area += (a[i1] * b[i2]) - (b[i1] * a[i2]); + } + return std::abs(area * 0.5); + }; + + double areaXY = area2D(poly, 0, 1); // x, y + double areaXZ = area2D(poly, 0, 2); // x, z + double areaYZ = area2D(poly, 1, 2); // y, z + + if (areaXY >= areaXZ && areaXY >= areaYZ) return Projection::XY; + if (areaXZ >= areaYZ) return Projection::XZ; + return Projection::YZ; + } + + // Funció per projectar punts 3D a 2D segons la projecció triada + inline std::vector> projectTo2D( + const std::vector>& poly3D, + Projection proj) { + + std::vector> poly2D(poly3D.size()); + + for (size_t i = 0; i < poly3D.size(); ++i) { + for (const auto& pt : poly3D[i]) { + switch (proj) { + case Projection::XY: + poly2D[i].push_back({pt[0], pt[1], pt[2]}); + break; + case Projection::XZ: + poly2D[i].push_back({pt[0], pt[2], pt[1]}); + break; + case Projection::YZ: + poly2D[i].push_back({pt[1], pt[2], pt[0]}); + break; + } + } + } + + return poly2D; + } + + inline bimGeometry::Geometry Extrude(std::vector> profile, glm::dvec3 dir, double distance, glm::dvec3 cuttingPlaneNormal = glm::dvec3(0), glm::dvec3 cuttingPlanePos = glm::dvec3(0)) + { + bimGeometry::Geometry geom; + std::vector holesIndicesHash; + + // check if first point is equal to last point, otherwise the outer loop of the shape is not closed + glm::dvec3 lastToFirstPoint = profile[0].front() - profile[0].back(); + if (glm::length(lastToFirstPoint) > 1e-8) { + profile[0].push_back(profile[0].front()); + } + + // build the caps + { + int polygonCount = profile.size(); // Main profile + holes + std::vector> polygon(polygonCount); + + glm::dvec3 normal = dir; + + for (size_t i = 0; i < profile[0].size(); i++) + { + glm::dvec3 pt = profile[0][i]; + glm::dvec4 et = glm::dvec4(glm::dvec3(pt) + dir * distance, 1); + + geom.AddPoint(et, normal); + polygon[0].push_back(Point{pt.x, pt.y, pt.z}); + } + + for (size_t i = 0; i < profile[0].size(); i++) + { + holesIndicesHash.push_back(false); + } + + for (size_t i = 1; i < profile.size(); i++) + { + std::vector hole = profile[i]; + int pointCount = hole.size(); + + for (int j = 0; j < pointCount; j++) + { + holesIndicesHash.push_back(j == 0); + + glm::dvec3 pt = hole[j]; + glm::dvec4 et = glm::dvec4(pt + dir * distance, 1); + + profile[0].push_back(pt); + geom.AddPoint(et, normal); + polygon[i].push_back({pt.x, pt.y, pt.z}); // Index 0 is main profile; see earcut reference + } + } + + Projection proj = bestProjection(polygon[0]); + auto polygon2D = projectTo2D(polygon, proj); + std::vector indices = mapbox::earcut(polygon2D); + + uint32_t offset = 0; + bool winding = true; + bool flipWinding = false; + + if (indices.size() >= 3) + { + bool winding = GetWindingOfTriangle(geom.GetPoint(offset + indices[0]), geom.GetPoint(offset + indices[1]), geom.GetPoint(offset + indices[2])); + bool flipWinding = !winding; + + for (size_t i = 0; i < indices.size(); i += 3) + { + if (flipWinding) + { + geom.AddFace(offset + indices[i + 0], offset + indices[i + 2], offset + indices[i + 1], -1); + } + else + { + geom.AddFace(offset + indices[i + 0], offset + indices[i + 1], offset + indices[i + 2], -1); + } + } + } + + offset += geom.numPoints; + + normal = -dir; + + for (size_t i = 0; i < profile[0].size(); i++) + { + glm::dvec3 pt = profile[0][i]; + glm::dvec4 et = glm::dvec4(glm::dvec3(pt), 1); + + if (cuttingPlaneNormal != glm::dvec3(0)) + { + et = glm::dvec4(glm::dvec3(pt), 1); + glm::dvec3 transDir = glm::dvec4(dir, 0); + + // project {et} onto the plane, following the extrusion normal + double ldotn = glm::dot(transDir, cuttingPlaneNormal); + if (ldotn == 0) + { + + } + else + { + glm::dvec3 dpos = cuttingPlanePos - glm::dvec3(et); + double dist = glm::dot(dpos, cuttingPlaneNormal) / ldotn; + // we want to apply dist, even when negative + et = et + glm::dvec4(dist * transDir, 1); + } + } + + geom.AddPoint(et, normal); + } + + for (size_t i = 0; i < indices.size(); i += 3) + { + if (flipWinding) + { + geom.AddFace(offset + indices[i + 0], offset + indices[i + 1], offset + indices[i + 2], -1); + } + else + { + geom.AddFace(offset + indices[i + 0], offset + indices[i + 2], offset + indices[i + 1], -1); + } + } + } + + uint32_t capSize = profile[0].size(); + for (size_t i = 1; i < capSize; i++) + { + // https://github.com/tomvandig/web-ifc/issues/5 + if (holesIndicesHash[i]) + { + continue; + } + + uint32_t bl = i - 1; + uint32_t br = i - 0; + + uint32_t tl = capSize + i - 1; + uint32_t tr = capSize + i - 0; + + // this winding should be correct + geom.AddFace(geom.GetPoint(tl), + geom.GetPoint(br), + geom.GetPoint(bl)); + + geom.AddFace(geom.GetPoint(tl), + geom.GetPoint(tr), + geom.GetPoint(br)); + } + + return geom; + } + inline glm::dvec3 projectOntoPlane(const glm::dvec3 &origin, const glm::dvec3 &normal, const glm::dvec3 &point, const glm::dvec3 &dir) { // project {et} onto the plane, following the extrusion normal @@ -549,15 +764,6 @@ namespace bimGeometry } } - inline bool GetWindingOfTriangle(const glm::dvec3 &a, const glm::dvec3 &b, const glm::dvec3 &c) - { - glm::dvec3 v12(b - a); - glm::dvec3 v13(c - a); - - glm::dvec3 norm = glm::normalize(glm::cross(v12, v13)); - return glm::dot(norm, glm::dvec3(0, 0, 1)) > 0.0; - } - //! This implementation generates much more vertices than needed, and does not have smoothed normals // TODO: Review rotate90 value, as it should be inferred from IFC but the source data had not been identified yet // An arbitrary value has been added in IFCSURFACECURVESWEPTAREASOLID but this is a bad solution @@ -757,4 +963,585 @@ namespace bimGeometry return geom; } + + inline Geometry SweepCircular(const double scaling, const bool closed, const std::vector &profile, const double radius, const std::vector &directrix, const glm::dvec3 &initialDirectrixNormal = glm::dvec3(0), const bool rotate90 = false) + { + Geometry geom; + + std::vector> dpts; + + // Remove repeated points + for (size_t i = 0; i < directrix.size(); i++) + { + if (i < directrix.size() - 1) + { + if (glm::distance(directrix[i], directrix[i + 1]) > EPS_BIG2 * scaling) + { + dpts.push_back(directrix[i]); + } + } + else + { + dpts.push_back(directrix[i]); + } + } + + if (closed) + { + glm::vec<3, glm::f64> dirStart = dpts[dpts.size() - 2] - dpts[dpts.size() - 1]; + glm::vec<3, glm::f64> dirEnd = dpts[1] - dpts[0]; + std::vector> newDpts; + newDpts.push_back(dpts[0] + dirStart); + for (size_t i = 0; i < dpts.size(); i++) + { + newDpts.push_back(dpts[i]); + } + newDpts.push_back(dpts[dpts.size() - 1] + dirEnd); + dpts = newDpts; + } + + if (dpts.size() <= 1) + { + // nothing to sweep + return geom; + } + + // compute curve for each part of the directrix + std::vector> curves; + std::vector transforms; + + for (size_t i = 0; i < dpts.size(); i++) + { + std::vector segmentForCurve; + + glm::dvec3 directrix2; + glm::dvec3 planeNormal; + glm::dvec3 directrixSegmentNormal; + glm::dvec3 planeOrigin; + + if (i == 0) // start + { + planeNormal = glm::normalize(dpts[1] - dpts[0]); + directrixSegmentNormal = planeNormal; + planeOrigin = dpts[0]; + directrix2 = planeNormal; + } + else if (i == dpts.size() - 1) // end + { + planeNormal = glm::normalize(dpts[i] - dpts[i - 1]); + directrixSegmentNormal = planeNormal; + planeOrigin = dpts[i]; + directrix2 = planeNormal; + } + else // middle + { + // possibly the directrix is bad + glm::dvec3 n1 = glm::normalize(dpts[i] - dpts[i - 1]); + glm::dvec3 n2 = glm::normalize(dpts[i + 1] - dpts[i]); + glm::dvec3 p = glm::normalize(glm::cross(n1, n2)); + directrix2 = -n1; + + // double prod = glm::dot(n1, n2); + + if (std::isnan(p.x)) + { + // TODO: sometimes outliers cause the perp to become NaN! + // this is bad news, as it nans the points added to the final mesh + // also, it's hard to bail out now :/ + // see curve.add() for more info on how this is currently "solved" + } + + glm::dvec3 u1 = glm::normalize(glm::cross(n1, p)); + glm::dvec3 u2 = glm::normalize(glm::cross(n2, p)); + + // TODO: When n1 and n2 have similar direction but opposite side... + // ... projection tend to infinity. -> glm::dot(n1, n2) + // I implemented a bad solution to prevent projection to infinity + if (glm::dot(n1, n2) < -0.9) + { + n2 = -n2; + u2 = -u2; + } + + glm::dvec3 au = glm::normalize(u1 + u2); + planeNormal = glm::normalize(glm::cross(au, p)); + directrixSegmentNormal = n1; // n1 or n2 doesn't matter + + planeOrigin = dpts[i]; + } + + glm::dvec3 dz = glm::normalize(directrix2); + glm::dvec3 dx = glm::dvec3(1, 0, 0); + glm::dvec3 dy = glm::dvec3(0, 1, 0); + + double parallelZ = glm::abs(glm::dot(dz, glm::dvec3(0, 0, 1))); + + if(parallelZ > 1 - EPS_BIG2) + { + dx = glm::normalize(glm::cross(dz, glm::dvec3(0, 1, 0))); + } else { + dx = glm::normalize(glm::cross(dz, glm::dvec3(0, 0, 1))); + } + + dy = glm::normalize(glm::cross(dz, dx)); + + glm::dmat4 profileScale = glm::dmat4( + glm::dvec4(dx * radius, 0), + glm::dvec4(dy * radius, 0), + glm::dvec4(dz, 0), + glm::dvec4(planeOrigin, 1)); + + transforms.push_back(profileScale); + + if (curves.empty()) + { + // construct initial curve + glm::dvec3 left; + glm::dvec3 right; + if (initialDirectrixNormal == glm::dvec3(0)) + { + left = glm::cross(directrixSegmentNormal, glm::dvec3(directrixSegmentNormal.y, directrixSegmentNormal.x, directrixSegmentNormal.z)); + if (left == glm::dvec3(0, 0, 0)) + { + left = glm::cross(directrixSegmentNormal, glm::dvec3(directrixSegmentNormal.x, directrixSegmentNormal.z, directrixSegmentNormal.y)); + } + if (left == glm::dvec3(0, 0, 0)) + { + left = glm::cross(directrixSegmentNormal, glm::dvec3(directrixSegmentNormal.z, directrixSegmentNormal.y, directrixSegmentNormal.x)); + } + right = glm::normalize(glm::cross(directrixSegmentNormal, left)); + left = glm::normalize(glm::cross(directrixSegmentNormal, right)); + } + else + { + left = glm::cross(directrixSegmentNormal, initialDirectrixNormal); + glm::dvec3 side = glm::normalize(initialDirectrixNormal); + right = glm::normalize(glm::cross(directrixSegmentNormal, left)); + left = glm::normalize(glm::cross(directrixSegmentNormal, right)); + right *= side; + } + + if (left == glm::dvec3(0, 0, 0)) + { + } + + // project profile onto planeNormal, place on planeOrigin + // TODO: look at holes + auto &ppts = profile; + for (auto &pt2D : ppts) + { + glm::dvec3 pt = -pt2D.x * left + -pt2D.y * right + planeOrigin; + if(rotate90) + { + pt = -pt2D.x * right - pt2D.y * left + planeOrigin; + } + glm::dvec3 proj = bimGeometry::projectOntoPlane(planeOrigin, planeNormal, pt, directrixSegmentNormal); + + segmentForCurve.push_back(proj); + } + } + else + { + // project previous curve onto the normal + const std::vector &prevCurve = curves.back(); + + auto &ppts = prevCurve; + for (auto &pt : ppts) + { + glm::dvec3 proj = bimGeometry::projectOntoPlane(planeOrigin, planeNormal, pt, directrixSegmentNormal); + + segmentForCurve.push_back(proj); + } + } + + if (!closed || (i != 0 && i != dpts.size() - 1)) + { + curves.push_back(segmentForCurve); + } + } + + if (closed) + { + dpts.pop_back(); + dpts.erase(dpts.begin()); + } + + // connect the curves + for (size_t i = 1; i < dpts.size(); i++) + { + glm::dvec3 p1 = dpts[i - 1]; + glm::dvec3 p2 = dpts[i]; + glm::dvec3 dir = p1 - p2; + glm::dvec4 ddir = glm::dvec4(dir, 0); + const double di = glm::distance(p1, p2); + + //Only segments smaller than 10 cm will be represented, those that are bigger will be standardized + + const auto &c1 = curves[i - 1]; + const auto &c2 = curves[i]; + + uint32_t capSize = c1.size(); + for (size_t j = 1; j < capSize; j++) + { + glm::dvec3 bl = c1[j - 1]; + glm::dvec3 br = c1[j - 0]; + glm::dvec3 tl = c2[j - 1]; + glm::dvec3 tr = c2[j - 0]; + + geom.AddFace(tl, br, bl); + geom.AddFace(tl, tr, br); + } + } + + return geom; + } + + inline Geometry SectionedSurface(std::vector> profiles) + { + Geometry geom; + + // Iterate over each profile, and create a surface by connecting the corresponding points with faces. + for (size_t i = 0; i < profiles.size() - 1; i++) + { + std::vector &profile1 = profiles[i]; + std::vector &profile2 = profiles[i + 1]; + + // Check that the profiles have the same number of points + if (profile1.size() != profile2.size()) + { + } + + std::vector indices; + + // Create faces by connecting corresponding points from the two profiles + for (size_t j = 0; j < profile1.size(); j++) + { + glm::dvec3 &p1 = profile1[j]; + int j2 = 0; + if (profile1.size() > 1) + { + double pr = (double)j / (double)(profile1.size() - 1); + j2 = pr * (profile2.size() - 1); + } + glm::dvec3 &p2 = profile2[j2]; + + glm::dvec3 normal = glm::dvec3(0.0, 0.0, 1.0); + + if (glm::distance(p1, p2) > 1E-5) + { + normal = glm::normalize(glm::cross(p2 - p1, glm::cross(p2 - p1, glm::dvec3(0.0, 0.0, 1.0)))); + } + + geom.AddPoint(p1, normal); + geom.AddPoint(p2, normal); + + indices.push_back(geom.numPoints - 2); + indices.push_back(geom.numPoints - 1); + } + + // Create the faces + if (indices.size() > 0) + { + for (size_t j = 0; j < indices.size() - 2; j += 4) + { + geom.AddFace(indices[j], indices[j + 1], indices[j + 2], -1); + geom.AddFace(indices[j + 2], indices[j + 1], indices[j + 3], -1); + } + } + } + + return geom; + } + + /// + + inline Curve GetRectangleCurve(double xdim, double ydim, glm::dmat3 placement = glm::dmat3(1)) + { + double halfX = xdim / 2; + double halfY = ydim / 2; + + glm::dvec2 bl = placement * glm::dvec3(-halfX, -halfY, 1); + glm::dvec2 br = placement * glm::dvec3(halfX, -halfY, 1); + + glm::dvec2 tl = placement * glm::dvec3(-halfX, halfY, 1); + glm::dvec2 tr = placement * glm::dvec3(halfX, halfY, 1); + + Curve c; + c.Add(bl); + c.Add(br); + c.Add(tr); + c.Add(tl); + c.Add(bl); + + if (MatrixFlipsTriangles(placement)) + { + c.Invert(); + } + + return c; + } + + inline Curve GetIShapedCurve(double width, double depth, double webThickness, double flangeThickness, bool hasFillet, double filletRadius, glm::dmat3 placement = glm::dmat3(1)) + { + Curve c; + + double hw = width / 2; + double hd = depth / 2; + double hweb = webThickness / 2; + + c.points.push_back(placement * glm::dvec3(-hw, +hd, 1)); // TL + c.points.push_back(placement * glm::dvec3(+hw, +hd, 1)); // TR + c.points.push_back(placement * glm::dvec3(+hw, +hd - flangeThickness, 1)); // TR knee + + if (hasFillet) + { + // TODO: interpolate + c.points.push_back(placement * glm::dvec3(+hweb + filletRadius, +hd - flangeThickness, 1)); // TR elbow start + c.points.push_back(placement * glm::dvec3(+hweb, +hd - flangeThickness - filletRadius, 1)); // TR elbow end + + c.points.push_back(placement * glm::dvec3(+hweb, -hd + flangeThickness + filletRadius, 1)); // BR elbow start + c.points.push_back(placement * glm::dvec3(+hweb + filletRadius, -hd + flangeThickness, 1)); // BR elbow end + } + else + { + c.points.push_back(placement * glm::dvec3(+hweb, +hd - flangeThickness, 1)); // TR elbow + c.points.push_back(placement * glm::dvec3(+hweb, -hd + flangeThickness, 1)); // BR elbow + } + + c.points.push_back(placement * glm::dvec3(+hw, -hd + flangeThickness, 1)); // BR knee + c.points.push_back(placement * glm::dvec3(+hw, -hd, 1)); // BR + + c.points.push_back(placement * glm::dvec3(-hw, -hd, 1)); // BL + c.points.push_back(placement * glm::dvec3(-hw, -hd + flangeThickness, 1)); // BL knee + + if (hasFillet) + { + // TODO: interpolate + c.points.push_back(placement * glm::dvec3(-hweb - filletRadius, -hd + flangeThickness, 1)); // BL elbow start + c.points.push_back(placement * glm::dvec3(-hweb, -hd + flangeThickness + filletRadius, 1)); // BL elbow end + + c.points.push_back(placement * glm::dvec3(-hweb, +hd - flangeThickness - filletRadius, 1)); // TL elbow start + c.points.push_back(placement * glm::dvec3(-hweb - filletRadius, +hd - flangeThickness, 1)); // TL elbow end + } + else + { + c.points.push_back(placement * glm::dvec3(-hweb, -hd + flangeThickness, 1)); // BL elbow + c.points.push_back(placement * glm::dvec3(-hweb, +hd - flangeThickness, 1)); // TL elbow + } + + c.points.push_back(placement * glm::dvec3(-hw, +hd - flangeThickness, 1)); // TL knee + c.points.push_back(placement * glm::dvec3(-hw, +hd, 1)); // TL + + if (MatrixFlipsTriangles(placement)) + { + c.Invert(); + } + + return c; + } + + inline Curve GetUShapedCurve(double depth, double flangeWidth, double webThickness, double flangeThickness, double filletRadius, double edgeRadius, double flangeSlope, glm::dmat3 placement = glm::dmat3(1)) + { + Curve c; + + double hd = depth / 2; + double hw = flangeWidth / 2; + // double hweb = webThickness / 2; + double slopeOffsetRight = flangeSlope * hw; + double slopeOffsetLeft = flangeSlope * (hw - webThickness); + // double flangeReferencePointY = hd - flangeThickness; + + // TODO: implement the radius + + c.points.push_back(placement * glm::dvec3(-hw, +hd, 1)); + c.points.push_back(placement * glm::dvec3(+hw, +hd, 1)); + + c.points.push_back(placement * glm::dvec3(+hw, +hd - flangeThickness + slopeOffsetRight, 1)); + + c.points.push_back(placement * glm::dvec3(-hw + webThickness, +hd - flangeThickness, 1 - slopeOffsetLeft)); + c.points.push_back(placement * glm::dvec3(-hw + webThickness, -hd + flangeThickness, 1 + slopeOffsetLeft)); + + c.points.push_back(placement * glm::dvec3(+hw, -hd + flangeThickness - slopeOffsetRight, 1)); + + c.points.push_back(placement * glm::dvec3(+hw, -hd, 1)); + c.points.push_back(placement * glm::dvec3(-hw, -hd, 1)); + + c.points.push_back(placement * glm::dvec3(-hw, +hd, 1)); + + if (MatrixFlipsTriangles(placement)) + { + c.Invert(); + } + + return c; + } + + inline Curve GetLShapedCurve(double width, double depth, double thickness, bool hasFillet, double filletRadius, double edgeRadius, double legSlope, glm::dmat3 placement = glm::dmat3(1)) + { + Curve c; + + double hw = width / 2; + double hd = depth / 2; + double hweb = thickness / 2; + + c.points.push_back(placement * glm::dvec3(-hw, +hd, 1)); + c.points.push_back(placement * glm::dvec3(-hw, -hd, 1)); + c.points.push_back(placement * glm::dvec3(+hw, -hd, 1)); + + if (hasFillet) + { + // TODO: Create interpolation and sloped lines + c.points.push_back(placement * glm::dvec3(+hw, -hd + thickness, 1)); + c.points.push_back(placement * glm::dvec3(-hw + thickness, -hd + thickness, 1)); + c.points.push_back(placement * glm::dvec3(-hw + thickness, +hd, 1)); + } + else + { + c.points.push_back(placement * glm::dvec3(+hw, -hd + thickness, 1)); + c.points.push_back(placement * glm::dvec3(-hw + thickness, -hd + thickness, 1)); + c.points.push_back(placement * glm::dvec3(-hw + thickness, +hd, 1)); + } + + c.points.push_back(placement * glm::dvec3(-hw, +hd, 1)); + + if (MatrixFlipsTriangles(placement)) + { + c.Invert(); + } + + return c; + } + + inline Curve GetTShapedCurve(double width, double depth, double thickness, bool hasFillet, double filletRadius, double edgeRadius, double legSlope, glm::dmat3 placement = glm::dmat3(1)) + { + Curve c; + + double hw = width / 2; + double hd = depth / 2; + double hweb = thickness / 2; + + c.points.push_back(placement * glm::dvec3(hw, hd, 1)); + + if (hasFillet) + { + // TODO: Create interpolation and sloped lines + c.points.push_back(placement * glm::dvec3(hw, hd - thickness, 1)); + c.points.push_back(placement * glm::dvec3(hweb, hd - thickness, 1)); + c.points.push_back(placement * glm::dvec3(hweb, -hd, 1)); + c.points.push_back(placement * glm::dvec3(-hweb, -hd, 1)); + c.points.push_back(placement * glm::dvec3(-hweb, hd - thickness, 1)); + c.points.push_back(placement * glm::dvec3(-hw, hd - thickness, 1)); + c.points.push_back(placement * glm::dvec3(-hw, hd, 1)); + } + else + { + c.points.push_back(placement * glm::dvec3(hw, hd - thickness, 1)); + c.points.push_back(placement * glm::dvec3(hweb, hd - thickness, 1)); + c.points.push_back(placement * glm::dvec3(hweb, -hd, 1)); + c.points.push_back(placement * glm::dvec3(-hweb, -hd, 1)); + c.points.push_back(placement * glm::dvec3(-hweb, hd - thickness, 1)); + c.points.push_back(placement * glm::dvec3(-hw, hd - thickness, 1)); + c.points.push_back(placement * glm::dvec3(-hw, hd, 1)); + } + + c.points.push_back(placement * glm::dvec3(hw, hd, 1)); + + if (MatrixFlipsTriangles(placement)) + { + c.Invert(); + } + + return c; + } + + inline Curve GetCShapedCurve(double width, double depth, double girth, double thickness, bool hasFillet, double filletRadius, glm::dmat3 placement = glm::dmat3(1)) + { + Curve c; + + double hw = width / 2; + double hd = depth / 2; + // double hweb = thickness / 2; + + c.points.push_back(placement * glm::dvec3(-hw, hd, 1)); + c.points.push_back(placement * glm::dvec3(hw, hd, 1)); + + if (hasFillet) + { + // TODO: Create interpolation and sloped lines + } + else + { + c.points.push_back(placement * glm::dvec3(hw, hd - girth, 1)); + c.points.push_back(placement * glm::dvec3(hw - thickness, hd - girth, 1)); + c.points.push_back(placement * glm::dvec3(hw - thickness, hd - thickness, 1)); + c.points.push_back(placement * glm::dvec3(-hw + thickness, hd - thickness, 1)); + c.points.push_back(placement * glm::dvec3(-hw + thickness, -hd + thickness, 1)); + c.points.push_back(placement * glm::dvec3(hw - thickness, -hd + thickness, 1)); + c.points.push_back(placement * glm::dvec3(hw - thickness, -hd + girth, 1)); + c.points.push_back(placement * glm::dvec3(hw, -hd + girth, 1)); + c.points.push_back(placement * glm::dvec3(hw, -hd, 1)); + c.points.push_back(placement * glm::dvec3(-hw, -hd, 1)); + } + + c.points.push_back(placement * glm::dvec3(-hw, hd, 1)); + + if (MatrixFlipsTriangles(placement)) + { + c.Invert(); + } + + return c; + } + + inline Curve GetZShapedCurve(double depth, double flangeWidth, double webThickness, double flangeThickness, double filletRadius, double edgeRadius, glm::dmat3 placement = glm::dmat3(1)) + { + Curve c; + double hw = flangeWidth / 2; + double hd = depth / 2; + double hweb = webThickness / 2; + // double hfla = flangeThickness / 2; + + c.points.push_back(placement * glm::dvec3(-hw, hd, 1)); + c.points.push_back(placement * glm::dvec3(hweb, hd, 1)); + c.points.push_back(placement * glm::dvec3(hweb, -hd + flangeThickness, 1)); + c.points.push_back(placement * glm::dvec3(hw, -hd + flangeThickness, 1)); + c.points.push_back(placement * glm::dvec3(hw, -hd, 1)); + c.points.push_back(placement * glm::dvec3(-hweb, -hd, 1)); + c.points.push_back(placement * glm::dvec3(-hweb, hd - flangeThickness, 1)); + c.points.push_back(placement * glm::dvec3(-hw, hd - flangeThickness, 1)); + c.points.push_back(placement * glm::dvec3(-hw, hd, 1)); + + if (MatrixFlipsTriangles(placement)) + { + c.Invert(); + } + + return c; + } + + inline Curve GetTrapeziumCurve(double bottomXDim, double topXDim, double yDim, double topXOffset, glm::dmat3 placement = glm::dmat3(1)) + { + double halfX = bottomXDim / 2; + double halfY = yDim / 2; + + glm::dvec2 bl = placement * glm::dvec3(-halfX, -halfY, 1); + glm::dvec2 br = placement * glm::dvec3(halfX, -halfY, 1); + + glm::dvec2 tl = placement * glm::dvec3(-halfX + topXOffset, halfY, 1); + glm::dvec2 tr = placement * glm::dvec3(-halfX + topXOffset + topXDim, halfY, 1); + + Curve c; + c.Add(bl); + c.Add(br); + c.Add(tr); + c.Add(tl); + c.Add(bl); + + if (MatrixFlipsTriangles(placement)) + { + c.Invert(); + } + + return c; + } } \ No newline at end of file diff --git a/src/cpp/web-ifc/geometry/operations/curve-utils.h b/src/cpp/web-ifc/geometry/operations/curve-utils.h index d8f7e32eb..915cc32b8 100644 --- a/src/cpp/web-ifc/geometry/operations/curve-utils.h +++ b/src/cpp/web-ifc/geometry/operations/curve-utils.h @@ -377,291 +377,65 @@ inline IfcCurve Build3DArc3Pt(const glm::dvec3 &p1, const glm::dvec3 &p2, const inline IfcCurve GetRectangleCurve(double xdim, double ydim, glm::dmat3 placement = glm::dmat3(1)) { - double halfX = xdim / 2; - double halfY = ydim / 2; - - glm::dvec2 bl = placement * glm::dvec3(-halfX, -halfY, 1); - glm::dvec2 br = placement * glm::dvec3(halfX, -halfY, 1); - - glm::dvec2 tl = placement * glm::dvec3(-halfX, halfY, 1); - glm::dvec2 tr = placement * glm::dvec3(halfX, halfY, 1); - + bimGeometry::Curve temp = bimGeometry::GetRectangleCurve(xdim, ydim, placement); IfcCurve c; - c.Add(bl); - c.Add(br); - c.Add(tr); - c.Add(tl); - c.Add(bl); - - if (MatrixFlipsTriangles(placement)) - { - c.Invert(); - } - + c.points = temp.points; return c; } inline IfcCurve GetIShapedCurve(double width, double depth, double webThickness, double flangeThickness, bool hasFillet, double filletRadius, glm::dmat3 placement = glm::dmat3(1)) { + bimGeometry::Curve temp = bimGeometry::GetIShapedCurve(width, depth, webThickness, flangeThickness, hasFillet, filletRadius,placement); IfcCurve c; - - double hw = width / 2; - double hd = depth / 2; - double hweb = webThickness / 2; - - c.points.push_back(placement * glm::dvec3(-hw, +hd, 1)); // TL - c.points.push_back(placement * glm::dvec3(+hw, +hd, 1)); // TR - c.points.push_back(placement * glm::dvec3(+hw, +hd - flangeThickness, 1)); // TR knee - - if (hasFillet) - { - // TODO: interpolate - c.points.push_back(placement * glm::dvec3(+hweb + filletRadius, +hd - flangeThickness, 1)); // TR elbow start - c.points.push_back(placement * glm::dvec3(+hweb, +hd - flangeThickness - filletRadius, 1)); // TR elbow end - - c.points.push_back(placement * glm::dvec3(+hweb, -hd + flangeThickness + filletRadius, 1)); // BR elbow start - c.points.push_back(placement * glm::dvec3(+hweb + filletRadius, -hd + flangeThickness, 1)); // BR elbow end - } - else - { - c.points.push_back(placement * glm::dvec3(+hweb, +hd - flangeThickness, 1)); // TR elbow - c.points.push_back(placement * glm::dvec3(+hweb, -hd + flangeThickness, 1)); // BR elbow - } - - c.points.push_back(placement * glm::dvec3(+hw, -hd + flangeThickness, 1)); // BR knee - c.points.push_back(placement * glm::dvec3(+hw, -hd, 1)); // BR - - c.points.push_back(placement * glm::dvec3(-hw, -hd, 1)); // BL - c.points.push_back(placement * glm::dvec3(-hw, -hd + flangeThickness, 1)); // BL knee - - if (hasFillet) - { - // TODO: interpolate - c.points.push_back(placement * glm::dvec3(-hweb - filletRadius, -hd + flangeThickness, 1)); // BL elbow start - c.points.push_back(placement * glm::dvec3(-hweb, -hd + flangeThickness + filletRadius, 1)); // BL elbow end - - c.points.push_back(placement * glm::dvec3(-hweb, +hd - flangeThickness - filletRadius, 1)); // TL elbow start - c.points.push_back(placement * glm::dvec3(-hweb - filletRadius, +hd - flangeThickness, 1)); // TL elbow end - } - else - { - c.points.push_back(placement * glm::dvec3(-hweb, -hd + flangeThickness, 1)); // BL elbow - c.points.push_back(placement * glm::dvec3(-hweb, +hd - flangeThickness, 1)); // TL elbow - } - - c.points.push_back(placement * glm::dvec3(-hw, +hd - flangeThickness, 1)); // TL knee - c.points.push_back(placement * glm::dvec3(-hw, +hd, 1)); // TL - - if (MatrixFlipsTriangles(placement)) - { - c.Invert(); - } - + c.points = temp.points; return c; } inline IfcCurve GetUShapedCurve(double depth, double flangeWidth, double webThickness, double flangeThickness, double filletRadius, double edgeRadius, double flangeSlope, glm::dmat3 placement = glm::dmat3(1)) { + bimGeometry::Curve temp = bimGeometry::GetUShapedCurve(depth, flangeWidth, webThickness, flangeThickness, filletRadius, edgeRadius, flangeSlope,placement); IfcCurve c; - - double hd = depth / 2; - double hw = flangeWidth / 2; - // double hweb = webThickness / 2; - double slopeOffsetRight = flangeSlope * hw; - double slopeOffsetLeft = flangeSlope * (hw - webThickness); - // double flangeReferencePointY = hd - flangeThickness; - - // TODO: implement the radius - - c.points.push_back(placement * glm::dvec3(-hw, +hd, 1)); - c.points.push_back(placement * glm::dvec3(+hw, +hd, 1)); - - c.points.push_back(placement * glm::dvec3(+hw, +hd - flangeThickness + slopeOffsetRight, 1)); - - c.points.push_back(placement * glm::dvec3(-hw + webThickness, +hd - flangeThickness, 1 - slopeOffsetLeft)); - c.points.push_back(placement * glm::dvec3(-hw + webThickness, -hd + flangeThickness, 1 + slopeOffsetLeft)); - - c.points.push_back(placement * glm::dvec3(+hw, -hd + flangeThickness - slopeOffsetRight, 1)); - - c.points.push_back(placement * glm::dvec3(+hw, -hd, 1)); - c.points.push_back(placement * glm::dvec3(-hw, -hd, 1)); - - c.points.push_back(placement * glm::dvec3(-hw, +hd, 1)); - - if (MatrixFlipsTriangles(placement)) - { - c.Invert(); - } - + c.points = temp.points; return c; } inline IfcCurve GetLShapedCurve(double width, double depth, double thickness, bool hasFillet, double filletRadius, double edgeRadius, double legSlope, glm::dmat3 placement = glm::dmat3(1)) { + bimGeometry::Curve temp = bimGeometry::GetLShapedCurve(width, depth, thickness, hasFillet, filletRadius, edgeRadius, legSlope, placement); IfcCurve c; - - double hw = width / 2; - double hd = depth / 2; - double hweb = thickness / 2; - - c.points.push_back(placement * glm::dvec3(-hw, +hd, 1)); - c.points.push_back(placement * glm::dvec3(-hw, -hd, 1)); - c.points.push_back(placement * glm::dvec3(+hw, -hd, 1)); - - if (hasFillet) - { - // TODO: Create interpolation and sloped lines - c.points.push_back(placement * glm::dvec3(+hw, -hd + thickness, 1)); - c.points.push_back(placement * glm::dvec3(-hw + thickness, -hd + thickness, 1)); - c.points.push_back(placement * glm::dvec3(-hw + thickness, +hd, 1)); - } - else - { - c.points.push_back(placement * glm::dvec3(+hw, -hd + thickness, 1)); - c.points.push_back(placement * glm::dvec3(-hw + thickness, -hd + thickness, 1)); - c.points.push_back(placement * glm::dvec3(-hw + thickness, +hd, 1)); - } - - c.points.push_back(placement * glm::dvec3(-hw, +hd, 1)); - - if (MatrixFlipsTriangles(placement)) - { - c.Invert(); - } - + c.points = temp.points; return c; } inline IfcCurve GetTShapedCurve(double width, double depth, double thickness, bool hasFillet, double filletRadius, double edgeRadius, double legSlope, glm::dmat3 placement = glm::dmat3(1)) { + bimGeometry::Curve temp = bimGeometry::GetTShapedCurve(width, depth, thickness, hasFillet, filletRadius, edgeRadius, legSlope, placement); IfcCurve c; - - double hw = width / 2; - double hd = depth / 2; - double hweb = thickness / 2; - - c.points.push_back(placement * glm::dvec3(hw, hd, 1)); - - if (hasFillet) - { - // TODO: Create interpolation and sloped lines - c.points.push_back(placement * glm::dvec3(hw, hd - thickness, 1)); - c.points.push_back(placement * glm::dvec3(hweb, hd - thickness, 1)); - c.points.push_back(placement * glm::dvec3(hweb, -hd, 1)); - c.points.push_back(placement * glm::dvec3(-hweb, -hd, 1)); - c.points.push_back(placement * glm::dvec3(-hweb, hd - thickness, 1)); - c.points.push_back(placement * glm::dvec3(-hw, hd - thickness, 1)); - c.points.push_back(placement * glm::dvec3(-hw, hd, 1)); - } - else - { - c.points.push_back(placement * glm::dvec3(hw, hd - thickness, 1)); - c.points.push_back(placement * glm::dvec3(hweb, hd - thickness, 1)); - c.points.push_back(placement * glm::dvec3(hweb, -hd, 1)); - c.points.push_back(placement * glm::dvec3(-hweb, -hd, 1)); - c.points.push_back(placement * glm::dvec3(-hweb, hd - thickness, 1)); - c.points.push_back(placement * glm::dvec3(-hw, hd - thickness, 1)); - c.points.push_back(placement * glm::dvec3(-hw, hd, 1)); - } - - c.points.push_back(placement * glm::dvec3(hw, hd, 1)); - - if (MatrixFlipsTriangles(placement)) - { - c.Invert(); - } - + c.points = temp.points; return c; } inline IfcCurve GetCShapedCurve(double width, double depth, double girth, double thickness, bool hasFillet, double filletRadius, glm::dmat3 placement = glm::dmat3(1)) { + bimGeometry::Curve temp = bimGeometry::GetCShapedCurve(width, depth, girth, thickness, hasFillet, filletRadius, placement); IfcCurve c; - - double hw = width / 2; - double hd = depth / 2; - // double hweb = thickness / 2; - - c.points.push_back(placement * glm::dvec3(-hw, hd, 1)); - c.points.push_back(placement * glm::dvec3(hw, hd, 1)); - - if (hasFillet) - { - // TODO: Create interpolation and sloped lines - } - else - { - c.points.push_back(placement * glm::dvec3(hw, hd - girth, 1)); - c.points.push_back(placement * glm::dvec3(hw - thickness, hd - girth, 1)); - c.points.push_back(placement * glm::dvec3(hw - thickness, hd - thickness, 1)); - c.points.push_back(placement * glm::dvec3(-hw + thickness, hd - thickness, 1)); - c.points.push_back(placement * glm::dvec3(-hw + thickness, -hd + thickness, 1)); - c.points.push_back(placement * glm::dvec3(hw - thickness, -hd + thickness, 1)); - c.points.push_back(placement * glm::dvec3(hw - thickness, -hd + girth, 1)); - c.points.push_back(placement * glm::dvec3(hw, -hd + girth, 1)); - c.points.push_back(placement * glm::dvec3(hw, -hd, 1)); - c.points.push_back(placement * glm::dvec3(-hw, -hd, 1)); - } - - c.points.push_back(placement * glm::dvec3(-hw, hd, 1)); - - if (MatrixFlipsTriangles(placement)) - { - c.Invert(); - } - + c.points = temp.points; return c; } inline IfcCurve GetZShapedCurve(double depth, double flangeWidth, double webThickness, double flangeThickness, double filletRadius, double edgeRadius, glm::dmat3 placement = glm::dmat3(1)) { + bimGeometry::Curve temp = bimGeometry::GetZShapedCurve(depth, flangeWidth, webThickness, flangeThickness, filletRadius, edgeRadius, placement); IfcCurve c; - double hw = flangeWidth / 2; - double hd = depth / 2; - double hweb = webThickness / 2; - // double hfla = flangeThickness / 2; - - c.points.push_back(placement * glm::dvec3(-hw, hd, 1)); - c.points.push_back(placement * glm::dvec3(hweb, hd, 1)); - c.points.push_back(placement * glm::dvec3(hweb, -hd + flangeThickness, 1)); - c.points.push_back(placement * glm::dvec3(hw, -hd + flangeThickness, 1)); - c.points.push_back(placement * glm::dvec3(hw, -hd, 1)); - c.points.push_back(placement * glm::dvec3(-hweb, -hd, 1)); - c.points.push_back(placement * glm::dvec3(-hweb, hd - flangeThickness, 1)); - c.points.push_back(placement * glm::dvec3(-hw, hd - flangeThickness, 1)); - c.points.push_back(placement * glm::dvec3(-hw, hd, 1)); - - if (MatrixFlipsTriangles(placement)) - { - c.Invert(); - } - + c.points = temp.points; return c; } inline IfcCurve GetTrapeziumCurve(double bottomXDim, double topXDim, double yDim, double topXOffset, glm::dmat3 placement = glm::dmat3(1)) { - double halfX = bottomXDim / 2; - double halfY = yDim / 2; - - glm::dvec2 bl = placement * glm::dvec3(-halfX, -halfY, 1); - glm::dvec2 br = placement * glm::dvec3(halfX, -halfY, 1); - - glm::dvec2 tl = placement * glm::dvec3(-halfX + topXOffset, halfY, 1); - glm::dvec2 tr = placement * glm::dvec3(-halfX + topXOffset + topXDim, halfY, 1); - + bimGeometry::Curve temp = bimGeometry::GetTrapeziumCurve(bottomXDim, topXDim, yDim, topXOffset, placement); IfcCurve c; - c.Add(bl); - c.Add(br); - c.Add(tr); - c.Add(tl); - c.Add(bl); - - if (MatrixFlipsTriangles(placement)) - { - c.Invert(); - } - + c.points = temp.points; return c; } diff --git a/src/cpp/web-ifc/geometry/operations/geometryutils.h b/src/cpp/web-ifc/geometry/operations/geometryutils.h index 748d7f795..a4e7cde13 100644 --- a/src/cpp/web-ifc/geometry/operations/geometryutils.h +++ b/src/cpp/web-ifc/geometry/operations/geometryutils.h @@ -39,6 +39,16 @@ namespace webifc::geometry ifcGeom.indexData = geom.indexData; ifcGeom.numPoints = geom.numPoints; ifcGeom.numFaces = geom.numFaces; + if(ifcGeom.planeData.size() != ifcGeom.numFaces) + { + for (size_t i = 0; i < ifcGeom.numFaces; i++) + { + if(i >= ifcGeom.planeData.size()) + { + ifcGeom.planeData.push_back(-1); + } + } + } return ifcGeom; } @@ -51,10 +61,9 @@ namespace webifc::geometry inline IfcGeometry SweepCircular(const double scaling, const bool closed, const IfcProfile &profile, const double radius, const IfcCurve &directrix, const glm::dvec3 &initialDirectrixNormal = glm::dvec3(0), const bool rotate90 = false) { spdlog::debug("[SweepCircular({})]"); - IfcGeometry geom; - - std::vector> dpts; + std::vector profile_vector; + std::vector directrix_vector; // Remove repeated points for (size_t i = 0; i < directrix.points.size(); i++) { @@ -62,230 +71,22 @@ namespace webifc::geometry { if (glm::distance(directrix.points[i], directrix.points[i + 1]) > EPS_BIG2 * scaling) { - dpts.push_back(directrix.points[i]); + directrix_vector.push_back(directrix.points[i]); } } else { - dpts.push_back(directrix.points[i]); + directrix_vector.push_back(directrix.points[i]); } } - if (closed) - { - glm::vec<3, glm::f64> dirStart = dpts[dpts.size() - 2] - dpts[dpts.size() - 1]; - glm::vec<3, glm::f64> dirEnd = dpts[1] - dpts[0]; - std::vector> newDpts; - newDpts.push_back(dpts[0] + dirStart); - for (size_t i = 0; i < dpts.size(); i++) - { - newDpts.push_back(dpts[i]); - } - newDpts.push_back(dpts[dpts.size() - 1] + dirEnd); - dpts = newDpts; + auto &ppts = profile.curve.points; + for (auto &pt2D : ppts) + { + profile_vector.push_back(pt2D); } - if (dpts.size() <= 1) - { - // nothing to sweep - return geom; - } - - // compute curve for each part of the directrix - std::vector curves; - std::vector transforms; - - for (size_t i = 0; i < dpts.size(); i++) - { - IfcCurve segmentForCurve; - - glm::dvec3 directrix2; - glm::dvec3 planeNormal; - glm::dvec3 directrixSegmentNormal; - glm::dvec3 planeOrigin; - - if (i == 0) // start - { - planeNormal = glm::normalize(dpts[1] - dpts[0]); - directrixSegmentNormal = planeNormal; - planeOrigin = dpts[0]; - directrix2 = planeNormal; - } - else if (i == dpts.size() - 1) // end - { - planeNormal = glm::normalize(dpts[i] - dpts[i - 1]); - directrixSegmentNormal = planeNormal; - planeOrigin = dpts[i]; - directrix2 = planeNormal; - } - else // middle - { - // possibly the directrix is bad - glm::dvec3 n1 = glm::normalize(dpts[i] - dpts[i - 1]); - glm::dvec3 n2 = glm::normalize(dpts[i + 1] - dpts[i]); - glm::dvec3 p = glm::normalize(glm::cross(n1, n2)); - directrix2 = -n1; - - // double prod = glm::dot(n1, n2); - - if (std::isnan(p.x)) - { - // TODO: sometimes outliers cause the perp to become NaN! - // this is bad news, as it nans the points added to the final mesh - // also, it's hard to bail out now :/ - // see curve.add() for more info on how this is currently "solved" -#if defined(_DEBUG) - printf("NaN perp!\n"); -#endif - } - - glm::dvec3 u1 = glm::normalize(glm::cross(n1, p)); - glm::dvec3 u2 = glm::normalize(glm::cross(n2, p)); - - // TODO: When n1 and n2 have similar direction but opposite side... - // ... projection tend to infinity. -> glm::dot(n1, n2) - // I implemented a bad solution to prevent projection to infinity - if (glm::dot(n1, n2) < -0.9) - { - n2 = -n2; - u2 = -u2; - } - - glm::dvec3 au = glm::normalize(u1 + u2); - planeNormal = glm::normalize(glm::cross(au, p)); - directrixSegmentNormal = n1; // n1 or n2 doesn't matter - - planeOrigin = dpts[i]; - } - - glm::dvec3 dz = glm::normalize(directrix2); - glm::dvec3 dx = glm::dvec3(1, 0, 0); - glm::dvec3 dy = glm::dvec3(0, 1, 0); - - double parallelZ = glm::abs(glm::dot(dz, glm::dvec3(0, 0, 1))); - - if(parallelZ > 1 - EPS_BIG2) - { - dx = glm::normalize(glm::cross(dz, glm::dvec3(0, 1, 0))); - } else { - dx = glm::normalize(glm::cross(dz, glm::dvec3(0, 0, 1))); - } - - dy = glm::normalize(glm::cross(dz, dx)); - - glm::dmat4 profileScale = glm::dmat4( - glm::dvec4(dx * radius, 0), - glm::dvec4(dy * radius, 0), - glm::dvec4(dz, 0), - glm::dvec4(planeOrigin, 1)); - - transforms.push_back(profileScale); - - if (curves.empty()) - { - // construct initial curve - glm::dvec3 left; - glm::dvec3 right; - if (initialDirectrixNormal == glm::dvec3(0)) - { - left = glm::cross(directrixSegmentNormal, glm::dvec3(directrixSegmentNormal.y, directrixSegmentNormal.x, directrixSegmentNormal.z)); - if (left == glm::dvec3(0, 0, 0)) - { - left = glm::cross(directrixSegmentNormal, glm::dvec3(directrixSegmentNormal.x, directrixSegmentNormal.z, directrixSegmentNormal.y)); - } - if (left == glm::dvec3(0, 0, 0)) - { - left = glm::cross(directrixSegmentNormal, glm::dvec3(directrixSegmentNormal.z, directrixSegmentNormal.y, directrixSegmentNormal.x)); - } - right = glm::normalize(glm::cross(directrixSegmentNormal, left)); - left = glm::normalize(glm::cross(directrixSegmentNormal, right)); - } - else - { - left = glm::cross(directrixSegmentNormal, initialDirectrixNormal); - glm::dvec3 side = glm::normalize(initialDirectrixNormal); - right = glm::normalize(glm::cross(directrixSegmentNormal, left)); - left = glm::normalize(glm::cross(directrixSegmentNormal, right)); - right *= side; - } - - if (left == glm::dvec3(0, 0, 0)) - { - printf("0 left vec in sweep!\n"); - } - - // project profile onto planeNormal, place on planeOrigin - // TODO: look at holes - auto &ppts = profile.curve.points; - for (auto &pt2D : ppts) - { - glm::dvec3 pt = -pt2D.x * left + -pt2D.y * right + planeOrigin; - if(rotate90) - { - pt = -pt2D.x * right - pt2D.y * left + planeOrigin; - } - glm::dvec3 proj = bimGeometry::projectOntoPlane(planeOrigin, planeNormal, pt, directrixSegmentNormal); - - segmentForCurve.Add(proj); - } - } - else - { - // project previous curve onto the normal - const IfcCurve &prevCurve = curves.back(); - - auto &ppts = prevCurve.points; - for (auto &pt : ppts) - { - glm::dvec3 proj = bimGeometry::projectOntoPlane(planeOrigin, planeNormal, pt, directrixSegmentNormal); - - segmentForCurve.Add(proj); - } - } - - if (!closed || (i != 0 && i != dpts.size() - 1)) - { - curves.push_back(segmentForCurve); - } - } - - if (closed) - { - dpts.pop_back(); - dpts.erase(dpts.begin()); - } - - // connect the curves - for (size_t i = 1; i < dpts.size(); i++) - { - glm::dvec3 p1 = dpts[i - 1]; - glm::dvec3 p2 = dpts[i]; - glm::dvec3 dir = p1 - p2; - glm::dvec4 ddir = glm::dvec4(dir, 0); - const double di = glm::distance(p1, p2); - - //Only segments smaller than 10 cm will be represented, those that are bigger will be standardized - - const auto &c1 = curves[i - 1].points; - const auto &c2 = curves[i].points; - - uint32_t capSize = c1.size(); - for (size_t j = 1; j < capSize; j++) - { - glm::dvec3 bl = c1[j - 1]; - glm::dvec3 br = c1[j - 0]; - glm::dvec3 tl = c2[j - 1]; - glm::dvec3 tr = c2[j - 0]; - - geom.AddFace(tl, br, bl); - geom.AddFace(tl, tr, br); - } - } - - // DumpSVGCurve(directrix.points, glm::dvec3(), "directrix.html"); - // DumpIfcGeometry(geom, "sweep.obj"); - - return geom; + return ToIfcGeometry(bimGeometry::SweepCircular(scaling, closed, profile_vector, radius, directrix_vector, initialDirectrixNormal, rotate90)); } inline bool computeSafeNormal(const glm::dvec3 v1, const glm::dvec3 v2, const glm::dvec3 v3, glm::dvec3 &normal, double eps = 0) @@ -505,7 +306,7 @@ namespace webifc::geometry // edgesPrinted.push_back({glm::dvec2(b.z + b.x / 2, b.y + b.x / 2), glm::dvec2(c.z + c.x / 2, c.y + c.x / 2)}); // fuzzybools::DumpSVGLines(edgesPrinted, L"triangulateBounds_tri.html"); #endif - geometry.AddFace(offset + indices[i + 0], offset + indices[i + 1], offset + indices[i + 2]); + geometry.AddFace(offset + indices[i + 0], offset + indices[i + 1], offset + indices[i + 2], -1); } #ifdef CSG_DEBUG_OUTPUT @@ -518,69 +319,29 @@ namespace webifc::geometry } } - inline IfcGeometry SectionedSurface(IfcCrossSections profiles) + inline IfcGeometry SectionedSurface(IfcCrossSections profiles_) { spdlog::debug("[SectionedSurface({})]"); - IfcGeometry geom; - - // Iterate over each profile, and create a surface by connecting the corresponding points with faces. - for (size_t i = 0; i < profiles.curves.size() - 1; i++) - { - IfcCurve &profile1 = profiles.curves[i]; - IfcCurve &profile2 = profiles.curves[i + 1]; - - // Check that the profiles have the same number of points - if (profile1.points.size() != profile2.points.size()) - { - spdlog::error("[SectionedSurface()] profiles must have the same number of points in SectionedSurface"); - } - - std::vector indices; - // Create faces by connecting corresponding points from the two profiles - for (size_t j = 0; j < profile1.points.size(); j++) - { - glm::dvec3 &p1 = profile1.points[j]; - int j2 = 0; - if (profile1.points.size() > 1) - { - double pr = (double)j / (double)(profile1.points.size() - 1); - j2 = pr * (profile2.points.size() - 1); - } - glm::dvec3 &p2 = profile2.points[j2]; - - glm::dvec3 normal = glm::dvec3(0.0, 0.0, 1.0); - - if (glm::distance(p1, p2) > 1E-5) - { - normal = glm::normalize(glm::cross(p2 - p1, glm::cross(p2 - p1, glm::dvec3(0.0, 0.0, 1.0)))); - } + std::vector> profiles; - geom.AddPoint(p1, normal); - geom.AddPoint(p2, normal); - - indices.push_back(geom.numPoints - 2); - indices.push_back(geom.numPoints - 1); - } - - // Create the faces - if (indices.size() > 0) + for (size_t i = 0; i < profiles_.curves.size(); i++) + { + std::vector profile; + for (size_t j = 0; j < profiles_.curves[i].points.size(); j++) { - for (size_t j = 0; j < indices.size() - 2; j += 4) - { - geom.AddFace(indices[j], indices[j + 1], indices[j + 2]); - geom.AddFace(indices[j + 2], indices[j + 1], indices[j + 3]); - } + profile.push_back({profiles_.curves[i].points[j].x, profiles_.curves[i].points[j].y, profiles_.curves[i].points[j].z}); } + profiles.push_back(profile); } - return geom; + return ToIfcGeometry(bimGeometry::SectionedSurface(profiles)); } inline IfcGeometry Extrude(IfcProfile profile, glm::dvec3 dir, double distance, glm::dvec3 cuttingPlaneNormal = glm::dvec3(0), glm::dvec3 cuttingPlanePos = glm::dvec3(0)) { spdlog::debug("[Extrude({})]"); - IfcGeometry geom; + std::vector holesIndicesHash; // check if first point is equal to last point, otherwise the outer loop of the shape is not closed @@ -589,144 +350,29 @@ namespace webifc::geometry profile.curve.points.push_back(profile.curve.points.front()); } - // build the caps + std::vector> profile_vector; + std::vector profile_contour; + for (size_t i = 0; i < profile.curve.points.size(); i++) { - using Point = std::array; - int polygonCount = 1 + profile.holes.size(); // Main profile + holes - std::vector> polygon(polygonCount); - - glm::dvec3 normal = dir; - - for (size_t i = 0; i < profile.curve.points.size(); i++) - { - glm::dvec2 pt = profile.curve.points[i]; - glm::dvec4 et = glm::dvec4(glm::dvec3(pt, 0) + dir * distance, 1); - - geom.AddPoint(et, normal); - polygon[0].push_back({pt.x, pt.y}); - } - - for (size_t i = 0; i < profile.curve.points.size(); i++) - { - holesIndicesHash.push_back(false); - } - - for (size_t i = 0; i < profile.holes.size(); i++) - { - IfcCurve hole = profile.holes[i]; - int pointCount = hole.points.size(); - - for (int j = 0; j < pointCount; j++) - { - holesIndicesHash.push_back(j == 0); - - glm::dvec2 pt = hole.points[j]; - glm::dvec4 et = glm::dvec4(glm::dvec3(pt, 0) + dir * distance, 1); - - profile.curve.Add(pt); - geom.AddPoint(et, normal); - polygon[i + 1].push_back({pt.x, pt.y}); // Index 0 is main profile; see earcut reference - } - } - - std::vector indices = mapbox::earcut(polygon); - - if (indices.size() < 3) - { - // probably a degenerate polygon - spdlog::error("[Extrude()] degenerate polygon in extrude"); - return geom; - } - - uint32_t offset = 0; - bool winding = bimGeometry::GetWindingOfTriangle(geom.GetPoint(offset + indices[0]), geom.GetPoint(offset + indices[1]), geom.GetPoint(offset + indices[2])); - bool flipWinding = !winding; - - for (size_t i = 0; i < indices.size(); i += 3) - { - if (flipWinding) - { - geom.AddFace(offset + indices[i + 0], offset + indices[i + 2], offset + indices[i + 1]); - } - else - { - geom.AddFace(offset + indices[i + 0], offset + indices[i + 1], offset + indices[i + 2]); - } - } - - offset += geom.numPoints; - - normal = -dir; - - for (size_t i = 0; i < profile.curve.points.size(); i++) - { - glm::dvec2 pt = profile.curve.points[i]; - glm::dvec4 et = glm::dvec4(glm::dvec3(pt, 0), 1); - - if (cuttingPlaneNormal != glm::dvec3(0)) - { - et = glm::dvec4(glm::dvec3(pt, 0), 1); - glm::dvec3 transDir = glm::dvec4(dir, 0); - - // project {et} onto the plane, following the extrusion normal - double ldotn = glm::dot(transDir, cuttingPlaneNormal); - if (ldotn == 0) - { - printf("0 direction in extrude\n"); - } - else - { - glm::dvec3 dpos = cuttingPlanePos - glm::dvec3(et); - double dist = glm::dot(dpos, cuttingPlaneNormal) / ldotn; - // we want to apply dist, even when negative - et = et + glm::dvec4(dist * transDir, 1); - } - } - - geom.AddPoint(et, normal); - } - - for (size_t i = 0; i < indices.size(); i += 3) - { - if (flipWinding) - { - geom.AddFace(offset + indices[i + 0], offset + indices[i + 1], offset + indices[i + 2]); - } - else - { - geom.AddFace(offset + indices[i + 0], offset + indices[i + 2], offset + indices[i + 1]); - } - } + profile_contour.push_back(profile.curve.points[i]); } - - uint32_t capSize = profile.curve.points.size(); - for (size_t i = 1; i < capSize; i++) + profile_vector.push_back(profile_contour); + for (size_t i = 0; i < profile.holes.size(); i++) { - // https://github.com/tomvandig/web-ifc/issues/5 - if (holesIndicesHash[i]) + std::vector hole_contour; + IfcCurve hole = profile.holes[i]; + int pointCount = hole.points.size(); + for (int j = 0; j < pointCount; j++) { - continue; + hole_contour.push_back(hole.points[j]); } - - uint32_t bl = i - 1; - uint32_t br = i - 0; - - uint32_t tl = capSize + i - 1; - uint32_t tr = capSize + i - 0; - - // this winding should be correct - geom.AddFace(geom.GetPoint(tl), - geom.GetPoint(br), - geom.GetPoint(bl)); - - geom.AddFace(geom.GetPoint(tl), - geom.GetPoint(tr), - geom.GetPoint(br)); + profile_vector.push_back(hole_contour); } - return geom; + return ToIfcGeometry(bimGeometry::Extrude(profile_vector, dir, distance, cuttingPlaneNormal, cuttingPlanePos)); } + // TODO: Send to bimGeometry inline double VectorToAngle2D(double x, double y) { double dd = sqrt(x * x + y * y); @@ -807,7 +453,7 @@ namespace webifc::geometry { for (uint32_t i = 0; i < meshGeom.numFaces; i++) { - Face f = meshGeom.GetFace(i); + bimGeometry::Face f = meshGeom.GetFace(i); glm::dvec3 a = newMat * glm::dvec4(meshGeom.GetPoint(f.i0), 1); return a; @@ -841,77 +487,42 @@ namespace webifc::geometry } } - inline void flattenRecursive(IfcComposedMesh &mesh, std::unordered_map &geometryMap, std::vector &geoms, glm::dmat4 mat) - { - glm::dmat4 newMat = mat * mesh.transformation; + inline void flattenRecursive(IfcComposedMesh &mesh, std::unordered_map &geometryMap, std::vector &geoms, glm::dmat4 mat) + { + glm::dmat4 newMat = mat * mesh.transformation; - bool transformationBreaksWinding = MatrixFlipsTriangles(newMat); + bool transformationBreaksWinding = MatrixFlipsTriangles(newMat); - auto geomIt = geometryMap.find(mesh.expressID); + auto geomIt = geometryMap.find(mesh.expressID); - if (geomIt != geometryMap.end()) - { - auto meshGeom = geomIt->second; + if (geomIt != geometryMap.end()) + { + auto meshGeom = geomIt->second; - if (meshGeom.part.size() > 0) + if (meshGeom.part.size() > 0) + { + for (uint32_t i = 0; i < meshGeom.part.size(); i++) { - for (uint32_t i = 0; i < meshGeom.part.size(); i++) - { - - IfcGeometry newMeshGeom = meshGeom.part[i]; - if (newMeshGeom.numFaces) - { - IfcGeometry newGeom; - newGeom.halfSpace = newMeshGeom.halfSpace; - if (newGeom.halfSpace) - { - newGeom.halfSpaceOrigin = newMat * glm::dvec4(newMeshGeom.halfSpaceOrigin, 1); - newGeom.halfSpaceX = newMat * glm::dvec4(newMeshGeom.halfSpaceX, 1); - newGeom.halfSpaceY = newMat * glm::dvec4(newMeshGeom.halfSpaceY, 1); - newGeom.halfSpaceZ = newMat * glm::dvec4(newMeshGeom.halfSpaceZ, 1); - } - - for (uint32_t i = 0; i < newMeshGeom.numFaces; i++) - { - Face f = newMeshGeom.GetFace(i); - glm::dvec3 a = newMat * glm::dvec4(newMeshGeom.GetPoint(f.i0), 1); - glm::dvec3 b = newMat * glm::dvec4(newMeshGeom.GetPoint(f.i1), 1); - glm::dvec3 c = newMat * glm::dvec4(newMeshGeom.GetPoint(f.i2), 1); - - if (transformationBreaksWinding) - { - newGeom.AddFace(b, a, c); - } - else - { - newGeom.AddFace(a, b, c); - } - } - geoms.push_back(newGeom); - } - } - } - else - { - if (meshGeom.numFaces) + IfcGeometry newMeshGeom = meshGeom.part[i]; + if (newMeshGeom.numFaces) { IfcGeometry newGeom; - newGeom.halfSpace = meshGeom.halfSpace; + newGeom.halfSpace = newMeshGeom.halfSpace; if (newGeom.halfSpace) { - newGeom.halfSpaceOrigin = newMat * glm::dvec4(meshGeom.halfSpaceOrigin, 1); - newGeom.halfSpaceX = newMat * glm::dvec4(meshGeom.halfSpaceX, 1); - newGeom.halfSpaceY = newMat * glm::dvec4(meshGeom.halfSpaceY, 1); - newGeom.halfSpaceZ = newMat * glm::dvec4(meshGeom.halfSpaceZ, 1); + newGeom.halfSpaceOrigin = newMat * glm::dvec4(newMeshGeom.halfSpaceOrigin, 1); + newGeom.halfSpaceX = newMat * glm::dvec4(newMeshGeom.halfSpaceX, 1); + newGeom.halfSpaceY = newMat * glm::dvec4(newMeshGeom.halfSpaceY, 1); + newGeom.halfSpaceZ = newMat * glm::dvec4(newMeshGeom.halfSpaceZ, 1); } - for (uint32_t i = 0; i < meshGeom.numFaces; i++) + for (uint32_t i = 0; i < newMeshGeom.numFaces; i++) { - Face f = meshGeom.GetFace(i); - glm::dvec3 a = newMat * glm::dvec4(meshGeom.GetPoint(f.i0), 1); - glm::dvec3 b = newMat * glm::dvec4(meshGeom.GetPoint(f.i1), 1); - glm::dvec3 c = newMat * glm::dvec4(meshGeom.GetPoint(f.i2), 1); + bimGeometry::Face f = newMeshGeom.GetFace(i); + glm::dvec3 a = newMat * glm::dvec4(newMeshGeom.GetPoint(f.i0), 1); + glm::dvec3 b = newMat * glm::dvec4(newMeshGeom.GetPoint(f.i1), 1); + glm::dvec3 c = newMat * glm::dvec4(newMeshGeom.GetPoint(f.i2), 1); if (transformationBreaksWinding) { @@ -927,13 +538,48 @@ namespace webifc::geometry } } } - - for (auto &c : mesh.children) + else { - flattenRecursive(c, geometryMap, geoms, newMat); + if (meshGeom.numFaces) + { + IfcGeometry newGeom; + newGeom.halfSpace = meshGeom.halfSpace; + if (newGeom.halfSpace) + { + newGeom.halfSpaceOrigin = newMat * glm::dvec4(meshGeom.halfSpaceOrigin, 1); + newGeom.halfSpaceX = newMat * glm::dvec4(meshGeom.halfSpaceX, 1); + newGeom.halfSpaceY = newMat * glm::dvec4(meshGeom.halfSpaceY, 1); + newGeom.halfSpaceZ = newMat * glm::dvec4(meshGeom.halfSpaceZ, 1); + } + + for (uint32_t i = 0; i < meshGeom.numFaces; i++) + { + bimGeometry::Face f = meshGeom.GetFace(i); + glm::dvec3 a = newMat * glm::dvec4(meshGeom.GetPoint(f.i0), 1); + glm::dvec3 b = newMat * glm::dvec4(meshGeom.GetPoint(f.i1), 1); + glm::dvec3 c = newMat * glm::dvec4(meshGeom.GetPoint(f.i2), 1); + + if (transformationBreaksWinding) + { + newGeom.AddFace(b, a, c); + } + else + { + newGeom.AddFace(a, b, c); + } + } + + geoms.push_back(newGeom); + } } } + for (auto &c : mesh.children) + { + flattenRecursive(c, geometryMap, geoms, newMat); + } + } + inline std::vector flatten(IfcComposedMesh &mesh, std::unordered_map &geometryMap, glm::dmat4 mat = glm::dmat4(1)) { std::vector geoms; @@ -953,7 +599,7 @@ namespace webifc::geometry { for (uint32_t i = 0; i < geoms[g].numFaces; i++) { - Face f = geoms[g].GetFace(i); + bimGeometry::Face f = geoms[g].GetFace(i); glm::dvec3 a = geoms[g].GetPoint(f.i0); glm::dvec3 b = geoms[g].GetPoint(f.i1); glm::dvec3 c = geoms[g].GetPoint(f.i2); diff --git a/src/cpp/web-ifc/geometry/operations/mesh_utils.h b/src/cpp/web-ifc/geometry/operations/mesh_utils.h index f53805394..a18dffec4 100644 --- a/src/cpp/web-ifc/geometry/operations/mesh_utils.h +++ b/src/cpp/web-ifc/geometry/operations/mesh_utils.h @@ -435,6 +435,7 @@ namespace webifc::geometry } } + // TODO: sent to bimGeometry inline void TriangulateBspline(IfcGeometry &geometry, std::vector const& bounds, IfcSurface const& surface, double const scaling) { spdlog::debug("[TriangulateBspline({})]"); diff --git a/src/cpp/web-ifc/geometry/representation/IfcGeometry.cpp b/src/cpp/web-ifc/geometry/representation/IfcGeometry.cpp index 7f38a1064..8f10f0e7f 100644 --- a/src/cpp/web-ifc/geometry/representation/IfcGeometry.cpp +++ b/src/cpp/web-ifc/geometry/representation/IfcGeometry.cpp @@ -9,11 +9,6 @@ namespace webifc::geometry { - bool Plane::IsEqualTo(const Vec &n, double d) const - { - return (equals(normal, n, toleranceVectorEquality) && equals(distance, d, toleranceScalarEquality)); - } - void Geometry::BuildFromVectors(std::vector& d, std::vector& i) { vertexData = d; @@ -23,107 +18,6 @@ namespace webifc::geometry { numFaces = indexData.size() / 3; } - void Geometry::AddFace(glm::dvec3 a, glm::dvec3 b, glm::dvec3 c, uint32_t pId) - { - bimGeometry::Geometry::AddFace(a, b, c); - planeData.push_back(pId); - } - - void Geometry::AddFace(uint32_t a, uint32_t b, uint32_t c, uint32_t pId) - { - bimGeometry::Geometry::AddFace(a, b, c); - planeData.push_back(pId); - } - - size_t Geometry::AddPlane(const glm::dvec3 &normal, double d) - { - for (auto &plane : planes) - { - if (plane.IsEqualTo(normal, d)) - { - return plane.id; - } - } - - Plane p; - p.id = planes.size(); - p.normal = glm::normalize(normal); - p.distance = d; - - planes.push_back(p); - - return p.id; - } - - void Geometry::buildPlanes() - { - if(!hasPlanes) - { - - Vec centroid = Vec(0,0,0); - - for (size_t i = 0; i < numFaces; i++) - { - Face f = GetFace(i); - - auto a = GetPoint(f.i0); - auto b = GetPoint(f.i1); - auto c = GetPoint(f.i2); - - centroid = centroid + (a + b + c) / 3.0; - } - - for (size_t i = 0; i < numFaces; i++) - { - Face f = GetFace(i); - - auto a = GetPoint(f.i0); - auto b = GetPoint(f.i1); - auto c = GetPoint(f.i2); - - glm::dvec3 norm; - - if (computeSafeNormal(a, b, c, norm, EPS_SMALL)) - { - double da = glm::dot(norm, a - centroid); - - size_t id = AddPlane(norm, da); - planeData[i] = id; - } - - hasPlanes = true; - } - - for (size_t i = 0; i < numFaces; i++) - { - Face f = GetFace(i); - - if(f.pId > -1) - { - auto a = GetPoint(f.i0); - auto b = GetPoint(f.i1); - auto c = GetPoint(f.i2); - - double da = glm::dot(planes[f.pId].normal, a); - - planes[f.pId].distance = da; - } - } - } - // TODO: Remove unused planes - } - - Face Geometry::GetFace(size_t index) const - { - Face f; - bimGeometry::Face nf = bimGeometry::Geometry::GetFace(index); - f.i0 = nf.i0; - f.i1 = nf.i1; - f.i2 = nf.i2; - f.pId = planeData[index]; - return f; - } - AABB Geometry::GetFaceBox(size_t index) const { AABB aabb; @@ -225,7 +119,7 @@ namespace webifc::geometry { for (uint32_t i = 0; i < numFaces; i++) { - Face f = GetFace(i); + bimGeometry::Face f = GetFace(i); glm::dvec3 a = trans * glm::dvec4(GetPoint(f.i0), 1); glm::dvec3 b = trans * glm::dvec4(GetPoint(f.i1), 1); @@ -250,7 +144,7 @@ namespace webifc::geometry { void IfcGeometry::ReverseFace(uint32_t index) { - Face f = GetFace(index); + bimGeometry::Face f = GetFace(index); indexData[index * 3 + 0] = f.i2; indexData[index * 3 + 1] = f.i1; indexData[index * 3 + 2] = f.i0; @@ -373,7 +267,7 @@ namespace webifc::geometry { { for (uint32_t i = 0; i < geom.numFaces; i++) { - Face f = geom.GetFace(i); + bimGeometry::Face f = geom.GetFace(i); glm::dvec3 a = geom.GetPoint(f.i0); glm::dvec3 b = geom.GetPoint(f.i1); glm::dvec3 c = geom.GetPoint(f.i2); @@ -401,7 +295,7 @@ namespace webifc::geometry { { for (uint32_t i = 0; i < geom.numFaces; i++) { - Face f = geom.GetFace(i); + bimGeometry::Face f = geom.GetFace(i); glm::dvec3 a = geom.GetPoint(f.i0); glm::dvec3 b = geom.GetPoint(f.i1); glm::dvec3 c = geom.GetPoint(f.i2); diff --git a/src/cpp/web-ifc/geometry/representation/IfcGeometry.h b/src/cpp/web-ifc/geometry/representation/IfcGeometry.h index c7359d4af..54f3ef446 100644 --- a/src/cpp/web-ifc/geometry/representation/IfcGeometry.h +++ b/src/cpp/web-ifc/geometry/representation/IfcGeometry.h @@ -22,18 +22,9 @@ namespace webifc::geometry { constexpr int VERTEX_FORMAT_SIZE_FLOATS = bimGeometry::VERTEX_FORMAT_SIZE_FLOATS; - struct Plane + struct Plane : bimGeometry::Plane { - size_t id; - double distance; - Vec normal; - - bool IsEqualTo(const Vec &n, double d) const; - }; - - struct Face : bimGeometry::Face - { - int pId; + }; struct AABB : bimGeometry::AABB @@ -43,18 +34,9 @@ namespace webifc::geometry { struct Geometry : bimGeometry::Geometry { - std::vector planeData; - std::vector planes; - bool isPolygon = false; - bool hasPlanes = false; void BuildFromVectors(std::vector& d, std::vector& i); - void AddFace(glm::dvec3 a, glm::dvec3 b, glm::dvec3 c, uint32_t pId = -1); - void AddFace(uint32_t a, uint32_t b, uint32_t c, uint32_t pId = -1); - size_t AddPlane(const glm::dvec3 &normal, double d); - void buildPlanes(); - Face GetFace(size_t index) const; AABB GetFaceBox(size_t index) const; void GetCenterExtents(glm::dvec3& center, glm::dvec3& extents) const; Geometry Normalize(glm::dvec3 center, glm::dvec3 extents) const; @@ -72,6 +54,7 @@ namespace webifc::geometry { Vec halfSpaceZ = Vec(0, 0, 1); Vec halfSpaceOrigin = Vec(0, 0, 0); Vec normalizationCenter = Vec(0, 0, 0); + void ReverseFaces(); void AddPart(IfcGeometry geom); void AddPart(Geometry geom); diff --git a/src/cpp/web-ifc/parsing/IfcFileStream.cpp b/src/cpp/web-ifc/parsing/IfcFileStream.cpp index b8a6be05b..e46357dfa 100644 --- a/src/cpp/web-ifc/parsing/IfcFileStream.cpp +++ b/src/cpp/web-ifc/parsing/IfcFileStream.cpp @@ -3,7 +3,7 @@ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ #include "IfcTokenStream.h" - + namespace webifc::parsing { IfcTokenStream::IfcFileStream::IfcFileStream(const std::function &requestData, uint32_t size) : _dataSource(requestData), _size(size) @@ -83,4 +83,9 @@ { return _buffer[_pointer]; } + + IfcTokenStream::IfcFileStream* IfcTokenStream::IfcFileStream::Clone() { + IfcFileStream * newStream = new IfcFileStream(_dataSource,_size); + return newStream; + } } \ No newline at end of file diff --git a/src/cpp/web-ifc/parsing/IfcLoader.cpp b/src/cpp/web-ifc/parsing/IfcLoader.cpp index d5bf5499d..0b92c14d1 100644 --- a/src/cpp/web-ifc/parsing/IfcLoader.cpp +++ b/src/cpp/web-ifc/parsing/IfcLoader.cpp @@ -745,4 +745,12 @@ namespace webifc::parsing { return compressIfcGuid(generateStringUUID()); } + IfcLoader * IfcLoader::Clone() { + return new IfcLoader(_maxExpressId, _lineWriterBuffer,_schemaManager, _tokenStream->Clone(), _lines, _headerLines, _ifcTypeToExpressID); + } + + IfcLoader::IfcLoader(uint32_t maxExpressId,uint32_t lineWriterBuffer, const schema::IfcSchemaManager &schemaManager, IfcTokenStream * tokenStream, std::unordered_map &lines, std::vector &headerLines,std::unordered_map> &ifcTypeToExpressID) + : _maxExpressId(maxExpressId) , _lineWriterBuffer(lineWriterBuffer), _schemaManager(schemaManager), _tokenStream(tokenStream), _lines(lines) , _headerLines(headerLines), _ifcTypeToExpressID(ifcTypeToExpressID) + {} + } \ No newline at end of file diff --git a/src/cpp/web-ifc/parsing/IfcLoader.h b/src/cpp/web-ifc/parsing/IfcLoader.h index c2347bef5..cc906fd89 100644 --- a/src/cpp/web-ifc/parsing/IfcLoader.h +++ b/src/cpp/web-ifc/parsing/IfcLoader.h @@ -64,6 +64,7 @@ namespace webifc::parsing void PushDouble(double input); void PushInt(int input); std::string GenerateUUID() const; + IfcLoader* Clone(); uint32_t GetNextExpressID(uint32_t expressId) const; template void Push(T input) @@ -77,6 +78,7 @@ namespace webifc::parsing uint32_t ifcType; uint32_t tapeOffset; }; + IfcLoader(uint32_t maxExpressId, uint32_t lineWriterBuffer, const schema::IfcSchemaManager &schemaManager, IfcTokenStream * tokenStream, std::unordered_map &lines, std::vector &headerLines,std::unordered_map> &ifcTypeToExpressID); uint32_t _maxExpressId; const uint32_t _lineWriterBuffer; const schema::IfcSchemaManager &_schemaManager; diff --git a/src/cpp/web-ifc/parsing/IfcTokenStream.cpp b/src/cpp/web-ifc/parsing/IfcTokenStream.cpp index 6c28a8dd9..5e92b8c21 100644 --- a/src/cpp/web-ifc/parsing/IfcTokenStream.cpp +++ b/src/cpp/web-ifc/parsing/IfcTokenStream.cpp @@ -158,5 +158,13 @@ namespace webifc::parsing { return _cChunk->GetTokenRef() + _readPtr; } - + + IfcTokenStream * IfcTokenStream::Clone() { + IfcTokenStream * newStream = new IfcTokenStream(_activeChunks,_maxChunks,_chunks,_fileStream->Clone()); + return newStream; + } + + IfcTokenStream::IfcTokenStream(size_t activeChunks, uint64_t maxChunks, std::vector &chunks,IfcTokenStream::IfcFileStream * fileStream) : _activeChunks(activeChunks), _maxChunks(maxChunks), _chunks(chunks), _cChunk(&chunks[0]), _fileStream(fileStream) + {} + } \ No newline at end of file diff --git a/src/cpp/web-ifc/parsing/IfcTokenStream.h b/src/cpp/web-ifc/parsing/IfcTokenStream.h index 98ac9580d..a351f4826 100644 --- a/src/cpp/web-ifc/parsing/IfcTokenStream.h +++ b/src/cpp/web-ifc/parsing/IfcTokenStream.h @@ -60,6 +60,7 @@ namespace webifc::parsing void MoveTo(const size_t pos); size_t GetReadOffset(); size_t GetTotalSize(); + IfcTokenStream * Clone(); private: void checkMemory(); @@ -82,6 +83,7 @@ namespace webifc::parsing bool IsAtEnd(); char Get(); void Clear(); + IfcFileStream * Clone(); private: void load(); std::function _dataSource; @@ -95,7 +97,7 @@ namespace webifc::parsing class IfcTokenChunk { public: - IfcTokenChunk(const size_t chunkSize, const size_t startRef, const size_t fileStartRef, IfcFileStream *_fileStream); + IfcTokenChunk(const size_t chunkSize, const size_t startRef, const size_t fileStartRef, IfcTokenStream::IfcFileStream *_fileStream); bool Clear(bool force); bool Clear(); bool IsLoaded(); @@ -125,6 +127,7 @@ namespace webifc::parsing uint8_t *_chunkData; IfcFileStream *_fileStream; }; + IfcTokenStream(size_t activeChunks, uint64_t maxChunks, std::vector &chunks,IfcFileStream * fileStream); std::vector _chunks; IfcTokenChunk * _cChunk; IfcFileStream * _fileStream; diff --git a/src/ts/web-ifc-api.ts b/src/ts/web-ifc-api.ts index dcd1e6863..59be43c01 100644 --- a/src/ts/web-ifc-api.ts +++ b/src/ts/web-ifc-api.ts @@ -162,7 +162,9 @@ export interface AABB { export interface Extrusion { GetBuffers(): Buffers; - SetValues(profile_: Array, dir_: Array, len_: number): void; + SetValues(profile_: Array, dir_: Array, len_: number, cuttingPlaneNormal_: Array, cuttingPlanePos_: Array, cap_: boolean): void; + SetHoles(profile_: Array): void; + ClearHoles(): void; } export interface Sweep { @@ -178,6 +180,19 @@ export interface Sweep { ): void; } +export interface CircularSweep { + GetBuffers(): Buffers; + SetValues( + scaling: number, + closed: boolean, + profile: Array, + radius: number, + directrix: Array, + initialNormal?: Array, + rotate90?: boolean, + ): void; +} + export interface Revolution { GetBuffers(): Buffers; SetValues(profile_: Array, transform_: Array, startDegrees_: number, endDegrees_: number, numRots_: number): void; @@ -230,6 +245,28 @@ export interface Alignment { SetValues(horizontal: Array, vertical: Array): void; } +export interface BooleanOperator { + GetBuffers(): Buffers; + SetValues(triangles_: Array, type_: string): void; + SetSecond(triangles_: Array): void; + clear(): void; +} + +export interface ProfileSection { + GetBuffers(): Buffers; + SetValues( + pType: number, + width: number, + depth: number, + webThickness: number, + flangeThickness: number, + hasFillet: boolean, + filletRadius: number, + radius: number, + slope: number, + placement: Array): void; +} + export interface IfcType { typeID: number; typeName: string; @@ -523,6 +560,11 @@ export class IfcAPI { return this.wasmModule.CreateSweep(); } + CreateCircularSweep() + { + return this.wasmModule.CreateCircularSweep(); + } + CreateRevolution() { return this.wasmModule.CreateRevolution(); @@ -553,6 +595,15 @@ export class IfcAPI { return this.wasmModule.CreateAlignment(); } + CreateBooleanOperator() + { + return this.wasmModule.CreateBooleanOperator(); + } + + CreateProfile() + { + return this.wasmModule.CreateProfile(); + } /** * Gets the header information required by the user diff --git a/tests/regression/results.json b/tests/regression/results.json index 6d6af9b40..0a5d4e7df 100644 --- a/tests/regression/results.json +++ b/tests/regression/results.json @@ -1 +1 @@ -{"tests/ifcfiles/public/AC20-FZK-Haus.ifc":"ddbc072479c7d36c704a511816d277d42d5f11856475a8e13569ef3e54d57862","tests/ifcfiles/public/C20-Institute-Var-2.ifc":"84d23a1a3f4bbdc53cee769fe1a48d860eb8d53a11c74924d0b8aca8d5476f26","tests/ifcfiles/public/FM_ARC_DigitalHub.ifc":"4d05247c5ace2bd554ba639e3dd636643de6e1e6ccbdde896c33e6512b940fbc","tests/ifcfiles/public/ISSUE_005_haus.ifc":"ddbc072479c7d36c704a511816d277d42d5f11856475a8e13569ef3e54d57862","tests/ifcfiles/public/ISSUE_021_Mini Project.ifc":"aaa41aaf49e4347f533ee8a8c6b70f4c821a69784e3deddb2f342045319424b0","tests/ifcfiles/public/ISSUE_034_HouseZ.ifc":"38a9e8ff28a3703018dadda2b9af55953c5421d768a85f421792be8c9dc0aa2a","tests/ifcfiles/public/ISSUE_044_test_IFCCOMPOSITEPROFILEDEF.ifc":"c00b1a1495a76def126ce4e233084589f51982fbd274fccb3a49c7a28535602a","tests/ifcfiles/public/ISSUE_053_20181220Holter_Tower_10.ifczip":"80c14b20355d6be8598035cdd834a7161972600e85108b7e719e9cc32e064676","tests/ifcfiles/public/ISSUE_068_ARK_NUS_skolebygg.ifc":"c5547962bb01a63518943a1ac80d29fbbb58e3981c604a2690cca7f3798ab918","tests/ifcfiles/public/ISSUE_102_M3D-CON-CD.ifc":"3aa0563cd8d42b912c028f2366ac0eb858401f121b024fa1492900524df8c1e9","tests/ifcfiles/public/ISSUE_102_M3D-CON.ifc":"5ff99be059d4ef39dc8c1ff481db2d2f2c22608b0312bff1afb77c88ca3ad591","tests/ifcfiles/public/ISSUE_126_model.ifc":"ac346eadff1eb32f65c46fa5d079e26731bd3e7e002783aaf5f6563a8c3b8fac","tests/ifcfiles/public/ISSUE_129_N1540_17_EXE_MOD_448200_02_09_11SMC_IGC_V17.ifc":"b99a204ba4506ce03621df3312865b7f61e594d76555e9b3bf3737c0bf6eaa8f","tests/ifcfiles/public/ISSUE_159_kleine_Wohnung_R22.ifc":"e4fed6ffed535fa2d7a37d1d20ea72bb28cd79eeba4943cbe3c5a47af10df480","tests/ifcfiles/public/ISSUE_171_IfcSurfaceCurveSweptAreaSolid.ifc":"0c8ed6afc3e7cf9a8d1b0512bd08b71d58d31105e012a0870243c0af829c5136","tests/ifcfiles/public/IfcOpenHouse_IFC4.ifc":"f6ea0ab3e381f6f1fd7f7090671a01cd33e30f789f7f1726721c67773ce030c6","tests/ifcfiles/public/KIT-Simple-Road-Test-Web-IFC4x3_RC2.ifc":"40e80188f399629289c7f1c8eb85354cd934965b95d7b85cad8d317c9059e25d","tests/ifcfiles/public/Office_A_20110811.ifc":"239af8e0c81dc58237290a05fed141497c1984d947fb468eee926e2477577123","tests/ifcfiles/public/S_Office_Integrated Design Archi.ifc":"b068507a9f42d5af91602ebbcf0e3f22bb2dab9cd3815425a5e01682c4201c3b","tests/ifcfiles/public/Sample_entities.ifc":"6103f60e8c998be307700e25705a7c7cd32aabb33227e4d2680cb37d76619d5f","tests/ifcfiles/public/advanced_model.ifc":"a6d1757016a16e62d8b081cc21860e0f508cdf1ea8e99696dbe2f1a789cedf86","tests/ifcfiles/public/dental_clinic.ifc":"cb3c048989870bcf8cea0763a50860eb804d99dfbbbafeee613491a4275a1876","tests/ifcfiles/public/duplex.ifc":"d851c33e73c05abeb2bb025ae2557d04338658aaeb74370a641e0f4ee63befbc","tests/ifcfiles/public/example.ifc":"dbe17b9adc264086cebd8de862f0b065ad574a014dca7a3973e93b1fef4430b1","tests/ifcfiles/public/ifcbridge-model01.ifc":"75fb287b92c5935ee3d2c1a0fd0c4a597fc6d21aa7445e39b2b8ce5c972f2a31","tests/ifcfiles/public/schependomlaan.ifc":"2259466c4fad90a85c3322d1a4154d06c2eb9041d6e3f97949939653a8e99838","tests/ifcfiles/public/tested_sample_project.ifc":"7f4177f29381300110864c4db0af1ec1ff5b5ffede21591e1eaeeb07f942bd3d"} \ No newline at end of file +{"tests/ifcfiles/public/AC20-FZK-Haus.ifc":"bba61781d1f1f69c48c79696a37c49a2bbdfd2de5c9c514ff68b561ead542908","tests/ifcfiles/public/C20-Institute-Var-2.ifc":"eb5016f053363bfa2ce77c01c1fafee0a0841e9a3cd2bad9973b4e2801161450","tests/ifcfiles/public/FM_ARC_DigitalHub.ifc":"c228a28b5608e84ab76870e47c6de5e20dae8041ab076f2523ecd306786c3e17","tests/ifcfiles/public/ISSUE_005_haus.ifc":"bba61781d1f1f69c48c79696a37c49a2bbdfd2de5c9c514ff68b561ead542908","tests/ifcfiles/public/ISSUE_021_Mini Project.ifc":"c3d3563790d60b3c7a52206fc1349625bcfa1fbd93dab519331a45253f5e92b6","tests/ifcfiles/public/ISSUE_034_HouseZ.ifc":"10bae310054219278c55d6679f6f139a82969889bd6572fbd2915b8d3c426f40","tests/ifcfiles/public/ISSUE_044_test_IFCCOMPOSITEPROFILEDEF.ifc":"eca6349e99ab66ef1add1c7e68cac452773e5fc0158093fda8d6d37a996a49cd","tests/ifcfiles/public/ISSUE_053_20181220Holter_Tower_10.ifczip":"44ebe8b67596c8d5a143f64245a242350779d392f76e32765fe32b5f0fdc8150","tests/ifcfiles/public/ISSUE_068_ARK_NUS_skolebygg.ifc":"cce1f0e03d6573fc65c6221690c1e6997a987fa34d28a000cce12ba466e965cc","tests/ifcfiles/public/ISSUE_102_M3D-CON-CD.ifc":"2caedc92e178e61881d370d972022718d44b3cb15bca6adeb9435f3bfc067169","tests/ifcfiles/public/ISSUE_102_M3D-CON.ifc":"2bbd92e9439587a2c02099f1e44aa88ea61431259f78a0d7fc9c9fed47716037","tests/ifcfiles/public/ISSUE_126_model.ifc":"5eb95ff56cf759485480aed4f52a76099477cb0adf4cf96881a665b2c49b8e9a","tests/ifcfiles/public/ISSUE_129_N1540_17_EXE_MOD_448200_02_09_11SMC_IGC_V17.ifc":"5f7e4cbbc2f754756bcf3fc0d39c9f39abc8c2e74d7250dd60c090d468d570ce","tests/ifcfiles/public/ISSUE_159_kleine_Wohnung_R22.ifc":"265a028363a6357deff752cc96e017c8745fa38b41b3f989654f616ddc6bb061","tests/ifcfiles/public/ISSUE_171_IfcSurfaceCurveSweptAreaSolid.ifc":"1b0e1dae1d15cbf5d57fea5db70eeed8d06782847e58aab078c603a86cb23ae6","tests/ifcfiles/public/IfcOpenHouse_IFC4.ifc":"2168710572a6ba420c30615be9460020d1d746f2450ff0b537f011b31cf21b2d","tests/ifcfiles/public/KIT-Simple-Road-Test-Web-IFC4x3_RC2.ifc":"23264cb32782d2be185f515df461051a9859418b67c72ae13f07be8f6197b0e1","tests/ifcfiles/public/Office_A_20110811.ifc":"aec659a1720390cb307837c45dbea11c11f39177865b6c9a960f99bfd359a54e","tests/ifcfiles/public/S_Office_Integrated Design Archi.ifc":"f6163d49b069cc9495c90ce88647b8885cfb9c66c7734f98a09558578a037f75","tests/ifcfiles/public/Sample_entities.ifc":"1fdc55a7d0875f725b36cdcfb0a2b8689d067eb87d30d255d92f78062c431acd","tests/ifcfiles/public/advanced_model.ifc":"337ec9629e9ddad5988566ae4ead636a0a771f5180b4acf89f2fe8d89f49a2e6","tests/ifcfiles/public/dental_clinic.ifc":"4aa67cfe9af8b2ea407d0111a62d1cc95ed24466bdbc63ec494ae2654c571167","tests/ifcfiles/public/duplex.ifc":"41e59ee8204cb486c821cea7b2644ae616736a76102de74a9c0d4f11dad04610","tests/ifcfiles/public/example.ifc":"2c93045416df8b88b774fbc85c6948261d8c542e254f52d669d489c9eef2bb3d","tests/ifcfiles/public/ifcbridge-model01.ifc":"42d19b18aa19116ab0bb687d6c78845dc8e21dac9dc027e0e9f92fb60f7a966f","tests/ifcfiles/public/schependomlaan.ifc":"cc1642da14c677c77f055a920baef201dec5ea8efefe804ad0be11a88312558c","tests/ifcfiles/public/tested_sample_project.ifc":"06991f289ebb8a79ae2f918aa9991eafa9fd10125f225e5dd662afffd8f8eb62"} \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index c5ba20cd1..8f1dba7e6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -18,114 +18,114 @@ "@jridgewell/gen-mapping" "^0.3.5" "@jridgewell/trace-mapping" "^0.3.24" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.26.2": - version "7.26.2" - resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz" - integrity sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ== +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz" + integrity sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg== dependencies: - "@babel/helper-validator-identifier" "^7.25.9" + "@babel/helper-validator-identifier" "^7.27.1" js-tokens "^4.0.0" - picocolors "^1.0.0" + picocolors "^1.1.1" -"@babel/compat-data@^7.26.8": - version "7.26.8" - resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.8.tgz" - integrity sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ== +"@babel/compat-data@^7.27.2": + version "7.27.2" + resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.27.2.tgz" + integrity sha512-TUtMJYRPyUb/9aU8f3K0mjmjf6M9N5Woshn2CS6nqJSeJtTtQcpLUXjGt9vbF8ZGff0El99sWkLgzwW3VXnxZQ== "@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.23.9": - version "7.26.10" - resolved "https://registry.npmjs.org/@babel/core/-/core-7.26.10.tgz" - integrity sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ== + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/core/-/core-7.27.1.tgz" + integrity sha512-IaaGWsQqfsQWVLqMn9OB92MNN7zukfVA4s7KKAI0KfrrDsZ0yhi5uV4baBuLuN7n3vsZpwP8asPPcVwApxvjBQ== dependencies: "@ampproject/remapping" "^2.2.0" - "@babel/code-frame" "^7.26.2" - "@babel/generator" "^7.26.10" - "@babel/helper-compilation-targets" "^7.26.5" - "@babel/helper-module-transforms" "^7.26.0" - "@babel/helpers" "^7.26.10" - "@babel/parser" "^7.26.10" - "@babel/template" "^7.26.9" - "@babel/traverse" "^7.26.10" - "@babel/types" "^7.26.10" + "@babel/code-frame" "^7.27.1" + "@babel/generator" "^7.27.1" + "@babel/helper-compilation-targets" "^7.27.1" + "@babel/helper-module-transforms" "^7.27.1" + "@babel/helpers" "^7.27.1" + "@babel/parser" "^7.27.1" + "@babel/template" "^7.27.1" + "@babel/traverse" "^7.27.1" + "@babel/types" "^7.27.1" convert-source-map "^2.0.0" debug "^4.1.0" gensync "^1.0.0-beta.2" json5 "^2.2.3" semver "^6.3.1" -"@babel/generator@^7.26.10", "@babel/generator@^7.27.0", "@babel/generator@^7.7.2": - version "7.27.0" - resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.27.0.tgz" - integrity sha512-VybsKvpiN1gU1sdMZIp7FcqphVVKEwcuj02x73uvcHE0PTihx1nlBcowYWhDwjpoAXRv43+gDzyggGnn1XZhVw== +"@babel/generator@^7.27.1", "@babel/generator@^7.27.3", "@babel/generator@^7.7.2": + version "7.27.5" + resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.27.5.tgz" + integrity sha512-ZGhA37l0e/g2s1Cnzdix0O3aLYm66eF8aufiVteOgnwxgnRP8GoyMj7VWsgWnQbVKXyge7hqrFh2K2TQM6t1Hw== dependencies: - "@babel/parser" "^7.27.0" - "@babel/types" "^7.27.0" + "@babel/parser" "^7.27.5" + "@babel/types" "^7.27.3" "@jridgewell/gen-mapping" "^0.3.5" "@jridgewell/trace-mapping" "^0.3.25" jsesc "^3.0.2" -"@babel/helper-compilation-targets@^7.26.5": - version "7.27.0" - resolved "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.0.tgz" - integrity sha512-LVk7fbXml0H2xH34dFzKQ7TDZ2G4/rVTOrq9V+icbbadjbVxxeFeDsNHv2SrZeWoA+6ZiTyWYWtScEIW07EAcA== +"@babel/helper-compilation-targets@^7.27.1": + version "7.27.2" + resolved "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz" + integrity sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ== dependencies: - "@babel/compat-data" "^7.26.8" - "@babel/helper-validator-option" "^7.25.9" + "@babel/compat-data" "^7.27.2" + "@babel/helper-validator-option" "^7.27.1" browserslist "^4.24.0" lru-cache "^5.1.1" semver "^6.3.1" -"@babel/helper-module-imports@^7.25.9": - version "7.25.9" - resolved "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz" - integrity sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw== +"@babel/helper-module-imports@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz" + integrity sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w== dependencies: - "@babel/traverse" "^7.25.9" - "@babel/types" "^7.25.9" + "@babel/traverse" "^7.27.1" + "@babel/types" "^7.27.1" -"@babel/helper-module-transforms@^7.26.0": - version "7.26.0" - resolved "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz" - integrity sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw== +"@babel/helper-module-transforms@^7.27.1": + version "7.27.3" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.27.3.tgz#db0bbcfba5802f9ef7870705a7ef8788508ede02" + integrity sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg== dependencies: - "@babel/helper-module-imports" "^7.25.9" - "@babel/helper-validator-identifier" "^7.25.9" - "@babel/traverse" "^7.25.9" + "@babel/helper-module-imports" "^7.27.1" + "@babel/helper-validator-identifier" "^7.27.1" + "@babel/traverse" "^7.27.3" -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.25.9", "@babel/helper-plugin-utils@^7.8.0": - version "7.26.5" - resolved "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz" - integrity sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg== +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.27.1", "@babel/helper-plugin-utils@^7.8.0": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz" + integrity sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw== -"@babel/helper-string-parser@^7.25.9": - version "7.25.9" - resolved "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz" - integrity sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA== +"@babel/helper-string-parser@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz" + integrity sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA== -"@babel/helper-validator-identifier@^7.25.9": - version "7.25.9" - resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz" - integrity sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ== +"@babel/helper-validator-identifier@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz" + integrity sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow== -"@babel/helper-validator-option@^7.25.9": - version "7.25.9" - resolved "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz" - integrity sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw== +"@babel/helper-validator-option@^7.27.1": + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz" + integrity sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg== -"@babel/helpers@^7.26.10": - version "7.27.0" - resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.0.tgz" - integrity sha512-U5eyP/CTFPuNE3qk+WZMxFkp/4zUzdceQlfzf7DdGdhp+Fezd7HD+i8Y24ZuTMKX3wQBld449jijbGq6OdGNQg== +"@babel/helpers@^7.27.1": + version "7.27.6" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.27.6.tgz#6456fed15b2cb669d2d1fabe84b66b34991d812c" + integrity sha512-muE8Tt8M22638HU31A3CgfSUciwz1fhATfoVai05aPXGor//CdWDCbnlY1yvBPo07njuVOCNGCSp/GTt12lIug== dependencies: - "@babel/template" "^7.27.0" - "@babel/types" "^7.27.0" + "@babel/template" "^7.27.2" + "@babel/types" "^7.27.6" -"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.23.9", "@babel/parser@^7.26.10", "@babel/parser@^7.27.0": - version "7.27.0" - resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.27.0.tgz" - integrity sha512-iaepho73/2Pz7w2eMS0Q5f83+0RKI7i4xmiYeBmDzfRVbQtTOG7Ts0S4HzJVsTMGI9keU8rNfuZr8DKfSt7Yyg== +"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.23.9", "@babel/parser@^7.27.1", "@babel/parser@^7.27.2", "@babel/parser@^7.27.4", "@babel/parser@^7.27.5": + version "7.27.5" + resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.27.5.tgz" + integrity sha512-OsQd175SxWkGlzbny8J3K8TnnDD0N3lrIUtB92xwyRpzaenGZhxDvxN/JgU00U3CDZNj9tPuDJ5H0WS4Nt3vKg== dependencies: - "@babel/types" "^7.27.0" + "@babel/types" "^7.27.3" "@babel/plugin-syntax-async-generators@^7.8.4": version "7.8.4" @@ -156,11 +156,11 @@ "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-import-attributes@^7.24.7": - version "7.26.0" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.26.0.tgz" - integrity sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A== + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.27.1.tgz" + integrity sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww== dependencies: - "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-plugin-utils" "^7.27.1" "@babel/plugin-syntax-import-meta@^7.10.4": version "7.10.4" @@ -177,11 +177,11 @@ "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-jsx@^7.7.2": - version "7.25.9" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.9.tgz" - integrity sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA== + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.27.1.tgz" + integrity sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w== dependencies: - "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-plugin-utils" "^7.27.1" "@babel/plugin-syntax-logical-assignment-operators@^7.10.4": version "7.10.4" @@ -240,41 +240,41 @@ "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-typescript@^7.7.2": - version "7.25.9" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.9.tgz" - integrity sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ== - dependencies: - "@babel/helper-plugin-utils" "^7.25.9" - -"@babel/template@^7.26.9", "@babel/template@^7.27.0", "@babel/template@^7.3.3": - version "7.27.0" - resolved "https://registry.npmjs.org/@babel/template/-/template-7.27.0.tgz" - integrity sha512-2ncevenBqXI6qRMukPlXwHKHchC7RyMuu4xv5JBXRfOGVcTy1mXCD12qrp7Jsoxll1EV3+9sE4GugBVRjT2jFA== - dependencies: - "@babel/code-frame" "^7.26.2" - "@babel/parser" "^7.27.0" - "@babel/types" "^7.27.0" - -"@babel/traverse@^7.25.9", "@babel/traverse@^7.26.10": - version "7.27.0" - resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.0.tgz" - integrity sha512-19lYZFzYVQkkHkl4Cy4WrAVcqBkgvV2YM2TU3xG6DIwO7O3ecbDPfW3yM3bjAGcqcQHi+CCtjMR3dIEHxsd6bA== - dependencies: - "@babel/code-frame" "^7.26.2" - "@babel/generator" "^7.27.0" - "@babel/parser" "^7.27.0" - "@babel/template" "^7.27.0" - "@babel/types" "^7.27.0" + version "7.27.1" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.27.1.tgz" + integrity sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" + +"@babel/template@^7.27.1", "@babel/template@^7.27.2", "@babel/template@^7.3.3": + version "7.27.2" + resolved "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz" + integrity sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw== + dependencies: + "@babel/code-frame" "^7.27.1" + "@babel/parser" "^7.27.2" + "@babel/types" "^7.27.1" + +"@babel/traverse@^7.27.1", "@babel/traverse@^7.27.3": + version "7.27.4" + resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.4.tgz" + integrity sha512-oNcu2QbHqts9BtOWJosOVJapWjBDSxGCpFvikNR5TGDYDQf3JwpIoMzIKrvfoti93cLfPJEG4tH9SPVeyCGgdA== + dependencies: + "@babel/code-frame" "^7.27.1" + "@babel/generator" "^7.27.3" + "@babel/parser" "^7.27.4" + "@babel/template" "^7.27.2" + "@babel/types" "^7.27.3" debug "^4.3.1" globals "^11.1.0" -"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.25.9", "@babel/types@^7.26.10", "@babel/types@^7.27.0", "@babel/types@^7.3.3": - version "7.27.0" - resolved "https://registry.npmjs.org/@babel/types/-/types-7.27.0.tgz" - integrity sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg== +"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.27.1", "@babel/types@^7.27.3", "@babel/types@^7.27.6", "@babel/types@^7.3.3": + version "7.27.6" + resolved "https://registry.npmjs.org/@babel/types/-/types-7.27.6.tgz" + integrity sha512-ETyHEk2VHHvl9b9jZP5IHPavHYk57EhanlRRuae9XCpb/j5bDCbPPMOBfCWhnl/7EDJz0jEMCi/RhccCE8r1+Q== dependencies: - "@babel/helper-string-parser" "^7.25.9" - "@babel/helper-validator-identifier" "^7.25.9" + "@babel/helper-string-parser" "^7.27.1" + "@babel/helper-validator-identifier" "^7.27.1" "@bcoe/v8-coverage@^0.2.3": version "0.2.3" @@ -288,140 +288,145 @@ dependencies: "@jridgewell/trace-mapping" "0.3.9" -"@esbuild/aix-ppc64@0.25.3": - version "0.25.3" - resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.25.3.tgz#014180d9a149cffd95aaeead37179433f5ea5437" - integrity sha512-W8bFfPA8DowP8l//sxjJLSLkD8iEjMc7cBVyP+u4cEv9sM7mdUCkgsj+t0n/BWPFtv7WWCN5Yzj0N6FJNUUqBQ== - -"@esbuild/android-arm64@0.25.3": - version "0.25.3" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.25.3.tgz#649e47e04ddb24a27dc05c395724bc5f4c55cbfe" - integrity sha512-XelR6MzjlZuBM4f5z2IQHK6LkK34Cvv6Rj2EntER3lwCBFdg6h2lKbtRjpTTsdEjD/WSe1q8UyPBXP1x3i/wYQ== - -"@esbuild/android-arm@0.25.3": - version "0.25.3" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.25.3.tgz#8a0f719c8dc28a4a6567ef7328c36ea85f568ff4" - integrity sha512-PuwVXbnP87Tcff5I9ngV0lmiSu40xw1At6i3GsU77U7cjDDB4s0X2cyFuBiDa1SBk9DnvWwnGvVaGBqoFWPb7A== - -"@esbuild/android-x64@0.25.3": - version "0.25.3" - resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.25.3.tgz#e2ab182d1fd06da9bef0784a13c28a7602d78009" - integrity sha512-ogtTpYHT/g1GWS/zKM0cc/tIebFjm1F9Aw1boQ2Y0eUQ+J89d0jFY//s9ei9jVIlkYi8AfOjiixcLJSGNSOAdQ== - -"@esbuild/darwin-arm64@0.25.3": - version "0.25.3" - resolved "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.3.tgz" - integrity sha512-eESK5yfPNTqpAmDfFWNsOhmIOaQA59tAcF/EfYvo5/QWQCzXn5iUSOnqt3ra3UdzBv073ykTtmeLJZGt3HhA+w== - -"@esbuild/darwin-x64@0.25.3": - version "0.25.3" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.25.3.tgz#d8c5342ec1a4bf4b1915643dfe031ba4b173a87a" - integrity sha512-Kd8glo7sIZtwOLcPbW0yLpKmBNWMANZhrC1r6K++uDR2zyzb6AeOYtI6udbtabmQpFaxJ8uduXMAo1gs5ozz8A== - -"@esbuild/freebsd-arm64@0.25.3": - version "0.25.3" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.3.tgz#9f7d789e2eb7747d4868817417cc968ffa84f35b" - integrity sha512-EJiyS70BYybOBpJth3M0KLOus0n+RRMKTYzhYhFeMwp7e/RaajXvP+BWlmEXNk6uk+KAu46j/kaQzr6au+JcIw== - -"@esbuild/freebsd-x64@0.25.3": - version "0.25.3" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.25.3.tgz#8ad35c51d084184a8e9e76bb4356e95350a64709" - integrity sha512-Q+wSjaLpGxYf7zC0kL0nDlhsfuFkoN+EXrx2KSB33RhinWzejOd6AvgmP5JbkgXKmjhmpfgKZq24pneodYqE8Q== - -"@esbuild/linux-arm64@0.25.3": - version "0.25.3" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.25.3.tgz#3af0da3d9186092a9edd4e28fa342f57d9e3cd30" - integrity sha512-xCUgnNYhRD5bb1C1nqrDV1PfkwgbswTTBRbAd8aH5PhYzikdf/ddtsYyMXFfGSsb/6t6QaPSzxtbfAZr9uox4A== - -"@esbuild/linux-arm@0.25.3": - version "0.25.3" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.25.3.tgz#e91cafa95e4474b3ae3d54da12e006b782e57225" - integrity sha512-dUOVmAUzuHy2ZOKIHIKHCm58HKzFqd+puLaS424h6I85GlSDRZIA5ycBixb3mFgM0Jdh+ZOSB6KptX30DD8YOQ== - -"@esbuild/linux-ia32@0.25.3": - version "0.25.3" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.25.3.tgz#81025732d85b68ee510161b94acdf7e3007ea177" - integrity sha512-yplPOpczHOO4jTYKmuYuANI3WhvIPSVANGcNUeMlxH4twz/TeXuzEP41tGKNGWJjuMhotpGabeFYGAOU2ummBw== - -"@esbuild/linux-loong64@0.25.3": - version "0.25.3" - resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.25.3.tgz#3c744e4c8d5e1148cbe60a71a11b58ed8ee5deb8" - integrity sha512-P4BLP5/fjyihmXCELRGrLd793q/lBtKMQl8ARGpDxgzgIKJDRJ/u4r1A/HgpBpKpKZelGct2PGI4T+axcedf6g== - -"@esbuild/linux-mips64el@0.25.3": - version "0.25.3" - resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.25.3.tgz#1dfe2a5d63702db9034cc6b10b3087cc0424ec26" - integrity sha512-eRAOV2ODpu6P5divMEMa26RRqb2yUoYsuQQOuFUexUoQndm4MdpXXDBbUoKIc0iPa4aCO7gIhtnYomkn2x+bag== - -"@esbuild/linux-ppc64@0.25.3": - version "0.25.3" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.25.3.tgz#2e85d9764c04a1ebb346dc0813ea05952c9a5c56" - integrity sha512-ZC4jV2p7VbzTlnl8nZKLcBkfzIf4Yad1SJM4ZMKYnJqZFD4rTI+pBG65u8ev4jk3/MPwY9DvGn50wi3uhdaghg== - -"@esbuild/linux-riscv64@0.25.3": - version "0.25.3" - resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.25.3.tgz#a9ea3334556b09f85ccbfead58c803d305092415" - integrity sha512-LDDODcFzNtECTrUUbVCs6j9/bDVqy7DDRsuIXJg6so+mFksgwG7ZVnTruYi5V+z3eE5y+BJZw7VvUadkbfg7QA== - -"@esbuild/linux-s390x@0.25.3": - version "0.25.3" - resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.25.3.tgz#f6a7cb67969222b200974de58f105dfe8e99448d" - integrity sha512-s+w/NOY2k0yC2p9SLen+ymflgcpRkvwwa02fqmAwhBRI3SC12uiS10edHHXlVWwfAagYSY5UpmT/zISXPMW3tQ== - -"@esbuild/linux-x64@0.25.3": - version "0.25.3" - resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.25.3.tgz#a237d3578ecdd184a3066b1f425e314ade0f8033" - integrity sha512-nQHDz4pXjSDC6UfOE1Fw9Q8d6GCAd9KdvMZpfVGWSJztYCarRgSDfOVBY5xwhQXseiyxapkiSJi/5/ja8mRFFA== - -"@esbuild/netbsd-arm64@0.25.3": - version "0.25.3" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.3.tgz#4c15c68d8149614ddb6a56f9c85ae62ccca08259" - integrity sha512-1QaLtOWq0mzK6tzzp0jRN3eccmN3hezey7mhLnzC6oNlJoUJz4nym5ZD7mDnS/LZQgkrhEbEiTn515lPeLpgWA== - -"@esbuild/netbsd-x64@0.25.3": - version "0.25.3" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.25.3.tgz#12f6856f8c54c2d7d0a8a64a9711c01a743878d5" - integrity sha512-i5Hm68HXHdgv8wkrt+10Bc50zM0/eonPb/a/OFVfB6Qvpiirco5gBA5bz7S2SHuU+Y4LWn/zehzNX14Sp4r27g== - -"@esbuild/openbsd-arm64@0.25.3": - version "0.25.3" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.3.tgz#ca078dad4a34df192c60233b058db2ca3d94bc5c" - integrity sha512-zGAVApJEYTbOC6H/3QBr2mq3upG/LBEXr85/pTtKiv2IXcgKV0RT0QA/hSXZqSvLEpXeIxah7LczB4lkiYhTAQ== - -"@esbuild/openbsd-x64@0.25.3": - version "0.25.3" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.25.3.tgz#c9178adb60e140e03a881d0791248489c79f95b2" - integrity sha512-fpqctI45NnCIDKBH5AXQBsD0NDPbEFczK98hk/aa6HJxbl+UtLkJV2+Bvy5hLSLk3LHmqt0NTkKNso1A9y1a4w== - -"@esbuild/sunos-x64@0.25.3": - version "0.25.3" - resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.25.3.tgz#03765eb6d4214ff27e5230af779e80790d1ee09f" - integrity sha512-ROJhm7d8bk9dMCUZjkS8fgzsPAZEjtRJqCAmVgB0gMrvG7hfmPmz9k1rwO4jSiblFjYmNvbECL9uhaPzONMfgA== - -"@esbuild/win32-arm64@0.25.3": - version "0.25.3" - resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.25.3.tgz#f1c867bd1730a9b8dfc461785ec6462e349411ea" - integrity sha512-YWcow8peiHpNBiIXHwaswPnAXLsLVygFwCB3A7Bh5jRkIBFWHGmNQ48AlX4xDvQNoMZlPYzjVOQDYEzWCqufMQ== - -"@esbuild/win32-ia32@0.25.3": - version "0.25.3" - resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.25.3.tgz#77491f59ef6c9ddf41df70670d5678beb3acc322" - integrity sha512-qspTZOIGoXVS4DpNqUYUs9UxVb04khS1Degaw/MnfMe7goQ3lTfQ13Vw4qY/Nj0979BGvMRpAYbs/BAxEvU8ew== - -"@esbuild/win32-x64@0.25.3": - version "0.25.3" - resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.25.3.tgz#b17a2171f9074df9e91bfb07ef99a892ac06412a" - integrity sha512-ICgUR+kPimx0vvRzf+N/7L7tVSQeE3BYY+NhHRHXS1kBuPO7z2+7ea2HbhDyZdTephgvNvKrlDDKUexuCVBVvg== +"@dimforge/rapier3d-compat@^0.12.0": + version "0.12.0" + resolved "https://registry.npmjs.org/@dimforge/rapier3d-compat/-/rapier3d-compat-0.12.0.tgz" + integrity sha512-uekIGetywIgopfD97oDL5PfeezkFpNhwlzlaEYNOA0N6ghdsOvh/HYjSMek5Q2O1PYvRSDFcqFVJl4r4ZBwOow== + +"@esbuild/aix-ppc64@0.25.5": + version "0.25.5" + resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.25.5.tgz#4e0f91776c2b340e75558f60552195f6fad09f18" + integrity sha512-9o3TMmpmftaCMepOdA5k/yDw8SfInyzWWTjYTFCX3kPSDJMROQTb8jg+h9Cnwnmm1vOzvxN7gIfB5V2ewpjtGA== + +"@esbuild/android-arm64@0.25.5": + version "0.25.5" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.25.5.tgz#bc766407f1718923f6b8079c8c61bf86ac3a6a4f" + integrity sha512-VGzGhj4lJO+TVGV1v8ntCZWJktV7SGCs3Pn1GRWI1SBFtRALoomm8k5E9Pmwg3HOAal2VDc2F9+PM/rEY6oIDg== + +"@esbuild/android-arm@0.25.5": + version "0.25.5" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.25.5.tgz#4290d6d3407bae3883ad2cded1081a234473ce26" + integrity sha512-AdJKSPeEHgi7/ZhuIPtcQKr5RQdo6OO2IL87JkianiMYMPbCtot9fxPbrMiBADOWWm3T2si9stAiVsGbTQFkbA== + +"@esbuild/android-x64@0.25.5": + version "0.25.5" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.25.5.tgz#40c11d9cbca4f2406548c8a9895d321bc3b35eff" + integrity sha512-D2GyJT1kjvO//drbRT3Hib9XPwQeWd9vZoBJn+bu/lVsOZ13cqNdDeqIF/xQ5/VmWvMduP6AmXvylO/PIc2isw== + +"@esbuild/darwin-arm64@0.25.5": + version "0.25.5" + resolved "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.5.tgz" + integrity sha512-GtaBgammVvdF7aPIgH2jxMDdivezgFu6iKpmT+48+F8Hhg5J/sfnDieg0aeG/jfSvkYQU2/pceFPDKlqZzwnfQ== + +"@esbuild/darwin-x64@0.25.5": + version "0.25.5" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.25.5.tgz#e27a5d92a14886ef1d492fd50fc61a2d4d87e418" + integrity sha512-1iT4FVL0dJ76/q1wd7XDsXrSW+oLoquptvh4CLR4kITDtqi2e/xwXwdCVH8hVHU43wgJdsq7Gxuzcs6Iq/7bxQ== + +"@esbuild/freebsd-arm64@0.25.5": + version "0.25.5" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.5.tgz#97cede59d638840ca104e605cdb9f1b118ba0b1c" + integrity sha512-nk4tGP3JThz4La38Uy/gzyXtpkPW8zSAmoUhK9xKKXdBCzKODMc2adkB2+8om9BDYugz+uGV7sLmpTYzvmz6Sw== + +"@esbuild/freebsd-x64@0.25.5": + version "0.25.5" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.25.5.tgz#71c77812042a1a8190c3d581e140d15b876b9c6f" + integrity sha512-PrikaNjiXdR2laW6OIjlbeuCPrPaAl0IwPIaRv+SMV8CiM8i2LqVUHFC1+8eORgWyY7yhQY+2U2fA55mBzReaw== + +"@esbuild/linux-arm64@0.25.5": + version "0.25.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.25.5.tgz#f7b7c8f97eff8ffd2e47f6c67eb5c9765f2181b8" + integrity sha512-Z9kfb1v6ZlGbWj8EJk9T6czVEjjq2ntSYLY2cw6pAZl4oKtfgQuS4HOq41M/BcoLPzrUbNd+R4BXFyH//nHxVg== + +"@esbuild/linux-arm@0.25.5": + version "0.25.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.25.5.tgz#2a0be71b6cd8201fa559aea45598dffabc05d911" + integrity sha512-cPzojwW2okgh7ZlRpcBEtsX7WBuqbLrNXqLU89GxWbNt6uIg78ET82qifUy3W6OVww6ZWobWub5oqZOVtwolfw== + +"@esbuild/linux-ia32@0.25.5": + version "0.25.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.25.5.tgz#763414463cd9ea6fa1f96555d2762f9f84c61783" + integrity sha512-sQ7l00M8bSv36GLV95BVAdhJ2QsIbCuCjh/uYrWiMQSUuV+LpXwIqhgJDcvMTj+VsQmqAHL2yYaasENvJ7CDKA== + +"@esbuild/linux-loong64@0.25.5": + version "0.25.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.25.5.tgz#428cf2213ff786a502a52c96cf29d1fcf1eb8506" + integrity sha512-0ur7ae16hDUC4OL5iEnDb0tZHDxYmuQyhKhsPBV8f99f6Z9KQM02g33f93rNH5A30agMS46u2HP6qTdEt6Q1kg== + +"@esbuild/linux-mips64el@0.25.5": + version "0.25.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.25.5.tgz#5cbcc7fd841b4cd53358afd33527cd394e325d96" + integrity sha512-kB/66P1OsHO5zLz0i6X0RxlQ+3cu0mkxS3TKFvkb5lin6uwZ/ttOkP3Z8lfR9mJOBk14ZwZ9182SIIWFGNmqmg== + +"@esbuild/linux-ppc64@0.25.5": + version "0.25.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.25.5.tgz#0d954ab39ce4f5e50f00c4f8c4fd38f976c13ad9" + integrity sha512-UZCmJ7r9X2fe2D6jBmkLBMQetXPXIsZjQJCjgwpVDz+YMcS6oFR27alkgGv3Oqkv07bxdvw7fyB71/olceJhkQ== + +"@esbuild/linux-riscv64@0.25.5": + version "0.25.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.25.5.tgz#0e7dd30730505abd8088321e8497e94b547bfb1e" + integrity sha512-kTxwu4mLyeOlsVIFPfQo+fQJAV9mh24xL+y+Bm6ej067sYANjyEw1dNHmvoqxJUCMnkBdKpvOn0Ahql6+4VyeA== + +"@esbuild/linux-s390x@0.25.5": + version "0.25.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.25.5.tgz#5669af81327a398a336d7e40e320b5bbd6e6e72d" + integrity sha512-K2dSKTKfmdh78uJ3NcWFiqyRrimfdinS5ErLSn3vluHNeHVnBAFWC8a4X5N+7FgVE1EjXS1QDZbpqZBjfrqMTQ== + +"@esbuild/linux-x64@0.25.5": + version "0.25.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.25.5.tgz#b2357dd153aa49038967ddc1ffd90c68a9d2a0d4" + integrity sha512-uhj8N2obKTE6pSZ+aMUbqq+1nXxNjZIIjCjGLfsWvVpy7gKCOL6rsY1MhRh9zLtUtAI7vpgLMK6DxjO8Qm9lJw== + +"@esbuild/netbsd-arm64@0.25.5": + version "0.25.5" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.5.tgz#53b4dfb8fe1cee93777c9e366893bd3daa6ba63d" + integrity sha512-pwHtMP9viAy1oHPvgxtOv+OkduK5ugofNTVDilIzBLpoWAM16r7b/mxBvfpuQDpRQFMfuVr5aLcn4yveGvBZvw== + +"@esbuild/netbsd-x64@0.25.5": + version "0.25.5" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.25.5.tgz#a0206f6314ce7dc8713b7732703d0f58de1d1e79" + integrity sha512-WOb5fKrvVTRMfWFNCroYWWklbnXH0Q5rZppjq0vQIdlsQKuw6mdSihwSo4RV/YdQ5UCKKvBy7/0ZZYLBZKIbwQ== + +"@esbuild/openbsd-arm64@0.25.5": + version "0.25.5" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.5.tgz#2a796c87c44e8de78001d808c77d948a21ec22fd" + integrity sha512-7A208+uQKgTxHd0G0uqZO8UjK2R0DDb4fDmERtARjSHWxqMTye4Erz4zZafx7Di9Cv+lNHYuncAkiGFySoD+Mw== + +"@esbuild/openbsd-x64@0.25.5": + version "0.25.5" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.25.5.tgz#28d0cd8909b7fa3953af998f2b2ed34f576728f0" + integrity sha512-G4hE405ErTWraiZ8UiSoesH8DaCsMm0Cay4fsFWOOUcz8b8rC6uCvnagr+gnioEjWn0wC+o1/TAHt+It+MpIMg== + +"@esbuild/sunos-x64@0.25.5": + version "0.25.5" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.25.5.tgz#a28164f5b997e8247d407e36c90d3fd5ddbe0dc5" + integrity sha512-l+azKShMy7FxzY0Rj4RCt5VD/q8mG/e+mDivgspo+yL8zW7qEwctQ6YqKX34DTEleFAvCIUviCFX1SDZRSyMQA== + +"@esbuild/win32-arm64@0.25.5": + version "0.25.5" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.25.5.tgz#6eadbead38e8bd12f633a5190e45eff80e24007e" + integrity sha512-O2S7SNZzdcFG7eFKgvwUEZ2VG9D/sn/eIiz8XRZ1Q/DO5a3s76Xv0mdBzVM5j5R639lXQmPmSo0iRpHqUUrsxw== + +"@esbuild/win32-ia32@0.25.5": + version "0.25.5" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.25.5.tgz#bab6288005482f9ed2adb9ded7e88eba9a62cc0d" + integrity sha512-onOJ02pqs9h1iMJ1PQphR+VZv8qBMQ77Klcsqv9CNW2w6yLqoURLcgERAIurY6QE63bbLuqgP9ATqajFLK5AMQ== + +"@esbuild/win32-x64@0.25.5": + version "0.25.5" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.25.5.tgz#7fc114af5f6563f19f73324b5d5ff36ece0803d1" + integrity sha512-TXv6YnJ8ZMVdX+SXWVBo/0p8LTcrUYngpWjvm91TMjjBQii7Oz11Lw5lbDV5Y0TzuhSJHwiH4hEtC1I42mMS0g== "@gerrit0/mini-shiki@^3.2.2": - version "3.3.0" - resolved "https://registry.npmjs.org/@gerrit0/mini-shiki/-/mini-shiki-3.3.0.tgz" - integrity sha512-frvArO0+s5Viq68uSod5SieLPVM2cLpXoQ1e07lURwgADXpL/MOypM7jPz9otks0g2DIe2YedDAeVrDyYJZRxA== - dependencies: - "@shikijs/engine-oniguruma" "^3.3.0" - "@shikijs/langs" "^3.3.0" - "@shikijs/themes" "^3.3.0" - "@shikijs/types" "^3.3.0" + version "3.4.2" + resolved "https://registry.npmjs.org/@gerrit0/mini-shiki/-/mini-shiki-3.4.2.tgz" + integrity sha512-3jXo5bNjvvimvdbIhKGfFxSnKCX+MA8wzHv55ptzk/cx8wOzT+BRcYgj8aFN3yTiTs+zvQQiaZFr7Jce1ZG3fw== + dependencies: + "@shikijs/engine-oniguruma" "^3.4.2" + "@shikijs/langs" "^3.4.2" + "@shikijs/themes" "^3.4.2" + "@shikijs/types" "^3.4.2" "@shikijs/vscode-textmate" "^10.0.2" "@hapi/bourne@^3.0.0": @@ -717,32 +722,40 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" -"@shikijs/engine-oniguruma@^3.3.0": - version "3.3.0" - resolved "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-3.3.0.tgz" - integrity sha512-l0vIw+GxeNU7uGnsu6B+Crpeqf+WTQ2Va71cHb5ZYWEVEPdfYwY5kXwYqRJwHrxz9WH+pjSpXQz+TJgAsrkA5A== +"@shikijs/engine-oniguruma@^3.4.2": + version "3.6.0" + resolved "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-3.6.0.tgz" + integrity sha512-nmOhIZ9yT3Grd+2plmW/d8+vZ2pcQmo/UnVwXMUXAKTXdi+LK0S08Ancrz5tQQPkxvjBalpMW2aKvwXfelauvA== dependencies: - "@shikijs/types" "3.3.0" + "@shikijs/types" "3.6.0" "@shikijs/vscode-textmate" "^10.0.2" -"@shikijs/langs@^3.3.0": - version "3.3.0" - resolved "https://registry.npmjs.org/@shikijs/langs/-/langs-3.3.0.tgz" - integrity sha512-zt6Kf/7XpBQKSI9eqku+arLkAcDQ3NHJO6zFjiChI8w0Oz6Jjjay7pToottjQGjSDCFk++R85643WbyINcuL+g== +"@shikijs/langs@^3.4.2": + version "3.6.0" + resolved "https://registry.yarnpkg.com/@shikijs/langs/-/langs-3.6.0.tgz#e3faea60e12c9bcdbebeeac14975c71f927bc7cb" + integrity sha512-IdZkQJaLBu1LCYCwkr30hNuSDfllOT8RWYVZK1tD2J03DkiagYKRxj/pDSl8Didml3xxuyzUjgtioInwEQM/TA== dependencies: - "@shikijs/types" "3.3.0" + "@shikijs/types" "3.6.0" -"@shikijs/themes@^3.3.0": - version "3.3.0" - resolved "https://registry.npmjs.org/@shikijs/themes/-/themes-3.3.0.tgz" - integrity sha512-tXeCvLXBnqq34B0YZUEaAD1lD4lmN6TOHAhnHacj4Owh7Ptb/rf5XCDeROZt2rEOk5yuka3OOW2zLqClV7/SOg== +"@shikijs/themes@^3.4.2": + version "3.6.0" + resolved "https://registry.npmjs.org/@shikijs/themes/-/themes-3.6.0.tgz" + integrity sha512-Fq2j4nWr1DF4drvmhqKq8x5vVQ27VncF8XZMBuHuQMZvUSS3NBgpqfwz/FoGe36+W6PvniZ1yDlg2d4kmYDU6w== dependencies: - "@shikijs/types" "3.3.0" + "@shikijs/types" "3.6.0" + +"@shikijs/types@3.6.0": + version "3.6.0" + resolved "https://registry.npmjs.org/@shikijs/types/-/types-3.6.0.tgz" + integrity sha512-cLWFiToxYu0aAzJqhXTQsFiJRTFDAGl93IrMSBNaGSzs7ixkLfdG6pH11HipuWFGW5vyx4X47W8HDQ7eSrmBUg== + dependencies: + "@shikijs/vscode-textmate" "^10.0.2" + "@types/hast" "^3.0.4" -"@shikijs/types@3.3.0", "@shikijs/types@^3.3.0": - version "3.3.0" - resolved "https://registry.npmjs.org/@shikijs/types/-/types-3.3.0.tgz" - integrity sha512-KPCGnHG6k06QG/2pnYGbFtFvpVJmC3uIpXrAiPrawETifujPBv0Se2oUxm5qYgjCvGJS9InKvjytOdN+bGuX+Q== +"@shikijs/types@^3.4.2": + version "3.4.2" + resolved "https://registry.npmjs.org/@shikijs/types/-/types-3.4.2.tgz" + integrity sha512-zHC1l7L+eQlDXLnxvM9R91Efh2V4+rN3oMVS2swCBssbj2U/FBwybD1eeLaq8yl/iwT+zih8iUbTBCgGZOYlVg== dependencies: "@shikijs/vscode-textmate" "^10.0.2" "@types/hast" "^3.0.4" @@ -869,16 +882,16 @@ "@types/jest@^29.5.14": version "29.5.14" - resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.5.14.tgz#2b910912fa1d6856cadcd0c1f95af7df1d6049e5" + resolved "https://registry.npmjs.org/@types/jest/-/jest-29.5.14.tgz" integrity sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ== dependencies: expect "^29.0.0" pretty-format "^29.0.0" "@types/node@*": - version "22.15.3" - resolved "https://registry.npmjs.org/@types/node/-/node-22.15.3.tgz" - integrity sha512-lX7HFZeHf4QG/J7tBZqrCAXwz9J5RD56Y6MpP0eJkka8p+K0RY/yBTW7CYFJ4VGCclxqOLKmiGP5juQc6MKgcw== + version "22.15.30" + resolved "https://registry.npmjs.org/@types/node/-/node-22.15.30.tgz" + integrity sha512-6Q7lr06bEHdlfplU6YRbgG1SFBdlsfNC4/lX+SkhiTs0cpJkOElmWls8PxDFv4yY/xKb8Y6SO0OmSX4wgqTZbA== dependencies: undici-types "~6.21.0" @@ -888,15 +901,16 @@ integrity sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw== "@types/stats.js@*": - version "0.17.3" - resolved "https://registry.npmjs.org/@types/stats.js/-/stats.js-0.17.3.tgz" - integrity sha512-pXNfAD3KHOdif9EQXZ9deK82HVNaXP5ZIF5RP2QG6OQFNTaY2YIetfrE9t528vEreGQvEPRDDc8muaoYeK0SxQ== + version "0.17.4" + resolved "https://registry.npmjs.org/@types/stats.js/-/stats.js-0.17.4.tgz" + integrity sha512-jIBvWWShCvlBqBNIZt0KAshWpvSjhkwkEu4ZUcASoAvhmrgAUI2t1dXrjSL4xXVLB4FznPrIsX3nKXFl/Dt4vA== -"@types/three@^0.175.0": - version "0.175.0" - resolved "https://registry.npmjs.org/@types/three/-/three-0.175.0.tgz" - integrity sha512-ldMSBgtZOZ3g9kJ3kOZSEtZIEITmJOzu8eKVpkhf036GuNkM4mt0NXecrjCn5tMm1OblOF7dZehlaDypBfNokw== +"@types/three@^0.176.0": + version "0.176.0" + resolved "https://registry.npmjs.org/@types/three/-/three-0.176.0.tgz" + integrity sha512-FwfPXxCqOtP7EdYMagCFePNKoG1AGBDUEVKtluv2BTVRpSt7b+X27xNsirPCTCqY1pGYsPUzaM3jgWP7dXSxlw== dependencies: + "@dimforge/rapier3d-compat" "^0.12.0" "@tweenjs/tween.js" "~23.1.3" "@types/stats.js" "*" "@types/webxr" "*" @@ -932,9 +946,9 @@ "@types/yargs-parser" "*" "@webgpu/types@*": - version "0.1.60" - resolved "https://registry.npmjs.org/@webgpu/types/-/types-0.1.60.tgz" - integrity sha512-8B/tdfRFKdrnejqmvq95ogp8tf52oZ51p3f4QD5m5Paey/qlX4Rhhy5Y8tgFMi7Ms70HzcMMw3EQjH/jdhTwlA== + version "0.1.61" + resolved "https://registry.yarnpkg.com/@webgpu/types/-/types-0.1.61.tgz#60ac1756bbeeae778b5357a94d4e6e160592d6f1" + integrity sha512-w2HbBvH+qO19SB5pJOJFKs533CdZqxl3fcGonqL321VHkW7W/iBo6H8bjDy6pr/+pbMwIu5dnuaAxH7NxBqUrQ== JSONStream@^1.3.5: version "1.3.5" @@ -960,9 +974,9 @@ acorn-walk@^8.1.1: acorn "^8.11.0" acorn@^8.11.0, acorn@^8.4.1: - version "8.14.1" - resolved "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz" - integrity sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg== + version "8.15.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.15.0.tgz#a360898bc415edaac46c8241f6383975b930b816" + integrity sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg== adm-zip@^0.5.10: version "0.5.16" @@ -1158,17 +1172,17 @@ batch@0.6.1: integrity sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw== brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + version "1.1.12" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.12.tgz#ab9b454466e5a8cc3a187beaad580412a9c5b843" + integrity sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg== dependencies: balanced-match "^1.0.0" concat-map "0.0.1" brace-expansion@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz" - integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== + version "2.0.2" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.2.tgz#54fc53237a613d854c7bd37463aad17df87214e7" + integrity sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ== dependencies: balanced-match "^1.0.0" @@ -1180,14 +1194,14 @@ braces@^3.0.3: fill-range "^7.1.1" browserslist@^4.24.0: - version "4.24.4" - resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz" - integrity sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A== + version "4.24.5" + resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.24.5.tgz" + integrity sha512-FDToo4Wo82hIdgc1CQ+NQD0hEhmpPjrZ3hiUgwgOG6IuTdlpr8jdjyG24P6cNP1yJpTLzS5OcGgSw0xmDU1/Tw== dependencies: - caniuse-lite "^1.0.30001688" - electron-to-chromium "^1.5.73" + caniuse-lite "^1.0.30001716" + electron-to-chromium "^1.5.149" node-releases "^2.0.19" - update-browserslist-db "^1.1.1" + update-browserslist-db "^1.1.3" bs-logger@^0.2.6: version "0.2.6" @@ -1262,10 +1276,10 @@ camelcase@^6.2.0: resolved "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== -caniuse-lite@^1.0.30001688: - version "1.0.30001716" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001716.tgz#39220dfbc58c85d9d4519e7090b656aa11ca4b85" - integrity sha512-49/c1+x3Kwz7ZIWt+4DvK3aMJy9oYXXG6/97JKsnjdCk/6n9vVyWL8NAwVt95Lwt9eigI10Hl782kDfZUUlRXw== +caniuse-lite@^1.0.30001716: + version "1.0.30001723" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001723.tgz#c4f3174f02089720736e1887eab345e09bb10944" + integrity sha512-1R/elMjtehrFejxwmexeXAtae5UO9iSyFn6G/I806CYC/BLyyBk1EPhrKBkWhy6wM6Xnm47dSJQec+tLJ39WHw== chalk-template@^0.4.0: version "0.4.0" @@ -1508,9 +1522,9 @@ debug@^3.1.0: ms "^2.1.1" dedent@^1.0.0: - version "1.5.3" - resolved "https://registry.npmjs.org/dedent/-/dedent-1.5.3.tgz" - integrity sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ== + version "1.6.0" + resolved "https://registry.npmjs.org/dedent/-/dedent-1.6.0.tgz" + integrity sha512-F1Z+5UCFpmQUzJa11agbyPVMbpgT/qA3/SKyJ1jyBgm7dUcUEa8v9JwDkerSQXfakBwFljIxhOJqGkjUwZ9FSA== deep-equal@~1.0.1: version "1.0.1" @@ -1600,10 +1614,10 @@ ejs@^3.1.10: dependencies: jake "^10.8.5" -electron-to-chromium@^1.5.73: - version "1.5.148" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.148.tgz#afed6a5771ec18d41e26541f71ba2ccc65f102ac" - integrity sha512-8uc1QXwwqayD4mblcsQYZqoi+cOc97A2XmKSBOIRbEAvbp6vrqmSYs4dHD2qVygUgn7Mi0qdKgPaJ9WC8cv63A== +electron-to-chromium@^1.5.149: + version "1.5.165" + resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.165.tgz" + integrity sha512-naiMx1Z6Nb2TxPU6fiFrUrDTjyPMLdTtaOd2oLmG8zVSg2hCWGkhPyxwk+qRmZ1ytwVqUv0u7ZcDA5+ALhaUtw== emittery@^0.13.1: version "0.13.1" @@ -1655,35 +1669,35 @@ es-object-atoms@^1.0.0, es-object-atoms@^1.1.1: es-errors "^1.3.0" esbuild@^0.25.0: - version "0.25.3" - resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.25.3.tgz" - integrity sha512-qKA6Pvai73+M2FtftpNKRxJ78GIjmFXFxd/1DVBqGo/qNhLSfv+G12n9pNoWdytJC8U00TrViOwpjT0zgqQS8Q== + version "0.25.5" + resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.25.5.tgz" + integrity sha512-P8OtKZRv/5J5hhz0cUAdu/cLuPIKXpQl1R9pZtvmHWQvrAUVd0UNIPT4IB4W3rNOqVO0rlqHmCIbSwxh/c9yUQ== optionalDependencies: - "@esbuild/aix-ppc64" "0.25.3" - "@esbuild/android-arm" "0.25.3" - "@esbuild/android-arm64" "0.25.3" - "@esbuild/android-x64" "0.25.3" - "@esbuild/darwin-arm64" "0.25.3" - "@esbuild/darwin-x64" "0.25.3" - "@esbuild/freebsd-arm64" "0.25.3" - "@esbuild/freebsd-x64" "0.25.3" - "@esbuild/linux-arm" "0.25.3" - "@esbuild/linux-arm64" "0.25.3" - "@esbuild/linux-ia32" "0.25.3" - "@esbuild/linux-loong64" "0.25.3" - "@esbuild/linux-mips64el" "0.25.3" - "@esbuild/linux-ppc64" "0.25.3" - "@esbuild/linux-riscv64" "0.25.3" - "@esbuild/linux-s390x" "0.25.3" - "@esbuild/linux-x64" "0.25.3" - "@esbuild/netbsd-arm64" "0.25.3" - "@esbuild/netbsd-x64" "0.25.3" - "@esbuild/openbsd-arm64" "0.25.3" - "@esbuild/openbsd-x64" "0.25.3" - "@esbuild/sunos-x64" "0.25.3" - "@esbuild/win32-arm64" "0.25.3" - "@esbuild/win32-ia32" "0.25.3" - "@esbuild/win32-x64" "0.25.3" + "@esbuild/aix-ppc64" "0.25.5" + "@esbuild/android-arm" "0.25.5" + "@esbuild/android-arm64" "0.25.5" + "@esbuild/android-x64" "0.25.5" + "@esbuild/darwin-arm64" "0.25.5" + "@esbuild/darwin-x64" "0.25.5" + "@esbuild/freebsd-arm64" "0.25.5" + "@esbuild/freebsd-x64" "0.25.5" + "@esbuild/linux-arm" "0.25.5" + "@esbuild/linux-arm64" "0.25.5" + "@esbuild/linux-ia32" "0.25.5" + "@esbuild/linux-loong64" "0.25.5" + "@esbuild/linux-mips64el" "0.25.5" + "@esbuild/linux-ppc64" "0.25.5" + "@esbuild/linux-riscv64" "0.25.5" + "@esbuild/linux-s390x" "0.25.5" + "@esbuild/linux-x64" "0.25.5" + "@esbuild/netbsd-arm64" "0.25.5" + "@esbuild/netbsd-x64" "0.25.5" + "@esbuild/openbsd-arm64" "0.25.5" + "@esbuild/openbsd-x64" "0.25.5" + "@esbuild/sunos-x64" "0.25.5" + "@esbuild/win32-arm64" "0.25.5" + "@esbuild/win32-ia32" "0.25.5" + "@esbuild/win32-x64" "0.25.5" escalade@^3.1.1, escalade@^3.2.0: version "3.2.0" @@ -2231,9 +2245,9 @@ istanbul-reports@^3.1.3: istanbul-lib-report "^3.0.0" jackspeak@^4.0.1: - version "4.1.0" - resolved "https://registry.npmjs.org/jackspeak/-/jackspeak-4.1.0.tgz" - integrity sha512-9DDdhb5j6cpeitCbvLO7n7J4IxnbM6hoF6O1g4HQ5TfhvvKN8ywDM7668ZhMHRqVmxqhps/F6syWK2KcPxYlkw== + version "4.1.1" + resolved "https://registry.npmjs.org/jackspeak/-/jackspeak-4.1.1.tgz" + integrity sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ== dependencies: "@isaacs/cliui" "^8.0.2" @@ -2547,7 +2561,7 @@ jest-snapshot@^29.7.0: pretty-format "^29.7.0" semver "^7.5.3" -jest-util@^29.0.0, jest-util@^29.7.0: +jest-util@^29.7.0: version "29.7.0" resolved "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz" integrity sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA== @@ -3394,7 +3408,7 @@ path-type@^4.0.0: resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== -picocolors@^1.0.0, picocolors@^1.1.1: +picocolors@^1.1.1: version "1.1.1" resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz" integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== @@ -3586,10 +3600,10 @@ semver@^6.3.0, semver@^6.3.1: resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== -semver@^7.5.3, semver@^7.5.4, semver@^7.7.1: - version "7.7.1" - resolved "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz" - integrity sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA== +semver@^7.5.3, semver@^7.5.4, semver@^7.7.2: + version "7.7.2" + resolved "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz" + integrity sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA== serve-index-75lb@^2.0.1: version "2.0.1" @@ -3881,10 +3895,10 @@ test-exclude@^6.0.0: glob "^7.1.4" minimatch "^3.0.4" -three@^0.175.0: - version "0.175.0" - resolved "https://registry.npmjs.org/three/-/three-0.175.0.tgz" - integrity sha512-nNE3pnTHxXN/Phw768u0Grr7W4+rumGg/H6PgeseNJojkJtmeHJfZWi41Gp2mpXl1pg1pf1zjwR4McM1jTqkpg== +three@^0.176.0: + version "0.176.0" + resolved "https://registry.npmjs.org/three/-/three-0.176.0.tgz" + integrity sha512-PWRKYWQo23ojf9oZSlRGH8K09q7nRSWx6LY/HF/UUrMdYgN9i1e2OwJYHoQjwc6HF/4lvvYLC5YC1X8UJL2ZpA== "through@>=2.2.7 <3": version "2.3.8" @@ -3916,19 +3930,18 @@ toidentifier@1.0.1: integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== ts-jest@^29.3.2: - version "29.3.2" - resolved "https://registry.npmjs.org/ts-jest/-/ts-jest-29.3.2.tgz" - integrity sha512-bJJkrWc6PjFVz5g2DGCNUo8z7oFEYaz1xP1NpeDU7KNLMWPpEyV8Chbpkn8xjzgRDpQhnGMyvyldoL7h8JXyug== + version "29.4.0" + resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-29.4.0.tgz#bef0ee98d94c83670af7462a1617bf2367a83740" + integrity sha512-d423TJMnJGu80/eSgfQ5w/R+0zFJvdtTxwtF9KzFFunOpSeD+79lHJQIiAhluJoyGRbvj9NZJsl9WjCUo0ND7Q== dependencies: bs-logger "^0.2.6" ejs "^3.1.10" fast-json-stable-stringify "^2.1.0" - jest-util "^29.0.0" json5 "^2.2.3" lodash.memoize "^4.1.2" make-error "^1.3.6" - semver "^7.7.1" - type-fest "^4.39.1" + semver "^7.7.2" + type-fest "^4.41.0" yargs-parser "^21.1.1" ts-node@^10.9.2: @@ -3965,10 +3978,10 @@ type-fest@^0.21.3: resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz" integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== -type-fest@^4.39.1: - version "4.40.1" - resolved "https://registry.npmjs.org/type-fest/-/type-fest-4.40.1.tgz" - integrity sha512-9YvLNnORDpI+vghLU/Nf+zSv0kL47KbVJ1o3sKgoTefl6i+zebxbiDQWoe/oWWqPhIgQdRZRT1KA9sCPL810SA== +type-fest@^4.41.0: + version "4.41.0" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz" + integrity sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA== type-is@^1.6.16, type-is@^1.6.18: version "1.6.18" @@ -3979,9 +3992,9 @@ type-is@^1.6.16, type-is@^1.6.18: mime-types "~2.1.24" typedoc@^0.28.3: - version "0.28.3" - resolved "https://registry.npmjs.org/typedoc/-/typedoc-0.28.3.tgz" - integrity sha512-5svOCTfXvVSh6zbZKSQluZhR8yN2tKpTeHZxlmWpE6N5vc3R8k/jhg9nnD6n5tN9/ObuQTojkONrOxFdUFUG9w== + version "0.28.5" + resolved "https://registry.yarnpkg.com/typedoc/-/typedoc-0.28.5.tgz#c6e1303fde05b746b3d2079621aff9c81561eccf" + integrity sha512-5PzUddaA9FbaarUzIsEc4wNXCiO4Ot3bJNeMF2qKpYlTmM9TTaSHQ7162w756ERCkXER/+o2purRG6YOAv6EMA== dependencies: "@gerrit0/mini-shiki" "^3.2.2" lunr "^2.3.9" @@ -4019,7 +4032,7 @@ unpipe@1.0.0: resolved "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== -update-browserslist-db@^1.1.1: +update-browserslist-db@^1.1.3: version "1.1.3" resolved "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz" integrity sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw== @@ -4143,9 +4156,9 @@ yallist@^3.0.2: integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== yaml@^2.7.1: - version "2.7.1" - resolved "https://registry.npmjs.org/yaml/-/yaml-2.7.1.tgz" - integrity sha512-10ULxpnOCQXxJvBgxsn9ptjq6uviG/htZKk9veJGhlqn3w/DxQ631zFF+nlQXLwmImeS5amR2dl2U8sg6U9jsQ== + version "2.8.0" + resolved "https://registry.npmjs.org/yaml/-/yaml-2.8.0.tgz" + integrity sha512-4lLa/EcQCB0cJkyts+FpIRx5G/llPxfP6VQU5KByHEhLxY3IJCH0f0Hy1MHI8sClTvsIb8qwRJ6R/ZdlDJ/leQ== yargs-parser@^21.1.1: version "21.1.1"