add functions to upload common uniforms default tip

Tue, 24 Jun 2025 20:21:38 +0200

author
Mike Becker <universe@uap-core.de>
date
Tue, 24 Jun 2025 20:21:38 +0200
changeset 167
8e6a661c87db
parent 166
d7a06c1afa0a

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);

mercurial