diff options
author | Maxime Curioni <maxime.curioni@gmail.com> | 2008-07-05 10:22:15 +0400 |
---|---|---|
committer | Maxime Curioni <maxime.curioni@gmail.com> | 2008-07-05 10:22:15 +0400 |
commit | 5200f51a876ee6519cfdcd2e29e1a2e265244a20 (patch) | |
tree | b52fe37e7c9b36c23396872f9e9091ef72653bb1 /source/blender | |
parent | 5bee0c9a82cf08205da50b529e51021645225314 (diff) |
soc-2008-mxcurioni: first render layer implementation with frame buffer objects. It does not work yet: I cannot manage to read from the correct buffer yet.
Diffstat (limited to 'source/blender')
4 files changed, 98 insertions, 47 deletions
diff --git a/source/blender/freestyle/intern/app_blender/AppGLWidget.cpp b/source/blender/freestyle/intern/app_blender/AppGLWidget.cpp index 2b43b2b9a0c..9a5a21ca93c 100755 --- a/source/blender/freestyle/intern/app_blender/AppGLWidget.cpp +++ b/source/blender/freestyle/intern/app_blender/AppGLWidget.cpp @@ -152,6 +152,9 @@ AppGLWidget::AppGLWidget(const char *iName) // _backBufferFlag = true; _record = false; + + workingBuffer = GL_BACK; //soc + } AppGLWidget::~AppGLWidget() @@ -402,15 +405,16 @@ void AppGLWidget::prepareCanvas() makeCurrent(); glPushAttrib(GL_ALL_ATTRIB_BITS); - if(_frontBufferFlag){ - if(_backBufferFlag) - glDrawBuffer(GL_FRONT_AND_BACK); - else - glDrawBuffer(GL_FRONT); - } - else if(_backBufferFlag) - glDrawBuffer(GL_BACK); - + // if(_frontBufferFlag){ + // if(_backBufferFlag) + // glDrawBuffer(GL_FRONT_AND_BACK); + // else + // glDrawBuffer(GL_FRONT); + // } + // else if(_backBufferFlag) + // glDrawBuffer(GL_BACK); + glDrawBuffer( workingBuffer ); //soc + // Projection Matrix //================== glMatrixMode(GL_PROJECTION); @@ -427,7 +431,7 @@ void AppGLWidget::prepareCanvas() void AppGLWidget::releaseCanvas() { makeCurrent(); - glDrawBuffer(GL_BACK); + glDrawBuffer( workingBuffer ); //soc glPopAttrib(); } diff --git a/source/blender/freestyle/intern/app_blender/AppGLWidget.h b/source/blender/freestyle/intern/app_blender/AppGLWidget.h index bc18be00a31..447eece30c9 100755 --- a/source/blender/freestyle/intern/app_blender/AppGLWidget.h +++ b/source/blender/freestyle/intern/app_blender/AppGLWidget.h @@ -91,6 +91,7 @@ public: AppGLWidget_Camera * _camera; + int workingBuffer; protected: unsigned int _width, _height; @@ -342,7 +343,7 @@ public: { makeCurrent(); //glReadBuffer(GL_FRONT); //in reality: glReadBuffer and glDrawBuffer are both set to GL_BACK - glReadBuffer(GL_BACK); + //glReadBuffer(GL_BACK); GLenum glformat; switch(format) { @@ -371,21 +372,21 @@ public: BACK } GLBuffer; - void setReadPixelsBuffer(int iBuffer) - { - makeCurrent(); - switch(iBuffer) - { - case FRONT: - glReadBuffer(GL_FRONT); - break; - case BACK: - glReadBuffer(GL_BACK); - break; - default: - break; - } - } + // void setReadPixelsBuffer(int iBuffer) + // { + // makeCurrent(); + // switch(iBuffer) + // { + // case FRONT: + // glReadBuffer(GL_FRONT); + // break; + // case BACK: + // glReadBuffer(GL_BACK); + // break; + // default: + // break; + // } + // } BBox<Vec3r> scene3DBBox() const { return _ModelRootNode->bbox(); } diff --git a/source/blender/freestyle/intern/app_blender/api.cpp b/source/blender/freestyle/intern/app_blender/api.cpp index 4ca13000ccb..fc0e6764710 100644 --- a/source/blender/freestyle/intern/app_blender/api.cpp +++ b/source/blender/freestyle/intern/app_blender/api.cpp @@ -105,7 +105,14 @@ extern "C" { FRS_scene_3ds_export(re); } - void FRS_render(Render* re) { + void FRS_render(Render* re, int render_in_layer) { + + if(render_in_layer) { + view->workingBuffer = GL_COLOR_ATTACHMENT0_EXT; + } else { + view->workingBuffer = GL_BACK; + } + // add style module string style_module = pathconfig->getProjectDir() + Config::DIR_SEP + "style_modules" + @@ -121,23 +128,67 @@ extern "C" { // render final result view->draw(); - - // copy result into render window - RenderResult rres; - RE_GetResultImage(re, &rres); - view->readPixels(0, 0, re->winx, re->winy, AppGLWidget::RGBA, rres.rectf ); - re->result->renlay = render_get_active_layer(re, re->result); - re->display_draw(re->result, NULL); - - controller->CloseFile(); } - void FRS_execute(Render* re, bool render_in_layer) { + void FRS_execute(Render* re, int render_in_layer) { + + GLuint framebuffer, renderbuffer; + GLenum status; + RenderLayer *rl; - //if(render_in_layer) - // set-up offscreen rendering + if(render_in_layer) { + cout << "Freestyle as a render layer - SETUP" << endl; - FRS_render(re); + // set up frame buffer + glGenFramebuffersEXT(1, &framebuffer); + glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, framebuffer); + + // set up render buffer + glGenRenderbuffersEXT(1, &renderbuffer); + glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, renderbuffer); + glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_RGBA8, re->winx, re->winy); + glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_RENDERBUFFER_EXT, renderbuffer); + + // status verification + status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT); + if (status != GL_FRAMEBUFFER_COMPLETE_EXT){ + cout << "Framebuffer setup error" << endl; + return; + } + + glDrawBuffer(GL_COLOR_ATTACHMENT0_EXT); + + } else { + glDrawBuffer(GL_BACK); + } + + FRS_render(re, render_in_layer); + + if(render_in_layer) { + for(rl = (RenderLayer *)re->result->layers.first; rl; rl= rl->next) { + if(rl->layflag & SCE_LAY_FRS) { + cout << "Freestyle as a render layer - RESULT" << endl; + + // transfer render to layer + glReadBuffer(GL_COLOR_ATTACHMENT0_EXT); + glReadPixels(0, 0, re->winx, re->winy, GL_RGBA, GL_FLOAT, rl->rectf ); + + // bind window + glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); + glDeleteRenderbuffersEXT(1, &renderbuffer); + glDeleteFramebuffersEXT(1, &framebuffer); + } + } + } else { + // copy result into render window + RenderResult rres; + RE_GetResultImage(re, &rres); + view->readPixels(0, 0, re->winx, re->winy, AppGLWidget::RGBA, rres.rectf ); + re->result->renlay = render_get_active_layer(re, re->result); + re->display_draw(re->result, NULL); + } + + controller->CloseFile(); } #ifdef __cplusplus diff --git a/source/blender/render/intern/source/pipeline.c b/source/blender/render/intern/source/pipeline.c index 8403d237f8f..d91736e9a10 100644 --- a/source/blender/render/intern/source/pipeline.c +++ b/source/blender/render/intern/source/pipeline.c @@ -1634,13 +1634,8 @@ static void do_render_3d(Render *re) /* Freestyle */ if( re->r.mode & R_EDGE_FRS ) { - for(rl = re->result->layers.first; rl; rl= rl->next) { - if(rl->layflag & SCE_LAY_FRS) { - printf("Freestyle as a render layer\n"); - FRS_prepare(re); - FRS_execute(re,1); - } - } + FRS_prepare(re); + FRS_execute(re,1); } /* do left-over 3d post effects (flares) */ |