[#27854] Collada import doesn't handle UVW mapping
authorNathan Letwory <nathan@letworyinteractive.com>
Wed, 6 Jul 2011 21:37:31 +0000 (21:37 +0000)
committerNathan Letwory <nathan@letworyinteractive.com>
Wed, 6 Jul 2011 21:37:31 +0000 (21:37 +0000)
Reported by David Roy
Patch by Brecht van Lommel

UV import code wasn't taking possible stride into account (always assuming stride==2), thus reading UV coords totally wrong.

source/blender/collada/MeshImporter.cpp
source/blender/collada/MeshImporter.h

index d1977d15fb2cb98f2443516def1b4496eba8d6db..760fb2359a4588eff8af71957a2baf9b0a2cd831 100644 (file)
@@ -144,15 +144,18 @@ void WVDataWrapper::print()
 }
 #endif
 
-void UVDataWrapper::getUV(int uv_index[2], float *uv)
+void UVDataWrapper::getUV(int uv_index, float *uv)
 {
+       int stride = mVData->getStride(0);
+       if(stride==0) stride = 2;
+
        switch(mVData->getType()) {
        case COLLADAFW::MeshVertexData::DATA_TYPE_FLOAT:
                {
                        COLLADAFW::ArrayPrimitiveType<float>* values = mVData->getFloatValues();
                        if (values->empty()) return;
-                       uv[0] = (*values)[uv_index[0]];
-                       uv[1] = (*values)[uv_index[1]];
+                       uv[0] = (*values)[uv_index*stride];
+                       uv[1] = (*values)[uv_index*stride + 1];
                        
                }
                break;
@@ -160,8 +163,8 @@ void UVDataWrapper::getUV(int uv_index[2], float *uv)
                {
                        COLLADAFW::ArrayPrimitiveType<double>* values = mVData->getDoubleValues();
                        if (values->empty()) return;
-                       uv[0] = (float)(*values)[uv_index[0]];
-                       uv[1] = (float)(*values)[uv_index[1]];
+                       uv[0] = (float)(*values)[uv_index*stride];
+                       uv[1] = (float)(*values)[uv_index*stride + 1];
                        
                }
                break;
@@ -197,54 +200,36 @@ void MeshImporter::rotate_face_indices(MFace *mface) {
 void MeshImporter::set_face_uv(MTFace *mtface, UVDataWrapper &uvs,
                                 COLLADAFW::IndexList& index_list, unsigned int *tris_indices)
 {
-       int uv_indices[4][2];
-
        // 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 < 3; i++) {
-               int uv_index = indices[tris_indices[i]];
-               uv_indices[i][0] = uv_index * 2;
-               uv_indices[i][1] = uv_index * 2 + 1;
-       }
-
-       uvs.getUV(uv_indices[0], mtface->uv[0]);
-       uvs.getUV(uv_indices[1], mtface->uv[1]);
-       uvs.getUV(uv_indices[2], mtface->uv[2]);
+       uvs.getUV(indices[tris_indices[0]], mtface->uv[0]);
+       uvs.getUV(indices[tris_indices[1]], mtface->uv[1]);
+       uvs.getUV(indices[tris_indices[2]], mtface->uv[2]);
 }
 
 void MeshImporter::set_face_uv(MTFace *mtface, UVDataWrapper &uvs,
                                COLLADAFW::IndexList& index_list, int index, bool quad)
 {
-       int uv_indices[4][2];
-
        // 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_indices[0], mtface->uv[0]);
-       uvs.getUV(uv_indices[1], mtface->uv[1]);
-       uvs.getUV(uv_indices[2], mtface->uv[2]);
+       uvs.getUV(indices[index + 0], mtface->uv[0]);
+       uvs.getUV(indices[index + 1], mtface->uv[1]);
+       uvs.getUV(indices[index + 2], mtface->uv[2]);
 
-       if (quad) uvs.getUV(uv_indices[3], mtface->uv[3]);
+       if (quad) uvs.getUV(indices[index + 3], mtface->uv[3]);
 
 #ifdef COLLADA_DEBUG
        /*if (quad) {
                fprintf(stderr, "face uv:\n"
-                               "((%d, %d), (%d, %d), (%d, %d), (%d, %d))\n"
+                               "((%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],
+                               indices[index + 0],
+                               indices[index + 1],
+                               indices[index + 2],
+                               indices[index + 3],
 
                                mtface->uv[0][0], mtface->uv[0][1],
                                mtface->uv[1][0], mtface->uv[1][1],
@@ -253,12 +238,12 @@ void MeshImporter::set_face_uv(MTFace *mtface, UVDataWrapper &uvs,
        }
        else {
                fprintf(stderr, "face uv:\n"
-                               "((%d, %d), (%d, %d), (%d, %d))\n"
+                               "((%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],
+                               indices[index + 0],
+                               indices[index + 1],
+                               indices[index + 2],
 
                                mtface->uv[0][0], mtface->uv[0][1],
                                mtface->uv[1][0], mtface->uv[1][1],
index 20fdb0dcc6e2ce35c07b7e4b86335deff7136300..88ee0e46c336283eec2b09c5d77a8a455149c6e8 100644 (file)
@@ -69,7 +69,7 @@ public:
        void print();
 #endif
 
-       void getUV(int uv_index[2], float *uv);
+       void getUV(int uv_index, float *uv);
 };
 
 class MeshImporter : public MeshImporterBase