src/sprite.c

changeset 88
6234b7ea48f3
parent 82
4e1e698f4b0d
child 89
e1f682a8a145
--- 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);
 }

mercurial