Check in solar system source, kill broken models
|
@ -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.
|
||||
|
|
|
@ -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"
|
||||
}
|
||||
}
|
После Ширина: | Высота: | Размер: 230 KiB |
До Ширина: | Высота: | Размер: 157 KiB После Ширина: | Высота: | Размер: 157 KiB |
До Ширина: | Высота: | Размер: 213 KiB После Ширина: | Высота: | Размер: 213 KiB |
До Ширина: | Высота: | Размер: 208 KiB После Ширина: | Высота: | Размер: 208 KiB |
До Ширина: | Высота: | Размер: 251 KiB После Ширина: | Высота: | Размер: 251 KiB |
До Ширина: | Высота: | Размер: 77 KiB После Ширина: | Высота: | Размер: 77 KiB |
После Ширина: | Высота: | Размер: 6.7 KiB |
После Ширина: | Высота: | Размер: 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"
|
||||
}
|
||||
|
|