| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178 |
- #include "os.hpp"
- #include <SDL3/SDL.h>
- #include <SDL3/SDL_oldnames.h>
- #include <SDL3/SDL_video.h>
- #include <imgui.h>
- #include <imgui_impl_sdl3.h>
- #include <imgui_impl_sdlrenderer3.h>
- #include <filesystem>
- #include <locale>
- #include <string>
- namespace saura {
- OS::OS() {
- root_window_ctx = std::make_unique<Window_Context>();
- root_window_ctx->title = "(Saura Studios) [Dev]";
- root_window_ctx->w = 1280;
- root_window_ctx->h = 720;
- std::locale::global(std::locale("en_US.UTF-8"));
- if (!SDL_Init(SDL_INIT_VIDEO)) {
- throw std::runtime_error("Failed SDL_Init!");
- }
- SDL_WindowFlags window_flags = SDL_WINDOW_RESIZABLE | SDL_WINDOW_HIDDEN;
- root_window_ctx->handle =
- SDL_CreateWindow(root_window_ctx->title.c_str(), root_window_ctx->w,
- root_window_ctx->h, window_flags);
- if (root_window_ctx->handle == nullptr) {
- throw std::runtime_error("Failed SDL_CreateWindow!");
- }
- root_window_ctx->renderer =
- SDL_CreateRenderer(root_window_ctx->handle, nullptr);
- if (root_window_ctx->renderer == nullptr) {
- throw std::runtime_error("Failed SDL_CreateRenderer!");
- }
- SDL_SetRenderVSync(root_window_ctx->renderer, SDL_RENDERER_VSYNC_DISABLED);
- SDL_SetWindowPosition(root_window_ctx->handle, SDL_WINDOWPOS_CENTERED,
- SDL_WINDOWPOS_CENTERED);
- SDL_ShowWindow(root_window_ctx->handle);
- // Setup imgui
- IMGUI_CHECKVERSION();
- ImGui::CreateContext();
- ImGuiIO &io = ImGui::GetIO();
- (void)io;
- io.ConfigFlags |=
- ImGuiConfigFlags_NavEnableKeyboard; // Enable Keyboard Controls
- io.ConfigFlags |=
- ImGuiConfigFlags_NavEnableGamepad; // Enable Gamepad Controls
- // Setup Dear ImGui style
- ImGui::StyleColorsDark();
- // Setup Platform/Renderer backends
- ImGui_ImplSDL3_InitForSDLRenderer(root_window_ctx->handle,
- root_window_ctx->renderer);
- ImGui_ImplSDLRenderer3_Init(root_window_ctx->renderer);
- }
- OS::~OS() {
- ImGui_ImplSDLRenderer3_Shutdown();
- ImGui_ImplSDL3_Shutdown();
- ImGui::DestroyContext();
- SDL_DestroyRenderer(root_window_ctx->renderer);
- SDL_DestroyWindow(root_window_ctx->handle);
- SDL_Quit();
- }
- void OS::draw_begin() {
- ImGui_ImplSDLRenderer3_NewFrame();
- ImGui_ImplSDL3_NewFrame();
- ImGui::NewFrame();
- }
- void OS::draw_end() {
- ImVec4 clear_color = {0.15f, 0.15f, 0.15f, 0.0f};
- ImGuiIO &io = ImGui::GetIO();
- (void)io;
- ImGui::Render();
- SDL_SetRenderScale(root_window_ctx->renderer, io.DisplayFramebufferScale.x,
- io.DisplayFramebufferScale.y);
- SDL_SetRenderDrawColorFloat(root_window_ctx->renderer, clear_color.x,
- clear_color.y, clear_color.z, clear_color.w);
- SDL_RenderClear(root_window_ctx->renderer);
- ImGui_ImplSDLRenderer3_RenderDrawData(ImGui::GetDrawData(),
- root_window_ctx->renderer);
- SDL_RenderPresent(root_window_ctx->renderer);
- }
- void OS::update() {
- int w, h = 0;
- SDL_GetWindowSize(root_window_ctx->handle, &w, &h);
- root_window_ctx->w = w;
- root_window_ctx->h = h;
- }
- bool OS::update_events() {
- SDL_Event event = {};
- while (SDL_PollEvent(&event)) {
- ImGui_ImplSDL3_ProcessEvent(&event);
- switch (event.type) {
- case SDL_EVENT_KEY_UP: {
- if (event.key.key == SDLK_ESCAPE) {
- return false;
- }
- break;
- }
- case SDL_EVENT_QUIT: {
- return false;
- }
- case SDL_EVENT_WINDOW_CLOSE_REQUESTED: {
- if (event.window.windowID == SDL_GetWindowID(root_window_ctx->handle)) {
- return false;
- }
- break;
- }
- }
- }
- return true;
- }
- void OS::sleep(double ms) { SDL_Delay((Uint32)ms * 1000); }
- int OS::get_root_window_width() { return root_window_ctx->w; }
- int OS::get_root_window_height() { return root_window_ctx->h; }
- void OS::set_root_window_title(std::string title) {
- SDL_SetWindowTitle(root_window_ctx.get()->handle, title.c_str());
- }
- double OS::get_performance_frequency() {
- return (double)SDL_GetPerformanceFrequency();
- }
- double OS::get_performance_counter() {
- return (double)SDL_GetPerformanceCounter();
- }
- std::string OS::get_safe_getenv(const std::string key) {
- return SDL_getenv(key.c_str());
- }
- fs::path OS::get_home_config_path() {
- fs::path res = {};
- #if defined(_WIN32)
- auto config = get_safe_getenv("APPDATA");
- if (config.empty()) {
- throw std::runtime_error("APPDATA environment variable not found");
- }
- res = fs::path(config);
- #elif defined(__linux__)
- auto config = get_safe_getenv("HOME");
- if (config.empty()) {
- throw std::runtime_error("HOME environment variable not found");
- }
- res = fs::path(config) / ".config";
- #endif
- return res;
- }
- std::string OS::get_user_name() { return get_safe_getenv("USERNAME"); }
- } // namespace saura
|