diff options
author | Jonas Suhr Christensen <jsc@umbraculum.org> | 2014-01-18 10:17:58 +0100 |
---|---|---|
committer | Jonas Suhr Christensen <jsc@umbraculum.org> | 2014-01-18 10:17:58 +0100 |
commit | fe9e38995f5a0abc196e9600c38d95385d6bf84f (patch) | |
tree | d106ff875aba7289296f5ed47626f50fc0930d2c /pugl/pugl_test.c | |
parent | 5f1e301d951c10533b101bcddc7a0262780743a3 (diff) |
Added PuGl window drawing. Enable with './configure -with-pugl'.
Diffstat (limited to 'pugl/pugl_test.c')
-rw-r--r-- | pugl/pugl_test.c | 193 |
1 files changed, 193 insertions, 0 deletions
diff --git a/pugl/pugl_test.c b/pugl/pugl_test.c new file mode 100644 index 0000000..b9a54f5 --- /dev/null +++ b/pugl/pugl_test.c @@ -0,0 +1,193 @@ +/* + Copyright 2012 David Robillard <http://drobilla.net> + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +/** + @file pugl_test.c A simple Pugl test that creates a top-level window. +*/ + +#include <stdio.h> +#include <string.h> + +#include "pugl/pugl.h" + +// Argh! +#ifdef __APPLE__ +# include <OpenGL/glu.h> +#else +# include <GL/glu.h> +#endif + +static int quit = 0; +static float xAngle = 0.0f; +static float yAngle = 0.0f; +static float dist = 10.0f; + +static void +onReshape(PuglView* view, int width, int height) +{ + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + glViewport(0, 0, width, height); + gluPerspective(45.0f, width/(float)height, 1.0f, 10.0f); + + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); +} + +static void +onDisplay(PuglView* view) +{ + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + glLoadIdentity(); + + glTranslatef(0.0f, 0.0f, dist * -1); + glRotatef(xAngle, 0.0f, 1.0f, 0.0f); + glRotatef(yAngle, 1.0f, 0.0f, 0.0f); + + glBegin(GL_QUADS); + + glColor3f(0, 0, 0); glVertex3f(-1, -1, -1); + glColor3f(0, 0, 1); glVertex3f(-1, -1, 1); + glColor3f(0, 1, 1); glVertex3f(-1, 1, 1); + glColor3f(0, 1, 0); glVertex3f(-1, 1, -1); + + glColor3f(1, 0, 0); glVertex3f( 1, -1, -1); + glColor3f(1, 0, 1); glVertex3f( 1, -1, 1); + glColor3f(1, 1, 1); glVertex3f( 1, 1, 1); + glColor3f(1, 1, 0); glVertex3f( 1, 1, -1); + + glColor3f(0, 0, 0); glVertex3f(-1, -1, -1); + glColor3f(0, 0, 1); glVertex3f(-1, -1, 1); + glColor3f(1, 0, 1); glVertex3f( 1, -1, 1); + glColor3f(1, 0, 0); glVertex3f( 1, -1, -1); + + glColor3f(0, 1, 0); glVertex3f(-1, 1, -1); + glColor3f(0, 1, 1); glVertex3f(-1, 1, 1); + glColor3f(1, 1, 1); glVertex3f( 1, 1, 1); + glColor3f(1, 1, 0); glVertex3f( 1, 1, -1); + + glColor3f(0, 0, 0); glVertex3f(-1, -1, -1); + glColor3f(0, 1, 0); glVertex3f(-1, 1, -1); + glColor3f(1, 1, 0); glVertex3f( 1, 1, -1); + glColor3f(1, 0, 0); glVertex3f( 1, -1, -1); + + glColor3f(0, 0, 1); glVertex3f(-1, -1, 1); + glColor3f(0, 1, 1); glVertex3f(-1, 1, 1); + glColor3f(1, 1, 1); glVertex3f( 1, 1, 1); + glColor3f(1, 0, 1); glVertex3f( 1, -1, 1); + + glEnd(); +} + +static void +printModifiers(PuglView* view) +{ + int mods = puglGetModifiers(view); + fprintf(stderr, "Modifiers:%s%s%s%s\n", + (mods & PUGL_MOD_SHIFT) ? " Shift" : "", + (mods & PUGL_MOD_CTRL) ? " Ctrl" : "", + (mods & PUGL_MOD_ALT) ? " Alt" : "", + (mods & PUGL_MOD_SUPER) ? " Super" : ""); +} + +static void +onKeyboard(PuglView* view, bool press, uint32_t key) +{ + fprintf(stderr, "Key %c %s ", (char)key, press ? "down" : "up"); + printModifiers(view); + if (key == 'q' || key == 'Q' || key == PUGL_CHAR_ESCAPE || + key == PUGL_CHAR_DELETE || key == PUGL_CHAR_BACKSPACE) { + quit = 1; + } +} + +static void +onSpecial(PuglView* view, bool press, PuglKey key) +{ + fprintf(stderr, "Special key %d %s ", key, press ? "down" : "up"); + printModifiers(view); +} + +static void +onMotion(PuglView* view, int x, int y) +{ + xAngle = x % 360; + yAngle = y % 360; + puglPostRedisplay(view); +} + +static void +onMouse(PuglView* view, int button, bool press, int x, int y) +{ + fprintf(stderr, "Mouse %d %s at %d,%d ", + button, press ? "down" : "up", x, y); + printModifiers(view); +} + +static void +onScroll(PuglView* view, int x, int y, float dx, float dy) +{ + fprintf(stderr, "Scroll %d %d %f %f ", x, y, dx, dy); + printModifiers(view); + dist += dy / 4.0f; + puglPostRedisplay(view); +} + +static void +onClose(PuglView* view) +{ + quit = 1; +} + +int +main(int argc, char** argv) +{ + bool ignoreKeyRepeat = false; + bool resizable = false; + for (int i = 1; i < argc; ++i) { + if (!strcmp(argv[i], "-h")) { + printf("USAGE: %s [OPTIONS]...\n\n" + " -h Display this help\n" + " -i Ignore key repeat\n" + " -r Resizable window\n", argv[0]); + return 0; + } else if (!strcmp(argv[i], "-i")) { + ignoreKeyRepeat = true; + } else if (!strcmp(argv[i], "-r")) { + resizable = true; + } else { + fprintf(stderr, "Unknown option: %s\n", argv[i]); + } + } + + PuglView* view = puglCreate(0, "Pugl Test", 512, 512, resizable, true); + puglIgnoreKeyRepeat(view, ignoreKeyRepeat); + puglSetKeyboardFunc(view, onKeyboard); + puglSetMotionFunc(view, onMotion); + puglSetMouseFunc(view, onMouse); + puglSetScrollFunc(view, onScroll); + puglSetSpecialFunc(view, onSpecial); + puglSetDisplayFunc(view, onDisplay); + puglSetReshapeFunc(view, onReshape); + puglSetCloseFunc(view, onClose); + + while (!quit) { + puglProcessEvents(view); + } + + puglDestroy(view); + return 0; +} |