buildObjects method

Future<List<Object3D>> buildObjects(
  1. Map<String, dynamic> geometries,
  2. 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;
}