simplify how pre-defined shader IDs work

Fri, 25 Jul 2025 19:19:54 +0200

author
Mike Becker <universe@uap-core.de>
date
Fri, 25 Jul 2025 19:19:54 +0200
changeset 226
18327d2df79d
parent 225
c42c7d1a3c34
child 227
a5775e8dbc13

simplify how pre-defined shader IDs work

src/2d.c file | annotate | diff | comparison | revisions
src/ascension/constants.h file | annotate | diff | comparison | revisions
src/sprite.c file | annotate | diff | comparison | revisions
src/text.c file | annotate | diff | comparison | revisions
--- a/src/2d.c	Fri Jul 25 18:58:50 2025 +0200
+++ b/src/2d.c	Fri Jul 25 19:19:54 2025 +0200
@@ -93,25 +93,16 @@
 
     // Compute shader flags
     int shader_flags = 0;
+    // TODO: think about a bool-array to int utility function
     if (filled) shader_flags |= ASC_RECTANGLE_SHADER_FLAG_FILL;
     if (border) shader_flags |= ASC_RECTANGLE_SHADER_FLAG_BORDER;
     if (round) shader_flags |= ASC_RECTANGLE_SHADER_FLAG_ROUND;
 
-    // Lookup table for the shader ID
-    const int shader_ids[] = {
-        -1, // unused
-        ASC_SHADER_RECTANGLE_FILL,
-        ASC_SHADER_RECTANGLE_DRAW_ROUND,
-        ASC_SHADER_RECTANGLE_FILL_ROUND,
-        ASC_SHADER_RECTANGLE_DRAW,
-        ASC_SHADER_RECTANGLE_FILL_BORDER,
-        ASC_SHADER_RECTANGLE_DRAW_ROUND,
-        ASC_SHADER_RECTANGLE_FILL_BORDER_ROUND,
-    };
-
-    // Look up and activate shader
+    // Look up and activate the shader
     const AscShaderProgram *shader = asc_shader_lookup_or_create(
-        shader_ids[shader_flags], asc_rectangle_shader_create, shader_flags);
+        ASC_SHADER_RECTANGLE(shader_flags),
+        asc_rectangle_shader_create, shader_flags
+    );
     if (asc_shader_use(shader, camera)) return;
     asc_cptr_cast(AscRectangleShader, rect_shader, shader);
 
@@ -240,17 +231,11 @@
     if (filled) shader_flags |= ASC_ELLIPSIS_SHADER_FLAG_FILL;
     if (border) shader_flags |= ASC_ELLIPSIS_SHADER_FLAG_BORDER;
 
-    // Lookup table for the shader ID
-    const int shader_ids[] = {
-        -1, // unused
-        ASC_SHADER_ELLIPSIS_FILL,
-        ASC_SHADER_ELLIPSIS_DRAW,
-        ASC_SHADER_ELLIPSIS_FILL_BORDER,
-    };
-
-    // Look up and activate shader
+    // Look up and activate the shader
     const AscShaderProgram *shader = asc_shader_lookup_or_create(
-        shader_ids[shader_flags], asc_ellipsis_shader_create, shader_flags);
+        ASC_SHADER_ELLIPSIS(shader_flags),
+        asc_ellipsis_shader_create, shader_flags
+    );
     if (asc_shader_use(shader, camera)) return;
     asc_cptr_cast(AscEllipsisShader, ellipsis_shader, shader);
 
--- a/src/ascension/constants.h	Fri Jul 25 18:58:50 2025 +0200
+++ b/src/ascension/constants.h	Fri Jul 25 19:19:54 2025 +0200
@@ -34,18 +34,10 @@
 
 #define ASC_SHADER_INTERNAL_ID(id)              (1000000000u+id)
 
-#define ASC_SHADER_SPRITE_RECT                  ASC_SHADER_INTERNAL_ID(1)
-#define ASC_SHADER_SPRITE_UV                    ASC_SHADER_INTERNAL_ID(2)
-#define ASC_SHADER_RECTANGLE_DRAW               ASC_SHADER_INTERNAL_ID(3)
-#define ASC_SHADER_RECTANGLE_FILL               ASC_SHADER_INTERNAL_ID(4)
-#define ASC_SHADER_RECTANGLE_DRAW_ROUND         ASC_SHADER_INTERNAL_ID(5)
-#define ASC_SHADER_RECTANGLE_FILL_ROUND         ASC_SHADER_INTERNAL_ID(6)
-#define ASC_SHADER_RECTANGLE_FILL_BORDER        ASC_SHADER_INTERNAL_ID(7)
-#define ASC_SHADER_RECTANGLE_FILL_BORDER_ROUND  ASC_SHADER_INTERNAL_ID(8)
-#define ASC_SHADER_ELLIPSIS_DRAW                ASC_SHADER_INTERNAL_ID(10)
-#define ASC_SHADER_ELLIPSIS_FILL                ASC_SHADER_INTERNAL_ID(11)
-#define ASC_SHADER_ELLIPSIS_FILL_BORDER         ASC_SHADER_INTERNAL_ID(12)
-#define ASC_SHADER_TEXT                         ASC_SHADER_INTERNAL_ID(20)
+#define ASC_SHADER_SPRITE(flags)                ASC_SHADER_INTERNAL_ID(0+flags)
+#define ASC_SHADER_RECTANGLE(flags)             ASC_SHADER_INTERNAL_ID(10+flags)
+#define ASC_SHADER_ELLIPSIS(flags)              ASC_SHADER_INTERNAL_ID(20+flags)
+#define ASC_SHADER_TEXT(flags)                  ASC_SHADER_INTERNAL_ID(30+flags)
 
 
 #endif // ASC_CONSTANTS_H
--- a/src/sprite.c	Fri Jul 25 18:58:50 2025 +0200
+++ b/src/sprite.c	Fri Jul 25 19:19:54 2025 +0200
@@ -83,12 +83,14 @@
 void asc_sprite_draw(const AscCamera *camera, const AscSceneNode *node) {
     asc_cptr_cast(AscSprite, sprite, node);
 
+    const int flags = asc_texture_is_uv_normalized(sprite->texture) ? 0 : 1;
+
     // Activate shader
     // TODO: scene should know which shader we are going to activate s.t. it can pre-sort nodes
-    const AscShaderProgram *shader =
-        asc_texture_is_uv_normalized(sprite->texture)
-                ? asc_shader_lookup_or_create(ASC_SHADER_SPRITE_UV, asc_sprite_shader_create, 0)
-                : asc_shader_lookup_or_create(ASC_SHADER_SPRITE_RECT, asc_sprite_shader_create, 1);
+    const AscShaderProgram *shader = asc_shader_lookup_or_create(
+        ASC_SHADER_SPRITE(flags),
+        asc_sprite_shader_create, flags
+    );
     if (asc_shader_use(shader, camera)) return;
     asc_cptr_cast(AscSpriteShader, sprite_shader, shader);
 
--- a/src/text.c	Fri Jul 25 18:58:50 2025 +0200
+++ b/src/text.c	Fri Jul 25 19:19:54 2025 +0200
@@ -112,7 +112,9 @@
     // Activate shader
     // TODO: scene should know which shader we are going to activate s.t. it can pre-sort nodes
     const AscShaderProgram *shader = asc_shader_lookup_or_create(
-            ASC_SHADER_TEXT, asc_text_shader_create, 0);
+        ASC_SHADER_TEXT(0),
+        asc_text_shader_create, 0
+    );
     if (asc_shader_use(shader, camera)) return;
     asc_cptr_cast(AscTextShader, text_shader, shader);
 

mercurial