Skip to content
Extraits de code Groupes Projets
Vérifiée Valider 7eb22890 rédigé par Kubat's avatar Kubat
Parcourir les fichiers

Setting small methods to separate things in the main

parent 4b3dc4d9
Aucune branche associée trouvée
Aucune étiquette associée trouvée
Aucune requête de fusion associée trouvée
......@@ -4,22 +4,9 @@ std::shared_ptr<MainWindow> MainWindow::self = nullptr;
Uint32 MainWindow::wakeup_on_mpv_render_update = 0;
Uint32 MainWindow::wakeup_on_mpv_events = 0;
int __one[] = {1};
mpv_opengl_init_params mpv_gl_init_params = {
.get_proc_address = [] (void *, const char *name) -> void * { return SDL_GL_GetProcAddress(name); },
};
mpv_render_param params[] = {
{MPV_RENDER_PARAM_API_TYPE, (void *) MPV_RENDER_API_TYPE_OPENGL},
{MPV_RENDER_PARAM_OPENGL_INIT_PARAMS, &mpv_gl_init_params},
{MPV_RENDER_PARAM_ADVANCED_CONTROL, &__one}, /* Async commands only */
{(mpv_render_param_type)0}
};
MainWindow::MainWindow(void) :
show_demo_window(true), show_another_window(false), clear_color(0.45f, 0.55f, 0.60f, 1.00f),
mpv_gl(nullptr), mpv(mpv_create())
mpv_gl(nullptr), mpv(mpv_create()), done(false)
{
if (!mpv)
throw 1; /* TODO */
......@@ -60,6 +47,18 @@ MainWindow::MainWindow(void) :
throw 1;
}
int __one[] = {1};
mpv_opengl_init_params mpv_gl_init_params = {
.get_proc_address = [] (void *, const char *name) -> void * { return SDL_GL_GetProcAddress(name); },
};
mpv_render_param params[] = {
{MPV_RENDER_PARAM_API_TYPE, (void *) MPV_RENDER_API_TYPE_OPENGL},
{MPV_RENDER_PARAM_OPENGL_INIT_PARAMS, &mpv_gl_init_params},
{MPV_RENDER_PARAM_ADVANCED_CONTROL, &__one}, /* Async commands only */
{(mpv_render_param_type)0}
};
if (mpv_render_context_create(&mpv_gl, mpv, params) < 0) /* Resolv already created context */
throw 1;
......@@ -84,6 +83,7 @@ MainWindow::MainWindow(void) :
io->ConfigFlags |= ImGuiConfigFlags_DockingEnable;
io->ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard;
io->ConfigFlags |= ImGuiConfigFlags_ViewportsEnable;
ImGui::StyleColorsDark();
ImGui_ImplSDL2_InitForOpenGL(window, gl_context);
ImGui_ImplOpenGL3_Init(glsl_version);
......@@ -122,139 +122,154 @@ MainWindow::DeInit(void)
void
MainWindow::Main(void)
{
bool done = false;
while (!done)
{
// Poll and handle events (inputs, window resize, etc.)
// You can read the io.WantCaptureMouse, io.WantCaptureKeyboard flags to tell if dear imgui wants to use your inputs.
// - When io.WantCaptureMouse is true, do not dispatch mouse input data to your main application.
// - When io.WantCaptureKeyboard is true, do not dispatch keyboard input data to your main application.
// Generally you may always pass all inputs to dear imgui, and hide them from your application based on those two flags.
SDL_Event event;
while (SDL_PollEvent(&event))
HandleEvents();
HandleLayers();
HandleRender();
}
DeInit();
}
void
MainWindow::HandleRender(void)
{
// Rendering
ImGui::Render();
/* Always redraw */
int w, h;
int __one__one = 1;
SDL_GetWindowSize(window, &w, &h);
mpv_opengl_fbo fbo = {
.fbo = 0,
.w = w,
.h = h,
};
mpv_render_param params[] = {
{MPV_RENDER_PARAM_OPENGL_FBO, &fbo},
{MPV_RENDER_PARAM_FLIP_Y, &__one__one},
{(mpv_render_param_type)0}
};
// mpv_render_context_render(mpv_gl, params);
SDL_Window* backup_current_window = SDL_GL_GetCurrentWindow();
SDL_GLContext backup_current_context = SDL_GL_GetCurrentContext();
ImGui::UpdatePlatformWindows();
ImGui::RenderPlatformWindowsDefault();
SDL_GL_MakeCurrent(backup_current_window, backup_current_context);
mpv_render_context_render(mpv_gl, params);
ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData());
SDL_GL_SwapWindow(window);
}
void
MainWindow::HandleEvents(void)
{
// Poll and handle events (inputs, window resize, etc.)
// You can read the io.WantCaptureMouse, io.WantCaptureKeyboard flags to tell if dear imgui wants to use your inputs.
// - When io.WantCaptureMouse is true, do not dispatch mouse input data to your main application.
// - When io.WantCaptureKeyboard is true, do not dispatch keyboard input data to your main application.
// Generally you may always pass all inputs to dear imgui, and hide them from your application based on those two flags.
SDL_Event event;
while (SDL_PollEvent(&event))
{
ImGui_ImplSDL2_ProcessEvent(&event);
if (event.type == SDL_QUIT)
done = true;
if (event.type == SDL_WINDOWEVENT && event.window.event == SDL_WINDOWEVENT_CLOSE && event.window.windowID == SDL_GetWindowID(window))
done = true;
if (event.type == SDL_KEYDOWN)
{
ImGui_ImplSDL2_ProcessEvent(&event);
if (event.type == SDL_QUIT)
done = true;
if (event.type == SDL_WINDOWEVENT && event.window.event == SDL_WINDOWEVENT_CLOSE && event.window.windowID == SDL_GetWindowID(window))
done = true;
if (event.type == SDL_KEYDOWN)
if (event.key.keysym.sym == SDLK_SPACE)
{
if (event.key.keysym.sym == SDLK_SPACE)
{
const char *cmd_pause[] = {"cycle", "pause", NULL};
mpv_command_async(mpv, 0, cmd_pause);
}
if (event.key.keysym.sym == SDLK_s)
{
// Also requires MPV_RENDER_PARAM_ADVANCED_CONTROL if you want
// screenshots to be rendered on GPU (like --vo=gpu would do).
const char *cmd_scr[] = {"screenshot-to-file",
"screenshot.png",
"window",
NULL};
printf("attempting to save screenshot to %s\n", cmd_scr[1]);
mpv_command_async(mpv, 0, cmd_scr);
}
const char *cmd_pause[] = {"cycle", "pause", NULL};
mpv_command_async(mpv, 0, cmd_pause);
}
if (event.type == wakeup_on_mpv_render_update)
if (event.key.keysym.sym == SDLK_s)
{
// Need to be called to update
mpv_render_context_update(mpv_gl);
// Also requires MPV_RENDER_PARAM_ADVANCED_CONTROL if you want
// screenshots to be rendered on GPU (like --vo=gpu would do).
const char *cmd_scr[] = {"screenshot-to-file",
"screenshot.png",
"window",
NULL};
printf("attempting to save screenshot to %s\n", cmd_scr[1]);
mpv_command_async(mpv, 0, cmd_scr);
}
// Happens when at least 1 new event is in the mpv event queue.
if (event.type == wakeup_on_mpv_events)
{
// Handle all remaining mpv events.
int count = 10;
while (count) {
mpv_event *mp_event = (mpv_event*) mpv_wait_event(mpv, 0);
if (mp_event->event_id == MPV_EVENT_NONE)
break;
if (mp_event->event_id == MPV_EVENT_LOG_MESSAGE) {
mpv_event_log_message *msg = (mpv_event_log_message *) mp_event->data;
if (strstr(msg->text, "DR image"))
printf("log: %s", msg->text);
continue;
}
count --;
printf("event: %s\n", mpv_event_name(mp_event->event_id));
}
if (event.type == wakeup_on_mpv_render_update)
{
// Need to be called to update
mpv_render_context_update(mpv_gl);
}
// Happens when at least 1 new event is in the mpv event queue.
if (event.type == wakeup_on_mpv_events)
{
// Handle all remaining mpv events.
int count = 10;
while (count) {
mpv_event *mp_event = (mpv_event*) mpv_wait_event(mpv, 0);
if (mp_event->event_id == MPV_EVENT_NONE)
break;
if (mp_event->event_id == MPV_EVENT_LOG_MESSAGE) {
mpv_event_log_message *msg = (mpv_event_log_message *) mp_event->data;
if (strstr(msg->text, "DR image"))
printf("log: %s", msg->text);
continue;
}
count --;
printf("event: %s\n", mpv_event_name(mp_event->event_id));
}
}
}
}
// Start the Dear ImGui frame
ImGui_ImplOpenGL3_NewFrame();
ImGui_ImplSDL2_NewFrame(window);
ImGui::NewFrame();
// 1. Show the big demo window (Most of the sample code is in ImGui::ShowDemoWindow()! You can browse its code to learn more about Dear ImGui!).
if (show_demo_window)
ImGui::ShowDemoWindow(&show_demo_window);
// 2. Show a simple window that we create ourselves. We use a Begin/End pair to created a named window.
{
static float f = 0.0f;
static int counter = 0;
void
MainWindow::HandleLayers(void)
{
// Start the Dear ImGui frame
ImGui_ImplOpenGL3_NewFrame();
ImGui_ImplSDL2_NewFrame(window);
ImGui::NewFrame();
ImGui::Begin("Hello, world!"); // Create a window called "Hello, world!" and append into it.
// 1. Show the big demo window (Most of the sample code is in ImGui::ShowDemoWindow()! You can browse its code to learn more about Dear ImGui!).
if (show_demo_window)
ImGui::ShowDemoWindow(&show_demo_window);
ImGui::Text("This is some useful text."); // Display some text (you can use a format strings too)
ImGui::Checkbox("Demo Window", &show_demo_window); // Edit bools storing our window open/close state
ImGui::Checkbox("Another Window", &show_another_window);
// 2. Show a simple window that we create ourselves. We use a Begin/End pair to created a named window.
{
static float f = 0.0f;
static int counter = 0;
ImGui::SliderFloat("float", &f, 0.0f, 1.0f); // Edit 1 float using a slider from 0.0f to 1.0f
ImGui::ColorEdit3("clear color", (float*)&clear_color); // Edit 3 floats representing a color
ImGui::Begin("Hello, world!"); // Create a window called "Hello, world!" and append into it.
if (ImGui::Button("Button")) // Buttons return true when clicked (most widgets return true when edited/activated)
counter++;
ImGui::SameLine();
ImGui::Text("counter = %d", counter);
ImGui::Text("This is some useful text."); // Display some text (you can use a format strings too)
ImGui::Checkbox("Demo Window", &show_demo_window); // Edit bools storing our window open/close state
ImGui::Checkbox("Another Window", &show_another_window);
ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / ImGui::GetIO().Framerate, ImGui::GetIO().Framerate);
ImGui::End();
}
ImGui::SliderFloat("float", &f, 0.0f, 1.0f); // Edit 1 float using a slider from 0.0f to 1.0f
ImGui::ColorEdit3("clear color", (float*)&clear_color); // Edit 3 floats representing a color
// 3. Show another simple window.
if (show_another_window)
{
ImGui::Begin("Another Window", &show_another_window); // Pass a pointer to our bool variable (the window will have a closing button that will clear the bool when clicked)
ImGui::Text("Hello from another window!");
if (ImGui::Button("Close Me"))
show_another_window = false;
ImGui::End();
}
if (ImGui::Button("Button")) // Buttons return true when clicked (most widgets return true when edited/activated)
counter++;
ImGui::SameLine();
ImGui::Text("counter = %d", counter);
// Rendering
ImGui::Render();
/* Always redraw */
int w, h;
int __one__one = 1;
SDL_GetWindowSize(window, &w, &h);
mpv_opengl_fbo fbo = {
.fbo = 0,
.w = w,
.h = h,
};
mpv_render_param params[] = {
{MPV_RENDER_PARAM_OPENGL_FBO, &fbo},
{MPV_RENDER_PARAM_FLIP_Y, &__one__one},
{(mpv_render_param_type)0}
};
// mpv_render_context_render(mpv_gl, params);
SDL_Window* backup_current_window = SDL_GL_GetCurrentWindow();
SDL_GLContext backup_current_context = SDL_GL_GetCurrentContext();
ImGui::UpdatePlatformWindows();
ImGui::RenderPlatformWindowsDefault();
SDL_GL_MakeCurrent(backup_current_window, backup_current_context);
mpv_render_context_render(mpv_gl, params);
ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData());
SDL_GL_SwapWindow(window);
ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / ImGui::GetIO().Framerate, ImGui::GetIO().Framerate);
ImGui::End();
}
DeInit();
// 3. Show another simple window.
if (show_another_window)
{
ImGui::Begin("Another Window", &show_another_window); // Pass a pointer to our bool variable (the window will have a closing button that will clear the bool when clicked)
ImGui::Text("Hello from another window!");
if (ImGui::Button("Close Me"))
show_another_window = false;
ImGui::End();
}
}
......@@ -24,12 +24,18 @@ private:
ImGuiIO *io;
ImGuiStyle *style;
bool done;
static Uint32 wakeup_on_mpv_render_update, wakeup_on_mpv_events; /* Need to be static */
static std::shared_ptr<MainWindow> self;
MainWindow(void);
void DeInit(void);
void HandleEvents(void);
void HandleLayers(void);
void HandleRender(void);
public:
void Main(void);
......
......@@ -4,13 +4,15 @@ Size=400,400
Collapsed=0
[Window][Hello, world!]
Pos=225,155
Size=642,389
ViewportPos=165,1
ViewportId=0xEBE6C6E6
Size=630,377
Collapsed=0
[Window][Dear ImGui Demo]
Pos=1019,130
Size=744,491
ViewportPos=1160,4
ViewportId=0xE927CF2F
Size=738,485
Collapsed=0
[Window][Another Window]
......
0% Chargement en cours ou .
You are about to add 0 people to the discussion. Proceed with caution.
Terminez d'abord l'édition de ce message.
Veuillez vous inscrire ou vous pour commenter