mirror of
https://github.com/grumpycoders/pcsx-redux.git
synced 2025-04-02 10:41:54 -04:00
169 lines
5 KiB
C++
169 lines
5 KiB
C++
#include <SDL2/SDL.h>
|
|
#include <imgui.h>
|
|
#include <backends/imgui_impl_sdl.h>
|
|
#include <backends/imgui_impl_opengl3.h>
|
|
#include <time.h>
|
|
|
|
#ifdef _WIN32
|
|
#include <windows.h>
|
|
#endif
|
|
|
|
#include <GL/glew.h>
|
|
#if defined(__APPLE__)
|
|
#include <OpenGL/gl.h>
|
|
#else
|
|
#include <GL/gl.h>
|
|
#endif
|
|
#pragma comment(lib, "opengl32.lib")
|
|
|
|
#include "ImFileDialog.h"
|
|
|
|
// SDL defines main
|
|
#undef main
|
|
|
|
int main(int argc, char* argv[])
|
|
{
|
|
bool run = true;
|
|
srand(time(NULL));
|
|
|
|
// init sdl2
|
|
if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER | SDL_INIT_AUDIO) < 0) {
|
|
printf("Failed to initialize SDL2\n");
|
|
return 0;
|
|
}
|
|
|
|
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);
|
|
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
|
|
Uint32 windowFlags = SDL_WINDOW_OPENGL | SDL_WINDOW_RESIZABLE | SDL_WINDOW_ALLOW_HIGHDPI;
|
|
|
|
// create the window
|
|
int wndWidth = 1200, wndHeight = 800;
|
|
SDL_Window* wnd = SDL_CreateWindow("File Dialog", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, wndWidth, wndHeight, windowFlags);
|
|
|
|
// create the GL context
|
|
SDL_GLContext glContext = SDL_GL_CreateContext(wnd);
|
|
SDL_GL_MakeCurrent(wnd, glContext);
|
|
glEnable(GL_DEPTH_TEST);
|
|
glEnable(GL_STENCIL_TEST);
|
|
|
|
// init glew
|
|
glewExperimental = true;
|
|
if (glewInit() != GLEW_OK) {
|
|
printf("Failed to initialize GLEW\n");
|
|
return 0;
|
|
}
|
|
|
|
// imgui
|
|
ImGui::CreateContext();
|
|
ImGuiIO& io = ImGui::GetIO(); (void)io;
|
|
ImGui::StyleColorsLight();
|
|
|
|
ImGui_ImplSDL2_InitForOpenGL(wnd, glContext);
|
|
ImGui_ImplOpenGL3_Init();
|
|
|
|
// ImFileDialog requires you to set the CreateTexture and DeleteTexture
|
|
ifd::FileDialog::Instance().CreateTexture = [](uint8_t* data, int w, int h, char fmt) -> void* {
|
|
GLuint tex;
|
|
|
|
glGenTextures(1, &tex);
|
|
glBindTexture(GL_TEXTURE_2D, tex);
|
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
|
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
|
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
|
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, (fmt == 0) ? GL_BGRA : GL_RGBA, GL_UNSIGNED_BYTE, data);
|
|
glGenerateMipmap(GL_TEXTURE_2D);
|
|
glBindTexture(GL_TEXTURE_2D, 0);
|
|
|
|
return (void*)tex;
|
|
};
|
|
ifd::FileDialog::Instance().DeleteTexture = [](void* tex) {
|
|
GLuint texID = (GLuint)((uintptr_t)tex);
|
|
glDeleteTextures(1, &texID);
|
|
};
|
|
|
|
SDL_Event event;
|
|
while (run) {
|
|
while (SDL_PollEvent(&event)) {
|
|
if (event.type == SDL_QUIT)
|
|
run = false;
|
|
else if (event.type == SDL_WINDOWEVENT) {
|
|
if (event.window.event == SDL_WINDOWEVENT_MOVED || event.window.event == SDL_WINDOWEVENT_MAXIMIZED || event.window.event == SDL_WINDOWEVENT_RESIZED) {
|
|
Uint32 wndFlags = SDL_GetWindowFlags(wnd);
|
|
SDL_GetWindowSize(wnd, &wndWidth, &wndHeight);
|
|
}
|
|
}
|
|
|
|
// let ImGui handle the events
|
|
ImGui_ImplSDL2_ProcessEvent(&event);
|
|
}
|
|
|
|
if (!run) break;
|
|
|
|
// Dear ImGui frame
|
|
ImGui_ImplOpenGL3_NewFrame();
|
|
ImGui_ImplSDL2_NewFrame(wnd);
|
|
ImGui::NewFrame();
|
|
|
|
// Simple window
|
|
ImGui::Begin("Control Panel");
|
|
if (ImGui::Button("Open file"))
|
|
ifd::FileDialog::Instance().Open("ShaderOpenDialog", "Open a shader", "Image file (*.png;*.jpg;*.jpeg;*.bmp;*.tga){.png,.jpg,.jpeg,.bmp,.tga},.*", true);
|
|
if (ImGui::Button("Open directory"))
|
|
ifd::FileDialog::Instance().Open("DirectoryOpenDialog", "Open a directory", "");
|
|
if (ImGui::Button("Save file"))
|
|
ifd::FileDialog::Instance().Save("ShaderSaveDialog", "Save a shader", "*.sprj {.sprj}");
|
|
ImGui::End();
|
|
|
|
// file dialogs
|
|
if (ifd::FileDialog::Instance().IsDone("ShaderOpenDialog")) {
|
|
if (ifd::FileDialog::Instance().HasResult()) {
|
|
const std::vector<std::filesystem::path>& res = ifd::FileDialog::Instance().GetResults();
|
|
for (const auto& r : res) // ShaderOpenDialog supports multiselection
|
|
printf("OPEN[%s]\n", r.u8string().c_str());
|
|
}
|
|
ifd::FileDialog::Instance().Close();
|
|
}
|
|
if (ifd::FileDialog::Instance().IsDone("DirectoryOpenDialog")) {
|
|
if (ifd::FileDialog::Instance().HasResult()) {
|
|
std::string res = ifd::FileDialog::Instance().GetResult().u8string();
|
|
printf("DIRECTORY[%s]\n", res.c_str());
|
|
}
|
|
ifd::FileDialog::Instance().Close();
|
|
}
|
|
if (ifd::FileDialog::Instance().IsDone("ShaderSaveDialog")) {
|
|
if (ifd::FileDialog::Instance().HasResult()) {
|
|
std::string res = ifd::FileDialog::Instance().GetResult().u8string();
|
|
printf("SAVE[%s]\n", res.c_str());
|
|
}
|
|
ifd::FileDialog::Instance().Close();
|
|
}
|
|
|
|
|
|
|
|
glBindFramebuffer(GL_FRAMEBUFFER, 0);
|
|
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
|
|
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
|
|
glViewport(0, 0, wndWidth, wndHeight);
|
|
|
|
// render Dear ImGui
|
|
ImGui::Render();
|
|
ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData());
|
|
|
|
SDL_GL_SwapWindow(wnd);
|
|
}
|
|
|
|
// Dear ImGui cleanup
|
|
ImGui_ImplOpenGL3_Shutdown();
|
|
ImGui_ImplSDL2_Shutdown();
|
|
ImGui::DestroyContext();
|
|
|
|
// SDL2 cleanup
|
|
SDL_GL_DeleteContext(glContext);
|
|
SDL_DestroyWindow(wnd);
|
|
SDL_Quit();
|
|
|
|
return 0;
|
|
}
|