parseLines method
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;
}