[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [18510] trunk/blender/source: BGE patch 18065: gameobj mass writeable + setmass actuator.

Benoit Bolsee benoit.bolsee at online.be
Wed Jan 14 23:33:39 CET 2009


Revision: 18510
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=18510
Author:   ben2610
Date:     2009-01-14 23:33:39 +0100 (Wed, 14 Jan 2009)

Log Message:
-----------
BGE patch 18065: gameobj mass writeable + setmass actuator. This patch allows to change the mass of a dynamic or rigid body object during the game. Two methods are available: in a Python script by setting the mass attribute of the game object; by logic brick with the Edit Object->Dynamics->Set Mass actuator. The mass can only be set on dynamic objects and must be a positive floating point value.

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/Ketsji/KX_BulletPhysicsController.cpp
    trunk/blender/source/gameengine/Ketsji/KX_BulletPhysicsController.h
    trunk/blender/source/gameengine/Ketsji/KX_GameObject.cpp
    trunk/blender/source/gameengine/Ketsji/KX_IPhysicsController.h
    trunk/blender/source/gameengine/Ketsji/KX_SCA_DynamicActuator.cpp
    trunk/blender/source/gameengine/Ketsji/KX_SCA_DynamicActuator.h
    trunk/blender/source/gameengine/Ketsji/KX_SumoPhysicsController.cpp
    trunk/blender/source/gameengine/Ketsji/KX_SumoPhysicsController.h
    trunk/blender/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp

Modified: trunk/blender/source/blender/makesdna/DNA_actuator_types.h
===================================================================
--- trunk/blender/source/blender/makesdna/DNA_actuator_types.h	2009-01-14 19:26:11 UTC (rev 18509)
+++ trunk/blender/source/blender/makesdna/DNA_actuator_types.h	2009-01-14 22:33:39 UTC (rev 18510)
@@ -82,7 +82,7 @@
 	char name[32];
 	float linVelocity[3]; /* initial lin. velocity on creation */
 	float angVelocity[3]; /* initial ang. velocity on creation */
-	float pad;
+	float mass;
 	short localflag; /* flag for the lin & ang. vel: apply locally   */
 	short dyn_operation;
 } bEditObjectActuator;

Modified: trunk/blender/source/blender/src/buttons_logic.c
===================================================================
--- trunk/blender/source/blender/src/buttons_logic.c	2009-01-14 19:26:11 UTC (rev 18509)
+++ trunk/blender/source/blender/src/buttons_logic.c	2009-01-14 22:33:39 UTC (rev 18510)
@@ -2136,12 +2136,17 @@
 			uiDefButS(block, TOG, 0, "3D",	xco+width-50, yco-44, 40, 19, &eoa->flag, 0.0, 0.0, 0, 0, "Enable 3D tracking");
 		}
 		else if(eoa->type==ACT_EDOB_DYNAMICS) {
-			ysize= 48;
+			ysize= 69;
 			glRects(xco, yco-ysize, xco+width, yco);
 			uiEmboss((float)xco, (float)yco-ysize, (float)xco+width, (float)yco, 1);
 			
-			str= "Dynamic Operation %t|Restore Dynamics %x0|Suspend Dynamics %x1|Enable Rigid Body %x2|Disable Rigid Body %x3";
+			str= "Dynamic Operation %t|Restore Dynamics %x0|Suspend Dynamics %x1|Enable Rigid Body %x2|Disable Rigid Body %x3|Set Mass %x4";
 			uiDefButS(block, MENU, B_REDR, str,		xco+40, yco-44, (width-80), 19,  &(eoa->dyn_operation), 0.0, 0.0, 0, 0, "");
+			if(eoa->dyn_operation==4) {
+				uiDefButF(block, NUM, 0, "",		xco+40, yco-63, width-80, 19,
+					 &eoa->mass, 0.0, 10000.0, 10, 0,
+					 "Mass for object.");
+			}
 		}
 		str= "Edit Object %t|Add Object %x0|End Object %x1|Replace Mesh %x2|Track to %x3|Dynamics %x4";
 		uiDefButS(block, MENU, B_REDR, str,		xco+40, yco-24, (width-80), 19, &eoa->type, 0.0, 0.0, 0, 0, "");

Modified: trunk/blender/source/gameengine/Converter/KX_ConvertActuators.cpp
===================================================================
--- trunk/blender/source/gameengine/Converter/KX_ConvertActuators.cpp	2009-01-14 19:26:11 UTC (rev 18509)
+++ trunk/blender/source/gameengine/Converter/KX_ConvertActuators.cpp	2009-01-14 22:33:39 UTC (rev 18510)
@@ -661,7 +661,8 @@
 					{
 						KX_SCA_DynamicActuator* tmpdynact 
 							= new KX_SCA_DynamicActuator(gameobj, 
-								editobact->dyn_operation
+								editobact->dyn_operation,
+								editobact->mass
 								);
 							baseact = tmpdynact;
 					}

Modified: trunk/blender/source/gameengine/Ketsji/KX_BulletPhysicsController.cpp
===================================================================
--- trunk/blender/source/gameengine/Ketsji/KX_BulletPhysicsController.cpp	2009-01-14 19:26:11 UTC (rev 18509)
+++ trunk/blender/source/gameengine/Ketsji/KX_BulletPhysicsController.cpp	2009-01-14 22:33:39 UTC (rev 18510)
@@ -303,6 +303,25 @@
 	GetPhysicsEnvironment()->enableCcdPhysicsController(childCtrl);
 }
 
+void KX_BulletPhysicsController::SetMass(MT_Scalar newmass)
+{
+	btRigidBody *body = GetRigidBody();
+	if (body && body->getActivationState() != DISABLE_SIMULATION && 
+		newmass>MT_EPSILON && GetMass()>MT_EPSILON)
+	{
+		btVector3 grav = body->getGravity();
+		btVector3 accel = grav / GetMass();
+		
+		btBroadphaseProxy* handle = body->getBroadphaseHandle();
+		GetPhysicsEnvironment()->updateCcdPhysicsController(this, 
+			newmass,
+			body->getCollisionFlags(),
+			handle->m_collisionFilterGroup, 
+			handle->m_collisionFilterMask);
+		body->setGravity(accel);
+	}
+}
+
 void	KX_BulletPhysicsController::SuspendDynamics(bool ghost)
 {
 	btRigidBody *body = GetRigidBody();
@@ -333,7 +352,7 @@
 			m_savedCollisionFlags,
 			m_savedCollisionFilterGroup,
 			m_savedCollisionFilterMask);
-		GetRigidBody()->forceActivationState(m_savedActivationState);
+		body->forceActivationState(m_savedActivationState);
 	}
 }
 

Modified: trunk/blender/source/gameengine/Ketsji/KX_BulletPhysicsController.h
===================================================================
--- trunk/blender/source/gameengine/Ketsji/KX_BulletPhysicsController.h	2009-01-14 19:26:11 UTC (rev 18509)
+++ trunk/blender/source/gameengine/Ketsji/KX_BulletPhysicsController.h	2009-01-14 22:33:39 UTC (rev 18510)
@@ -41,6 +41,7 @@
 	virtual	void setPosition(const MT_Point3& pos);
 	virtual	void setScaling(const MT_Vector3& scaling);
 	virtual	MT_Scalar	GetMass();
+	virtual	void	SetMass(MT_Scalar newmass);
 	virtual	MT_Vector3	getReactionForce();
 	virtual void	setRigidBody(bool rigid);
 	virtual void    AddCompoundChild(KX_IPhysicsController* child);

Modified: trunk/blender/source/gameengine/Ketsji/KX_GameObject.cpp
===================================================================
--- trunk/blender/source/gameengine/Ketsji/KX_GameObject.cpp	2009-01-14 19:26:11 UTC (rev 18509)
+++ trunk/blender/source/gameengine/Ketsji/KX_GameObject.cpp	2009-01-14 22:33:39 UTC (rev 18510)
@@ -1129,7 +1129,7 @@
 	if (m_pPhysicsController1)
 	{
 		if (attr == "mass")
-			return PyFloat_FromDouble(GetPhysicsController()->GetMass());
+			return PyFloat_FromDouble(m_pPhysicsController1->GetMass());
 	}
 
 	if (attr == "parent")
@@ -1171,10 +1171,6 @@
 
 int KX_GameObject::_setattr(const STR_String& attr, PyObject *value)	// _setattr method
 {
-	if (attr == "mass") {
-		PyErr_SetString(PyExc_AttributeError, "attribute \"mass\" is read only");
-		return 1;
-	}
 	
 	if (attr == "parent") {
 		PyErr_SetString(PyExc_AttributeError, "attribute \"mass\" is read only\nUse setParent()");
@@ -1203,6 +1199,11 @@
 				return 0;
 			}		
 		}
+		if (attr == "mass") {
+			if (m_pPhysicsController1)
+				m_pPhysicsController1->SetMass(val);
+			return 0;
+		}
 	}
 	
 	if (PySequence_Check(value))

Modified: trunk/blender/source/gameengine/Ketsji/KX_IPhysicsController.h
===================================================================
--- trunk/blender/source/gameengine/Ketsji/KX_IPhysicsController.h	2009-01-14 19:26:11 UTC (rev 18509)
+++ trunk/blender/source/gameengine/Ketsji/KX_IPhysicsController.h	2009-01-14 22:33:39 UTC (rev 18510)
@@ -78,6 +78,7 @@
 	virtual	void setPosition(const MT_Point3& pos)=0;
 	virtual	void setScaling(const MT_Vector3& scaling)=0;
 	virtual	MT_Scalar	GetMass()=0;
+	virtual void	SetMass(MT_Scalar newmass)=0;
 	virtual	MT_Vector3	getReactionForce()=0;
 	virtual void	setRigidBody(bool rigid)=0;
 	virtual void    AddCompoundChild(KX_IPhysicsController* child) = 0;

Modified: trunk/blender/source/gameengine/Ketsji/KX_SCA_DynamicActuator.cpp
===================================================================
--- trunk/blender/source/gameengine/Ketsji/KX_SCA_DynamicActuator.cpp	2009-01-14 19:26:11 UTC (rev 18509)
+++ trunk/blender/source/gameengine/Ketsji/KX_SCA_DynamicActuator.cpp	2009-01-14 22:33:39 UTC (rev 18510)
@@ -133,10 +133,12 @@
 
 KX_SCA_DynamicActuator::KX_SCA_DynamicActuator(SCA_IObject *gameobj,
 													   short dyn_operation,
+													   float setmass,
 													   PyTypeObject* T) : 
 
 	SCA_IActuator(gameobj, T),
-	m_dyn_operation(dyn_operation)
+	m_dyn_operation(dyn_operation),
+	m_setmass(setmass)
 {
 } /* End of constructor */
 
@@ -179,6 +181,9 @@
 		case 3:
 			controller->setRigidBody(false);
 			break;
+		case 4:
+			controller->SetMass(m_setmass);
+			break;
 	}
 
 	return false;

Modified: trunk/blender/source/gameengine/Ketsji/KX_SCA_DynamicActuator.h
===================================================================
--- trunk/blender/source/gameengine/Ketsji/KX_SCA_DynamicActuator.h	2009-01-14 19:26:11 UTC (rev 18509)
+++ trunk/blender/source/gameengine/Ketsji/KX_SCA_DynamicActuator.h	2009-01-14 22:33:39 UTC (rev 18510)
@@ -45,10 +45,12 @@
 
 	// dynamics operation to apply to the game object
 	short m_dyn_operation;
+	float m_setmass;
  public:
 	KX_SCA_DynamicActuator(
 		SCA_IObject* gameobj, 
 		short dyn_operation,
+ 		float setmass,
 		PyTypeObject* T=&Type
 	);
 

Modified: trunk/blender/source/gameengine/Ketsji/KX_SumoPhysicsController.cpp
===================================================================
--- trunk/blender/source/gameengine/Ketsji/KX_SumoPhysicsController.cpp	2009-01-14 19:26:11 UTC (rev 18509)
+++ trunk/blender/source/gameengine/Ketsji/KX_SumoPhysicsController.cpp	2009-01-14 22:33:39 UTC (rev 18510)
@@ -205,6 +205,10 @@
 	return SumoPhysicsController::getMass();
 }
 
+void	KX_SumoPhysicsController::SetMass(MT_Scalar newmass)
+{
+}
+
 MT_Scalar	KX_SumoPhysicsController::GetRadius()
 {
 	return SumoPhysicsController::GetRadius();

Modified: trunk/blender/source/gameengine/Ketsji/KX_SumoPhysicsController.h
===================================================================
--- trunk/blender/source/gameengine/Ketsji/KX_SumoPhysicsController.h	2009-01-14 19:26:11 UTC (rev 18509)
+++ trunk/blender/source/gameengine/Ketsji/KX_SumoPhysicsController.h	2009-01-14 22:33:39 UTC (rev 18510)
@@ -87,6 +87,7 @@
 	virtual	void setPosition(const MT_Point3& pos);
 	virtual	void setScaling(const MT_Vector3& scaling);
 	virtual	MT_Scalar	GetMass();
+	virtual	void		SetMass(MT_Scalar newmass);
 	virtual	MT_Scalar	GetRadius();
 	virtual	MT_Vector3	getReactionForce();
 	virtual	void	setRigidBody(bool rigid);

Modified: trunk/blender/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp
===================================================================
--- trunk/blender/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp	2009-01-14 19:26:11 UTC (rev 18509)
+++ trunk/blender/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp	2009-01-14 22:33:39 UTC (rev 18510)
@@ -74,10 +74,10 @@
 	
 
 ///???
-#ifdef WIN32
+/*#ifdef WIN32
 	if (GetRigidBody() && !GetRigidBody()->isStaticObject())
 		GetRigidBody()->setLinearVelocity(startVel);
-#endif
+#endif*/
 
 }
 





More information about the Bf-blender-cvs mailing list