List<Vector3f> flatNormals = new ArrayList<>();
//from row two and no. points rows forward
List<Vector3f> vertices = new ArrayList<>();
Vector3f min = null;
Vector3f max = null;
for(int row = 2; row < points+2; row++){
String[] line = lines.get(row).split("\\s+");
normalLists.add(new ArrayList<Vector3f>());
Vector3f vertex = new Vector3f(
Float.parseFloat(line[0]),
Float.parseFloat(line[1]),
Float.parseFloat(line[2]));
vertices.add(vertex);
if(min == null) min = vertex;
if(max == null) max = vertex;
if(vertex.x > max.x) max = new Vector3f(vertex.x, max.y, max.z);
if(vertex.y > max.y) max = new Vector3f(max.x, vertex.y, max.z);
if(vertex.z > max.z) max = new Vector3f(max.x, max.y, vertex.z);
if(vertex.x < min.x) min = new Vector3f(vertex.x, min.y, min.z);
if(vertex.y < min.y) min = new Vector3f(min.x, vertex.y, min.z);
if(vertex.z < min.z) min = new Vector3f(min.x, min.y, vertex.z);
}
Vector3f lengths = max.subtract(min);
float maxLength = Math.max(Math.max(lengths.x, lengths.y), lengths.z);
Vector3f midPoint = Vector3f.sum(max, min).scale(-0.5);
normalization = Matrix4f.product(
Matrix4f.scale(1.0/maxLength),
Matrix4f.translation(midPoint));
List<Integer> indices = new ArrayList<>();
//indices start at row 2+points, every row's a face
for(int row = 2+points; row < faces+points+2; row++){
String[] line = lines.get(row).split("\\s+");
//calculate the normal
Vector3f v1 = vertices.get(Integer.parseInt(line[1]));
Vector3f v2 = vertices.get(Integer.parseInt(line[2]));
Vector3f v3 = vertices.get(Integer.parseInt(line[3]));
Vector3f normal = Vector3f.cross(
v2.subtract(v1).unit(),
v3.subtract(v1).unit()).unit();
//System.out.println("Normal: "+normal);
if(smooth) for(int i = 0; i < Integer.parseInt(line[0]); i++){
normalLists.get(Integer.parseInt(line[i+1])).add(normal);
}
//triangulate and add indices to index list.
for(int i = 0; i < Integer.parseInt(line[0])-2; i++){
indices.add(Integer.parseInt(line[1]));
indices.add(Integer.parseInt(line[i+2]));
indices.add(Integer.parseInt(line[i+3]));
if(!smooth){
flatNormals.add(normal);
flatNormals.add(normal);
flatNormals.add(normal);
}
}
}
//create buffer of indices here TODO
float[] dataBuffer;
int[] indexBuffer;
if(smooth){
dataBuffer = new float[vertices.size()*elements];
indexBuffer = new int[indices.size()];
for(int i = 0; i < indices.size(); i++){
indexBuffer[i] = indices.get(i);
}
for(int i = 0; i < vertices.size(); i++){
Vector3f vertex = vertices.get(i);
dataBuffer[i*elements] = vertex.x;
dataBuffer[i*elements+1] = vertex.y;
dataBuffer[i*elements+2] = vertex.z;
Vector3f normal = new Vector3f(0, 0, 0);
for(Vector3f normalTerm : normalLists.get(i)){
normal = normal.add(normalTerm);
}
normal = normal.scale(1.0/normalLists.get(i).size());
//normal = new Vector3f(1, 0, 0);
dataBuffer[i*elements+3] = normal.x;
dataBuffer[i*elements+4] = normal.y;
dataBuffer[i*elements+5] = normal.z;
dataBuffer[i*elements+6] = vertex.x;
dataBuffer[i*elements+7] = vertex.y;
}
}
else{
dataBuffer = new float[indices.size()*elements];
indexBuffer = new int[indices.size()];
for(int i = 0; i < indices.size(); i++){
indexBuffer[i] = i;
//Positions
Vector3f vertex = vertices.get(indices.get(i));
dataBuffer[i*elements] = vertex.x;
dataBuffer[i*elements+1] = vertex.y;
dataBuffer[i*elements+2] = vertex.z;
//Normals
Vector3f normal = flatNormals.get(i);
dataBuffer[i*elements+3] = normal.x;
dataBuffer[i*elements+4] = normal.y;
dataBuffer[i*elements+5] = normal.z;
//UVs