[Bf-blender-cvs] [51da664fa18] blender2.8: Fix broken merge in fb45821, was missing changes from cc64872.

Brecht Van Lommel noreply at git.blender.org
Mon Jan 22 14:44:02 CET 2018


Commit: 51da664fa1848b086b3a942c37dddd8cce0b0d89
Author: Brecht Van Lommel
Date:   Mon Jan 22 14:28:43 2018 +0100
Branches: blender2.8
https://developer.blender.org/rB51da664fa1848b086b3a942c37dddd8cce0b0d89

Fix broken merge in fb45821, was missing changes from cc64872.

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

M	intern/cycles/blender/blender_mesh.cpp

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

diff --git a/intern/cycles/blender/blender_mesh.cpp b/intern/cycles/blender/blender_mesh.cpp
index 2c0548adbed..51f41e58b3b 100644
--- a/intern/cycles/blender/blender_mesh.cpp
+++ b/intern/cycles/blender/blender_mesh.cpp
@@ -79,7 +79,7 @@ inline void face_split_tri_indices(const int face_flag,
 
 struct MikkUserData {
 	MikkUserData(const BL::Mesh& b_mesh,
-	             BL::MeshTextureFaceLayer *layer,
+	             const char *layer_name,
 	             const Mesh *mesh,
 	             float3 *tangent,
 	             float *tangent_sign)
@@ -89,16 +89,19 @@ struct MikkUserData {
 	          tangent(tangent),
 	          tangent_sign(tangent_sign)
 	{
-		Attribute *attr_vN = mesh->attributes.find(ATTR_STD_VERTEX_NORMAL);
+		const AttributeSet& attributes = (mesh->subd_faces.size()) ?
+			mesh->subd_attributes : mesh->attributes;
+
+		Attribute *attr_vN = attributes.find(ATTR_STD_VERTEX_NORMAL);
 		vertex_normal = attr_vN->data_float3();
 
-		if(layer == NULL) {
-			Attribute *attr_orco = mesh->attributes.find(ATTR_STD_GENERATED);
+		if(layer_name == NULL) {
+			Attribute *attr_orco = attributes.find(ATTR_STD_GENERATED);
 			orco = attr_orco->data_float3();
 			mesh_texture_space(*(BL::Mesh*)&b_mesh, orco_loc, orco_size);
 		}
 		else {
-			Attribute *attr_uv = mesh->attributes.find(ustring(layer->name()));
+			Attribute *attr_uv = attributes.find(ustring(layer_name));
 			if(attr_uv != NULL) {
 				texface = attr_uv->data_float3();
 			}
@@ -120,13 +123,47 @@ struct MikkUserData {
 static int mikk_get_num_faces(const SMikkTSpaceContext *context)
 {
 	const MikkUserData *userdata = (const MikkUserData *)context->m_pUserData;
-	return userdata->mesh->num_triangles();
+	if(userdata->mesh->subd_faces.size()) {
+		return userdata->mesh->subd_faces.size();
+	}
+	else {
+		return userdata->mesh->num_triangles();
+	}
 }
 
-static int mikk_get_num_verts_of_face(const SMikkTSpaceContext * /*context*/,
-                                      const int /*face_num*/)
+static int mikk_get_num_verts_of_face(const SMikkTSpaceContext *context,
+                                      const int face_num)
 {
-	return 3;
+	const MikkUserData *userdata = (const MikkUserData *)context->m_pUserData;
+	if(userdata->mesh->subd_faces.size()) {
+		const Mesh *mesh = userdata->mesh;
+		return mesh->subd_faces[face_num].num_corners;
+	}
+	else {
+		return 3;
+	}
+}
+
+static int mikk_vertex_index(const Mesh *mesh, const int face_num, const int vert_num)
+{
+	if(mesh->subd_faces.size()) {
+		const Mesh::SubdFace& face = mesh->subd_faces[face_num];
+		return mesh->subd_face_corners[face.start_corner + vert_num];
+	}
+	else {
+		return mesh->triangles[face_num * 3 + vert_num];
+	}
+}
+
+static int mikk_corner_index(const Mesh *mesh, const int face_num, const int vert_num)
+{
+	if(mesh->subd_faces.size()) {
+		const Mesh::SubdFace& face = mesh->subd_faces[face_num];
+		return face.start_corner + vert_num;
+	}
+	else {
+		return face_num * 3 + vert_num;
+	}
 }
 
 static void mikk_get_position(const SMikkTSpaceContext *context,
@@ -135,9 +172,8 @@ static void mikk_get_position(const SMikkTSpaceContext *context,
 {
 	const MikkUserData *userdata = (const MikkUserData *)context->m_pUserData;
 	const Mesh *mesh = userdata->mesh;
-	const int vert_index = mesh->triangles[face_num * 3 + vert_num];
-	const float3 vP = mesh->verts[vert_index];
-
+	const int vertex_index = mikk_vertex_index(mesh, face_num, vert_num);
+	const float3 vP = mesh->verts[vertex_index];
 	P[0] = vP.x;
 	P[1] = vP.y;
 	P[2] = vP.z;
@@ -148,15 +184,15 @@ static void mikk_get_texture_coordinate(const SMikkTSpaceContext *context,
                                         const int face_num, const int vert_num)
 {
 	const MikkUserData *userdata = (const MikkUserData *)context->m_pUserData;
+	const Mesh *mesh = userdata->mesh;
 	if(userdata->texface != NULL) {
-		const size_t corner_index = face_num * 3 + vert_num;
+		const int corner_index = mikk_corner_index(mesh, face_num, vert_num);
 		float3 tfuv = userdata->texface[corner_index];
 		uv[0] = tfuv.x;
 		uv[1] = tfuv.y;
 	}
 	else if(userdata->orco != NULL) {
-		const Mesh *mesh = userdata->mesh;
-		const size_t vertex_index = mesh->triangles[face_num * 3 + vert_num];
+		const int vertex_index = mikk_vertex_index(mesh, face_num, vert_num);
 		const float3 orco_loc = userdata->orco_loc;
 		const float3 orco_size = userdata->orco_size;
 		const float3 orco = (userdata->orco[vertex_index] + orco_loc) / orco_size;
@@ -177,13 +213,25 @@ static void mikk_get_normal(const SMikkTSpaceContext *context, float N[3],
 	const MikkUserData *userdata = (const MikkUserData *)context->m_pUserData;
 	const Mesh *mesh = userdata->mesh;
 	float3 vN;
-	if(mesh->smooth[face_num]) {
-		const size_t vert_index = mesh->triangles[face_num * 3 + vert_num];
-		vN = userdata->vertex_normal[vert_index];
+	if(mesh->subd_faces.size()) {
+		const Mesh::SubdFace& face = mesh->subd_faces[face_num];
+		if(face.smooth) {
+			const int vertex_index = mikk_vertex_index(mesh, face_num, vert_num);
+			vN = userdata->vertex_normal[vertex_index];
+		}
+		else {
+			vN = face.normal(mesh);
+		}
 	}
 	else {
-		const Mesh::Triangle tri = mesh->get_triangle(face_num);
-		vN = tri.compute_normal(&mesh->verts[0]);
+		if(mesh->smooth[face_num]) {
+			const int vertex_index = mikk_vertex_index(mesh, face_num, vert_num);
+			vN = userdata->vertex_normal[vertex_index];
+		}
+		else {
+			const Mesh::Triangle tri = mesh->get_triangle(face_num);
+			vN = tri.compute_normal(&mesh->verts[0]);
+		}
 	}
 	N[0] = vN.x;
 	N[1] = vN.y;
@@ -196,7 +244,8 @@ static void mikk_set_tangent_space(const SMikkTSpaceContext *context,
                                    const int face_num, const int vert_num)
 {
 	MikkUserData *userdata = (MikkUserData *)context->m_pUserData;
-	const size_t corner_index = face_num * 3 + vert_num;
+	const Mesh *mesh = userdata->mesh;
+	const int corner_index = mikk_corner_index(mesh, face_num, vert_num);
 	userdata->tangent[corner_index] = make_float3(T[0], T[1], T[2]);
 	if(userdata->tangent_sign != NULL) {
 		userdata->tangent_sign[corner_index] = sign;
@@ -204,27 +253,27 @@ static void mikk_set_tangent_space(const SMikkTSpaceContext *context,
 }
 
 static void mikk_compute_tangents(const BL::Mesh& b_mesh,
-                                  BL::MeshTextureFaceLayer *b_layer,
+                                  const char *layer_name,
                                   Mesh *mesh,
                                   bool need_sign,
                                   bool active_render)
 {
 	/* Create tangent attributes. */
+	AttributeSet& attributes = (mesh->subd_faces.size()) ?
+		mesh->subd_attributes : mesh->attributes;
 	Attribute *attr;
 	ustring name;
-	if(b_layer != NULL) {
-		name = ustring((string(b_layer->name().c_str()) + ".tangent").c_str());
+	if(layer_name != NULL) {
+		name = ustring((string(layer_name) + ".tangent").c_str());
 	}
 	else {
 		name = ustring("orco.tangent");
 	}
 	if(active_render) {
-		attr = mesh->attributes.add(ATTR_STD_UV_TANGENT, name);
+		attr = attributes.add(ATTR_STD_UV_TANGENT, name);
 	}
 	else {
-		attr = mesh->attributes.add(name,
-		                            TypeDesc::TypeVector,
-		                            ATTR_ELEMENT_CORNER);
+		attr = attributes.add(name, TypeDesc::TypeVector, ATTR_ELEMENT_CORNER);
 	}
 	float3 *tangent = attr->data_float3();
 	/* Create bitangent sign attribute. */
@@ -232,8 +281,8 @@ static void mikk_compute_tangents(const BL::Mesh& b_mesh,
 	if(need_sign) {
 		Attribute *attr_sign;
 		ustring name_sign;
-		if(b_layer != NULL) {
-			name_sign = ustring((string(b_layer->name().c_str()) +
+		if(layer_name != NULL) {
+			name_sign = ustring((string(layer_name) +
 			                           ".tangent_sign").c_str());
 		}
 		else {
@@ -241,18 +290,17 @@ static void mikk_compute_tangents(const BL::Mesh& b_mesh,
 		}
 
 		if(active_render) {
-			attr_sign = mesh->attributes.add(ATTR_STD_UV_TANGENT_SIGN,
-			                                 name_sign);
+			attr_sign = attributes.add(ATTR_STD_UV_TANGENT_SIGN, name_sign);
 		}
 		else {
-			attr_sign = mesh->attributes.add(name_sign,
-			                                 TypeDesc::TypeFloat,
-			                                 ATTR_ELEMENT_CORNER);
+			attr_sign = attributes.add(name_sign,
+			                           TypeDesc::TypeFloat,
+			                           ATTR_ELEMENT_CORNER);
 		}
 		tangent_sign = attr_sign->data_float();
 	}
 	/* Setup userdata. */
-	MikkUserData userdata(b_mesh, b_layer, mesh, tangent, tangent_sign);
+	MikkUserData userdata(b_mesh, layer_name, mesh, tangent, tangent_sign);
 	/* Setup interface. */
 	SMikkTSpaceInterface sm_interface;
 	memset(&sm_interface, 0, sizeof(sm_interface));
@@ -399,45 +447,9 @@ static void attr_create_uv_map(Scene *scene,
                                Mesh *mesh,
                                BL::Mesh& b_mesh,
                                const vector<int>& nverts,
-                               const vector<int>& face_flags,
-                               bool subdivision,
-                               bool subdivide_uvs)
+                               const vector<int>& face_flags)
 {
-	if(subdivision) {
-		BL::Mesh::uv_layers_iterator l;
-		int i = 0;
-
-		for(b_mesh.uv_layers.begin(l); l != b_mesh.uv_layers.end(); ++l, ++i) {
-			bool active_render = b_mesh.uv_layers[i].active_render();
-			AttributeStandard std = (active_render)? ATTR_STD_UV: ATTR_STD_NONE;
-			ustring name = ustring(l->name().c_str());
-
-			/* UV map */
-			if(mesh->need_attribute(scene, name) || mesh->need_attribute(scene, std)) {
-				Attribute *attr;
-
-				if(active_render)
-					attr = mesh->subd_attributes.add(std, name);
-				else
-					attr = mesh->subd_attributes.add(name, TypeDesc::TypePoint, ATTR_ELEMENT_CORNER);
-
-				if(subdivide_uvs) {
-					attr->flags |= ATTR_SUBDIVIDED;
-				}
-
-				BL::Mesh::polygons_iterator p;
-				float3 *fdata = attr->data_float3();
-
-				for(b_mesh.polygons.begin(p); p != b_mesh.polygons.end(); ++p) {
-					int n = p->loop_total();
-					for(int j = 0; j < n; j++) {
-						*(fdata++) = get_float3(l->data[p->loop_start() + j].uv());
-					}
-				}
-			}
-		}
-	}
-	else if(b_mesh.tessface_uv_textures.le

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list