[Bf-blender-cvs] [6bbcb66] temp-cycles-microdisplacement: Sync patches from Blender to Cycles

Mai Lavelle noreply at git.blender.org
Thu Jun 9 12:11:29 CEST 2016


Commit: 6bbcb661e8e6c672c353aa9d27193753bf10c5fe
Author: Mai Lavelle
Date:   Tue Jun 7 23:41:05 2016 -0400
Branches: temp-cycles-microdisplacement
https://developer.blender.org/rB6bbcb661e8e6c672c353aa9d27193753bf10c5fe

Sync patches from Blender to Cycles

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

M	intern/cycles/blender/blender_mesh.cpp
M	intern/cycles/render/mesh.cpp
M	intern/cycles/render/mesh.h

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

diff --git a/intern/cycles/blender/blender_mesh.cpp b/intern/cycles/blender/blender_mesh.cpp
index 80db511..f6764a8 100644
--- a/intern/cycles/blender/blender_mesh.cpp
+++ b/intern/cycles/blender/blender_mesh.cpp
@@ -532,12 +532,14 @@ static void attr_create_pointiness(Scene *scene,
 static void create_mesh(Scene *scene,
                         Mesh *mesh,
                         BL::Mesh& b_mesh,
-                        const vector<Shader*>& used_shaders)
+                        const vector<Shader*>& used_shaders,
+                        bool subdivision=false)
 {
 	/* count vertices and faces */
 	int numverts = b_mesh.vertices.length();
 	int numfaces = b_mesh.tessfaces.length();
 	int numtris = 0;
+	int numpatches = 0;
 	bool use_loop_normals = b_mesh.use_auto_smooth();
 
 	BL::Mesh::vertices_iterator v;
@@ -545,11 +547,15 @@ static void create_mesh(Scene *scene,
 
 	for(b_mesh.tessfaces.begin(f); f != b_mesh.tessfaces.end(); ++f) {
 		int4 vi = get_int4(f->vertices_raw());
-		numtris += (vi[3] == 0)? 1: 2;
+		if(!subdivision)
+			numtris += (vi[3] == 0)? 1: 2;
+		else
+			numpatches++;
 	}
 
 	/* allocate memory */
 	mesh->reserve_mesh(numverts, numtris);
+	mesh->reserve_patches(numpatches);
 
 	/* create vertex coordinates and normals */
 	for(b_mesh.vertices.begin(v); v != b_mesh.vertices.end(); ++v)
@@ -611,24 +617,33 @@ static void create_mesh(Scene *scene,
 			}
 		}
 
-		/* create triangles */
-		if(n == 4) {
-			if(is_zero(cross(mesh->verts[vi[1]] - mesh->verts[vi[0]], mesh->verts[vi[2]] - mesh->verts[vi[0]])) ||
-			   is_zero(cross(mesh->verts[vi[2]] - mesh->verts[vi[0]], mesh->verts[vi[3]] - mesh->verts[vi[0]])))
-			{
-				// TODO(mai): order here is probably wrong
-				mesh->add_triangle(vi[0], vi[1], vi[3], shader, smooth, true);
-				mesh->add_triangle(vi[2], vi[3], vi[1], shader, smooth, true);
-				face_flags[fi] |= FACE_FLAG_DIVIDE_24;
-			}
-			else {
-				mesh->add_triangle(vi[0], vi[1], vi[2], shader, smooth, true);
-				mesh->add_triangle(vi[0], vi[2], vi[3], shader, smooth, true);
-				face_flags[fi] |= FACE_FLAG_DIVIDE_13;
+		if(!subdivision) {
+			/* create triangles */
+			if(n == 4) {
+				if(is_zero(cross(mesh->verts[vi[1]] - mesh->verts[vi[0]], mesh->verts[vi[2]] - mesh->verts[vi[0]])) ||
+				   is_zero(cross(mesh->verts[vi[2]] - mesh->verts[vi[0]], mesh->verts[vi[3]] - mesh->verts[vi[0]])))
+				{
+					// TODO(mai): order here is probably wrong
+					mesh->add_triangle(vi[0], vi[1], vi[3], shader, smooth, true);
+					mesh->add_triangle(vi[2], vi[3], vi[1], shader, smooth, true);
+					face_flags[fi] |= FACE_FLAG_DIVIDE_24;
+				}
+				else {
+					mesh->add_triangle(vi[0], vi[1], vi[2], shader, smooth, true);
+					mesh->add_triangle(vi[0], vi[2], vi[3], shader, smooth, true);
+					face_flags[fi] |= FACE_FLAG_DIVIDE_13;
+				}
 			}
+			else
+				mesh->add_triangle(vi[0], vi[1], vi[2], shader, smooth, false);
+		}
+		else {
+			/* create patches */
+			if(n == 4)
+				mesh->add_patch(vi[0], vi[1], vi[2], vi[3], shader, smooth);
+			else
+				mesh->add_patch(vi[0], vi[1], vi[2], shader, smooth);
 		}
-		else
-			mesh->add_triangle(vi[0], vi[1], vi[2], shader, smooth, false);
 
 		nverts[fi] = n;
 	}
@@ -662,8 +677,7 @@ static void create_subd_mesh(Scene *scene,
                              float dicing_rate,
                              int max_subdivisions)
 {
-	Mesh basemesh;
-	create_mesh(scene, &basemesh, b_mesh, used_shaders);
+	create_mesh(scene, mesh, b_mesh, used_shaders, true);
 
 	SubdParams sdparams(mesh, 0, true, false);
 	sdparams.dicing_rate = max(0.1f, RNA_float_get(cmesh, "dicing_rate") * dicing_rate);
@@ -675,7 +689,7 @@ static void create_subd_mesh(Scene *scene,
 
 	/* tesselate */
 	DiagSplit dsplit(sdparams);
-	basemesh.tessellate(&dsplit);
+	mesh->tessellate(&dsplit);
 }
 
 /* Sync */
@@ -788,7 +802,7 @@ Mesh *BlenderSync::sync_mesh(BL::Object& b_ob,
 					create_subd_mesh(scene, mesh, b_ob, b_mesh, &cmesh, used_shaders,
 					                 dicing_rate, max_subdivisions);
 				else
-					create_mesh(scene, mesh, b_mesh, used_shaders);
+					create_mesh(scene, mesh, b_mesh, used_shaders, false);
 
 				create_mesh_volume_attributes(scene, b_ob, mesh, b_scene.frame_current());
 			}
diff --git a/intern/cycles/render/mesh.cpp b/intern/cycles/render/mesh.cpp
index 1fc1599..4c33545 100644
--- a/intern/cycles/render/mesh.cpp
+++ b/intern/cycles/render/mesh.cpp
@@ -73,6 +73,17 @@ void Mesh::Curve::bounds_grow(const int k, const float3 *curve_keys, const float
 	bounds.grow(upper, mr);
 }
 
+/* Patch */
+
+float3 Mesh::Patch::normal(const float3 *verts) const
+{
+	float3 v0 = verts[v[0]];
+	float3 v1 = verts[v[1]];
+	float3 v2 = verts[v[2]];
+
+	return safe_normalize(cross(v1 - v0, v2 - v0));
+}
+
 /* Mesh */
 
 NODE_DEFINE(Mesh)
@@ -1507,37 +1518,34 @@ bool Mesh::need_attribute(Scene * /*scene*/, ustring name)
 
 void Mesh::tessellate(DiagSplit *split)
 {
-	int num_faces = num_triangles();
-
-	add_face_normals();
-	add_vertex_normals();
-
-	Attribute *attr_fN = attributes.find(ATTR_STD_FACE_NORMAL);
-	float3 *fN = attr_fN->data_float3();
+	int num_faces = patches.size();
 
+	/* make a copy of the vertex normals as subd code will write into them */
+	std::vector<float3> vN(verts.size());
 	Attribute *attr_vN = attributes.find(ATTR_STD_VERTEX_NORMAL);
-	float3 *vN = attr_vN->data_float3();
+	memcpy(&vN[0], attr_vN->data_float3(), sizeof(float3)*vN.size());
 
 	for(int f = 0; f < num_faces; f++) {
-		if(!forms_quad[f]) {
+		if(!patches[f].is_quad()) {
 			/* triangle */
 			LinearTrianglePatch patch;
-			Triangle triangle = get_triangle(f);
+			Patch p = patches[f];
 			float3 *hull = patch.hull;
 			float3 *normals = patch.normals;
 
 			for(int i = 0; i < 3; i++) {
-				hull[i] = verts[triangle.v[i]];
+				hull[i] = verts[p.v[i]];
 			}
 
-			if(smooth[f]) {
+			if(p.smooth) {
 				for(int i = 0; i < 3; i++) {
-					normals[i] = vN[triangle.v[i]];
+					normals[i] = vN[p.v[i]];
 				}
 			}
 			else {
+				float3 N = p.normal(&verts[0]);
 				for(int i = 0; i < 3; i++) {
-					normals[i] = fN[f];
+					normals[i] = N;
 				}
 			}
 
@@ -1546,34 +1554,31 @@ void Mesh::tessellate(DiagSplit *split)
 		else {
 			/* quad */
 			LinearQuadPatch patch;
-			Triangle triangle0 = get_triangle(f);
-			Triangle triangle1 = get_triangle(f+1);
+			Patch p = patches[f];
 			float3 *hull = patch.hull;
 			float3 *normals = patch.normals;
 
-			hull[0] = verts[triangle0.v[0]];
-			hull[1] = verts[triangle0.v[1]];
-			hull[3] = verts[triangle0.v[2]];
-			hull[2] = verts[triangle1.v[2]];
+			for(int i = 0; i < 4; i++) {
+				hull[i] = verts[p.v[i]];
+			}
 
-			if(smooth[f]) {
-				normals[0] = vN[triangle0.v[0]];
-				normals[1] = vN[triangle0.v[1]];
-				normals[3] = vN[triangle0.v[2]];
-				normals[2] = vN[triangle1.v[2]];
+			if(p.smooth) {
+				for(int i = 0; i < 4; i++) {
+					normals[i] = vN[p.v[i]];
+				}
 			}
 			else {
+				float3 N = p.normal(&verts[0]);
 				for(int i = 0; i < 4; i++) {
-					normals[i] = fN[f];
+					normals[i] = N;
 				}
 			}
 
-			split->split_quad(&patch);
+			swap(hull[2], hull[3]);
+			swap(normals[2], normals[3]);
 
-			// consume second triangle in quad
-			f++;
+			split->split_quad(&patch);
 		}
-
 	}
 }
 
diff --git a/intern/cycles/render/mesh.h b/intern/cycles/render/mesh.h
index a1ad3c3..b8ea02c 100644
--- a/intern/cycles/render/mesh.h
+++ b/intern/cycles/render/mesh.h
@@ -96,6 +96,7 @@ public:
 		bool smooth;
 
 		bool is_quad() { return v[3] >= 0; }
+		float3 normal(const float3 *verts) const;
 	};
 
 	/* Displacement */




More information about the Bf-blender-cvs mailing list