Base input pass updated for sokol possibly done (untested)

Still need to figure out input event consumption, I don't want to do it with the event ring.

I would like to setup input binding layers and then have the push/pop input contextes with a set of bindings.
If the bindings are detected it should "consume" that binding from further use for the buffered time period.

This will be really important with how heavily model this app will be.I
This commit is contained in:
2024-06-18 01:33:50 -04:00
parent 3b395f3356
commit b698f5166b
14 changed files with 487 additions and 151 deletions

View File

@ -30,7 +30,7 @@ ModuleAPI :: struct {
startup : type_of( startup ),
shutdown : type_of( sectr_shutdown ),
reload : type_of( reload ),
reload : type_of( hot_reload ),
tick : type_of( tick ),
clean_frame : type_of( clean_frame ),
}
@ -107,24 +107,23 @@ startup :: proc( prof : ^SpallProfiler, persistent_mem, frame_mem, transient_mem
{
input = & input_data[1]
input_prev = & input_data[0]
for & input in input_data {
using input
error : AllocatorError
events, error = make( Array(InputEvent), Kilo, persistent_slab_allocator() )
ensure(error == AllocatorError.None, "Failed to allocate input.events array")
using input_events
key_events, error = make( Array(InputKeyEvent), Kilo, persistent_slab_allocator() )
ensure(error == AllocatorError.None, "Failed to allocate key_events array")
error : AllocatorError
events, error = make( Queue(InputEvent), 4 * Kilo, persistent_allocator() )
ensure(error == AllocatorError.None, "Failed to allocate input.events array")
mouse_events, error = make( Array(InputMouseEvent), Kilo, persistent_slab_allocator() )
ensure(error == AllocatorError.None, "Failed to allocate mouse_events array")
key_events, error = make( Queue(InputKeyEvent), Kilo, persistent_allocator() )
ensure(error == AllocatorError.None, "Failed to allocate key_events array")
codes_pressed, error = make( Array(rune), Kilo, persistent_slab_allocator() )
ensure(error == AllocatorError.None, "Failed to allocate codes_pressed array")
}
mouse_events, error = make( Queue(InputMouseEvent), 2 * Kilo, persistent_allocator() )
ensure(error == AllocatorError.None, "Failed to allocate mouse_events array")
input_staged_events, error := make( Array(InputEvent), Kilo, persistent_slab_allocator() )
codes_pressed, error = make( Array(rune), Kilo, persistent_allocator() )
ensure(error == AllocatorError.None, "Failed to allocate codes_pressed array")
staged_input_events, error = make( Array(InputEvent), 8 * Kilo, persistent_allocator() )
ensure(error == AllocatorError.None, "Failed to allocate input_staged_events array")
}
@ -396,7 +395,7 @@ sectr_shutdown :: proc()
}
@export
reload :: proc( prof : ^SpallProfiler, persistent_mem, frame_mem, transient_mem, files_buffer_mem : ^VArena, host_logger : ^ Logger )
hot_reload :: proc( prof : ^SpallProfiler, persistent_mem, frame_mem, transient_mem, files_buffer_mem : ^VArena, host_logger : ^ Logger )
{
spall.SCOPED_EVENT( & prof.ctx, & prof.buffer, #procedure )
set_profiler_module_context( prof )
@ -484,7 +483,6 @@ tick :: proc( host_delta_time_ms : f64, host_delta_ns : Duration ) -> b32
return ! should_close
}
// Lifted out of tick so that sokol_app_frame_callback can do it as well.
tick_work_frame :: #force_inline proc( host_delta_time_ms : f64 ) -> b32
{
@ -542,6 +540,7 @@ tick_work_frame :: #force_inline proc( host_delta_time_ms : f64 ) -> b32
// Lifted out of tick so that sokol_app_frame_callback can do it as well.
tick_frametime :: #force_inline proc( client_tick : ^time.Tick, host_delta_time_ms : f64, host_delta_ns : Duration )
{
profile(#procedure)
state := get_state(); using state
context.allocator = frame_slab_allocator()
context.temp_allocator = transient_allocator()
@ -598,7 +597,7 @@ tick_frametime :: #force_inline proc( client_tick : ^time.Tick, host_delta_time_
@export
clean_frame :: proc()
{
// profile( #procedure)
profile( #procedure)
state := get_state(); using state
context.logger = to_odin_logger( & Memory_App.logger )

View File

@ -15,10 +15,12 @@ sokol_app_init_callback :: proc "c" () {
// This is being filled in but we're directly controlling the lifetime of sokol_app's execution.
// So this will only get called during window pan or resize events (on Win32 at least)
sokol_app_frame_callback :: proc "c" () {
sokol_app_frame_callback :: proc "c" ()
{
context = get_state().sokol_context
state := get_state()
profile(#procedure)
state := get_state()
should_close : b32
sokol_width := sokol_app.widthf()
@ -38,10 +40,12 @@ sokol_app_frame_callback :: proc "c" () {
sokol_delta_ms := sokol_app.frame_delta()
sokol_delta_ns := transmute(Duration) sokol_delta_ms * MS_To_NS
profile_begin("Client Tick")
client_tick := time.tick_now()
should_close |= tick_work_frame( sokol_delta_ms )
tick_frametime( & client_tick, sokol_delta_ms, sokol_delta_ns )
profile_end()
tick_frametime( & client_tick, sokol_delta_ms, sokol_delta_ns )
window.resized = false
}
@ -118,43 +122,52 @@ sokol_app_event_callback :: proc "c" (sokol_event : ^sokol_app.Event)
type = .Key_Pressed
key = to_key_from_sokol( sokol_event.key_code )
modifiers = to_modifiers_code_from_sokol( sokol_event.modifiers )
sokol_app.consume_event()
case .KEY_UP:
type = .Key_Released
key = to_key_from_sokol( sokol_event.key_code )
modifiers = to_modifiers_code_from_sokol( sokol_event.modifiers )
sokol_app.consume_event()
case .CHAR:
type = .Unicode
codepoint = transmute(rune) sokol_event.char_code
modifiers = to_modifiers_code_from_sokol( sokol_event.modifiers )
sokol_app.consume_event()
case .MOUSE_DOWN:
type = .Mouse_Pressed
mouse.btn = to_mouse_btn_from_sokol( sokol_event.mouse_button )
modifiers = to_modifiers_code_from_sokol( sokol_event.modifiers )
sokol_app.consume_event()
case .MOUSE_UP:
type = .Mouse_Released
mouse.btn = to_mouse_btn_from_sokol( sokol_event.mouse_button )
modifiers = to_modifiers_code_from_sokol( sokol_event.modifiers )
sokol_app.consume_event()
case .MOUSE_SCROLL:
type = .Mouse_Scroll
mouse.scroll = { sokol_event.scroll_x, sokol_event.scroll_y }
modifiers = to_modifiers_code_from_sokol( sokol_event.modifiers )
sokol_app.consume_event()
case .MOUSE_MOVE:
type = .Mouse_Move
modifiers = to_modifiers_code_from_sokol( sokol_event.modifiers )
sokol_app.consume_event()
case .MOUSE_ENTER:
type = .Mouse_Enter
modifiers = to_modifiers_code_from_sokol( sokol_event.modifiers )
sokol_app.consume_event()
case .MOUSE_LEAVE:
type = .Mouse_Leave
modifiers = to_modifiers_code_from_sokol( sokol_event.modifiers )
sokol_app.consume_event()
// TODO(Ed): Add support
case .TOUCHES_BEGAN:
@ -163,30 +176,43 @@ sokol_app_event_callback :: proc "c" (sokol_event : ^sokol_app.Event)
case .TOUCHES_CANCELLED:
case .RESIZED:
sokol_app.consume_event()
case .ICONIFIED:
sokol_app.consume_event()
case .RESTORED:
sokol_app.consume_event()
case .FOCUSED:
sokol_app.consume_event()
case .UNFOCUSED:
sokol_app.consume_event()
case .SUSPENDED:
sokol_app.consume_event()
case .RESUMED:
sokol_app.consume_event()
case .QUIT_REQUESTED:
sokol_app.consume_event()
case .CLIPBOARD_PASTED:
sokol_app.consume_event()
case .FILES_DROPPED:
sokol_app.consume_event()
case .DISPLAY_CHANGED:
logf("sokol_app - event: Display changed")
logf("refresh rate: %v", sokol_app.refresh_rate())
monitor_refresh_hz := sokol_app.refresh_rate()
sokol_app.consume_event()
}
append_staged_input_events( event )
}
#endregion("Sokol App")

View File

@ -79,7 +79,8 @@ update :: proc( delta_time : f64 ) -> b32
}
state.input, state.input_prev = swap( state.input, state.input_prev )
pull_staged_input_events( state.input, & state.staged_input_events )
pull_staged_input_events( state.input, & state.input_events, state.staged_input_events )
poll_input_events( state.input, state.input_prev, state.input_events )
debug_actions : DebugActions = {}
// poll_debug_actions( & debug_actions, state.input )
@ -165,7 +166,7 @@ update :: proc( delta_time : f64 ) -> b32
switch config.cam_zoom_mode
{
case .Smooth:
zoom_delta := input.mouse.vertical_wheel * config.cam_zoom_sensitivity_smooth
zoom_delta := input.mouse.scroll.y * config.cam_zoom_sensitivity_smooth
workspace.zoom_target *= 1 + zoom_delta * f32(delta_time)
workspace.zoom_target = clamp(workspace.zoom_target, config.cam_min_zoom, config.cam_max_zoom)
@ -174,7 +175,7 @@ update :: proc( delta_time : f64 ) -> b32
cam.zoom += (workspace.zoom_target - cam.zoom) * lerp_factor * f32(delta_time)
cam.zoom = clamp(cam.zoom, config.cam_min_zoom, config.cam_max_zoom) // Ensure cam.zoom stays within bounds
case .Digital:
zoom_delta := input.mouse.vertical_wheel * config.cam_zoom_sensitivity_digital
zoom_delta := input.mouse.scroll.y * config.cam_zoom_sensitivity_digital
workspace.zoom_target = clamp(workspace.zoom_target + zoom_delta, config.cam_min_zoom, config.cam_max_zoom)
cam.zoom = workspace.zoom_target
}