Advertisement
Guest User

OBJLoader

a guest
Jan 22nd, 2016
3,062
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 3.74 KB | None | 0 0
  1. package renderEngine;
  2.  
  3. import java.io.BufferedReader;
  4. import java.io.File;
  5. import java.io.FileNotFoundException;
  6. import java.io.FileReader;
  7. import java.util.ArrayList;
  8. import java.util.List;
  9.  
  10. import org.lwjgl.util.vector.Vector2f;
  11. import org.lwjgl.util.vector.Vector3f;
  12.  
  13. import models.RawModel;
  14.  
  15. public class OBJLoader {
  16.  
  17.     public static RawModel loadObjModel(String fileName, Loader loader) {
  18.         FileReader fr = null;
  19.         try {
  20.             fr = new FileReader(new File("res/" + fileName + ".obj"));
  21.         } catch (FileNotFoundException e) {
  22.             System.err.println("Couldn't load file!");
  23.             e.printStackTrace();
  24.         }
  25.         BufferedReader reader = new BufferedReader(fr);
  26.         String line;
  27.         List<Vector3f> vertices = new ArrayList<Vector3f>();
  28.         List<Vector2f> textures = new ArrayList<Vector2f>();
  29.         List<Vector3f> normals = new ArrayList<Vector3f>();
  30.         List<Integer> indices = new ArrayList<Integer>();
  31.         float[] verticesArray = null;
  32.         float[] normalsArray = null;
  33.         float[] textureArray = null;
  34.         int[] indicesArray = null;
  35.         try {
  36.             while (true) {
  37.                 line = reader.readLine();
  38.                 String[] currentLine = line.split(" ");
  39.                 if (line.startsWith("v ")) {
  40.                     Vector3f vertex = new Vector3f(Float.parseFloat(currentLine[1]), Float.parseFloat(currentLine[2]),
  41.                             Float.parseFloat(currentLine[3]));
  42.                     vertices.add(vertex);
  43.                 } else if (line.startsWith("vt ")) {
  44.                     Vector2f texture = new Vector2f(Float.parseFloat(currentLine[1]), Float.parseFloat(currentLine[2]));
  45.                     textures.add(texture);
  46.                 } else if (line.startsWith("vn ")) {
  47.                     Vector3f normal = new Vector3f(Float.parseFloat(currentLine[1]), Float.parseFloat(currentLine[2]),
  48.                             Float.parseFloat(currentLine[3]));
  49.                     normals.add(normal);
  50.                 } else if (line.startsWith("f ")) {
  51.                     textureArray = new float[vertices.size() * 2];
  52.                     normalsArray = new float[vertices.size() * 3];
  53.                     break;
  54.                 }
  55.             }
  56.             while (line != null) {
  57.                 if (!line.startsWith("f ")) {
  58.                     line = reader.readLine();
  59.                     continue;
  60.                 }
  61.                 String[] currentLine = line.split(" ");
  62.                 String[] vertex1 = currentLine[1].split("/");
  63.                 String[] vertex2 = currentLine[2].split("/");
  64.                 String[] vertex3 = currentLine[3].split("/");
  65.  
  66.                 processVertex(vertex1, indices, textures, normals, textureArray, normalsArray);
  67.                 processVertex(vertex2, indices, textures, normals, textureArray, normalsArray);
  68.                 processVertex(vertex3, indices, textures, normals, textureArray, normalsArray);
  69.                 line = reader.readLine();
  70.             }
  71.             reader.close();
  72.         } catch (Exception e) {
  73.             e.printStackTrace();
  74.         }
  75.  
  76.         verticesArray = new float[vertices.size() * 3];
  77.         indicesArray = new int[indices.size()];
  78.  
  79.         int vertexPointer = 0;
  80.         for (Vector3f vertex : vertices) {
  81.             verticesArray[vertexPointer++] = vertex.x;
  82.             verticesArray[vertexPointer++] = vertex.y;
  83.             verticesArray[vertexPointer++] = vertex.z;
  84.         }
  85.         for (int i = 0; i < indices.size(); i++) {
  86.             indicesArray[i] = indices.get(i);
  87.         }
  88.         return loader.loadToVAO(verticesArray, textureArray, indicesArray);
  89.     }
  90.  
  91.     private static void processVertex(String[] vertexData, List<Integer> indices, List<Vector2f> textures,
  92.             List<Vector3f> normals, float[] textureArray, float[] normalsArray) {
  93.         int currentVertexPointer = Integer.parseInt(vertexData[0]) - 1;
  94.         indices.add(currentVertexPointer);
  95.         Vector2f currentTex = textures.get(Integer.parseInt(vertexData[1]) - 1);
  96.         textureArray[currentVertexPointer * 2] = currentTex.x;
  97.         textureArray[currentVertexPointer * 2 + 1] = 1 - currentTex.y;
  98.         Vector3f currentNorm = normals.get(Integer.parseInt(vertexData[2]) - 1);
  99.         normalsArray[currentVertexPointer * 3] = currentNorm.x;
  100.         normalsArray[currentVertexPointer * 3 + 1] = currentNorm.y;
  101.         normalsArray[currentVertexPointer * 3 + 2] = currentNorm.z;
  102.     }
  103. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement