diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d1402b51..04ceeb4c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -10,19 +10,19 @@ importers: devDependencies: '@babylonjs/core': specifier: ^7.29.0 - version: 7.29.0 + version: 7.32.0 '@babylonjs/gui': specifier: ^7.29.0 - version: 7.29.0(@babylonjs/core@7.29.0) + version: 7.32.0(@babylonjs/core@7.32.0) '@babylonjs/havok': specifier: ^1.3.10 version: 1.3.10 '@babylonjs/inspector': specifier: ^7.29.0 - version: 7.29.0(@babylonjs/core@7.29.0)(@babylonjs/gui-editor@7.31.0(@babylonjs/core@7.29.0)(@babylonjs/gui@7.29.0(@babylonjs/core@7.29.0))(@types/react-dom@18.3.1)(@types/react@18.3.12))(@babylonjs/gui@7.29.0(@babylonjs/core@7.29.0))(@babylonjs/loaders@7.29.0(@babylonjs/core@7.29.0)(babylonjs-gltf2interface@7.31.0))(@babylonjs/materials@7.31.0(@babylonjs/core@7.29.0))(@babylonjs/serializers@7.31.0(@babylonjs/core@7.29.0)(babylonjs-gltf2interface@7.31.0))(@types/react-dom@18.3.1)(@types/react@18.3.12) + version: 7.32.0(@babylonjs/core@7.32.0)(@babylonjs/gui-editor@7.32.0(@babylonjs/core@7.32.0)(@babylonjs/gui@7.32.0(@babylonjs/core@7.32.0))(@types/react-dom@18.3.1)(@types/react@18.3.12))(@babylonjs/gui@7.32.0(@babylonjs/core@7.32.0))(@babylonjs/loaders@7.32.0(@babylonjs/core@7.32.0)(babylonjs-gltf2interface@7.32.0))(@babylonjs/materials@7.32.0(@babylonjs/core@7.32.0))(@babylonjs/serializers@7.32.0(@babylonjs/core@7.32.0)(babylonjs-gltf2interface@7.32.0))(@types/react-dom@18.3.1)(@types/react@18.3.12) '@babylonjs/loaders': specifier: ^7.29.0 - version: 7.29.0(@babylonjs/core@7.29.0)(babylonjs-gltf2interface@7.31.0) + version: 7.32.0(@babylonjs/core@7.32.0)(babylonjs-gltf2interface@7.32.0) '@brianchirls/game-input': specifier: ^0.1.1 version: 0.1.1 @@ -34,31 +34,31 @@ importers: version: 7.4.3 '@types/jest': specifier: ^29.5.13 - version: 29.5.13 + version: 29.5.14 '@types/seedrandom': specifier: ^3.0.8 version: 3.0.8 '@types/webpack': specifier: ^5.28.5 - version: 5.28.5(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack-dev-server@5.1.0)(webpack@5.95.0)) + version: 5.28.5(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack-dev-server@5.1.0)(webpack@5.96.1)) '@types/webpack-env': specifier: ^1.18.5 version: 1.18.5 '@typescript-eslint/eslint-plugin': specifier: ^8.9.0 - version: 8.9.0(@typescript-eslint/parser@8.9.0(eslint@8.57.1)(typescript@5.1.6))(eslint@8.57.1)(typescript@5.1.6) + version: 8.12.2(@typescript-eslint/parser@8.12.2(eslint@8.57.1)(typescript@5.1.6))(eslint@8.57.1)(typescript@5.1.6) '@typescript-eslint/parser': specifier: ^8.9.0 - version: 8.9.0(eslint@8.57.1)(typescript@5.1.6) + version: 8.12.2(eslint@8.57.1)(typescript@5.1.6) '@webpack-cli/generators': specifier: ^3.0.7 - version: 3.0.7(encoding@0.1.13)(mem-fs@2.3.0)(prettier@3.3.3)(webpack-cli@5.1.4)(webpack@5.95.0) + version: 3.0.7(encoding@0.1.13)(mem-fs@2.3.0)(prettier@3.3.3)(webpack-cli@5.1.4)(webpack@5.96.1) cross-env: specifier: ^7.0.3 version: 7.0.3 css-loader: specifier: ^7.1.2 - version: 7.1.2(webpack@5.95.0(webpack-cli@5.1.4)) + version: 7.1.2(webpack@5.96.1(webpack-cli@5.1.4)) d3: specifier: ^7.9.0 version: 7.9.0 @@ -67,7 +67,7 @@ importers: version: 8.57.1 eslint-plugin-import: specifier: ^2.31.0 - version: 2.31.0(@typescript-eslint/parser@8.9.0(eslint@8.57.1)(typescript@5.1.6))(eslint@8.57.1) + version: 2.31.0(@typescript-eslint/parser@8.12.2(eslint@8.57.1)(typescript@5.1.6))(eslint@8.57.1) extended-random: specifier: ^1.2.2 version: 1.2.2 @@ -79,79 +79,79 @@ importers: version: 1.3.1 html-loader: specifier: ^5.1.0 - version: 5.1.0(webpack@5.95.0(webpack-cli@5.1.4)) + version: 5.1.0(webpack@5.96.1(webpack-cli@5.1.4)) html-webpack-plugin: specifier: ^5.6.0 - version: 5.6.0(webpack@5.95.0(webpack-cli@5.1.4)) + version: 5.6.3(webpack@5.96.1(webpack-cli@5.1.4)) http-server: specifier: ^14.1.1 version: 14.1.1 i18next: specifier: ^23.16.0 - version: 23.16.0 + version: 23.16.4 jest: specifier: ^29.7.0 - version: 29.7.0(@types/node@22.7.5)(ts-node@10.9.2(@types/node@22.7.5)(typescript@5.1.6)) + version: 29.7.0(@types/node@22.8.7)(ts-node@10.9.2(@types/node@22.8.7)(typescript@5.1.6)) mini-css-extract-plugin: specifier: ^2.9.1 - version: 2.9.1(webpack@5.95.0(webpack-cli@5.1.4)) + version: 2.9.2(webpack@5.96.1(webpack-cli@5.1.4)) prettier: specifier: ^3.3.3 version: 3.3.3 raw-loader: specifier: ^4.0.2 - version: 4.0.2(webpack@5.95.0(webpack-cli@5.1.4)) + version: 4.0.2(webpack@5.96.1(webpack-cli@5.1.4)) sass: specifier: ^1.79.5 - version: 1.79.5 + version: 1.80.6 sass-loader: specifier: ^16.0.2 - version: 16.0.2(sass@1.79.5)(webpack@5.95.0(webpack-cli@5.1.4)) + version: 16.0.3(sass@1.80.6)(webpack@5.96.1(webpack-cli@5.1.4)) squirrel-noise: specifier: ^1.0.0 version: 1.0.0 style-loader: specifier: ^4.0.0 - version: 4.0.0(webpack@5.95.0(webpack-cli@5.1.4)) + version: 4.0.0(webpack@5.96.1(webpack-cli@5.1.4)) terrain-generation: specifier: ^1.8.0 version: 1.8.0 ts-jest: specifier: ^29.2.5 - version: 29.2.5(@babel/core@7.25.8)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.8))(jest@29.7.0(@types/node@22.7.5)(ts-node@10.9.2(@types/node@22.7.5)(typescript@5.1.6)))(typescript@5.1.6) + version: 29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(jest@29.7.0(@types/node@22.8.7)(ts-node@10.9.2(@types/node@22.8.7)(typescript@5.1.6)))(typescript@5.1.6) ts-loader: specifier: ^9.5.1 - version: 9.5.1(typescript@5.1.6)(webpack@5.95.0(webpack-cli@5.1.4)) + version: 9.5.1(typescript@5.1.6)(webpack@5.96.1(webpack-cli@5.1.4)) ts-node: specifier: ^10.9.2 - version: 10.9.2(@types/node@22.7.5)(typescript@5.1.6) + version: 10.9.2(@types/node@22.8.7)(typescript@5.1.6) ts-shader-loader: specifier: ^2.0.2 version: 2.0.2 typedoc: specifier: ^0.26.9 - version: 0.26.9(typescript@5.1.6) + version: 0.26.11(typescript@5.1.6) typedoc-material-theme: specifier: ^1.1.0 - version: 1.1.0(typedoc@0.26.9(typescript@5.1.6)) + version: 1.1.0(typedoc@0.26.11(typescript@5.1.6)) typedoc-plugin-missing-exports: specifier: ^3.0.0 - version: 3.0.0(typedoc@0.26.9(typescript@5.1.6)) + version: 3.0.0(typedoc@0.26.11(typescript@5.1.6)) typescript: specifier: ~5.1.6 version: 5.1.6 typescript-plugin-css-modules: specifier: ^5.1.0 - version: 5.1.0(ts-node@10.9.2(@types/node@22.7.5)(typescript@5.1.6))(typescript@5.1.6) + version: 5.1.0(ts-node@10.9.2(@types/node@22.8.7)(typescript@5.1.6))(typescript@5.1.6) webpack: specifier: ^5.95.0 - version: 5.95.0(webpack-cli@5.1.4) + version: 5.96.1(webpack-cli@5.1.4) webpack-cli: specifier: ^5.1.4 - version: 5.1.4(@webpack-cli/generators@3.0.7)(webpack-dev-server@5.1.0)(webpack@5.95.0) + version: 5.1.4(@webpack-cli/generators@3.0.7)(webpack-dev-server@5.1.0)(webpack@5.96.1) webpack-dev-server: specifier: ^5.1.0 - version: 5.1.0(webpack-cli@5.1.4)(webpack@5.95.0) + version: 5.1.0(webpack-cli@5.1.4)(webpack@5.96.1) packages: @@ -162,66 +162,58 @@ packages: resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} - '@babel/code-frame@7.25.7': - resolution: {integrity: sha512-0xZJFNE5XMpENsgfHYTw8FbX4kv53mFLn2i3XPoq69LyhYSCBJtitaHx9QnsVTrsogI4Z3+HtEfZ2/GFPOtf5g==} + '@babel/code-frame@7.26.2': + resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} engines: {node: '>=6.9.0'} - '@babel/compat-data@7.25.8': - resolution: {integrity: sha512-ZsysZyXY4Tlx+Q53XdnOFmqwfB9QDTHYxaZYajWRoBLuLEAwI2UIbtxOjWh/cFaa9IKUlcB+DDuoskLuKu56JA==} + '@babel/compat-data@7.26.2': + resolution: {integrity: sha512-Z0WgzSEa+aUcdiJuCIqgujCshpMWgUpgOxXotrYPSA53hA3qopNaqcJpyr0hVb1FeWdnqFA35/fUtXgBK8srQg==} engines: {node: '>=6.9.0'} - '@babel/core@7.25.8': - resolution: {integrity: sha512-Oixnb+DzmRT30qu9d3tJSQkxuygWm32DFykT4bRoORPa9hZ/L4KhVB/XiRm6KG+roIEM7DBQlmg27kw2HZkdZg==} + '@babel/core@7.26.0': + resolution: {integrity: sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==} engines: {node: '>=6.9.0'} - '@babel/generator@7.25.7': - resolution: {integrity: sha512-5Dqpl5fyV9pIAD62yK9P7fcA768uVPUyrQmqpqstHWgMma4feF1x/oFysBCVZLY5wJ2GkMUCdsNDnGZrPoR6rA==} + '@babel/generator@7.26.2': + resolution: {integrity: sha512-zevQbhbau95nkoxSq3f/DC/SC+EEOUZd3DYqfSkMhY2/wfSeaHV1Ew4vk8e+x8lja31IbyuUa2uQ3JONqKbysw==} engines: {node: '>=6.9.0'} - '@babel/helper-compilation-targets@7.25.7': - resolution: {integrity: sha512-DniTEax0sv6isaw6qSQSfV4gVRNtw2rte8HHM45t9ZR0xILaufBRNkpMifCRiAPyvL4ACD6v0gfCwCmtOQaV4A==} + '@babel/helper-compilation-targets@7.25.9': + resolution: {integrity: sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==} engines: {node: '>=6.9.0'} - '@babel/helper-module-imports@7.25.7': - resolution: {integrity: sha512-o0xCgpNmRohmnoWKQ0Ij8IdddjyBFE4T2kagL/x6M3+4zUgc+4qTOUBoNe4XxDskt1HPKO007ZPiMgLDq2s7Kw==} + '@babel/helper-module-imports@7.25.9': + resolution: {integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==} engines: {node: '>=6.9.0'} - '@babel/helper-module-transforms@7.25.7': - resolution: {integrity: sha512-k/6f8dKG3yDz/qCwSM+RKovjMix563SLxQFo0UhRNo239SP6n9u5/eLtKD6EAjwta2JHJ49CsD8pms2HdNiMMQ==} + '@babel/helper-module-transforms@7.26.0': + resolution: {integrity: sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-plugin-utils@7.25.7': - resolution: {integrity: sha512-eaPZai0PiqCi09pPs3pAFfl/zYgGaE6IdXtYvmf0qlcDTd3WCtO7JWCcRd64e0EQrcYgiHibEZnOGsSY4QSgaw==} + '@babel/helper-plugin-utils@7.25.9': + resolution: {integrity: sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==} engines: {node: '>=6.9.0'} - '@babel/helper-simple-access@7.25.7': - resolution: {integrity: sha512-FPGAkJmyoChQeM+ruBGIDyrT2tKfZJO8NcxdC+CWNJi7N8/rZpSxK7yvBJ5O/nF1gfu5KzN7VKG3YVSLFfRSxQ==} + '@babel/helper-string-parser@7.25.9': + resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} engines: {node: '>=6.9.0'} - '@babel/helper-string-parser@7.25.7': - resolution: {integrity: sha512-CbkjYdsJNHFk8uqpEkpCvRs3YRp9tY6FmFY7wLMSYuGYkrdUi7r2lc4/wqsvlHoMznX3WJ9IP8giGPq68T/Y6g==} + '@babel/helper-validator-identifier@7.25.9': + resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-identifier@7.25.7': - resolution: {integrity: sha512-AM6TzwYqGChO45oiuPqwL2t20/HdMC1rTPAesnBCgPCSF1x3oN9MVUwQV2iyz4xqWrctwK5RNC8LV22kaQCNYg==} + '@babel/helper-validator-option@7.25.9': + resolution: {integrity: sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-option@7.25.7': - resolution: {integrity: sha512-ytbPLsm+GjArDYXJ8Ydr1c/KJuutjF2besPNbIZnZ6MKUxi/uTA22t2ymmA4WFjZFpjiAMO0xuuJPqK2nvDVfQ==} + '@babel/helpers@7.26.0': + resolution: {integrity: sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==} engines: {node: '>=6.9.0'} - '@babel/helpers@7.25.7': - resolution: {integrity: sha512-Sv6pASx7Esm38KQpF/U/OXLwPPrdGHNKoeblRxgZRLXnAtnkEe4ptJPDtAZM7fBLadbc1Q07kQpSiGQ0Jg6tRA==} - engines: {node: '>=6.9.0'} - - '@babel/highlight@7.25.7': - resolution: {integrity: sha512-iYyACpW3iW8Fw+ZybQK+drQre+ns/tKpXbNESfrhNnPLIklLbXr7MYJ6gPEd0iETGLOK+SxMjVvKb/ffmk+FEw==} - engines: {node: '>=6.9.0'} - - '@babel/parser@7.25.8': - resolution: {integrity: sha512-HcttkxzdPucv3nNFmfOOMfFf64KgdJVqm1KaCm25dPGMLElo9nsLvXeJECQg8UzPuBGLyTSA0ZzqCtDSzKTEoQ==} + '@babel/parser@7.26.2': + resolution: {integrity: sha512-DWMCZH9WA4Maitz2q21SRKHo9QXZxkDsbNZoVD62gusNtNBBqDg9i7uOhASfTfIGNzW+O+r7+jAlM8dwphcJKQ==} engines: {node: '>=6.0.0'} hasBin: true @@ -246,8 +238,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-import-attributes@7.25.7': - resolution: {integrity: sha512-AqVo+dguCgmpi/3mYBdu9lkngOBlQ2w2vnNpa6gfiCxQZLzV4ZbhsXitJ2Yblkoe1VQwtHSaNmIaGll/26YWRw==} + '@babel/plugin-syntax-import-attributes@7.26.0': + resolution: {integrity: sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -262,8 +254,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-jsx@7.25.7': - resolution: {integrity: sha512-ruZOnKO+ajVL/MVx+PwNBPOkrnXTXoWMtte1MBpegfCArhqOe3Bj52avVj1huLLxNKYKXYaSxZ2F+woK1ekXfw==} + '@babel/plugin-syntax-jsx@7.25.9': + resolution: {integrity: sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -310,49 +302,49 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-typescript@7.25.7': - resolution: {integrity: sha512-rR+5FDjpCHqqZN2bzZm18bVYGaejGq5ZkpVCJLXor/+zlSrSoc4KWcHI0URVWjl/68Dyr1uwZUz/1njycEAv9g==} + '@babel/plugin-syntax-typescript@7.25.9': + resolution: {integrity: sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/runtime@7.25.7': - resolution: {integrity: sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w==} + '@babel/runtime@7.26.0': + resolution: {integrity: sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==} engines: {node: '>=6.9.0'} - '@babel/template@7.25.7': - resolution: {integrity: sha512-wRwtAgI3bAS+JGU2upWNL9lSlDcRCqD05BZ1n3X2ONLH1WilFP6O1otQjeMK/1g0pvYcXC7b/qVUB1keofjtZA==} + '@babel/template@7.25.9': + resolution: {integrity: sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==} engines: {node: '>=6.9.0'} - '@babel/traverse@7.25.7': - resolution: {integrity: sha512-jatJPT1Zjqvh/1FyJs6qAHL+Dzb7sTb+xr7Q+gM1b+1oBsMsQQ4FkVKb6dFlJvLlVssqkRzV05Jzervt9yhnzg==} + '@babel/traverse@7.25.9': + resolution: {integrity: sha512-ZCuvfwOwlz/bawvAuvcj8rrithP2/N55Tzz342AkTvq4qaWbGfmCk/tKhNaV2cthijKrPAA8SRJV5WWe7IBMJw==} engines: {node: '>=6.9.0'} - '@babel/types@7.25.8': - resolution: {integrity: sha512-JWtuCu8VQsMladxVz/P4HzHUGCAwpuqacmowgXFs5XjxIgKuNjnLokQzuVjlTvIzODaDmpjT3oxcC48vyk9EWg==} + '@babel/types@7.26.0': + resolution: {integrity: sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==} engines: {node: '>=6.9.0'} - '@babylonjs/core@7.29.0': - resolution: {integrity: sha512-uegeRE4kEjoiW8nXOszMTkz1jlx5ITTTZvDo5xjhPSa0GK9KhZ2IQF0JONEuJgBdJPtplrUXzH8VzqIE8GpY1g==} + '@babylonjs/core@7.32.0': + resolution: {integrity: sha512-f0SznCzw7x50yhb77hE/eFnOay0MeKJw/ktldBt34brWzgVytnfF+g3weftXxHWHxXMB/U0zvpeh2G+14HMzPg==} - '@babylonjs/gui-editor@7.31.0': - resolution: {integrity: sha512-5Atsj+GQvggpE+ZhGP04v7S6tMGf3rTAhoNol3Io152qeNo9zHPKtcXbNOfUG69B3cKn6rVhWJcArazL84NAlg==} + '@babylonjs/gui-editor@7.32.0': + resolution: {integrity: sha512-JPxUygnaOHMj5Myx+0GGUTmyfxgnqC+gcGH6IITEdDg4QdcQ0J8dtMxMzOJJF5WJhm/4mTxsHhtkDXVqVdJz9Q==} peerDependencies: '@babylonjs/core': ^7.0.0 '@babylonjs/gui': ^7.0.0 '@types/react': '>=16.7.3' '@types/react-dom': '>=16.0.9' - '@babylonjs/gui@7.29.0': - resolution: {integrity: sha512-oXEDrOAGV0YWYGUnHj7zb/QpKt7wtzebR4VlUOrPYhq1jYF5OK5r34hNMOsbx5j1elQAujNMCxMmGmnzJfc7mw==} + '@babylonjs/gui@7.32.0': + resolution: {integrity: sha512-x902JfaohDpo77IlEyPnu+Yv4bQrbA0gc61TSlDlf3bPS02eKuwcu9X1ilSbe/MkgV4WyPRAUqAB/ekFra7lHg==} peerDependencies: '@babylonjs/core': ^7.0.0 '@babylonjs/havok@1.3.10': resolution: {integrity: sha512-ddF0LPBVmg+rmPaMmwTPA9FcHyUnrSsQqFoBbYbN51WMhEJQ+7gRFW3J5lML6lN9M/fbknh6bh1ZirZ2bU2B/w==} - '@babylonjs/inspector@7.29.0': - resolution: {integrity: sha512-FTVcO44Y3VDOh9YZ9I+XJPrc8e7+eoNwyPr5qVvS4hGCkxA84nUvAfKi1wrz+iKUv7HxjEjkz0ptIPLYbtHnxw==} + '@babylonjs/inspector@7.32.0': + resolution: {integrity: sha512-lYXwtun7z+bVWBUyPciVqQRD+LhIFV4e1mC65XAKHu8Q9PLAfEm6ZJquRi31yDn1Fp/DimklfZBolKWnPwRkVA==} peerDependencies: '@babylonjs/core': ^7.0.0 '@babylonjs/gui': ^7.0.0 @@ -363,19 +355,19 @@ packages: '@types/react': '>=16.7.3' '@types/react-dom': '>=16.0.9' - '@babylonjs/loaders@7.29.0': - resolution: {integrity: sha512-nAukPQ0Sy6okeAiTKPW21A3ftShxTpOtwWN6q4/CjPn1wPR04R3g/G2w40yF8jtTZji0MGgHSzcSTvMMb4pcaQ==} + '@babylonjs/loaders@7.32.0': + resolution: {integrity: sha512-wAh5/35h0px/5ob9pwteXEEOgVYzNVKKJ+vlU7R9iKknOkrx1OW/xTeEvxFNu3OqMJDCrfEaXZ5b9JS9Cl/WZA==} peerDependencies: '@babylonjs/core': ^7.0.0 babylonjs-gltf2interface: ^7.0.0 - '@babylonjs/materials@7.31.0': - resolution: {integrity: sha512-iXzm/jKSGgZycM3j9gJdy8SfQbNftNEkYANA//KOna/TGf30vZSWkRkXTLWjhdXQTuJp+1jJ1xVWej4FR3rUXQ==} + '@babylonjs/materials@7.32.0': + resolution: {integrity: sha512-Qx8nQMMuJQTXdlizuIoUsuv8/Sm5kf/zqhjzsZTwH3yw/NdwhNgWrWKo+0eXrgoJgJcHCGckS5e3ow42B8dgMQ==} peerDependencies: '@babylonjs/core': ^7.0.0 - '@babylonjs/serializers@7.31.0': - resolution: {integrity: sha512-xUJA9t8yRvTscPfXsV3DTKCaWCYXGODmPB9hfs2ywSQ2PSvHOLeDEXbWOovEJnIcqS4jmCJHe20PiOY7xAYAwA==} + '@babylonjs/serializers@7.32.0': + resolution: {integrity: sha512-4DpIed1F4/TUZ5NLhoswCRwmLL59tBZjKKjudK9rq2Ic4pcQejna3uw+Q/bTe3RC88lex8Zm7NTLdACjh7Y2yg==} peerDependencies: '@babylonjs/core': ^7.0.0 babylonjs-gltf2interface: ^7.0.0 @@ -394,14 +386,14 @@ packages: resolution: {integrity: sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==} engines: {node: '>=10.0.0'} - '@eslint-community/eslint-utils@4.4.0': - resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} + '@eslint-community/eslint-utils@4.4.1': + resolution: {integrity: sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - '@eslint-community/regexpp@4.11.1': - resolution: {integrity: sha512-m4DVN9ZqskZoLU5GlWZadwDnYo3vAEydiUayB9widCl9ffWx2IvPnp6n3on5rJmziJSw9Bv+Z3ChDVdMwXCY8Q==} + '@eslint-community/regexpp@4.12.1': + resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} '@eslint/eslintrc@2.1.4': @@ -788,17 +780,17 @@ packages: '@rtsao/scc@1.1.0': resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==} - '@shikijs/core@1.22.0': - resolution: {integrity: sha512-S8sMe4q71TJAW+qG93s5VaiihujRK6rqDFqBnxqvga/3LvqHEnxqBIOPkt//IdXVtHkQWKu4nOQNk0uBGicU7Q==} + '@shikijs/core@1.22.2': + resolution: {integrity: sha512-bvIQcd8BEeR1yFvOYv6HDiyta2FFVePbzeowf5pPS1avczrPK+cjmaxxh0nx5QzbON7+Sv0sQfQVciO7bN72sg==} - '@shikijs/engine-javascript@1.22.0': - resolution: {integrity: sha512-AeEtF4Gcck2dwBqCFUKYfsCq0s+eEbCEbkUuFou53NZ0sTGnJnJ/05KHQFZxpii5HMXbocV9URYVowOP2wH5kw==} + '@shikijs/engine-javascript@1.22.2': + resolution: {integrity: sha512-iOvql09ql6m+3d1vtvP8fLCVCK7BQD1pJFmHIECsujB0V32BJ0Ab6hxk1ewVSMFA58FI0pR2Had9BKZdyQrxTw==} - '@shikijs/engine-oniguruma@1.22.0': - resolution: {integrity: sha512-5iBVjhu/DYs1HB0BKsRRFipRrD7rqjxlWTj4F2Pf+nQSPqc3kcyqFFeZXnBMzDf0HdqaFVvhDRAGiYNvyLP+Mw==} + '@shikijs/engine-oniguruma@1.22.2': + resolution: {integrity: sha512-GIZPAGzQOy56mGvWMoZRPggn0dTlBf1gutV5TdceLCZlFNqWmuc7u+CzD0Gd9vQUTgLbrt0KLzz6FNprqYAxlA==} - '@shikijs/types@1.22.0': - resolution: {integrity: sha512-Fw/Nr7FGFhlQqHfxzZY8Cwtwk5E9nKDUgeLjZgt3UuhcM3yJR9xj3ZGNravZZok8XmEZMiYkSMTPlPkULB8nww==} + '@shikijs/types@1.22.2': + resolution: {integrity: sha512-NCWDa6LGZqTuzjsGfXOBWfjS/fDIbDdmVDug+7ykVe1IKT4c1gakrvlfFYp5NhAXH/lyqLM8wsAPo5wNy73Feg==} '@shikijs/vscode-textmate@9.3.0': resolution: {integrity: sha512-jn7/7ky30idSkd/O5yDBfAnVt+JJpepofP/POZ1iMOxK59cOfqIgg/Dj0eFsjOTMw+4ycJN0uhZH/Eb0bs/EUA==} @@ -1041,6 +1033,12 @@ packages: '@types/emscripten@1.39.13': resolution: {integrity: sha512-cFq+fO/isvhvmuP/+Sl4K4jtU6E23DoivtbO4r50e3odaxAiVdbfSYRDdJ4gCdxx+3aRjhphS5ZMwIH4hFy/Cw==} + '@types/eslint-scope@3.7.7': + resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==} + + '@types/eslint@9.6.1': + resolution: {integrity: sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==} + '@types/estree@1.0.6': resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} @@ -1050,8 +1048,8 @@ packages: '@types/express-serve-static-core@4.19.6': resolution: {integrity: sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==} - '@types/express-serve-static-core@5.0.0': - resolution: {integrity: sha512-AbXMTZGt40T+KON9/Fdxx0B2WK5hsgxcfXJLr5bFpZ7b4JCex2WyQPTEKdXqfHiY5nKKBScZ7yCoO6Pvgxfvnw==} + '@types/express-serve-static-core@5.0.1': + resolution: {integrity: sha512-CRICJIl0N5cXDONAdlTv5ShATZ4HEwk6kDDIW2/w9qOWKg+NU/5F8wYRWCrONad0/UKkloNSmmyN/wX4rtpbVA==} '@types/express@4.17.21': resolution: {integrity: sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==} @@ -1083,8 +1081,8 @@ packages: '@types/istanbul-reports@3.0.4': resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} - '@types/jest@29.5.13': - resolution: {integrity: sha512-wd+MVEZCHt23V0/L642O5APvspWply/rGY5BcW4SUETo2UzPU3Z26qr8jC2qxpimI2jjx9h7+2cj2FwIr01bXg==} + '@types/jest@29.5.14': + resolution: {integrity: sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ==} '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} @@ -1107,8 +1105,8 @@ packages: '@types/node@15.14.9': resolution: {integrity: sha512-qjd88DrCxupx/kJD5yQgZdcYKZKSIGBVDIBE1/LTGcNm3d2Np/jxojkdePDdfnBHJc5W7vSMpbJ1aB7p/Py69A==} - '@types/node@22.7.5': - resolution: {integrity: sha512-jML7s2NAzMWc//QSJ1a3prpk78cOPchGvXJsC3C6R6PSMoooztvRVQEz89gmBTBY1SPMaqo5teB4uNHPdetShQ==} + '@types/node@22.8.7': + resolution: {integrity: sha512-LidcG+2UeYIWcMuMUpBKOnryBWG/rnmOHQR5apjn8myTQcx3rinFRn7DcIFhMnS0PPFSC6OafdIKEad0lj6U0Q==} '@types/normalize-package-data@2.4.4': resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} @@ -1167,8 +1165,8 @@ packages: '@types/webpack@5.28.5': resolution: {integrity: sha512-wR87cgvxj3p6D0Crt1r5avwqffqPXUkNlnQ1mjU93G7gCuFjufZR4I6j8cz5g1F1tTYpfOOFvly+cmIQwL9wvw==} - '@types/ws@8.5.12': - resolution: {integrity: sha512-3tPRkv1EtkDpzlgyKyI8pGsGZAGPEaXeu0DOj5DI25Ja91bdAYddYHbADRYVrZMRbfW+1l5YwXVDKohDJNQxkQ==} + '@types/ws@8.5.13': + resolution: {integrity: sha512-osM/gWBTPKgHV8XkTunnegTRIsvF6owmf5w+JtAfOw472dptdm0dlGv4xCt6GwQRcC2XVOvvRE/0bAoQcL2QkA==} '@types/yargs-parser@21.0.3': resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} @@ -1176,8 +1174,8 @@ packages: '@types/yargs@17.0.33': resolution: {integrity: sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==} - '@typescript-eslint/eslint-plugin@8.9.0': - resolution: {integrity: sha512-Y1n621OCy4m7/vTXNlCbMVp87zSd7NH0L9cXD8aIpOaNlzeWxIK4+Q19A68gSmTNRZn92UjocVUWDthGxtqHFg==} + '@typescript-eslint/eslint-plugin@8.12.2': + resolution: {integrity: sha512-gQxbxM8mcxBwaEmWdtLCIGLfixBMHhQjBqR8sVWNTPpcj45WlYL2IObS/DNMLH1DBP0n8qz+aiiLTGfopPEebw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 @@ -1187,8 +1185,8 @@ packages: typescript: optional: true - '@typescript-eslint/parser@8.9.0': - resolution: {integrity: sha512-U+BLn2rqTTHnc4FL3FJjxaXptTxmf9sNftJK62XLz4+GxG3hLHm/SUNaaXP5Y4uTiuYoL5YLy4JBCJe3+t8awQ==} + '@typescript-eslint/parser@8.12.2': + resolution: {integrity: sha512-MrvlXNfGPLH3Z+r7Tk+Z5moZAc0dzdVjTgUgwsdGweH7lydysQsnSww3nAmsq8blFuRD5VRlAr9YdEFw3e6PBw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -1197,12 +1195,12 @@ packages: typescript: optional: true - '@typescript-eslint/scope-manager@8.9.0': - resolution: {integrity: sha512-bZu9bUud9ym1cabmOYH9S6TnbWRzpklVmwqICeOulTCZ9ue2/pczWzQvt/cGj2r2o1RdKoZbuEMalJJSYw3pHQ==} + '@typescript-eslint/scope-manager@8.12.2': + resolution: {integrity: sha512-gPLpLtrj9aMHOvxJkSbDBmbRuYdtiEbnvO25bCMza3DhMjTQw0u7Y1M+YR5JPbMsXXnSPuCf5hfq0nEkQDL/JQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/type-utils@8.9.0': - resolution: {integrity: sha512-JD+/pCqlKqAk5961vxCluK+clkppHY07IbV3vett97KOV+8C6l+CPEPwpUuiMwgbOz/qrN3Ke4zzjqbT+ls+1Q==} + '@typescript-eslint/type-utils@8.12.2': + resolution: {integrity: sha512-bwuU4TAogPI+1q/IJSKuD4shBLc/d2vGcRT588q+jzayQyjVK2X6v/fbR4InY2U2sgf8MEvVCqEWUzYzgBNcGQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '*' @@ -1210,12 +1208,12 @@ packages: typescript: optional: true - '@typescript-eslint/types@8.9.0': - resolution: {integrity: sha512-SjgkvdYyt1FAPhU9c6FiYCXrldwYYlIQLkuc+LfAhCna6ggp96ACncdtlbn8FmnG72tUkXclrDExOpEYf1nfJQ==} + '@typescript-eslint/types@8.12.2': + resolution: {integrity: sha512-VwDwMF1SZ7wPBUZwmMdnDJ6sIFk4K4s+ALKLP6aIQsISkPv8jhiw65sAK6SuWODN/ix+m+HgbYDkH+zLjrzvOA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.9.0': - resolution: {integrity: sha512-9iJYTgKLDG6+iqegehc5+EqE6sqaee7kb8vWpmHZ86EqwDjmlqNNHeqDVqb9duh+BY6WCNHfIGvuVU3Tf9Db0g==} + '@typescript-eslint/typescript-estree@8.12.2': + resolution: {integrity: sha512-mME5MDwGe30Pq9zKPvyduyU86PH7aixwqYR2grTglAdB+AN8xXQ1vFGpYaUSJ5o5P/5znsSBeNcs5g5/2aQwow==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '*' @@ -1223,14 +1221,14 @@ packages: typescript: optional: true - '@typescript-eslint/utils@8.9.0': - resolution: {integrity: sha512-PKgMmaSo/Yg/F7kIZvrgrWa1+Vwn036CdNUvYFEkYbPwOH4i8xvkaRlu148W3vtheWK9ckKRIz7PBP5oUlkrvQ==} + '@typescript-eslint/utils@8.12.2': + resolution: {integrity: sha512-UTTuDIX3fkfAz6iSVa5rTuSfWIYZ6ATtEocQ/umkRSyC9O919lbZ8dcH7mysshrCdrAM03skJOEYaBugxN+M6A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 - '@typescript-eslint/visitor-keys@8.9.0': - resolution: {integrity: sha512-Ht4y38ubk4L5/U8xKUBfKNYGmvKvA1CANoxiTRMM+tOLk3lbF3DvzZCxJCRSE+2GdCMSh6zq9VZJc3asc1XuAA==} + '@typescript-eslint/visitor-keys@8.12.2': + resolution: {integrity: sha512-PChz8UaKQAVNHghsHcPyx1OMHoFRUEA7rJSK/mDhdq85bk+PLsUHUBqTQTFt18VJZbmxBovM65fezlheQRsSDA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@ungap/structured-clone@1.2.0': @@ -1334,11 +1332,6 @@ packages: resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} engines: {node: '>= 0.6'} - acorn-import-attributes@1.9.5: - resolution: {integrity: sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==} - peerDependencies: - acorn: ^8 - acorn-jsx@5.3.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: @@ -1348,8 +1341,8 @@ packages: resolution: {integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==} engines: {node: '>=0.4.0'} - acorn@8.12.1: - resolution: {integrity: sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==} + acorn@8.14.0: + resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} engines: {node: '>=0.4.0'} hasBin: true @@ -1406,10 +1399,6 @@ packages: resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} engines: {node: '>=12'} - ansi-styles@3.2.1: - resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} - engines: {node: '>=4'} - ansi-styles@4.3.0: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} @@ -1525,8 +1514,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0 - babylonjs-gltf2interface@7.31.0: - resolution: {integrity: sha512-ZGtSmhOpDGPtXQNJ1KkgwTplsDczf3pTUKLs/T8ZxBD9598izuUPQK8+Ua1zAioC+NQdQuEyQ0f2aytn/HtZ5A==} + babylonjs-gltf2interface@7.32.0: + resolution: {integrity: sha512-ebPsZnxcKl7jX0Q/Kqd9HDgyhdJjMBtXND7XprasBEQPUVcRu+JTFhHF9YXQ4NBPCbHBYXKYs6g0w+A/CWPCPg==} balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} @@ -1582,8 +1571,8 @@ packages: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} - browserslist@4.24.0: - resolution: {integrity: sha512-Rmb62sR1Zpjql25eSanFGEhAxcFwfA1K0GuQcLoaJBAcENegrQut3hYdhXFF1obQfiDyqIW/cLM5HSJ/9k884A==} + browserslist@4.24.2: + resolution: {integrity: sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true @@ -1610,10 +1599,6 @@ packages: resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==} engines: {node: '>=18'} - bytes@3.0.0: - resolution: {integrity: sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==} - engines: {node: '>= 0.8'} - bytes@3.1.2: resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} engines: {node: '>= 0.8'} @@ -1649,16 +1634,12 @@ packages: resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} engines: {node: '>=10'} - caniuse-lite@1.0.30001668: - resolution: {integrity: sha512-nWLrdxqCdblixUO+27JtGJJE/txpJlyUy5YN1u53wLZkP0emYCo5zgS6QYft7VUYR42LGgi/S5hdLZTrnyIddw==} + caniuse-lite@1.0.30001677: + resolution: {integrity: sha512-fmfjsOlJUpMWu+mAAtZZZHz7UEwsUxIIvu1TJfO1HqFQvB/B+ii0xr9B5HpbZY/mC4XZ8SvjHJqtAY6pDPQEog==} ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} - chalk@2.4.2: - resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} - engines: {node: '>=4'} - chalk@4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} @@ -1760,16 +1741,10 @@ packages: collect-v8-coverage@1.0.2: resolution: {integrity: sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==} - color-convert@1.9.3: - resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} - color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} - color-name@1.1.3: - resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} - color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} @@ -1816,8 +1791,8 @@ packages: resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==} engines: {node: '>= 0.6'} - compression@1.7.4: - resolution: {integrity: sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==} + compression@1.7.5: + resolution: {integrity: sha512-bQJ0YRck5ak3LgtnpKkiabX5pNF7tMUh1BSy2ZBOTh0Dim0BUu6aPPwByIns6/A5Prh8PufSPerMDUklpzes2Q==} engines: {node: '>= 0.8.0'} concat-map@0.0.1: @@ -2224,8 +2199,8 @@ packages: engines: {node: '>=0.10.0'} hasBin: true - electron-to-chromium@1.5.38: - resolution: {integrity: sha512-VbeVexmZ1IFh+5EfrYz1I0HTzHVIlJa112UEWhciPyeOcKJGeTv6N8WnG4wsQB81DGCaVEGhpSb6o6a8WYFXXg==} + electron-to-chromium@1.5.50: + resolution: {integrity: sha512-eMVObiUQ2LdgeO1F/ySTXsvqvxb6ZH2zPGaMYsWzRDdOddUa77tdmI0ltg+L16UpbWdhPmuF3wIQYyQq65WfZw==} emittery@0.13.1: resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} @@ -2472,8 +2447,8 @@ packages: fast-simplex-noise@4.0.0: resolution: {integrity: sha512-2zRCJkPdMnPyXNEeI5IYgH555Nbd/j9nC8YVoOm5dmFDjqxuLD888nEAGB8cSUIyxLlNHCZVlZ7AO27Fm3boJA==} - fast-uri@3.0.2: - resolution: {integrity: sha512-GR6f0hD7XXyNJa25Tb9BuIdN0tdr+0BMi6/CJPH3wJO1JjNG3n/VsSw38AwRdKZABm8lGbPfakLRkYzx2V9row==} + fast-uri@3.0.3: + resolution: {integrity: sha512-aLrHthzCjH5He4Z2H9YZ+v6Ujb9ocRuW6ZzkJQOrTxleEijANq4v1TsaPaVG1PZcuurEzrLcWRyYBYXD5cEiaw==} fastest-levenshtein@1.0.16: resolution: {integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==} @@ -2684,10 +2659,6 @@ packages: has-bigints@1.0.2: resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} - has-flag@3.0.0: - resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} - engines: {node: '>=4'} - has-flag@4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} @@ -2767,8 +2738,8 @@ packages: html-void-elements@3.0.0: resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} - html-webpack-plugin@5.6.0: - resolution: {integrity: sha512-iwaY4wzbe48AfKLZ/Cc8k0L+FKG6oSNRaZ8x5A/T/IVDGyXcbHncM9TdDa93wn0FsSm82FhTKW7f3vS61thXAw==} + html-webpack-plugin@5.6.3: + resolution: {integrity: sha512-QSf1yjtSAsmf7rYBV7XX86uua4W/vkhIt0xNXKbsi2foEeW7vjJQz4bhnpL3xH+l1ryl1680uNv968Z+X6jSYg==} engines: {node: '>=10.13.0'} peerDependencies: '@rspack/core': 0.x || 1.x @@ -2840,8 +2811,8 @@ packages: resolution: {integrity: sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A==} engines: {node: '>=10.18'} - i18next@23.16.0: - resolution: {integrity: sha512-Ni3CG6c14teOogY19YNRl+kYaE/Rb59khy0VyHVn4uOZ97E2E/Yziyi6r3C3s9+wacjdLZiq/LLYyx+Cgd+FCw==} + i18next@23.16.4: + resolution: {integrity: sha512-9NIYBVy9cs4wIqzurf7nLXPyf3R78xYbxExVqHLK9od3038rjpyOEzW+XB130kZ1N4PZ9inTtJ471CRJ4Ituyg==} iconv-lite@0.4.24: resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} @@ -3100,8 +3071,8 @@ packages: resolution: {integrity: sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==} engines: {node: '>= 8.0.0'} - isbinaryfile@5.0.3: - resolution: {integrity: sha512-VR4gNjFaDP8csJQvzInG20JvBj8MaHYLxNOMXysxRbGM7tcsHZwCjhch3FubFtZBkuDbN55i4dUukGeIrzF+6g==} + isbinaryfile@5.0.4: + resolution: {integrity: sha512-YKBKVkKhty7s8rxddb40oOkuP0NbaeXrQvLin6QMHL7Ypiy2RW9LwOVrVgZRyOrhQlayMd9t+D8yDy8MKFTSDQ==} engines: {node: '>= 18.0.0'} isexe@2.0.0: @@ -3544,8 +3515,8 @@ packages: resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} engines: {node: '>=6'} - mini-css-extract-plugin@2.9.1: - resolution: {integrity: sha512-+Vyi+GCCOHnrJ2VPS+6aPoXN2k2jgUzDRhTFLjjTBn23qyXJXkjUWQgTL+mXpF5/A8ixLdCc6kWsoeOjKGejKQ==} + mini-css-extract-plugin@2.9.2: + resolution: {integrity: sha512-GJuACcS//jtq4kCtd5ii/M0SZf7OZRH+BxdqXZHaJfb8TJiVl+NgQRPwiYt2EuqeSkNydn/7vP+bcE27C5mb9w==} engines: {node: '>= 12.13.0'} peerDependencies: webpack: ^5.0.0 @@ -3668,6 +3639,10 @@ packages: resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} engines: {node: '>= 0.6'} + negotiator@0.6.4: + resolution: {integrity: sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==} + engines: {node: '>= 0.6'} + neo-async@2.6.2: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} @@ -3946,8 +3921,8 @@ packages: resolution: {integrity: sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==} engines: {node: '>= 0.10'} - parse5@7.2.0: - resolution: {integrity: sha512-ZkDsAOcxsUMZ4Lz5fVciOehNcJ+Gb8gTzcA4yl3wnc273BAybYWrQ+Ks/OjCjSEpjvQkDSeZbybK9qj2VHHdGA==} + parse5@7.2.1: + resolution: {integrity: sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==} parseurl@1.3.3: resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} @@ -3982,8 +3957,8 @@ packages: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} - picocolors@1.1.0: - resolution: {integrity: sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==} + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} picomatch@2.3.1: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} @@ -4227,8 +4202,8 @@ packages: regenerator-runtime@0.14.1: resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} - regex@4.3.3: - resolution: {integrity: sha512-r/AadFO7owAq1QJVeZ/nq9jNS1vyZt+6t1p/E59B56Rn2GCya+gr1KSyOzNL/er+r+B7phv5jG2xU2Nz1YkmJg==} + regex@4.4.0: + resolution: {integrity: sha512-uCUSuobNVeqUupowbdZub6ggI5/JZkYyJdDogddJr60L764oxC2pMZov1fQ3wM9bdyzUILDG+Sqx6NAKAz9rKQ==} regexp.prototype.flags@1.5.3: resolution: {integrity: sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ==} @@ -4340,8 +4315,8 @@ packages: safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - sass-loader@16.0.2: - resolution: {integrity: sha512-Ll6iXZ1EYwYT19SqW4mSBb76vSSi8JgzElmzIerhEGgzB5hRjDQIWsPmuk1UrAXkR16KJHqVY0eH+5/uw9Tmfw==} + sass-loader@16.0.3: + resolution: {integrity: sha512-gosNorT1RCkuCMyihv6FBRR7BMV06oKRAs+l4UMp1mlcVg9rWN6KMmUj3igjQwmYys4mDP3etEYJgiHRbgHCHA==} engines: {node: '>= 18.12.0'} peerDependencies: '@rspack/core': 0.x || 1.x @@ -4361,8 +4336,8 @@ packages: webpack: optional: true - sass@1.79.5: - resolution: {integrity: sha512-W1h5kp6bdhqFh2tk3DsI771MoEJjvrSY/2ihJRJS4pjIyfJCw0nTsxqhnrUzaLMOJjFchj8rOvraI/YUVjtx5g==} + sass@1.80.6: + resolution: {integrity: sha512-ccZgdHNiBF1NHBsWvacvT5rju3y1d/Eu+8Ex6c21nHp2lZGLBEtuwc415QfiI1PJa1TpCo3iXwwSRjRpn2Ckjg==} engines: {node: '>=14.0.0'} hasBin: true @@ -4459,8 +4434,8 @@ packages: engines: {node: '>=4'} hasBin: true - shiki@1.22.0: - resolution: {integrity: sha512-/t5LlhNs+UOKQCYBtl5ZsH/Vclz73GIqT2yQsCBygr8L/ppTdmpL4w3kPLoZJbMKVWtoG77Ue1feOjZfDxvMkw==} + shiki@1.22.2: + resolution: {integrity: sha512-3IZau0NdGKXhH2bBlUk4w1IHNxPh6A5B2sUpyY+8utLu2j/h1QpFkAaUA1bAMxOWWGtTWcAh531vnS4NJKS/lA==} side-channel@1.0.6: resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} @@ -4659,10 +4634,6 @@ packages: resolution: {integrity: sha512-v3YCf31atbwJQIMtPNX8hcQ+okD4NQaTuKGUWfII8eaqn+3otrbttGL1zSMZAAtiPsBztQnujVBugg/cXFUpyg==} hasBin: true - supports-color@5.5.0: - resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} - engines: {node: '>=4'} - supports-color@7.2.0: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} @@ -4702,8 +4673,8 @@ packages: uglify-js: optional: true - terser@5.34.1: - resolution: {integrity: sha512-FsJZ7iZLd/BXkz+4xrRTGJ26o/6VTjQytUk8b8OxkwcD2I+79VPJlz7qss1+zE7h8GNIScFqXcDyJ/KqBYZFVA==} + terser@5.36.0: + resolution: {integrity: sha512-IYV9eNMuFAV4THUspIRXkLakHnV6XO7FEdtKjf/mDyrnqUg9LnlOn6/RwRvM9SZjR4GUq8Nk8zj67FzVARr74w==} engines: {node: '>=10'} hasBin: true @@ -4737,10 +4708,6 @@ packages: tmpl@1.0.5: resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} - to-fast-properties@2.0.0: - resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} - engines: {node: '>=4'} - to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} @@ -4764,8 +4731,8 @@ packages: trim-lines@3.0.1: resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} - ts-api-utils@1.3.0: - resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==} + ts-api-utils@1.4.0: + resolution: {integrity: sha512-032cPxaEKwM+GT3vA5JXNzIaizx388rhsSW79vGRNGXfRRAdEAn2mvk36PvK5HnOchyWZ7afLEXqYCvPCrzuzQ==} engines: {node: '>=16'} peerDependencies: typescript: '>=4.2.0' @@ -4825,8 +4792,8 @@ packages: resolution: {integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==} engines: {node: '>=6'} - tslib@2.7.0: - resolution: {integrity: sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==} + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} tuf-js@1.1.7: resolution: {integrity: sha512-i3P9Kgw3ytjELUfpuKVDNBJvk4u5bXL6gskv572mcevPbSKCV3zt3djhmlEQ65yERjIbOSncy7U4cQJaB1CBCg==} @@ -4887,8 +4854,8 @@ packages: peerDependencies: typedoc: 0.26.x - typedoc@0.26.9: - resolution: {integrity: sha512-Rc7QpWL7EtmrT8yxV0GmhOR6xHgFnnhphbD9Suti3fz3um7ZOrou6q/g9d6+zC5PssTLZmjaW4Upmzv8T1rCcQ==} + typedoc@0.26.11: + resolution: {integrity: sha512-sFEgRRtrcDl2FxVP58Ze++ZK2UQAEvtvvH8rRlig1Ja3o7dDaMHmaBfvJmdGnNEFaLTpQsN8dpvZaTqJSu/Ugw==} engines: {node: '>= 18'} hasBin: true peerDependencies: @@ -5092,8 +5059,8 @@ packages: resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} engines: {node: '>=10.13.0'} - webpack@5.95.0: - resolution: {integrity: sha512-2t3XstrKULz41MNMBF+cJ97TyHdyQ8HCt//pqErqDvNjU9YQBnZxIHa11VXsi7F3mb5/aO2tuDxdeTPdU7xu9Q==} + webpack@5.96.1: + resolution: {integrity: sha512-l2LlBSvVZGhL4ZrPwyr8+37AunkcYj5qh8o6u2/2rzoPc8gxFJkLj1WxNgooi9pnoc06jh0BjuXnamM4qlujZA==} engines: {node: '>=10.13.0'} hasBin: true peerDependencies: @@ -5240,25 +5207,26 @@ snapshots: '@jridgewell/gen-mapping': 0.3.5 '@jridgewell/trace-mapping': 0.3.25 - '@babel/code-frame@7.25.7': + '@babel/code-frame@7.26.2': dependencies: - '@babel/highlight': 7.25.7 - picocolors: 1.1.0 + '@babel/helper-validator-identifier': 7.25.9 + js-tokens: 4.0.0 + picocolors: 1.1.1 - '@babel/compat-data@7.25.8': {} + '@babel/compat-data@7.26.2': {} - '@babel/core@7.25.8': + '@babel/core@7.26.0': dependencies: '@ampproject/remapping': 2.3.0 - '@babel/code-frame': 7.25.7 - '@babel/generator': 7.25.7 - '@babel/helper-compilation-targets': 7.25.7 - '@babel/helper-module-transforms': 7.25.7(@babel/core@7.25.8) - '@babel/helpers': 7.25.7 - '@babel/parser': 7.25.8 - '@babel/template': 7.25.7 - '@babel/traverse': 7.25.7 - '@babel/types': 7.25.8 + '@babel/code-frame': 7.26.2 + '@babel/generator': 7.26.2 + '@babel/helper-compilation-targets': 7.25.9 + '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.0) + '@babel/helpers': 7.26.0 + '@babel/parser': 7.26.2 + '@babel/template': 7.25.9 + '@babel/traverse': 7.25.9 + '@babel/types': 7.26.0 convert-source-map: 2.0.0 debug: 4.3.7 gensync: 1.0.0-beta.2 @@ -5267,226 +5235,211 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/generator@7.25.7': + '@babel/generator@7.26.2': dependencies: - '@babel/types': 7.25.8 + '@babel/parser': 7.26.2 + '@babel/types': 7.26.0 '@jridgewell/gen-mapping': 0.3.5 '@jridgewell/trace-mapping': 0.3.25 jsesc: 3.0.2 - '@babel/helper-compilation-targets@7.25.7': + '@babel/helper-compilation-targets@7.25.9': dependencies: - '@babel/compat-data': 7.25.8 - '@babel/helper-validator-option': 7.25.7 - browserslist: 4.24.0 + '@babel/compat-data': 7.26.2 + '@babel/helper-validator-option': 7.25.9 + browserslist: 4.24.2 lru-cache: 5.1.1 semver: 6.3.1 - '@babel/helper-module-imports@7.25.7': + '@babel/helper-module-imports@7.25.9': dependencies: - '@babel/traverse': 7.25.7 - '@babel/types': 7.25.8 + '@babel/traverse': 7.25.9 + '@babel/types': 7.26.0 transitivePeerDependencies: - supports-color - '@babel/helper-module-transforms@7.25.7(@babel/core@7.25.8)': + '@babel/helper-module-transforms@7.26.0(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.25.8 - '@babel/helper-module-imports': 7.25.7 - '@babel/helper-simple-access': 7.25.7 - '@babel/helper-validator-identifier': 7.25.7 - '@babel/traverse': 7.25.7 + '@babel/core': 7.26.0 + '@babel/helper-module-imports': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 + '@babel/traverse': 7.25.9 transitivePeerDependencies: - supports-color - '@babel/helper-plugin-utils@7.25.7': {} + '@babel/helper-plugin-utils@7.25.9': {} - '@babel/helper-simple-access@7.25.7': - dependencies: - '@babel/traverse': 7.25.7 - '@babel/types': 7.25.8 - transitivePeerDependencies: - - supports-color - - '@babel/helper-string-parser@7.25.7': {} + '@babel/helper-string-parser@7.25.9': {} - '@babel/helper-validator-identifier@7.25.7': {} + '@babel/helper-validator-identifier@7.25.9': {} - '@babel/helper-validator-option@7.25.7': {} - - '@babel/helpers@7.25.7': - dependencies: - '@babel/template': 7.25.7 - '@babel/types': 7.25.8 + '@babel/helper-validator-option@7.25.9': {} - '@babel/highlight@7.25.7': + '@babel/helpers@7.26.0': dependencies: - '@babel/helper-validator-identifier': 7.25.7 - chalk: 2.4.2 - js-tokens: 4.0.0 - picocolors: 1.1.0 + '@babel/template': 7.25.9 + '@babel/types': 7.26.0 - '@babel/parser@7.25.8': + '@babel/parser@7.26.2': dependencies: - '@babel/types': 7.25.8 + '@babel/types': 7.26.0 - '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.25.8)': + '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.25.8 - '@babel/helper-plugin-utils': 7.25.7 + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.25.8)': + '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.25.8 - '@babel/helper-plugin-utils': 7.25.7 + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.25.8)': + '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.25.8 - '@babel/helper-plugin-utils': 7.25.7 + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.25.8)': + '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.25.8 - '@babel/helper-plugin-utils': 7.25.7 + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-syntax-import-attributes@7.25.7(@babel/core@7.25.8)': + '@babel/plugin-syntax-import-attributes@7.26.0(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.25.8 - '@babel/helper-plugin-utils': 7.25.7 + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.25.8)': + '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.25.8 - '@babel/helper-plugin-utils': 7.25.7 + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.25.8)': + '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.25.8 - '@babel/helper-plugin-utils': 7.25.7 + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-syntax-jsx@7.25.7(@babel/core@7.25.8)': + '@babel/plugin-syntax-jsx@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.25.8 - '@babel/helper-plugin-utils': 7.25.7 + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.25.8)': + '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.25.8 - '@babel/helper-plugin-utils': 7.25.7 + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.25.8)': + '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.25.8 - '@babel/helper-plugin-utils': 7.25.7 + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.25.8)': + '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.25.8 - '@babel/helper-plugin-utils': 7.25.7 + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.25.8)': + '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.25.8 - '@babel/helper-plugin-utils': 7.25.7 + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.25.8)': + '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.25.8 - '@babel/helper-plugin-utils': 7.25.7 + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.25.8)': + '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.25.8 - '@babel/helper-plugin-utils': 7.25.7 + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.25.8)': + '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.25.8 - '@babel/helper-plugin-utils': 7.25.7 + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.25.8)': + '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.25.8 - '@babel/helper-plugin-utils': 7.25.7 + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-syntax-typescript@7.25.7(@babel/core@7.25.8)': + '@babel/plugin-syntax-typescript@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.25.8 - '@babel/helper-plugin-utils': 7.25.7 + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/runtime@7.25.7': + '@babel/runtime@7.26.0': dependencies: regenerator-runtime: 0.14.1 - '@babel/template@7.25.7': + '@babel/template@7.25.9': dependencies: - '@babel/code-frame': 7.25.7 - '@babel/parser': 7.25.8 - '@babel/types': 7.25.8 + '@babel/code-frame': 7.26.2 + '@babel/parser': 7.26.2 + '@babel/types': 7.26.0 - '@babel/traverse@7.25.7': + '@babel/traverse@7.25.9': dependencies: - '@babel/code-frame': 7.25.7 - '@babel/generator': 7.25.7 - '@babel/parser': 7.25.8 - '@babel/template': 7.25.7 - '@babel/types': 7.25.8 + '@babel/code-frame': 7.26.2 + '@babel/generator': 7.26.2 + '@babel/parser': 7.26.2 + '@babel/template': 7.25.9 + '@babel/types': 7.26.0 debug: 4.3.7 globals: 11.12.0 transitivePeerDependencies: - supports-color - '@babel/types@7.25.8': + '@babel/types@7.26.0': dependencies: - '@babel/helper-string-parser': 7.25.7 - '@babel/helper-validator-identifier': 7.25.7 - to-fast-properties: 2.0.0 + '@babel/helper-string-parser': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 - '@babylonjs/core@7.29.0': {} + '@babylonjs/core@7.32.0': {} - '@babylonjs/gui-editor@7.31.0(@babylonjs/core@7.29.0)(@babylonjs/gui@7.29.0(@babylonjs/core@7.29.0))(@types/react-dom@18.3.1)(@types/react@18.3.12)': + '@babylonjs/gui-editor@7.32.0(@babylonjs/core@7.32.0)(@babylonjs/gui@7.32.0(@babylonjs/core@7.32.0))(@types/react-dom@18.3.1)(@types/react@18.3.12)': dependencies: - '@babylonjs/core': 7.29.0 - '@babylonjs/gui': 7.29.0(@babylonjs/core@7.29.0) + '@babylonjs/core': 7.32.0 + '@babylonjs/gui': 7.32.0(@babylonjs/core@7.32.0) '@types/react': 18.3.12 '@types/react-dom': 18.3.1 - '@babylonjs/gui@7.29.0(@babylonjs/core@7.29.0)': + '@babylonjs/gui@7.32.0(@babylonjs/core@7.32.0)': dependencies: - '@babylonjs/core': 7.29.0 + '@babylonjs/core': 7.32.0 '@babylonjs/havok@1.3.10': dependencies: '@types/emscripten': 1.39.13 - '@babylonjs/inspector@7.29.0(@babylonjs/core@7.29.0)(@babylonjs/gui-editor@7.31.0(@babylonjs/core@7.29.0)(@babylonjs/gui@7.29.0(@babylonjs/core@7.29.0))(@types/react-dom@18.3.1)(@types/react@18.3.12))(@babylonjs/gui@7.29.0(@babylonjs/core@7.29.0))(@babylonjs/loaders@7.29.0(@babylonjs/core@7.29.0)(babylonjs-gltf2interface@7.31.0))(@babylonjs/materials@7.31.0(@babylonjs/core@7.29.0))(@babylonjs/serializers@7.31.0(@babylonjs/core@7.29.0)(babylonjs-gltf2interface@7.31.0))(@types/react-dom@18.3.1)(@types/react@18.3.12)': + '@babylonjs/inspector@7.32.0(@babylonjs/core@7.32.0)(@babylonjs/gui-editor@7.32.0(@babylonjs/core@7.32.0)(@babylonjs/gui@7.32.0(@babylonjs/core@7.32.0))(@types/react-dom@18.3.1)(@types/react@18.3.12))(@babylonjs/gui@7.32.0(@babylonjs/core@7.32.0))(@babylonjs/loaders@7.32.0(@babylonjs/core@7.32.0)(babylonjs-gltf2interface@7.32.0))(@babylonjs/materials@7.32.0(@babylonjs/core@7.32.0))(@babylonjs/serializers@7.32.0(@babylonjs/core@7.32.0)(babylonjs-gltf2interface@7.32.0))(@types/react-dom@18.3.1)(@types/react@18.3.12)': dependencies: - '@babylonjs/core': 7.29.0 - '@babylonjs/gui': 7.29.0(@babylonjs/core@7.29.0) - '@babylonjs/gui-editor': 7.31.0(@babylonjs/core@7.29.0)(@babylonjs/gui@7.29.0(@babylonjs/core@7.29.0))(@types/react-dom@18.3.1)(@types/react@18.3.12) - '@babylonjs/loaders': 7.29.0(@babylonjs/core@7.29.0)(babylonjs-gltf2interface@7.31.0) - '@babylonjs/materials': 7.31.0(@babylonjs/core@7.29.0) - '@babylonjs/serializers': 7.31.0(@babylonjs/core@7.29.0)(babylonjs-gltf2interface@7.31.0) + '@babylonjs/core': 7.32.0 + '@babylonjs/gui': 7.32.0(@babylonjs/core@7.32.0) + '@babylonjs/gui-editor': 7.32.0(@babylonjs/core@7.32.0)(@babylonjs/gui@7.32.0(@babylonjs/core@7.32.0))(@types/react-dom@18.3.1)(@types/react@18.3.12) + '@babylonjs/loaders': 7.32.0(@babylonjs/core@7.32.0)(babylonjs-gltf2interface@7.32.0) + '@babylonjs/materials': 7.32.0(@babylonjs/core@7.32.0) + '@babylonjs/serializers': 7.32.0(@babylonjs/core@7.32.0)(babylonjs-gltf2interface@7.32.0) '@fortawesome/fontawesome-svg-core': 6.6.0 '@fortawesome/free-regular-svg-icons': 6.6.0 '@fortawesome/free-solid-svg-icons': 6.6.0 '@types/react': 18.3.12 '@types/react-dom': 18.3.1 - '@babylonjs/loaders@7.29.0(@babylonjs/core@7.29.0)(babylonjs-gltf2interface@7.31.0)': + '@babylonjs/loaders@7.32.0(@babylonjs/core@7.32.0)(babylonjs-gltf2interface@7.32.0)': dependencies: - '@babylonjs/core': 7.29.0 - babylonjs-gltf2interface: 7.31.0 + '@babylonjs/core': 7.32.0 + babylonjs-gltf2interface: 7.32.0 - '@babylonjs/materials@7.31.0(@babylonjs/core@7.29.0)': + '@babylonjs/materials@7.32.0(@babylonjs/core@7.32.0)': dependencies: - '@babylonjs/core': 7.29.0 + '@babylonjs/core': 7.32.0 - '@babylonjs/serializers@7.31.0(@babylonjs/core@7.29.0)(babylonjs-gltf2interface@7.31.0)': + '@babylonjs/serializers@7.32.0(@babylonjs/core@7.32.0)(babylonjs-gltf2interface@7.32.0)': dependencies: - '@babylonjs/core': 7.29.0 - babylonjs-gltf2interface: 7.31.0 + '@babylonjs/core': 7.32.0 + babylonjs-gltf2interface: 7.32.0 '@bcoe/v8-coverage@0.2.3': {} @@ -5500,12 +5453,12 @@ snapshots: '@discoveryjs/json-ext@0.5.7': {} - '@eslint-community/eslint-utils@4.4.0(eslint@8.57.1)': + '@eslint-community/eslint-utils@4.4.1(eslint@8.57.1)': dependencies: eslint: 8.57.1 eslint-visitor-keys: 3.4.3 - '@eslint-community/regexpp@4.11.1': {} + '@eslint-community/regexpp@4.12.1': {} '@eslint/eslintrc@2.1.4': dependencies: @@ -5575,27 +5528,27 @@ snapshots: '@jest/console@29.7.0': dependencies: '@jest/types': 29.6.3 - '@types/node': 22.7.5 + '@types/node': 22.8.7 chalk: 4.1.2 jest-message-util: 29.7.0 jest-util: 29.7.0 slash: 3.0.0 - '@jest/core@29.7.0(ts-node@10.9.2(@types/node@22.7.5)(typescript@5.1.6))': + '@jest/core@29.7.0(ts-node@10.9.2(@types/node@22.8.7)(typescript@5.1.6))': dependencies: '@jest/console': 29.7.0 '@jest/reporters': 29.7.0 '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 22.7.5 + '@types/node': 22.8.7 ansi-escapes: 4.3.2 chalk: 4.1.2 ci-info: 3.9.0 exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@22.7.5)(ts-node@10.9.2(@types/node@22.7.5)(typescript@5.1.6)) + jest-config: 29.7.0(@types/node@22.8.7)(ts-node@10.9.2(@types/node@22.8.7)(typescript@5.1.6)) jest-haste-map: 29.7.0 jest-message-util: 29.7.0 jest-regex-util: 29.6.3 @@ -5620,7 +5573,7 @@ snapshots: dependencies: '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 22.7.5 + '@types/node': 22.8.7 jest-mock: 29.7.0 '@jest/expect-utils@29.7.0': @@ -5638,7 +5591,7 @@ snapshots: dependencies: '@jest/types': 29.6.3 '@sinonjs/fake-timers': 10.3.0 - '@types/node': 22.7.5 + '@types/node': 22.8.7 jest-message-util: 29.7.0 jest-mock: 29.7.0 jest-util: 29.7.0 @@ -5660,7 +5613,7 @@ snapshots: '@jest/transform': 29.7.0 '@jest/types': 29.6.3 '@jridgewell/trace-mapping': 0.3.25 - '@types/node': 22.7.5 + '@types/node': 22.8.7 chalk: 4.1.2 collect-v8-coverage: 1.0.2 exit: 0.1.2 @@ -5707,7 +5660,7 @@ snapshots: '@jest/transform@29.7.0': dependencies: - '@babel/core': 7.25.8 + '@babel/core': 7.26.0 '@jest/types': 29.6.3 '@jridgewell/trace-mapping': 0.3.25 babel-plugin-istanbul: 6.1.1 @@ -5730,7 +5683,7 @@ snapshots: '@jest/schemas': 29.6.3 '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 22.7.5 + '@types/node': 22.8.7 '@types/yargs': 17.0.33 chalk: 4.1.2 @@ -5761,21 +5714,21 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.0 - '@jsonjoy.com/base64@1.1.2(tslib@2.7.0)': + '@jsonjoy.com/base64@1.1.2(tslib@2.8.1)': dependencies: - tslib: 2.7.0 + tslib: 2.8.1 - '@jsonjoy.com/json-pack@1.1.0(tslib@2.7.0)': + '@jsonjoy.com/json-pack@1.1.0(tslib@2.8.1)': dependencies: - '@jsonjoy.com/base64': 1.1.2(tslib@2.7.0) - '@jsonjoy.com/util': 1.5.0(tslib@2.7.0) + '@jsonjoy.com/base64': 1.1.2(tslib@2.8.1) + '@jsonjoy.com/util': 1.5.0(tslib@2.8.1) hyperdyperid: 1.2.0 - thingies: 1.21.0(tslib@2.7.0) - tslib: 2.7.0 + thingies: 1.21.0(tslib@2.8.1) + tslib: 2.8.1 - '@jsonjoy.com/util@1.5.0(tslib@2.7.0)': + '@jsonjoy.com/util@1.5.0(tslib@2.8.1)': dependencies: - tslib: 2.7.0 + tslib: 2.8.1 '@leichtgewicht/ip-codec@2.0.5': {} @@ -6079,33 +6032,34 @@ snapshots: '@parcel/watcher-win32-arm64': 2.4.1 '@parcel/watcher-win32-ia32': 2.4.1 '@parcel/watcher-win32-x64': 2.4.1 + optional: true '@pkgjs/parseargs@0.11.0': optional: true '@rtsao/scc@1.1.0': {} - '@shikijs/core@1.22.0': + '@shikijs/core@1.22.2': dependencies: - '@shikijs/engine-javascript': 1.22.0 - '@shikijs/engine-oniguruma': 1.22.0 - '@shikijs/types': 1.22.0 + '@shikijs/engine-javascript': 1.22.2 + '@shikijs/engine-oniguruma': 1.22.2 + '@shikijs/types': 1.22.2 '@shikijs/vscode-textmate': 9.3.0 '@types/hast': 3.0.4 hast-util-to-html: 9.0.3 - '@shikijs/engine-javascript@1.22.0': + '@shikijs/engine-javascript@1.22.2': dependencies: - '@shikijs/types': 1.22.0 + '@shikijs/types': 1.22.2 '@shikijs/vscode-textmate': 9.3.0 oniguruma-to-js: 0.4.3 - '@shikijs/engine-oniguruma@1.22.0': + '@shikijs/engine-oniguruma@1.22.2': dependencies: - '@shikijs/types': 1.22.0 + '@shikijs/types': 1.22.2 '@shikijs/vscode-textmate': 9.3.0 - '@shikijs/types@1.22.0': + '@shikijs/types@1.22.2': dependencies: '@shikijs/vscode-textmate': 9.3.0 '@types/hast': 3.0.4 @@ -6207,42 +6161,42 @@ snapshots: '@types/babel__core@7.20.5': dependencies: - '@babel/parser': 7.25.8 - '@babel/types': 7.25.8 + '@babel/parser': 7.26.2 + '@babel/types': 7.26.0 '@types/babel__generator': 7.6.8 '@types/babel__template': 7.4.4 '@types/babel__traverse': 7.20.6 '@types/babel__generator@7.6.8': dependencies: - '@babel/types': 7.25.8 + '@babel/types': 7.26.0 '@types/babel__template@7.4.4': dependencies: - '@babel/parser': 7.25.8 - '@babel/types': 7.25.8 + '@babel/parser': 7.26.2 + '@babel/types': 7.26.0 '@types/babel__traverse@7.20.6': dependencies: - '@babel/types': 7.25.8 + '@babel/types': 7.26.0 '@types/body-parser@1.19.5': dependencies: '@types/connect': 3.4.38 - '@types/node': 22.7.5 + '@types/node': 22.8.7 '@types/bonjour@3.5.13': dependencies: - '@types/node': 22.7.5 + '@types/node': 22.8.7 '@types/connect-history-api-fallback@1.5.4': dependencies: - '@types/express-serve-static-core': 5.0.0 - '@types/node': 22.7.5 + '@types/express-serve-static-core': 5.0.1 + '@types/node': 22.8.7 '@types/connect@3.4.38': dependencies: - '@types/node': 22.7.5 + '@types/node': 22.8.7 '@types/d3-array@3.2.1': {} @@ -6363,20 +6317,30 @@ snapshots: '@types/emscripten@1.39.13': {} + '@types/eslint-scope@3.7.7': + dependencies: + '@types/eslint': 9.6.1 + '@types/estree': 1.0.6 + + '@types/eslint@9.6.1': + dependencies: + '@types/estree': 1.0.6 + '@types/json-schema': 7.0.15 + '@types/estree@1.0.6': {} '@types/expect@1.20.4': {} '@types/express-serve-static-core@4.19.6': dependencies: - '@types/node': 22.7.5 + '@types/node': 22.8.7 '@types/qs': 6.9.16 '@types/range-parser': 1.2.7 '@types/send': 0.17.4 - '@types/express-serve-static-core@5.0.0': + '@types/express-serve-static-core@5.0.1': dependencies: - '@types/node': 22.7.5 + '@types/node': 22.8.7 '@types/qs': 6.9.16 '@types/range-parser': 1.2.7 '@types/send': 0.17.4 @@ -6392,7 +6356,7 @@ snapshots: '@types/graceful-fs@4.1.9': dependencies: - '@types/node': 22.7.5 + '@types/node': 22.8.7 '@types/hast@3.0.4': dependencies: @@ -6404,7 +6368,7 @@ snapshots: '@types/http-proxy@1.17.15': dependencies: - '@types/node': 22.7.5 + '@types/node': 22.8.7 '@types/istanbul-lib-coverage@2.0.6': {} @@ -6416,7 +6380,7 @@ snapshots: dependencies: '@types/istanbul-lib-report': 3.0.3 - '@types/jest@29.5.13': + '@types/jest@29.5.14': dependencies: expect: 29.7.0 pretty-format: 29.7.0 @@ -6435,11 +6399,11 @@ snapshots: '@types/node-forge@1.3.11': dependencies: - '@types/node': 22.7.5 + '@types/node': 22.8.7 '@types/node@15.14.9': {} - '@types/node@22.7.5': + '@types/node@22.8.7': dependencies: undici-types: 6.19.8 @@ -6475,7 +6439,7 @@ snapshots: '@types/send@0.17.4': dependencies: '@types/mime': 1.3.5 - '@types/node': 22.7.5 + '@types/node': 22.8.7 '@types/serve-index@1.9.4': dependencies: @@ -6484,12 +6448,12 @@ snapshots: '@types/serve-static@1.15.7': dependencies: '@types/http-errors': 2.0.4 - '@types/node': 22.7.5 + '@types/node': 22.8.7 '@types/send': 0.17.4 '@types/sockjs@0.3.36': dependencies: - '@types/node': 22.7.5 + '@types/node': 22.8.7 '@types/stack-utils@2.0.3': {} @@ -6502,20 +6466,20 @@ snapshots: '@types/webpack-env@1.18.5': {} - '@types/webpack@5.28.5(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack-dev-server@5.1.0)(webpack@5.95.0))': + '@types/webpack@5.28.5(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack-dev-server@5.1.0)(webpack@5.96.1))': dependencies: - '@types/node': 22.7.5 + '@types/node': 22.8.7 tapable: 2.2.1 - webpack: 5.95.0(webpack-cli@5.1.4) + webpack: 5.96.1(webpack-cli@5.1.4) transitivePeerDependencies: - '@swc/core' - esbuild - uglify-js - webpack-cli - '@types/ws@8.5.12': + '@types/ws@8.5.13': dependencies: - '@types/node': 22.7.5 + '@types/node': 22.8.7 '@types/yargs-parser@21.0.3': {} @@ -6523,30 +6487,30 @@ snapshots: dependencies: '@types/yargs-parser': 21.0.3 - '@typescript-eslint/eslint-plugin@8.9.0(@typescript-eslint/parser@8.9.0(eslint@8.57.1)(typescript@5.1.6))(eslint@8.57.1)(typescript@5.1.6)': + '@typescript-eslint/eslint-plugin@8.12.2(@typescript-eslint/parser@8.12.2(eslint@8.57.1)(typescript@5.1.6))(eslint@8.57.1)(typescript@5.1.6)': dependencies: - '@eslint-community/regexpp': 4.11.1 - '@typescript-eslint/parser': 8.9.0(eslint@8.57.1)(typescript@5.1.6) - '@typescript-eslint/scope-manager': 8.9.0 - '@typescript-eslint/type-utils': 8.9.0(eslint@8.57.1)(typescript@5.1.6) - '@typescript-eslint/utils': 8.9.0(eslint@8.57.1)(typescript@5.1.6) - '@typescript-eslint/visitor-keys': 8.9.0 + '@eslint-community/regexpp': 4.12.1 + '@typescript-eslint/parser': 8.12.2(eslint@8.57.1)(typescript@5.1.6) + '@typescript-eslint/scope-manager': 8.12.2 + '@typescript-eslint/type-utils': 8.12.2(eslint@8.57.1)(typescript@5.1.6) + '@typescript-eslint/utils': 8.12.2(eslint@8.57.1)(typescript@5.1.6) + '@typescript-eslint/visitor-keys': 8.12.2 eslint: 8.57.1 graphemer: 1.4.0 ignore: 5.3.2 natural-compare: 1.4.0 - ts-api-utils: 1.3.0(typescript@5.1.6) + ts-api-utils: 1.4.0(typescript@5.1.6) optionalDependencies: typescript: 5.1.6 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.9.0(eslint@8.57.1)(typescript@5.1.6)': + '@typescript-eslint/parser@8.12.2(eslint@8.57.1)(typescript@5.1.6)': dependencies: - '@typescript-eslint/scope-manager': 8.9.0 - '@typescript-eslint/types': 8.9.0 - '@typescript-eslint/typescript-estree': 8.9.0(typescript@5.1.6) - '@typescript-eslint/visitor-keys': 8.9.0 + '@typescript-eslint/scope-manager': 8.12.2 + '@typescript-eslint/types': 8.12.2 + '@typescript-eslint/typescript-estree': 8.12.2(typescript@5.1.6) + '@typescript-eslint/visitor-keys': 8.12.2 debug: 4.3.7 eslint: 8.57.1 optionalDependencies: @@ -6554,54 +6518,54 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.9.0': + '@typescript-eslint/scope-manager@8.12.2': dependencies: - '@typescript-eslint/types': 8.9.0 - '@typescript-eslint/visitor-keys': 8.9.0 + '@typescript-eslint/types': 8.12.2 + '@typescript-eslint/visitor-keys': 8.12.2 - '@typescript-eslint/type-utils@8.9.0(eslint@8.57.1)(typescript@5.1.6)': + '@typescript-eslint/type-utils@8.12.2(eslint@8.57.1)(typescript@5.1.6)': dependencies: - '@typescript-eslint/typescript-estree': 8.9.0(typescript@5.1.6) - '@typescript-eslint/utils': 8.9.0(eslint@8.57.1)(typescript@5.1.6) + '@typescript-eslint/typescript-estree': 8.12.2(typescript@5.1.6) + '@typescript-eslint/utils': 8.12.2(eslint@8.57.1)(typescript@5.1.6) debug: 4.3.7 - ts-api-utils: 1.3.0(typescript@5.1.6) + ts-api-utils: 1.4.0(typescript@5.1.6) optionalDependencies: typescript: 5.1.6 transitivePeerDependencies: - eslint - supports-color - '@typescript-eslint/types@8.9.0': {} + '@typescript-eslint/types@8.12.2': {} - '@typescript-eslint/typescript-estree@8.9.0(typescript@5.1.6)': + '@typescript-eslint/typescript-estree@8.12.2(typescript@5.1.6)': dependencies: - '@typescript-eslint/types': 8.9.0 - '@typescript-eslint/visitor-keys': 8.9.0 + '@typescript-eslint/types': 8.12.2 + '@typescript-eslint/visitor-keys': 8.12.2 debug: 4.3.7 fast-glob: 3.3.2 is-glob: 4.0.3 minimatch: 9.0.5 semver: 7.6.3 - ts-api-utils: 1.3.0(typescript@5.1.6) + ts-api-utils: 1.4.0(typescript@5.1.6) optionalDependencies: typescript: 5.1.6 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.9.0(eslint@8.57.1)(typescript@5.1.6)': + '@typescript-eslint/utils@8.12.2(eslint@8.57.1)(typescript@5.1.6)': dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.1) - '@typescript-eslint/scope-manager': 8.9.0 - '@typescript-eslint/types': 8.9.0 - '@typescript-eslint/typescript-estree': 8.9.0(typescript@5.1.6) + '@eslint-community/eslint-utils': 4.4.1(eslint@8.57.1) + '@typescript-eslint/scope-manager': 8.12.2 + '@typescript-eslint/types': 8.12.2 + '@typescript-eslint/typescript-estree': 8.12.2(typescript@5.1.6) eslint: 8.57.1 transitivePeerDependencies: - supports-color - typescript - '@typescript-eslint/visitor-keys@8.9.0': + '@typescript-eslint/visitor-keys@8.12.2': dependencies: - '@typescript-eslint/types': 8.9.0 + '@typescript-eslint/types': 8.12.2 eslint-visitor-keys: 3.4.3 '@ungap/structured-clone@1.2.0': {} @@ -6682,15 +6646,15 @@ snapshots: '@webassemblyjs/ast': 1.12.1 '@xtuc/long': 4.2.2 - '@webpack-cli/configtest@2.1.1(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack-dev-server@5.1.0)(webpack@5.95.0))(webpack@5.95.0(webpack-cli@5.1.4))': + '@webpack-cli/configtest@2.1.1(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack-dev-server@5.1.0)(webpack@5.96.1))(webpack@5.96.1(webpack-cli@5.1.4))': dependencies: - webpack: 5.95.0(webpack-cli@5.1.4) - webpack-cli: 5.1.4(@webpack-cli/generators@3.0.7)(webpack-dev-server@5.1.0)(webpack@5.95.0) + webpack: 5.96.1(webpack-cli@5.1.4) + webpack-cli: 5.1.4(@webpack-cli/generators@3.0.7)(webpack-dev-server@5.1.0)(webpack@5.96.1) - '@webpack-cli/generators@3.0.7(encoding@0.1.13)(mem-fs@2.3.0)(prettier@3.3.3)(webpack-cli@5.1.4)(webpack@5.95.0)': + '@webpack-cli/generators@3.0.7(encoding@0.1.13)(mem-fs@2.3.0)(prettier@3.3.3)(webpack-cli@5.1.4)(webpack@5.96.1)': dependencies: - webpack: 5.95.0(webpack-cli@5.1.4) - webpack-cli: 5.1.4(@webpack-cli/generators@3.0.7)(webpack-dev-server@5.1.0)(webpack@5.95.0) + webpack: 5.96.1(webpack-cli@5.1.4) + webpack-cli: 5.1.4(@webpack-cli/generators@3.0.7)(webpack-dev-server@5.1.0)(webpack@5.96.1) yeoman-environment: 3.19.3 yeoman-generator: 5.10.0(encoding@0.1.13)(mem-fs@2.3.0)(yeoman-environment@3.19.3) optionalDependencies: @@ -6701,17 +6665,17 @@ snapshots: - mem-fs - supports-color - '@webpack-cli/info@2.0.2(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack-dev-server@5.1.0)(webpack@5.95.0))(webpack@5.95.0(webpack-cli@5.1.4))': + '@webpack-cli/info@2.0.2(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack-dev-server@5.1.0)(webpack@5.96.1))(webpack@5.96.1(webpack-cli@5.1.4))': dependencies: - webpack: 5.95.0(webpack-cli@5.1.4) - webpack-cli: 5.1.4(@webpack-cli/generators@3.0.7)(webpack-dev-server@5.1.0)(webpack@5.95.0) + webpack: 5.96.1(webpack-cli@5.1.4) + webpack-cli: 5.1.4(@webpack-cli/generators@3.0.7)(webpack-dev-server@5.1.0)(webpack@5.96.1) - '@webpack-cli/serve@2.0.5(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack-dev-server@5.1.0)(webpack@5.95.0))(webpack-dev-server@5.1.0(webpack-cli@5.1.4)(webpack@5.95.0))(webpack@5.95.0(webpack-cli@5.1.4))': + '@webpack-cli/serve@2.0.5(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack-dev-server@5.1.0)(webpack@5.96.1))(webpack-dev-server@5.1.0(webpack-cli@5.1.4)(webpack@5.96.1))(webpack@5.96.1(webpack-cli@5.1.4))': dependencies: - webpack: 5.95.0(webpack-cli@5.1.4) - webpack-cli: 5.1.4(@webpack-cli/generators@3.0.7)(webpack-dev-server@5.1.0)(webpack@5.95.0) + webpack: 5.96.1(webpack-cli@5.1.4) + webpack-cli: 5.1.4(@webpack-cli/generators@3.0.7)(webpack-dev-server@5.1.0)(webpack@5.96.1) optionalDependencies: - webpack-dev-server: 5.1.0(webpack-cli@5.1.4)(webpack@5.95.0) + webpack-dev-server: 5.1.0(webpack-cli@5.1.4)(webpack@5.96.1) '@xtuc/ieee754@1.2.0': {} @@ -6728,19 +6692,15 @@ snapshots: mime-types: 2.1.35 negotiator: 0.6.3 - acorn-import-attributes@1.9.5(acorn@8.12.1): + acorn-jsx@5.3.2(acorn@8.14.0): dependencies: - acorn: 8.12.1 - - acorn-jsx@5.3.2(acorn@8.12.1): - dependencies: - acorn: 8.12.1 + acorn: 8.14.0 acorn-walk@8.3.4: dependencies: - acorn: 8.12.1 + acorn: 8.14.0 - acorn@8.12.1: {} + acorn@8.14.0: {} agent-base@6.0.2: dependencies: @@ -6780,7 +6740,7 @@ snapshots: ajv@8.17.1: dependencies: fast-deep-equal: 3.1.3 - fast-uri: 3.0.2 + fast-uri: 3.0.3 json-schema-traverse: 1.0.0 require-from-string: 2.0.2 @@ -6794,10 +6754,6 @@ snapshots: ansi-regex@6.1.0: {} - ansi-styles@3.2.1: - dependencies: - color-convert: 1.9.3 - ansi-styles@4.3.0: dependencies: color-convert: 2.0.1 @@ -6899,13 +6855,13 @@ snapshots: dependencies: possible-typed-array-names: 1.0.0 - babel-jest@29.7.0(@babel/core@7.25.8): + babel-jest@29.7.0(@babel/core@7.26.0): dependencies: - '@babel/core': 7.25.8 + '@babel/core': 7.26.0 '@jest/transform': 29.7.0 '@types/babel__core': 7.20.5 babel-plugin-istanbul: 6.1.1 - babel-preset-jest: 29.6.3(@babel/core@7.25.8) + babel-preset-jest: 29.6.3(@babel/core@7.26.0) chalk: 4.1.2 graceful-fs: 4.2.11 slash: 3.0.0 @@ -6914,7 +6870,7 @@ snapshots: babel-plugin-istanbul@6.1.1: dependencies: - '@babel/helper-plugin-utils': 7.25.7 + '@babel/helper-plugin-utils': 7.25.9 '@istanbuljs/load-nyc-config': 1.1.0 '@istanbuljs/schema': 0.1.3 istanbul-lib-instrument: 5.2.1 @@ -6924,37 +6880,37 @@ snapshots: babel-plugin-jest-hoist@29.6.3: dependencies: - '@babel/template': 7.25.7 - '@babel/types': 7.25.8 + '@babel/template': 7.25.9 + '@babel/types': 7.26.0 '@types/babel__core': 7.20.5 '@types/babel__traverse': 7.20.6 - babel-preset-current-node-syntax@1.1.0(@babel/core@7.25.8): - dependencies: - '@babel/core': 7.25.8 - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.25.8) - '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.25.8) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.25.8) - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.25.8) - '@babel/plugin-syntax-import-attributes': 7.25.7(@babel/core@7.25.8) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.25.8) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.25.8) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.25.8) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.25.8) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.25.8) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.25.8) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.25.8) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.25.8) - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.25.8) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.25.8) - - babel-preset-jest@29.6.3(@babel/core@7.25.8): - dependencies: - '@babel/core': 7.25.8 + babel-preset-current-node-syntax@1.1.0(@babel/core@7.26.0): + dependencies: + '@babel/core': 7.26.0 + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.26.0) + '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.26.0) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.26.0) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.26.0) + '@babel/plugin-syntax-import-attributes': 7.26.0(@babel/core@7.26.0) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.26.0) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.26.0) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.26.0) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.26.0) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.26.0) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.26.0) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.26.0) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.26.0) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.26.0) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.26.0) + + babel-preset-jest@29.6.3(@babel/core@7.26.0): + dependencies: + '@babel/core': 7.26.0 babel-plugin-jest-hoist: 29.6.3 - babel-preset-current-node-syntax: 1.1.0(@babel/core@7.25.8) + babel-preset-current-node-syntax: 1.1.0(@babel/core@7.26.0) - babylonjs-gltf2interface@7.31.0: {} + babylonjs-gltf2interface@7.32.0: {} balanced-match@1.0.2: {} @@ -7026,12 +6982,12 @@ snapshots: dependencies: fill-range: 7.1.1 - browserslist@4.24.0: + browserslist@4.24.2: dependencies: - caniuse-lite: 1.0.30001668 - electron-to-chromium: 1.5.38 + caniuse-lite: 1.0.30001677 + electron-to-chromium: 1.5.50 node-releases: 2.0.18 - update-browserslist-db: 1.1.1(browserslist@4.24.0) + update-browserslist-db: 1.1.1(browserslist@4.24.2) bs-logger@0.2.6: dependencies: @@ -7059,8 +7015,6 @@ snapshots: dependencies: run-applescript: 7.0.0 - bytes@3.0.0: {} - bytes@3.1.2: {} cacache@15.3.0: @@ -7137,22 +7091,16 @@ snapshots: camel-case@4.1.2: dependencies: pascal-case: 3.1.2 - tslib: 2.7.0 + tslib: 2.8.1 camelcase@5.3.1: {} camelcase@6.3.0: {} - caniuse-lite@1.0.30001668: {} + caniuse-lite@1.0.30001677: {} ccount@2.0.1: {} - chalk@2.4.2: - dependencies: - ansi-styles: 3.2.1 - escape-string-regexp: 1.0.5 - supports-color: 5.5.0 - chalk@4.1.2: dependencies: ansi-styles: 4.3.0 @@ -7242,16 +7190,10 @@ snapshots: collect-v8-coverage@1.0.2: {} - color-convert@1.9.3: - dependencies: - color-name: 1.1.3 - color-convert@2.0.1: dependencies: color-name: 1.1.4 - color-name@1.1.3: {} - color-name@1.1.4: {} color-support@1.1.3: {} @@ -7280,14 +7222,14 @@ snapshots: dependencies: mime-db: 1.53.0 - compression@1.7.4: + compression@1.7.5: dependencies: - accepts: 1.3.8 - bytes: 3.0.0 + bytes: 3.1.2 compressible: 2.0.18 debug: 2.6.9 + negotiator: 0.6.4 on-headers: 1.0.2 - safe-buffer: 5.1.2 + safe-buffer: 5.2.1 vary: 1.1.2 transitivePeerDependencies: - supports-color @@ -7318,13 +7260,13 @@ snapshots: corser@2.0.1: {} - create-jest@29.7.0(@types/node@22.7.5)(ts-node@10.9.2(@types/node@22.7.5)(typescript@5.1.6)): + create-jest@29.7.0(@types/node@22.8.7)(ts-node@10.9.2(@types/node@22.8.7)(typescript@5.1.6)): dependencies: '@jest/types': 29.6.3 chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@22.7.5)(ts-node@10.9.2(@types/node@22.7.5)(typescript@5.1.6)) + jest-config: 29.7.0(@types/node@22.8.7)(ts-node@10.9.2(@types/node@22.8.7)(typescript@5.1.6)) jest-util: 29.7.0 prompts: 2.4.2 transitivePeerDependencies: @@ -7345,7 +7287,7 @@ snapshots: shebang-command: 2.0.0 which: 2.0.2 - css-loader@7.1.2(webpack@5.95.0(webpack-cli@5.1.4)): + css-loader@7.1.2(webpack@5.96.1(webpack-cli@5.1.4)): dependencies: icss-utils: 5.1.0(postcss@8.4.47) postcss: 8.4.47 @@ -7356,7 +7298,7 @@ snapshots: postcss-value-parser: 4.2.0 semver: 7.6.3 optionalDependencies: - webpack: 5.95.0(webpack-cli@5.1.4) + webpack: 5.96.1(webpack-cli@5.1.4) css-select@4.3.0: dependencies: @@ -7609,7 +7551,8 @@ snapshots: destroy@1.2.0: {} - detect-libc@1.0.3: {} + detect-libc@1.0.3: + optional: true detect-newline@3.1.0: {} @@ -7671,7 +7614,7 @@ snapshots: dot-case@3.0.4: dependencies: no-case: 3.0.4 - tslib: 2.7.0 + tslib: 2.8.1 dotenv@16.4.5: {} @@ -7683,7 +7626,7 @@ snapshots: dependencies: jake: 10.9.2 - electron-to-chromium@1.5.38: {} + electron-to-chromium@1.5.50: {} emittery@0.13.1: {} @@ -7823,17 +7766,17 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.0(@typescript-eslint/parser@8.9.0(eslint@8.57.1)(typescript@5.1.6))(eslint-import-resolver-node@0.3.9)(eslint@8.57.1): + eslint-module-utils@2.12.0(@typescript-eslint/parser@8.12.2(eslint@8.57.1)(typescript@5.1.6))(eslint-import-resolver-node@0.3.9)(eslint@8.57.1): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 8.9.0(eslint@8.57.1)(typescript@5.1.6) + '@typescript-eslint/parser': 8.12.2(eslint@8.57.1)(typescript@5.1.6) eslint: 8.57.1 eslint-import-resolver-node: 0.3.9 transitivePeerDependencies: - supports-color - eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.9.0(eslint@8.57.1)(typescript@5.1.6))(eslint@8.57.1): + eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.12.2(eslint@8.57.1)(typescript@5.1.6))(eslint@8.57.1): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.8 @@ -7844,7 +7787,7 @@ snapshots: doctrine: 2.1.0 eslint: 8.57.1 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.9.0(eslint@8.57.1)(typescript@5.1.6))(eslint-import-resolver-node@0.3.9)(eslint@8.57.1) + eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.12.2(eslint@8.57.1)(typescript@5.1.6))(eslint-import-resolver-node@0.3.9)(eslint@8.57.1) hasown: 2.0.2 is-core-module: 2.15.1 is-glob: 4.0.3 @@ -7856,7 +7799,7 @@ snapshots: string.prototype.trimend: 1.0.8 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 8.9.0(eslint@8.57.1)(typescript@5.1.6) + '@typescript-eslint/parser': 8.12.2(eslint@8.57.1)(typescript@5.1.6) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack @@ -7876,8 +7819,8 @@ snapshots: eslint@8.57.1: dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.1) - '@eslint-community/regexpp': 4.11.1 + '@eslint-community/eslint-utils': 4.4.1(eslint@8.57.1) + '@eslint-community/regexpp': 4.12.1 '@eslint/eslintrc': 2.1.4 '@eslint/js': 8.57.1 '@humanwhocodes/config-array': 0.13.0 @@ -7919,8 +7862,8 @@ snapshots: espree@9.6.1: dependencies: - acorn: 8.12.1 - acorn-jsx: 5.3.2(acorn@8.12.1) + acorn: 8.14.0 + acorn-jsx: 5.3.2(acorn@8.14.0) eslint-visitor-keys: 3.4.3 esprima@4.0.1: {} @@ -8031,7 +7974,7 @@ snapshots: fast-simplex-noise@4.0.0: {} - fast-uri@3.0.2: {} + fast-uri@3.0.3: {} fastest-levenshtein@1.0.16: {} @@ -8266,8 +8209,6 @@ snapshots: has-bigints@1.0.2: {} - has-flag@3.0.0: {} - has-flag@4.0.0: {} has-property-descriptors@1.0.2: @@ -8333,11 +8274,11 @@ snapshots: html-escaper@2.0.2: {} - html-loader@5.1.0(webpack@5.95.0(webpack-cli@5.1.4)): + html-loader@5.1.0(webpack@5.96.1(webpack-cli@5.1.4)): dependencies: html-minifier-terser: 7.2.0 - parse5: 7.2.0 - webpack: 5.95.0(webpack-cli@5.1.4) + parse5: 7.2.1 + webpack: 5.96.1(webpack-cli@5.1.4) html-minifier-terser@6.1.0: dependencies: @@ -8347,7 +8288,7 @@ snapshots: he: 1.2.0 param-case: 3.0.4 relateurl: 0.2.7 - terser: 5.34.1 + terser: 5.36.0 html-minifier-terser@7.2.0: dependencies: @@ -8357,11 +8298,11 @@ snapshots: entities: 4.5.0 param-case: 3.0.4 relateurl: 0.2.7 - terser: 5.34.1 + terser: 5.36.0 html-void-elements@3.0.0: {} - html-webpack-plugin@5.6.0(webpack@5.95.0(webpack-cli@5.1.4)): + html-webpack-plugin@5.6.3(webpack@5.96.1(webpack-cli@5.1.4)): dependencies: '@types/html-minifier-terser': 6.1.0 html-minifier-terser: 6.1.0 @@ -8369,7 +8310,7 @@ snapshots: pretty-error: 4.0.0 tapable: 2.2.1 optionalDependencies: - webpack: 5.95.0(webpack-cli@5.1.4) + webpack: 5.96.1(webpack-cli@5.1.4) htmlparser2@6.1.0: dependencies: @@ -8469,9 +8410,9 @@ snapshots: hyperdyperid@1.2.0: {} - i18next@23.16.0: + i18next@23.16.4: dependencies: - '@babel/runtime': 7.25.7 + '@babel/runtime': 7.26.0 iconv-lite@0.4.24: dependencies: @@ -8689,7 +8630,7 @@ snapshots: isbinaryfile@4.0.10: {} - isbinaryfile@5.0.3: {} + isbinaryfile@5.0.4: {} isexe@2.0.0: {} @@ -8699,8 +8640,8 @@ snapshots: istanbul-lib-instrument@5.2.1: dependencies: - '@babel/core': 7.25.8 - '@babel/parser': 7.25.8 + '@babel/core': 7.26.0 + '@babel/parser': 7.26.2 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 semver: 6.3.1 @@ -8709,8 +8650,8 @@ snapshots: istanbul-lib-instrument@6.0.3: dependencies: - '@babel/core': 7.25.8 - '@babel/parser': 7.25.8 + '@babel/core': 7.26.0 + '@babel/parser': 7.26.2 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 semver: 7.6.3 @@ -8761,7 +8702,7 @@ snapshots: '@jest/expect': 29.7.0 '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 22.7.5 + '@types/node': 22.8.7 chalk: 4.1.2 co: 4.6.0 dedent: 1.5.3 @@ -8781,16 +8722,16 @@ snapshots: - babel-plugin-macros - supports-color - jest-cli@29.7.0(@types/node@22.7.5)(ts-node@10.9.2(@types/node@22.7.5)(typescript@5.1.6)): + jest-cli@29.7.0(@types/node@22.8.7)(ts-node@10.9.2(@types/node@22.8.7)(typescript@5.1.6)): dependencies: - '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@22.7.5)(typescript@5.1.6)) + '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@22.8.7)(typescript@5.1.6)) '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 chalk: 4.1.2 - create-jest: 29.7.0(@types/node@22.7.5)(ts-node@10.9.2(@types/node@22.7.5)(typescript@5.1.6)) + create-jest: 29.7.0(@types/node@22.8.7)(ts-node@10.9.2(@types/node@22.8.7)(typescript@5.1.6)) exit: 0.1.2 import-local: 3.2.0 - jest-config: 29.7.0(@types/node@22.7.5)(ts-node@10.9.2(@types/node@22.7.5)(typescript@5.1.6)) + jest-config: 29.7.0(@types/node@22.8.7)(ts-node@10.9.2(@types/node@22.8.7)(typescript@5.1.6)) jest-util: 29.7.0 jest-validate: 29.7.0 yargs: 17.7.2 @@ -8800,12 +8741,12 @@ snapshots: - supports-color - ts-node - jest-config@29.7.0(@types/node@22.7.5)(ts-node@10.9.2(@types/node@22.7.5)(typescript@5.1.6)): + jest-config@29.7.0(@types/node@22.8.7)(ts-node@10.9.2(@types/node@22.8.7)(typescript@5.1.6)): dependencies: - '@babel/core': 7.25.8 + '@babel/core': 7.26.0 '@jest/test-sequencer': 29.7.0 '@jest/types': 29.6.3 - babel-jest: 29.7.0(@babel/core@7.25.8) + babel-jest: 29.7.0(@babel/core@7.26.0) chalk: 4.1.2 ci-info: 3.9.0 deepmerge: 4.3.1 @@ -8825,8 +8766,8 @@ snapshots: slash: 3.0.0 strip-json-comments: 3.1.1 optionalDependencies: - '@types/node': 22.7.5 - ts-node: 10.9.2(@types/node@22.7.5)(typescript@5.1.6) + '@types/node': 22.8.7 + ts-node: 10.9.2(@types/node@22.8.7)(typescript@5.1.6) transitivePeerDependencies: - babel-plugin-macros - supports-color @@ -8855,7 +8796,7 @@ snapshots: '@jest/environment': 29.7.0 '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 22.7.5 + '@types/node': 22.8.7 jest-mock: 29.7.0 jest-util: 29.7.0 @@ -8865,7 +8806,7 @@ snapshots: dependencies: '@jest/types': 29.6.3 '@types/graceful-fs': 4.1.9 - '@types/node': 22.7.5 + '@types/node': 22.8.7 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11 @@ -8891,7 +8832,7 @@ snapshots: jest-message-util@29.7.0: dependencies: - '@babel/code-frame': 7.25.7 + '@babel/code-frame': 7.26.2 '@jest/types': 29.6.3 '@types/stack-utils': 2.0.3 chalk: 4.1.2 @@ -8904,7 +8845,7 @@ snapshots: jest-mock@29.7.0: dependencies: '@jest/types': 29.6.3 - '@types/node': 22.7.5 + '@types/node': 22.8.7 jest-util: 29.7.0 jest-pnp-resolver@1.2.3(jest-resolve@29.7.0): @@ -8939,7 +8880,7 @@ snapshots: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 22.7.5 + '@types/node': 22.8.7 chalk: 4.1.2 emittery: 0.13.1 graceful-fs: 4.2.11 @@ -8967,7 +8908,7 @@ snapshots: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 22.7.5 + '@types/node': 22.8.7 chalk: 4.1.2 cjs-module-lexer: 1.4.1 collect-v8-coverage: 1.0.2 @@ -8987,15 +8928,15 @@ snapshots: jest-snapshot@29.7.0: dependencies: - '@babel/core': 7.25.8 - '@babel/generator': 7.25.7 - '@babel/plugin-syntax-jsx': 7.25.7(@babel/core@7.25.8) - '@babel/plugin-syntax-typescript': 7.25.7(@babel/core@7.25.8) - '@babel/types': 7.25.8 + '@babel/core': 7.26.0 + '@babel/generator': 7.26.2 + '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-syntax-typescript': 7.25.9(@babel/core@7.26.0) + '@babel/types': 7.26.0 '@jest/expect-utils': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - babel-preset-current-node-syntax: 1.1.0(@babel/core@7.25.8) + babel-preset-current-node-syntax: 1.1.0(@babel/core@7.26.0) chalk: 4.1.2 expect: 29.7.0 graceful-fs: 4.2.11 @@ -9013,7 +8954,7 @@ snapshots: jest-util@29.7.0: dependencies: '@jest/types': 29.6.3 - '@types/node': 22.7.5 + '@types/node': 22.8.7 chalk: 4.1.2 ci-info: 3.9.0 graceful-fs: 4.2.11 @@ -9032,7 +8973,7 @@ snapshots: dependencies: '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 22.7.5 + '@types/node': 22.8.7 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.13.1 @@ -9041,23 +8982,23 @@ snapshots: jest-worker@27.5.1: dependencies: - '@types/node': 22.7.5 + '@types/node': 22.8.7 merge-stream: 2.0.0 supports-color: 8.1.1 jest-worker@29.7.0: dependencies: - '@types/node': 22.7.5 + '@types/node': 22.8.7 jest-util: 29.7.0 merge-stream: 2.0.0 supports-color: 8.1.1 - jest@29.7.0(@types/node@22.7.5)(ts-node@10.9.2(@types/node@22.7.5)(typescript@5.1.6)): + jest@29.7.0(@types/node@22.8.7)(ts-node@10.9.2(@types/node@22.8.7)(typescript@5.1.6)): dependencies: - '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@22.7.5)(typescript@5.1.6)) + '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@22.8.7)(typescript@5.1.6)) '@jest/types': 29.6.3 import-local: 3.2.0 - jest-cli: 29.7.0(@types/node@22.7.5)(ts-node@10.9.2(@types/node@22.7.5)(typescript@5.1.6)) + jest-cli: 29.7.0(@types/node@22.8.7)(ts-node@10.9.2(@types/node@22.8.7)(typescript@5.1.6)) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -9115,14 +9056,14 @@ snapshots: launch-editor@2.9.1: dependencies: - picocolors: 1.1.0 + picocolors: 1.1.1 shell-quote: 1.8.1 less@4.2.0: dependencies: copy-anything: 2.0.6 parse-node-version: 1.0.1 - tslib: 2.7.0 + tslib: 2.8.1 optionalDependencies: errno: 0.1.8 graceful-fs: 4.2.11 @@ -9187,7 +9128,7 @@ snapshots: lower-case@2.0.2: dependencies: - tslib: 2.7.0 + tslib: 2.8.1 lru-cache@10.4.3: {} @@ -9229,7 +9170,7 @@ snapshots: minipass-fetch: 2.1.2 minipass-flush: 1.0.5 minipass-pipeline: 1.2.4 - negotiator: 0.6.3 + negotiator: 0.6.4 promise-retry: 2.0.1 socks-proxy-agent: 7.0.0 ssri: 9.0.1 @@ -9250,7 +9191,7 @@ snapshots: minipass-fetch: 3.0.5 minipass-flush: 1.0.5 minipass-pipeline: 1.2.4 - negotiator: 0.6.3 + negotiator: 0.6.4 promise-retry: 2.0.1 socks-proxy-agent: 7.0.0 ssri: 10.0.6 @@ -9271,7 +9212,7 @@ snapshots: minipass-fetch: 1.4.1 minipass-flush: 1.0.5 minipass-pipeline: 1.2.4 - negotiator: 0.6.3 + negotiator: 0.6.4 promise-retry: 2.0.1 socks-proxy-agent: 6.2.1 ssri: 8.0.1 @@ -9315,7 +9256,7 @@ snapshots: deep-extend: 0.6.0 ejs: 3.1.10 globby: 11.1.0 - isbinaryfile: 5.0.3 + isbinaryfile: 5.0.4 minimatch: 7.4.6 multimatch: 5.0.0 normalize-path: 3.0.0 @@ -9332,10 +9273,10 @@ snapshots: memfs@4.14.0: dependencies: - '@jsonjoy.com/json-pack': 1.1.0(tslib@2.7.0) - '@jsonjoy.com/util': 1.5.0(tslib@2.7.0) - tree-dump: 1.0.2(tslib@2.7.0) - tslib: 2.7.0 + '@jsonjoy.com/json-pack': 1.1.0(tslib@2.8.1) + '@jsonjoy.com/util': 1.5.0(tslib@2.8.1) + tree-dump: 1.0.2(tslib@2.8.1) + tslib: 2.8.1 merge-descriptors@1.0.3: {} @@ -9379,11 +9320,11 @@ snapshots: mimic-fn@2.1.0: {} - mini-css-extract-plugin@2.9.1(webpack@5.95.0(webpack-cli@5.1.4)): + mini-css-extract-plugin@2.9.2(webpack@5.96.1(webpack-cli@5.1.4)): dependencies: schema-utils: 4.2.0 tapable: 2.2.1 - webpack: 5.95.0(webpack-cli@5.1.4) + webpack: 5.96.1(webpack-cli@5.1.4) minimalistic-assert@1.0.1: {} @@ -9508,14 +9449,17 @@ snapshots: negotiator@0.6.3: {} + negotiator@0.6.4: {} + neo-async@2.6.2: {} no-case@3.0.4: dependencies: lower-case: 2.0.2 - tslib: 2.7.0 + tslib: 2.8.1 - node-addon-api@7.1.1: {} + node-addon-api@7.1.1: + optional: true node-fetch@2.7.0(encoding@0.1.13): dependencies: @@ -9742,7 +9686,7 @@ snapshots: oniguruma-to-js@0.4.3: dependencies: - regex: 4.3.3 + regex: 4.4.0 open@10.1.0: dependencies: @@ -9876,7 +9820,7 @@ snapshots: param-case@3.0.4: dependencies: dot-case: 3.0.4 - tslib: 2.7.0 + tslib: 2.8.1 parent-module@1.0.1: dependencies: @@ -9890,14 +9834,14 @@ snapshots: parse-json@5.2.0: dependencies: - '@babel/code-frame': 7.25.7 + '@babel/code-frame': 7.26.2 error-ex: 1.3.2 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 parse-node-version@1.0.1: {} - parse5@7.2.0: + parse5@7.2.1: dependencies: entities: 4.5.0 @@ -9906,7 +9850,7 @@ snapshots: pascal-case@3.1.2: dependencies: no-case: 3.0.4 - tslib: 2.7.0 + tslib: 2.8.1 path-exists@4.0.0: {} @@ -9925,7 +9869,7 @@ snapshots: path-type@4.0.0: {} - picocolors@1.1.0: {} + picocolors@1.1.1: {} picomatch@2.3.1: {} @@ -9949,13 +9893,13 @@ snapshots: possible-typed-array-names@1.0.0: {} - postcss-load-config@3.1.4(postcss@8.4.47)(ts-node@10.9.2(@types/node@22.7.5)(typescript@5.1.6)): + postcss-load-config@3.1.4(postcss@8.4.47)(ts-node@10.9.2(@types/node@22.8.7)(typescript@5.1.6)): dependencies: lilconfig: 2.1.0 yaml: 1.10.2 optionalDependencies: postcss: 8.4.47 - ts-node: 10.9.2(@types/node@22.7.5)(typescript@5.1.6) + ts-node: 10.9.2(@types/node@22.8.7)(typescript@5.1.6) postcss-modules-extract-imports@3.1.0(postcss@8.4.47): dependencies: @@ -9988,7 +9932,7 @@ snapshots: postcss@8.4.47: dependencies: nanoid: 3.3.7 - picocolors: 1.1.0 + picocolors: 1.1.1 source-map-js: 1.2.1 preferred-pm@3.1.4: @@ -10074,11 +10018,11 @@ snapshots: iconv-lite: 0.4.24 unpipe: 1.0.0 - raw-loader@4.0.2(webpack@5.95.0(webpack-cli@5.1.4)): + raw-loader@4.0.2(webpack@5.96.1(webpack-cli@5.1.4)): dependencies: loader-utils: 2.0.4 schema-utils: 3.3.0 - webpack: 5.95.0(webpack-cli@5.1.4) + webpack: 5.96.1(webpack-cli@5.1.4) react-is@18.3.1: {} @@ -10161,7 +10105,7 @@ snapshots: regenerator-runtime@0.14.1: {} - regex@4.3.3: {} + regex@4.4.0: {} regexp.prototype.flags@1.5.3: dependencies: @@ -10237,7 +10181,7 @@ snapshots: rxjs@7.8.1: dependencies: - tslib: 2.7.0 + tslib: 2.8.1 safe-array-concat@1.1.2: dependencies: @@ -10258,19 +10202,20 @@ snapshots: safer-buffer@2.1.2: {} - sass-loader@16.0.2(sass@1.79.5)(webpack@5.95.0(webpack-cli@5.1.4)): + sass-loader@16.0.3(sass@1.80.6)(webpack@5.96.1(webpack-cli@5.1.4)): dependencies: neo-async: 2.6.2 optionalDependencies: - sass: 1.79.5 - webpack: 5.95.0(webpack-cli@5.1.4) + sass: 1.80.6 + webpack: 5.96.1(webpack-cli@5.1.4) - sass@1.79.5: + sass@1.80.6: dependencies: - '@parcel/watcher': 2.4.1 chokidar: 4.0.1 immutable: 4.3.7 source-map-js: 1.2.1 + optionalDependencies: + '@parcel/watcher': 2.4.1 sax@1.3.0: {} @@ -10390,12 +10335,12 @@ snapshots: interpret: 1.4.0 rechoir: 0.6.2 - shiki@1.22.0: + shiki@1.22.2: dependencies: - '@shikijs/core': 1.22.0 - '@shikijs/engine-javascript': 1.22.0 - '@shikijs/engine-oniguruma': 1.22.0 - '@shikijs/types': 1.22.0 + '@shikijs/core': 1.22.2 + '@shikijs/engine-javascript': 1.22.2 + '@shikijs/engine-oniguruma': 1.22.2 + '@shikijs/types': 1.22.2 '@shikijs/vscode-textmate': 9.3.0 '@types/hast': 3.0.4 @@ -10614,9 +10559,9 @@ snapshots: strip-json-comments@3.1.1: {} - style-loader@4.0.0(webpack@5.95.0(webpack-cli@5.1.4)): + style-loader@4.0.0(webpack@5.96.1(webpack-cli@5.1.4)): dependencies: - webpack: 5.95.0(webpack-cli@5.1.4) + webpack: 5.96.1(webpack-cli@5.1.4) stylus@0.62.0: dependencies: @@ -10628,10 +10573,6 @@ snapshots: transitivePeerDependencies: - supports-color - supports-color@5.5.0: - dependencies: - has-flag: 3.0.0 - supports-color@7.2.0: dependencies: has-flag: 4.0.0 @@ -10655,19 +10596,19 @@ snapshots: terrain-generation@1.8.0: {} - terser-webpack-plugin@5.3.10(webpack@5.95.0(webpack-cli@5.1.4)): + terser-webpack-plugin@5.3.10(webpack@5.96.1(webpack-cli@5.1.4)): dependencies: '@jridgewell/trace-mapping': 0.3.25 jest-worker: 27.5.1 schema-utils: 3.3.0 serialize-javascript: 6.0.2 - terser: 5.34.1 - webpack: 5.95.0(webpack-cli@5.1.4) + terser: 5.36.0 + webpack: 5.96.1(webpack-cli@5.1.4) - terser@5.34.1: + terser@5.36.0: dependencies: '@jridgewell/source-map': 0.3.6 - acorn: 8.12.1 + acorn: 8.14.0 commander: 2.20.3 source-map-support: 0.5.21 @@ -10681,9 +10622,9 @@ snapshots: textextensions@5.16.0: {} - thingies@1.21.0(tslib@2.7.0): + thingies@1.21.0(tslib@2.8.1): dependencies: - tslib: 2.7.0 + tslib: 2.8.1 through@2.3.8: {} @@ -10695,8 +10636,6 @@ snapshots: tmpl@1.0.5: {} - to-fast-properties@2.0.0: {} - to-regex-range@5.0.1: dependencies: is-number: 7.0.0 @@ -10705,24 +10644,24 @@ snapshots: tr46@0.0.3: {} - tree-dump@1.0.2(tslib@2.7.0): + tree-dump@1.0.2(tslib@2.8.1): dependencies: - tslib: 2.7.0 + tslib: 2.8.1 treeverse@1.0.4: {} trim-lines@3.0.1: {} - ts-api-utils@1.3.0(typescript@5.1.6): + ts-api-utils@1.4.0(typescript@5.1.6): dependencies: typescript: 5.1.6 - ts-jest@29.2.5(@babel/core@7.25.8)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.25.8))(jest@29.7.0(@types/node@22.7.5)(ts-node@10.9.2(@types/node@22.7.5)(typescript@5.1.6)))(typescript@5.1.6): + ts-jest@29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(jest@29.7.0(@types/node@22.8.7)(ts-node@10.9.2(@types/node@22.8.7)(typescript@5.1.6)))(typescript@5.1.6): dependencies: bs-logger: 0.2.6 ejs: 3.1.10 fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@22.7.5)(ts-node@10.9.2(@types/node@22.7.5)(typescript@5.1.6)) + jest: 29.7.0(@types/node@22.8.7)(ts-node@10.9.2(@types/node@22.8.7)(typescript@5.1.6)) jest-util: 29.7.0 json5: 2.2.3 lodash.memoize: 4.1.2 @@ -10731,12 +10670,12 @@ snapshots: typescript: 5.1.6 yargs-parser: 21.1.1 optionalDependencies: - '@babel/core': 7.25.8 + '@babel/core': 7.26.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - babel-jest: 29.7.0(@babel/core@7.25.8) + babel-jest: 29.7.0(@babel/core@7.26.0) - ts-loader@9.5.1(typescript@5.1.6)(webpack@5.95.0(webpack-cli@5.1.4)): + ts-loader@9.5.1(typescript@5.1.6)(webpack@5.96.1(webpack-cli@5.1.4)): dependencies: chalk: 4.1.2 enhanced-resolve: 5.17.1 @@ -10744,17 +10683,17 @@ snapshots: semver: 7.6.3 source-map: 0.7.4 typescript: 5.1.6 - webpack: 5.95.0(webpack-cli@5.1.4) + webpack: 5.96.1(webpack-cli@5.1.4) - ts-node@10.9.2(@types/node@22.7.5)(typescript@5.1.6): + ts-node@10.9.2(@types/node@22.8.7)(typescript@5.1.6): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.11 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 22.7.5 - acorn: 8.12.1 + '@types/node': 22.8.7 + acorn: 8.14.0 acorn-walk: 8.3.4 arg: 4.1.3 create-require: 1.1.1 @@ -10781,7 +10720,7 @@ snapshots: minimist: 1.2.8 strip-bom: 3.0.0 - tslib@2.7.0: {} + tslib@2.8.1: {} tuf-js@1.1.7: dependencies: @@ -10842,25 +10781,25 @@ snapshots: is-typed-array: 1.1.13 possible-typed-array-names: 1.0.0 - typedoc-material-theme@1.1.0(typedoc@0.26.9(typescript@5.1.6)): + typedoc-material-theme@1.1.0(typedoc@0.26.11(typescript@5.1.6)): dependencies: '@material/material-color-utilities': 0.2.7 - typedoc: 0.26.9(typescript@5.1.6) + typedoc: 0.26.11(typescript@5.1.6) - typedoc-plugin-missing-exports@3.0.0(typedoc@0.26.9(typescript@5.1.6)): + typedoc-plugin-missing-exports@3.0.0(typedoc@0.26.11(typescript@5.1.6)): dependencies: - typedoc: 0.26.9(typescript@5.1.6) + typedoc: 0.26.11(typescript@5.1.6) - typedoc@0.26.9(typescript@5.1.6): + typedoc@0.26.11(typescript@5.1.6): dependencies: lunr: 2.3.9 markdown-it: 14.1.0 minimatch: 9.0.5 - shiki: 1.22.0 + shiki: 1.22.2 typescript: 5.1.6 yaml: 2.6.0 - typescript-plugin-css-modules@5.1.0(ts-node@10.9.2(@types/node@22.7.5)(typescript@5.1.6))(typescript@5.1.6): + typescript-plugin-css-modules@5.1.0(ts-node@10.9.2(@types/node@22.8.7)(typescript@5.1.6))(typescript@5.1.6): dependencies: '@types/postcss-modules-local-by-default': 4.0.2 '@types/postcss-modules-scope': 3.0.4 @@ -10869,12 +10808,12 @@ snapshots: less: 4.2.0 lodash.camelcase: 4.3.0 postcss: 8.4.47 - postcss-load-config: 3.1.4(postcss@8.4.47)(ts-node@10.9.2(@types/node@22.7.5)(typescript@5.1.6)) + postcss-load-config: 3.1.4(postcss@8.4.47)(ts-node@10.9.2(@types/node@22.8.7)(typescript@5.1.6)) postcss-modules-extract-imports: 3.1.0(postcss@8.4.47) postcss-modules-local-by-default: 4.0.5(postcss@8.4.47) postcss-modules-scope: 3.2.0(postcss@8.4.47) reserved-words: 0.1.2 - sass: 1.79.5 + sass: 1.80.6 source-map-js: 1.2.1 stylus: 0.62.0 tsconfig-paths: 4.2.0 @@ -10953,11 +10892,11 @@ snapshots: untildify@4.0.0: {} - update-browserslist-db@1.1.1(browserslist@4.24.0): + update-browserslist-db@1.1.1(browserslist@4.24.2): dependencies: - browserslist: 4.24.0 + browserslist: 4.24.2 escalade: 3.2.0 - picocolors: 1.1.0 + picocolors: 1.1.1 uri-js@4.4.1: dependencies: @@ -11042,12 +10981,12 @@ snapshots: webidl-conversions@3.0.1: {} - webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack-dev-server@5.1.0)(webpack@5.95.0): + webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack-dev-server@5.1.0)(webpack@5.96.1): dependencies: '@discoveryjs/json-ext': 0.5.7 - '@webpack-cli/configtest': 2.1.1(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack-dev-server@5.1.0)(webpack@5.95.0))(webpack@5.95.0(webpack-cli@5.1.4)) - '@webpack-cli/info': 2.0.2(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack-dev-server@5.1.0)(webpack@5.95.0))(webpack@5.95.0(webpack-cli@5.1.4)) - '@webpack-cli/serve': 2.0.5(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack-dev-server@5.1.0)(webpack@5.95.0))(webpack-dev-server@5.1.0(webpack-cli@5.1.4)(webpack@5.95.0))(webpack@5.95.0(webpack-cli@5.1.4)) + '@webpack-cli/configtest': 2.1.1(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack-dev-server@5.1.0)(webpack@5.96.1))(webpack@5.96.1(webpack-cli@5.1.4)) + '@webpack-cli/info': 2.0.2(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack-dev-server@5.1.0)(webpack@5.96.1))(webpack@5.96.1(webpack-cli@5.1.4)) + '@webpack-cli/serve': 2.0.5(webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack-dev-server@5.1.0)(webpack@5.96.1))(webpack-dev-server@5.1.0(webpack-cli@5.1.4)(webpack@5.96.1))(webpack@5.96.1(webpack-cli@5.1.4)) colorette: 2.0.20 commander: 10.0.1 cross-spawn: 7.0.3 @@ -11056,13 +10995,13 @@ snapshots: import-local: 3.2.0 interpret: 3.1.1 rechoir: 0.8.0 - webpack: 5.95.0(webpack-cli@5.1.4) + webpack: 5.96.1(webpack-cli@5.1.4) webpack-merge: 5.10.0 optionalDependencies: - '@webpack-cli/generators': 3.0.7(encoding@0.1.13)(mem-fs@2.3.0)(prettier@3.3.3)(webpack-cli@5.1.4)(webpack@5.95.0) - webpack-dev-server: 5.1.0(webpack-cli@5.1.4)(webpack@5.95.0) + '@webpack-cli/generators': 3.0.7(encoding@0.1.13)(mem-fs@2.3.0)(prettier@3.3.3)(webpack-cli@5.1.4)(webpack@5.96.1) + webpack-dev-server: 5.1.0(webpack-cli@5.1.4)(webpack@5.96.1) - webpack-dev-middleware@7.4.2(webpack@5.95.0(webpack-cli@5.1.4)): + webpack-dev-middleware@7.4.2(webpack@5.96.1(webpack-cli@5.1.4)): dependencies: colorette: 2.0.20 memfs: 4.14.0 @@ -11071,9 +11010,9 @@ snapshots: range-parser: 1.2.1 schema-utils: 4.2.0 optionalDependencies: - webpack: 5.95.0(webpack-cli@5.1.4) + webpack: 5.96.1(webpack-cli@5.1.4) - webpack-dev-server@5.1.0(webpack-cli@5.1.4)(webpack@5.95.0): + webpack-dev-server@5.1.0(webpack-cli@5.1.4)(webpack@5.96.1): dependencies: '@types/bonjour': 3.5.13 '@types/connect-history-api-fallback': 1.5.4 @@ -11081,12 +11020,12 @@ snapshots: '@types/serve-index': 1.9.4 '@types/serve-static': 1.15.7 '@types/sockjs': 0.3.36 - '@types/ws': 8.5.12 + '@types/ws': 8.5.13 ansi-html-community: 0.0.8 bonjour-service: 1.2.1 chokidar: 3.6.0 colorette: 2.0.20 - compression: 1.7.4 + compression: 1.7.5 connect-history-api-fallback: 2.0.0 express: 4.21.1 graceful-fs: 4.2.11 @@ -11101,11 +11040,11 @@ snapshots: serve-index: 1.9.1 sockjs: 0.3.24 spdy: 4.0.2 - webpack-dev-middleware: 7.4.2(webpack@5.95.0(webpack-cli@5.1.4)) + webpack-dev-middleware: 7.4.2(webpack@5.96.1(webpack-cli@5.1.4)) ws: 8.18.0 optionalDependencies: - webpack: 5.95.0(webpack-cli@5.1.4) - webpack-cli: 5.1.4(@webpack-cli/generators@3.0.7)(webpack-dev-server@5.1.0)(webpack@5.95.0) + webpack: 5.96.1(webpack-cli@5.1.4) + webpack-cli: 5.1.4(@webpack-cli/generators@3.0.7)(webpack-dev-server@5.1.0)(webpack@5.96.1) transitivePeerDependencies: - bufferutil - debug @@ -11120,15 +11059,15 @@ snapshots: webpack-sources@3.2.3: {} - webpack@5.95.0(webpack-cli@5.1.4): + webpack@5.96.1(webpack-cli@5.1.4): dependencies: + '@types/eslint-scope': 3.7.7 '@types/estree': 1.0.6 '@webassemblyjs/ast': 1.12.1 '@webassemblyjs/wasm-edit': 1.12.1 '@webassemblyjs/wasm-parser': 1.12.1 - acorn: 8.12.1 - acorn-import-attributes: 1.9.5(acorn@8.12.1) - browserslist: 4.24.0 + acorn: 8.14.0 + browserslist: 4.24.2 chrome-trace-event: 1.0.4 enhanced-resolve: 5.17.1 es-module-lexer: 1.5.4 @@ -11142,11 +11081,11 @@ snapshots: neo-async: 2.6.2 schema-utils: 3.3.0 tapable: 2.2.1 - terser-webpack-plugin: 5.3.10(webpack@5.95.0(webpack-cli@5.1.4)) + terser-webpack-plugin: 5.3.10(webpack@5.96.1(webpack-cli@5.1.4)) watchpack: 2.4.2 webpack-sources: 3.2.3 optionalDependencies: - webpack-cli: 5.1.4(@webpack-cli/generators@3.0.7)(webpack-dev-server@5.1.0)(webpack@5.95.0) + webpack-cli: 5.1.4(@webpack-cli/generators@3.0.7)(webpack-dev-server@5.1.0)(webpack@5.96.1) transitivePeerDependencies: - '@swc/core' - esbuild diff --git a/src/locales/en-US/objectTypes.json b/src/locales/en-US/objectTypes.json index 3ed1da59..84a0f8c7 100644 --- a/src/locales/en-US/objectTypes.json +++ b/src/locales/en-US/objectTypes.json @@ -7,6 +7,8 @@ "telluricPlanet": "Telluric Planet", "telluricMoon": "Telluric Moon", "spaceStation": "Space Station", + "spaceElevator": "Space Elevator", + "spaceElevatorClimber": "Space Elevator Climber", "anomaly": "Anomaly", "landingPad": "Landing Pad" } diff --git a/src/locales/fr-FR/objectTypes.json b/src/locales/fr-FR/objectTypes.json index 159ceea5..c45c5499 100644 --- a/src/locales/fr-FR/objectTypes.json +++ b/src/locales/fr-FR/objectTypes.json @@ -1,12 +1,14 @@ { - "starSystem": "Système Solaire", - "star": "Étoile de type {{stellarType}}", - "neutronStar": "Étoile à Neutrons", - "blackHole": "Trou Noir", - "gasPlanet": "Planète Gazeuse", - "telluricPlanet": "Planète Tellurique", - "telluricMoon": "Lune Tellurique", - "spaceStation": "Station Spatiale", - "anomaly": "Anomalie", - "landingPad": "Plateforme d'Atterrissage" + "starSystem": "Système Solaire", + "star": "Étoile de type {{stellarType}}", + "neutronStar": "Étoile à Neutrons", + "blackHole": "Trou Noir", + "gasPlanet": "Planète Gazeuse", + "telluricPlanet": "Planète Tellurique", + "telluricMoon": "Lune Tellurique", + "spaceStation": "Station Spatiale", + "spaceElevator": "Ascenseur Spatial", + "spaceElevatorClimber": "Nacelle de l'Ascenseur Spatial", + "anomaly": "Anomalie", + "landingPad": "Plateforme d'Atterrissage" } diff --git a/src/ts/alphaTestis.ts b/src/ts/alphaTestis.ts index bc022739..f4366f4e 100644 --- a/src/ts/alphaTestis.ts +++ b/src/ts/alphaTestis.ts @@ -20,17 +20,18 @@ import "../styles/index.scss"; import { Settings } from "./settings"; import { positionNearObjectBrightSide } from "./utils/positionNearObject"; import { CosmosJourneyer } from "./cosmosJourneyer"; -import { Vector3 } from "@babylonjs/core/Maths/math.vector"; import { newSeededGasPlanetModel } from "./planets/gasPlanet/gasPlanetModel"; import { SpaceShipControlsInputs } from "./spaceship/spaceShipControlsInputs"; import { newSeededStarModel } from "./stellarObjects/star/starModel"; -import { newSeededSpaceStationModel } from "./spacestation/spacestationModel"; import { StarSystemModel } from "./starSystem/starSystemModel"; import { StarSystemCoordinates } from "./utils/coordinates/universeCoordinates"; import { CustomSystemRegistry } from "./starSystem/customSystemRegistry"; import { newSeededTelluricSatelliteModel } from "./planets/telluricPlanet/telluricSatelliteModel"; import { newSeededTelluricPlanetModel } from "./planets/telluricPlanet/telluricPlanetModel"; +import { newSeededSpaceElevatorModel } from "./spacestation/spaceElevatorModel"; +import { getOrbitRadiusFromPeriod } from "./utils/physics"; +import { Quaternion } from "@babylonjs/core/Maths/math"; const engine = await CosmosJourneyer.CreateAsync(); @@ -69,11 +70,13 @@ const hecateModel = newSeededTelluricPlanetModel(253, "Hécate", [sunModel]); hecateModel.physics.minTemperature = -40; hecateModel.physics.maxTemperature = 30; +hecateModel.physics.siderealDayDuration = 6 * 60 * 60; + hecateModel.orbit.period = 60 * 60 * 24 * 365.25; hecateModel.orbit.radius = 25000 * hecateModel.radius; -hecateModel.orbit.normalToPlane = Vector3.Up(); +hecateModel.orbit.orientation = Quaternion.Identity(); -const spaceStationModel = newSeededSpaceStationModel(0, [sunModel], systemCoordinates, [hecateModel]); +const spaceStationModel = newSeededSpaceElevatorModel(0, [sunModel], systemCoordinates, hecateModel); //physicsViewer.showBody(spaceStation.aggregate.body); /*for(const landingpad of spaceStation.landingPads) { @@ -82,19 +85,18 @@ const spaceStationModel = newSeededSpaceStationModel(0, [sunModel], systemCoordi const moonModel = newSeededTelluricSatelliteModel(23, "Manaleth", [hecateModel]); moonModel.physics.mass = 2; -moonModel.physics.rotationPeriod = 7 * 60 * 60; +moonModel.physics.siderealDayDuration = 28 * 60 * 60; moonModel.physics.minTemperature = -180; moonModel.physics.maxTemperature = 200; moonModel.physics.waterAmount = 0.9; -moonModel.orbit.period = moonModel.physics.rotationPeriod; -moonModel.orbit.radius = 8 * hecateModel.radius; -moonModel.orbit.normalToPlane = Vector3.Up(); +moonModel.orbit.period = moonModel.physics.siderealDayDuration; +moonModel.orbit.radius = getOrbitRadiusFromPeriod(moonModel.orbit.period, hecateModel.physics.mass); const aresModel = newSeededTelluricPlanetModel(0.3725, "Ares", [sunModel]); if (aresModel.clouds !== null) aresModel.clouds.coverage = 1; aresModel.physics.mass = 7; -aresModel.physics.rotationPeriod = (24 * 60 * 60) / 30; +aresModel.physics.siderealDayDuration = (24 * 60 * 60) / 30; aresModel.physics.minTemperature = -30; aresModel.physics.maxTemperature = 20; aresModel.physics.pressure = 0.5; @@ -103,7 +105,6 @@ aresModel.physics.oceanLevel = 0; aresModel.orbit.period = 60 * 60 * 24 * 365.24; aresModel.orbit.radius = 25020 * hecateModel.radius; -aresModel.orbit.normalToPlane = Vector3.Up(); //aresModel.terrainSettings.continents_fragmentation = 0.0; //aresModel.terrainSettings.continent_base_height = 10e3; @@ -112,7 +113,7 @@ aresModel.orbit.normalToPlane = Vector3.Up(); const andromaqueModel = newSeededGasPlanetModel(0.28711440474126226, "Andromaque", [sunModel]); andromaqueModel.orbit.period = 60 * 60 * 24 * 365.25; andromaqueModel.orbit.radius = 25300 * hecateModel.radius; -andromaqueModel.orbit.normalToPlane = Vector3.Up(); +andromaqueModel.orbit.orientation = Quaternion.Identity(); const starSystemModel: StarSystemModel = { name: systemName, @@ -121,12 +122,12 @@ const starSystemModel: StarSystemModel = { { stellarObjects: [sunModel], planetarySystems: [ - { planets: [hecateModel], satellites: [moonModel], spaceStations: [spaceStationModel] }, - { planets: [aresModel], satellites: [], spaceStations: [] }, - { planets: [andromaqueModel], satellites: [], spaceStations: [] } + { planets: [hecateModel], satellites: [moonModel], orbitalFacilities: [spaceStationModel] }, + { planets: [aresModel], satellites: [], orbitalFacilities: [] }, + { planets: [andromaqueModel], satellites: [], orbitalFacilities: [] } ], anomalies: [], - spaceStations: [] + orbitalFacilities: [] } ] }; diff --git a/src/ts/anomalies/julia/juliaSet.ts b/src/ts/anomalies/julia/juliaSet.ts index d8a01175..23e24aea 100644 --- a/src/ts/anomalies/julia/juliaSet.ts +++ b/src/ts/anomalies/julia/juliaSet.ts @@ -18,13 +18,14 @@ import { Camera } from "@babylonjs/core/Cameras/camera"; import { JuliaSetModel } from "./juliaSetModel"; import { PostProcessType } from "../../postProcesses/postProcessTypes"; -import { Axis } from "@babylonjs/core/Maths/math.axis"; import { TransformNode } from "@babylonjs/core/Meshes"; import { Scene } from "@babylonjs/core/scene"; import { Vector3 } from "@babylonjs/core/Maths/math.vector"; import { Cullable } from "../../utils/cullable"; import { CelestialBody } from "../../architecture/celestialBody"; import { orbitalObjectTypeToDisplay } from "../../utils/strings/orbitalObjectTypeToDisplay"; +import { defaultTargetInfoCelestialBody, TargetInfo } from "../../architecture/targetable"; +import { setRotationQuaternion } from "../../uberCore/transforms/basicTransform"; export class JuliaSet implements CelestialBody, Cullable { readonly model: JuliaSetModel; @@ -36,6 +37,8 @@ export class JuliaSet implements CelestialBody, Cullable { readonly ringsUniforms = null; readonly asteroidField = null; + readonly targetInfo: TargetInfo; + /** * New Gas Planet * @param model The model to create the planet from or a seed for the planet in [-1, 1] @@ -48,7 +51,9 @@ export class JuliaSet implements CelestialBody, Cullable { this.postProcesses.push(PostProcessType.JULIA_SET); - this.getTransform().rotate(Axis.X, this.model.physics.axialTilt); + setRotationQuaternion(this.getTransform(), this.model.physics.axialTilt); + + this.targetInfo = defaultTargetInfoCelestialBody(this.getBoundingRadius()); } getTransform(): TransformNode { diff --git a/src/ts/anomalies/julia/juliaSetModel.ts b/src/ts/anomalies/julia/juliaSetModel.ts index ec57d0bc..5c5d01b6 100644 --- a/src/ts/anomalies/julia/juliaSetModel.ts +++ b/src/ts/anomalies/julia/juliaSetModel.ts @@ -18,15 +18,15 @@ import { normalRandom } from "extended-random"; import { clamp } from "../../utils/math"; import { getOrbitalPeriod, getPeriapsis, Orbit } from "../../orbit/orbit"; -import { Vector3 } from "@babylonjs/core/Maths/math.vector"; import { OrbitalObjectPhysicsInfo } from "../../architecture/physicsInfo"; import { CelestialBodyModel } from "../../architecture/celestialBody"; import { GenerationSteps } from "../../utils/generationSteps"; import { Color3 } from "@babylonjs/core/Maths/math.color"; import { AnomalyModel } from "../anomaly"; - import { getRngFromSeed } from "../../utils/getRngFromSeed"; import { OrbitalObjectType } from "../../architecture/orbitalObject"; +import { Quaternion } from "@babylonjs/core/Maths/math"; +import { Axis } from "@babylonjs/core/Maths/math.axis"; export type JuliaSetModel = AnomalyModel & { readonly type: OrbitalObjectType.JULIA_SET; @@ -51,13 +51,13 @@ export function newSeededJuliaSetModel(seed: number, name: string, parentBodies: radius: orbitRadius, p: orbitalP, period: getOrbitalPeriod(orbitRadius, parentMassSum), - normalToPlane: Vector3.Up() + orientation: Quaternion.Identity() }; const physicalProperties: OrbitalObjectPhysicsInfo = { mass: 10, - rotationPeriod: 0, - axialTilt: normalRandom(0, 0.4, rng, GenerationSteps.AXIAL_TILT) + siderealDayDuration: 0, + axialTilt: Quaternion.RotationAxis(Axis.X, normalRandom(0, 0.4, rng, GenerationSteps.AXIAL_TILT)) }; return { diff --git a/src/ts/anomalies/mandelbulb/mandelbulb.ts b/src/ts/anomalies/mandelbulb/mandelbulb.ts index f19b4b99..303b90bc 100644 --- a/src/ts/anomalies/mandelbulb/mandelbulb.ts +++ b/src/ts/anomalies/mandelbulb/mandelbulb.ts @@ -18,7 +18,6 @@ import { Camera } from "@babylonjs/core/Cameras/camera"; import { MandelbulbModel } from "./mandelbulbModel"; import { PostProcessType } from "../../postProcesses/postProcessTypes"; -import { Axis } from "@babylonjs/core/Maths/math.axis"; import { TransformNode } from "@babylonjs/core/Meshes"; import { Scene } from "@babylonjs/core/scene"; import { Vector3 } from "@babylonjs/core/Maths/math.vector"; @@ -26,6 +25,9 @@ import { Cullable } from "../../utils/cullable"; import { CelestialBody } from "../../architecture/celestialBody"; import { orbitalObjectTypeToDisplay } from "../../utils/strings/orbitalObjectTypeToDisplay"; +import { defaultTargetInfoCelestialBody, TargetInfo } from "../../architecture/targetable"; +import { setRotationQuaternion } from "../../uberCore/transforms/basicTransform"; + export class Mandelbulb implements CelestialBody, Cullable { readonly model: MandelbulbModel; @@ -36,6 +38,8 @@ export class Mandelbulb implements CelestialBody, Cullable { readonly asteroidField = null; readonly ringsUniforms = null; + readonly targetInfo: TargetInfo; + /** * New Gas Planet * @param model The model to create the planet from or a seed for the planet in [-1, 1] @@ -48,7 +52,9 @@ export class Mandelbulb implements CelestialBody, Cullable { this.postProcesses.push(PostProcessType.MANDELBULB); - this.getTransform().rotate(Axis.X, this.model.physics.axialTilt); + setRotationQuaternion(this.getTransform(), this.model.physics.axialTilt); + + this.targetInfo = defaultTargetInfoCelestialBody(this.getBoundingRadius()); } getTransform(): TransformNode { diff --git a/src/ts/anomalies/mandelbulb/mandelbulbModel.ts b/src/ts/anomalies/mandelbulb/mandelbulbModel.ts index f29b529b..403b3ac0 100644 --- a/src/ts/anomalies/mandelbulb/mandelbulbModel.ts +++ b/src/ts/anomalies/mandelbulb/mandelbulbModel.ts @@ -19,7 +19,6 @@ import { Color3 } from "@babylonjs/core/Maths/math.color"; import { normalRandom, randRange } from "extended-random"; import { clamp } from "../../utils/math"; import { getOrbitalPeriod, getPeriapsis, Orbit } from "../../orbit/orbit"; -import { Vector3 } from "@babylonjs/core/Maths/math.vector"; import { CelestialBodyModel } from "../../architecture/celestialBody"; import { GenerationSteps } from "../../utils/generationSteps"; import { OrbitalObjectPhysicsInfo } from "../../architecture/physicsInfo"; @@ -27,6 +26,8 @@ import { AnomalyModel } from "../anomaly"; import { getRngFromSeed } from "../../utils/getRngFromSeed"; import { OrbitalObjectType } from "../../architecture/orbitalObject"; +import { Quaternion } from "@babylonjs/core/Maths/math"; +import { Axis } from "@babylonjs/core/Maths/math.axis"; export type MandelbulbModel = AnomalyModel & { readonly type: OrbitalObjectType.MANDELBULB; @@ -53,13 +54,13 @@ export function newSeededMandelbulbModel(seed: number, name: string, parentBodie radius: orbitRadius, p: orbitalP, period: getOrbitalPeriod(orbitRadius, parentMassSum), - normalToPlane: Vector3.Up() + orientation: Quaternion.Identity() }; const physicalProperties: OrbitalObjectPhysicsInfo = { mass: 10, - rotationPeriod: 0, - axialTilt: normalRandom(0, 0.4, rng, GenerationSteps.AXIAL_TILT) + siderealDayDuration: 0, + axialTilt: Quaternion.RotationAxis(Axis.X, normalRandom(0, 0.4, rng, GenerationSteps.AXIAL_TILT)) }; return { diff --git a/src/ts/architecture/celestialBody.ts b/src/ts/architecture/celestialBody.ts index 5ec33466..45f29e83 100644 --- a/src/ts/architecture/celestialBody.ts +++ b/src/ts/architecture/celestialBody.ts @@ -18,11 +18,12 @@ import { OrbitalObject, OrbitalObjectModel } from "./orbitalObject"; import { HasPostProcesses } from "./hasPostProcesses"; import { CanHaveRings, CanHaveRingsModel } from "./canHaveRings"; +import { Targetable } from "./targetable"; /** * Describes all celestial bodies (a combination of OrbitalObject, CanHaveRings and HasPostProcesses) */ -export interface CelestialBody extends OrbitalObject, CanHaveRings, HasPostProcesses { +export interface CelestialBody extends OrbitalObject, CanHaveRings, HasPostProcesses, Targetable { /** * The underlying model describing the data of the celestial body */ diff --git a/src/ts/architecture/orbitalObject.ts b/src/ts/architecture/orbitalObject.ts index 12ac8c13..f2a01865 100644 --- a/src/ts/architecture/orbitalObject.ts +++ b/src/ts/architecture/orbitalObject.ts @@ -82,8 +82,8 @@ export class OrbitalObjectUtils { * @constructor */ static GetRotationAngle(object: OrbitalObject, deltaTime: number): number { - if (object.model.physics.rotationPeriod === 0) return 0; - return (2 * Math.PI * deltaTime) / object.model.physics.rotationPeriod; + if (object.model.physics.siderealDayDuration === 0) return 0; + return (2 * Math.PI * deltaTime) / object.model.physics.siderealDayDuration; } /** @@ -142,7 +142,8 @@ export const enum OrbitalObjectType { GAS_PLANET = 1002, MANDELBULB = 2000, JULIA_SET = 2001, - SPACE_STATION = 3000 + SPACE_STATION = 3000, + SPACE_ELEVATOR = 3001 } export const SatelliteTypes = [OrbitalObjectType.TELLURIC_SATELLITE, OrbitalObjectType.SPACE_STATION]; diff --git a/src/ts/architecture/physicsInfo.ts b/src/ts/architecture/physicsInfo.ts index 651ff257..80ef8ff4 100644 --- a/src/ts/architecture/physicsInfo.ts +++ b/src/ts/architecture/physicsInfo.ts @@ -15,13 +15,17 @@ // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . +import { Quaternion } from "@babylonjs/core/Maths/math"; + export type OrbitalObjectPhysicsInfo = { mass: number; /** - * Time needed for the object to rotate on its axis in seconds + * Time needed for the object to rotate 360° on its axis in seconds. + * It is slightly different from the duration of solar day which is the time it takes for the sun to be at the same position in the sky. + * @see https://en.wikipedia.org/wiki/Sidereal_time */ - rotationPeriod: number; - axialTilt: number; + siderealDayDuration: number; + axialTilt: Quaternion; }; export type StellarObjectPhysicsInfo = OrbitalObjectPhysicsInfo & { diff --git a/src/ts/architecture/planetaryMassObject.ts b/src/ts/architecture/planetaryMassObject.ts index 8eca77fa..093b4678 100644 --- a/src/ts/architecture/planetaryMassObject.ts +++ b/src/ts/architecture/planetaryMassObject.ts @@ -27,4 +27,4 @@ export interface PlanetaryMassObject extends CelestialBody { export type PlanetaryMassObjectModel = CelestialBodyModel & { readonly physics: PlanetaryMassObjectPhysicsInfo; -}; \ No newline at end of file +}; diff --git a/src/ts/architecture/stellarObject.ts b/src/ts/architecture/stellarObject.ts index df0839be..fb27ec11 100644 --- a/src/ts/architecture/stellarObject.ts +++ b/src/ts/architecture/stellarObject.ts @@ -18,6 +18,7 @@ import { PointLight } from "@babylonjs/core/Lights/pointLight"; import { CelestialBody, CelestialBodyModel } from "./celestialBody"; import { StellarObjectPhysicsInfo } from "./physicsInfo"; +import { OrbitalObjectType } from "./orbitalObject"; export interface StellarObject extends CelestialBody { model: StellarObjectModel; @@ -27,4 +28,6 @@ export interface StellarObject extends CelestialBody { export type StellarObjectModel = CelestialBodyModel & { physics: StellarObjectPhysicsInfo; + + type: OrbitalObjectType.STAR | OrbitalObjectType.NEUTRON_STAR | OrbitalObjectType.BLACK_HOLE; }; diff --git a/src/ts/architecture/targetable.ts b/src/ts/architecture/targetable.ts new file mode 100644 index 00000000..e670d170 --- /dev/null +++ b/src/ts/architecture/targetable.ts @@ -0,0 +1,29 @@ +import { Transformable } from "./transformable"; +import { HasBoundingSphere } from "./hasBoundingSphere"; +import { TypedObject } from "./typedObject"; + +export const enum ObjectTargetCursorType { + CELESTIAL_BODY, + FACILITY, + ANOMALY, + LANDING_PAD, + STAR_SYSTEM +} + +export type TargetInfo = { + type: ObjectTargetCursorType; + minDistance: number; + maxDistance: number; +}; + +export interface Targetable extends Transformable, HasBoundingSphere, TypedObject { + readonly targetInfo: TargetInfo; +} + +export function defaultTargetInfoCelestialBody(boundingRadius: number): TargetInfo { + return { + type: ObjectTargetCursorType.CELESTIAL_BODY, + minDistance: boundingRadius * 10.0, + maxDistance: 0.0 + }; +} diff --git a/src/ts/assets/materials.ts b/src/ts/assets/materials.ts index df001f13..ea367a9e 100644 --- a/src/ts/assets/materials.ts +++ b/src/ts/assets/materials.ts @@ -22,6 +22,8 @@ import { StandardMaterial } from "@babylonjs/core/Materials/standardMaterial"; import { Color3 } from "@babylonjs/core/Maths/math.color"; import { PBRMetallicRoughnessMaterial } from "@babylonjs/core/Materials/PBR/pbrMetallicRoughnessMaterial"; import { Textures } from "./textures"; +import { RegisterMaterialPlugin } from "@babylonjs/core/Materials/materialPluginManager"; +import { ClimberRingPluginMaterial } from "../materials/climberRingMaterial"; export class Materials { public static BUTTERFLY_MATERIAL: ButterflyMaterial; @@ -43,6 +45,11 @@ export class Materials { Materials.CRATE_MATERIAL.baseTexture = Textures.CRATE_ALBEDO; Materials.CRATE_MATERIAL.normalTexture = Textures.CRATE_NORMAL; Materials.CRATE_MATERIAL.metallicRoughnessTexture = Textures.CRATE_METALLIC_ROUGHNESS; + + RegisterMaterialPlugin(ClimberRingPluginMaterial.NAME, (material) => { + new ClimberRingPluginMaterial(material); + return null; + }); } static DebugMaterial(name: string, diffuse: boolean, wireframe: boolean, scene: Scene) { diff --git a/src/ts/assets/procedural/landingPad/landingPad.ts b/src/ts/assets/procedural/landingPad/landingPad.ts index 5d576f18..e45333a5 100644 --- a/src/ts/assets/procedural/landingPad/landingPad.ts +++ b/src/ts/assets/procedural/landingPad/landingPad.ts @@ -8,11 +8,10 @@ import { LandingPadMaterial } from "./landingPadMaterial"; import { Vector3 } from "@babylonjs/core/Maths/math.vector"; import { PhysicsAggregate } from "@babylonjs/core/Physics/v2/physicsAggregate"; import { CollisionMask, Settings } from "../../../settings"; -import { TypedObject } from "../../../architecture/typedObject"; import i18n from "../../../i18n"; -import { HasBoundingSphere } from "../../../architecture/hasBoundingSphere"; import { InstancedMesh } from "@babylonjs/core/Meshes/instancedMesh"; import { Objects } from "../../objects"; +import { ObjectTargetCursorType, Targetable, TargetInfo } from "../../../architecture/targetable"; export const enum LandingPadSize { SMALL = 1, @@ -20,7 +19,7 @@ export const enum LandingPadSize { LARGE = 3 } -export class LandingPad implements Transformable, TypedObject, HasBoundingSphere { +export class LandingPad implements Targetable { private readonly deck: Mesh; private readonly deckAggregate: PhysicsAggregate; @@ -33,6 +32,8 @@ export class LandingPad implements Transformable, TypedObject, HasBoundingSphere private readonly boundingRadius: number; + readonly targetInfo: TargetInfo; + constructor(padNumber: number, padSize: LandingPadSize, scene: Scene) { this.padSize = padSize; @@ -89,6 +90,12 @@ export class LandingPad implements Transformable, TypedObject, HasBoundingSphere this.crates.push(crate); } } + + this.targetInfo = { + type: ObjectTargetCursorType.LANDING_PAD, + minDistance: this.getBoundingRadius() * 4.0, + maxDistance: 2e3 + }; } update(stellarObjects: Transformable[], cameraWorldPosition: Vector3): void { diff --git a/src/ts/assets/procedural/spaceStation/landingBay.ts b/src/ts/assets/procedural/spaceStation/landingBay.ts index 0c40aa92..f1adc7a1 100644 --- a/src/ts/assets/procedural/spaceStation/landingBay.ts +++ b/src/ts/assets/procedural/spaceStation/landingBay.ts @@ -27,13 +27,13 @@ import { Axis, Space } from "@babylonjs/core/Maths/math.axis"; import { LandingPad, LandingPadSize } from "../landingPad/landingPad"; import { PhysicsAggregate } from "@babylonjs/core/Physics/v2/physicsAggregate"; import { createRing } from "../../../utils/geometry/ringBuilder"; -import { SpaceStationModel } from "../../../spacestation/spacestationModel"; import { LandingBayMaterial } from "./landingBayMaterial"; import { PhysicsShapeType } from "@babylonjs/core/Physics/v2/IPhysicsEnginePlugin"; import { getRngFromSeed } from "../../../utils/getRngFromSeed"; import { createEnvironmentAggregate } from "../../../utils/havok"; import { computeRingRotationPeriod } from "../../../utils/physics"; +import { OrbitalFacilityModel } from "../../../spacestation/orbitalFacility"; export class LandingBay { private readonly root: TransformNode; @@ -53,7 +53,7 @@ export class LandingBay { readonly landingPads: LandingPad[] = []; - constructor(stationModel: SpaceStationModel, seed: number, scene: Scene) { + constructor(stationModel: OrbitalFacilityModel, seed: number, scene: Scene) { this.root = new TransformNode("LandingBayRoot", scene); this.rng = getRngFromSeed(seed); diff --git a/src/ts/assets/procedural/spaceStation/landingBayMaterial.ts b/src/ts/assets/procedural/spaceStation/landingBayMaterial.ts index 3463e33a..87c0c7b7 100644 --- a/src/ts/assets/procedural/spaceStation/landingBayMaterial.ts +++ b/src/ts/assets/procedural/spaceStation/landingBayMaterial.ts @@ -25,8 +25,8 @@ import landingBayMaterialVertex from "../../../../shaders/landingBayMaterial/ver import { setStellarObjectUniforms, StellarObjectUniformNames } from "../../../postProcesses/uniforms/stellarObjectUniforms"; import { Textures } from "../../textures"; import { Settings } from "../../../settings"; -import { SpaceStationModel } from "../../../spacestation/spacestationModel"; import { DynamicTexture } from "@babylonjs/core/Materials/Textures/dynamicTexture"; +import { OrbitalFacilityModel } from "../../../spacestation/orbitalFacility"; const LandingBayUniformNames = { WORLD: "world", @@ -49,7 +49,7 @@ const LandingBaySamplerNames = { export class LandingBayMaterial extends ShaderMaterial { private stellarObjects: Transformable[] = []; - constructor(stationModel: SpaceStationModel, meanRadius: number, deltaRadius: number, height: number, scene: Scene) { + constructor(stationModel: OrbitalFacilityModel, meanRadius: number, deltaRadius: number, height: number, scene: Scene) { const shaderName = "landingBayMaterial"; if (Effect.ShadersStore[`${shaderName}FragmentShader`] === undefined) { Effect.ShadersStore[`${shaderName}FragmentShader`] = landingBayMaterialFragment; diff --git a/src/ts/assets/procedural/spaceStation/ringHabitat.ts b/src/ts/assets/procedural/spaceStation/ringHabitat.ts index 4825e8ed..650c52e5 100644 --- a/src/ts/assets/procedural/spaceStation/ringHabitat.ts +++ b/src/ts/assets/procedural/spaceStation/ringHabitat.ts @@ -26,12 +26,12 @@ import { Mesh } from "@babylonjs/core/Meshes/mesh"; import { MetalSectionMaterial } from "./metalSectionMaterial"; import { Vector3 } from "@babylonjs/core/Maths/math.vector"; import { createRing } from "../../../utils/geometry/ringBuilder"; -import { SpaceStationModel } from "../../../spacestation/spacestationModel"; import { PhysicsAggregate } from "@babylonjs/core/Physics/v2/physicsAggregate"; import { PhysicsShapeType } from "@babylonjs/core/Physics/v2/IPhysicsEnginePlugin"; import { getRngFromSeed } from "../../../utils/getRngFromSeed"; import { createEnvironmentAggregate } from "../../../utils/havok"; import { computeRingRotationPeriod } from "../../../utils/physics"; +import { OrbitalFacilityModel } from "../../../spacestation/orbitalFacility"; export class RingHabitat implements Transformable { private readonly root: TransformNode; @@ -54,7 +54,7 @@ export class RingHabitat implements Transformable { readonly habitableSurface: number; - constructor(stationModel: SpaceStationModel, requiredHabitableSurface: number, seed: number, scene: Scene) { + constructor(stationModel: OrbitalFacilityModel, requiredHabitableSurface: number, seed: number, scene: Scene) { this.root = new TransformNode("RingHabitatRoot", scene); this.rng = getRngFromSeed(seed); diff --git a/src/ts/assets/procedural/spaceStation/ringHabitatMaterial.ts b/src/ts/assets/procedural/spaceStation/ringHabitatMaterial.ts index 51539a77..27adc06a 100644 --- a/src/ts/assets/procedural/spaceStation/ringHabitatMaterial.ts +++ b/src/ts/assets/procedural/spaceStation/ringHabitatMaterial.ts @@ -24,7 +24,8 @@ import ringHabitatMaterialFragment from "../../../../shaders/ringHabitatMaterial import ringHabitatMaterialVertex from "../../../../shaders/ringHabitatMaterial/vertex.glsl"; import { setStellarObjectUniforms, StellarObjectUniformNames } from "../../../postProcesses/uniforms/stellarObjectUniforms"; import { Textures } from "../../textures"; -import { SpaceStationModel } from "../../../spacestation/spacestationModel"; + +import { OrbitalFacilityModel } from "../../../spacestation/orbitalFacility"; const RingHabitatUniformNames = { WORLD: "world", @@ -46,7 +47,7 @@ const RingHabitatSamplerNames = { export class RingHabitatMaterial extends ShaderMaterial { private stellarObjects: Transformable[] = []; - constructor(stationModel: SpaceStationModel, meanRadius: number, deltaRadius: number, height: number, scene: Scene) { + constructor(stationModel: OrbitalFacilityModel, meanRadius: number, deltaRadius: number, height: number, scene: Scene) { const shaderName = "ringHabitatMaterial"; if (Effect.ShadersStore[`${shaderName}FragmentShader`] === undefined) { Effect.ShadersStore[`${shaderName}FragmentShader`] = ringHabitatMaterialFragment; diff --git a/src/ts/blackHoleDemo.ts b/src/ts/blackHoleDemo.ts index 6d9afb06..5e736861 100644 --- a/src/ts/blackHoleDemo.ts +++ b/src/ts/blackHoleDemo.ts @@ -24,6 +24,8 @@ import { newSeededBlackHoleModel } from "./stellarObjects/blackHole/blackHoleMod import { StarSystemModel } from "./starSystem/starSystemModel"; import { CustomSystemRegistry } from "./starSystem/customSystemRegistry"; import { newSeededTelluricPlanetModel } from "./planets/telluricPlanet/telluricPlanetModel"; +import { Axis } from "@babylonjs/core/Maths/math.axis"; +import { Quaternion } from "@babylonjs/core/Maths/math"; const engine = await CosmosJourneyer.CreateAsync(); @@ -35,7 +37,7 @@ const blackHoleModel = newSeededBlackHoleModel(42, "Gargantua", []); const millerPlanetModel = newSeededTelluricPlanetModel(47, "Miller", [blackHoleModel]); millerPlanetModel.orbit.radius = blackHoleModel.physics.accretionDiskRadius * 4; -millerPlanetModel.orbit.normalToPlane.x += 0.2; +millerPlanetModel.orbit.orientation = Quaternion.RotationAxis(Axis.X, 0.2); const starSystemModel: StarSystemModel = { name: "Black Hole Demo", @@ -50,9 +52,9 @@ const starSystemModel: StarSystemModel = { subSystems: [ { stellarObjects: [blackHoleModel], - planetarySystems: [{ planets: [millerPlanetModel], satellites: [], spaceStations: [] }], + planetarySystems: [{ planets: [millerPlanetModel], satellites: [], orbitalFacilities: [] }], anomalies: [], - spaceStations: [] + orbitalFacilities: [] } ] }; diff --git a/src/ts/cosmosJourneyer.ts b/src/ts/cosmosJourneyer.ts index c6b45668..67610721 100644 --- a/src/ts/cosmosJourneyer.ts +++ b/src/ts/cosmosJourneyer.ts @@ -404,7 +404,7 @@ export class CosmosJourneyer { const nearestOrbitalObject = this.starSystemView.getStarSystem().getNearestOrbitalObject(shipPosition); const correspondingSpaceStation = this.starSystemView .getStarSystem() - .getSpaceStations() + .getOrbitalFacilities() .find((station) => station === nearestOrbitalObject); if (correspondingSpaceStation === undefined) { throw new Error("Tried loading a save with a pad number, but the closest orbital objects does not have landing pads!"); diff --git a/src/ts/materials/climberRingMaterial.ts b/src/ts/materials/climberRingMaterial.ts new file mode 100644 index 00000000..3646f479 --- /dev/null +++ b/src/ts/materials/climberRingMaterial.ts @@ -0,0 +1,74 @@ +import { MaterialPluginBase } from "@babylonjs/core/Materials/materialPluginBase"; +import { Material } from "@babylonjs/core/Materials/material"; +import { MaterialDefines, ShaderLanguage } from "@babylonjs/core"; +import { Scene } from "@babylonjs/core/scene"; +import { AbstractMesh } from "@babylonjs/core/Meshes/abstractMesh"; +import { Nullable } from "@babylonjs/core/types"; +import { Textures } from "../assets/textures"; +import { PBRMetallicRoughnessMaterial } from "@babylonjs/core/Materials/PBR/pbrMetallicRoughnessMaterial"; + +/** + * Extend from MaterialPluginBase to create your plugin. + */ +export class ClimberRingPluginMaterial extends MaterialPluginBase { + static NAME = "ClimberRingPluginMaterial"; + + constructor(material: Material) { + super(material, ClimberRingPluginMaterial.NAME, 200); + } + + setEnabled(enabled: boolean) { + this._enable(enabled); + } + + // Also, you should always associate a define with your plugin because the list of defines (and their values) + // is what triggers a recompilation of the shader: a shader is recompiled only if a value of a define changes. + prepareDefines(defines: MaterialDefines, scene: Scene, mesh: AbstractMesh) { + super.prepareDefines(defines, scene, mesh); + } + + getClassName() { + return "BlackAndWhitePluginMaterial"; + } + + // This is used to inform the system which language is supported + isCompatible(shaderLanguage: ShaderLanguage): boolean { + switch (shaderLanguage) { + case ShaderLanguage.GLSL: + case ShaderLanguage.WGSL: + return true; + default: + return false; + } + } + + getCustomCode(shaderType: string, shaderLanguage?: ShaderLanguage): Nullable<{ [p: string]: string }> { + if (shaderType === "vertex") { + return { + CUSTOM_VERTEX_UPDATE_POSITION: ` + uvUpdated.y = fract(5.0 * uvUpdated.y); + uvUpdated = fract(2.0 * uvUpdated); + ` + }; + } + + // for other shader types we're not doing anything, return null + return null; + } +} + +export class ClimberRingMaterial extends PBRMetallicRoughnessMaterial { + constructor(name: string, scene: Scene) { + super(name, scene); + + this.baseTexture = Textures.CRATE_ALBEDO; + this.normalTexture = Textures.CRATE_NORMAL; + this.metallicRoughnessTexture = Textures.CRATE_METALLIC_ROUGHNESS; + + const plugin = this.pluginManager?.getPlugin(ClimberRingPluginMaterial.NAME); + if (plugin === null) { + throw new Error("Plugin not found"); + } + (plugin as ClimberRingPluginMaterial).setEnabled(true); + } +} diff --git a/src/ts/missions/generateSightSeeingMissions.ts b/src/ts/missions/generateSightSeeingMissions.ts index ae096721..504c44be 100644 --- a/src/ts/missions/generateSightSeeingMissions.ts +++ b/src/ts/missions/generateSightSeeingMissions.ts @@ -16,7 +16,6 @@ // along with this program. If not, see . import { getNeighborStarSystemCoordinates } from "../utils/getNeighborStarSystems"; -import { SpaceStationModel } from "../spacestation/spacestationModel"; import { newSightSeeingMission } from "./sightSeeingMission"; import { uniformRandBool } from "extended-random"; import { SystemObjectType } from "../utils/coordinates/universeCoordinates"; @@ -27,6 +26,7 @@ import { StarSystemModel, StarSystemModelUtils } from "../starSystem/starSystemM import { getRngFromSeed } from "../utils/getRngFromSeed"; import { getSystemModelFromCoordinates } from "../starSystem/modelFromCoordinates"; import { OrbitalObjectType } from "../architecture/orbitalObject"; +import { OrbitalFacilityModel } from "../spacestation/orbitalFacility"; /** * Generates sightseeing missions available at the given space station for the player. Missions are generated based on the current timestamp (hourly basis). @@ -35,7 +35,7 @@ import { OrbitalObjectType } from "../architecture/orbitalObject"; * @param player The player for which the missions are generated * @param timestampMillis The current timestamp in milliseconds */ -export function generateSightseeingMissions(spaceStationModel: SpaceStationModel, starSystemModel: StarSystemModel, player: Player, timestampMillis: number): Mission[] { +export function generateSightseeingMissions(spaceStationModel: OrbitalFacilityModel, starSystemModel: StarSystemModel, player: Player, timestampMillis: number): Mission[] { const currentHour = Math.floor(timestampMillis / 1000 / 60 / 60); const starSystem = starSystemModel; diff --git a/src/ts/missions/mission.ts b/src/ts/missions/mission.ts index 8e93eda2..ac7196f6 100644 --- a/src/ts/missions/mission.ts +++ b/src/ts/missions/mission.ts @@ -17,11 +17,11 @@ import { MissionNode, MissionNodeSerialized } from "./nodes/missionNode"; import { MissionContext } from "./missionContext"; -import { SpaceStationModel } from "../spacestation/spacestationModel"; import { getObjectModelByUniverseId, getUniverseIdForSpaceStationModel } from "../utils/coordinates/orbitalObjectId"; import i18n from "../i18n"; import { StarSystemCoordinates, UniverseObjectId } from "../utils/coordinates/universeCoordinates"; import { deserializeMissionNode } from "./nodes/deserializeNode"; +import { OrbitalFacilityModel } from "../spacestation/orbitalFacility"; /** * Registered mission types. Those are used to display localized strings in the UI @@ -60,7 +60,7 @@ export class Mission { /** * The space station that gave the mission */ - readonly missionGiver: SpaceStationModel; + readonly missionGiver: OrbitalFacilityModel; /** * The type of the mission (useful for displaying localized strings) @@ -74,7 +74,7 @@ export class Mission { * @param missionGiver The space station that gave the mission * @param missionType The type of the mission (useful for displaying localized strings) */ - constructor(tree: MissionNode, reward: number, missionGiver: SpaceStationModel, missionType: MissionType) { + constructor(tree: MissionNode, reward: number, missionGiver: OrbitalFacilityModel, missionType: MissionType) { this.tree = tree; this.reward = reward; this.missionGiver = missionGiver; @@ -166,7 +166,7 @@ export class Mission { return new Mission( deserializeMissionNode(missionSerialized.tree), missionSerialized.reward, - getObjectModelByUniverseId(missionSerialized.missionGiver) as SpaceStationModel, + getObjectModelByUniverseId(missionSerialized.missionGiver) as OrbitalFacilityModel, missionSerialized.type ); } diff --git a/src/ts/missions/sightSeeingMission.ts b/src/ts/missions/sightSeeingMission.ts index d5c28d4b..aebbc77e 100644 --- a/src/ts/missions/sightSeeingMission.ts +++ b/src/ts/missions/sightSeeingMission.ts @@ -16,7 +16,6 @@ // along with this program. If not, see . import { Mission, MissionType } from "./mission"; -import { SpaceStationModel } from "../spacestation/spacestationModel"; import { SystemObjectType, UniverseObjectId } from "../utils/coordinates/universeCoordinates"; import { getStarGalacticPosition } from "../utils/coordinates/starSystemCoordinatesUtils"; import { Vector3 } from "@babylonjs/core/Maths/math.vector"; @@ -24,6 +23,7 @@ import { MissionNode } from "./nodes/missionNode"; import { MissionFlyByNode } from "./nodes/actions/sightseeing/missionFlyByNode"; import { MissionTerminatorLandingNode } from "./nodes/actions/sightseeing/missionTerminatorLandingNode"; import { MissionAsteroidFieldNode } from "./nodes/actions/sightseeing/missionAsteroidFieldNode"; +import { OrbitalFacilityModel } from "../spacestation/orbitalFacility"; /** * Sightseeing mission types are a subset of mission types. @@ -57,7 +57,7 @@ function generateMissionTree(target: SightSeeingTarget): MissionNode { * @param target The target of the sightseeing mission. * @returns The new sightseeing mission. */ -export function newSightSeeingMission(missionGiver: SpaceStationModel, target: SightSeeingTarget): Mission { +export function newSightSeeingMission(missionGiver: OrbitalFacilityModel, target: SightSeeingTarget): Mission { const missionTree = generateMissionTree(target); const targetSystemCoordinates = target.objectId.starSystemCoordinates; diff --git a/src/ts/orbit/orbit.ts b/src/ts/orbit/orbit.ts index 0b25c568..0f40070a 100644 --- a/src/ts/orbit/orbit.ts +++ b/src/ts/orbit/orbit.ts @@ -15,14 +15,15 @@ // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . -import { Matrix, Vector3 } from "@babylonjs/core/Maths/math.vector"; +import { Vector3 } from "@babylonjs/core/Maths/math.vector"; import { Settings } from "../settings"; +import { Quaternion } from "@babylonjs/core/Maths/math"; export type Orbit = { radius: number; p: number; period: number; - normalToPlane: Vector3; + orientation: Quaternion; }; /** @@ -50,14 +51,9 @@ export function getPointOnOrbitLocal(settings: Orbit, t: number): Vector3 { * @returns */ export function getPointOnOrbit(centerOfMass: Vector3, settings: Orbit, t: number): Vector3 { - const localPosition = getPointOnOrbitLocal(settings, t); - - // rotate orbital plane - const rotationAxis = Vector3.Up().equalsWithEpsilon(settings.normalToPlane) ? Vector3.Up() : Vector3.Cross(Vector3.Up(), settings.normalToPlane).normalize(); - const angle = Vector3.GetAngleBetweenVectors(Vector3.Up(), settings.normalToPlane, rotationAxis); - const rotationMatrix = Matrix.RotationAxis(rotationAxis, angle); - - return Vector3.TransformCoordinates(localPosition, rotationMatrix).addInPlace(centerOfMass); + return getPointOnOrbitLocal(settings, t) // local position + .applyRotationQuaternionInPlace(settings.orientation) // apply orbit orientation + .addInPlace(centerOfMass); // translate to center of mass } /** diff --git a/src/ts/orbit/orbitRenderer.ts b/src/ts/orbit/orbitRenderer.ts index a0ad4141..c55bfe00 100644 --- a/src/ts/orbit/orbitRenderer.ts +++ b/src/ts/orbit/orbitRenderer.ts @@ -17,7 +17,6 @@ import { CreateGreasedLine, GreasedLineBaseMesh } from "@babylonjs/core/Meshes"; import { Vector3 } from "@babylonjs/core/Maths/math"; -import { setUpVector } from "../uberCore/transforms/basicTransform"; import { getPointOnOrbitLocal } from "./orbit"; import { OrbitalObject } from "../architecture/orbitalObject"; import { Scene } from "@babylonjs/core/scene"; @@ -98,10 +97,8 @@ export class OrbitRenderer { parentBarycenter.scaleInPlace(1 / massSum); orbitMesh.position = parentBarycenter; + orbitMesh.rotationQuaternion = orbitalObject.model.orbit.orientation; orbitMesh.computeWorldMatrix(true); - - const normalToPlane = orbitalObject.model.orbit.normalToPlane; - setUpVector(orbitMesh, normalToPlane); } } diff --git a/src/ts/planets/gasPlanet/gasPlanet.ts b/src/ts/planets/gasPlanet/gasPlanet.ts index 28133ee4..ae52a675 100644 --- a/src/ts/planets/gasPlanet/gasPlanet.ts +++ b/src/ts/planets/gasPlanet/gasPlanet.ts @@ -18,7 +18,6 @@ import { GasPlanetMaterial } from "./gasPlanetMaterial"; import { GasPlanetModel } from "./gasPlanetModel"; import { MeshBuilder } from "@babylonjs/core/Meshes/meshBuilder"; -import { Axis } from "@babylonjs/core/Maths/math.axis"; import { Mesh } from "@babylonjs/core/Meshes/mesh"; import { PostProcessType } from "../../postProcesses/postProcessTypes"; import { isSizeOnScreenEnough } from "../../utils/isObjectVisibleOnScreen"; @@ -36,6 +35,9 @@ import { AsteroidField } from "../../asteroidFields/asteroidField"; import { orbitalObjectTypeToDisplay } from "../../utils/strings/orbitalObjectTypeToDisplay"; import { Planet } from "../../architecture/planet"; +import { defaultTargetInfoCelestialBody, TargetInfo } from "../../architecture/targetable"; +import { setRotationQuaternion } from "../../uberCore/transforms/basicTransform"; + export class GasPlanet implements Planet, Cullable { private readonly mesh: Mesh; readonly material: GasPlanetMaterial; @@ -48,6 +50,8 @@ export class GasPlanet implements Planet, Cullable { readonly ringsUniforms: RingsUniforms | null; readonly asteroidField: AsteroidField | null; + readonly targetInfo: TargetInfo; + /** * New Gas Planet * @param model The model to create the planet from or a seed for the planet in [-1, 1] @@ -95,7 +99,9 @@ export class GasPlanet implements Planet, Cullable { this.asteroidField = null; } - this.getTransform().rotate(Axis.X, this.model.physics.axialTilt); + setRotationQuaternion(this.getTransform(), this.model.physics.axialTilt); + + this.targetInfo = defaultTargetInfoCelestialBody(this.getBoundingRadius()); } updateMaterial(stellarObjects: Transformable[], deltaSeconds: number): void { diff --git a/src/ts/planets/gasPlanet/gasPlanetModel.ts b/src/ts/planets/gasPlanet/gasPlanetModel.ts index 30935167..7231a67c 100644 --- a/src/ts/planets/gasPlanet/gasPlanetModel.ts +++ b/src/ts/planets/gasPlanet/gasPlanetModel.ts @@ -21,7 +21,6 @@ import { Quaternion } from "@babylonjs/core/Maths/math"; import { Axis } from "@babylonjs/core/Maths/math.axis"; import { clamp } from "../../utils/math"; import { getOrbitalPeriod, getPeriapsis, Orbit } from "../../orbit/orbit"; -import { Vector3 } from "@babylonjs/core/Maths/math.vector"; import { PlanetaryMassObjectPhysicsInfo } from "../../architecture/physicsInfo"; import { CelestialBodyModel } from "../../architecture/celestialBody"; import { newSeededRingsModel } from "../../rings/ringsModel"; @@ -50,21 +49,19 @@ export function newSeededGasPlanetModel(seed: number, name: string, parentBodies orbitRadius += maxRadius * 1.5; } - const orbitalPlaneNormal = Vector3.Up().applyRotationQuaternionInPlace(Quaternion.RotationAxis(Axis.X, (rng(GenerationSteps.ORBIT + 20) - 0.5) * 0.2)); - const parentMassSum = parentBodies.reduce((sum, body) => sum + body.physics.mass, 0); const orbit: Orbit = { radius: orbitRadius, p: 2, //orbitalP, period: getOrbitalPeriod(orbitRadius, parentMassSum), - normalToPlane: orbitalPlaneNormal + orientation: Quaternion.RotationAxis(Axis.X, (rng(GenerationSteps.ORBIT + 20 - 0.5) * 0.2)) }; const physicalProperties: PlanetaryMassObjectPhysicsInfo = { //FIXME: when Settings.Earth radius gets to 1:1 scale, change this value by a variable in settings mass: Settings.JUPITER_MASS * (radius / 69_911e3) ** 3, - axialTilt: normalRandom(0, 0.4, rng, GenerationSteps.AXIAL_TILT), - rotationPeriod: (24 * 60 * 60) / 10, + axialTilt: Quaternion.RotationAxis(Axis.X, normalRandom(0, 0.4, rng, GenerationSteps.AXIAL_TILT)), + siderealDayDuration: (24 * 60 * 60) / 10, minTemperature: -180, maxTemperature: 200, pressure: 1 diff --git a/src/ts/planets/telluricPlanet/telluricPlanet.ts b/src/ts/planets/telluricPlanet/telluricPlanet.ts index f6faee58..a6b5eb66 100644 --- a/src/ts/planets/telluricPlanet/telluricPlanet.ts +++ b/src/ts/planets/telluricPlanet/telluricPlanet.ts @@ -17,7 +17,6 @@ import { Direction } from "../../utils/direction"; import { Vector3 } from "@babylonjs/core/Maths/math.vector"; -import { Axis } from "@babylonjs/core/Maths/math.axis"; import { TelluricPlanetMaterial } from "./telluricPlanetMaterial"; import { TelluricPlanetaryMassObjectModel } from "./telluricPlanetaryMassObjectModel"; import { PostProcessType } from "../../postProcesses/postProcessTypes"; @@ -32,11 +31,13 @@ import { TransformNode } from "@babylonjs/core/Meshes"; import { PhysicsAggregate } from "@babylonjs/core/Physics/v2/physicsAggregate"; import { PhysicsShapeType } from "@babylonjs/core/Physics/v2/IPhysicsEnginePlugin"; import { RingsUniforms } from "../../rings/ringsUniform"; -import { rotate } from "../../uberCore/transforms/basicTransform"; +import { setRotationQuaternion } from "../../uberCore/transforms/basicTransform"; import { CloudsUniforms } from "../../clouds/cloudsUniforms"; import { Scene } from "@babylonjs/core/scene"; import { AsteroidField } from "../../asteroidFields/asteroidField"; import { orbitalObjectTypeToDisplay } from "../../utils/strings/orbitalObjectTypeToDisplay"; +import { OrbitalObjectType } from "../../architecture/orbitalObject"; +import { defaultTargetInfoCelestialBody, TargetInfo } from "../../architecture/targetable"; export class TelluricPlanet implements PlanetaryMassObject, Cullable { readonly sides: ChunkTree[]; // stores the 6 sides of the sphere @@ -55,6 +56,8 @@ export class TelluricPlanet implements PlanetaryMassObject, Cullable { readonly cloudsUniforms: CloudsUniforms | null; + readonly targetInfo: TargetInfo; + /** * New Telluric Planet * @param model The model to build the planet or a seed for the planet in [-1, 1] @@ -65,8 +68,7 @@ export class TelluricPlanet implements PlanetaryMassObject, Cullable { this.transform = new TransformNode(this.model.name, scene); - rotate(this.transform, Axis.X, this.model.physics.axialTilt); - this.transform.computeWorldMatrix(true); + setRotationQuaternion(this.getTransform(), this.model.physics.axialTilt); this.aggregate = new PhysicsAggregate( this.getTransform(), @@ -116,6 +118,9 @@ export class TelluricPlanet implements PlanetaryMassObject, Cullable { new ChunkTree(Direction.RIGHT, this.model, this.aggregate, this.material, scene), new ChunkTree(Direction.LEFT, this.model, this.aggregate, this.material, scene) ]; + + this.targetInfo = defaultTargetInfoCelestialBody(this.getBoundingRadius()); + this.targetInfo.maxDistance = this.model.type === OrbitalObjectType.TELLURIC_SATELLITE ? this.model.orbit.radius * 8.0 : 0; } getTransform(): TransformNode { diff --git a/src/ts/planets/telluricPlanet/telluricPlanetModel.ts b/src/ts/planets/telluricPlanet/telluricPlanetModel.ts index 0330f037..310e004c 100644 --- a/src/ts/planets/telluricPlanet/telluricPlanetModel.ts +++ b/src/ts/planets/telluricPlanet/telluricPlanetModel.ts @@ -56,8 +56,8 @@ export function newSeededTelluricPlanetModel(seed: number, name: string, parentB const physicalProperties: TelluricPlanetaryMassObjectPhysicsInfo = { mass: mass, - axialTilt: normalRandom(0, 0.2, rng, GenerationSteps.AXIAL_TILT), - rotationPeriod: (60 * 60 * 24) / 10, + axialTilt: Quaternion.RotationAxis(Axis.X, normalRandom(0, 0.2, rng, GenerationSteps.AXIAL_TILT)), + siderealDayDuration: (60 * 60 * 24) / 10, minTemperature: minTemperature, maxTemperature: maxTemperature, pressure: pressure, @@ -75,8 +75,6 @@ export function newSeededTelluricPlanetModel(seed: number, name: string, parentB clouds = newCloudsModel(radius + physicalProperties.oceanLevel, Settings.CLOUD_LAYER_HEIGHT, physicalProperties.waterAmount, physicalProperties.pressure); } - const orbitalPlaneNormal = Vector3.Up().applyRotationQuaternionInPlace(Quaternion.RotationAxis(Axis.X, (rng(GenerationSteps.ORBIT + 20) - 0.5) * 0.2)); - const parentMaxRadius = parentBodies.reduce((max, body) => Math.max(max, body.radius), 0); // Todo: do not hardcode const orbitRadius = 2e9 + rng(GenerationSteps.ORBIT) * 15e9 + parentMaxRadius * 1.5; @@ -88,7 +86,7 @@ export function newSeededTelluricPlanetModel(seed: number, name: string, parentB radius: orbitRadius, p: orbitalP, period: getOrbitalPeriod(orbitRadius, parentMassSum), - normalToPlane: orbitalPlaneNormal + orientation: Quaternion.RotationAxis(Axis.X, (rng(GenerationSteps.ORBIT + 20) - 0.5) * 0.2) }; const terrainSettings = { @@ -117,4 +115,4 @@ export function newSeededTelluricPlanetModel(seed: number, name: string, parentB rings: rings, clouds: clouds }; -} \ No newline at end of file +} diff --git a/src/ts/planets/telluricPlanet/telluricSatelliteModel.ts b/src/ts/planets/telluricPlanet/telluricSatelliteModel.ts index 2c70d707..68e2be95 100644 --- a/src/ts/planets/telluricPlanet/telluricSatelliteModel.ts +++ b/src/ts/planets/telluricPlanet/telluricSatelliteModel.ts @@ -22,7 +22,6 @@ import { normalRandom, randRangeInt } from "extended-random"; import { GenerationSteps } from "../../utils/generationSteps"; import { Settings } from "../../settings"; import { TelluricPlanetaryMassObjectPhysicsInfo } from "../../architecture/physicsInfo"; -import { Vector3 } from "@babylonjs/core/Maths/math.vector"; import { Quaternion } from "@babylonjs/core/Maths/math"; import { Axis } from "@babylonjs/core/Maths/math.axis"; import { clamp } from "terrain-generation"; @@ -70,10 +69,16 @@ export function newSeededTelluricSatelliteModel(seed: number, name: string, pare // when pressure is close to 1, the max temperature is close to the min temperature (the atmosphere does thermal regulation) const maxTemperature = minTemperature + Math.exp(-pressure) * randRangeInt(30, 200, rng, 81); + // this average is an approximation of a quaternion average + // see https://math.stackexchange.com/questions/61146/averaging-quaternions + const parentAverageAxialTilt: Quaternion = parentBodies.reduce((sum, body) => sum.add(body.physics.axialTilt), Quaternion.Zero()); + parentAverageAxialTilt.scaleInPlace(1 / parentBodies.length); + parentAverageAxialTilt.normalize(); + const physicalProperties: TelluricPlanetaryMassObjectPhysicsInfo = { mass: mass, - axialTilt: 0, - rotationPeriod: (60 * 60 * 24) / 10, + axialTilt: parentAverageAxialTilt, + siderealDayDuration: (60 * 60 * 24) / 10, minTemperature: minTemperature, maxTemperature: maxTemperature, pressure: pressure, @@ -83,8 +88,6 @@ export function newSeededTelluricSatelliteModel(seed: number, name: string, pare physicalProperties.oceanLevel = Settings.OCEAN_DEPTH * physicalProperties.waterAmount * physicalProperties.pressure; - const orbitalPlaneNormal = Vector3.Up().applyRotationQuaternionInPlace(Quaternion.RotationAxis(Axis.X, (rng(GenerationSteps.ORBIT + 20) - 0.5) * 0.2)); - // Todo: do not hardcode let orbitRadius = 2e9 + rng(GenerationSteps.ORBIT) * 15e9; @@ -101,11 +104,11 @@ export function newSeededTelluricSatelliteModel(seed: number, name: string, pare radius: orbitRadius, p: orbitalP, period: getOrbitalPeriod(orbitRadius, parentMassSum), - normalToPlane: orbitalPlaneNormal + orientation: parentAverageAxialTilt }; // tidal lock - physicalProperties.rotationPeriod = orbit.period; + physicalProperties.siderealDayDuration = orbit.period; const canHaveLiquidWater = hasLiquidWater(physicalProperties.pressure, physicalProperties.minTemperature, physicalProperties.maxTemperature); if (!canHaveLiquidWater) physicalProperties.oceanLevel = 0; @@ -139,4 +142,4 @@ export function newSeededTelluricSatelliteModel(seed: number, name: string, pare rings: null, clouds: clouds }; -} \ No newline at end of file +} diff --git a/src/ts/planets/telluricPlanet/terrain/chunks/planetChunk.ts b/src/ts/planets/telluricPlanet/terrain/chunks/planetChunk.ts index a241a30c..54333758 100644 --- a/src/ts/planets/telluricPlanet/terrain/chunks/planetChunk.ts +++ b/src/ts/planets/telluricPlanet/terrain/chunks/planetChunk.ts @@ -63,7 +63,15 @@ export class PlanetChunk implements Transformable, HasBoundingSphere, Cullable { private disposed = false; - constructor(path: number[], direction: Direction, parentAggregate: PhysicsAggregate, material: Material, planetModel: TelluricPlanetaryMassObjectModel, rootLength: number, scene: Scene) { + constructor( + path: number[], + direction: Direction, + parentAggregate: PhysicsAggregate, + material: Material, + planetModel: TelluricPlanetaryMassObjectModel, + rootLength: number, + scene: Scene + ) { const id = `D${direction}P${path.join("")}`; this.depth = path.length; @@ -149,11 +157,7 @@ export class PlanetChunk implements Transformable, HasBoundingSphere, Cullable { rockPatch.createInstances([{ mesh: Objects.ROCK, distance: 0 }]); this.instancePatches.push(rockPatch); - if ( - this.planetModel.physics.pressure > 0 && - this.planetModel.physics.oceanLevel > 0 && - this.getAverageHeight() > this.planetModel.physics.oceanLevel + 50 - ) { + if (this.planetModel.physics.pressure > 0 && this.planetModel.physics.oceanLevel > 0 && this.getAverageHeight() > this.planetModel.physics.oceanLevel + 50) { const treePatch = new InstancePatch(this.parent, randomDownSample(instancesMatrixBuffer, 4800)); treePatch.createInstances([{ mesh: Objects.TREE, distance: 0 }]); this.instancePatches.push(treePatch); diff --git a/src/ts/playground.ts b/src/ts/playground.ts index fdca2f1c..ac2080d1 100644 --- a/src/ts/playground.ts +++ b/src/ts/playground.ts @@ -17,34 +17,20 @@ import "../styles/index.scss"; -import { Matrix, Quaternion, Vector3 } from "@babylonjs/core/Maths/math.vector"; +import { Vector3 } from "@babylonjs/core/Maths/math.vector"; import { Engine } from "@babylonjs/core/Engines/engine"; import "@babylonjs/core/Materials/standardMaterial"; import "@babylonjs/core/Loading/loadingScreen"; import "@babylonjs/core/Misc/screenshotTools"; import { Tools } from "@babylonjs/core/Misc/tools"; import "@babylonjs/core/Meshes/thinInstanceMesh"; -import { - Axis, - Color3, - DirectionalLight, - HavokPlugin, - HemisphericLight, - MeshBuilder, - PBRMaterial, - PhysicsAggregate, - PhysicsShapeType, - PhysicsViewer, - Texture -} from "@babylonjs/core"; +import { DirectionalLight, HavokPlugin, HemisphericLight } from "@babylonjs/core"; import { Assets } from "./assets/assets"; -import { Scene, StandardMaterial } from "@babylonjs/core"; -import { translate } from "./uberCore/transforms/basicTransform"; import { DefaultControls } from "./defaultControls/defaultControls"; -import { AsteroidField } from "./asteroidFields/asteroidField"; import HavokPhysics from "@babylonjs/havok"; -import { Textures } from "./assets/textures"; -import { StarFieldBox } from "./starSystem/starFieldBox"; +import { SpaceElevatorClimber } from "./spacestation/spaceElevatorClimber"; +import { Scene } from "@babylonjs/core/scene"; +import { TransformNode } from "@babylonjs/core/Meshes"; const canvas = document.getElementById("renderer") as HTMLCanvasElement; canvas.width = window.innerWidth; @@ -77,53 +63,24 @@ directionalLight.intensity = 0.7; const hemi = new HemisphericLight("hemi", Vector3.Up(), scene); hemi.intensity = 0.4; -const scaler = 500; +const sunTransform = new TransformNode("sunTransform", scene); +sunTransform.position = directionalLight.direction.scale(-100); -defaultControls.getTransform().position.z = -200 * scaler; -defaultControls.getTransform().position.y = 20 * scaler; -defaultControls.speed *= scaler; -camera.maxZ *= scaler; +const sunTransformable = { + transform: sunTransform, + getTransform: () => sunTransform, + dispose: () => sunTransform.dispose() +}; -const skybox = new StarFieldBox(scene); +const climber = new SpaceElevatorClimber(scene); -const sphere = MeshBuilder.CreateSphere("box", { diameter: 20 * scaler }, scene); - -const pbr = new PBRMaterial("pbr", scene); -sphere.material = pbr; - -pbr.albedoColor = new Color3(1.0, 0.766, 0.336); -pbr.metallic = 1.0; // set to 1 to only use it from the metallicRoughnessTexture -pbr.roughness = 0; // set to 1 to only use it from the metallicRoughnessTexture - -const sphereAggregate = new PhysicsAggregate(sphere, PhysicsShapeType.SPHERE, { mass: 0 }, scene); - -const beltRadius = 100 * scaler; -const beltSpread = 20 * scaler; - -const belt = new AsteroidField(42, sphere, beltRadius, beltSpread, scene); - -const torus = MeshBuilder.CreateTorus("torus", { diameter: 2 * beltRadius, thickness: 2 * beltSpread, tessellation: 32 }, scene); -torus.visibility = 0.1; -torus.parent = sphere; -torus.scaling.y = 0.1 / scaler; - -const physicsViewer = new PhysicsViewer(scene); - -const rotation = Matrix.Identity(); +defaultControls.getTransform().position.copyFromFloats(0, 5, -5); +defaultControls.getTransform().lookAt(climber.getTransform().position); scene.onBeforeRenderObservable.add(() => { defaultControls.update(engine.getDeltaTime() / 1000); - belt.update(defaultControls.getTransform().getAbsolutePosition(), engine.getDeltaTime() / 1000); - - rotation.copyFrom(rotation.multiply(Matrix.RotationAxis(Vector3.Up(), 0.001))); - - skybox.setRotationMatrix(rotation); - - //sphere.rotate(Axis.Y, 0.002); - /*scene.meshes.forEach((mesh) => { - if (mesh.physicsBody) physicsViewer.showBody(mesh.physicsBody); - });*/ + climber.update([sunTransformable]); }); scene.executeWhenReady(() => { diff --git a/src/ts/postProcesses/lensFlarePostProcess.ts b/src/ts/postProcesses/lensFlarePostProcess.ts index 86efb082..7175a42c 100644 --- a/src/ts/postProcesses/lensFlarePostProcess.ts +++ b/src/ts/postProcesses/lensFlarePostProcess.ts @@ -69,7 +69,19 @@ export class LensFlarePostProcess extends PostProcess implements ObjectPostProce const samplers: string[] = Object.values(SamplerUniformNames); - super(object.model.name + "LensFlare", shaderName, uniforms, samplers, 1, null, Texture.BILINEAR_SAMPLINGMODE, scene.getEngine(), false, null, Constants.TEXTURETYPE_HALF_FLOAT); + super( + object.model.name + "LensFlare", + shaderName, + uniforms, + samplers, + 1, + null, + Texture.BILINEAR_SAMPLINGMODE, + scene.getEngine(), + false, + null, + Constants.TEXTURETYPE_HALF_FLOAT + ); this.object = object; this.settings = settings; diff --git a/src/ts/postProcesses/matterJetPostProcess.ts b/src/ts/postProcesses/matterJetPostProcess.ts index 3a8c73d0..ab01633f 100644 --- a/src/ts/postProcesses/matterJetPostProcess.ts +++ b/src/ts/postProcesses/matterJetPostProcess.ts @@ -64,7 +64,19 @@ export class MatterJetPostProcess extends PostProcess implements ObjectPostProce const samplers: string[] = Object.values(SamplerUniformNames); - super(`${stellarObject.model.name}MatterJetPostProcess`, shaderName, uniforms, samplers, 1, null, Texture.BILINEAR_SAMPLINGMODE, scene.getEngine(), false, null, Constants.TEXTURETYPE_HALF_FLOAT); + super( + `${stellarObject.model.name}MatterJetPostProcess`, + shaderName, + uniforms, + samplers, + 1, + null, + Texture.BILINEAR_SAMPLINGMODE, + scene.getEngine(), + false, + null, + Constants.TEXTURETYPE_HALF_FLOAT + ); this.object = stellarObject; this.matterJetUniforms = settings; diff --git a/src/ts/postProcesses/uniforms/stellarObjectUniforms.ts b/src/ts/postProcesses/uniforms/stellarObjectUniforms.ts index 19130b4b..57d6f883 100644 --- a/src/ts/postProcesses/uniforms/stellarObjectUniforms.ts +++ b/src/ts/postProcesses/uniforms/stellarObjectUniforms.ts @@ -41,6 +41,8 @@ export function setStellarObjectUniforms(effect: Effect, stellarObjects: Transfo effect.setArray3(StellarObjectUniformNames.STAR_POSITIONS, flattenVector3Array(stellarObjects.map((stellarObject) => stellarObject.getTransform().getAbsolutePosition()))); effect.setArray3( StellarObjectUniformNames.STAR_COLORS, - flattenColor3Array(stellarObjects.map((stellarObject) => (stellarObject instanceof Star ? getRgbFromTemperature(stellarObject.model.physics.blackBodyTemperature) : Color3.White()))) + flattenColor3Array( + stellarObjects.map((stellarObject) => (stellarObject instanceof Star ? getRgbFromTemperature(stellarObject.model.physics.blackBodyTemperature) : Color3.White())) + ) ); } diff --git a/src/ts/society/factions.ts b/src/ts/society/factions.ts index 75de6550..a90e5f5a 100644 --- a/src/ts/society/factions.ts +++ b/src/ts/society/factions.ts @@ -1,3 +1,7 @@ +import { StarSystemCoordinates } from "../utils/coordinates/universeCoordinates"; +import { getPowerPlayData } from "./powerplay"; +import { uniformRandBool } from "extended-random"; + export const enum Faction { FEYNMAN_INTERSTELLAR, CHURCH_OF_AWAKENING, @@ -17,3 +21,20 @@ export function factionToString(faction: Faction): string { return "Satori Concord"; } } + +export function getFactionFromCoordinates(starSystemCoordinates: StarSystemCoordinates, rng: (index: number) => number): Faction { + const powerplayData = getPowerPlayData(starSystemCoordinates); + + const isMaterialist = uniformRandBool(powerplayData.materialistSpiritualist, rng, 249); + const isCapitalist = uniformRandBool(powerplayData.capitalistCommunist, rng, 498); + + if (isMaterialist && isCapitalist) { + return Faction.FEYNMAN_INTERSTELLAR; + } else if (isMaterialist && !isCapitalist) { + return Faction.HUMAN_COMMONWEALTH; + } else if (!isMaterialist && isCapitalist) { + return Faction.CHURCH_OF_AWAKENING; + } else { + return Faction.SATORI_CONCORD; + } +} diff --git a/src/ts/spaceStationGenerator.ts b/src/ts/spaceStationGenerator.ts index 24d57c86..81126a4a 100644 --- a/src/ts/spaceStationGenerator.ts +++ b/src/ts/spaceStationGenerator.ts @@ -108,7 +108,7 @@ scene.onBeforePhysicsObservable.add(() => { const cameraWorldPosition = camera.globalPosition; - spaceStation.update([sun], cameraWorldPosition, deltaSeconds); + spaceStation.update([sun], [], cameraWorldPosition, deltaSeconds); //scene.meshes.forEach(mesh => {if(mesh.physicsBody) viewer.showBody(mesh.physicsBody)}); //spaceStation.getTransform().position.y = Math.sin(elapsedSeconds / 5) * 10000; diff --git a/src/ts/spaceship/shipControls.ts b/src/ts/spaceship/shipControls.ts index fed13ce1..f4bc6fc2 100644 --- a/src/ts/spaceship/shipControls.ts +++ b/src/ts/spaceship/shipControls.ts @@ -201,8 +201,8 @@ export class ShipControls implements Controls { return this.closestLandableFacility; } - public update(deltaTime: number): Vector3 { - this.spaceship.update(deltaTime); + public update(deltaSeconds: number): Vector3 { + this.spaceship.update(deltaSeconds); let [inputRoll, inputPitch] = SpaceShipControlsInputs.map.rollPitch.value; if (SpaceShipControlsInputs.map.ignorePointer.value > 0) { @@ -211,7 +211,7 @@ export class ShipControls implements Controls { } if (this.spaceship.getWarpDrive().isDisabled()) { - this.spaceship.increaseMainEngineThrottle(deltaTime * SpaceShipControlsInputs.map.throttle.value); + this.spaceship.increaseMainEngineThrottle(deltaSeconds * SpaceShipControlsInputs.map.throttle.value); if (SpaceShipControlsInputs.map.upDown.value !== 0) { if (this.spaceship.isLanded()) { @@ -225,12 +225,12 @@ export class ShipControls implements Controls { ); } } else { - this.spaceship.getWarpDrive().increaseThrottle(0.5 * deltaTime * SpaceShipControlsInputs.map.throttle.value); + this.spaceship.getWarpDrive().increaseThrottle(0.5 * deltaSeconds * SpaceShipControlsInputs.map.throttle.value); } if (!this.spaceship.isLanded()) { - roll(this.getTransform(), 2.0 * inputRoll * deltaTime); - pitch(this.getTransform(), 2.0 * inputPitch * deltaTime); + roll(this.getTransform(), 2.0 * inputRoll * deltaSeconds); + pitch(this.getTransform(), 2.0 * inputPitch * deltaSeconds); } // camera shake @@ -240,7 +240,7 @@ export class ShipControls implements Controls { this.thirdPersonCamera.radius += (Math.random() - 0.5) / 100; } - this.thirdPersonCamera.fov = moveTowards(this.thirdPersonCamera.fov, this.targetFov, this.targetFov === this.baseFov ? 2.0 * deltaTime : 0.3 * deltaTime); + this.thirdPersonCamera.fov = moveTowards(this.thirdPersonCamera.fov, this.targetFov, this.targetFov === this.baseFov ? 2.0 * deltaSeconds : 0.3 * deltaSeconds); this.getActiveCameras().forEach((camera) => camera.getViewMatrix(true)); diff --git a/src/ts/spacestation/orbitalFacility.ts b/src/ts/spacestation/orbitalFacility.ts new file mode 100644 index 00000000..30ad4048 --- /dev/null +++ b/src/ts/spacestation/orbitalFacility.ts @@ -0,0 +1,56 @@ +import { OrbitalObject, OrbitalObjectModel, OrbitalObjectType } from "../architecture/orbitalObject"; +import { ManagesLandingPads } from "../utils/managesLandingPads"; +import { Cullable } from "../utils/cullable"; +import { StarSystemCoordinates } from "../utils/coordinates/universeCoordinates"; +import { CropType } from "../utils/agriculture"; +import { Faction } from "../society/factions"; +import { Vector3 } from "@babylonjs/core/Maths/math.vector"; +import { Transformable } from "../architecture/transformable"; +import { Targetable } from "../architecture/targetable"; + +export type OrbitalFacilityModel = OrbitalObjectModel & { + readonly starSystemCoordinates: StarSystemCoordinates; + + readonly type: OrbitalObjectType.SPACE_STATION | OrbitalObjectType.SPACE_ELEVATOR; + + readonly population: number; + + /** + * The average energy consumption of a citizen of the habitat in KWh + */ + readonly energyConsumptionPerCapitaKWh: number; + + /** + * The number of inhabitants per square kilometer in the habitat + */ + readonly populationDensity: number; + + readonly agricultureMix: [number, CropType][]; + + readonly nbHydroponicLayers: number; + + readonly faction: Faction; + + /** + * The total energy consumption of the habitat in KWh + */ + readonly totalEnergyConsumptionKWh: number; + readonly solarPanelEfficiency: number; + + /** + * The surface of solar panels in m² + */ + readonly solarPanelSurfaceM2: number; + + readonly housingSurfaceHa: number; + readonly agricultureSurfaceHa: number; + readonly totalHabitatSurfaceM2: number; +}; + +export interface OrbitalFacility extends OrbitalObject, ManagesLandingPads, Cullable, Targetable { + readonly model: OrbitalFacilityModel; + + getSubTargets(): Targetable[]; + + update(stellarObjects: Transformable[], parents: OrbitalObject[], cameraWorldPosition: Vector3, deltaSeconds: number): void; +} diff --git a/src/ts/spacestation/spaceElevator.ts b/src/ts/spacestation/spaceElevator.ts new file mode 100644 index 00000000..7d8f4454 --- /dev/null +++ b/src/ts/spacestation/spaceElevator.ts @@ -0,0 +1,311 @@ +// This file is part of Cosmos Journeyer +// +// Copyright (C) 2024 Barthélemy Paléologue +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +import { Scene } from "@babylonjs/core/scene"; +import { isSizeOnScreenEnough } from "../utils/isObjectVisibleOnScreen"; +import { Camera } from "@babylonjs/core/Cameras/camera"; +import { TransformNode } from "@babylonjs/core/Meshes"; +import { Vector3 } from "@babylonjs/core/Maths/math.vector"; +import { SpaceStationNodeType } from "../assets/procedural/spaceStation/spaceStationNode"; +import { UtilitySection } from "../assets/procedural/spaceStation/utilitySection"; +import { HelixHabitat } from "../assets/procedural/spaceStation/helixHabitat"; +import { RingHabitat } from "../assets/procedural/spaceStation/ringHabitat"; +import { Transformable } from "../architecture/transformable"; +import { SolarSection } from "../assets/procedural/spaceStation/solarSection"; +import { wheelOfFortune } from "../utils/random"; +import { CylinderHabitat } from "../assets/procedural/spaceStation/cylinderHabitat"; +import { LandingBay } from "../assets/procedural/spaceStation/landingBay"; +import { LandingPad } from "../assets/procedural/landingPad/landingPad"; +import { LandingRequest } from "../utils/managesLandingPads"; +import { Settings } from "../settings"; +import { getRngFromSeed } from "../utils/getRngFromSeed"; +import { orbitalObjectTypeToDisplay } from "../utils/strings/orbitalObjectTypeToDisplay"; +import { OrbitalFacility } from "./orbitalFacility"; +import { SpaceElevatorModel } from "./spaceElevatorModel"; +import { OrbitalObject } from "../architecture/orbitalObject"; +import { MeshBuilder } from "@babylonjs/core/Meshes/meshBuilder"; +import { MetalSectionMaterial } from "../assets/procedural/spaceStation/metalSectionMaterial"; +import { Mesh } from "@babylonjs/core/Meshes/mesh"; +import { SpaceElevatorClimber } from "./spaceElevatorClimber"; +import { clamp, remap, triangleWave } from "../utils/math"; +import { ObjectTargetCursorType, Targetable, TargetInfo } from "../architecture/targetable"; +import { setRotationQuaternion } from "../uberCore/transforms/basicTransform"; +import { Axis } from "@babylonjs/core/Maths/math.axis"; + +export class SpaceElevator implements OrbitalFacility { + readonly name: string; + + readonly model: SpaceElevatorModel; + + private readonly solarSections: SolarSection[] = []; + private readonly utilitySections: UtilitySection[] = []; + private readonly helixHabitats: HelixHabitat[] = []; + private readonly ringHabitats: RingHabitat[] = []; + private readonly cylinderHabitats: CylinderHabitat[] = []; + private readonly landingBays: LandingBay[] = []; + + private readonly tether: Mesh; + private readonly tetherLength: number; + private readonly tetherMaterial: MetalSectionMaterial; + + private readonly climber: SpaceElevatorClimber; + + private readonly root: TransformNode; + + private readonly scene: Scene; + + private readonly boundingRadius: number; + + private elapsedSeconds = 0; + + readonly targetInfo: TargetInfo; + + constructor(model: SpaceElevatorModel, scene: Scene) { + this.model = model; + + this.name = this.model.name; + + this.root = new TransformNode(this.name, scene); + this.scene = scene; + + const tetherThickness = 10; + this.tetherLength = this.model.tetherLength; + + this.tether = MeshBuilder.CreateCylinder( + `${this.name} Tether`, + { + height: this.tetherLength, + diameter: tetherThickness, + tessellation: 6 + }, + this.scene + ); + this.tether.convertToFlatShadedMesh(); + + this.tetherMaterial = new MetalSectionMaterial(scene); + this.tether.material = this.tetherMaterial; + + this.climber = new SpaceElevatorClimber(scene); + this.climber.getTransform().parent = this.tether; + + this.climber.getTransform().position.y = this.tetherLength / 2; + + this.generate(); + + // center the space station on its center of mass + const boundingVectors = this.getTransform().getHierarchyBoundingVectors(); + const centerWorld = boundingVectors.max.add(boundingVectors.min).scale(0.5); + const deltaPosition = this.getTransform().getAbsolutePosition().subtract(centerWorld); + + this.tether.parent = this.getTransform(); + + this.getTransform() + .getChildTransformNodes(true) + .forEach((transform) => transform.position.addInPlace(deltaPosition)); + + this.getTransform() + .getChildTransformNodes(true) + .forEach((transform) => transform.rotateAround(Vector3.Zero(), Axis.Z, -Math.PI / 2)); + + setRotationQuaternion(this.getTransform(), this.model.physics.axialTilt); + + const extendSize = boundingVectors.max.subtract(boundingVectors.min).scale(0.5); + this.boundingRadius = Math.max(extendSize.x, extendSize.y, extendSize.z); + + this.targetInfo = { + type: ObjectTargetCursorType.FACILITY, + minDistance: this.getBoundingRadius() * 6.0, + maxDistance: 0.0 + }; + } + + getLandingPads(): LandingPad[] { + return this.landingBays.flatMap((landingBay) => { + return landingBay.landingPads; + }); + } + + getSubTargets(): Targetable[] { + return [this.climber, ...this.getLandingPads()]; + } + + handleLandingRequest(request: LandingRequest): LandingPad | null { + const availableLandingPads = this.getLandingPads() + .filter((landingPad) => { + return landingPad.padSize >= request.minimumPadSize; + }) + .sort((a, b) => { + return a.padSize - b.padSize; + }); + + if (availableLandingPads.length === 0) return null; + + return availableLandingPads[0]; + } + + getRotationAxis(): Vector3 { + return this.getTransform().up; + } + + public getBoundingRadius(): number { + return this.boundingRadius; + } + + getTypeName(): string { + return orbitalObjectTypeToDisplay(this.model); + } + + public computeCulling(cameras: Camera[]): void { + let isVisible = false; + for (const camera of cameras) { + isVisible = isVisible || isSizeOnScreenEnough(this, camera); + } + + this.getTransform().setEnabled(isVisible); + } + + private generate() { + const solarPanelSurface = this.model.solarPanelSurfaceM2; + const habitatSurface = this.model.totalHabitatSurfaceM2; + + let lastNode: TransformNode = this.tether; + + const rng = getRngFromSeed(this.model.seed); + + lastNode = this.addUtilitySections(lastNode, 5 + Math.floor(rng(564) * 5), rng); + + const habitatType = wheelOfFortune( + [ + [SpaceStationNodeType.RING_HABITAT, 0.5], + [SpaceStationNodeType.HELIX_HABITAT, 0.3], + [SpaceStationNodeType.CYLINDER_HABITAT, 0.2] + ], + rng(17) + ); + + let newNode: TransformNode | null = null; + if (habitatType === SpaceStationNodeType.HELIX_HABITAT) { + const helixHabitat = new HelixHabitat(habitatSurface, Settings.SEED_HALF_RANGE * rng(19), this.scene); + this.helixHabitats.push(helixHabitat); + newNode = helixHabitat.getTransform(); + } else if (habitatType === SpaceStationNodeType.RING_HABITAT) { + const ringHabitat = new RingHabitat(this.model, habitatSurface, Settings.SEED_HALF_RANGE * rng(27), this.scene); + this.ringHabitats.push(ringHabitat); + newNode = ringHabitat.getTransform(); + } else if (habitatType === SpaceStationNodeType.CYLINDER_HABITAT) { + const cylinderHabitat = new CylinderHabitat(habitatSurface, Settings.SEED_HALF_RANGE * rng(13), this.scene); + this.cylinderHabitats.push(cylinderHabitat); + newNode = cylinderHabitat.getTransform(); + } + + if (newNode === null) { + throw new Error("Node creation failed"); + } + + this.placeNode(newNode, lastNode); + newNode.parent = this.root; + lastNode = newNode; + + lastNode = this.addUtilitySections(lastNode, 5 + Math.floor(rng(23) * 5), rng); + + const solarSection = new SolarSection(solarPanelSurface, Settings.SEED_HALF_RANGE * rng(31), this.scene); + solarSection.getTransform().parent = this.getTransform(); + this.placeNode(solarSection.getTransform(), lastNode); + lastNode = solarSection.getTransform(); + this.solarSections.push(solarSection); + + lastNode = this.addUtilitySections(lastNode, 5 + Math.floor(rng(23) * 5), rng); + + const landingBay = new LandingBay(this.model, rng(37) * Settings.SEED_HALF_RANGE, this.scene); + + this.landingBays.push(landingBay); + this.placeNode(landingBay.getTransform(), lastNode); + landingBay.getTransform().parent = this.getTransform(); + } + + private addUtilitySections(lastNode: TransformNode, nbSections: number, rng: (index: number) => number): TransformNode { + let newLastNode = lastNode; + for (let i = 0; i < nbSections; i++) { + const utilitySection = new UtilitySection(rng(132 + 10 * this.utilitySections.length) * Settings.SEED_HALF_RANGE, this.scene); + this.utilitySections.push(utilitySection); + + this.placeNode(utilitySection.getTransform(), newLastNode); + + utilitySection.getTransform().parent = this.getTransform(); + + newLastNode = utilitySection.getTransform(); + } + + return newLastNode; + } + + private placeNode(node: TransformNode, parent: TransformNode) { + const previousBoundingVectors = parent.getHierarchyBoundingVectors(); + const previousBoundingExtendSize = previousBoundingVectors.max.subtract(previousBoundingVectors.min).scale(0.5); + + const newBoundingVectors = node.getHierarchyBoundingVectors(); + const newBoundingExtendSize = newBoundingVectors.max.subtract(newBoundingVectors.min).scale(0.5); + + const previousSectionSizeY = previousBoundingExtendSize.y; + const newSectionY = newBoundingExtendSize.y; + + node.position = parent.position.add(parent.up.scale(previousSectionSizeY + newSectionY)); + } + + update(stellarObjects: Transformable[], parents: OrbitalObject[], cameraWorldPosition: Vector3, deltaSeconds: number) { + this.elapsedSeconds += deltaSeconds; + + this.solarSections.forEach((solarSection) => solarSection.update(stellarObjects, cameraWorldPosition)); + this.utilitySections.forEach((utilitySection) => utilitySection.update(stellarObjects, cameraWorldPosition)); + this.helixHabitats.forEach((helixHabitat) => helixHabitat.update(stellarObjects, cameraWorldPosition, deltaSeconds)); + this.ringHabitats.forEach((ringHabitat) => ringHabitat.update(stellarObjects, cameraWorldPosition, deltaSeconds)); + this.cylinderHabitats.forEach((cylinderHabitat) => cylinderHabitat.update(stellarObjects, cameraWorldPosition, deltaSeconds)); + this.landingBays.forEach((landingBay) => landingBay.update(stellarObjects, cameraWorldPosition, deltaSeconds)); + + this.tetherMaterial.update(stellarObjects); + + const climberSpeed = 300 / 3.6; // 300 km/h in m/s + const roundTripDuration = (2 * this.tetherLength) / climberSpeed; + + this.climber.getTransform().position.y = remap( + clamp(1.05 * triangleWave(this.elapsedSeconds / roundTripDuration), 0, 1), + 0, + 1, + -this.tetherLength / 2, + this.tetherLength / 2 + ); + } + + getTransform(): TransformNode { + return this.root; + } + + dispose() { + this.solarSections.forEach((solarSection) => solarSection.dispose()); + this.utilitySections.forEach((utilitySection) => utilitySection.dispose()); + this.helixHabitats.forEach((helixHabitat) => helixHabitat.dispose()); + this.ringHabitats.forEach((ringHabitat) => ringHabitat.dispose()); + this.cylinderHabitats.forEach((cylinderHabitat) => cylinderHabitat.dispose()); + this.landingBays.forEach((landingBay) => landingBay.dispose()); + this.tether.dispose(); + this.tetherMaterial.dispose(); + + this.climber.dispose(); + + this.root.dispose(); + } +} diff --git a/src/ts/spacestation/spaceElevatorClimber.ts b/src/ts/spacestation/spaceElevatorClimber.ts new file mode 100644 index 00000000..4e4d10e0 --- /dev/null +++ b/src/ts/spacestation/spaceElevatorClimber.ts @@ -0,0 +1,142 @@ +import { Scene } from "@babylonjs/core/scene"; +import { CreateBox, CreateTube, TransformNode } from "@babylonjs/core/Meshes"; +import { Transformable } from "../architecture/transformable"; +import { Vector3 } from "@babylonjs/core/Maths/math.vector"; +import { Mesh } from "@babylonjs/core/Meshes/mesh"; +import { Axis, Space } from "@babylonjs/core/Maths/math.axis"; +import { SolarPanelMaterial } from "../assets/procedural/solarPanel/solarPanelMaterial"; +import { MetalSectionMaterial } from "../assets/procedural/spaceStation/metalSectionMaterial"; +import { ClimberRingMaterial } from "../materials/climberRingMaterial"; +import i18n from "../i18n"; +import { ObjectTargetCursorType, Targetable, TargetInfo } from "../architecture/targetable"; + +export class SpaceElevatorClimber implements Targetable { + private readonly transform: TransformNode; + + private readonly solarPanelMaterial: SolarPanelMaterial; + private readonly metalSectionMaterial: MetalSectionMaterial; + + private readonly boundingRadius: number; + + readonly targetInfo: TargetInfo; + + constructor(scene: Scene) { + this.transform = new TransformNode("SpaceElevatorClimber", scene); + + this.solarPanelMaterial = new SolarPanelMaterial(scene); + this.metalSectionMaterial = new MetalSectionMaterial(scene); + + const angleSubtracted = Math.PI / 6; + const minAngle = -Math.PI / 2 + angleSubtracted / 2; + const maxAngle = Math.PI / 2 - angleSubtracted / 2; + const nbPoints = 64; + + const globalRadius = 100; + const innerRadius = 10; + + const yThickness = 0.5; + + const rightPath = []; + for (let theta = minAngle; theta <= maxAngle; theta += (maxAngle - minAngle) / nbPoints) { + const x = Math.cos(theta) * globalRadius; + const z = Math.sin(theta) * globalRadius; + rightPath.push(new Vector3(x, 0, z)); + } + + const rightRing = CreateTube( + "ClimberRightRing", + { + path: rightPath, + cap: Mesh.CAP_ALL, + radius: innerRadius + }, + scene + ); + rightRing.scaling.y = yThickness; + rightRing.parent = this.transform; + + rightRing.material = new ClimberRingMaterial("ClimberRingMaterial", scene); + + const leftRing = rightRing.clone("ClimberLeftRing"); + leftRing.rotate(Axis.Y, Math.PI); + + const arm1 = CreateBox( + "ClimberArm1", + { + height: globalRadius * 2, + width: (innerRadius * yThickness) / 4, + depth: (innerRadius * yThickness) / 4 + }, + scene + ); + arm1.material = this.metalSectionMaterial; + arm1.rotate(Axis.Z, Math.PI / 2, Space.WORLD); + arm1.parent = this.transform; + + const armAngles = [Math.PI / 4, -Math.PI / 4]; + + armAngles.forEach((angle, index) => { + const arm = arm1.clone(`ClimberArm${index + 2}`); + arm.rotate(Axis.Y, angle, Space.WORLD); + arm.parent = this.transform; + }); + + const solarPanelWidth = 100; + const solarPanelDepth = 20; + const solarPanelThickness = 0.1; + + const solarPanelAngleSpacing = Math.PI / 6; + + const solarPanel1 = CreateBox( + "ClimberSolarPanel1", + { + width: solarPanelWidth, + height: solarPanelThickness, + depth: solarPanelDepth + }, + scene + ); + solarPanel1.material = this.solarPanelMaterial; + solarPanel1.position.x = globalRadius + solarPanelWidth / 2; + solarPanel1.parent = this.transform; + + const angles = [solarPanelAngleSpacing, -solarPanelAngleSpacing, Math.PI + solarPanelAngleSpacing, Math.PI - solarPanelAngleSpacing, Math.PI]; + + angles.forEach((angle, index) => { + const solarPanel2 = solarPanel1.clone(`ClimberSolarPanel${index + 2}`); + solarPanel2.parent = this.transform; + solarPanel2.rotateAround(Vector3.Zero(), Axis.Y, angle); + }); + + this.boundingRadius = globalRadius + solarPanelWidth; + + this.targetInfo = { + type: ObjectTargetCursorType.FACILITY, + minDistance: this.getBoundingRadius() * 7.0, + maxDistance: this.getBoundingRadius() * 3000, + }; + } + + getBoundingRadius(): number { + return this.boundingRadius; + } + + getTypeName(): string { + return i18n.t("objectTypes:spaceElevatorClimber"); + } + + update(stellarObjects: Transformable[]) { + this.solarPanelMaterial.update(stellarObjects); + this.metalSectionMaterial.update(stellarObjects); + } + + getTransform() { + return this.transform; + } + + dispose() { + this.solarPanelMaterial.dispose(); + this.metalSectionMaterial.dispose(); + this.transform.dispose(); + } +} diff --git a/src/ts/spacestation/spaceElevatorModel.ts b/src/ts/spacestation/spaceElevatorModel.ts new file mode 100644 index 00000000..7170cb0d --- /dev/null +++ b/src/ts/spacestation/spaceElevatorModel.ts @@ -0,0 +1,116 @@ +import { StellarObjectModel } from "../architecture/stellarObject"; +import { StarSystemCoordinates } from "../utils/coordinates/universeCoordinates"; +import { CelestialBodyModel } from "../architecture/celestialBody"; +import { getRngFromSeed } from "../utils/getRngFromSeed"; +import { generateSpaceElevatorName } from "../utils/strings/spaceStationNameGenerator"; +import { Orbit } from "../orbit/orbit"; +import { OrbitalObjectPhysicsInfo } from "../architecture/physicsInfo"; +import { getFactionFromCoordinates } from "../society/factions"; +import { randomPieChart } from "../utils/random"; +import { CropType, CropTypes, getEdibleEnergyPerHaPerDay } from "../utils/agriculture"; +import { getOrbitRadiusFromPeriod, getSphereRadiatedEnergyFlux } from "../utils/physics"; +import { getSolarPanelSurfaceFromEnergyRequirement } from "../utils/solarPanels"; +import { Settings } from "../settings"; +import { OrbitalObjectType } from "../architecture/orbitalObject"; + +import { OrbitalFacilityModel } from "./orbitalFacility"; +import { Quaternion } from "@babylonjs/core/Maths/math"; + +export type SpaceElevatorModel = OrbitalFacilityModel & { + readonly type: OrbitalObjectType.SPACE_ELEVATOR; + + readonly tetherLength: number; +}; + +export function newSeededSpaceElevatorModel( + seed: number, + stellarObjectModels: StellarObjectModel[], + starSystemCoordinates: StarSystemCoordinates, + parentBody: CelestialBodyModel +): SpaceElevatorModel { + const rng = getRngFromSeed(seed); + + const name = generateSpaceElevatorName(rng, 2756); + + const parentSiderealDayDuration = parentBody.physics.siderealDayDuration; + + const orbitRadius = getOrbitRadiusFromPeriod(parentSiderealDayDuration, parentBody.physics.mass); + + const parentAxialTilt: Quaternion = parentBody.physics.axialTilt; + + const orbit: Orbit = { + radius: orbitRadius, + p: 2, + period: parentSiderealDayDuration, + orientation: parentAxialTilt, + }; + + const tetherLength = orbitRadius - parentBody.radius; + + const physicalProperties: OrbitalObjectPhysicsInfo = { + mass: 1, + siderealDayDuration: parentSiderealDayDuration, + axialTilt: parentAxialTilt + }; + + const faction = getFactionFromCoordinates(starSystemCoordinates, rng); + + //TODO: make this dependent on economic model + const population = 2_000_000; + const energyConsumptionPerCapitaKWh = 40_000; + + const populationDensity = 4_000; + + const mix = randomPieChart(CropTypes.length, rng, 498); + const agricultureMix: [number, CropType][] = mix.map((proportion, index) => [proportion, CropTypes[index]]); + + const nbHydroponicLayers = 10; + + // find average distance to stellar objects + const distanceToStar = parentBody.orbit.radius; + + let totalStellarFlux = 0; + stellarObjectModels.forEach((stellarObject) => { + const exposureTimeFraction = 0.5; + const starRadius = stellarObject.radius; + const starTemperature = stellarObject.physics.blackBodyTemperature; + totalStellarFlux += getSphereRadiatedEnergyFlux(starTemperature, starRadius, distanceToStar) * exposureTimeFraction; + }); + + const totalEnergyConsumptionKWh = population * energyConsumptionPerCapitaKWh; + + const solarPanelEfficiency = 0.4; + + const solarPanelSurfaceM2 = getSolarPanelSurfaceFromEnergyRequirement(solarPanelEfficiency, totalEnergyConsumptionKWh, totalStellarFlux); + + const housingSurfaceHa = (100 * population) / populationDensity; // convert km² to ha + let agricultureSurfaceHa = 0; + agricultureMix.forEach(([fraction, cropType]) => { + agricultureSurfaceHa += + (fraction * population * Settings.INDIVIDUAL_AVERAGE_DAILY_INTAKE) / + (Settings.HYDROPONIC_TO_CONVENTIONAL_RATIO * nbHydroponicLayers * getEdibleEnergyPerHaPerDay(cropType)); + }); + const totalHabitatSurfaceM2 = (housingSurfaceHa + agricultureSurfaceHa) * 1000; // convert ha to m² + + return { + seed, + type: OrbitalObjectType.SPACE_ELEVATOR, + starSystemCoordinates: starSystemCoordinates, + name, + orbit, + physics: physicalProperties, + tetherLength, + population, + energyConsumptionPerCapitaKWh, + populationDensity, + agricultureMix, + nbHydroponicLayers, + faction, + totalEnergyConsumptionKWh, + solarPanelEfficiency, + solarPanelSurfaceM2, + housingSurfaceHa, + agricultureSurfaceHa, + totalHabitatSurfaceM2 + }; +} diff --git a/src/ts/spacestation/spaceStation.ts b/src/ts/spacestation/spaceStation.ts index 4d085a30..ec8fc3a4 100644 --- a/src/ts/spacestation/spaceStation.ts +++ b/src/ts/spacestation/spaceStation.ts @@ -18,10 +18,6 @@ import { Scene } from "@babylonjs/core/scene"; import { isSizeOnScreenEnough } from "../utils/isObjectVisibleOnScreen"; import { Camera } from "@babylonjs/core/Cameras/camera"; -import { SpaceStationModel } from "./spacestationModel"; -import { PostProcessType } from "../postProcesses/postProcessTypes"; -import { OrbitalObject } from "../architecture/orbitalObject"; -import { Cullable } from "../utils/cullable"; import { TransformNode } from "@babylonjs/core/Meshes"; import { Vector3 } from "@babylonjs/core/Maths/math.vector"; import { SpaceStationNodeType } from "../assets/procedural/spaceStation/spaceStationNode"; @@ -30,24 +26,26 @@ import { HelixHabitat } from "../assets/procedural/spaceStation/helixHabitat"; import { RingHabitat } from "../assets/procedural/spaceStation/ringHabitat"; import { Transformable } from "../architecture/transformable"; import { SolarSection } from "../assets/procedural/spaceStation/solarSection"; -import { Axis } from "@babylonjs/core/Maths/math.axis"; import { wheelOfFortune } from "../utils/random"; import { CylinderHabitat } from "../assets/procedural/spaceStation/cylinderHabitat"; import { LandingBay } from "../assets/procedural/spaceStation/landingBay"; import { LandingPad } from "../assets/procedural/landingPad/landingPad"; -import { LandingRequest, ManagesLandingPads } from "../utils/managesLandingPads"; +import { LandingRequest } from "../utils/managesLandingPads"; import { Settings } from "../settings"; import { EngineBay } from "../assets/procedural/spaceStation/engineBay"; import { getRngFromSeed } from "../utils/getRngFromSeed"; import { orbitalObjectTypeToDisplay } from "../utils/strings/orbitalObjectTypeToDisplay"; +import { OrbitalFacility } from "./orbitalFacility"; +import { SpaceStationModel } from "./spacestationModel"; +import { OrbitalObject } from "../architecture/orbitalObject"; +import { ObjectTargetCursorType, Targetable, TargetInfo } from "../architecture/targetable"; +import { setRotationQuaternion } from "../uberCore/transforms/basicTransform"; -export class SpaceStation implements OrbitalObject, Cullable, ManagesLandingPads { +export class SpaceStation implements OrbitalFacility { readonly name: string; readonly model: SpaceStationModel; - readonly postProcesses: PostProcessType[] = []; - readonly solarSections: SolarSection[] = []; readonly utilitySections: UtilitySection[] = []; readonly helixHabitats: HelixHabitat[] = []; @@ -62,6 +60,8 @@ export class SpaceStation implements OrbitalObject, Cullable, ManagesLandingPads private readonly boundingRadius: number; + readonly targetInfo: TargetInfo; + constructor(model: SpaceStationModel, scene: Scene) { this.model = model; @@ -81,11 +81,16 @@ export class SpaceStation implements OrbitalObject, Cullable, ManagesLandingPads .getChildTransformNodes(true) .forEach((transform) => transform.position.addInPlace(deltaPosition)); - this.root.rotate(Axis.X, this.model.physics.axialTilt); - this.root.rotate(Axis.Z, this.model.physics.axialTilt); + setRotationQuaternion(this.getTransform(), this.model.physics.axialTilt); const extendSize = boundingVectors.max.subtract(boundingVectors.min).scale(0.5); this.boundingRadius = Math.max(extendSize.x, extendSize.y, extendSize.z); + + this.targetInfo = { + type: ObjectTargetCursorType.FACILITY, + minDistance: this.getBoundingRadius() * 6.0, + maxDistance: 0.0 + }; } getLandingPads(): LandingPad[] { @@ -94,6 +99,10 @@ export class SpaceStation implements OrbitalObject, Cullable, ManagesLandingPads }); } + getSubTargets(): Targetable[] { + return this.getLandingPads(); + } + handleLandingRequest(request: LandingRequest): LandingPad | null { const availableLandingPads = this.getLandingPads() .filter((landingPad) => { @@ -220,7 +229,7 @@ export class SpaceStation implements OrbitalObject, Cullable, ManagesLandingPads node.position = parent.position.add(parent.up.scale(previousSectionSizeY + newSectionY)); } - update(stellarObjects: Transformable[], cameraWorldPosition: Vector3, deltaSeconds: number) { + update(stellarObjects: Transformable[], parents: OrbitalObject[], cameraWorldPosition: Vector3, deltaSeconds: number) { this.solarSections.forEach((solarSection) => solarSection.update(stellarObjects, cameraWorldPosition)); this.utilitySections.forEach((utilitySection) => utilitySection.update(stellarObjects, cameraWorldPosition)); this.helixHabitats.forEach((helixHabitat) => helixHabitat.update(stellarObjects, cameraWorldPosition, deltaSeconds)); diff --git a/src/ts/spacestation/spacestationModel.ts b/src/ts/spacestation/spacestationModel.ts index 83d601ef..9df937c0 100644 --- a/src/ts/spacestation/spacestationModel.ts +++ b/src/ts/spacestation/spacestationModel.ts @@ -17,60 +17,28 @@ import { getOrbitalPeriod, Orbit } from "../orbit/orbit"; import { Vector3 } from "@babylonjs/core/Maths/math.vector"; -import { OrbitalObjectModel, OrbitalObjectType } from "../architecture/orbitalObject"; +import { OrbitalObjectType } from "../architecture/orbitalObject"; import { OrbitalObjectPhysicsInfo } from "../architecture/physicsInfo"; import { CelestialBodyModel } from "../architecture/celestialBody"; -import { normalRandom, uniformRandBool } from "extended-random"; +import { normalRandom } from "extended-random"; import { clamp } from "../utils/math"; import { GenerationSteps } from "../utils/generationSteps"; import { CropType, CropTypes, getEdibleEnergyPerHaPerDay } from "../utils/agriculture"; import { randomPieChart } from "../utils/random"; import { generateSpaceStationName } from "../utils/strings/spaceStationNameGenerator"; -import { Faction } from "../society/factions"; -import { getPowerPlayData } from "../society/powerplay"; +import { getFactionFromCoordinates } from "../society/factions"; import { getSolarPanelSurfaceFromEnergyRequirement } from "../utils/solarPanels"; import { Settings } from "../settings"; import { StellarObjectModel } from "../architecture/stellarObject"; import { StarSystemCoordinates } from "../utils/coordinates/universeCoordinates"; - import { getRngFromSeed } from "../utils/getRngFromSeed"; import { getSphereRadiatedEnergyFlux } from "../utils/physics"; +import { OrbitalFacilityModel } from "./orbitalFacility"; +import { Quaternion } from "@babylonjs/core/Maths/math"; +import { Axis } from "@babylonjs/core/Maths/math.axis"; -export type SpaceStationModel = OrbitalObjectModel & { - readonly starSystemCoordinates: StarSystemCoordinates; - - readonly population: number; - - /** - * The average energy consumption of a citizen of the habitat in KWh - */ - readonly energyConsumptionPerCapitaKWh: number; - - /** - * The number of inhabitants per square kilometer in the habitat - */ - readonly populationDensity: number; - - readonly agricultureMix: [number, CropType][]; - - readonly nbHydroponicLayers: number; - - readonly faction: Faction; - - /** - * The total energy consumption of the habitat in KWh - */ - readonly totalEnergyConsumptionKWh: number; - readonly solarPanelEfficiency: number; - - /** - * The surface of solar panels in m² - */ - readonly solarPanelSurfaceM2: number; - - readonly housingSurfaceHa: number; - readonly agricultureSurfaceHa: number; - readonly totalHabitatSurfaceM2: number; +export type SpaceStationModel = OrbitalFacilityModel & { + readonly type: OrbitalObjectType.SPACE_STATION; }; export function newSeededSpaceStationModel( @@ -83,7 +51,7 @@ export function newSeededSpaceStationModel( const name = generateSpaceStationName(rng, 2756); - const parentMaxRadius = parentBodies.reduce((max, body) => Math.max(max, body.radius), 0); + const parentMaxRadius = parentBodies.reduce((max, body) => Math.max(max, body.radius, (body.rings?.ringEnd || 0) * body.radius), 0); const orbitRadius = (2 + clamp(normalRandom(2, 1, rng, GenerationSteps.ORBIT), 0, 10)) * parentMaxRadius; const parentMassSum = parentBodies.reduce((sum, body) => sum + body.physics.mass, 0); @@ -91,30 +59,16 @@ export function newSeededSpaceStationModel( radius: orbitRadius, p: 2, period: getOrbitalPeriod(orbitRadius, parentMassSum), - normalToPlane: Vector3.Up() + orientation: Quaternion.Identity() }; const physicalProperties: OrbitalObjectPhysicsInfo = { mass: 1, - rotationPeriod: 0, - axialTilt: 2 * rng(GenerationSteps.AXIAL_TILT) * Math.PI + siderealDayDuration: 0, + axialTilt: Quaternion.RotationAxis(Axis.X, 2 * rng(GenerationSteps.AXIAL_TILT) * Math.PI) }; - const powerplayData = getPowerPlayData(starSystemCoordinates); - - const isMaterialist = uniformRandBool(powerplayData.materialistSpiritualist, rng, 249); - const isCapitalist = uniformRandBool(powerplayData.capitalistCommunist, rng, 498); - - let faction: Faction; - if (isMaterialist && isCapitalist) { - faction = Faction.FEYNMAN_INTERSTELLAR; - } else if (isMaterialist && !isCapitalist) { - faction = Faction.HUMAN_COMMONWEALTH; - } else if (!isMaterialist && isCapitalist) { - faction = Faction.CHURCH_OF_AWAKENING; - } else { - faction = Faction.SATORI_CONCORD; - } + const faction = getFactionFromCoordinates(starSystemCoordinates, rng); //TODO: make this dependent on economic model const population = 2_000_000; diff --git a/src/ts/starSystem/seededStarSystemModel.ts b/src/ts/starSystem/seededStarSystemModel.ts index b33649fc..564f273e 100644 --- a/src/ts/starSystem/seededStarSystemModel.ts +++ b/src/ts/starSystem/seededStarSystemModel.ts @@ -40,6 +40,7 @@ import { isSystemInHumanBubble } from "../society/starSystemSociety"; import { OrbitalObjectType } from "../architecture/orbitalObject"; import { newSeededTelluricSatelliteModel } from "../planets/telluricPlanet/telluricSatelliteModel"; import { newSeededTelluricPlanetModel } from "../planets/telluricPlanet/telluricPlanetModel"; +import { newSeededSpaceElevatorModel } from "../spacestation/spaceElevatorModel"; const enum GenerationSteps { NAME, @@ -116,14 +117,14 @@ export function newSeededStarSystemModel(seed: SystemSeed): StarSystemModel { planetarySystems.push({ planets: [newSeededTelluricPlanetModel(seed, planetName, stellarObjects)], satellites: [], - spaceStations: [] + orbitalFacilities: [] }); break; case OrbitalObjectType.GAS_PLANET: planetarySystems.push({ planets: [newSeededGasPlanetModel(seed, planetName, stellarObjects)], satellites: [], - spaceStations: [] + orbitalFacilities: [] }); break; default: @@ -204,8 +205,19 @@ export function newSeededStarSystemModel(seed: SystemSeed): StarSystemModel { planetarySystemsWithStations.forEach((planetarySystem) => { const spaceStationSeed = centeredRand(systemRng, GenerationSteps.SPACE_STATIONS + planetarySystem.planets.length) * Settings.SEED_HALF_RANGE; - const spaceStationModel = newSeededSpaceStationModel(spaceStationSeed, stellarObjects, coordinates, planetarySystem.planets); - planetarySystem.spaceStations.push(spaceStationModel); + + if ( + uniformRandBool(0.5, systemRng, 657) && // 50% chance of having a space elevator + planetarySystem.planets.length === 1 && // I don't want to imagine the complexity of a space elevator in a close binary system + planetarySystem.planets[0].type === OrbitalObjectType.TELLURIC_PLANET && // space elevators can't be built on gas giants yet + planetarySystem.planets[0].rings === null // can't have rings because the tether would be at risk + ) { + const spaceElevatorModel = newSeededSpaceElevatorModel(spaceStationSeed, stellarObjects, coordinates, planetarySystem.planets[0]); + planetarySystem.orbitalFacilities.push(spaceElevatorModel); + } else { + const spaceStationModel = newSeededSpaceStationModel(spaceStationSeed, stellarObjects, coordinates, planetarySystem.planets); + planetarySystem.orbitalFacilities.push(spaceStationModel); + } }); } @@ -217,7 +229,7 @@ export function newSeededStarSystemModel(seed: SystemSeed): StarSystemModel { stellarObjects, planetarySystems, anomalies, - spaceStations: [] + orbitalFacilities: [] } ] }; diff --git a/src/ts/starSystem/starSystemController.ts b/src/ts/starSystem/starSystemController.ts index 908d44b8..9fa0c35f 100644 --- a/src/ts/starSystem/starSystemController.ts +++ b/src/ts/starSystem/starSystemController.ts @@ -49,18 +49,22 @@ import { StarSystemCoordinates } from "../utils/coordinates/universeCoordinates" import { wait } from "../utils/wait"; import { Planet } from "../architecture/planet"; import { TelluricPlanetModel } from "../planets/telluricPlanet/telluricPlanetModel"; +import { OrbitalFacility } from "../spacestation/orbitalFacility"; +import { SpaceStationModel } from "../spacestation/spacestationModel"; +import { SpaceElevator } from "../spacestation/spaceElevator"; +import { SpaceElevatorModel } from "../spacestation/spaceElevatorModel"; export type PlanetarySystem = { readonly planets: Planet[]; readonly satellites: TelluricPlanet[]; - readonly spaceStations: SpaceStation[]; + readonly spaceStations: OrbitalFacility[]; }; export type SubStarSystem = { readonly stellarObjects: StellarObject[]; readonly planetarySystems: PlanetarySystem[]; readonly anomalies: CelestialBody[]; - readonly spaceStations: SpaceStation[]; + readonly spaceStations: OrbitalFacility[]; }; /** @@ -176,13 +180,20 @@ export class StarSystemController { await wait(this.timeOut); } - const spaceStations: SpaceStation[] = []; - for (const spaceStationModel of subSystemModel.spaceStations) { - const spaceStation = new SpaceStation(spaceStationModel, this.scene); - spaceStations.push(spaceStation); - spaceStation.getTransform().setAbsolutePosition(new Vector3(this.offset * ++this.loadingIndex, 0, 0)); + const spaceStations: OrbitalFacility[] = []; + for (const orbitalFacilityModel of subSystemModel.orbitalFacilities) { + let orbitalFacility: OrbitalFacility; + switch (orbitalFacilityModel.type) { + case OrbitalObjectType.SPACE_STATION: + orbitalFacility = new SpaceStation(orbitalFacilityModel as SpaceStationModel, this.scene); + break; + case OrbitalObjectType.SPACE_ELEVATOR: + throw new Error("A space elevator orbiting a star??? Sounds like a bad idea"); + } + spaceStations.push(orbitalFacility); + orbitalFacility.getTransform().setAbsolutePosition(new Vector3(this.offset * ++this.loadingIndex, 0, 0)); - this.objectToParents.set(spaceStation, stellarObjects); + this.objectToParents.set(orbitalFacility, stellarObjects); await wait(this.timeOut); } @@ -234,14 +245,26 @@ export class StarSystemController { await wait(this.timeOut); } - const spaceStations: SpaceStation[] = []; - for (const spaceStationModel of planetarySystemModel.spaceStations) { - console.log("Loading space station:", spaceStationModel.name); - const spaceStation = new SpaceStation(spaceStationModel, this.scene); - spaceStations.push(spaceStation); - spaceStation.getTransform().setAbsolutePosition(new Vector3(this.offset * ++this.loadingIndex, 0, 0)); + const spaceStations: OrbitalFacility[] = []; + for (const orbitalFacilityModel of planetarySystemModel.orbitalFacilities) { + console.log("Loading space station:", orbitalFacilityModel.name); + + let orbitalFacility: OrbitalFacility; - this.objectToParents.set(spaceStation, planets); + switch (orbitalFacilityModel.type) { + case OrbitalObjectType.SPACE_STATION: + orbitalFacility = new SpaceStation(orbitalFacilityModel as SpaceStationModel, this.scene); + break; + + case OrbitalObjectType.SPACE_ELEVATOR: + orbitalFacility = new SpaceElevator(orbitalFacilityModel as SpaceElevatorModel, this.scene); + break; + } + + spaceStations.push(orbitalFacility); + orbitalFacility.getTransform().setAbsolutePosition(new Vector3(this.offset * ++this.loadingIndex, 0, 0)); + + this.objectToParents.set(orbitalFacility, planets); await wait(this.timeOut); } @@ -258,37 +281,29 @@ export class StarSystemController { * @param position The position from which we want to find the nearest orbital object */ public getNearestOrbitalObject(position: Vector3): OrbitalObject { - const celestialBodies = this.getCelestialBodies(); - const spaceStations = this.getSpaceStations(); - if (celestialBodies.length + spaceStations.length === 0) throw new Error("There are no orbital objects in the solar system"); - let nearest: OrbitalObject = celestialBodies[0]; + const orbitalObjects = this.getOrbitalObjects(); + + if (orbitalObjects.length === 0) throw new Error("There are no orbital objects in the solar system"); + let nearest: OrbitalObject = orbitalObjects[0]; let smallerDistance = Number.POSITIVE_INFINITY; - for (const body of celestialBodies) { - const distance = body.getTransform().getAbsolutePosition().subtract(position).length() - body.getRadius(); + for (const body of orbitalObjects) { + const distance = body.getTransform().getAbsolutePosition().subtract(position).length() - body.getBoundingRadius(); if (distance < smallerDistance) { nearest = body; smallerDistance = distance; } } - for (const spacestation of spaceStations) { - const distance = spacestation.getTransform().getAbsolutePosition().subtract(position).length(); - if (distance < smallerDistance && distance < spacestation.getBoundingRadius() * 20) { - nearest = spacestation; - smallerDistance = distance; - } - } - return nearest; } /** * Returns all the space stations in the star system */ - public getSpaceStations(): SpaceStation[] { - const solarSpaceStations: SpaceStation[] = this.subSystems.flatMap((subSystem) => subSystem.spaceStations); - const planetSpaceStations: SpaceStation[] = this.subSystems.flatMap((subSystem) => subSystem.planetarySystems.flatMap((planetarySystem) => planetarySystem.spaceStations)); - return solarSpaceStations.concat(planetSpaceStations); + public getOrbitalFacilities(): OrbitalFacility[] { + const solarFacilities: OrbitalFacility[] = this.subSystems.flatMap((subSystem) => subSystem.spaceStations); + const planetFacilities: OrbitalFacility[] = this.subSystems.flatMap((subSystem) => subSystem.planetarySystems.flatMap((planetarySystem) => planetarySystem.spaceStations)); + return solarFacilities.concat(planetFacilities); } /** @@ -315,7 +330,7 @@ export class StarSystemController { * Returns all the orbital objects in the star system */ public getOrbitalObjects(): OrbitalObject[] { - return [...this.getCelestialBodies(), ...this.getSpaceStations()]; + return [...this.getCelestialBodies(), ...this.getOrbitalFacilities()]; } /** @@ -459,7 +474,7 @@ export class StarSystemController { const celestialBodies = this.getCelestialBodies(); const stellarObjects = this.getStellarObjects(); - const spaceStations = this.getSpaceStations(); + const orbitalFacilities = this.getOrbitalFacilities(); const orbitalObjects = this.getOrbitalObjects(); // The nearest body might have to be treated separately @@ -473,19 +488,31 @@ export class StarSystemController { // When we are a bit further, we only need to compensate the translation as it would be unnatural not to see the body rotating const distanceOfNearestToControls = Vector3.Distance(nearestOrbitalObject.getTransform().getAbsolutePosition(), controller.getTransform().getAbsolutePosition()); - const shouldCompensateTranslation = distanceOfNearestToControls < nearestOrbitalObject.getBoundingRadius() * (nearestOrbitalObject instanceof SpaceStation ? 200 : 10); - + const shouldCompensateTranslation = + distanceOfNearestToControls < nearestOrbitalObject.getBoundingRadius() * (nearestOrbitalObject.model.type === OrbitalObjectType.SPACE_STATION ? 200 : 10); + // compensate rotation when close to the body let shouldCompensateRotation = distanceOfNearestToControls < nearestOrbitalObject.getBoundingRadius() * 3; if (nearestOrbitalObject === nearestCelestialBody && ringUniforms !== null) { // or in the vicinity of the rings shouldCompensateRotation = shouldCompensateRotation || distanceOfNearestToControls < ringUniforms.model.ringEnd * nearestOrbitalObject.getBoundingRadius(); } - // and never compensate the rotation of a space station - shouldCompensateRotation = shouldCompensateRotation && !(nearestOrbitalObject instanceof SpaceStation); - // also never compensate the rotation of a black hole + // never compensate the rotation of a black hole shouldCompensateRotation = shouldCompensateRotation && !(nearestOrbitalObject instanceof BlackHole); + // first, all other objects are updated normally + for (const object of orbitalObjects) { + if (object === nearestOrbitalObject) continue; + + const parents = this.objectToParents.get(object); + if (parents === undefined) { + throw new Error(`Parents of ${object.model.name} are not defined`); + } + + OrbitalObjectUtils.SetOrbitalPosition(object, parents, this.elapsedSeconds); + OrbitalObjectUtils.UpdateRotation(object, deltaSeconds); + } + // ROTATION COMPENSATION // If we have to compensate the rotation of the nearest body, there are multiple things to take into account // The orbital plane of the body can be described using its normal vector. When the body is not rotating, the normal vector will rotate in its stead. @@ -498,26 +525,28 @@ export class StarSystemController { if (shouldCompensateRotation) { const dThetaNearest = OrbitalObjectUtils.GetRotationAngle(nearestOrbitalObject, deltaSeconds); + const nearestObjectRotationAxis = nearestOrbitalObject.getRotationAxis(); + for (const object of orbitalObjects) { const orbit = object.model.orbit; // the normal to the orbit planes must be rotated as well (even the one of the nearest body) - const rotation = Quaternion.RotationAxis(nearestOrbitalObject.getRotationAxis(), -dThetaNearest); - orbit.normalToPlane.applyRotationQuaternionInPlace(rotation); + const rotation = Quaternion.RotationAxis(nearestObjectRotationAxis, -dThetaNearest); + rotation.multiplyToRef(orbit.orientation, orbit.orientation); if (object === nearestOrbitalObject) continue; // All other bodies must revolve around it for consistency (finally we can say the sun revolves around the earth!) - rotateAround(object.getTransform(), nearestOrbitalObject.getTransform().getAbsolutePosition(), nearestOrbitalObject.getRotationAxis(), -dThetaNearest); + rotateAround(object.getTransform(), nearestOrbitalObject.getTransform().getAbsolutePosition(), nearestObjectRotationAxis, -dThetaNearest); } this.systemTargets.forEach((target) => { - rotateAround(target.getTransform(), nearestOrbitalObject.getTransform().getAbsolutePosition(), nearestOrbitalObject.getRotationAxis(), -dThetaNearest); + rotateAround(target.getTransform(), nearestOrbitalObject.getTransform().getAbsolutePosition(), nearestObjectRotationAxis, -dThetaNearest); }); // the starfield is rotated to give the impression the nearest body is rotating, which is only an illusion - const starfieldAdditionalRotation = Matrix.RotationAxis(nearestOrbitalObject.getRotationAxis(), dThetaNearest); - this.starFieldBox.setRotationMatrix(this.starFieldBox.getRotationMatrix().multiply(starfieldAdditionalRotation)); + const starfieldAdditionalRotation = Matrix.RotationAxis(nearestObjectRotationAxis, dThetaNearest); + this.starFieldBox.setRotationMatrix(starfieldAdditionalRotation.multiply(this.starFieldBox.getRotationMatrix())); } else { // if we don't compensate the rotation of the nearest body, we must simply update its rotation OrbitalObjectUtils.UpdateRotation(nearestOrbitalObject, deltaSeconds); @@ -552,19 +581,6 @@ export class StarSystemController { translate(nearestOrbitalObject.getTransform(), nearestBodyDisplacement); } - // finally, all other objects are updated normally - for (const object of orbitalObjects) { - if (object === nearestOrbitalObject) continue; - - const parents = this.objectToParents.get(object); - if (parents === undefined) { - throw new Error(`Parents of ${object.model.name} are not defined`); - } - - OrbitalObjectUtils.SetOrbitalPosition(object, parents, this.elapsedSeconds); - OrbitalObjectUtils.UpdateRotation(object, deltaSeconds); - } - controller.update(deltaSeconds); for (const object of celestialBodies) { @@ -582,9 +598,9 @@ export class StarSystemController { } const cameraWorldPosition = controller.getTransform().getAbsolutePosition(); - for (const spaceStation of spaceStations) { - spaceStation.update(stellarObjects, cameraWorldPosition, deltaSeconds); - spaceStation.computeCulling(controller.getActiveCameras()); + for (const orbitalFacility of orbitalFacilities) { + orbitalFacility.update(stellarObjects, this.objectToParents.get(orbitalFacility) ?? [], cameraWorldPosition, deltaSeconds); + orbitalFacility.computeCulling(controller.getActiveCameras()); } // floating origin diff --git a/src/ts/starSystem/starSystemModel.ts b/src/ts/starSystem/starSystemModel.ts index 8ae3c79e..d1c91a90 100644 --- a/src/ts/starSystem/starSystemModel.ts +++ b/src/ts/starSystem/starSystemModel.ts @@ -19,9 +19,9 @@ import { StarSystemCoordinates } from "../utils/coordinates/universeCoordinates" import { StellarObjectModel } from "../architecture/stellarObject"; import { PlanetaryMassObjectModel } from "../architecture/planetaryMassObject"; import { AnomalyModel } from "../anomalies/anomaly"; -import { SpaceStationModel } from "../spacestation/spacestationModel"; import { PlanetModel } from "../architecture/planet"; import { TelluricSatelliteModel } from "../planets/telluricPlanet/telluricSatelliteModel"; +import { OrbitalFacilityModel } from "../spacestation/orbitalFacility"; /** * Data model for a planetary system. It holds all the information necessary to generate and render a planetary system. @@ -43,7 +43,7 @@ export type PlanetarySystemModel = { /** * The space stations orbiting the planet. */ - spaceStations: SpaceStationModel[]; + orbitalFacilities: OrbitalFacilityModel[]; }; /** @@ -71,7 +71,7 @@ export type SubStarSystemModel = { /** * The space stations orbiting the stellar objects in the sub star system. */ - spaceStations: SpaceStationModel[]; + orbitalFacilities: OrbitalFacilityModel[]; }; /** @@ -132,9 +132,9 @@ export class StarSystemModelUtils { * @param starSystem The star system to get the space stations from. * @constructor */ - static GetSpaceStations(starSystem: StarSystemModel): SpaceStationModel[] { - const stellarSpaceStations = starSystem.subSystems.flatMap((subSystem) => subSystem.spaceStations); - const planetarySpaceStations = starSystem.subSystems.flatMap((subSystem) => subSystem.planetarySystems.flatMap((planetarySystem) => planetarySystem.spaceStations)); + static GetSpaceStations(starSystem: StarSystemModel): OrbitalFacilityModel[] { + const stellarSpaceStations = starSystem.subSystems.flatMap((subSystem) => subSystem.orbitalFacilities); + const planetarySpaceStations = starSystem.subSystems.flatMap((subSystem) => subSystem.planetarySystems.flatMap((planetarySystem) => planetarySystem.orbitalFacilities)); return stellarSpaceStations.concat(planetarySpaceStations); } diff --git a/src/ts/starSystem/starSystemView.ts b/src/ts/starSystem/starSystemView.ts index 1beeede5..3ef2ad73 100644 --- a/src/ts/starSystem/starSystemView.ts +++ b/src/ts/starSystem/starSystemView.ts @@ -37,7 +37,12 @@ import { ChunkForge } from "../planets/telluricPlanet/terrain/chunks/chunkForge" import { DefaultControls } from "../defaultControls/defaultControls"; import { CharacterControls } from "../characterControls/characterControls"; import { Assets } from "../assets/assets"; -import { getForwardDirection, getRotationQuaternion, setRotationQuaternion, translate } from "../uberCore/transforms/basicTransform"; +import { + getForwardDirection, + getRotationQuaternion, + setRotationQuaternion, + translate +} from "../uberCore/transforms/basicTransform"; import { Observable } from "@babylonjs/core/Misc/observable"; import { NeutronStar } from "../stellarObjects/neutronStar/neutronStar"; import { View } from "../utils/view"; @@ -56,8 +61,6 @@ import i18n from "../i18n"; import { AbstractEngine } from "@babylonjs/core/Engines/abstractEngine"; import { Sounds } from "../assets/sounds"; import { Materials } from "../assets/materials"; -import { SpaceStation } from "../spacestation/spaceStation"; -import { ObjectTargetCursorType } from "../ui/objectTargetCursor"; import { SpaceStationLayer } from "../ui/spaceStation/spaceStationLayer"; import { Player } from "../player/player"; import { getNeighborStarSystemCoordinates } from "../utils/getNeighborStarSystems"; @@ -71,7 +74,8 @@ import { Mission } from "../missions/mission"; import { StarSystemCoordinates, starSystemCoordinatesEquals } from "../utils/coordinates/universeCoordinates"; import { getSystemModelFromCoordinates } from "./modelFromCoordinates"; import { StarSystemModel } from "./starSystemModel"; -import { isSatellite } from "../architecture/orbitalObject"; +import { OrbitalObjectType } from "../architecture/orbitalObject"; +import { OrbitalFacility } from "../spacestation/orbitalFacility"; /** * The star system view is the part of Cosmos Journeyer responsible to display the current star system, along with the @@ -430,22 +434,17 @@ export class StarSystemView implements View { this.targetCursorLayer.reset(); const celestialBodies = starSystem.getCelestialBodies(); - const spaceStations = starSystem.getSpaceStations(); + const spaceStations = starSystem.getOrbitalFacilities(); celestialBodies.forEach((body) => { - let maxDistance = 0.0; - if (isSatellite(body.model.type)) { - // moon target cursors fades away when the player is too far - maxDistance = body.model.orbit.radius * 8.0; - } - this.targetCursorLayer.addObject(body, ObjectTargetCursorType.CELESTIAL_BODY, body.getBoundingRadius() * 10.0, maxDistance); + this.targetCursorLayer.addObject(body); }); spaceStations.forEach((spaceStation) => { - this.targetCursorLayer.addObject(spaceStation, ObjectTargetCursorType.FACILITY, spaceStation.getBoundingRadius() * 6.0, 0.0); + this.targetCursorLayer.addObject(spaceStation); - spaceStation.getLandingPads().forEach((landingPad) => { - this.targetCursorLayer.addObject(landingPad, ObjectTargetCursorType.LANDING_PAD, landingPad.getBoundingRadius() * 4.0, 2e3); + spaceStation.getSubTargets().forEach((landingPad) => { + this.targetCursorLayer.addObject(landingPad); }); }); @@ -469,7 +468,7 @@ export class StarSystemView implements View { getNeighborStarSystemCoordinates(starSystem.model.coordinates, Math.min(Settings.PLAYER_JUMP_RANGE_LY, Settings.VISIBLE_NEIGHBORHOOD_MAX_RADIUS_LY)).forEach( ([neighborCoordinates, position, distance]) => { const systemTarget = this.getStarSystem().addSystemTarget(neighborCoordinates); - this.targetCursorLayer.addObject(systemTarget, ObjectTargetCursorType.STAR_SYSTEM, 0, 0); + this.targetCursorLayer.addObject(systemTarget); } ); @@ -557,8 +556,8 @@ export class StarSystemView implements View { this.characterControls.setClosestWalkableObject(nearestOrbitalObject); this.spaceshipControls.spaceship.setClosestWalkableObject(nearestOrbitalObject); - if (nearestOrbitalObject instanceof SpaceStation) { - this.spaceshipControls.setClosestLandableFacility(nearestOrbitalObject); + if (nearestOrbitalObject.model.type === OrbitalObjectType.SPACE_STATION || nearestOrbitalObject.model.type === OrbitalObjectType.SPACE_ELEVATOR) { + this.spaceshipControls.setClosestLandableFacility(nearestOrbitalObject as OrbitalFacility); } else { this.spaceshipControls.setClosestLandableFacility(null); } @@ -627,7 +626,7 @@ export class StarSystemView implements View { this.spaceStationLayer.setVisibility(true); const facility = this.spaceshipControls.getClosestLandableFacility(); this.getStarSystem() - .getSpaceStations() + .getOrbitalFacilities() .find((spaceStation) => { if (spaceStation === facility) { this.spaceStationLayer.setStation( @@ -794,7 +793,7 @@ export class StarSystemView implements View { .find((systemTarget) => starSystemCoordinatesEquals(systemTarget.systemCoordinates, targetSeed)); if (target === undefined) { target = this.getStarSystem().addSystemTarget(targetSeed); - this.targetCursorLayer.addObject(target, ObjectTargetCursorType.STAR_SYSTEM, 0, 0); + this.targetCursorLayer.addObject(target); } this.targetCursorLayer.setTarget(target); this.spaceShipLayer.setTarget(target.getTransform()); diff --git a/src/ts/starmap/starMap.ts b/src/ts/starmap/starMap.ts index 83028e7d..32cebaa0 100644 --- a/src/ts/starmap/starMap.ts +++ b/src/ts/starmap/starMap.ts @@ -445,7 +445,6 @@ export class StarMap implements View { const starSystemCoordinates = data.coordinates; const starSystemModel = getSystemModelFromCoordinates(starSystemCoordinates); - //TODO: when implementing binary star systems, this will need to be updated to display all stellar objects and not just the first one const stellarObjectModel = StarSystemModelUtils.GetStellarObjects(starSystemModel)[0]; diff --git a/src/ts/stellarObjects/blackHole/blackHole.ts b/src/ts/stellarObjects/blackHole/blackHole.ts index 086f9da5..a8316ddb 100644 --- a/src/ts/stellarObjects/blackHole/blackHole.ts +++ b/src/ts/stellarObjects/blackHole/blackHole.ts @@ -15,7 +15,6 @@ // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . -import { Axis } from "@babylonjs/core/Maths/math.axis"; import { PointLight } from "@babylonjs/core/Lights/pointLight"; import { Vector3 } from "@babylonjs/core/Maths/math.vector"; import { Scene } from "@babylonjs/core/scene"; @@ -28,6 +27,9 @@ import { Cullable } from "../../utils/cullable"; import { TransformNode } from "@babylonjs/core/Meshes"; import { orbitalObjectTypeToDisplay } from "../../utils/strings/orbitalObjectTypeToDisplay"; +import { defaultTargetInfoCelestialBody, TargetInfo } from "../../architecture/targetable"; +import { setRotationQuaternion } from "../../uberCore/transforms/basicTransform"; + export class BlackHole implements StellarObject, Cullable { readonly name: string; @@ -43,13 +45,15 @@ export class BlackHole implements StellarObject, Cullable { readonly asteroidField = null; + readonly targetInfo: TargetInfo; + constructor(model: BlackHoleModel, scene: Scene) { this.model = model; this.name = this.model.name; this.transform = new TransformNode(this.model.name, scene); - this.transform.rotate(Axis.X, this.model.physics.axialTilt); + setRotationQuaternion(this.getTransform(), this.model.physics.axialTilt); this.light = new PointLight(`${this.model.name}Light`, Vector3.Zero(), scene); //this.light.diffuse.fromArray(getRgbFromTemperature(this.model.physicalProperties.temperature).asArray()); @@ -58,6 +62,8 @@ export class BlackHole implements StellarObject, Cullable { if (this.model.physics.accretionDiskRadius === 0) this.light.intensity = 0; this.postProcesses.push(PostProcessType.BLACK_HOLE); + + this.targetInfo = defaultTargetInfoCelestialBody(this.getBoundingRadius()); } getTransform(): TransformNode { diff --git a/src/ts/stellarObjects/blackHole/blackHoleModel.ts b/src/ts/stellarObjects/blackHole/blackHoleModel.ts index 419604e8..fe58605a 100644 --- a/src/ts/stellarObjects/blackHole/blackHoleModel.ts +++ b/src/ts/stellarObjects/blackHole/blackHoleModel.ts @@ -16,7 +16,6 @@ // along with this program. If not, see . import { getOrbitalPeriod, Orbit } from "../../orbit/orbit"; -import { Vector3 } from "@babylonjs/core/Maths/math.vector"; import { normalRandom } from "extended-random"; import { BlackHolePhysicsInfo } from "../../architecture/physicsInfo"; import { CelestialBodyModel } from "../../architecture/celestialBody"; @@ -27,6 +26,8 @@ import { GenerationSteps } from "../../utils/generationSteps"; import { getRngFromSeed } from "../../utils/getRngFromSeed"; import { OrbitalObjectType } from "../../architecture/orbitalObject"; import { estimateStarRadiusFromMass } from "../../utils/physics"; +import { Quaternion } from "@babylonjs/core/Maths/math"; +import { Axis } from "@babylonjs/core/Maths/math.axis"; export type BlackHoleModel = StellarObjectModel & { readonly type: OrbitalObjectType.BLACK_HOLE; @@ -54,14 +55,14 @@ export function newSeededBlackHoleModel(seed: number, name: string, parentBodies radius: orbitRadius, p: 2, period: getOrbitalPeriod(orbitRadius, parentMassSum), - normalToPlane: Vector3.Up() + orientation: Quaternion.Identity() }; const physicalProperties: BlackHolePhysicsInfo = { mass: getMassFromSchwarzschildRadius(radius), //FIXME: do not hardcode - rotationPeriod: 1.5e-19, - axialTilt: normalRandom(0, 0.4, rng, GenerationSteps.AXIAL_TILT), + siderealDayDuration: 1.5e-19, + axialTilt: Quaternion.RotationAxis(Axis.X, normalRandom(0, 0.4, rng, GenerationSteps.AXIAL_TILT)), accretionDiskRadius: radius * normalRandom(12, 3, rng, 7777), //TODO: compute temperature of accretion disk (function of rotation speed) blackBodyTemperature: 7_000 diff --git a/src/ts/stellarObjects/blackHole/blackHolePostProcess.ts b/src/ts/stellarObjects/blackHole/blackHolePostProcess.ts index da56b946..39d75018 100644 --- a/src/ts/stellarObjects/blackHole/blackHolePostProcess.ts +++ b/src/ts/stellarObjects/blackHole/blackHolePostProcess.ts @@ -87,7 +87,7 @@ export class BlackHolePostProcess extends PostProcess implements ObjectPostProce }); const schwarzschildRadius = blackHole.model.radius; - const kerrMetricA = getKerrMetricA(blackHole.model.physics.mass, blackHole.model.physics.rotationPeriod); + const kerrMetricA = getKerrMetricA(blackHole.model.physics.mass, blackHole.model.physics.siderealDayDuration); this.onApplyObservable.add((effect) => { if (this.activeCamera === null) { diff --git a/src/ts/stellarObjects/neutronStar/neutronStar.ts b/src/ts/stellarObjects/neutronStar/neutronStar.ts index bb2ae88e..2e2d520f 100644 --- a/src/ts/stellarObjects/neutronStar/neutronStar.ts +++ b/src/ts/stellarObjects/neutronStar/neutronStar.ts @@ -30,7 +30,6 @@ import { PhysicsShapeSphere } from "@babylonjs/core/Physics/v2/physicsShape"; import { getRgbFromTemperature } from "../../utils/specrend"; import { Light } from "@babylonjs/core/Lights/light"; import { setRotationQuaternion } from "../../uberCore/transforms/basicTransform"; -import { Quaternion } from "@babylonjs/core/Maths/math"; import { TransformNode } from "@babylonjs/core/Meshes"; import { RingsUniforms } from "../../rings/ringsUniform"; import { Camera } from "@babylonjs/core/Cameras/camera"; @@ -39,6 +38,8 @@ import { Scene } from "@babylonjs/core/scene"; import { AsteroidField } from "../../asteroidFields/asteroidField"; import { orbitalObjectTypeToDisplay } from "../../utils/strings/orbitalObjectTypeToDisplay"; +import { defaultTargetInfoCelestialBody, TargetInfo } from "../../architecture/targetable"; + export class NeutronStar implements StellarObject, Cullable { readonly model: NeutronStarModel; @@ -55,6 +56,8 @@ export class NeutronStar implements StellarObject, Cullable { readonly asteroidField: AsteroidField | null; + readonly targetInfo: TargetInfo; + /** * New Star * @param model The seed of the star in [-1, 1] @@ -86,7 +89,7 @@ export class NeutronStar implements StellarObject, Cullable { const physicsShape = new PhysicsShapeSphere(Vector3.Zero(), this.model.radius, scene); this.aggregate.shape.addChildFromParent(this.getTransform(), physicsShape, this.mesh); - this.light = new PointLight(`${name}Light`, Vector3.Zero(), scene); + this.light = new PointLight(`${this.model.name}Light`, Vector3.Zero(), scene); this.light.diffuse.fromArray(getRgbFromTemperature(this.model.physics.blackBodyTemperature).asArray()); this.light.falloffType = Light.FALLOFF_STANDARD; this.light.parent = this.getTransform(); @@ -94,7 +97,7 @@ export class NeutronStar implements StellarObject, Cullable { this.material = new StarMaterial(this.model, scene); this.mesh.material = this.material; - setRotationQuaternion(this.getTransform(), Quaternion.Identity()); + setRotationQuaternion(this.getTransform(), this.model.physics.axialTilt); this.postProcesses.push(PostProcessType.VOLUMETRIC_LIGHT, PostProcessType.LENS_FLARE, PostProcessType.MATTER_JETS); if (this.model.rings !== null) { @@ -109,6 +112,8 @@ export class NeutronStar implements StellarObject, Cullable { this.ringsUniforms = null; this.asteroidField = null; } + + this.targetInfo = defaultTargetInfoCelestialBody(this.getBoundingRadius()); } getTransform(): TransformNode { diff --git a/src/ts/stellarObjects/neutronStar/neutronStarModel.ts b/src/ts/stellarObjects/neutronStar/neutronStarModel.ts index 25d7e81d..d4f480d0 100644 --- a/src/ts/stellarObjects/neutronStar/neutronStarModel.ts +++ b/src/ts/stellarObjects/neutronStar/neutronStarModel.ts @@ -16,7 +16,6 @@ // along with this program. If not, see . import { CelestialBodyModel } from "../../architecture/celestialBody"; -import { Vector3 } from "@babylonjs/core/Maths/math.vector"; import { StellarObjectPhysicsInfo } from "../../architecture/physicsInfo"; import { StellarObjectModel } from "../../architecture/stellarObject"; import { getOrbitalPeriod, Orbit } from "../../orbit/orbit"; @@ -27,6 +26,7 @@ import { GenerationSteps } from "../../utils/generationSteps"; import { getRngFromSeed } from "../../utils/getRngFromSeed"; import { OrbitalObjectType } from "../../architecture/orbitalObject"; +import { Quaternion } from "@babylonjs/core/Maths/math"; export type NeutronStarModel = StellarObjectModel & { readonly type: OrbitalObjectType.NEUTRON_STAR; @@ -39,9 +39,9 @@ export function newSeededNeutronStarModel(seed: number, name: string, parentBodi const physicalProperties: StellarObjectPhysicsInfo = { mass: 1000, - rotationPeriod: 24 * 60 * 60, + siderealDayDuration: 24 * 60 * 60, blackBodyTemperature: temperature, - axialTilt: 0 + axialTilt: Quaternion.Identity() }; const radius = clamp(normalRandom(10e3, 1e3, rng, GenerationSteps.RADIUS), 2e3, 50e3); @@ -54,7 +54,7 @@ export function newSeededNeutronStarModel(seed: number, name: string, parentBodi radius: orbitRadius, p: 2, period: getOrbitalPeriod(orbitRadius, parentMassSum), - normalToPlane: Vector3.Up() + orientation: Quaternion.Identity() }; const ringProportion = 0.02; diff --git a/src/ts/stellarObjects/star/star.ts b/src/ts/stellarObjects/star/star.ts index 735dc454..9d45ad72 100644 --- a/src/ts/stellarObjects/star/star.ts +++ b/src/ts/stellarObjects/star/star.ts @@ -23,7 +23,6 @@ import { MeshBuilder } from "@babylonjs/core/Meshes/meshBuilder"; import { Vector3 } from "@babylonjs/core/Maths/math.vector"; import { Light } from "@babylonjs/core/Lights/light"; import { setRotationQuaternion } from "../../uberCore/transforms/basicTransform"; -import { Quaternion } from "@babylonjs/core/Maths/math"; import { PostProcessType } from "../../postProcesses/postProcessTypes"; import { Camera } from "@babylonjs/core/Cameras/camera"; import { isSizeOnScreenEnough } from "../../utils/isObjectVisibleOnScreen"; @@ -38,6 +37,8 @@ import { AsteroidField } from "../../asteroidFields/asteroidField"; import { getRgbFromTemperature } from "../../utils/specrend"; import { orbitalObjectTypeToDisplay } from "../../utils/strings/orbitalObjectTypeToDisplay"; +import { defaultTargetInfoCelestialBody, TargetInfo } from "../../architecture/targetable"; + export class Star implements StellarObject, Cullable { readonly mesh: Mesh; readonly light: PointLight; @@ -53,6 +54,8 @@ export class Star implements StellarObject, Cullable { readonly model: StarModel; + readonly targetInfo: TargetInfo; + /** * New Star * @param model The seed of the star in [-1, 1] @@ -90,7 +93,7 @@ export class Star implements StellarObject, Cullable { this.material = new StarMaterial(this.model, scene); this.mesh.material = this.material; - setRotationQuaternion(this.getTransform(), Quaternion.Identity()); + setRotationQuaternion(this.getTransform(), this.model.physics.axialTilt); this.postProcesses.push(PostProcessType.VOLUMETRIC_LIGHT, PostProcessType.LENS_FLARE); if (this.model.rings !== null) { @@ -105,6 +108,8 @@ export class Star implements StellarObject, Cullable { this.ringsUniforms = null; this.asteroidField = null; } + + this.targetInfo = defaultTargetInfoCelestialBody(this.getBoundingRadius()); } getTransform(): TransformNode { diff --git a/src/ts/stellarObjects/star/starModel.ts b/src/ts/stellarObjects/star/starModel.ts index 5237c69e..dcd81e1c 100644 --- a/src/ts/stellarObjects/star/starModel.ts +++ b/src/ts/stellarObjects/star/starModel.ts @@ -16,7 +16,6 @@ // along with this program. If not, see . import { randRange, randRangeInt, uniformRandBool } from "extended-random"; -import { Vector3 } from "@babylonjs/core/Maths/math.vector"; import { Settings } from "../../settings"; import { getOrbitalPeriod, Orbit } from "../../orbit/orbit"; import { StellarObjectPhysicsInfo } from "../../architecture/physicsInfo"; @@ -28,6 +27,7 @@ import { GenerationSteps } from "../../utils/generationSteps"; import { getRngFromSeed } from "../../utils/getRngFromSeed"; import { OrbitalObjectType } from "../../architecture/orbitalObject"; +import { Quaternion } from "@babylonjs/core/Maths/math"; export type StarModel = StellarObjectModel & { readonly type: OrbitalObjectType.STAR; @@ -44,9 +44,9 @@ export function newSeededStarModel(seed: number, name: string, parentBodies: Cel const physicalProperties: StellarObjectPhysicsInfo = { mass: 1.9885e30, //TODO: compute mass from physical properties - rotationPeriod: 24 * 60 * 60, + siderealDayDuration: 24 * 60 * 60, blackBodyTemperature: temperature, - axialTilt: 0 + axialTilt: Quaternion.Identity() }; const radius = getRandomRadiusFromStellarType(stellarType, rng); @@ -59,7 +59,7 @@ export function newSeededStarModel(seed: number, name: string, parentBodies: Cel radius: orbitRadius, p: 2, period: getOrbitalPeriod(orbitRadius, parentMassSum), - normalToPlane: Vector3.Up() + orientation: Quaternion.Identity() }; const rings = uniformRandBool(RING_PROPORTION, rng, GenerationSteps.RINGS) ? newSeededRingsModel(rng) : null; diff --git a/src/ts/ui/objectTargetCursor.ts b/src/ts/ui/objectTargetCursor.ts index d3d08c25..cb50f511 100644 --- a/src/ts/ui/objectTargetCursor.ts +++ b/src/ts/ui/objectTargetCursor.ts @@ -24,14 +24,7 @@ import { TypedObject } from "../architecture/typedObject"; import { Vector3 } from "@babylonjs/core/Maths/math.vector"; import { Matrix } from "@babylonjs/core/Maths/math"; import { smoothstep } from "../utils/math"; - -export const enum ObjectTargetCursorType { - CELESTIAL_BODY, - FACILITY, - ANOMALY, - LANDING_PAD, - STAR_SYSTEM -} +import { ObjectTargetCursorType, Targetable } from "../architecture/targetable"; export class ObjectTargetCursor { readonly htmlRoot: HTMLDivElement; @@ -62,7 +55,7 @@ export class ObjectTargetCursor { private isInformationEnabled = false; - constructor(object: Transformable & HasBoundingSphere & TypedObject, iconType: ObjectTargetCursorType, minDistance: number, maxDistance: number) { + constructor(object: Targetable) { this.htmlRoot = document.createElement("div"); this.htmlRoot.classList.add("targetCursorRoot"); this.htmlRoot.dataset.name = object.getTransform().name + " Target Cursor Root"; @@ -70,7 +63,7 @@ export class ObjectTargetCursor { this.cursor = document.createElement("div"); this.cursor.classList.add("targetCursor"); - switch (iconType) { + switch (object.targetInfo.type) { case ObjectTargetCursorType.CELESTIAL_BODY: this.cursor.classList.add("rounded"); this.minSize = 5; @@ -130,8 +123,8 @@ export class ObjectTargetCursor { this.object = object; - this.minDistance = minDistance; - this.maxDistance = maxDistance; + this.minDistance = object.targetInfo.minDistance; + this.maxDistance = object.targetInfo.maxDistance; } setTarget(isTarget: boolean) { @@ -159,8 +152,8 @@ export class ObjectTargetCursor { ); this.htmlRoot.classList.remove("hidden"); - this.htmlRoot.style.left = `${this.screenCoordinates.x * 100}vw`; - this.htmlRoot.style.top = `${this.screenCoordinates.y * 100}vh`; + this.htmlRoot.style.left = `${this.screenCoordinates.x * camera.getEngine().getRenderWidth()}px`; + this.htmlRoot.style.top = `${this.screenCoordinates.y * camera.getEngine().getRenderHeight()}px`; } else { this.htmlRoot.classList.add("hidden"); } diff --git a/src/ts/ui/spaceStation/spaceStationInfos.ts b/src/ts/ui/spaceStation/spaceStationInfos.ts index ebb5141f..14a7abfc 100644 --- a/src/ts/ui/spaceStation/spaceStationInfos.ts +++ b/src/ts/ui/spaceStation/spaceStationInfos.ts @@ -16,13 +16,13 @@ // along with this program. If not, see . import { factionToString } from "../../society/factions"; -import { SpaceStationModel } from "../../spacestation/spacestationModel"; import { CropType, cropTypeToString } from "../../utils/agriculture"; import { makeD3PieChart } from "../../utils/d3PieChart"; import { OrbitalObjectModel } from "../../architecture/orbitalObject"; +import { OrbitalFacilityModel } from "../../spacestation/orbitalFacility"; -export function generateInfoHTML(model: SpaceStationModel, parentModels: OrbitalObjectModel[]): string { +export function generateInfoHTML(model: OrbitalFacilityModel, parentModels: OrbitalObjectModel[]): string { const agricultureMix = model.agricultureMix; const parentName = parentModels.map((parentModel) => parentModel.name).join("-"); diff --git a/src/ts/ui/spaceStation/spaceStationLayer.ts b/src/ts/ui/spaceStation/spaceStationLayer.ts index c8d55db9..e0719f57 100644 --- a/src/ts/ui/spaceStation/spaceStationLayer.ts +++ b/src/ts/ui/spaceStation/spaceStationLayer.ts @@ -16,13 +16,13 @@ // along with this program. If not, see . import spaceStationHTML from "../../../html/spaceStationUI.html"; -import { SpaceStationModel } from "../../spacestation/spacestationModel"; import { Observable } from "@babylonjs/core/Misc/observable"; import { generateInfoHTML } from "./spaceStationInfos"; import { Player } from "../../player/player"; import { generateMissionsDom } from "./spaceStationMissions"; import { Settings } from "../../settings"; import { OrbitalObjectModel } from "../../architecture/orbitalObject"; +import { OrbitalFacilityModel } from "../../spacestation/orbitalFacility"; const enum MainPanelState { NONE, @@ -34,7 +34,7 @@ export class SpaceStationLayer { private parentNode: HTMLElement; private spaceStationHeader: HTMLElement; - private currentStation: SpaceStationModel | null = null; + private currentStation: OrbitalFacilityModel | null = null; private currentStationParents: OrbitalObjectModel[] = []; private readonly playerName: HTMLElement; @@ -135,7 +135,7 @@ export class SpaceStationLayer { return this.parentNode.style.visibility !== "hidden"; } - public setStation(station: SpaceStationModel, stationParents: OrbitalObjectModel[], player: Player) { + public setStation(station: OrbitalFacilityModel, stationParents: OrbitalObjectModel[], player: Player) { this.currentStation = station; this.currentStationParents = stationParents; this.spaceStationHeader.innerHTML = ` diff --git a/src/ts/ui/spaceStation/spaceStationMissions.ts b/src/ts/ui/spaceStation/spaceStationMissions.ts index fbf83a96..b0c65ab9 100644 --- a/src/ts/ui/spaceStation/spaceStationMissions.ts +++ b/src/ts/ui/spaceStation/spaceStationMissions.ts @@ -1,4 +1,3 @@ -import { SpaceStationModel } from "../../spacestation/spacestationModel"; import { getNeighborStarSystemCoordinates } from "../../utils/getNeighborStarSystems"; import { parseDistance } from "../../utils/strings/parseToStrings"; import { Settings } from "../../settings"; @@ -10,6 +9,7 @@ import { MissionContainer } from "./missionContainer"; import { getRngFromSeed } from "../../utils/getRngFromSeed"; import { getSystemModelFromCoordinates } from "../../starSystem/modelFromCoordinates"; import { StarSystemModelUtils } from "../../starSystem/starSystemModel"; +import { OrbitalFacilityModel } from "../../spacestation/orbitalFacility"; /** * Generates all missions available at the given space station for the player. Missions are generated based on the current timestamp (hourly basis). @@ -17,7 +17,7 @@ import { StarSystemModelUtils } from "../../starSystem/starSystemModel"; * @param player The player for which the missions are generated * @returns The DOM element containing the generated missions as HTML */ -export function generateMissionsDom(stationModel: SpaceStationModel, player: Player): HTMLDivElement { +export function generateMissionsDom(stationModel: OrbitalFacilityModel, player: Player): HTMLDivElement { const starSystemModel = getSystemModelFromCoordinates(stationModel.starSystemCoordinates); const sightSeeingMissions = generateSightseeingMissions(stationModel, starSystemModel, player, Date.now()); @@ -26,10 +26,10 @@ export function generateMissionsDom(stationModel: SpaceStationModel, player: Pla const rng = getRngFromSeed(stationModel.seed); - let neighborSpaceStations: [SpaceStationModel, number][] = []; + let neighborSpaceStations: [OrbitalFacilityModel, number][] = []; neighborSystems.forEach(([coordinates, position, distance], index) => { const systemModel = getSystemModelFromCoordinates(coordinates); - const spaceStations = StarSystemModelUtils.GetSpaceStations(systemModel).map<[SpaceStationModel, number]>((stationModel) => { + const spaceStations = StarSystemModelUtils.GetSpaceStations(systemModel).map<[OrbitalFacilityModel, number]>((stationModel) => { return [stationModel, distance]; }); neighborSpaceStations = neighborSpaceStations.concat(spaceStations); diff --git a/src/ts/ui/targetCursorLayer.ts b/src/ts/ui/targetCursorLayer.ts index 09fdef1b..69de148a 100644 --- a/src/ts/ui/targetCursorLayer.ts +++ b/src/ts/ui/targetCursorLayer.ts @@ -16,12 +16,13 @@ // along with this program. If not, see . import { IDisposable } from "@babylonjs/core/scene"; -import { ObjectTargetCursor, ObjectTargetCursorType } from "./objectTargetCursor"; +import { ObjectTargetCursor } from "./objectTargetCursor"; import { Vector3 } from "@babylonjs/core/Maths/math.vector"; import { Transformable } from "../architecture/transformable"; import { HasBoundingSphere } from "../architecture/hasBoundingSphere"; import { TypedObject } from "../architecture/typedObject"; import { Camera } from "@babylonjs/core/Cameras/camera"; +import { Targetable } from "../architecture/targetable"; export class TargetCursorLayer implements IDisposable { private targetCursors: ObjectTargetCursor[] = []; @@ -47,8 +48,8 @@ export class TargetCursorLayer implements IDisposable { return this.layerRoot.style.display === "block"; } - public addObject(object: Transformable & HasBoundingSphere & TypedObject, iconType: ObjectTargetCursorType, minDistance: number, maxDistance: number) { - const overlay = new ObjectTargetCursor(object, iconType, minDistance, maxDistance); + public addObject(object: Targetable) { + const overlay = new ObjectTargetCursor(object); this.targetCursors.push(overlay); this.layerRoot.appendChild(overlay.htmlRoot); } diff --git a/src/ts/utils/algebra.ts b/src/ts/utils/algebra.ts index 91316e62..24b2b71f 100644 --- a/src/ts/utils/algebra.ts +++ b/src/ts/utils/algebra.ts @@ -41,4 +41,4 @@ export function flattenColor3Array(color3Array: Color3[]): number[] { result.push(color3.r, color3.g, color3.b); } return result; -} \ No newline at end of file +} diff --git a/src/ts/utils/coordinates/orbitalObjectId.ts b/src/ts/utils/coordinates/orbitalObjectId.ts index c0d0fa4a..d72eb860 100644 --- a/src/ts/utils/coordinates/orbitalObjectId.ts +++ b/src/ts/utils/coordinates/orbitalObjectId.ts @@ -4,10 +4,10 @@ import { StellarObject } from "../../architecture/stellarObject"; import { SystemObjectId, UniverseObjectId, SystemObjectType } from "./universeCoordinates"; import { PlanetaryMassObject } from "../../architecture/planetaryMassObject"; import { SpaceStation } from "../../spacestation/spaceStation"; -import { SpaceStationModel } from "../../spacestation/spacestationModel"; import { getSystemModelFromCoordinates } from "../../starSystem/modelFromCoordinates"; import { StarSystemModelUtils } from "../../starSystem/starSystemModel"; import { CelestialBody } from "../../architecture/celestialBody"; +import { OrbitalFacilityModel } from "../../spacestation/orbitalFacility"; /** * Get the object ID of the given orbital object within the star system. @@ -23,7 +23,7 @@ export function getSystemObjectId(orbitalObject: OrbitalObject, starSystem: Star objectType = SystemObjectType.PLANETARY_MASS_OBJECT; } else if ((objectIndex = starSystem.getAnomalies().indexOf(orbitalObject as CelestialBody)) !== -1) { objectType = SystemObjectType.ANOMALY; - } else if ((objectIndex = starSystem.getSpaceStations().indexOf(orbitalObject as SpaceStation)) !== -1) { + } else if ((objectIndex = starSystem.getOrbitalFacilities().indexOf(orbitalObject as SpaceStation)) !== -1) { objectType = SystemObjectType.SPACE_STATION; } else throw new Error("Nearest orbital object not found among any of the universal orbital object types"); @@ -58,7 +58,7 @@ export function getObjectBySystemId(systemObjectId: SystemObjectId, starSystem: orbitalObject = starSystem.getAnomalies().at(systemObjectId.objectIndex); break; case SystemObjectType.SPACE_STATION: - orbitalObject = starSystem.getSpaceStations().at(systemObjectId.objectIndex); + orbitalObject = starSystem.getOrbitalFacilities().at(systemObjectId.objectIndex); break; default: throw new Error(`Unknown universe object type: ${systemObjectId.objectType}`); @@ -88,7 +88,7 @@ export function getObjectModelByUniverseId(universeObjectId: UniverseObjectId): } } -export function getUniverseIdForSpaceStationModel(spaceStationModel: SpaceStationModel): UniverseObjectId { +export function getUniverseIdForSpaceStationModel(spaceStationModel: OrbitalFacilityModel): UniverseObjectId { const systemModel = getSystemModelFromCoordinates(spaceStationModel.starSystemCoordinates); const spaceStationModels = StarSystemModelUtils.GetSpaceStations(systemModel); diff --git a/src/ts/utils/generationSteps.ts b/src/ts/utils/generationSteps.ts index 60a9882b..4f64ca2b 100644 --- a/src/ts/utils/generationSteps.ts +++ b/src/ts/utils/generationSteps.ts @@ -31,5 +31,5 @@ export const enum GenerationSteps { PRESSURE = 1800, WATER_AMOUNT = 1700, - TERRAIN = 1500, + TERRAIN = 1500 } diff --git a/src/ts/utils/havok.ts b/src/ts/utils/havok.ts index 75211c59..0a1d1301 100644 --- a/src/ts/utils/havok.ts +++ b/src/ts/utils/havok.ts @@ -72,4 +72,4 @@ export function createEnvironmentAggregate(mesh: AbstractMesh, physicsShapeType: aggregate.shape.filterCollideMask = CollisionMask.DYNAMIC_OBJECTS; return aggregate; -} \ No newline at end of file +} diff --git a/src/ts/utils/managesLandingPads.ts b/src/ts/utils/managesLandingPads.ts index 58513f50..419320bf 100644 --- a/src/ts/utils/managesLandingPads.ts +++ b/src/ts/utils/managesLandingPads.ts @@ -6,4 +6,6 @@ export type LandingRequest = { export interface ManagesLandingPads { handleLandingRequest(request: LandingRequest): LandingPad | null; + + getLandingPads(): LandingPad[]; } diff --git a/src/ts/utils/math.ts b/src/ts/utils/math.ts index 78c277d0..531da6a4 100644 --- a/src/ts/utils/math.ts +++ b/src/ts/utils/math.ts @@ -33,4 +33,12 @@ export function moveTowards(x: number, target: number, rate: number): number { export function smoothstep(edge0: number, edge1: number, x: number): number { const t = Math.min(1, Math.max(0, (x - edge0) / (edge1 - edge0))); return t * t * (3 - 2 * t); +} + +export function triangleWave(x: number) { + return 2 * Math.abs(x - Math.floor(x + 0.5)); +} + +export function remap(value: number, from1: number, to1: number, from2: number, to2: number) { + return from2 + (value - from1) * (to2 - from2) / (to1 - from1); } \ No newline at end of file diff --git a/src/ts/utils/physics.ts b/src/ts/utils/physics.ts index a67d0307..ac16eb2c 100644 --- a/src/ts/utils/physics.ts +++ b/src/ts/utils/physics.ts @@ -133,4 +133,38 @@ export function hasLiquidWater(pressure: number, minTemperature: number, maxTemp */ export function getSchwarzschildRadius(mass: number): number { return (2 * Settings.G * mass) / (Settings.C * Settings.C); -} \ No newline at end of file +} + +/** + * Returns the orbital period of an object in seconds given its radius and the mass of the parent object + * @param period The period of the orbit in seconds + * @param mass The mass of the parent object in kilograms + */ +export function getOrbitRadiusFromPeriod(period: number, mass: number) { + const omega = (2 * Math.PI) / period; + return Math.cbrt((Settings.G * mass) / (omega * omega)); +} + +/** + * Returns the apparent gravity on a space tether given its period, mass and distance + * @param period The rotation period of the tether in seconds (typically the same as the parent object for a classic space elevator) + * @param mass The mass of the parent object in kilograms + * @param distance The distance to the center of the parent object in meters + * @see https://en.wikipedia.org/wiki/Space_elevator#Apparent_gravitational_field + */ +export function getApparentGravityOnSpaceTether(period: number, mass: number, distance: number) { + const omega = (2 * Math.PI) / period; + return (-Settings.G * mass) / (distance * distance) + distance * omega * omega; +} + +/** + * Returns the necessary length of a tether to simulate a given gravity at the end of the tether of a space elevator + * This is an approximation that only works when GM/r² << w²r (which tends to be the case for space elevators) + * @param period The rotation period of the tether in seconds (typically the same as the parent object for a classic space elevator) + * @param mass The mass of the parent object in kilograms + * @param gravity The gravity to simulate at the end of the tether in m/s² + */ +export function getTetherLengthForGravity(period: number, mass: number, gravity: number) { + const omega = (2 * Math.PI) / period; + return gravity / (omega * omega); +} diff --git a/src/ts/utils/strings/orbitalObjectTypeToDisplay.ts b/src/ts/utils/strings/orbitalObjectTypeToDisplay.ts index 3a645f1a..3087680a 100644 --- a/src/ts/utils/strings/orbitalObjectTypeToDisplay.ts +++ b/src/ts/utils/strings/orbitalObjectTypeToDisplay.ts @@ -33,6 +33,8 @@ export function orbitalObjectTypeToDisplay(model: OrbitalObjectModel): string { return i18n.t("objectTypes:telluricMoon"); case OrbitalObjectType.SPACE_STATION: return i18n.t("objectTypes:spaceStation"); + case OrbitalObjectType.SPACE_ELEVATOR: + return i18n.t("objectTypes:spaceElevator"); case OrbitalObjectType.STAR: return i18n.t("objectTypes:star", { stellarType: getStellarTypeFromTemperature((model as StellarObjectModel).physics.blackBodyTemperature) }); case OrbitalObjectType.NEUTRON_STAR: diff --git a/src/ts/utils/strings/spaceStationNameGenerator.ts b/src/ts/utils/strings/spaceStationNameGenerator.ts index 8e9e42d8..2d95eaef 100644 --- a/src/ts/utils/strings/spaceStationNameGenerator.ts +++ b/src/ts/utils/strings/spaceStationNameGenerator.ts @@ -130,6 +130,24 @@ export const SpaceStationAdjectives: string[] = [ "Zenith" ]; +export const SpaceElevatorAdjectives: string[] = [ + "Ascension", + "Ascending", + "Bridge", + "Climb", + "Climbing", + "Elevated", + "Elevation", + "Elevator", + "Ladder", + "Lift", + "Lifting", + "Rising", + "Skyward", + "Soaring", + "Upward" +]; + /** * Generate a space station name using a noise based rng and a given sample index * @param rng The noise based rng with a range of [0, 1] @@ -140,3 +158,9 @@ export function generateSpaceStationName(rng: (index: number) => number, sampleI const name = SpaceStationNames[Math.floor(rng(sampleIndex + 1) * SpaceStationNames.length)]; return `${name}${uniformRandBool(0.5, rng, sampleIndex + 2) ? "'s" : ""} ${adjective}`; } + +export function generateSpaceElevatorName(rng: (index: number) => number, sampleIndex: number) { + const adjective = SpaceElevatorAdjectives[Math.floor(rng(sampleIndex) * SpaceElevatorAdjectives.length)]; + const name = SpaceStationNames[Math.floor(rng(sampleIndex + 1) * SpaceStationNames.length)]; + return `${name}${uniformRandBool(0.5, rng, sampleIndex + 2) ? "'s" : ""} ${adjective}`; +} diff --git a/src/ts/utils/systemTarget.ts b/src/ts/utils/systemTarget.ts index 3d9651bd..a206a8d8 100644 --- a/src/ts/utils/systemTarget.ts +++ b/src/ts/utils/systemTarget.ts @@ -1,18 +1,22 @@ import { Scene } from "@babylonjs/core/scene"; import { TransformNode } from "@babylonjs/core/Meshes"; -import { Transformable } from "../architecture/transformable"; -import { HasBoundingSphere } from "../architecture/hasBoundingSphere"; -import { TypedObject } from "../architecture/typedObject"; import i18n from "../i18n"; import { StarSystemCoordinates } from "./coordinates/universeCoordinates"; import { getSystemModelFromCoordinates } from "../starSystem/modelFromCoordinates"; +import { ObjectTargetCursorType, Targetable } from "../architecture/targetable"; -export class SystemTarget implements Transformable, HasBoundingSphere, TypedObject { +export class SystemTarget implements Targetable { readonly name: string; private readonly transform: TransformNode; readonly systemCoordinates: StarSystemCoordinates; + readonly targetInfo = { + type: ObjectTargetCursorType.STAR_SYSTEM, + minDistance: 0, + maxDistance: 0 + }; + constructor(systemCoordinates: StarSystemCoordinates, scene: Scene) { const systemModel = getSystemModelFromCoordinates(systemCoordinates); this.name = systemModel.name;