Dear Reader,
I am learning OpenGl with X windows. I have been trying to use display lists, but I do not get any thing on the screen. If I put the drawing code in the place where I call the list everything works.
Could someone explain what I have done wrong.
Here is the code.
#include <stdio.h>
#include <Xm/MainW.h>
#include <Xm/Form.h>
#include <Xm/DrawingA.h>
#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glx.h>
#include <GLwMDrawA.h>
XVisualInfo *vi =NULL;
GLXContext cx;
Bool doubleBuffer = True;
GLuint listname = 1;
int BufferAttributes [] =
{
GLX_DOUBLEBUFFER,
GLX_RGBA,
GLX_DEPTH_SIZE, 12,
GLX_RED_SIZE, 1,
GLX_GREEN_SIZE, 1,
GLX_BLUE_SIZE, 1,
None
};
int *singleBufferAttributes = &BufferAttributes[0];
int *doubleBufferAttributes = &BufferAttributes[1];
void resize (Widget w, XtPointer clientdata, XtPointer calldata);
void expose (Widget w, XtPointer clientdata, XtPointer calldata);
void init (Widget w, XtPointer clientdata, XtPointer calldata);
void draw (Widget w);
int main (int argc, char **argv)
{
XtAppContext appContext;
Display *display;
Widget shell;
Widget form;
Widget draw;
Arg args[10];
int n;
XtToolkitInitialize();
appContext = XtCreateApplicationContext();
display = XtOpenDisplay (appContext,NULL,“Test”,“Test”,NULL,0,&argc,argv);
if (vi == NULL)
{
vi = glXChooseVisual(display, DefaultScreen(display), doubleBufferAttribut
es);
if (vi == NULL)
{
vi = glXChooseVisual(display, DefaultScreen(display), singleBufferAttri
butes);
if (vi == NULL) XtAppError(appContext,“No RGB visual with depth buffer”
);
doubleBuffer = False;
}
}
cx = glXCreateContext (display, vi, None, True);
if (vi == NULL) XtAppError(appContext,“Could not create rendering context”);
n=0;
XtSetArg(args[n], XmNallowShellResize, True); n++;
XtSetArg(args[n], XmNtitle, "Main Window "); n++;
shell = XtAppCreateShell(“shell”, “shell”, applicationShellWidgetClass, displ
ay, args, n);
n=0;
form = XtCreateWidget(“form”, xmFormWidgetClass, shell, args, n);
XtManageChild (form);
n=0;
XtSetArg(args[n], XmNwidth, 400); n++;
XtSetArg(args[n], XmNheight, 400); n++;
XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM); n++;
XtSetArg(args[n], XmNtopAttachment, XmATTACH_FORM); n++;
XtSetArg(args[n], XmNrightAttachment, XmATTACH_FORM); n++;
XtSetArg(args[n], XmNbottomAttachment, XmATTACH_FORM); n++;
XtSetArg(args[n], GLwNvisualInfo, vi); n++;
draw = XtCreateWidget(“Draw”, glwMDrawingAreaWidgetClass, form, args,n);
XtManageChild (draw);
XtAddCallback(draw, GLwNexposeCallback, expose, NULL);
XtAddCallback(draw, GLwNresizeCallback, resize, NULL);
XtAddCallback(draw, GLwNginitCallback, init , NULL);
XtRealizeWidget (shell);
XtAppMainLoop(appContext);
}
float polygon1[3][3] = { {-10.0, -10.0, 0.0,},
{ 10.0, -10.0, 0.0,},
{-10.0, 10.0, 0.0,} };
float polygon2[3][3] = { { 0.0, -10.0, -10.0,},
{ 0.0, -10.0, 10.0,},
{ 0.0, 5.0, -10.0,} };
float polygon3[4][3] = { {-10.0, 6.0, 4.0,},
{-10.0, 3.0, 4.0,},
{ 4.0, -9.0, -10.0,},
{ 4.0, -6.0, -10.0,} };
void init (Widget w, XtPointer clientdata, XtPointer calldata)
{
glNewList(listname,GL_COMPILE);
glPushMatrix();
glPushAttrib(GL_CURRENT_BIT);
glBegin(GL_POLYGON);
glColor3f(0.0, 0.0, 0.0);
glVertex3fv(&polygon1[0][0]);
glColor3f(0.7, 0.7, 0.7);
glVertex3fv(&polygon1[1][0]);
glColor3f(1.0, 1.0, 1.0);
glVertex3fv(&polygon1[2][0]);
glEnd();
glBegin(GL_POLYGON);
glColor3f(1.0, 1.0, 0.0);
glVertex3fv(&polygon2[0][0]);
glColor3f(0.0, 1.0, 0.7);
glVertex3fv(&polygon2[1][0]);
glColor3f(0.0, 0.0, 1.0);
glVertex3fv(&polygon2[2][0]);
glEnd();
glBegin(GL_POLYGON);
glColor3f(1.0, 1.0, 0.0);
glVertex3fv(&polygon3[0][0]);
glColor3f(1.0, 0.0, 1.0);
glVertex3fv(&polygon3[1][0]);
glColor3f(0.0, 0.0, 1.0);
glVertex3fv(&polygon3[2][0]);
glColor3f(1.0, 0.0, 1.0);
glVertex3fv(&polygon3[3][0]);
glEnd();
glPopAttrib();
glPopMatrix();
glEndList ();
}
void expose (Widget w, XtPointer clientdata, XtPointer calldata)
{
glXMakeCurrent (XtDisplay(w), XtWindow(w), cx);
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);
glClearColor(0.0, 0.0, 0.0, 0.0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
gluPerspective(40.0, 1.0, 30.0, 1000.0);
glTranslatef(0.0, 0.0, -40.0);
glRotatef(-58.0, 0,1,0);
glCallList (listname);
glXSwapBuffers (XtDisplay(w), XtWindow(w));
}
void resize (Widget w, XtPointer clientdata, XtPointer calldata)
{
GLwDrawingAreaCallbackStruct *callbackData;
callbackData = (GLwDrawingAreaCallbackStruct *) calldata;
glXMakeCurrent(XtDisplay(w), XtWindow (w), cx);
glXWaitX();
glViewport (0,0,callbackData->width, callbackData->height);
}