Revision: 21425
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=21425
Author:   chingachgook
Date:     2009-07-08 13:55:11 +0200 (Wed, 08 Jul 2009)

Log Message:
-----------
Added import multiple UV layers.
If <geometry> has more than one primitive - UVs aren't imported properly.
Will fix this soon.

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

Modified: 
branches/soc-2009-chingachgook/source/blender/collada/DocumentExporter.cpp
===================================================================
--- branches/soc-2009-chingachgook/source/blender/collada/DocumentExporter.cpp  
2009-07-08 11:44:40 UTC (rev 21424)
+++ branches/soc-2009-chingachgook/source/blender/collada/DocumentExporter.cpp  
2009-07-08 11:55:11 UTC (rev 21425)
@@ -711,7 +711,7 @@
                        ep.setReflective(cot);
                        ep.setReflectivity(0.0f);
                }
-               // specular, shininess
+               // specular
                if (ep.getShaderType() != COLLADASW::EffectProfile::LAMBERT) {
                        cot = getcol(ma->specr, ma->specg, ma->specb, 1.0f);
                        ep.setSpecular(cot);

Modified: 
branches/soc-2009-chingachgook/source/blender/collada/DocumentImporter.cpp
===================================================================
--- branches/soc-2009-chingachgook/source/blender/collada/DocumentImporter.cpp  
2009-07-08 11:44:40 UTC (rev 21424)
+++ branches/soc-2009-chingachgook/source/blender/collada/DocumentImporter.cpp  
2009-07-08 11:55:11 UTC (rev 21425)
@@ -11,6 +11,7 @@
 #include "COLLADAFWMaterial.h"
 #include "COLLADAFWGeometry.h"
 #include "COLLADAFWMesh.h"
+#include "COLLADAFWMeshVertexData.h"
 #include "COLLADAFWFloatOrDoubleArray.h"
 #include "COLLADAFWArrayPrimitiveType.h"
 #include "COLLADAFWMeshPrimitiveWithFaceVertexCount.h"
@@ -20,6 +21,7 @@
 #include "COLLADAFWScale.h"
 #include "COLLADAFWRotate.h"
 #include "COLLADAFWEffect.h"
+#include "COLLADAFWIndexList.h"
 
 #include "COLLADASaxFWLLoader.h"
 
@@ -132,6 +134,41 @@
                // TODO need also for angle conversion, time conversion...
        };
 
+       class UVDataWrapper {
+               COLLADAFW::MeshVertexData *mVData;
+       public:
+               UVDataWrapper(COLLADAFW::MeshVertexData& vdata) : mVData(&vdata)
+               {}
+
+               void getUV(int uv_set_index, int uv_index, 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 = 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];
+                                       
+                                       break;
+                               }
+                       case COLLADAFW::MeshVertexData::DATA_TYPE_DOUBLE:
+                               {
+                                       COLLADAFW::ArrayPrimitiveType<double>* 
values = mVData->getDoubleValues();
+                                       
+                                       uv[0] = 
(float)(*values)[uv_coords_index];
+                                       uv[1] = 
(float)(*values)[uv_coords_index + 1];
+                                       
+                                       break;
+                               }
+                       }
+                       //uv[0] = mVData;
+                       //uv[1] = ...;
+               }
+       };
+
 public:
 
        /** Constructor. */
@@ -380,6 +417,27 @@
                return true;
        }
 
+       // utility functions
+
+       void set_tri_or_quad_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
+               };
+
+               if (quad) uv_indices[3] = index_list.getIndex(index + 3);
+
+               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]);
+       }
+
        /** 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 ) 
@@ -487,24 +545,40 @@
                // allocate faces
                me->mface = (MFace*)CustomData_add_layer(&me->fdata, CD_MFACE, 
CD_CALLOC, NULL, totface);
                me->totface = totface;
+               
+               // UVs
+               int totuvset = 
cmesh->getUVCoords().getInputInfosArray().getCount();
 
+               for (i = 0; i < totuvset; i++) {
+                       // add new CustomData layer
+                       CustomData_add_layer(&me->fdata, CD_MTFACE, CD_CALLOC, 
NULL, totface);
+               }
+
+               if (totuvset) me->mtface = 
(MTFace*)CustomData_get_layer_n(&me->fdata, CD_MTFACE, 0);
+
+               UVDataWrapper uvs(cmesh->getUVCoords());
+               
                // read faces
                MFace *mface = me->mface;
 
                MaterialIdPrimitiveArrayMap mat_prim_map;
-               
-               for (i = 0; i < prim_arr.getCount(); i++){
+
+               // TODO: import uv set names
+
+               for (i = 0; i < prim_arr.getCount(); i++) {
                        
                        COLLADAFW::MeshPrimitive *mp = prim_arr[i];
-                       
+
                        // faces
                        size_t prim_totface = mp->getFaceCount();
                        unsigned int *indices = 
mp->getPositionIndices().getData();
                        int k;
                        int type = mp->getPrimitiveType();
-
+                       int index = 0;
+                       
                        // 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();
                        
                        if (type == COLLADAFW::MeshPrimitive::TRIANGLES) {
                                for (k = 0; k < prim_totface; k++){
@@ -513,8 +587,16 @@
                                        mface->v3 = indices[2];
                                        
                                        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
+                                               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);
+                                       }
+                                       index += 3;
                                        mface++;
-                                       
                                        prim.totface++;
                                }
                        }
@@ -523,7 +605,8 @@
                                COLLADAFW::Polygons::VertexCountArray& vca =
                                        
mpvc->getGroupedVerticesVertexCountArray();
                                for (k = 0; k < prim_totface; k++) {
-                                       
+
+                                       // face
                                        if (vca[k] == 3){
                                                mface->v1 = indices[0];
                                                mface->v2 = indices[1];
@@ -536,11 +619,32 @@
                                                mface->v2 = indices[1];
                                                mface->v3 = indices[2];
                                                mface->v4 = indices[3];
+
+                                               // trick
+                                               if (mface->v4 == 0) {
+                                                       mface->v4 = mface->v1;
+                                                       mface->v1 = mface->v2;
+                                                       mface->v2 = mface->v3;
+                                                       mface->v3 = 0;
+                                               }
+
                                                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
+                                               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, mface->v4 != 0);
+                                       }
+                                       index += mface->v4 ? 4 : 3;
                                        mface++;
-
                                        prim.totface++;
                                }
                        }
@@ -548,51 +652,9 @@
                        // check if primitive has material
                        mat_prim_map[mp->getMaterialId()].push_back(prim);
                }
-
+               
                geom_uid_mat_mapping_map[cgeom->getUniqueId()] = mat_prim_map;
-
-               /*
-               // UVs
-               MeshVertexData& uvcoord = cmesh->getUVCoords();
                
-               // get number of UV sets
-               int totuvset = uvcoord.getNumInputInfos();
-               
-               // for each uv set 
-               for (i = 0; i < totuvset; i++) {
-                       
-                       std::string uv_name = uvcoord.getName(i);
-                       me->mtface = CustomData_add_layer_named(&me->fdata, 
CD_MTFACE, CD_DEFAULT, NULL, me->totface, uv_name);
-                       
-                       size_t stride = uvcoord.getStride(i);
-                       size_t totindex = uvcoord.getLength(i);
-                       size_t totuv = (totindex/stride);
-                       size_t start = i * stride;
-                       
-                       // for each uv coord in this set 
-                       for (int j = start; j < totindex; j += stride) {
-                               
-                               switch(uvcoord.getType()) {
-                               case COLLADAFW::MeshVertexData::DATA_TYPE_FLOAT:
-                                       COLLADAFW::ArrayPrimitiveType<float>* 
values = uvcoord.getFloatValues();
-                                       
-                                       float u = (*values)[j];
-                                       float v = (*values)[j + 1];
-                                       
-                                       break;
-                               case 
COLLADAFW::MeshVertexData::DATA_TYPE_DOUBLE:
-                                       COLLADAFW::ArrayPrimitiveType<double>* 
values = uvcoord.getDoubleValues();
-                                       
-                                       float u = (float)(*values)[j];
-                                       float v = (float)(*values)[j + 1];
-                                       
-                                       break;
-                               }
-                               
-                       }
-               }
-               */
-               
                // normals
                mesh_calc_normals(me->mvert, me->totvert, me->mface, 
me->totface, NULL);
                return true;
@@ -703,6 +765,8 @@
        {
                /*std::string name = image->getOriginalId();
                  BKE_add_image_file(name);*/
+               const std::string& filepath = 
image->getImageURI().toNativePath();
+               BKE_add_image_file((char*)filepath.c_str(), 0);
                return true;
        }
 


_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to