Fix T39585: cycles motion vector pass problem with curves.

This commit is contained in:
Brecht Van Lommel 2014-05-09 17:02:08 +02:00
parent fe00dbcc23
commit 5f01b3d96e
2 changed files with 34 additions and 28 deletions

@ -79,7 +79,7 @@ void Object::compute_bounds(bool motion_blur)
bounds = mbounds.transformed(&tfm);
}
void Object::apply_transform()
void Object::apply_transform(bool apply_to_motion)
{
if(!mesh || tfm == transform_identity())
return;
@ -95,7 +95,9 @@ void Object::apply_transform()
for(size_t i = 0; i < mesh->verts.size(); i++)
mesh->verts[i] = transform_point(&tfm, mesh->verts[i]);
if(apply_to_motion) {
Attribute *attr = mesh->attributes.find(ATTR_STD_MOTION_VERTEX_POSITION);
if (attr) {
size_t steps_size = mesh->verts.size() * (mesh->motion_steps - 1);
float3 *vert_steps = attr->data_float3();
@ -115,6 +117,7 @@ void Object::apply_transform()
normal_steps[i] = normalize(transform_direction(&ntfm, normal_steps[i]));
}
}
}
/* curves */
if(mesh->curve_keys.size()) {
@ -134,6 +137,7 @@ void Object::apply_transform()
mesh->curve_keys[i].w = radius;
}
if(apply_to_motion) {
Attribute *curve_attr = mesh->curve_attributes.find(ATTR_STD_MOTION_VERTEX_POSITION);
if (curve_attr) {
@ -151,6 +155,7 @@ void Object::apply_transform()
}
}
}
}
/* we keep normals pointing in same direction on negative scale, notify
* mesh about this in it (re)calculates normals */
@ -414,6 +419,7 @@ void ObjectManager::apply_static_transforms(DeviceScene *dscene, Scene *scene, u
#ifdef __OBJECT_MOTION__
Scene::MotionType need_motion = scene->need_motion();
bool motion_blur = need_motion == Scene::MOTION_BLUR;
bool apply_to_motion = need_motion != Scene::MOTION_PASS;
#else
bool motion_blur = false;
#endif
@ -436,7 +442,7 @@ void ObjectManager::apply_static_transforms(DeviceScene *dscene, Scene *scene, u
if(mesh_users[object->mesh] == 1) {
if(!(motion_blur && object->use_motion)) {
if(!object->mesh->transform_applied) {
object->apply_transform();
object->apply_transform(apply_to_motion);
object->mesh->transform_applied = true;
if(progress.get_cancel()) return;

@ -60,7 +60,7 @@ public:
void tag_update(Scene *scene);
void compute_bounds(bool motion_blur);
void apply_transform();
void apply_transform(bool apply_to_motion);
vector<float> motion_times();
};