private MD5Mesh readMesh(BufferedReader reader, MD5 md5) throws IOException {
    MD5Mesh mesh = new MD5Mesh();
    String line = MD5ParserCommon.readToLine(reader, "numverts ");
    mesh.numVertices = Integer.parseInt(line.trim().split(" ", 3)[1]);
    mesh.vertexList = new MD5Vertex[mesh.numVertices];
    for (int i = 0; i < mesh.numVertices; ++i) {
      line = MD5ParserCommon.readNextLine(reader);
      Matcher matcher = vertPatten.matcher(line);
      if (!matcher.find()) {
        throw new IOException("Invalid vertex line \"" + line + "\"");
      }
      int index = Integer.parseInt(matcher.group(1));
      MD5Vertex vert = new MD5Vertex();
      vert.uv = MD5ParserCommon.readUV(matcher.group(2), matcher.group(3));
      vert.startWeight = Integer.parseInt(matcher.group(4));
      vert.countWeight = Integer.parseInt(matcher.group(5));
      mesh.vertexList[index] = vert;
    }

    line = MD5ParserCommon.readToLine(reader, "numtris ");
    mesh.numTriangles = Integer.parseInt(line.trim().split(" ", 3)[1]);
    mesh.indexList = new int[mesh.numTriangles * 3];
    for (int i = 0; i < mesh.numTriangles; ++i) {
      line = MD5ParserCommon.readNextLine(reader);
      Matcher matcher = triPattern.matcher(line);
      if (!matcher.find()) {
        throw new IOException("Invalid triangle line \"" + line + "\"");
      }
      int triIndex = Integer.parseInt(matcher.group(1));
      mesh.indexList[3 * triIndex] = Integer.parseInt(matcher.group(2));
      mesh.indexList[3 * triIndex + 1] = Integer.parseInt(matcher.group(3));
      mesh.indexList[3 * triIndex + 2] = Integer.parseInt(matcher.group(4));
    }

    line = MD5ParserCommon.readToLine(reader, "numweights ");
    mesh.numWeights = Integer.parseInt(line.trim().split(" ", 3)[1]);
    mesh.weightList = new MD5Weight[mesh.numWeights];
    for (int i = 0; i < mesh.numWeights; ++i) {
      line = MD5ParserCommon.readNextLine(reader);
      Matcher matcher = weightPattern.matcher(line);
      if (!matcher.find()) {
        throw new IOException("Invalid weight line \"" + line + "\"");
      }
      int weightIndex = Integer.parseInt(matcher.group(1));
      MD5Weight weight = new MD5Weight();
      weight.jointIndex = Integer.parseInt(matcher.group(2));
      weight.bias = Float.parseFloat(matcher.group(3));
      weight.position =
          MD5ParserCommon.readVector3f(matcher.group(4), matcher.group(5), matcher.group(6));
      mesh.weightList[weightIndex] = weight;
    }
    return mesh;
  }
Esempio n. 2
0
  public static MD5Mesh parse(List<String> meshBlock) {
    MD5Mesh mesh = new MD5Mesh();
    List<MD5Vertex> vertices = mesh.getVertices();
    List<MD5Triangle> triangles = mesh.getTriangles();
    List<MD5Weight> weights = mesh.getWeights();

    for (String line : meshBlock) {
      if (line.contains("shader")) {
        Matcher textureMatcher = PATTERN_SHADER.matcher(line);
        if (textureMatcher.matches()) {
          mesh.setTexture(textureMatcher.group(1));
        }
      } else if (line.contains("vert")) {
        Matcher vertexMatcher = PATTERN_VERTEX.matcher(line);
        if (vertexMatcher.matches()) {
          MD5Vertex vertex = new MD5Vertex();
          vertex.setIndex(Integer.parseInt(vertexMatcher.group(1)));
          float x = Float.parseFloat(vertexMatcher.group(2));
          float y = Float.parseFloat(vertexMatcher.group(3));
          vertex.setTextCoords(new Vector2f(x, y));
          vertex.setStartWeight(Integer.parseInt(vertexMatcher.group(4)));
          vertex.setWeightCount(Integer.parseInt(vertexMatcher.group(5)));
          vertices.add(vertex);
        }
      } else if (line.contains("tri")) {
        Matcher triMatcher = PATTERN_TRI.matcher(line);
        if (triMatcher.matches()) {
          MD5Triangle triangle = new MD5Triangle();
          triangle.setIndex(Integer.parseInt(triMatcher.group(1)));
          triangle.setVertex0(Integer.parseInt(triMatcher.group(2)));
          triangle.setVertex1(Integer.parseInt(triMatcher.group(3)));
          triangle.setVertex2(Integer.parseInt(triMatcher.group(4)));
          triangles.add(triangle);
        }
      } else if (line.contains("weight")) {
        Matcher weightMatcher = PATTERN_WEIGHT.matcher(line);
        if (weightMatcher.matches()) {
          MD5Weight weight = new MD5Weight();
          weight.setIndex(Integer.parseInt(weightMatcher.group(1)));
          weight.setJointIndex(Integer.parseInt(weightMatcher.group(2)));
          weight.setBias(Float.parseFloat(weightMatcher.group(3)));
          float x = Float.parseFloat(weightMatcher.group(4));
          float y = Float.parseFloat(weightMatcher.group(5));
          float z = Float.parseFloat(weightMatcher.group(6));
          weight.setPosition(new Vector3f(x, y, z));
          weights.add(weight);
        }
      }
    }
    return mesh;
  }