load static method

Future<MeshData> load(
  1. String assetPath
)

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);
}