Fixed input bug where the input was not zeroed at the end of each frame.
This commit is contained in:
parent
7f00ead99c
commit
020e2789d7
|
@ -129,6 +129,7 @@ struct Mac_Input_Chunk{
|
||||||
@end
|
@end
|
||||||
|
|
||||||
@interface FCoder_Window_Delegate : NSObject<NSWindowDelegate>
|
@interface FCoder_Window_Delegate : NSObject<NSWindowDelegate>
|
||||||
|
- (void)process_focus_event;
|
||||||
@end
|
@end
|
||||||
|
|
||||||
@interface FCoder_View : NSView
|
@interface FCoder_View : NSView
|
||||||
|
@ -458,6 +459,15 @@ mac_resize(NSWindow *window){
|
||||||
mac_resize(bounds.size.width, bounds.size.height);
|
mac_resize(bounds.size.width, bounds.size.height);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function inline void
|
||||||
|
mac_profile(char *name, u64 begin, u64 end){
|
||||||
|
printf("%s Time: %fs\n", name, ((end - begin) / 1000000.0f));
|
||||||
|
}
|
||||||
|
|
||||||
|
#define MacProfileScope(name) for (u64 i = 0, begin = system_now_time();\
|
||||||
|
i < 1;\
|
||||||
|
++i, mac_profile(name, begin, system_now_time()))
|
||||||
|
|
||||||
////////////////////////////////
|
////////////////////////////////
|
||||||
|
|
||||||
@implementation FCoder_App_Delegate
|
@implementation FCoder_App_Delegate
|
||||||
|
@ -491,16 +501,23 @@ mac_resize(NSWindow *window){
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)windowDidBecomeKey:(NSNotification *)notification{
|
- (void)windowDidBecomeKey:(NSNotification *)notification{
|
||||||
printf("Focus\n");
|
// NOTE(yuval): The window is the focused window
|
||||||
system_signal_step(0);
|
[self process_focus_event];
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)windowDidResignKey:(NSNotification *)notification{
|
- (void)windowDidResignKey:(NSNotification *)notification{
|
||||||
printf("Lost Focus\n");
|
// NOTE(yuval): The window has lost focus
|
||||||
system_signal_step(0);
|
[self process_focus_event];
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)windowDidEnterFullScreen:(NSNotification *)notification{
|
- (void)process_focus_event{
|
||||||
|
mac_vars.input_chunk.pers.mouse_l = false;
|
||||||
|
mac_vars.input_chunk.pers.mouse_r = false;
|
||||||
|
block_zero_struct(&mac_vars.input_chunk.pers.controls);
|
||||||
|
block_zero_struct(&mac_vars.input_chunk.pers.modifiers);
|
||||||
|
mac_vars.active_key_stroke = 0;
|
||||||
|
mac_vars.active_text_input = 0;
|
||||||
|
|
||||||
system_signal_step(0);
|
system_signal_step(0);
|
||||||
}
|
}
|
||||||
@end
|
@end
|
||||||
|
@ -522,75 +539,82 @@ mac_resize(NSWindow *window){
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)drawRect:(NSRect)bounds{
|
- (void)drawRect:(NSRect)bounds{
|
||||||
// NOTE(yuval): Read comment in win32_4ed.cpp's main loop
|
MacProfileScope("Frame"){
|
||||||
system_mutex_acquire(mac_vars.global_frame_mutex);
|
MacProfileScope("Acquire System Mutex"){
|
||||||
|
// NOTE(yuval): Read comment in win32_4ed.cpp's main loop
|
||||||
|
system_mutex_acquire(mac_vars.global_frame_mutex);
|
||||||
|
}
|
||||||
|
|
||||||
/* NOTE(yuval): Force the graphics context to clear to black so we don't
|
Mac_Input_Chunk input_chunk = mac_vars.input_chunk;
|
||||||
get a flash of white until the app is ready to draw. In practice on modern macOS,
|
Application_Step_Input input = {};
|
||||||
this only gets called for window creation and other extraordinary events.
|
|
||||||
(Taken From SDL) */
|
|
||||||
[[NSColor blackColor] setFill];
|
|
||||||
NSRectFill(bounds);
|
|
||||||
|
|
||||||
// NOTE(yuval): Prepare the Frame Input
|
// NOTE(yuval): Prepare the Frame Input
|
||||||
Mac_Input_Chunk input_chunk = mac_vars.input_chunk;
|
MacProfileScope("Prepare Input"){
|
||||||
Application_Step_Input input = {};
|
input.first_step = mac_vars.first;
|
||||||
|
input.dt = frame_useconds / 1000000.0f;
|
||||||
|
input.events = input_chunk.trans.event_list;
|
||||||
|
|
||||||
input.first_step = mac_vars.first;
|
input.mouse.out_of_window = input_chunk.trans.out_of_window;
|
||||||
input.dt = frame_useconds / 1000000.0f;
|
|
||||||
input.events = input_chunk.trans.event_list;
|
|
||||||
|
|
||||||
input.mouse.out_of_window = input_chunk.trans.out_of_window;
|
input.mouse.l = input_chunk.pers.mouse_l;
|
||||||
|
input.mouse.press_l = input_chunk.trans.mouse_l_press;
|
||||||
|
input.mouse.release_l = input_chunk.trans.mouse_l_release;
|
||||||
|
|
||||||
input.mouse.l = input_chunk.pers.mouse_l;
|
input.mouse.r = input_chunk.pers.mouse_r;
|
||||||
input.mouse.press_l = input_chunk.trans.mouse_l_press;
|
input.mouse.press_r = input_chunk.trans.mouse_r_press;
|
||||||
input.mouse.release_l = input_chunk.trans.mouse_l_release;
|
input.mouse.release_r = input_chunk.trans.mouse_r_release;
|
||||||
|
|
||||||
input.mouse.r = input_chunk.pers.mouse_r;
|
input.mouse.wheel = input_chunk.trans.mouse_wheel;
|
||||||
input.mouse.press_r = input_chunk.trans.mouse_r_press;
|
input.mouse.p = input_chunk.pers.mouse;
|
||||||
input.mouse.release_r = input_chunk.trans.mouse_r_release;
|
|
||||||
|
|
||||||
input.mouse.wheel = input_chunk.trans.mouse_wheel;
|
input.trying_to_kill = input_chunk.trans.trying_to_kill;
|
||||||
input.mouse.p = input_chunk.pers.mouse;
|
|
||||||
|
|
||||||
input.trying_to_kill = input_chunk.trans.trying_to_kill;
|
block_zero_struct(&mac_vars.input_chunk.trans);
|
||||||
|
mac_vars.active_key_stroke = 0;
|
||||||
|
mac_vars.active_text_input = 0;
|
||||||
|
|
||||||
block_zero_struct(&mac_vars.input_chunk.trans);
|
// NOTE(yuval): See comment in win32_4ed.cpp's main loop
|
||||||
|
if (mac_vars.send_exit_signal){
|
||||||
|
input.trying_to_kill = true;
|
||||||
|
mac_vars.send_exit_signal = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// NOTE(yuval): See comment in win32_4ed.cpp's main loop
|
Application_Step_Result result = {};
|
||||||
if (mac_vars.send_exit_signal){
|
MacProfileScope("Step"){
|
||||||
input.trying_to_kill = true;
|
// NOTE(yuval): Application Core Update
|
||||||
mac_vars.send_exit_signal = false;
|
if (app.step != 0){
|
||||||
|
result = app.step(mac_vars.tctx, &target, mac_vars.base_ptr, &input);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
MacProfileScope("Perform Kill"){
|
||||||
|
// NOTE(yuval): Quit the app
|
||||||
|
if (result.perform_kill){
|
||||||
|
printf("Terminating 4coder!\n");
|
||||||
|
[NSApp terminate:nil];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
MacProfileScope("Render"){
|
||||||
|
// NOTE(yuval): Render
|
||||||
|
renderer->render(renderer, &target);
|
||||||
|
|
||||||
|
// NOTE(yuval): Schedule another step if needed
|
||||||
|
if (result.animating){
|
||||||
|
system_signal_step(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
MacProfileScope("Cleanup"){
|
||||||
|
mac_vars.first = false;
|
||||||
|
|
||||||
|
linalloc_clear(mac_vars.frame_arena);
|
||||||
|
|
||||||
|
system_mutex_release(mac_vars.global_frame_mutex);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
printf("\n");
|
||||||
// NOTE(yuval): Application Core Update
|
|
||||||
Application_Step_Result result = {};
|
|
||||||
if (app.step != 0){
|
|
||||||
result = app.step(mac_vars.tctx, &target, mac_vars.base_ptr, &input);
|
|
||||||
}
|
|
||||||
|
|
||||||
// NOTE(yuval): Quit the app
|
|
||||||
if (result.perform_kill){
|
|
||||||
printf("Terminating 4coder!\n");
|
|
||||||
[NSApp terminate:nil];
|
|
||||||
}
|
|
||||||
|
|
||||||
// NOTE(yuval): Render
|
|
||||||
u64 begin_render = system_now_time();
|
|
||||||
renderer->render(renderer, &target);
|
|
||||||
u64 end_render = system_now_time();
|
|
||||||
printf("Render Time: %fs\n\n", (end_render - begin_render) / 1000000.0f);
|
|
||||||
|
|
||||||
// NOTE(yuval): Schedule another step if needed
|
|
||||||
if (result.animating){
|
|
||||||
system_signal_step(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
mac_vars.first = false;
|
|
||||||
|
|
||||||
linalloc_clear(mac_vars.frame_arena);
|
|
||||||
|
|
||||||
system_mutex_release(mac_vars.global_frame_mutex);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
- (BOOL)acceptsFirstResponder{
|
- (BOOL)acceptsFirstResponder{
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
/* macOS System/Graphics/Font API Implementations */
|
/* macOS System/Graphics/Font API Implementations */
|
||||||
|
|
||||||
//////////////////////
|
/********************/
|
||||||
// System API //
|
/* System API */
|
||||||
//////////////////////
|
/********************/
|
||||||
|
|
||||||
////////////////////////////////
|
////////////////////////////////
|
||||||
|
|
||||||
|
@ -796,9 +796,9 @@ system_get_keyboard_modifiers_sig(){
|
||||||
|
|
||||||
////////////////////////////////
|
////////////////////////////////
|
||||||
|
|
||||||
////////////////////////
|
/**********************/
|
||||||
// Graphics API //
|
/* Graphics API */
|
||||||
////////////////////////
|
/**********************/
|
||||||
|
|
||||||
////////////////////////////////
|
////////////////////////////////
|
||||||
|
|
||||||
|
@ -816,9 +816,9 @@ graphics_fill_texture_sig(){
|
||||||
|
|
||||||
////////////////////////////////
|
////////////////////////////////
|
||||||
|
|
||||||
////////////////////
|
/******************/
|
||||||
// Font API //
|
/* Font API */
|
||||||
////////////////////
|
/******************/
|
||||||
|
|
||||||
////////////////////////////////
|
////////////////////////////////
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue