#include #include #include #include #include #include #include #include #include #include #include #include "../include/glad/glad.h" //#include #include #include "hash.h" #include "structure.h" #include "base.h" #include "entities.h" #include "menus.h" float rectDefault[18] ; static mat4 scale, slide; void initMenus() { rectDefault[0] = -0.5f; rectDefault[1] = -0.5f; rectDefault[2] = -1.0f; rectDefault[3] = -0.5f; rectDefault[4] = 0.5f; rectDefault[5] = -1.0f; rectDefault[6] = 0.5f; rectDefault[7] = 0.5f; rectDefault[8] = -1.0f; rectDefault[9] = -0.5f; rectDefault[10] = -0.5f; rectDefault[11] = -1.0f; rectDefault[12] = 0.5f; rectDefault[13] = 0.5f; rectDefault[14] = -1.0f; rectDefault[15] = 0.5f; rectDefault[16] = -0.5f; rectDefault[17] = -1.0f; } void gl_drawRect(unsigned int fragShader, float x, float y, float w, float h, int r, int g, int b) { glm_mat4_identity(scale); glm_mat4_identity(slide); scale[0][0] = w; scale[1][1] = h; scale[2][2] = 0.5f; glm_translate(slide, (vec3){x+w/2, y+h/2, 0.0f}); glUniformMatrix4fv(glGetUniformLocation(fragShader, "scale"), 1, GL_FALSE, (float*)scale); glUniformMatrix4fv(glGetUniformLocation(fragShader, "slide"), 1, GL_FALSE, (float*)slide); glUniform4f(glGetUniformLocation(fragShader, "u_color2"), r/255.0f, g/255.0f, b/255.0f, 0.5f); glDrawArrays(GL_TRIANGLES, 0, 6); } void gl_drawDigit(unsigned int fragShader, int n, float x, float y, float size, int r, int g, int b, float width) { assert(n >= 0 && n < 10); if(n == 0) { gl_drawRect(fragShader, x-size/2-width, y-size-width, size+2*width, 2*width, r, g, b); gl_drawRect(fragShader, x-size/2-width, y-size-width, 2*width, 2*size+2*width, r, g, b); gl_drawRect(fragShader, x-size/2-width, y+size-width, size+2*width, 2*width, r, g, b); gl_drawRect(fragShader, x+size/2-width, y-size-width, 2*width, 2*size+2*width, r, g, b); } else if(n == 1) { gl_drawRect(fragShader, x+size/2-width, y-size-width, 2*width, 2*size+2*width, r, g, b); } else if(n == 2) { gl_drawRect(fragShader, x-size/2-width, y+size-width, size+2*width, 2*width, r, g, b); gl_drawRect(fragShader, x+size/2-width, y-width, 2*width, size+2*width, r, g, b); gl_drawRect(fragShader, x-size/2-width, y-width, size+2*width, 2*width, r, g, b); gl_drawRect(fragShader, x-size/2-width, y-size-width, 2*width, size+2*width, r, g, b); gl_drawRect(fragShader, x-size/2-width, y-size-width, size+2*width, 2*width, r, g, b); } else if(n == 3) { gl_drawRect(fragShader, x-size/2-width, y+size-width, size+2*width, 2*width, r, g, b); gl_drawRect(fragShader, x+size/2-width, y-width, 2*width, size+2*width, r, g, b); gl_drawRect(fragShader, x-size/2-width, y-width, size+2*width, 2*width, r, g, b); gl_drawRect(fragShader, x+size/2-width, y-size-width, 2*width, size+2*width, r, g, b); gl_drawRect(fragShader, x-size/2-width, y-size-width, size+2*width, 2*width, r, g, b); } else if(n == 4) { gl_drawRect(fragShader, x+size/2-width, y-size-width, 2*width, 2*size+2*width, r, g, b); gl_drawRect(fragShader, x-size/2-width, y-width, size+2*width, 2*width, r, g, b); gl_drawRect(fragShader, x-size/2-width, y-width, 2*width, size+2*width, r, g, b); } else if(n == 5) { gl_drawRect(fragShader, x-size/2-width, y+size-width, size+2*width, 2*width, r, g, b); gl_drawRect(fragShader, x-size/2-width, y-width, 2*width, size+2*width, r, g, b); gl_drawRect(fragShader, x-size/2-width, y-width, size+2*width, 2*width, r, g, b); gl_drawRect(fragShader, x+size/2-width, y-size-width, 2*width, size+2*width, r, g, b); gl_drawRect(fragShader, x-size/2-width, y-size-width, size+2*width, 2*width, r, g, b); } else if(n == 6) { gl_drawRect(fragShader, x-size/2-width, y+size-width, size+2*width, 2*width, r, g, b); gl_drawRect(fragShader, x-size/2-width, y-size-width, 2*width, 2*size+2*width, r, g, b); gl_drawRect(fragShader, x-size/2-width, y-width, size+2*width, 2*width, r, g, b); gl_drawRect(fragShader, x+size/2-width, y-size-width, 2*width, size+2*width, r, g, b); gl_drawRect(fragShader, x-size/2-width, y-size-width, size+2*width, 2*width, r, g, b); } else if(n == 7) { gl_drawRect(fragShader, x-size/2-width, y+size-width, size+2*width, 2*width, r, g, b); gl_drawRect(fragShader, x-size/2-width, y-width, 2*width, size+2*width, r, g, b); gl_drawRect(fragShader, x+size/2-width, y-size-width, 2*width, 2*size+2*width, r, g, b); } else if(n == 8) { gl_drawRect(fragShader, x-size/2-width, y+size-width, size+2*width, 2*width, r, g, b); gl_drawRect(fragShader, x-size/2-width, y-size-width, 2*width, 2*size+2*width, r, g, b); gl_drawRect(fragShader, x-size/2-width, y-width, size+2*width, 2*width, r, g, b); gl_drawRect(fragShader, x+size/2-width, y-size-width, 2*width, 2*size+2*width, r, g, b); gl_drawRect(fragShader, x-size/2-width, y-size-width, size+2*width, 2*width, r, g, b); } else { gl_drawRect(fragShader, x-size/2-width, y+size-width, size+2*width, 2*width, r, g, b); gl_drawRect(fragShader, x-size/2-width, y-width, 2*width, size+2*width, r, g, b); gl_drawRect(fragShader, x-size/2-width, y-width, size+2*width, 2*width, r, g, b); gl_drawRect(fragShader, x+size/2-width, y-size-width, 2*width, 2*size+2*width, r, g, b); gl_drawRect(fragShader, x-size/2-width, y-size-width, size+2*width, 2*width, r, g, b); } } // 7-segment display // 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) { int left = n; float curx = x; if(left < 0) { left *= (-1); } if(side == 1) { curx += ((ln_baseN(abs(n), 10)-1)*(size+4*width)); } while(left > 0) { gl_drawDigit(fragShader, left%10, curx, y, size, r, g, b, width); curx -= (size+4*width); left = left/10; } if(n == 0) { gl_drawDigit(fragShader, 0, curx, y, size, r, g, b, width); curx -= (size+4*width); } if(n < 0) { gl_drawRect(fragShader, curx-size/2-width, y, size+2*width, 2*width, r, g, b); } } void gl_drawChar(unsigned int fragShader, char ch, float x, float y, float size, int r, int g, int b, float width) { if(ch == 'a' || ch == 'A') { gl_drawRect(fragShader, x-size/2-width, y+size-width, size+2*width, 2*width, r, g, b); gl_drawRect(fragShader, x-size/2-width, y-size-width, 2*width, 2*size+2*width, r, g, b); gl_drawRect(fragShader, x-size/2-width, y-width, size+2*width, 2*width, r, g, b); gl_drawRect(fragShader, x+size/2-width, y-size-width, 2*width, 2*size+2*width, r, g, b); } else if(ch == 'b' || ch == 'B') { gl_drawRect(fragShader, x-size/2-width, y+size-width, size, 2*width, r, g, b); gl_drawRect(fragShader, x-size/2-width, y-size-width, 2*width, 2*size+2*width, r, g, b); gl_drawRect(fragShader, x-size/2-width, y-width, size+2*width, 2*width, r, g, b); gl_drawRect(fragShader, x+size/2-width, y-size+width, 2*width, 2*size-width, r, g, b); gl_drawRect(fragShader, x-size/2-width, y-size-width, size, 2*width, r, g, b); } else if(ch == 'c' || ch == 'C') { gl_drawRect(fragShader, x-size/2-width, y+size-width, size+2*width, 2*width, r, g, b); gl_drawRect(fragShader, x-size/2-width, y-size-width, 2*width, 2*size+2*width, r, g, b); gl_drawRect(fragShader, x-size/2-width, y-size-width, size+2*width, 2*width, r, g, b); } else if(ch == 'd' || ch == 'D') { gl_drawRect(fragShader, x-size/2-width, y+size-width, size+2*width, 2*width, r, g, b); gl_drawRect(fragShader, x-size/2+width, y-size-width, 2*width, 2*size+2*width, r, g, b); gl_drawRect(fragShader, x+size/2-width, y-size-width, 2*width, 2*size+2*width, r, g, b); gl_drawRect(fragShader, x-size/2-width, y-size-width, size+2*width, 2*width, r, g, b); } else if(ch == 'e' || ch == 'E') { gl_drawRect(fragShader, x-size/2-width, y+size-width, size+2*width, 2*width, r, g, b); gl_drawRect(fragShader, x-size/2-width, y-size-width, 2*width, 2*size+2*width, r, g, b); gl_drawRect(fragShader, x-size/2-width, y-width, size+2*width, 2*width, r, g, b); gl_drawRect(fragShader, x-size/2-width, y-size-width, size+2*width, 2*width, r, g, b); } else if(ch == 'f' || ch == 'F') { gl_drawRect(fragShader, x-size/2-width, y+size-width, size+2*width, 2*width, r, g, b); gl_drawRect(fragShader, x-size/2-width, y-size-width, 2*width, 2*size+2*width, r, g, b); gl_drawRect(fragShader, x-size/2-width, y-width, size+2*width, 2*width, r, g, b); } else if(ch == 'g' || ch == 'G') { gl_drawRect(fragShader, x-size/2-width, y+size-width, size+2*width, 2*width, r, g, b); gl_drawRect(fragShader, x-size/2-width, y-size-width, 2*width, 2*size+2*width, r, g, b); gl_drawRect(fragShader, x-width, y-width, size/2+2*width, 2*width, r, g, b); gl_drawRect(fragShader, x+size/2-width, y-size-width, 2*width, size+2*width, r, g, b); gl_drawRect(fragShader, x-size/2-width, y-size-width, size+2*width, 2*width, r, g, b); } else if(ch == 'h' || ch == 'H') { gl_drawRect(fragShader, x-size/2-width, y-size-width, 2*width, 2*size+2*width, r, g, b); gl_drawRect(fragShader, x-size/2-width, y-width, size+2*width, 2*width, r, g, b); gl_drawRect(fragShader, x+size/2-width, y-size-width, 2*width, 2*size+2*width, r, g, b); } else if(ch == 'i' || ch == 'I') { gl_drawRect(fragShader, x-size/2-width, y+size-width, size+2*width, 2*width, r, g, b); gl_drawRect(fragShader, x-width, y-size-width, 2*width, 2*size+2*width, r, g, b); gl_drawRect(fragShader, x-size/2-width, y-size-width, size+2*width, 2*width, r, g, b); } else if(ch == 'j' || ch == 'J') { gl_drawRect(fragShader, x-size/2-width, y+size-width, size+2*width, 2*width, r, g, b); gl_drawRect(fragShader, x-width, y-size-width, 2*width, 2*size+2*width, r, g, b); gl_drawRect(fragShader, x-size/2-width, y-size-width, size/2+2*width, 2*width, r, g, b); } else if(ch == 'k' || ch == 'K') { gl_drawRect(fragShader, x-size/2-width, y-size-width, 2*width, 2*size+2*width, r, g, b); gl_drawRect(fragShader, x-size/2-width, y-width, size/2+2*width, 2*width, r, g, b); gl_drawRect(fragShader, x-width, y-size/2-width, 2*width, size+2*width, r, g, b); gl_drawRect(fragShader, x+size/2-width, y+size/2-width, 2*width, size/2+2*width, r, g, b); gl_drawRect(fragShader, x+size/2-width, y-size-width, 2*width, size/2+2*width, r, g, b); gl_drawRect(fragShader, x-width, y+size/2-width, size/2+2*width, 2*width, r, g, b); gl_drawRect(fragShader, x-width, y-size/2-width, size/2+2*width, 2*width, r, g, b); } else if(ch == 'l' || ch == 'L') { gl_drawRect(fragShader, x-size/2-width, y-size-width, 2*width, 2*size+2*width, r, g, b); gl_drawRect(fragShader, x-size/2-width, y-size-width, size+2*width, 2*width, r, g, b); } else if(ch == 'm' || ch == 'M') { gl_drawRect(fragShader, x-size/2-width, y+size-width, size+2*width, 2*width, r, g, b); gl_drawRect(fragShader, x-size/2-width, y-size-width, 2*width, 2*size+2*width, r, g, b); gl_drawRect(fragShader, x-width, y-width, 2*width, size+2*width, r, g, b); gl_drawRect(fragShader, x+size/2-width, y-size-width, 2*width, 2*size+2*width, r, g, b); } else if(ch == 'n' || ch == 'N') { gl_drawRect(fragShader, x-size/2-width, y+size-width, size+2*width, 2*width, r, g, b); gl_drawRect(fragShader, x-size/2-width, y-size-width, 2*width, 2*size+2*width, r, g, b); gl_drawRect(fragShader, x+size/2-width, y-size-width, 2*width, 2*size+2*width, r, g, b); } else if(ch == 'o' || ch == 'O') { gl_drawRect(fragShader, x-size/2-width, y-size-width, size+2*width, 2*width, r, g, b); gl_drawRect(fragShader, x-size/2-width, y-size-width, 2*width, 2*size+2*width, r, g, b); gl_drawRect(fragShader, x-size/2-width, y+size-width, size+2*width, 2*width, r, g, b); gl_drawRect(fragShader, x+size/2-width, y-size-width, 2*width, 2*size+2*width, r, g, b); } else if(ch == 'p' || ch == 'P') { gl_drawRect(fragShader, x-size/2-width, y+size-width, size+2*width, 2*width, r, g, b); gl_drawRect(fragShader, x-size/2-width, y-size-width, 2*width, 2*size+2*width, r, g, b); gl_drawRect(fragShader, x-size/2-width, y-width, size+2*width, 2*width, r, g, b); gl_drawRect(fragShader, x+size/2-width, y-width, 2*width, size+2*width, r, g, b); } else if(ch == 'q' || ch == 'Q') { gl_drawRect(fragShader, x-size/2-width, y-size/2-width, 2*width, 3*size/2+2*width, r, g, b); gl_drawRect(fragShader, x+size/2-width, y-size/2-width, 2*width, 3*size/2+2*width, r, g, b); gl_drawRect(fragShader, x-size/2-width, y-size/2-width, size+2*width, 2*width, r, g, b); gl_drawRect(fragShader, x-size/2-width, y+size-width, size+2*width, 2*width, r, g, b); gl_drawRect(fragShader, x+size/4-width, y-size-width, 2*width, size/2+2*width, r, g, b); } else if(ch == 'r' || ch == 'R') { gl_drawRect(fragShader, x-size/2-width, y+size-width, size+2*width, 2*width, r, g, b); gl_drawRect(fragShader, x-size/2-width, y-size-width, 2*width, 2*size+2*width, r, g, b); gl_drawRect(fragShader, x-size/2-width, y-width, size+2*width, 2*width, r, g, b); gl_drawRect(fragShader, x+size/2-width, y-width, 2*width, size+2*width, r, g, b); gl_drawRect(fragShader, x+size/4-width, y-size-width, 2*width, size+2*width, r, g, b); } else if(ch == 's' || ch == 'S') { gl_drawRect(fragShader, x-size/2-width, y+size-width, size+2*width, 2*width, r, g, b); gl_drawRect(fragShader, x-size/2-width, y-width, 2*width, size+2*width, r, g, b); gl_drawRect(fragShader, x-size/2-width, y-width, size+2*width, 2*width, r, g, b); gl_drawRect(fragShader, x+size/2-width, y-size-width, 2*width, size+2*width, r, g, b); gl_drawRect(fragShader, x-size/2-width, y-size-width, size+2*width, 2*width, r, g, b); } else if(ch == 't' || ch == 'T') { gl_drawRect(fragShader, x-size/2-width, y+size-width, size+2*width, 2*width, r, g, b); gl_drawRect(fragShader, x-width, y-size-width, 2*width, 2*size+2*width, r, g, b); } else if(ch == 'u' || ch == 'U') { gl_drawRect(fragShader, x-size/2-width, y-size-width, 2*width, 2*size+2*width, r, g, b); gl_drawRect(fragShader, x+size/2-width, y-size-width, 2*width, 2*size+2*width, r, g, b); gl_drawRect(fragShader, x-size/2-width, y-size-width, size+2*width, 2*width, r, g, b); } else if(ch == 'v' || ch == 'V') { gl_drawRect(fragShader, x+size/2-width, y-width, 2*width, size+2*width, r, g, b); gl_drawRect(fragShader, x-size/2-width, y-width, 2*width, size+2*width, r, g, b); gl_drawRect(fragShader, x+size/4-width, y-size-width, 2*width, size+2*width, r, g, b); gl_drawRect(fragShader, x-size/4-width, y-size-width, 2*width, size+2*width, r, g, b); gl_drawRect(fragShader, x-size/2-width, y-width, size/4+2*width, 2*width, r, g, b); gl_drawRect(fragShader, x+size/4-width, y-width, size/4+2*width, 2*width, r, g, b); gl_drawRect(fragShader, x-size/4-width, y-size-width, size/2+2*width, 2*width, r, g, b); } else if(ch == 'w' || ch == 'W') { gl_drawRect(fragShader, x-size/2-width, y-size-width, size+2*width, 2*width, r, g, b); gl_drawRect(fragShader, x-size/2-width, y-size-width, 2*width, 2*size+2*width, r, g, b); gl_drawRect(fragShader, x-width, y-size-width, 2*width, size+2*width, r, g, b); gl_drawRect(fragShader, x+size/2-width, y-size-width, 2*width, 2*size+2*width, r, g, b); } else if(ch == 'x' || ch == 'X') { gl_drawRect(fragShader, x-width, y-size/2-width, 2*width, size+2*width, r, g, b); gl_drawRect(fragShader, x+size/2-width, y+size/2-width, 2*width, size/2+2*width, r, g, b); gl_drawRect(fragShader, x+size/2-width, y-size-width, 2*width, size/2+2*width, r, g, b); gl_drawRect(fragShader, x-size/2-width, y+size/2-width, 2*width, size/2+2*width, r, g, b); gl_drawRect(fragShader, x-size/2-width, y-size-width, 2*width, size/2+2*width, r, g, b); gl_drawRect(fragShader, x-size/2-width, y+size/2-width, size+2*width, 2*width, r, g, b); gl_drawRect(fragShader, x-size/2-width, y-size/2-width, size+2*width, 2*width, r, g, b); } else if(ch == 'y' || ch == 'Y') { gl_drawRect(fragShader, x+size/2-width, y-width, 2*width, size+2*width, r, g, b); gl_drawRect(fragShader, x-width, y-size-width, 2*width, size+2*width, r, g, b); gl_drawRect(fragShader, x-size/2-width, y-width, size+2*width, 2*width, r, g, b); gl_drawRect(fragShader, x-size/2-width, y-width, 2*width, size+2*width, r, g, b); } else if(ch == 'z' || ch == 'Z') { gl_drawRect(fragShader, x-size/2-width, y+size-width, size+2*width, 2*width, r, g, b); gl_drawRect(fragShader, x+size/2-width, y-width, 2*width, size+2*width, r, g, b); gl_drawRect(fragShader, x-size/2-width, y-width, size+2*width, 2*width, r, g, b); gl_drawRect(fragShader, x-size/2-width, y-size-width, 2*width, size+2*width, r, g, b); gl_drawRect(fragShader, x-size/2-width, y-size-width, size+2*width, 2*width, r, g, b); } } int get_string_len(char* s) { int k = 0; while(s[k] != '\0') { k+=1; } return k; } // 7-segment display // 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) { float curx = x; int len = get_string_len(str); if(side == 1) { curx += ((len)*(size+4*width)); } char c = str[len-1]; int i = len-1; while(i >= 0) { gl_drawChar(fragShader, c, curx, y, size, r, g, b, width); curx -= (size+4*width); i -= 1; c = str[i]; } } void gl_printf(unsigned int fragShader, int count, ...) { } void gl_initDrawRect(unsigned int shaderProgram) { glUseProgram(shaderProgram); } static onoff_button* buttonList; static interface* interfaceList; void init_interf() { buttonList = malloc(sizeof(onoff_button)*256); interfaceList = malloc(sizeof(interface)*64); } void free_interf() { free(buttonList); free(interfaceList); }