Fix #33131: more useful cycles behavior for layers that are both marked excluded

and as mask layer. Now it will still use the mask, and have no further influence
rather than just being excluded entirely.
This commit is contained in:
Brecht Van Lommel 2012-11-09 23:28:51 +00:00
parent b3fb373f89
commit 09b34e69d4
4 changed files with 25 additions and 3 deletions

@ -253,6 +253,7 @@ Object *BlenderSync::sync_object(BL::Object b_parent, int persistent_id[OBJECT_P
if(use_holdout != object->use_holdout) {
object->use_holdout = use_holdout;
scene->object_manager->tag_update(scene);
object_updated = true;
}
/* object sync
@ -278,6 +279,10 @@ Object *BlenderSync::sync_object(BL::Object b_parent, int persistent_id[OBJECT_P
object->random_id ^= hash_int(hash_string(b_parent.name().c_str()));
}
/* make holdout objects on excluded layer invisible for non-camera rays */
if(use_holdout && (layer_flag & render_layer.exclude_layer))
object->visibility &= ~(PATH_RAY_ALL - PATH_RAY_CAMERA);
/* camera flag is not actually used, instead is tested
* against render layer flags */
if(object->visibility & PATH_RAY_CAMERA) {

@ -241,6 +241,7 @@ void BlenderSync::sync_render_layers(BL::SpaceView3D b_v3d, const char *layer)
render_layer.use_localview = (b_v3d.local_view() ? true : false);
render_layer.scene_layer = get_layer(b_v3d.layers(), b_v3d.layers_local_view(), render_layer.use_localview);
render_layer.layer = render_layer.scene_layer;
render_layer.exclude_layer = 0;
render_layer.holdout_layer = 0;
render_layer.material_override = PointerRNA_NULL;
render_layer.use_background = true;
@ -258,10 +259,16 @@ void BlenderSync::sync_render_layers(BL::SpaceView3D b_v3d, const char *layer)
for(r.layers.begin(b_rlay); b_rlay != r.layers.end(); ++b_rlay) {
if((!layer && first_layer) || (layer && b_rlay->name() == layer)) {
render_layer.name = b_rlay->name();
render_layer.scene_layer = get_layer(b_scene.layers()) & ~get_layer(b_rlay->layers_exclude());
render_layer.layer = get_layer(b_rlay->layers());
render_layer.holdout_layer = get_layer(b_rlay->layers_zmask());
render_layer.exclude_layer = get_layer(b_rlay->layers_exclude());
render_layer.scene_layer = get_layer(b_scene.layers()) & ~render_layer.exclude_layer;
render_layer.scene_layer |= render_layer.exclude_layer & render_layer.holdout_layer;
render_layer.layer = get_layer(b_rlay->layers());
render_layer.layer |= render_layer.holdout_layer;
render_layer.material_override = b_rlay->material_override();
render_layer.use_background = b_rlay->use_sky();
render_layer.use_viewport_visibility = false;

@ -116,7 +116,8 @@ private:
struct RenderLayerInfo {
RenderLayerInfo()
: scene_layer(0), layer(0), holdout_layer(0),
: scene_layer(0), layer(0),
holdout_layer(0), exclude_layer(0),
material_override(PointerRNA_NULL),
use_background(true),
use_viewport_visibility(false),
@ -127,6 +128,7 @@ private:
uint scene_layer;
uint layer;
uint holdout_layer;
uint exclude_layer;
BL::Material material_override;
bool use_background;
bool use_viewport_visibility;

@ -147,6 +147,10 @@ void LightManager::device_update_distribution(Device *device, DeviceScene *dscen
Mesh *mesh = object->mesh;
bool have_emission = false;
/* skip if we are not visible for BSDFs */
if(!(object->visibility & (PATH_RAY_DIFFUSE|PATH_RAY_GLOSSY|PATH_RAY_TRANSMIT)))
continue;
/* skip if we have no emission shaders */
foreach(uint sindex, mesh->used_shaders) {
Shader *shader = scene->shaders[sindex];
@ -183,6 +187,10 @@ void LightManager::device_update_distribution(Device *device, DeviceScene *dscen
Mesh *mesh = object->mesh;
bool have_emission = false;
/* skip if we are not visible for BSDFs */
if(!(object->visibility & (PATH_RAY_DIFFUSE|PATH_RAY_GLOSSY|PATH_RAY_TRANSMIT)))
continue;
/* skip if we have no emission shaders */
foreach(uint sindex, mesh->used_shaders) {
Shader *shader = scene->shaders[sindex];