Advertisement
Guest User

Untitled

a guest
Mar 22nd, 2021
134
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.23 KB | None | 0 0
  1. public RawModel loadObjModel(String fileName) {
  2. FileReader fr = null;
  3. try {
  4. fr = new FileReader(new File("res\\" + fileName + ".obj"));
  5. BufferedReader reader = new BufferedReader(fr);
  6.  
  7. List<Vector3f> vertices = new ArrayList<>();
  8. List<Vector2f> textures = new ArrayList<>();
  9. List<Vector3f> normals = new ArrayList<>();
  10. List<Integer> indices = new ArrayList<>();
  11. List<Face> faces = new ArrayList<>();
  12.  
  13. String line;
  14. while((line = reader.readLine()) != null) {
  15.  
  16. if(line == null || line.equals("") || line.startsWith("#")) {
  17. }
  18. else {
  19. String[] split = line.split(" ");
  20. switch(split[0]) {
  21. case "v" :
  22. vertices.add(new Vector3f(
  23. Float.parseFloat(split[1]),
  24. Float.parseFloat(split[2]),
  25. Float.parseFloat(split[3])));
  26. break;
  27. case "vn" :
  28. normals.add(new Vector3f(
  29. Float.parseFloat(split[1]),
  30. Float.parseFloat(split[2]),
  31. Float.parseFloat(split[3])));
  32. break;
  33. case "vt" :
  34. textures.add(new Vector2f(
  35. Float.parseFloat(split[1]),
  36. Float.parseFloat(split[2])));
  37. break;
  38. case "f" :
  39. faces.add(new Face(
  40. new int[] {
  41. Integer.parseInt(split[1].split("/")[0]),
  42. Integer.parseInt(split[2].split("/")[0]),
  43. Integer.parseInt(split[3].split("/")[0])
  44. },
  45. new int[] {
  46. Integer.parseInt(split[1].split("/")[1]),
  47. Integer.parseInt(split[2].split("/")[1]),
  48. Integer.parseInt(split[3].split("/")[1])
  49. },
  50. new int[] {
  51. Integer.parseInt(split[1].split("/")[2]),
  52. Integer.parseInt(split[2].split("/")[2]),
  53. Integer.parseInt(split[3].split("/")[2])
  54. }));
  55. break;
  56. }
  57. }
  58. }
  59. reader.close();
  60.  
  61. Map<Integer, Float> addedNormals = new HashMap<>();
  62. Map<Integer, Float> addedTextures = new HashMap<>();
  63.  
  64. for(Face face : faces) {
  65.  
  66. boolean foundSeam0 = false;
  67. for(int i = 0; i < 3; i++) {
  68.  
  69. int currentVertexPointer = face.getVertices()[i] - 1;
  70. indices.add(currentVertexPointer);
  71.  
  72. Vector2f tex = textures.get(face.getTextureCoords()[i] - 1);
  73.  
  74. if(tex.x == 0) {
  75. foundSeam0 = true;
  76. }
  77.  
  78. addedTextures.put(currentVertexPointer * 2 + 0, tex.x);
  79. addedTextures.put(currentVertexPointer * 2 + 1, 1 - tex.y);
  80.  
  81. Vector3f currentNorm = normals.get(face.getNormals()[i] - 1);
  82. addedNormals.put(currentVertexPointer * 3, currentNorm.x);
  83. addedNormals.put(currentVertexPointer * 3 + 1, currentNorm.y);
  84. addedNormals.put(currentVertexPointer * 3 + 2, currentNorm.z);
  85. }
  86.  
  87. // THIS IS MY ATTEMPTED FIX.
  88. // if(foundSeam0) {
  89. // for(int i = 0; i < 3; i++) {
  90. //
  91. // int currentVertexPointer = face.getVertices()[i] - 1;
  92. // indices.add(currentVertexPointer);
  93. //
  94. // Vector2f tex = textures.get(face.getTextureCoords()[i] - 1);
  95. //
  96. // addedTextures.put(currentVertexPointer * 2 + 0, tex.x == 0 ? 1 : tex.x);
  97. // addedTextures.put(currentVertexPointer * 2 + 1, 1 - tex.y);
  98. //
  99. // Vector3f currentNorm = normals.get(face.getNormals()[i] - 1);
  100. // addedNormals.put(currentVertexPointer * 3 + 0, currentNorm.x);
  101. // addedNormals.put(currentVertexPointer * 3 + 1, currentNorm.y);
  102. // addedNormals.put(currentVertexPointer * 3 + 2, currentNorm.z);
  103. //
  104. // Vector3f vertex = vertices.get(currentVertexPointer);
  105. // vertices.add(new Vector3f(vertex.x, vertex.y, vertex.z));
  106. // }
  107. // }
  108.  
  109.  
  110. }
  111.  
  112. float[] normalsArray = new float[addedNormals.size()];
  113. float[] textureArray = new float[addedTextures.size()];
  114.  
  115. for(Entry<Integer, Float> set : addedNormals.entrySet()) {
  116. normalsArray[set.getKey()] = set.getValue();
  117. }
  118. for(Entry<Integer, Float> set : addedTextures.entrySet()) {
  119. textureArray[set.getKey()] = set.getValue();
  120. }
  121.  
  122. int vertexPointer = 0;
  123. float[] verticesArray = new float[vertices.size() * 3];
  124. for(Vector3f vertex : vertices) {
  125. verticesArray[vertexPointer++] = vertex.x;
  126. verticesArray[vertexPointer++] = vertex.y;
  127. verticesArray[vertexPointer++] = vertex.z;
  128. }
  129.  
  130. int[] indicesArray = new int[indices.size()];
  131. for(int i = 0; i < indices.size(); i++) {
  132. indicesArray[i] = indices.get(i);
  133. }
  134.  
  135. BufferedImage map = ImageIO.read(new File("res\\moon.png"));
  136. Graphics2D g = (Graphics2D) map.getGraphics();
  137. g.setStroke(new BasicStroke(2f));
  138. g.setColor(Color.BLACK);
  139.  
  140. for(int index = 0; index + 6 < textureArray.length;) {
  141.  
  142. int x0 = (int) (textureArray[index++] * map.getWidth());
  143. int y0 = (int) (textureArray[index++] * map.getHeight());
  144.  
  145. int x1 = (int) (textureArray[index++] * map.getWidth());
  146. int y1 = (int) (textureArray[index++] * map.getHeight());
  147.  
  148. int x2 = (int) (textureArray[index++] * map.getWidth());
  149. int y2 = (int) (textureArray[index++] * map.getHeight());
  150.  
  151. g.drawLine(x0, y0, x1, y1);
  152. g.drawLine(x1, y1, x2, y2);
  153. g.drawLine(x2, y2, x0, y0);
  154.  
  155. }
  156.  
  157. ImageIO.write(map, "png", new File("res\\edit.png"));
  158.  
  159. return this.loadToVAO(verticesArray, textureArray, normalsArray, indicesArray);
  160. }
  161. catch(Exception e) {
  162. e.printStackTrace();
  163. }
  164.  
  165. return null;
  166.  
  167. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement