From b0cdf4de7bfdf5863ce34dcb26180d8cf86266c2 Mon Sep 17 00:00:00 2001 From: Kai Blaschke Date: Sat, 8 Jun 2024 17:20:00 +0200 Subject: [PATCH 1/2] Add optional FBO ID parameter to render function. This will allow external apps to pass in any custom FBO to render to. Defaults to 0, keeping previous behavior if not given. --- src/libprojectM/ProjectM.cpp | 5 ++--- src/libprojectM/ProjectM.hpp | 2 +- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/libprojectM/ProjectM.cpp b/src/libprojectM/ProjectM.cpp index ae9390efaf..3e97724de9 100644 --- a/src/libprojectM/ProjectM.cpp +++ b/src/libprojectM/ProjectM.cpp @@ -90,7 +90,7 @@ void ProjectM::ResetTextures() m_textureManager = std::make_unique(m_textureSearchPaths); } -void ProjectM::RenderFrame() +void ProjectM::RenderFrame(uint32_t targetFramebufferObject /*= 0*/) { // Don't render if window area is zero. if (m_windowWidth == 0 || m_windowHeight == 0) @@ -166,8 +166,7 @@ void ProjectM::RenderFrame() // ToDo: Call the to-be-implemented render method in Renderer m_activePreset->RenderFrame(audioData, renderContext); - // ToDo: Allow external apps to provide a custom target framebuffer. - glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0); + glBindFramebuffer(GL_DRAW_FRAMEBUFFER, static_cast(targetFramebufferObject)); if (m_transition != nullptr && m_transitioningPreset != nullptr) { diff --git a/src/libprojectM/ProjectM.hpp b/src/libprojectM/ProjectM.hpp index b84e293359..844597128e 100644 --- a/src/libprojectM/ProjectM.hpp +++ b/src/libprojectM/ProjectM.hpp @@ -101,7 +101,7 @@ class PROJECTM_EXPORT ProjectM void ResetTextures(); - void RenderFrame(); + void RenderFrame(uint32_t targetFramebufferObject = 0); void SetBeatSensitivity(float sensitivity); From bd2b1ba9f425e91c93421effb6c184fbdf89e4b3 Mon Sep 17 00:00:00 2001 From: Kai Blaschke Date: Sat, 8 Jun 2024 17:22:11 +0200 Subject: [PATCH 2/2] Add API function to enable rendering to custom FBO IDs --- src/api/include/projectM-4/render_opengl.h | 11 ++++++++--- src/libprojectM/ProjectMCWrapper.cpp | 8 ++++++++ 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/src/api/include/projectM-4/render_opengl.h b/src/api/include/projectM-4/render_opengl.h index 0a061f7653..6b524cfebe 100644 --- a/src/api/include/projectM-4/render_opengl.h +++ b/src/api/include/projectM-4/render_opengl.h @@ -34,13 +34,18 @@ extern "C" { /** * @brief Renders a single frame. * - * @note Separate two-pass frame rendering is currently not supported by the C API as it is rarely used - * and also depends on the loaded preset. - * * @param instance The projectM instance handle. */ PROJECTM_EXPORT void projectm_opengl_render_frame(projectm_handle instance); +/** + * @brief Renders a single frame into a user-defined framebuffer object. + * + * @param instance The projectM instance handle. + * @param framebuffer_object_id The OpenGL FBO ID to render to. + */ +PROJECTM_EXPORT void projectm_opengl_render_frame_fbo(projectm_handle instance, uint32_t framebuffer_object_id); + #ifdef __cplusplus } // extern "C" #endif diff --git a/src/libprojectM/ProjectMCWrapper.cpp b/src/libprojectM/ProjectMCWrapper.cpp index cbf5f6edcb..f81aefd234 100644 --- a/src/libprojectM/ProjectMCWrapper.cpp +++ b/src/libprojectM/ProjectMCWrapper.cpp @@ -6,6 +6,8 @@ #include #include +#include + namespace libprojectM { @@ -171,6 +173,12 @@ void projectm_opengl_render_frame(projectm_handle instance) projectMInstance->RenderFrame(); } +void projectm_opengl_render_frame_fbo(projectm_handle instance, uint32_t framebuffer_object_id) +{ + auto projectMInstance = handle_to_instance(instance); + projectMInstance->RenderFrame(framebuffer_object_id); +} + void projectm_set_beat_sensitivity(projectm_handle instance, float sensitivity) { auto projectMInstance = handle_to_instance(instance);