diff options
author | Brecht Van Lommel <brechtvanlommel@pandora.be> | 2013-09-11 00:26:34 +0400 |
---|---|---|
committer | Brecht Van Lommel <brechtvanlommel@pandora.be> | 2013-09-11 00:26:34 +0400 |
commit | 734eaab54542644f6a031858b4ca280cd565dc6a (patch) | |
tree | 9daef15ae823f2a13b73ac13d9f650614aa65a1f /source/blender/render | |
parent | 92d94ccb084df36ab7fd39f0258a7189356d9966 (diff) |
Fix #36327: cycles render layers exclude layers animation did not work well.
This is kind of another way to animate layers which is disabled, but add an
exception to make this case work.
Diffstat (limited to 'source/blender/render')
-rw-r--r-- | source/blender/render/intern/source/external_engine.c | 31 |
1 files changed, 28 insertions, 3 deletions
diff --git a/source/blender/render/intern/source/external_engine.c b/source/blender/render/intern/source/external_engine.c index ea22423985b..827a1f8f113 100644 --- a/source/blender/render/intern/source/external_engine.c +++ b/source/blender/render/intern/source/external_engine.c @@ -49,6 +49,8 @@ #include "IMB_imbuf.h" #include "IMB_imbuf_types.h" +#include "RNA_access.h" + #ifdef WITH_PYTHON #include "BPY_extern.h" #endif @@ -392,6 +394,17 @@ RenderData *RE_engine_get_render_data(Render *re) /* Render */ +static bool render_layer_exclude_animated(Scene *scene, SceneRenderLayer *srl) +{ + PointerRNA ptr; + PropertyRNA *prop; + + RNA_pointer_create(&scene->id, &RNA_SceneRenderLayer, srl, &ptr); + prop = RNA_struct_find_property(&ptr, "layers_exclude"); + + return RNA_property_animated(&ptr, prop); +} + int RE_engine_render(Render *re, int do_all) { RenderEngineType *type = RE_engines_find(re->r.engine); @@ -420,13 +433,25 @@ int RE_engine_render(Render *re, int do_all) if (re->r.scemode & R_SINGLE_LAYER) { srl = BLI_findlink(&re->r.layers, re->r.actlay); - if (srl) + if (srl) { non_excluded_lay |= ~srl->lay_exclude; + + /* in this case we must update all because animation for + * the scene has not been updated yet, and so may not be + * up to date until after BKE_scene_update_for_newframe */ + if (render_layer_exclude_animated(re->scene, srl)) + non_excluded_lay |= ~0; + } } else { - for (srl = re->r.layers.first; srl; srl = srl->next) - if (!(srl->layflag & SCE_LAY_DISABLE)) + for (srl = re->r.layers.first; srl; srl = srl->next) { + if (!(srl->layflag & SCE_LAY_DISABLE)) { non_excluded_lay |= ~srl->lay_exclude; + + if (render_layer_exclude_animated(re->scene, srl)) + non_excluded_lay |= ~0; + } + } } lay &= non_excluded_lay; |