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;
|
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:
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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
|
||||||
|
|
||||||
|
|||||||
@ -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
|
||||||
|
|
||||||
|
|||||||
@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user