style cleanup
[blender.git] / source / blender / collada / ControllerExporter.cpp
index c8307589af4e252c1e3b2e9e8d85fb7d94fef117..71a16df3b265150992793e171dcc484247968d60 100644 (file)
@@ -120,9 +120,10 @@ void ControllerExporter::operator()(Object *ob)
        Object *ob_arm = bc_get_assigned_armature(ob);
        Key *key = BKE_key_from_object(ob);
 
-       if (ob_arm)
+       if (ob_arm) {
                export_skin_controller(ob, ob_arm);
-       if(key){
+       }
+       if (key) {
                export_morph_controller(ob, key);
        }
 }
@@ -200,13 +201,12 @@ void ControllerExporter::export_skin_controller(Object *ob, Object *ob_arm)
        bool use_instantiation = this->export_settings->use_object_instantiation;
        Mesh *me;
 
-       if (this->export_settings->apply_modifiers) 
-               me = bc_to_mesh_apply_modifiers(scene, ob, this->export_settings->export_mesh_type);
-       else 
-               me = (Mesh *)ob->data;
+       me = bc_get_mesh_copy(scene,
+                               ob,
+                               this->export_settings->export_mesh_type,
+                               this->export_settings->apply_modifiers,
+                               this->export_settings->triangulate);
        
-       BKE_mesh_tessface_ensure(me);
-
        if (!me->dvert) return;
 
        std::string controller_name = id_name(ob_arm);
@@ -238,6 +238,7 @@ void ControllerExporter::export_skin_controller(Object *ob, Object *ob_arm)
                                joint_index_by_def_index.push_back(-1);
                }
 
+               int oob_counter = 0;
                for (i = 0; i < me->totvert; i++) {
                        MDeformVert *vert = &me->dvert[i];
                        std::map<int, float> jw;
@@ -246,10 +247,20 @@ void ControllerExporter::export_skin_controller(Object *ob, Object *ob_arm)
                        float sumw = 0.0f;
 
                        for (j = 0; j < vert->totweight; j++) {
-                               int joint_index = joint_index_by_def_index[vert->dw[j].def_nr];
-                               if (joint_index != -1 && vert->dw[j].weight > 0.0f) {
-                                       jw[joint_index] += vert->dw[j].weight;
-                                       sumw += vert->dw[j].weight;
+                               int idx = vert->dw[j].def_nr;
+                               if (idx >= joint_index_by_def_index.size()) {
+                                       // XXX: Maybe better find out where and 
+                                       //      why the Out Of Bound indexes get created ?
+                                       oob_counter += 1;
+                               }
+                               else {
+                                       if (idx >= 0) {
+                                               int joint_index = joint_index_by_def_index[idx];
+                                               if (joint_index != -1 && vert->dw[j].weight > 0.0f) {
+                                                       jw[joint_index] += vert->dw[j].weight;
+                                                       sumw += vert->dw[j].weight;
+                                               }
+                                       }
                                }
                        }
 
@@ -270,16 +281,18 @@ void ControllerExporter::export_skin_controller(Object *ob, Object *ob_arm)
 #endif
                        }
                }
+
+               if (oob_counter > 0) {
+                       fprintf(stderr, "Ignored %d Vertex weigths which use index to non existing VGroup %ld.\n", oob_counter, joint_index_by_def_index.size());
+               }
        }
 
        std::string weights_source_id = add_weights_source(me, controller_id, weights);
        add_joints_element(&ob->defbase, joints_source_id, inv_bind_mat_source_id);
        add_vertex_weights_element(weights_source_id, joints_source_id, vcounts, joints);
 
-       if (this->export_settings->apply_modifiers)
-       {
-               BKE_libblock_free_us(&(G.main->mesh), me);
-       }
+       BKE_libblock_free_us(&(G.main->mesh), me);
+
        closeSkin();
        closeController();
 }
@@ -289,13 +302,11 @@ void ControllerExporter::export_morph_controller(Object *ob, Key *key)
        bool use_instantiation = this->export_settings->use_object_instantiation;
        Mesh *me;
 
-       if (this->export_settings->apply_modifiers) {
-               me = bc_to_mesh_apply_modifiers(scene, ob, this->export_settings->export_mesh_type);
-       } 
-       else {
-               me = (Mesh *)ob->data;
-       }
-       BKE_mesh_tessface_ensure(me);
+       me = bc_get_mesh_copy(scene,
+                               ob,
+                               this->export_settings->export_mesh_type,
+                               this->export_settings->apply_modifiers,
+                               this->export_settings->triangulate);
 
        std::string controller_name = id_name(ob) + "-morph";
        std::string controller_id = get_controller_id(key, ob);
@@ -316,10 +327,8 @@ void ControllerExporter::export_morph_controller(Object *ob, Key *key)
                                         COLLADASW::URI(COLLADABU::Utils::EMPTY_STRING, morph_weights_id)));
        targets.add();
 
-       if (this->export_settings->apply_modifiers)
-       {
-               BKE_libblock_free_us(&(G.main->mesh), me);
-       }
+       BKE_libblock_free_us(&(G.main->mesh), me);
+
 
        //support for animations
        //can also try the base element and param alternative
@@ -343,7 +352,7 @@ std::string ControllerExporter::add_morph_targets(Key *key, Object *ob)
 
        source.prepareToAppendValues();
 
-       KeyBlock * kb = (KeyBlock*)key->block.first;
+       KeyBlock *kb = (KeyBlock *)key->block.first;
        //skip the basis
        kb = kb->next;
        for (; kb; kb = kb->next) {
@@ -372,7 +381,7 @@ std::string ControllerExporter::add_morph_weights(Key *key, Object *ob)
        
        source.prepareToAppendValues();
 
-       KeyBlock * kb = (KeyBlock*)key->block.first;
+       KeyBlock *kb = (KeyBlock *)key->block.first;
        //skip the basis
        kb = kb->next;
        for (; kb; kb = kb->next) {
@@ -385,16 +394,17 @@ std::string ControllerExporter::add_morph_weights(Key *key, Object *ob)
 }
 
 //Added to implemente support for animations.
-void ControllerExporter::add_weight_extras(Key *key){
+void ControllerExporter::add_weight_extras(Key *key)
+{
        // can also try the base element and param alternative
        COLLADASW::BaseExtraTechnique extra;
        
-       KeyBlock * kb = (KeyBlock*)key->block.first;
+       KeyBlock * kb = (KeyBlock *)key->block.first;
        //skip the basis
        kb = kb->next;
        for (; kb; kb = kb->next) {
                // XXX why is the weight not used here and set to 0.0?
-               float weight = kb->curval;
+               // float weight = kb->curval;
                extra.addExtraTechniqueParameter ("KHR", "morph_weights" , 0.000, "MORPH_WEIGHT_TO_TARGET");
        }
 }