[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [47973] branches/soc-2012-bratwurst/source /blender/assimp: - bf_assimp: support singular lines in meshes.

Alexander Gessler alexander.gessler at gmx.net
Fri Jun 15 20:15:30 CEST 2012


Revision: 47973
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=47973
Author:   aramis_acg
Date:     2012-06-15 18:15:27 +0000 (Fri, 15 Jun 2012)
Log Message:
-----------
- bf_assimp: support singular lines in meshes. Code for this is based on Collada.

Modified Paths:
--------------
    branches/soc-2012-bratwurst/source/blender/assimp/MeshImporter.cpp
    branches/soc-2012-bratwurst/source/blender/assimp/MeshImporter.h

Modified: branches/soc-2012-bratwurst/source/blender/assimp/MeshImporter.cpp
===================================================================
--- branches/soc-2012-bratwurst/source/blender/assimp/MeshImporter.cpp	2012-06-15 17:57:39 UTC (rev 47972)
+++ branches/soc-2012-bratwurst/source/blender/assimp/MeshImporter.cpp	2012-06-15 18:15:27 UTC (rev 47973)
@@ -475,7 +475,6 @@
 			}
 		}
 	}
-
 }
 
 void MeshImporter::assign_textures_to_face(const MFace& fac, MTFace& tfac, unsigned int assimp_mat_id, unsigned int uv_index)
@@ -488,6 +487,88 @@
 }
 
 
+unsigned int MeshImporter::count_lines()
+{
+	unsigned int count = 0;
+	for (std::vector<const aiMesh*>::const_iterator it = in_meshes.begin(), end = in_meshes.end(); it != end; ++it) {
+		const aiMesh& m = **it;
+
+		for (unsigned int i = 0; i < m.mNumFaces; ++i) {
+
+			const aiFace& f = m.mFaces[i];
+			if (f.mNumIndices == 2)	{
+				++count;
+			}
+		}
+	}
+
+	return count;
+}
+
+void MeshImporter::mesh_add_edges(unsigned int len)
+{
+	if (!len) {
+		return;
+	}
+
+	CustomData edata;
+	MEdge *medge;
+	int i, totedge;
+
+	totedge = mesh->totedge + len;
+
+	/* update customdata  */
+	CustomData_copy(&mesh->edata, &edata, CD_MASK_MESH, CD_DEFAULT, totedge);
+	CustomData_copy_data(&mesh->edata, &edata, 0, 0, mesh->totedge);
+
+	if (!CustomData_has_layer(&edata, CD_MEDGE)) {
+		CustomData_add_layer(&edata, CD_MEDGE, CD_CALLOC, NULL, totedge);
+	}
+
+	CustomData_free(&mesh->edata, mesh->totedge);
+	mesh->edata = edata;
+	mesh_update_customdata_pointers(mesh, FALSE); /* new edges don't change tessellation */
+
+	/* set default flags */
+	medge = &mesh->medge[mesh->totedge];
+	for (i = 0; i < len; i++, medge++) {
+		medge->flag = ME_EDGEDRAW | ME_EDGERENDER | SELECT;
+	}
+	mesh->totedge = totedge;
+}
+
+
+void MeshImporter::convert_lines()
+{
+	const unsigned int loose_edge_count = count_lines();
+	if (loose_edge_count > 0) {
+
+		const unsigned int face_edge_count  = mesh->totedge;
+		const unsigned int total_edge_count = loose_edge_count + face_edge_count;
+
+		mesh_add_edges(loose_edge_count);
+		MEdge *med = mesh->medge + face_edge_count;
+
+		for (std::vector<const aiMesh*>::const_iterator it = in_meshes.begin(), end = in_meshes.end(); it != end; ++it) {
+			const aiMesh& m = **it;
+
+			for (unsigned int i = 0; i < m.mNumFaces; ++i) {
+				const aiFace& f = m.mFaces[i];
+				if (f.mNumIndices == 2)	{
+					med->bweight = 0;
+					med->crease  = 0;
+					med->flag    = 0;
+					med->v1      = f.mIndices[0];
+					med->v2      = f.mIndices[1];
+
+					++med;
+				}
+			}
+		}
+	}
+}
+
+
 // initiate the conversion from aiMesh to BlenMesh.
 void MeshImporter::convert()
 {
@@ -495,6 +576,9 @@
 	convert_faces();
 
 	BKE_mesh_make_edges(mesh, 0);
+
+	// so far we ignored all lines, now add them to the final mesh
+	convert_lines();
 }
 
 }

Modified: branches/soc-2012-bratwurst/source/blender/assimp/MeshImporter.h
===================================================================
--- branches/soc-2012-bratwurst/source/blender/assimp/MeshImporter.h	2012-06-15 17:57:39 UTC (rev 47972)
+++ branches/soc-2012-bratwurst/source/blender/assimp/MeshImporter.h	2012-06-15 18:15:27 UTC (rev 47973)
@@ -61,6 +61,12 @@
 	void convert_vertices();
 	void convert_faces();
 
+	void convert_lines();
+	void mesh_add_edges(unsigned int len);
+
+	// count line primitives contained in the mesh(es)
+	unsigned int count_lines();
+
 	// count extra tris added by polygon triangulation
 	unsigned int count_new_tris();
 




More information about the Bf-blender-cvs mailing list