[Bf-blender-cvs] [683c195] temp-cycles-microdisplacement: Ensure split quads line up with split ngons

Mai Lavelle noreply at git.blender.org
Fri Jun 24 19:26:54 CEST 2016


Commit: 683c195feff80dd2497cbaa94a39e165dd8923a0
Author: Mai Lavelle
Date:   Fri Jun 24 12:39:11 2016 -0400
Branches: temp-cycles-microdisplacement
https://developer.blender.org/rB683c195feff80dd2497cbaa94a39e165dd8923a0

Ensure split quads line up with split ngons

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

M	intern/cycles/render/mesh.cpp
M	intern/cycles/subd/subd_split.cpp
M	intern/cycles/subd/subd_split.h

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

diff --git a/intern/cycles/render/mesh.cpp b/intern/cycles/render/mesh.cpp
index 18e3fac..699b466 100644
--- a/intern/cycles/render/mesh.cpp
+++ b/intern/cycles/render/mesh.cpp
@@ -1737,7 +1737,35 @@ void Mesh::tessellate(DiagSplit *split)
 			swap(hull[2], hull[3]);
 			swap(normals[2], normals[3]);
 
-			split->split_quad(&patch);
+			/* Quad faces need to be split at least once to line up with split ngons, we do this
+			 * here in this manner because if we do it later edge factors may end up slightly off.
+			 */
+			QuadDice::SubPatch subpatch;
+			subpatch.patch = &patch;
+
+			subpatch.P00 = make_float2(0.0f, 0.0f);
+			subpatch.P10 = make_float2(0.5f, 0.0f);
+			subpatch.P01 = make_float2(0.0f, 0.5f);
+			subpatch.P11 = make_float2(0.5f, 0.5f);
+			split->split_quad(&patch, &subpatch);
+
+			subpatch.P00 = make_float2(0.5f, 0.0f);
+			subpatch.P10 = make_float2(1.0f, 0.0f);
+			subpatch.P01 = make_float2(0.5f, 0.5f);
+			subpatch.P11 = make_float2(1.0f, 0.5f);
+			split->split_quad(&patch, &subpatch);
+
+			subpatch.P00 = make_float2(0.0f, 0.5f);
+			subpatch.P10 = make_float2(0.5f, 0.5f);
+			subpatch.P01 = make_float2(0.0f, 1.0f);
+			subpatch.P11 = make_float2(0.5f, 1.0f);
+			split->split_quad(&patch, &subpatch);
+
+			subpatch.P00 = make_float2(0.5f, 0.5f);
+			subpatch.P10 = make_float2(1.0f, 0.5f);
+			subpatch.P01 = make_float2(0.5f, 1.0f);
+			subpatch.P11 = make_float2(1.0f, 1.0f);
+			split->split_quad(&patch, &subpatch);
 		}
 		else {
 			/* ngon */
diff --git a/intern/cycles/subd/subd_split.cpp b/intern/cycles/subd/subd_split.cpp
index 401216b..844708f 100644
--- a/intern/cycles/subd/subd_split.cpp
+++ b/intern/cycles/subd/subd_split.cpp
@@ -211,16 +211,21 @@ void DiagSplit::split(QuadDice::SubPatch& sub, QuadDice::EdgeFactors& ef, int de
 	}
 }
 
-void DiagSplit::split_quad(Patch *patch)
+void DiagSplit::split_quad(Patch *patch, QuadDice::SubPatch *subpatch)
 {
 	QuadDice::SubPatch sub_split;
 	QuadDice::EdgeFactors ef_split;
 
-	sub_split.patch = patch;
-	sub_split.P00 = make_float2(0.0f, 0.0f);
-	sub_split.P10 = make_float2(1.0f, 0.0f);
-	sub_split.P01 = make_float2(0.0f, 1.0f);
-	sub_split.P11 = make_float2(1.0f, 1.0f);
+	if(subpatch) {
+		sub_split = *subpatch;
+	}
+	else {
+		sub_split.patch = patch;
+		sub_split.P00 = make_float2(0.0f, 0.0f);
+		sub_split.P10 = make_float2(1.0f, 0.0f);
+		sub_split.P01 = make_float2(0.0f, 1.0f);
+		sub_split.P11 = make_float2(1.0f, 1.0f);
+	}
 
 	ef_split.tu0 = T(patch, sub_split.P00, sub_split.P10);
 	ef_split.tu1 = T(patch, sub_split.P01, sub_split.P11);
diff --git a/intern/cycles/subd/subd_split.h b/intern/cycles/subd/subd_split.h
index 5440acc..a2f76dd 100644
--- a/intern/cycles/subd/subd_split.h
+++ b/intern/cycles/subd/subd_split.h
@@ -51,7 +51,7 @@ public:
 	void dispatch(QuadDice::SubPatch& sub, QuadDice::EdgeFactors& ef);
 	void split(QuadDice::SubPatch& sub, QuadDice::EdgeFactors& ef, int depth=0);
 
-	void split_quad(Patch *patch);
+	void split_quad(Patch *patch, QuadDice::SubPatch *subpatch=NULL);
 };
 
 CCL_NAMESPACE_END




More information about the Bf-blender-cvs mailing list