--- a/src/sprite.c Sat Apr 19 19:30:46 2025 +0200 +++ b/src/sprite.c Sun Apr 20 15:41:16 2025 +0200 @@ -32,20 +32,52 @@ #include <GL/glew.h> +static void asc_sprite_free(AscSceneNode *node) { + free(node); +} + +AscSceneNode *asc_sprite_create(struct asc_sprite_create_args args) { + AscSprite *sprite = calloc(1, sizeof(AscSprite)); + + // special sprite parameters + sprite->tex = args.texture; + + // basic node parameters + AscSceneNode *node = (AscSceneNode *) sprite; + node->render_group = args.opaque + ? ASC_RENDER_GROUP_SPRITE_OPAQUE + : ASC_RENDER_GROUP_SPRITE_BLEND; + node->free_func = asc_sprite_free; + + node->position.x = (float) args.x; + node->position.y = (float) args.y; + + node->scale.x = (float) (args.width == 0 ? args.texture.width : args.width); + node->scale.y = (float) (args.height == 0 ? args.texture.height : args.height); + + return node; +} + void asc_sprite_draw(AscSprite const *node) { // Obtain shader - AscShaderSprite *shader = ASC_SHADER_SPRITE; + AscShaderSprite *shader = &ASC_DEFAULT_SHADER.sprite; // Upload model matrix glUniformMatrix4fv(shader->program.model, 1, GL_FALSE, node->data.world_transform); // Bind texture - asc_texture_bind(&node->tex, shader->tex, 0); + if (node->tex.target == GL_TEXTURE_RECTANGLE) { + asc_texture_bind(&node->tex, shader->rect_tex, 0); + asc_texture_bind(&ASC_DEFAULT_TEXTURES.empty_1x1_2d, shader->uv_tex, 1); + } else { + asc_texture_bind(&ASC_DEFAULT_TEXTURES.empty_1x1_rect, shader->rect_tex, 0); + asc_texture_bind(&node->tex, shader->uv_tex, 1); + } // Apply depth glUniform1f(shader->depth, (float)(node->data.depth)); // Draw mesh - asc_mesh_draw_triangle_strip(ASC_PRIMITIVES_PLANE); + asc_mesh_draw_triangle_strip(&ASC_PRIMITIVES.plane); }