mirror of
https://github.com/LucasDower/ObjToSchematic.git
synced 2025-12-11 20:15:30 +01:00
Added support for .gltf/.glb files (beta)
This commit is contained in:
parent
dd5227ad6e
commit
4144497cd5
392
package-lock.json
generated
392
package-lock.json
generated
@ -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",
|
||||
|
||||
@ -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"
|
||||
}
|
||||
}
|
||||
|
||||
@ -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(),
|
||||
},
|
||||
};
|
||||
|
||||
@ -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>;
|
||||
}
|
||||
|
||||
149
src/importers/gltf_loader.ts
Normal file
149
src/importers/gltf_loader.ts
Normal 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,
|
||||
);
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
|
||||
@ -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}'`);
|
||||
}
|
||||
|
||||
@ -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);
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
@ -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 {
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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 };
|
||||
}
|
||||
}
|
||||
|
||||
@ -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 {
|
||||
|
||||
@ -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);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -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);
|
||||
});
|
||||
|
||||
@ -23,8 +23,7 @@ export namespace InitParams {
|
||||
|
||||
export namespace ImportParams {
|
||||
export type Input = {
|
||||
importer: TImporters,
|
||||
fileSource: string,
|
||||
file: File,
|
||||
rotation: Vector3,
|
||||
}
|
||||
|
||||
|
||||
@ -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: {
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user