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:
-rw-r--r--source/gameengine/Converter/BL_BlenderDataConversion.cpp5
-rw-r--r--source/gameengine/Converter/BL_DeformableGameObject.h5
-rw-r--r--source/gameengine/Converter/BL_SkinDeformer.h16
-rw-r--r--source/gameengine/GameLogic/SCA_LogicManager.cpp31
-rw-r--r--source/gameengine/GameLogic/SCA_LogicManager.h11
-rw-r--r--source/gameengine/Ketsji/KX_GameObject.cpp3
-rw-r--r--source/gameengine/Ketsji/KX_GameObject.h2
-rw-r--r--source/gameengine/Ketsji/KX_Scene.cpp30
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();
}