Depsgraph / Render / Collection: Tag groups for rendering

We need to tag groups before and after rendering, so the group collections
viewport and render visibility are taken into account.

Note: This is a workaround, that will be removed once the render engine have
its own depsgraph, instead of re-using the viewport depsgraph.
This commit is contained in:
Dalai Felinto
2017-12-15 08:33:25 -02:00
parent 1f5106de61
commit 3a47fb764c

View File

@@ -37,6 +37,7 @@
#include <errno.h>
#include "DNA_anim_types.h"
#include "DNA_group_types.h"
#include "DNA_image_types.h"
#include "DNA_node_types.h"
#include "DNA_object_types.h"
@@ -2113,6 +2114,31 @@ static void tag_dependend_objects_for_render(Scene *scene, int UNUSED(renderlay)
}
#endif
#define DEPSGRAPH_WORKAROUND_GROUP_HACK
#ifdef DEPSGRAPH_WORKAROUND_GROUP_HACK
/**
* Make sure the COLLECTION_VIEWPORT / COLLECTION_RENDER is considered
* for the collections visibility.
*
* This won't be needed anymore once we have depsgraph per render engine.
*/
static void tag_groups_for_render(Render *re)
{
for (Group *group = re->main->group.first; group; group = group->id.next) {
DEG_id_tag_update(&group->id, 0);
}
#ifdef WITH_FREESTYLE
if (re->freestyle_bmain) {
for (Group *group = re->freestyle_bmain->group.first; group; group = group->id.next) {
DEG_id_tag_update(&group->id, 0);
}
}
#endif
}
#endif
static void tag_scenes_for_render(Render *re)
{
bNode *node;
@@ -2196,6 +2222,10 @@ static void ntree_render_scenes(Render *re)
if (re->scene->nodetree == NULL) return;
tag_scenes_for_render(re);
#ifdef DEPSGRAPH_WORKAROUND_GROUP_HACK
tag_groups_for_render(re);
#endif
/* now foreach render-result node tagged we do a full render */
/* results are stored in a way compisitor will find it */
@@ -2413,6 +2443,10 @@ static void do_merge_fullsample(Render *re, bNodeTree *ntree)
}
}
#ifdef DEPSGRAPH_WORKAROUND_GROUP_HACK
tag_groups_for_render(re);
#endif
/* composite */
if (ntree) {
ntreeCompositTagRender(re->scene);
@@ -2564,6 +2598,11 @@ void RE_MergeFullSample(Render *re, Main *bmain, Scene *sce, bNodeTree *ntree)
#ifdef WITH_FREESTYLE
free_all_freestyle_renders();
#endif
#ifdef DEPSGRAPH_WORKAROUND_GROUP_HACK
/* Restore their visibility based on the viewport visibility flags. */
tag_groups_for_render(re);
#endif
}
/* returns fully composited render-result on given time step (in RenderData) */
@@ -2662,6 +2701,11 @@ static void do_render_composite_fields_blur_3d(Render *re)
free_all_freestyle_renders();
#endif
#ifdef DEPSGRAPH_WORKAROUND_GROUP_HACK
/* Restore their visibility based on the viewport visibility flags. */
tag_groups_for_render(re);
#endif
/* weak... the display callback wants an active renderlayer pointer... */
if (re->result != NULL) {
re->result->renlay = render_get_active_layer(re, re->result);
@@ -3223,6 +3267,11 @@ static int render_initialize_from_main(Render *re, RenderData *rd, Main *bmain,
/* check all scenes involved */
tag_scenes_for_render(re);
#ifdef DEPSGRAPH_WORKAROUND_GROUP_HACK
/* Update group collections visibility. */
tag_groups_for_render(re);
#endif
/*
* Disabled completely for now,
* can be later set as render profile option