package renderEngine; import java.io.BufferedReader; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.util.ArrayList; import java.util.List; import javax.vecmath.Vector2f; import javax.vecmath.Vector3f; import models.RawModel; public class OBJLoader { public static RawModel loadObjModel(String fileName, Loader loader) { FileReader fr = null; try { fr = new FileReader(new File("res/" + fileName + ".obj")); } catch (FileNotFoundException e) { System.out.println("Couldn't load file! " + fileName); e.printStackTrace(); } BufferedReader reader = new BufferedReader(fr); String line; List vertices = new ArrayList(); List textures = new ArrayList(); List normals = new ArrayList(); List indices = new ArrayList(); float[] verticesArray = null; float[] normalsArray = null; float[] texturesArray = null; int[] indicesArray = null; try { while(true) { line = reader.readLine(); String[] currentLine = line.split(" "); if (line.startsWith("v ")) { Vector3f vertex = new Vector3f(Float.parseFloat(currentLine[1]), Float.parseFloat(currentLine[2]), Float.parseFloat(currentLine[3])); vertices.add(vertex); } else if (line.startsWith("vt ")) { Vector2f texture = new Vector2f(Float.parseFloat(currentLine[1]), Float.parseFloat(currentLine[2])); textures.add(texture); } else if (line.startsWith("vn ")) { Vector3f normal = new Vector3f(Float.parseFloat(currentLine[1]), Float.parseFloat(currentLine[2]), Float.parseFloat(currentLine[3])); normals.add(normal); } else if (line.startsWith("f ")) { texturesArray = new float[vertices.size()*2]; normalsArray = new float[vertices.size()*3]; break; } } while(line != null) { if (!line.startsWith("f ")) { line = reader.readLine(); continue; } String[] currentLine = line.split(" "); String[] vertex1 = currentLine[1].split("/"); String[] vertex2 = currentLine[2].split("/"); String[] vertex3 = currentLine[3].split("/"); processVertex(vertex1, indices, textures, normals, texturesArray, normalsArray); processVertex(vertex2, indices, textures, normals, texturesArray, normalsArray); processVertex(vertex3, indices, textures, normals, texturesArray, normalsArray); line = reader.readLine(); } reader.close(); } catch (Exception e) { e.printStackTrace(); } verticesArray = new float[vertices.size()*3]; indicesArray = new int[indices.size()*3]; int vertexPointer = 0; for (Vector3f vertex: vertices) { verticesArray[vertexPointer++] = vertex.x; verticesArray[vertexPointer++] = vertex.y; verticesArray[vertexPointer++] = vertex.z; } for (int iii=0; iii indices, List textures, List normals, float[] textureArray, float[] normalsArray) { int currentVertexPointer = Integer.parseInt(vertexData[0]) - 1; indices.add(currentVertexPointer); Vector2f currentTex = textures.get(Integer.parseInt(vertexData[1])-1); textureArray[currentVertexPointer*2] = currentTex.x; textureArray[currentVertexPointer*2+1] = currentTex.y; Vector3f currentNorm = normals.get(Integer.parseInt(vertexData[2])-1); normalsArray[currentVertexPointer*3] = currentNorm.x; normalsArray[currentVertexPointer*3+1] = currentNorm.y; normalsArray[currentVertexPointer*3+2] = currentNorm.z; } }