El patrón actual en GLTF2Loader se parece a esto:
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 los descriptores de acceso (que a su vez dependen de todos los archivos de búfer .bin
) se cargarán antes de que se puedan crear mallas. Esto presenta un problema, si no todos los búferes son realmente necesarios. Por ejemplo:
.bin
Draco y un archivo .bin
sin comprimir, para que los clientes que no admitan Draco puedan recurrir a la versión no optimizada. En cualquier caso, queremos cargar solo uno de los búferes.Entonces, creo que podría ser necesario reestructurar GLTF2Loader para solicitar dependencias de arriba hacia abajo. La sintaxis propuesta (a menos que existan buenos ejemplos existentes para imitar) sería algo como esto:
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 concisión, aunque presumiblemente eso no se puede verificar en examples / js.
Antes de embarcarme en un viaje de refactorización, ¿alguna preferencia fuerte sobre cómo debería funcionar? Espero, pero tendré que verificar, que este cambio pueda ocurrir de forma incremental.
/ cc @takahirox
Estoy de acuerdo con la refactorización.
En mi opinión, la combinación de _withDependencies
y _each
es un poco compleja.
Por cierto, @mrdoob , ¿nos permite usar Promise
y ES6?
Supongo que está bien deshacerse de Internet Explorer para obtener un código manejable para cargar gltf 👌
Entonces Promise
s son geniales. ES6 ... depende de la función y la compatibilidad del navegador.
¡Gracias @takahirox por la refactorización!
Creo que esto se puede cerrar. Algunas partes no son estrictamente de arriba hacia abajo: para un modelo con múltiples escenas, es posible que algún día no deseemos que los nodos o accesos se recuperen a través de getMultiDependencies()
. Pero para todos los modelos de ejemplo que he visto hasta ahora, la estructura actual se ve mucho mejor.
Comentario más útil
Supongo que está bien deshacerse de Internet Explorer para obtener un código manejable para cargar gltf 👌
Entonces
Promise
s son geniales. ES6 ... depende de la función y la compatibilidad del navegador.