Pola saat ini di GLTF2Loader terlihat seperti ini:
class GLTF2Parser {
loadMeshes () {
return this._withDependencies( [
'materials',
'accessors'
] ).then( ( dependencies ) => {
_each( json.meshes, ( meshDef ) => {
var geometry = /* ... */;
var material = dependencies.materials[ meshDef.material ];
var mesh = new THREE.Mesh( geometry, material );
// ...
return mesh;
} );
// ...
return meshes;
} );
}
// ...
}
Akibatnya, semua pengakses (yang pada gilirannya bergantung pada semua file buffer .bin
) akan dimuat sebelum mesh apa pun dapat dibuat. Ini menimbulkan masalah, jika tidak semua buffer benar-benar dibutuhkan. Sebagai contoh:
.bin
, dan .bin
yang tidak dikompresi, sehingga klien yang tidak mendukung Draco masih dapat menggunakan versi yang tidak dioptimalkan. Dalam kedua kasus, kami hanya ingin memuat salah satu buffer.Jadi, saya pikir mungkin perlu untuk merestrukturisasi GLTF2Loader untuk meminta dependensi top-down. Sintaks yang diusulkan (kecuali ada contoh bagus untuk ditiru) akan menjadi seperti ini:
class GLTF2Parser {
loadMesh ( meshDef ) {
return Promise.all( [
this.loadGeometry( meshDef.primitives ),
this.loadMaterial( meshDef.material )
] ).then( ( dependencies ) => {
var [geometry, material] = dependencies;
var mesh new THREE.Mesh( geometry, material );
// ...
return mesh;
} );
}
// ...
}
^Menggunakan ES6 untuk keringkasan, meskipun mungkin itu sebenarnya tidak dapat diperiksa ke dalam contoh/js.
Sebelum saya memulai perjalanan refactoring, ada preferensi kuat tentang bagaimana ini seharusnya bekerja? Saya berharap, tetapi perlu memverifikasi, bahwa perubahan ini dapat terjadi secara bertahap.
/cc @takahirox
Saya setuju dengan refactoring.
IMO kombinasi _withDependencies
dan _each
agak rumit.
BTW, @mrdoob apakah Anda mengizinkan kami menggunakan Promise
dan ES6?
Saya kira tidak apa-apa untuk membuang Internet Explorer untuk mendapatkan kode yang dapat dikelola untuk memuat gltf
Jadi Promise
itu keren. ES6... tergantung pada fitur dan kompatibilitas browser.
Terima kasih @takahirox untuk refactoringnya!
Saya pikir ini bisa ditutup. Beberapa bagian tidak sepenuhnya top-down — untuk model dengan banyak adegan, kita mungkin suatu hari nanti tidak ingin node atau pengakses diambil melalui getMultiDependencies()
. Tetapi untuk semua contoh model yang saya lihat sejauh ini, struktur saat ini terlihat jauh lebih baik.
Komentar yang paling membantu
Saya kira tidak apa-apa untuk membuang Internet Explorer untuk mendapatkan kode yang dapat dikelola untuk memuat gltf
Jadi
Promise
itu keren. ES6... tergantung pada fitur dan kompatibilitas browser.