#include "arc/engine/engine.h" #include #include #include "arc/engine/state.h" #include "arc/graphics/window.h" #include "arc/graphics/renderer.h" #include "arc/input/mouse.h" #include "arc/input/keyboard.h" #include "arc/std/errno.h" #include "arc/std/handler.h" //NOTE: some of this file is temporary, mostly to get smthn running so I can test out different ideas #ifdef ARC_SDL #include #include "arc/graphics/sdl/window.h" #include "arc/graphics/sdl/renderer.h" #include "arc/input/sdl/mouse.h" #include "arc/input/sdl/keyboard.h" #endif // ARC_SDL void ARC_EngineData_Create(ARC_EngineData **data, ARC_Handler_CleanDataFn cleanfn){ *data = (ARC_EngineData *)malloc(sizeof(ARC_EngineData)); (*data)->window = NULL; (*data)->renderer = NULL; (*data)->mouse = NULL; ARC_Handler_Create(&((*data)->state), cleanfn); ARC_WindowInfo windowInfo; ARC_RenderInfo renderInfo; ARC_MouseInfo mouseInfo; ARC_KeyboardInfo keyboardInfo; (*data)->windowSize = (ARC_Point){ 2560, 1440 }; #ifdef ARC_SDL windowInfo = (ARC_WindowInfo){ "title", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, (*data)->windowSize.x, (*data)->windowSize.y, 0 }; #endif // ARC_SDL ARC_Window_Create(&((*data)->window), &windowInfo); if(arc_errno){ free(data); return; } #ifdef ARC_SDL renderInfo = (ARC_RenderInfo){ (SDL_Window *)(*data)->window->window, -1, SDL_RENDERER_ACCELERATED }; #endif // ARC_SDL ARC_Renderer_Create(&((*data)->renderer), &renderInfo); if(arc_errno){ ARC_Window_Destroy((*data)->window); free(data); } #ifdef ARC_SDL SDL_Event *event = (SDL_Event *)malloc(sizeof(SDL_Event)); mouseInfo = (ARC_MouseInfo ){ event }; keyboardInfo = (ARC_KeyboardInfo){ event }; #endif // ARC_SDL ARC_Mouse_Create(&((*data)->mouse), &mouseInfo); ARC_Keyboard_Create(&((*data)->keyboard), &keyboardInfo); } void ARC_EngineData_Destroy(ARC_EngineData *data){ #ifdef ARC_SDL free(data->mouse->event); #endif // ARC_SDL ARC_Mouse_Destroy(data->mouse); ARC_Keyboard_Destroy(data->keyboard); ARC_Renderer_Destroy(data->renderer); ARC_Window_Destroy(data->window); ARC_Handler_Destroy(data->state); } void ARC_Engine_Run(ARC_EngineData *data){ if(arc_errno){ return; } #ifdef ARC_SDL SDL_Event *event = data->mouse->event; #endif // ARC_SDL double lastTime = 0, currentTime; data->dt = 0; data->running = 0; while(!data->running){ #ifdef ARC_SDL currentTime = SDL_GetTicks(); data->dt = currentTime - lastTime; lastTime = currentTime; SDL_PollEvent(data->mouse->event); if(event->type == SDL_QUIT){ return; } if(event->type == SDL_KEYDOWN && event->key.keysym.sym == SDLK_ESCAPE){ return; } #endif // ARC_SDL ARC_Mouse_Update(data->mouse); ARC_Keyboard_Update(data->keyboard); ARC_Handler_Clean(data->state); ARC_Handler_Iterate(data->state, ARC_State_Update); ARC_Renderer_Clear(data->renderer); ARC_Handler_Iterate(data->state, ARC_State_Render); ARC_Renderer_Render(data->renderer); } }