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

Log Message:
-----------
PhysicsConstraints.createConstraint:
allow to dynamically create rigid body constraints while disable collision 
detection between connected bodies, pass as 10th argument the flag 128

PhysiPython KX_ConstraintWrapper, setParam
export setParam(paramIndex,paramValue0,paramValue1) for Physics constraints
paramIndex 0,1,2 are linear limits, 3,4,5 are angular limits, 6,7,8 are linear 
motors, 9,10,11 are angular motors

For example:
disableConnectedBodies=128
cons = 
PhysicsConstraints.createConstraint(oid,rid,generic6dof,pivotInAx,pivotInAy,pivotInAz,angleX,angleY,angleZ,disableConnectedBodies)
#params 0,1,2 are linear limits, low,high value. if low > high then disable 
limit
cons.setParam(0,0,0)

I will provide an example .blend for Blender 2.49

Modified Paths:
--------------
    trunk/blender/source/gameengine/Ketsji/KX_ConstraintWrapper.cpp
    trunk/blender/source/gameengine/Ketsji/KX_ConstraintWrapper.h
    trunk/blender/source/gameengine/Ketsji/KX_PyConstraintBinding.cpp
    trunk/blender/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp

Modified: trunk/blender/source/gameengine/Ketsji/KX_ConstraintWrapper.cpp
===================================================================
--- trunk/blender/source/gameengine/Ketsji/KX_ConstraintWrapper.cpp     
2009-05-24 00:42:40 UTC (rev 20370)
+++ trunk/blender/source/gameengine/Ketsji/KX_ConstraintWrapper.cpp     
2009-05-24 01:55:24 UTC (rev 20371)
@@ -54,7 +54,7 @@
        return PyInt_FromLong(m_constraintId);
 }
 
-PyObject* KX_ConstraintWrapper::PySetLimit(PyObject* args, PyObject* kwds)
+PyObject* KX_ConstraintWrapper::PySetParam(PyObject* args, PyObject* kwds)
 {
        int len = PyTuple_Size(args);
        int success = 1;
@@ -73,12 +73,8 @@
        return NULL;
 }
 
-PyObject* KX_ConstraintWrapper::PyEnableMotor(PyObject* args, PyObject* kwds)
-{
-       ///will add it soon
-       return PyInt_FromLong(0);
-}
 
+
 //python specific stuff
 PyTypeObject KX_ConstraintWrapper::Type = {
 #if (PY_VERSION_HEX >= 0x02060000)
@@ -130,8 +126,7 @@
 
 PyMethodDef KX_ConstraintWrapper::Methods[] = {
        {"getConstraintId",(PyCFunction) 
KX_ConstraintWrapper::sPyGetConstraintId, METH_VARARGS},
-       {"setLimit",(PyCFunction) KX_ConstraintWrapper::sPySetLimit, 
METH_VARARGS},
-       {"enableMotor",(PyCFunction) KX_ConstraintWrapper::sPyEnableMotor, 
METH_VARARGS},
+       {"setParam",(PyCFunction) KX_ConstraintWrapper::sPySetParam, 
METH_VARARGS},
        {NULL,NULL} //Sentinel
 };
 

Modified: trunk/blender/source/gameengine/Ketsji/KX_ConstraintWrapper.h
===================================================================
--- trunk/blender/source/gameengine/Ketsji/KX_ConstraintWrapper.h       
2009-05-24 00:42:40 UTC (rev 20370)
+++ trunk/blender/source/gameengine/Ketsji/KX_ConstraintWrapper.h       
2009-05-24 01:55:24 UTC (rev 20371)
@@ -45,8 +45,7 @@
        
        KX_PYMETHOD(KX_ConstraintWrapper,TestMethod);
        KX_PYMETHOD(KX_ConstraintWrapper,GetConstraintId);
-       KX_PYMETHOD(KX_ConstraintWrapper,SetLimit);
-       KX_PYMETHOD(KX_ConstraintWrapper,EnableMotor);
+       KX_PYMETHOD(KX_ConstraintWrapper,SetParam);
 
 private:
        int                                     m_constraintId;

Modified: trunk/blender/source/gameengine/Ketsji/KX_PyConstraintBinding.cpp
===================================================================
--- trunk/blender/source/gameengine/Ketsji/KX_PyConstraintBinding.cpp   
2009-05-24 00:42:40 UTC (rev 20370)
+++ trunk/blender/source/gameengine/Ketsji/KX_PyConstraintBinding.cpp   
2009-05-24 01:55:24 UTC (rev 20371)
@@ -405,6 +405,8 @@
        int physicsid=0,physicsid2 = 0,constrainttype=0,extrainfo=0;
        int len = PyTuple_Size(args);
        int success = 1;
+       int flag = 0;
+
        float pivotX=1,pivotY=1,pivotZ=1,axisX=0,axisY=0,axisZ=1;
        if (len == 3)
        {
@@ -421,6 +423,11 @@
                success = 
PyArg_ParseTuple(args,"iiiffffff",&physicsid,&physicsid2,&constrainttype,
                        &pivotX,&pivotY,&pivotZ,&axisX,&axisY,&axisZ);
        }
+       else if (len == 10)
+       {
+               success = 
PyArg_ParseTuple(args,"iiiffffffi",&physicsid,&physicsid2,&constrainttype,
+                       &pivotX,&pivotY,&pivotZ,&axisX,&axisY,&axisZ,&flag);
+       }
        else if (len==4)
        {
                success = 
PyArg_ParseTuple(args,"iiii",&physicsid,&physicsid2,&constrainttype,&extrainfo);
@@ -455,7 +462,7 @@
                                                pivotX,pivotY,pivotZ,
                                                
(float)axis0.x(),(float)axis0.y(),(float)axis0.z(),
                                                
(float)axis1.x(),(float)axis1.y(),(float)axis1.z(),
-                                               
(float)axis2.x(),(float)axis2.y(),(float)axis2.z(),0);//dat->flag); //flag?
+                                               
(float)axis2.x(),(float)axis2.y(),(float)axis2.z(),flag);
 
                                } else
                                {

Modified: 
trunk/blender/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp
===================================================================
--- trunk/blender/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp    
2009-05-24 00:42:40 UTC (rev 20370)
+++ trunk/blender/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp    
2009-05-24 01:55:24 UTC (rev 20371)
@@ -426,6 +426,13 @@
        btRigidBody* body = ctrl->GetRigidBody();
        if (body)
        {
+               for (int i=body->getNumConstraintRefs()-1;i>=0;i--)
+               {
+                       btTypedConstraint* con = body->getConstraintRef(i);
+                       m_dynamicsWorld->removeConstraint(con);
+                       body->removeConstraintRef(con);
+                       //delete con; //might be kept by python 
KX_ConstraintWrapper
+               }
                m_dynamicsWorld->removeRigidBody(ctrl->GetRigidBody());
        } else
        {
@@ -1791,9 +1798,43 @@
        {
        case PHY_GENERIC_6DOF_CONSTRAINT:
                {
-                       //param = 1..12, min0,max0,min1,max1...min6,max6
-                       btGeneric6DofConstraint* genCons = 
(btGeneric6DofConstraint*)typedConstraint;
-                       genCons->setLimit(param,value0,value1);
+                       
+                       switch (param)
+                       {
+                       case 0: case 1: case 2: case 3: case 4: case 5:
+                               {
+                                       //param = 0..5 are constraint limits, 
with low/high limit value
+                                       btGeneric6DofConstraint* genCons = 
(btGeneric6DofConstraint*)typedConstraint;
+                                       genCons->setLimit(param,value0,value1);
+                                       break;
+                               }
+                       case 6: case 7: case 8:
+                               {
+                                       //param = 6,7,8 are translational 
motors, with value0=target velocity, value1 = max motor force
+                                       btGeneric6DofConstraint* genCons = 
(btGeneric6DofConstraint*)typedConstraint;
+                                       int transMotorIndex = param-6;
+                                       btTranslationalLimitMotor* transMotor = 
genCons->getTranslationalLimitMotor();
+                                       
transMotor->m_targetVelocity[transMotorIndex]= value0;
+                                       
transMotor->m_maxMotorForce[transMotorIndex]=value1;
+                                       
transMotor->m_enableMotor[transMotorIndex] = (value1>0.f);
+                                       break;
+                               }
+                       case 9: case 10: case 11:
+                               {
+                                       //param = 9,10,11 are rotational 
motors, with value0=target velocity, value1 = max motor force
+                                       btGeneric6DofConstraint* genCons = 
(btGeneric6DofConstraint*)typedConstraint;
+                                       int angMotorIndex = param-9;
+                                       btRotationalLimitMotor* rotMotor = 
genCons->getRotationalLimitMotor(angMotorIndex);
+                                       rotMotor->m_enableMotor = (value1 > 
0.f);
+                                       rotMotor->m_targetVelocity = value0;
+                                       rotMotor->m_maxMotorForce = value1;
+                                       break;
+                               }
+
+                       default:
+                               {
+                               }
+                       }
                        break;
                };
        default:


_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to