[Bf-blender-cvs] [6a7f6b1] temp-cycles-microdisplacement: Seperate dice and split for subdivision meshes

Mai Lavelle noreply at git.blender.org
Mon Apr 11 14:54:27 CEST 2016


Commit: 6a7f6b1ca1e6a52fa81af75ea68ad71351bc058d
Author: Mai Lavelle
Date:   Sun Jan 31 22:03:00 2016 -0500
Branches: temp-cycles-microdisplacement
https://developer.blender.org/rB6a7f6b1ca1e6a52fa81af75ea68ad71351bc058d

Seperate dice and split for subdivision meshes

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

M	intern/cycles/blender/blender_curves.cpp
M	intern/cycles/blender/blender_mesh.cpp
M	intern/cycles/render/CMakeLists.txt
M	intern/cycles/render/mesh.cpp
M	intern/cycles/render/mesh.h
A	intern/cycles/render/mesh_subdivision.cpp
M	intern/cycles/subd/subd_dice.cpp
M	intern/cycles/subd/subd_split.cpp

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

diff --git a/intern/cycles/blender/blender_curves.cpp b/intern/cycles/blender/blender_curves.cpp
index 0178bfb..199270f 100644
--- a/intern/cycles/blender/blender_curves.cpp
+++ b/intern/cycles/blender/blender_curves.cpp
@@ -411,7 +411,7 @@ void ExportCurveTrianglePlanes(Mesh *mesh, ParticleCurveData *CData,
 		}
 	}
 
-	mesh->reserve(mesh->verts.size(), mesh->triangles.size(), 0, 0);
+	mesh->reserve(mesh->verts.size(), mesh->triangles.size(), 0, 0, 0);
 	mesh->attributes.remove(ATTR_STD_VERTEX_NORMAL);
 	mesh->attributes.remove(ATTR_STD_FACE_NORMAL);
 	mesh->add_face_normals();
@@ -547,7 +547,7 @@ void ExportCurveTriangleGeometry(Mesh *mesh, ParticleCurveData *CData, int resol
 		}
 	}
 
-	mesh->reserve(mesh->verts.size(), mesh->triangles.size(), 0, 0);
+	mesh->reserve(mesh->verts.size(), mesh->triangles.size(), 0, 0, 0);
 	mesh->attributes.remove(ATTR_STD_VERTEX_NORMAL);
 	mesh->attributes.remove(ATTR_STD_FACE_NORMAL);
 	mesh->add_face_normals();
diff --git a/intern/cycles/blender/blender_mesh.cpp b/intern/cycles/blender/blender_mesh.cpp
index e2477ee..b075bfb 100644
--- a/intern/cycles/blender/blender_mesh.cpp
+++ b/intern/cycles/blender/blender_mesh.cpp
@@ -532,12 +532,13 @@ static void attr_create_pointiness(Scene *scene,
 static void create_mesh(Scene *scene,
                         Mesh *mesh,
                         BL::Mesh& b_mesh,
-                        const vector<uint>& used_shaders)
+                        const vector<uint>& 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 numtris = 0, numpatches = 0;
 	bool use_loop_normals = b_mesh.use_auto_smooth();
 
 	BL::Mesh::vertices_iterator v;
@@ -545,11 +546,14 @@ 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++;
 	}
 
 	/* reserve memory */
-	mesh->reserve(numverts, numtris, 0, 0);
+	mesh->reserve(numverts, numtris, 0, 0, numpatches);
 
 	/* create vertex coordinates and normals */
 	int i = 0;
@@ -613,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->set_triangle(ti++, vi[0], vi[1], vi[3], shader, smooth, true);
-				mesh->set_triangle(ti++, vi[2], vi[3], vi[1], shader, smooth, true);
-				face_flags[fi] |= FACE_FLAG_DIVIDE_24;
-			}
-			else {
-				mesh->set_triangle(ti++, vi[0], vi[1], vi[2], shader, smooth, true);
-				mesh->set_triangle(ti++, 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->set_triangle(ti++, vi[0], vi[1], vi[3], shader, smooth, true);
+					mesh->set_triangle(ti++, vi[2], vi[3], vi[1], shader, smooth, true);
+					face_flags[fi] |= FACE_FLAG_DIVIDE_24;
+				}
+				else {
+					mesh->set_triangle(ti++, vi[0], vi[1], vi[2], shader, smooth, true);
+					mesh->set_triangle(ti++, vi[0], vi[2], vi[3], shader, smooth, true);
+					face_flags[fi] |= FACE_FLAG_DIVIDE_13;
+				}
 			}
+			else
+				mesh->set_triangle(ti++, vi[0], vi[1], vi[2], shader, smooth, false);
+		}
+		else {
+			/* create patches */
+			if(n == 4)
+				mesh->set_patch(ti++, vi[0], vi[1], vi[2], vi[3], shader, smooth);
+			else
+				mesh->set_patch(ti++, vi[0], vi[1], vi[2], -1, shader, smooth);
 		}
-		else
-			mesh->set_triangle(ti++, vi[0], vi[1], vi[2], shader, smooth, false);
 
 		nverts[fi] = n;
 	}
@@ -664,7 +677,7 @@ static void create_subd_mesh(Scene *scene,
                              bool preview)
 {
 	Mesh *basemesh = new Mesh();
-	create_mesh(scene, basemesh, b_mesh, used_shaders);
+	create_mesh(scene, basemesh, b_mesh, used_shaders, true);
 
 	SubdParams sdparams(mesh, used_shaders[0], true, false);
 	sdparams.dicing_rate = preview ? RNA_float_get(cmesh, "preview_dicing_rate") : RNA_float_get(cmesh, "dicing_rate");
@@ -767,6 +780,8 @@ Mesh *BlenderSync::sync_mesh(BL::Object& b_ob,
 	 * adjustments in dynamic BVH - other methods could probably do this better*/
 	vector<float4> oldcurve_keys = mesh->curve_keys;
 
+	vector<Mesh::SubPatch> oldsubpatches = mesh->subpatches;
+
 	mesh->clear();
 	mesh->used_shaders = used_shaders;
 	mesh->name = ustring(b_ob_data.name().c_str());
@@ -843,6 +858,17 @@ Mesh *BlenderSync::sync_mesh(BL::Object& b_ob,
 		if(memcmp(&oldcurve_keys[0], &mesh->curve_keys[0], sizeof(float4)*oldcurve_keys.size()) != 0)
 			rebuild = true;
 	}
+
+	if(oldsubpatches.size() != mesh->subpatches.size())
+		rebuild = true;
+	else if(oldsubpatches.size()) {
+		for(int i = 0; i < oldsubpatches.size(); i++) {
+			if(oldsubpatches[i] != mesh->subpatches[i]) {
+				rebuild = true;
+				break;
+			}
+		}
+	}
 	
 	mesh->tag_update(scene, rebuild);
 
diff --git a/intern/cycles/render/CMakeLists.txt b/intern/cycles/render/CMakeLists.txt
index 17ca6ce..ab0e571 100644
--- a/intern/cycles/render/CMakeLists.txt
+++ b/intern/cycles/render/CMakeLists.txt
@@ -27,6 +27,7 @@ set(SRC
 	light.cpp
 	mesh.cpp
 	mesh_displace.cpp
+	mesh_subdivision.cpp
 	nodes.cpp
 	object.cpp
 	osl.cpp
diff --git a/intern/cycles/render/mesh.cpp b/intern/cycles/render/mesh.cpp
index 681ab68..aa862d1 100644
--- a/intern/cycles/render/mesh.cpp
+++ b/intern/cycles/render/mesh.cpp
@@ -35,9 +35,6 @@
 #include "util_progress.h"
 #include "util_set.h"
 
-#include "../subd/subd_split.h"
-#include "../subd/subd_patch.h"
-
 CCL_NAMESPACE_BEGIN
 
 /* Triangle */
@@ -110,7 +107,7 @@ Mesh::~Mesh()
 	delete bvh;
 }
 
-void Mesh::reserve(int numverts, int numtris, int numcurves, int numcurvekeys)
+void Mesh::reserve(int numverts, int numtris, int numcurves, int numcurvekeys, int numpatches)
 {
 	/* reserve space to add verts and triangles later */
 	verts.resize(numverts);
@@ -123,6 +120,8 @@ void Mesh::reserve(int numverts, int numtris, int numcurves, int numcurvekeys)
 	curve_keys.resize(numcurvekeys);
 	curves.resize(numcurves);
 
+	patches.resize(numpatches);
+
 	attributes.reserve();
 	curve_attributes.reserve();
 }
@@ -140,6 +139,8 @@ void Mesh::clear()
 	curve_keys.clear();
 	curves.clear();
 
+	patches.clear();
+
 	attributes.clear();
 	curve_attributes.clear();
 	used_shaders.clear();
@@ -210,6 +211,19 @@ void Mesh::add_curve(int first_key, int num_keys, int shader)
 	curves.push_back(curve);
 }
 
+void Mesh::set_patch(int i, int v0, int v1, int v2, int v3, int shader, bool smooth)
+{
+	Patch patch;
+	patch.v[0] = v0;
+	patch.v[1] = v1;
+	patch.v[2] = v2;
+	patch.v[3] = v3;
+	patch.shader = shader;
+	patch.smooth = smooth;
+
+	patches[i] = patch;
+}
+
 void Mesh::compute_bounds()
 {
 	BoundBox bnds = BoundBox::empty;
@@ -1449,75 +1463,5 @@ bool Mesh::need_attribute(Scene *scene, ustring name)
 	return false;
 }
 
-void Mesh::tessellate(DiagSplit *split)
-{
-	int num_faces = triangles.size();
-
-	add_face_normals();
-
-	Attribute *attr_vF = attributes.find(ATTR_STD_FACE_NORMAL);
-	float3 *vF = attr_vF->data_float3();
-
-	Attribute *attr_vN = attributes.find(ATTR_STD_VERTEX_NORMAL);
-	float3 *vN = attr_vN->data_float3();
-
-	for(int f = 0; f < num_faces; f++) {
-		if(!forms_quad[f]) {
-			/* triangle */
-			LinearTrianglePatch* patch = new LinearTrianglePatch();
-			float3 *hull = patch->hull;
-			float3 *normals = patch->normals;
-
-			for(int i = 0; i < 3; i++) {
-				hull[i] = verts[triangles[f].v[i]];
-			}
-
-			if(smooth[f]) {
-				for(int i = 0; i < 3; i++) {
-					normals[i] = vN[triangles[f].v[i]];
-				}
-			}
-			else {
-				for(int i = 0; i < 3; i++) {
-					normals[i] = vF[f];
-				}
-			}
-
-			split->split_triangle(patch);
-			delete patch;
-		}
-		else {
-			/* quad */
-			LinearQuadPatch* patch = new LinearQuadPatch();
-			float3 *hull = patch->hull;
-			float3 *normals = patch->normals;
-
-			hull[0] = verts[triangles[f  ].v[0]];
-			hull[1] = verts[triangles[f  ].v[1]];
-			hull[3] = verts[triangles[f  ].v[2]];
-			hull[2] = verts[triangles[f+1].v[2]];
-
-			if(smooth[f]) {
-				normals[0] = vN[triangles[f  ].v[0]];
-				normals[1] = vN[triangles[f  ].v[1]];
-				normals[3] = vN[triangles[f  ].v[2]];
-				normals[2] = vN[triangles[f+1].v[2]];
-			}
-			else {
-				for(int i = 0; i < 4; i++) {
-					normals[i] = vF[f];
-				}
-			}
-
-			split->split_quad(patch);
-			delete patch;
-
-			// consume second triangle in quad
-			f++;
-		}
-
-	}
-}
-
 CCL_NAMESPACE_END
 
diff --git a/intern/cycles/render/mesh.h b/intern/cycles/render/mesh.h
index 29a613d..188fedd 100644
--- a/intern/cycles/render/mesh.h
+++ b/intern/cycles/render/mesh.h
@@ -63,6 +63,37 @@ public:
 		void bounds_grow(const int k, const float4 *curve_keys, BoundBox& bounds) const;
 	};
 
+	/* Mesh Patch */
+	struct Patch {
+		int v[4]; /* v[3] is -1 if triangle patch */
+		uint shader;
+		bool smooth;
+
+		bool is_quad() { return v[3] != -1; }
+	};
+
+	struct SubPatch {
+		int patch;
+		int edge_factors[4];
+		float2 uv[4];
+
+		bool is_quad() const { return edge_factors[3] != -1; }
+
+		bool operator == (const SubPatch& other) const
+		{
+			if(patch != other.patch)
+				return false;
+
+			for(int i = 0; i < 4; i++) {
+				if((edge_factors[i] != other.edge_factors[i]) || (uv[i] != other.uv[i]))
+					return false;
+			}
+
+			return true;
+		}
+		bool operator != (const SubPatch& other) const { return !(*this == other); }
+	};
+
 	/* Displacement */
 	enum DisplacementMethod {
 		DISPLACE_BUMP = 0,
@@ -95,6 +126,9 @@ public:
 	vector<float4> curve_keys; /* co + radius */
 	vector<Curve> curves;
 
+	vector<Patch> patches;
+	vector<SubPatch> subpatches;
+
 	vec

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list