fix probably incorrect array access of struct members default tip

Mon, 21 Apr 2025 17:52:01 +0200

author
Mike Becker <universe@uap-core.de>
date
Mon, 21 Apr 2025 17:52:01 +0200
changeset 90
aa8e7a38905c
parent 89
e1f682a8a145

fix probably incorrect array access of struct members

src/ascension/glcontext.h file | annotate | diff | comparison | revisions
src/glcontext.c file | annotate | diff | comparison | revisions
src/scene.c file | annotate | diff | comparison | revisions
src/sprite.c file | annotate | diff | comparison | revisions
--- a/src/ascension/glcontext.h	Mon Apr 21 17:27:33 2025 +0200
+++ b/src/ascension/glcontext.h	Mon Apr 21 17:52:01 2025 +0200
@@ -41,26 +41,37 @@
     int depth_size;
 } AscGLContextSettings;
 
+enum AscDefaultPrimitives {
+    ASC_PRIMITIVE_PLANE_IDX = 0,
+    ASC_PRIMITIVE_COUNT
+};
+
+enum AscDefaultTextures2d {
+    ASC_TEXTURE_2D_EMPTY_1X1_IDX = 0,
+    ASC_TEXTURE_2D_COUNT
+};
+
+enum AscDefaultTexturesRect {
+    ASC_TEXTURE_RECT_EMPTY_1X1_IDX = 0,
+    ASC_TEXTURE_RECT_COUNT
+};
+
 typedef struct AscGLContext {
     SDL_Window *window;
     SDL_GLContext glctx;
-    struct {
-        AscMesh plane;
-    } primitives;
+    AscMesh primitives[ASC_PRIMITIVE_COUNT];
+    AscTexture textures_2d[ASC_TEXTURE_2D_COUNT];
+    AscTexture textures_rect[ASC_TEXTURE_RECT_COUNT];
     struct {
         AscShaderSprite sprite;
     } shader;
-    struct {
-        AscTexture empty_1x1_2d;
-        AscTexture empty_1x1_rect;
-    } textures;
 } AscGLContext;
 
-#define ASC_PRIMITIVES asc_active_window->glctx.primitives
-
-#define ASC_DEFAULT_SHADER asc_active_window->glctx.shader
-
-#define ASC_DEFAULT_TEXTURES asc_active_window->glctx.textures
+#define asc_active_glctx (&asc_active_window->glctx)
+#define ASC_PRIMITIVE_PLANE (&asc_active_glctx->primitives[ASC_PRIMITIVE_PLANE_IDX])
+#define ASC_TEXTURE_2D_EMPTY_1X1 (&asc_active_glctx->textures_2d[ASC_TEXTURE_2D_EMPTY_1X1_IDX])
+#define ASC_TEXTURE_RECT_EMPTY_1X1 (&asc_active_glctx->textures_rect[ASC_TEXTURE_RECT_EMPTY_1X1_IDX])
+#define ASC_SHADER_SPRITE (&asc_active_glctx->shader.sprite)
 
 __attribute__((__nonnull__, __warn_unused_result__))
 bool asc_gl_context_initialize(
--- a/src/glcontext.c	Mon Apr 21 17:27:33 2025 +0200
+++ b/src/glcontext.c	Mon Apr 21 17:52:01 2025 +0200
@@ -50,9 +50,9 @@
 
 static int asc_primitives_init(AscGLContext *context) {
     asc_dprintf("Create primitives for the GL context of active window.");
-    asc_mesh_allocate_buffers((AscMesh*)&context->primitives, sizeof(context->primitives) / sizeof(AscMesh));
+    asc_mesh_allocate_buffers(context->primitives, ASC_PRIMITIVE_COUNT);
 
-    asc_primitives_init_plane(&context->primitives.plane);
+    asc_primitives_init_plane(&context->primitives[ASC_PRIMITIVE_PLANE_IDX]);
     // TODO: more primitives
 
     return asc_error_catch_all_gl();
@@ -75,8 +75,8 @@
 }
 
 static int asc_texture_initialize_predefined(AscGLContext *ctx) {
-    asc_texture_init_rectangle(&ctx->textures.empty_1x1_rect, 1);
-    asc_texture_init_2d(&ctx->textures.empty_1x1_2d, 1);
+    asc_texture_init_rectangle(ctx->textures_rect, ASC_TEXTURE_RECT_COUNT);
+    asc_texture_init_2d(ctx->textures_2d, ASC_TEXTURE_2D_COUNT);
 
     // Create a 1x1 surface with 32-bit RGBA format
     SDL_Surface* white1x1 = SDL_CreateRGBSurface(
@@ -91,15 +91,15 @@
     SDL_FillRect(white1x1, NULL, 0xFFFFFFFF);
 
     // Initialize the empty textures with the white surface
-    asc_texture_from_surface(&ctx->textures.empty_1x1_2d, white1x1);
-    asc_texture_from_surface(&ctx->textures.empty_1x1_rect, white1x1);
+    asc_texture_from_surface(&ctx->textures_rect[ASC_TEXTURE_RECT_EMPTY_1X1_IDX], white1x1);
+    asc_texture_from_surface(&ctx->textures_2d[ASC_TEXTURE_2D_EMPTY_1X1_IDX], white1x1);
 
     return asc_error_catch_all_gl();
 }
 
 static void asc_texture_destroy_predefined(AscGLContext *ctx) {
-    asc_texture_destroy(&ctx->textures.empty_1x1_2d, 1);
-    asc_texture_destroy(&ctx->textures.empty_1x1_rect, 1);
+    asc_texture_destroy(ctx->textures_rect, ASC_TEXTURE_RECT_COUNT);
+    asc_texture_destroy(ctx->textures_2d, ASC_TEXTURE_2D_COUNT);
 }
 
 bool asc_gl_context_initialize(
--- a/src/scene.c	Mon Apr 21 17:27:33 2025 +0200
+++ b/src/scene.c	Mon Apr 21 17:52:01 2025 +0200
@@ -142,7 +142,7 @@
     size_t sprite_count = cxListSize(render_group[ASC_RENDER_GROUP_SPRITE_OPAQUE])
         + cxListSize(render_group[ASC_RENDER_GROUP_SPRITE_BLEND]);
     if (sprite_count > 0) {
-        AscShaderProgram *shader = &asc_active_window->glctx.shader.sprite.program;
+        AscShaderProgram *shader = &ASC_SHADER_SPRITE->program;
         glUseProgram(shader->id);
         glUniformMatrix4fv(shader->projection, 1,
                            GL_FALSE, camera->projection);
--- a/src/sprite.c	Mon Apr 21 17:27:33 2025 +0200
+++ b/src/sprite.c	Mon Apr 21 17:52:01 2025 +0200
@@ -63,7 +63,7 @@
 
 void asc_sprite_draw(AscSprite const *node) {
     // Obtain shader
-    AscShaderSprite *shader = &ASC_DEFAULT_SHADER.sprite;
+    AscShaderSprite *shader = ASC_SHADER_SPRITE;
 
     // Upload model matrix
     glUniformMatrix4fv(shader->program.model, 1,
@@ -72,9 +72,9 @@
     // Bind texture
     if (node->texture->target == GL_TEXTURE_RECTANGLE) {
         asc_texture_bind(node->texture, shader->rect_tex, 0);
-        asc_texture_bind(&ASC_DEFAULT_TEXTURES.empty_1x1_2d, shader->uv_tex, 1);
+        asc_texture_bind(ASC_TEXTURE_2D_EMPTY_1X1, shader->uv_tex, 1);
     } else {
-        asc_texture_bind(&ASC_DEFAULT_TEXTURES.empty_1x1_rect, shader->rect_tex, 0);
+        asc_texture_bind(ASC_TEXTURE_RECT_EMPTY_1X1, shader->rect_tex, 0);
         asc_texture_bind(node->texture, shader->uv_tex, 1);
     }
 
@@ -82,5 +82,5 @@
     glUniform1f(shader->depth, (float)(node->data.depth));
 
     // Draw mesh
-    asc_mesh_draw_triangle_strip(&ASC_PRIMITIVES.plane);
+    asc_mesh_draw_triangle_strip(ASC_PRIMITIVE_PLANE);
 }

mercurial