Advertisement
jackd5011

Better OBJ parser for ThinMatrix engine

Aug 6th, 2019
217
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 4.42 KB | None | 0 0
  1. package objConverter;
  2.  
  3. import java.io.BufferedReader;
  4. import java.io.FileNotFoundException;
  5. import java.io.FileReader;
  6. import java.io.IOException;
  7. import java.util.ArrayList;
  8. import java.util.List;
  9.  
  10. public class OBJFileLoader {
  11.  
  12.     private static final String RES_LOC = "res/";
  13.  
  14.     public static ModelData loadOBJ(String objFileName) {
  15.         BufferedReader reader = null;
  16.         try {
  17.             reader = new BufferedReader(new FileReader(RES_LOC + objFileName + ".obj"));
  18.         } catch(FileNotFoundException e) {
  19.             System.err.println("OBJ file not found at: " + RES_LOC + objFileName + ".obj");
  20.             return null;
  21.         }
  22.  
  23.         // input data lists
  24.         List<Float> vertices = new ArrayList<Float>();
  25.         List<Float> texCoords = new ArrayList<Float>();
  26.         List<Float> normals = new ArrayList<Float>();
  27.  
  28.         // output data lists
  29.         List<Float> v = new ArrayList<Float>();
  30.         List<Float> t = new ArrayList<Float>();
  31.         List<Float> n = new ArrayList<Float>();
  32.         List<Integer> i = new ArrayList<Integer>();
  33.  
  34.         try {
  35.             for(String line = reader.readLine(); line != null; line = reader.readLine()) {
  36.                 String[] parts = line.split(" ");
  37.                 if(parts[0].equalsIgnoreCase("v")) { // vertex position
  38.                     vertices.add(Float.parseFloat(parts[1])); // x
  39.                     vertices.add(Float.parseFloat(parts[2])); // y
  40.                     vertices.add(Float.parseFloat(parts[3])); // z
  41.                 } else if(parts[0].equalsIgnoreCase("vt")) { // texture coordinate
  42.                     texCoords.add(Float.parseFloat(parts[1])); // u
  43.                     texCoords.add(1f - Float.parseFloat(parts[2])); // v
  44.                 } else if(parts[0].equalsIgnoreCase("vn")) { // normal vector
  45.                     normals.add(Float.parseFloat(parts[1])); // x
  46.                     normals.add(Float.parseFloat(parts[2])); // y
  47.                     normals.add(Float.parseFloat(parts[3])); // z
  48.                 } else if(parts[0].equalsIgnoreCase("f")) {
  49.                     int v0, v1, v2, v3, idx = v.size() / 3;
  50.                     switch(parts.length) {
  51.                     case 4: // triangle
  52.                         v0 = appendVertex(parts[1].split("/"), vertices, texCoords, normals, v, t, n, idx);
  53.                         v1 = appendVertex(parts[2].split("/"), vertices, texCoords, normals, v, t, n, idx + 1);
  54.                         v2 = appendVertex(parts[3].split("/"), vertices, texCoords, normals, v, t, n, idx + 2);
  55.                         i.add(v0);
  56.                         i.add(v1);
  57.                         i.add(v2);
  58.                         break;
  59.                     case 5: // quad
  60.                         v0 = appendVertex(parts[1].split("/"), vertices, texCoords, normals, v, t, n, idx);
  61.                         v1 = appendVertex(parts[2].split("/"), vertices, texCoords, normals, v, t, n, idx + 1);
  62.                         v2 = appendVertex(parts[3].split("/"), vertices, texCoords, normals, v, t, n, idx + 2);
  63.                         v3 = appendVertex(parts[4].split("/"), vertices, texCoords, normals, v, t, n, idx + 3);
  64.                         // triangle 1
  65.                         i.add(v0);
  66.                         i.add(v1);
  67.                         i.add(v2);
  68.                         // triangle 2
  69.                         i.add(v2);
  70.                         i.add(v3);
  71.                         i.add(v0);
  72.                         break;
  73.                     default: // unrecognized n-gon
  74.                         System.out.println("Unrecognized vertex size: " + (parts.length - 1));
  75.                         break;
  76.                     }
  77.                 }
  78.             }
  79.         } catch(Exception e) {
  80.             System.err.println("Failed to read OBJ model!");
  81.             e.printStackTrace(System.err);
  82.             return null;
  83.         } finally {
  84.             try {
  85.                 reader.close();
  86.             } catch (IOException e) {
  87.                 System.err.println("Failed to close reader!");
  88.                 e.printStackTrace();
  89.             }
  90.         }
  91.  
  92.         float[] vertexData = floatListToArray(v);
  93.         float[] textureData = floatListToArray(t);
  94.         float[] normalData = floatListToArray(n);
  95.         int[] indexData = intListToArray(i);
  96.        
  97.         return new ModelData(vertexData, textureData, normalData, indexData, 0f);
  98.     }
  99.  
  100.     private static int appendVertex(String[] vertex, List<Float> v, List<Float> t, List<Float> n, List<Float> ov, List<Float> ot, List<Float> on, int i) {
  101.         int vi = Integer.parseInt(vertex[0]) - 1;
  102.         int ti = Integer.parseInt(vertex[1]) - 1;
  103.         int ni = Integer.parseInt(vertex[2]) - 1;
  104.         // append vertex position
  105.         ov.add(v.get(vi*3));
  106.         ov.add(v.get(vi*3+1));
  107.         ov.add(v.get(vi*3+2));
  108.         // append texture coordinate
  109.         ot.add(t.get(ti*2));
  110.         ot.add(t.get(ti*2+1));
  111.         // append normal vector
  112.         on.add(n.get(ni*3));
  113.         on.add(n.get(ni*3+1));
  114.         on.add(n.get(ni*3+2));
  115.         // return index
  116.         return i;
  117.     }
  118.    
  119.     private static float[] floatListToArray(List<Float> list) {
  120.         float[] arr = new float[list.size()];
  121.         for(int i = 0; i < list.size(); i++) {
  122.             arr[i] = list.get(i);
  123.         }
  124.         return arr;
  125.     }
  126.    
  127.     private static int[] intListToArray(List<Integer> list) {
  128.         int[] arr = new int[list.size()];
  129.         for(int i = 0; i < list.size(); i++) {
  130.             arr[i] = list.get(i);
  131.         }
  132.         return arr;
  133.     }
  134.  
  135. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement