diff --git a/Makefile b/Makefile index 3451643..bedc98e 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,6 @@ all: cd ./basics && $(MAKE) + cd ./opengl && $(MAKE) .PHONY: all diff --git a/opengl/Makefile b/opengl/Makefile new file mode 100644 index 0000000..e9705f8 --- /dev/null +++ b/opengl/Makefile @@ -0,0 +1,19 @@ +CPPC := g++ +BINDIR := $(PWD)/bin + +ALL_TARGETS = $(BINDIR)/demo + + +all: $(ALL_TARGETS) + + +clean: + rm -vf ./bin/* + + +$(BINDIR)/demo: + cd src && \ + gcc -o $(BINDIR)/demo demo.c -lX11 -lGL -lGLU + + +.PHONY: all clean diff --git a/opengl/src/demo.c b/opengl/src/demo.c new file mode 100644 index 0000000..ff72857 --- /dev/null +++ b/opengl/src/demo.c @@ -0,0 +1,92 @@ +#include +#include +#include +#include +#include +#include +#include + +Display *dpy; +Window root; +GLint att[] = { GLX_RGBA, GLX_DEPTH_SIZE, 24, GLX_DOUBLEBUFFER, None }; +XVisualInfo *vi; +Colormap cmap; +XSetWindowAttributes swa; +Window win; +GLXContext glc; +XWindowAttributes gwa; +XEvent xev; + + +void DrawAQuad() { + glClearColor(1.0, 1.0, 1.0, 1.0); + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + glOrtho(-1., 1., -1., 1., 1., 20.); + + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + gluLookAt(0., 0., 10., 0., 0., 0., 0., 1., 0.); + + glBegin(GL_QUADS); + glColor3f(1., 0., 0.); glVertex3f(-.75, -.75, 0.); + glColor3f(0., 1., 0.); glVertex3f( .75, -.75, 0.); + glColor3f(0., 0., 1.); glVertex3f( .75, .75, 0.); + glColor3f(1., 1., 0.); glVertex3f(-.75, .75, 0.); + glEnd(); +} + +int main(int argc, char *argv[]) { + + dpy = XOpenDisplay(NULL); + + if(dpy == NULL) { + printf("\n\tcannot connect to X server\n\n"); + exit(0); + } + + root = DefaultRootWindow(dpy); + + vi = glXChooseVisual(dpy, 0, att); + + if(vi == NULL) { + printf("\n\tno appropriate visual found\n\n"); + exit(0); } + else { + printf("\n\tvisual %p selected\n", (void *)vi->visualid); } /* %p creates hexadecimal output like in glxinfo */ + + cmap = XCreateColormap(dpy, root, vi->visual, AllocNone); + + swa.colormap = cmap; + swa.event_mask = ExposureMask | KeyPressMask; + + win = XCreateWindow(dpy, root, 0, 0, 600, 600, 0, vi->depth, InputOutput, vi->visual, CWColormap | CWEventMask, &swa); + + XMapWindow(dpy, win); + + XStoreName(dpy, win, "VERY SIMPLE APPLICATION"); + + glc = glXCreateContext(dpy, vi, NULL, GL_TRUE); + glXMakeCurrent(dpy, win, glc); + + glEnable(GL_DEPTH_TEST); + + while(1) { + XNextEvent(dpy, &xev); + + if(xev.type == Expose) { + XGetWindowAttributes(dpy, win, &gwa); + glViewport(0, 0, gwa.width, gwa.height); + DrawAQuad(); + glXSwapBuffers(dpy, win); } + + else if(xev.type == KeyPress) { + glXMakeCurrent(dpy, None, NULL); + glXDestroyContext(dpy, glc); + XDestroyWindow(dpy, win); + XCloseDisplay(dpy); + exit(0); } + } /* this closes while(1) { */ +} /* this is the } which closes int main(int argc, char *argv[]) { */