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