72 return absl::FailedPreconditionError(
73 "Legacy SDL2 window path is unavailable when building with SDL3");
75 if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_TIMER) != 0) {
76 return absl::InternalError(
77 absl::StrFormat(
"SDL_Init: %s\n", SDL_GetError()));
80 SDL_DisplayMode display_mode;
81 SDL_GetCurrentDisplayMode(0, &display_mode);
82 int screen_width = display_mode.w * 0.8;
83 int screen_height = display_mode.h * 0.8;
85 window.
window_ = std::unique_ptr<SDL_Window, util::SDL_Deleter>(
86 SDL_CreateWindow(
"Yet Another Zelda3 Editor", SDL_WINDOWPOS_UNDEFINED,
87 SDL_WINDOWPOS_UNDEFINED, screen_width, screen_height,
90 if (window.
window_ ==
nullptr) {
91 return absl::InternalError(
92 absl::StrFormat(
"SDL_CreateWindow: %s\n", SDL_GetError()));
98 return absl::InternalError(
"Failed to initialize renderer");
102 IMGUI_CHECKVERSION();
103 ImGui::CreateContext();
104 ImGuiIO& io = ImGui::GetIO();
105 io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard;
106 io.ConfigFlags |= ImGuiConfigFlags_DockingEnable;
110 io.ConfigMacOSXBehaviors =
true;
114 static std::string ini_path_str;
115 if (ini_path_str.empty()) {
116 ini_path_str = ini_path->string();
118 io.IniFilename = ini_path_str.c_str();
120 io.IniFilename =
nullptr;
121 LOG_WARN(
"Window",
"Failed to resolve ImGui ini path: %s",
122 ini_path.status().ToString().c_str());
126#ifdef IMGUI_DISABLE_DEFAULT_ASSERT_HANDLER
127 ImGui::SetAssertHandler(ImGuiAssertionHandler);
130 LOG_INFO(
"Window",
"ImGui assertions are disabled in this build");
134#if defined(YAZE_ENABLE_IMGUI_TEST_ENGINE) && YAZE_ENABLE_IMGUI_TEST_ENGINE
140 SDL_Renderer* sdl_renderer =
142 ImGui_ImplSDL2_InitForSDLRenderer(window.
window_.get(), sdl_renderer);
143 ImGui_ImplSDLRenderer2_Init(sdl_renderer);
154 const int audio_frequency = 48000;
155 const size_t buffer_size =
156 (audio_frequency / 50) * 2;
161 new int16_t[buffer_size], std::default_delete<int16_t[]>());
167 "Audio buffer allocated: %zu int16_t samples (backend in Emulator)",
171 return absl::OkStatus();
222 return absl::FailedPreconditionError(
223 "Legacy SDL2 window path is unavailable when building with SDL3");
226 ImGuiIO& io = ImGui::GetIO();
230 while (SDL_PollEvent(&event)) {
231 ImGui_ImplSDL2_ProcessEvent(&event);
232 switch (event.type) {
236 case SDL_WINDOWEVENT:
237 switch (event.window.event) {
238 case SDL_WINDOWEVENT_CLOSE:
241 case SDL_WINDOWEVENT_SIZE_CHANGED:
242 case SDL_WINDOWEVENT_RESIZED:
244 io.DisplaySize.x =
static_cast<float>(
event.window.data1);
245 io.DisplaySize.y =
static_cast<float>(
event.window.data2);
248 case SDL_WINDOWEVENT_MINIMIZED:
249 case SDL_WINDOWEVENT_HIDDEN:
253 case SDL_WINDOWEVENT_RESTORED:
254 case SDL_WINDOWEVENT_SHOWN:
255 case SDL_WINDOWEVENT_EXPOSED:
265 const int buttons = SDL_GetMouseState(&mouseX, &mouseY);
267 io.DeltaTime = 1.0f / 60.0f;
268 io.MousePos = ImVec2(
static_cast<float>(mouseX),
static_cast<float>(mouseY));
269 io.MouseDown[0] = buttons & SDL_BUTTON(SDL_BUTTON_LEFT);
270 io.MouseDown[1] = buttons & SDL_BUTTON(SDL_BUTTON_RIGHT);
271 io.MouseDown[2] = buttons & SDL_BUTTON(SDL_BUTTON_MIDDLE);
274 io.MouseWheel =
static_cast<float>(wheel);
275 return absl::OkStatus();