Revision: 22455
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=22455
Author:   chingachgook
Date:     2009-08-14 19:12:04 +0200 (Fri, 14 Aug 2009)

Log Message:
-----------
Importer:
* Converts euler rotation to quaternion for bone animation.

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-08-14 16:25:59 UTC (rev 22454)
+++ branches/soc-2009-chingachgook/source/blender/collada/DocumentExporter.cpp  
2009-08-14 17:12:04 UTC (rev 22455)
@@ -280,7 +280,7 @@
                std::string geom_id = get_geometry_id(ob);
                
                // openMesh(geoId, geoName, meshId)
-               openMesh(geom_id, "", "");
+               openMesh(geom_id);
                
                // writes <source> for vertex coords
                createVertsSource(geom_id, me);
@@ -1129,7 +1129,7 @@
        
        void exportScene(Scene *sce) {
                // <library_visual_scenes> <visual_scene>
-               openVisualScene(id_name(sce), "");
+               openVisualScene(id_name(sce));
 
                // write <node>s
                //forEachMeshObjectInScene(sce, *this);
@@ -1307,7 +1307,7 @@
                                } 
                                
                                if (find(mImages.begin(), mImages.end(), name) 
== mImages.end()) {
-                                       COLLADASW::Image 
img(COLLADABU::URI(COLLADABU::URI::nativePathToUri(rel)), name, "");
+                                       COLLADASW::Image 
img(COLLADABU::URI(COLLADABU::URI::nativePathToUri(rel)), name);
                                        img.add(mSW);
 
                                        mImages.push_back(name);
@@ -1351,7 +1351,7 @@
                else if (ma->spec_shader == MA_SPEC_PHONG) {
                        ep.setShaderType(COLLADASW::EffectProfile::PHONG);
                        // shininess
-                       // XXX not sure about this
+                       // XXX not sure, stolen this from previous Collada 
plugin
                        ep.setShininess(ma->har / 4);
                }
                else {
@@ -1370,6 +1370,7 @@
                // emission
                COLLADASW::ColorOrTexture cot = getcol(0.0f, 0.0f, 0.0f, 1.0f);
                ep.setEmission(cot);
+               ep.setTransparent(cot);
                // diffuse 
                cot = getcol(ma->r, ma->g, ma->b, 1.0f);
                ep.setDiffuse(cot);
@@ -1478,6 +1479,9 @@
                        if (t->mapto & MAP_REF) {
                                ep.setReflective(createTexture(ima, uvname, 
sampler));
                        }
+                       if (t->mapto & MAP_ALPHA) {
+                               ep.setTransparent(createTexture(ima, uvname, 
sampler));
+                       }
                }
                // performs the actual writing
                ep.addProfileElements();
@@ -1622,11 +1626,11 @@
                        addLight(cla);
                }
                // spot
-               // XXX add other params later
                else if (la->type == LA_SPOT) {
                        COLLADASW::SpotLight cla(mSW, la_id, la_name, e);
                        cla.setColor(col);
                        cla.setFallOffAngle(la->spotsize);
+                       cla.setFallOffExponent(la->spotblend);
                        cla.setLinearAttenuation(la->att1);
                        cla.setQuadraticAttenuation(la->att2);
                        addLight(cla);

Modified: 
branches/soc-2009-chingachgook/source/blender/collada/DocumentImporter.cpp
===================================================================
--- branches/soc-2009-chingachgook/source/blender/collada/DocumentImporter.cpp  
2009-08-14 16:25:59 UTC (rev 22454)
+++ branches/soc-2009-chingachgook/source/blender/collada/DocumentImporter.cpp  
2009-08-14 17:12:04 UTC (rev 22455)
@@ -50,6 +50,7 @@
 #include "BKE_depsgraph.h"
 #include "BLI_util.h"
 #include "BKE_displist.h"
+#include "BLI_arithb.h"
 }
 #include "BKE_armature.h"
 #include "BKE_mesh.h"
@@ -160,13 +161,6 @@
 
 typedef std::map<COLLADAFW::TextureMapId, std::vector<MTex*> > 
TexIndexTextureArrayMap;
 
-// this is only for ArmatureImporter to "see" 
MeshImporter::get_object_by_geom_uid
-class MeshImporterBase
-{
-public:
-       virtual Object *get_object_by_geom_uid(const COLLADAFW::UniqueId& 
geom_uid) = 0;
-};
-
 class TransformReader : public TransformBase
 {
 protected:
@@ -255,6 +249,20 @@
        }
 };
 
+// only for ArmatureImporter to "see" MeshImporter::get_object_by_geom_uid
+class MeshImporterBase
+{
+public:
+       virtual Object *get_object_by_geom_uid(const COLLADAFW::UniqueId& 
geom_uid) = 0;
+};
+
+// ditto as above
+class AnimationImporterBase
+{
+public:
+       virtual void change_eul_to_quat(Object *ob, bAction *act) = 0;
+};
+
 class ArmatureImporter : private TransformReader
 {
 private:
@@ -291,6 +299,11 @@
        std::map<COLLADAFW::UniqueId, COLLADAFW::Node*> joint_by_uid; // 
contains all joints
        std::vector<COLLADAFW::Node*> root_joints;
 
+       std::vector<Object*> armature_objects;
+
+       MeshImporterBase *mesh_importer;
+       AnimationImporterBase *anim_importer;
+
        // This is used to store data passed in write_controller_data.
        // Arrays from COLLADAFW::SkinControllerData lose ownership, so do this 
class members
        // so that arrays don't get freed until we free them explicitly.
@@ -395,7 +408,7 @@
                }
 
                // called from write_controller
-               void create_armature(const COLLADAFW::SkinController* co, Scene 
*scene)
+               Object *create_armature(const COLLADAFW::SkinController* co, 
Scene *scene)
                {
                        ob_arm = add_object(scene, OB_ARMATURE);
 
@@ -412,6 +425,8 @@
                                // now we'll be able to get inv bind matrix 
from joint id
                                // joint_id_to_joint_index_map[joint_ids[i]] = 
i;
                        }
+
+                       return ob_arm;
                }
 
                bool get_joint_inv_bind_matrix(float inv_bind_mat[][4], 
COLLADAFW::Node *node)
@@ -528,8 +543,6 @@
        };
 
        std::map<COLLADAFW::UniqueId, SkinInfo> skin_by_data_uid; // data UID = 
skin controller data UID
-       MeshImporterBase *mesh_importer;
-
 #if 0
        JointData *get_joint_data(COLLADAFW::Node *node)
        {
@@ -809,8 +822,8 @@
 
 public:
 
-       ArmatureImporter(UnitConverter *conv, MeshImporterBase *imp, Scene 
*sce) :
-               TransformReader(conv), scene(sce), empty(NULL), 
mesh_importer(imp) {}
+       ArmatureImporter(UnitConverter *conv, MeshImporterBase *mesh, 
AnimationImporterBase *anim, Scene *sce) :
+               TransformReader(conv), scene(sce), empty(NULL), 
mesh_importer(mesh), anim_importer(anim) {}
 
        ~ArmatureImporter()
        {
@@ -936,7 +949,9 @@
                                return true;
                        }
 
-                       skin_by_data_uid[data_uid].create_armature(co, scene);
+                       Object *ob_arm = 
skin_by_data_uid[data_uid].create_armature(co, scene);
+
+                       armature_objects.push_back(ob_arm);
                }
                // morph controller
                else {
@@ -972,6 +987,17 @@
        {
                BLI_snprintf(joint_path, count, "pose.pose_channels[\"%s\"]", 
get_joint_name(node));
        }
+       
+       void fix_animation()
+       {
+               /* Change Euler rotation to Quaternion for bone animation */
+               std::vector<Object*>::iterator it;
+               for (it = armature_objects.begin(); it != 
armature_objects.end(); it++) {
+                       Object *ob = *it;
+                       if (!ob || !ob->adt || !ob->adt->action) continue;
+                       anim_importer->change_eul_to_quat(ob, ob->adt->action);
+               }
+       }
 };
 
 class MeshImporter : public MeshImporterBase
@@ -1506,7 +1532,7 @@
                if (texindex_texarray_map.find(texture_index) == 
texindex_texarray_map.end()) {
                        
                        fprintf(stderr, "Cannot find texture array by texture 
index.\n");
-                       return NULL;
+                       return color_texture;
                }
                
                std::vector<MTex*> textures = 
texindex_texarray_map[texture_index];
@@ -1555,15 +1581,14 @@
                                                                                
                                *color_texture);
                }
                
-               // if material has color texture
-               if (*color_texture && strlen((*color_texture)->uvname)) {
-                       // set tface
-                       if (strcmp(layername, (*color_texture)->uvname) != 0) {
-                               
-                               texture_face = 
(MTFace*)CustomData_get_layer_named(&me->fdata, CD_MTFACE,
-                                                                               
                                                   (*color_texture)->uvname);
-                               strcpy(layername, (*color_texture)->uvname);
-                       }
+               // set texture face
+               if (*color_texture &&
+                       strlen((*color_texture)->uvname) &&
+                       strcmp(layername, (*color_texture)->uvname) != 0) {
+                       
+                       texture_face = 
(MTFace*)CustomData_get_layer_named(&me->fdata, CD_MTFACE,
+                                                                               
                                           (*color_texture)->uvname);
+                       strcpy(layername, (*color_texture)->uvname);
                }
                
                MaterialIdPrimitiveArrayMap& mat_prim_map = 
geom_uid_mat_mapping_map[*geom_uid];
@@ -1582,7 +1607,7 @@
                                while (i++ < prim.totface) {
                                        prim.mface->mat_nr = mat_index;
                                        prim.mface++;
-                                       // bind image to tface
+                                       // bind texture images to faces
                                        if (texture_face && (*color_texture)) {
                                                texture_face->mode = TF_TEX;
                                                texture_face->tpage = 
(Image*)(*color_texture)->tex->ima;
@@ -1694,14 +1719,14 @@
                
                read_faces(mesh, me, new_tris);
                
-               //mesh_calc_normals(me->mvert, me->totvert, me->mface, 
me->totface, NULL);
+               mesh_calc_normals(me->mvert, me->totvert, me->mface, 
me->totface, NULL);
 
                return true;
        }
 
 };
 
-class AnimationImporter : private TransformReader
+class AnimationImporter : private TransformReader, public AnimationImporterBase
 {
 private:
 
@@ -1710,6 +1735,30 @@
 
        std::map<COLLADAFW::UniqueId, std::vector<FCurve*> > uid_fcurve_map;
        std::map<COLLADAFW::UniqueId, TransformReader::Animation> 
uid_animated_map;
+       std::map<bActionGroup*, std::vector<FCurve*> > fcurves_actionGroup_map;
+       
+       FCurve *create_fcurve(int array_index, char *rna_path)
+       {
+               FCurve *fcu = (FCurve*)MEM_callocN(sizeof(FCurve), "FCurve");
+               
+               fcu->flag = 
(FCURVE_VISIBLE|FCURVE_AUTO_HANDLES|FCURVE_SELECTED);
+               fcu->rna_path = BLI_strdupn(rna_path, strlen(rna_path));
+               fcu->array_index = array_index;
+               return fcu;
+       }
+       
+       void create_bezt(FCurve *fcu, float frame, float output)
+       {
+               BezTriple bez;
+               memset(&bez, 0, sizeof(BezTriple));
+               bez.vec[1][0] = frame;
+               bez.vec[1][1] = output;
+               bez.ipo = U.ipo_new; /* use default interpolation mode here... 
*/
+               bez.f1 = bez.f2 = bez.f3 = SELECT;
+               bez.h1 = bez.h2 = HD_AUTO;
+               insert_bezt_fcurve(fcu, &bez);
+               calchandles_fcurve(fcu);
+       }
 
        void make_fcurves_from_animation(COLLADAFW::AnimationCurve *curve,
                                                                         
COLLADAFW::FloatOrDoubleArray& input,
@@ -1728,7 +1777,7 @@
                        fcu->flag = 
(FCURVE_VISIBLE|FCURVE_AUTO_HANDLES|FCURVE_SELECTED);
                        // fcu->rna_path = BLI_strdupn(path, strlen(path));
                        fcu->array_index = 0;
-                       fcu->totvert = curve->getKeyCount();
+                       //fcu->totvert = curve->getKeyCount();
                        
                        // create beztriple for each key
                        for (i = 0; i < curve->getKeyCount(); i++) {
@@ -1761,7 +1810,7 @@
                                fcu->flag = 
(FCURVE_VISIBLE|FCURVE_AUTO_HANDLES|FCURVE_SELECTED);
                                // fcu->rna_path = BLI_strdupn(path, 
strlen(path));
                                fcu->array_index = 0;
-                               fcu->totvert = curve->getKeyCount();
+                               //fcu->totvert = curve->getKeyCount();
                                
                                // create beztriple for each key
                                for (int j = 0; j < curve->getKeyCount(); j++) {
@@ -1789,33 +1838,31 @@
                }
        }
        
-       void add_fcurves_to_object(Object *ob, std::vector<FCurve*>& curves, 
char *rna_path, int array_index)
+       void add_fcurves_to_object(Object *ob, std::vector<FCurve*>& curves, 
char *rna_path, int array_index, Animation *animated)
        {
                ID *id = &ob->id;
                bAction *act;
+               bActionGroup *grp = NULL;
+               
+               if (!ob->adt || !ob->adt->action) act = verify_adt_action(id, 
1);
+               else act = verify_adt_action(id, 0);
 
-               if (!ob->adt || !ob->adt->action)
-                       act = verify_adt_action(id, 1);
-               else 
-                       act = verify_adt_action(id, 0);
-
                if (!ob->adt || !ob->adt->action) {
                        fprintf(stderr, "Cannot create anim data or action for 
this object. \n");
                        return;
                }
-
+               

@@ Diff output truncated at 10240 characters. @@

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

Reply via email to