From 003bdb2d55f21c0d3b99e7879baec6daf7fab70c Mon Sep 17 00:00:00 2001 From: jacob Date: Fri, 6 Feb 2026 02:51:13 -0600 Subject: [PATCH] 'dummy' -> 'bot' --- src/base/base.cgh | 1 + src/base/base_math.c | 20 ++++++++++++++----- src/base/base_math.h | 8 +++++--- src/base/base_rand.c | 4 ++-- src/base/base_shader.gh | 27 ++++++++++++++++++++++++++ src/base/base_util.h | 9 --------- src/meta/meta.c | 1 + src/pp/pp.c | 6 +++--- src/pp/pp.h | 4 ++-- src/pp/pp_shared.cgh | 2 +- src/pp/pp_sim/pp_sim_core.c | 38 ++++++++++++++++++------------------- src/pp/pp_transcode.c | 8 ++++---- src/pp/pp_vis/pp_vis_core.c | 14 +++++++------- src/pp/pp_vis/pp_vis_core.h | 4 ++-- src/pp/pp_vis/pp_vis_gpu.g | 38 ++++++++++++++++++------------------- src/proto/proto_shaders.g | 2 +- 16 files changed, 108 insertions(+), 78 deletions(-) diff --git a/src/base/base.cgh b/src/base/base.cgh index 0701619e..fe0cc583 100644 --- a/src/base/base.cgh +++ b/src/base/base.cgh @@ -493,6 +493,7 @@ typedef uint u32; typedef uint64_t u64; typedef float f32; + typedef double f64; typedef bool b32; // bool has 32-bit size & alignment in HLSL #endif diff --git a/src/base/base_math.c b/src/base/base_math.c index 1adc9e80..63122e0c 100644 --- a/src/base/base_math.c +++ b/src/base/base_math.c @@ -52,16 +52,26 @@ i32 SignF64(f64 v) return (v >= 0) - (v < 0); } -//- Norm +//- Normalize -f32 NormU32(u32 v) +f32 Norm8(u32 v) { - return (f32)(v & (((u32)1 << 24) - 1)) / (f32)((u32)1 << 24); + return (v & 0xFF) / (f32)0x1FF; } -f64 NormU64(u64 v) +f32 Norm16(u32 v) { - return (f64)(v & (((u64)1 << 53) - 1)) / (f64)((u64)1 << 53); + return (v & 0xFFFF) / (f32)0x10000; +} + +f32 Norm24(u32 v) +{ + return (v & 0xFFFFFF) / (f32)0x1000000; +} + +f64 Norm53(u64 v) +{ + return (v & 0x1FFFFFFFFFFFFFull) / (f64)0x20000000000000ull; } //////////////////////////////////////////////////////////// diff --git a/src/base/base_math.h b/src/base/base_math.h index edada1f0..fd2f106c 100644 --- a/src/base/base_math.h +++ b/src/base/base_math.h @@ -261,9 +261,11 @@ f64 SaturateF64(f64 v); i32 SignF32(f32 v); i32 SignF64(f64 v); -//- Norm -f32 NormU32(u32 v); -f64 NormU64(u64 v); +//- Normalize +f32 Norm8(u32 v); +f32 Norm16(u32 v); +f32 Norm24(u32 v); +f64 Norm53(u64 v); //////////////////////////////////////////////////////////// //~ Exponential ops diff --git a/src/base/base_rand.c b/src/base/base_rand.c index d44bebbf..cb2339c9 100644 --- a/src/base/base_rand.c +++ b/src/base/base_rand.c @@ -11,10 +11,10 @@ u64 RandU64FromState(RandState *state) f32 RandF32FromState(RandState *state, f32 range_start, f32 range_end) { - return range_start + (range_end - range_start) * NormU32(RandU64FromState(state)); + return range_start + (range_end - range_start) * Norm24(RandU64FromState(state)); } f64 RandF64FromState(RandState *state, f64 range_start, f64 range_end) { - return range_start + (range_end - range_start) * NormU64(RandU64FromState(state)); + return range_start + (range_end - range_start) * Norm53(RandU64FromState(state)); } diff --git a/src/base/base_shader.gh b/src/base/base_shader.gh index 9d2f3f47..d7eec125 100644 --- a/src/base/base_shader.gh +++ b/src/base/base_shader.gh @@ -108,6 +108,33 @@ u32 countof(T arr[N]) #define SmoothstepF32 (f32)smoothstep #define SmoothstepF64 (f64)smoothstep +//////////////////////////////////////////////////////////// +//~ Float ops + +//- Normalize + +Inline f32 Norm8(u32 v) +{ + return (v & 0xFF) / (f32)0x1FF; +} + +Inline f32 Norm16(u32 v) +{ + return (v & 0xFFFF) / (f32)0x10000; +} + +Inline f32 Norm24(u32 v) +{ + return (v & 0xFFFFFF) / (f32)0x1000000; +} + +Inline f64 Norm53(u64 v) +{ + return (v & 0x1FFFFFFFFFFFFFull) / (f64)0x20000000000000ull; +} + +//- Match floor + #define MatchFloor(a, b) all(floor(a) == floor(b)) //////////////////////////////////////////////////////////// diff --git a/src/base/base_util.h b/src/base/base_util.h index 2eccf51c..75c4460c 100644 --- a/src/base/base_util.h +++ b/src/base/base_util.h @@ -104,15 +104,6 @@ Inline void Mergesort(void *items, u64 item_count, u64 item_size, MergesortCompa } } -//////////////////////////////////////////////////////////// -//~ Shuffle utils - -#define ShuffleStructs(ptr, count, seed) ShuffleStructs_((ptr), sizeof(*(ptr)), (count), (seed)) -Inline void ShuffleStructs_(void *items, u64 item_count, u64 item_size, u64 seed) -{ - -} - //////////////////////////////////////////////////////////// //~ Dict utils diff --git a/src/meta/meta.c b/src/meta/meta.c index 0e59b1c6..d4b8e2e7 100644 --- a/src/meta/meta.c +++ b/src/meta/meta.c @@ -436,6 +436,7 @@ void M_BuildEntryPoint(WaveLaneCtx *lane) // Disable warnings PushStringToList(perm, &cp.warnings_dxc, Lit("-Wno-unused-variable")); + PushStringToList(perm, &cp.warnings_dxc, Lit("-Wno-conversion")); } } diff --git a/src/pp/pp.c b/src/pp/pp.c index 4b746229..601e51cf 100644 --- a/src/pp/pp.c +++ b/src/pp/pp.c @@ -1589,7 +1589,7 @@ void P_StepFrame(P_Frame *frame) if (!ignore_spawn) { f32 rand_score_spread = 5; - f32 virtual_score = spawn->score + rand_score_spread * NormU32(RandU64FromState(&world->rand)); + f32 virtual_score = spawn->score + rand_score_spread * Norm24(RandU64FromState(&world->rand)); if (virtual_score > highest_score) { highest_score = virtual_score; @@ -2457,8 +2457,8 @@ void P_StepFrame(P_Frame *frame) bullet->is_bullet = 1; bullet->key = P_RandKey(); - f32 rand_speed = ((f32)P_RandU64FromEnt(firer) / (f32)0xFFFFFFFFFFFFFFFFull) - 0.5; - f32 rand_angle = ((f32)P_RandU64FromEnt(firer) / (f32)0xFFFFFFFFFFFFFFFFull) - 0.5; + f32 rand_speed = Norm24(P_RandU64FromEnt(firer)) - 0.5; + f32 rand_angle = Norm24(P_RandU64FromEnt(firer)) - 0.5; f32 speed = tweak_speed * sim_dt; f32 angle = AngleFromVec2(fire_dir); diff --git a/src/pp/pp.h b/src/pp/pp.h index 40cbcbc3..c7d6376f 100644 --- a/src/pp/pp.h +++ b/src/pp/pp.h @@ -108,7 +108,7 @@ Struct(P_Ent) f32 exists; b32 is_guy; - b32 is_dummy; + b32 is_bot; f32 health; Xform xf; @@ -325,7 +325,7 @@ Struct(P_Msg) NET_Key src; NET_Key dst; - b32 affect_dummies; + b32 affect_bots; P_PrefabKind prefab; P_Key key; diff --git a/src/pp/pp_shared.cgh b/src/pp/pp_shared.cgh index bab2fb02..9cf5e9ab 100644 --- a/src/pp/pp_shared.cgh +++ b/src/pp/pp_shared.cgh @@ -36,7 +36,7 @@ Enum(P_TileKind) #define P_PrefabsXList(X) \ X(None, P_PrefabFlag_HideFromEditor) \ X(Guy, P_PrefabFlag_None) \ - X(Dummy, P_PrefabFlag_None) \ + X(Bot, P_PrefabFlag_None) \ X(GuySpawn, P_PrefabFlag_None) \ /* --------------------------------------------------- */ diff --git a/src/pp/pp_sim/pp_sim_core.c b/src/pp/pp_sim/pp_sim_core.c index d5e4f51b..c789defe 100644 --- a/src/pp/pp_sim/pp_sim_core.c +++ b/src/pp/pp_sim/pp_sim_core.c @@ -412,23 +412,23 @@ void S_TickForever(WaveLaneCtx *lane) } ////////////////////////////// - //- Apply dummy controls + //- Apply bot controls { - b32 dummy_movement_enabled = TweakBool("Dummy movement enabled", 0); - for (P_Ent *dummy = P_FirstEnt(world_frame); !P_IsEntNil(dummy); dummy = P_NextEnt(dummy)) + b32 bot_movement_enabled = TweakBool("Bot movement enabled", 0); + for (P_Ent *bot = P_FirstEnt(world_frame); !P_IsEntNil(bot); bot = P_NextEnt(bot)) { - if (dummy->is_dummy) + if (bot->is_bot) { - if (dummy_movement_enabled) + if (bot_movement_enabled) { - i64 alive_time_ns = time_ns - dummy->created_at_ns; + i64 alive_time_ns = time_ns - bot->created_at_ns; i64 frequency_ns = NsFromSeconds(0.1); - dummy->control.move.y = SinF32((f64)alive_time_ns / (f64)frequency_ns); + bot->control.move.y = SinF32((f64)alive_time_ns / (f64)frequency_ns); } else { - ZeroStruct(&dummy->control.move); + ZeroStruct(&bot->control.move); } } } @@ -549,7 +549,7 @@ void S_TickForever(WaveLaneCtx *lane) // TODO: Real reset for (P_Ent *ent = P_FirstEnt(world_frame); !P_IsEntNil(ent); ent = P_NextEnt(ent)) { - if (!ent->is_player || (msg->affect_dummies && ent->is_dummy)) + if (!ent->is_player || (msg->affect_bots && ent->is_bot)) { ent->exists = 0; } @@ -572,25 +572,25 @@ void S_TickForever(WaveLaneCtx *lane) guy->has_weapon = 1; } break; - case P_PrefabKind_Dummy: + case P_PrefabKind_Bot: { - P_Ent *dummy = P_EntFromKey(world_frame, msg->key); - if (!dummy->is_dummy) + P_Ent *bot = P_EntFromKey(world_frame, msg->key); + if (!bot->is_bot) { - dummy = P_PushTempEnt(frame_arena, &ents); - dummy->key = msg->key; - dummy->is_player = 1; - dummy->is_dummy = 1; - P_SetEntString(dummy, name); + bot = P_PushTempEnt(frame_arena, &ents); + bot->key = msg->key; + bot->is_player = 1; + bot->is_bot = 1; + P_SetEntString(bot, Lit("Bot")); } - P_Ent *guy = P_EntFromKey(world_frame, dummy->guy); + P_Ent *guy = P_EntFromKey(world_frame, bot->guy); if (!guy->is_guy) { guy = P_PushTempEnt(frame_arena, &ents); guy->key = P_RandKey(); guy->is_guy = 1; guy->has_weapon = 1; - dummy->guy = guy->key; + bot->guy = guy->key; } guy->xf = msg->xf; } break; diff --git a/src/pp/pp_transcode.c b/src/pp/pp_transcode.c index 30fb92a2..299aedbb 100644 --- a/src/pp/pp_transcode.c +++ b/src/pp/pp_transcode.c @@ -42,9 +42,9 @@ String P_PackWorld(Arena *arena, P_World *src_world) { result.len += PushString(arena, Lit(" guy\n")).len; } - if (ent->is_dummy) + if (ent->is_bot) { - result.len += PushString(arena, Lit(" dummy\n")).len; + result.len += PushString(arena, Lit(" bot\n")).len; } if (ent->has_weapon) { @@ -150,9 +150,9 @@ P_UnpackedWorld P_UnpackWorld(Arena *arena, String packed) { ent->is_guy = 1; } - if (MatchString(prop->value, Lit("dummy"))) + if (MatchString(prop->value, Lit("bot"))) { - ent->is_dummy = 1; + ent->is_bot = 1; } if (MatchString(prop->value, Lit("has_weapon"))) { diff --git a/src/pp/pp_vis/pp_vis_core.c b/src/pp/pp_vis/pp_vis_core.c index f66b416d..d774b4be 100644 --- a/src/pp/pp_vis/pp_vis_core.c +++ b/src/pp/pp_vis/pp_vis_core.c @@ -4092,6 +4092,7 @@ void V_TickForever(WaveLaneCtx *lane) Vec2 cell_pos = MulAffineVec2(frame->af.world_to_cell, frame->world_cursor); i32 tile_idx = P_TileIdxFromTilePos(tile_pos); UI_BuildLabelF("Camera pos: %F", FmtFloat2(frame->camera_pos)); + UI_BuildLabelF("Camera zoom: %F", FmtFloat(frame->camera_zoom)); UI_BuildLabelF("Cursor world pos: %F", FmtFloat2(frame->world_cursor)); UI_BuildLabelF("Cursor tile pos: %F", FmtFloat2(tile_pos)); UI_BuildLabelF("Cursor tile idx: %F", FmtSint(tile_idx)); @@ -4512,7 +4513,7 @@ void V_TickForever(WaveLaneCtx *lane) if (kind == V_CmdKind_reset_world) { P_Msg *msg = P_PushMsg(P_MsgKind_ResetWorld, Zstr); - msg->affect_dummies = 1; + msg->affect_bots = 1; } else { @@ -4527,19 +4528,18 @@ void V_TickForever(WaveLaneCtx *lane) } } break; - case V_CmdKind_spawn_tp_dummy: - case V_CmdKind_spawn_dummy: + case V_CmdKind_spawn_tp_bot: + case V_CmdKind_spawn_bot: { P_Msg *msg = P_PushMsg(P_MsgKind_Prefab, Zstr); - msg->prefab = P_PrefabKind_Dummy; + msg->prefab = P_PrefabKind_Bot; msg->key = P_RandKey(); msg->xf.t = frame->world_cursor; - msg->data = Lit("Dummy"); - if (kind == V_CmdKind_spawn_tp_dummy) + if (kind == V_CmdKind_spawn_tp_bot) { for (P_Ent *ent = P_FirstEnt(local_frame); !P_IsEntNil(ent); ent = P_NextEnt(ent)) { - if (ent->is_dummy) + if (ent->is_bot) { msg->key = ent->key; break; diff --git a/src/pp/pp_vis/pp_vis_core.h b/src/pp/pp_vis/pp_vis_core.h index b6ebc544..bf79157c 100644 --- a/src/pp/pp_vis/pp_vis_core.h +++ b/src/pp/pp_vis/pp_vis_core.h @@ -14,8 +14,8 @@ X(toggle_fullscreen, Toggle Fullscreen Mode, V_CmdDescFlag_None, V_HOTKEY( Button_Enter, .alt = 1 ) ) \ X(toggle_window_topmost, Toggle Window Topmost, V_CmdDescFlag_None, V_HOTKEY( Button_F4 ), ) \ X(spawn_tp_player, Spawn/Teleport Player, V_CmdDescFlag_None, V_HOTKEY( Button_Q ), ) \ - X(spawn_tp_dummy, Spawn/Teleport Dummy, V_CmdDescFlag_None, V_HOTKEY( Button_T ), ) \ - X(spawn_dummy, Spawn Dummy, V_CmdDescFlag_None, V_HOTKEY( Button_T, .ctrl = 1 ), ) \ + X(spawn_tp_bot, Spawn/Teleport Bot, V_CmdDescFlag_None, V_HOTKEY( Button_T ), ) \ + X(spawn_bot, Spawn Bot, V_CmdDescFlag_None, V_HOTKEY( Button_T, .ctrl = 1 ), ) \ X(delete, Delete entity at cursor, V_CmdDescFlag_None, V_HOTKEY( Button_M2 ), ) \ X(reset_world, Reset world, V_CmdDescFlag_None, V_HOTKEY( Button_R, .ctrl = 1, .alt = 1 ), ) \ X(clear_particles, Clear particles, V_CmdDescFlag_None, V_HOTKEY( Button_C ), ) \ diff --git a/src/pp/pp_vis/pp_vis_gpu.g b/src/pp/pp_vis/pp_vis_gpu.g index 95869d1f..ac9c2000 100644 --- a/src/pp/pp_vis/pp_vis_gpu.g +++ b/src/pp/pp_vis/pp_vis_gpu.g @@ -6,7 +6,7 @@ f32 V_RandFromPos(Vec3 pos) Texture3D noise3d = G_Dereference(V_ShaderConst_NoiseTex); // TODO: Compile-time noise dims u32 noise = noise3d[(Vec3U32)pos % countof(noise3d)]; - f32 rand = (f32)noise / 0xFFFF; + f32 rand = Norm16(noise); return rand; } @@ -176,16 +176,16 @@ ComputeShader(V_SimParticlesCS, 64) u64 seed0 = MixU64(particle.seq); u64 seed1 = MixU64(seed0); - f32 rand_speed = (f32)((seed0 >> 0) & 0xFFFF) / (f32)0xFFFF; - f32 rand_angle = (f32)((seed0 >> 16) & 0xFFFF) / (f32)0xFFFF; - f32 rand_offset = (f32)((seed0 >> 32) & 0xFFFF) / (f32)0xFFFF; - f32 rand_falloff = (f32)((seed0 >> 48) & 0xFFFF) / (f32)0xFFFF; + f32 rand_speed = Norm16(seed0 >> 0); + f32 rand_angle = Norm16(seed0 >> 16); + f32 rand_offset = Norm16(seed0 >> 32); + f32 rand_falloff = Norm16(seed0 >> 48); - f32 rand_r = (f32)((seed1 >> 0) & 0xFF) / (f32)0xFF; - f32 rand_g = (f32)((seed1 >> 8) & 0xFF) / (f32)0xFF; - f32 rand_b = (f32)((seed1 >> 16) & 0xFF) / (f32)0xFF; - f32 rand_a = (f32)((seed1 >> 24) & 0xFF) / (f32)0xFF; - f32 rand_lifetime = (f32)((seed1 >> 32) & 0xFFFF) / (f32)0xFFFF; + f32 rand_r = Norm8(seed1 >> 0); + f32 rand_g = Norm8(seed1 >> 8); + f32 rand_b = Norm8(seed1 >> 16); + f32 rand_a = Norm8(seed1 >> 24); + f32 rand_lifetime = Norm16(seed1 >> 32); f32 speed = emitter.speed + (rand_speed - 0.5) * emitter.speed_spread; f32 angle = emitter.angle + (rand_angle - 0.5) * emitter.angle_spread; @@ -255,8 +255,6 @@ ComputeShader(V_SimParticlesCS, 64) (AnyBit(particle.flags, V_ParticleFlag_StainOnPrune) && particle.exists == 0) ); - - // Stain if (should_stain) { f32 old_dryness = drynesses[cell_pos]; @@ -400,14 +398,14 @@ PixelShader(V_CompositePS, V_CompositePSOutput, V_CompositePSInput input) b32 tile_is_wall = 0; Vec4 tile_color = 0; { - P_TileKind tile_tl = tiles.Load(Vec3(tile_pos.x - 1, tile_pos.y - 1, 0)); - P_TileKind tile_tr = tiles.Load(Vec3(tile_pos.x + 1, tile_pos.y - 1, 0)); - P_TileKind tile_br = tiles.Load(Vec3(tile_pos.x + 1, tile_pos.y + 1, 0)); - P_TileKind tile_bl = tiles.Load(Vec3(tile_pos.x - 1, tile_pos.y + 1, 0)); - P_TileKind tile_t = tiles.Load(Vec3(tile_pos.x, tile_pos.y - 1, 0)); - P_TileKind tile_r = tiles.Load(Vec3(tile_pos.x + 1, tile_pos.y, 0)); - P_TileKind tile_b = tiles.Load(Vec3(tile_pos.x, tile_pos.y + 1, 0)); - P_TileKind tile_l = tiles.Load(Vec3(tile_pos.x - 1, tile_pos.y, 0)); + P_TileKind tile_tl = tiles.Load(Vec3(tile_pos.x - 0.99, tile_pos.y - 0.99, 0)); + P_TileKind tile_tr = tiles.Load(Vec3(tile_pos.x + 0.99, tile_pos.y - 0.99, 0)); + P_TileKind tile_br = tiles.Load(Vec3(tile_pos.x + 0.99, tile_pos.y + 0.99, 0)); + P_TileKind tile_bl = tiles.Load(Vec3(tile_pos.x - 0.99, tile_pos.y + 0.99, 0)); + P_TileKind tile_t = tiles.Load(Vec3(tile_pos.x, tile_pos.y - 0.99, 0)); + P_TileKind tile_r = tiles.Load(Vec3(tile_pos.x + 0.99, tile_pos.y, 0)); + P_TileKind tile_b = tiles.Load(Vec3(tile_pos.x, tile_pos.y + 0.99, 0)); + P_TileKind tile_l = tiles.Load(Vec3(tile_pos.x - 0.99, tile_pos.y, 0)); f32 tile_edge_dist = Inf; P_TileKind edge_tile = tile; diff --git a/src/proto/proto_shaders.g b/src/proto/proto_shaders.g index 3bb92d9a..7e271939 100644 --- a/src/proto/proto_shaders.g +++ b/src/proto/proto_shaders.g @@ -65,7 +65,7 @@ PixelShader(PT_BlitPS, PT_BlitPSOutput, PT_BlitPSInput input) u32 noise_val = noise[noise_coord]; Vec4 result = tex_col; - result.r = (f32)noise_val / (f32)U16Max; + result.r = Norm16(noise_val); PT_BlitPSOutput output; output.sv_target0 = result;