Fix for full-sample anti-aliasing (FSAA) not working with Freestyle.

Reverted the trunk revision 56136 and part of revision 56127 concerning the local Main
for Freestyle and temporary scene generation for stroke rendering.

The function do_merge_fullsample() in pipeline.c has access to the Scene of each Render,
so that the temporary Scene generated by Freestyle has to be kept for FSAA even after
stroke rendering has been done.  By the same token, the local Main has been moved from
the BlenderStrokeRenderer class to Render.  It is noted that free_all_freestyle_renders()
in pipeline.c is intended to get the temporary Scene of each Render released specifically
taking account of the FSAA case.
This commit is contained in:
Tamito Kajiyama 2013-04-23 22:40:13 +00:00
parent 9465ecf634
commit a1ed1dd26b
4 changed files with 27 additions and 24 deletions

@ -57,7 +57,7 @@ namespace Freestyle {
BlenderStrokeRenderer::BlenderStrokeRenderer(Render *re, int render_count) : StrokeRenderer() BlenderStrokeRenderer::BlenderStrokeRenderer(Render *re, int render_count) : StrokeRenderer()
{ {
memset(&_freestyle_bmain, 0, sizeof(Main)); freestyle_bmain = &re->freestyle_bmain;
// TEMPORARY - need a texture manager // TEMPORARY - need a texture manager
_textureManager = new BlenderTextureManager; _textureManager = new BlenderTextureManager;
@ -71,7 +71,7 @@ BlenderStrokeRenderer::BlenderStrokeRenderer(Render *re, int render_count) : Str
char name[22]; char name[22];
BLI_snprintf(name, sizeof(name), "FRS%d_%s", render_count, re->scene->id.name + 2); BLI_snprintf(name, sizeof(name), "FRS%d_%s", render_count, re->scene->id.name + 2);
freestyle_scene = BKE_scene_add(&_freestyle_bmain, name); freestyle_scene = BKE_scene_add(freestyle_bmain, name);
freestyle_scene->r.cfra = old_scene->r.cfra; freestyle_scene->r.cfra = old_scene->r.cfra;
freestyle_scene->r.mode = old_scene->r.mode & freestyle_scene->r.mode = old_scene->r.mode &
~(R_EDGE_FRS | R_SHADOW | R_SSS | R_PANORAMA | R_ENVMAP | R_MBLUR | R_BORDER); ~(R_EDGE_FRS | R_SHADOW | R_SSS | R_PANORAMA | R_ENVMAP | R_MBLUR | R_BORDER);
@ -114,10 +114,10 @@ BlenderStrokeRenderer::BlenderStrokeRenderer(Render *re, int render_count) : Str
SceneRenderLayer *srl = (SceneRenderLayer *)freestyle_scene->r.layers.first; SceneRenderLayer *srl = (SceneRenderLayer *)freestyle_scene->r.layers.first;
srl->layflag = SCE_LAY_SOLID | SCE_LAY_ZTRA; srl->layflag = SCE_LAY_SOLID | SCE_LAY_ZTRA;
BKE_scene_set_background(&_freestyle_bmain, freestyle_scene); BKE_scene_set_background(freestyle_bmain, freestyle_scene);
// Camera // Camera
Object *object_camera = BKE_object_add(&_freestyle_bmain, freestyle_scene, OB_CAMERA); Object *object_camera = BKE_object_add(freestyle_bmain, freestyle_scene, OB_CAMERA);
Camera *camera = (Camera *)object_camera->data; Camera *camera = (Camera *)object_camera->data;
camera->type = CAM_ORTHO; camera->type = CAM_ORTHO;
@ -135,7 +135,7 @@ BlenderStrokeRenderer::BlenderStrokeRenderer(Render *re, int render_count) : Str
freestyle_scene->camera = object_camera; freestyle_scene->camera = object_camera;
// Material // Material
material = BKE_material_add(&_freestyle_bmain, "stroke_material"); material = BKE_material_add(freestyle_bmain, "stroke_material");
material->mode |= MA_VERTEXCOLP; material->mode |= MA_VERTEXCOLP;
material->mode |= MA_TRANSP; material->mode |= MA_TRANSP;
material->mode |= MA_SHLESS; material->mode |= MA_SHLESS;
@ -169,12 +169,12 @@ BlenderStrokeRenderer::~BlenderStrokeRenderer()
#endif #endif
switch (ob->type) { switch (ob->type) {
case OB_MESH: case OB_MESH:
BKE_libblock_free(&_freestyle_bmain.object, ob); BKE_libblock_free(&freestyle_bmain->object, ob);
BKE_libblock_free(&_freestyle_bmain.mesh, data); BKE_libblock_free(&freestyle_bmain->mesh, data);
break; break;
case OB_CAMERA: case OB_CAMERA:
BKE_libblock_free(&_freestyle_bmain.object, ob); BKE_libblock_free(&freestyle_bmain->object, ob);
BKE_libblock_free(&_freestyle_bmain.camera, data); BKE_libblock_free(&freestyle_bmain->camera, data);
freestyle_scene->camera = NULL; freestyle_scene->camera = NULL;
break; break;
default: default:
@ -184,9 +184,7 @@ BlenderStrokeRenderer::~BlenderStrokeRenderer()
BLI_freelistN(&freestyle_scene->base); BLI_freelistN(&freestyle_scene->base);
// release material // release material
BKE_libblock_free(&_freestyle_bmain.mat, material); BKE_libblock_free(&freestyle_bmain->mat, material);
BKE_scene_unlink(&_freestyle_bmain, freestyle_scene, NULL);
} }
float BlenderStrokeRenderer::get_stroke_vertex_z(void) const float BlenderStrokeRenderer::get_stroke_vertex_z(void) const
@ -270,7 +268,7 @@ void BlenderStrokeRenderer::RenderStrokeRepBasic(StrokeRep *iStrokeRep) const
//me = Mesh.New() //me = Mesh.New()
#if 0 #if 0
Object *object_mesh = BKE_object_add(&_freestyle_bmain, freestyle_scene, OB_MESH); Object *object_mesh = BKE_object_add(freestyle_bmain, freestyle_scene, OB_MESH);
#else #else
Object *object_mesh = NewMesh(); Object *object_mesh = NewMesh();
#endif #endif
@ -278,7 +276,7 @@ void BlenderStrokeRenderer::RenderStrokeRepBasic(StrokeRep *iStrokeRep) const
mesh->mat = (Material **)MEM_mallocN(1 * sizeof(Material *), "MaterialList"); mesh->mat = (Material **)MEM_mallocN(1 * sizeof(Material *), "MaterialList");
mesh->mat[0] = material; mesh->mat[0] = material;
mesh->totcol = 1; mesh->totcol = 1;
test_object_materials((Main *) &_freestyle_bmain, (ID *)mesh); test_object_materials(freestyle_bmain, (ID *)mesh);
// vertices allocation // vertices allocation
mesh->totvert = visible_faces + visible_segments * 2; mesh->totvert = visible_faces + visible_segments * 2;
@ -461,9 +459,9 @@ Object *BlenderStrokeRenderer::NewMesh() const
/* XXX this is for later review, for now we start names with 27 (DEL) /* XXX this is for later review, for now we start names with 27 (DEL)
to allow ignoring them in DAG_ids_check_recalc() */ to allow ignoring them in DAG_ids_check_recalc() */
BLI_snprintf(name, MAX_ID_NAME, "%c0%08xOB", 27, mesh_id); BLI_snprintf(name, MAX_ID_NAME, "%c0%08xOB", 27, mesh_id);
ob = BKE_object_add_only_object((Main *) &_freestyle_bmain, OB_MESH, name); ob = BKE_object_add_only_object(freestyle_bmain, OB_MESH, name);
BLI_snprintf(name, MAX_ID_NAME, "%c0%08xME", 27, mesh_id); BLI_snprintf(name, MAX_ID_NAME, "%c0%08xME", 27, mesh_id);
ob->data = BKE_mesh_add((Main *) &_freestyle_bmain, name); ob->data = BKE_mesh_add(freestyle_bmain, name);
ob->lay = 1; ob->lay = 1;
base = BKE_scene_base_add(freestyle_scene, ob); base = BKE_scene_base_add(freestyle_scene, ob);
@ -491,11 +489,7 @@ Render *BlenderStrokeRenderer::RenderScene(Render *re)
Render *freestyle_render = RE_NewRender(freestyle_scene->id.name); Render *freestyle_render = RE_NewRender(freestyle_scene->id.name);
RE_RenderFreestyleStrokes(freestyle_render, &_freestyle_bmain, freestyle_scene); RE_RenderFreestyleStrokes(freestyle_render, freestyle_bmain, freestyle_scene);
// rendering is done, scene would be freed in destructor,
// no need to store it's in render structure
freestyle_render->scene = NULL;
return freestyle_render; return freestyle_render;
} }

@ -54,7 +54,7 @@ public:
Render *RenderScene(Render *re); Render *RenderScene(Render *re);
protected: protected:
Main _freestyle_bmain; Main *freestyle_bmain;
Scene *old_scene; Scene *old_scene;
Scene *freestyle_scene; Scene *freestyle_scene;
Material *material; Material *material;

@ -44,6 +44,8 @@
#include "BLI_threads.h" #include "BLI_threads.h"
#include "BKE_main.h"
#include "RE_pipeline.h" #include "RE_pipeline.h"
#include "RE_shader_ext.h" /* TexResult, ShadeResult, ShadeInput */ #include "RE_shader_ext.h" /* TexResult, ShadeResult, ShadeInput */
#include "sunsky.h" #include "sunsky.h"
@ -237,6 +239,7 @@ struct Render
ListBase volume_precache_parts; ListBase volume_precache_parts;
#ifdef WITH_FREESTYLE #ifdef WITH_FREESTYLE
struct Main freestyle_bmain;
ListBase freestyle_renders; ListBase freestyle_renders;
#endif #endif

@ -1529,6 +1529,11 @@ static void tag_scenes_for_render(Render *re)
for (sce = re->main->scene.first; sce; sce = sce->id.next) for (sce = re->main->scene.first; sce; sce = sce->id.next)
sce->id.flag &= ~LIB_DOIT; sce->id.flag &= ~LIB_DOIT;
#ifdef WITH_FREESTYLE
for (sce = re->freestyle_bmain.scene.first; sce; sce = sce->id.next)
sce->id.flag &= ~LIB_DOIT;
#endif
if (RE_GetCamera(re) && composite_needs_render(re->scene, 1)) if (RE_GetCamera(re) && composite_needs_render(re->scene, 1))
re->scene->id.flag |= LIB_DOIT; re->scene->id.flag |= LIB_DOIT;
@ -1662,10 +1667,11 @@ static void free_all_freestyle_renders(void)
for (link = (LinkData *)re1->freestyle_renders.first; link; link = link->next) { for (link = (LinkData *)re1->freestyle_renders.first; link; link = link->next) {
if (link->data) { if (link->data) {
freestyle_render = (Render *)link->data; freestyle_render = (Render *)link->data;
BKE_scene_unlink(&re1->freestyle_bmain, freestyle_render->scene, NULL);
RE_FreeRender(freestyle_render); RE_FreeRender(freestyle_render);
} }
} }
BLI_freelistN( &re1->freestyle_renders ); BLI_freelistN(&re1->freestyle_renders);
} }
} }
#endif #endif
@ -1711,7 +1717,7 @@ static void do_merge_fullsample(Render *re, bNodeTree *ntree)
BLI_rw_mutex_lock(&re->resultmutex, THREAD_LOCK_WRITE); BLI_rw_mutex_lock(&re->resultmutex, THREAD_LOCK_WRITE);
render_result_exr_file_read(re1, sample); render_result_exr_file_read(re1, sample);
#ifdef WITH_FREESTYLE #ifdef WITH_FREESTYLE
if( re1->r.mode & R_EDGE_FRS) if (re1->r.mode & R_EDGE_FRS)
composite_freestyle_renders(re1, sample); composite_freestyle_renders(re1, sample);
#endif #endif
BLI_rw_mutex_unlock(&re->resultmutex); BLI_rw_mutex_unlock(&re->resultmutex);