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

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to