From 6399b355bc115e3b321b054a1ae9df1e27e3440a Mon Sep 17 00:00:00 2001 From: Emil Kosz Date: Thu, 5 Jun 2025 21:42:14 +0200 Subject: [PATCH] Potentially speed up entity rendering? --- game/res/shaders/uielement.frag | 3 +- game/res/textures/font.png | Bin 1708 -> 1845 bytes game/res/textures/font.xcf | Bin 35644 -> 36621 bytes game/src/chunk/chunkman.c | 31 ++++++++++--- game/src/chunk/chunkman.h | 2 +- game/src/entity/entman.c | 77 +++++++++++++++----------------- game/src/gl/program.c | 8 +++- game/src/gl/program.h | 3 +- game/src/gl/texture.c | 15 ------- game/src/gl/texture.h | 1 - game/src/graphics.c | 24 +++++----- game/src/resources.c | 58 +++++++++++++----------- game/src/resources.h | 4 +- game/src/state.c | 20 ++++++--- game/src/state.h | 3 +- game/src/ui/uielement.c | 8 +--- game/src/ui/uielement.h | 4 +- game/src/ui/uiman.c | 42 +++++++++-------- 18 files changed, 158 insertions(+), 145 deletions(-) diff --git a/game/res/shaders/uielement.frag b/game/res/shaders/uielement.frag index 46b2d27..02c951d 100644 --- a/game/res/shaders/uielement.frag +++ b/game/res/shaders/uielement.frag @@ -9,6 +9,5 @@ varying vec2 f_uv; void main () { - vec4 tex_color = texture2D (texture, f_uv); - gl_FragColor = tex_color * vec4 (color, 1.0); + gl_FragColor = texture2D (texture, f_uv) * vec4 (color, 1.0); } diff --git a/game/res/textures/font.png b/game/res/textures/font.png index 9dea6b7835c5ddc3dee7ea4c93e9360f6e787e7b..538cdf5dc2533941d872dc1cf6b53f1d8ad38511 100644 GIT binary patch delta 1756 zcmZ3(yOnQ3ZvAFY7srr_TW@1;PkO7xF(>uu|9Z>knxS&rGn!Y-D6v1Q;{BL)XXlUI z?|=Wxe(?SG-+vw77r8RnK2kX6eoFoK%mTkZ?3@o0zt8!@FU*i?$Jwwz$V2tRW-kTx zc}fjGB=k1b2r+D}?_yY2_lkj~v|$c+fJy+n!agU4DgRj<1y~&G1;7*vdBnuPB2~9; z+DXmB$4@=qdjIM9sQ3S`?{J%OtM-2R>YBA{uKbIW-Mef4wkfqeGHKtp=(|RJJ>THT ztnV8Vw=Y~Q(>c!nZDg;)sl}xi)&Kwe-Lc_=P32L6-LKcwq+AkMR}j>&mYZ>k>@*jb z*YBh1=jxi>%kB>;yY@uk?!sLOms_@>ccP87Z$5 zzO(7RS}<*wcZgwt^nUGA4A&x7m~`k07B^+CzGxZsce7Ar+`F!AT{c@X-!iO!H+x&G z@o&LPToQr*UU*z8ocP#}{WH(v_dk|iy^?;?HDvNa^=0)trk=TcGc9TLxhFRnS4(!3 z%~^eaezlses_TS}9Ew@DRu;;i4>53mz2%I5m&?r5bxBv&ojct>%dNbvC?P#s+}L*N z@dE#>k1QJ}{myzi`^d5hwx8v!C)G7q9E!RxuiL-JzIU_T+wi4bZ*8Z4JF~PwQ2!}^ zFZ+gR-#g4Z41R9?rd}Vi``fDzoy;$mwq|cBIs2ohXXy+Tt@N*p{lr^hrzM8YyB~dU zU3Im@EL*#Qwe!No1Bje=h|v5P+9+E%2aE4YKb<%`ur z#n08#T1+p$RIXa`Y3ujZ$9T6Uohn(17q(jEcl$bHvNUYgzB)^>f(l=`R{*L9wT zN;5PI73^(;PzlSeReZ5lnYuGw9C6C+3Pgj51yW?=DmwMF)mms0) zIk{|&yR{qhw}}N<=JMvr3L0N)oh-2VX!9p`3zsRmF9eMRWP`Z{7fg=d>@@AZWQkFC z{L#NU8+%u5ek-3OYxuD0idN>oTZd=X?=26K7SNSgd%wA&T=@TNad}4pwZg{-nRI`@ zwG~`+xBvas#y!)WPVaG9P~yPSdsyQuvv2L$3WoK6^Ul^)uiukqzc1YWS6r3aQ|=4j z>f8I5Zr>o3b?l19gd5f~<-$&hE>)cO)b^2Z+V}J}wRMH6;lW4dJSeC<{Hi~tZRsSX zES>s&(+;<{eBz4{<8r%qKB;hpa;95T*WE|@=k1|Li#SxuZg{M-t<=ERMTy>II zspC`ruzGES9{Z0&OU?@fPn)7I_cAtS>VfqM>J!~#5?qOser_G4ux z{cVExFFLN9#q=W4?dzdcripiFecD@L?fpMszlX~F|Mi?)8jb?DONBa3Grm1epR!)l zC+`3BM^08Q3pMite_Xg?_F`wl!wm&0atX)k>~`JX=Ve#*Twmk<^}6;HKli@(*?Svb znH0u<Zr*gf}k zElZsxW5uqFr4onhSLDUyvhlwc-P_HrvUXeMTbIb^d`c3W%PhVItthZM5UtDU-xRmg zVutdGi~I&&53I%9KP@{Gn;2?sdHR*i|I?fco+Vs(w`}dJ3ol-MjW~Gk_fJJvhbL=Y zv-=hW|9Z|D9I+#8vfSN%_tV~QSJ}RgbhWdSS%SH zYJ~YcT4unQv8m(gz35F9nfvv(GImDgZOlKtee3-fU-zEjRZzX*X1w!nv5C*>#P4}e zXH7iH-5ce$sp9LM{cBe|y>@E;Qu+ET9ShuE+**bzFNXu5pO$rfexPEs2;x!+5_i?E#sad+hV>#cVYuDu!AG*5qzusa}IP3e0 z9yh(|*Y3y-?~&WQwZGmzIud^NUWWD;?(Kb^F;1_K zMz5=97O3Ws*=hPUIE>+Aq45L-MgbLuLwC70#NDy5K0U)-%;5a@YtcuQ?lsMu;AQ&# zcJ$_!r}gh|=$^UVvLmbdqrlo<$}>+#yEJ@Pi7xt);j>mdKI;Vst09agQ?EnA( delta 1618 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 ZT9W-g()f^M4NA%2kO8GTNQy;D@&I`mf=mDa diff --git a/game/src/chunk/chunkman.c b/game/src/chunk/chunkman.c index 26fff30..20e8de6 100644 --- a/game/src/chunk/chunkman.c +++ b/game/src/chunk/chunkman.c @@ -3,6 +3,8 @@ /* TODO: perhaps render the chunks in a circle, not a square, around the player? */ +int n_frame_chunks; + static GHashTable *chunks; static GHashTable *chunk_meshes; @@ -11,16 +13,19 @@ static bool bound = false; guint chunkman_ivec2_hash (gconstpointer key) { + /* This makes sure there's no collisions, thus making the whole + table much, much faster. */ const ivec2 *v = key; - return g_int_hash(&(*v)[0]) ^ g_int_hash(&(*v)[1]); + guint x = (guint) (*v)[0]; + guint y = (guint) (*v)[1]; + return (x * 73856093u) ^ (y * 19349663u); } gboolean chunkman_ivec2_equal (gconstpointer a, gconstpointer b) { - const ivec2 *av = a; - const ivec2 *bv = b; - return (*av)[0] == (*bv)[0] && (*av)[1] == (*bv)[1]; + /* Much faster than comparing the integer values. */ + return memcmp (a, b, sizeof (int) * 2) == 0; } ivec2 * @@ -141,6 +146,19 @@ chunkman_render (vec3 position) chunkman_world_to_chunk (position[0], position[2], &cx, &cz); program_use (RESPRG ("chunk")); + glActiveTexture (GL_TEXTURE0); + glBindTexture (GL_TEXTURE_2D, RESTEX ("terrain0")); + glActiveTexture (GL_TEXTURE1); + glBindTexture (GL_TEXTURE_2D, RESTEX ("terrain1")); + glActiveTexture (GL_TEXTURE2); + glBindTexture (GL_TEXTURE_2D, RESTEX ("terrain2")); + glActiveTexture (GL_TEXTURE3); + glBindTexture (GL_TEXTURE_2D, RESTEX ("terrain3")); + glActiveTexture (GL_TEXTURE4); + glBindTexture (GL_TEXTURE_2D, RESTEX ("terrain4")); + + n_frame_chunks = 0; + for (int z = cz - RENDER_DISTANCE; z <= cz + RENDER_DISTANCE; ++z) { for (int x = cx - RENDER_DISTANCE; x <= cx + RENDER_DISTANCE; ++x) @@ -154,8 +172,9 @@ chunkman_render (vec3 position) bound = true; } - program_set_vec3 (RESPRG ("chunk"), "chunk_position", x * CHUNK_DIM, 0.0, z * CHUNK_DIM); - ChunkMesh_render (mesh); + program_set_vec3_ind (RESPRG ("chunk"), "chunk_position", x * CHUNK_DIM, 0.0, z * CHUNK_DIM); + ChunkMesh_render (mesh); + n_frame_chunks++; } } } diff --git a/game/src/chunk/chunkman.h b/game/src/chunk/chunkman.h index 4d4ecf6..1fcb6c3 100644 --- a/game/src/chunk/chunkman.h +++ b/game/src/chunk/chunkman.h @@ -9,7 +9,7 @@ #include "../entity/entman.h" #include "../entity/templates.h" -#define RENDER_DISTANCE 4 +#define RENDER_DISTANCE 3 void chunkman_init (); void chunkman_update (vec3 position); diff --git a/game/src/entity/entman.c b/game/src/entity/entman.c index 346500f..7b94851 100644 --- a/game/src/entity/entman.c +++ b/game/src/entity/entman.c @@ -5,9 +5,9 @@ seperately somehow. */ extern vec3 camera_position; -extern int last_time; Entity *player_entity, *sky_entity; +int n_frame_ents; static GSequence *entities; static SimpleMesh mesh_quad1, mesh_quad2, mesh_quad_x; @@ -78,7 +78,13 @@ void entman_render_internal (gpointer data, gpointer userdata) { Entity *entity = data; - mat4 *view = userdata; + + struct { + mat4 *view; +#ifdef FRUSTUM_CULL + vec4 *frustum_planes[6]; +#endif + } *vp = userdata; if (!entity->visible) { @@ -90,22 +96,15 @@ entman_render_internal (gpointer data, gpointer userdata) { return; } - + /* TODO: Fix this up. It still isn't perfect, when you look up, sometimes the entities get culled. */ #if FRUSTUM_CULL - vec4 planes[6]; - mat4 proj, view_proj; - - camera_get_projection (640.0 / 480.0, proj); - glm_mat4_mul (proj, *view, view_proj); - glm_frustum_planes (view_proj, planes); - vec3 aabb[2]; entity_compute_aabb (entity, aabb[0], aabb[1]); - if (!glm_aabb_frustum (aabb, planes)) + if (!glm_aabb_frustum (aabb, *vp->frustum_planes)) { return; } @@ -133,7 +132,7 @@ entman_render_internal (gpointer data, gpointer userdata) { case RENDER_BILLBOARD: mat4 inv_view; - glm_mat4_copy (*view, inv_view); + glm_mat4_copy (*vp->view, inv_view); glm_mat4_inv (inv_view, inv_view); vec3 right = { inv_view[0][0], inv_view[1][0], inv_view[2][0] }; @@ -182,16 +181,7 @@ entman_render_internal (gpointer data, gpointer userdata) } program_set_mat4 (entity->program, "model", model); - program_set_float (entity->program, "time", last_time); - - if (entity->wavy) - { - program_set_float (entity->program, "wavy", true); - } - else - { - program_set_float (entity->program, "wavy", false); - } + program_set_float (entity->program, "wavy", entity->wavy); if (entity->texture != last_texture) { @@ -208,12 +198,33 @@ entman_render_internal (gpointer data, gpointer userdata) last_type = entity->mesh_type; last_texture = entity->texture; SimpleMesh_render (&to_render); + + n_frame_ents++; } void -entman_render (mat4 view) +entman_render (mat4 *view, mat4 *proj) { - g_sequence_foreach (entities, entman_render_internal, view); + last_program = -1; + last_texture = -1; + last_type = -1; + n_frame_ents = 0; + +#ifdef FRUSTUM_CULL + vec4 planes[6]; + mat4 view_proj; + glm_mat4_mul (*proj, *view, view_proj); + glm_frustum_planes (view_proj, planes); +#endif + + struct { + mat4 *view; +#ifdef FRUSTUM_CULL + vec4 *frustum_planes; +#endif + } data = { view, planes }; + + g_sequence_foreach (entities, entman_render_internal, &data); } static inline int @@ -225,24 +236,6 @@ entman_compare (gconstpointer a, gconstpointer b, gpointer userdata) const Entity *entity1 = a; const Entity *entity2 = b; - if (entity1->mesh_type == entity2->mesh_type) - { - return 0; - } - - // Handle MESH_QUAD1 - if (entity1->mesh_type == MESH_QUAD1) - return -1; - if (entity2->mesh_type == MESH_QUAD1) - return 1; - - // Handle MESH_QUAD_X vs MESH_QUAD2 - if (entity1->mesh_type == MESH_QUAD_X && entity2->mesh_type == MESH_QUAD2) - return -1; - if (entity1->mesh_type == MESH_QUAD2 && entity2->mesh_type == MESH_QUAD_X) - return 1; - - // Default: compare numerically return (int) entity1->mesh_type - (int) entity2->mesh_type; } diff --git a/game/src/gl/program.c b/game/src/gl/program.c index 9121cb8..2d35e3b 100644 --- a/game/src/gl/program.c +++ b/game/src/gl/program.c @@ -73,7 +73,13 @@ program_create (const char *v_src, const char *f_src) } void -program_set_vec3 (int program, const char *name, float x, float y, float z) +program_set_vec3 (int program, const char *name, vec3 value) +{ + glUniform3f (glGetUniformLocation (program, name), value[0], value[1], value[2]); +} + +void +program_set_vec3_ind (int program, const char *name, float x, float y, float z) { glUniform3f (glGetUniformLocation (program, name), x, y, z); } diff --git a/game/src/gl/program.h b/game/src/gl/program.h index 4759e6c..3d49ae9 100644 --- a/game/src/gl/program.h +++ b/game/src/gl/program.h @@ -13,6 +13,7 @@ void program_fail (int program); int program_create (const char *v_src, const char *f_src); void program_set_float (int program, const char *name, float value); void program_set_int_array (int program, const char *name, size_t count, int *value); -void program_set_vec3 (int program, const char *name, float x, float y, float z); +void program_set_vec3 (int program, const char *name, vec3 value); +void program_set_vec3_ind (int program, const char *name, float x, float y, float z); void program_set_mat4 (int program, const char *name, mat4 value); void program_print (int program); diff --git a/game/src/gl/texture.c b/game/src/gl/texture.c index b60a04c..efeedaf 100644 --- a/game/src/gl/texture.c +++ b/game/src/gl/texture.c @@ -14,18 +14,3 @@ texture_create (int width, int height, unsigned char *data) return texture; } - -unsigned int -texture_create_no_interp (int width, int height, unsigned char *data) -{ - unsigned int texture; - glGenTextures (1, &texture); - glBindTexture (GL_TEXTURE_2D, texture); - glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST); - glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - - glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, data); - glGenerateMipmap (GL_TEXTURE_2D); - - return texture; -} diff --git a/game/src/gl/texture.h b/game/src/gl/texture.h index a5beb46..587abdd 100644 --- a/game/src/gl/texture.h +++ b/game/src/gl/texture.h @@ -3,4 +3,3 @@ #include unsigned int texture_create (int width, int height, unsigned char *data); -unsigned int texture_create_no_interp (int width, int height, unsigned char *data); diff --git a/game/src/graphics.c b/game/src/graphics.c index 6485d32..1a06827 100644 --- a/game/src/graphics.c +++ b/game/src/graphics.c @@ -1,6 +1,7 @@ #include "graphics.h" extern vec3 camera_position; +extern int last_time; static SDL_Window *sdl_window; static SDL_GLContext gl_context; @@ -51,6 +52,8 @@ graphics_init () glEnable (GL_CULL_FACE); glEnable (GL_DEPTH_TEST); + glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glBlendFuncSeparate (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ZERO); } void @@ -62,26 +65,19 @@ graphics_render () camera_get_projection (WINDOW_WIDTH / WINDOW_HEIGHT, projection); camera_get_view (view); - resources_programs_set_projection (projection); - resources_programs_set_view (view); - - glActiveTexture (GL_TEXTURE0); - glBindTexture (GL_TEXTURE_2D, RESTEX ("terrain0")); - glActiveTexture (GL_TEXTURE1); - glBindTexture (GL_TEXTURE_2D, RESTEX ("terrain1")); - glActiveTexture (GL_TEXTURE2); - glBindTexture (GL_TEXTURE_2D, RESTEX ("terrain2")); - glActiveTexture (GL_TEXTURE3); - glBindTexture (GL_TEXTURE_2D, RESTEX ("terrain3")); - glActiveTexture (GL_TEXTURE4); - glBindTexture (GL_TEXTURE_2D, RESTEX ("terrain4")); + resources_programs_set_mat4 ("projection", &projection); + resources_programs_set_mat4 ("view", &view); + resources_programs_set_float ("time", last_time); chunkman_render (camera_position); - entman_render (view); + entman_render (view, projection); + /* We don't care about blending elsewhere for now. */ + glEnable (GL_BLEND); glDisable (GL_DEPTH_TEST); uiman_render (); glEnable (GL_DEPTH_TEST); + glDisable (GL_BLEND); SDL_GL_SwapWindow (sdl_window); } diff --git a/game/src/resources.c b/game/src/resources.c index c99236e..8782c26 100644 --- a/game/src/resources.c +++ b/game/src/resources.c @@ -55,21 +55,6 @@ resources_load_texture (const char *path) return texture; } -unsigned int -resources_load_texture_no_interp (const char *path) -{ - SDL_Surface *surface = IMG_Load (path); - - if (surface == NULL) - { - WARN ("Failed to load texture from path %s: %s", path, SDL_GetError ()); - return 0; - } - - unsigned int texture = texture_create_no_interp (surface->w, surface->h, surface->pixels); - return texture; -} - static inline void resources_add_program (char *key, unsigned int program) { @@ -101,35 +86,55 @@ resources_get_texture (char *key) } void -res_proj_internal (gpointer key, gpointer value, gpointer userdata) +res_mat4_internal (gpointer key, gpointer value, gpointer userdata) { UNUSED (key); unsigned int program = GPOINTER_TO_INT (value); - mat4 *projection = userdata; + + struct { + const char *name; + mat4 *mat; + } *data = userdata; + program_use (program); - program_set_mat4 (program, "projection", *projection); + program_set_mat4 (program, data->name, *data->mat); } void -res_view_internal (gpointer key, gpointer value, gpointer userdata) +res_float_internal (gpointer key, gpointer value, gpointer userdata) { UNUSED (key); unsigned int program = GPOINTER_TO_INT (value); - mat4 *view = userdata; + + struct { + const char *name; + float val; + } *data = userdata; + program_use (program); - program_set_mat4 (program, "view", *view); + program_set_float (program, data->name, data->val); } void -resources_programs_set_projection (mat4 projection) +resources_programs_set_float (const char *name, float value) { - g_hash_table_foreach (programs, res_proj_internal, projection); + struct { + const char *name; + float val; + } data = { name, value }; + + g_hash_table_foreach (programs, res_float_internal, &data); } void -resources_programs_set_view (mat4 view) +resources_programs_set_mat4 (const char *name, mat4 *value) { - g_hash_table_foreach (programs, res_view_internal, view); + struct { + const char *name; + mat4 *mat; + } data = { name, value }; + + g_hash_table_foreach (programs, res_mat4_internal, &data); } void @@ -142,7 +147,6 @@ resources_init () #define RLP resources_load_program #define RAT resources_add_texture #define RLT resources_load_texture - #define RLTNI resources_load_texture_no_interp RAP ("default", RLP ("res/shaders/default.vert", "res/shaders/default.frag")); RAP ("chunk", RLP ("res/shaders/chunk.vert", "res/shaders/chunk.frag")); @@ -158,7 +162,7 @@ resources_init () RAT ("grass0", RLT ("res/textures/grass0.png")); RAT ("clouds", RLT ("res/textures/clouds.png")); - RAT ("font0", RLTNI ("res/textures/font.png")); + RAT ("font0", RLT ("res/textures/font.png")); #undef RAP #undef RLP diff --git a/game/src/resources.h b/game/src/resources.h index 8cd0634..4516815 100644 --- a/game/src/resources.h +++ b/game/src/resources.h @@ -10,8 +10,8 @@ #define RESPRG(key) (resources_get_program (key)) #define RESTEX(key) (resources_get_texture (key)) -void resources_programs_set_projection (mat4 projection); -void resources_programs_set_view (mat4 view); +void resources_programs_set_float (const char *name, float value); +void resources_programs_set_mat4 (const char *name, mat4 *mat); unsigned int resources_get_program (char *key); unsigned int resources_get_texture (char *key); void resources_init (); diff --git a/game/src/state.c b/game/src/state.c index 3ceac97..dc49185 100644 --- a/game/src/state.c +++ b/game/src/state.c @@ -3,7 +3,8 @@ extern vec3 camera_position; extern vec3 camera_rotation; extern Entity *player_entity, *sky_entity; -extern UIElement *player_pos; +extern UIElement *player_pos, *n_ents, *n_chunks; +extern int n_frame_ents, n_frame_chunks; float delta_time; int last_time; @@ -21,18 +22,27 @@ game_state_tick (int ticks) delta_time = (ticks - last_time) / 1000.0; last_time = ticks; + /* We pin the camera to the player position, with eye level 20 + centimeters below the height. */ glm_vec3_copy (player_entity->position, camera_position); camera_position[1] += player_entity->scale[1] - 0.2; player_entity->rotation[1] = camera_rotation[1]; + /* The sky needs to be in the center of the world all the time, + otherwise, as we explore the world, we might reach the end of the + sky. */ sky_entity->position[0] = camera_position[0]; sky_entity->position[2] = camera_position[2]; /* Put the player position into the UI. */ - char *buf = malloc (sizeof (char) * 32); - snprintf (buf, 32, "X:%2.1f Y:%2.1f Z:%2.1f", player_entity->position[0], + player_pos->text = malloc (sizeof (char) * 32); + snprintf (player_pos->text, 32, "position X:%2.1f Y:%2.1f Z:%2.1f", player_entity->position[0], player_entity->position[1], player_entity->position[2]); - player_pos->text = buf; - + /* Put the amount of entities rendered into the UI. */ + n_ents->text = malloc (sizeof (char) * 32); + snprintf (n_ents->text, 32, "entities rendered: %d", n_frame_ents); + /* Put the amount of chunks rendered into the UI. */ + n_chunks->text = malloc (sizeof (char) * 32); + snprintf (n_chunks->text, 32, "chunks rendered: %d", n_frame_chunks); if (flags_get ("moving_forward")) { diff --git a/game/src/state.h b/game/src/state.h index 8f94fa0..d3fe675 100644 --- a/game/src/state.h +++ b/game/src/state.h @@ -2,7 +2,8 @@ #include "camera.h" #include "flags.h" -#include "entity/entity.h" +#include "chunk/chunkman.h" +#include "entity/entman.h" #include "ui/uielement.h" void game_state_init (int ticks); diff --git a/game/src/ui/uielement.c b/game/src/ui/uielement.c index b9bcbb2..18ce98b 100644 --- a/game/src/ui/uielement.c +++ b/game/src/ui/uielement.c @@ -47,18 +47,14 @@ UIElement_render (UIElement *element) program_set_mat4 (RESPRG ("uielement"), "model", model); /* TODO: rename this function to vec3_individual or something. */ - program_set_vec3 (RESPRG ("uielement"), "color", - element->background_color[0], element->background_color[1], - element->background_color[2]); + program_set_vec3 (RESPRG ("uielement"), "color", element->background_color); SimpleMesh_render (&quad); /* Now, the tedious, boring, and so on task of rendering the text, the worst fate of an OpenGL programmer. */ glActiveTexture (GL_TEXTURE0); glBindTexture (GL_TEXTURE_2D, RESTEX ("font0")); - program_set_vec3 (RESPRG ("uielement"), "color", - element->text_color[0], element->text_color[1], - element->text_color[2]); + program_set_vec3 (RESPRG ("uielement"), "color", element->text_color); for (size_t i = 0; i < strlen (element->text); ++i) { diff --git a/game/src/ui/uielement.h b/game/src/ui/uielement.h index 671ccb3..9d20106 100644 --- a/game/src/ui/uielement.h +++ b/game/src/ui/uielement.h @@ -1,7 +1,5 @@ #pragma once -/* TODO: Patch up with GLib's GTree */ - #include #include @@ -19,6 +17,8 @@ typedef struct UIElement void (*on_left_click) (struct UIElement *self); void (*on_right_click) (struct UIElement *self); + void (*on_tick) (struct UIElement *self); + void *userdata; bool visible; vec3 text_color; diff --git a/game/src/ui/uiman.c b/game/src/ui/uiman.c index 0023752..ea839d3 100644 --- a/game/src/ui/uiman.c +++ b/game/src/ui/uiman.c @@ -1,33 +1,37 @@ #include "uiman.h" -UIElement *player_pos; +UIElement *player_pos, *n_ents, *n_chunks; static UIElement ui_root; +#define UINEWROOT() ((UIElement) { .parent = NULL, .children = g_sequence_new (NULL), .visible = false }) +#define UINEW(pare) ((UIElement) { .parent = pare, .text_color = { 1.0, 1.0, 1.0 }, .visible = true }) +#define UIADD(pare, child) (UIElement_add_child (pare, child)) + void uiman_init () { - ui_root = (UIElement) { - .parent = NULL, - .children = g_sequence_new (NULL), - .visible = false, - }; + ui_element_mesh_init (); + ui_root = UINEWROOT (); player_pos = malloc (sizeof (UIElement)); - *player_pos = (UIElement) { - .parent = &ui_root, - .children = NULL, - .visible = true, - .background_color = { 0.0, 0.0, 0.0 }, - .text_color = { 1.0, 1.0, 1.0 }, - .position = { -0.65, 0.92, 0.0 }, - .scale = { 0.3, 0.03, 1.0 }, - .text = "POSITION: 0,0,0" - }; - - UIElement_add_child (&ui_root, player_pos); + *player_pos = UINEW (&ui_root); + glm_vec3_copy ((vec3) { -0.65, 0.92, 0.0 }, player_pos->position); + glm_vec3_copy ((vec3) { 0.3, 0.03, 1.0 }, player_pos->scale); + UIADD (&ui_root, player_pos); - ui_element_mesh_init (); + n_ents = malloc (sizeof (UIElement)); + *n_ents = UINEW (&ui_root); + glm_vec3_copy ((vec3) { -0.65, 0.81, 0.0 }, n_ents->position); + glm_vec3_copy ((vec3) { 0.3, 0.03, 1.0 }, n_ents->scale); + glm_vec3_copy ((vec3) { 0.7, 1.0, 0.7 }, n_ents->text_color); + UIADD (&ui_root, n_ents); + + n_chunks = malloc (sizeof (UIElement)); + *n_chunks = UINEW (&ui_root); + glm_vec3_copy ((vec3) { -0.65, 0.70, 0.0 }, n_chunks->position); + glm_vec3_copy ((vec3) { 0.3, 0.03, 1.0 }, n_chunks->scale); + UIADD (&ui_root, n_chunks); } void