diff options
author | Brecht Van Lommel <brechtvanlommel@gmail.com> | 2018-06-12 14:49:27 +0300 |
---|---|---|
committer | Brecht Van Lommel <brechtvanlommel@gmail.com> | 2018-06-12 18:07:18 +0300 |
commit | 3801736b891ea0a1ca3c9a8927a44d38527fcefc (patch) | |
tree | f4a364dda67e8e18d0b692e4ed0ea0225fba54aa /source/blender/render | |
parent | a9cfd8c910687e5e18e34339a5a33fb73f167421 (diff) |
Depsgraph: remove object tagging hack for render.
With copy-on-write it should now all be evaluated correctly in render
resolution, without needing to switch the original data resoluton.
Diffstat (limited to 'source/blender/render')
-rw-r--r-- | source/blender/render/intern/source/pipeline.c | 214 |
1 files changed, 0 insertions, 214 deletions
diff --git a/source/blender/render/intern/source/pipeline.c b/source/blender/render/intern/source/pipeline.c index 98a08564905..648fbff7b23 100644 --- a/source/blender/render/intern/source/pipeline.c +++ b/source/blender/render/intern/source/pipeline.c @@ -1225,19 +1225,6 @@ static int composite_needs_render(Scene *sce, int this_scene) return 0; } -static bool rlayer_node_uses_alpha(bNodeTree *ntree, bNode *node) -{ - bNodeSocket *sock; - - for (sock = node->outputs.first; sock; sock = sock->next) { - /* Weak! but how to make it better? */ - if (STREQ(sock->name, "Alpha") && nodeCountSocketLinks(ntree, sock) > 0) - return true; - } - - return false; -} - bool RE_allow_render_generic_object(Object *ob) { /* override not showing object when duplis are used with particles */ @@ -1250,188 +1237,6 @@ bool RE_allow_render_generic_object(Object *ob) return true; } -/* Issue here is that it's possible that object which is used by boolean, - * array or shrinkwrap modifiers weren't displayed in the viewport before - * rendering. This leads to situations when apply() of this modifiers - * could not get ob->derivedFinal and modifiers are not being applied. - * - * This was worked around by direct call of get_derived_final() from those - * modifiers, but such approach leads to write conflicts with threaded - * update. - * - * Here we make sure derivedFinal will be calculated by update_for_newframe - * function later in the pipeline and all the modifiers are applied - * properly without hacks from their side. - * - sergey - - */ -#define DEPSGRAPH_WORKAROUND_HACK - -#ifdef DEPSGRAPH_WORKAROUND_HACK -static void tag_dependend_object_for_render(Scene *scene, Object *object); - -static void tag_dependend_group_for_render(Scene *scene, Collection *collection) -{ - if (collection->id.tag & LIB_TAG_DOIT) { - return; - } - collection->id.tag |= LIB_TAG_DOIT; - - for (CollectionObject *cob = collection->gobject.first; cob != NULL; cob = cob->next) { - Object *object = cob->ob; - tag_dependend_object_for_render(scene, object); - } -} - -static void tag_dependend_object_for_render(Scene *scene, Object *object) -{ - if (object->type == OB_MESH) { - if (RE_allow_render_generic_object(object)) { - ModifierData *md; - VirtualModifierData virtualModifierData; - - if (object->particlesystem.first) { - DEG_id_tag_update(&object->id, OB_RECALC_DATA); - } - - for (md = modifiers_getVirtualModifierList(object, &virtualModifierData); - md; - md = md->next) - { - if (!modifier_isEnabled(scene, md, eModifierMode_Render)) { - continue; - } - - if (md->type == eModifierType_Boolean) { - BooleanModifierData *bmd = (BooleanModifierData *)md; - if (bmd->object && bmd->object->type == OB_MESH) { - DEG_id_tag_update(&bmd->object->id, OB_RECALC_DATA); - } - } - else if (md->type == eModifierType_Array) { - ArrayModifierData *amd = (ArrayModifierData *)md; - if (amd->start_cap && amd->start_cap->type == OB_MESH) { - DEG_id_tag_update(&amd->start_cap->id, OB_RECALC_DATA); - } - if (amd->end_cap && amd->end_cap->type == OB_MESH) { - DEG_id_tag_update(&amd->end_cap->id, OB_RECALC_DATA); - } - } - else if (md->type == eModifierType_Shrinkwrap) { - ShrinkwrapModifierData *smd = (ShrinkwrapModifierData *)md; - if (smd->target && smd->target->type == OB_MESH) { - DEG_id_tag_update(&smd->target->id, OB_RECALC_DATA); - } - } - else if (md->type == eModifierType_ParticleSystem) { - ParticleSystemModifierData *psmd = (ParticleSystemModifierData *)md; - ParticleSystem *psys = psmd->psys; - ParticleSettings *part = psys->part; - switch (part->ren_as) { - case PART_DRAW_OB: - if (part->dup_ob != NULL) { - DEG_id_tag_update(&part->dup_ob->id, OB_RECALC_DATA); - } - break; - case PART_DRAW_GR: - if (part->dup_group != NULL) { - FOREACH_COLLECTION_OBJECT_RECURSIVE_BEGIN(part->dup_group, ob) - { - DEG_id_tag_update(&ob->id, OB_RECALC_DATA); - } - FOREACH_COLLECTION_OBJECT_RECURSIVE_END; - } - break; - } - } - } - } - } - if (object->dup_group != NULL) { - tag_dependend_group_for_render(scene, object->dup_group); - } -} - -static void tag_dependend_objects_for_render(Main *bmain, Scene *scene) -{ - BKE_main_id_tag_idcode(bmain, ID_GR, LIB_TAG_DOIT, false); - FOREACH_OBJECT_RENDERABLE_BEGIN(scene, object) - { - tag_dependend_object_for_render(scene, object); - } - FOREACH_OBJECT_RENDERABLE_END; -} -#endif - -static void tag_scenes_for_render(Render *re) -{ - bNode *node; - Scene *sce; - - for (sce = re->main->scene.first; sce; sce = sce->id.next) { - sce->id.tag &= ~LIB_TAG_DOIT; -#ifdef DEPSGRAPH_WORKAROUND_HACK - tag_dependend_objects_for_render(re->main, sce); -#endif - } - -#ifdef WITH_FREESTYLE - if (re->freestyle_bmain) { - for (sce = re->freestyle_bmain->scene.first; sce; sce = sce->id.next) { - sce->id.tag &= ~LIB_TAG_DOIT; -#ifdef DEPSGRAPH_WORKAROUND_HACK - tag_dependend_objects_for_render(re->freestyle_bmain, sce); -#endif - } - } -#endif - - if (RE_GetCamera(re) && composite_needs_render(re->scene, 1)) { - re->scene->id.tag |= LIB_TAG_DOIT; -#ifdef DEPSGRAPH_WORKAROUND_HACK - tag_dependend_objects_for_render(re->main, re->scene); -#endif - } - - if (re->scene->nodetree == NULL) return; - - /* check for render-layers nodes using other scenes, we tag them LIB_TAG_DOIT */ - for (node = re->scene->nodetree->nodes.first; node; node = node->next) { - node->flag &= ~NODE_TEST; - if (node->type == CMP_NODE_R_LAYERS && (node->flag & NODE_MUTED) == 0) { - if (node->id) { - if (!MAIN_VERSION_ATLEAST(re->main, 265, 5)) { - if (rlayer_node_uses_alpha(re->scene->nodetree, node)) { - Scene *scene = (Scene *)node->id; - - if (scene->r.alphamode != R_ALPHAPREMUL) { - BKE_reportf(re->reports, RPT_WARNING, "Setting scene %s alpha mode to Premul", scene->id.name + 2); - - /* also print, so feedback is immediate */ - printf("2.66 versioning fix: setting scene %s alpha mode to Premul\n", scene->id.name + 2); - - scene->r.alphamode = R_ALPHAPREMUL; - } - } - } - - if (node->id != (ID *)re->scene) { - if ((node->id->tag & LIB_TAG_DOIT) == 0) { - Scene *scene = (Scene *) node->id; - if (render_scene_has_layers_to_render(scene, NULL)) { - node->flag |= NODE_TEST; - node->id->tag |= LIB_TAG_DOIT; -#ifdef DEPSGRAPH_WORKAROUND_HACK - tag_dependend_objects_for_render(re->main, scene); -#endif - } - } - } - } - } - } - -} - static void ntree_render_scenes(Render *re) { bNode *node; @@ -1441,12 +1246,6 @@ static void ntree_render_scenes(Render *re) if (re->scene->nodetree == NULL) return; - tag_scenes_for_render(re); - -#ifdef DEPSGRAPH_WORKAROUND_GROUP_HACK - tag_collections_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 */ for (node = re->scene->nodetree->nodes.first; node; node = node->next) { @@ -1640,11 +1439,6 @@ static void do_render_composite(Render *re) free_all_freestyle_renders(); #endif -#ifdef DEPSGRAPH_WORKAROUND_GROUP_HACK - /* Restore their visibility based on the viewport visibility flags. */ - tag_collections_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); @@ -2164,14 +1958,6 @@ static int render_initialize_from_main(Render *re, RenderData *rd, Main *bmain, return 1; } - /* check all scenes involved */ - tag_scenes_for_render(re); - -#ifdef DEPSGRAPH_WORKAROUND_GROUP_HACK - /* Update collection collections visibility. */ - tag_collections_for_render(re); -#endif - /* * Disabled completely for now, * can be later set as render profile option |