Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package labs.introtoprogramming.lab5.geometry;

import labs.introtoprogramming.lab5.io.obj.Polygon;
import labs.introtoprogramming.lab5.io.obj.Vertex;
import labs.introtoprogramming.lab5.object.Triangle;
import labs.introtoprogramming.lab5.scene.Transform;

import java.util.ArrayList;
import java.util.List;

public class Triangulation {

public List<Triangle> splitPolygons(List<Polygon> polygons) {
List<Triangle> triangles = new ArrayList<>();
for (Polygon pol : polygons) {
List<Vertex> ver = pol.getVertices();
Vector3 pillar = ver.get(0).geometry;
for (int i = 1; i < ver.size() - 1; i++) {
triangles.add(new Triangle(new Transform(),
pillar, ver.get(i).geometry, ver.get(i + 1).geometry));
}
}
System.out.println(triangles.size());
return triangles;
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,12 @@
package labs.introtoprogramming.lab5.io.obj;

import labs.introtoprogramming.lab5.object.Triangle;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

public interface ObjReader {
void load(InputStream is) throws IOException;
List<Triangle> getPolygons();
}
117 changes: 117 additions & 0 deletions src/main/java/labs/introtoprogramming/lab5/io/obj/ParseObjFile.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,117 @@
package labs.introtoprogramming.lab5.io.obj;

import labs.introtoprogramming.lab5.geometry.Triangulation;
import labs.introtoprogramming.lab5.geometry.Vector3;
import labs.introtoprogramming.lab5.object.PolygonObject;
import labs.introtoprogramming.lab5.object.Triangle;
import labs.introtoprogramming.lab5.scene.SceneObject;
import labs.introtoprogramming.lab5.scene.Transform;

import java.io.*;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;

public class ParseObjFile implements ObjReader {
/**
* String indicators of parameter in .obj file.
*/
private final static String OBJ_VERTEX_NORMAL = "vn";
private final static String OBJ_VERTEX = "v";
private final static String OBJ_FACE = "f";
private List<Vector3> verticesNormals = new ArrayList<>();
private List<Vector3> verticesGeometry = new ArrayList<>();
private List<Polygon> polygons = new ArrayList<>();
private Triangulation triangulation = new Triangulation();

/**
* This is part to parse object file
* @param is
* @throws FileNotFoundException
* @throws IOException
*/
public void load(InputStream is) throws IOException {
InputStreamReader fileReader;
BufferedReader bufferedReader;
fileReader = new InputStreamReader(is, StandardCharsets.UTF_8);
bufferedReader = new BufferedReader(fileReader);
String line;

// read .obj file
while ((line = bufferedReader.readLine()) != null) {
line = line.trim();

if (line.isEmpty()) {
continue;
}

// cases to process
if (line.startsWith(OBJ_VERTEX_NORMAL)) {
processVertexNormal(line);
// add vertex with some coordinates
} else if (line.startsWith(OBJ_VERTEX)) {
processVertex(line);
} else if (line.startsWith(OBJ_FACE)) {
processFace(line);
}
}
bufferedReader.close();
}

public List<Triangle> getPolygons() {
return triangulation.splitPolygons(polygons);
}
/**
* Create vertex( just coordinates of each one) from data of file.
* @param line
*/
private void processVertex(String line) {
String[] values = line.replaceAll("\\s+", " ").split(" ");
double[] result = new double[3];
for (int i = 1; i < values.length; i++) {
result[i - 1] = Double.parseDouble(values[i]);
}
verticesGeometry.add(new Vector3(result[0], result[1], result[2]));
}
/**
* Create normal-data of vertex
* @param line
*/
private void processVertexNormal(String line) {
String[] values = line.replaceAll("\\s+", " ").split(" ");
double[] result = new double[3];
for (int i = 1; i < values.length; i++) {
result[i - 1] = Double.parseDouble(values[i]);
}
verticesNormals.add(new Vector3(result[0], result[1], result[2]));
}


private void processFace(String line) {
line = line.substring(OBJ_FACE.length()).trim();
polygons.add(parseCodeLine(line));
}

private Polygon parseCodeLine(String list) {
if (list == null) {
return null;
}
if (list.equals("")) {
return null;
}
String[] vertexStrings = list.split(" ");
List<Vertex> vertices = new ArrayList<>();

for (int i = 0; i < vertexStrings.length; i++) {
String[] temp = vertexStrings[i].split("/");
Vector3 geometry = verticesGeometry.get(Integer.parseInt(temp[0]) - 1);
int index = -1;
if (temp.length >= 3) {
index = Integer.parseInt(temp[2]);
}
Vector3 normal = index == -1 ? Vector3.ZERO : verticesNormals.get(index - 1);
vertices.add(new Vertex(geometry, normal));
}
return new Polygon(vertices);
}
}
15 changes: 15 additions & 0 deletions src/main/java/labs/introtoprogramming/lab5/io/obj/Polygon.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package labs.introtoprogramming.lab5.io.obj;

import java.util.List;

public class Polygon {
private List<Vertex> vertices;

public Polygon(List<Vertex> vertices) {
this.vertices = vertices;
}

public List<Vertex> getVertices() {
return vertices;
}
}
16 changes: 16 additions & 0 deletions src/main/java/labs/introtoprogramming/lab5/io/obj/Vertex.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package labs.introtoprogramming.lab5.io.obj;

import labs.introtoprogramming.lab5.geometry.Vector3;

public class Vertex {
/**
* Vertex parameters: geometry coordinates and coordinates of normals
*/
public Vector3 geometry;
public Vector3 normal;

public Vertex(Vector3 geometry, Vector3 normal) {
this.geometry = geometry;
this.normal = normal;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,9 @@ public class OptimizedObject extends SceneObject {

public OptimizedObject(Transform transform, List<SceneObject> objects) {
super(transform);
for (SceneObject obj : objects) {
obj.getTransform().setParent(transform);
}
tree = new KDTree(objects);
}

Expand Down

This file was deleted.

This file was deleted.

Loading