view doodle/main/prog/gl_example.d @ 83:06b4504cbcb0

Checkpoint of trying to get a different renderer going (OpenGL)
author daveb
date Mon, 16 Aug 2010 17:16:36 +0930
parents
children
line wrap: on
line source

// File stolen from Gtkd

module main.prog.gl_example;

private import gtk.DrawingArea;
private import glgtk.GLCapability;
private import glgdk.GLDrawable;
private import glgdk.GLConfig;
private import glgdk.GLContext;
private import gtkglc.glgdktypes;

private import gtkglc.gl;
private import gtkglc.glu;

private import gdk.Event;

private import gtk.Widget;

private import gtk.Main;
private import gtk.MainWindow;

/**
 * This is a Simple class extending the DrawingArea widget.
 * A really simple Demo illustrating OpenGL with DUI
 * It uses the new GLCapability mixin to add the GL capabilities to the widget.
 * This example is provided under the terms of the GPL License.
 * Note the initialization of the GLCapabilities on the constructor.
 * 
 * @author pac@tuxfamily.org
 */
class SimpleGL : DrawingArea {
    GLfloat width;
    GLfloat height;

    /** need to include the mixin to add GL capabilities to this widget */
    mixin GLCapability;

    /**
     * Construct a simple DrawingArea and sets the GLCapabilities
     */
    this() {
        super(300, 300);
        setGLCapability();	// set the GL capabilities for this widget
    }

    /**
     * put any gl initializations here
     * returns true to consume the event
     */
    bool initGL() {
        resizeGL(null);
        return true;
    }

    /**
     * This method is called every time the window must be paint or repaint
     * This is where you put the OpenGL call to draw something.
     * This method call be called directly by the application without an event object
     * to force redrawing of the scene.
     * returns true to consume the event
     */
    bool drawGL(GdkEventExpose* event = null) {
        glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        glLoadIdentity ();

        gluLookAt(0, 0, 10, 0, 0, 0, 0, 1,0); //Set the camera position

        //Just Draw a tri-colored triangle
        glBegin(GL_TRIANGLES);
        glColor3f(1.0f,0.0f,0.0f);
        glVertex3f( 0.0f, 1.0f, 0.0f);
        glColor3f(0.0f,1.0f,0.0f);
        glVertex3f(-1.0f,-1.0f, 0.0f);
        glColor3f(0.0f,0.0f,1.0f);
        glVertex3f( 1.0f,-1.0f, 0.0f);
        glEnd();

        return true;
    }

    /**
     * This method is called when the window is resized
     * returns true to consume the event
     */
    bool resizeGL(GdkEventConfigure* event = null) {
        GLfloat w;
        GLfloat h;

        if ( event == null ) {
            w = getWidth();
            h = getHeight();
        }
        else {
            w = event.width;
            h = event.height;
        }

        width = w;
        height = h;

        glViewport (0, 0, cast(int)w, cast(int)h); //Adjust the viewport according to new window dimensions 

        /*
         * Update the projection Matrix accoding to the new dimension
         * and reset the OpenGL state to MODELVIEW
         */
        glMatrixMode (GL_PROJECTION);
        glLoadIdentity ();
        gluPerspective(20, w/h, 0.1, 10);
        glMatrixMode (GL_MODELVIEW);

        return true;
    }
}

private import glgdk.GLdInit;

void main(string[] args)
{
    Main.init(args);
    GLdInit.init(args);

    SimpleGL simpleGL = new SimpleGL();
    MainWindow window = new MainWindow("Simplest OpenGL Example");
    window.add(simpleGL);
    window.showAll();

    Main.run();
}