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

Cleaning a bit

parent d71c1dc8
Aucune branche associée trouvée
Aucune étiquette associée trouvée
Aucune requête de fusion associée trouvée
......@@ -12,7 +12,7 @@
#
#CXX = g++
#CXX = clang++
CXX = clang++
EXE = example_sdl_opengl3
SOURCES = main.cpp
......
......@@ -4,12 +4,12 @@ Size=400,400
Collapsed=0
[Window][Hello, world!]
Pos=109,82
Pos=65,133
Size=703,254
Collapsed=0
[Window][Dear ImGui Demo]
Pos=1293,55
Pos=1218,40
Size=550,680
Collapsed=0
......@@ -18,3 +18,58 @@ Pos=60,60
Size=198,71
Collapsed=0
[Window][Example: Console]
Pos=120,381
Size=520,600
Collapsed=0
[Window][Dear ImGui Metrics]
Pos=771,79
Size=338,239
Collapsed=0
[Window][Dear ImGui Style Editor]
Pos=60,60
Size=339,856
Collapsed=0
[Window][Example: Simple layout]
Pos=60,60
Size=500,440
Collapsed=0
[Window][Example: Long text display]
Pos=60,60
Size=520,600
Collapsed=0
[Window][Example: Auto-resizing window]
Pos=60,60
Size=450,267
Collapsed=0
[Window][Same title as another window##2]
Pos=100,200
Size=450,61
Collapsed=0
[Window][###AnimatedTitle]
Pos=100,300
Size=247,48
Collapsed=0
[Window][Same title as another window##1]
Pos=689,505
Size=484,137
Collapsed=0
[Window][Example: Custom rendering]
Pos=1310,581
Size=466,391
Collapsed=0
[Window][Example: Documents]
Pos=239,49
Size=981,743
Collapsed=0
......@@ -3,60 +3,9 @@
#include "imgui_impl_opengl3.h"
#include <stdio.h>
#include <SDL.h>
// mpv stuff
#include <mpv/client.h>
#include <mpv/render_gl.h>
// Ugly stuff for mpv
static Uint32 wakeup_on_mpv_render_update, wakeup_on_mpv_events;
static void die(const char *msg)
{
fprintf(stderr, "%s\n", msg);
exit(1);
}
static void *get_proc_address_mpv(void *fn_ctx, const char *name)
{
return SDL_GL_GetProcAddress(name);
}
static void on_mpv_events(void *ctx)
{
SDL_Event event = {.type = wakeup_on_mpv_events};
SDL_PushEvent(&event);
}
static void on_mpv_render_update(void *ctx)
{
SDL_Event event = {.type = wakeup_on_mpv_render_update};
SDL_PushEvent(&event);
}
// About Desktop OpenGL function loaders:
// Modern desktop OpenGL doesn't have a standard portable header file to load OpenGL function pointers.
// Helper libraries are often used for this purpose! Here we are supporting a few common ones (gl3w, glew, glad).
// You may use another loader/header of your choice (glext, glLoadGen, etc.), or chose to manually implement your own.
#if defined(IMGUI_IMPL_OPENGL_LOADER_GL3W)
#include <GL/gl3w.h> // Initialize with gl3wInit()
#elif defined(IMGUI_IMPL_OPENGL_LOADER_GLEW)
#include <GL/glew.h> // Initialize with glewInit()
#elif defined(IMGUI_IMPL_OPENGL_LOADER_GLAD)
#include <glad/glad.h> // Initialize with gladLoadGL()
#elif defined(IMGUI_IMPL_OPENGL_LOADER_GLBINDING2)
#define GLFW_INCLUDE_NONE // GLFW including OpenGL headers causes ambiguity or multiple definition errors.
#include <glbinding/Binding.h> // Initialize with glbinding::Binding::initialize()
#include <glbinding/gl/gl.h>
using namespace gl;
#elif defined(IMGUI_IMPL_OPENGL_LOADER_GLBINDING3)
#define GLFW_INCLUDE_NONE // GLFW including OpenGL headers causes ambiguity or multiple definition errors.
#include <glbinding/glbinding.h>// Initialize with glbinding::initialize()
#include <glbinding/gl/gl.h>
using namespace gl;
#else
#include IMGUI_IMPL_OPENGL_LOADER_CUSTOM
#endif
#include <GL/gl3w.h>
// Main code
int main(int argc, char **argv)
......@@ -64,46 +13,36 @@ int main(int argc, char **argv)
// MPV init before SDL init
// If I remenber, we need to set an idle thing for mpv, so that it won't close even after the end of the video (which is facheux)
if (argc != 2)
die("pass a single media file as argument");
return 1;
// Our state
bool show_demo_window = true;
bool show_another_window = false;
ImVec4 clear_color = ImVec4(0.45f, 0.55f, 0.60f, 1.00f);
static Uint32 wakeup_on_mpv_render_update, wakeup_on_mpv_events; /* Need to be static */
mpv_render_context *mpv_gl;
mpv_handle *mpv = mpv_create();
if (!mpv)
die("context init failed");
return 1;
// Some minor options can only be set before mpv_initialize().
// Some minor options can only be set before mpv_initialize(). (XXX: The idle flag)
if (mpv_initialize(mpv) < 0)
die("mpv init failed");
return 1;
mpv_request_log_messages(mpv, "debug");
// Jesus Christ SDL, you suck!
SDL_SetHint(SDL_HINT_NO_SIGNAL_HANDLERS, "no");
// Setup SDL
// (Some versions of SDL before <2.0.10 appears to have performance/stalling issues on a minority of Windows systems,
// depending on whether SDL_INIT_GAMECONTROLLER is enabled or disabled.. updating to latest version of SDL is recommended!)
if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER | SDL_INIT_GAMECONTROLLER) != 0)
SDL_SetHint(SDL_HINT_NO_SIGNAL_HANDLERS, "no"); // Jesus Christ SDL, you suck!
if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER) != 0)
{
printf("Error: %s\n", SDL_GetError());
return -1;
}
// Decide GL+GLSL versions
#if __APPLE__
// GL 3.2 Core + GLSL 150
const char* glsl_version = "#version 150";
SDL_GL_SetAttribute(SDL_GL_CONTEXT_FLAGS, SDL_GL_CONTEXT_FORWARD_COMPATIBLE_FLAG); // Always required on Mac
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, 2);
#else
// GL 3.0 + GLSL 130
const char* glsl_version = "#version 130";
SDL_GL_SetAttribute(SDL_GL_CONTEXT_FLAGS, 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, 0);
#endif
// Create window with graphics context
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
......@@ -116,74 +55,36 @@ int main(int argc, char **argv)
SDL_GL_SetSwapInterval(1); // Enable vsync
// Initialize OpenGL loader
#if defined(IMGUI_IMPL_OPENGL_LOADER_GL3W)
bool err = gl3wInit() != 0;
#elif defined(IMGUI_IMPL_OPENGL_LOADER_GLEW)
bool err = glewInit() != GLEW_OK;
#elif defined(IMGUI_IMPL_OPENGL_LOADER_GLAD)
bool err = gladLoadGL() == 0;
#elif defined(IMGUI_IMPL_OPENGL_LOADER_GLBINDING2)
bool err = false;
glbinding::Binding::initialize();
#elif defined(IMGUI_IMPL_OPENGL_LOADER_GLBINDING3)
bool err = false;
glbinding::initialize([](const char* name) { return (glbinding::ProcAddress)SDL_GL_GetProcAddress(name); });
#else
bool err = false; // If you use IMGUI_IMPL_OPENGL_LOADER_CUSTOM, your loader is likely to requires some form of initialization.
#endif
if (err)
if (gl3wInit())
{
fprintf(stderr, "Failed to initialize OpenGL loader!\n");
return 1;
}
// TODO Name correctly those things
int __one[] = {1};
auto __something = (mpv_opengl_init_params){
.get_proc_address = get_proc_address_mpv,
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, &__something},
// Tell libmpv that you will call mpv_render_context_update() on render
// context update callbacks, and that you will _not_ block on the core
// ever (see <libmpv/render.h> "Threading" section for what libmpv
// functions you can call at all when this is active).
// In particular, this means you must call e.g. mpv_command_async()
// instead of mpv_command().
// If you want to use synchronous calls, either make them on a separate
// thread, or remove the option below (this will disable features like
// DR and is not recommended anyway).
{MPV_RENDER_PARAM_ADVANCED_CONTROL, &__one},
{MPV_RENDER_PARAM_OPENGL_INIT_PARAMS, &mpv_gl_init_params},
{MPV_RENDER_PARAM_ADVANCED_CONTROL, &__one}, /* Async commands only */
{(mpv_render_param_type)0}
};
// This makes mpv use the currently set GL context. It will use the callback
// (passed via params) to resolve GL builtin functions, as well as extensions.
mpv_render_context *mpv_gl;
if (mpv_render_context_create(&mpv_gl, mpv, params) < 0)
die("failed to initialize mpv GL context");
if (mpv_render_context_create(&mpv_gl, mpv, params) < 0) /* Resolv already created context */
return 1;
// We use events for thread-safe notification of the SDL main loop.
// Generally, the wakeup callbacks (set further below) should do as least
// work as possible, and merely wake up another thread to do actual work.
// On SDL, waking up the mainloop is the ideal course of action. SDL's
// SDL_PushEvent() is thread-safe, so we use that.
wakeup_on_mpv_render_update = SDL_RegisterEvents(1);
wakeup_on_mpv_events = SDL_RegisterEvents(1);
if (wakeup_on_mpv_render_update == (Uint32)-1 ||
wakeup_on_mpv_events == (Uint32)-1)
die("could not register events");
wakeup_on_mpv_events = SDL_RegisterEvents(1);
if (wakeup_on_mpv_render_update == (Uint32)-1 || wakeup_on_mpv_events == (Uint32)-1)
return 1;
// When normal mpv events are available.
mpv_set_wakeup_callback(mpv, on_mpv_events, NULL);
// When there is a need to call mpv_render_context_update(), which can
// request a new frame to be rendered.
// (Separate from the normal event handling mechanism for the sake of
// users which run OpenGL on a different thread.)
mpv_render_context_set_update_callback(mpv_gl, on_mpv_render_update, NULL);
mpv_set_wakeup_callback(mpv, [](void *) -> void {SDL_Event event = {.type = wakeup_on_mpv_events}; SDL_PushEvent(&event);}, NULL);
// When there is a need to call mpv_render_context_update(), which can request a new frame to be rendered.
mpv_render_context_set_update_callback(mpv_gl, [](void *) -> void { SDL_Event event = {.type = wakeup_on_mpv_render_update}; SDL_PushEvent(&event); }, NULL);
// Play this file.
const char *cmd[] = {"loadfile", argv[1], NULL};
......@@ -195,34 +96,13 @@ int main(int argc, char **argv)
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();
//ImGui::StyleColorsClassic();
// Setup Platform/Renderer bindings
ImGui_ImplSDL2_InitForOpenGL(window, gl_context);
ImGui_ImplOpenGL3_Init(glsl_version);
// Load Fonts
// - If no fonts are loaded, dear imgui will use the default font. You can also load multiple fonts and use ImGui::PushFont()/PopFont() to select them.
// - AddFontFromFileTTF() will return the ImFont* so you can store it if you need to select the font among multiple.
// - If the file cannot be loaded, the function will return NULL. Please handle those errors in your application (e.g. use an assertion, or display an error and quit).
// - The fonts will be rasterized at a given size (w/ oversampling) and stored into a texture when calling ImFontAtlas::Build()/GetTexDataAsXXXX(), which ImGui_ImplXXXX_NewFrame below will call.
// - Read 'docs/FONTS.md' for more instructions and details.
// - Remember that in C/C++ if you want to include a backslash \ in a string literal you need to write a double backslash \\ !
//io.Fonts->AddFontDefault();
assert(io.Fonts->AddFontDefault());
//io.Fonts->AddFontFromFileTTF("../../misc/fonts/Roboto-Medium.ttf", 16.0f);
//io.Fonts->AddFontFromFileTTF("../../misc/fonts/Cousine-Regular.ttf", 15.0f);
//io.Fonts->AddFontFromFileTTF("../../misc/fonts/DroidSans.ttf", 16.0f);
//io.Fonts->AddFontFromFileTTF("../../misc/fonts/ProggyTiny.ttf", 10.0f);
//ImFont* font = io.Fonts->AddFontFromFileTTF("c:\\Windows\\Fonts\\ArialUni.ttf", 18.0f, NULL, io.Fonts->GetGlyphRangesJapanese());
//IM_ASSERT(font != NULL);
// Our state
bool show_demo_window = true;
bool show_another_window = false;
ImVec4 clear_color = ImVec4(0.45f, 0.55f, 0.60f, 1.00f);
// Main loop
bool done = false;
......@@ -234,7 +114,6 @@ int main(int argc, char **argv)
// - 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;
int redraw = 0;
while (SDL_PollEvent(&event))
{
ImGui_ImplSDL2_ProcessEvent(&event);
......@@ -242,8 +121,6 @@ int main(int argc, char **argv)
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_WINDOWEVENT && event.window.event == SDL_WINDOWEVENT_EXPOSED)
redraw = 1;
if (event.type == SDL_KEYDOWN)
{
if (event.key.keysym.sym == SDLK_SPACE)
......@@ -265,57 +142,45 @@ int main(int argc, char **argv)
}
if (event.type == wakeup_on_mpv_render_update)
{
uint64_t flags = mpv_render_context_update(mpv_gl);
if (flags & MPV_RENDER_UPDATE_FRAME)
redraw = 1;
// 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.
while (1) {
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;
// Print log messages about DR allocations, just to
// test whether it works. If there is more than 1 of
// these, it works. (The log message can actually change
// any time, so it's possible this logging stops working
// in the future.)
if (strstr(msg->text, "DR image"))
printf("log: %s", msg->text);
continue;
}
count --;
printf("event: %s\n", mpv_event_name(mp_event->event_id));
}
}
}
redraw = 1;
if (redraw)
/* Always redraw */
{
int w, h;
int __one__one = 1;
SDL_GetWindowSize(window, &w, &h);
auto __thing1 = (mpv_opengl_fbo){
mpv_opengl_fbo fbo = {
.fbo = 0,
.w = w,
.h = h,
};
mpv_render_param params[] = {
// Specify the default framebuffer (0) as target. This will
// render onto the entire screen. If you want to show the video
// in a smaller rectangle or apply fancy transformations, you'll
// need to render into a separate FBO and draw it manually.
{MPV_RENDER_PARAM_OPENGL_FBO, &__thing1},
// Flip rendering (needed due to flipped GL coordinate system).
{MPV_RENDER_PARAM_OPENGL_FBO, &fbo},
{MPV_RENDER_PARAM_FLIP_Y, &__one__one},
{(mpv_render_param_type)0}
};
// See render_gl.h on what OpenGL environment mpv expects, and
// other API details.
mpv_render_context_render(mpv_gl, params);
}
......@@ -363,25 +228,16 @@ int main(int argc, char **argv)
// Rendering
ImGui::Render();
// glViewport(0, 0, (int)io.DisplaySize.x, (int)io.DisplaySize.y);
// glClearColor(clear_color.x, clear_color.y, clear_color.z, clear_color.w);
// glClear(GL_COLOR_BUFFER_BIT);
ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData());
SDL_GL_SwapWindow(window);
}
// Destroy the GL renderer and all of the GL objects it allocated. If video
// is still running, the video track will be deselected.
/* CLEAN */
mpv_render_context_free(mpv_gl);
mpv_detach_destroy(mpv);
// Cleanup
ImGui_ImplOpenGL3_Shutdown();
ImGui_ImplSDL2_Shutdown();
ImGui::DestroyContext();
SDL_GL_DeleteContext(gl_context);
SDL_DestroyWindow(window);
SDL_Quit();
......
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