[Bf-blender-cvs] [7faeed5] temp-cycles-microdisplacement: Split vertex normals on ngons

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


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;
 }




More information about the Bf-blender-cvs mailing list