29 return absl::FailedPreconditionError(
30 "Legacy SDL2 window path is unavailable when building with SDL3");
32 if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_TIMER) != 0) {
33 return absl::InternalError(
34 absl::StrFormat(
"SDL_Init: %s\n", SDL_GetError()));
37 SDL_DisplayMode display_mode;
38 SDL_GetCurrentDisplayMode(0, &display_mode);
39 int screen_width = display_mode.w * 0.8;
40 int screen_height = display_mode.h * 0.8;
42 window.
window_ = std::unique_ptr<SDL_Window, util::SDL_Deleter>(
43 SDL_CreateWindow(
"Yet Another Zelda3 Editor", SDL_WINDOWPOS_UNDEFINED,
44 SDL_WINDOWPOS_UNDEFINED, screen_width, screen_height,
47 if (window.
window_ ==
nullptr) {
48 return absl::InternalError(
49 absl::StrFormat(
"SDL_CreateWindow: %s\n", SDL_GetError()));
55 return absl::InternalError(
"Failed to initialize renderer");
60 ImGui::CreateContext();
61 ImGuiIO& io = ImGui::GetIO();
63 io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard;
64 io.ConfigFlags |= ImGuiConfigFlags_DockingEnable;
68 io.ConfigMacOSXBehaviors =
true;
72 static std::string ini_path_str;
73 if (ini_path_str.empty()) {
74 ini_path_str = ini_path->string();
76 io.IniFilename = ini_path_str.c_str();
78 io.IniFilename =
nullptr;
79 LOG_WARN(
"Window",
"Failed to resolve ImGui ini path: %s",
80 ini_path.status().ToString().c_str());
84#if defined(YAZE_ENABLE_IMGUI_TEST_ENGINE) && YAZE_ENABLE_IMGUI_TEST_ENGINE
90 SDL_Renderer* sdl_renderer =
92 ImGui_ImplSDL2_InitForSDLRenderer(window.
window_.get(), sdl_renderer);
104 const int audio_frequency = 48000;
105 const size_t buffer_size =
106 (audio_frequency / 50) * 2;
111 new int16_t[buffer_size], std::default_delete<int16_t[]>());
117 "Audio buffer allocated: %zu int16_t samples (backend in Emulator)",
121 return absl::OkStatus();
172 return absl::FailedPreconditionError(
173 "Legacy SDL2 window path is unavailable when building with SDL3");
176 ImGuiIO& io = ImGui::GetIO();
180 while (SDL_PollEvent(&event)) {
181 ImGui_ImplSDL2_ProcessEvent(&event);
182 switch (event.type) {
186 case SDL_WINDOWEVENT:
187 switch (event.window.event) {
188 case SDL_WINDOWEVENT_CLOSE:
191 case SDL_WINDOWEVENT_SIZE_CHANGED:
192 case SDL_WINDOWEVENT_RESIZED:
194 io.DisplaySize.x =
static_cast<float>(
event.window.data1);
195 io.DisplaySize.y =
static_cast<float>(
event.window.data2);
198 case SDL_WINDOWEVENT_MINIMIZED:
199 case SDL_WINDOWEVENT_HIDDEN:
203 case SDL_WINDOWEVENT_RESTORED:
204 case SDL_WINDOWEVENT_SHOWN:
205 case SDL_WINDOWEVENT_EXPOSED:
215 const int buttons = SDL_GetMouseState(&mouseX, &mouseY);
217 io.DeltaTime = 1.0f / 60.0f;
218 io.MousePos = ImVec2(
static_cast<float>(mouseX),
static_cast<float>(mouseY));
219 io.MouseDown[0] = buttons & SDL_BUTTON(SDL_BUTTON_LEFT);
220 io.MouseDown[1] = buttons & SDL_BUTTON(SDL_BUTTON_RIGHT);
221 io.MouseDown[2] = buttons & SDL_BUTTON(SDL_BUTTON_MIDDLE);
224 io.MouseWheel =
static_cast<float>(wheel);
225 return absl::OkStatus();