gameui

annotate test.cc @ 3:f1014234dece

transitions in gui elements are awesome :)
author John Tsiombikas <nuclear@member.fsf.org>
date Fri, 21 Mar 2014 03:37:16 +0200
parents 3aa12cdb9925
children e0916bb20b7f
rev   line source
nuclear@0 1 #include <stdio.h>
nuclear@0 2 #include <stdlib.h>
nuclear@0 3 #include <assert.h>
nuclear@3 4 #include <vector>
nuclear@0 5 #include <GL/glut.h>
nuclear@3 6 #include "gameui.h"
nuclear@0 7
nuclear@0 8 static bool init();
nuclear@0 9 static void cleanup();
nuclear@0 10 static void disp();
nuclear@3 11 static void idle();
nuclear@0 12 static void reshape(int x, int y);
nuclear@0 13 static void keypress(unsigned char key, int x, int y);
nuclear@0 14 static void keyrelease(unsigned char key, int x, int y);
nuclear@0 15 static void skeypress(int key, int x, int y);
nuclear@0 16 static void skeyrelease(int key, int x, int y);
nuclear@0 17 static void mouse(int bn, int st, int x, int y);
nuclear@0 18 static void motion(int x, int y);
nuclear@0 19
nuclear@3 20 static std::vector<gameui::Widget*> widgets;
nuclear@3 21
nuclear@0 22 int main(int argc, char **argv)
nuclear@0 23 {
nuclear@0 24 glutInitWindowSize(800, 600);
nuclear@0 25 glutInit(&argc, argv);
nuclear@0 26 glutInitDisplayMode(GLUT_RGB | GLUT_DEPTH | GLUT_DOUBLE);
nuclear@0 27 glutCreateWindow("gameui test");
nuclear@0 28
nuclear@0 29 glutDisplayFunc(disp);
nuclear@3 30 glutIdleFunc(idle);
nuclear@0 31 glutReshapeFunc(reshape);
nuclear@0 32 glutKeyboardFunc(keypress);
nuclear@0 33 glutKeyboardUpFunc(keyrelease);
nuclear@0 34 glutSpecialFunc(skeypress);
nuclear@0 35 glutSpecialUpFunc(skeyrelease);
nuclear@0 36 glutMouseFunc(mouse);
nuclear@0 37 glutMotionFunc(motion);
nuclear@0 38 glutPassiveMotionFunc(motion);
nuclear@0 39
nuclear@0 40 if(!init()) {
nuclear@0 41 return 1;
nuclear@0 42 }
nuclear@0 43 atexit(cleanup);
nuclear@0 44
nuclear@0 45 glutMainLoop();
nuclear@0 46 return 0;
nuclear@0 47 }
nuclear@0 48
nuclear@0 49
nuclear@0 50 static bool init()
nuclear@0 51 {
nuclear@3 52 gameui::Button *button = new gameui::Button;
nuclear@3 53 button->set_position(350, 280);
nuclear@3 54 button->set_size(100, 40);
nuclear@3 55 widgets.push_back(button);
nuclear@3 56
nuclear@0 57 return true;
nuclear@0 58 }
nuclear@0 59
nuclear@0 60 static void cleanup()
nuclear@0 61 {
nuclear@3 62 for(size_t i=0; i<widgets.size(); i++) {
nuclear@3 63 delete widgets[i];
nuclear@3 64 }
nuclear@0 65 }
nuclear@0 66
nuclear@0 67 static void disp()
nuclear@0 68 {
nuclear@3 69 glClearColor(0.2, 0.2, 0.2, 1.0);
nuclear@0 70 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
nuclear@0 71
nuclear@3 72 for(size_t i=0; i<widgets.size(); i++) {
nuclear@3 73 widgets[i]->draw();
nuclear@3 74 }
nuclear@3 75
nuclear@0 76 glutSwapBuffers();
nuclear@0 77 assert(glGetError() == GL_NO_ERROR);
nuclear@0 78 }
nuclear@0 79
nuclear@3 80 static void idle()
nuclear@3 81 {
nuclear@3 82 glutPostRedisplay();
nuclear@3 83 }
nuclear@3 84
nuclear@0 85 static void reshape(int x, int y)
nuclear@0 86 {
nuclear@0 87 glViewport(0, 0, x, y);
nuclear@0 88 glMatrixMode(GL_PROJECTION);
nuclear@0 89 glLoadIdentity();
nuclear@3 90 glOrtho(0, x, 0, y, -1, 1);
nuclear@0 91 }
nuclear@0 92
nuclear@0 93 static void keypress(unsigned char key, int x, int y)
nuclear@0 94 {
nuclear@0 95 if(key == 27) {
nuclear@0 96 exit(0);
nuclear@0 97 }
nuclear@0 98 }
nuclear@0 99
nuclear@0 100 static void keyrelease(unsigned char key, int x, int y)
nuclear@0 101 {
nuclear@0 102 }
nuclear@0 103
nuclear@0 104 static void skeypress(int key, int x, int y)
nuclear@0 105 {
nuclear@0 106 }
nuclear@0 107
nuclear@0 108 static void skeyrelease(int key, int x, int y)
nuclear@0 109 {
nuclear@0 110 }
nuclear@0 111
nuclear@0 112 static void mouse(int bn, int st, int x, int y)
nuclear@0 113 {
nuclear@3 114 int bidx = bn - GLUT_LEFT_BUTTON;
nuclear@3 115 bool down = st == GLUT_DOWN;
nuclear@3 116
nuclear@3 117 for(size_t i=0; i<widgets.size(); i++) {
nuclear@3 118 gameui::Widget *w = widgets[i];
nuclear@3 119
nuclear@3 120 if(w->hit_test(gameui::Vec2(x, y))) {
nuclear@3 121 gameui::Event ev;
nuclear@3 122 ev.type = gameui::EV_MOUSE_BUTTON;
nuclear@3 123 ev.button.button = bidx;
nuclear@3 124 ev.button.press = down;
nuclear@3 125 ev.button.pos = gameui::Vec2(x, y);
nuclear@3 126 w->handle_event(ev);
nuclear@3 127 }
nuclear@3 128 }
nuclear@0 129 }
nuclear@0 130
nuclear@0 131 static void motion(int x, int y)
nuclear@0 132 {
nuclear@3 133 static gameui::Widget *active;
nuclear@3 134
nuclear@3 135 if(active && !active->hit_test(gameui::Vec2(x, y))) {
nuclear@3 136 gameui::Event ev;
nuclear@3 137 ev.type = gameui::EV_MOUSE_FOCUS;
nuclear@3 138 ev.focus.enter = false;
nuclear@3 139 active->handle_event(ev);
nuclear@3 140 active = 0;
nuclear@3 141 }
nuclear@3 142
nuclear@3 143 for(size_t i=0; i<widgets.size(); i++) {
nuclear@3 144 gameui::Widget *w = widgets[i];
nuclear@3 145
nuclear@3 146 if(w->hit_test(gameui::Vec2(x, y))) {
nuclear@3 147 if(active != w) {
nuclear@3 148 gameui::Event ev;
nuclear@3 149 ev.type = gameui::EV_MOUSE_FOCUS;
nuclear@3 150 ev.focus.enter = true;
nuclear@3 151 w->handle_event(ev);
nuclear@3 152 active = w;
nuclear@3 153 }
nuclear@3 154 }
nuclear@3 155 }
nuclear@0 156 }