pp refactor progress

This commit is contained in:
jacob 2025-08-05 16:00:31 -05:00
parent f389b0e6f8
commit bb300b9ef4
6 changed files with 271 additions and 268 deletions

View File

@ -122,8 +122,8 @@ String DebugStringFromEntity(Arena *arena, Entity *ent)
//result.len += StringFormat(arena, Lit("[%F]"), FmtUid(ent->id.uid)).len;
{
b32 transmitting = sim_ent_has_prop(ent, SEPROP_SYNC_SRC);
b32 receiving = sim_ent_has_prop(ent, SEPROP_SYNC_DST);
b32 transmitting = sim_ent_has_prop(ent, Prop_SyncSrc);
b32 receiving = sim_ent_has_prop(ent, Prop_SyncDst);
if (transmitting & receiving)
{
result.len += PushString(arena, Lit(" networked (sending & receiving)")).len;
@ -154,7 +154,7 @@ String DebugStringFromEntity(Arena *arena, Entity *ent)
u64 chunk = ent->props[chunk_index];
for (u64 part_index = 8; part_index-- > 0;)
{
if ((chunk_index != (countof(ent->props) - 1)) || ((chunk_index * 64) + (part_index * 8)) <= SEPROP_COUNT)
if ((chunk_index != (countof(ent->props) - 1)) || ((chunk_index * 64) + (part_index * 8)) <= Prop_Count)
{
u8 part = (chunk >> (part_index * 8)) & 0xFF;
StringFromChar(arena, hex[(part >> 4) & 0x0F]);
@ -365,8 +365,8 @@ MergesortCompareFuncDef(EntitySortCmp, arg_a, arg_b, _)
if (result == 0)
{
/* Sort by light */
b32 a_cmp = sim_ent_has_prop(a, SEPROP_LIGHT_TEST);
b32 b_cmp = sim_ent_has_prop(b, SEPROP_LIGHT_TEST);
b32 a_cmp = sim_ent_has_prop(a, Prop_LightTest);
b32 b_cmp = sim_ent_has_prop(b, Prop_LightTest);
result = (a_cmp > b_cmp) - (a_cmp < b_cmp);
}
if (result == 0)
@ -937,7 +937,7 @@ void UpdateUser(P_Window *window)
for (u64 ent_index = 0; ent_index < g->ss_blended->num_ents_reserved; ++ent_index)
{
Entity *chunk_ent = &g->ss_blended->ents[ent_index];
if (sim_ent_is_valid_and_active(chunk_ent) && sim_ent_has_prop(chunk_ent, SEPROP_TILE_CHUNK))
if (sim_ent_is_valid_and_active(chunk_ent) && sim_ent_has_prop(chunk_ent, Prop_TileChunk))
{
struct user_tile_cache_entry *entry = user_tile_cache_entry_from_chunk_pos(chunk_ent->tile_chunk_pos);
if (!entry->valid)
@ -1081,9 +1081,9 @@ void UpdateUser(P_Window *window)
Xform parent_xf = sim_ent_get_xform(parent);
b32 skip_debug_draw = !g->debug_camera && ent == local_camera;
skip_debug_draw = skip_debug_draw || sim_ent_has_prop(ent, SEPROP_MOTOR_JOINT);
skip_debug_draw = skip_debug_draw || sim_ent_has_prop(ent, Prop_MotorJoint);
b32 skip_debug_draw_transform = sim_ent_has_prop(ent, SEPROP_CAMERA);
b32 skip_debug_draw_transform = sim_ent_has_prop(ent, Prop_Camera);
skip_debug_draw_transform = 1;
Xform sprite_xform = MulXform(xf, ent->sprite_local_xform);
@ -1091,7 +1091,7 @@ void UpdateUser(P_Window *window)
/* Draw tracer */
/* TODO: Enable this */
#if 0
if (sim_ent_has_prop(ent, SEPROP_TRACER))
if (sim_ent_has_prop(ent, Prop_Tracer))
{
Vec2 velocity = ent->tracer_start_velocity;
@ -1143,7 +1143,7 @@ void UpdateUser(P_Window *window)
/* TODO: Fade in placeholder if texture isn't loaded */
if (sheet->loaded && texture->loaded)
{
b32 is_light = sim_ent_has_prop(ent, SEPROP_LIGHT_TEST);
b32 is_light = sim_ent_has_prop(ent, Prop_LightTest);
Vec3 emittance = ent->sprite_emittance;
u32 tint = ent->sprite_tint;
S_Frame frame = S_FrameFromIndex(sheet, ent->animation_frame);
@ -1154,7 +1154,7 @@ void UpdateUser(P_Window *window)
/* Draw tiles */
/* TODO: Something better */
if (sim_ent_has_prop(ent, SEPROP_TILE_CHUNK))
if (sim_ent_has_prop(ent, Prop_TileChunk))
{
Vec2I32 chunk_index = ent->tile_chunk_index;
S_Tag tile_sprite = S_TagFromPath(Lit("sprite/tile.ase"));
@ -1187,7 +1187,7 @@ void UpdateUser(P_Window *window)
{
TempArena temp = BeginTempArena(scratch.arena);
if (sim_ent_has_prop(ent, SEPROP_KINEMATIC) || sim_ent_has_prop(ent, SEPROP_DYNAMIC))
if (sim_ent_has_prop(ent, Prop_Kinematic) || sim_ent_has_prop(ent, Prop_Dynamic))
{
DrawDebugMovement(ent);
}
@ -1269,7 +1269,7 @@ void UpdateUser(P_Window *window)
/* Draw weld joint */
#if 0
if (sim_ent_has_prop(ent, SEPROP_WELD_JOINT))
if (sim_ent_has_prop(ent, Prop_WeldJoint))
{
Entity *e1 = sim_ent_from_id(g->ss_blended, ent->weld_joint_data.e1);
Xform e1_xf = sim_ent_get_xform(e1);
@ -1285,7 +1285,7 @@ void UpdateUser(P_Window *window)
#endif
/* Draw mouse joint */
if (sim_ent_has_prop(ent, SEPROP_MOUSE_JOINT))
if (sim_ent_has_prop(ent, Prop_MouseJoint))
{
Entity *target = sim_ent_from_id(g->ss_blended, ent->mouse_joint_data.target);
Xform target_xf = sim_ent_get_xform(target);
@ -1338,7 +1338,7 @@ void UpdateUser(P_Window *window)
}
/* Draw contact constraint */
if (sim_ent_has_prop(ent, SEPROP_CONTACT_CONSTRAINT))
if (sim_ent_has_prop(ent, Prop_ContactConstraint))
{
ContactConstraint *data = &ent->contact_constraint_data;
Entity *e0 = sim_ent_from_id(g->ss_blended, data->e0);
@ -1410,7 +1410,7 @@ void UpdateUser(P_Window *window)
/* Draw collision debug */
#if COLLIDER_DEBUG
if (sim_ent_has_prop(ent, SEPROP_COLLISION_DEBUG))
if (sim_ent_has_prop(ent, Prop_CollisionDebug))
{
CollisionDebugData *data = &ent->collision_debug_data;
CLD_CollisionData collision_reuslt = data->collision_result;
@ -1610,7 +1610,7 @@ void UpdateUser(P_Window *window)
#endif
/* Draw hierarchy */
if (sim_ent_has_prop(parent, SEPROP_ACTIVE) && !parent->is_root)
if (sim_ent_has_prop(parent, Prop_Active) && !parent->is_root)
{
u32 color = Rgba32F(0.6, 0.6, 1, 0.75);
f32 thickness = 2;
@ -1622,7 +1622,7 @@ void UpdateUser(P_Window *window)
}
/* Draw camera rect */
if (sim_ent_has_prop(ent, SEPROP_CAMERA))
if (sim_ent_has_prop(ent, Prop_Camera))
{
u32 color = ent == local_camera ? Rgba32F(1, 1, 1, 0.5) : Rgba32F(0, 0.75, 0, 0.5);
f32 thickness = 3;
@ -2086,13 +2086,13 @@ void GenerateuserInputCmds(Client *user_input_client, u64 tick)
Snapshot *user_input_ss = sim_snapshot_acquire(user_input_client, prev_user_input_ss, tick);
Entity *user_input_root = sim_ent_from_id(user_input_ss, SIM_ENT_ROOT_ID);
/* Find / create local control cmd ent */
Entity *control_cmd = sim_ent_find_first_match_one(user_input_ss, SEPROP_CMD);
Entity *control_cmd = sim_ent_find_first_match_one(user_input_ss, Prop_Cmd);
if (!control_cmd->valid)
{
control_cmd = sim_ent_acquire_sync_src(user_input_root);
control_cmd->cmd_kind = SIM_CMD_KIND_CONTROL;
control_cmd->predictor = user_input_client->player_id;
sim_ent_enable_prop(control_cmd, SEPROP_CMD);
sim_ent_enable_prop(control_cmd, Prop_Cmd);
sim_ent_activate(control_cmd, user_input_ss->tick);
}
{
@ -2382,10 +2382,10 @@ JobDef(SimJob, UNUSED sig, UNUSED id)
for (u64 i = 0; i < ss->num_ents_reserved; ++i)
{
Entity *ent = &ss->ents[i];
if (ent->valid && sim_ent_has_prop(ent, SEPROP_SYNC_DST))
if (ent->valid && sim_ent_has_prop(ent, Prop_SyncDst))
{
sim_ent_disable_prop(ent, SEPROP_SYNC_DST);
sim_ent_enable_prop(ent, SEPROP_SYNC_SRC);
sim_ent_disable_prop(ent, Prop_SyncDst);
sim_ent_enable_prop(ent, Prop_SyncSrc);
}
}
}
@ -2620,7 +2620,7 @@ JobDef(SimJob, UNUSED sig, UNUSED id)
if (master_ss->valid)
{
Entity *master_player = sim_ent_find_first_match_one(master_ss, SEPROP_PLAYER_IS_MASTER);
Entity *master_player = sim_ent_find_first_match_one(master_ss, Prop_IsMaster);
/* Update ent id from master */
{

View File

@ -1,8 +1,3 @@
/* Id magic number constants (to be used in conjunction with ent ids in deterministic id combinations) */
#define SIM_ENT_CONTACT_BASIS_Uid (UID(0x6a2a5d2dbecf534f, 0x0a8ca7c372a015af))
#define SIM_ENT_COLLISION_DEBUG_BASIS_Uid (UID(0x302c01182013bb02, 0x570bd270399d11a5))
#define SIM_ENT_TILE_CHUNK_BASIS_Uid (UID(0x3ce42de071dd226b, 0x9b566f7df30c813a))
////////////////////////////////
//~ Acquire
@ -56,7 +51,7 @@ Entity *sim_ent_acquire_sync_src(Entity *parent)
{
Snapshot *ss = parent->ss;
Entity *e = sim_ent_acquire_raw(ss, parent, sim_ent_random_id());
sim_ent_enable_prop(e, SEPROP_SYNC_SRC);
sim_ent_enable_prop(e, Prop_SyncSrc);
e->owner = ss->local_player;
return e;
}
@ -65,7 +60,7 @@ Entity *sim_ent_acquire_sync_src_with_id(Entity *parent, EntityId id)
{
Snapshot *ss = parent->ss;
Entity *e = sim_ent_acquire_raw(ss, parent, id);
sim_ent_enable_prop(e, SEPROP_SYNC_SRC);
sim_ent_enable_prop(e, Prop_SyncSrc);
e->owner = ss->local_player;
return e;
}
@ -75,7 +70,7 @@ Entity *sim_ent_acquire_sync_dst(Entity *parent, EntityId ent_id, EntityId owner
{
Snapshot *ss = parent->ss;
Entity *e = sim_ent_acquire_raw(ss, parent, ent_id);
sim_ent_enable_prop(e, SEPROP_SYNC_DST);
sim_ent_enable_prop(e, Prop_SyncDst);
e->owner = owner_id;
return e;
}
@ -114,7 +109,7 @@ void sim_ent_release(Entity *ent)
sim_ent_release_raw(ent);
}
void sim_ent_release_all_with_prop(Snapshot *ss, EntProp prop)
void sim_ent_release_all_with_prop(Snapshot *ss, Prop prop)
{
TempArena scratch = BeginScratchNoConflict();
@ -133,7 +128,7 @@ void sim_ent_release_all_with_prop(Snapshot *ss, EntProp prop)
* child entities will be released along with parent anyway) */
for (u64 i = 0; i < ents_to_release_count; ++i) {
Entity *ent = ents_to_release[i];
if (ent->valid && !ent->is_root && !sim_ent_has_prop(ent, SEPROP_CMD) && !sim_ent_has_prop(ent, SEPROP_PLAYER)) {
if (ent->valid && !ent->is_root && !sim_ent_has_prop(ent, Prop_Cmd) && !sim_ent_has_prop(ent, Prop_Player)) {
sim_ent_release(ent);
}
}
@ -146,7 +141,7 @@ void sim_ent_release_all_with_prop(Snapshot *ss, EntProp prop)
void sim_ent_activate(Entity *ent, u64 current_tick)
{
sim_ent_enable_prop(ent, SEPROP_ACTIVE);
sim_ent_enable_prop(ent, Prop_Active);
ent->activation_tick = current_tick;
++ent->continuity_gen;
}
@ -300,7 +295,7 @@ EntityId sim_ent_tile_chunk_id_from_tile_chunk_index(Vec2I32 chunk_index)
////////////////////////////////
//~ Query
Entity *sim_ent_find_first_match_one(Snapshot *ss, EntProp prop)
Entity *sim_ent_find_first_match_one(Snapshot *ss, Prop prop)
{
u64 count = ss->num_ents_reserved;
Entity *entities = ss->ents;
@ -489,21 +484,21 @@ void sim_ent_set_local_xform(Entity *ent, Xform xf)
void sim_ent_set_linear_velocity(Entity *ent, Vec2 velocity)
{
if (sim_ent_has_prop(ent, SEPROP_KINEMATIC) || sim_ent_has_prop(ent, SEPROP_DYNAMIC)) {
if (sim_ent_has_prop(ent, Prop_Kinematic) || sim_ent_has_prop(ent, Prop_Dynamic)) {
ent->linear_velocity = ClampVec2Len(velocity, SIM_MAX_LINEAR_VELOCITY);
}
}
void sim_ent_set_angular_velocity(Entity *ent, f32 velocity)
{
if (sim_ent_has_prop(ent, SEPROP_KINEMATIC) || sim_ent_has_prop(ent, SEPROP_DYNAMIC)) {
if (sim_ent_has_prop(ent, Prop_Kinematic) || sim_ent_has_prop(ent, Prop_Dynamic)) {
ent->angular_velocity = ClampF32(velocity, -SIM_MAX_ANGULAR_VELOCITY, SIM_MAX_ANGULAR_VELOCITY);
}
}
void sim_ent_apply_linear_impulse(Entity *ent, Vec2 impulse, Vec2 point)
{
if (sim_ent_has_prop(ent, SEPROP_DYNAMIC)) {
if (sim_ent_has_prop(ent, Prop_Dynamic)) {
Xform xf = sim_ent_get_xform(ent);
Vec2 center = xf.og;
f32 scale = AbsF32(DeterminantFromXform(xf));
@ -518,7 +513,7 @@ void sim_ent_apply_linear_impulse(Entity *ent, Vec2 impulse, Vec2 point)
void sim_ent_apply_linear_impulse_to_center(Entity *ent, Vec2 impulse)
{
if (sim_ent_has_prop(ent, SEPROP_DYNAMIC)) {
if (sim_ent_has_prop(ent, Prop_Dynamic)) {
Xform xf = sim_ent_get_xform(ent);
f32 scale = AbsF32(DeterminantFromXform(xf));
f32 inv_mass = 1.f / (ent->mass_unscaled * scale);
@ -529,14 +524,14 @@ void sim_ent_apply_linear_impulse_to_center(Entity *ent, Vec2 impulse)
void sim_ent_apply_force_to_center(Entity *ent, Vec2 force)
{
if (sim_ent_has_prop(ent, SEPROP_DYNAMIC)) {
if (sim_ent_has_prop(ent, Prop_Dynamic)) {
ent->force = AddVec2(ent->force, force);
}
}
void sim_ent_apply_angular_impulse(Entity *ent, f32 impulse)
{
if (sim_ent_has_prop(ent, SEPROP_DYNAMIC)) {
if (sim_ent_has_prop(ent, Prop_Dynamic)) {
Xform xf = sim_ent_get_xform(ent);
f32 scale = AbsF32(DeterminantFromXform(xf));
f32 inv_inertia = 1.f / (ent->inertia_unscaled * scale);
@ -546,7 +541,7 @@ void sim_ent_apply_angular_impulse(Entity *ent, f32 impulse)
void sim_ent_apply_torque(Entity *ent, f32 torque)
{
if (sim_ent_has_prop(ent, SEPROP_DYNAMIC)) {
if (sim_ent_has_prop(ent, Prop_Dynamic)) {
ent->torque += torque;
}
}
@ -620,7 +615,7 @@ void sim_ent_lerp(Entity *e, Entity *e0, Entity *e1, f64 blend)
void sim_ent_sync_acquire_tree(Entity *local_parent, Entity *remote, EntityId remote_player)
{
__prof;
if (sim_ent_has_prop(remote, SEPROP_SYNC_SRC)) {
if (sim_ent_has_prop(remote, Prop_SyncSrc)) {
Snapshot *local_ss = local_parent->ss;
Snapshot *remote_ss = remote->ss;
@ -661,8 +656,8 @@ void sim_ent_sync(Entity *local, Entity *remote)
local->prev_in_id_bin = old.prev_in_id_bin;
local->next_free = old.next_free;
sim_ent_disable_prop(local, SEPROP_SYNC_SRC);
sim_ent_enable_prop(local, SEPROP_SYNC_DST);
sim_ent_disable_prop(local, Prop_SyncSrc);
sim_ent_enable_prop(local, Prop_SyncDst);
}
////////////////////////////////

View File

@ -1,66 +1,63 @@
#define SIM_ENT_NIL_ID ((EntityId) { UID(0, 0) })
#define SIM_ENT_ROOT_ID ((EntityId) { UID(0xaaaaaaaaaaaaaaaa, 0xaaaaaaaaaaaaaaaa) })
////////////////////////////////
//~ Entity props
typedef i32 EntProp; enum {
SEPROP_ACTIVE,
SEPROP_RELEASE,
typedef i32 Prop; enum {
Prop_Active,
Prop_Release,
SEPROP_SYNC_SRC, /* This entity is networked to other clients */
SEPROP_SYNC_DST, /* This entity is not locally created, and will sync with incoming net src ents */
Prop_SyncSrc, /* This entity is networked to other clients */
Prop_SyncDst, /* This entity is not locally created, and will sync with incoming net src ents */
SEPROP_PLAYER,
SEPROP_PLAYER_IS_MASTER,
Prop_Player,
Prop_IsMaster,
SEPROP_CMD,
Prop_Cmd,
SEPROP_TILE_CHUNK,
SEPROP_WALL,
Prop_TileChunk,
Prop_Wall,
/* Physics collision */
SEPROP_SENSOR, /* This entity's collisions generate contacts */
SEPROP_SOLID, /* This entity's collisions generate contacts to be solved by the physics system (overrides SEPROP_SENSOR) */
SEPROP_TOI, /* This entity's collisions are processed using TOI (time of impact) for precise collisions */
Prop_Sensor, /* This entity's collisions generate contacts */
Prop_Solid, /* This entity's collisions generate contacts to be solved by the physics system (overrides Prop_Sensor) */
Prop_Toi, /* This entity's collisions are processed using TOI (time of impact) for precise collisions */
/* Physics movement */
SEPROP_KINEMATIC, /* This entity reacts to velocity */
SEPROP_DYNAMIC, /* This entity reacts to velocity and forces (overrides SEPROP_KINEMATIC) */
Prop_Kinematic, /* This entity reacts to velocity */
Prop_Dynamic, /* This entity reacts to velocity and forces (overrides Prop_Kinematic) */
SEPROP_CONTROLLED,
Prop_Controlled,
SEPROP_COLLISION_DEBUG,
SEPROP_CONTACT_CONSTRAINT,
SEPROP_MOTOR_JOINT,
SEPROP_MOUSE_JOINT,
SEPROP_WELD_JOINT,
Prop_CollisionDebug,
Prop_ContactConstraint,
Prop_MotorJoint,
Prop_MouseJoint,
Prop_WeldJoint,
SEPROP_CAMERA,
SEPROP_CAMERA_ACTIVE,
Prop_Camera,
Prop_ActiveCamera,
SEPROP_BULLET,
SEPROP_WEAPON_SMG,
SEPROP_WEAPON_LAUNCHER,
SEPROP_WEAPON_CHUCKER,
Prop_Bullet,
Prop_Smg,
Prop_Launcher,
Prop_Chucker,
SEPROP_CHUCKER_ZONE,
Prop_ChuckerZone,
SEPROP_EXPLOSION,
Prop_Explosion,
SEPROP_TRACER,
Prop_Tracer,
SEPROP_QUAKE,
Prop_Quake,
SEPROP_ATTACHED,
Prop_Attached,
/* Test props */
SEPROP_TEST,
SEPROP_TEST_SOUND_EMITTER,
SEPROP_LIGHT_TEST,
Prop_Test,
Prop_SoundEmitterTest,
Prop_LightTest,
SEPROP_COUNT
Prop_Count
};
////////////////////////////////
@ -73,7 +70,7 @@ Struct(Entity) {
b32 valid; /* Is this ent allocated in memory that can be written to (can always be read) */
EntityId id;
u64 props[(SEPROP_COUNT + 63) / 64];
u64 props[(Prop_Count + 63) / 64];
u64 continuity_gen;
/* Is this the root ent */
@ -99,8 +96,8 @@ Struct(Entity) {
//- Sync
/* SEPROP_SYNC_SRC */
/* SEPROP_SYNC_DST */
/* Prop_SyncSrc */
/* Prop_SyncDst */
/* Id of the player that owns simulation for this entity */
EntityId owner;
@ -127,7 +124,7 @@ Struct(Entity) {
//- Cmd
/* SEPROP_CMD */
/* Prop_Cmd */
CmdKind cmd_kind;
EntityId cmd_player;
@ -143,7 +140,7 @@ Struct(Entity) {
//- Chat
/* SEPROP_CHAT */
/* Prop_CHAT */
EntityId chat_player;
//String chat_msg;
@ -151,7 +148,7 @@ Struct(Entity) {
//- Tile
/* SEPROP_TILE_CHUNK */
/* Prop_TileChunk */
/* FIXME: Move out of here */
u8 tile_chunk_tiles[SIM_TILES_PER_CHUNK_SQRT * SIM_TILES_PER_CHUNK_SQRT];
@ -159,7 +156,7 @@ Struct(Entity) {
//- Client
/* SEPROP_PLAYER */
/* Prop_Player */
/* FIXME: Lerp */
@ -193,21 +190,21 @@ Struct(Entity) {
//- Constraints / joints
/* SEPROP_CONSTRAINT_CONTACT */
/* Prop_CONSTRAINT_CONTACT */
ContactConstraint contact_constraint_data;
/* SEPROP_MOTOR_JOINT */
/* Prop_MotorJoint */
MotorJoint motor_joint_data;
/* SEPROP_MOUSE_JOINT */
/* Prop_MouseJoint */
MouseJoint mouse_joint_data;
/* SEPROP_WELD_JOINT */
/* Prop_WeldJoint */
WeldJoint weld_joint_data;
//- Control
/* SEPROP_CONTROLLED */
/* Prop_Controlled */
EntityId controlling_player;
@ -223,7 +220,7 @@ Struct(Entity) {
//- Physics
/* SEPROP_DYNAMIC */
/* Prop_Dynamic */
//f32 density; /* Density in kg/m^2 */
@ -259,13 +256,13 @@ Struct(Entity) {
//- Animation
/* SEPROP_ANIMATING */
/* Prop_ANIMATING */
i64 animation_last_frame_change_time_ns;
u32 animation_frame;
//- Attachment
/* SEPROP_ATTACHED */
/* Prop_Attached */
/* Slice name on the parent ent's sprite to attach to */
String attach_slice;
@ -275,14 +272,14 @@ Struct(Entity) {
//- Chucker
/* SEPROP_WEAPON_CHUCKER */
/* Prop_Chucker */
EntityId chucker_zone;
EntityId chucker_joint;
//- Chucker zone
/* SEPROP_CHUCKER_ZONE */
/* Prop_ChuckerZone */
EntityId chucker_zone_ent;
u64 chucker_zone_ent_tick;
@ -326,7 +323,7 @@ Struct(Entity) {
//- Tracer
/* SEPROP_TRACER */
/* Prop_Tracer */
Vec2 tracer_start;
Vec2 tracer_start_velocity;
@ -338,7 +335,7 @@ Struct(Entity) {
//- Quake
/* SEPROP_QUAKE */
/* Prop_Quake */
f32 quake_intensity;
f32 quake_frequency;
@ -346,19 +343,19 @@ Struct(Entity) {
//- Testing
/* SEPROP_TEST */
/* Prop_Test */
b32 test_initialized;
Xform test_start_local_xform;
Xform test_start_sprite_xform;
/* SEPROP_TEST_SOUND_EMITTER */
/* Prop_SoundEmitterTest */
String sound_name;
MIX_TrackDesc sound_desc;
MIX_Handle sound_handle;
//- Camera
/* SEPROP_CAMERA */
/* Prop_Camera */
EntityId camera_follow;
Xform camera_quad_xform;
f32 camera_lerp; /* Rate at which camera xform approaches target xform */
@ -376,7 +373,7 @@ Struct(EntArray) {
};
Struct(EntPropArray) {
EntProp *props;
Prop *props;
u64 count;
};
@ -391,6 +388,17 @@ Inline Entity *sim_ent_nil(void)
return *_g_sim_ent_nil;
}
////////////////////////////////
//~ Id types
#define SIM_ENT_TILE_CHUNK_BASIS_Uid (UID(0x3ce42de071dd226b, 0x9b566f7df30c813a))
#define SIM_ENT_NIL_ID ((EntityId) { UID(0, 0) })
#define SIM_ENT_ROOT_ID ((EntityId) { UID(0xaaaaaaaaaaaaaaaa, 0xaaaaaaaaaaaaaaaa) })
/* Id magic number constants (to be used in conjunction with ent ids in deterministic id combinations) */
#define SIM_ENT_CONTACT_BASIS_Uid (UID(0x6a2a5d2dbecf534f, 0x0a8ca7c372a015af))
#define SIM_ENT_COLLISION_DEBUG_BASIS_Uid (UID(0x302c01182013bb02, 0x570bd270399d11a5))
////////////////////////////////
//~ Id helpers
@ -407,21 +415,21 @@ Inline b32 sim_ent_id_is_nil(EntityId id)
////////////////////////////////
//~ Property helpers
Inline void sim_ent_enable_prop(Entity *ent, EntProp prop)
Inline void sim_ent_enable_prop(Entity *ent, Prop prop)
{
u64 index = prop / 64;
u64 bit = prop % 64;
ent->props[index] |= ((u64)1 << bit);
}
Inline void sim_ent_disable_prop(Entity *ent, EntProp prop)
Inline void sim_ent_disable_prop(Entity *ent, Prop prop)
{
u64 index = prop / 64;
u64 bit = prop % 64;
ent->props[index] &= ~((u64)1 << bit);
}
Inline b32 sim_ent_has_prop(Entity *ent, EntProp prop)
Inline b32 sim_ent_has_prop(Entity *ent, Prop prop)
{
u64 index = prop / 64;
u64 bit = prop % 64;
@ -430,7 +438,7 @@ Inline b32 sim_ent_has_prop(Entity *ent, EntProp prop)
Inline b32 sim_ent_is_valid_and_active(Entity *ent)
{
return ent->valid && sim_ent_has_prop(ent, SEPROP_ACTIVE);
return ent->valid && sim_ent_has_prop(ent, Prop_Active);
}
Inline b32 sim_ent_should_predict(Entity *ent)
@ -448,7 +456,7 @@ Inline b32 sim_ent_should_simulate(Entity *ent)
b32 result = 0;
if (sim_ent_is_valid_and_active(ent)) {
result = 1;
if (sim_ent_has_prop(ent, SEPROP_SYNC_DST)) {
if (sim_ent_has_prop(ent, Prop_SyncDst)) {
EntityId local_player = ent->ss->local_player;
result = sim_ent_id_eq(local_player, ent->owner) || sim_ent_id_eq(local_player, ent->predictor);
}
@ -471,7 +479,7 @@ Entity *sim_ent_acquire_sync_dst(Entity *parent, EntityId ent_id, EntityId owner
void sim_ent_release_raw(Entity *ent);
void sim_ent_release(Entity *ent);
void sim_ent_release_all_with_prop(Snapshot *ss, EntProp prop);
void sim_ent_release_all_with_prop(Snapshot *ss, Prop prop);
////////////////////////////////
//~ Activate operations
@ -494,7 +502,7 @@ EntityId sim_ent_tile_chunk_id_from_tile_chunk_index(Vec2I32 chunk_start);
////////////////////////////////
//~ Query operations
Entity *sim_ent_find_first_match_one(Snapshot *ss, EntProp prop);
Entity *sim_ent_find_first_match_one(Snapshot *ss, Prop prop);
Entity *sim_ent_find_first_match_all(Snapshot *ss, EntPropArray props);
////////////////////////////////

View File

@ -10,7 +10,7 @@ internal b32 can_contact(Entity *e0, Entity *e1)
b32 result = 0;
result = e0 != e1 &&
!sim_ent_id_eq(e0->top, e1->top) &&
!(sim_ent_has_prop(e0, SEPROP_WALL) && sim_ent_has_prop(e1, SEPROP_WALL));
!(sim_ent_has_prop(e0, Prop_Wall) && sim_ent_has_prop(e1, Prop_Wall));
return result;
}
@ -29,7 +29,7 @@ void phys_create_and_update_contacts(PhysStepCtx *ctx, f32 elapsed_dt, u64 phys_
for (u64 check0_index = 0; check0_index < ss->num_ents_reserved; ++check0_index) {
Entity *check0 = &ss->ents[check0_index];
if (!sim_ent_is_valid_and_active(check0)) continue;
if (!(sim_ent_has_prop(check0, SEPROP_SOLID) || sim_ent_has_prop(check0, SEPROP_SENSOR))) continue;
if (!(sim_ent_has_prop(check0, Prop_Solid) || sim_ent_has_prop(check0, Prop_Sensor))) continue;
if (check0->local_collider.count <= 0) continue;
Xform check0_xf = sim_ent_get_xform(check0);
@ -41,7 +41,7 @@ void phys_create_and_update_contacts(PhysStepCtx *ctx, f32 elapsed_dt, u64 phys_
while ((space_entry = space_iter_next(&iter)) != 0) {
Entity *check1 = sim_ent_from_id(ss, space_entry->ent);
if (!sim_ent_is_valid_and_active(check1)) continue;
if (!(sim_ent_has_prop(check1, SEPROP_SOLID) || sim_ent_has_prop(check1, SEPROP_SENSOR))) continue;
if (!(sim_ent_has_prop(check1, Prop_Solid) || sim_ent_has_prop(check1, Prop_Sensor))) continue;
if (check1->local_collider.count <= 0) continue;
if (!can_contact(check0, check1)) continue;
@ -97,12 +97,12 @@ void phys_create_and_update_contacts(PhysStepCtx *ctx, f32 elapsed_dt, u64 phys_
constraint_ent->contact_constraint_data.e0 = e0->id;
constraint_ent->contact_constraint_data.e1 = e1->id;
/* Both entities must be solid and one must be dynamic for a solve to be necessary. */
constraint_ent->contact_constraint_data.skip_solve = !sim_ent_has_prop(e0, SEPROP_SOLID) || !sim_ent_has_prop(e1, SEPROP_SOLID) ||
!(sim_ent_has_prop(e0, SEPROP_DYNAMIC) || sim_ent_has_prop(e1, SEPROP_DYNAMIC));
sim_ent_enable_prop(constraint_ent, SEPROP_ACTIVE);
constraint_ent->contact_constraint_data.skip_solve = !sim_ent_has_prop(e0, Prop_Solid) || !sim_ent_has_prop(e1, Prop_Solid) ||
!(sim_ent_has_prop(e0, Prop_Dynamic) || sim_ent_has_prop(e1, Prop_Dynamic));
sim_ent_enable_prop(constraint_ent, Prop_Active);
/* TODO: Should we recalculate normal as more contact points are added? */
sim_ent_enable_prop(constraint_ent, SEPROP_CONTACT_CONSTRAINT);
sim_ent_enable_prop(constraint_ent, Prop_ContactConstraint);
sim_ent_activate(constraint_ent, tick);
}
constraint = &constraint_ent->contact_constraint_data;
@ -233,7 +233,7 @@ void phys_create_and_update_contacts(PhysStepCtx *ctx, f32 elapsed_dt, u64 phys_
if (!dbg_ent->valid) {
/* FIXME: Entity never released */
dbg_ent = sim_ent_acquire_local_with_id(root, dbg_ent_id);
sim_ent_enable_prop(dbg_ent, SEPROP_COLLISION_DEBUG);
sim_ent_enable_prop(dbg_ent, Prop_CollisionDebug);
}
CollisionDebugData *dbg = &dbg_ent->collision_debug_data;
@ -273,7 +273,7 @@ void phys_prepare_contacts(PhysStepCtx *ctx, u64 phys_iteration)
for (u64 sim_ent_index = 0; sim_ent_index < ss->num_ents_reserved; ++sim_ent_index) {
Entity *constraint_ent = &ss->ents[sim_ent_index];
if (!sim_ent_should_simulate(constraint_ent)) continue;
if (!sim_ent_has_prop(constraint_ent, SEPROP_CONTACT_CONSTRAINT)) continue;
if (!sim_ent_has_prop(constraint_ent, Prop_ContactConstraint)) continue;
ContactConstraint *constraint = &constraint_ent->contact_constraint_data;
@ -295,14 +295,14 @@ void phys_prepare_contacts(PhysStepCtx *ctx, u64 phys_iteration)
f32 inv_i1 = 0;
{
/* If not simulated locally or ent is not dynamic, pretend contact mass is infinite */
if (sim_ent_should_simulate(e0) && sim_ent_has_prop(e0, SEPROP_DYNAMIC)) {
if (sim_ent_should_simulate(e0) && sim_ent_has_prop(e0, Prop_Dynamic)) {
f32 scale = AbsF32(DeterminantFromXform(e0_xf));
f32 scaled_mass = e0->mass_unscaled * scale;
f32 scaled_inertia = e0->inertia_unscaled * scale;
inv_m0 = 1.f / scaled_mass;
inv_i0 = 1.f / scaled_inertia;
}
if (sim_ent_should_simulate(e1) && sim_ent_has_prop(e1, SEPROP_DYNAMIC)) {
if (sim_ent_should_simulate(e1) && sim_ent_has_prop(e1, Prop_Dynamic)) {
f32 scale = AbsF32(DeterminantFromXform(e1_xf));
f32 scaled_mass = e1->mass_unscaled * scale;
f32 scaled_inertia = e1->inertia_unscaled * scale;
@ -346,8 +346,8 @@ void phys_prepare_contacts(PhysStepCtx *ctx, u64 phys_iteration)
} else {
/* Mark constraint for removal */
constraint_ent->contact_constraint_data.num_points = 0;
sim_ent_disable_prop(constraint_ent, SEPROP_ACTIVE);
sim_ent_enable_prop(constraint_ent, SEPROP_RELEASE);
sim_ent_disable_prop(constraint_ent, Prop_Active);
sim_ent_enable_prop(constraint_ent, Prop_Release);
}
}
@ -357,18 +357,18 @@ void phys_prepare_contacts(PhysStepCtx *ctx, u64 phys_iteration)
for (u64 sim_ent_index = 0; sim_ent_index < ss->num_ents_reserved; ++sim_ent_index) {
Entity *dbg_ent = &ss->ents[sim_ent_index];
if (!sim_ent_should_simulate(dbg_ent)) continue;
if (!sim_ent_has_prop(dbg_ent, SEPROP_COLLISION_DEBUG)) continue;
if (!sim_ent_has_prop(dbg_ent, Prop_CollisionDebug)) continue;
CollisionDebugData *dbg = &dbg_ent->collision_debug_data;
Entity *e0 = sim_ent_from_id(ss, dbg->e0);
Entity *e1 = sim_ent_from_id(ss, dbg->e1);
if (!(sim_ent_should_simulate(e0) && sim_ent_should_simulate(e1)) ||
!(sim_ent_has_prop(e0, SEPROP_SOLID) || sim_ent_has_prop(e0, SEPROP_SENSOR)) ||
!(sim_ent_has_prop(e1, SEPROP_SOLID) || sim_ent_has_prop(e1, SEPROP_SENSOR))) {
!(sim_ent_has_prop(e0, Prop_Solid) || sim_ent_has_prop(e0, Prop_Sensor)) ||
!(sim_ent_has_prop(e1, Prop_Solid) || sim_ent_has_prop(e1, Prop_Sensor))) {
/* Mark dbg ent for removal */
sim_ent_disable_prop(dbg_ent, SEPROP_ACTIVE);
sim_ent_enable_prop(dbg_ent, SEPROP_RELEASE);
sim_ent_disable_prop(dbg_ent, Prop_Active);
sim_ent_enable_prop(dbg_ent, Prop_Release);
}
}
#endif
@ -382,7 +382,7 @@ void phys_warm_start_contacts(PhysStepCtx *ctx)
for (u64 sim_ent_index = 0; sim_ent_index < ss->num_ents_reserved; ++sim_ent_index) {
Entity *constraint_ent = &ss->ents[sim_ent_index];
if (!sim_ent_should_simulate(constraint_ent)) continue;
if (!sim_ent_has_prop(constraint_ent, SEPROP_CONTACT_CONSTRAINT)) continue;
if (!sim_ent_has_prop(constraint_ent, Prop_ContactConstraint)) continue;
ContactConstraint *constraint = &constraint_ent->contact_constraint_data;
@ -434,7 +434,7 @@ void phys_solve_contacts(PhysStepCtx *ctx, f32 dt, b32 apply_bias)
for (u64 sim_ent_index = 0; sim_ent_index < ss->num_ents_reserved; ++sim_ent_index) {
Entity *constraint_ent = &ss->ents[sim_ent_index];
if (!sim_ent_should_simulate(constraint_ent)) continue;
if (!sim_ent_has_prop(constraint_ent, SEPROP_CONTACT_CONSTRAINT)) continue;
if (!sim_ent_has_prop(constraint_ent, Prop_ContactConstraint)) continue;
ContactConstraint *constraint = &constraint_ent->contact_constraint_data;
@ -572,7 +572,7 @@ void phys_prepare_motor_joints(PhysStepCtx *ctx)
for (u64 sim_ent_index = 0; sim_ent_index < ss->num_ents_reserved; ++sim_ent_index) {
Entity *joint_ent = &ss->ents[sim_ent_index];
if (!sim_ent_should_simulate(joint_ent)) continue;
if (!sim_ent_has_prop(joint_ent, SEPROP_MOTOR_JOINT)) continue;
if (!sim_ent_has_prop(joint_ent, Prop_MotorJoint)) continue;
MotorJoint *joint = &joint_ent->motor_joint_data;
@ -623,8 +623,8 @@ void phys_prepare_motor_joints(PhysStepCtx *ctx)
#endif
} else {
/* Mark joint for removal */
sim_ent_disable_prop(joint_ent, SEPROP_ACTIVE);
sim_ent_enable_prop(joint_ent, SEPROP_RELEASE);
sim_ent_disable_prop(joint_ent, Prop_Active);
sim_ent_enable_prop(joint_ent, Prop_Release);
}
}
}
@ -636,7 +636,7 @@ void phys_warm_start_motor_joints(PhysStepCtx *ctx)
for (u64 sim_ent_index = 0; sim_ent_index < ss->num_ents_reserved; ++sim_ent_index) {
Entity *joint_ent = &ss->ents[sim_ent_index];
if (!sim_ent_should_simulate(joint_ent)) continue;
if (!sim_ent_has_prop(joint_ent, SEPROP_MOTOR_JOINT)) continue;
if (!sim_ent_has_prop(joint_ent, Prop_MotorJoint)) continue;
MotorJoint *joint = &joint_ent->motor_joint_data;
@ -668,7 +668,7 @@ void phys_solve_motor_joints(PhysStepCtx *ctx, f32 dt)
for (u64 sim_ent_index = 0; sim_ent_index < ss->num_ents_reserved; ++sim_ent_index) {
Entity *joint_ent = &ss->ents[sim_ent_index];
if (!sim_ent_should_simulate(joint_ent)) continue;
if (!sim_ent_has_prop(joint_ent, SEPROP_MOTOR_JOINT)) continue;
if (!sim_ent_has_prop(joint_ent, Prop_MotorJoint)) continue;
MotorJoint *joint = &joint_ent->motor_joint_data;
@ -774,7 +774,7 @@ void phys_prepare_mouse_joints(PhysStepCtx *ctx)
for (u64 sim_ent_index = 0; sim_ent_index < ss->num_ents_reserved; ++sim_ent_index) {
Entity *joint_ent = &ss->ents[sim_ent_index];
if (!sim_ent_should_simulate(joint_ent)) continue;
if (!sim_ent_has_prop(joint_ent, SEPROP_MOUSE_JOINT)) continue;
if (!sim_ent_has_prop(joint_ent, Prop_MouseJoint)) continue;
MouseJoint *joint = &joint_ent->mouse_joint_data;
Entity *ent = sim_ent_from_id(ss, joint->target);
@ -808,8 +808,8 @@ void phys_prepare_mouse_joints(PhysStepCtx *ctx)
#endif
} else {
/* Mark joint for removal */
sim_ent_disable_prop(joint_ent, SEPROP_ACTIVE);
sim_ent_enable_prop(joint_ent, SEPROP_RELEASE);
sim_ent_disable_prop(joint_ent, Prop_Active);
sim_ent_enable_prop(joint_ent, Prop_Release);
}
}
}
@ -821,7 +821,7 @@ void phys_warm_start_mouse_joints(PhysStepCtx *ctx)
for (u64 sim_ent_index = 0; sim_ent_index < ss->num_ents_reserved; ++sim_ent_index) {
Entity *joint_ent = &ss->ents[sim_ent_index];
if (!sim_ent_should_simulate(joint_ent)) continue;
if (!sim_ent_has_prop(joint_ent, SEPROP_MOUSE_JOINT)) continue;
if (!sim_ent_has_prop(joint_ent, Prop_MouseJoint)) continue;
MouseJoint *joint = &joint_ent->mouse_joint_data;
Entity *ent = sim_ent_from_id(ss, joint->target);
@ -843,7 +843,7 @@ void phys_solve_mouse_joints(PhysStepCtx *ctx, f32 dt)
for (u64 sim_ent_index = 0; sim_ent_index < ss->num_ents_reserved; ++sim_ent_index) {
Entity *joint_ent = &ss->ents[sim_ent_index];
if (!sim_ent_should_simulate(joint_ent)) continue;
if (!sim_ent_has_prop(joint_ent, SEPROP_MOUSE_JOINT)) continue;
if (!sim_ent_has_prop(joint_ent, Prop_MouseJoint)) continue;
MouseJoint *joint = &joint_ent->mouse_joint_data;
Entity *ent = sim_ent_from_id(ss, joint->target);
@ -939,7 +939,7 @@ void phys_prepare_weld_joints(PhysStepCtx *ctx)
for (u64 sim_ent_index = 0; sim_ent_index < ss->num_ents_reserved; ++sim_ent_index) {
Entity *joint_ent = &ss->ents[sim_ent_index];
if (!sim_ent_should_simulate(joint_ent)) continue;
if (!sim_ent_has_prop(joint_ent, SEPROP_WELD_JOINT)) continue;
if (!sim_ent_has_prop(joint_ent, Prop_WeldJoint)) continue;
/* TODO: Lookup and disable collision for any contacts between e0 & e1? */
@ -975,8 +975,8 @@ void phys_prepare_weld_joints(PhysStepCtx *ctx)
#endif
} else {
/* Mark joint for removal */
sim_ent_disable_prop(joint_ent, SEPROP_ACTIVE);
sim_ent_enable_prop(joint_ent, SEPROP_RELEASE);
sim_ent_disable_prop(joint_ent, Prop_Active);
sim_ent_enable_prop(joint_ent, Prop_Release);
}
}
}
@ -988,7 +988,7 @@ void phys_warm_start_weld_joints(PhysStepCtx *ctx)
for (u64 sim_ent_index = 0; sim_ent_index < ss->num_ents_reserved; ++sim_ent_index) {
Entity *joint_ent = &ss->ents[sim_ent_index];
if (!sim_ent_should_simulate(joint_ent)) continue;
if (!sim_ent_has_prop(joint_ent, SEPROP_WELD_JOINT)) continue;
if (!sim_ent_has_prop(joint_ent, Prop_WeldJoint)) continue;
WeldJoint *joint = &joint_ent->weld_joint_data;
@ -1025,7 +1025,7 @@ void phys_solve_weld_joints(PhysStepCtx *ctx, f32 dt)
for (u64 sim_ent_index = 0; sim_ent_index < ss->num_ents_reserved; ++sim_ent_index) {
Entity *joint_ent = &ss->ents[sim_ent_index];
if (!sim_ent_should_simulate(joint_ent)) continue;
if (!sim_ent_has_prop(joint_ent, SEPROP_WELD_JOINT)) continue;
if (!sim_ent_has_prop(joint_ent, Prop_WeldJoint)) continue;
WeldJoint *joint = &joint_ent->weld_joint_data;
Entity *e0 = sim_ent_from_id(ss, joint->e0);
@ -1106,8 +1106,8 @@ void phys_integrate_forces(PhysStepCtx *ctx, f32 dt)
Entity *ent = &ss->ents[sim_ent_index];
if (!sim_ent_should_simulate(ent)) continue;
b32 is_dynamic = sim_ent_has_prop(ent, SEPROP_DYNAMIC);
b32 is_kinematic = sim_ent_has_prop(ent, SEPROP_KINEMATIC);
b32 is_dynamic = sim_ent_has_prop(ent, Prop_Dynamic);
b32 is_kinematic = sim_ent_has_prop(ent, Prop_Kinematic);
if (is_dynamic || is_kinematic) {
Vec2 linear_velocity = ent->linear_velocity;
f32 angular_velocity = ent->angular_velocity;
@ -1147,7 +1147,7 @@ void phys_integrate_velocities(PhysStepCtx *ctx, f32 dt)
for (u64 sim_ent_index = 0; sim_ent_index < ss->num_ents_reserved; ++sim_ent_index) {
Entity *ent = &ss->ents[sim_ent_index];
if (!sim_ent_should_simulate(ent)) continue;
if (!sim_ent_has_prop(ent, SEPROP_DYNAMIC) && !sim_ent_has_prop(ent, SEPROP_KINEMATIC)) continue;
if (!sim_ent_has_prop(ent, Prop_Dynamic) && !sim_ent_has_prop(ent, Prop_Kinematic)) continue;
Xform xf = get_derived_xform(ent, dt);
sim_ent_set_xform(ent, xf);
@ -1168,8 +1168,8 @@ f32 phys_determine_earliest_toi(PhysStepCtx *ctx, f32 step_dt, f32 tolerance, u3
for (u64 e0_index = 0; e0_index < ss->num_ents_reserved; ++e0_index) {
Entity *e0 = &ss->ents[e0_index];
if (!sim_ent_should_simulate(e0)) continue;
if (!(sim_ent_has_prop(e0, SEPROP_SOLID) || sim_ent_has_prop(e0, SEPROP_SENSOR))) continue;
if (!sim_ent_has_prop(e0, SEPROP_TOI)) continue;
if (!(sim_ent_has_prop(e0, Prop_Solid) || sim_ent_has_prop(e0, Prop_Sensor))) continue;
if (!sim_ent_has_prop(e0, Prop_Toi)) continue;
if (e0->local_collider.count <= 0) continue;
CLD_Shape e0_collider = e0->local_collider;
@ -1186,7 +1186,7 @@ f32 phys_determine_earliest_toi(PhysStepCtx *ctx, f32 step_dt, f32 tolerance, u3
while ((entry = space_iter_next(&iter)) != 0) {
Entity *e1 = sim_ent_from_id(ss, entry->ent);
if (!sim_ent_should_simulate(e1)) continue;
if (!(sim_ent_has_prop(e1, SEPROP_SOLID) || sim_ent_has_prop(e1, SEPROP_SENSOR))) continue;
if (!(sim_ent_has_prop(e1, Prop_Solid) || sim_ent_has_prop(e1, Prop_Sensor))) continue;
if (e1->local_collider.count <= 0) continue;
if (!can_contact(e0, e1)) continue;

View File

@ -597,7 +597,7 @@ void sim_snapshot_set_tile(Snapshot *ss, Vec2I32 world_tile_index, TileKind tile
if (!chunk_ent->valid) {
Entity *root = sim_ent_from_id(ss, SIM_ENT_ROOT_ID);
chunk_ent = sim_ent_acquire_sync_src_with_id(root, chunk_id);
sim_ent_enable_prop(chunk_ent, SEPROP_TILE_CHUNK);
sim_ent_enable_prop(chunk_ent, Prop_TileChunk);
chunk_ent->tile_chunk_index = chunk_index;
}
@ -680,7 +680,7 @@ void sim_snapshot_sync_ents(Snapshot *local_ss, Snapshot *remote_ss, EntityId re
/* Sync ents with remote, skipping index 0 (nil) & index 1 (root) */
for (u64 i = 2; i < local_ss->num_ents_reserved; ++i) {
Entity *local_ent = &local_ss->ents[i];
if (local_ent->valid && sim_ent_has_prop(local_ent, SEPROP_SYNC_DST)) {
if (local_ent->valid && sim_ent_has_prop(local_ent, Prop_SyncDst)) {
b32 should_sync = sim_ent_id_eq(local_ent->owner, remote_player) || sim_ent_id_is_nil(remote_player);
if ((sync_flags & SIM_SYNC_FLAG_NOSYNC_PREDICTABLES) && sim_ent_id_eq(local_ent->predictor, local_ss->local_player)) {
should_sync = 0;
@ -692,13 +692,13 @@ void sim_snapshot_sync_ents(Snapshot *local_ss, Snapshot *remote_ss, EntityId re
sim_ent_sync(local_ent, remote_ent);
} else {
/* Remote ent is no longer valid / networked, release it */
sim_ent_enable_prop(local_ent, SEPROP_RELEASE);
sim_ent_disable_prop(local_ent, SEPROP_SYNC_DST);
sim_ent_enable_prop(local_ent, Prop_Release);
sim_ent_disable_prop(local_ent, Prop_SyncDst);
}
}
}
}
sim_ent_release_all_with_prop(local_ss, SEPROP_RELEASE);
sim_ent_release_all_with_prop(local_ss, Prop_Release);
}
@ -984,7 +984,7 @@ void sim_snapshot_decode(BB_Reader *br, Snapshot *ss)
Entity *e = sim_ent_from_index(ss, e);
Assert(e->valid); /* An entity that we don't have allocated should never have been marked for release */
if (e->valid) {
sim_ent_enable_prop(e, SEPROP_RELEASE);
sim_ent_enable_prop(e, Prop_Release);
}
} else {
alloc_parent_index = BB_ReadUV();
@ -1070,7 +1070,7 @@ void sim_snapshot_decode(BB_Reader *br, Snapshot *ss)
if (BB_ReadBit(br)) {
struct sim_ent_decode_node *n = PushStruct(scratch.arena, struct sim_ent_decode_node)
} else {
sim_ent_enable_prop(e, SEPROP_RELEASE);
sim_ent_enable_prop(e, Prop_Release);
}
}
}
@ -1089,13 +1089,13 @@ void sim_snapshot_decode(BB_Reader *br, Snapshot *ss)
/* Why is an already released ent being marked as released? */
Assert(e->valid);
if (e->valid) {
sim_ent_enable_prop(e, SEPROP_RELEASE);
sim_ent_enable_prop(e, Prop_Release);
}
} else {
sim_ent_decode(br, e);
}
}
sim_ent_release_all_with_prop(ss, SEPROP_RELEASE);
sim_ent_release_all_with_prop(ss, Prop_Release);
#endif
EndScratch(scratch);

View File

@ -36,11 +36,11 @@ Entity *SpawnTestSmg(Entity *parent)
Entity *e = sim_ent_acquire_sync_src(parent);
e->sprite = S_TagFromPath(Lit("sprite/gun.ase"));
sim_ent_enable_prop(e, SEPROP_ATTACHED);
sim_ent_enable_prop(e, Prop_Attached);
e->attach_slice = Lit("attach.wep");
e->layer = SIM_LAYER_RELATIVE_WEAPON;
sim_ent_enable_prop(e, SEPROP_WEAPON_SMG);
sim_ent_enable_prop(e, Prop_Smg);
e->primary_fire_delay = 1.0f / 10.0f;
e->secondary_fire_delay = 1.0f / 10.0f;
@ -52,11 +52,11 @@ Entity *SpawnTestLauncher(Entity *parent)
Entity *e = sim_ent_acquire_sync_src(parent);
e->sprite = S_TagFromPath(Lit("sprite/gun.ase"));
sim_ent_enable_prop(e, SEPROP_ATTACHED);
sim_ent_enable_prop(e, Prop_Attached);
e->attach_slice = Lit("attach.wep");
e->layer = SIM_LAYER_RELATIVE_WEAPON;
sim_ent_enable_prop(e, SEPROP_WEAPON_LAUNCHER);
sim_ent_enable_prop(e, Prop_Launcher);
e->primary_fire_delay = 1.0f / 10.0f;
e->secondary_fire_delay = 1.0f / 10.0f;
@ -68,11 +68,11 @@ Entity *SpawnTestChucker(Entity *parent)
Entity *chucker = sim_ent_acquire_sync_src(parent);
chucker->sprite = S_TagFromPath(Lit("sprite/gun.ase"));
sim_ent_enable_prop(chucker, SEPROP_ATTACHED);
sim_ent_enable_prop(chucker, Prop_Attached);
chucker->attach_slice = Lit("attach.wep");
chucker->layer = SIM_LAYER_RELATIVE_WEAPON;
sim_ent_enable_prop(chucker, SEPROP_WEAPON_CHUCKER);
sim_ent_enable_prop(chucker, Prop_Chucker);
chucker->primary_fire_delay = 1.0f / 10.0f;
chucker->secondary_fire_delay = 1.0f / 2.0f;
@ -80,12 +80,12 @@ Entity *SpawnTestChucker(Entity *parent)
{
Entity *zone = sim_ent_acquire_sync_src(chucker);
sim_ent_enable_prop(zone, SEPROP_CHUCKER_ZONE);
sim_ent_enable_prop(zone, Prop_ChuckerZone);
sim_ent_enable_prop(zone, SEPROP_ATTACHED);
sim_ent_enable_prop(zone, Prop_Attached);
zone->attach_slice = Lit("out");
sim_ent_enable_prop(zone, SEPROP_SENSOR);
sim_ent_enable_prop(zone, Prop_Sensor);
CLD_Shape collider = ZI;
collider.count = 2;
collider.points[1] = VEC2(0, -0.5);
@ -116,7 +116,7 @@ Entity *SpawnTestEmployee(Entity *parent)
f32 r = 0;
{
sim_ent_enable_prop(e, SEPROP_TEST);
sim_ent_enable_prop(e, Prop_Test);
e->sprite = S_TagFromPath(Lit("sprite/tim.ase"));
e->mass_unscaled = 10;
e->inertia_unscaled = 5;
@ -145,7 +145,7 @@ Entity *SpawnTestEmployee(Entity *parent)
sim_ent_enable_prop(e, SEPROP_LIGHT_TEST);
sim_ent_enable_prop(e, Prop_LightTest);
e->sprite_emittance = VEC3(1, 1, 1);
@ -160,8 +160,8 @@ Entity *SpawnTestEmployee(Entity *parent)
//e->control_torque = 5000;
e->control_torque = F32Infinity;
sim_ent_enable_prop(e, SEPROP_DYNAMIC);
sim_ent_enable_prop(e, SEPROP_SOLID);
sim_ent_enable_prop(e, Prop_Dynamic);
sim_ent_enable_prop(e, Prop_Solid);
employee = e;
}
@ -175,7 +175,7 @@ Entity *SpawnTestEmployee(Entity *parent)
Entity *e = SpawnTestChucker(employee);
employee->equipped = e->id;
sim_ent_enable_prop(e, SEPROP_LIGHT_TEST);
sim_ent_enable_prop(e, Prop_LightTest);
e->sprite_emittance = VEC3(1, 1, 1);
}
@ -189,8 +189,8 @@ Entity *SpawnTestCamera(Entity *parent, Entity *follow)
camera_ent = sim_ent_acquire_sync_src(parent);
sim_ent_set_xform(camera_ent, XformIdentity);
sim_ent_enable_prop(camera_ent, SEPROP_CAMERA);
sim_ent_enable_prop(camera_ent, SEPROP_CAMERA_ACTIVE);
sim_ent_enable_prop(camera_ent, Prop_Camera);
sim_ent_enable_prop(camera_ent, Prop_ActiveCamera);
camera_ent->camera_follow = follow->id;
f32 width = (f32)DEFAULT_CAMERA_WIDTH;
@ -206,11 +206,11 @@ Entity *SpawnTestExplosion(Entity *parent, Vec2 pos, f32 strength, f32 radius)
Entity *ent = sim_ent_acquire_sync_src(parent);
sim_ent_set_xform(ent, XformFromPos(pos));
sim_ent_enable_prop(ent, SEPROP_EXPLOSION);
sim_ent_enable_prop(ent, Prop_Explosion);
ent->explosion_strength = strength;
ent->explosion_radius = radius;
sim_ent_enable_prop(ent, SEPROP_SENSOR);
sim_ent_enable_prop(ent, Prop_Sensor);
ent->local_collider.count = 1;
ent->local_collider.radius = radius;
@ -259,11 +259,11 @@ void SpawnTestEntities2(Entity *parent, Vec2 pos)
//e->sprite_tint = Alpha32F(ColorBlue, 0.75);
//e->sprite_tint = Alpha32F(ColorWhite, 1);
sim_ent_enable_prop(e, SEPROP_SOLID);
sim_ent_enable_prop(e, Prop_Solid);
Quad collider_quad = QuadFromRect(RectFromScalar(-0.5, -0.5, 1, 1));
e->local_collider = CLD_ShapeFromQuad(collider_quad);
sim_ent_enable_prop(e, SEPROP_LIGHT_TEST);
sim_ent_enable_prop(e, Prop_LightTest);
/* FIXME: Remove this */
{
@ -275,7 +275,7 @@ void SpawnTestEntities2(Entity *parent, Vec2 pos)
e->sprite_tint = Rgba32F(r / 5, g / 5, b / 5, 1);
}
sim_ent_enable_prop(e, SEPROP_DYNAMIC);
sim_ent_enable_prop(e, Prop_Dynamic);
e->mass_unscaled = 50;
e->inertia_unscaled = 2;
#if 0
@ -299,9 +299,9 @@ void SpawnTestEntities2(Entity *parent, Vec2 pos)
e->sprite_collider_slice = Lit("shape");
e->layer = SIM_LAYER_SHOULDERS;
sim_ent_enable_prop(e, SEPROP_SOLID);
sim_ent_enable_prop(e, Prop_Solid);
sim_ent_enable_prop(e, SEPROP_DYNAMIC);
sim_ent_enable_prop(e, Prop_Dynamic);
e->mass_unscaled = 0.5;
e->inertia_unscaled = 1000;
e->linear_ground_friction = 0.001;
@ -328,7 +328,7 @@ void SpawnTestEntities3(Entity *parent, Vec2 pos)
e->sprite_tint = ColorRed;
sim_ent_enable_prop(e, SEPROP_SOLID);
sim_ent_enable_prop(e, Prop_Solid);
Quad collider_quad = QuadFromRect(RectFromScalar(-0.5, -0.5, 1, 1));
e->local_collider = CLD_ShapeFromQuad(collider_quad);
}
@ -350,7 +350,7 @@ void SpawnTestEntities4(Entity *parent, Vec2 pos)
e->sprite = S_TagFromPath(Lit("sprite/tile.ase"));
e->layer = SIM_LAYER_SHOULDERS;
sim_ent_enable_prop(e, SEPROP_LIGHT_TEST);
sim_ent_enable_prop(e, Prop_LightTest);
e->sprite_emittance = VEC3(2, 2, 2);
e->sprite_tint = Rgb32F(1, 1, 1);
@ -386,7 +386,7 @@ void SpawnTestTile(Snapshot *world, Vec2 world_pos)
S_EndScope(scope);
}
sim_ent_enable_prop(e, SEPROP_SOLID);
sim_ent_enable_prop(e, Prop_Solid);
Quad collider_quad = QuadFromRect(RectFromScalar(-tile_size.x / 2, -tile_size.y / 2, tile_size.y, tile_size.y));
e->local_collider = CLD_ShapeFromQuad(collider_quad);
#else
@ -401,7 +401,7 @@ void ClearLevelTest(SimStepCtx *ctx)
for (u64 j = 0; j < world->num_ents_reserved; ++j) {
Entity *ent = &world->ents[j];
if (ent->valid) {
sim_ent_enable_prop(ent, SEPROP_RELEASE);
sim_ent_enable_prop(ent, Prop_Release);
}
}
}
@ -450,13 +450,13 @@ void GenerateTestWalls(Snapshot *world)
for (u64 ent_index = 0; ent_index < world->num_ents_reserved; ++ent_index) {
Entity *ent = &world->ents[ent_index];
if (!ent->valid) continue;
if (sim_ent_has_prop(ent, SEPROP_TILE_CHUNK)) {
if (sim_ent_has_prop(ent, Prop_TileChunk)) {
/* Append chunk to array */
*PushStructNoZero(scratch.arena, Entity *) = ent;
++sorted_tile_chunks_count;
} else if (sim_ent_has_prop(ent, SEPROP_WALL)) {
} else if (sim_ent_has_prop(ent, Prop_Wall)) {
/* Release existing wall */
sim_ent_enable_prop(ent, SEPROP_RELEASE);
sim_ent_enable_prop(ent, Prop_Release);
}
}
y_sorted_tile_chunks = PushStructsNoZero(scratch.arena, Entity *, sorted_tile_chunks_count);
@ -664,7 +664,7 @@ void GenerateTestWalls(Snapshot *world)
/* Create wall entities */
for (struct wall_node *node = first_wall; node; node = node->next) {
Entity *wall_ent = sim_ent_acquire_sync_src(root);
sim_ent_enable_prop(wall_ent, SEPROP_WALL);
sim_ent_enable_prop(wall_ent, Prop_Wall);
Vec2 start = sim_pos_from_world_tile_index(node->start);
Vec2 end = sim_pos_from_world_tile_index(node->end);
@ -672,7 +672,7 @@ void GenerateTestWalls(Snapshot *world)
Xform xf = XformFromPos(start);
sim_ent_set_xform(wall_ent, xf);
sim_ent_enable_prop(wall_ent, SEPROP_SOLID);
sim_ent_enable_prop(wall_ent, Prop_Solid);
wall_ent->local_collider.count = 2;
wall_ent->local_collider.points[1] = SubVec2(end, start);
@ -699,7 +699,7 @@ PHYS_COLLISION_CALLBACK_FUNC_DEF(OnEntityCollision, data, step_ctx)
if (sim_ent_should_simulate(e0) && sim_ent_should_simulate(e1)) {
/* Bullet impact */
if (sim_ent_has_prop(e0, SEPROP_BULLET)) {
if (sim_ent_has_prop(e0, Prop_Bullet)) {
Vec2 normal = data->normal; /* Impact normal */
Vec2 vrel = data->vrel; /* Impact velocity */
@ -708,7 +708,7 @@ PHYS_COLLISION_CALLBACK_FUNC_DEF(OnEntityCollision, data, step_ctx)
Entity *src = sim_ent_from_id(world, bullet->bullet_src);
/* Process collision if bullet already spent or * target share same top level parent */
if (!bullet->bullet_has_hit && !sim_ent_id_eq(src->top, target->top) && sim_ent_has_prop(target, SEPROP_SOLID)) {
if (!bullet->bullet_has_hit && !sim_ent_id_eq(src->top, target->top) && sim_ent_has_prop(target, Prop_Solid)) {
Vec2 point = data->point;
/* Update tracer */
@ -741,7 +741,7 @@ PHYS_COLLISION_CALLBACK_FUNC_DEF(OnEntityCollision, data, step_ctx)
f32 angular_velocity_range = 5;
f32 angular_velocity = RandF64FromState(&step_ctx->rand, -angular_velocity_range, angular_velocity_range);
sim_ent_enable_prop(decal, SEPROP_KINEMATIC);
sim_ent_enable_prop(decal, Prop_Kinematic);
sim_ent_set_linear_velocity(decal, linear_velocity);
sim_ent_set_angular_velocity(decal, angular_velocity);
@ -756,12 +756,12 @@ PHYS_COLLISION_CALLBACK_FUNC_DEF(OnEntityCollision, data, step_ctx)
/* Update bullet */
bullet->bullet_has_hit = 1;
sim_ent_enable_prop(bullet, SEPROP_RELEASE);
sim_ent_enable_prop(bullet, Prop_Release);
}
}
/* Explosion blast collision */
if (sim_ent_has_prop(e0, SEPROP_EXPLOSION)) {
if (sim_ent_has_prop(e0, Prop_Explosion)) {
Entity *exp = e0;
Entity *victim = e1;
@ -800,8 +800,8 @@ PHYS_COLLISION_CALLBACK_FUNC_DEF(OnEntityCollision, data, step_ctx)
}
/* Chucker zone */
if (sim_ent_has_prop(e0, SEPROP_CHUCKER_ZONE)) {
if (!sim_ent_id_eq(e0->top, e1->top) && sim_ent_has_prop(e1, SEPROP_SOLID)) {
if (sim_ent_has_prop(e0, Prop_ChuckerZone)) {
if (!sim_ent_id_eq(e0->top, e1->top) && sim_ent_has_prop(e1, Prop_Solid)) {
e0->chucker_zone_ent = e1->id;
e0->chucker_zone_ent_tick = world->tick;
}
@ -855,7 +855,7 @@ void StepSim(SimStepCtx *ctx)
/* FIXME: Player never released upon disconnect */
player = sim_ent_acquire_sync_src(root);
player->player_client_handle = client->handle;
sim_ent_enable_prop(player, SEPROP_PLAYER);
sim_ent_enable_prop(player, Prop_Player);
player->predictor = player->id;
sim_ent_activate(player, world->tick);
client->player_id = player->id;
@ -864,9 +864,9 @@ void StepSim(SimStepCtx *ctx)
world_client->player_id = player->id;
world->local_player = player->id;
player->owner = player->id;
sim_ent_enable_prop(player, SEPROP_PLAYER_IS_MASTER);
sim_ent_enable_prop(player, Prop_IsMaster);
}
P_LogInfoF("Created player with id %F for sim client %F. is_master: %F", FmtUid(player->id.uid), FmtHandle(client->handle), FmtUint(sim_ent_has_prop(player, SEPROP_PLAYER_IS_MASTER)));
P_LogInfoF("Created player with id %F for sim client %F. is_master: %F", FmtUid(player->id.uid), FmtHandle(client->handle), FmtUint(sim_ent_has_prop(player, Prop_IsMaster)));
}
/* Update rtt */
@ -889,16 +889,16 @@ void StepSim(SimStepCtx *ctx)
/* Mark all incoming ents as sync dsts */
for (u64 i = 0; i < world->num_ents_reserved; ++i) {
Entity *ent = &world->ents[i];
if (ent->valid && sim_ent_has_prop(ent, SEPROP_SYNC_SRC) && !sim_ent_id_eq(ent->owner, world_client->player_id)) {
sim_ent_disable_prop(ent, SEPROP_SYNC_SRC);
sim_ent_enable_prop(ent, SEPROP_SYNC_DST);
if (ent->valid && sim_ent_has_prop(ent, Prop_SyncSrc) && !sim_ent_id_eq(ent->owner, world_client->player_id)) {
sim_ent_disable_prop(ent, Prop_SyncSrc);
sim_ent_enable_prop(ent, Prop_SyncDst);
}
}
/* Mark incoming cmds with correct client */
for (u64 i = 0; i < world->num_ents_reserved; ++i) {
Entity *ent = &world->ents[i];
if (ent->valid && sim_ent_has_prop(ent, SEPROP_CMD) && sim_ent_has_prop(ent, SEPROP_SYNC_DST)) {
if (ent->valid && sim_ent_has_prop(ent, Prop_Cmd) && sim_ent_has_prop(ent, Prop_SyncDst)) {
ent->cmd_player = ent->owner;
}
}
@ -907,9 +907,9 @@ void StepSim(SimStepCtx *ctx)
if (!is_master) {
for (u64 i = 0; i < world->num_ents_reserved; ++i) {
Entity *ent = &world->ents[i];
if (sim_ent_is_valid_and_active(ent) && sim_ent_has_prop(ent, SEPROP_CMD)) {
if (sim_ent_is_valid_and_active(ent) && sim_ent_has_prop(ent, Prop_Cmd)) {
if (!sim_ent_id_is_nil(ent->cmd_player) && sim_ent_id_eq(ent->cmd_player, world->local_player)) {
sim_ent_enable_prop(ent, SEPROP_SYNC_SRC);
sim_ent_enable_prop(ent, Prop_SyncSrc);
}
}
}
@ -919,7 +919,7 @@ void StepSim(SimStepCtx *ctx)
//- Release entities at beginning of frame
sim_ent_release_all_with_prop(world, SEPROP_RELEASE);
sim_ent_release_all_with_prop(world, Prop_Release);
ResetSimAccel(world, ctx->accel);
@ -928,9 +928,9 @@ void StepSim(SimStepCtx *ctx)
for (u64 ent_index = 0; ent_index < world->num_ents_reserved; ++ent_index) {
Entity *ent = &world->ents[ent_index];
if (!ent->valid) continue;
if (sim_ent_has_prop(ent, SEPROP_SYNC_DST) && !sim_ent_is_owner(ent) && !sim_ent_should_predict(ent)) continue;
if (sim_ent_has_prop(ent, Prop_SyncDst) && !sim_ent_is_owner(ent) && !sim_ent_should_predict(ent)) continue;
if (!sim_ent_has_prop(ent, SEPROP_ACTIVE)) {
if (!sim_ent_has_prop(ent, Prop_Active)) {
u64 atick = ent->activation_tick;
if (atick != 0 || world->tick >= atick) {
sim_ent_activate(ent, world->tick);
@ -945,7 +945,7 @@ void StepSim(SimStepCtx *ctx)
Entity *cmd_ent = &world->ents[ent_index];
if (!is_master && !sim_ent_should_simulate(cmd_ent)) continue;
if (sim_ent_has_prop(cmd_ent, SEPROP_CMD)) {
if (sim_ent_has_prop(cmd_ent, Prop_Cmd)) {
Entity *player = sim_ent_from_id(world, cmd_ent->cmd_player);
if (sim_ent_should_simulate(player)) {
b32 persist_cmd = 0;
@ -992,7 +992,7 @@ void StepSim(SimStepCtx *ctx)
if (flags & SIM_CONTROL_FLAG_DELETE) {
Entity *ent = sim_ent_from_id(world, player->player_hovered_ent);
if (ent->valid) {
sim_ent_enable_prop(ent, SEPROP_RELEASE);
sim_ent_enable_prop(ent, Prop_Release);
}
}
if (flags & SIM_CONTROL_FLAG_CLEAR_ALL) {
@ -1062,7 +1062,7 @@ void StepSim(SimStepCtx *ctx)
String msg = sim_data_from_key(sim_data_store, msg_key);
if (msg.len > 0) {
Entity *chat_ent = sim_ent_acquire_sync_src(root);
sim_ent_enable_prop(chat_ent, SEPROP_CHAT);
sim_ent_enable_prop(chat_ent, Prop_CHAT);
chat_ent->chat_player = player->id;
chat_ent->chat_msg = msg_key;
}
@ -1078,7 +1078,7 @@ void StepSim(SimStepCtx *ctx)
/* Release cmd */
if (!persist_cmd) {
sim_ent_enable_prop(cmd_ent, SEPROP_RELEASE);
sim_ent_enable_prop(cmd_ent, Prop_Release);
}
}
}
@ -1091,7 +1091,7 @@ void StepSim(SimStepCtx *ctx)
Entity *ent = &world->ents[ent_index];
if (!sim_ent_should_simulate(ent)) continue;
if (sim_ent_has_prop(ent, SEPROP_CONTROLLED)) {
if (sim_ent_has_prop(ent, Prop_Controlled)) {
Entity *player = sim_ent_from_id(world, ent->controlling_player);
if (player->valid) {
ent->control = player->player_control;
@ -1106,13 +1106,13 @@ void StepSim(SimStepCtx *ctx)
for (u64 i = 0; i < world->num_ents_reserved; ++i) {
Entity *ent = &world->ents[i];
if (!sim_ent_should_simulate(ent)) continue;
if (sim_ent_has_prop(ent, SEPROP_PLAYER)) {
if (sim_ent_has_prop(ent, Prop_Player)) {
/* FIXME: Ents never released when client disconnects */
Entity *control_ent = sim_ent_from_id(world, ent->player_control_ent);
if (!control_ent->valid) {
control_ent = SpawnTestEmployee(root);
control_ent->predictor = ent->id;
sim_ent_enable_prop(control_ent, SEPROP_CONTROLLED);
sim_ent_enable_prop(control_ent, Prop_Controlled);
ent->player_control_ent = control_ent->id;
control_ent->controlling_player = ent->id;
}
@ -1197,7 +1197,7 @@ void StepSim(SimStepCtx *ctx)
/* Test collider */
#if 0
if (sim_ent_has_prop(ent, SEPROP_TEST)) {
if (sim_ent_has_prop(ent, Prop_Test)) {
//if ((1)) {
#if 0
ent->local_collider.points[0] = VEC2(0, 0);
@ -1237,7 +1237,7 @@ void StepSim(SimStepCtx *ctx)
for (u64 ent_index = 0; ent_index < world->num_ents_reserved; ++ent_index) {
Entity *ent = &world->ents[ent_index];
if (!sim_ent_should_simulate(ent)) continue;
if (!sim_ent_has_prop(ent, SEPROP_ATTACHED)) continue;
if (!sim_ent_has_prop(ent, Prop_Attached)) continue;
Entity *parent = sim_ent_from_id(world, ent->parent);
S_Tag parent_sprite = parent->sprite;
@ -1262,7 +1262,7 @@ void StepSim(SimStepCtx *ctx)
Entity *ent = &world->ents[ent_index];
if (!sim_ent_should_simulate(ent)) continue;
if (sim_ent_has_prop(ent, SEPROP_CONTROLLED)) {
if (sim_ent_has_prop(ent, Prop_Controlled)) {
ControlData *control = &ent->control;
ControlFlag flags = control->flags;
if (flags & SIM_CONTROL_FLAG_FIRE) {
@ -1313,7 +1313,7 @@ void StepSim(SimStepCtx *ctx)
}
/* Fire smg */
if (sim_ent_has_prop(ent, SEPROP_WEAPON_SMG)) {
if (sim_ent_has_prop(ent, Prop_Smg)) {
if (primary_triggered) {
S_Tag sprite = ent->sprite;
u32 animation_frame = ent->animation_frame;
@ -1328,7 +1328,7 @@ void StepSim(SimStepCtx *ctx)
{
bullet = sim_ent_acquire_sync_src(root);
sim_ent_enable_prop(bullet, SEPROP_BULLET);
sim_ent_enable_prop(bullet, Prop_Bullet);
bullet->bullet_src = ent->id;
bullet->bullet_src_pos = rel_pos;
bullet->bullet_src_dir = rel_dir;
@ -1352,7 +1352,7 @@ void StepSim(SimStepCtx *ctx)
Entity *tracer = sim_ent_acquire_sync_src(root);
tracer->tracer_fade_duration = 0.025f;
tracer->layer = SIM_LAYER_TRACERS;
sim_ent_enable_prop(tracer, SEPROP_TRACER);
sim_ent_enable_prop(tracer, Prop_Tracer);
bullet->bullet_tracer = tracer->id;
}
@ -1360,7 +1360,7 @@ void StepSim(SimStepCtx *ctx)
}
/* Fire launcher */
if (sim_ent_has_prop(ent, SEPROP_WEAPON_LAUNCHER)) {
if (sim_ent_has_prop(ent, Prop_Launcher)) {
if (primary_triggered) {
S_Tag sprite = ent->sprite;
u32 animation_frame = ent->animation_frame;
@ -1375,7 +1375,7 @@ void StepSim(SimStepCtx *ctx)
{
bullet = sim_ent_acquire_sync_src(root);
sim_ent_enable_prop(bullet, SEPROP_BULLET);
sim_ent_enable_prop(bullet, Prop_Bullet);
bullet->bullet_src = ent->id;
bullet->bullet_src_pos = rel_pos;
bullet->bullet_src_dir = rel_dir;
@ -1398,7 +1398,7 @@ void StepSim(SimStepCtx *ctx)
Entity *tracer = sim_ent_acquire_sync_src(root);
tracer->tracer_fade_duration = 0.025f;
tracer->layer = SIM_LAYER_TRACERS;
sim_ent_enable_prop(tracer, SEPROP_TRACER);
sim_ent_enable_prop(tracer, Prop_Tracer);
bullet->bullet_tracer = tracer->id;
}
@ -1406,7 +1406,7 @@ void StepSim(SimStepCtx *ctx)
}
/* Fire chucker */
if (sim_ent_has_prop(ent, SEPROP_WEAPON_CHUCKER)) {
if (sim_ent_has_prop(ent, Prop_Chucker)) {
if (primary_triggered) {
}
if (secondary_triggered) {
@ -1416,13 +1416,13 @@ void StepSim(SimStepCtx *ctx)
if (sim_ent_is_valid_and_active(target) && zone->chucker_zone_ent_tick == world->tick - 1) {
if (!sim_ent_id_eq(old_joint_ent->weld_joint_data.e1, target->id)) {
Entity *joint_ent = sim_ent_acquire_sync_src(root);
sim_ent_enable_prop(joint_ent, SEPROP_ACTIVE);
sim_ent_enable_prop(joint_ent, Prop_Active);
Xform xf0 = sim_ent_get_xform(ent);
Xform xf1 = sim_ent_get_xform(target);
Xform xf0_to_xf1 = MulXform(InvertXform(xf0), xf1);
sim_ent_enable_prop(joint_ent, SEPROP_WELD_JOINT);
sim_ent_enable_prop(joint_ent, Prop_WeldJoint);
WeldJointDesc def = phys_weld_joint_def_init();
def.e0 = ent->id;
def.e1 = target->id;
@ -1436,8 +1436,8 @@ void StepSim(SimStepCtx *ctx)
}
}
if (old_joint_ent->valid) {
sim_ent_enable_prop(old_joint_ent, SEPROP_RELEASE);
sim_ent_disable_prop(old_joint_ent, SEPROP_ACTIVE);
sim_ent_enable_prop(old_joint_ent, Prop_Release);
sim_ent_disable_prop(old_joint_ent, Prop_Active);
}
}
}
@ -1450,18 +1450,18 @@ void StepSim(SimStepCtx *ctx)
Entity *ent = &world->ents[ent_index];
if (!sim_ent_should_simulate(ent)) continue;
if (sim_ent_has_prop(ent, SEPROP_CONTROLLED)) {
if (sim_ent_has_prop(ent, Prop_Controlled)) {
Entity *joint_ent = sim_ent_from_id(world, ent->move_joint);
if (is_master && !sim_ent_is_valid_and_active(joint_ent)) {
joint_ent = sim_ent_acquire_sync_src(root);
joint_ent->predictor = ent->predictor;
joint_ent->mass_unscaled = F32Infinity;
joint_ent->inertia_unscaled = F32Infinity;
sim_ent_enable_prop(joint_ent, SEPROP_ACTIVE);
sim_ent_enable_prop(joint_ent, SEPROP_KINEMATIC);
sim_ent_enable_prop(joint_ent, Prop_Active);
sim_ent_enable_prop(joint_ent, Prop_Kinematic);
ent->move_joint = joint_ent->id;
sim_ent_enable_prop(joint_ent, SEPROP_MOTOR_JOINT);
sim_ent_enable_prop(joint_ent, Prop_MotorJoint);
MotorJointDesc def = phys_motor_joint_def_init();
def.e0 = joint_ent->id; /* Re-using joint entity as e0 */
def.e1 = ent->id;
@ -1486,7 +1486,7 @@ void StepSim(SimStepCtx *ctx)
Entity *ent = &world->ents[ent_index];
if (!sim_ent_should_simulate(ent)) continue;
if (sim_ent_has_prop(ent, SEPROP_CONTROLLED)) {
if (sim_ent_has_prop(ent, Prop_Controlled)) {
Xform xf = sim_ent_get_xform(ent);
Xform sprite_xf = MulXform(xf, ent->sprite_local_xform);
@ -1497,9 +1497,9 @@ void StepSim(SimStepCtx *ctx)
joint_ent->predictor = ent->predictor;
joint_ent->mass_unscaled = F32Infinity;
joint_ent->inertia_unscaled = F32Infinity;
sim_ent_enable_prop(joint_ent, SEPROP_KINEMATIC); /* Since we'll be setting velocity manually */
sim_ent_enable_prop(joint_ent, SEPROP_MOTOR_JOINT);
sim_ent_enable_prop(joint_ent, SEPROP_ACTIVE);
sim_ent_enable_prop(joint_ent, Prop_Kinematic); /* Since we'll be setting velocity manually */
sim_ent_enable_prop(joint_ent, Prop_MotorJoint);
sim_ent_enable_prop(joint_ent, Prop_Active);
ent->aim_joint = joint_ent->id;
MotorJointDesc def = phys_motor_joint_def_init();
@ -1582,7 +1582,7 @@ void StepSim(SimStepCtx *ctx)
for (u64 ent_index = 0; ent_index < world->num_ents_reserved; ++ent_index) {
Entity *ent = &world->ents[ent_index];
if (!sim_ent_should_simulate(ent)) continue;
if (!sim_ent_has_prop(ent, SEPROP_DYNAMIC)) continue;
if (!sim_ent_has_prop(ent, Prop_Dynamic)) continue;
Entity *joint_ent = sim_ent_from_id(world, ent->ground_friction_joint);
@ -1596,8 +1596,8 @@ void StepSim(SimStepCtx *ctx)
if (is_master && !sim_ent_is_valid_and_active(joint_ent)) {
joint_ent = sim_ent_acquire_sync_src(root);
joint_ent->predictor = ent->predictor;
sim_ent_enable_prop(joint_ent, SEPROP_MOTOR_JOINT);
sim_ent_enable_prop(joint_ent, SEPROP_ACTIVE);
sim_ent_enable_prop(joint_ent, Prop_MotorJoint);
sim_ent_enable_prop(joint_ent, Prop_Active);
joint_ent->motor_joint_data = phys_motor_joint_from_def(def);
ent->ground_friction_joint = joint_ent->id;
}
@ -1612,7 +1612,7 @@ void StepSim(SimStepCtx *ctx)
for (u64 i = 0; i < world->num_ents_reserved; ++i) {
Entity *player = &world->ents[i];
if (!sim_ent_should_simulate(player)) continue;
if (!sim_ent_has_prop(player, SEPROP_PLAYER)) continue;
if (!sim_ent_has_prop(player, Prop_Player)) continue;
Vec2 cursor = player->player_cursor_pos;
b32 start_dragging = player->player_dbg_drag_start;
@ -1634,8 +1634,8 @@ void StepSim(SimStepCtx *ctx)
joint_ent->mass_unscaled = F32Infinity;
joint_ent->inertia_unscaled = F32Infinity;
player->player_dbg_drag_joint_ent = joint_ent->id;
sim_ent_enable_prop(joint_ent, SEPROP_MOUSE_JOINT);
sim_ent_enable_prop(joint_ent, SEPROP_ACTIVE);
sim_ent_enable_prop(joint_ent, Prop_MouseJoint);
sim_ent_enable_prop(joint_ent, Prop_Active);
}
Xform xf = sim_ent_get_xform(target_ent);
@ -1675,10 +1675,10 @@ void StepSim(SimStepCtx *ctx)
for (u64 ent_index = 0; ent_index < world->num_ents_reserved; ++ent_index) {
Entity *ent = &world->ents[ent_index];
if (!sim_ent_should_simulate(ent)) continue;
if (!sim_ent_has_prop(ent, SEPROP_EXPLOSION)) continue;
if (!sim_ent_has_prop(ent, Prop_Explosion)) continue;
/* Explosion doesn't need to generate any more collisions after initial physics step */
sim_ent_disable_prop(ent, SEPROP_SENSOR);
sim_ent_disable_prop(ent, Prop_Sensor);
}
@ -1687,7 +1687,7 @@ void StepSim(SimStepCtx *ctx)
for (u64 ent_index = 0; ent_index < world->num_ents_reserved; ++ent_index) {
Entity *ent = &world->ents[ent_index];
if (!sim_ent_should_simulate(ent)) continue;
if (!sim_ent_has_prop(ent, SEPROP_TRACER)) continue;
if (!sim_ent_has_prop(ent, Prop_Tracer)) continue;
Vec2 end = sim_ent_get_xform(ent).og;
@ -1697,7 +1697,7 @@ void StepSim(SimStepCtx *ctx)
if (DotVec2(tick_velocity, SubVec2(gradient_start, end)) > 0) {
/* Tracer has disappeared */
sim_ent_enable_prop(ent, SEPROP_RELEASE);
sim_ent_enable_prop(ent, Prop_Release);
}
ent->tracer_gradient_start = gradient_start;
@ -1710,15 +1710,15 @@ void StepSim(SimStepCtx *ctx)
for (u64 ent_index = 0; ent_index < world->num_ents_reserved; ++ent_index) {
Entity *ent = &world->ents[ent_index];
if (!sim_ent_should_simulate(ent)) continue;
if (!sim_ent_has_prop(ent, SEPROP_BULLET)) continue;
if (!sim_ent_has_prop(ent, Prop_Bullet)) continue;
if (ent->activation_tick == world->tick) {
Entity *src = sim_ent_from_id(world, ent->bullet_src);
Xform src_xf = sim_ent_get_xform(src);
/* Activate collision */
sim_ent_enable_prop(ent, SEPROP_SENSOR);
sim_ent_enable_prop(ent, SEPROP_TOI);
sim_ent_enable_prop(ent, Prop_Sensor);
sim_ent_enable_prop(ent, Prop_Toi);
Vec2 pos = MulXformV2(src_xf, ent->bullet_src_pos);
Vec2 vel = MulXformBasisV2(src_xf, ent->bullet_src_dir);
@ -1736,14 +1736,14 @@ void StepSim(SimStepCtx *ctx)
Xform xf = XformFromTrs(TRS(.t = pos, .r = AngleFromVec2(vel) + Pi / 2));
sim_ent_set_xform(ent, xf);
sim_ent_enable_prop(ent, SEPROP_KINEMATIC);
sim_ent_enable_prop(ent, Prop_Kinematic);
sim_ent_set_linear_velocity(ent, vel);
/* Initialize tracer */
Entity *tracer = sim_ent_from_id(world, ent->bullet_tracer);
if (sim_ent_should_simulate(tracer)) {
sim_ent_set_xform(tracer, xf);
sim_ent_enable_prop(tracer, SEPROP_KINEMATIC);
sim_ent_enable_prop(tracer, Prop_Kinematic);
sim_ent_set_linear_velocity(tracer, ent->linear_velocity);
tracer->tracer_start = pos;
tracer->tracer_start_velocity = ent->linear_velocity;
@ -1757,7 +1757,7 @@ void StepSim(SimStepCtx *ctx)
sim_ent_set_xform(quake, XformFromPos(pos));
quake->quake_intensity = 0.2f;
quake->quake_fade = quake->quake_intensity / 0.1f;
sim_ent_enable_prop(quake, SEPROP_QUAKE);
sim_ent_enable_prop(quake, Prop_Quake);
}
}
}
@ -1768,7 +1768,7 @@ void StepSim(SimStepCtx *ctx)
for (u64 ent_index = 0; ent_index < world->num_ents_reserved; ++ent_index) {
Entity *ent = &world->ents[ent_index];
if (!sim_ent_should_simulate(ent)) continue;
if (!sim_ent_has_prop(ent, SEPROP_CAMERA)) continue;
if (!sim_ent_has_prop(ent, Prop_Camera)) continue;
Xform xf = sim_ent_get_xform(ent);
@ -1809,7 +1809,7 @@ void StepSim(SimStepCtx *ctx)
for (u64 quake_ent_index = 0; quake_ent_index < world->num_ents_reserved; ++quake_ent_index) {
Entity *quake = &world->ents[quake_ent_index];
if (!sim_ent_should_simulate(quake)) continue;
if (!sim_ent_has_prop(quake, SEPROP_QUAKE)) continue;
if (!sim_ent_has_prop(quake, Prop_Quake)) continue;
ent->shake += quake->quake_intensity;
}
}
@ -1823,11 +1823,11 @@ void StepSim(SimStepCtx *ctx)
for (u64 ent_index = 0; ent_index < world->num_ents_reserved; ++ent_index) {
Entity *ent = &world->ents[ent_index];
if (!sim_ent_should_simulate(ent)) continue;
if (!sim_ent_has_prop(ent, SEPROP_QUAKE)) continue;
if (!sim_ent_has_prop(ent, Prop_Quake)) continue;
ent->quake_intensity = MaxF32(0, ent->quake_intensity - (ent->quake_fade * sim_dt));
if (ent->quake_intensity <= 0) {
sim_ent_enable_prop(ent, SEPROP_RELEASE);
sim_ent_enable_prop(ent, Prop_Release);
}
}
@ -1862,7 +1862,7 @@ void StepSim(SimStepCtx *ctx)
//- Release entities at end of frame
sim_ent_release_all_with_prop(world, SEPROP_RELEASE);
sim_ent_release_all_with_prop(world, Prop_Release);
//- Sync to publish client
@ -1878,8 +1878,8 @@ void StepSim(SimStepCtx *ctx)
for (u64 ent_index = 2; ent_index < pub_world->num_ents_reserved; ++ent_index) {
Entity *ent = &pub_world->ents[ent_index];
if (ent->valid) {
sim_ent_enable_prop(ent, SEPROP_SYNC_DST);
sim_ent_enable_prop(ent, SEPROP_SYNC_SRC);
sim_ent_enable_prop(ent, Prop_SyncDst);
sim_ent_enable_prop(ent, Prop_SyncSrc);
}
}