buildObjects method
Future<List<Object3D>>
buildObjects(
- Map<String, dynamic> geometries,
- dynamic instanceMaterials
)
Implementation
Future<List<Object3D>> buildObjects(Map<String,dynamic> geometries, instanceMaterials ) async{
final List<Object3D> objects = [];
for ( final type in geometries.keys ) {
final Map<String,dynamic> geometry = geometries[ type ];
final List<Material> materials = await resolveMaterialBinding( geometry['materialKeys'], instanceMaterials );
// handle case if no materials are defined
if ( materials.isEmpty) {
if ( type == 'lines' || type == 'linestrips' ) {
materials.add(LineBasicMaterial() );
}
else {
materials.add(MeshPhongMaterial() );
}
}
// Collada allows to use phong and lambert materials with lines. Replacing these cases with LineBasicMaterial.
if ( type == 'lines' || type == 'linestrips' ) {
for (int i = 0, l = materials.length; i < l; i ++ ) {
final material = materials[ i ];
if ( material is MeshPhongMaterial || material is MeshLambertMaterial) {
final lineMaterial = LineBasicMaterial();
lineMaterial.color.setFrom( material.color );
lineMaterial.opacity = material.opacity;
lineMaterial.transparent = material.transparent;
materials[ i ] = lineMaterial;
}
}
}
// regard skinning
final skinning = ( geometry['data'].attributes['skinIndex'] != null );
final Material? material = ( materials.length == 1 ) ? materials[ 0 ] : GroupMaterial(materials);
Object3D? object;
switch ( type ) {
case 'lines':
object = LineSegments( geometry['data'], material );
break;
case 'linestrips':
object = Line( geometry['data'], material );
break;
case 'triangles':
case 'polylist':
if ( skinning ) {
object = SkinnedMesh( geometry['data'], material );
}
else {
object = Mesh( geometry['data'], material );
}
break;
}
if(object != null){
objects.add( object );
}
}
return objects;
}