From 1839899027bda67135a2d83c511bde157dc50840 Mon Sep 17 00:00:00 2001 From: jacob Date: Mon, 5 Jan 2026 02:19:38 -0600 Subject: [PATCH] entity pruning --- src/base/base_string.c | 11 +++++------ src/base/base_string.h | 9 +++------ src/pp/pp_sim/pp_sim_core.c | 31 ++++++++++++++++++++++++++++--- src/pp/pp_sim/pp_sim_core.h | 4 +++- src/pp/pp_vis/pp_vis_core.c | 28 +++++++++++++++++++++++++--- 5 files changed, 64 insertions(+), 19 deletions(-) diff --git a/src/base/base_string.c b/src/base/base_string.c index 1767e24a..3054fc17 100644 --- a/src/base/base_string.c +++ b/src/base/base_string.c @@ -195,14 +195,13 @@ String StringFromPtr(Arena *arena, void *ptr) }; } -String StringFromhandle(Arena *arena, u64 v0, u64 v1) +String StringFromhandle(Arena *arena, u64 v) { String result = Zi; result.text = ArenaNext(arena, u8); - result.len += PushString(arena, Lit("h")).len; - result.len += StringFromUint(arena, v0, 16, 0).len; - result.len += PushString(arena, Lit("x")).len; - result.len += StringFromUint(arena, v1, 16, 0).len; + result.len += PushString(arena, Lit("[")).len; + result.len += StringFromUint(arena, (v >> 32), 16, 0).len; + result.len += PushString(arena, Lit("]")).len; return result; } @@ -822,7 +821,7 @@ String FormatString(Arena *arena, String fmt, FmtArgArray args) case FmtArgKind_Handle: { - parsed_arg = StringFromhandle(arena, arg.value.handle.h64[0], arg.value.handle.h64[1]); + parsed_arg = StringFromhandle(arena, arg.value.handle); } break; case FmtArgKind_Uid: diff --git a/src/base/base_string.h b/src/base/base_string.h index 2e2a5151..835926b7 100644 --- a/src/base/base_string.h +++ b/src/base/base_string.h @@ -49,10 +49,7 @@ Struct(FmtArg) Vec4F64 floats; void *ptr; Uid uid; - struct - { - u64 h64[2]; - } handle; + u64 handle; } value; }; @@ -84,7 +81,7 @@ String StringFromUints(Arena *arena, u64 uints_count, u64 *uints, u64 base, u64 String StringFromSint(Arena *arena, i64 n, u64 base, u64 zfill); String StringFromFloat(Arena *arena, f64 src, u32 precision); String StringFromPtr(Arena *arena, void *ptr); -String StringFromhandle(Arena *arena, u64 v0, u64 v1); +String StringFromhandle(Arena *arena, u64 v); String StringFromUid(Arena *arena, Uid uid); //////////////////////////////////////////////////////////// @@ -150,7 +147,7 @@ String StringFromList(Arena *arena, StringList l, String separator); #define FmtHex(v, ...) FMTARG(FmtArgKind_Hex, .value.uints.x = (v), __VA_ARGS__) #define FmtPtr(v, ...) FMTARG(FmtArgKind_Ptr, .value.ptr = (v), __VA_ARGS__) -#define FmtHandle(v, ...) FMTARG(FmtArgKind_Handle, .value.handle.h64[0] = (v).idx, .value.handle.h64[1] = (v).gen, __VA_ARGS__) +#define FmtHandle(v, ...) FMTARG(FmtArgKind_Handle, .value.handle = (v), __VA_ARGS__) #define FmtUid(v, ...) FMTARG(FmtArgKind_Uid, .value.uid = (v), __VA_ARGS__) #define FmtEnd FMTARG(FmtArgKind_End) // Denotes end of VA list diff --git a/src/pp/pp_sim/pp_sim_core.c b/src/pp/pp_sim/pp_sim_core.c index 166023a6..9974202c 100644 --- a/src/pp/pp_sim/pp_sim_core.c +++ b/src/pp/pp_sim/pp_sim_core.c @@ -102,7 +102,6 @@ Rng2I32 S_UpdateWorldFromDelta(Arena *arena, S_World *world, S_Delta *delta) ent = PushStructNoZero(arena, S_Ent); *ent = S_NilEnt; ent->key = key; - ent->exists = 1; S_EntBin *bin = &world->ent_bins[ent->key.v % world->ent_bins_count]; DllQueuePushNP(bin->first, bin->last, ent, next_in_bin, prev_in_bin); DllQueuePush(world->first_ent, world->last_ent, ent); @@ -1363,7 +1362,6 @@ void S_TickForever(WaveLaneCtx *lane) snapshot->tick = world->tick; snapshot->time_ns = world->time_ns; - // Forward user tile deltas for (i64 applied_user_tile_delta_idx = 0; applied_user_tile_delta_idx < applied_user_tile_deltas_count; ++applied_user_tile_delta_idx) { @@ -1395,7 +1393,7 @@ void S_TickForever(WaveLaneCtx *lane) has_sent_initial_tick = 1; } - // Push full entity deltas + // Push raw entity deltas for (S_Ent *ent = S_FirstEnt(world); ent->valid; ent = S_NextEnt(ent)) { S_Delta *delta = 0; @@ -1419,6 +1417,33 @@ void S_TickForever(WaveLaneCtx *lane) } UnlockTicketMutex(&S.output_back_tm); + ////////////////////////////// + //- Prune ents + + { + i64 ents_to_prune_count = 0; + S_Ent **ents_to_prune = PushStructsNoZero(frame_arena, S_Ent *, world->ents_count); + for (S_Ent *ent = S_FirstEnt(world); ent->valid; ent = S_NextEnt(ent)) + { + if (ent->prune >= 1) + { + ents_to_prune[ents_to_prune_count] = ent; + ents_to_prune_count += 1; + } + } + + for (i64 prune_idx = 0; prune_idx < ents_to_prune_count; ++prune_idx) + { + // FIXME: Add to free list + // FIXME: Ensure sure prunes are received by user + S_Ent *ent = ents_to_prune[prune_idx]; + S_EntBin *bin = &world->ent_bins[ent->key.v % world->ent_bins_count]; + DllQueueRemoveNP(bin->first, bin->last, ent, next_in_bin, prev_in_bin); + DllQueueRemove(world->first_ent, world->last_ent, ent); + world->ents_count -= 1; + } + } + ////////////////////////////// //- End sim frame diff --git a/src/pp/pp_sim/pp_sim_core.h b/src/pp/pp_sim/pp_sim_core.h index 2782fb3a..234b12e3 100644 --- a/src/pp/pp_sim/pp_sim_core.h +++ b/src/pp/pp_sim/pp_sim_core.h @@ -56,7 +56,7 @@ Struct(S_Ent) ////////////////////////////// //- Build data - f32 exists; + f32 prune; Xform last_xf; Xform xf; @@ -324,6 +324,8 @@ b32 S_MatchKey(S_Key a, S_Key b); S_Key S_RandKey(void); +#define S_FmtKey(key) FmtHandle((key).v) + //////////////////////////////////////////////////////////// //~ Tile helpers diff --git a/src/pp/pp_vis/pp_vis_core.c b/src/pp/pp_vis/pp_vis_core.c index 52aff2b7..bca2d267 100644 --- a/src/pp/pp_vis/pp_vis_core.c +++ b/src/pp/pp_vis/pp_vis_core.c @@ -567,9 +567,30 @@ void V_TickForever(WaveLaneCtx *lane) } ////////////////////////////// - //- Prune entities + //- Prune ents - // TODO + { + i64 ents_to_prune_count = 0; + S_Ent **ents_to_prune = PushStructsNoZero(frame->arena, S_Ent *, world->ents_count); + for (S_Ent *ent = S_FirstEnt(world); ent->valid; ent = S_NextEnt(ent)) + { + if (ent->prune >= 1) + { + ents_to_prune[ents_to_prune_count] = ent; + ents_to_prune_count += 1; + } + } + + for (i64 prune_idx = 0; prune_idx < ents_to_prune_count; ++prune_idx) + { + // FIXME: Add to free list + S_Ent *ent = ents_to_prune[prune_idx]; + S_EntBin *bin = &world->ent_bins[ent->key.v % world->ent_bins_count]; + DllQueueRemoveNP(bin->first, bin->last, ent, next_in_bin, prev_in_bin); + DllQueueRemove(world->first_ent, world->last_ent, ent); + world->ents_count -= 1; + } + } ////////////////////////////// //- Copy sim debug info @@ -2398,11 +2419,12 @@ void V_TickForever(WaveLaneCtx *lane) { if (hovered_ent->valid) { + LogDebugF("Sending delete command for ent %F", S_FmtKey(hovered_ent->key)); S_Cmd *cmd = V_PushSimCmd(S_CmdKind_Delta); cmd->delta.kind = S_DeltaKind_RawEnt; S_Ent *ent = &cmd->delta.ent; ent->key = hovered_ent->key; - ent->exists = 0; + ent->prune = 1; } } break; }