diff options
-rw-r--r-- | source/gameengine/Converter/BL_BlenderDataConversion.cpp | 5 | ||||
-rw-r--r-- | source/gameengine/Converter/BL_DeformableGameObject.h | 5 | ||||
-rw-r--r-- | source/gameengine/Converter/BL_SkinDeformer.h | 16 | ||||
-rw-r--r-- | source/gameengine/GameLogic/SCA_LogicManager.cpp | 31 | ||||
-rw-r--r-- | source/gameengine/GameLogic/SCA_LogicManager.h | 11 | ||||
-rw-r--r-- | source/gameengine/Ketsji/KX_GameObject.cpp | 3 | ||||
-rw-r--r-- | source/gameengine/Ketsji/KX_GameObject.h | 2 | ||||
-rw-r--r-- | source/gameengine/Ketsji/KX_Scene.cpp | 30 |
8 files changed, 98 insertions, 5 deletions
diff --git a/source/gameengine/Converter/BL_BlenderDataConversion.cpp b/source/gameengine/Converter/BL_BlenderDataConversion.cpp index d3b994eda91..8295600b6cf 100644 --- a/source/gameengine/Converter/BL_BlenderDataConversion.cpp +++ b/source/gameengine/Converter/BL_BlenderDataConversion.cpp @@ -1170,6 +1170,11 @@ void BL_ConvertBlenderObjects(struct Main* maggie, // needed for python scripting logicmgr->RegisterGameObjectName(gameobj->GetName(),gameobj); + + // needed for dynamic object morphing + logicmgr->RegisterGameObj(gameobj, blenderobject); + for (int i = 0; i < gameobj->GetMeshCount(); i++) + logicmgr->RegisterGameMeshName(gameobj->GetMesh(i)->GetName(), blenderobject); converter->RegisterGameObject(gameobj, blenderobject); diff --git a/source/gameengine/Converter/BL_DeformableGameObject.h b/source/gameengine/Converter/BL_DeformableGameObject.h index 1f05d2fcbcc..720a152575a 100644 --- a/source/gameengine/Converter/BL_DeformableGameObject.h +++ b/source/gameengine/Converter/BL_DeformableGameObject.h @@ -56,8 +56,9 @@ public: BL_DeformableGameObject(void* sgReplicationInfo, SG_Callbacks callbacks) : KX_GameObject(sgReplicationInfo,callbacks), m_pDeformer(NULL) -{ - }; + { + m_isDeformable = true; + }; virtual ~BL_DeformableGameObject(); }; diff --git a/source/gameengine/Converter/BL_SkinDeformer.h b/source/gameengine/Converter/BL_SkinDeformer.h index 255537e5b7a..416266fef9c 100644 --- a/source/gameengine/Converter/BL_SkinDeformer.h +++ b/source/gameengine/Converter/BL_SkinDeformer.h @@ -79,7 +79,21 @@ public: for (bDeformGroup *dg=(bDeformGroup*)m_defbase->first; dg; dg=(bDeformGroup*)dg->next) dg->data = (void*)get_named_bone(barm, dg->name); */ - }; + }; + + /* this second constructor is needed for making a mesh deformable on the fly. */ + + BL_SkinDeformer( struct Object *bmeshobj_old, + struct Object *bmeshobj_new, + class BL_SkinMeshObject *mesh) + :BL_MeshDeformer(bmeshobj_old, mesh), + m_armobj(NULL), + m_lastUpdate(-1), + m_defbase(&bmeshobj_old->defbase) + { + GB_build_mats(bmeshobj_new->parent->obmat, bmeshobj_new->obmat, m_premat, m_postmat); + GB_validate_defgroups((Mesh*)bmeshobj_old->data, m_defbase); + }; virtual void ProcessReplica(); virtual RAS_Deformer *GetReplica(); diff --git a/source/gameengine/GameLogic/SCA_LogicManager.cpp b/source/gameengine/GameLogic/SCA_LogicManager.cpp index 483a3c59a26..262f458abb2 100644 --- a/source/gameengine/GameLogic/SCA_LogicManager.cpp +++ b/source/gameengine/GameLogic/SCA_LogicManager.cpp @@ -116,6 +116,21 @@ void SCA_LogicManager::RegisterGameObjectName(const STR_String& gameobjname, +void SCA_LogicManager::RegisterGameMeshName(const STR_String& gamemeshname, void* blendobj) +{ + STR_HashedString mn = gamemeshname; + m_map_gamemeshname_to_blendobj.insert(mn, blendobj); +} + + + +void SCA_LogicManager::RegisterGameObj(CValue* gameobj, void* blendobj) +{ + m_map_gameobj_to_blendobj.insert(CHashedPtr(gameobj), blendobj); +} + + + CValue* SCA_LogicManager::GetGameObjectByName(const STR_String& gameobjname) { STR_HashedString mn = "OB"+gameobjname; @@ -128,6 +143,22 @@ CValue* SCA_LogicManager::GetGameObjectByName(const STR_String& gameobjname) } +void* SCA_LogicManager::FindBlendObjByGameObj(CValue* gameobject) +{ + void **obp= m_map_gameobj_to_blendobj[CHashedPtr(gameobject)]; + return obp?*obp:NULL; +} + + + +void* SCA_LogicManager::FindBlendObjByGameMeshName(const STR_String& gamemeshname) +{ + STR_HashedString mn = gamemeshname; + void **obp= m_map_gamemeshname_to_blendobj[mn]; + return obp?*obp:NULL; +} + + void SCA_LogicManager::RemoveSensor(SCA_ISensor* sensor) { diff --git a/source/gameengine/GameLogic/SCA_LogicManager.h b/source/gameengine/GameLogic/SCA_LogicManager.h index 7af1190f03b..6e1ddd652cb 100644 --- a/source/gameengine/GameLogic/SCA_LogicManager.h +++ b/source/gameengine/GameLogic/SCA_LogicManager.h @@ -47,6 +47,8 @@ #include "STR_HashedString.h" #include "Value.h" +#include "KX_HashedPtr.h" + using namespace std; typedef list<class SCA_IController*> controllerlist; @@ -111,6 +113,9 @@ class SCA_LogicManager GEN_Map<STR_HashedString,void*> m_mapStringToMeshes; GEN_Map<STR_HashedString,void*> m_mapStringToActions; + GEN_Map<STR_HashedString,void*> m_map_gamemeshname_to_blendobj; + GEN_Map<CHashedPtr,void*> m_map_gameobj_to_blendobj; + vector<SmartActuatorPtr> m_removedActuators; public: @@ -149,6 +154,12 @@ public: void RegisterGameObjectName(const STR_String& gameobjname,CValue* gameobj); class CValue* GetGameObjectByName(const STR_String& gameobjname); + + void RegisterGameMeshName(const STR_String& gamemeshname, void* blendobj); + void* FindBlendObjByGameMeshName(const STR_String& gamemeshname); + + void RegisterGameObj(CValue* gameobj, void* blendobj); + void* FindBlendObjByGameObj(CValue* gameobj); }; #endif //__KX_LOGICMANAGER diff --git a/source/gameengine/Ketsji/KX_GameObject.cpp b/source/gameengine/Ketsji/KX_GameObject.cpp index c89bf33b21c..6e2c8a3d5d7 100644 --- a/source/gameengine/Ketsji/KX_GameObject.cpp +++ b/source/gameengine/Ketsji/KX_GameObject.cpp @@ -72,7 +72,8 @@ KX_GameObject::KX_GameObject( m_bSuspendDynamics(false), m_bUseObjectColor(false), m_bVisible(true), - m_pPhysicsController1(NULL) + m_pPhysicsController1(NULL), + m_isDeformable(false) { m_ignore_activity_culling = false; m_pClient_info = new KX_ClientObjectInfo(this, KX_ClientObjectInfo::ACTOR); diff --git a/source/gameengine/Ketsji/KX_GameObject.h b/source/gameengine/Ketsji/KX_GameObject.h index c84d905da8b..fa116795ef4 100644 --- a/source/gameengine/Ketsji/KX_GameObject.h +++ b/source/gameengine/Ketsji/KX_GameObject.h @@ -87,6 +87,8 @@ protected: MT_CmMatrix4x4 m_OpenGL_4x4Matrix; public: + bool m_isDeformable; + virtual void /* This function should be virtual - derived classed override it */ Relink( GEN_Map<GEN_HashedPtr, void*> *map diff --git a/source/gameengine/Ketsji/KX_Scene.cpp b/source/gameengine/Ketsji/KX_Scene.cpp index eb3f8821b62..67c056650bb 100644 --- a/source/gameengine/Ketsji/KX_Scene.cpp +++ b/source/gameengine/Ketsji/KX_Scene.cpp @@ -73,6 +73,9 @@ #include "PHY_IPhysicsEnvironment.h" #include "KX_IPhysicsController.h" +#include "BL_SkinDeformer.h" +#include "BL_DeformableGameObject.h" + void* KX_SceneReplicationFunc(SG_IObject* node,void* gameobj,void* scene) { @@ -719,8 +722,33 @@ void KX_Scene::NewRemoveObject(class CValue* gameobj) void KX_Scene::ReplaceMesh(class CValue* gameobj,void* meshobj) { KX_GameObject* newobj = (KX_GameObject*) gameobj; + RAS_MeshObject* mesh = (RAS_MeshObject*) meshobj; + newobj->RemoveMeshes(); - newobj->AddMesh((RAS_MeshObject*)meshobj); + newobj->AddMesh(mesh); + + if (newobj->m_isDeformable && mesh->m_class == 1) { + Object* blendobj = (struct Object*)m_logicmgr->FindBlendObjByGameObj(newobj); + Object* oldblendobj = (struct Object*)m_logicmgr->FindBlendObjByGameMeshName(mesh->GetName()); + if (blendobj->parent && blendobj->parent->type == OB_ARMATURE && blendobj->partype==PARSKEL && ((Mesh*)blendobj->data)->dvert) { + BL_SkinDeformer* skindeformer = new BL_SkinDeformer(oldblendobj, blendobj, (BL_SkinMeshObject*)mesh); + skindeformer->SetArmature((BL_ArmatureObject*) newobj->GetParent()); + + // FIXME: should the old m_pDeformer be deleted? + // delete ((BL_DeformableGameObject*)newobj)->m_pDeformer + + ((BL_DeformableGameObject*)newobj)->m_pDeformer = skindeformer; + } + else if (((Mesh*)blendobj->data)->dvert) { + BL_MeshDeformer* meshdeformer = new BL_MeshDeformer(oldblendobj, (BL_SkinMeshObject*)mesh); + + // FIXME: should the old m_pDeformer be deleted? + // delete ((BL_DeformableGameObject*)newobj)->m_pDeformer + + ((BL_DeformableGameObject*)newobj)->m_pDeformer = meshdeformer; + } + } + newobj->Bucketize(); } |