Commit: 5d4c8c35d670ddd5ca55035245790cdb5ff299f7
Author: Mai Lavelle
Date:   Mon Jun 20 05:49:51 2016 -0400
Branches: temp-cycles-microdisplacement
https://developer.blender.org/rB5d4c8c35d670ddd5ca55035245790cdb5ff299f7

Split ngons into quads

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

M       intern/cycles/render/mesh.cpp
M       intern/cycles/util/util_math.h

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

diff --git a/intern/cycles/render/mesh.cpp b/intern/cycles/render/mesh.cpp
index c961ecb..2968f7a 100644
--- a/intern/cycles/render/mesh.cpp
+++ b/intern/cycles/render/mesh.cpp
@@ -1642,53 +1642,27 @@ void Mesh::tessellate(DiagSplit *split)
        float3* vN = attr_vN->data_float3();
 
        for(int f = 0; f < num_faces; f++) {
-               if(!subd_faces[f].is_quad()) {
-                       /* triangle */
-                       LinearTrianglePatch patch;
-                       SubdFace p = subd_faces[f];
-                       float3 *hull = patch.hull;
-                       float3 *normals = patch.normals;
-
-                       patch.patch_index = f;
+               SubdFace& face = subd_faces[f];
 
-                       for(int i = 0; i < 3; i++) {
-                               hull[i] = 
verts[subd_face_corners[p.start_corner+i]];
-                       }
-
-                       if(p.smooth) {
-                               for(int i = 0; i < 3; i++) {
-                                       normals[i] = 
vN[subd_face_corners[p.start_corner+i]];
-                               }
-                       }
-                       else {
-                               float3 N = p.normal(this);
-                               for(int i = 0; i < 3; i++) {
-                                       normals[i] = N;
-                               }
-                       }
-
-                       split->split_triangle(&patch);
-               }
-               else {
+               if(face.is_quad()) {
                        /* quad */
                        LinearQuadPatch patch;
-                       SubdFace p = subd_faces[f];
                        float3 *hull = patch.hull;
                        float3 *normals = patch.normals;
 
                        patch.patch_index = f;
 
                        for(int i = 0; i < 4; i++) {
-                               hull[i] = 
verts[subd_face_corners[p.start_corner+i]];
+                               hull[i] = 
verts[subd_face_corners[face.start_corner+i]];
                        }
 
-                       if(p.smooth) {
+                       if(face.smooth) {
                                for(int i = 0; i < 4; i++) {
-                                       normals[i] = 
vN[subd_face_corners[p.start_corner+i]];
+                                       normals[i] = 
vN[subd_face_corners[face.start_corner+i]];
                                }
                        }
                        else {
-                               float3 N = p.normal(this);
+                               float3 N = face.normal(this);
                                for(int i = 0; i < 4; i++) {
                                        normals[i] = N;
                                }
@@ -1699,6 +1673,51 @@ void Mesh::tessellate(DiagSplit *split)
 
                        split->split_quad(&patch);
                }
+               else {
+                       /* ngon */
+                       float3 center_vert = make_float3(0.0f, 0.0f, 0.0f);
+                       float3 center_normal = make_float3(0.0f, 0.0f, 0.0f);
+
+                       float inv_num_corners = 1.0f/float(face.num_corners);
+                       for(int corner = 0; corner < face.num_corners; 
corner++) {
+                               center_vert += 
verts[subd_face_corners[face.start_corner + corner]] * inv_num_corners;
+                               center_normal += 
vN[subd_face_corners[face.start_corner + corner]] * inv_num_corners;
+                       }
+
+                       for(int corner = 0; corner < face.num_corners; 
corner++) {
+                               LinearQuadPatch patch;
+                               float3 *hull = patch.hull;
+                               float3 *normals = patch.normals;
+
+                               patch.patch_index = f;
+
+                               hull[0] = 
verts[subd_face_corners[face.start_corner + mod(corner + 0, face.num_corners)]];
+                               hull[1] = 
verts[subd_face_corners[face.start_corner + mod(corner + 1, face.num_corners)]];
+                               hull[2] = 
verts[subd_face_corners[face.start_corner + mod(corner - 1, face.num_corners)]];
+                               hull[3] = center_vert;
+
+                               hull[1] = (hull[1] + hull[0]) * 0.5;
+                               hull[2] = (hull[2] + hull[0]) * 0.5;
+
+                               if(face.smooth) {
+                                       normals[0] = 
vN[subd_face_corners[face.start_corner + mod(corner + 0, face.num_corners)]];
+                                       normals[1] = 
vN[subd_face_corners[face.start_corner + mod(corner + 1, face.num_corners)]];
+                                       normals[2] = 
vN[subd_face_corners[face.start_corner + mod(corner - 1, face.num_corners)]];
+                                       normals[3] = center_normal;
+
+                                       normals[1] = (normals[1] + normals[0]) 
* 0.5;
+                                       normals[2] = (normals[2] + normals[0]) 
* 0.5;
+                               }
+                               else {
+                                       float3 N = face.normal(this);
+                                       for(int i = 0; i < 4; i++) {
+                                               normals[i] = N;
+                                       }
+                               }
+
+                               split->split_quad(&patch);
+                       }
+               }
        }
 }
 
diff --git a/intern/cycles/util/util_math.h b/intern/cycles/util/util_math.h
index e1de8bb..ad39993 100644
--- a/intern/cycles/util/util_math.h
+++ b/intern/cycles/util/util_math.h
@@ -224,6 +224,10 @@ ccl_device_inline float smoothstepf(float f)
        return (3.0f*ff - 2.0f*ff*f);
 }
 
+ccl_device_inline int mod(int x, int m) {
+       return (x % m + m) % m;
+}
+
 /* Float2 Vector */
 
 #ifndef __KERNEL_OPENCL__

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

Reply via email to