Commit: 7faeed57c30d8dd4387972bd9b7488f72f30f4f3
Author: Mai Lavelle
Date:   Thu Jun 23 05:47:49 2016 -0400
Branches: temp-cycles-microdisplacement
https://developer.blender.org/rB7faeed57c30d8dd4387972bd9b7488f72f30f4f3

Split vertex normals on ngons

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

M       intern/cycles/blender/blender_mesh.cpp
M       intern/cycles/render/mesh.cpp

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

diff --git a/intern/cycles/blender/blender_mesh.cpp 
b/intern/cycles/blender/blender_mesh.cpp
index 455668a..cc55b62 100644
--- a/intern/cycles/blender/blender_mesh.cpp
+++ b/intern/cycles/blender/blender_mesh.cpp
@@ -717,9 +717,24 @@ static void create_mesh(Scene *scene,
                        vi.reserve(n);
                        for(int i = 0; i < n; i++) {
                                vi[i] = b_mesh.loops[p->loop_start() + 
i].vertex_index();
-                       }
 
-                       /* TODO(mai): split vertices if normal is different */
+                               /* split vertices if normal is different
+                                *
+                                * note all vertex attributes must have been 
set here so we can split
+                                * and copy attributes in split_vertex without 
remapping later */
+                               if(use_loop_normals) {
+                                       float3 loop_N = 
get_float3(b_mesh.loops[p->loop_start() + i].normal());
+
+                                       if(N[vi[i]] != loop_N) {
+                                               int new_vi = 
mesh->split_vertex(vi[i]);
+
+                                               /* set new normal and vertex 
index */
+                                               N = attr_N->data_float3();
+                                               N[new_vi] = loop_N;
+                                               vi[i] = new_vi;
+                                       }
+                               }
+                       }
 
                        /* create subd faces */
                        mesh->add_subd_face(&vi[0], n, shader, smooth);
diff --git a/intern/cycles/render/mesh.cpp b/intern/cycles/render/mesh.cpp
index f8e4993..18e3fac 100644
--- a/intern/cycles/render/mesh.cpp
+++ b/intern/cycles/render/mesh.cpp
@@ -267,6 +267,14 @@ int Mesh::split_vertex(int vertex)
                }
        }
 
+       foreach(Attribute& attr, subd_attributes.attributes) {
+               if(attr.element == ATTR_ELEMENT_VERTEX) {
+                       vector<char> tmp(attr.data_sizeof());
+                       memcpy(&tmp[0], attr.data() + tmp.size()*vertex, 
tmp.size());
+                       attr.add(&tmp[0]);
+               }
+       }
+
        return verts.size() - 1;
 }

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

Reply via email to