From 28af2c9fc9e0604ca3c0596b2f7b05ef4919db1a Mon Sep 17 00:00:00 2001 From: jacob Date: Wed, 7 Aug 2024 16:36:33 -0500 Subject: [PATCH] potentially fixed entity release function --- src/entity.c | 36 +++++++++++++++++++++++++----------- src/entity.h | 5 +++-- src/game.c | 36 ++++++++++++++++++++++++++---------- 3 files changed, 54 insertions(+), 23 deletions(-) diff --git a/src/entity.c b/src/entity.c index b4202045..c0466c05 100644 --- a/src/entity.c +++ b/src/entity.c @@ -104,16 +104,16 @@ struct entity *entity_alloc_child(struct entity *parent) return e; } -void entity_release(struct entity_store *store, struct entity *ent) +INTERNAL void entity_release_internal(struct entity_store *store, struct entity *ent) { /* Release children */ - if (ent->first.gen) { - for (struct entity *child = entity_from_handle(store, ent->first); child->valid; child = entity_from_handle(store, child->next)) { - entity_release(store, child); + struct entity_handle first_handle = ent->first; + if (first_handle.gen) { + for (struct entity *child = entity_from_handle(store, first_handle); child->valid; child = entity_from_handle(store, child->next)) { + entity_release_internal(store, child); } } - /* Unlink */ - entity_unlink(ent); + /* Release */ ++ent->handle.gen; ent->valid = false; @@ -121,6 +121,12 @@ void entity_release(struct entity_store *store, struct entity *ent) store->first_free = ent->handle; } +void entity_release(struct entity_store *store, struct entity *ent) +{ + entity_unlink_parent(ent); + entity_release_internal(store, ent); +} + /* ========================== * * Query * ========================== */ @@ -294,13 +300,12 @@ void entity_link_parent_child(struct entity *parent, struct entity *child) child->is_top = parent->is_root; } -void entity_unlink(struct entity *ent) +/* NOTE: Entity will be dangling after calling this, should re-link to root entity. */ +void entity_unlink_parent(struct entity *ent) { struct entity_store *store = entity_get_store(ent); - ASSERT(!entity_handle_eq(ent->handle, store->root)); struct entity_handle parent_handle = ent->parent; - struct entity *parent = entity_from_handle(store, parent_handle); struct entity *prev = entity_from_handle(store, ent->prev); struct entity *next = entity_from_handle(store, ent->next); @@ -316,8 +321,17 @@ void entity_unlink(struct entity *ent) } else { parent->last = prev->handle; } - ent->is_top = false; - ent->is_root = false; + ent->prev = entity_handle_nil(); + ent->next = entity_handle_nil(); +} + +/* NOTE: Children will be re-linked as children to their grandparent (ent's parent) */ +void entity_unlink_children(struct entity *ent) +{ + struct entity_store *store = entity_get_store(ent); + + struct entity_handle parent_handle = ent->parent; + struct entity *parent = entity_from_handle(store, parent_handle); /* Link children to grandparent */ struct entity_handle child_first_handle = ent->first; diff --git a/src/entity.h b/src/entity.h index 867f15e4..7a39bd26 100644 --- a/src/entity.h +++ b/src/entity.h @@ -130,7 +130,7 @@ struct entity_prop_array { * Handle helpers * ========================== */ -INLINE struct entity_handle entity_nil_handle(void) +INLINE struct entity_handle entity_handle_nil(void) { return (struct entity_handle) { 0 }; } @@ -212,6 +212,7 @@ struct entity *entity_find_first_match_all(struct entity_store *store, struct en /* Tree */ void entity_link_parent_child(struct entity *parent, struct entity *child); -void entity_unlink(struct entity *ent); +void entity_unlink_parent(struct entity *ent); +void entity_unlink_children(struct entity *ent); #endif diff --git a/src/game.c b/src/game.c index fca69f87..0f8678c0 100644 --- a/src/game.c +++ b/src/game.c @@ -114,9 +114,9 @@ INTERNAL void spawn_test_entities(void) entity_set_xform(e, XFORM_TRS(.t = pos, .r = r, .s = size)); e->sprite = sprite_tag_from_path(STR("res/graphics/tim.ase")); - //e->sprite_span_name = STR("idle.unarmed"); + e->sprite_span_name = STR("idle.unarmed"); //e->sprite_span_name = STR("idle.one_handed"); - e->sprite_span_name = STR("idle.two_handed"); + //e->sprite_span_name = STR("idle.two_handed"); entity_enable_prop(e, ENTITY_PROP_PLAYER_CONTROLLED); e->player_max_speed = 4.f; @@ -130,28 +130,44 @@ INTERNAL void spawn_test_entities(void) //entity_enable_prop(e, ENTITY_PROP_TEST); } - /* Child ent */ + /* Child ent 1 */ { - struct v2 pos = V2(0, 0); - struct v2 size = V2(1, 1); + struct v2 pos = V2(-0.15, -0.05); + struct v2 size = V2(0.25, 0.5); f32 r = 0; struct xform xf = XFORM_TRS(.t = pos, .r = r, .s = size); struct entity *e = entity_alloc_child(player_ent); - entity_set_xform(e, xf); + entity_set_local_xform(e, xf); e->sprite = sprite_tag_from_path(STR("res/graphics/tim.ase")); - //e->sprite_span_name = STR("idle.unarmed"); - //e->sprite_span_name = STR("idle.one_handed"); e->sprite_span_name = STR("idle.two_handed"); - e->sprite_tint = RGBA_32_F(1, 0, 0, 0.5); + e->sprite_tint = RGBA_32_F(0, 0, 0, 1); entity_enable_prop(e, ENTITY_PROP_ANIMATING); entity_enable_prop(e, ENTITY_PROP_PLAYER_CONTROLLED); + } - //entity_enable_prop(e, ENTITY_PROP_TEST); + /* Child ent 2 */ + { + struct v2 pos = V2(0.15, -0.05); + struct v2 size = V2(-0.25, 0.5); + f32 r = 0; + + struct xform xf = XFORM_TRS(.t = pos, .r = r, .s = size); + + struct entity *e = entity_alloc_child(player_ent); + entity_set_local_xform(e, xf); + + e->sprite = sprite_tag_from_path(STR("res/graphics/tim.ase")); + e->sprite_span_name = STR("idle.two_handed"); + e->sprite_tint = RGBA_32_F(0, 0, 0, 1); + + entity_enable_prop(e, ENTITY_PROP_ANIMATING); + + entity_enable_prop(e, ENTITY_PROP_PLAYER_CONTROLLED); } /* Camera ent */