parseLines method

Future<List<Face3D>> parseLines(
  1. List<String> lines, {
  2. Map<String, Map<String, ObjMaterial>> materialLib = const {},
})

Creates a List of Face3D for given obj lines and materialLib.

Implementation

Future<List<Face3D>> parseLines(
  List<String> lines, {
  Map<String, Map<String, ObjMaterial>> materialLib = const {},
}) async {
  final vertices = <Vector3>[];
  final faces = <Face3D>[];
  Map<String, ObjMaterial> materials = {};
  ObjMaterial currentMaterial = ObjMaterial.defaultMaterial();
  for (var line in lines) {
    List<String> chars = line.trim().split(_whiteSpace);

    if (chars[0] == "v") {
      // vertex
      vertices.add(Vector3(
        double.parse(chars[1]),
        double.parse(chars[3]),
        double.parse(chars[2]),
      ));
    } else if (chars[0] == "f") {
      // face
      for (int i = 1; i < chars.length - 1; i++) {
        faces.add(Face3D(
          Triangle.points(
            vertices[_parseVertexIndex(chars[1]) - 1].clone(),
            vertices[_parseVertexIndex(chars[i]) - 1].clone(),
            vertices[_parseVertexIndex(chars[i + 1]) - 1].clone(),
          ),
          color: currentMaterial.color,
        ));
      }
    } else if (chars[0] == usemtl) {
      currentMaterial = materials[chars[1]] ?? ObjMaterial.defaultMaterial();
    } else if (chars[0] == mtllib) {
      materials = materialLib[chars[1]] ?? <String, ObjMaterial>{};
    }
  }

  return faces;
}