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:
authorSergey Sharybin <sergey.vfx@gmail.com>2016-01-16 13:36:42 +0300
committerSergey Sharybin <sergey.vfx@gmail.com>2016-01-16 13:36:42 +0300
commit36aa7e659e02bf5434af77749f587380a76e7512 (patch)
treea9c12fb7a896284a86ed4f68308d18c59f4e4f03 /intern/cycles/render/mesh_displace.cpp
parentddc75d7e8a04f70daddb497d52c8234e6a0c120c (diff)
Fix T47180: Cycles deform motion blur + displacement behaves weirdly
Displacement shader was not updating motion vertex positions. Current solution is not totally correct because it applies same offset for all time steps. Ideally we'll need to evaluate displacement shader for every time offset separately, but currently we don't have subframe image access. For the time being will consider this a TODO.
Diffstat (limited to 'intern/cycles/render/mesh_displace.cpp')
-rw-r--r--intern/cycles/render/mesh_displace.cpp14
1 files changed, 11 insertions, 3 deletions
diff --git a/intern/cycles/render/mesh_displace.cpp b/intern/cycles/render/mesh_displace.cpp
index 801fffc774c..dccfd74f17a 100644
--- a/intern/cycles/render/mesh_displace.cpp
+++ b/intern/cycles/render/mesh_displace.cpp
@@ -54,9 +54,10 @@ bool MeshManager::displace(Device *device, DeviceScene *dscene, Scene *scene, Me
}
/* setup input for device task */
- vector<bool> done(mesh->verts.size(), false);
+ const size_t num_verts = mesh->verts.size();
+ vector<bool> done(num_verts, false);
device_vector<uint4> d_input;
- uint4 *d_input_data = d_input.resize(mesh->verts.size());
+ uint4 *d_input_data = d_input.resize(num_verts);
size_t d_input_size = 0;
for(size_t i = 0; i < mesh->triangles.size(); i++) {
@@ -137,11 +138,12 @@ bool MeshManager::displace(Device *device, DeviceScene *dscene, Scene *scene, Me
/* read result */
done.clear();
- done.resize(mesh->verts.size(), false);
+ done.resize(num_verts, false);
int k = 0;
float4 *offset = (float4*)d_output.data_pointer;
+ Attribute *attr_mP = mesh->attributes.find(ATTR_STD_MOTION_VERTEX_POSITION);
for(size_t i = 0; i < mesh->triangles.size(); i++) {
Mesh::Triangle t = mesh->triangles[i];
Shader *shader = scene->shaders[mesh->shader[i]];
@@ -154,6 +156,12 @@ bool MeshManager::displace(Device *device, DeviceScene *dscene, Scene *scene, Me
done[t.v[j]] = true;
float3 off = float4_to_float3(offset[k++]);
mesh->verts[t.v[j]] += off;
+ if(attr_mP != NULL) {
+ for(int step = 0; step < mesh->motion_steps - 1; step++) {
+ float3 *mP = attr_mP->data_float3() + step*num_verts;
+ mP[t.v[j]] += off;
+ }
+ }
}
}
}