working on interfaces and buttons
This commit is contained in:
parent
04d782f55a
commit
cc7f169340
BIN
obj/base.o
BIN
obj/base.o
Binary file not shown.
BIN
obj/main.o
BIN
obj/main.o
Binary file not shown.
BIN
obj/menus.o
BIN
obj/menus.o
Binary file not shown.
14
src/base.c
14
src/base.c
|
@ -63,6 +63,20 @@ int max(int a, int b) {
|
||||||
return a;
|
return a;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
float minf(float a, float b) {
|
||||||
|
if(a > b) {
|
||||||
|
return b;
|
||||||
|
};
|
||||||
|
return a;
|
||||||
|
}
|
||||||
|
|
||||||
|
float maxf(float a, float b) {
|
||||||
|
if(a < b) {
|
||||||
|
return b;
|
||||||
|
};
|
||||||
|
return a;
|
||||||
|
}
|
||||||
|
|
||||||
double mind(double a, double b) {
|
double mind(double a, double b) {
|
||||||
if(a > b) {
|
if(a > b) {
|
||||||
return b;
|
return b;
|
||||||
|
|
|
@ -9,6 +9,8 @@ int min(int a, int b);
|
||||||
int max(int a, int b);
|
int max(int a, int b);
|
||||||
double mind(double a, double b);
|
double mind(double a, double b);
|
||||||
double maxd(double a, double b);
|
double maxd(double a, double b);
|
||||||
|
float minf(float a, float b);
|
||||||
|
float maxf(float a, float b);
|
||||||
double absf(double n);
|
double absf(double n);
|
||||||
int convex_seg(int x1, int x2, double theta);
|
int convex_seg(int x1, int x2, double theta);
|
||||||
double convex_tri(double a, double tha, double b, double thb, double c, double thc);
|
double convex_tri(double a, double tha, double b, double thb, double c, double thc);
|
||||||
|
|
15
src/main.c
15
src/main.c
|
@ -29,7 +29,7 @@ double jPress = false;
|
||||||
double gPress = false;
|
double gPress = false;
|
||||||
double rPress = false;
|
double rPress = false;
|
||||||
|
|
||||||
void reset_everything(char* folder) {
|
void reset_everything(int count, char* folder) {
|
||||||
hashtbl_free(visited);
|
hashtbl_free(visited);
|
||||||
free_proj();
|
free_proj();
|
||||||
free_interf();
|
free_interf();
|
||||||
|
@ -40,7 +40,7 @@ void reset_everything(char* folder) {
|
||||||
init_ent_generator(10);
|
init_ent_generator(10);
|
||||||
init_proj();
|
init_proj();
|
||||||
init_interf();
|
init_interf();
|
||||||
parse_rooms(1, folder);
|
parse_rooms(count, folder);
|
||||||
}
|
}
|
||||||
|
|
||||||
void processInput(GLFWwindow *window, float dtime) {
|
void processInput(GLFWwindow *window, float dtime) {
|
||||||
|
@ -174,11 +174,11 @@ void processInput(GLFWwindow *window, float dtime) {
|
||||||
if(glfwGetKey(window, GLFW_KEY_R) == GLFW_PRESS) {
|
if(glfwGetKey(window, GLFW_KEY_R) == GLFW_PRESS) {
|
||||||
if(!rPress) {
|
if(!rPress) {
|
||||||
rPress = true;
|
rPress = true;
|
||||||
reset_everything("levels/level_00/");
|
reset_everything(7, "templates/");
|
||||||
}
|
}
|
||||||
} else {
|
}/*else {
|
||||||
rPress = false;
|
rPress = false;
|
||||||
}
|
}*/
|
||||||
}
|
}
|
||||||
|
|
||||||
const char *vertexShaderSource = "#version 330 core\n"
|
const char *vertexShaderSource = "#version 330 core\n"
|
||||||
|
@ -412,8 +412,7 @@ int main_alt() {
|
||||||
gl_drawInteger(shaderProgramR, triCount, 0.0f, 0.92f, 0.04f, 128, 128, 128, 0.005f, 1);
|
gl_drawInteger(shaderProgramR, triCount, 0.0f, 0.92f, 0.04f, 128, 128, 128, 0.005f, 1);
|
||||||
gl_drawData(shaderProgramR);
|
gl_drawData(shaderProgramR);
|
||||||
|
|
||||||
// glfw: swap buffers and poll IO events (keys pressed/released, mouse moved etc.)
|
if(!isInMenu(shaderProgramR)) {
|
||||||
// -------------------------------------------------------------------------------
|
|
||||||
processInput(window, delta);
|
processInput(window, delta);
|
||||||
if(gamemode == 0) {
|
if(gamemode == 0) {
|
||||||
movePlayerG(delta);
|
movePlayerG(delta);
|
||||||
|
@ -421,10 +420,12 @@ int main_alt() {
|
||||||
teleport_on_edge();
|
teleport_on_edge();
|
||||||
update_entities(delta);
|
update_entities(delta);
|
||||||
updateProj(delta);
|
updateProj(delta);
|
||||||
|
}
|
||||||
|
|
||||||
usleep(max(0, interval-(int)(1000000*delta)));
|
usleep(max(0, interval-(int)(1000000*delta)));
|
||||||
sim_time += deltad;
|
sim_time += deltad;
|
||||||
|
|
||||||
|
// glfw: swap buffers and poll IO events (keys pressed/released, mouse moved etc.)
|
||||||
glfwSwapBuffers(window);
|
glfwSwapBuffers(window);
|
||||||
glfwPollEvents();
|
glfwPollEvents();
|
||||||
|
|
||||||
|
|
225
src/menus.c
225
src/menus.c
|
@ -10,7 +10,7 @@
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
#include <glad/glad.h>
|
#include <glad/glad.h>
|
||||||
#include "../include/glad/glad.h"
|
#include "../include/glad/glad.h"
|
||||||
//#include <GLFW/glfw3.h>
|
#include <GLFW/glfw3.h>
|
||||||
#include <cglm/cglm.h>
|
#include <cglm/cglm.h>
|
||||||
|
|
||||||
#include "hash.h"
|
#include "hash.h"
|
||||||
|
@ -106,6 +106,7 @@ void gl_drawDigit(unsigned int fragShader, int n, float x, float y, float size,
|
||||||
}
|
}
|
||||||
|
|
||||||
// 7-segment display
|
// 7-segment display
|
||||||
|
// y is the middle of the text
|
||||||
// side can be -1 (aligned right) or 1 (aligned left)
|
// side can be -1 (aligned right) or 1 (aligned left)
|
||||||
void gl_drawInteger(unsigned int fragShader, int n, float x, float y, float size, int r, int g, int b, float width, int side) {
|
void gl_drawInteger(unsigned int fragShader, int n, float x, float y, float size, int r, int g, int b, float width, int side) {
|
||||||
int left = n;
|
int left = n;
|
||||||
|
@ -277,6 +278,7 @@ int get_string_len(char* s) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// 7-segment display
|
// 7-segment display
|
||||||
|
// y is the middle of the text
|
||||||
// side can be -1 (aligned right) or 1 (aligned left)
|
// side can be -1 (aligned right) or 1 (aligned left)
|
||||||
void gl_drawString(unsigned int fragShader, char* str, float x, float y, float size, int r, int g, int b, float width, int side) {
|
void gl_drawString(unsigned int fragShader, char* str, float x, float y, float size, int r, int g, int b, float width, int side) {
|
||||||
float curx = x;
|
float curx = x;
|
||||||
|
@ -343,15 +345,232 @@ void gl_initDrawRect(unsigned int shaderProgram) {
|
||||||
glUseProgram(shaderProgram);
|
glUseProgram(shaderProgram);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------------------------------------------------------------------------------------ //
|
||||||
|
|
||||||
static onoff_button* buttonList;
|
static onoff_button* buttonList;
|
||||||
static interface* interfaceList;
|
static interface* interfaceList;
|
||||||
|
|
||||||
|
static int MAX_BUTTON_SIZE = 1024;
|
||||||
|
static int MAX_INTERFACE_SIZE = 192;
|
||||||
|
|
||||||
|
static int bListId;
|
||||||
|
static int intListId;
|
||||||
|
|
||||||
|
static int* current_interface = NULL;
|
||||||
|
|
||||||
|
void display_button(int but_id, unsigned int fragShader) {
|
||||||
|
if(but_id < 0 || but_id > bListId) {
|
||||||
|
fprintf(stderr, "ERROR : attempting to display a non-existing button (%d)\n", but_id);
|
||||||
|
} else {
|
||||||
|
float size = minf(buttonList[but_id].h/2.1f, (buttonList[but_id].w)/get_string_len(buttonList[but_id].text));
|
||||||
|
gl_drawRect(fragShader, buttonList[but_id].x, buttonList[but_id].y, buttonList[but_id].w, buttonList[but_id].h, buttonList[but_id].red, buttonList[but_id].green, buttonList[but_id].blue);
|
||||||
|
gl_drawString(fragShader, buttonList[but_id].text, buttonList[but_id].x+(size+size/10.0f)/2.0f, buttonList[but_id].y+buttonList[but_id].h/2.0f, size, 255-buttonList[but_id].red, 255-buttonList[but_id].green, 255-buttonList[but_id].blue, size/10.0f, 1);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void display_interface(int int_id, unsigned int fragShader) {
|
||||||
|
if(int_id < 0 || int_id > intListId) {
|
||||||
|
fprintf(stderr, "ERROR : attempting to display a non-existing interface (%d)\n", int_id);
|
||||||
|
} else {
|
||||||
|
float size = minf(interfaceList[int_id].h/2.1f, (interfaceList[int_id].w)/get_string_len(interfaceList[int_id].title));
|
||||||
|
gl_drawRect(fragShader, interfaceList[int_id].x, interfaceList[int_id].y, interfaceList[int_id].w, interfaceList[int_id].h, interfaceList[int_id].red, interfaceList[int_id].green, interfaceList[int_id].blue);
|
||||||
|
gl_drawString(fragShader, interfaceList[int_id].title, interfaceList[int_id].x+(size+size/10.0f)/2.0f, interfaceList[int_id].y+interfaceList[int_id].h/2.0f, size, 255-interfaceList[int_id].red, 255-interfaceList[int_id].green, 255-interfaceList[int_id].blue, size/10.0f, 1);
|
||||||
|
|
||||||
|
for(int k = 0; k < interfaceList[int_id].nButtons; k++) {
|
||||||
|
display_button(interfaceList[int_id].buttons[k], fragShader);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool is_button_pressed(int but_id, float mx, float my) {
|
||||||
|
if(but_id < 0 || but_id > bListId) {
|
||||||
|
fprintf(stderr, "ERROR : attempting to update a non-existing button (%d)\n", but_id);
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
return (mx >= buttonList[but_id].x && my >= buttonList[but_id].y && mx <= buttonList[but_id].x+buttonList[but_id].w && my <= buttonList[but_id].y+buttonList[but_id].h);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void menu_actions(int int_id) {
|
||||||
|
if(int_id < 0 || int_id > intListId) {
|
||||||
|
fprintf(stderr, "ERROR : attempting to update a non-existing interface (%d)\n", int_id);
|
||||||
|
} else if(false /* TODO : mouse is clicked */) {
|
||||||
|
float mx = 0.0f;
|
||||||
|
float my = 0.0f;
|
||||||
|
/* TODO : get mouse position and state */
|
||||||
|
for(int k = 0; k < interfaceList[int_id].nButtons; k++) {
|
||||||
|
if(is_button_pressed(interfaceList[int_id].buttons[k], mx, my)) {
|
||||||
|
switch (buttonList[interfaceList[int_id].buttons[k]].type) {
|
||||||
|
case WARP:
|
||||||
|
*current_interface = *buttonList[interfaceList[int_id].buttons[k]].metadata;
|
||||||
|
break;
|
||||||
|
case SET_VAR:
|
||||||
|
/* TODO */
|
||||||
|
break;
|
||||||
|
case EXIT:
|
||||||
|
current_interface = NULL;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool isInMenu(unsigned int fragShader) {
|
||||||
|
if(current_interface == NULL) {
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
display_interface(*current_interface, fragShader);
|
||||||
|
menu_actions(*current_interface);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void init_interf() {
|
void init_interf() {
|
||||||
buttonList = malloc(sizeof(onoff_button)*256);
|
buttonList = malloc(sizeof(onoff_button)*MAX_BUTTON_SIZE);
|
||||||
interfaceList = malloc(sizeof(interface)*64);
|
for(int k = 0; k < MAX_BUTTON_SIZE; k++) {
|
||||||
|
buttonList[k].id = -1;
|
||||||
|
}
|
||||||
|
interfaceList = malloc(sizeof(interface)*MAX_INTERFACE_SIZE);
|
||||||
|
for(int k = 0; k < MAX_INTERFACE_SIZE; k++) {
|
||||||
|
interfaceList[k].intfid = -1;
|
||||||
|
}
|
||||||
|
bListId = 0;
|
||||||
|
intListId = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// returns the ID of the new button (-1 if error)
|
||||||
|
int button_create_onoff(char* text, int red, int green, int blue, float x, float y, float w, float h, button_action actn, int* val) {
|
||||||
|
if(bListId < MAX_BUTTON_SIZE) {
|
||||||
|
|
||||||
|
buttonList[bListId].id = bListId;
|
||||||
|
buttonList[bListId].text = text;
|
||||||
|
buttonList[bListId].red = red;
|
||||||
|
buttonList[bListId].green = green;
|
||||||
|
buttonList[bListId].blue = blue;
|
||||||
|
|
||||||
|
buttonList[bListId].x = x;
|
||||||
|
buttonList[bListId].y = y;
|
||||||
|
buttonList[bListId].w = w;
|
||||||
|
buttonList[bListId].h = h;
|
||||||
|
|
||||||
|
buttonList[bListId].type = actn;
|
||||||
|
buttonList[bListId].metadata = val;
|
||||||
|
|
||||||
|
bListId += 1;
|
||||||
|
return (bListId-1);
|
||||||
|
} else {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// returns the ID of the new interface (-1 if error)
|
||||||
|
int interface_create(char* title, int red, int green, int blue, float x, float y, float w, float h) {
|
||||||
|
if(intListId < MAX_INTERFACE_SIZE) {
|
||||||
|
interfaceList[intListId].intfid = intListId;
|
||||||
|
|
||||||
|
interfaceList[intListId].title = title;
|
||||||
|
interfaceList[intListId].red = red;
|
||||||
|
interfaceList[intListId].green = green;
|
||||||
|
interfaceList[intListId].blue = blue;
|
||||||
|
|
||||||
|
interfaceList[intListId].x = x;
|
||||||
|
interfaceList[intListId].y = y;
|
||||||
|
interfaceList[intListId].w = w;
|
||||||
|
interfaceList[intListId].h = h;
|
||||||
|
|
||||||
|
interfaceList[intListId].buttons = malloc(sizeof(int*)*16);
|
||||||
|
interfaceList[intListId].nButtons = 0;
|
||||||
|
interfaceList[intListId].nMemButtons = 16;
|
||||||
|
|
||||||
|
intListId += 1;
|
||||||
|
return (intListId-1);
|
||||||
|
} else {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void interface_link_button(int interface_id, int button_id) {
|
||||||
|
if(interface_id < 0 || interface_id >= intListId) {
|
||||||
|
fprintf(stderr, "ERROR : attempting to link non-existing interface (%d)\n", interface_id);
|
||||||
|
} else if(button_id < 0 || button_id >= bListId) {
|
||||||
|
fprintf(stderr, "ERROR : attempting to link non-existing button (%d)\n", button_id);
|
||||||
|
} else {
|
||||||
|
if(interfaceList[interface_id].nMemButtons == interfaceList[interface_id].nButtons) {
|
||||||
|
int* newI = malloc(sizeof(int)*2*interfaceList[interface_id].nMemButtons);
|
||||||
|
for(int k = 0; k < interfaceList[interface_id].nMemButtons; k++) {
|
||||||
|
newI[k] = interfaceList[interface_id].buttons[k];
|
||||||
|
}
|
||||||
|
free(interfaceList[interface_id].buttons);
|
||||||
|
interfaceList[interface_id].buttons = newI;
|
||||||
|
interfaceList[interface_id].nMemButtons *= 2;
|
||||||
|
}
|
||||||
|
interfaceList[interface_id].buttons[interfaceList[interface_id].nButtons] = button_id;
|
||||||
|
interfaceList[interface_id].nButtons += 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void interface_unlink_button(int interface_id, int button_id) {
|
||||||
|
if(interface_id < 0 || interface_id >= intListId) {
|
||||||
|
fprintf(stderr, "ERROR : attempting to unlink non-existing interface (%d)\n", interface_id);
|
||||||
|
} else if(button_id < 0 || button_id >= bListId) {
|
||||||
|
fprintf(stderr, "ERROR : attempting to unlink non-existing button (%d)\n", button_id);
|
||||||
|
} else {
|
||||||
|
int not_found = 1;
|
||||||
|
for(int k = 0; k < not_found*interfaceList[interface_id].nButtons; k++) {
|
||||||
|
if(interfaceList[interface_id].buttons[k] == button_id) {
|
||||||
|
not_found = 0;
|
||||||
|
interfaceList[interface_id].buttons[k] = interfaceList[interface_id].buttons[interfaceList[interface_id].nButtons-1];
|
||||||
|
interfaceList[interface_id].nButtons -= 1;
|
||||||
|
}
|
||||||
|
if(not_found) {
|
||||||
|
fprintf(stderr, "WARNING : interface %d does not link to buttton %d\n", interface_id, button_id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void interface_set(int interface_id) {
|
||||||
|
*current_interface = interface_id;
|
||||||
}
|
}
|
||||||
|
|
||||||
void free_interf() {
|
void free_interf() {
|
||||||
free(buttonList);
|
free(buttonList);
|
||||||
free(interfaceList);
|
free(interfaceList);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
typedef struct onoff_button {
|
||||||
|
int id;
|
||||||
|
|
||||||
|
char* text;
|
||||||
|
float x; float y; float w; float h;
|
||||||
|
int red;
|
||||||
|
int green;
|
||||||
|
int blue;
|
||||||
|
|
||||||
|
// {WARP, SET_VAR}
|
||||||
|
button_action type;
|
||||||
|
|
||||||
|
// the value to change (if SET_VAR) or the destination interface (if WARP)
|
||||||
|
int* metadata;
|
||||||
|
} onoff_button;
|
||||||
|
|
||||||
|
typedef struct interface {
|
||||||
|
int intfid;
|
||||||
|
|
||||||
|
char* title;
|
||||||
|
float x; float y; float w; float h;
|
||||||
|
int red;
|
||||||
|
int green;
|
||||||
|
int blue;
|
||||||
|
|
||||||
|
int* buttons;
|
||||||
|
int nButtons;
|
||||||
|
int nMemButtons;
|
||||||
|
} interface;
|
||||||
|
*/
|
26
src/menus.h
26
src/menus.h
|
@ -1,18 +1,16 @@
|
||||||
#ifndef MENUS_H
|
#ifndef MENUS_H
|
||||||
#define MENUS_H
|
#define MENUS_H
|
||||||
|
|
||||||
typedef enum button_action {WARP, SET_VAR} button_action ;
|
typedef enum button_action {WARP, SET_VAR, EXIT} button_action ;
|
||||||
|
|
||||||
typedef struct onoff_button {
|
typedef struct onoff_button {
|
||||||
int id;
|
int id;
|
||||||
|
|
||||||
char* text;
|
char* text;
|
||||||
double x; double y; double w; double h;
|
float x; float y; float w; float h;
|
||||||
int red;
|
int red; int green; int blue;
|
||||||
int green;
|
|
||||||
int blue;
|
|
||||||
|
|
||||||
// {WARP, SET_VAR}
|
// {WARP, SET_VAR, EXIT}
|
||||||
button_action type;
|
button_action type;
|
||||||
|
|
||||||
// the value to change (if SET_VAR) or the destination interface (if WARP)
|
// the value to change (if SET_VAR) or the destination interface (if WARP)
|
||||||
|
@ -23,9 +21,12 @@ typedef struct interface {
|
||||||
int intfid;
|
int intfid;
|
||||||
|
|
||||||
char* title;
|
char* title;
|
||||||
|
float x; float y; float w; float h;
|
||||||
|
int red; int green; int blue;
|
||||||
|
|
||||||
onoff_button* buttons;
|
int* buttons;
|
||||||
int nbuttons;
|
int nButtons;
|
||||||
|
int nMemButtons;
|
||||||
} interface;
|
} interface;
|
||||||
|
|
||||||
void initMenus();
|
void initMenus();
|
||||||
|
@ -38,6 +39,15 @@ void gl_drawString(unsigned int fragShader, char* str, float x, float y, float s
|
||||||
void gl_printf(unsigned int fragShader, float x, float y, float size, float width, int r, int g, int b, const char* str, ...);
|
void gl_printf(unsigned int fragShader, float x, float y, float size, float width, int r, int g, int b, const char* str, ...);
|
||||||
|
|
||||||
void init_interf();
|
void init_interf();
|
||||||
|
|
||||||
|
bool isInMenu(unsigned int fragShader);
|
||||||
|
|
||||||
|
int button_create_onoff(char* text, int red, int green, int blue, float x, float y, float w, float h, button_action actn, int* val);
|
||||||
|
int interface_create(char* title, int red, int green, int blue, float x, float y, float w, float h);
|
||||||
|
void interface_link_button(int interface_id, int button_id);
|
||||||
|
void interface_unlink_button(int interface_id, int button_id);
|
||||||
|
void interface_set(int interface_id);
|
||||||
|
|
||||||
void free_interf();
|
void free_interf();
|
||||||
|
|
||||||
#endif
|
#endif
|
Loading…
Reference in New Issue