Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMaxime Curioni <maxime.curioni@gmail.com>2008-07-05 10:22:15 +0400
committerMaxime Curioni <maxime.curioni@gmail.com>2008-07-05 10:22:15 +0400
commit5200f51a876ee6519cfdcd2e29e1a2e265244a20 (patch)
treeb52fe37e7c9b36c23396872f9e9091ef72653bb1 /source/blender/freestyle/intern/app_blender
parent5bee0c9a82cf08205da50b529e51021645225314 (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/freestyle/intern/app_blender')
-rwxr-xr-xsource/blender/freestyle/intern/app_blender/AppGLWidget.cpp24
-rwxr-xr-xsource/blender/freestyle/intern/app_blender/AppGLWidget.h33
-rw-r--r--source/blender/freestyle/intern/app_blender/api.cpp79
3 files changed, 96 insertions, 40 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