[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [21910] trunk/blender/source: ReplaceMesh Actuator option to replace the physics mesh and display mesh + python api options .

Campbell Barton ideasman42 at gmail.com
Sun Jul 26 03:32:38 CEST 2009


Revision: 21910
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=21910
Author:   campbellbarton
Date:     2009-07-26 03:32:37 +0200 (Sun, 26 Jul 2009)

Log Message:
-----------
ReplaceMesh Actuator option to replace the physics mesh and display mesh + python api options.

When the mesh field is left blank and Physics option is enabled, it reinstances the physics mesh from the existing mesh.
like calling gameOb.reinstancePhysicsMesh() from python.

Modified Paths:
--------------
    trunk/blender/source/blender/makesdna/DNA_actuator_types.h
    trunk/blender/source/blender/src/buttons_logic.c
    trunk/blender/source/gameengine/Converter/KX_ConvertActuators.cpp
    trunk/blender/source/gameengine/GameLogic/SCA_IScene.h
    trunk/blender/source/gameengine/Ketsji/KX_GameObject.cpp
    trunk/blender/source/gameengine/Ketsji/KX_GameObject.h
    trunk/blender/source/gameengine/Ketsji/KX_SCA_ReplaceMeshActuator.cpp
    trunk/blender/source/gameengine/Ketsji/KX_SCA_ReplaceMeshActuator.h
    trunk/blender/source/gameengine/Ketsji/KX_Scene.cpp
    trunk/blender/source/gameengine/Ketsji/KX_Scene.h
    trunk/blender/source/gameengine/PyDoc/GameTypes.py

Modified: trunk/blender/source/blender/makesdna/DNA_actuator_types.h
===================================================================
--- trunk/blender/source/blender/makesdna/DNA_actuator_types.h	2009-07-25 23:16:45 UTC (rev 21909)
+++ trunk/blender/source/blender/makesdna/DNA_actuator_types.h	2009-07-26 01:32:37 UTC (rev 21910)
@@ -405,6 +405,10 @@
 /* editObjectActuator->flag */
 #define ACT_TRACK_3D			1
 
+/* editObjectActuator->flag for replace mesh actuator */
+#define ACT_EDOB_REPLACE_MESH_NOGFX		2 /* use for replace mesh actuator */
+#define ACT_EDOB_REPLACE_MESH_PHYS		4
+
 /* SceneActuator->type */
 #define ACT_SCENE_RESTART		0
 #define ACT_SCENE_SET			1

Modified: trunk/blender/source/blender/src/buttons_logic.c
===================================================================
--- trunk/blender/source/blender/src/buttons_logic.c	2009-07-25 23:16:45 UTC (rev 21909)
+++ trunk/blender/source/blender/src/buttons_logic.c	2009-07-26 01:32:37 UTC (rev 21910)
@@ -2177,7 +2177,10 @@
 			glRects(xco, yco-ysize, xco+width, yco);
 			uiEmboss((float)xco, (float)yco-ysize, (float)xco+width, (float)yco, 1);
 	 
-			uiDefIDPoinBut(block, test_meshpoin_but, ID_ME, 1, "ME:",		xco+40, yco-44, (width-80), 19, &(eoa->me), "replace the existing mesh with this one");
+			uiDefIDPoinBut(block, test_meshpoin_but, ID_ME, 1, "ME:",		xco+40, yco-44, (width-80)/2, 19, &(eoa->me), "replace the existing, when left blank 'Phys' will remake the existing physics mesh");
+			
+			uiDefButBitS(block, TOGN, ACT_EDOB_REPLACE_MESH_NOGFX, B_NOP, "Gfx",	xco+40 + (width-80)/2, yco-44, (width-80)/4, 19, &eoa->flag, 0, 0, 0, 0, "Replace the display mesh");
+			uiDefButBitS(block, TOG, ACT_EDOB_REPLACE_MESH_PHYS, B_NOP, "Phys",	xco+40 + (width-80)/2 +(width-80)/4, yco-44, (width-80)/4, 19, &eoa->flag, 0, 0, 0, 0, "Replace the physics mesh (triangle bounds only. compound shapes not supported)");
 		}
 		else if(eoa->type==ACT_EDOB_TRACK_TO) {
 			ysize= 48;

Modified: trunk/blender/source/gameengine/Converter/KX_ConvertActuators.cpp
===================================================================
--- trunk/blender/source/gameengine/Converter/KX_ConvertActuators.cpp	2009-07-25 23:16:45 UTC (rev 21909)
+++ trunk/blender/source/gameengine/Converter/KX_ConvertActuators.cpp	2009-07-26 01:32:37 UTC (rev 21910)
@@ -638,7 +638,10 @@
 							= new KX_SCA_ReplaceMeshActuator(
 								gameobj,
 								tmpmesh,
-								scene
+								scene,
+								(editobact->flag & ACT_EDOB_REPLACE_MESH_NOGFX)==0,
+								(editobact->flag & ACT_EDOB_REPLACE_MESH_PHYS)!=0
+								
 								);
 							
 							baseact = tmpreplaceact;

Modified: trunk/blender/source/gameengine/GameLogic/SCA_IScene.h
===================================================================
--- trunk/blender/source/gameengine/GameLogic/SCA_IScene.h	2009-07-25 23:16:45 UTC (rev 21909)
+++ trunk/blender/source/gameengine/GameLogic/SCA_IScene.h	2009-07-26 01:32:37 UTC (rev 21910)
@@ -55,7 +55,7 @@
 	//virtual void	DelayedReleaseObject(class CValue* gameobj)=0;
 	
 	virtual void	ReplaceMesh(class CValue* gameobj,
-								void* meshobj)=0;
+								void* meshobj, bool use_gfx, bool use_phys)=0;
 	std::vector<SCA_DebugProp*>& GetDebugProperties();
 	void			AddDebugProperty(class CValue* debugprop,
 									 const STR_String &name);

Modified: trunk/blender/source/gameengine/Ketsji/KX_GameObject.cpp
===================================================================
--- trunk/blender/source/gameengine/Ketsji/KX_GameObject.cpp	2009-07-25 23:16:45 UTC (rev 21909)
+++ trunk/blender/source/gameengine/Ketsji/KX_GameObject.cpp	2009-07-26 01:32:37 UTC (rev 21910)
@@ -1182,7 +1182,7 @@
 	{"getChildrenRecursive", (PyCFunction)KX_GameObject::sPyGetChildrenRecursive,METH_NOARGS},
 	{"getPhysicsId", (PyCFunction)KX_GameObject::sPyGetPhysicsId,METH_NOARGS},
 	{"getPropertyNames", (PyCFunction)KX_GameObject::sPyGetPropertyNames,METH_NOARGS},
-	{"replaceMesh",(PyCFunction) KX_GameObject::sPyReplaceMesh, METH_O},
+	{"replaceMesh",(PyCFunction) KX_GameObject::sPyReplaceMesh, METH_VARARGS},
 	{"endObject",(PyCFunction) KX_GameObject::sPyEndObject, METH_NOARGS},
 	{"reinstancePhysicsMesh", (PyCFunction)KX_GameObject::sPyReinstancePhysicsMesh,METH_VARARGS},
 	
@@ -1260,15 +1260,21 @@
 }
 */
 
-PyObject* KX_GameObject::PyReplaceMesh(PyObject* value)
+PyObject* KX_GameObject::PyReplaceMesh(PyObject* args)
 {
 	KX_Scene *scene = KX_GetActiveScene();
-	RAS_MeshObject* new_mesh;
 	
+	PyObject *value;
+	int use_gfx= 1, use_phys= 0;
+	RAS_MeshObject *new_mesh;
+	
+	if (!PyArg_ParseTuple(args,"O|ii:replaceMesh", &value, &use_gfx, &use_phys))
+		return NULL;
+	
 	if (!ConvertPythonToMesh(value, &new_mesh, false, "gameOb.replaceMesh(value): KX_GameObject"))
 		return NULL;
 	
-	scene->ReplaceMesh(this, new_mesh);
+	scene->ReplaceMesh(this, new_mesh, (bool)use_gfx, (bool)use_phys);
 	Py_RETURN_NONE;
 }
 

Modified: trunk/blender/source/gameengine/Ketsji/KX_GameObject.h
===================================================================
--- trunk/blender/source/gameengine/Ketsji/KX_GameObject.h	2009-07-25 23:16:45 UTC (rev 21909)
+++ trunk/blender/source/gameengine/Ketsji/KX_GameObject.h	2009-07-26 01:32:37 UTC (rev 21910)
@@ -865,7 +865,7 @@
 	KX_PYMETHOD_VARARGS(KX_GameObject,GetMesh);
 	KX_PYMETHOD_NOARGS(KX_GameObject,GetPhysicsId);
 	KX_PYMETHOD_NOARGS(KX_GameObject,GetPropertyNames);
-	KX_PYMETHOD_O(KX_GameObject,ReplaceMesh);
+	KX_PYMETHOD_VARARGS(KX_GameObject,ReplaceMesh);
 	KX_PYMETHOD_NOARGS(KX_GameObject,EndObject);
 	KX_PYMETHOD_DOC(KX_GameObject,rayCastTo);
 	KX_PYMETHOD_DOC(KX_GameObject,rayCast);

Modified: trunk/blender/source/gameengine/Ketsji/KX_SCA_ReplaceMeshActuator.cpp
===================================================================
--- trunk/blender/source/gameengine/Ketsji/KX_SCA_ReplaceMeshActuator.cpp	2009-07-25 23:16:45 UTC (rev 21909)
+++ trunk/blender/source/gameengine/Ketsji/KX_SCA_ReplaceMeshActuator.cpp	2009-07-26 01:32:37 UTC (rev 21910)
@@ -96,6 +96,8 @@
 
 PyAttributeDef KX_SCA_ReplaceMeshActuator::Attributes[] = {
 	KX_PYATTRIBUTE_RW_FUNCTION("mesh", KX_SCA_ReplaceMeshActuator, pyattr_get_mesh, pyattr_set_mesh),
+	KX_PYATTRIBUTE_BOOL_RW    ("useDisplayMesh", KX_SCA_ReplaceMeshActuator, m_use_gfx),
+	KX_PYATTRIBUTE_BOOL_RW    ("usePhysicsMesh", KX_SCA_ReplaceMeshActuator, m_use_phys),
 	{ NULL }	//Sentinel
 };
 
@@ -179,11 +181,15 @@
 KX_SCA_ReplaceMeshActuator::KX_SCA_ReplaceMeshActuator(SCA_IObject *gameobj,
 													   class RAS_MeshObject *mesh,
 													   SCA_IScene* scene,
+													   bool use_gfx,
+													   bool use_phys,
 													   PyTypeObject* T) : 
 
 	SCA_IActuator(gameobj, T),
 	m_mesh(mesh),
-	m_scene(scene)
+	m_scene(scene),
+	m_use_gfx(use_gfx),
+	m_use_phys(use_phys)
 {
 } /* End of constructor */
 
@@ -205,7 +211,8 @@
 	if (bNegativeEvent)
 		return false; // do nothing on negative events
 
-	if (m_mesh) m_scene->ReplaceMesh(GetParent(),m_mesh);
+	if (m_mesh || m_use_phys) /* NULL mesh is ok if were updating physics */
+		m_scene->ReplaceMesh(GetParent(),m_mesh, m_use_gfx, m_use_phys);
 
 	return false;
 }
@@ -227,7 +234,7 @@
 
 void KX_SCA_ReplaceMeshActuator::InstantReplaceMesh()
 {
-	if (m_mesh) m_scene->ReplaceMesh(GetParent(),m_mesh);
+	if (m_mesh) m_scene->ReplaceMesh(GetParent(),m_mesh, m_use_gfx, m_use_phys);
 }
 
 /* eof */

Modified: trunk/blender/source/gameengine/Ketsji/KX_SCA_ReplaceMeshActuator.h
===================================================================
--- trunk/blender/source/gameengine/Ketsji/KX_SCA_ReplaceMeshActuator.h	2009-07-25 23:16:45 UTC (rev 21909)
+++ trunk/blender/source/gameengine/Ketsji/KX_SCA_ReplaceMeshActuator.h	2009-07-26 01:32:37 UTC (rev 21910)
@@ -50,12 +50,16 @@
 	// mesh reference (mesh to replace)
 	RAS_MeshObject* m_mesh;
 	SCA_IScene*	 m_scene;
+	bool m_use_phys;
+	bool m_use_gfx; 
 
  public:
 	KX_SCA_ReplaceMeshActuator(
 		SCA_IObject* gameobj, 
 		RAS_MeshObject *mesh, 
 		SCA_IScene* scene,
+		bool use_gfx,
+		bool use_phys,
 		PyTypeObject* T=&Type
 	);
 

Modified: trunk/blender/source/gameengine/Ketsji/KX_Scene.cpp
===================================================================
--- trunk/blender/source/gameengine/Ketsji/KX_Scene.cpp	2009-07-25 23:16:45 UTC (rev 21909)
+++ trunk/blender/source/gameengine/Ketsji/KX_Scene.cpp	2009-07-26 01:32:37 UTC (rev 21910)
@@ -1017,92 +1017,119 @@
 
 
 
-void KX_Scene::ReplaceMesh(class CValue* obj,void* meshobj)
+void KX_Scene::ReplaceMesh(class CValue* obj,void* meshobj, bool use_gfx, bool use_phys)
 {
 	KX_GameObject* gameobj = static_cast<KX_GameObject*>(obj);
 	RAS_MeshObject* mesh = static_cast<RAS_MeshObject*>(meshobj);
 
-	if(!gameobj || !mesh)
-	{
-		std::cout << "warning: invalid object, mesh will not be replaced" << std::endl;
+	if(!gameobj) {
+		std::cout << "KX_Scene::ReplaceMesh Warning: invalid object, doing nothing" << std::endl;
 		return;
 	}
-
-	gameobj->RemoveMeshes();
-	gameobj->AddMesh(mesh);
 	
-	if (gameobj->m_isDeformable)
-	{
-		BL_DeformableGameObject* newobj = static_cast<BL_DeformableGameObject*>( gameobj );
+	if(use_gfx && mesh != NULL)
+	{		
+		gameobj->RemoveMeshes();
+		gameobj->AddMesh(mesh);
 		
-		if (newobj->GetDeformer())
+		if (gameobj->m_isDeformable)
 		{
-			delete newobj->GetDeformer();
-			newobj->SetDeformer(NULL);
-		}
-
-		if (mesh->IsDeformed())
-		{
-			// we must create a new deformer but which one?
-			KX_GameObject* parentobj = newobj->GetParent();
-			// this always return the original game object (also for replicate)
-			Object* blendobj = newobj->GetBlenderObject();
-			// object that owns the new mesh
-			Object* oldblendobj = static_cast<struct Object*>(m_logicmgr->FindBlendObjByGameMeshName(mesh->GetName()));
-			Mesh* blendmesh = mesh->GetMesh();
-
-			bool bHasModifier = BL_ModifierDeformer::HasCompatibleDeformer(blendobj);
-			bool bHasShapeKey = blendmesh->key != NULL && blendmesh->key->type==KEY_RELATIVE;
-			bool bHasDvert = blendmesh->dvert != NULL;
-			bool bHasArmature = 
-				parentobj &&								// current parent is armature
-				parentobj->GetGameObjectType() == SCA_IObject::OBJ_ARMATURE &&
-				oldblendobj &&								// needed for mesh deform
-				blendobj->parent &&							// original object had armature (not sure this test is needed)
-				blendobj->parent->type == OB_ARMATURE && 
-				blendobj->partype==PARSKEL && 
-				blendmesh->dvert!=NULL;						// mesh has vertex group
-			bool releaseParent = true;
-

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list