[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [21481] branches/soc-2009-chingachgook/ source/blender/collada/DocumentImporter.cpp: Importer:

Arystanbek Dyussenov arystan.d at gmail.com
Fri Jul 10 13:32:55 CEST 2009


Revision: 21481
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=21481
Author:   kazanbas
Date:     2009-07-10 13:32:55 +0200 (Fri, 10 Jul 2009)

Log Message:
-----------
Importer:
- fixed multi-UV set import and made code more readable
- added #ifdef'ed console output useful for debugging

Modified Paths:
--------------
    branches/soc-2009-chingachgook/source/blender/collada/DocumentImporter.cpp

Modified: branches/soc-2009-chingachgook/source/blender/collada/DocumentImporter.cpp
===================================================================
--- branches/soc-2009-chingachgook/source/blender/collada/DocumentImporter.cpp	2009-07-10 11:22:11 UTC (rev 21480)
+++ branches/soc-2009-chingachgook/source/blender/collada/DocumentImporter.cpp	2009-07-10 11:32:55 UTC (rev 21481)
@@ -51,6 +51,10 @@
 #include <string>
 #include <map>
 
+
+// #define COLLADA_DEBUG
+
+
 const char *primTypeToStr(COLLADAFW::MeshPrimitive::PrimitiveType type)
 {
 	using namespace COLLADAFW;
@@ -141,18 +145,30 @@
 		UVDataWrapper(COLLADAFW::MeshVertexData& vdata) : mVData(&vdata)
 		{}
 
-		void getUV(int uv_set_index, int uv_index, float *uv)
+#ifdef COLLADA_DEBUG
+		void print()
 		{
+			fprintf(stderr, "UVs:\n");
+			COLLADAFW::ArrayPrimitiveType<float>* values = mVData->getFloatValues();
+			for (int i = 0; i < values->getCount(); i += 2) {
+				fprintf(stderr, "%.1f, %.1f\n", (*values)[i], (*values)[i+1]);
+			}
+			fprintf(stderr, "\n");
+		}
+#endif
+
+		void getUV(int uv_set_index, int uv_index[2], float *uv)
+		{
 			//int uv_coords_index = mVData->getInputInfosArray()[uv_set_index]->getCount() * uv_set_index + uv_index * 2;
-			int uv_coords_index = uv_index * 2;
+			// int uv_coords_index = uv_index * 2;
  			//int uv_coords_index = mVData->getLength(uv_set_index) * uv_set_index + uv_index * 2;
 			
 			switch(mVData->getType()) {
 			case COLLADAFW::MeshVertexData::DATA_TYPE_FLOAT:
 				{
-					COLLADAFW::ArrayPrimitiveType<float>* values = mVData->getFloatValues();					
-					uv[0] = (*values)[uv_coords_index];
-					uv[1] = (*values)[uv_coords_index + 1];
+					COLLADAFW::ArrayPrimitiveType<float>* values = mVData->getFloatValues();
+					uv[0] = (*values)[uv_index[0]];
+					uv[1] = (*values)[uv_index[1]];
 					
 					break;
 				}
@@ -160,8 +176,8 @@
 				{
 					COLLADAFW::ArrayPrimitiveType<double>* values = mVData->getDoubleValues();
 					
-					uv[0] = (float)(*values)[uv_coords_index];
-					uv[1] = (float)(*values)[uv_coords_index + 1];
+					uv[0] = (float)(*values)[uv_index[0]];
+					uv[1] = (float)(*values)[uv_index[1]];
 					
 					break;
 				}
@@ -420,28 +436,86 @@
 
 	// utility functions
 
-	void set_tri_or_quad_uv(MTFace *mtface, UVDataWrapper &uvs, int uv_set_index,
+	void set_face_indices(MFace *mface, unsigned int *indices, bool quad)
+	{
+		mface->v1 = indices[0];
+		mface->v2 = indices[1];
+		mface->v3 = indices[2];
+		if (quad) mface->v4 = indices[3];
+	}
+
+	// change face indices order so that v4 is not 0
+	void rotate_face_indices(MFace *mface) {
+		mface->v4 = mface->v1;
+		mface->v1 = mface->v2;
+		mface->v2 = mface->v3;
+		mface->v3 = 0;
+	}
+
+	void set_face_uv(MTFace *mtface, UVDataWrapper &uvs, int uv_set_index,
 					COLLADAFW::IndexList& index_list, int index, bool quad)
 	{
-		int uv_indices[4] = {
-			index_list.getIndex(index),
-			index_list.getIndex(index + 1),
-			index_list.getIndex(index + 2),
-			0
-		};
+		int uv_indices[4][2];
 
-		//if (quad) uv_indices[3] = index_list.getIndex(index + 3);
+		// per face vertex indices, this means for quad we have 4 indices, not 8
+		COLLADAFW::UIntValuesArray& indices = index_list.getIndices();
 
+		// make indices into FloatOrDoubleArray
+		for (int i = 0; i < (quad ? 4 : 3); i++) {
+			int uv_index = indices[index + i];
+			uv_indices[i][0] = uv_index * 2;
+			uv_indices[i][1] = uv_index * 2 + 1;
+		}
+
 		uvs.getUV(uv_set_index, uv_indices[0], mtface->uv[0]);
 		uvs.getUV(uv_set_index, uv_indices[1], mtface->uv[1]);
 		uvs.getUV(uv_set_index, uv_indices[2], mtface->uv[2]);
 
+		if (quad) uvs.getUV(uv_set_index, uv_indices[3], mtface->uv[3]);
+
+#ifdef COLLADA_DEBUG
 		if (quad) {
-			uv_indices[3] = index_list.getIndex(index + 3);
-			uvs.getUV(uv_set_index, uv_indices[3], mtface->uv[3]);
+			fprintf(stderr, "face uv:\n"
+					"((%d, %d), (%d, %d), (%d, %d), (%d, %d))\n"
+					"((%.1f, %.1f), (%.1f, %.1f), (%.1f, %.1f), (%.1f, %.1f))\n",
+
+					uv_indices[0][0], uv_indices[0][1],
+					uv_indices[1][0], uv_indices[1][1],
+					uv_indices[2][0], uv_indices[2][1],
+					uv_indices[3][0], uv_indices[3][1],
+
+					mtface->uv[0][0], mtface->uv[0][1],
+					mtface->uv[1][0], mtface->uv[1][1],
+					mtface->uv[2][0], mtface->uv[2][1],
+					mtface->uv[3][0], mtface->uv[3][1]);
 		}
+		else {
+			fprintf(stderr, "face uv:\n"
+					"((%d, %d), (%d, %d), (%d, %d))\n"
+					"((%.1f, %.1f), (%.1f, %.1f), (%.1f, %.1f))\n",
+
+					uv_indices[0][0], uv_indices[0][1],
+					uv_indices[1][0], uv_indices[1][1],
+					uv_indices[2][0], uv_indices[2][1],
+
+					mtface->uv[0][0], mtface->uv[0][1],
+					mtface->uv[1][0], mtface->uv[1][1],
+					mtface->uv[2][0], mtface->uv[2][1]);
+		}
+#endif
 	}
 
+#ifdef COLLADA_DEBUG
+	void print_index_list(COLLADAFW::IndexList& index_list)
+	{
+		fprintf(stderr, "Index list for \"%s\":\n", index_list.getName().c_str());
+		for (int i = 0; i < index_list.getIndicesCount(); i += 2) {
+			fprintf(stderr, "%u, %u\n", index_list.getIndex(i), index_list.getIndex(i + 1));
+		}
+		fprintf(stderr, "\n");
+	}
+#endif
+
 	/** When this method is called, the writer must write the geometry.
 		@return The writer should return true, if writing succeeded, false otherwise.*/
 	virtual bool writeGeometry ( const COLLADAFW::Geometry* cgeom ) 
@@ -481,7 +555,6 @@
 				COLLADAFW::Polygons *mpvc = (COLLADAFW::Polygons*)mp;
 				COLLADAFW::Polygons::VertexCountArray& vca = mpvc->getGroupedVerticesVertexCountArray();
 				
-				bool ok = true;
 				for(int j = 0; j < vca.getCount(); j++){
 					int count = vca[j];
 					if (count != 3 && count != 4) {
@@ -561,13 +634,18 @@
 		if (totuvset) me->mtface = (MTFace*)CustomData_get_layer_n(&me->fdata, CD_MTFACE, 0);
 
 		UVDataWrapper uvs(cmesh->getUVCoords());
-		
+
+#ifdef COLLADA_DEBUG
+		uvs.print();
+#endif
+
 		// read faces
 		MFace *mface = me->mface;
 
 		MaterialIdPrimitiveArrayMap mat_prim_map;
 
 		// TODO: import uv set names
+		int face_index = 0;
 
 		for (i = 0; i < prim_arr.getCount(); i++) {
 			
@@ -583,72 +661,60 @@
 			// since we cannot set mface->mat_nr here, we store part of me->mface in Primitive
 			Primitive prim = {mface, 0};
 			COLLADAFW::IndexListArray& index_list_array = mp->getUVCoordIndicesArray();
+
+#ifdef COLLADA_DEBUG
+			fprintf(stderr, "Primitive %d:\n", i);
+			for (int j = 0; j < totuvset; j++) {
+				print_index_list(*index_list_array[j]);
+			}
+#endif
 			
 			if (type == COLLADAFW::MeshPrimitive::TRIANGLES) {
 				for (k = 0; k < prim_totface; k++){
-					mface->v1 = indices[0];
-					mface->v2 = indices[1];
-					mface->v3 = indices[2];
 					
+					set_face_indices(mface, indices, false);
 					indices += 3;
 
 					for (int j = 0; j < totuvset; j++) {
-						// k - face index, j - uv set index
-
-						// get mtface by face index (k) and uv set index
+						// get mtface by face index and uv set index
 						MTFace *mtface = (MTFace*)CustomData_get_layer_n(&me->fdata, CD_MTFACE, j);
-						set_tri_or_quad_uv(&mtface[k], uvs, j, *index_list_array[j], index, false);
+						set_face_uv(&mtface[face_index], uvs, j, *index_list_array[j], index, false);
 					}
+					
 					index += 3;
 					mface++;
+					face_index++;
 					prim.totface++;
 				}
 			}
 			else if (type == COLLADAFW::MeshPrimitive::POLYLIST || type == COLLADAFW::MeshPrimitive::POLYGONS) {
 				COLLADAFW::Polygons *mpvc =	(COLLADAFW::Polygons*)mp;
-				COLLADAFW::Polygons::VertexCountArray& vca =
-					mpvc->getGroupedVerticesVertexCountArray();
+				COLLADAFW::Polygons::VertexCountArray& vcounta = mpvc->getGroupedVerticesVertexCountArray();
+
 				for (k = 0; k < prim_totface; k++) {
 
 					// face
-					if (vca[k] == 3){
-						mface->v1 = indices[0];
-						mface->v2 = indices[1];
-						mface->v3 = indices[2];
-						indices += 3;
-						
-					}
-					else {
-						mface->v1 = indices[0];
-						mface->v2 = indices[1];
-						mface->v3 = indices[2];
-						mface->v4 = indices[3];
+					int vcount = vcounta[k];
 
-						// trick
-						if (mface->v4 == 0) {
-							mface->v4 = mface->v1;
-							mface->v1 = mface->v2;
-							mface->v2 = mface->v3;
-							mface->v3 = 0;
-						}
+					set_face_indices(mface, indices, vcount == 4);
+					indices += vcount;
+					
+					// do the trick if needed
+					if (vcount == 4 && mface->v4 == 0)
+						rotate_face_indices(mface);
 
-						indices +=4;
-						
-					}
-
 					// set mtface for each uv set
 					// it is assumed that all primitives have equal number of UV sets
 
 					for (int j = 0; j < totuvset; j++) {
-						// k - face index, j - uv set index
-
-						// get mtface by face index (k) and uv set index
+						// get mtface by face index and uv set index
 						MTFace *mtface = (MTFace*)CustomData_get_layer_n(&me->fdata, CD_MTFACE, j);
+						set_face_uv(&mtface[face_index], uvs, j, *index_list_array[j], index, mface->v4 != 0);
+					}
 
-						set_tri_or_quad_uv(&mtface[k], uvs, j, *index_list_array[j], index, mface->v4 != 0);
-					}
 					index += mface->v4 ? 4 : 3;
 					mface++;
+					face_index++;
 					prim.totface++;
 				}
 			}





More information about the Bf-blender-cvs mailing list