diff options
author | Brecht Van Lommel <brechtvanlommel@pandora.be> | 2012-05-02 13:33:45 +0400 |
---|---|---|
committer | Brecht Van Lommel <brechtvanlommel@pandora.be> | 2012-05-02 13:33:45 +0400 |
commit | 1e2afcddd3f1fd7b82fc0ea78fec2d80021fe844 (patch) | |
tree | 8bec6696a9a624affbb56ae9531fc6598f631d81 /intern/cycles/render/object.cpp | |
parent | 5d4fd04f05fc20d1a15817e5de4f1e2b776ab2b6 (diff) |
Fix #31168: cycles mask layer should only affect objects for camera rays.
Fix: texture coordinate normal output was not correct, still changed under
object transform.
Diffstat (limited to 'intern/cycles/render/object.cpp')
-rw-r--r-- | intern/cycles/render/object.cpp | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/intern/cycles/render/object.cpp b/intern/cycles/render/object.cpp index ccc654965f1..cae69c06f7d 100644 --- a/intern/cycles/render/object.cpp +++ b/intern/cycles/render/object.cpp @@ -41,6 +41,7 @@ Object::Object() motion.pre = transform_identity(); motion.post = transform_identity(); use_motion = false; + use_holdout = false; } Object::~Object() @@ -143,12 +144,14 @@ ObjectManager::~ObjectManager() void ObjectManager::device_update_transforms(Device *device, DeviceScene *dscene, Scene *scene, Progress& progress) { float4 *objects = dscene->objects.resize(OBJECT_SIZE*scene->objects.size()); + uint *object_flag = dscene->object_flag.resize(OBJECT_SIZE*scene->objects.size()); int i = 0; map<Mesh*, float> surface_area_map; Scene::MotionType need_motion = scene->need_motion(); foreach(Object *ob, scene->objects) { Mesh *mesh = ob->mesh; + uint flag = 0; /* compute transformations */ Transform tfm = ob->tfm; @@ -219,6 +222,7 @@ void ObjectManager::device_update_transforms(Device *device, DeviceScene *dscene transform_motion_decompose(&decomp, &ob->motion); memcpy(&objects[offset+8], &decomp, sizeof(float4)*8); + flag |= SD_OBJECT_MOTION; } else { float4 no_motion = make_float4(FLT_MAX); @@ -226,12 +230,18 @@ void ObjectManager::device_update_transforms(Device *device, DeviceScene *dscene } } + /* object flag */ + if(ob->use_holdout) + flag |= SD_HOLDOUT_MASK; + object_flag[i] = flag; + i++; if(progress.get_cancel()) return; } device->tex_alloc("__objects", dscene->objects); + device->tex_alloc("__object_flag", dscene->object_flag); } void ObjectManager::device_update(Device *device, DeviceScene *dscene, Scene *scene, Progress& progress) @@ -266,6 +276,9 @@ void ObjectManager::device_free(Device *device, DeviceScene *dscene) { device->tex_free(dscene->objects); dscene->objects.clear(); + + device->tex_free(dscene->object_flag); + dscene->object_flag.clear(); } void ObjectManager::apply_static_transforms(Scene *scene, Progress& progress) |