Tue, 24 Jun 2025 20:21:38 +0200
add functions to upload common uniforms
src/2d.c | file | annotate | diff | comparison | revisions | |
src/ascension/2d.h | file | annotate | diff | comparison | revisions | |
src/ascension/scene_node.h | file | annotate | diff | comparison | revisions | |
src/ascension/shader.h | file | annotate | diff | comparison | revisions | |
src/shader.c | file | annotate | diff | comparison | revisions | |
src/sprite.c | file | annotate | diff | comparison | revisions |
--- a/src/2d.c Tue Jun 24 20:09:47 2025 +0200 +++ b/src/2d.c Tue Jun 24 20:21:38 2025 +0200 @@ -32,6 +32,7 @@ #include "ascension/error.h" #include "ascension/shader.h" +// TODO: implement abstraction in shader.h to remove glew.h include here #include <GL/glew.h> #include <assert.h> @@ -102,8 +103,7 @@ static void asc_rectangle_update(AscSceneNode *node) { asc_ptr_cast(AscRectangle, rectangle, node); - asc_vec2f size = asc_vec2f_new(rectangle->width, rectangle->height); - asc_mesh_plane_2d(&rectangle->mesh, .size = size, .uv_scale = size); + asc_mesh_plane_2d(&rectangle->mesh, .size = rectangle->size, .uv_scale = rectangle->size); } static void asc_rectangle_draw(const AscCamera *camera, const AscSceneNode *node) { @@ -138,31 +138,19 @@ asc_shader_use(&shader->program, camera); // Upload uniforms - // TODO: uploading model matrix could be a helper function - glUniformMatrix4fv(shader->program.model, 1, - GL_FALSE, node->world_transform); + asc_shader_upload_model_matrix(&shader->program, node); if (filled) { - glUniform4f(shader->color, - rectangle->color.red, - rectangle->color.green, - rectangle->color.blue, - rectangle->color.alpha - ); + asc_shader_upload_col4f(shader->color, rectangle->color); } - glUniform2f(shader->size, rectangle->width, rectangle->height); + asc_shader_upload_vec2f(shader->size, rectangle->size); if (border) { - glUniform1f(shader->thickness, rectangle->thickness); - glUniform4f(shader->border_color, - rectangle->border_color.red, - rectangle->border_color.green, - rectangle->border_color.blue, - rectangle->border_color.alpha - ); + asc_shader_upload_float(shader->thickness, rectangle->thickness); + asc_shader_upload_col4f(shader->border_color, rectangle->border_color); } if (round) { - glUniform1f(shader->radius, rectangle->radius); + asc_shader_upload_float(shader->radius, rectangle->radius); } // Draw mesh @@ -175,13 +163,13 @@ if (args.bounds.size.width + args.bounds.size.height > 0) { rectangle->node.position.x = (float) args.bounds.pos.x; rectangle->node.position.y = (float) args.bounds.pos.y; - rectangle->width = (float) args.bounds.size.width; - rectangle->height = (float) args.bounds.size.height; + rectangle->size.width = (float) args.bounds.size.width; + rectangle->size.height = (float) args.bounds.size.height; } else { rectangle->node.position.x = (float) args.x; rectangle->node.position.y = (float) args.y; - rectangle->width = (float) args.width; - rectangle->height = (float) args.height; + rectangle->size.width = (float) args.width; + rectangle->size.height = (float) args.height; } rectangle->radius = (float)args.radius;
--- a/src/ascension/2d.h Tue Jun 24 20:09:47 2025 +0200 +++ b/src/ascension/2d.h Tue Jun 24 20:21:38 2025 +0200 @@ -36,8 +36,7 @@ AscMesh mesh; asc_col4f color; asc_col4f border_color; - float width; - float height; + asc_vec2f size; float radius; float thickness; bool filled;
--- a/src/ascension/scene_node.h Tue Jun 24 20:09:47 2025 +0200 +++ b/src/ascension/scene_node.h Tue Jun 24 20:21:38 2025 +0200 @@ -35,7 +35,7 @@ #include "transform.h" typedef struct asc_scene_node_s AscSceneNode; -typedef struct asc_camera_s AscCamera; // opaque declared +typedef struct asc_camera_s AscCamera; // avoids full include of camera.h typedef void(*asc_scene_node_destroy_func)(AscSceneNode*); typedef void(*asc_scene_node_update_func)(AscSceneNode*);
--- a/src/ascension/shader.h Tue Jun 24 20:09:47 2025 +0200 +++ b/src/ascension/shader.h Tue Jun 24 20:21:38 2025 +0200 @@ -28,8 +28,12 @@ #ifndef ASCENSION_SHADER_H #define ASCENSION_SHADER_H +#include <cx/allocator.h> + #include "camera.h" +typedef struct asc_scene_node_s AscSceneNode; // avoids full include of scene_node.h + struct asc_shader_code_files_s { /** * File name of the vertex shader. @@ -235,4 +239,16 @@ */ void asc_shader_clear_registry(void); +void asc_shader_upload_model_matrix(const AscShaderProgram *shader, const AscSceneNode *node); + +void asc_shader_upload_col4f(int uniform_id, asc_col4f color); + +static inline void asc_shader_upload_col4i(int uniform_id, asc_col4i color) { + asc_shader_upload_col4f(uniform_id, asc_col_itof(color)); +} + +void asc_shader_upload_float(int uniform_id, float value); + +void asc_shader_upload_vec2f(int uniform_id, asc_vec2f value); + #endif //ASCENSION_SHADER_H
--- a/src/shader.c Tue Jun 24 20:09:47 2025 +0200 +++ b/src/shader.c Tue Jun 24 20:21:38 2025 +0200 @@ -25,9 +25,10 @@ * POSSIBILITY OF SUCH DAMAGE. */ +#include "ascension/shader.h" + #include "ascension/context.h" #include "ascension/error.h" -#include "ascension/shader.h" #include "ascension/filesystem.h" #include <string.h> @@ -262,3 +263,19 @@ // also clear the active program to avoid accidental matches with newly created shaders asc_shader_use(NULL, NULL); } + +void asc_shader_upload_model_matrix(const AscShaderProgram *shader, const AscSceneNode *node) { + glUniformMatrix4fv(shader->model, 1,GL_FALSE, node->world_transform); +} + +void asc_shader_upload_col4f(int uniform_id, asc_col4f color) { + glUniform4f(uniform_id, color.red, color.green, color.blue, color.alpha); +} + +void asc_shader_upload_float(int uniform_id, float value) { + glUniform1f(uniform_id, value); +} + +void asc_shader_upload_vec2f(int uniform_id, asc_vec2f value) { + glUniform2f(uniform_id, value.x, value.y); +}
--- a/src/sprite.c Tue Jun 24 20:09:47 2025 +0200 +++ b/src/sprite.c Tue Jun 24 20:21:38 2025 +0200 @@ -105,8 +105,7 @@ asc_shader_use(&shader->program, camera); // Upload model matrix - glUniformMatrix4fv(shader->program.model, 1, - GL_FALSE, node->world_transform); + asc_shader_upload_model_matrix(&shader->program, node); // Bind texture asc_texture_bind(sprite->texture, shader->tex, 0);