buttons can be drawn
This commit is contained in:
parent
cedf7cac74
commit
96d7127021
7 changed files with 113 additions and 35 deletions
13
Makefile
13
Makefile
|
@ -1,5 +1,12 @@
|
||||||
build:
|
OBJ = ui.o vec.o
|
||||||
gcc mmn_17.c -lglut -lGL -lGLU -lm -o mmn_17
|
CFLAGS = -g -Wall
|
||||||
|
|
||||||
|
build: $(OBJ)
|
||||||
|
gcc $(CFLAGS) mmn_17.c $(OBJ) -lglut -lGL -lGLU -lm -o mmn_17
|
||||||
|
|
||||||
|
%.o : %.c
|
||||||
|
gcc -c $(CFLAGS) $< -o $@
|
||||||
|
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
rm mmn_17
|
rm *.o mmn_17
|
||||||
|
|
22
mmn_17.c
22
mmn_17.c
|
@ -1,13 +1,33 @@
|
||||||
#include <GL/freeglut.h>
|
#include <GL/freeglut.h>
|
||||||
#include <GL/freeglut_std.h>
|
#include <GL/freeglut_std.h>
|
||||||
#include <GL/gl.h>
|
#include <GL/gl.h>
|
||||||
|
#include <GL/glu.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <math.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 :)"
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
void display(void) {
|
void display(void) {
|
||||||
// Clear screen
|
// Clear screen
|
||||||
glClearColor(0.0, 0.0, 0.0, 1.0); // Dark theme :)
|
glClearColor(0.0, 0.0, 0.0, 1.0); // Dark theme :)
|
||||||
glClear(GL_COLOR_BUFFER_BIT);
|
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);
|
||||||
|
}
|
||||||
|
int err = glGetError();
|
||||||
|
if(err != 0) {
|
||||||
|
printf("opengl error %d: %s\n", err, gluErrorString(err));
|
||||||
|
}
|
||||||
|
glutSwapBuffers();
|
||||||
glFlush();
|
glFlush();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -22,7 +42,7 @@ int main(int argc, char** argv) {
|
||||||
glutInitWindowSize(800, 500);
|
glutInitWindowSize(800, 500);
|
||||||
glutInitWindowPosition(450, 450);
|
glutInitWindowPosition(450, 450);
|
||||||
/* create window and set callbacks */
|
/* create window and set callbacks */
|
||||||
glutCreateWindow("glutLeaveMainLoop is undefined if called from a nested loop");
|
glutCreateWindow("World of Cow");
|
||||||
glutDisplayFunc(display);
|
glutDisplayFunc(display);
|
||||||
glutMouseFunc(mouseEvent);
|
glutMouseFunc(mouseEvent);
|
||||||
|
|
||||||
|
|
47
ui.c
47
ui.c
|
@ -0,0 +1,47 @@
|
||||||
|
#include "ui.h"
|
||||||
|
#include "vec.h"
|
||||||
|
#include <GL/freeglut_std.h>
|
||||||
|
#include <GL/freeglut_ext.h>
|
||||||
|
#include <GL/glut.h>
|
||||||
|
#include <GL/gl.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
void ui_button_draw(ui_button* b) {
|
||||||
|
printf("drawing button %p\n", b);
|
||||||
|
int wWidth = glutGet(GLUT_WINDOW_WIDTH);
|
||||||
|
int wHeight = glutGet(GLUT_WINDOW_HEIGHT);
|
||||||
|
|
||||||
|
vec3 pos = vec3_add(b->position.absolute, vec3_new(b->position.relative.x * wWidth, b->position.relative.y * wHeight, 0.0));
|
||||||
|
vec3 ext = b->size;
|
||||||
|
glColor3f(1.0, 1.0, 1.0);
|
||||||
|
glBegin(GL_QUADS);
|
||||||
|
glVertexVec(pos);
|
||||||
|
glVertex3f(pos.x + ext.x, pos.y, pos.z);
|
||||||
|
glVertexVec(vec3_add(pos, ext));
|
||||||
|
glVertex3f(pos.x, pos.y + ext.y, pos.z);
|
||||||
|
glEnd();
|
||||||
|
// Draw text if needed
|
||||||
|
if(b->text != NULL) {
|
||||||
|
glColor3f(0.0, 0.0, 0.0);
|
||||||
|
// Get text size
|
||||||
|
int textWidth = glutBitmapLength(GLUT_BITMAP_TIMES_ROMAN_24, (unsigned char*)b->text);
|
||||||
|
int textHeight = glutBitmapHeight(GLUT_BITMAP_TIMES_ROMAN_24);
|
||||||
|
// set raster position - not gonna take into account multiple line text buttons
|
||||||
|
vec3 rPos = vec3_add(pos, vec3_mult(ext, 0.5));
|
||||||
|
rPos.x -= textWidth * 0.5;
|
||||||
|
rPos.y -= textHeight * 0.25;
|
||||||
|
glRasterPos3f(rPos.x, rPos.y, rPos.z);
|
||||||
|
glutBitmapString(GLUT_BITMAP_TIMES_ROMAN_24, (unsigned char*)b->text);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
char ui_button_mouse_over(ui_button* b) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ui_slider_draw(ui_slider* s) {
|
||||||
|
|
||||||
|
}
|
||||||
|
char ui_slider_mouse_over(ui_slider* s) {
|
||||||
|
return 0;
|
||||||
|
}
|
27
ui.h
27
ui.h
|
@ -1,12 +1,31 @@
|
||||||
#ifndef __UI_BUTTON
|
#ifndef __UI
|
||||||
#define __UI_BUTTON
|
#define __UI
|
||||||
#include "vec.h"
|
#include "vec.h"
|
||||||
|
|
||||||
|
typedef struct _ui_position {
|
||||||
|
vec3 relative;
|
||||||
|
vec3 absolute;
|
||||||
|
} ui_pos;
|
||||||
|
|
||||||
typedef struct _ui_button {
|
typedef struct _ui_button {
|
||||||
vec3 relative; // Position relative to screen size
|
ui_pos position;
|
||||||
vec3 absolute; // position in pixels(added to relative)
|
/* x,y - width,height, z - unused */
|
||||||
vec3 size; // size in pixels - if screen is too small i am not sure if it is a smart idea to make everything smaller
|
vec3 size; // size in pixels - if screen is too small i am not sure if it is a smart idea to make everything smaller
|
||||||
void (*onClick); // instead of passing stuff in, im just gonna put every state variable in global scope to ensure everything lives...
|
void (*onClick); // instead of passing stuff in, im just gonna put every state variable in global scope to ensure everything lives...
|
||||||
|
char* text;
|
||||||
} ui_button;
|
} ui_button;
|
||||||
|
|
||||||
|
typedef struct _ui_slider {
|
||||||
|
ui_pos position;
|
||||||
|
/* x - width, y - height, z - middle circle radius */
|
||||||
|
vec3 size;
|
||||||
|
float value; // Value will always range between 0 and 1
|
||||||
|
} ui_slider;
|
||||||
|
|
||||||
|
void ui_button_draw(ui_button* b);
|
||||||
|
char ui_button_mouse_over(ui_button* b);
|
||||||
|
|
||||||
|
void ui_slider_draw(ui_slider* s);
|
||||||
|
char ui_slider_mouse_over(ui_slider* s);
|
||||||
|
|
||||||
#endif
|
#endif
|
25
ui_button.h
25
ui_button.h
|
@ -1,25 +0,0 @@
|
||||||
#ifndef __UI
|
|
||||||
#define __UI
|
|
||||||
#include "vec.h"
|
|
||||||
|
|
||||||
typedef struct _ui_position {
|
|
||||||
vec3 relative;
|
|
||||||
vec3 absolute;
|
|
||||||
} ui_pos;
|
|
||||||
|
|
||||||
typedef struct _ui_button {
|
|
||||||
ui_pos position;
|
|
||||||
/* x,y - width,height, z - unused */
|
|
||||||
vec3 size; // size in pixels - if screen is too small i am not sure if it is a smart idea to make everything smaller
|
|
||||||
void (*onClick); // instead of passing stuff in, im just gonna put every state variable in global scope to ensure everything lives...
|
|
||||||
char* text;
|
|
||||||
} ui_button;
|
|
||||||
|
|
||||||
typedef struct _ui_slider {
|
|
||||||
ui_pos position;
|
|
||||||
/* x - width, y - height, z - middle circle radius */
|
|
||||||
vec3 size;
|
|
||||||
float value; // Value will always range between 0 and 1
|
|
||||||
} ui_slider;
|
|
||||||
|
|
||||||
#endif
|
|
8
vec.c
8
vec.c
|
@ -1,4 +1,5 @@
|
||||||
#include "vec.h"
|
#include "vec.h"
|
||||||
|
#include <GL/gl.h>
|
||||||
|
|
||||||
vec3 vec3_new(float x, float y, float z) {
|
vec3 vec3_new(float x, float y, float z) {
|
||||||
vec3 r = { x, y, z };
|
vec3 r = { x, y, z };
|
||||||
|
@ -26,4 +27,11 @@ float vec3_dot(vec3 a, vec3 b) {
|
||||||
vec3 vec3_mult(vec3 a, float s) {
|
vec3 vec3_mult(vec3 a, float s) {
|
||||||
vec3 r = { a.x * s, a.y * s, a.z * s };
|
vec3 r = { a.x * s, a.y * s, a.z * s };
|
||||||
return r;
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
void glVertexVec(vec3 v) {
|
||||||
|
glVertex3f(v.x, v.y, v.z);
|
||||||
|
}
|
||||||
|
void glColorVec(vec3 v) {
|
||||||
|
glColor3f(v.x, v.y, v.z);
|
||||||
}
|
}
|
6
vec.h
6
vec.h
|
@ -7,8 +7,6 @@ typedef struct _vec3 {
|
||||||
float z;
|
float z;
|
||||||
} vec3;
|
} vec3;
|
||||||
|
|
||||||
const vec3 ZERO = { 0.0, 0.0, 0.0};
|
|
||||||
|
|
||||||
vec3 vec3_new(float x, float y, float z);
|
vec3 vec3_new(float x, float y, float z);
|
||||||
vec3 vec3_splat(float f);
|
vec3 vec3_splat(float f);
|
||||||
vec3 vec3_add(vec3 a, vec3 b);
|
vec3 vec3_add(vec3 a, vec3 b);
|
||||||
|
@ -16,4 +14,8 @@ vec3 vec3_sub(vec3 a, vec3 b);
|
||||||
float vec3_dot(vec3 a, vec3 b);
|
float vec3_dot(vec3 a, vec3 b);
|
||||||
vec3 vec3_mult(vec3 a, float s);
|
vec3 vec3_mult(vec3 a, float s);
|
||||||
|
|
||||||
|
// Some opengl extensions to support these vectors
|
||||||
|
void glVertexVec(vec3 v);
|
||||||
|
void glColorVec(vec3 v);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in a new issue