diff options
Diffstat (limited to 'intern/cycles/render/mesh_displace.cpp')
-rw-r--r-- | intern/cycles/render/mesh_displace.cpp | 16 |
1 files changed, 12 insertions, 4 deletions
diff --git a/intern/cycles/render/mesh_displace.cpp b/intern/cycles/render/mesh_displace.cpp index 1ba0c7f7291..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++) { @@ -78,7 +79,7 @@ bool MeshManager::displace(Device *device, DeviceScene *dscene, Scene *scene, Me int prim = mesh->tri_offset + i; float u, v; - switch (j) { + switch(j) { case 0: u = 1.0f; v = 0.0f; @@ -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; + } + } } } } |