Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrecht Van Lommel <brechtvanlommel@pandora.be>2012-05-02 13:33:45 +0400
committerBrecht Van Lommel <brechtvanlommel@pandora.be>2012-05-02 13:33:45 +0400
commit1e2afcddd3f1fd7b82fc0ea78fec2d80021fe844 (patch)
tree8bec6696a9a624affbb56ae9531fc6598f631d81 /intern/cycles/render
parent5d4fd04f05fc20d1a15817e5de4f1e2b776ab2b6 (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')
-rw-r--r--intern/cycles/render/camera.cpp6
-rw-r--r--intern/cycles/render/object.cpp13
-rw-r--r--intern/cycles/render/object.h1
-rw-r--r--intern/cycles/render/scene.h1
4 files changed, 20 insertions, 1 deletions
diff --git a/intern/cycles/render/camera.cpp b/intern/cycles/render/camera.cpp
index e9ca7c3a366..f0b77871130 100644
--- a/intern/cycles/render/camera.cpp
+++ b/intern/cycles/render/camera.cpp
@@ -149,6 +149,7 @@ void Camera::device_update(Device *device, DeviceScene *dscene, Scene *scene)
/* camera motion */
Scene::MotionType need_motion = scene->need_motion();
+ kcam->have_motion = 0;
if(need_motion == Scene::MOTION_PASS) {
if(use_motion) {
@@ -162,7 +163,10 @@ void Camera::device_update(Device *device, DeviceScene *dscene, Scene *scene)
}
else if(need_motion == Scene::MOTION_BLUR) {
/* todo: exact camera position will not be hit this way */
- transform_motion_decompose(&kcam->motion, &motion);
+ if(use_motion) {
+ transform_motion_decompose(&kcam->motion, &motion);
+ kcam->have_motion = 1;
+ }
}
/* depth of field */
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)
diff --git a/intern/cycles/render/object.h b/intern/cycles/render/object.h
index e84c4b26767..267052bfca7 100644
--- a/intern/cycles/render/object.h
+++ b/intern/cycles/render/object.h
@@ -46,6 +46,7 @@ public:
uint visibility;
MotionTransform motion;
bool use_motion;
+ bool use_holdout;
Object();
~Object();
diff --git a/intern/cycles/render/scene.h b/intern/cycles/render/scene.h
index 7d4acf369fd..ca4d9fc9625 100644
--- a/intern/cycles/render/scene.h
+++ b/intern/cycles/render/scene.h
@@ -85,6 +85,7 @@ public:
/* shaders */
device_vector<uint4> svm_nodes;
device_vector<uint> shader_flag;
+ device_vector<uint> object_flag;
/* filter */
device_vector<float> filter_table;