O padrão atual em GLTF2Loader se parece com isto:
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;
} );
}
// ...
}
Como resultado, todos os acessadores (que por sua vez dependem de todos os .bin
arquivos de buffer) serão carregados antes que qualquer malha possa ser criada. Isso apresenta um problema, se nem todos os buffers são realmente necessários. Por exemplo:
.bin
e um .bin
descompactado, para que os clientes que não suportam Draco ainda possam recorrer à versão não otimizada. Em qualquer um dos casos, queremos carregar apenas um dos buffers.Portanto, acho que pode ser necessário reestruturar o GLTF2Loader para solicitar dependências de cima para baixo. A sintaxe proposta (a menos que haja bons exemplos existentes para imitar) seria algo assim:
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;
} );
}
// ...
}
^ Usando ES6 para concisão, embora presumivelmente isso não possa realmente ser verificado em examples / js.
Antes de embarcar em uma jornada de refatoração, alguma preferência forte sobre como isso deve funcionar? Espero, mas preciso verificar, que essa mudança possa acontecer de forma incremental.
/ cc @takahirox
Eu concordo com a refatoração.
Na minha opinião, a combinação de _withDependencies
e _each
é um pouco complexa.
BTW, @mrdoob , você nos permite usar Promise
e ES6?
Acho que não há problema em abandonar o Internet Explorer para obter um código gerenciável para carregar o gltf 👌
Então Promise
s são legais. ES6 ... depende do recurso e compatibilidade do navegador.
Obrigado @takahirox pela refatoração!
Eu acho que isso pode ser fechado. Algumas partes não são estritamente de cima para baixo - para um modelo com várias cenas, podemos algum dia não querer ter nós ou acessores recuperados por meio de getMultiDependencies()
. Mas para todos os modelos de exemplo que vi até agora, a estrutura atual parece muito melhor.
Comentários muito úteis
Acho que não há problema em abandonar o Internet Explorer para obter um código gerenciável para carregar o gltf 👌
Então
Promise
s são legais. ES6 ... depende do recurso e compatibilidade do navegador.