Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- public RawModel loadObjModel(String fileName) {
- FileReader fr = null;
- try {
- fr = new FileReader(new File("res\\" + fileName + ".obj"));
- BufferedReader reader = new BufferedReader(fr);
- List<Vector3f> vertices = new ArrayList<>();
- List<Vector2f> textures = new ArrayList<>();
- List<Vector3f> normals = new ArrayList<>();
- List<Integer> indices = new ArrayList<>();
- List<Face> faces = new ArrayList<>();
- String line;
- while((line = reader.readLine()) != null) {
- if(line == null || line.equals("") || line.startsWith("#")) {
- }
- else {
- String[] split = line.split(" ");
- switch(split[0]) {
- case "v" :
- vertices.add(new Vector3f(
- Float.parseFloat(split[1]),
- Float.parseFloat(split[2]),
- Float.parseFloat(split[3])));
- break;
- case "vn" :
- normals.add(new Vector3f(
- Float.parseFloat(split[1]),
- Float.parseFloat(split[2]),
- Float.parseFloat(split[3])));
- break;
- case "vt" :
- textures.add(new Vector2f(
- Float.parseFloat(split[1]),
- Float.parseFloat(split[2])));
- break;
- case "f" :
- faces.add(new Face(
- new int[] {
- Integer.parseInt(split[1].split("/")[0]),
- Integer.parseInt(split[2].split("/")[0]),
- Integer.parseInt(split[3].split("/")[0])
- },
- new int[] {
- Integer.parseInt(split[1].split("/")[1]),
- Integer.parseInt(split[2].split("/")[1]),
- Integer.parseInt(split[3].split("/")[1])
- },
- new int[] {
- Integer.parseInt(split[1].split("/")[2]),
- Integer.parseInt(split[2].split("/")[2]),
- Integer.parseInt(split[3].split("/")[2])
- }));
- break;
- }
- }
- }
- reader.close();
- Map<Integer, Float> addedNormals = new HashMap<>();
- Map<Integer, Float> addedTextures = new HashMap<>();
- for(Face face : faces) {
- boolean foundSeam0 = false;
- for(int i = 0; i < 3; i++) {
- int currentVertexPointer = face.getVertices()[i] - 1;
- indices.add(currentVertexPointer);
- Vector2f tex = textures.get(face.getTextureCoords()[i] - 1);
- if(tex.x == 0) {
- foundSeam0 = true;
- }
- addedTextures.put(currentVertexPointer * 2 + 0, tex.x);
- addedTextures.put(currentVertexPointer * 2 + 1, 1 - tex.y);
- Vector3f currentNorm = normals.get(face.getNormals()[i] - 1);
- addedNormals.put(currentVertexPointer * 3, currentNorm.x);
- addedNormals.put(currentVertexPointer * 3 + 1, currentNorm.y);
- addedNormals.put(currentVertexPointer * 3 + 2, currentNorm.z);
- }
- // THIS IS MY ATTEMPTED FIX.
- // if(foundSeam0) {
- // for(int i = 0; i < 3; i++) {
- //
- // int currentVertexPointer = face.getVertices()[i] - 1;
- // indices.add(currentVertexPointer);
- //
- // Vector2f tex = textures.get(face.getTextureCoords()[i] - 1);
- //
- // addedTextures.put(currentVertexPointer * 2 + 0, tex.x == 0 ? 1 : tex.x);
- // addedTextures.put(currentVertexPointer * 2 + 1, 1 - tex.y);
- //
- // Vector3f currentNorm = normals.get(face.getNormals()[i] - 1);
- // addedNormals.put(currentVertexPointer * 3 + 0, currentNorm.x);
- // addedNormals.put(currentVertexPointer * 3 + 1, currentNorm.y);
- // addedNormals.put(currentVertexPointer * 3 + 2, currentNorm.z);
- //
- // Vector3f vertex = vertices.get(currentVertexPointer);
- // vertices.add(new Vector3f(vertex.x, vertex.y, vertex.z));
- // }
- // }
- }
- float[] normalsArray = new float[addedNormals.size()];
- float[] textureArray = new float[addedTextures.size()];
- for(Entry<Integer, Float> set : addedNormals.entrySet()) {
- normalsArray[set.getKey()] = set.getValue();
- }
- for(Entry<Integer, Float> set : addedTextures.entrySet()) {
- textureArray[set.getKey()] = set.getValue();
- }
- int vertexPointer = 0;
- float[] verticesArray = new float[vertices.size() * 3];
- for(Vector3f vertex : vertices) {
- verticesArray[vertexPointer++] = vertex.x;
- verticesArray[vertexPointer++] = vertex.y;
- verticesArray[vertexPointer++] = vertex.z;
- }
- int[] indicesArray = new int[indices.size()];
- for(int i = 0; i < indices.size(); i++) {
- indicesArray[i] = indices.get(i);
- }
- BufferedImage map = ImageIO.read(new File("res\\moon.png"));
- Graphics2D g = (Graphics2D) map.getGraphics();
- g.setStroke(new BasicStroke(2f));
- g.setColor(Color.BLACK);
- for(int index = 0; index + 6 < textureArray.length;) {
- int x0 = (int) (textureArray[index++] * map.getWidth());
- int y0 = (int) (textureArray[index++] * map.getHeight());
- int x1 = (int) (textureArray[index++] * map.getWidth());
- int y1 = (int) (textureArray[index++] * map.getHeight());
- int x2 = (int) (textureArray[index++] * map.getWidth());
- int y2 = (int) (textureArray[index++] * map.getHeight());
- g.drawLine(x0, y0, x1, y1);
- g.drawLine(x1, y1, x2, y2);
- g.drawLine(x2, y2, x0, y0);
- }
- ImageIO.write(map, "png", new File("res\\edit.png"));
- return this.loadToVAO(verticesArray, textureArray, normalsArray, indicesArray);
- }
- catch(Exception e) {
- e.printStackTrace();
- }
- return null;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement