From 34168ef1d15ff2677dac4859fe3bb361c4bcd742 Mon Sep 17 00:00:00 2001 From: MallocNull Date: Thu, 31 Dec 2020 10:24:09 -0600 Subject: [PATCH] font code works but things need to happen --- src/data/fonts/scape.bmp | Bin 0 -> 786554 bytes src/data/fonts/scape.dat | Bin 0 -> 273 bytes src/data/map-colors.bmp | Bin 40138 -> 0 bytes src/data/map-heights.bmp | Bin 40138 -> 0 bytes src/data/map-reserve.bmp | Bin 40138 -> 0 bytes src/data/{ => models}/cube.obj | 0 src/data/{ => models}/cube.rbm | Bin src/data/{ => models}/cube2.obj | 0 src/data/{ => models}/cube2.rbm | Bin src/data/{ => models}/monkey.obj | 0 src/data/{ => models}/monkey.rbm | Bin src/data/{ => models}/player.obj | 0 src/data/{ => models}/player.rbm | Bin src/data/{ => models}/rbm.sh | 0 src/{ => data}/shaders/test.frag | 2 +- src/{ => data}/shaders/test.vert | 0 src/data/terrains/map-colors.bmp | Bin 0 -> 30122 bytes src/data/terrains/map-heights.bmp | Bin 0 -> 30122 bytes src/data/terrains/map-reserve.bmp | Bin 0 -> 30122 bytes src/data/{ => terrains}/map.xcf | Bin 64779 -> 64793 bytes src/koa/etc.c | 12 +- src/koa/etc.h | 13 +- src/koa/file.c | 56 +++- src/koa/file.h | 14 + src/main.c | 79 +++++- src/okuu/font.c | 419 ++++++++++++++++++++++++++++++ src/okuu/font.h | 78 ++++++ src/okuu/shader.c | 35 ++- src/okuu/shader.h | 5 +- src/okuu/terrain.c | 47 +--- 30 files changed, 677 insertions(+), 83 deletions(-) create mode 100644 src/data/fonts/scape.bmp create mode 100644 src/data/fonts/scape.dat delete mode 100644 src/data/map-colors.bmp delete mode 100644 src/data/map-heights.bmp delete mode 100644 src/data/map-reserve.bmp rename src/data/{ => models}/cube.obj (100%) rename src/data/{ => models}/cube.rbm (100%) rename src/data/{ => models}/cube2.obj (100%) rename src/data/{ => models}/cube2.rbm (100%) rename src/data/{ => models}/monkey.obj (100%) rename src/data/{ => models}/monkey.rbm (100%) rename src/data/{ => models}/player.obj (100%) rename src/data/{ => models}/player.rbm (100%) rename src/data/{ => models}/rbm.sh (100%) rename src/{ => data}/shaders/test.frag (95%) rename src/{ => data}/shaders/test.vert (100%) create mode 100644 src/data/terrains/map-colors.bmp create mode 100644 src/data/terrains/map-heights.bmp create mode 100644 src/data/terrains/map-reserve.bmp rename src/data/{ => terrains}/map.xcf (90%) create mode 100644 src/okuu/font.c create mode 100644 src/okuu/font.h diff --git a/src/data/fonts/scape.bmp b/src/data/fonts/scape.bmp new file mode 100644 index 0000000000000000000000000000000000000000..6f212fb085f17a1e11a086ffb5fd56956c341f9d GIT binary patch literal 786554 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

Xa?4x*1v?z9<*WjfKgdzZuCT^#ML`icB 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 literal 0 HcmV?d00001 diff --git a/src/data/fonts/scape.dat b/src/data/fonts/scape.dat new file mode 100644 index 0000000000000000000000000000000000000000..1fa6e609b9d7620bd2054d6884481ae74f534d1d GIT binary patch literal 273 WcmZQzVqjnZVg(=t!VLT)8~^~$@()D- literal 0 HcmV?d00001 diff --git a/src/data/map-colors.bmp b/src/data/map-colors.bmp deleted file mode 100644 index ce9a07c04c0eeec9d53aa035f0d58a221ea31036..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40138 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 emg_-&YVPq2vEXAb@V=;Hqi?lTx>>i+>^qpv3b diff --git a/src/data/map-heights.bmp b/src/data/map-heights.bmp deleted file mode 100644 index 5347b817bdc4edbbe6af3bfcaa7a977283fde4bf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40138 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 E0Wz%B3;+NC diff --git a/src/data/cube.obj b/src/data/models/cube.obj similarity index 100% rename from src/data/cube.obj rename to src/data/models/cube.obj diff --git a/src/data/cube.rbm b/src/data/models/cube.rbm similarity index 100% rename from src/data/cube.rbm rename to src/data/models/cube.rbm diff --git a/src/data/cube2.obj b/src/data/models/cube2.obj similarity index 100% rename from src/data/cube2.obj rename to src/data/models/cube2.obj diff --git a/src/data/cube2.rbm b/src/data/models/cube2.rbm similarity index 100% rename from src/data/cube2.rbm rename to src/data/models/cube2.rbm diff --git a/src/data/monkey.obj b/src/data/models/monkey.obj similarity index 100% rename from src/data/monkey.obj rename to src/data/models/monkey.obj diff --git a/src/data/monkey.rbm b/src/data/models/monkey.rbm similarity index 100% rename from src/data/monkey.rbm rename to src/data/models/monkey.rbm diff --git a/src/data/player.obj b/src/data/models/player.obj similarity index 100% rename from src/data/player.obj rename to src/data/models/player.obj diff --git a/src/data/player.rbm b/src/data/models/player.rbm similarity index 100% rename from src/data/player.rbm rename to src/data/models/player.rbm diff --git a/src/data/rbm.sh b/src/data/models/rbm.sh similarity index 100% rename from src/data/rbm.sh rename to src/data/models/rbm.sh diff --git a/src/shaders/test.frag b/src/data/shaders/test.frag similarity index 95% rename from src/shaders/test.frag rename to src/data/shaders/test.frag index 1033257..db2f29b 100644 --- a/src/shaders/test.frag +++ b/src/data/shaders/test.frag @@ -15,7 +15,7 @@ void main() { float diff = max(0.0, dot(norm, light_dir)); vec3 diffuse = diff * light_color; - vec3 color = (ambient + diffuse) * f_color; + vec3 color = (ambient + diffuse) * vec3(f_color); gl_FragColor = vec4(color, 1.0); //gl_FragColor = vec4(f_normal, 1.0); } diff --git a/src/shaders/test.vert b/src/data/shaders/test.vert similarity index 100% rename from src/shaders/test.vert rename to src/data/shaders/test.vert diff --git a/src/data/terrains/map-colors.bmp b/src/data/terrains/map-colors.bmp new file mode 100644 index 0000000000000000000000000000000000000000..46ba94a471f4d881a18fe88a5bfd2b92858fefa0 GIT binary patch literal 30122 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 LUv^{v*~k9_Sd6dk literal 0 HcmV?d00001 diff --git a/src/data/terrains/map-reserve.bmp b/src/data/terrains/map-reserve.bmp new file mode 100644 index 0000000000000000000000000000000000000000..dc612ee70af82d1f83efd42b4d546d2406064b85 GIT binary patch literal 30122 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 literal 0 HcmV?d00001 diff --git a/src/data/map.xcf b/src/data/terrains/map.xcf similarity index 90% rename from src/data/map.xcf rename to src/data/terrains/map.xcf index 182d43809415a7a5ce38e9d735f41c7d4c889a2c..b872272f287958897f2b24a1ceb544c799258fd3 100644 GIT binary patch delta 2819 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 ZuU*X?Kl_?Ri+S9JnptnCIDABZ;NMGNy#@dP diff --git a/src/koa/etc.c b/src/koa/etc.c index 94b0520..396b724 100644 --- a/src/koa/etc.c +++ b/src/koa/etc.c @@ -1,15 +1,11 @@ #include "etc.h" -int color_eq(color_t a, color_t b) { - return color_eqp(&a, &b); +int color_eq(const color_t a, const color_t b) { + return color_eqp(a, b); } -int color_eqp(const color_t* a, const color_t* b) { - return - (a->r == b->r) && - (a->g == b->g) && - (a->b == b->b) && - (a->a == b->a); +int color_eqp(const color_t a, const color_t b) { + return memcmp(a, b, 4) == 0; } void mfree(int n, ...) { diff --git a/src/koa/etc.h b/src/koa/etc.h index 38c3954..37d58c5 100644 --- a/src/koa/etc.h +++ b/src/koa/etc.h @@ -9,12 +9,15 @@ #define __MIN(A, B) ((A) < (B) ? (A) : (B)) #define __MAX(A, B) ((A) > (B) ? (A) : (B)) -typedef struct { - uint8_t r, g, b, a; -} color_t; +#define _R_ 0 +#define _G_ 1 +#define _B_ 2 +#define _A_ 3 -int color_eq(color_t, color_t); -int color_eqp(const color_t*, const color_t*); +typedef uint8_t color_t[4]; + +int color_eq(const color_t, const color_t); +int color_eqp(const color_t, const color_t); void mfree(int n, ...); uint8_t* ltoh(uint8_t*, int); diff --git a/src/koa/file.c b/src/koa/file.c index ea59daa..71c5e5b 100644 --- a/src/koa/file.c +++ b/src/koa/file.c @@ -158,21 +158,21 @@ int bmp_reload_chunk(bmp_t* bmp, int x, int y, int width, int height) { uint8_t buffer[4]; for(int ay = 0; ay < height; ++ay) { - fseek(fp, - data->header_size - + (data->width * (data->height - (y + ay) - 1) * data->bytepp) - + x * data->bytepp, - SEEK_SET + fseek( + fp, + data->header_size + + (data->width * (data->height - (y + ay) - 1) * data->bytepp) + + x * data->bytepp, + SEEK_SET ); for(int ax = 0; ax < width; ++ax) { fread(buffer, 1, data->bytepp, fp); - color_t* px = &bmp->pixels[ay][ax]; - px->b = buffer[0]; - px->g = buffer[1]; - px->r = buffer[2]; - px->a = 0xFF; + bmp->pixels[ay][ax][_B_] = buffer[0]; + bmp->pixels[ay][ax][_G_] = buffer[1]; + bmp->pixels[ay][ax][_R_] = buffer[2]; + bmp->pixels[ay][ax][_A_] = 0xFF; } } @@ -180,6 +180,42 @@ int bmp_reload_chunk(bmp_t* bmp, int x, int y, int width, int height) { return 1; } +int _bmp_comp_cnt(int col) { + int cnt = 0; + for(int i = 0; i < KOA_COMPONENTS; ++i) + cnt += (col >> i) & 0x1; + + return cnt; +} + +uint8_t* bmp_gl_data(bmp_t* bmp, int col) { + float* out = malloc(bmp_gl_data_size(bmp, col)); + bmp_gl_data_out(bmp, out, col); + return out; +} + +void bmp_gl_data_out(bmp_t* bmp, uint8_t* out, int col) { + const int comps = _bmp_comp_cnt(col); + for(uint32_t y = 0; y < bmp->height; ++y) { + for(uint32_t x = 0; x < bmp->width; ++x) { + int at = 0; + for(int i = 0; i < KOA_COMPONENTS; ++i) { + if(!((col >> i) & 0x1)) + continue; + + out[y * bmp->width * comps + x * comps + at] = + bmp->pixels[y][x][i]; + ++at; + } + } + } +} + +uint32_t bmp_gl_data_size(bmp_t* bmp, int col) { + return sizeof(uint8_t) * _bmp_comp_cnt(col) + * bmp->width * bmp->height; +} + void bmp_discard_pixels(bmp_t* bmp) { if(bmp->pixels == NULL) return; diff --git a/src/koa/file.h b/src/koa/file.h index f09b025..f34311a 100644 --- a/src/koa/file.h +++ b/src/koa/file.h @@ -20,6 +20,14 @@ char* file_read(const char*); // BEGIN BMP LOADING FUNCTIONS +#define KOA_COMPONENTS 4 +#define KOA_R 1 +#define KOA_G 2 +#define KOA_B 4 +#define KOA_A 8 +#define KOA_RGB 7 +#define KOA_RGBA F + typedef struct { char file[4096]; uint32_t width, height, size, @@ -35,9 +43,15 @@ typedef struct { } bmp_t; bmp_t* bmp_load(const char*); + bmp_t* bmp_load_chunk(const char*, int, int, int, int); int bmp_reload_chunk(bmp_t*, int, int, int, int); int bmp_load_metadata(const char*, bmp_meta_t*); + +uint8_t* bmp_gl_data(bmp_t*, int); +void bmp_gl_data_out(bmp_t*, uint8_t*, int); +uint32_t bmp_gl_data_size(bmp_t*, int); + void bmp_discard_pixels(bmp_t*); void bmp_unload(bmp_t*); diff --git a/src/main.c b/src/main.c index 3afde3b..bcd6669 100644 --- a/src/main.c +++ b/src/main.c @@ -11,6 +11,7 @@ #include "okuu/mesh.h" #include "okuu/shader.h" #include "okuu/terrain.h" +#include "okuu/font.h" #define WINDOW_WIDTH 640 #define WINDOW_HEIGHT 480 @@ -20,7 +21,11 @@ struct { SDL_GLContext ctx; const uint8_t* keys; int mode, running; + int mouse[3]; + vec2 tlocs[10]; + font_t* scape; + text_t* text; mesh_t* monkey; terrain_t* map; } _g; @@ -39,15 +44,37 @@ int init(); void deinit(); void run(); +void reset_text_locs() { + for(int i = 0; i < 10; ++i) { + _g.tlocs[i][0] = rand() % (WINDOW_WIDTH / 2); + _g.tlocs[i][1] = rand() % WINDOW_HEIGHT; + } +} + int main(int argc, char* argv[]) { if(init() < 0) return -1; - _g.monkey = mesh_load("data/player.rbm"); + font_init_subsystem(_g.window); + + _g.scape = font_load( + "data/fonts/scape.bmp", + "data/fonts/scape.dat", + GL_NEAREST + ); + font_set_default(_g.scape); + + _g.text = text_create(NULL); + text_set(_g.text, "flashwave is cool !!!"); + text_set_size(_g.text, 32); + text_set_rgb_hex(_g.text, 0x55007e); + reset_text_locs(); + + _g.monkey = mesh_load("data/models/player.rbm"); _g.map = terrain_load( - "data/map-heights.bmp", - "data/map-colors.bmp", + "data/terrains/map-heights.bmp", + "data/terrains/map-colors.bmp", 10, 10 ); @@ -55,9 +82,9 @@ int main(int argc, char* argv[]) { shader_layout(_s_def.shader, 4, "vertex", "texuv", "normal", "color" ); - shader_source(_s_def.shader, 2, - "shaders/test.vert", GL_VERTEX_SHADER, - "shaders/test.frag", GL_FRAGMENT_SHADER + shader_source(_s_def.shader, SHADER_FILE, 2, + "data/shaders/test.vert", GL_VERTEX_SHADER, + "data/shaders/test.frag", GL_FRAGMENT_SHADER ); shader_attribs(_s_def.shader, 3, "model", "view", "projection" @@ -81,6 +108,7 @@ void run() { if(init) { //glm_rotate_make(model, glm_rad(90), (vec3){ 0.f, -1.f, 0.f }); glm_mat4_identity(model); + glm_mat4_identity(map); glm_mat4_identity(view); @@ -117,12 +145,14 @@ void run() { view ); + for(int i = 0; i < 10; ++i) { + text_move(_g.text, _g.tlocs[i]); + text_render(_g.text); + } + shader_start(_s_def.shader); { glUniformMatrix4fv(_ATTR(DEF_VIEW), 1, GL_FALSE, (float*)view); - /*mesh_bind(_g.monkey); - mesh_render(_g.monkey); - mesh_unbind();*/ glm_translate_make(model, (vec3){-x, -(_g.map->heights[(int)y][(int)x] + 2.f), -y}); glm_mat4_mul(model, map, model); glUniformMatrix4fv(_ATTR(DEF_MODEL), 1, GL_FALSE, (float*)model); @@ -173,10 +203,41 @@ void run() { glm_translate_make(map, (vec3){__MAX(0, x - CHUNK_SIZE / 2), 0, __MAX(0, y - CHUNK_SIZE / 2)}); } + if(_g.keys[SDL_SCANCODE_P]) + reset_text_locs(); + + _g.mouse[2] = SDL_GetMouseState(&_g.mouse[0], &_g.mouse[1]); + if(_g.mouse[2] & SDL_BUTTON(SDL_BUTTON_LEFT)) { + + } + SDL_Event ev; while(SDL_PollEvent(&ev)) { if(ev.type == SDL_QUIT) _g.running = 0; + else if(ev.type == SDL_WINDOWEVENT && + ev.window.event == SDL_WINDOWEVENT_SIZE_CHANGED) + { + glViewport(0, 0, ev.window.data1, ev.window.data2); + font_window_changed(_g.window); + } + /*else if(ev.type == SDL_MOUSEBUTTONDOWN) { + float mx = (float)ev.button.x / (float)WINDOW_WIDTH; + float my = (float)ev.button.y / (float)WINDOW_HEIGHT; + vec4 mouse = {mx * 2 - 1, (1 - my) * 2 - 1, -1.f, 1.f}; + mat4 imat; + + glm_mat4_inv(projection, imat); + glm_mat4_mulv(imat, mouse, mouse); + mouse[2] = -1.f; + mouse[3] = 0.f; + + glm_mat4_inv(view, imat); + glm_mat4_mulv(imat, mouse, mouse); + + + + }*/ } } diff --git a/src/okuu/font.c b/src/okuu/font.c new file mode 100644 index 0000000..d0fdcec --- /dev/null +++ b/src/okuu/font.c @@ -0,0 +1,419 @@ +#include "font.h" + +// SUBSYSTEM // + +const char* _vertex_shader = + "#version 100 \r\n" + + "attribute vec2 coords;" + "attribute vec2 texuv;" + + "varying vec2 f_texuv;" + + "uniform mat4 trans;" + "uniform mat4 ortho;" + + "void main() {" + "gl_Position = ortho * trans * vec4(coords, 0.0, 1.0);" + "f_texuv = texuv;" + "}\r\n"; +const char* _fragment_shader = + "#version 100 \n" + "precision mediump float;\n" + + "varying vec2 f_texuv;\n" + + "uniform vec4 color;\n" + "uniform sampler2D font;\n" + + "void main() {\n" + "vec4 fcol = texture2D(font, f_texuv);\n" + "if(fcol.rgb == vec3(0.0)) discard;\n" + "gl_FragColor = color * fcol;\n" + "}\n"; + +struct { + shader_t* shader; + font_t* default_font; + + enum { + FONT_TRANS, + FONT_ORTHO, + FONT_COLOR, + FONT_FONT + }; +} _ss; + +void _font_window_change(SDL_Window* window) { + shader_start(_ss.shader); + + mat4 ortho; + int width, height; + SDL_GetWindowSize(window, &width, &height); + + glm_ortho(0.f, (float)width, (float)height, 0.f, -1.f, 1.f, ortho); + glUniformMatrix4fv( + _ATTR(FONT_ORTHO), 1, GL_FALSE, (float*)ortho + ); +} + +void font_init_subsystem(SDL_Window* window) { + _ss.shader = shader_create("font"); + shader_layout(_ss.shader, 2, + "coords", "texuv" + ); + shader_source(_ss.shader, SHADER_SRC, 2, + _vertex_shader, GL_VERTEX_SHADER, + _fragment_shader, GL_FRAGMENT_SHADER + ); + shader_attribs(_ss.shader, 4, + "trans", "ortho", "color", "font" + ); + + _font_window_change(window); +} + +void font_window_changed(SDL_Window* window) { + _font_window_change(window); +} + +void font_set_default(font_t* font) { + _ss.default_font = font; +} + +void font_deinit_subsystem() { + shader_destroy(_ss.shader); +} + +// FONT FUNCTIONS // + +font_t* font_load(const char* bmp_path, const char* data_path, int filter) { + const int buffer_size = 0x111; + int buffer_read = 0; + uint8_t buffer[buffer_size]; + + FILE* fp = fopen(data_path, "rb"); + if(fp == NULL) + return NULL; + buffer_read = fread(buffer, 1, buffer_size, fp); + fclose(fp); + if(buffer_read != buffer_size) + return NULL; + if(buffer[0x10] != 0) + return NULL; + + bmp_t* bmp = bmp_load(bmp_path); + if(bmp == NULL) + return NULL; + + font_t* font = malloc(sizeof(font_t)); + + font->width = bmp->width; + font->height = bmp->height; + font->cell_width = *(uint32_t*)ltoh(buffer + 0x08, 4); + font->cell_height = *(uint32_t*)ltoh(buffer + 0x0C, 4); + + for(int i = 0; i < 256; ++i) { + glyph_t* glyph = font->glyphs + i; + uint32_t width = buffer[0x11 + i]; + + glyph->width = (float)width / (float)font->cell_width; + int x = (font->cell_width * i) % font->width; + int y = ((font->cell_width * i) / font->width) * font->cell_height; + + glyph->top_left[0] = (float)x / (float)font->width; + glyph->top_left[1] = (float)y / (float)font->height; + + glyph->bottom_right[0] = (float)(x + width) / (float)font->width; + glyph->bottom_right[1] = + (float)(y + font->cell_height) / (float)font->height; + } + + uint8_t* pixels = bmp_gl_data(bmp, KOA_RGB); + + glGenTextures(1, &font->texture); + glBindTexture(GL_TEXTURE_2D, font->texture); + glTexImage2D( + GL_TEXTURE_2D, 0, GL_RGB, + font->width, font->height, 0, + GL_RGB, GL_UNSIGNED_BYTE, + pixels + ); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, filter); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, filter); + + bmp_unload(bmp); + free(pixels); + + return font; +} + +void font_bind(font_t* font) { + glBindTexture(GL_TEXTURE_2D, font->texture); +} + +void font_unbind() { + glBindTexture(GL_TEXTURE_2D, 0); +} + +void font_unload(font_t* font) { + glDeleteTextures(1, font->texture); + free(font); +} + +// TEXT FUNCTIONS // + +text_t* text_create(font_t* font) { + text_t* text = malloc(sizeof(text_t)); + + if(font == NULL) + text->font = _ss.default_font; + text->text = NULL; + glm_vec4_copy((vec4){0.f, 0.f, 0.f, 1.f}, text->color); + + text->length = + text->size = + text->wrap = + text->tri_cnt = 0; + + text->vert_inv = + text->texuv_inv = 1; + + glm_mat4_identity(text->trans_mat); + glGenVertexArrays(1, &text->vao); + glGenBuffers(2, text->buffers); + + glBindVertexArray(text->vao); { + glEnableVertexAttribArray(0); + glBindBuffer(GL_ARRAY_BUFFER, text->buffers[0]); + glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, (void*)0); + + glEnableVertexAttribArray(1); + glBindBuffer(GL_ARRAY_BUFFER, text->buffers[1]); + glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 0, (void*)0); + } glBindVertexArray(0); + glBindBuffer(GL_ARRAY_BUFFER, 0); + + return text; +} + +void text_set(text_t* text, const char* value) { + uint32_t value_len = strlen(value); + if(text->text == NULL || strcmp(value, text->text) != 0) { + text->texuv_inv = 1; + text->vert_inv = 1; + } + + free(text->text); + text->length = value_len; + text->text = strdup(value); +} + +void text_set_font(text_t* text, font_t* font) { + text->font = font; + + text->texuv_inv = 1; + text->vert_inv = 1; +} + +void text_set_size(text_t* text, uint32_t size) { + text->size = size; + text->vert_inv = 1; +} + +void text_set_rgb + (text_t* text, uint8_t r, uint8_t g, uint8_t b) +{ + text_set_rgba(text, r, g, b, 0xFF); +} + +void text_set_rgba + (text_t* text, uint8_t r, uint8_t g, uint8_t b, uint8_t a) +{ + glm_vec4_copy( + (vec4){ + (float)r / 255.f, + (float)g / 255.f, + (float)b / 255.f, + (float)a / 255.f + }, + text->color + ); +} + +void text_set_rgb_gl(text_t* text, vec3 color) { + vec4 color4; + glm_vec4(color, 1.f, color4); + text_set_rgba_gl(text, color4); +} + +void text_set_rgba_gl(text_t* text, vec4 color) { + glm_vec4_copy(color, text->color); +} + +void text_set_rgb_hex(text_t* text, uint32_t color) { + color &= 0x00FFFFFF; + color <<= 8; + color |= 0xFF; + + text_set_rgba_hex(text, color); +} + +void text_set_rgba_hex(text_t* text, uint32_t color) { + text_set_rgba(text, + (color >> 24) & 0xFF, + (color >> 16) & 0xFF, + (color >> 8) & 0xFF, + color & 0xFF + ); +} + +void text_move(text_t* text, vec2 coords) { + vec3 coords3 = { coords[0], coords[1], 0.f }; + glm_translate_make(text->trans_mat, coords3); +} + +void text_move_xy(text_t* text, float x, float y) { + vec2 coords = { x, y }; + text_move(text, coords); +} + +void text_wrap(text_t* text, uint32_t wrap) { + text->wrap = wrap; + text->vert_inv = 1; +} + +void text_redraw(text_t* text) { + if(!text->vert_inv && !text->texuv_inv) + return; + + text->tri_cnt = 2 * text->length; + + float* verts = NULL; + float* texuvs = NULL; + + if(text->vert_inv) + verts = malloc(sizeof(float) * 6 * text->tri_cnt); + if(text->texuv_inv) + texuvs = malloc(sizeof(float) * 6 * text->tri_cnt); + + uint32_t top_x = 0, top_y = 0; + for(uint32_t i = 0; i < text->length; ++i) { + glyph_t* glyph = text->font->glyphs + text->text[i]; + uint32_t width = (uint32_t)(text->size * glyph->width), + height = text->size; + + if(top_x + width > text->wrap && text->wrap != 0) { + top_x = 0; + top_y += height; + } + + // !! TRIANGLES WOUND CCW FOR CULLING !! // + + if(verts != NULL) { + // TRIANGLE 1 // + // TOP LEFT + verts[i * 12] = top_x; + verts[i * 12 + 1] = top_y; + // BOTTOM LEFT + verts[i * 12 + 2] = top_x; + verts[i * 12 + 3] = top_y + height; + // TOP RIGHT + verts[i * 12 + 4] = top_x + width; + verts[i * 12 + 5] = top_y; + + // TRIANGLE 2 // + // BOTTOM RIGHT + verts[i * 12 + 6] = top_x + width; + verts[i * 12 + 7] = top_y + height; + // TOP RIGHT + verts[i * 12 + 8] = top_x + width; + verts[i * 12 + 9] = top_y; + // BOTTOM LEFT + verts[i * 12 + 10] = top_x; + verts[i * 12 + 11] = top_y + height; + } + + if(texuvs != NULL) { + // TRIANGLE 1 // + // TOP LEFT + texuvs[i * 12] = glyph->top_left[0]; + texuvs[i * 12 + 1] = glyph->top_left[1]; + // BOTTOM LEFT + texuvs[i * 12 + 2] = glyph->top_left[0]; + texuvs[i * 12 + 3] = glyph->bottom_right[1]; + // TOP RIGHT + texuvs[i * 12 + 4] = glyph->bottom_right[0]; + texuvs[i * 12 + 5] = glyph->top_left[1]; + + // TRIANGLE 2 // + // BOTTOM RIGHT + texuvs[i * 12 + 6] = glyph->bottom_right[0]; + texuvs[i * 12 + 7] = glyph->bottom_right[1]; + // TOP RIGHT + texuvs[i * 12 + 8] = glyph->bottom_right[0]; + texuvs[i * 12 + 9] = glyph->top_left[1]; + // BOTTOM LEFT + texuvs[i * 12 + 10] = glyph->top_left[0]; + texuvs[i * 12 + 11] = glyph->bottom_right[1]; + } + + top_x += width; + } + + if(verts != NULL) { + glBindBuffer(GL_ARRAY_BUFFER, text->buffers[0]); + glBufferData( + GL_ARRAY_BUFFER, + text->tri_cnt * 6 * sizeof(float), + verts, + GL_DYNAMIC_DRAW + ); + } + + if(texuvs != NULL) { + glBindBuffer(GL_ARRAY_BUFFER, text->buffers[1]); + glBufferData( + GL_ARRAY_BUFFER, + text->tri_cnt * 6 * sizeof(float), + texuvs, + GL_DYNAMIC_DRAW + ); + } + + glBindBuffer(GL_ARRAY_BUFFER, 0); + + free(verts); + free(texuvs); + + text->vert_inv = 0; + text->texuv_inv = 0; +} + +void text_render(text_t* text) { + text_redraw(text); + shader_start(_ss.shader); + + glUniformMatrix4fv( + _ATTR(FONT_TRANS), + 1, GL_FALSE, + (float*)text->trans_mat + ); + glUniform4fv( + _ATTR(FONT_COLOR), 1, + (float*)text->color + ); + glActiveTexture(GL_TEXTURE0); + + font_bind(text->font); + glBindVertexArray(text->vao); + glDrawArrays(GL_TRIANGLES, 0, text->tri_cnt * 3); +} + +void text_destroy(text_t* text) { + glDeleteBuffers(2, text->buffers); + glDeleteVertexArrays(1, &text->vao); + + free(text->text); + free(text); +} \ No newline at end of file diff --git a/src/okuu/font.h b/src/okuu/font.h new file mode 100644 index 0000000..9366f14 --- /dev/null +++ b/src/okuu/font.h @@ -0,0 +1,78 @@ +#ifndef OKUU_FONT_H +#define OKUU_FONT_H + +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include "shader.h" +#include "koa/etc.h" + +typedef struct { + float width; + vec2 top_left, + bottom_right; +} glyph_t; + +typedef struct { + GLuint texture; + uint32_t width, height, + cell_width, cell_height; + glyph_t glyphs[256]; +} font_t; + +typedef struct { + font_t* font; + char* text; + vec4 color; + uint32_t + length, size, + wrap, tri_cnt; + + mat4 trans_mat; + GLuint vao, buffers[2]; + uint8_t vert_inv, texuv_inv; +} text_t; + +void font_init_subsystem(SDL_Window*); +void font_window_changed(SDL_Window*); +void font_set_default(font_t*); +void font_deinit_subsystem(); + +font_t* font_load(const char*, const char*, int); +void font_bind(font_t*); +void font_unbind(); +void font_unload(font_t*); + +text_t* text_create(font_t*); +void text_set(text_t*, const char*); +void text_set_font(text_t*, font_t*); +void text_set_size(text_t*, uint32_t); + +void text_set_rgb(text_t*, uint8_t, uint8_t, uint8_t); +void text_set_rgba(text_t*, uint8_t, uint8_t, uint8_t, uint8_t); +void text_set_rgb_gl(text_t*, vec3); +void text_set_rgba_gl(text_t*, vec4); +void text_set_rgb_hex(text_t*, uint32_t); +void text_set_rgba_hex(text_t*, uint32_t); + +void text_move(text_t*, vec2); +void text_move_xy(text_t*, float, float); +void text_wrap(text_t*, uint32_t); + +void text_redraw(text_t*); +void text_render(text_t*); + +/*void text_get_bounds(text_t*, vec2); +uint32_t text_line_count(text_t*);*/ + +void text_destroy(text_t*); + +#endif diff --git a/src/okuu/shader.c b/src/okuu/shader.c index a5d1969..0ec0af2 100644 --- a/src/okuu/shader.c +++ b/src/okuu/shader.c @@ -31,7 +31,7 @@ int shader_layout(shader_t* shader, int count, ...) { return 0; } -int shader_source(shader_t* shader, int files, ...) { +int shader_source(shader_t* shader, int is_src, int files, ...) { if(shader->loaded) return -1; @@ -42,16 +42,23 @@ int shader_source(shader_t* shader, int files, ...) { va_list args; va_start(args, files); for(int i = 0; i < files; ++i) { - const char* file_name = va_arg(args, const char*); - char* source = file_read(file_name); - if(source == NULL) { - failed = 1; - break; - } + char* file_name = "INLINE"; + char* source = NULL; + + if(!is_src) { + file_name = va_arg(args, char*); + source = file_read(file_name); + if(source == NULL) { + failed = 1; + break; + } + } else + source = va_arg(args, char*); shaders[i] = glCreateShader(va_arg(args, GLuint)); if(shaders[i] == 0) { - free(source); + if(!is_src) + free(source); failed = 1; break; } @@ -68,13 +75,15 @@ int shader_source(shader_t* shader, int files, ...) { fprintf(__STDERR, "[ERROR] (%s (COMPILER)) %s\n", file_name, msg); free(msg); - free(source); + if(!is_src) + free(source); failed = 1; break; } glAttachShader(shader->program, shaders[i]); - free(source); + if(!is_src) + free(source); } va_end(args); @@ -149,8 +158,10 @@ shader_t* shader_active() { } void shader_start(shader_t* shader) { - glUseProgram(shader->program); - _active = shader; + if(_active == NULL || _active->program != shader->program) { + glUseProgram(shader->program); + _active = shader; + } } void shader_stop() { diff --git a/src/okuu/shader.h b/src/okuu/shader.h index 75add8c..d277211 100644 --- a/src/okuu/shader.h +++ b/src/okuu/shader.h @@ -12,6 +12,9 @@ #define _SHADER shader_active() #define _ATTR(I) shader_attr(_SHADER, I) +#define SHADER_FILE 0 +#define SHADER_SRC 1 + typedef char layout_name_t[256]; typedef struct { @@ -27,7 +30,7 @@ typedef struct { shader_t* shader_create(const char*); int shader_layout(shader_t*, int, ...); -int shader_source(shader_t*, int, ...); +int shader_source(shader_t*, int, int, ...); int shader_attribs(shader_t*, int, ...); GLint shader_attr(const shader_t*, int); diff --git a/src/okuu/terrain.c b/src/okuu/terrain.c index 49788d8..1fbd390 100644 --- a/src/okuu/terrain.c +++ b/src/okuu/terrain.c @@ -1,11 +1,11 @@ #include "terrain.h" -#define _HGT_AT(A, X, Y) (A->bmps[0]->pixels[Y][X].r / 10.f) +#define _HGT_AT(A, X, Y) (A->bmps[0]->pixels[Y][X][_R_] / 10.f) #define _RWCOL_AT(A, X, Y) (A->bmps[1]->pixels[Y][X]) -#define _RCOL_AT(A, X, Y, C) (_RWCOL_AT(A, X, Y).C) +#define _RCOL_AT(A, X, Y, C) (_RWCOL_AT(A, X, Y)[C]) #define _COL_AT(A, X, Y, C) (_RCOL_AT(A, X, Y, C) / 255.f) #define _COL_EQ(A, X1, Y1, X2, Y2) \ - (color_eqp(&A->bmps[1]->pixels[Y1][X1], &A->bmps[1]->pixels[Y2][X2])) + (color_eqp(A->bmps[1]->pixels[Y1][X1], A->bmps[1]->pixels[Y2][X2])) float _avg_hgt(terrain_t* map, int x, int y) { return @@ -250,14 +250,12 @@ void terrain_move(terrain_t* terrain, int center_x, int center_y) { memcpy(data + at + 12, data + at + 3, 3 * sizeof(float)); memcpy(data + at + 24, data + at + 3, 3 * sizeof(float)); memcpy(data + at + 33, data + at + 3, 3 * sizeof(float)); - - //_norm_smooth(data, x, y); break; case 3: for(int j = 0; j < 12; ++j) { - data[at + j * 3] = _COL_AT(terrain, x, y, r); - data[at + j * 3 + 1] = _COL_AT(terrain, x, y, g); - data[at + j * 3 + 2] = _COL_AT(terrain, x, y, b); + data[at + j * 3] = _COL_AT(terrain, x, y, _R_); + data[at + j * 3 + 1] = _COL_AT(terrain, x, y, _G_); + data[at + j * 3 + 2] = _COL_AT(terrain, x, y, _B_); } const color_t path_colors[] = { @@ -267,7 +265,7 @@ void terrain_move(terrain_t* terrain, int center_x, int center_y) { int found = 0; for(int j = 0; j < sizeof(path_colors) / sizeof(color_t); ++j) { - if(color_eqp(&path_colors[j], &_RWCOL_AT(terrain, x, y))) { + if(color_eqp(path_colors[j], _RWCOL_AT(terrain, x, y))) { found = 1; break; } @@ -301,17 +299,17 @@ void terrain_move(terrain_t* terrain, int center_x, int center_y) { { data[at + j * 9] = _COL_AT(terrain, x + coords[j][0], - y + coords[j][1], r + y + coords[j][1], _R_ ); data[at + j * 9 + 1] = _COL_AT(terrain, x + coords[j][0], - y + coords[j][1], g + y + coords[j][1], _G_ ); data[at + j * 9 + 2] = _COL_AT(terrain, x + coords[j][0], - y + coords[j][1], b + y + coords[j][1], _B_ ); memcpy(data + at + j * 9 + 3, data + at + j * 9, 3 * sizeof(float)); @@ -319,31 +317,6 @@ void terrain_move(terrain_t* terrain, int center_x, int center_y) { } } - /* - for(int j = 0; j < 4; ++j) { - if(_COL_EQ(terrain, - x + coords[j][0], - y + coords[j][1], - x + coords[j][2], - y + coords[j][3])) - { - for(int k = 0; k < 6; ++k) { - data[at + ((k * 3 + j * 9) % 36)] = - _COL_AT(terrain, - x + coords[j][0], - y + coords[j][1], r); - data[at + ((k * 3 + j * 9 + 1) % 36)] = - _COL_AT(terrain, - x + coords[j][0], - y + coords[j][1], g); - data[at + ((k * 3 + j * 9 + 2) % 36)] = - _COL_AT(terrain, - x + coords[j][0], - y + coords[j][1], b); - } - } - }*/ - break; } }