Mon, 21 Apr 2025 17:52:01 +0200
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); }