// gcc glcube.c -liup -liupgl -lGL -lGLU -o glcube
#include <stdio.h>
#include <stdlib.h>
#include <iup.h>
#include <iupgl.h>
#include <GL/gl.h>
#include <GL/glu.h>
#include "cbasic.h"
DIM LOCAL Ihandle AS *canvas;
DIM LOCAL float AS t=0;
LOCAL SUB polygon(int a, int b, int c, int d)
BEGIN_SUB
DIM double AS vertices[][3]={{-1,-1, 1}, {-1, 1, 1}, { 1, 1, 1}, { 1,-1, 1},
{-1,-1,-1}, {-1, 1,-1}, { 1, 1,-1}, { 1,-1,-1}};
glBegin(GL_POLYGON);
glVertex3dv(vertices[a]);
glVertex3dv(vertices[b]);
glVertex3dv(vertices[c]);
glVertex3dv(vertices[d]);
glEnd();
END_SUB
LOCAL SUB colorCube(void)
BEGIN_SUB
glColor3f(1,0,0);
glNormal3f(1,0,0);
polygon(2,3,7,6);
glColor3f(0,1,0);
glNormal3f(0,1,0);
polygon(1,2,6,5);
glColor3f(0,0,1);
glNormal3f(0,0,1);
polygon(0,3,2,1);
glColor3f(1,0,1);
glNormal3f(0,-1,0);
polygon(3,0,4,7);
glColor3f(1,1,0);
glNormal3f(0,0,-1);
polygon(4,5,6,7);
glColor3f(0,1,1);
glNormal3f(-1,0,0);
polygon(5,4,0,1);
END_SUB
LOCAL FUNCTION int repaint_cb(Ihandle *self)
BEGIN_FUNCTION
IupGLMakeCurrent(self);
glClearColor(0.3f, 0.3f, 0.3f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glEnable(GL_DEPTH_TEST);
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glTranslatef( 0.0f, 0.0f , 0.0f );
glScalef( 1.0f, 1.0f, 1.0f );
glRotatef(t,0,0,1);
colorCube();
glPopMatrix();
IupGLSwapBuffers(self);
RETURN_FUNCTION(IUP_DEFAULT);
END_FUNCTION
LOCAL FUNCTION int resize_cb(Ihandle *self, int width, int height)
BEGIN_FUNCTION
IupGLMakeCurrent(self);
glViewport(0, 0, width, height);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(60,4./3.,1.,15);
gluLookAt(3,3,3, 0,0,0, 0,0,1);
RETURN_FUNCTION(IUP_DEFAULT);
END_FUNCTION
FUNCTION int idle_cd(void)
BEGIN_FUNCTION
t+=1;
repaint_cb(canvas);
RETURN_FUNCTION(IUP_DEFAULT);
END_FUNCTION
FUNCTION int exit_cb(void)
BEGIN_FUNCTION
RETURN_FUNCTION(IUP_CLOSE);
END_FUNCTION
FUNCTION Ihandle* initDialog(void)
BEGIN_FUNCTION
DIM Ihandle* AS dialog;
canvas = IupGLCanvas(NULL);
IupSetAttribute(canvas,"RASTERSIZE","640x480");
IupSetAttribute(canvas, "BUFFER","DOUBLE");
IupSetAttribute(canvas, "DEPTH_SIZE", "16");
IupSetCallback(canvas, "ACTION", (Icallback) repaint_cb);
IupSetCallback(canvas, "RESIZE_CB",(Icallback) resize_cb);
dialog = IupDialog(canvas);
IupSetAttribute(dialog, "TITLE", "IUP 3D OpenGL");
IupSetCallback(dialog, "CLOSE_CB", (Icallback) exit_cb);
IupSetFunction("IDLE_ACTION", (Icallback)idle_cd);
RETURN_FUNCTION(dialog);
END_FUNCTION
MAIN
BEGIN_FUNCTION
DIM Ihandle* AS dialog;
IupOpen(0, 0);
IupGLCanvasOpen();
dialog = initDialog();
IupShowXY(dialog, IUP_CENTER, IUP_CENTER);
IupMainLoop();
IupClose();
END_FUNCTION