Revision: 36968
          
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=36968
Author:   moguri
Date:     2011-05-28 07:15:27 +0000 (Sat, 28 May 2011)
Log Message:
-----------
BGE Animation:
  * Adding IPOs to BL_Action
  * Adding a "speed" option to adjust the playback speed by some factor

Modified Paths:
--------------
    
branches/soc-2011-pepper/source/gameengine/Converter/KX_BlenderScalarInterpolator.cpp
    
branches/soc-2011-pepper/source/gameengine/Converter/KX_BlenderScalarInterpolator.h
    branches/soc-2011-pepper/source/gameengine/Converter/KX_IpoConvert.cpp
    branches/soc-2011-pepper/source/gameengine/Converter/KX_IpoConvert.h
    branches/soc-2011-pepper/source/gameengine/Ketsji/BL_Action.cpp
    branches/soc-2011-pepper/source/gameengine/Ketsji/BL_Action.h
    branches/soc-2011-pepper/source/gameengine/Ketsji/BL_ActionManager.cpp
    branches/soc-2011-pepper/source/gameengine/Ketsji/BL_ActionManager.h
    branches/soc-2011-pepper/source/gameengine/Ketsji/KX_GameObject.cpp
    branches/soc-2011-pepper/source/gameengine/SceneGraph/SG_IObject.cpp
    branches/soc-2011-pepper/source/gameengine/SceneGraph/SG_IObject.h

Modified: 
branches/soc-2011-pepper/source/gameengine/Converter/KX_BlenderScalarInterpolator.cpp
===================================================================
--- 
branches/soc-2011-pepper/source/gameengine/Converter/KX_BlenderScalarInterpolator.cpp
       2011-05-28 06:18:05 UTC (rev 36967)
+++ 
branches/soc-2011-pepper/source/gameengine/Converter/KX_BlenderScalarInterpolator.cpp
       2011-05-28 07:15:27 UTC (rev 36968)
@@ -47,11 +47,11 @@
        return evaluate_fcurve(m_fcu, currentTime);
 }
 
-BL_InterpolatorList::BL_InterpolatorList(struct AnimData *adt) {
-       if(adt->action==NULL)
+BL_InterpolatorList::BL_InterpolatorList(bAction *action) {
+       if(action==NULL)
                return;
        
-       for(FCurve *fcu= (FCurve *)adt->action->curves.first; fcu; fcu= (FCurve 
*)fcu->next) {
+       for(FCurve *fcu= (FCurve *)action->curves.first; fcu; fcu= (FCurve 
*)fcu->next) {
                if(fcu->rna_path) {
                        BL_ScalarInterpolator *new_ipo = new 
BL_ScalarInterpolator(fcu); 
                        //assert(new_ipo);

Modified: 
branches/soc-2011-pepper/source/gameengine/Converter/KX_BlenderScalarInterpolator.h
===================================================================
--- 
branches/soc-2011-pepper/source/gameengine/Converter/KX_BlenderScalarInterpolator.h
 2011-05-28 06:18:05 UTC (rev 36967)
+++ 
branches/soc-2011-pepper/source/gameengine/Converter/KX_BlenderScalarInterpolator.h
 2011-05-28 07:15:27 UTC (rev 36968)
@@ -66,7 +66,7 @@
 
 class BL_InterpolatorList : public std::vector<KX_IScalarInterpolator *> {
 public:
-       BL_InterpolatorList(struct AnimData *adt);
+       BL_InterpolatorList(struct bAction *action);
        ~BL_InterpolatorList();
 
        KX_IScalarInterpolator *GetScalarInterpolator(const char *rna_path, int 
array_index);   

Modified: branches/soc-2011-pepper/source/gameengine/Converter/KX_IpoConvert.cpp
===================================================================
--- branches/soc-2011-pepper/source/gameengine/Converter/KX_IpoConvert.cpp      
2011-05-28 06:18:05 UTC (rev 36967)
+++ branches/soc-2011-pepper/source/gameengine/Converter/KX_IpoConvert.cpp      
2011-05-28 07:15:27 UTC (rev 36968)
@@ -54,6 +54,7 @@
 
 #include "DNA_object_types.h"
 #include "DNA_action_types.h"
+#include "DNA_anim_types.h"
 #include "DNA_ipo_types.h"
 #include "DNA_lamp_types.h"
 #include "DNA_world_types.h"
@@ -76,135 +77,136 @@
        BL_InterpolatorList *adtList= converter->FindInterpolatorList(for_adt);
 
        if (!adtList) {         
-               adtList = new BL_InterpolatorList(for_adt);
+               adtList = new BL_InterpolatorList(for_adt->action);
                converter->RegisterInterpolatorList(adtList, for_adt);
        }
                        
        return adtList; 
 }
 
-void BL_ConvertIpos(struct Object* blenderobject,KX_GameObject* 
gameobj,KX_BlenderSceneConverter *converter)
+SG_Controller *BL_CreateIPO(struct bAction *action, KX_GameObject* gameobj, 
KX_BlenderSceneConverter *converter)
 {
-       if (blenderobject->adt) {
+       KX_IpoSGController* ipocontr = new KX_IpoSGController();
+       ipocontr->SetGameObject(gameobj);
 
-               KX_IpoSGController* ipocontr = new KX_IpoSGController();
-               gameobj->GetSGNode()->AddSGController(ipocontr);
-               ipocontr->SetObject(gameobj->GetSGNode());
-               
-               // For ipo_as_force, we need to know which SM object and Scene 
the
-               // object associated with this ipo is in. Is this already known 
here?
-               // I think not.... then it must be done later :(
-//             ipocontr->SetSumoReference(gameobj->GetSumoScene(), 
-//                                                                
gameobj->GetSumoObject());
+       Object* blenderobject = gameobj->GetBlenderObject();
 
-               ipocontr->SetGameObject(gameobj);
+       ipocontr->GetIPOTransform().SetPosition(
+               MT_Point3(
+               blenderobject->loc[0]/*+blenderobject->dloc[0]*/,
+               blenderobject->loc[1]/*+blenderobject->dloc[1]*/,
+               blenderobject->loc[2]/*+blenderobject->dloc[2]*/
+               )
+       );
+       ipocontr->GetIPOTransform().SetEulerAngles(
+               MT_Vector3(
+               blenderobject->rot[0],
+               blenderobject->rot[1],
+               blenderobject->rot[2]
+               )
+       );
+       ipocontr->GetIPOTransform().SetScaling(
+               MT_Vector3(
+               blenderobject->size[0],
+               blenderobject->size[1],
+               blenderobject->size[2]
+               )
+       );
 
-               ipocontr->GetIPOTransform().SetPosition(
-                       MT_Point3(
-                       blenderobject->loc[0]/*+blenderobject->dloc[0]*/,
-                       blenderobject->loc[1]/*+blenderobject->dloc[1]*/,
-                       blenderobject->loc[2]/*+blenderobject->dloc[2]*/
-                       )
-               );
-               ipocontr->GetIPOTransform().SetEulerAngles(
-                       MT_Vector3(
-                       blenderobject->rot[0],
-                       blenderobject->rot[1],
-                       blenderobject->rot[2]
-                       )
-               );
-               ipocontr->GetIPOTransform().SetScaling(
-                       MT_Vector3(
-                       blenderobject->size[0],
-                       blenderobject->size[1],
-                       blenderobject->size[2]
-                       )
-               );
+       const char *rotmode, *drotmode;
 
-               const char *rotmode, *drotmode;
+       switch(blenderobject->rotmode)
+       {
+       case ROT_MODE_AXISANGLE:
+               rotmode = "rotation_axis_angle";
+               drotmode = "delta_rotation_axis_angle";
+       case ROT_MODE_QUAT:
+               rotmode = "rotation_quaternion";
+               drotmode = "delta_rotation_quaternion";
+       default:
+               rotmode = "rotation_euler";
+               drotmode = "delta_rotation_euler";
+       }
 
-               switch(blenderobject->rotmode)
-               {
-               case ROT_MODE_AXISANGLE:
-                       rotmode = "rotation_axis_angle";
-                       drotmode = "delta_rotation_axis_angle";
-               case ROT_MODE_QUAT:
-                       rotmode = "rotation_quaternion";
-                       drotmode = "delta_rotation_quaternion";
-               default:
-                       rotmode = "rotation_euler";
-                       drotmode = "delta_rotation_euler";
-               }
-
-               BL_InterpolatorList *adtList= GetAdtList(blenderobject->adt, 
converter);
+       BL_InterpolatorList *adtList= GetAdtList(blenderobject->adt, converter);
                
-               // For each active channel in the adtList add an
-               // interpolator to the game object.
+       // For each active channel in the adtList add an
+       // interpolator to the game object.
                
-               KX_IInterpolator *interpolator;
-               KX_IScalarInterpolator *interp;
+       KX_IInterpolator *interpolator;
+       KX_IScalarInterpolator *interp;
                
-               for(int i=0; i<3; i++) {
-                       if ((interp = 
adtList->GetScalarInterpolator("location", i))) {
-                               interpolator= new 
KX_ScalarInterpolator(&(ipocontr->GetIPOTransform().GetPosition()[i]), interp);
-                               ipocontr->AddInterpolator(interpolator);
-                               ipocontr->SetIPOChannelActive(OB_LOC_X+i, true);
-                       }
+       for(int i=0; i<3; i++) {
+               if ((interp = adtList->GetScalarInterpolator("location", i))) {
+                       interpolator= new 
KX_ScalarInterpolator(&(ipocontr->GetIPOTransform().GetPosition()[i]), interp);
+                       ipocontr->AddInterpolator(interpolator);
+                       ipocontr->SetIPOChannelActive(OB_LOC_X+i, true);
                }
-               for(int i=0; i<3; i++) {
-                       if ((interp = 
adtList->GetScalarInterpolator("delta_location", i))) {
-                               interpolator= new 
KX_ScalarInterpolator(&(ipocontr->GetIPOTransform().GetDeltaPosition()[i]), 
interp);
-                               ipocontr->AddInterpolator(interpolator);
-                               ipocontr->SetIPOChannelActive(OB_DLOC_X+i, 
true);
-                       }
+       }
+       for(int i=0; i<3; i++) {
+               if ((interp = adtList->GetScalarInterpolator("delta_location", 
i))) {
+                       interpolator= new 
KX_ScalarInterpolator(&(ipocontr->GetIPOTransform().GetDeltaPosition()[i]), 
interp);
+                       ipocontr->AddInterpolator(interpolator);
+                       ipocontr->SetIPOChannelActive(OB_DLOC_X+i, true);
                }
-               for(int i=0; i<3; i++) {
-                       if ((interp = adtList->GetScalarInterpolator(rotmode, 
i))) {
-                               interpolator= new 
KX_ScalarInterpolator(&(ipocontr->GetIPOTransform().GetEulerAngles()[i]), 
interp);
-                               ipocontr->AddInterpolator(interpolator);
-                               ipocontr->SetIPOChannelActive(OB_ROT_X+i, true);
-                       }
+       }
+       for(int i=0; i<3; i++) {
+               if ((interp = adtList->GetScalarInterpolator(rotmode, i))) {
+                       interpolator= new 
KX_ScalarInterpolator(&(ipocontr->GetIPOTransform().GetEulerAngles()[i]), 
interp);
+                       ipocontr->AddInterpolator(interpolator);
+                       ipocontr->SetIPOChannelActive(OB_ROT_X+i, true);
                }
-               for(int i=0; i<3; i++) {
-                       if ((interp = adtList->GetScalarInterpolator(drotmode, 
i))) {
-                               interpolator= new 
KX_ScalarInterpolator(&(ipocontr->GetIPOTransform().GetDeltaEulerAngles()[i]), 
interp);
-                               ipocontr->AddInterpolator(interpolator);
-                               ipocontr->SetIPOChannelActive(OB_DROT_X+i, 
true);
-                       }
+       }
+       for(int i=0; i<3; i++) {
+               if ((interp = adtList->GetScalarInterpolator(drotmode, i))) {
+                       interpolator= new 
KX_ScalarInterpolator(&(ipocontr->GetIPOTransform().GetDeltaEulerAngles()[i]), 
interp);
+                       ipocontr->AddInterpolator(interpolator);
+                       ipocontr->SetIPOChannelActive(OB_DROT_X+i, true);
                }
-               for(int i=0; i<3; i++) {
-                       if ((interp = adtList->GetScalarInterpolator("scale", 
i))) {
-                               interpolator= new 
KX_ScalarInterpolator(&(ipocontr->GetIPOTransform().GetScaling()[i]), interp);
-                               ipocontr->AddInterpolator(interpolator);
-                               ipocontr->SetIPOChannelActive(OB_SIZE_X+i, 
true);
-                       }
+       }
+       for(int i=0; i<3; i++) {
+               if ((interp = adtList->GetScalarInterpolator("scale", i))) {
+                       interpolator= new 
KX_ScalarInterpolator(&(ipocontr->GetIPOTransform().GetScaling()[i]), interp);
+                       ipocontr->AddInterpolator(interpolator);
+                       ipocontr->SetIPOChannelActive(OB_SIZE_X+i, true);
                }
-               for(int i=0; i<3; i++) {
-                       if ((interp = 
adtList->GetScalarInterpolator("delta_scale", i))) {
-                               interpolator= new 
KX_ScalarInterpolator(&(ipocontr->GetIPOTransform().GetDeltaScaling()[i]), 
interp);
-                               ipocontr->AddInterpolator(interpolator);
-                               ipocontr->SetIPOChannelActive(OB_DSIZE_X+i, 
true);
-                       }
+       }
+       for(int i=0; i<3; i++) {
+               if ((interp = adtList->GetScalarInterpolator("delta_scale", 
i))) {
+                       interpolator= new 
KX_ScalarInterpolator(&(ipocontr->GetIPOTransform().GetDeltaScaling()[i]), 
interp);
+                       ipocontr->AddInterpolator(interpolator);
+                       ipocontr->SetIPOChannelActive(OB_DSIZE_X+i, true);
                }
+       }
                
-               {
-                       KX_ObColorIpoSGController* ipocontr_obcol=NULL;
+       {
+               KX_ObColorIpoSGController* ipocontr_obcol=NULL;
                        
-                       for(int i=0; i<4; i++) {
-                               if ((interp = 
adtList->GetScalarInterpolator("color", i))) {
-                                       if (!ipocontr_obcol) {
-                                               ipocontr_obcol = new 
KX_ObColorIpoSGController();
-                                               
gameobj->GetSGNode()->AddSGController(ipocontr_obcol);
-                                               
ipocontr_obcol->SetObject(gameobj->GetSGNode());
-                                       }
-                                       interpolator= new 
KX_ScalarInterpolator(&ipocontr_obcol->m_rgba[i], interp);
-                                       
ipocontr_obcol->AddInterpolator(interpolator);
+               for(int i=0; i<4; i++) {
+                       if ((interp = adtList->GetScalarInterpolator("color", 
i))) {
+                               if (!ipocontr_obcol) {
+                                       ipocontr_obcol = new 
KX_ObColorIpoSGController();
+                                       
gameobj->GetSGNode()->AddSGController(ipocontr_obcol);
+                                       
ipocontr_obcol->SetObject(gameobj->GetSGNode());
                                }
+                               interpolator= new 
KX_ScalarInterpolator(&ipocontr_obcol->m_rgba[i], interp);
+                               ipocontr_obcol->AddInterpolator(interpolator);
                        }
                }
        }
+
+       return ipocontr;
 }
 

@@ 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