[Bf-blender-cvs] [24ad7e0] master: Cycles code refactor: add support for motion vertex attributes.

Brecht Van Lommel noreply at git.blender.org
Sat Mar 29 15:32:56 CET 2014


Commit: 24ad7e0bea77d942267344990d22e931610c3d07
Author: Brecht Van Lommel
Date:   Sat Mar 29 13:03:46 2014 +0100
https://developer.blender.org/rB24ad7e0bea77d942267344990d22e931610c3d07

Cycles code refactor: add support for motion vertex attributes.

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

M	intern/cycles/kernel/geom/geom_curve.h
M	intern/cycles/kernel/geom/geom_triangle.h
M	intern/cycles/kernel/kernel_types.h
M	intern/cycles/render/attribute.cpp
M	intern/cycles/render/attribute.h
M	intern/cycles/render/mesh.cpp
M	intern/cycles/render/mesh.h

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

diff --git a/intern/cycles/kernel/geom/geom_curve.h b/intern/cycles/kernel/geom/geom_curve.h
index 2daeb59..ec9081a 100644
--- a/intern/cycles/kernel/geom/geom_curve.h
+++ b/intern/cycles/kernel/geom/geom_curve.h
@@ -28,7 +28,7 @@ ccl_device float curve_attribute_float(KernelGlobals *kg, const ShaderData *sd,
 
 		return kernel_tex_fetch(__attributes_float, offset + sd->prim);
 	}
-	else if(elem == ATTR_ELEMENT_CURVE_KEY) {
+	else if(elem == ATTR_ELEMENT_CURVE_KEY || elem == ATTR_ELEMENT_CURVE_KEY_MOTION) {
 		float4 curvedata = kernel_tex_fetch(__curves, sd->prim);
 		int k0 = __float_as_int(curvedata.x) + sd->segment;
 		int k1 = k0 + 1;
@@ -67,7 +67,7 @@ ccl_device float3 curve_attribute_float3(KernelGlobals *kg, const ShaderData *sd
 
 		return float4_to_float3(kernel_tex_fetch(__attributes_float3, offset + sd->prim));
 	}
-	else if(elem == ATTR_ELEMENT_CURVE_KEY) {
+	else if(elem == ATTR_ELEMENT_CURVE_KEY || elem == ATTR_ELEMENT_CURVE_KEY_MOTION) {
 		float4 curvedata = kernel_tex_fetch(__curves, sd->prim);
 		int k0 = __float_as_int(curvedata.x) + sd->segment;
 		int k1 = k0 + 1;
diff --git a/intern/cycles/kernel/geom/geom_triangle.h b/intern/cycles/kernel/geom/geom_triangle.h
index 6eaa077..1bdc764 100644
--- a/intern/cycles/kernel/geom/geom_triangle.h
+++ b/intern/cycles/kernel/geom/geom_triangle.h
@@ -176,7 +176,7 @@ ccl_device float triangle_attribute_float(KernelGlobals *kg, const ShaderData *s
 
 		return kernel_tex_fetch(__attributes_float, offset + sd->prim);
 	}
-	else if(elem == ATTR_ELEMENT_VERTEX) {
+	else if(elem == ATTR_ELEMENT_VERTEX || elem == ATTR_ELEMENT_VERTEX_MOTION) {
 		float3 tri_vindex = float4_to_float3(kernel_tex_fetch(__tri_vindex, sd->prim));
 
 		float f0 = kernel_tex_fetch(__attributes_float, offset + __float_as_int(tri_vindex.x));
@@ -219,7 +219,7 @@ ccl_device float3 triangle_attribute_float3(KernelGlobals *kg, const ShaderData
 
 		return float4_to_float3(kernel_tex_fetch(__attributes_float3, offset + sd->prim));
 	}
-	else if(elem == ATTR_ELEMENT_VERTEX) {
+	else if(elem == ATTR_ELEMENT_VERTEX || elem == ATTR_ELEMENT_VERTEX_MOTION) {
 		float3 tri_vindex = float4_to_float3(kernel_tex_fetch(__tri_vindex, sd->prim));
 
 		float3 f0 = float4_to_float3(kernel_tex_fetch(__attributes_float3, offset + __float_as_int(tri_vindex.x)));
diff --git a/intern/cycles/kernel/kernel_types.h b/intern/cycles/kernel/kernel_types.h
index 67029d9..70fafdf 100644
--- a/intern/cycles/kernel/kernel_types.h
+++ b/intern/cycles/kernel/kernel_types.h
@@ -434,9 +434,11 @@ typedef enum AttributeElement {
 	ATTR_ELEMENT_MESH,
 	ATTR_ELEMENT_FACE,
 	ATTR_ELEMENT_VERTEX,
+	ATTR_ELEMENT_VERTEX_MOTION,
 	ATTR_ELEMENT_CORNER,
 	ATTR_ELEMENT_CURVE,
-	ATTR_ELEMENT_CURVE_KEY
+	ATTR_ELEMENT_CURVE_KEY,
+	ATTR_ELEMENT_CURVE_KEY_MOTION
 } AttributeElement;
 
 typedef enum AttributeStandard {
diff --git a/intern/cycles/render/attribute.cpp b/intern/cycles/render/attribute.cpp
index 61b9cf2..bef3295 100644
--- a/intern/cycles/render/attribute.cpp
+++ b/intern/cycles/render/attribute.cpp
@@ -38,9 +38,14 @@ void Attribute::set(ustring name_, TypeDesc type_, AttributeElement element_)
 		type == TypeDesc::TypeNormal || type == TypeDesc::TypeMatrix);
 }
 
-void Attribute::reserve(int numverts, int numtris, int numcurves, int numkeys)
+void Attribute::reserve(int numverts, int numtris, int numsteps, int numcurves, int numkeys, bool resize)
 {
-	buffer.resize(buffer_size(numverts, numtris, numcurves, numkeys), 0);
+	if (resize) {
+		buffer.resize(buffer_size(numverts, numtris, numsteps, numcurves, numkeys), 0);
+	}
+	else {
+		buffer.reserve(buffer_size(numverts, numtris, numsteps, numcurves, numkeys));
+	}
 }
 
 void Attribute::add(const float& f)
@@ -80,7 +85,7 @@ size_t Attribute::data_sizeof() const
 		return sizeof(float3);
 }
 
-size_t Attribute::element_size(int numverts, int numtris, int numcurves, int numkeys) const
+size_t Attribute::element_size(int numverts, int numtris, int numsteps, int numcurves, int numkeys) const
 {
 	size_t size;
 	
@@ -92,6 +97,9 @@ size_t Attribute::element_size(int numverts, int numtris, int numcurves, int num
 		case ATTR_ELEMENT_VERTEX:
 			size = numverts;
 			break;
+		case ATTR_ELEMENT_VERTEX_MOTION:
+			size = numverts * (numsteps - 1);
+			break;
 		case ATTR_ELEMENT_FACE:
 			size = numtris;
 			break;
@@ -104,6 +112,9 @@ size_t Attribute::element_size(int numverts, int numtris, int numcurves, int num
 		case ATTR_ELEMENT_CURVE_KEY:
 			size = numkeys;
 			break;
+		case ATTR_ELEMENT_CURVE_KEY_MOTION:
+			size = numkeys * (numsteps - 1);
+			break;
 		default:
 			size = 0;
 			break;
@@ -112,9 +123,9 @@ size_t Attribute::element_size(int numverts, int numtris, int numcurves, int num
 	return size;
 }
 
-size_t Attribute::buffer_size(int numverts, int numtris, int numcurves, int numkeys) const
+size_t Attribute::buffer_size(int numverts, int numtris, int numsteps, int numcurves, int numkeys) const
 {
-	return element_size(numverts, numtris, numcurves, numkeys)*data_sizeof();
+	return element_size(numverts, numtris, numsteps, numcurves, numkeys)*data_sizeof();
 }
 
 bool Attribute::same_storage(TypeDesc a, TypeDesc b)
@@ -182,7 +193,7 @@ AttributeSet::~AttributeSet()
 {
 }
 
-Attribute *AttributeSet::add(ustring name, TypeDesc type, AttributeElement element)
+Attribute *AttributeSet::add(ustring name, TypeDesc type, AttributeElement element, bool resize)
 {
 	Attribute *attr = find(name);
 
@@ -202,9 +213,9 @@ Attribute *AttributeSet::add(ustring name, TypeDesc type, AttributeElement eleme
 	
 	/* this is weak .. */
 	if(triangle_mesh)
-		attr->reserve(triangle_mesh->verts.size(), triangle_mesh->triangles.size(), 0, 0);
+		attr->reserve(triangle_mesh->verts.size(), triangle_mesh->triangles.size(), triangle_mesh->motion_steps, 0, 0, resize);
 	if(curve_mesh)
-		attr->reserve(0, 0, curve_mesh->curves.size(), curve_mesh->curve_keys.size());
+		attr->reserve(0, 0, curve_mesh->motion_steps, curve_mesh->curves.size(), curve_mesh->curve_keys.size(), resize);
 	
 	return attr;
 }
@@ -343,9 +354,9 @@ void AttributeSet::reserve()
 {
 	foreach(Attribute& attr, attributes) {
 		if(triangle_mesh)
-			attr.reserve(triangle_mesh->verts.size(), triangle_mesh->triangles.size(), 0, 0);
+			attr.reserve(triangle_mesh->verts.size(), triangle_mesh->triangles.size(), triangle_mesh->motion_steps, 0, 0, true);
 		if(curve_mesh)
-			attr.reserve(0, 0, curve_mesh->curves.size(), curve_mesh->curve_keys.size());
+			attr.reserve(0, 0, 0, curve_mesh->curves.size(), curve_mesh->curve_keys.size(), true);
 	}
 }
 
diff --git a/intern/cycles/render/attribute.h b/intern/cycles/render/attribute.h
index 0b8905a..5160224 100644
--- a/intern/cycles/render/attribute.h
+++ b/intern/cycles/render/attribute.h
@@ -49,19 +49,21 @@ public:
 
 	Attribute() {}
 	void set(ustring name, TypeDesc type, AttributeElement element);
-	void reserve(int numverts, int numfaces, int numcurves, int numkeys);
+	void reserve(int numverts, int numfaces, int numsteps, int numcurves, int numkeys, bool resize);
 
 	size_t data_sizeof() const;
-	size_t element_size(int numverts, int numfaces, int numcurves, int numkeys) const;
-	size_t buffer_size(int numverts, int numfaces, int numcurves, int numkeys) const;
+	size_t element_size(int numverts, int numfaces, int numsteps, int numcurves, int numkeys) const;
+	size_t buffer_size(int numverts, int numfaces, int numsteps, int numcurves, int numkeys) const;
 
 	char *data() { return (buffer.size())? &buffer[0]: NULL; };
 	float3 *data_float3() { return (float3*)data(); }
+	float4 *data_float4() { return (float4*)data(); }
 	float *data_float() { return (float*)data(); }
 	Transform *data_transform() { return (Transform*)data(); }
 
 	const char *data() const { return (buffer.size())? &buffer[0]: NULL; }
 	const float3 *data_float3() const { return (const float3*)data(); }
+	const float4 *data_float4() const { return (const float4*)data(); }
 	const float *data_float() const { return (const float*)data(); }
 	const Transform *data_transform() const { return (const Transform*)data(); }
 
@@ -86,7 +88,7 @@ public:
 	AttributeSet();
 	~AttributeSet();
 
-	Attribute *add(ustring name, TypeDesc type, AttributeElement element);
+	Attribute *add(ustring name, TypeDesc type, AttributeElement element, bool resize = true);
 	Attribute *find(ustring name) const;
 	void remove(ustring name);
 
diff --git a/intern/cycles/render/mesh.cpp b/intern/cycles/render/mesh.cpp
index 93f2488..1c92eb5 100644
--- a/intern/cycles/render/mesh.cpp
+++ b/intern/cycles/render/mesh.cpp
@@ -46,6 +46,8 @@ Mesh::Mesh()
 	displacement_method = DISPLACE_BUMP;
 	bounds = BoundBox::empty;
 
+	motion_steps = 3;
+
 	bvh = NULL;
 
 	tri_offset = 0;
@@ -641,6 +643,7 @@ static void update_attribute_element_offset(Mesh *mesh, vector<float>& attr_floa
 		size_t size = mattr->element_size(
 			mesh->verts.size(),
 			mesh->triangles.size(),
+			mesh->motion_steps,
 			mesh->curves.size(),
 			mesh->curve_keys.size());
 
@@ -663,19 +666,21 @@ static void update_attribute_element_offset(Mesh *mesh, vector<float>& attr_floa
 				attr_float3[offset+k] = (&tfm->x)[k];
 		}
 		else {
-			float3 *data = mattr->data_float3();
+			float4 *data = mattr->data_float4();
 			offset = attr_float3.size();
 
 			attr_float3.resize(attr_float3.size() + size);
 
 			for(size_t k = 0; k < size; k++)
-				attr_float3[offset+k] = float3_to_float4(data[k]);
+				attr_float3[offset+k] = data[k];
 		}
 
 		/* mesh vertex/curve index is global, not per object, so we sneak
 		 * a correction for that in here */
 		if(element == ATTR_ELEMENT_VERTEX)
 			offset -= mesh->vert_offset;
+		else if(element == ATTR_ELEMENT_VERTEX_MOTION)
+			offset -= mesh->vert_offset;
 		else if(element == ATTR_ELEMENT_FACE)
 			offset -= mesh->tri_offset;
 		else if(element == ATTR_ELEMENT_CORNER)
@@ -684,6 +689,8 @@ static void update_attribute_element_offset(Mesh *mesh, vector<float>& attr_floa
 			offset -= mesh->curve_offset;
 		else if(element == ATTR_ELEMENT_CURVE_KEY)
 			offset -= mesh->curvekey_offset;
+		else if(element == ATTR_ELEMENT_CURVE_KEY_MOTION)
+			offset -= mesh->curvekey_offset;
 	}
 	else {
 		/* attribute not found */
@@ -750,8 +757,8 @@ void MeshManager::device_update_attributes(Device *device, Devic

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list