entity pruning
This commit is contained in:
parent
6a305b4803
commit
1839899027
@ -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:
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
|
||||
@ -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
|
||||
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user