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;