From 92379ec21f78ba7a7f7354d3039ef300c0bb2cb4 Mon Sep 17 00:00:00 2001 From: Erwin Coumans Date: Sat, 16 Dec 2006 05:50:38 +0000 Subject: contribution from RCRuiz: drawing of rigidbody constraint pivots, and allow passing of full constraint frame. --- .../Converter/BL_BlenderDataConversion.cpp | 111 ++++++++++++++------- .../Converter/KX_BlenderSceneConverter.cpp | 98 +++++++++++++----- .../Converter/KX_BlenderSceneConverter.h | 5 +- 3 files changed, 152 insertions(+), 62 deletions(-) (limited to 'source/gameengine/Converter') diff --git a/source/gameengine/Converter/BL_BlenderDataConversion.cpp b/source/gameengine/Converter/BL_BlenderDataConversion.cpp index a496c60639f..8f4f692eab4 100644 --- a/source/gameengine/Converter/BL_BlenderDataConversion.cpp +++ b/source/gameengine/Converter/BL_BlenderDataConversion.cpp @@ -167,6 +167,18 @@ #include "BL_ArmatureObject.h" #include "BL_DeformableGameObject.h" +#ifdef __cplusplus +extern "C" { +#endif +#include "BSE_headerbuttons.h" +void update_for_newframe(); +//void scene_update_for_newframe(struct Scene *sce, unsigned int lay); +//#include "BKE_ipo.h" +//void do_all_data_ipos(void); +#ifdef __cplusplus +} +#endif + static int default_face_mode = TF_DYNAMIC; static unsigned int KX_rgbaint2uint_new(unsigned int icol) @@ -1618,7 +1630,7 @@ KX_GameObject* getGameOb(STR_String busc,CListValue* sumolist){ return 0; } - +#include "BLI_arithb.h" // convert blender objects into ketsji gameobjects void BL_ConvertBlenderObjects(struct Main* maggie, const STR_String& scenename, @@ -1642,6 +1654,7 @@ void BL_ConvertBlenderObjects(struct Main* maggie, RAS_FrameSettings::RAS_FrameType frame_type; int aspect_width; int aspect_height; + vector inivel,iniang; if (alwaysUseExpandFraming) { frame_type = RAS_FrameSettings::e_frame_extend; @@ -1720,6 +1733,10 @@ void BL_ConvertBlenderObjects(struct Main* maggie, if (gameobj) { + MT_Point3 posPrev; + MT_Matrix3x3 angor; + if (converter->addInitFromFrame) blenderscene->r.cfra=blenderscene->r.sfra; + MT_Point3 pos = MT_Point3( blenderobject->loc[0]+blenderobject->dloc[0], blenderobject->loc[1]+blenderobject->dloc[1], @@ -1735,7 +1752,26 @@ void BL_ConvertBlenderObjects(struct Main* maggie, blenderobject->size[1], blenderobject->size[2] ); - + if (converter->addInitFromFrame){//rcruiz + float eulxyzPrev[3]; + blenderscene->r.cfra=blenderscene->r.sfra-1; + update_for_newframe(); + MT_Vector3 tmp=pos-MT_Point3(blenderobject->loc[0]+blenderobject->dloc[0], + blenderobject->loc[1]+blenderobject->dloc[1], + blenderobject->loc[2]+blenderobject->dloc[2] + ); + eulxyzPrev[0]=blenderobject->rot[0]; + eulxyzPrev[1]=blenderobject->rot[1]; + eulxyzPrev[2]=blenderobject->rot[2]; + tmp.scale((float)blenderscene->r.frs_sec,(float)blenderscene->r.frs_sec,(float)blenderscene->r.frs_sec); + inivel.push_back(tmp); + tmp=eulxyz-eulxyzPrev; + tmp.scale((float)blenderscene->r.frs_sec,(float)blenderscene->r.frs_sec,(float)blenderscene->r.frs_sec); + iniang.push_back(tmp); + blenderscene->r.cfra=blenderscene->r.sfra; + update_for_newframe(); + } + gameobj->NodeSetLocalPosition(pos); gameobj->NodeSetLocalOrientation(MT_Matrix3x3(eulxyz)); gameobj->NodeSetLocalScale(scale); @@ -1759,7 +1795,7 @@ void BL_ConvertBlenderObjects(struct Main* maggie, templist->Add(gameobj->AddRef()); // update children/parent hierarchy - if (blenderobject->parent != 0) + if ((blenderobject->parent != 0)&&(!converter->addInitFromFrame)) { // blender has an additional 'parentinverse' offset in each object SG_Node* parentinversenode = new SG_Node(NULL,NULL,SG_Callbacks()); @@ -1790,12 +1826,15 @@ void BL_ConvertBlenderObjects(struct Main* maggie, logicmgr->RegisterGameMeshName(gameobj->GetMesh(i)->GetName(), blenderobject); converter->RegisterGameObject(gameobj, blenderobject); - // this was put in rapidly, needs to be looked at more closely // only draw/use objects in active 'blender' layers logicbrick_conversionlist->Add(gameobj->AddRef()); + if (converter->addInitFromFrame){ + posPrev=gameobj->NodeGetWorldPosition(); + angor=gameobj->NodeGetWorldOrientation(); + } if (isInActiveLayer) { objectlist->Add(gameobj->AddRef()); @@ -1805,7 +1844,11 @@ void BL_ConvertBlenderObjects(struct Main* maggie, gameobj->Bucketize(); } - + if (converter->addInitFromFrame){ + gameobj->NodeSetLocalPosition(posPrev); + gameobj->NodeSetLocalOrientation(angor); + } + } base = base->next; @@ -1928,6 +1971,20 @@ void BL_ConvertBlenderObjects(struct Main* maggie, } BL_CreatePhysicsObjectNew(gameobj,blenderobject,meshobj,kxscene,activeLayerBitInfo,physics_engine,converter,processCompoundChildren); } + + + //set ini linearVel and int angularVel //rcruiz + if (converter->addInitFromFrame) + for (i=0;iGetCount();i++) + { + KX_GameObject* gameobj = (KX_GameObject*) sumolist->GetValue(i); + if (gameobj->IsDynamic()){ + gameobj->setLinearVelocity(inivel[i],false); + gameobj->setAngularVelocity(iniang[i],false); + } + + + } // create physics joints for (i=0;iGetCount();i++) @@ -1956,8 +2013,19 @@ void BL_ConvertBlenderObjects(struct Main* maggie, if (gameobj->GetPhysicsController()) { PHY_IPhysicsController* physctrl = (PHY_IPhysicsController*) gameobj->GetPhysicsController()->GetUserData(); + //we need to pass a full constraint frame, not just axis - int constraintId = kxscene->GetPhysicsEnvironment()->createConstraint(physctrl,physctr2,(PHY_ConstraintType)dat->type,(float)dat->pivX,(float)dat->pivY,(float)dat->pivZ,(float)dat->axX,(float)dat->axY,(float)dat->axZ); + //localConstraintFrameBasis + MT_Matrix3x3 localCFrame(MT_Vector3(dat->axX,dat->axY,dat->axZ)); + MT_Vector3 axis0 = localCFrame.getColumn(0); + MT_Vector3 axis1 = localCFrame.getColumn(1); + MT_Vector3 axis2 = localCFrame.getColumn(2); + + int constraintId = kxscene->GetPhysicsEnvironment()->createConstraint(physctrl,physctr2,(PHY_ConstraintType)dat->type,(float)dat->pivX,(float)dat->pivY,(float)dat->pivZ, + (float)axis0.x(),(float)axis0.y(),(float)axis0.z(), + (float)axis1.x(),(float)axis1.y(),(float)axis1.z(), + (float)axis2.x(),(float)axis2.y(),(float)axis2.z() + ); //if it is a generic 6DOF constraint, set all the limits accordingly if (dat->type == PHY_GENERIC_6DOF_CONSTRAINT) { @@ -1984,40 +2052,9 @@ void BL_ConvertBlenderObjects(struct Main* maggie, } - //Intento de actualizar posicion - /*for (i=0;iGetCount();i++) - { - KX_GameObject* gameobj = (KX_GameObject*) sumolist->GetValue(i); - struct Object* blenderobject = converter->FindBlenderObject(gameobj); - - MT_Point3 pos = MT_Point3( - blenderobject->loc[0]+blenderobject->dloc[0], - blenderobject->loc[1]+blenderobject->dloc[1], - blenderobject->loc[2]+blenderobject->dloc[2] - ); - MT_Vector3 eulxyz = MT_Vector3( - blenderobject->rot[0], - blenderobject->rot[1], - blenderobject->rot[2] - ); - MT_Vector3 scale = MT_Vector3( - blenderobject->size[0], - blenderobject->size[1], - blenderobject->size[2] - ); - - gameobj->NodeSetLocalPosition(pos); - gameobj->NodeSetLocalOrientation(MT_Matrix3x3(eulxyz)); - gameobj->NodeSetLocalScale(scale); - gameobj->NodeUpdateGS(0,true); - }*/ - //rcruiz> - - templist->Release(); sumolist->Release(); - int executePriority=0; /* incremented by converter routines */ // convert global sound stuff diff --git a/source/gameengine/Converter/KX_BlenderSceneConverter.cpp b/source/gameengine/Converter/KX_BlenderSceneConverter.cpp index 10f3ea39616..75c0e54eb68 100644 --- a/source/gameengine/Converter/KX_BlenderSceneConverter.cpp +++ b/source/gameengine/Converter/KX_BlenderSceneConverter.cpp @@ -77,6 +77,8 @@ #include "DNA_world_types.h" #include "BKE_main.h" +#include "BLI_arithb.h" + extern "C" { #include "DNA_object_types.h" @@ -560,7 +562,8 @@ IpoCurve* findIpoCurve(IpoCurve* first,char* searchName) return 0; } -Ipo* KX_BlenderSceneConverter::findIpoForName(char* objName) +// this is not longer necesary //rcruiz +/*Ipo* KX_BlenderSceneConverter::findIpoForName(char* objName) { Ipo* ipo_iter = (Ipo*)m_maggie->ipo.first; @@ -574,7 +577,7 @@ Ipo* KX_BlenderSceneConverter::findIpoForName(char* objName) } return 0; } - +*/ void KX_BlenderSceneConverter::ResetPhysicsObjectsAnimationIpo(bool clearIpo) { @@ -600,29 +603,35 @@ void KX_BlenderSceneConverter::ResetPhysicsObjectsAnimationIpo(bool clearIpo) if (blenderObject) { //erase existing ipo's - Ipo* ipo = findIpoForName(blenderObject->id.name+2); + Ipo* ipo = blenderObject->ipo;//findIpoForName(blenderObject->id.name+2); if (ipo) - { - //clear the curve data - if (clearIpo){ - IpoCurve *icu1; - int numCurves = 0; - for( icu1 = (IpoCurve*)ipo->curve.first; icu1; ) { + { //clear the curve data + if (clearIpo){//rcruiz + IpoCurve *icu1; + + int numCurves = 0; + for( icu1 = (IpoCurve*)ipo->curve.first; icu1; ) { - IpoCurve* tmpicu = icu1; - icu1 = icu1->next; - numCurves++; + IpoCurve* tmpicu = icu1; + + /*int i; + BezTriple *bezt; + for( bezt = tmpicu->bezt, i = 0; i < tmpicu->totvert; i++, bezt++){ + printf("(%f,%f,%f),(%f,%f,%f),(%f,%f,%f)\n",bezt->vec[0][0],bezt->vec[0][1],bezt->vec[0][2],bezt->vec[1][0],bezt->vec[1][1],bezt->vec[1][2],bezt->vec[2][0],bezt->vec[2][1],bezt->vec[2][2]); + }*/ + + icu1 = icu1->next; + numCurves++; - BLI_remlink( &( blenderObject->ipo->curve ), tmpicu ); - if( tmpicu->bezt ) - MEM_freeN( tmpicu->bezt ); - MEM_freeN( tmpicu ); - localDel_ipoCurve( tmpicu ,m_sipo); - } - } + BLI_remlink( &( blenderObject->ipo->curve ), tmpicu ); + if( tmpicu->bezt ) + MEM_freeN( tmpicu->bezt ); + MEM_freeN( tmpicu ); + localDel_ipoCurve( tmpicu ,m_sipo); + } + } } else - { - ipo = add_ipo(blenderObject->id.name+2, ID_OB); + { ipo = add_ipo(blenderObject->id.name+2, ID_OB); blenderObject->ipo = ipo; } @@ -643,6 +652,48 @@ void KX_BlenderSceneConverter::ResetPhysicsObjectsAnimationIpo(bool clearIpo) } +void KX_BlenderSceneConverter::resetNoneDynamicObjectToIpo(){ + + if (addInitFromFrame){ + KX_SceneList* scenes = m_ketsjiEngine->CurrentScenes(); + int numScenes = scenes->size(); + if (numScenes>=0){ + KX_Scene* scene = scenes->at(0); + CListValue* parentList = scene->GetRootParentList(); + for (int ix=0;ixGetCount();ix++){ + KX_GameObject* gameobj = (KX_GameObject*)parentList->GetValue(ix); + if (!gameobj->IsDynamic()){ + Object* blenderobject = FindBlenderObject(gameobj); + if (!blenderobject) + continue; + if (blenderobject->type==OB_ARMATURE) + continue; + float eu[3]; + Mat4ToEul(blenderobject->obmat,eu); + MT_Point3 pos = MT_Point3( + blenderobject->obmat[3][0], + blenderobject->obmat[3][1], + blenderobject->obmat[3][2] + ); + MT_Vector3 eulxyz = MT_Vector3( + eu[0], + eu[1], + eu[2] + ); + MT_Vector3 scale = MT_Vector3( + blenderobject->size[0], + blenderobject->size[1], + blenderobject->size[2] + ); + gameobj->NodeSetLocalPosition(pos); + gameobj->NodeSetLocalOrientation(MT_Matrix3x3(eulxyz)); + gameobj->NodeSetLocalScale(scale); + gameobj->NodeUpdateGS(0,true); + } + } + } + } +} #define TEST_HANDLES_GAME2IPO 0 @@ -797,9 +848,8 @@ void KX_BlenderSceneConverter::WritePhysicsObjectToAnimationIpo(int frameNumber) } - } - - + } + } diff --git a/source/gameengine/Converter/KX_BlenderSceneConverter.h b/source/gameengine/Converter/KX_BlenderSceneConverter.h index c4447c53930..a897922d51b 100644 --- a/source/gameengine/Converter/KX_BlenderSceneConverter.h +++ b/source/gameengine/Converter/KX_BlenderSceneConverter.h @@ -76,7 +76,7 @@ class KX_BlenderSceneConverter : public KX_ISceneConverter bool m_usemat; void localDel_ipoCurve ( IpoCurve * icu ,struct SpaceIpo* sipo); - struct Ipo* findIpoForName(char* objName); +// struct Ipo* findIpoForName(char* objName); public: KX_BlenderSceneConverter( @@ -132,6 +132,9 @@ public: virtual void ResetPhysicsObjectsAnimationIpo(bool clearIpo); + ///this is for reseting the position,rotation and scale of the gameobjet that is not dynamic + virtual void resetNoneDynamicObjectToIpo(); + ///this generates ipo curves for position, rotation, allowing to use game physics in animation virtual void WritePhysicsObjectToAnimationIpo(int frameNumber); virtual void TestHandlesPhysicsObjectToAnimationIpo(); -- cgit v1.2.3