package com.framsticks.net.client3D.graphics.loaders;

//import java.io.BufferedReader;
//import java.io.FileReader;
//import java.io.IOException;
//import java.util.StringTokenizer;
//import java.util.ArrayList;

/**
 * Zaczątki loadra do plikow AC3D, zarzucone, przeszedlem na format OBJ
 * 
 * @author vorg
 */
public class AC3DLoader {
//	public static Mesh load(String filePath) throws IOException {
//		return load(new BufferedReader(new FileReader(filePath))); 		
//	}
//	
//	public static Mesh load(BufferedReader reader) throws IOException {
//		Mesh mesh = new Mesh();
//		String line;
//		while((line = reader.readLine()) != null) {
//			StringTokenizer tokens = new StringTokenizer(line, " ");
//			String section = tokens.nextToken();
//			if (section.equals("AC3Db")) {
//				System.out.println("AC3Db start");
//			}
//			else if (section.equals("MATERIAL")){			
//				readMaterial(tokens, reader, mesh);
//			}
//			else if (section.equals("OBJECT")) {				
//				readObject(tokens.nextToken(), reader, mesh);
//			}
//		}
//		
//		System.out.println("done");
//
//		mesh.calcBoundingBox();
//		return mesh;
//	}
//	
//	private static void readMaterial(StringTokenizer tokens, BufferedReader reader, Mesh mesh) {
//		System.out.println("MATERIAL");
//	}
//	
//	
//	//format pliku poprzez atrybuty "kids n" i typy obiektow [world, poly, group] pozwala
//	//na stworzenie hierarchi obiektow, a na razie tego nie obsluguje
//	private static void readObject(String type, BufferedReader reader, Mesh mesh) throws IOException {
//		System.out.println("OBJECT " + type);
//		
//		Geometry geometry = new Geometry();
//		
//		ArrayList<Vec3> vertexList = new ArrayList<Vec3>();
//		ArrayList<Vec2> texCoordList = new ArrayList<Vec2>();
//		ArrayList<Integer> indexList = new ArrayList<Integer>();
//		
//		String line;
//		String token;
//		while((line = reader.readLine()) != null) {
//			StringTokenizer tokens = new StringTokenizer(line, " ");
//			token = tokens.nextToken();
//			if (token.equals("kids")) {
//				break;
//			}
//			else if (token.equals("name")) {
//				readObjectName(reader, tokens, geometry);
//			}
//			else if (token.equals("numvert")) {
//				readObjectVertexList(reader, tokens, vertexList);
//			}
//			else if (token.equals("numsurf")) {
//				readObjectFaces(reader, tokens, geometry, indexList, texCoordList);
//			}
//		}
//		
//		splitVertices(indexList, vertexList, texCoordList);
//		VertexStream vertexStream = createVertexStream(indexList, vertexList, texCoordList);
//		geometry.setVertexStream(vertexStream);
//		GeometryUtils.generateNormals(geometry);
//		
//		if (type.equals("poly")) {
//			mesh.getGeometryList().add(geometry);
//		}
//	}
//	
//	private static void readObjectName(BufferedReader reader, StringTokenizer firstLine, Geometry geometry) {
//		if (firstLine.hasMoreTokens()) {
//			String name = firstLine.nextToken();
//			name = name.substring(1, name.length()-1);
//			System.out.println(" name " + name);
//			geometry.setName(name);
//		}
//	}
//	
//	private static void readObjectVertexList(BufferedReader reader, StringTokenizer firstLine, ArrayList<Vec3> vertexList) throws IOException {
//		int numvert = Integer.parseInt(firstLine.nextToken());
//		String line;
//		for(int i=0; i<numvert; i++) {
//			line = reader.readLine();
//
//			String[] spline = line.split(" ");
//			vertexList.add(new Vec3(
//				Float.parseFloat(spline[0]),
//				Float.parseFloat(spline[1]),
//				Float.parseFloat(spline[2])
//			));
//			
//		}
//	}
//	
//	private static void readObjectFaces(BufferedReader reader, StringTokenizer firstLine, 
//			Geometry geometry, ArrayList<Integer> indexList, ArrayList<Vec2> texCoordList) throws IOException {
//		String line;
//		int numsurf = Integer.parseInt(firstLine.nextToken());
//		
//		//zapametujemy typ calego obiektu jak i pojedynczych faceow
//		//aby sprawdzic czy w obiekcie wystepuja tylko face'y jednego typu
//		PrimitiveType surfType = PrimitiveType.None;
//		
//		for(int i=0; i<numsurf; i++) {
//			line = reader.readLine(); //SURF sufType(%d)
//			line = reader.readLine(); //mat
//			line = reader.readLine(); //refs
//			int refs = Integer.parseInt(line.split(" ")[1]);
//								
//			if (refs == 3) {
//				surfType = PrimitiveType.Triangles;
//			}
//			else if (refs == 4) {
//				surfType = PrimitiveType.Quads;
//			}
//			else {
//				System.out.println(" WRN: refs=" + refs + " is unsupported");
//			}
//			
//			if (geometry.getPrimitiveType() == PrimitiveType.None) {
//				geometry.setPrimitiveType(surfType);
//			}
//			
//			if (surfType == geometry.getPrimitiveType()) {
//				for(int j=0; j<refs; j++) {
//					line = reader.readLine();
//					String[] spline = line.split(" ");
//					try {
//						indexList.add(Integer.parseInt(spline[0]));
//						texCoordList.add( new Vec2(
//							Float.parseFloat(spline[1]),
//							Float.parseFloat(spline[2])
//						));
//					}
//					catch(NumberFormatException e) {
//						System.out.println("parse error at line : \"" + line + "\"");
//					}
//				}
//			}
//			else {
//				System.out.println(" WRN: refs=" + refs + ", skipping because geometryType is " + geometry.getPrimitiveType());
//				for(int j=0; j<refs; j++) {
//					line = reader.readLine();
//				}
//			}
//		}
//	}
//	
//	//duplikujemy wierzcholki dla ktorych jest kilka roznych wspolrzednych
//	//zakladam ze w vertexList nie ma duplikatow
//	private static void splitVertices(ArrayList<Integer> indexList, ArrayList<Vec3> vertexList, ArrayList<Vec2> texCoordList) {	
//		ArrayList<Integer> newIndexList = new ArrayList<Integer>();
//		ArrayList<Vec3> newVertexList = new ArrayList<Vec3>();
//		ArrayList<Vec2> newTexCoordList = new ArrayList<Vec2>();
//		
//		for(int i=0; i<indexList.size(); i++) {
//			int index = indexList.get(i);
//			Vec3 vertex = vertexList.get(index);
//			Vec2 texCoord = texCoordList.get(i);
//			int newIndex = -1;
//			for(int j=0; j<newVertexList.size(); j++) {
//				if (newVertexList.get(j).equals(vertex) && newTexCoordList.get(j).equals(texCoord)) {
//					newIndex = j;
//					break;
//				}
//			}
//			if (newIndex == -1)	{
//				newVertexList.add(vertex);
//				newTexCoordList.add(texCoord);
//				newIndex = newVertexList.size() - 1;
//			}
//			newIndexList.add(newIndex);
//		}
//		
//		indexList.clear();
//		indexList.addAll(newIndexList);
//		vertexList.clear();
//		vertexList.addAll(newVertexList);
//		texCoordList.clear();
//		texCoordList.addAll(newTexCoordList);
//	}
//	
//	private static VertexStream createVertexStream(ArrayList<Integer> indexList, ArrayList<Vec3> vertexList, ArrayList<Vec2> texCoordList) {
//		VertexStream vertexStream = new VertexStream();
//		
//		IndexBuffer indexBuffer = new IndexBuffer();
//		int[] idxBuf = new int[indexList.size()];
//		for(int i=0; i<indexList.size(); i++) {
//			idxBuf[i] = indexList.get(i);
//		}
//		indexBuffer.setBuffer(idxBuf);
//		vertexStream.setIndexBuffer(indexBuffer);
//		
//		FloatVertexAttrib posAttrib = new FloatVertexAttrib("pos");
//		float[] posBuf = new float[3*vertexList.size()];
//		for(int i=0; i<vertexList.size(); i++) {
//			float[] v = vertexList.get(i).getVector();
//			posBuf[i*3  ] = v[0];
//			posBuf[i*3+1] = v[1];
//			posBuf[i*3+2] = v[2];
//		}
//		posAttrib.setBuffer(posBuf);
//		vertexStream.addAttrib(posAttrib);
//		
//		FloatVertexAttrib texCoord0Attrib = new FloatVertexAttrib("texCoord0");
//		float[] texCoord0Buf = new float[2*texCoordList.size()];
//		for(int i=0; i<texCoordList.size(); i++) {
//			float[] v = texCoordList.get(i).getVector();
//			texCoord0Buf[i*2  ] = v[0];
//			texCoord0Buf[i*2+1] = v[1];
//		}
//		texCoord0Attrib.setBuffer(texCoord0Buf);
//		vertexStream.addAttrib(texCoord0Attrib);
//		
//		
//		
//		return vertexStream;
//	}
}
