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 */

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

Reply via email to