import java.awt.geom.Point2D;
import java.util.ArrayList;

import javax.swing.*;
import javax.media.opengl.*;
import javax.media.opengl.awt.GLCanvas;
import javax.media.opengl.glu.GLU;

import utils.ImageLoader;



public class Terrain extends JFrame{

	GLCanvas canvas;
	SceneView sv;

	public Terrain() {

		sv = new SceneView(); //GLEventListener-Objekt

		GLProfile glp = GLProfile.getDefault();
		GLCapabilities caps = new GLCapabilities(glp);
		canvas = new GLCanvas(caps);

		canvas.addGLEventListener(sv);

		add(canvas);

		setTitle("Terrain");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setSize(1200,600);
		setVisible(true);  

	}



	class SceneView implements GLEventListener {

		double[][] terrain = new double[100][100];
		
		public SceneView(){
			
			generateHeightField();
		}
		
		
		public void init(GLAutoDrawable drawable) {
			GL2 gl = drawable.getGL().getGL2(); 	
			gl.glClearColor(0f, 0f, 0f, 0f); // grey background
			gl.glClearDepth(1.0);//Depth Buffer Setup
			gl.glEnable(GL.GL_DEPTH_TEST);//Enables Depth Testing
			gl.glPolygonMode(GL2.GL_FRONT_AND_BACK, GL2.GL_LINE );

		}

		public void display(GLAutoDrawable drawable) {
			GL2 gl = drawable.getGL().getGL2();         
			GLU glu = new GLU();
			gl.glClear(GL2.GL_COLOR_BUFFER_BIT|GL.GL_DEPTH_BUFFER_BIT); // clear background & depth buffer
			gl.glMatrixMode(GL2.GL_MODELVIEW);
			gl.glLoadIdentity();
			glu.gluLookAt(50, 20, 100, 30, 0, -20, 0, 1, 0);
			
			 
			for(int i = 0; i<terrain.length-1;i++){	
				gl.glBegin(GL2.GL_TRIANGLE_STRIP);
				
				for(int j = 0; j<terrain[0].length-1;j++){
					
						gl.glColor3d(0, terrain[i][j]/10.0, terrain[i][j]/10.0);	
						gl.glVertex3d(i,terrain[i][j], j);
						
						gl.glColor3d(0, terrain[i+1][j]/10.0, terrain[i][j]/10.0);
						gl.glVertex3d(i+1,terrain[i+1][j], j);

						gl.glColor3d(0, terrain[i][j+1]/10.0, terrain[i][j]/10.0);
						gl.glVertex3d(i,terrain[i][j+1], j+1);
						
						gl.glColor3d(0, terrain[i+1][j+1]/10.0, terrain[i][j]/10.0);
						gl.glVertex3d(i+1,terrain[i+1][j+1], j+1);			
					
				}
				
				gl.glEnd();
			}
		



		}

		public void reshape(GLAutoDrawable drawable, int x, int y, int w, int h) {
			GL2 gl = drawable.getGL().getGL2();
			GLU glu = new GLU();
			//gl.glViewport(Math.max(0,(w-h)/2), Math.max(0,(h-w)/2), Math.min(w,h), Math.min(w,h)); //reset the current viewport
			gl.glMatrixMode(GL2.GL_PROJECTION);
			gl.glLoadIdentity();
			glu.gluPerspective(45, w/h, 0.1, 100);
		}

		public void dispose(GLAutoDrawable drawable) {
		}
		
		private void generateHeightField(){
			
			int[] pixels = ImageLoader.loadImage("http://www.medien.ifi.lmu.de/lehre/ss12/cg1/uebung/heightmap.png");
			
			for(int i = 0; i<terrain.length;i++){	
				for(int j = 0; j<terrain[0].length;j++){
					terrain[i][j] = (double)pixels[i+j*100]/5.0-5;
				}
			}
			
		}


	}

	public static void main(String args[]) {
		new Terrain();   
	}




}

