[Bf-blender-cvs] [36aa7e6] master: Fix T47180: Cycles deform motion blur + displacement behaves weirdly

Sergey Sharybin noreply at git.blender.org
Sat Jan 16 11:42:34 CET 2016


Commit: 36aa7e659e02bf5434af77749f587380a76e7512
Author: Sergey Sharybin
Date:   Sat Jan 16 15:36:42 2016 +0500
Branches: master
https://developer.blender.org/rB36aa7e659e02bf5434af77749f587380a76e7512

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.

===================================================================

M	intern/cycles/render/mesh_displace.cpp

===================================================================

diff --git a/intern/cycles/render/mesh_displace.cpp b/intern/cycles/render/mesh_displace.cpp
index 801fffc..dccfd74 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;
+					}
+				}
 			}
 		}
 	}




More information about the Bf-blender-cvs mailing list