Added support for .gltf/.glb files (beta)

This commit is contained in:
Lucas Dower 2023-03-21 22:56:00 +00:00
parent dd5227ad6e
commit 4144497cd5
No known key found for this signature in database
GPG Key ID: B3EE6B8499593605
16 changed files with 607 additions and 89 deletions

392
package-lock.json generated
View File

@ -9,6 +9,8 @@
"version": "0.7.4",
"license": "BSD-3-Clause",
"dependencies": {
"@loaders.gl/core": "^3.3.1",
"@loaders.gl/gltf": "^3.3.1",
"split.js": "^1.6.5"
},
"devDependencies": {
@ -590,6 +592,17 @@
"@babel/core": "^7.0.0-0"
}
},
"node_modules/@babel/runtime": {
"version": "7.21.0",
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.0.tgz",
"integrity": "sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==",
"dependencies": {
"regenerator-runtime": "^0.13.11"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/template": {
"version": "7.20.7",
"resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz",
@ -849,12 +862,6 @@
"node": ">=8"
}
},
"node_modules/@istanbuljs/load-nyc-config/node_modules/sprintf-js": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
"integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==",
"dev": true
},
"node_modules/@istanbuljs/schema": {
"version": "0.1.3",
"resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz",
@ -1181,6 +1188,103 @@
"integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==",
"dev": true
},
"node_modules/@loaders.gl/core": {
"version": "3.3.1",
"resolved": "https://registry.npmjs.org/@loaders.gl/core/-/core-3.3.1.tgz",
"integrity": "sha512-molMKfNbg/6T705VCW2XOKcXPfYZGj9XimQ6YVE4bSN+wwGpkni63ABuqndUllVga98CBZUBZplCQ0ljg6Bv3A==",
"dependencies": {
"@babel/runtime": "^7.3.1",
"@loaders.gl/loader-utils": "3.3.1",
"@loaders.gl/worker-utils": "3.3.1",
"@probe.gl/log": "^3.5.0"
}
},
"node_modules/@loaders.gl/draco": {
"version": "3.3.1",
"resolved": "https://registry.npmjs.org/@loaders.gl/draco/-/draco-3.3.1.tgz",
"integrity": "sha512-O73j+HpuKXhsoaD6jxYf1m8RDaE73eKWiBRwj8ExkhtFFmCnI02ERNuPhSbt7oN9xjEBuAuLBN2DpBtayKLhcA==",
"dependencies": {
"@babel/runtime": "^7.3.1",
"@loaders.gl/loader-utils": "3.3.1",
"@loaders.gl/schema": "3.3.1",
"@loaders.gl/worker-utils": "3.3.1",
"draco3d": "1.5.5"
}
},
"node_modules/@loaders.gl/gltf": {
"version": "3.3.1",
"resolved": "https://registry.npmjs.org/@loaders.gl/gltf/-/gltf-3.3.1.tgz",
"integrity": "sha512-FQgtA0DxtmZygRGCbQcgn6KzgwUgVzlyajVL+Lydo25qZ2MqafCdvGDQQaNz1bQSUtIReYKuOjig9YlycPYZaA==",
"dependencies": {
"@loaders.gl/draco": "3.3.1",
"@loaders.gl/images": "3.3.1",
"@loaders.gl/loader-utils": "3.3.1",
"@loaders.gl/textures": "3.3.1",
"@math.gl/core": "^3.5.1"
}
},
"node_modules/@loaders.gl/images": {
"version": "3.3.1",
"resolved": "https://registry.npmjs.org/@loaders.gl/images/-/images-3.3.1.tgz",
"integrity": "sha512-A3JgiPSmL/0D/u67+huXfOHg4pEU9BUMtboxmVc/F0jC/aueli6/Erlco4Bf0Ci4fy9+eApmHD4eKmFSamdNCw==",
"dependencies": {
"@loaders.gl/loader-utils": "3.3.1"
}
},
"node_modules/@loaders.gl/loader-utils": {
"version": "3.3.1",
"resolved": "https://registry.npmjs.org/@loaders.gl/loader-utils/-/loader-utils-3.3.1.tgz",
"integrity": "sha512-yp3ngZw4O9OY7O3d8DCFwsuwDGR4IlDqJCFp47CVS3crrpANBOP12hBZl1uLZJQ8KN1gFXp0tIQtp5/J2bv+Hg==",
"dependencies": {
"@babel/runtime": "^7.3.1",
"@loaders.gl/worker-utils": "3.3.1",
"@probe.gl/stats": "^3.5.0"
}
},
"node_modules/@loaders.gl/schema": {
"version": "3.3.1",
"resolved": "https://registry.npmjs.org/@loaders.gl/schema/-/schema-3.3.1.tgz",
"integrity": "sha512-VpVFLCc+38P0ddJ5478NnXN60YhNx9/dYHy1Y9ccOGTzaXPn8uFqM7DW/eNaJ7ikyiAWeSD75TpSQPzBrAd5MQ==",
"dependencies": {
"@types/geojson": "^7946.0.7"
}
},
"node_modules/@loaders.gl/textures": {
"version": "3.3.1",
"resolved": "https://registry.npmjs.org/@loaders.gl/textures/-/textures-3.3.1.tgz",
"integrity": "sha512-LjWprbSPTPvL+pnKKxqTVs1vuzysj8JJDMI374wSs2EQIBkxWgACjitR0+E7+DZ4qId1DtRmhW+L7x0SflekaA==",
"dependencies": {
"@loaders.gl/images": "3.3.1",
"@loaders.gl/loader-utils": "3.3.1",
"@loaders.gl/schema": "3.3.1",
"@loaders.gl/worker-utils": "3.3.1",
"ktx-parse": "^0.0.4",
"texture-compressor": "^1.0.2"
}
},
"node_modules/@loaders.gl/worker-utils": {
"version": "3.3.1",
"resolved": "https://registry.npmjs.org/@loaders.gl/worker-utils/-/worker-utils-3.3.1.tgz",
"integrity": "sha512-r1u358xZEMKUsv7gOabmc6fA6knWArYU0BqeWOaJHyN/72ESuDZrzjtk+Adux9rIJLlxrMHLq/o/WCsO1tmrYw==",
"dependencies": {
"@babel/runtime": "^7.3.1"
}
},
"node_modules/@math.gl/core": {
"version": "3.6.3",
"resolved": "https://registry.npmjs.org/@math.gl/core/-/core-3.6.3.tgz",
"integrity": "sha512-jBABmDkj5uuuE0dTDmwwss7Cup5ZwQ6Qb7h1pgvtkEutTrhkcv8SuItQNXmF45494yIHeoGue08NlyeY6wxq2A==",
"dependencies": {
"@babel/runtime": "^7.12.0",
"@math.gl/types": "3.6.3",
"gl-matrix": "^3.4.0"
}
},
"node_modules/@math.gl/types": {
"version": "3.6.3",
"resolved": "https://registry.npmjs.org/@math.gl/types/-/types-3.6.3.tgz",
"integrity": "sha512-3uWLVXHY3jQxsXCr/UCNPSc2BG0hNUljhmOBt9l+lNFDp7zHgm0cK2Tw4kj2XfkJy4TgwZTBGwRDQgWEbLbdTA=="
},
"node_modules/@nodelib/fs.scandir": {
"version": "2.1.5",
"resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
@ -1216,6 +1320,31 @@
"node": ">= 8"
}
},
"node_modules/@probe.gl/env": {
"version": "3.6.0",
"resolved": "https://registry.npmjs.org/@probe.gl/env/-/env-3.6.0.tgz",
"integrity": "sha512-4tTZYUg/8BICC3Yyb9rOeoKeijKbZHRXBEKObrfPmX4sQmYB15ZOUpoVBhAyJkOYVAM8EkPci6Uw5dLCwx2BEQ==",
"dependencies": {
"@babel/runtime": "^7.0.0"
}
},
"node_modules/@probe.gl/log": {
"version": "3.6.0",
"resolved": "https://registry.npmjs.org/@probe.gl/log/-/log-3.6.0.tgz",
"integrity": "sha512-hjpyenpEvOdowgZ1qMeCJxfRD4JkKdlXz0RC14m42Un62NtOT+GpWyKA4LssT0+xyLULCByRAtG2fzZorpIAcA==",
"dependencies": {
"@babel/runtime": "^7.0.0",
"@probe.gl/env": "3.6.0"
}
},
"node_modules/@probe.gl/stats": {
"version": "3.6.0",
"resolved": "https://registry.npmjs.org/@probe.gl/stats/-/stats-3.6.0.tgz",
"integrity": "sha512-JdALQXB44OP4kUBN/UrQgzbJe4qokbVF4Y8lkIA8iVCFnjVowWIgkD/z/0QO65yELT54tTrtepw1jScjKB+rhQ==",
"dependencies": {
"@babel/runtime": "^7.0.0"
}
},
"node_modules/@sinonjs/commons": {
"version": "1.8.6",
"resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz",
@ -1404,6 +1533,11 @@
"@types/range-parser": "*"
}
},
"node_modules/@types/geojson": {
"version": "7946.0.10",
"resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.10.tgz",
"integrity": "sha512-Nmh0K3iWQJzniTuPRcJn5hxXkfB1T1pgB89SBig5PlJQU5yocazeu4jATJlaA0GYFKWMqDdvYemoSnF2pXgLVA=="
},
"node_modules/@types/graceful-fs": {
"version": "4.1.6",
"resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.6.tgz",
@ -3815,6 +3949,11 @@
"integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==",
"dev": true
},
"node_modules/draco3d": {
"version": "1.5.5",
"resolved": "https://registry.npmjs.org/draco3d/-/draco3d-1.5.5.tgz",
"integrity": "sha512-JVuNV0EJzD3LBYhGyIXJLeBID/EVtmFO1ZNhAYflTgiMiAJlbhXQmRRda/azjc8MRVMHh0gqGhiqHUo5dIXM8Q=="
},
"node_modules/ee-first": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
@ -4830,6 +4969,11 @@
"integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==",
"dev": true
},
"node_modules/gl-matrix": {
"version": "3.4.3",
"resolved": "https://registry.npmjs.org/gl-matrix/-/gl-matrix-3.4.3.tgz",
"integrity": "sha512-wcCp8vu8FT22BnvKVPjXa/ICBWRq/zjFfdofZy1WSpQZpphblv12/bOQLBC1rMM7SGOFS9ltVmKOHil5+Ml7gA=="
},
"node_modules/glob": {
"version": "7.2.3",
"resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
@ -5320,6 +5464,17 @@
"node": ">= 4"
}
},
"node_modules/image-size": {
"version": "0.7.5",
"resolved": "https://registry.npmjs.org/image-size/-/image-size-0.7.5.tgz",
"integrity": "sha512-Hiyv+mXHfFEP7LzUL/llg9RwFxxY+o9N3JVLIeG5E7iFIFAalxvRU9UZthBdYDEVnzHMgjnKJPPpay5BWf1g9g==",
"bin": {
"image-size": "bin/image-size.js"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/images": {
"version": "3.2.4",
"resolved": "https://registry.npmjs.org/images/-/images-3.2.4.tgz",
@ -6512,6 +6667,11 @@
"node": ">=6"
}
},
"node_modules/ktx-parse": {
"version": "0.0.4",
"resolved": "https://registry.npmjs.org/ktx-parse/-/ktx-parse-0.0.4.tgz",
"integrity": "sha512-LY3nrmfXl+wZZdPxgJ3ZmLvG+wkOZZP3/dr4RbQj1Pk3Qwz44esOOSFFVQJcNWpXAtiNIC66WgXufX/SYgYz6A=="
},
"node_modules/leven": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz",
@ -8081,6 +8241,11 @@
"node": ">= 10.13.0"
}
},
"node_modules/regenerator-runtime": {
"version": "0.13.11",
"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz",
"integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg=="
},
"node_modules/regexpp": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz",
@ -8822,6 +8987,11 @@
"resolved": "https://registry.npmjs.org/split.js/-/split.js-1.6.5.tgz",
"integrity": "sha512-mPTnGCiS/RiuTNsVhCm9De9cCAUsrNFFviRbADdKiiV+Kk8HKp/0fWu7Kr8pi3/yBmsqLFHuXGT9UUZ+CNLwFw=="
},
"node_modules/sprintf-js": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
"integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g=="
},
"node_modules/stack-trace": {
"version": "0.0.10",
"resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz",
@ -9202,6 +9372,26 @@
"integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==",
"dev": true
},
"node_modules/texture-compressor": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/texture-compressor/-/texture-compressor-1.0.2.tgz",
"integrity": "sha512-dStVgoaQ11mA5htJ+RzZ51ZxIZqNOgWKAIvtjLrW1AliQQLCmrDqNzQZ8Jh91YealQ95DXt4MEduLzJmbs6lig==",
"dependencies": {
"argparse": "^1.0.10",
"image-size": "^0.7.4"
},
"bin": {
"texture-compressor": "bin/texture-compressor.js"
}
},
"node_modules/texture-compressor/node_modules/argparse": {
"version": "1.0.10",
"resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
"integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
"dependencies": {
"sprintf-js": "~1.0.2"
}
},
"node_modules/tga": {
"version": "1.0.7",
"resolved": "https://registry.npmjs.org/tga/-/tga-1.0.7.tgz",
@ -10841,6 +11031,14 @@
"@babel/helper-plugin-utils": "^7.19.0"
}
},
"@babel/runtime": {
"version": "7.21.0",
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.0.tgz",
"integrity": "sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==",
"requires": {
"regenerator-runtime": "^0.13.11"
}
},
"@babel/template": {
"version": "7.20.7",
"resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz",
@ -11042,12 +11240,6 @@
"resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
"integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
"dev": true
},
"sprintf-js": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
"integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==",
"dev": true
}
}
},
@ -11315,6 +11507,103 @@
"integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==",
"dev": true
},
"@loaders.gl/core": {
"version": "3.3.1",
"resolved": "https://registry.npmjs.org/@loaders.gl/core/-/core-3.3.1.tgz",
"integrity": "sha512-molMKfNbg/6T705VCW2XOKcXPfYZGj9XimQ6YVE4bSN+wwGpkni63ABuqndUllVga98CBZUBZplCQ0ljg6Bv3A==",
"requires": {
"@babel/runtime": "^7.3.1",
"@loaders.gl/loader-utils": "3.3.1",
"@loaders.gl/worker-utils": "3.3.1",
"@probe.gl/log": "^3.5.0"
}
},
"@loaders.gl/draco": {
"version": "3.3.1",
"resolved": "https://registry.npmjs.org/@loaders.gl/draco/-/draco-3.3.1.tgz",
"integrity": "sha512-O73j+HpuKXhsoaD6jxYf1m8RDaE73eKWiBRwj8ExkhtFFmCnI02ERNuPhSbt7oN9xjEBuAuLBN2DpBtayKLhcA==",
"requires": {
"@babel/runtime": "^7.3.1",
"@loaders.gl/loader-utils": "3.3.1",
"@loaders.gl/schema": "3.3.1",
"@loaders.gl/worker-utils": "3.3.1",
"draco3d": "1.5.5"
}
},
"@loaders.gl/gltf": {
"version": "3.3.1",
"resolved": "https://registry.npmjs.org/@loaders.gl/gltf/-/gltf-3.3.1.tgz",
"integrity": "sha512-FQgtA0DxtmZygRGCbQcgn6KzgwUgVzlyajVL+Lydo25qZ2MqafCdvGDQQaNz1bQSUtIReYKuOjig9YlycPYZaA==",
"requires": {
"@loaders.gl/draco": "3.3.1",
"@loaders.gl/images": "3.3.1",
"@loaders.gl/loader-utils": "3.3.1",
"@loaders.gl/textures": "3.3.1",
"@math.gl/core": "^3.5.1"
}
},
"@loaders.gl/images": {
"version": "3.3.1",
"resolved": "https://registry.npmjs.org/@loaders.gl/images/-/images-3.3.1.tgz",
"integrity": "sha512-A3JgiPSmL/0D/u67+huXfOHg4pEU9BUMtboxmVc/F0jC/aueli6/Erlco4Bf0Ci4fy9+eApmHD4eKmFSamdNCw==",
"requires": {
"@loaders.gl/loader-utils": "3.3.1"
}
},
"@loaders.gl/loader-utils": {
"version": "3.3.1",
"resolved": "https://registry.npmjs.org/@loaders.gl/loader-utils/-/loader-utils-3.3.1.tgz",
"integrity": "sha512-yp3ngZw4O9OY7O3d8DCFwsuwDGR4IlDqJCFp47CVS3crrpANBOP12hBZl1uLZJQ8KN1gFXp0tIQtp5/J2bv+Hg==",
"requires": {
"@babel/runtime": "^7.3.1",
"@loaders.gl/worker-utils": "3.3.1",
"@probe.gl/stats": "^3.5.0"
}
},
"@loaders.gl/schema": {
"version": "3.3.1",
"resolved": "https://registry.npmjs.org/@loaders.gl/schema/-/schema-3.3.1.tgz",
"integrity": "sha512-VpVFLCc+38P0ddJ5478NnXN60YhNx9/dYHy1Y9ccOGTzaXPn8uFqM7DW/eNaJ7ikyiAWeSD75TpSQPzBrAd5MQ==",
"requires": {
"@types/geojson": "^7946.0.7"
}
},
"@loaders.gl/textures": {
"version": "3.3.1",
"resolved": "https://registry.npmjs.org/@loaders.gl/textures/-/textures-3.3.1.tgz",
"integrity": "sha512-LjWprbSPTPvL+pnKKxqTVs1vuzysj8JJDMI374wSs2EQIBkxWgACjitR0+E7+DZ4qId1DtRmhW+L7x0SflekaA==",
"requires": {
"@loaders.gl/images": "3.3.1",
"@loaders.gl/loader-utils": "3.3.1",
"@loaders.gl/schema": "3.3.1",
"@loaders.gl/worker-utils": "3.3.1",
"ktx-parse": "^0.0.4",
"texture-compressor": "^1.0.2"
}
},
"@loaders.gl/worker-utils": {
"version": "3.3.1",
"resolved": "https://registry.npmjs.org/@loaders.gl/worker-utils/-/worker-utils-3.3.1.tgz",
"integrity": "sha512-r1u358xZEMKUsv7gOabmc6fA6knWArYU0BqeWOaJHyN/72ESuDZrzjtk+Adux9rIJLlxrMHLq/o/WCsO1tmrYw==",
"requires": {
"@babel/runtime": "^7.3.1"
}
},
"@math.gl/core": {
"version": "3.6.3",
"resolved": "https://registry.npmjs.org/@math.gl/core/-/core-3.6.3.tgz",
"integrity": "sha512-jBABmDkj5uuuE0dTDmwwss7Cup5ZwQ6Qb7h1pgvtkEutTrhkcv8SuItQNXmF45494yIHeoGue08NlyeY6wxq2A==",
"requires": {
"@babel/runtime": "^7.12.0",
"@math.gl/types": "3.6.3",
"gl-matrix": "^3.4.0"
}
},
"@math.gl/types": {
"version": "3.6.3",
"resolved": "https://registry.npmjs.org/@math.gl/types/-/types-3.6.3.tgz",
"integrity": "sha512-3uWLVXHY3jQxsXCr/UCNPSc2BG0hNUljhmOBt9l+lNFDp7zHgm0cK2Tw4kj2XfkJy4TgwZTBGwRDQgWEbLbdTA=="
},
"@nodelib/fs.scandir": {
"version": "2.1.5",
"resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
@ -11341,6 +11630,31 @@
"fastq": "^1.6.0"
}
},
"@probe.gl/env": {
"version": "3.6.0",
"resolved": "https://registry.npmjs.org/@probe.gl/env/-/env-3.6.0.tgz",
"integrity": "sha512-4tTZYUg/8BICC3Yyb9rOeoKeijKbZHRXBEKObrfPmX4sQmYB15ZOUpoVBhAyJkOYVAM8EkPci6Uw5dLCwx2BEQ==",
"requires": {
"@babel/runtime": "^7.0.0"
}
},
"@probe.gl/log": {
"version": "3.6.0",
"resolved": "https://registry.npmjs.org/@probe.gl/log/-/log-3.6.0.tgz",
"integrity": "sha512-hjpyenpEvOdowgZ1qMeCJxfRD4JkKdlXz0RC14m42Un62NtOT+GpWyKA4LssT0+xyLULCByRAtG2fzZorpIAcA==",
"requires": {
"@babel/runtime": "^7.0.0",
"@probe.gl/env": "3.6.0"
}
},
"@probe.gl/stats": {
"version": "3.6.0",
"resolved": "https://registry.npmjs.org/@probe.gl/stats/-/stats-3.6.0.tgz",
"integrity": "sha512-JdALQXB44OP4kUBN/UrQgzbJe4qokbVF4Y8lkIA8iVCFnjVowWIgkD/z/0QO65yELT54tTrtepw1jScjKB+rhQ==",
"requires": {
"@babel/runtime": "^7.0.0"
}
},
"@sinonjs/commons": {
"version": "1.8.6",
"resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz",
@ -11526,6 +11840,11 @@
"@types/range-parser": "*"
}
},
"@types/geojson": {
"version": "7946.0.10",
"resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.10.tgz",
"integrity": "sha512-Nmh0K3iWQJzniTuPRcJn5hxXkfB1T1pgB89SBig5PlJQU5yocazeu4jATJlaA0GYFKWMqDdvYemoSnF2pXgLVA=="
},
"@types/graceful-fs": {
"version": "4.1.6",
"resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.6.tgz",
@ -13439,6 +13758,11 @@
}
}
},
"draco3d": {
"version": "1.5.5",
"resolved": "https://registry.npmjs.org/draco3d/-/draco3d-1.5.5.tgz",
"integrity": "sha512-JVuNV0EJzD3LBYhGyIXJLeBID/EVtmFO1ZNhAYflTgiMiAJlbhXQmRRda/azjc8MRVMHh0gqGhiqHUo5dIXM8Q=="
},
"ee-first": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
@ -14225,6 +14549,11 @@
"integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==",
"dev": true
},
"gl-matrix": {
"version": "3.4.3",
"resolved": "https://registry.npmjs.org/gl-matrix/-/gl-matrix-3.4.3.tgz",
"integrity": "sha512-wcCp8vu8FT22BnvKVPjXa/ICBWRq/zjFfdofZy1WSpQZpphblv12/bOQLBC1rMM7SGOFS9ltVmKOHil5+Ml7gA=="
},
"glob": {
"version": "7.2.3",
"resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
@ -14585,6 +14914,11 @@
"integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==",
"dev": true
},
"image-size": {
"version": "0.7.5",
"resolved": "https://registry.npmjs.org/image-size/-/image-size-0.7.5.tgz",
"integrity": "sha512-Hiyv+mXHfFEP7LzUL/llg9RwFxxY+o9N3JVLIeG5E7iFIFAalxvRU9UZthBdYDEVnzHMgjnKJPPpay5BWf1g9g=="
},
"images": {
"version": "3.2.4",
"resolved": "https://registry.npmjs.org/images/-/images-3.2.4.tgz",
@ -15482,6 +15816,11 @@
"integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==",
"dev": true
},
"ktx-parse": {
"version": "0.0.4",
"resolved": "https://registry.npmjs.org/ktx-parse/-/ktx-parse-0.0.4.tgz",
"integrity": "sha512-LY3nrmfXl+wZZdPxgJ3ZmLvG+wkOZZP3/dr4RbQj1Pk3Qwz44esOOSFFVQJcNWpXAtiNIC66WgXufX/SYgYz6A=="
},
"leven": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz",
@ -16720,6 +17059,11 @@
"resolve": "^1.20.0"
}
},
"regenerator-runtime": {
"version": "0.13.11",
"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz",
"integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg=="
},
"regexpp": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz",
@ -17283,6 +17627,11 @@
"resolved": "https://registry.npmjs.org/split.js/-/split.js-1.6.5.tgz",
"integrity": "sha512-mPTnGCiS/RiuTNsVhCm9De9cCAUsrNFFviRbADdKiiV+Kk8HKp/0fWu7Kr8pi3/yBmsqLFHuXGT9UUZ+CNLwFw=="
},
"sprintf-js": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
"integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g=="
},
"stack-trace": {
"version": "0.0.10",
"resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz",
@ -17565,6 +17914,25 @@
"integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==",
"dev": true
},
"texture-compressor": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/texture-compressor/-/texture-compressor-1.0.2.tgz",
"integrity": "sha512-dStVgoaQ11mA5htJ+RzZ51ZxIZqNOgWKAIvtjLrW1AliQQLCmrDqNzQZ8Jh91YealQ95DXt4MEduLzJmbs6lig==",
"requires": {
"argparse": "^1.0.10",
"image-size": "^0.7.4"
},
"dependencies": {
"argparse": {
"version": "1.0.10",
"resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
"integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
"requires": {
"sprintf-js": "~1.0.2"
}
}
}
},
"tga": {
"version": "1.0.7",
"resolved": "https://registry.npmjs.org/tga/-/tga-1.0.7.tgz",

View File

@ -75,6 +75,8 @@
"worker-loader": "^3.0.8"
},
"dependencies": {
"@loaders.gl/core": "^3.3.1",
"@loaders.gl/gltf": "^3.3.1",
"split.js": "^1.6.5"
}
}

View File

@ -156,8 +156,7 @@ export class AppContext {
const payload: TToWorkerMessage = {
action: 'Import',
params: {
importer: 'obj',
fileSource: await uiElements.input.getValue(),
file: uiElements.input.getValue(),
rotation: uiElements.rotation.getValue(),
},
};

View File

@ -1,6 +1,5 @@
import { Mesh } from '../mesh';
export abstract class IImporter {
abstract parse(fileSource: string): void;
abstract toMesh(): Mesh;
public abstract import(file: File): Promise<Mesh>;
}

View File

@ -0,0 +1,149 @@
import { parse } from '@loaders.gl/core';
import { GLTFLoader } from '@loaders.gl/gltf';
import { RGBAColours, RGBAUtil } from '../colour';
import { MaterialMap, MaterialType, Mesh, Tri } from '../mesh';
import { UV } from '../util';
import { Vector3 } from '../vector';
import { IImporter } from './base_importer';
export class GltfLoader extends IImporter {
public override import(file: File): Promise<Mesh> {
return new Promise<Mesh>((resolve, reject) => {
parse(file, GLTFLoader, { limit: 0 })
.then((gltf: any) => {
resolve(this._handleGLTF(gltf));
})
.catch((err: any) => {
reject(err);
});
});
}
private _handleGLTF(gltf: any): Mesh {
const meshVertices: Vector3[] = [];
const meshNormals: Vector3[] = [];
const meshTexcoords: UV[] = [];
const meshTriangles: Tri[] = [];
const meshMaterials: MaterialMap = new Map();
meshMaterials.set('NONE', {
type: MaterialType.solid,
colour: RGBAUtil.copy(RGBAColours.WHITE),
needsAttention: false,
canBeTextured: false,
});
let maxIndex = 0;
Object.values(gltf.meshes).forEach((mesh: any) => {
Object.values(mesh.primitives).forEach((primitive: any) => {
const attributes = primitive.attributes;
if (attributes.POSITION !== undefined) {
const positions = attributes.POSITION.value as Float32Array;
for (let i = 0; i < positions.length; i += 3) {
meshVertices.push(new Vector3(
positions[i + 0],
positions[i + 1],
positions[i + 2],
));
}
}
if (attributes.NORMAL !== undefined) {
const normals = attributes.NORMAL.value as Float32Array;
for (let i = 0; i < normals.length; i += 3) {
meshNormals.push(new Vector3(
normals[i + 0],
normals[i + 1],
normals[i + 2],
));
}
}
if (attributes.TEXCOORD_0 !== undefined) {
const texcoords = attributes.TEXCOORD_0.value as Float32Array;
for (let i = 0; i < texcoords.length; i += 2) {
meshTexcoords.push(new UV(
texcoords[i + 0],
1.0 - texcoords[i + 1],
));
}
}
// Material
let materialNameToUse = 'NONE';
{
if (primitive.material) {
const materialName = primitive.material.name;
let materialMade = false;
const pbr = primitive.material.pbrMetallicRoughness;
if (pbr !== undefined) {
const diffuseTexture = pbr.baseColorTexture;
if (diffuseTexture !== undefined) {
meshMaterials.set(materialName, {
type: MaterialType.solid,
colour: RGBAUtil.copy(RGBAColours.WHITE),
needsAttention: false,
canBeTextured: true,
});
materialNameToUse = materialName;
materialMade = true;
}
}
const emissiveColour: (number[] | undefined) = primitive.material.emissiveFactor;
if (!materialMade && emissiveColour !== undefined) {
meshMaterials.set(materialName, {
type: MaterialType.solid,
colour: {
r: emissiveColour[0],
g: emissiveColour[1],
b: emissiveColour[2],
a: 1.0,
},
needsAttention: false,
canBeTextured: false,
});
materialNameToUse = materialName;
materialMade = true;
}
}
}
// Indices
{
const indices = primitive.indices.value as Uint16Array;
for (let i = 0; i < indices.length / 3; ++i) {
meshTriangles.push({
material: materialNameToUse,
positionIndices: {
x: maxIndex + indices[i * 3 + 0],
y: maxIndex + indices[i * 3 + 1],
z: maxIndex + indices[i * 3 + 2],
},
texcoordIndices: {
x: maxIndex + indices[i * 3 + 0],
y: maxIndex + indices[i * 3 + 1],
z: maxIndex + indices[i * 3 + 2],
},
});
}
let localMax = 0;
for (let i = 0; i < indices.length; ++i) {
localMax = Math.max(localMax, indices[i]);
}
maxIndex += localMax + 1;
}
});
});
return new Mesh(
meshVertices,
meshNormals,
meshTexcoords,
meshTriangles,
meshMaterials,
);
}
}

View File

@ -1,14 +1,17 @@
import { ASSERT } from '../util/error_util';
import { IImporter } from './base_importer';
import { GltfLoader } from './gltf_loader';
import { ObjImporter } from './obj_importer';
export type TImporters = 'obj';
export type TImporters = 'obj' | 'gltf';
export class ImporterFactor {
public static GetImporter(importer: TImporters): IImporter {
switch (importer) {
case 'obj':
return new ObjImporter();
case 'gltf':
return new GltfLoader();
default:
ASSERT(false);
}

View File

@ -1,14 +1,7 @@
import path from 'path';
import { RGBA, RGBAColours } from '../colour';
import { checkFractional, checkNaN } from '../math';
import { MaterialType, Mesh, SolidMaterial, TexturedMaterial, Tri } from '../mesh';
import { StatusHandler } from '../status';
import { EImageChannel, TTransparencyOptions } from '../texture';
import { checkNaN } from '../math';
import { Mesh, Tri } from '../mesh';
import { UV } from '../util';
import { AppError, ASSERT } from '../util/error_util';
import { LOG } from '../util/log_util';
import { LOG_ERROR } from '../util/log_util';
import { RegExpBuilder } from '../util/regex_util';
import { REGEX_NZ_ANY } from '../util/regex_util';
import { REGEX_NUMBER } from '../util/regex_util';
@ -181,27 +174,24 @@ export class ObjImporter extends IImporter {
},
];
override parse(fileSource: string) {
this._parseOBJ(fileSource);
public override import(file: File): Promise<Mesh> {
return new Promise((res, rej) => {
file.text().then((fileSource) => {
if (fileSource.includes('<27>')) {
rej(new AppError(`Unrecognised character found, please encode using UTF-8`));
}
fileSource.replace('\r', ''); // Convert Windows carriage return
const fileLines = fileSource.split('\n');
for (const line of fileLines) {
this.parseOBJLine(line);
}
res(new Mesh(this._vertices, this._normals, this._uvs, this._tris, new Map()));
});
});
}
override toMesh(): Mesh {
return new Mesh(this._vertices, this._normals, this._uvs, this._tris, new Map());
}
private _parseOBJ(fileSource: string) {
if (fileSource.includes('<27>')) {
throw new AppError(`Unrecognised character found, please encode <b>${path}</b> using UTF-8`);
}
fileSource.replace('\r', ''); // Convert Windows carriage return
const fileLines = fileSource.split('\n');
for (const line of fileLines) {
this.parseOBJLine(line);
}
}
public parseOBJLine(line: string) {
const essentialTokens = ['usemtl ', 'v ', 'vt ', 'f ', 'vn '];
@ -211,7 +201,6 @@ export class ObjImporter extends IImporter {
try {
parser.delegate(match.groups);
} catch (error) {
LOG_ERROR('Caught', error);
if (error instanceof AppError) {
throw new AppError(`Failed attempt to parse '${line}', because '${error.message}'`);
}

View File

@ -4,18 +4,18 @@ import { ASSERT } from '../../util/error_util';
import { UIUtil } from '../../util/ui_util';
import { ConfigComponent } from './config';
export class ObjFileComponent extends ConfigComponent<Promise<string>, HTMLDivElement> {
export class FileComponent extends ConfigComponent<File, HTMLDivElement> {
private _loadedFilePath: string;
public constructor() {
super(Promise.resolve(''));
super();
this._loadedFilePath = '';
}
protected override _generateInnerHTML() {
return `
<div class="input-file struct-prop" id="${this._getId()}">
<input type="file" accept=".obj" style="display: none;" id="${this._getId()}-input">
<input type="file" accept=".obj,.gltf,.glb" style="display: none;" id="${this._getId()}-input">
${this._loadedFilePath}
</div>
`;
@ -40,7 +40,7 @@ export class ObjFileComponent extends ConfigComponent<Promise<string>, HTMLDivEl
const file = files.item(0);
ASSERT(file !== null);
this._loadedFilePath = file.name;
this._setValue(file.text());
this._setValue(file);
}
});

View File

@ -55,7 +55,7 @@ export class MaterialTypeComponent extends ConfigComponent<MaterialType, HTMLDiv
super._onEnabledChanged();
this._solidButton.setEnabled(this.enabled);
this._texturedButton.setEnabled(this.enabled);
this._texturedButton.setEnabled(this.enabled && (this._material.type === MaterialType.textured || this._material.canBeTextured));
}
protected override _onValueChanged(): void {

View File

@ -18,7 +18,7 @@ import { ButtonComponent } from './components/button';
import { CheckboxComponent } from './components/checkbox';
import { ComboboxComponent, ComboBoxItem } from './components/combobox';
import { ConfigComponent } from './components/config';
import { ObjFileComponent } from './components/file_input';
import { FileComponent } from './components/file_input';
import { HeaderComponent } from './components/header';
import { PaletteComponent } from './components/palette';
import { SliderComponent } from './components/slider';
@ -46,8 +46,8 @@ export class UI {
'import': {
label: '1. Import',
components: {
'input': new ObjFileComponent()
.setLabel('Wavefront .obj file'),
'input': new FileComponent()
.setLabel('3D Model (.obj, .gltf/.glb)'),
'rotation': new VectorSpinboxComponent()
.setLabel('Rotation')
.setWrap(360)

View File

@ -1,10 +1,11 @@
import { ProgressManager } from './progress';
import { StatusHandler } from './status';
import { AppError } from './util/error_util';
import { LOG_ERROR } from './util/log_util';
import { WorkerClient } from './worker_client';
import { TFromWorkerMessage, TToWorkerMessage } from './worker_types';
export function doWork(message: TToWorkerMessage): TFromWorkerMessage {
export async function doWork(message: TToWorkerMessage): Promise<TFromWorkerMessage> {
StatusHandler.Get.clear();
if (message.action !== 'RenderNextVoxelMeshChunk' && message.action !== 'RenderNextBlockMeshChunk') {
@ -14,35 +15,37 @@ export function doWork(message: TToWorkerMessage): TFromWorkerMessage {
try {
switch (message.action) {
case 'Init':
return {
return Promise.resolve({
action: 'Init',
result: WorkerClient.Get.init(message.params),
messages: StatusHandler.getAll(),
};
});
case 'Import':
return {
const result = await WorkerClient.Get.import(message.params);
return Promise.resolve({
action: 'Import',
result: WorkerClient.Get.import(message.params),
result: result,
messages: StatusHandler.getAll(),
};
});
case 'SetMaterials':
return {
return Promise.resolve({
action: 'SetMaterials',
result: WorkerClient.Get.setMaterials(message.params),
messages: StatusHandler.getAll(),
};
});
case 'RenderMesh':
return {
return Promise.resolve({
action: 'RenderMesh',
result: WorkerClient.Get.renderMesh(message.params),
messages: StatusHandler.getAll(),
};
});
case 'Voxelise':
return {
return Promise.resolve({
action: 'Voxelise',
result: WorkerClient.Get.voxelise(message.params),
messages: StatusHandler.getAll(),
};
});
/*
case 'RenderVoxelMesh':
return {
@ -52,17 +55,17 @@ export function doWork(message: TToWorkerMessage): TFromWorkerMessage {
};
*/
case 'RenderNextVoxelMeshChunk':
return {
return Promise.resolve({
action: 'RenderNextVoxelMeshChunk',
result: WorkerClient.Get.renderChunkedVoxelMesh(message.params),
messages: StatusHandler.getAll(),
};
});
case 'Assign':
return {
return Promise.resolve({
action: 'Assign',
result: WorkerClient.Get.assign(message.params),
messages: StatusHandler.getAll(),
};
});
/*
case 'RenderBlockMesh':
return {
@ -72,19 +75,20 @@ export function doWork(message: TToWorkerMessage): TFromWorkerMessage {
};
*/
case 'RenderNextBlockMeshChunk':
return {
return Promise.resolve({
action: 'RenderNextBlockMeshChunk',
result: WorkerClient.Get.renderChunkedBlockMesh(message.params),
messages: StatusHandler.getAll(),
};
});
case 'Export':
return {
return Promise.resolve({
action: 'Export',
result: WorkerClient.Get.export(message.params),
messages: StatusHandler.getAll(),
};
});
}
} catch (e: any) {
LOG_ERROR(e);
return { action: e instanceof AppError ? 'KnownError' : 'UnknownError', error: e as Error };
}
}

View File

@ -1,3 +1,5 @@
import path from 'path';
import { Atlas } from './atlas';
import { BlockMesh } from './block_mesh';
import { BufferGenerator } from './buffer';
@ -69,11 +71,12 @@ export class WorkerClient {
return {};
}
public import(params: ImportParams.Input): ImportParams.Output {
const importer = ImporterFactor.GetImporter(params.importer);
importer.parse(params.fileSource);
public async import(params: ImportParams.Input): Promise<ImportParams.Output> {
const parsed = path.parse(params.file.name);
const importer = ImporterFactor.GetImporter(parsed.ext === '.obj' ? 'obj' : 'gltf');
this._loadedMesh = await importer.import(params.file);
this._loadedMesh = importer.toMesh();
this._loadedMesh.processMesh(params.rotation.y, params.rotation.x, params.rotation.z);
return {

View File

@ -114,10 +114,13 @@ export class WorkerController {
ASSERT(this._worker !== undefined, 'No worker instance');
this._worker.postMessage(this._jobPending.payload);
} else {
const result = doWork(this._jobPending.payload);
if (this._jobPending.callback) {
this._jobPending.callback(result);
}
const pendingJob = this._jobPending;
doWork(this._jobPending.payload).then((result) => {
if (pendingJob.callback) {
pendingJob.callback(result);
}
});
}
}
}

View File

@ -1,5 +1,6 @@
const workerInstance = require('./worker');
addEventListener('message', (e) => {
postMessage(workerInstance.doWork(e.data));
addEventListener('message', async (e) => {
const result = await workerInstance.doWork(e.data);
postMessage(result);
});

View File

@ -23,8 +23,7 @@ export namespace InitParams {
export namespace ImportParams {
export type Input = {
importer: TImporters,
fileSource: string,
file: File,
rotation: Vector3,
}

View File

@ -7,8 +7,7 @@ import { THeadlessConfig } from './headless';
export const headlessConfig: THeadlessConfig = {
import: {
importer: 'obj',
fileSource: fs.readFileSync('/Users/lucasdower/ObjToSchematic/res/samples/skull.obj', 'utf8'),
file: new File([], '/Users/lucasdower/ObjToSchematic/res/samples/skull.obj'),
rotation: new Vector3(0, 0, 0),
},
voxelise: {