1.clock.h
#pragma once
#include "defines.h"
typedef struct clock
{
f64 start_time;
f64 elapsed;
}clock;
KAPI void clock_update(clock* clock);
KAPI void clock_start(clock* clock);
KAPI void clock_stop(clock* clock);
2.clock.c
#include "clock.h"
#include "platform/platform.h"
KAPI void clock_update(clock* clock)
{
if(clock->start_time !=0)
{
clock->elapsed = platform_get_absolute_time()- clock->start_time;
}
}
KAPI void clock_start(clock* clock)
{
clock->start_time = platform_get_absolute_time();
clock->elapsed = 0;
}
KAPI void clock_stop(clock* clock)
{
clock->start_time = 0;
}
3.event.h
#pragma once
#include "defines.h"
typedef struct event_context{
union{
i64 i64[2];
u64 u64[2];
f64 f64[2];
i32 i32[4];
u32 u32[4];
f32 f32[4];
i16 i16[8];
u16 u16[8];
i8 i8[16];
u8 u8[16];
char c[16];
}data;
}event_context;
//should return true if handled
typedef b8 (*PFN_on_event)(u16 code,void* sender,void* listener_inst,event_context data);
b8 event_initialize();
void event_shutdown();
KAPI b8 event_register(u16 code, void* listener,PFN_on_event on_event);
KAPI b8 event_unregister(u16 code,void* listener, PFN_on_event on_event);
KAPI b8 event_fire(u16 code,void* sender,event_context context);
typedef enum system_event_code{
EVENT_CODE_APPLICATION_QUIT = 0X01,
EVENT_CODE_KEY_PRESSED = 0x02,
EVENT_CODE_KEY_RELEASED = 0x03,
EVENT_CODE_BUTTON_PRESSED = 0x04,
EVENT_CODE_BUTTON_RELEASED = 0x05,
EVENT_CODE_MOUSE_MOVED = 0x06,
EVENT_CODE_MOUSE_WHEEL = 0x07,
EVENT_CODE_RESIZED = 0x08,
MAX_EVENT_CODE = 0xFF
}system_event_code;
4.event.c
#include "core/event.h"
#include "core/kmemory.h"
#include "containers/darray.h"
typedef struct registered_event{
void* listener;
PFN_on_event callback;
}registered_event;
typedef struct event_code_entry{
registered_event* events;
}event_code_entry;
#define MAX_MESSAGE_CODES 16384
//State structure
typedef struct event_system_state{
//Lookup table for event codes
event_code_entry registered[MAX_MESSAGE_CODES];
}event_system_state;
/**
* @brief
* Event system internal state.
*
*/
static b8 is_initialized = false;
static event_system_state state;
b8 event_initialize(){
if(is_initialized == true)
{
return false;
}
is_initialized = false;
kzero_memory(&state,sizeof(state));
is_initialized = true;
return true;
}
void event_shutdown()
{
for(u16 i = 0;i < MAX_MESSAGE_CODES;++i)
{
if(state.registered[i].events != 0)
{
darray_destroy(state.registered[i].events);
state.registered[i].events = 0;
}
}
}
b8 event_register(u16 code,void* listener,PFN_on_event on_event)
{
if(is_initialized == false)
{
return false;
}
if(state.registered[code].events == 0)
{
state.registered[code].events = darray_create(registered_event);
}
u64 registered_count = darray_length(state.registered[code].events);
for(u64 i = 0;i <registered_count;++i)
{
if(state.registered[code].events[i].listener == listener)
{
return false;
}
}
registered_event event;
event.listener = listener;
event.callback = on_event;
darray_push(state.registered[code].events,event);
return true;
}
b8 event_unregister(u16 code,void* listener, PFN_on_event on_event)
{
if(is_initialized == false)
{
return false;
}
if(state.registered[code].events == 0)
{
return false;
}
u64 registered_count = darray_length(state.registered[code].events);
for(u64 i = 0;i<registered_count;++i)
{
registered_event e = state.registered[code].events[i];
if(e.listener == listener && e.callback == on_event)
{
registered_event popped_event;
darray_pop_at(state.registered[code].events,1,&popped_event);
return true;
}
}
return false;
}
b8 event_fire(u16 code,void* sender,event_context context)
{
if(is_initialized == false)
{
return false;
}
if(state.registered[code].events==0)
{
return false;
}
u64 registered_count = darray_length(state.registered[code].events);
for(u64 i = 0;i<registered_count;++i)
{
registered_event e = state.registered[code].events[i];
if(e.callback(code,sender,e.listener,context))
{
return true;
}
}
return false;
}