From ce33d7547241ff0231270daae51f7d21d06fa9fd Mon Sep 17 00:00:00 2001 From: johndoe6345789 Date: Mon, 5 Jan 2026 09:16:38 +0000 Subject: [PATCH] feat: Enhance mouse grab functionality and improve logging in SDL window service --- scripts/cube_logic.lua | 4 +- scripts/dev_commands.py | 3 +- shaders/solid.frag | 51 +++++++++++++++++++++-- shaders/solid.frag.spv | Bin 560 -> 2672 bytes src/services/impl/sdl_window_service.cpp | 39 ++++++++++++++--- 5 files changed, 85 insertions(+), 12 deletions(-) diff --git a/scripts/cube_logic.lua b/scripts/cube_logic.lua index c448235..14dd345 100644 --- a/scripts/cube_logic.lua +++ b/scripts/cube_logic.lua @@ -574,8 +574,8 @@ local function create_room_objects() {room.wall_thickness, room.wall_height, room.half_size}, green_wall), } - -- Add lanterns in the four corners - local lantern_offset = 4.0 + -- Add lanterns in the four corners (adjusted for bigger room) + local lantern_offset = room.half_size - 2.0 -- 2 units from wall objects[#objects + 1] = create_lantern(lantern_offset, lantern_offset) objects[#objects + 1] = create_lantern(-lantern_offset, lantern_offset) objects[#objects + 1] = create_lantern(lantern_offset, -lantern_offset) diff --git a/scripts/dev_commands.py b/scripts/dev_commands.py index f6a876f..8e11bbc 100644 --- a/scripts/dev_commands.py +++ b/scripts/dev_commands.py @@ -324,6 +324,7 @@ def _sync_assets(build_dir: str, dry_run: bool) -> None: ("scripts", ["*.lua"]), ("shaders", ["*.spv"]), ("scripts/models", ["*.stl", "*.obj", "*.fbx"]), + ("config", ["*.json"]), ] print("\n=== Syncing Assets ===") @@ -369,7 +370,7 @@ def run_demo(args: argparse.Namespace) -> None: exe_name = args.target or ("sdl3_app.exe" if IS_WINDOWS else "sdl3_app") binary = str(Path(build_dir) / exe_name) - cmd: list[str] = [binary] + cmd: list[str] = [binary, "-j", "config/seed_runtime.json"] run_args = _strip_leading_double_dash(args.args) if run_args: cmd.extend(run_args) diff --git a/shaders/solid.frag b/shaders/solid.frag index 9791877..cec1102 100644 --- a/shaders/solid.frag +++ b/shaders/solid.frag @@ -4,7 +4,52 @@ layout(location = 0) in vec3 fragColor; layout(location = 1) in vec3 fragWorldPos; layout(location = 0) out vec4 outColor; -void main() { - // Use vertex color directly for solid colors - outColor = vec4(fragColor, 1.0); +// Lantern positions (8 lights) +const vec3 LIGHT_POSITIONS[8] = vec3[8]( + vec3(13.0, 4.5, 13.0), // Corner + vec3(-13.0, 4.5, 13.0), // Corner + vec3(13.0, 4.5, -13.0), // Corner + vec3(-13.0, 4.5, -13.0), // Corner + vec3(0.0, 4.5, 13.0), // Wall midpoint + vec3(0.0, 4.5, -13.0), // Wall midpoint + vec3(13.0, 4.5, 0.0), // Wall midpoint + vec3(-13.0, 4.5, 0.0) // Wall midpoint +); + +const vec3 LIGHT_COLOR = vec3(1.0, 0.9, 0.6); // Warm lantern color +const float LIGHT_INTENSITY = 0.8; +const float AMBIENT_STRENGTH = 0.08; // Low ambient for darker atmosphere + +float calculateAttenuation(float distance) { + // Quadratic attenuation: 1 / (constant + linear*d + quadratic*d^2) + const float kConstant = 1.0; + const float kLinear = 0.09; + const float kQuadratic = 0.032; + return 1.0 / (kConstant + kLinear * distance + kQuadratic * distance * distance); +} + +void main() { + vec3 ambient = AMBIENT_STRENGTH * fragColor; + vec3 lighting = vec3(0.0); + + // Calculate contribution from each lantern + for (int i = 0; i < 8; i++) { + vec3 lightDir = LIGHT_POSITIONS[i] - fragWorldPos; + float distance = length(lightDir); + lightDir = normalize(lightDir); + + // Distance attenuation + float attenuation = calculateAttenuation(distance); + + // Add light contribution + lighting += LIGHT_COLOR * LIGHT_INTENSITY * attenuation; + } + + // Combine ambient and dynamic lighting with surface color + vec3 finalColor = ambient + fragColor * lighting; + + // Clamp to prevent over-bright areas + finalColor = clamp(finalColor, 0.0, 1.0); + + outColor = vec4(finalColor, 1.0); } diff --git a/shaders/solid.frag.spv b/shaders/solid.frag.spv index 45f555f2e28f4a831e90a4d635856454d46bc3b4..b11bf6308746c24d62db9575f90a1eaedca78946 100644 GIT binary patch literal 2672 zcmZ9ONmE>96ox-&IuIZO8B0ZNf(n|5Ml%p2lS#w@6^t6kmD?%bNSuKg3)YN=IPKF{SI?ATSO&U@Z7e$%Zkb&vL@)RhKOU)oIDzoFC(li+sc zdVb;Z!o+5Kb>h_Nr;XT~N_n6$`^f7-E9+UkspDZ}9=U<+CsrR#KqV@tbce(;Y-dh6 z?N0spR$@93#F)F3i`er+8u2i?Vo-_=|)|czmW;>6u ze{CaMyU=R1Ho)c`LpSPc*W2~x8W5(G#?bW~m(w%o+<&odN}h8OU2m>dKg*UIHY>9q zuFKk2S{sek#a6y$)_(>5-nq)@4Y=&TWf0Yq7U6DY8`(PAysPM1y_q$NVddPn)>b>l zr)N*Trw_sV({>JR&p_Lp@E>HC-RF^f$5W1vfOo-Fa_Py>qZceULVjO?<&I;^4ZXGC19VPyLusPn03ibnNYsp9agW&#OZ%^ru+4Y|3X`e!j8^%73 zb_Tha?+iGl#ksK0=JvOLYJ>hrn{O*LU_S@2F`(5d@{icL%y{m;i#XR2G3gX-PnkltMkP6~^oMr{iD<^hV z-z$y#$ssCf4{OSU&8R!1Kr##hPCR8zXN`_gpUGUj@qza)Z1>3rH7Y z4}Io%4)T%n8aQ&?*VhqqoI_vqkvGS>ONe#!d2ZV0m{H%GNIxR4-*c9W+$&(YILCLv zz6<%7={>M#_<6DJ_rY?;T2r5#XXg32?`rcsvkwsW{TBJ!9~GSM%zS-vop-|Xi~b*j zy-#6Z1AF(v&cM#_Wij6}_!=S~Gp~THqtBk+XSt}c3YJ@B*WC9iGTI@**Wd>4k-j{B z4bF3NZfluuZ1mC}y*>fkYpFP+23XEtaO+?>YX;{ZA-Qg3k=N-rsD+qsynbi1=MA*J zzo{^Z_>J*Cco+QjA!mu}MejyDvjMa-8n?IL-Bay-$ex0CPv!O__R|-62f)^gyo2B& jL_T5;fjeUkV;d(QwU2xU+OF+iF1f~V literal 560 zcmYk1y-EXN5JktVn?$4eF`}JBEQMfULN&dDd^@*3gTS$vA)liS${H=y_^=VqIe(iu7eGTW9Id2t`PTAV zWOs?nx7L%`Iknt25%GCf_4R1~ire+)Za+1@K~nM!sG9qPdJmv#bxMr%k9A8-&5GA6 aG4*F$<2?t2^YZQM>z1wFXYU7B*TgT%q8_aP diff --git a/src/services/impl/sdl_window_service.cpp b/src/services/impl/sdl_window_service.cpp index e25de35..22349f0 100644 --- a/src/services/impl/sdl_window_service.cpp +++ b/src/services/impl/sdl_window_service.cpp @@ -263,9 +263,34 @@ void SdlWindowService::PollEvents() { logger_->Trace("SdlWindowService", "PollEvents"); SDL_Event event; while (SDL_PollEvent(&event)) { - // Convert SDL event to application event and publish - PublishEvent(event); - HandleMouseGrabEvent(event); + // Check if this event should trigger mouse grab + bool isGrabTrigger = false; + if (window_ && mouseGrabConfig_.enabled && mouseGrabConfig_.grabOnClick && + event.type == SDL_EVENT_MOUSE_BUTTON_DOWN && + event.button.button == grabMouseButton_) { + isGrabTrigger = true; + if (logger_) { + logger_->Info("SdlWindowService: Mouse grab triggered by click (button=" + + std::to_string(event.button.button) + ")"); + } + ApplyMouseGrab(true); + } + + // Handle release separately (doesn't suppress event) + if (window_ && mouseGrabConfig_.enabled && mouseGrabConfig_.releaseOnEscape && + event.type == SDL_EVENT_KEY_DOWN && + event.key.key == releaseKey_ && + !event.key.repeat) { + if (logger_) { + logger_->Info("SdlWindowService: Mouse grab released by escape key"); + } + ApplyMouseGrab(false); + } + + // Only publish event if it's not the grab-triggering click + if (!isGrabTrigger) { + PublishEvent(event); + } // Check for quit event if (event.type == SDL_EVENT_QUIT || event.type == SDL_EVENT_WINDOW_CLOSE_REQUESTED) { @@ -307,9 +332,11 @@ void SdlWindowService::ConfigureMouseGrabBindings() { } if (logger_) { - logger_->Trace("SdlWindowService", "ConfigureMouseGrabBindings", - "grabMouseButton=" + std::to_string(static_cast(grabMouseButton_)) + - ", releaseKey=" + std::to_string(static_cast(releaseKey_))); + logger_->Info("SdlWindowService: Mouse grab config: enabled=" + + std::string(mouseGrabConfig_.enabled ? "true" : "false") + + ", grabOnClick=" + std::string(mouseGrabConfig_.grabOnClick ? "true" : "false") + + ", grabMouseButton=" + std::to_string(static_cast(grabMouseButton_)) + + ", releaseKey=" + std::to_string(static_cast(releaseKey_))); } }