diff --git a/src/projectM-engine/PBuffer.cpp b/src/projectM-engine/PBuffer.cpp index 134cb43ea..512e9c485 100755 --- a/src/projectM-engine/PBuffer.cpp +++ b/src/projectM-engine/PBuffer.cpp @@ -40,20 +40,27 @@ RenderTarget::~RenderTarget() { glDeleteTextures( 1, &this->textureID[0]); if (usePbuffers) -{ + { glDeleteTextures( 1, &this->textureID[1] ); - glDeleteRenderbuffersEXT(1, &this->depthb); - glDeleteFramebuffersEXT(1, &this->fbuffer); -} + glDeleteRenderbuffersEXT(1, &this->depthb[0]); + glDeleteFramebuffersEXT(1, &this->fbuffer[0]); + if(renderToTexture) + { + glDeleteTextures( 1, &this->textureID[2] ); + glDeleteRenderbuffersEXT(1, &this->depthb[1]); + glDeleteFramebuffersEXT(1, &this->fbuffer[1]); + } + } } /** Creates new pbuffers */ -RenderTarget::RenderTarget(int texsize, int width, int height) : usePbuffers(false) { +RenderTarget::RenderTarget(int texsize, int width, int height, int renderToTexture) : usePbuffers(false) { int mindim = 0; int origtexsize = 0; this->usePbuffers = true; + this->renderToTexture = 0; this->texsize = texsize; @@ -64,6 +71,33 @@ RenderTarget::RenderTarget(int texsize, int width, int height) : usePbuffers(fal if(glewIsSupported("GL_EXT_framebuffer_object")) { + + if(this->renderToTexture) + { + GLuint fb2, depth_rb2; + glGenFramebuffersEXT(1, &fb2); + glBindFramebufferEXT( GL_FRAMEBUFFER_EXT, fb2 ); + glGenRenderbuffersEXT(1, &depth_rb2); + glBindRenderbufferEXT( GL_RENDERBUFFER_EXT, depth_rb2 ); + + glRenderbufferStorageEXT( GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT24, this->texsize,this->texsize ); + glFramebufferRenderbufferEXT( GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, depth_rb2 ); + this->fbuffer[1] = fb2; + this->depthb[1]= depth_rb2; + glGenTextures(1, &this->textureID[2]); + glBindTexture(GL_TEXTURE_2D, this->textureID[2]); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA8, texsize, texsize, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL ); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); + glFramebufferTexture2DEXT( GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, this->textureID[2], 0 ); + + } + + + + GLuint fb, depth_rb, rgba_tex, other_tex; glGenFramebuffersEXT(1, &fb); glBindFramebufferEXT( GL_FRAMEBUFFER_EXT, fb ); @@ -72,8 +106,8 @@ RenderTarget::RenderTarget(int texsize, int width, int height) : usePbuffers(fal glBindRenderbufferEXT( GL_RENDERBUFFER_EXT, depth_rb ); glRenderbufferStorageEXT( GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT24, this->texsize,this->texsize ); glFramebufferRenderbufferEXT( GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, depth_rb ); - this->fbuffer = fb; - this->depthb = depth_rb; + this->fbuffer[0] = fb; + this->depthb[0]= depth_rb; glGenTextures(1, &other_tex); glBindTexture(GL_TEXTURE_2D,other_tex); @@ -163,7 +197,7 @@ void RenderTarget::lock() { if(this->usePbuffers) { - glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, this->fbuffer); + glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, this->fbuffer[0]); } } diff --git a/src/projectM-engine/PBuffer.hpp b/src/projectM-engine/PBuffer.hpp index 03e572e1f..8cca207e5 100755 --- a/src/projectM-engine/PBuffer.hpp +++ b/src/projectM-engine/PBuffer.hpp @@ -68,11 +68,12 @@ public: ContextType origContextType; -int usePbuffers; + int usePbuffers; + int renderToTexture; ~RenderTarget(); - RenderTarget( int texsize, int width, int height ); + RenderTarget( int texsize, int width, int height, int renderToTexture ); void lock(); void unlock(); int nearestPower2( int value, TextureScale scaleRule ); @@ -86,9 +87,9 @@ int usePbuffers; #endif */ /** Render target texture ID for non-pbuffer systems */ - GLuint textureID[2]; - GLuint fbuffer; - GLuint depthb; + GLuint textureID[3]; + GLuint fbuffer[2]; + GLuint depthb[2]; }; diff --git a/src/projectM-engine/Renderer.cpp b/src/projectM-engine/Renderer.cpp index 218a2ff82..a9201a50e 100644 --- a/src/projectM-engine/Renderer.cpp +++ b/src/projectM-engine/Renderer.cpp @@ -191,9 +191,18 @@ void Renderer::RenderFrame(PresetOutputs *presetOutputs, PresetInputs *presetInp //video texture memory and render fullscreen. /** Reset the viewport size */ + if(renderTarget->renderToTexture) + { + glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, this->renderTarget->fbuffer[1]); + glViewport( 0, 0, this->renderTarget->texsize, this->renderTarget->texsize ); + } + else glViewport( 0, 0, this->vw, this->vh ); + DWRITE( "viewport: %d x %d\n", this->vw, this->vh ); - glViewport( 0, 0, this->vw, this->vh ); - glClear( GL_COLOR_BUFFER_BIT ); + + + + glClear( GL_COLOR_BUFFER_BIT ); glBindTexture( GL_TEXTURE_2D, this->renderTarget->textureID[0] ); @@ -222,6 +231,9 @@ void Renderer::RenderFrame(PresetOutputs *presetOutputs, PresetInputs *presetInp if(this->showstats%2) draw_stats(presetInputs); glTranslatef(0.5 ,0.5,0); +if(renderTarget->renderToTexture) + glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); + DWRITE("End of Pass 2\n" ); } diff --git a/src/projectM-engine/projectM.cpp b/src/projectM-engine/projectM.cpp index 2c7aaec28..d011d4b7b 100755 --- a/src/projectM-engine/projectM.cpp +++ b/src/projectM-engine/projectM.cpp @@ -510,7 +510,7 @@ DLLEXPORT void projectM::projectM_reset() this->hasInit = 1; - this->renderTarget = new RenderTarget ( texsize, width, height ); + this->renderTarget = new RenderTarget ( texsize, width, height, 0 ); this->textureManager = new TextureManager(presetURL); this->presetInputs.gx = gx; this->presetInputs.gy = gy;