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/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); 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);