Sat, 10 May 2025 15:06:47 +0200
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;