Check in solar system source, kill broken models

This commit is contained in:
Steven Vergenz 2018-12-04 09:57:00 -08:00
Родитель e7a295fa4d
Коммит 8d0939df78
35 изменённых файлов: 1275 добавлений и 3 удалений

4
.gitignore поставляемый
Просмотреть файл

@ -60,4 +60,6 @@ typings/
# next.js build output
.next
built/
built/
*.blend1

Просмотреть файл

@ -1,3 +1,17 @@
## Editing
* Open this folder in VSCode.
## Building
* From inside VSCode: `Shift+Ctrl+B`
* From command line: `npm run build`
## Running
* From inside VSCode: `F5`
* From command line: `npm start`
## Attribution
Planet textures are from https://www.solarsystemscope.com/textures/, and licensed under a Creative Commons Attribution 4.0 International license.

704
packages/solar-system/package-lock.json сгенерированный Normal file
Просмотреть файл

@ -0,0 +1,704 @@
{
"name": "solar-system",
"version": "0.1.0",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
"@types/bunyan": {
"version": "1.8.5",
"resolved": "https://registry.npmjs.org/@types/bunyan/-/bunyan-1.8.5.tgz",
"integrity": "sha512-7n8ANtxh2c5A/NfCuv8cVtWcgSLdq76MQbtmbInpzXuPw4TSAReUJ+MGHK4m67I4zI3ynCJoABfaeHYJaYSeRg==",
"dev": true,
"requires": {
"@types/node": "*"
}
},
"@types/node": {
"version": "10.12.11",
"resolved": "https://registry.npmjs.org/@types/node/-/node-10.12.11.tgz",
"integrity": "sha512-3iIOhNiPGTdcUNVCv9e5G7GotfvJJe2pc9w2UgDXlUwnxSZ3RgcUocIU+xYm+rTU54jIKih998QE4dMOyMN1NQ==",
"dev": true
},
"@types/restify": {
"version": "7.2.6",
"resolved": "https://registry.npmjs.org/@types/restify/-/restify-7.2.6.tgz",
"integrity": "sha512-gg6yKn5nQSGH+b/T6Y7CbFbkm8+rTsGEYzrUjzZk+suRLZpnMhBjoTHh/AcD3yh/lDrOq31K9gkBo25IbI2GaQ==",
"dev": true,
"requires": {
"@types/bunyan": "*",
"@types/node": "*",
"@types/spdy": "*"
}
},
"@types/spdy": {
"version": "3.4.4",
"resolved": "https://registry.npmjs.org/@types/spdy/-/spdy-3.4.4.tgz",
"integrity": "sha512-N9LBlbVRRYq6HgYpPkqQc3a9HJ/iEtVZToW6xlTtJiMhmRJ7jJdV7TaZQJw/Ve/1ePUsQiCTDc4JMuzzag94GA==",
"dev": true,
"requires": {
"@types/node": "*"
}
},
"asn1": {
"version": "0.2.4",
"resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz",
"integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==",
"requires": {
"safer-buffer": "~2.1.0"
}
},
"assert-plus": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
"integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU="
},
"async-limiter": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz",
"integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg=="
},
"balanced-match": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
"integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
"optional": true
},
"bcrypt-pbkdf": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
"integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=",
"requires": {
"tweetnacl": "^0.14.3"
}
},
"brace-expansion": {
"version": "1.1.11",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
"integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
"optional": true,
"requires": {
"balanced-match": "^1.0.0",
"concat-map": "0.0.1"
}
},
"bunyan": {
"version": "1.8.12",
"resolved": "https://registry.npmjs.org/bunyan/-/bunyan-1.8.12.tgz",
"integrity": "sha1-8VDw9nSKvdcq6uhPBEA74u8RN5c=",
"requires": {
"dtrace-provider": "~0.8",
"moment": "^2.10.6",
"mv": "~2",
"safe-json-stringify": "~1"
}
},
"concat-map": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
"integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
"optional": true
},
"core-util-is": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
"integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
},
"csv": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/csv/-/csv-1.2.1.tgz",
"integrity": "sha1-UjHt/BxxUlEuxFeBB2p6l/9SXAw=",
"requires": {
"csv-generate": "^1.1.2",
"csv-parse": "^1.3.3",
"csv-stringify": "^1.1.2",
"stream-transform": "^0.2.2"
}
},
"csv-generate": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/csv-generate/-/csv-generate-1.1.2.tgz",
"integrity": "sha1-7GsA7a7W5ZrZwgWC9MNk4osUYkA="
},
"csv-parse": {
"version": "1.3.3",
"resolved": "https://registry.npmjs.org/csv-parse/-/csv-parse-1.3.3.tgz",
"integrity": "sha1-0c/YdDwvhJoKuy/VRNtWaV0ZpJA="
},
"csv-stringify": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/csv-stringify/-/csv-stringify-1.1.2.tgz",
"integrity": "sha1-d6QVJlgbzjOA8SsA18W7rHDIK1g=",
"requires": {
"lodash.get": "~4.4.2"
}
},
"dashdash": {
"version": "1.14.1",
"resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
"integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
"requires": {
"assert-plus": "^1.0.0"
}
},
"debug": {
"version": "2.6.9",
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
"requires": {
"ms": "2.0.0"
}
},
"decode-uri-component": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz",
"integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU="
},
"deepmerge": {
"version": "2.2.1",
"resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-2.2.1.tgz",
"integrity": "sha512-R9hc1Xa/NOBi9WRVUWg19rl1UB7Tt4kuPd+thNJgFZoxXsTz7ncaPaeIm+40oSGuP33DfMb4sZt1QIGiJzC4EA=="
},
"detect-node": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.4.tgz",
"integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw=="
},
"dtrace-provider": {
"version": "0.8.7",
"resolved": "https://registry.npmjs.org/dtrace-provider/-/dtrace-provider-0.8.7.tgz",
"integrity": "sha1-3JObTT4GIM/gwc2APQ0tftBP/QQ=",
"optional": true,
"requires": {
"nan": "^2.10.0"
}
},
"ecc-jsbn": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
"integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=",
"requires": {
"jsbn": "~0.1.0",
"safer-buffer": "^2.1.0"
}
},
"escape-regexp-component": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/escape-regexp-component/-/escape-regexp-component-1.0.2.tgz",
"integrity": "sha1-nGO20LJf8qiMOtvRjFthrMO5+qI="
},
"ewma": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/ewma/-/ewma-2.0.1.tgz",
"integrity": "sha512-MYYK17A76cuuyvkR7MnqLW4iFYPEi5Isl2qb8rXiWpLiwFS9dxW/rncuNnjjgSENuVqZQkIuR4+DChVL4g1lnw==",
"requires": {
"assert-plus": "^1.0.0"
}
},
"extsprintf": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
"integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU="
},
"fast-decode-uri-component": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/fast-decode-uri-component/-/fast-decode-uri-component-1.0.0.tgz",
"integrity": "sha512-WQSYVKn6tDW/3htASeUkrx5LcnuTENQIZQPCVlwdnvIJ7bYtSpoJYq38MgUJnx1CQIR1gjZ8HJxAEcN4gqugBg=="
},
"find-my-way": {
"version": "1.15.4",
"resolved": "https://registry.npmjs.org/find-my-way/-/find-my-way-1.15.4.tgz",
"integrity": "sha512-3XPCOhoGMPK6ELgUHd5BuNxsL+fTNM0EIrTlcLwjT2uZq22UHL4IQt5N54PIQblk164ioZATRov9mcuA4RB3eA==",
"requires": {
"fast-decode-uri-component": "^1.0.0",
"safe-regex": "^1.1.0",
"semver-store": "^0.3.0"
}
},
"formidable": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.1.tgz",
"integrity": "sha512-Fs9VRguL0gqGHkXS5GQiMCr1VhZBxz0JnJs4JmMp/2jL18Fmbzvv7vOFRU+U8TBkHEE/CX1qDXzJplVULgsLeg=="
},
"getpass": {
"version": "0.1.7",
"resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
"integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
"requires": {
"assert-plus": "^1.0.0"
}
},
"glob": {
"version": "6.0.4",
"resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz",
"integrity": "sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI=",
"optional": true,
"requires": {
"inflight": "^1.0.4",
"inherits": "2",
"minimatch": "2 || 3",
"once": "^1.3.0",
"path-is-absolute": "^1.0.0"
}
},
"handle-thing": {
"version": "1.2.5",
"resolved": "http://registry.npmjs.org/handle-thing/-/handle-thing-1.2.5.tgz",
"integrity": "sha1-/Xqtcmvxpf0W38KbL3pmAdJxOcQ="
},
"hpack.js": {
"version": "2.1.6",
"resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz",
"integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=",
"requires": {
"inherits": "^2.0.1",
"obuf": "^1.0.0",
"readable-stream": "^2.0.1",
"wbuf": "^1.1.0"
}
},
"http-deceiver": {
"version": "1.2.7",
"resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz",
"integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc="
},
"http-signature": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
"integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
"requires": {
"assert-plus": "^1.0.0",
"jsprim": "^1.2.2",
"sshpk": "^1.7.0"
}
},
"inflight": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
"integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
"optional": true,
"requires": {
"once": "^1.3.0",
"wrappy": "1"
}
},
"inherits": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
"integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
},
"isarray": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
"integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
},
"jsbn": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
"integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM="
},
"json-schema": {
"version": "0.2.3",
"resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz",
"integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM="
},
"jsprim": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz",
"integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=",
"requires": {
"assert-plus": "1.0.0",
"extsprintf": "1.3.0",
"json-schema": "0.2.3",
"verror": "1.10.0"
}
},
"lodash": {
"version": "4.17.11",
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz",
"integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg=="
},
"lodash.get": {
"version": "4.4.2",
"resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz",
"integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk="
},
"lru-cache": {
"version": "4.1.5",
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz",
"integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==",
"requires": {
"pseudomap": "^1.0.2",
"yallist": "^2.1.2"
}
},
"mime": {
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
"integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="
},
"minimalistic-assert": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz",
"integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A=="
},
"minimatch": {
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
"integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
"optional": true,
"requires": {
"brace-expansion": "^1.1.7"
}
},
"minimist": {
"version": "0.0.8",
"resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
"integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
"optional": true
},
"mkdirp": {
"version": "0.5.1",
"resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
"integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
"optional": true,
"requires": {
"minimist": "0.0.8"
}
},
"moment": {
"version": "2.22.2",
"resolved": "https://registry.npmjs.org/moment/-/moment-2.22.2.tgz",
"integrity": "sha1-PCV/mDn8DpP/UxSWMiOeuQeD/2Y=",
"optional": true
},
"ms": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
"integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
},
"mv": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/mv/-/mv-2.1.1.tgz",
"integrity": "sha1-rmzg1vbV4KT32JN5jQPB6pVZtqI=",
"optional": true,
"requires": {
"mkdirp": "~0.5.1",
"ncp": "~2.0.0",
"rimraf": "~2.4.0"
}
},
"nan": {
"version": "2.11.1",
"resolved": "https://registry.npmjs.org/nan/-/nan-2.11.1.tgz",
"integrity": "sha512-iji6k87OSXa0CcrLl9z+ZiYSuR2o+c0bGuNmXdrhTQTakxytAFsC56SArGYoiHlJlFoHSnvmhpceZJaXkVuOtA==",
"optional": true
},
"ncp": {
"version": "2.0.0",
"resolved": "http://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz",
"integrity": "sha1-GVoh1sRuNh0vsSgbo4uR6d9727M=",
"optional": true
},
"negotiator": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz",
"integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk="
},
"obuf": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz",
"integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg=="
},
"once": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
"integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
"requires": {
"wrappy": "1"
}
},
"path-is-absolute": {
"version": "1.0.1",
"resolved": "http://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
"integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
"optional": true
},
"pidusage": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/pidusage/-/pidusage-1.2.0.tgz",
"integrity": "sha512-OGo+iSOk44HRJ8q15AyG570UYxcm5u+R99DI8Khu8P3tKGkVu5EZX4ywHglWSTMNNXQ274oeGpYrvFEhDIFGPg=="
},
"process-nextick-args": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz",
"integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw=="
},
"pseudomap": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
"integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM="
},
"qs": {
"version": "6.6.0",
"resolved": "https://registry.npmjs.org/qs/-/qs-6.6.0.tgz",
"integrity": "sha512-KIJqT9jQJDQx5h5uAVPimw6yVg2SekOKu959OCtktD3FjzbpvaPr8i4zzg07DOMz+igA4W/aNM7OV8H37pFYfA=="
},
"query-string": {
"version": "6.2.0",
"resolved": "https://registry.npmjs.org/query-string/-/query-string-6.2.0.tgz",
"integrity": "sha512-5wupExkIt8RYL4h/FE+WTg3JHk62e6fFPWtAZA9J5IWK1PfTfKkMS93HBUHcFpeYi9KsY5pFbh+ldvEyaz5MyA==",
"requires": {
"decode-uri-component": "^0.2.0",
"strict-uri-encode": "^2.0.0"
}
},
"readable-stream": {
"version": "2.3.6",
"resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
"integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
"requires": {
"core-util-is": "~1.0.0",
"inherits": "~2.0.3",
"isarray": "~1.0.0",
"process-nextick-args": "~2.0.0",
"safe-buffer": "~5.1.1",
"string_decoder": "~1.1.1",
"util-deprecate": "~1.0.1"
}
},
"restify": {
"version": "7.2.3",
"resolved": "https://registry.npmjs.org/restify/-/restify-7.2.3.tgz",
"integrity": "sha512-ywwBQSuGewhUJohUykm4w/c1Qokcn67F+9iYHrIVWfN3iXRXFy0cjaB6pKinuw2qh5rYmlYwANs4bJf/3mF9yQ==",
"requires": {
"assert-plus": "^1.0.0",
"bunyan": "^1.8.12",
"csv": "^1.1.1",
"dtrace-provider": "^0.8.1",
"escape-regexp-component": "^1.0.2",
"ewma": "^2.0.1",
"find-my-way": "^1.13.0",
"formidable": "^1.2.1",
"http-signature": "^1.2.0",
"lodash": "^4.17.10",
"lru-cache": "^4.1.3",
"mime": "^1.5.0",
"negotiator": "^0.6.1",
"once": "^1.4.0",
"pidusage": "^1.2.0",
"qs": "^6.5.2",
"restify-errors": "^5.0.0",
"semver": "^5.4.1",
"spdy": "^3.4.7",
"uuid": "^3.1.0",
"vasync": "^1.6.4",
"verror": "^1.10.0"
}
},
"restify-errors": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/restify-errors/-/restify-errors-5.0.0.tgz",
"integrity": "sha512-+vby9Kxf7qlzvbZSTIEGkIixkeHG+pVCl34dk6eKnL+ua4pCezpdLT/1/eabzPZb65ADrgoc04jeWrrF1E1pvQ==",
"requires": {
"assert-plus": "^1.0.0",
"lodash": "^4.2.1",
"safe-json-stringify": "^1.0.3",
"verror": "^1.8.1"
}
},
"ret": {
"version": "0.1.15",
"resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz",
"integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg=="
},
"rimraf": {
"version": "2.4.5",
"resolved": "http://registry.npmjs.org/rimraf/-/rimraf-2.4.5.tgz",
"integrity": "sha1-7nEM5dk6j9uFb7Xqj/Di11k0sto=",
"optional": true,
"requires": {
"glob": "^6.0.1"
}
},
"safe-buffer": {
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
"integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
},
"safe-json-stringify": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/safe-json-stringify/-/safe-json-stringify-1.2.0.tgz",
"integrity": "sha512-gH8eh2nZudPQO6TytOvbxnuhYBOvDBBLW52tz5q6X58lJcd/tkmqFR+5Z9adS8aJtURSXWThWy/xJtJwixErvg==",
"optional": true
},
"safe-regex": {
"version": "1.1.0",
"resolved": "http://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz",
"integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=",
"requires": {
"ret": "~0.1.10"
}
},
"safer-buffer": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
},
"select-hose": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz",
"integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo="
},
"semver": {
"version": "5.6.0",
"resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz",
"integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg=="
},
"semver-store": {
"version": "0.3.0",
"resolved": "https://registry.npmjs.org/semver-store/-/semver-store-0.3.0.tgz",
"integrity": "sha512-TcZvGMMy9vodEFSse30lWinkj+JgOBvPn8wRItpQRSayhc+4ssDs335uklkfvQQJgL/WvmHLVj4Ycv2s7QCQMg=="
},
"spdy": {
"version": "3.4.7",
"resolved": "https://registry.npmjs.org/spdy/-/spdy-3.4.7.tgz",
"integrity": "sha1-Qv9B7OXMD5mjpsKKq7c/XDsDrLw=",
"requires": {
"debug": "^2.6.8",
"handle-thing": "^1.2.5",
"http-deceiver": "^1.2.7",
"safe-buffer": "^5.0.1",
"select-hose": "^2.0.0",
"spdy-transport": "^2.0.18"
}
},
"spdy-transport": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-2.1.1.tgz",
"integrity": "sha512-q7D8c148escoB3Z7ySCASadkegMmUZW8Wb/Q1u0/XBgDKMO880rLQDj8Twiew/tYi7ghemKUi/whSYOwE17f5Q==",
"requires": {
"debug": "^2.6.8",
"detect-node": "^2.0.3",
"hpack.js": "^2.1.6",
"obuf": "^1.1.1",
"readable-stream": "^2.2.9",
"safe-buffer": "^5.0.1",
"wbuf": "^1.7.2"
}
},
"sshpk": {
"version": "1.15.2",
"resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.15.2.tgz",
"integrity": "sha512-Ra/OXQtuh0/enyl4ETZAfTaeksa6BXks5ZcjpSUNrjBr0DvrJKX+1fsKDPpT9TBXgHAFsa4510aNVgI8g/+SzA==",
"requires": {
"asn1": "~0.2.3",
"assert-plus": "^1.0.0",
"bcrypt-pbkdf": "^1.0.0",
"dashdash": "^1.12.0",
"ecc-jsbn": "~0.1.1",
"getpass": "^0.1.1",
"jsbn": "~0.1.0",
"safer-buffer": "^2.0.2",
"tweetnacl": "~0.14.0"
}
},
"stream-transform": {
"version": "0.2.2",
"resolved": "https://registry.npmjs.org/stream-transform/-/stream-transform-0.2.2.tgz",
"integrity": "sha1-dYZ0h/SVKPi/HYJJllh1PQLfeDg="
},
"strict-uri-encode": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz",
"integrity": "sha1-ucczDHBChi9rFC3CdLvMWGbONUY="
},
"string_decoder": {
"version": "1.1.1",
"resolved": "http://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
"integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
"requires": {
"safe-buffer": "~5.1.0"
}
},
"tweetnacl": {
"version": "0.14.5",
"resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
"integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q="
},
"typescript": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-3.0.3.tgz",
"integrity": "sha512-kk80vLW9iGtjMnIv11qyxLqZm20UklzuR2tL0QAnDIygIUIemcZMxlMWudl9OOt76H3ntVzcTiddQ1/pAAJMYg==",
"dev": true
},
"util-deprecate": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
"integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
},
"uuid": {
"version": "3.3.2",
"resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz",
"integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA=="
},
"vasync": {
"version": "1.6.4",
"resolved": "https://registry.npmjs.org/vasync/-/vasync-1.6.4.tgz",
"integrity": "sha1-3+k2Fq0OeugBszKp2Iv8XNyOHR8=",
"requires": {
"verror": "1.6.0"
},
"dependencies": {
"extsprintf": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.2.0.tgz",
"integrity": "sha1-WtlGwi9bMrp/jNdCZxHG6KP8JSk="
},
"verror": {
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/verror/-/verror-1.6.0.tgz",
"integrity": "sha1-fROyex+swuLakEBetepuW90lLqU=",
"requires": {
"extsprintf": "1.2.0"
}
}
}
},
"verror": {
"version": "1.10.0",
"resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
"integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
"requires": {
"assert-plus": "^1.0.0",
"core-util-is": "1.0.2",
"extsprintf": "^1.2.0"
}
},
"wbuf": {
"version": "1.7.3",
"resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz",
"integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==",
"requires": {
"minimalistic-assert": "^1.0.0"
}
},
"wrappy": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
"integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
},
"ws": {
"version": "6.1.2",
"resolved": "https://registry.npmjs.org/ws/-/ws-6.1.2.tgz",
"integrity": "sha512-rfUqzvz0WxmSXtJpPMX2EeASXabOrSMk1ruMOV3JBTBjo4ac2lDjGGsbQSyxj8Odhw5fBib8ZKEjDNvgouNKYw==",
"requires": {
"async-limiter": "~1.0.0"
}
},
"yallist": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
"integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI="
}
}
}

Просмотреть файл

@ -0,0 +1,28 @@
{
"name": "solar-system",
"version": "0.1.0",
"private": true,
"description": "",
"main": "built/app.js",
"engines": {
"node": ">=8.12.0",
"npm": ">=6.4.1"
},
"scripts": {
"clean": "tsc --build --clean",
"build": "tsc --build",
"start": "node .",
"debug": "node --nolazy --inspect-brk=9229 ."
},
"author": "",
"license": "ISC",
"devDependencies": {
"@types/node": "^10.3.1",
"@types/restify": "^7.2.0",
"typescript": "3.0.3"
},
"dependencies": {
"@microsoft/mixed-reality-extension-sdk": "^0.1.0",
"restify": "^7.2.0"
}
}

Двоичные данные
packages/solar-system/public/assets/earth.jpg Normal file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 230 KiB

Просмотреть файл

До

Ширина:  |  Высота:  |  Размер: 157 KiB

После

Ширина:  |  Высота:  |  Размер: 157 KiB

Просмотреть файл

До

Ширина:  |  Высота:  |  Размер: 213 KiB

После

Ширина:  |  Высота:  |  Размер: 213 KiB

Просмотреть файл

До

Ширина:  |  Высота:  |  Размер: 208 KiB

После

Ширина:  |  Высота:  |  Размер: 208 KiB

Просмотреть файл

До

Ширина:  |  Высота:  |  Размер: 251 KiB

После

Ширина:  |  Высота:  |  Размер: 251 KiB

Просмотреть файл

До

Ширина:  |  Высота:  |  Размер: 77 KiB

После

Ширина:  |  Высота:  |  Размер: 77 KiB

Двоичные данные
packages/solar-system/public/assets/saturn ring.png Normal file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 6.7 KiB

Двоичные данные
packages/solar-system/public/assets/saturn.blend Normal file

Двоичный файл не отображается.

Двоичные данные
packages/solar-system/public/assets/saturn.jpg Normal file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 51 KiB

Просмотреть файл

До

Ширина:  |  Высота:  |  Размер: 266 KiB

После

Ширина:  |  Высота:  |  Размер: 266 KiB

Просмотреть файл

До

Ширина:  |  Высота:  |  Размер: 35 KiB

После

Ширина:  |  Высота:  |  Размер: 35 KiB

Просмотреть файл

До

Ширина:  |  Высота:  |  Размер: 75 KiB

После

Ширина:  |  Высота:  |  Размер: 75 KiB

Просмотреть файл

@ -0,0 +1,93 @@
{
"sol": {
"name": "sol",
"diameter": 2782032,
"distance": 0,
"obliquity": 0,
"inclination": 0,
"day": 0,
"year": 0
},
"mercury": {
"name": "mercury",
"parent": "sol",
"diameter": 4879,
"distance": 57.9,
"obliquity": 0.034,
"inclination": 7.0,
"day": 4222.6,
"year": 88.0
},
"venus": {
"name": "venus",
"parent": "sol",
"diameter": 12104,
"distance": 108.2,
"obliquity": 177.4,
"inclination": 3.4,
"day": 2802.0,
"year": 224.7,
"retrograde": true
},
"earth": {
"name": "earth",
"parent": "sol",
"diameter": 12756,
"distance": 149.6,
"obliquity": 23.4,
"inclination": 0,
"day": 24,
"year": 365.2
},
"mars": {
"name": "mars",
"parent": "sol",
"diameter": 6792,
"distance": 227.9,
"obliquity": 25.2,
"inclination": 1.9,
"day": 24.7,
"year": 687.0
},
"jupiter": {
"name": "jupiter",
"parent": "sol",
"diameter": 142984,
"distance": 778.6,
"obliquity": 3.1,
"inclination": 1.3,
"day": 9.9,
"year": 4331
},
"saturn": {
"name": "saturn",
"parent": "sol",
"diameter": 120536,
"distance": 1433.5,
"obliquity": 26.7,
"inclination": 2.5,
"day": 9.9,
"year": 10747
},
"uranus": {
"name": "uranus",
"parent": "sol",
"diameter": 51118,
"distance": 2872.5,
"obliquity": 97.8,
"inclination": 0.8,
"day": 17.2,
"year": 30589,
"retrograde": true
},
"neptune": {
"name": "neptune",
"parent": "sol",
"diameter": 49528,
"distance": 4495.1,
"obliquity": 28.3,
"inclination": 1.8,
"day": 16.1,
"year": 59800
}
}

Двоичные данные
packages/solar-system/public/earth.glb

Двоичный файл не отображается.

Двоичные данные
packages/solar-system/public/earth.jpg

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 338 KiB

Двоичные данные
packages/solar-system/public/jupiter.glb

Двоичный файл не отображается.

Двоичные данные
packages/solar-system/public/mars.glb

Двоичный файл не отображается.

Двоичные данные
packages/solar-system/public/mercury.glb

Двоичный файл не отображается.

Двоичные данные
packages/solar-system/public/moon.glb

Двоичный файл не отображается.

Двоичные данные
packages/solar-system/public/neptune.glb

Двоичный файл не отображается.

Двоичные данные
packages/solar-system/public/saturn ring.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 18 KiB

Двоичные данные
packages/solar-system/public/saturn.blend

Двоичный файл не отображается.

Двоичные данные
packages/solar-system/public/saturn.glb

Двоичный файл не отображается.

Двоичные данные
packages/solar-system/public/saturn.jpg

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 71 KiB

Двоичные данные
packages/solar-system/public/sun.glb

Двоичный файл не отображается.

Двоичные данные
packages/solar-system/public/uranus.glb

Двоичный файл не отображается.

Двоичные данные
packages/solar-system/public/venus.glb

Двоичный файл не отображается.

Просмотреть файл

@ -0,0 +1,371 @@
/*!
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License.
*/
import * as MRESDK from 'mixed-reality-extension-sdk';
import * as MRERPC from 'mixed-reality-extension-sdk/built/rpc';
import { resolve as resolvePath } from 'path';
/**
* Solar system database
*/
interface Database {
[key: string]: DatabaseRecord;
}
interface DatabaseRecord {
name: string;
parent: string;
diameter: number; // km
distance: number; // 10^6 km
day: number; // hours
year: number; // days
inclination: number; // degrees
obliquity: number; // degrees
retrograde: boolean;
}
interface CelestialBody {
inclination: MRESDK.Actor;
position: MRESDK.Actor;
obliquity0: MRESDK.Actor;
obliquity1: MRESDK.Actor;
model: MRESDK.Actor;
}
interface CelestialBodySet {
[key: string]: CelestialBody;
}
// Data source: https://nssdc.gsfc.nasa.gov/planetary/dataheet/
// ('sol' config modified for scale and dramatic effect)
// tslint:disable-next-line:no-var-requires
const database: Database = require('../public/database.json');
/**
* Solar System Application
*/
class SolarSystem {
private celestialBodies: CelestialBodySet = {};
private animationsRunning = false;
private rpc: MRERPC.ContextRPC;
private server: MRESDK.WebHost;
private context: MRESDK.Context;
private logger: MRESDK.Logger;
constructor() {
this.server = new MRESDK.WebHost({
baseDir: resolvePath(__dirname, '../public'),
baseUrl: 'http://localhost:3902/',
logger: this.logger = new MRESDK.ConsoleLogger(),
port: 3902
});
//this.logger.disable('success', 'debug');
this.server.adapter.onConnection((context) => {
this.context = context;
this.rpc = new MRERPC.ContextRPC(this.context);
this.rpc.on('button-up', (buttonName: string, testBool: boolean) => {
this.context.logger.log('debug',
`The ${buttonName} button was pressed with a test boolean value of ${testBool}`);
});
this.context.onUserJoined(user => this.userJoined(user));
this.context.onUserLeft(user => this.userLeft(user));
this.context.onStarted(() => this.started());
this.context.onStopped(() => this.stopped());
});
}
private started = async () => {
this.logger.log('info', `session started ${this.context.sessionId}`);
await this.createSolarSystem();
const sunEntity = this.celestialBodies.sol;
if (sunEntity && sunEntity.model) {
const sun = sunEntity.model;
const sunPrimitives = sun.findChildrenByName('Primitive', true);
sunPrimitives.forEach((prim) => {
const buttonBehavior = prim.setBehavior(MRESDK.ButtonBehavior);
buttonBehavior.onClick('pressed', (userId: string) => {
if (this.animationsRunning) {
this.pauseAnimations();
this.animationsRunning = false;
} else {
this.resumeAnimations();
this.animationsRunning = true;
}
});
buttonBehavior.onHover('enter', (userId: string) => {
this.context.logger.log('debug', `Hover entered on ${sunEntity.model.name}.`);
});
buttonBehavior.onHover('exit', (userId: string) => {
this.context.logger.log('debug', `Hover exited on ${sunEntity.model.name}.`);
});
});
}
this.resumeAnimations();
this.animationsRunning = true;
}
private stopped() {
this.logger.log('info', `session stopped ${this.context.sessionId}`);
}
private userJoined(user: MRESDK.User) {
this.logger.log('debug', `user-joined: ${user.name}, ${user.id}`);
this.rpc.send('log', { message: 'user joined', testBoolean: true });
}
private userLeft(user: MRESDK.User) {
this.logger.log('debug', `user-left: ${user.name}`);
}
private createSolarSystem(): Promise<any> {
const promises = [];
const keys = Object.keys(database);
for (const bodyName of keys) {
promises.push(this.createBody(bodyName));
}
return Promise.all(promises);
}
private resumeAnimations() {
const keys = Object.keys(database);
for (const bodyName of keys) {
const celestialBody = this.celestialBodies[bodyName];
celestialBody.model.resumeAnimation(`${bodyName}:axial`);
celestialBody.position.resumeAnimation(`${bodyName}:orbital`);
}
}
private pauseAnimations() {
const keys = Object.keys(database);
for (const bodyName of keys) {
const celestialBody = this.celestialBodies[bodyName];
celestialBody.model.pauseAnimation(`${bodyName}:axial`);
celestialBody.position.pauseAnimation(`${bodyName}:orbital`);
}
}
private createBody(bodyName: string): Promise<any> {
this.logger.log('debug', `Loading ${bodyName}`);
const facts = database[bodyName];
const distanceMultiplier = Math.pow(facts.distance, 1 / 3);
const scaleMultiplier = Math.pow(facts.diameter, 1 / 3) / 25;
const positionValue = { x: distanceMultiplier, y: 0, z: 0 };
const scaleValue = { x: scaleMultiplier, y: scaleMultiplier, z: scaleMultiplier };
const obliquityValue = MRESDK.Quaternion.RotationAxis(
MRESDK.Vector3.Forward(), facts.obliquity * MRESDK.DegreesToRadians
).toJSON();
const inclinationValue = MRESDK.Quaternion.RotationAxis(
MRESDK.Vector3.Forward(), facts.inclination * MRESDK.DegreesToRadians
).toJSON();
// Object layout for celestial body is:
// inclination -- orbital plane. centered on sol and tilted
// position -- position of center of celestial body (orbits sol)
// obliquity0 -- centered on position. hidden node to account
// for the fact that obliquity is a world-relative axis
// obliquity1 -- centered on position. tilt of obliquity axis
// model -- centered on position. the celestial body (rotates)
try {
const inclination = MRESDK.Actor.CreateEmpty(this.context, {
actor: {
name: `${bodyName}-inclination`,
transform: {
rotation: inclinationValue
}
}
});
const position = MRESDK.Actor.CreateEmpty(this.context, {
actor: {
name: `${bodyName}-position`,
parentId: inclination.value.id,
transform: {
position: positionValue
}
}
});
const obliquity0 = MRESDK.Actor.CreateEmpty(this.context, {
actor: {
name: `${bodyName}-obliquity0`,
parentId: position.value.id
}
});
const obliquity1 = MRESDK.Actor.CreateEmpty(this.context, {
actor: {
name: `${bodyName}-obliquity1`,
parentId: obliquity0.value.id,
transform: {
rotation: obliquityValue
}
}
});
const model = MRESDK.Actor.CreateFromGLTF(this.context, {
resourceUrl: `${this.server.baseUrl}/assets/${bodyName}.gltf`,
colliderType: 'sphere',
actor: {
name: `${bodyName}-body`,
parentId: obliquity1.value.id,
transform: {
scale: scaleValue
}
}
});
position.value.enableText({
contents: bodyName,
height: 0.5,
pixelsPerLine: 50,
color: MRESDK.Color3.Yellow()
});
setTimeout(() => {
position.value.text.color = MRESDK.Color3.White();
}, 5000);
this.celestialBodies[bodyName] = {
inclination: inclination.value,
position: position.value,
obliquity0: obliquity0.value,
obliquity1: obliquity1.value,
model: model.value
} as CelestialBody;
return Promise.all([
inclination,
position,
obliquity0,
obliquity1,
model,
this.createAnimations(bodyName)
]);
} catch (e) {
this.logger.log('error', "createBody failed", bodyName, e);
}
}
private createAnimations(bodyName: string): Promise<any> {
const promises: Array<Promise<any>> = [];
promises.push(this.createAxialAnimation(bodyName));
promises.push(this.createOrbitalAnimation(bodyName));
return Promise.all(promises);
}
public readonly timeFactor = 40;
public readonly axialKeyframeCount = 90;
public readonly orbitalKeyframeCount = 90;
private createAxialAnimation(bodyName: string): Promise<any> {
const facts = database[bodyName];
const celestialBody = this.celestialBodies[bodyName];
if (facts.day > 0) {
const spin = facts.retrograde ? -1 : 1;
// days = seconds (not in agreement with orbital animation)
const axisTimeInSeconds = facts.day / this.timeFactor;
const timeStep = axisTimeInSeconds / this.axialKeyframeCount;
const keyframes: MRESDK.AnimationKeyframe[] = [];
const angleStep = 360 / this.axialKeyframeCount;
const initial = celestialBody.model.transform.rotation.clone();
let value: Partial<MRESDK.ActorLike>;
for (let i = 0; i < this.axialKeyframeCount; ++i) {
const rotDelta = MRESDK.Quaternion.RotationAxis(
MRESDK.Vector3.Up(), (-angleStep * i * spin) * MRESDK.DegreesToRadians);
const rotation = initial.multiply(rotDelta).toJSON();
value = {
transform: {
rotation
}
};
keyframes.push({
time: timeStep * i,
value,
});
}
// Final frame
value = {
transform: {
rotation: celestialBody.model.transform.rotation.toJSON()
}
};
keyframes.push({
time: axisTimeInSeconds,
value,
});
// Create the animation on the actor
return celestialBody.model.createAnimation({
animationName: `${bodyName}:axial`,
keyframes,
events: [],
wrapMode: MRESDK.AnimationWrapMode.Loop
});
}
}
private createOrbitalAnimation(bodyName: string): Promise<any> {
const facts = database[bodyName];
const celestialBody = this.celestialBodies[bodyName];
if (facts.year > 0) {
// years = seconds (not in agreement with axial animation)
const orbitTimeInSeconds = facts.year / this.timeFactor;
const timeStep = orbitTimeInSeconds / this.orbitalKeyframeCount;
const angleStep = 360 / this.orbitalKeyframeCount;
const keyframes: MRESDK.AnimationKeyframe[] = [];
const initial = celestialBody.position.transform.position.clone();
let value: Partial<MRESDK.ActorLike>;
for (let i = 0; i < this.orbitalKeyframeCount; ++i) {
const rotDelta = MRESDK.Quaternion.RotationAxis(
MRESDK.Vector3.Up(), (-angleStep * i) * MRESDK.DegreesToRadians);
const position = initial.rotateByQuaternionToRef(rotDelta, new MRESDK.Vector3()).toJSON();
value = {
transform: {
position
}
};
keyframes.push({
time: timeStep * i,
value,
});
}
// Final frame
value = {
transform: {
position: celestialBody.position.transform.position.toJSON()
}
};
keyframes.push({
time: orbitTimeInSeconds,
value,
});
// Create the animation on the actor
return celestialBody.position.createAnimation({
animationName: `${bodyName}:orbital`,
keyframes,
events: [],
wrapMode: MRESDK.AnimationWrapMode.Loop
});
}
}
}
export default new SolarSystem();

Просмотреть файл

@ -0,0 +1,10 @@
{
"extends": "../tsconfig.packages.json",
"include": [
"./src"
],
"compilerOptions": {
"outDir": "./built", /* Redirect output structure to the directory. */
"rootDir": "./src" /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */
}
}

Просмотреть файл

@ -0,0 +1,50 @@
<configuration>
<system.webServer>
<webSocket enabled="false" />
<handlers>
<add name="iisnode-server" path="built/app.js" verb="*" modules="iisnode" />
</handlers>
<defaultDocument>
<files>
<add value="built/app.js" />
</files>
</defaultDocument>
<rewrite>
<rules>
<rule name="LogFile" patternSyntax="ECMAScript" stopProcessing="true">
<match url="iisnode" />
</rule>
<rule name="NodeInspector" patternSyntax="ECMAScript" stopProcessing="true">
<match url="^built/app.js\/debug[\/]?" />
</rule>
<rule name="StaticContent">
<action type="Rewrite" url="built/app.js"/>
</rule>
<rule name="DynamicContent">
<conditions>
<add input="{REQUEST_FILENAME}" matchType="IsFile" negate="True"/>
</conditions>
<action type="Rewrite" url="built/app.js"/>
</rule>
</rules>
</rewrite>
<security>
<requestFiltering>
<hiddenSegments>
<remove segment="bin"/>
</hiddenSegments>
</requestFiltering>
</security>
<httpErrors existingResponse="PassThrough" />
</system.webServer>
</configuration>

Просмотреть файл

@ -1,9 +1,9 @@
{
"files": [],
"references": [
/*{
{
"path": "./solar-system"
},*/
},
{
"path": "./hello-world"
}