diff options
author | Maxime Curioni <maxime.curioni@gmail.com> | 2009-03-22 19:25:14 +0300 |
---|---|---|
committer | Maxime Curioni <maxime.curioni@gmail.com> | 2009-03-22 19:25:14 +0300 |
commit | d79ddebaaec697e1775a6f652a1ee064eb053bf4 (patch) | |
tree | 15231467095ba6cddba4372ee71c02de1e0d2fcc | |
parent | f86309d6728337f3f9452a78f949b3f4fd3d59af (diff) |
Freestyle was changed from a tile-based process to a post-processing effect. This will allow style modules to process the underlying color buffer ( AppCanvas::readColorPixels ) and depth buffer ( AppCanvas::readDepthPixels ), as was supported in the original program.
Corrected crash when Freestyle is rendered in "Single" render layer mode (for example, in the compositor)
5 files changed, 62 insertions, 9 deletions
diff --git a/source/blender/freestyle/FRS_freestyle.h b/source/blender/freestyle/FRS_freestyle.h index aa66ce999bc..3bc6e092f02 100644 --- a/source/blender/freestyle/FRS_freestyle.h +++ b/source/blender/freestyle/FRS_freestyle.h @@ -22,7 +22,9 @@ extern "C" { void FRS_initialize(); void FRS_prepare(Render* re); void FRS_render_Blender(Render* re); - + void FRS_composite_result(Render* re, SceneRenderLayer* srl); + void FRS_add_Freestyle(Render* re); + #ifdef __cplusplus } #endif diff --git a/source/blender/freestyle/intern/app_blender/FRS_freestyle.cpp b/source/blender/freestyle/intern/app_blender/FRS_freestyle.cpp index 233fe26a38d..af9210205bd 100644 --- a/source/blender/freestyle/intern/app_blender/FRS_freestyle.cpp +++ b/source/blender/freestyle/intern/app_blender/FRS_freestyle.cpp @@ -16,6 +16,7 @@ extern "C" { #include "render_types.h" #include "renderpipeline.h" +#include "pixelblending.h" #include "BLI_blenlib.h" #include "BIF_renderwin.h" @@ -161,7 +162,57 @@ extern "C" { cout << "Freestyle cannot be used because the view map is not available" << endl; } cout << "\n###################################################################" << endl; - } + } + + void FRS_composite_result(Render* re, SceneRenderLayer* srl) + { + + RenderLayer *rl; + float *src, *dest, *pixSrc, *pixDest; + int x, y, rectx, recty; + + if( re->freestyle_render == NULL || re->freestyle_render->result == NULL ) + return; + + rl = render_get_active_layer( re->freestyle_render, re->freestyle_render->result ); + if( !rl || rl->rectf == NULL) { cout << "Cannot find Freestyle result image" << endl; return; } + src = rl->rectf; + + rl = RE_GetRenderLayer(re->result, srl->name); + if( !rl || rl->rectf == NULL) { cout << "No layer to composite to" << endl; return; } + dest = rl->rectf; + + rectx = re->rectx; + recty = re->recty; + + for( y = 0; y < recty; y++) { + for( x = 0; x < rectx; x++) { + + pixSrc = src + 4 * (rectx * y + x); + if( pixSrc[3] > 0.0) { + pixDest = dest + 4 * (rectx * y + x); + addAlphaOverFloat(pixDest, pixSrc); + } + } + } + + } + + void FRS_add_Freestyle(Render* re) { + + SceneRenderLayer *srl, *freestyle_srl = NULL; + for(srl= (SceneRenderLayer *)re->scene->r.layers.first; srl && (freestyle_srl == NULL); srl= srl->next) { + if(srl->layflag & SCE_LAY_FRS) { + if (!freestyle_srl) freestyle_srl = srl; + } + } + + if( freestyle_srl ) { + FRS_prepare(re); + FRS_render_Blender(re); + FRS_composite_result(re, freestyle_srl); + } + } #ifdef __cplusplus } diff --git a/source/blender/freestyle/intern/stroke/BlenderStrokeRenderer.cpp b/source/blender/freestyle/intern/stroke/BlenderStrokeRenderer.cpp index a175620c8d7..286d23c619b 100644 --- a/source/blender/freestyle/intern/stroke/BlenderStrokeRenderer.cpp +++ b/source/blender/freestyle/intern/stroke/BlenderStrokeRenderer.cpp @@ -230,10 +230,12 @@ void BlenderStrokeRenderer::RenderStrokeRepBasic(StrokeRep *iStrokeRep) const{ void BlenderStrokeRenderer::RenderScene( Render *re ) { scene->r.mode &= ~( R_EDGE_FRS | R_SHADOW | R_SSS | R_PANORAMA | R_ENVMAP | R_MBLUR ); + scene->r.scemode &= ~( R_SINGLE_LAYER ); scene->r.planes = R_PLANES32; scene->r.imtype = R_PNG; re->freestyle_render = RE_NewRender(scene->id.name); + RE_BlenderFrame( re->freestyle_render, scene, 1); // char filepath[255]; diff --git a/source/blender/render/intern/source/convertblender.c b/source/blender/render/intern/source/convertblender.c index 2f0455a6716..8313019024d 100644 --- a/source/blender/render/intern/source/convertblender.c +++ b/source/blender/render/intern/source/convertblender.c @@ -4879,13 +4879,7 @@ void RE_Database_FromScene(Render *re, Scene *scene, int use_camera_view) if((re->r.mode & R_SSS) && !re->test_break()) if(re->r.renderer==R_INTERN) make_sss_tree(re); - - /* Freestyle */ - if((re->r.mode & R_EDGE_FRS ) && !re->test_break()) - if(re->r.renderer==R_INTERN) { - FRS_prepare(re); - FRS_render_Blender(re); - } + } if(re->test_break()) diff --git a/source/blender/render/intern/source/pipeline.c b/source/blender/render/intern/source/pipeline.c index 673bea87d6c..12dcd812a04 100644 --- a/source/blender/render/intern/source/pipeline.c +++ b/source/blender/render/intern/source/pipeline.c @@ -1637,6 +1637,10 @@ static void do_render_3d(Render *re) if(!re->test_break()) add_halo_flare(re); + /* Freestyle */ + if( re->r.mode & R_EDGE_FRS && re->r.renderer==R_INTERN) + FRS_add_Freestyle(re); + /* free all render verts etc */ RE_Database_Free(re); } |