change node's free function to a destroy function

Sat, 10 May 2025 15:06:47 +0200

author
Mike Becker <universe@uap-core.de>
date
Sat, 10 May 2025 15:06:47 +0200
changeset 113
71ba88258ea0
parent 112
3e956c96dd6c
child 114
5b91bbab1ac0

change node's free function to a destroy function

src/ascension/scene_node.h file | annotate | diff | comparison | revisions
src/behavior.c file | annotate | diff | comparison | revisions
src/scene_node.c file | annotate | diff | comparison | revisions
src/sprite.c file | annotate | diff | comparison | revisions
src/text.c file | annotate | diff | comparison | revisions
--- a/src/ascension/scene_node.h	Tue May 06 23:04:54 2025 +0200
+++ b/src/ascension/scene_node.h	Sat May 10 15:06:47 2025 +0200
@@ -35,8 +35,8 @@
 
 typedef struct asc_scene_node_s AscSceneNode;
 
-typedef void(*asc_scene_free_func)(AscSceneNode*);
-typedef void(*asc_scene_update_func)(AscSceneNode*);
+typedef void(*asc_scene_node_destroy_func)(AscSceneNode*);
+typedef void(*asc_scene_node_update_func)(AscSceneNode*);
 
 enum AscRenderGroup {
     ASC_RENDER_GROUP_NONE = -1,
@@ -51,14 +51,14 @@
     AscSceneNode *next;
     AscSceneNode *children;
     AscSceneNode *last_child;
-    // TODO: think about how to make nodes identifiable - by name? by int?
+    char *name;
     /**
      * List of AscBehavior structs.
      * Not a pointer list!
      */
     CxList *behaviors;
-    asc_scene_free_func free_func;
-    asc_scene_update_func update_func;
+    asc_scene_node_destroy_func destroy_func;
+    asc_scene_node_update_func update_func;
     asc_vec3f position;
     asc_vec3f rotation;
     asc_vec3f scale;
--- a/src/behavior.c	Tue May 06 23:04:54 2025 +0200
+++ b/src/behavior.c	Sat May 10 15:06:47 2025 +0200
@@ -40,7 +40,7 @@
 }
 
 static CxList *asc_behavior_new_list(void) {
-    // TODO: add comparator when we know how to identifier behaviors in order to remove them
+    // TODO: add comparator when we know how to identify behaviors in order to remove them
     CxList *list = cxArrayListCreate(NULL, NULL, sizeof(AscBehavior), 4);
     cxDefineDestructor(list, asc_behavior_destroy);
     return list;
--- a/src/scene_node.c	Tue May 06 23:04:54 2025 +0200
+++ b/src/scene_node.c	Sat May 10 15:06:47 2025 +0200
@@ -45,13 +45,20 @@
 AscSceneNode *asc_scene_node_empty(void) {
     AscSceneNode *node = calloc(1, sizeof(AscSceneNode));
     node->render_group = ASC_RENDER_GROUP_NONE;
-    node->free_func = (asc_scene_free_func) free;
     node->scale.x = node->scale.y = node->scale.z = 1;
     asc_transform_identity(node->transform);
     asc_transform_identity(node->world_transform);
     return node;
 }
 
+static void asc_scene_node_destroy(AscSceneNode *node) {
+    cxListFree(node->behaviors);
+    if (node->destroy_func != NULL) {
+        node->destroy_func(node);
+    }
+    free(node->name);
+}
+
 void asc_scene_node_free(AscSceneNode *node) {
     if (node == NULL) return;
 
@@ -62,12 +69,8 @@
     CxTreeIterator iter = asc_scene_node_iterator(node, true);
     cx_foreach(AscSceneNode*, child, iter) {
         if (!iter.exiting) continue;
-        cxListFree(child->behaviors);
-        if (child->free_func != NULL) {
-            child->free_func(child);
-        } else {
-            free(child);
-        }
+        asc_scene_node_destroy(child);
+        free(child);
     }
 }
 
@@ -98,7 +101,7 @@
 // TODO: rename in asc_node_add_behavior or just asc_add_behavior()
 void asc_scene_add_behavior(
         AscSceneNode *node,
-        asc_scene_update_func behavior
+        asc_scene_node_update_func behavior
 ) {
     if (node->behaviors == NULL) {
         node->behaviors = cxLinkedListCreateSimple(CX_STORE_POINTERS);
@@ -109,7 +112,7 @@
 
 void asc_scene_remove_behavior(
         AscSceneNode *node,
-        asc_scene_update_func behavior
+        asc_scene_node_update_func behavior
 ) {
     if (node->behaviors != NULL) {
         cxListFindRemove(node->behaviors, behavior);
--- a/src/sprite.c	Tue May 06 23:04:54 2025 +0200
+++ b/src/sprite.c	Sat May 10 15:06:47 2025 +0200
@@ -32,10 +32,8 @@
 
 #include <GL/glew.h>
 
-static void asc_sprite_free(AscSceneNode *node) {
-    AscSprite *sprite = (AscSprite *) node;
-    sprite->texture->refcount--;
-    free(node);
+static void asc_sprite_destroy(AscSceneNode *node) {
+    ((AscSprite *) node)->texture->refcount--;
 }
 
 AscSceneNode *asc_sprite_create(struct asc_sprite_create_args args) {
@@ -50,7 +48,7 @@
     node->render_group = args.opaque
                              ? ASC_RENDER_GROUP_SPRITE_OPAQUE
                              : ASC_RENDER_GROUP_SPRITE_BLEND;
-    node->free_func = asc_sprite_free;
+    node->destroy_func = asc_sprite_destroy;
 
     node->position = asc_vec3f_new(args.x, args.y, ASC_SCENE_2D_DEPTH_OFFSET);
     node->scale = asc_vec3f_new(
--- a/src/text.c	Tue May 06 23:04:54 2025 +0200
+++ b/src/text.c	Sat May 10 15:06:47 2025 +0200
@@ -70,14 +70,13 @@
     SDL_FreeSurface(surface);
 }
 
-static void asc_text_free(AscSceneNode *node) {
+static void asc_text_destroy(AscSceneNode *node) {
     AscText *text = (AscText*) node;
     AscSprite *sprite = (AscSprite*) node;
     asc_texture_destroy(sprite->texture, 1);
     assert(sprite->texture->refcount == 0);
     free(sprite->texture);
     cx_strfree(&text->text);
-    free(node);
 }
 
 AscSceneNode *asc_text_create(struct asc_text_create_args args) {
@@ -85,7 +84,7 @@
     AscSceneNode *node = (AscSceneNode*) text;
 
     node->render_group = ASC_RENDER_GROUP_SPRITE_BLEND;
-    node->free_func = asc_text_free;
+    node->destroy_func = asc_text_destroy;
     node->update_func = asc_text_update;
 
     node->flags = args.alignment;

mercurial