diff options
author | Tavian Barnes <tavianator@gmail.com> | 2009-07-02 18:12:25 +0000 |
---|---|---|
committer | Tavian Barnes <tavianator@gmail.com> | 2009-07-02 18:12:25 +0000 |
commit | 634bb3ca825dc6659f03a3013694c5c7b64460e8 (patch) | |
tree | 14174ee0ced95e9ced7af5fa69d94118c709cc66 | |
parent | a0571c84673f01b05e6edeb901cca8ff5ae9a023 (diff) | |
download | dimension-634bb3ca825dc6659f03a3013694c5c7b64460e8.tar.xz |
Put windowing interface in libdimension-tests.
-rw-r--r-- | libdimension/raytrace.c | 10 | ||||
-rw-r--r-- | tests/gl.c | 127 | ||||
-rw-r--r-- | tests/tests.c | 179 | ||||
-rw-r--r-- | tests/tests.h | 19 |
4 files changed, 206 insertions, 129 deletions
diff --git a/libdimension/raytrace.c b/libdimension/raytrace.c index 21dfcb9..1984d24 100644 --- a/libdimension/raytrace.c +++ b/libdimension/raytrace.c @@ -196,7 +196,7 @@ dmnsn_raytrace_scene_impl(dmnsn_progress *progress, dmnsn_scene *scene, dmnsn_line ray, ray_trans; dmnsn_array *intersections; dmnsn_color color; - dmnsn_CIE_Lab Lab; + dmnsn_CIE_Lab Lab = { 0.0, 0.0, 0.0 }; // Shut up uninitialized use warning width = scene->canvas->x; height = scene->canvas->y; @@ -229,8 +229,8 @@ dmnsn_raytrace_scene_impl(dmnsn_progress *progress, dmnsn_scene *scene, t = t_temp; /* Color each object differently */ - Lab.a = sin((double)(i + 2)); - Lab.b = cos((double)(i + 2)); + Lab.a = sin((double)(i + 8)); + Lab.b = cos((double)(i + 8)); } } dmnsn_delete_array(intersections); @@ -239,8 +239,8 @@ dmnsn_raytrace_scene_impl(dmnsn_progress *progress, dmnsn_scene *scene, /* Shade according to distance from camera */ if (t >= 0.0) { Lab.L = 100.0*(1.0 - (t - 2.25)/2.25); - Lab.a *= Lab.L; - Lab.b *= Lab.L; + Lab.a *= Lab.L/1.1; + Lab.b *= Lab.L/1.1; color = dmnsn_color_from_Lab(Lab, dmnsn_whitepoint); } @@ -21,21 +21,6 @@ #include "tests.h" #include <stdlib.h> #include <stdio.h> -#include <GL/glx.h> -#include <GL/gl.h> - -typedef struct { - Display *dpy; - Window win; - Colormap cmap; - GLXContext cx; - XEvent event; -} dmnsn_display; - -dmnsn_display *dmnsn_new_display(const dmnsn_canvas *canvas); -void dmnsn_delete_display(dmnsn_display *display); - -void dmnsn_display_frame(dmnsn_display *display); int main() { @@ -129,18 +114,18 @@ main() { ); dmnsn_array_push(scene->objects, &cube); - display = dmnsn_new_display(scene->canvas); + display = dmnsn_new_glX_display(scene->canvas); if (!display) { dmnsn_delete_cube(cube); dmnsn_delete_sphere(sphere); dmnsn_delete_perspective_camera(scene->camera); dmnsn_delete_canvas(scene->canvas); dmnsn_delete_scene(scene); - fprintf(stderr, "--- Couldn't initialize X or GLX! ---\n"); + fprintf(stderr, "--- Couldn't initialize X or glX! ---\n"); return EXIT_FAILURE; } - for (i = 0; i < 48; ++i) { + for (i = 0; i < 10; ++i) { progress = dmnsn_raytrace_scene_async(scene); if (!progress) { dmnsn_delete_display(display); @@ -202,109 +187,3 @@ main() { dmnsn_delete_scene(scene); return EXIT_SUCCESS; } - -static Bool -WaitForNotify(Display *d, XEvent *e, char *arg) -{ - return (e->type == MapNotify) && (e->xmap.window == (Window)arg); -} - -dmnsn_display * -dmnsn_new_display(const dmnsn_canvas *canvas) -{ - int attributeList[] = { - GLX_RGBA, - GLX_DOUBLEBUFFER, - GLX_RED_SIZE, 1, - GLX_GREEN_SIZE, 1, - GLX_BLUE_SIZE, 1, - None - }; - dmnsn_display *display; - XVisualInfo *vi; - XSetWindowAttributes swa; - - display = malloc(sizeof(dmnsn_display)); - if (!display) { - return NULL; - } - - /* Get an X connection */ - display->dpy = XOpenDisplay(0); - if (!display->dpy) { - free(display); - return NULL; - } - - /* Get an appropriate visual */ - vi = glXChooseVisual(display->dpy, DefaultScreen(display->dpy), - attributeList); - if (!vi) { - XCloseDisplay(display->dpy); - free(display); - return NULL; - } - - /* Create a GLX context */ - display->cx = glXCreateContext(display->dpy, vi, 0, GL_TRUE); - if (!display->cx) { - XCloseDisplay(display->dpy); - free(display); - return NULL; - } - - /* Create a color map */ - display->cmap = XCreateColormap(display->dpy, - RootWindow(display->dpy, vi->screen), - vi->visual, AllocNone); - if (!display->cmap) { - glXDestroyContext(display->dpy, display->cx); - XCloseDisplay(display->dpy); - free(display); - return NULL; - } - - /* Create a window */ - swa.colormap = display->cmap; - swa.border_pixel = 0; - swa.event_mask = StructureNotifyMask; - display->win = XCreateWindow(display->dpy, - RootWindow(display->dpy, vi->screen), - 0, 0, canvas->x, canvas->y, - 0, vi->depth, InputOutput, vi->visual, - CWBorderPixel|CWColormap|CWEventMask, &swa); - if (!display->win) { - XFreeColormap(display->dpy, display->cmap); - glXDestroyContext(display->dpy, display->cx); - XCloseDisplay(display->dpy); - free(display); - return NULL; - } - - XMapWindow(display->dpy, display->win); - XIfEvent(display->dpy, &display->event, WaitForNotify, (char*)display->win); - - /* Connect the context to the window */ - glXMakeCurrent(display->dpy, display->win, display->cx); - - return display; -} - -void -dmnsn_delete_display(dmnsn_display *display) -{ - if (display) { - XDestroyWindow(display->dpy, display->win); - XFreeColormap(display->dpy, display->cmap); - glXDestroyContext(display->dpy, display->cx); - XCloseDisplay(display->dpy); - free(display); - } -} - -void -dmnsn_display_frame(dmnsn_display *display) -{ - glFlush(); - glXSwapBuffers(display->dpy, display->win); -} diff --git a/tests/tests.c b/tests/tests.c index b938d39..0816c5d 100644 --- a/tests/tests.c +++ b/tests/tests.c @@ -20,6 +20,185 @@ #include "tests.h" +/* XIfEvent callback */ +static Bool +WaitForNotify(Display *d, XEvent *e, char *arg) +{ + return (e->type == MapNotify) && (e->xmap.window == (Window)arg); +} + +/* New non-glX X window */ +dmnsn_display * +dmnsn_new_X_display(const dmnsn_canvas *canvas) +{ + dmnsn_display *display; + int screen, depth; + Visual *visual; + XSetWindowAttributes swa; + + display = malloc(sizeof(dmnsn_display)); + if (!display) { + return NULL; + } + + /* Get an X connection */ + display->dpy = XOpenDisplay(0); + if (!display->dpy) { + free(display); + return NULL; + } + screen = DefaultScreen(display->dpy); + depth = DefaultDepth(display->dpy, screen); + + /* Get an appropriate visual */ + visual = DefaultVisual(display->dpy, screen); + + /* Set display->cx to NULL */ + display->cx = NULL; + + /* Create a color map */ + display->cmap = XCreateColormap(display->dpy, + RootWindow(display->dpy, screen), + visual, AllocNone); + if (!display->cmap) { + glXDestroyContext(display->dpy, display->cx); + XCloseDisplay(display->dpy); + free(display); + return NULL; + } + + /* Create a window */ + swa.colormap = display->cmap; + swa.border_pixel = 0; + swa.event_mask = StructureNotifyMask; + display->win = XCreateWindow(display->dpy, + RootWindow(display->dpy, screen), + 0, 0, canvas->x, canvas->y, + 0, depth, InputOutput, visual, + CWBorderPixel|CWColormap|CWEventMask, &swa); + if (!display->win) { + XFreeColormap(display->dpy, display->cmap); + glXDestroyContext(display->dpy, display->cx); + XCloseDisplay(display->dpy); + free(display); + return NULL; + } + + XStoreName(display->dpy, display->win, "X"); + + XMapWindow(display->dpy, display->win); + XIfEvent(display->dpy, &display->event, WaitForNotify, (char*)display->win); + + return display; +} + +dmnsn_display * +dmnsn_new_glX_display(const dmnsn_canvas *canvas) +{ + int attributeList[] = { + GLX_RGBA, + GLX_DOUBLEBUFFER, + GLX_RED_SIZE, 1, + GLX_GREEN_SIZE, 1, + GLX_BLUE_SIZE, 1, + None + }; + dmnsn_display *display; + XVisualInfo *vi; + XSetWindowAttributes swa; + + display = malloc(sizeof(dmnsn_display)); + if (!display) { + return NULL; + } + + /* Get an X connection */ + display->dpy = XOpenDisplay(0); + if (!display->dpy) { + free(display); + return NULL; + } + + /* Get an appropriate visual */ + vi = glXChooseVisual(display->dpy, DefaultScreen(display->dpy), + attributeList); + if (!vi) { + XCloseDisplay(display->dpy); + free(display); + return NULL; + } + + /* Create a GLX context */ + display->cx = glXCreateContext(display->dpy, vi, 0, GL_TRUE); + if (!display->cx) { + XCloseDisplay(display->dpy); + free(display); + return NULL; + } + + /* Create a color map */ + display->cmap = XCreateColormap(display->dpy, + RootWindow(display->dpy, vi->screen), + vi->visual, AllocNone); + if (!display->cmap) { + glXDestroyContext(display->dpy, display->cx); + XCloseDisplay(display->dpy); + free(display); + return NULL; + } + + /* Create a window */ + swa.colormap = display->cmap; + swa.border_pixel = 0; + swa.event_mask = StructureNotifyMask; + display->win = XCreateWindow(display->dpy, + RootWindow(display->dpy, vi->screen), + 0, 0, canvas->x, canvas->y, + 0, vi->depth, InputOutput, vi->visual, + CWBorderPixel|CWColormap|CWEventMask, &swa); + if (!display->win) { + XFreeColormap(display->dpy, display->cmap); + glXDestroyContext(display->dpy, display->cx); + XCloseDisplay(display->dpy); + free(display); + return NULL; + } + + XStoreName(display->dpy, display->win, "glX"); + + XMapWindow(display->dpy, display->win); + XIfEvent(display->dpy, &display->event, WaitForNotify, (char*)display->win); + + /* Connect the context to the window */ + glXMakeCurrent(display->dpy, display->win, display->cx); + + return display; +} + +void +dmnsn_delete_display(dmnsn_display *display) +{ + if (display) { + XDestroyWindow(display->dpy, display->win); + XFreeColormap(display->dpy, display->cmap); + if (display->cx) { + glXDestroyContext(display->dpy, display->cx); + } + XCloseDisplay(display->dpy); + free(display); + } +} + +void +dmnsn_display_frame(dmnsn_display *display) +{ + if (display->cx) { + glFlush(); + glXSwapBuffers(display->dpy, display->win); + } + XSync(display->dpy, True); +} + /* Print a progress bar of the progress of `progress' */ void progressbar(const char *str, const dmnsn_progress *progress) diff --git a/tests/tests.h b/tests/tests.h index 49e814c..fa088fc 100644 --- a/tests/tests.h +++ b/tests/tests.h @@ -19,7 +19,26 @@ *************************************************************************/ #include "../libdimension/dimension.h" +#include <GL/glx.h> +#include <GL/gl.h> #include <stdio.h> +typedef struct { + Display *dpy; + Window win; + Colormap cmap; + GLXContext cx; + XEvent event; +} dmnsn_display; + +/* Create a new X window */ +dmnsn_display *dmnsn_new_X_display(const dmnsn_canvas *canvas); +dmnsn_display *dmnsn_new_glX_display(const dmnsn_canvas *canvas); +/* Destroy the X window */ +void dmnsn_delete_display(dmnsn_display *display); + +/* Flush the GL buffers */ +void dmnsn_display_frame(dmnsn_display *display); + /* Print a progress bar of the progress of `progress' */ void progressbar(const char *str, const dmnsn_progress *progress); |