//package edu.uprm.walsaip.vte.core.model;
//
//import static java.lang.System.out;
//
//import javax.media.opengl.GL;
//
//import edu.uprm.walsaip.vte.core.ModuleInfo;
//import edu.uprm.walsaip.vte.core.exceptions.FilenameNullException;
//import edu.uprm.walsaip.vte.core.exceptions.InvalidFileException;
//import edu.uprm.walsaip.vte.core.messagebus.Message;
//import edu.uprm.walsaip.vte.core.renderer.RendererFactory;
//import edu.uprm.walsaip.vte.core.util.GLUtils;
//
//
///**
// * 
// * 
// * @author Ricardo Veguilla
// * 
// */
//public class FullMeshTerrainModel extends GenericTerrainModelImpl {
//	public static final String ID = FullMeshTerrainModel.class.getSimpleName();
//
//  
//    private int primitiveType = GL.GL_TRIANGLES;
//    private int numPrimitives = 0;
//	private boolean doInit = false;
//	private boolean dataInitDone = false;
//	
//	public static final ModuleInfo<FullMeshTerrainModel> MODULE_INFO = new ModuleInfo<FullMeshTerrainModel>() {
//		protected void setInfo() {
//			name = FullMeshTerrainModel.class.getSimpleName();
//			description = "A Terrain TerrainModel Implementation.";
//			moduleClass = FullMeshTerrainModel.class;
//			supported = true;
//		}
//	};
//		
//
//
//
//	//private boolean reInitRenderer = false;
//	
//
//
//	private boolean initDone = false;
//
//	public FullMeshTerrainModel() {
//		super();
////		this.position = new Position();
////		this.position.getAngle().setPitch(360);
//	}
//	
//
//
//
//	public void init(GL gl) {
//		
//		if (renderer == null) {
//			renderer = RendererFactory.getDefaultRenderer();
//		}
//		renderer.init(gl);	
//		initDone  = true;
//		
//	}
//
//
//	private  void initRenderData(GL gl) {
//		
//		generatePrimitives();
//		if (imageData != null) {	
//			setupTextures(gl);
//		}
//	
//		doInit = false;
//		
//	}
//	
//	private void generatePrimitives() {
//		out.printf("Generating primitives...");
//
//		
//		int width = terrainData.getWidth();
//		int height = terrainData.getHeight();
//		int numPixels = width*height;
//		
//		
//		
//		//int center_x_offset = -width / 2;
//		//int center_y_offset = -height / 2;
//		
//		
//		int offset_h = 1;
//		int offset_w = 1;
//		
//		
//		
//		int vertexPerPixel = 0;
//		if (primitiveType == GL.GL_QUADS) {
//			vertexPerPixel = 4;
//			numPrimitives = numPixels*4;
//		}
//		else if (primitiveType == GL.GL_TRIANGLES) {
//			vertexPerPixel = 6;
//			numPrimitives = numPixels*6;
//				
//		}
//		
//		
//		int floatsPerVertex =3;
//		int numFloats = numPixels*vertexPerPixel*floatsPerVertex;
//		this.renderer.setupBuffers(numFloats);
//		
//		
//
//		float [] vertex1 = new float[3];
//		float [] vertex2 = new float[3];
//		float [] vertex3 = new float[3];
//		float [] vertex4 = new float[3];
//		int idx = 0;
//		for (int w = 0; w < width - offset_w; w += offset_w) {
//			for (int h = 0; h < height - offset_h; h += offset_h) {
//			
//
//		
//				vertex1[0] =(float) ( w);
//				vertex1[1] = terrainData.get(w, h);
//				vertex1[2] = (float) ( h);
//				
//				vertex2[0] =(float) (w+1);
//				vertex2[1] = terrainData.get(w+1, h);
//				vertex2[2] = (float) ( h);
//				
//				vertex3[0] =(float) ( w+1);
//				vertex3[1] = terrainData.get(w+1, h+1);
//				vertex3[2] = (float) ( h+1);
//				
//				
//				vertex4[0] =(float) ( w);
//				vertex4[1] = terrainData.get(w, h+1);
//				vertex4[2] = (float) ( h+1);
//				
//				
//				
//				switch (primitiveType) {
//
//				case GL.GL_QUADS:
//
//
//					
//					idx = renderer.addVertex(idx, vertex4 );
//					idx = renderer.addVertex(idx, vertex3 );
//					idx = renderer.addVertex(idx, vertex2 );
//					idx = renderer.addVertex(idx, vertex1 );
//					
//					break;
//				case GL.GL_TRIANGLES:
//				
//					idx = renderer.addVertex(idx, vertex4 );
//					idx = renderer.addVertex(idx, vertex3 );
//					idx = renderer.addVertex(idx, vertex2 );
//					
//					idx = renderer.addVertex(idx, vertex4 );
//					idx = renderer.addVertex(idx, vertex2 );
//					idx = renderer.addVertex(idx, vertex1 );
//				
//					
//					break;
//				}
//			}
//			// out.println();
//		}
//		
//		dataInitDone = true;
//		
//		terrainData =null;
//		out.printf("done.\n");
//		
//	}
//	
//	
//	
////	private void bindVertexBufferObject(GL gl, int GL_TARGET_ARRAY, int id,
////			int numObjects, IntBuffer idBuffer, Buffer buffer,String bufferDesc) {
////
////		int allocatedBufferSize[] = new int[1];
////		int bufferSize = 0;
////		int bufferID = 0;
////		//enabledArray[id] = true;
////
////		if (GL_TARGET_ARRAY == GL.GL_ELEMENT_ARRAY_BUFFER)
////			bufferSize = numObjects * SIZEOF_INT;
////		else
////			bufferSize = numObjects * SIZEOF_FLOAT;
////		bufferID = idBuffer.get(id);
////
////		gl.glBindBuffer(GL_TARGET_ARRAY, bufferID);
////		out.printf("Atempting to allocated "+ bufferSize + " bytes for "+bufferDesc+"...");
////		gl.glBufferData(GL_TARGET_ARRAY, bufferSize, buffer, GL.GL_STATIC_DRAW);
////		gl.glGetBufferParameteriv(GL_TARGET_ARRAY, GL.GL_BUFFER_SIZE,
////				allocatedBufferSize, 0);
////		if (allocatedBufferSize[0] <= 0)
////			err.println("Error: Failed to allocate memory!");
////		else if (allocatedBufferSize[0] != bufferSize) {
////			err.println("Error: Unable to allocate requested memory size! Allocated: " + allocatedBufferSize[0]);
////		} else
////			out.printf("done.\n");
////		
////	}
//	public int render(GL gl) {
////		if (!initDone)
////			init(gl);
////		if (reInitRenderer) {
////			renderer.init(gl);
////			reInitRenderer = false;
////		}
//
//		if (doInit) { 
//			
//			if(texturesEnabled) {
//				gl.glEnable(GL.GL_TEXTURE_2D);
//				gl.glEnable(GL.GL_LIGHTING);
//				gl.glBindTexture(GL.GL_TEXTURE_2D, gTextureID);
//			}
//			else {
//				gl.glDisable(GL.GL_TEXTURE_2D);
//				gl.glDisable(GL.GL_LIGHTING);
//			}
//			if (!dataInitDone)
//				initRenderData(gl);	
//			
//		}
//		
//		
//		translateAndRotate(gl,this.position);
//		
//	 
//		
//		renderer.render_frame_begin(gl);
//		renderer.render(gl, GL.GL_TRIANGLES, numPrimitives);
//		renderer.render_frame_end(gl);
//		return renderer.numTrianglesRendered();
//		
//	}
//	
//	public void processEvent(Message<?> m) {
//
//	
//			String action = m.getName();
//			Object value = m.getValue();
//
//			
//			if (action.equals(INIT)) {
//				if (value != null) 
//					try {
//						super.init(String.class.cast(value));
//					} catch (FilenameNullException e) {
//							e.printStackTrace();
//					} catch (InvalidFileException e) {
//						e.printStackTrace();
//					}
//					
//				//MessageBus.sendMessage(new Message<String>(View.ID,Module.INIT,null));
//				if (windowRes != 0)
//					doInit = true;
//				
//			}
//			else if (action.equals(WINDOW_HEIGHT)) {
//				windowRes = Integer.class.cast(value);
//				if (filename != null )
//					doInit = true;
//			}
//			 else if (action.equals(ROTATE_AROUND_X)) {
//					float pitch = position.getAngle().getPitch();
//					pitch = 270.0f+(Float.class.cast(value)/4.0f);
//					position.getAngle().setPitch(pitch);
//				} else if (action.equals(ROTATE_X_PLUS)) {
//				
//					float pitch = position.getAngle().getPitch();
//					pitch = GLUtils.range360(pitch - 0.7f);
//					//System.out.println("pitch360: " + pitch);
//					if (pitch < 270f && pitch > 0)
//						pitch = 270f;
//					//System.out.println("pitchUp: " + pitch);
//					position.getAngle().setPitch(pitch);
//
//				} else if (action.equals(ROTATE_Y_PLUS)) {
//					position.getAngle().incrementYaw(0.7f);
//				} else if (action.equals(ROTATE_Z_PLUS)) {
//					position.getAngle().incrementRoll(0.7f);
//				}  else if (action.equals(ROTATE_X_MINUS)) {
//					float pitch = position.getAngle().getPitch();
//					pitch = pitch + 0.7f;
//					if (pitch < 270)
//						pitch = 0f;
//
//					if (pitch > 360f)
//						pitch = 360f;
//					position.getAngle().setPitch(pitch);
//
//				} else if (action.equals(ROTATE_Y_MINUS)) {
//					position.getAngle().incrementYaw(-0.7f);
//				} else if (action.equals(ROTATE_Z_MINUS)) {
//					position.getAngle().incrementRoll(-0.7f);
//				} else if (action.equals(MOVE_X_PLUS)) {
//					position.getPosition().incrementX(-5.0f);
//				} else if (action.equals(MOVE_X_MINUS)) {
//					position.getPosition().incrementX(5.0f);
//				} else if (action.equals(MOVE_Y_PLUS)) {
//					position.getPosition().incrementY(-5.0f);
//				} else if (action.equals(MOVE_Y_MINUS)) {
//					position.getPosition().incrementY(5.0f);
//				} else if (action.equals(MOVE_Z_PLUS)) {
//					position.getPosition().incrementZ(-5.0f);
//				} else if (action.equals(MOVE_Z_MINUS)) {
//					position.getPosition().incrementZ(5.0f);
//				}
//				else if (action.equals(SET_PITCH)) {
//					position.getAngle().setPitch(Float.class.cast(value));
//				}
//
//		
//	}
//
//
//}
