package simplebrowser.prototype;

import java.awt.Dimension;
import java.nio.ByteBuffer;
import java.nio.IntBuffer;

import javax.media.opengl.DebugGL3;
import javax.media.opengl.GL3;
import javax.media.opengl.GLAutoDrawable;
import javax.media.opengl.GLCapabilities;
import javax.media.opengl.GLEventListener;
import javax.media.opengl.GLException;
import javax.media.opengl.GLProfile;
import javax.media.opengl.awt.GLCanvas;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
import javax.vecmath.Vector3f;

import simplebrowser.prototype.gl.BufferObject;
import simplebrowser.prototype.gl.VertexArrayObject;

import com.jogamp.common.nio.Buffers;
import com.jogamp.graph.curve.opengl.RenderState;
import com.jogamp.graph.curve.opengl.TextRenderer;
import com.jogamp.graph.font.Font;
import com.jogamp.graph.font.FontFactory;
import com.jogamp.graph.geom.opengl.SVertex;
import com.jogamp.opengl.util.Animator;
import com.jogamp.opengl.util.glsl.ShaderState;

public class TestTextRendering implements GLEventListener {
	JFrame frame = null;
	GLCanvas canvas = null;
	
	public static Font font;
	public static RenderState textRenderState = null;
    public static TextRenderer textRenderer = null;
	
	void init() {
		frame = new JFrame("TEXT RENDERER");
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
        GLProfile profile = GLProfile.get(GLProfile.GL3);
        
        GLCapabilities capabilities = new GLCapabilities(profile);
        capabilities.setDoubleBuffered(true);
        capabilities.setSampleBuffers(true);
        
		canvas = new GLCanvas(capabilities);
		
		canvas = new GLCanvas(capabilities);
        canvas.setPreferredSize(new Dimension(500, 500));
        canvas.addGLEventListener(this);
        
        frame.add(canvas);
        frame.pack();
        frame.setVisible(true);
	}
		
	public static void main(String[] args) {
		final TestTextRendering tr = new TestTextRendering();
        
    	SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                tr.init();
            }
        });
	}

	@Override
	public void display(GLAutoDrawable drawable) {
		GL3 gl = drawable.getGL().getGL3();
		
		gl.glClear(GL3.GL_COLOR_BUFFER_BIT | GL3.GL_DEPTH_BUFFER_BIT);		
		
		int width = drawable.getWidth();
		int height = drawable.getHeight();
		
		textRenderer.reshapePerspective(null, 45.0f, width, height, 0.1f, 7000.0f);     
		textRenderer.reshapeOrtho(null, width, height, 0.1f, 7000.0f);

        final float[] textPosition = new float[] {0, 0, 0};
        final int[] texSize = new int[] { 400 }; 
        final int fontSize = 50;
        
        textRenderer.resetModelview(null);
        textRenderer.setColorStatic(gl, 0.0f, 0.0f, 1.0f);
        textRenderer.translate(gl, 250, 250, -6000);
        textRenderer.drawString3D(gl, font, "Hi", textPosition, fontSize, texSize);
	}

	@Override
	public void dispose(GLAutoDrawable drawable) {
	}


	@Override
	public void init(GLAutoDrawable drawable) {
		GL3 gl = new DebugGL3(drawable.getGL().getGL3());
		drawable.setGL(gl);
		
		gl.glClearColor(0.3f, 0.3f, 0.3f, 1.0f);
		gl.glEnable(GL3.GL_DEPTH_TEST);
		gl.glEnable(GL3.GL_MULTISAMPLE);
		
        try {
			font = FontFactory.get(FontFactory.UBUNTU).getDefault();
			
			textRenderState = RenderState.createRenderState(new ShaderState(), SVertex.factory());
	        textRenderer = TextRenderer.create(textRenderState, 0);	
	        
	        textRenderer.init(gl);
			textRenderer.setAlpha(gl, 1.0f);
			textRenderer.setColorStatic(gl, 0.0f, 0.0f, 0.0f);        
		} catch(Exception e) {
			throw new RuntimeException(e);
		}
        
        // here, I would create a VA, IB, VB, set them up, etc, only to finally break the bind 
        // on the vertex array
        
        // UNCOMMENT BELOW TO MAKE APPLICATION THROW AN EXCEPTION
        gl.glBindVertexArray(0); 
	}

	@Override
	public void reshape(GLAutoDrawable arg0, int arg1, int arg2, int arg3,
			int arg4) {
	}

}