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:
authorTamito Kajiyama <rd6t-kjym@asahi-net.or.jp>2010-03-28 21:46:10 +0400
committerTamito Kajiyama <rd6t-kjym@asahi-net.or.jp>2010-03-28 21:46:10 +0400
commit840ba8e8e74c74088aabf8185b91fd5e32302fee (patch)
tree2e0f229ffe129b889229c17b108777cb26aa818e
parent009d7819c144047355c35fb1ac90333351779e3c (diff)
Fixed the full sample anti-aliasing support in Freestyle.
The render pipeline has been extended to better work with Freestyle stroke rendering. Struct Render has a new member ListBase freestyle_renders to keep Render instances generated through stroke rendering in Freestyle. The number of elements (LinkData instances with LinkData::data pointing to a Render instance) in freestyle_renders is the same as the scene render layers of the scene being rendered. When the k-th scene render layer has the Freestyle option enabled, the k-th element of freestyle_renders refers to a Render instance that holds Freestyle render results for the scene layer. This association between the scene render layer and the Render instance is used to merge the Freestyle render results into the corresponding render results for the scene render layer.
-rw-r--r--source/blender/freestyle/FRS_freestyle.h5
-rwxr-xr-xsource/blender/freestyle/intern/application/Controller.cpp7
-rwxr-xr-xsource/blender/freestyle/intern/application/Controller.h2
-rw-r--r--source/blender/freestyle/intern/blender_interface/BlenderStrokeRenderer.cpp9
-rw-r--r--source/blender/freestyle/intern/blender_interface/BlenderStrokeRenderer.h2
-rw-r--r--source/blender/freestyle/intern/blender_interface/FRS_freestyle.cpp102
-rw-r--r--source/blender/render/intern/include/render_types.h2
-rw-r--r--source/blender/render/intern/source/pipeline.c72
8 files changed, 139 insertions, 62 deletions
diff --git a/source/blender/freestyle/FRS_freestyle.h b/source/blender/freestyle/FRS_freestyle.h
index 3d8e785ce99..cd07d2dfc11 100644
--- a/source/blender/freestyle/FRS_freestyle.h
+++ b/source/blender/freestyle/FRS_freestyle.h
@@ -19,7 +19,10 @@ extern "C" {
// Rendering
void FRS_initialize();
void FRS_set_context(bContext* C);
- void FRS_add_Freestyle( struct Render* re);
+ int FRS_is_freestyle_enabled(struct SceneRenderLayer* srl);
+ void FRS_init_stroke_rendering(struct Render* re);
+ struct Render* FRS_do_stroke_rendering(struct Render* re, struct SceneRenderLayer* srl);
+ void FRS_composite_result(struct Render* re, struct SceneRenderLayer* srl, struct Render* freestyle_render);
void FRS_exit();
// Panel configuration
diff --git a/source/blender/freestyle/intern/application/Controller.cpp b/source/blender/freestyle/intern/application/Controller.cpp
index 43f091d3fa1..76c9023df57 100755
--- a/source/blender/freestyle/intern/application/Controller.cpp
+++ b/source/blender/freestyle/intern/application/Controller.cpp
@@ -676,8 +676,13 @@ void Controller::DrawStrokes()
resetModified();
}
+void Controller::ResetRenderCount()
+{
+ _render_count = 0;
+}
+
Render* Controller::RenderStrokes(Render *re) {
- BlenderStrokeRenderer* blenderRenderer = new BlenderStrokeRenderer(re);
+ BlenderStrokeRenderer* blenderRenderer = new BlenderStrokeRenderer(re, ++_render_count);
_Canvas->Render( blenderRenderer );
Render* freestyle_render = blenderRenderer->RenderScene(re);
delete blenderRenderer;
diff --git a/source/blender/freestyle/intern/application/Controller.h b/source/blender/freestyle/intern/application/Controller.h
index 9d1db24a026..deeabb6da0a 100755
--- a/source/blender/freestyle/intern/application/Controller.h
+++ b/source/blender/freestyle/intern/application/Controller.h
@@ -85,6 +85,7 @@ public:
void saveSteerableViewMapImages();
void toggleEdgeTesselationNature(Nature::EdgeNature iNature);
void DrawStrokes();
+ void ResetRenderCount();
Render* RenderStrokes(Render *re);
void SwapStyleModules(unsigned i1, unsigned i2);
void InsertStyleModule(unsigned index, const char *iFileName);
@@ -204,6 +205,7 @@ private:
real _EPSILON;
real _bboxDiag;
+ int _render_count;
//AppStyleWindow *_pStyleWindow;
//AppOptionsWindow *_pOptionsWindow;
diff --git a/source/blender/freestyle/intern/blender_interface/BlenderStrokeRenderer.cpp b/source/blender/freestyle/intern/blender_interface/BlenderStrokeRenderer.cpp
index f6798384f0a..c7b4b681958 100644
--- a/source/blender/freestyle/intern/blender_interface/BlenderStrokeRenderer.cpp
+++ b/source/blender/freestyle/intern/blender_interface/BlenderStrokeRenderer.cpp
@@ -32,7 +32,7 @@ extern "C" {
#endif
-BlenderStrokeRenderer::BlenderStrokeRenderer(Render* re)
+BlenderStrokeRenderer::BlenderStrokeRenderer(Render* re, int render_count)
:StrokeRenderer(){
// TEMPORARY - need a texture manager
@@ -45,7 +45,9 @@ BlenderStrokeRenderer::BlenderStrokeRenderer(Render* re)
objects.first = objects.last = NULL;
ListBase lb;
- freestyle_scene = add_scene("freestyle_strokes");
+ char name[22];
+ snprintf(name, sizeof(name), "FRS%d_%s", render_count, re->scene->id.name+2);
+ freestyle_scene = add_scene(name);
lb = freestyle_scene->r.layers;
freestyle_scene->r= old_scene->r;
freestyle_scene->r.layers= lb;
@@ -95,9 +97,6 @@ BlenderStrokeRenderer::~BlenderStrokeRenderer(){
_textureManager = 0;
}
- // release scene
- free_libblock( &G.main->scene, freestyle_scene );
-
// release objects and data blocks
LinkData *link = (LinkData *)objects.first;
while(link) {
diff --git a/source/blender/freestyle/intern/blender_interface/BlenderStrokeRenderer.h b/source/blender/freestyle/intern/blender_interface/BlenderStrokeRenderer.h
index 5bee116457d..3f2b2a1128c 100644
--- a/source/blender/freestyle/intern/blender_interface/BlenderStrokeRenderer.h
+++ b/source/blender/freestyle/intern/blender_interface/BlenderStrokeRenderer.h
@@ -23,7 +23,7 @@ extern "C" {
class LIB_STROKE_EXPORT BlenderStrokeRenderer : public StrokeRenderer
{
public:
- BlenderStrokeRenderer(Render *re);
+ BlenderStrokeRenderer(Render *re, int render_count);
virtual ~BlenderStrokeRenderer();
/*! Renders a stroke rep */
diff --git a/source/blender/freestyle/intern/blender_interface/FRS_freestyle.cpp b/source/blender/freestyle/intern/blender_interface/FRS_freestyle.cpp
index 0ea3280c1bc..001da72771b 100644
--- a/source/blender/freestyle/intern/blender_interface/FRS_freestyle.cpp
+++ b/source/blender/freestyle/intern/blender_interface/FRS_freestyle.cpp
@@ -185,7 +185,7 @@ extern "C" {
controller->ComputeViewMap();
}
- void composite_result(Render* re, SceneRenderLayer* srl, Render* freestyle_render)
+ void FRS_composite_result(Render* re, SceneRenderLayer* srl, Render* freestyle_render)
{
RenderLayer *rl;
@@ -230,64 +230,66 @@ extern "C" {
}
return count;
}
+
+ int FRS_is_freestyle_enabled(SceneRenderLayer* srl) {
+ return (!(srl->layflag & SCE_LAY_DISABLE) &&
+ srl->layflag & SCE_LAY_FRS &&
+ displayed_layer_count(srl) > 0);
+ }
- void FRS_add_Freestyle(Render* re) {
-
- SceneRenderLayer *srl;
- Render* freestyle_render = NULL;
-
- // init
+ void FRS_init_stroke_rendering(Render* re) {
+
cout << "\n#===============================================================" << endl;
cout << "# Freestyle" << endl;
cout << "#===============================================================" << endl;
init_view(re);
init_camera(re);
- freestyle_scene = re->scene;
+
+ controller->ResetRenderCount();
+ }
+
+ Render* FRS_do_stroke_rendering(Render* re, SceneRenderLayer *srl) {
- for(srl= (SceneRenderLayer *)re->scene->r.layers.first; srl; srl= srl->next) {
- if( !(srl->layflag & SCE_LAY_DISABLE) &&
- srl->layflag & SCE_LAY_FRS &&
- displayed_layer_count(srl) > 0 )
- {
- cout << "\n----------------------------------------------------------" << endl;
- cout << "| " << (re->scene->id.name+2) << "|" << srl->name << endl;
- cout << "----------------------------------------------------------" << endl;
-
- // prepare Freestyle:
- // - clear canvas
- // - load mesh
- // - add style modules
- // - set parameters
- // - compute view map
- prepare(re, srl);
-
- if( re->test_break(re->tbh) ) {
- controller->CloseFile();
- break;
- }
-
- // render and composite Freestyle result
- if( controller->_ViewMap ) {
-
- // render strokes
- re->i.infostr= "Freestyle: Stroke rendering";
- re->stats_draw(re->sdh, &re->i);
- re->i.infostr= NULL;
- controller->DrawStrokes();
- freestyle_render = controller->RenderStrokes(re);
- controller->CloseFile();
-
- // composite result
- composite_result(re, srl, freestyle_render);
-
- // free resources
- RE_FreeRender(freestyle_render);
- }
- }
- }
+ Render* freestyle_render = NULL;
- freestyle_scene = NULL;
+ cout << "\n----------------------------------------------------------" << endl;
+ cout << "| " << (re->scene->id.name+2) << "|" << srl->name << endl;
+ cout << "----------------------------------------------------------" << endl;
+
+ // prepare Freestyle:
+ // - clear canvas
+ // - load mesh
+ // - add style modules
+ // - set parameters
+ // - compute view map
+ prepare(re, srl);
+
+ if( re->test_break(re->tbh) ) {
+ controller->CloseFile();
+ return NULL;
+ }
+
+ // render and composite Freestyle result
+ if( controller->_ViewMap ) {
+
+ // render strokes
+ re->i.infostr= "Freestyle: Stroke rendering";
+ re->stats_draw(re->sdh, &re->i);
+ re->i.infostr= NULL;
+ freestyle_scene = re->scene;
+ controller->DrawStrokes();
+ freestyle_render = controller->RenderStrokes(re);
+ controller->CloseFile();
+ freestyle_scene = NULL;
+
+ // composite result
+ FRS_composite_result(re, srl, freestyle_render);
+ RE_FreeRenderResult(freestyle_render->result);
+ freestyle_render->result = NULL;
+ }
+
+ return freestyle_render;
}
//=======================================================
diff --git a/source/blender/render/intern/include/render_types.h b/source/blender/render/intern/include/render_types.h
index 127fbce20eb..5767b2471ac 100644
--- a/source/blender/render/intern/include/render_types.h
+++ b/source/blender/render/intern/include/render_types.h
@@ -219,6 +219,8 @@ struct Render
ListBase volumes;
ListBase volume_precache_parts;
+ ListBase freestyle_renders;
+
/* arena for allocating data for use during render, for
* example dynamic TFaces to go in the VlakRen structure.
*/
diff --git a/source/blender/render/intern/source/pipeline.c b/source/blender/render/intern/source/pipeline.c
index 8da0a1bf177..0a1c63ba114 100644
--- a/source/blender/render/intern/source/pipeline.c
+++ b/source/blender/render/intern/source/pipeline.c
@@ -1829,6 +1829,7 @@ void RE_TileProcessor(Render *re, int firsttile, int threaded)
/* ************ This part uses API, for rendering Blender scenes ********** */
static void external_render_3d(Render *re, RenderEngineType *type);
+static void add_freestyle(Render *re);
static void do_render_3d(Render *re)
{
@@ -1864,7 +1865,7 @@ static void do_render_3d(Render *re)
/* Freestyle */
if( re->r.mode & R_EDGE_FRS && re->r.renderer==R_INTERN)
if(!re->test_break(re->tbh))
- FRS_add_Freestyle(re);
+ add_freestyle(re);
/* free all render verts etc */
RE_Database_Free(re);
@@ -2316,6 +2317,64 @@ static void render_composit_stats(void *unused, char *str)
}
+/* invokes Freestyle stroke rendering */
+static void add_freestyle(Render *re)
+{
+ SceneRenderLayer *srl;
+ LinkData *link;
+
+ FRS_init_stroke_rendering(re);
+
+ for(srl= (SceneRenderLayer *)re->scene->r.layers.first; srl; srl= srl->next) {
+
+ link = (LinkData *)MEM_callocN(sizeof(LinkData), "LinkData to Freestyle render");
+ BLI_addtail(&re->freestyle_renders, link);
+
+ if( FRS_is_freestyle_enabled(srl) ) {
+ link->data = (void *)FRS_do_stroke_rendering(re, srl);
+ }
+ }
+}
+
+/* merges the results of Freestyle stroke rendering into a given render result */
+static void composite_freestyle_renders(Render *re, int sample)
+{
+ Render *freestyle_render;
+ SceneRenderLayer *srl;
+ LinkData *link;
+
+ link = (LinkData *)re->freestyle_renders.first;
+ for(srl= (SceneRenderLayer *)re->scene->r.layers.first; srl; srl= srl->next) {
+ if( FRS_is_freestyle_enabled(srl) ) {
+ freestyle_render = (Render *)link->data;
+ read_render_result(freestyle_render, sample);
+ FRS_composite_result(re, srl, freestyle_render);
+ RE_FreeRenderResult(freestyle_render->result);
+ freestyle_render->result = NULL;
+ }
+ link = link->next;
+ }
+}
+
+/* releases temporary scenes and renders for Freestyle stroke rendering */
+static void free_all_freestyle_renders(void)
+{
+ Render *re1, *freestyle_render;
+ LinkData *link;
+
+ for(re1= RenderGlobal.renderlist.first; re1; re1= re1->next) {
+ for (link = (LinkData *)re1->freestyle_renders.first; link; link = link->next) {
+ if (link->data) {
+ freestyle_render = (Render *)link->data;
+ free_libblock(&G.main->scene, freestyle_render->scene);
+ RE_FreeRender(freestyle_render);
+ }
+ }
+ BLI_freelistN( &re1->freestyle_renders );
+ }
+}
+
+
/* reads all buffers, calls optional composite, merges in first result->rectf */
static void do_merge_fullsample(Render *re, bNodeTree *ntree)
{
@@ -2339,9 +2398,12 @@ static void do_merge_fullsample(Render *re, bNodeTree *ntree)
tag_scenes_for_render(re);
for(re1= RenderGlobal.renderlist.first; re1; re1= re1->next) {
- if(re1->scene->id.flag & LIB_DOIT)
- if(re1->r.scemode & R_FULL_SAMPLE)
+ if(re1->scene->id.flag & LIB_DOIT) {
+ if(re1->r.scemode & R_FULL_SAMPLE) {
read_render_result(re1, sample);
+ composite_freestyle_renders(re1, sample);
+ }
+ }
}
}
@@ -2491,6 +2553,8 @@ static void do_render_composite_fields_blur_3d(Render *re)
do_merge_fullsample(re, NULL);
}
+ free_all_freestyle_renders();
+
/* weak... the display callback wants an active renderlayer pointer... */
re->result->renlay= render_get_active_layer(re, re->result);
re->display_draw(re->ddh, re->result, NULL);
@@ -2824,7 +2888,7 @@ void RE_RenderFreestyleStrokes(Render *re, Scene *scene)
re->result_ok= 0;
scene->r.cfra= 1;
if(render_initialize_from_scene(re, scene, NULL, scene->lay, 0, 0)) {
- do_render_all_options(re);
+ do_render_fields_blur_3d(re);
}
re->result_ok= 1;
}