svn merge ^/trunk/blender -r46300:46330
[blender.git] / source / blender / collada / MeshImporter.cpp
index 829ee5f290e310ca1e7a948e451a3a962cb49839..5560a80f68ecbe9b4b56111705af5190fafaa889 100644 (file)
@@ -116,7 +116,7 @@ UVDataWrapper::UVDataWrapper(COLLADAFW::MeshVertexData& vdata) : mVData(&vdata)
 void WVDataWrapper::print()
 {
        fprintf(stderr, "UVs:\n");
-       switch(mVData->getType()) {
+       switch (mVData->getType()) {
        case COLLADAFW::MeshVertexData::DATA_TYPE_FLOAT:
                {
                        COLLADAFW::ArrayPrimitiveType<float>* values = mVData->getFloatValues();
@@ -145,9 +145,9 @@ void WVDataWrapper::print()
 void UVDataWrapper::getUV(int uv_index, float *uv)
 {
        int stride = mVData->getStride(0);
-       if(stride==0) stride = 2;
+       if (stride==0) stride = 2;
 
-       switch(mVData->getType()) {
+       switch (mVData->getType()) {
        case COLLADAFW::MeshVertexData::DATA_TYPE_FLOAT:
                {
                        COLLADAFW::ArrayPrimitiveType<float>* values = mVData->getFloatValues();
@@ -180,14 +180,15 @@ void MeshImporter::set_face_indices(MFace *mface, unsigned int *indices, bool qu
        if (quad) mface->v4 = indices[3];
        else mface->v4 = 0;
 #ifdef COLLADA_DEBUG
-       // fprintf(stderr, "%u, %u, %u \n", indices[0], indices[1], indices[2]);
+       // fprintf(stderr, "%u, %u, %u\n", indices[0], indices[1], indices[2]);
 #endif
 }
 
 // not used anymore, test_index_face from blenkernel is better
 #if 0
 // change face indices order so that v4 is not 0
-void MeshImporter::rotate_face_indices(MFace *mface) {
+void MeshImporter::rotate_face_indices(MFace *mface)
+{
        mface->v4 = mface->v1;
        mface->v1 = mface->v2;
        mface->v2 = mface->v3;
@@ -280,7 +281,7 @@ bool MeshImporter::is_nice_mesh(COLLADAFW::Mesh *mesh)      // checks if mesh has sup
                        COLLADAFW::Polygons *mpvc = (COLLADAFW::Polygons*)mp;
                        COLLADAFW::Polygons::VertexCountArray& vca = mpvc->getGroupedVerticesVertexCountArray();
                        
-                       for(unsigned int j = 0; j < vca.getCount(); j++){
+                       for (unsigned int j = 0; j < vca.getCount(); j++) {
                                int count = vca[j];
                                if (count < 3) {
                                        fprintf(stderr, "Primitive %s in %s has at least one face with vertex count < 3\n",
@@ -290,7 +291,7 @@ bool MeshImporter::is_nice_mesh(COLLADAFW::Mesh *mesh)      // checks if mesh has sup
                        }
                                
                }
-               else if(type != COLLADAFW::MeshPrimitive::TRIANGLES && type!= COLLADAFW::MeshPrimitive::TRIANGLE_FANS) {
+               else if (type != COLLADAFW::MeshPrimitive::TRIANGLES && type!= COLLADAFW::MeshPrimitive::TRIANGLE_FANS) {
                        fprintf(stderr, "Primitive type %s is not supported.\n", type_str);
                        return false;
                }
@@ -309,7 +310,7 @@ void MeshImporter::read_vertices(COLLADAFW::Mesh *mesh, Mesh *me)
        // vertices
        COLLADAFW::MeshVertexData& pos = mesh->getPositions();
        int stride = pos.getStride(0);
-       if(stride==0) stride = 3;
+       if (stride==0) stride = 3;
        
        me->totvert = mesh->getPositions().getFloatValues()->getCount() / stride;
        me->mvert = (MVert*)CustomData_add_layer(&me->vdata, CD_MVERT, CD_CALLOC, NULL, me->totvert);
@@ -485,7 +486,7 @@ void MeshImporter::read_faces(COLLADAFW::Mesh *mesh, Mesh *me, int new_tris) //T
 #endif
                
                if (type == COLLADAFW::MeshPrimitive::TRIANGLES) {
-                       for (j = 0; j < prim_totface; j++){
+                       for (j = 0; j < prim_totface; j++) {
                                
                                set_face_indices(mface, indices, false);
                                indices += 3;
@@ -526,12 +527,12 @@ void MeshImporter::read_faces(COLLADAFW::Mesh *mesh, Mesh *me, int new_tris) //T
                // The first trifan vertex will be the first vertex in every triangle
                if (type == COLLADAFW::MeshPrimitive::TRIANGLE_FANS) {
                        unsigned grouped_vertex_count = mp->getGroupedVertexElementsCount();
-                       for (unsigned int group_index = 0; group_index < grouped_vertex_count; group_index++){
+                       for (unsigned int group_index = 0; group_index < grouped_vertex_count; group_index++) {
                                unsigned int first_vertex = indices[0]; // Store first trifan vertex
                                unsigned int first_normal = nind[0]; // Store first trifan vertex normal
                                unsigned int vertex_count = mp->getGroupedVerticesVertexCount(group_index);
 
-                               for (unsigned int vertex_index = 0; vertex_index < vertex_count - 2; vertex_index++){
+                               for (unsigned int vertex_index = 0; vertex_index < vertex_count - 2; vertex_index++) {
                                        // For each triangle store indeces of its 3 vertices
                                        unsigned int triangle_vertex_indices[3]={first_vertex, indices[1], indices[2]};
                                        set_face_indices(mface, triangle_vertex_indices, false);
@@ -675,7 +676,7 @@ void MeshImporter::get_vector(float v[3], COLLADAFW::MeshVertexData& arr, int i,
 {
        i *= stride;
        
-       switch(arr.getType()) {
+       switch (arr.getType()) {
        case COLLADAFW::MeshVertexData::DATA_TYPE_FLOAT:
                {
                        COLLADAFW::ArrayPrimitiveType<float>* values = arr.getFloatValues();
@@ -726,6 +727,16 @@ bool MeshImporter::flat_face(unsigned int *nind, COLLADAFW::MeshVertexData& nor,
 
 MeshImporter::MeshImporter(UnitConverter *unitconv, ArmatureImporter *arm, Scene *sce) : unitconverter(unitconv), scene(sce), armature_importer(arm) {}
 
+void MeshImporter::bmeshConversion()
+{
+       for (std::map<COLLADAFW::UniqueId, Mesh*>::iterator m = uid_mesh_map.begin();
+                       m != uid_mesh_map.end(); ++m)
+       {
+               if ((*m).second) BKE_mesh_convert_mfaces_to_mpolys((*m).second);
+       }
+}
+
+
 Object *MeshImporter::get_object_by_geom_uid(const COLLADAFW::UniqueId& geom_uid)
 {
        if (uid_object_map.find(geom_uid) != uid_object_map.end())
@@ -741,10 +752,13 @@ MTex *MeshImporter::assign_textures_to_uvlayer(COLLADAFW::TextureCoordinateBindi
        size_t setindex = ctexture.getSetIndex();
        std::string uvname = ctexture.getSemantic();
        
-       if(setindex==-1) return NULL;
+       if (setindex==-1) return NULL;
        
        const CustomData *data = &me->fdata;
        int layer_index = CustomData_get_layer_index(data, CD_MTFACE);
+
+       if (layer_index == -1) return NULL;
+
        CustomDataLayer *cdl = &data->layers[layer_index+setindex];
        
        /* set uvname to bind_vertex_input semantic */
@@ -793,8 +807,8 @@ MTFace *MeshImporter::assign_material_to_geom(COLLADAFW::MaterialBinding cmateri
        // what we already have handled.
        std::multimap<COLLADAFW::UniqueId, COLLADAFW::UniqueId>::iterator it;
        it=materials_mapped_to_geom.find(*geom_uid);
-       while(it!=materials_mapped_to_geom.end()) {
-               if(it->second == ma_uid && it->first == *geom_uid) return NULL; // do nothing if already found
+       while (it!=materials_mapped_to_geom.end()) {
+               if (it->second == ma_uid && it->first == *geom_uid) return NULL; // do nothing if already found
                it++;
        }
        // first time we get geom_uid, ma_uid pair. Save for later check.
@@ -841,7 +855,6 @@ MTFace *MeshImporter::assign_material_to_geom(COLLADAFW::MaterialBinding cmateri
                                prim.mface++;
                                // bind texture images to faces
                                if (texture_face && (*color_texture)) {
-                                       texture_face->mode = TF_TEX;
                                        texture_face->tpage = (Image*)(*color_texture)->tex->ima;
                                        texture_face++;
                                }
@@ -896,7 +909,7 @@ Object *MeshImporter::create_mesh_object(COLLADAFW::Node *node, COLLADAFW::Insta
 
        set_mesh(ob, uid_mesh_map[*geom_uid]);
        
-       if (old_mesh->id.us == 0) free_libblock(&G.main->mesh, old_mesh);
+       if (old_mesh->id.us == 0) BKE_libblock_free(&G.main->mesh, old_mesh);
        
        char layername[100];
        layername[0] = '\0';
@@ -909,15 +922,16 @@ Object *MeshImporter::create_mesh_object(COLLADAFW::Node *node, COLLADAFW::Insta
        // loop through geom's materials
        for (unsigned int i = 0; i < mat_array.getCount(); i++) {
                
-               if(mat_array[i].getReferencedMaterial().isValid()) {
+               if (mat_array[i].getReferencedMaterial().isValid()) {
                        texture_face = assign_material_to_geom(mat_array[i], uid_material_map, ob, geom_uid,
                                                                                                   &color_texture, layername, texture_face,
                                                                                                   material_texture_mapping_map, i);
-               } else {
+               }
+               else {
                        fprintf(stderr, "invalid referenced material for %s\n", mat_array[i].getName().c_str());
                }
        }
-               
+
        return ob;
 }
 
@@ -943,7 +957,7 @@ bool MeshImporter::write_geometry(const COLLADAFW::Geometry* geom)
        }
        
        const std::string& str_geom_id = mesh->getName().size() ? mesh->getName() : mesh->getOriginalId();
-       Mesh *me = add_mesh((char*)str_geom_id.c_str());
+       Mesh *me = BKE_mesh_add((char*)str_geom_id.c_str());
 
        // store the Mesh pointer to link it later with an Object
        this->uid_mesh_map[mesh->getUniqueId()] = me;
@@ -958,7 +972,7 @@ bool MeshImporter::write_geometry(const COLLADAFW::Geometry* geom)
 
        make_edges(me, 0);
 
-       mesh_calc_normals(me->mvert, me->totvert, me->mloop, me->mpoly, me->totloop, me->totpoly, NULL, NULL, 0, NULL, NULL);
+       mesh_calc_normals_mapping(me->mvert, me->totvert, me->mloop, me->mpoly, me->totloop, me->totpoly, NULL, NULL, 0, NULL, NULL);
 
        return true;
 }