The Update(TM), Part 1
This commit is contained in:
191
src/state.cpp
191
src/state.cpp
@@ -1,182 +1,133 @@
|
||||
#include "state.h"
|
||||
|
||||
static void _tick(State* state);
|
||||
static void _draw(State* state);
|
||||
|
||||
static void
|
||||
_tick(State* state)
|
||||
static void _tick(State* self)
|
||||
{
|
||||
SDL_Event event;
|
||||
SDL_MouseWheelEvent* mouseWheelEvent;
|
||||
SDL_GetWindowSize(self->window, &self->settings.windowW, &self->settings.windowH);
|
||||
|
||||
state->input.mouse.wheelDeltaY = 0;
|
||||
editor_tick(&self->editor);
|
||||
preview_tick(&self->preview);
|
||||
dialog_tick(&self->dialog);
|
||||
imgui_tick(&self->imgui);
|
||||
|
||||
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);
|
||||
editor_tick(&state->editor);
|
||||
preview_tick(&state->preview);
|
||||
tool_tick(&state->tool);
|
||||
snapshots_tick(&state->snapshots);
|
||||
dialog_tick(&state->dialog);
|
||||
imgui_tick(&state->imgui);
|
||||
|
||||
if (input_release(&state->input, INPUT_SAVE))
|
||||
{
|
||||
// Open dialog if path empty, otherwise save in-place
|
||||
if (state->anm2.path.empty())
|
||||
dialog_anm2_save(&state->dialog);
|
||||
else
|
||||
anm2_serialize(&state->anm2, state->anm2.path);
|
||||
}
|
||||
|
||||
if (input_release(&state->input, INPUT_PLAY))
|
||||
{
|
||||
state->preview.isPlaying = !state->preview.isPlaying;
|
||||
state->preview.isRecording = false;
|
||||
}
|
||||
if (self->imgui.isQuit) self->isRunning = false;
|
||||
}
|
||||
|
||||
static void
|
||||
_draw(State* state)
|
||||
static void _draw(State* self)
|
||||
{
|
||||
editor_draw(&state->editor);
|
||||
preview_draw(&state->preview);
|
||||
editor_draw(&self->editor);
|
||||
preview_draw(&self->preview);
|
||||
imgui_draw();
|
||||
|
||||
SDL_GL_SwapWindow(state->window);
|
||||
SDL_GL_SwapWindow(self->window);
|
||||
}
|
||||
|
||||
void
|
||||
init(State* state)
|
||||
void init(State* self)
|
||||
{
|
||||
settings_load(&state->settings);
|
||||
settings_init(&self->settings);
|
||||
|
||||
std::cout << STRING_INFO_INIT << std::endl;
|
||||
log_info(STATE_INIT_INFO);
|
||||
|
||||
if (!SDL_Init(SDL_INIT_VIDEO))
|
||||
{
|
||||
std::cout << STRING_ERROR_SDL_INIT << SDL_GetError() << std::endl;
|
||||
quit(state);
|
||||
log_error(std::format(STATE_SDL_INIT_ERROR, SDL_GetError()));
|
||||
quit(self);
|
||||
}
|
||||
|
||||
log_info(STATE_SDL_INIT_INFO);
|
||||
|
||||
SDL_CreateWindowAndRenderer
|
||||
(
|
||||
STRING_WINDOW_TITLE,
|
||||
state->settings.windowW,
|
||||
state->settings.windowH,
|
||||
WINDOW_TITLE,
|
||||
self->settings.windowW,
|
||||
self->settings.windowH,
|
||||
WINDOW_FLAGS,
|
||||
&state->window,
|
||||
&state->renderer
|
||||
&self->window,
|
||||
&self->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);
|
||||
glewInit();
|
||||
|
||||
if (!state->glContext)
|
||||
self->glContext = SDL_GL_CreateContext(self->window);
|
||||
|
||||
if (!self->glContext)
|
||||
{
|
||||
std::cout << STRING_ERROR_GL_CONTEXT_INIT << SDL_GetError() << std::endl;
|
||||
quit(state);
|
||||
log_error(std::format(STATE_GL_CONTEXT_INIT_ERROR, SDL_GetError()));
|
||||
quit(self);
|
||||
}
|
||||
|
||||
std::cout << STRING_INFO_SDL_INIT << "(" << STRING_INFO_OPENGL << glGetString(GL_VERSION) << ")" << std::endl;
|
||||
|
||||
glewInit();
|
||||
log_info(std::format(STATE_GL_CONTEXT_INIT_INFO, (const char*)glGetString(GL_VERSION)));
|
||||
|
||||
glEnable(GL_BLEND);
|
||||
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
||||
glDisable(GL_DEPTH_TEST);
|
||||
glLineWidth(LINE_WIDTH);
|
||||
glLineWidth(STATE_GL_LINE_WIDTH);
|
||||
|
||||
std::cout << STRING_INFO_GLEW_INIT << std::endl;
|
||||
|
||||
resources_init(&state->resources);
|
||||
dialog_init(&state->dialog, &state->anm2, &state->reference, &state->resources, state->window);
|
||||
tool_init(&state->tool, &state->input);
|
||||
snapshots_init(&state->snapshots, &state->anm2, &state->reference, &state->time, &state->input);
|
||||
preview_init(&state->preview, &state->anm2, &state->reference, &state->time, &state->resources, &state->settings);
|
||||
editor_init(&state->editor, &state->anm2, &state->reference, &state->resources, &state->settings);
|
||||
resources_init(&self->resources);
|
||||
clipboard_init(&self->clipboard, &self->anm2);
|
||||
dialog_init(&self->dialog, &self->anm2, &self->reference, &self->resources, self->window);
|
||||
snapshots_init(&self->snapshots, &self->anm2, &self->reference, &self->preview);
|
||||
preview_init(&self->preview, &self->anm2, &self->reference, &self->resources, &self->settings);
|
||||
editor_init(&self->editor, &self->anm2, &self->reference, &self->resources, &self->settings);
|
||||
|
||||
imgui_init
|
||||
(
|
||||
&state->imgui,
|
||||
&state->dialog,
|
||||
&state->resources,
|
||||
&state->input,
|
||||
&state->anm2,
|
||||
&state->reference,
|
||||
&state->time,
|
||||
&state->editor,
|
||||
&state->preview,
|
||||
&state->settings,
|
||||
&state->tool,
|
||||
&state->snapshots,
|
||||
state->window,
|
||||
&state->glContext
|
||||
&self->imgui,
|
||||
&self->dialog,
|
||||
&self->resources,
|
||||
&self->anm2,
|
||||
&self->reference,
|
||||
&self->editor,
|
||||
&self->preview,
|
||||
&self->settings,
|
||||
&self->snapshots,
|
||||
&self->clipboard,
|
||||
self->window,
|
||||
&self->glContext
|
||||
);
|
||||
|
||||
if (state->isArgument)
|
||||
if (self->is_argument())
|
||||
{
|
||||
anm2_deserialize(&state->anm2, &state->resources, state->argument);
|
||||
window_title_from_path_set(state->window, state->argument);
|
||||
anm2_deserialize(&self->anm2, &self->resources, self->argument);
|
||||
window_title_from_path_set(self->window, self->argument);
|
||||
}
|
||||
else
|
||||
anm2_new(&state->anm2);
|
||||
anm2_new(&self->anm2);
|
||||
}
|
||||
|
||||
void
|
||||
loop(State* state)
|
||||
void loop(State* self)
|
||||
{
|
||||
state->tick = SDL_GetTicks();
|
||||
self->tick = SDL_GetTicks();
|
||||
|
||||
while (state->tick > state->lastTick + TICK_DELAY)
|
||||
while (self->tick > self->lastTick + TICK_DELAY)
|
||||
{
|
||||
state->tick = SDL_GetTicks();
|
||||
self->tick = SDL_GetTicks();
|
||||
|
||||
if (state->tick - state->lastTick < TICK_DELAY)
|
||||
SDL_Delay(TICK_DELAY - (state->tick - state->lastTick));
|
||||
if (self->tick - self->lastTick < TICK_DELAY)
|
||||
SDL_Delay(TICK_DELAY - (self->tick - self->lastTick));
|
||||
|
||||
_tick(state);
|
||||
_tick(self);
|
||||
|
||||
self->lastTick = self->tick;
|
||||
|
||||
state->lastTick = state->tick;
|
||||
}
|
||||
|
||||
_draw(state);
|
||||
_draw(self);
|
||||
}
|
||||
|
||||
void
|
||||
quit(State* state)
|
||||
void quit(State* self)
|
||||
{
|
||||
imgui_free();
|
||||
settings_save(&state->settings);
|
||||
preview_free(&state->preview);
|
||||
editor_free(&state->editor);
|
||||
resources_free(&state->resources);
|
||||
settings_save(&self->settings);
|
||||
preview_free(&self->preview);
|
||||
editor_free(&self->editor);
|
||||
resources_free(&self->resources);
|
||||
|
||||
SDL_GL_DestroyContext(state->glContext);
|
||||
SDL_GL_DestroyContext(self->glContext);
|
||||
SDL_Quit();
|
||||
|
||||
std::cout << STRING_INFO_QUIT << std::endl;
|
||||
}
|
||||
|
||||
log_info(STATE_QUIT_INFO);
|
||||
}
|
Reference in New Issue
Block a user