Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorErwin Coumans <blender@erwincoumans.com>2006-12-16 08:50:38 +0300
committerErwin Coumans <blender@erwincoumans.com>2006-12-16 08:50:38 +0300
commit92379ec21f78ba7a7f7354d3039ef300c0bb2cb4 (patch)
tree3fd43168fe1267d6d654cd5acddf812cda158c64 /source/gameengine/Converter
parent3c9a11f24ed9bd131e049e98e86aaee1bcaeb53a (diff)
contribution from RCRuiz:
drawing of rigidbody constraint pivots, and allow passing of full constraint frame.
Diffstat (limited to 'source/gameengine/Converter')
-rw-r--r--source/gameengine/Converter/BL_BlenderDataConversion.cpp111
-rw-r--r--source/gameengine/Converter/KX_BlenderSceneConverter.cpp98
-rw-r--r--source/gameengine/Converter/KX_BlenderSceneConverter.h5
3 files changed, 152 insertions, 62 deletions
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<MT_Vector3> 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;i<sumolist->GetCount();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;i<sumolist->GetCount();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;i<sumolist->GetCount();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;ix<parentList->GetCount();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();