package org.waltermilner;

import com.sun.opengl.util.Animator;
import com.sun.opengl.util.BufferUtil;
import java.awt.Frame;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.nio.FloatBuffer;
import javax.media.opengl.GL;
import javax.media.opengl.GLAutoDrawable;
import javax.media.opengl.GLCanvas;
import javax.media.opengl.GLEventListener;

public class Bezier implements GLEventListener {

    static Animator animator = null;
   
    float[] ctrlPoints = {
        -4.0f, -4.0f, 0.0f, -2.0f, 4.0f, 0.0f,
        2.0f, -4.0f, 0.0f, 4.0f, 4.0f, 0.0f
    };

    public void display(GLAutoDrawable gLDrawable) {

        final GL gl = gLDrawable.getGL();
        gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT);

        gl.glLoadIdentity();									// Reset The View    
        gl.glColor3f(1.0f, 0.0f, 0.0f);
        gl.glEnable(GL.GL_MAP1_VERTEX_3);
        gl.glBegin(GL.GL_LINE_STRIP);
        for (int i = 0; i <= 30; i++) {
            gl.glEvalCoord1f(i / 30.0f);
        }
        gl.glEnd();
        gl.glPointSize(5.0f);
        gl.glColor3f(1.0f, 1.0f, 0.0f);
        gl.glBegin(GL.GL_POINTS);
        for (int i = 0; i < 4; i++) {
            gl.glVertex3f(ctrlPoints[i * 3], ctrlPoints[i * 3 + 1], ctrlPoints[i * 3 + 2]);
        }
        gl.glEnd();
        gl.glFlush();
    }

    public void displayChanged(GLAutoDrawable gLDrawable, boolean modeChanged, boolean deviceChanged) {
    }

    public void init(GLAutoDrawable gLDrawable) {

        final GL gl = gLDrawable.getGL();

        gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
        gl.glShadeModel(GL.GL_FLAT);

        FloatBuffer ctrlPointBuffer = BufferUtil.newFloatBuffer(12);
        for (int i = 0; i < ctrlPoints.length; i++) {
            ctrlPointBuffer.put(ctrlPoints[i]);
        }
        ctrlPointBuffer.rewind();
        gl.glMap1f(GL.GL_MAP1_VERTEX_3, 0.0f, 1.0f, 3, 4, ctrlPointBuffer);
        gl.glEnable(GL.GL_MAP1_VERTEX_3);
    }

    public void reshape(GLAutoDrawable gLDrawable, int x, int y, int w, int h) {
        GL gl = gLDrawable.getGL();

        gl.glViewport(0, 0, w, h);
        gl.glMatrixMode(GL.GL_PROJECTION);
        gl.glLoadIdentity();
        if (w <= h) {
            gl.glOrtho(-5.0, 5.0, -5.0 * h / w,
                    5.0 * h / w, -5.0, 5.0);
        } else {
            gl.glOrtho(-5.0 * w / h,
                    5.0 * w / h, -5.0, 5.0, -5.0, 5.0);
        }
        gl.glMatrixMode(GL.GL_MODELVIEW);
        gl.glLoadIdentity();
    }

   
    public static void main(String[] args) {
        Frame frame = new Frame("Bezier");
        GLCanvas canvas = new GLCanvas();
        canvas.addGLEventListener(new Bezier());
        frame.add(canvas);
        frame.setSize(640, 480);
        animator = new Animator(canvas);
        frame.addWindowListener(new WindowAdapter() {

            @Override
            public void windowClosing(WindowEvent e) {
                animator.stop();
                System.exit(0);
            }
        });
        frame.setVisible(true);
        animator.start();
        canvas.requestFocus();
    }
}

