#include "state.h" static void _tick(State* state); static void _draw(State* state); static void _tick(State* state) { SDL_Event event; SDL_MouseWheelEvent* mouseWheelEvent; state->input.mouse.wheelDeltaY = 0; while(SDL_PollEvent(&event)) { ImGui_ImplSDL3_ProcessEvent(&event); switch (event.type) { case SDL_EVENT_QUIT: state->isRunning = false; break; case SDL_EVENT_MOUSE_WHEEL: mouseWheelEvent = &event.wheel; state->input.mouse.wheelDeltaY = mouseWheelEvent->y; break; default: break; } } SDL_GetWindowSize(state->window, &state->settings.windowW, &state->settings.windowH); input_tick(&state->input); preview_tick(&state->preview); dialog_tick(&state->dialog); imgui_tick(&state->imgui); } static void _draw(State* state) { preview_draw(&state->preview); imgui_draw(&state->imgui); SDL_GL_SwapWindow(state->window); } void init(State* state) { /* set start working directory */ std::filesystem::path startPath = std::filesystem::current_path(); memset(state->startPath, '\0', PATH_MAX - 1); strncpy(state->startPath, startPath.c_str(), PATH_MAX - 1); settings_load(&state->settings); printf(STRING_INFO_INIT); if (!SDL_Init(SDL_INIT_VIDEO)) { printf(STRING_ERROR_SDL_INIT, SDL_GetError()); quit(state); } printf(STRING_INFO_SDL_INIT); SDL_CreateWindowAndRenderer ( STRING_WINDOW_TITLE, state->settings.windowW, state->settings.windowH, WINDOW_FLAGS, &state->window, &state->renderer ); SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE); SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3); SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 3); state->glContext = SDL_GL_CreateContext(state->window); printf(STRING_INFO_OPENGL, glGetString(GL_VERSION)); if (!state->glContext) { printf(STRING_ERROR_GL_CONTEXT_INIT, SDL_GetError()); quit(state); } glewInit(); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glDisable(GL_DEPTH_TEST); printf(STRING_INFO_GLEW_INIT); resources_init(&state->resources); dialog_init(&state->dialog, &state->anm2, &state->resources, state->window); preview_init(&state->preview, &state->anm2, &state->resources, &state->input, &state->settings); imgui_init ( &state->imgui, &state->dialog, &state->resources, &state->input, &state->anm2, &state->preview, &state->settings, state->window, &state->glContext ); if (state->isArgument) anm2_deserialize(&state->anm2, &state->resources, state->argument); else anm2_new(&state->anm2); window_title_from_anm2_set(state->window, &state->anm2); } void loop(State* state) { state->tick = SDL_GetTicks(); while (state->tick > state->lastTick + TICK_DELAY) { state->tick = SDL_GetTicks(); if (state->tick - state->lastTick < TICK_DELAY) SDL_Delay(TICK_DELAY - (state->tick - state->lastTick)); _tick(state); _draw(state); state->lastTick = state->tick; } } void quit(State* state) { /* return to base path */ std::filesystem::current_path(state->startPath); imgui_free(&state->imgui); settings_save(&state->settings); preview_free(&state->preview); resources_free(&state->resources); SDL_GL_DestroyContext(state->glContext); SDL_Quit(); printf(STRING_INFO_QUIT); }