Advertisement
ThinMatrix

Obj Loader from Tuts

May 4th, 2020
903
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 models.RawModel;
  11.  
  12. import org.lwjgl.util.vector.Vector2f;
  13. import org.lwjgl.util.vector.Vector3f;
  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.  
  37.             while (true) {
  38.                 line = reader.readLine();
  39.                 String[] currentLine = line.split(" ");
  40.                 if (line.startsWith("v ")) {
  41.                     Vector3f vertex = new Vector3f(Float.parseFloat(currentLine[1]),
  42.                             Float.parseFloat(currentLine[2]), Float.parseFloat(currentLine[3]));
  43.                     vertices.add(vertex);
  44.                 } else if (line.startsWith("vt ")) {
  45.                     Vector2f texture = new Vector2f(Float.parseFloat(currentLine[1]),
  46.                             Float.parseFloat(currentLine[2]));
  47.                     textures.add(texture);
  48.                 } else if (line.startsWith("vn ")) {
  49.                     Vector3f normal = new Vector3f(Float.parseFloat(currentLine[1]),
  50.                             Float.parseFloat(currentLine[2]), Float.parseFloat(currentLine[3]));
  51.                     normals.add(normal);
  52.                 } else if (line.startsWith("f ")) {
  53.                     textureArray = new float[vertices.size() * 2];
  54.                     normalsArray = new float[vertices.size() * 3];
  55.                     break;
  56.                 }
  57.             }
  58.  
  59.             while (line != null) {
  60.                 if (!line.startsWith("f ")) {
  61.                     line = reader.readLine();
  62.                     continue;
  63.                 }
  64.                 String[] currentLine = line.split(" ");
  65.                 String[] vertex1 = currentLine[1].split("/");
  66.                 String[] vertex2 = currentLine[2].split("/");
  67.                 String[] vertex3 = currentLine[3].split("/");
  68.                
  69.                 processVertex(vertex1,indices,textures,normals,textureArray,normalsArray);
  70.                 processVertex(vertex2,indices,textures,normals,textureArray,normalsArray);
  71.                 processVertex(vertex3,indices,textures,normals,textureArray,normalsArray);
  72.                 line = reader.readLine();
  73.             }
  74.             reader.close();
  75.  
  76.         } catch (Exception e) {
  77.             e.printStackTrace();
  78.         }
  79.        
  80.         verticesArray = new float[vertices.size()*3];
  81.         indicesArray = new int[indices.size()];
  82.        
  83.         int vertexPointer = 0;
  84.         for(Vector3f vertex:vertices){
  85.             verticesArray[vertexPointer++] = vertex.x;
  86.             verticesArray[vertexPointer++] = vertex.y;
  87.             verticesArray[vertexPointer++] = vertex.z;
  88.         }
  89.        
  90.         for(int i=0;i<indices.size();i++){
  91.             indicesArray[i] = indices.get(i);
  92.         }
  93.         return loader.loadToVAO(verticesArray, textureArray, normalsArray, indicesArray);
  94.  
  95.     }
  96.  
  97.     private static void processVertex(String[] vertexData, List<Integer> indices,
  98.             List<Vector2f> textures, List<Vector3f> normals, float[] textureArray,
  99.             float[] normalsArray) {
  100.         int currentVertexPointer = Integer.parseInt(vertexData[0]) - 1;
  101.         indices.add(currentVertexPointer);
  102.         Vector2f currentTex = textures.get(Integer.parseInt(vertexData[1])-1);
  103.         textureArray[currentVertexPointer*2] = currentTex.x;
  104.         textureArray[currentVertexPointer*2+1] = 1 - currentTex.y;
  105.         Vector3f currentNorm = normals.get(Integer.parseInt(vertexData[2])-1);
  106.         normalsArray[currentVertexPointer*3] = currentNorm.x;
  107.         normalsArray[currentVertexPointer*3+1] = currentNorm.y;
  108.         normalsArray[currentVertexPointer*3+2] = currentNorm.z;
  109.     }
  110.  
  111. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement