entity pruning

This commit is contained in:
jacob 2026-01-05 02:19:38 -06:00
parent 6a305b4803
commit 1839899027
5 changed files with 64 additions and 19 deletions

View File

@ -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; String result = Zi;
result.text = ArenaNext(arena, u8); result.text = ArenaNext(arena, u8);
result.len += PushString(arena, Lit("h")).len; result.len += PushString(arena, Lit("[")).len;
result.len += StringFromUint(arena, v0, 16, 0).len; result.len += StringFromUint(arena, (v >> 32), 16, 0).len;
result.len += PushString(arena, Lit("x")).len; result.len += PushString(arena, Lit("]")).len;
result.len += StringFromUint(arena, v1, 16, 0).len;
return result; return result;
} }
@ -822,7 +821,7 @@ String FormatString(Arena *arena, String fmt, FmtArgArray args)
case FmtArgKind_Handle: 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; } break;
case FmtArgKind_Uid: case FmtArgKind_Uid:

View File

@ -49,10 +49,7 @@ Struct(FmtArg)
Vec4F64 floats; Vec4F64 floats;
void *ptr; void *ptr;
Uid uid; Uid uid;
struct u64 handle;
{
u64 h64[2];
} handle;
} value; } 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 StringFromSint(Arena *arena, i64 n, u64 base, u64 zfill);
String StringFromFloat(Arena *arena, f64 src, u32 precision); String StringFromFloat(Arena *arena, f64 src, u32 precision);
String StringFromPtr(Arena *arena, void *ptr); 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); 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 FmtHex(v, ...) FMTARG(FmtArgKind_Hex, .value.uints.x = (v), __VA_ARGS__)
#define FmtPtr(v, ...) FMTARG(FmtArgKind_Ptr, .value.ptr = (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 FmtUid(v, ...) FMTARG(FmtArgKind_Uid, .value.uid = (v), __VA_ARGS__)
#define FmtEnd FMTARG(FmtArgKind_End) // Denotes end of VA list #define FmtEnd FMTARG(FmtArgKind_End) // Denotes end of VA list

View File

@ -102,7 +102,6 @@ Rng2I32 S_UpdateWorldFromDelta(Arena *arena, S_World *world, S_Delta *delta)
ent = PushStructNoZero(arena, S_Ent); ent = PushStructNoZero(arena, S_Ent);
*ent = S_NilEnt; *ent = S_NilEnt;
ent->key = key; ent->key = key;
ent->exists = 1;
S_EntBin *bin = &world->ent_bins[ent->key.v % world->ent_bins_count]; 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); DllQueuePushNP(bin->first, bin->last, ent, next_in_bin, prev_in_bin);
DllQueuePush(world->first_ent, world->last_ent, ent); DllQueuePush(world->first_ent, world->last_ent, ent);
@ -1363,7 +1362,6 @@ void S_TickForever(WaveLaneCtx *lane)
snapshot->tick = world->tick; snapshot->tick = world->tick;
snapshot->time_ns = world->time_ns; snapshot->time_ns = world->time_ns;
// Forward user tile deltas // 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) 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; 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)) for (S_Ent *ent = S_FirstEnt(world); ent->valid; ent = S_NextEnt(ent))
{ {
S_Delta *delta = 0; S_Delta *delta = 0;
@ -1419,6 +1417,33 @@ void S_TickForever(WaveLaneCtx *lane)
} }
UnlockTicketMutex(&S.output_back_tm); 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 //- End sim frame

View File

@ -56,7 +56,7 @@ Struct(S_Ent)
////////////////////////////// //////////////////////////////
//- Build data //- Build data
f32 exists; f32 prune;
Xform last_xf; Xform last_xf;
Xform xf; Xform xf;
@ -324,6 +324,8 @@ b32 S_MatchKey(S_Key a, S_Key b);
S_Key S_RandKey(void); S_Key S_RandKey(void);
#define S_FmtKey(key) FmtHandle((key).v)
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
//~ Tile helpers //~ Tile helpers

View File

@ -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 //- Copy sim debug info
@ -2398,11 +2419,12 @@ void V_TickForever(WaveLaneCtx *lane)
{ {
if (hovered_ent->valid) if (hovered_ent->valid)
{ {
LogDebugF("Sending delete command for ent %F", S_FmtKey(hovered_ent->key));
S_Cmd *cmd = V_PushSimCmd(S_CmdKind_Delta); S_Cmd *cmd = V_PushSimCmd(S_CmdKind_Delta);
cmd->delta.kind = S_DeltaKind_RawEnt; cmd->delta.kind = S_DeltaKind_RawEnt;
S_Ent *ent = &cmd->delta.ent; S_Ent *ent = &cmd->delta.ent;
ent->key = hovered_ent->key; ent->key = hovered_ent->key;
ent->exists = 0; ent->prune = 1;
} }
} break; } break;
} }