GLTF2Loaderの現在のパターンは、次のようになります。
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;
} );
}
// ...
}
その結果、メッシュを作成する前に、すべてのアクセサー(すべての.bin
バッファーファイルに依存します)がロードされます。 すべてのバッファが実際に必要なわけではない場合、これにより問題が発生します。 例えば:
.bin
ファイルと非圧縮.bin
を含めることができるため、Dracoをサポートしていないクライアントは最適化されていないバージョンにフォールバックできます。 いずれの場合も、バッファの1つだけをロードする必要があります。したがって、依存関係をトップダウンで要求するには、GLTF2Loaderを再構築する必要があると思います。 提案された構文は(模倣するのに適した既存の例がない限り)次のようになります。
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;
} );
}
// ...
}
^簡潔にするためにES6を使用していますが、おそらく実際にはexamples / jsにチェックインすることはできません。
リファクタリングの旅に出る前に、これがどのように機能するかについての強い好みはありますか? この変更が段階的に発生する可能性があることを期待していますが、確認する必要があります。
/ cc @takahirox
リファクタリングに同意します。
IMO _withDependencies
と_each
の組み合わせは少し複雑です。
ところで、 @ mrdoobはPromise
とES6の使用を許可しますか?
gltfをロードするための管理可能なコードを取得するためにInternetExplorerを捨てても大丈夫だと思います👌
したがって、 Promise
はかっこいいです。 ES6 ...は機能とブラウザの互換性によって異なります。
リファクタリングしてくれてありがとう@takahirox !
これは閉じることができると思います。 一部のパーツは厳密にはトップダウンではありません。複数のシーンがあるモデルの場合、いつかgetMultiDependencies()
介してノードまたはアクセサーを取得したくない場合があります。 しかし、これまでに見たすべてのサンプルモデルについて、現在の構造ははるかに良く見えます。
最も参考になるコメント
gltfをロードするための管理可能なコードを取得するためにInternetExplorerを捨てても大丈夫だと思います👌
したがって、
Promise
はかっこいいです。 ES6 ...は機能とブラウザの互換性によって異なります。