107 lines
2.9 KiB
C
107 lines
2.9 KiB
C
#include <GL/freeglut.h>
|
|
#include <GL/freeglut_std.h>
|
|
#include <GL/gl.h>
|
|
#include <GL/glu.h>
|
|
#include <stdio.h>
|
|
#include <math.h>
|
|
#include "ui.h"
|
|
// Ui stuff
|
|
ui_button buttons[] = {
|
|
{
|
|
/* pos */ { { 0.5, 0.5, 0.0 }, { -50.0, -25.0, 0.0 } },
|
|
/* size */ { 100.0, 50.0, 0.0 },
|
|
/* onclick */ NULL,
|
|
/* text */ "Test :)"
|
|
}
|
|
};
|
|
ui_slider sliders[] = {
|
|
{
|
|
/* pos */ { { 0.5, 0.7, 0.0 }, {-50.0, -5.0, 0.0 } },
|
|
/* size */ { 100.0, 10.0, 10.0 },
|
|
0.1
|
|
}
|
|
};
|
|
|
|
|
|
void display(void) {
|
|
printf("Drawing!\n");
|
|
// Clear screen
|
|
glClearColor(0.0, 0.0, 0.0, 1.0); // Dark theme :)
|
|
glClear(GL_COLOR_BUFFER_BIT);
|
|
// Draw buttons
|
|
for(ui_button* b = buttons; b < buttons + sizeof buttons / sizeof(ui_button); b += 1) {
|
|
ui_button_draw(b);
|
|
}
|
|
for(ui_slider* s = sliders; s < sliders + sizeof sliders / sizeof(ui_slider); s += 1) {
|
|
ui_slider_draw(s);
|
|
}
|
|
|
|
int err = glGetError();
|
|
if(err != 0) {
|
|
printf("opengl error %d: %s\n", err, gluErrorString(err));
|
|
}
|
|
glutSwapBuffers();
|
|
glFlush();
|
|
}
|
|
|
|
void mouseEvent(int button, int state, int x, int y) {
|
|
if(state == 1) {
|
|
for(ui_button* b = buttons; b < buttons + sizeof buttons / sizeof(ui_button); b += 1) {
|
|
if(ui_button_mouse_over(b, x, y) && b->onClick != NULL) {
|
|
b->onClick();
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
for(ui_slider* s = sliders; s < sliders + sizeof sliders / sizeof(ui_slider); s += 1) {
|
|
if(ui_slider_mouse_over(s, x, y)) {
|
|
ui_slider_onclick(s, x, y, button, state);
|
|
}
|
|
}
|
|
}
|
|
|
|
void mouseWheelEvent(int wheel, int dir, int x, int y) {
|
|
printf("wheel event\n");
|
|
for(ui_slider* s = sliders; s < sliders + sizeof sliders / sizeof(ui_slider); s += 1) {
|
|
if(ui_slider_mouse_over(s, x, y)) {
|
|
s->value += dir * 0.05;
|
|
if(s->value < 0.0) s->value = 0.0;
|
|
if(s->value > 1.0) s->value = 1.0;
|
|
printf("Updated %p value to %f\n", s, s->value);
|
|
}
|
|
}
|
|
glutPostRedisplay();
|
|
}
|
|
|
|
void keyboardEvent(unsigned char c, int x, int y) {
|
|
if(c == '\e') {
|
|
glutLeaveMainLoop();
|
|
exit(0);
|
|
}
|
|
if(c == 'a') {
|
|
glutPostRedisplay();
|
|
}
|
|
}
|
|
|
|
int main(int argc, char** argv) {
|
|
/* initialize glut and window */
|
|
glutInit(&argc, argv);
|
|
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
|
|
glutInitWindowSize(800, 500);
|
|
glutInitWindowPosition(450, 450);
|
|
/* create window and set callbacks */
|
|
glutCreateWindow("World of Cow");
|
|
glutDisplayFunc(display);
|
|
glutMouseFunc(mouseEvent);
|
|
glutKeyboardFunc(keyboardEvent);
|
|
glutMouseWheelFunc(mouseWheelEvent);
|
|
|
|
/* set projection and camera */
|
|
glMatrixMode(GL_PROJECTION);
|
|
glLoadIdentity();
|
|
gluOrtho2D(0.0, 800.0, 0.0, 500.0);
|
|
|
|
glutMainLoop();
|
|
|
|
return 0;
|
|
} |