3d游戏引擎的vulkan的core代码实现

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;

}












 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Magnum Lehar

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值