package otherSupport;

import java.io.DataInputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.IntBuffer;
import java.nio.ShortBuffer;
import java.nio.channels.FileChannel;

public class BinarySTLFile {

	public static class Triangles {
		public int count;
		public 	byte header[];
		public double normal[][];
		public double vertex1[][];
		public double vertex2[][];
		public double vertex3[][];
		public short attribByteCount[];
	}
	
	public final static Triangles mustRead(String fileName) {
		try {
			return read(fileName);
		} catch (IOException e) {
			throw new RuntimeException(e);
		}
	}
	
	public final static Triangles read(String fileName) throws IOException {
		Triangles ret = new Triangles();
		
		FileInputStream file = new FileInputStream(fileName);		
		FileChannel chan = file.getChannel();
			
		ret.header = new byte[80];
		chan.read(ByteBuffer.wrap(ret.header));
		
		ByteBuffer buff = ByteBuffer.allocate(4);
		chan.read(buff);
		buff.flip();
		buff.order(ByteOrder.LITTLE_ENDIAN);
		ret.count = buff.getInt();
		
		ret.normal = new double[ret.count][3];
		ret.vertex1 = new double[ret.count][3];
		ret.vertex2 = new double[ret.count][3];
		ret.vertex3 = new double[ret.count][3];
		ret.attribByteCount = new short[ret.count];
		
		buff = ByteBuffer.allocate(50);
		buff.order(ByteOrder.LITTLE_ENDIAN);
		
		for(int i=0; i < ret.count; i++){
			buff.rewind();
			chan.read(buff);
			buff.flip();
			ret.normal[i][0] = buff.getFloat();
			ret.normal[i][1] = buff.getFloat();
			ret.normal[i][2] = buff.getFloat();

			ret.vertex1[i][0] = buff.getFloat();
			ret.vertex1[i][1] = buff.getFloat();
			ret.vertex1[i][2] = buff.getFloat();

			ret.vertex2[i][0] = buff.getFloat();
			ret.vertex2[i][1] = buff.getFloat();
			ret.vertex2[i][2] = buff.getFloat();

			ret.vertex3[i][0] = buff.getFloat();
			ret.vertex3[i][1] = buff.getFloat();
			ret.vertex3[i][2] = buff.getFloat();
			
			ret.attribByteCount[i] = buff.getShort();
		}
		
		file.close();
		
		return ret;
	}
}
