forked from bartvdbraak/blender
Fix bug in rigid body constraint buttons drawing, and while we are at it, add 'Collision' button to disable collisions between bodies, linked between constraint.
This commit is contained in:
parent
41ad6f9d0a
commit
0749bf7be7
@ -520,6 +520,7 @@ typedef enum B_CONSTRAINTCHANNEL_FLAG {
|
||||
|
||||
/* Rigid-Body Constraint */
|
||||
#define CONSTRAINT_DRAW_PIVOT 0x40
|
||||
#define CONSTRAINT_DISABLE_LINKED_COLLISION 0x80
|
||||
|
||||
/* important: these defines need to match up with PHY_DynamicTypes headerfile */
|
||||
#define CONSTRAINT_RB_BALL 1
|
||||
|
@ -1497,16 +1497,20 @@ static void draw_constraint (uiBlock *block, ListBase *list, bConstraint *con, s
|
||||
int offsetY = 150;
|
||||
int textButWidth = ((width/2)-togButWidth);
|
||||
|
||||
uiDefButI(block, MENU, B_CONSTRAINT_TEST, "Joint Types%t|Ball%x1|Hinge%x2|Cone Twist%x4|Generic (experimental)%x12",//|Extra Force%x6",
|
||||
*xco, *yco-25, 150, 18, &data->type, 0, 0, 0, 0, "Choose the joint type");
|
||||
height = 140;
|
||||
if (data->type==CONSTRAINT_RB_GENERIC6DOF)
|
||||
height = 270;
|
||||
if (data->type==CONSTRAINT_RB_CONETWIST)
|
||||
height = 200;
|
||||
|
||||
uiDefBut(block, ROUNDBOX, B_DIFF, "", *xco-10, *yco-height, width+40,height-1, NULL, 5.0, 0.0, 12, rb_col, "");
|
||||
|
||||
uiDefBut(block, ROUNDBOX, B_DIFF, "", *xco-10, *yco-height, width+40,height-1, NULL, 5.0, 0.0, 12, rb_col, "");
|
||||
|
||||
uiDefButI(block, MENU, B_CONSTRAINT_TEST, "Joint Types%t|Ball%x1|Hinge%x2|Cone Twist%x4|Generic (experimental)%x12",//|Extra Force%x6",
|
||||
*xco, *yco-25, 150, 18, &data->type, 0, 0, 0, 0, "Choose the joint type");
|
||||
|
||||
uiDefButBitS(block, TOG, CONSTRAINT_DISABLE_LINKED_COLLISION, B_CONSTRAINT_TEST, "Collision", *xco+155, *yco-25, 111, 18, &data->flag, 0, 24, 0, 0, "Enable Collision Between Linked Bodies");
|
||||
|
||||
|
||||
uiDefIDPoinBut(block, test_obpoin_but, ID_OB, B_CONSTRAINT_CHANGETARGET, "toObject:", *xco, *yco-50, 130, 18, &data->tar, "Child Object");
|
||||
uiDefButBitS(block, TOG, CONSTRAINT_DRAW_PIVOT, B_CONSTRAINT_TEST, "ShowPivot", *xco+135, *yco-50, 130, 18, &data->flag, 0, 24, 0, 0, "Show pivot position and rotation");
|
||||
|
||||
@ -1586,6 +1590,7 @@ static void draw_constraint (uiBlock *block, ListBase *list, bConstraint *con, s
|
||||
uiDefButF(block, NUM, B_CONSTRAINT_TEST, "", *xco+(width-textButWidth-5), *yco-offsetY, (textButWidth), 18, &(data->maxLimit[5]), -extremeAngZ, extremeAngZ, 0.1,0.5,"max z limit");
|
||||
uiBlockEndAlign(block);
|
||||
}
|
||||
|
||||
}
|
||||
break;
|
||||
case CONSTRAINT_TYPE_CLAMPTO:
|
||||
|
@ -2478,7 +2478,7 @@ void BL_ConvertBlenderObjects(struct Main* maggie,
|
||||
(float)dat->pivY,(float)dat->pivZ,
|
||||
(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());
|
||||
(float)axis2.x(),(float)axis2.y(),(float)axis2.z(),dat->flag);
|
||||
if (constraintId)
|
||||
{
|
||||
//if it is a generic 6DOF constraint, set all the limits accordingly
|
||||
|
@ -435,7 +435,7 @@ static PyObject* gPyCreateConstraint(PyObject* self,
|
||||
PHY_IPhysicsController* physctrl2 = (PHY_IPhysicsController*) physicsid2;
|
||||
if (physctrl) //TODO:check for existance of this pointer!
|
||||
{
|
||||
int constraintid = PHY_GetActiveEnvironment()->createConstraint(physctrl,physctrl2,(enum PHY_ConstraintType)constrainttype,pivotX,pivotY,pivotZ,axisX,axisY,axisZ);
|
||||
int constraintid = PHY_GetActiveEnvironment()->createConstraint(physctrl,physctrl2,(enum PHY_ConstraintType)constrainttype,pivotX,pivotY,pivotZ,axisX,axisY,axisZ,0);
|
||||
|
||||
KX_ConstraintWrapper* wrap = new KX_ConstraintWrapper((enum PHY_ConstraintType)constrainttype,constraintid,PHY_GetActiveEnvironment());
|
||||
|
||||
|
@ -33,6 +33,7 @@ subject to the following restrictions:
|
||||
|
||||
#include "PHY_IMotionState.h"
|
||||
|
||||
#define CCD_CONSTRAINT_DISABLE_LINKED_COLLISION 0x80
|
||||
|
||||
bool useIslands = true;
|
||||
|
||||
@ -882,13 +883,16 @@ int CcdPhysicsEnvironment::createUniversalD6Constraint(
|
||||
const btVector3& linearMinLimits,
|
||||
const btVector3& linearMaxLimits,
|
||||
const btVector3& angularMinLimits,
|
||||
const btVector3& angularMaxLimits
|
||||
const btVector3& angularMaxLimits,int flags
|
||||
)
|
||||
{
|
||||
|
||||
bool disableCollisionBetweenLinkedBodies = (0==(flags & CCD_CONSTRAINT_DISABLE_LINKED_COLLISION));
|
||||
|
||||
//we could either add some logic to recognize ball-socket and hinge, or let that up to the user
|
||||
//perhaps some warning or hint that hinge/ball-socket is more efficient?
|
||||
|
||||
|
||||
btGeneric6DofConstraint* genericConstraint = 0;
|
||||
CcdPhysicsController* ctrl0 = (CcdPhysicsController*) ctrlRef;
|
||||
CcdPhysicsController* ctrl1 = (CcdPhysicsController*) ctrlOther;
|
||||
@ -918,7 +922,7 @@ int CcdPhysicsEnvironment::createUniversalD6Constraint(
|
||||
if (genericConstraint)
|
||||
{
|
||||
// m_constraints.push_back(genericConstraint);
|
||||
m_dynamicsWorld->addConstraint(genericConstraint);
|
||||
m_dynamicsWorld->addConstraint(genericConstraint,disableCollisionBetweenLinkedBodies);
|
||||
|
||||
genericConstraint->setUserConstraintId(gConstraintUid++);
|
||||
genericConstraint->setUserConstraintType(PHY_GENERIC_6DOF_CONSTRAINT);
|
||||
@ -1488,10 +1492,13 @@ int CcdPhysicsEnvironment::createConstraint(class PHY_IPhysicsController* ctrl
|
||||
float pivotX,float pivotY,float pivotZ,
|
||||
float axisX,float axisY,float axisZ,
|
||||
float axis1X,float axis1Y,float axis1Z,
|
||||
float axis2X,float axis2Y,float axis2Z
|
||||
float axis2X,float axis2Y,float axis2Z,int flags
|
||||
)
|
||||
{
|
||||
|
||||
bool disableCollisionBetweenLinkedBodies = (0==(flags & CCD_CONSTRAINT_DISABLE_LINKED_COLLISION));
|
||||
|
||||
|
||||
|
||||
CcdPhysicsController* c0 = (CcdPhysicsController*)ctrl0;
|
||||
CcdPhysicsController* c1 = (CcdPhysicsController*)ctrl1;
|
||||
@ -1683,7 +1690,7 @@ int CcdPhysicsEnvironment::createConstraint(class PHY_IPhysicsController* ctrl
|
||||
pivotInA);
|
||||
}
|
||||
|
||||
m_dynamicsWorld->addConstraint(p2p);
|
||||
m_dynamicsWorld->addConstraint(p2p,disableCollisionBetweenLinkedBodies);
|
||||
// m_constraints.push_back(p2p);
|
||||
|
||||
p2p->setUserConstraintId(gConstraintUid++);
|
||||
@ -1753,7 +1760,7 @@ int CcdPhysicsEnvironment::createConstraint(class PHY_IPhysicsController* ctrl
|
||||
if (genericConstraint)
|
||||
{
|
||||
//m_constraints.push_back(genericConstraint);
|
||||
m_dynamicsWorld->addConstraint(genericConstraint);
|
||||
m_dynamicsWorld->addConstraint(genericConstraint,disableCollisionBetweenLinkedBodies);
|
||||
genericConstraint->setUserConstraintId(gConstraintUid++);
|
||||
genericConstraint->setUserConstraintType(type);
|
||||
//64 bit systems can't cast pointer to int. could use size_t instead.
|
||||
@ -1819,7 +1826,7 @@ int CcdPhysicsEnvironment::createConstraint(class PHY_IPhysicsController* ctrl
|
||||
if (coneTwistContraint)
|
||||
{
|
||||
//m_constraints.push_back(genericConstraint);
|
||||
m_dynamicsWorld->addConstraint(coneTwistContraint);
|
||||
m_dynamicsWorld->addConstraint(coneTwistContraint,disableCollisionBetweenLinkedBodies);
|
||||
coneTwistContraint->setUserConstraintId(gConstraintUid++);
|
||||
coneTwistContraint->setUserConstraintType(type);
|
||||
//64 bit systems can't cast pointer to int. could use size_t instead.
|
||||
@ -1858,7 +1865,7 @@ int CcdPhysicsEnvironment::createConstraint(class PHY_IPhysicsController* ctrl
|
||||
hinge->setAngularOnly(angularOnly);
|
||||
|
||||
//m_constraints.push_back(hinge);
|
||||
m_dynamicsWorld->addConstraint(hinge);
|
||||
m_dynamicsWorld->addConstraint(hinge,disableCollisionBetweenLinkedBodies);
|
||||
hinge->setUserConstraintId(gConstraintUid++);
|
||||
hinge->setUserConstraintType(type);
|
||||
//64 bit systems can't cast pointer to int. could use size_t instead.
|
||||
|
@ -127,7 +127,7 @@ protected:
|
||||
float pivotX,float pivotY,float pivotZ,
|
||||
float axisX,float axisY,float axisZ,
|
||||
float axis1X=0,float axis1Y=0,float axis1Z=0,
|
||||
float axis2X=0,float axis2Y=0,float axis2Z=0
|
||||
float axis2X=0,float axis2Y=0,float axis2Z=0,int flag=0
|
||||
);
|
||||
|
||||
|
||||
@ -139,7 +139,7 @@ protected:
|
||||
const btVector3& linearMinLimits,
|
||||
const btVector3& linearMaxLimits,
|
||||
const btVector3& angularMinLimits,
|
||||
const btVector3& angularMaxLimits
|
||||
const btVector3& angularMaxLimits,int flags
|
||||
);
|
||||
|
||||
virtual void setConstraintParam(int constraintId,int param,float value,float value1);
|
||||
|
@ -92,8 +92,7 @@ void DummyPhysicsEnvironment::setGravity(float x,float y,float z)
|
||||
int DummyPhysicsEnvironment::createConstraint(class PHY_IPhysicsController* ctrl,class PHY_IPhysicsController* ctrl2,PHY_ConstraintType type,
|
||||
float pivotX,float pivotY,float pivotZ,float axisX,float axisY,float axisZ,
|
||||
float axis1X,float axis1Y,float axis1Z,
|
||||
float axis2X,float axis2Y,float axis2Z
|
||||
|
||||
float axis2X,float axis2Y,float axis2Z,int flag
|
||||
)
|
||||
{
|
||||
|
||||
|
@ -58,7 +58,7 @@ public:
|
||||
float pivotX,float pivotY,float pivotZ,
|
||||
float axisX,float axisY,float axisZ,
|
||||
float axis1X=0,float axis1Y=0,float axis1Z=0,
|
||||
float axis2X=0,float axis2Y=0,float axis2Z=0
|
||||
float axis2X=0,float axis2Y=0,float axis2Z=0,int flag=0
|
||||
);
|
||||
|
||||
virtual void removeConstraint(int constraintid);
|
||||
|
@ -111,8 +111,8 @@ int SumoPhysicsEnvironment::createConstraint(
|
||||
float pivotX,float pivotY,float pivotZ,
|
||||
float axisX,float axisY,float axisZ,
|
||||
float axis1X,float axis1Y,float axis1Z,
|
||||
float axis2X,float axis2Y,float axis2Z
|
||||
|
||||
float axis2X,float axis2Y,float axis2Z,
|
||||
int flag
|
||||
)
|
||||
{
|
||||
int constraintid = 0;
|
||||
|
@ -63,7 +63,7 @@ public:
|
||||
float pivotX,float pivotY,float pivotZ,
|
||||
float axisX,float axisY,float axisZ,
|
||||
float axis1X=0,float axis1Y=0,float axis1Z=0,
|
||||
float axis2X=0,float axis2Y=0,float axis2Z=0
|
||||
float axis2X=0,float axis2Y=0,float axis2Z=0,int flag=0
|
||||
|
||||
);
|
||||
|
||||
|
@ -129,7 +129,7 @@ class PHY_IPhysicsEnvironment
|
||||
float pivotX,float pivotY,float pivotZ,
|
||||
float axis0X,float axis0Y,float axis0Z,
|
||||
float axis1X=0,float axis1Y=0,float axis1Z=0,
|
||||
float axis2X=0,float axis2Y=0,float axis2Z=0
|
||||
float axis2X=0,float axis2Y=0,float axis2Z=0,int flag=0
|
||||
)=0;
|
||||
virtual void removeConstraint(int constraintid)=0;
|
||||
virtual float getAppliedImpulse(int constraintid){ return 0.f;}
|
||||
|
Loading…
Reference in New Issue
Block a user