Fri, 25 Jul 2025 19:19:54 +0200
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);