[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [20374] trunk/blender: + renamed pad3 to m_contactProcessingThreshold (thanks Campbell Barton/ ideasman for confirming it is ok to rename it)

Erwin Coumans blender at erwincoumans.com
Sun May 24 08:31:47 CEST 2009


Revision: 20374
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=20374
Author:   erwin
Date:     2009-05-24 08:31:47 +0200 (Sun, 24 May 2009)

Log Message:
-----------
+ renamed pad3 to m_contactProcessingThreshold (thanks Campbell Barton/ideasman for confirming it is ok to rename it)
+ fixed Python method, PyArg_ParseTuple already checks for errors, no returning of NULL, thanks Campbell too)
+ added linear/angular spring for each of the 6DOFs of a generic 6dof constraint.  This makes the generic 6dof constraint very versatile.

Modified Paths:
--------------
    trunk/blender/extern/bullet2/src/BulletDynamics/ConstraintSolver/btGeneric6DofConstraint.cpp
    trunk/blender/extern/bullet2/src/BulletDynamics/ConstraintSolver/btGeneric6DofConstraint.h
    trunk/blender/source/blender/blenkernel/intern/object.c
    trunk/blender/source/blender/blenloader/intern/readfile.c
    trunk/blender/source/blender/makesdna/DNA_object_types.h
    trunk/blender/source/blender/src/buttons_logic.c
    trunk/blender/source/gameengine/Converter/BL_BlenderDataConversion.cpp
    trunk/blender/source/gameengine/Ketsji/KX_ConstraintWrapper.cpp
    trunk/blender/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp

Modified: trunk/blender/extern/bullet2/src/BulletDynamics/ConstraintSolver/btGeneric6DofConstraint.cpp
===================================================================
--- trunk/blender/extern/bullet2/src/BulletDynamics/ConstraintSolver/btGeneric6DofConstraint.cpp	2009-05-24 05:58:37 UTC (rev 20373)
+++ trunk/blender/extern/bullet2/src/BulletDynamics/ConstraintSolver/btGeneric6DofConstraint.cpp	2009-05-24 06:31:47 UTC (rev 20374)
@@ -22,9 +22,11 @@
 #include "btGeneric6DofConstraint.h"
 #include "BulletDynamics/Dynamics/btRigidBody.h"
 #include "LinearMath/btTransformUtil.h"
+#include "LinearMath/btTransformUtil.h"
 #include <new>
 
 
+
 #define D6_USE_OBSOLETE_METHOD false
 
 
@@ -738,7 +740,9 @@
         }
         // if we're limited low and high simultaneously, the joint motor is
         // ineffective
-        if (limit && (limot->m_loLimit == limot->m_hiLimit)) powered = 0;
+        if (limit && (limot->m_loLimit == limot->m_hiLimit)) 
+			powered = 0;
+
         info->m_constraintError[srow] = btScalar(0.f);
         if (powered)
         {
@@ -827,3 +831,117 @@
 
 
 
+btGeneric6DofSpringConstraint::btGeneric6DofSpringConstraint(btRigidBody& rbA, btRigidBody& rbB, const btTransform& frameInA, const btTransform& frameInB ,bool useLinearReferenceFrameA)
+	: btGeneric6DofConstraint(rbA, rbB, frameInA, frameInB, useLinearReferenceFrameA)
+{
+	for(int i = 0; i < 6; i++)
+	{
+		m_springEnabled[i] = false;
+		m_equilibriumPoint[i] = btScalar(0.f);
+		m_springStiffness[i] = btScalar(0.f);
+	}
+}
+
+
+void btGeneric6DofSpringConstraint::enableSpring(int index, bool onOff)
+{
+	btAssert((index >= 0) && (index < 6));
+	m_springEnabled[index] = onOff;
+	if(index < 3)
+	{
+		m_linearLimits.m_enableMotor[index] = onOff;
+	}
+	else
+	{
+		m_angularLimits[index - 3].m_enableMotor = onOff;
+	}
+}
+
+
+
+void btGeneric6DofSpringConstraint::setStiffness(int index, btScalar stiffness)
+{
+	btAssert((index >= 0) && (index < 6));
+	m_springStiffness[index] = stiffness;
+}
+
+
+void btGeneric6DofSpringConstraint::setEquilibriumPoint()
+{
+	calculateTransforms();
+	for(int i = 0; i < 3; i++)
+	{
+		m_equilibriumPoint[i] = m_calculatedLinearDiff[i];
+	}
+	for(int i = 0; i < 3; i++)
+	{
+		m_equilibriumPoint[i + 3] = m_calculatedAxisAngleDiff[i];
+	}
+}
+
+
+
+void btGeneric6DofSpringConstraint::setEquilibriumPoint(int index)
+{
+	btAssert((index >= 0) && (index < 6));
+	calculateTransforms();
+	if(index < 3)
+	{
+		m_equilibriumPoint[index] = m_calculatedLinearDiff[index];
+	}
+	else
+	{
+		m_equilibriumPoint[index + 3] = m_calculatedAxisAngleDiff[index];
+	}
+}
+
+
+
+void btGeneric6DofSpringConstraint::internalUpdateSprings(btConstraintInfo2* info)
+{
+	// it is assumed that calculateTransforms() have been called before this call
+	int i;
+	btVector3 relVel = m_rbB.getLinearVelocity() - m_rbA.getLinearVelocity();
+	for(i = 0; i < 3; i++)
+	{
+		if(m_springEnabled[i])
+		{
+			// get current position of constraint
+			btScalar currPos = m_calculatedLinearDiff[i];
+			// calculate difference
+			btScalar delta = currPos - m_equilibriumPoint[i];
+			// spring force is (delta * m_stiffness) according to Hooke's Law
+			btScalar force = delta * m_springStiffness[i];
+			m_linearLimits.m_targetVelocity[i] = force  * info->fps;
+			m_linearLimits.m_maxMotorForce[i] = btFabs(force) / info->fps;
+		}
+	}
+	for(i = 0; i < 3; i++)
+	{
+		if(m_springEnabled[i + 3])
+		{
+			// get current position of constraint
+			btScalar currPos = m_calculatedAxisAngleDiff[i];
+			// calculate difference
+			btScalar delta = currPos - m_equilibriumPoint[i+3];
+			// spring force is (-delta * m_stiffness) according to Hooke's Law
+			btScalar force = -delta * m_springStiffness[i+3];
+			m_angularLimits[i].m_targetVelocity = force  * info->fps;
+			m_angularLimits[i].m_maxMotorForce = btFabs(force) / info->fps;
+		}
+	}
+}
+
+
+void btGeneric6DofSpringConstraint::getInfo2(btConstraintInfo2* info)
+{
+	// this will be called by constraint solver at the constraint setup stage
+	// set current motor parameters
+	internalUpdateSprings(info);
+	// do the rest of job for constraint setup
+	btGeneric6DofConstraint::getInfo2(info);
+}
+
+
+
+

Modified: trunk/blender/extern/bullet2/src/BulletDynamics/ConstraintSolver/btGeneric6DofConstraint.h
===================================================================
--- trunk/blender/extern/bullet2/src/BulletDynamics/ConstraintSolver/btGeneric6DofConstraint.h	2009-05-24 05:58:37 UTC (rev 20373)
+++ trunk/blender/extern/bullet2/src/BulletDynamics/ConstraintSolver/btGeneric6DofConstraint.h	2009-05-24 06:31:47 UTC (rev 20374)
@@ -478,4 +478,20 @@
 };
 
 
+class btGeneric6DofSpringConstraint : public btGeneric6DofConstraint
+{
+protected:
+	bool		m_springEnabled[6];
+	btScalar	m_equilibriumPoint[6];
+	btScalar	m_springStiffness[6];
+	void internalUpdateSprings(btConstraintInfo2* info);
+public: 
+    btGeneric6DofSpringConstraint(btRigidBody& rbA, btRigidBody& rbB, const btTransform& frameInA, const btTransform& frameInB ,bool useLinearReferenceFrameA);
+	void enableSpring(int index, bool onOff);
+	void setStiffness(int index, btScalar stiffness);
+	void setEquilibriumPoint(); // set the current constraint position/orientation as an equilibrium point for all DOF
+	void setEquilibriumPoint(int index);  // set the current constraint position/orientation as an equilibrium point for given DOF
+	virtual void getInfo2 (btConstraintInfo2* info);
+};
+
 #endif //GENERIC_6DOF_CONSTRAINT_H

Modified: trunk/blender/source/blender/blenkernel/intern/object.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/object.c	2009-05-24 05:58:37 UTC (rev 20373)
+++ trunk/blender/source/blender/blenkernel/intern/object.c	2009-05-24 06:31:47 UTC (rev 20374)
@@ -985,7 +985,7 @@
 	ob->gameflag= OB_PROP|OB_COLLISION;
 	ob->margin = 0.0;
 	/* ob->pad3 == Contact Processing Threshold */
-	ob->pad3 = 1.;
+	ob->m_contactProcessingThreshold = 1.;
 	
 	/* NT fluid sim defaults */
 	ob->fluidsimFlag = 0;

Modified: trunk/blender/source/blender/blenloader/intern/readfile.c
===================================================================
--- trunk/blender/source/blender/blenloader/intern/readfile.c	2009-05-24 05:58:37 UTC (rev 20373)
+++ trunk/blender/source/blender/blenloader/intern/readfile.c	2009-05-24 06:31:47 UTC (rev 20374)
@@ -8110,7 +8110,7 @@
 		Object *ob;
 		World *wrld;
 		for(ob = main->object.first; ob; ob= ob->id.next) {
-			ob->pad3 = 1.; //pad3 is used for m_contactProcessingThreshold
+			ob->m_contactProcessingThreshold = 1.; //pad3 is used for m_contactProcessingThreshold
 			if(ob->parent) {
 				/* check if top parent has compound shape set and if yes, set this object
 				   to compound shaper as well (was the behaviour before, now it's optional) */

Modified: trunk/blender/source/blender/makesdna/DNA_object_types.h
===================================================================
--- trunk/blender/source/blender/makesdna/DNA_object_types.h	2009-05-24 05:58:37 UTC (rev 20373)
+++ trunk/blender/source/blender/makesdna/DNA_object_types.h	2009-05-24 06:31:47 UTC (rev 20374)
@@ -159,7 +159,7 @@
 	float margin;
 	float max_vel; /* clamp the maximum velocity 0.0 is disabled */
 	float min_vel; /* clamp the maximum velocity 0.0 is disabled */
-	float pad3; /* pad3 is now used for m_contactProcessingThreshold, can we still rename it? */
+	float m_contactProcessingThreshold;
 
 	char dt, dtx;
 	char totcol;	/* copy of mesh or curve or meta */

Modified: trunk/blender/source/blender/src/buttons_logic.c
===================================================================
--- trunk/blender/source/blender/src/buttons_logic.c	2009-05-24 05:58:37 UTC (rev 20373)
+++ trunk/blender/source/blender/src/buttons_logic.c	2009-05-24 06:31:47 UTC (rev 20374)
@@ -3204,7 +3204,7 @@
 			if (ob->gameflag & OB_RIGID_BODY)
 			{
 				uiDefButF(block, NUM, 0, "CPT",
-					xco+180, yco, 180, 19, &ob->pad3, 0.00, 1., 1, 0, 
+					xco+180, yco, 180, 19, &ob->m_contactProcessingThreshold, 0.00, 1., 1, 0, 
 					"Contact Processing Threshold");
 			
 				yco -= 20;
@@ -3287,7 +3287,7 @@
 					xco, yco, 180, 19, &ob->margin, 0.0, 1.0, 1, 0, 
 					"Collision margin");
 			uiDefButF(block, NUM, 0, "CPT",
-				xco+180, yco, 180, 19, &ob->pad3, 0.00, 1., 1, 0, 
+				xco+180, yco, 180, 19, &ob->m_contactProcessingThreshold, 0.00, 1., 1, 0, 
 				"Contact Processing Threshold");
 
 		}

Modified: trunk/blender/source/gameengine/Converter/BL_BlenderDataConversion.cpp
===================================================================
--- trunk/blender/source/gameengine/Converter/BL_BlenderDataConversion.cpp	2009-05-24 05:58:37 UTC (rev 20373)
+++ trunk/blender/source/gameengine/Converter/BL_BlenderDataConversion.cpp	2009-05-24 06:31:47 UTC (rev 20374)
@@ -1422,7 +1422,7 @@
 	///contact processing threshold is only for rigid bodies and static geometry, not 'dynamic'
 	if (objprop.m_angular_rigidbody || !objprop.m_dyna )
 	{
-		objprop.m_contactProcessingThreshold = blenderobject->pad3;
+		objprop.m_contactProcessingThreshold = blenderobject->m_contactProcessingThreshold;
 	} else
 	{
 		objprop.m_contactProcessingThreshold = 0.f;

Modified: trunk/blender/source/gameengine/Ketsji/KX_ConstraintWrapper.cpp
===================================================================
--- trunk/blender/source/gameengine/Ketsji/KX_ConstraintWrapper.cpp	2009-05-24 05:58:37 UTC (rev 20373)
+++ trunk/blender/source/gameengine/Ketsji/KX_ConstraintWrapper.cpp	2009-05-24 06:31:47 UTC (rev 20374)
@@ -59,22 +59,17 @@
 	int len = PyTuple_Size(args);
 	int success = 1;
 	
-	if (len == 3)
+	int dof;
+	float minLimit,maxLimit;
+	success = PyArg_ParseTuple(args,"iff:setParam",&dof,&minLimit,&maxLimit);
+	if (success)
 	{
-		int dof;
-		float minLimit,maxLimit;
-		success = PyArg_ParseTuple(args,"iff",&dof,&minLimit,&maxLimit);
-		if (success)
-		{
-			m_physenv->setConstraintParam(m_constraintId,dof,minLimit,maxLimit);
-			Py_RETURN_NONE;
-		}
+		m_physenv->setConstraintParam(m_constraintId,dof,minLimit,maxLimit);
 	}
-	return NULL;
+	Py_RETURN_NONE;
 }
 
 
-
 //python specific stuff
 PyTypeObject KX_ConstraintWrapper::Type = {
 #if (PY_VERSION_HEX >= 0x02060000)

Modified: trunk/blender/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp
===================================================================
--- trunk/blender/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp	2009-05-24 05:58:37 UTC (rev 20373)

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list