16 if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_TIMER) != 0) {
17 return absl::InternalError(
18 absl::StrFormat(
"SDL_Init: %s\n", SDL_GetError()));
21 SDL_DisplayMode display_mode;
22 SDL_GetCurrentDisplayMode(0, &display_mode);
23 int screen_width = display_mode.w * 0.8;
24 int screen_height = display_mode.h * 0.8;
26 window.
window_ = std::unique_ptr<SDL_Window, SDL_Deleter>(
27 SDL_CreateWindow(
"Yet Another Zelda3 Editor", SDL_WINDOWPOS_UNDEFINED,
28 SDL_WINDOWPOS_UNDEFINED, screen_width, screen_height,
31 if (window.
window_ ==
nullptr) {
32 return absl::InternalError(
33 absl::StrFormat(
"SDL_CreateWindow: %s\n", SDL_GetError()));
39 ImGui::CreateContext();
40 ImGuiIO& io = ImGui::GetIO();
41 io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard;
42 io.ConfigFlags |= ImGuiConfigFlags_DockingEnable;
44 ImGui_ImplSDL2_InitForSDLRenderer(window.
window_.get(),
52 ImGui_ImplSDLRenderer2_NewFrame();
53 ImGui_ImplSDL2_NewFrame();
55 const int audio_frequency = 48000;
56 SDL_AudioSpec want, have;
57 SDL_memset(&want, 0,
sizeof(want));
58 want.freq = audio_frequency;
59 want.format = AUDIO_S16;
63 window.
audio_device_ = SDL_OpenAudioDevice(NULL, 0, &want, &have, 0);
65 throw std::runtime_error(
66 absl::StrFormat(
"Failed to open audio: %s\n", SDL_GetError()));
68 window.
audio_buffer_ = std::make_shared<int16_t>(audio_frequency / 50 * 4);
71 return absl::OkStatus();
88 ImGuiIO &io = ImGui::GetIO();
89 SDL_WaitEvent(&event);
90 ImGui_ImplSDL2_ProcessEvent(&event);
94 io.KeyShift = ((SDL_GetModState() & KMOD_SHIFT) != 0);
95 io.KeyCtrl = ((SDL_GetModState() & KMOD_CTRL) != 0);
96 io.KeyAlt = ((SDL_GetModState() & KMOD_ALT) != 0);
97 io.KeySuper = ((SDL_GetModState() & KMOD_GUI) != 0);
100 case SDL_WINDOWEVENT:
101 switch (event.window.event) {
102 case SDL_WINDOWEVENT_CLOSE:
105 case SDL_WINDOWEVENT_SIZE_CHANGED:
106 io.DisplaySize.x =
static_cast<float>(
event.window.data1);
107 io.DisplaySize.y =
static_cast<float>(
event.window.data2);
114 const int buttons = SDL_GetMouseState(&mouseX, &mouseY);
116 io.DeltaTime = 1.0f / 60.0f;
117 io.MousePos = ImVec2(
static_cast<float>(mouseX),
static_cast<float>(mouseY));
118 io.MouseDown[0] = buttons & SDL_BUTTON(SDL_BUTTON_LEFT);
119 io.MouseDown[1] = buttons & SDL_BUTTON(SDL_BUTTON_RIGHT);
120 io.MouseDown[2] = buttons & SDL_BUTTON(SDL_BUTTON_MIDDLE);
123 io.MouseWheel =
static_cast<float>(wheel);
124 return absl::OkStatus();