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
path: root/source
diff options
context:
space:
mode:
authorMaxime Curioni <maxime.curioni@gmail.com>2009-03-22 19:25:14 +0300
committerMaxime Curioni <maxime.curioni@gmail.com>2009-03-22 19:25:14 +0300
commitd79ddebaaec697e1775a6f652a1ee064eb053bf4 (patch)
tree15231467095ba6cddba4372ee71c02de1e0d2fcc /source
parentf86309d6728337f3f9452a78f949b3f4fd3d59af (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)
Diffstat (limited to 'source')
-rw-r--r--source/blender/freestyle/FRS_freestyle.h4
-rw-r--r--source/blender/freestyle/intern/app_blender/FRS_freestyle.cpp53
-rw-r--r--source/blender/freestyle/intern/stroke/BlenderStrokeRenderer.cpp2
-rw-r--r--source/blender/render/intern/source/convertblender.c8
-rw-r--r--source/blender/render/intern/source/pipeline.c4
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);
}