load static method
Implementation
static Future<MeshData> load(String assetPath) async {
final String content = await rootBundle.loadString(assetPath);
final List<vm.Vector3> rawPos = [];
final List<vm.Vector3> rawNorm = [];
final Map<String, int> uniqueVertices = {};
final List<double> finalVertexBuffer = [];
final List<int> finalIndices = [];
final List<MeshGroup> groups = [];
String currentMaterial = "default";
String? mtlLibName;
int groupStartIndex = 0;
LineSplitter.split(content).forEach((line) {
line = line.trim();
if (line.isEmpty || line.startsWith('#')) return;
final parts = line.split(RegExp(r'\s+'));
final type = parts[0];
if (type == 'v') {
rawPos.add(vm.Vector3(double.parse(parts[1]), double.parse(parts[2]), double.parse(parts[3])));
} else if (type == 'vn') {
rawNorm.add(vm.Vector3(double.parse(parts[1]), double.parse(parts[2]), double.parse(parts[3])));
} else if (type == 'mtllib') {
mtlLibName = parts[1];
} else if (type == 'usemtl') {
if (finalIndices.length > groupStartIndex) {
groups.add(MeshGroup(currentMaterial, groupStartIndex, finalIndices.length - groupStartIndex));
}
currentMaterial = parts[1];
groupStartIndex = finalIndices.length;
} else if (type == 'f') {
final List<String> faceVerts = parts.sublist(1);
for (int i = 1; i < faceVerts.length - 1; i++) {
_processVertex(faceVerts[0], uniqueVertices, finalVertexBuffer, finalIndices, rawPos, rawNorm);
_processVertex(faceVerts[i], uniqueVertices, finalVertexBuffer, finalIndices, rawPos, rawNorm);
_processVertex(faceVerts[i + 1], uniqueVertices, finalVertexBuffer, finalIndices, rawPos, rawNorm);
}
}
});
if (finalIndices.length > groupStartIndex) {
groups.add(MeshGroup(currentMaterial, groupStartIndex, finalIndices.length - groupStartIndex));
}
return MeshData(Float32List.fromList(finalVertexBuffer), Uint32List.fromList(finalIndices), groups, mtlLibName);
}