BulletSim: ability to specify groups of axis to modify in constraint parameters that control multiple axis. Add useLinearReferenceFrameA constraint parameter.
parent
7a9eb26b00
commit
9d04c6a828
|
@ -406,8 +406,18 @@ public class ExtendedPhysics : INonSharedRegionModule
|
||||||
public const int PHYS_PARAM_SPRING_STIFFNESS = 14418;
|
public const int PHYS_PARAM_SPRING_STIFFNESS = 14418;
|
||||||
[ScriptConstant]
|
[ScriptConstant]
|
||||||
public const int PHYS_PARAM_LINK_TYPE = 14419;
|
public const int PHYS_PARAM_LINK_TYPE = 14419;
|
||||||
|
[ScriptConstant]
|
||||||
|
public const int PHYS_PARAM_USE_LINEAR_FRAMEA = 14420;
|
||||||
|
|
||||||
public const int PHYS_PARAM_MAX = 14419;
|
public const int PHYS_PARAM_MAX = 14420;
|
||||||
|
|
||||||
|
// Used when specifying a parameter that has settings for the three linear and three angular axis
|
||||||
|
[ScriptConstant]
|
||||||
|
public const int PHYS_AXIS_ALL = -1;
|
||||||
|
[ScriptConstant]
|
||||||
|
public const int PHYS_AXIS_ALL_LINEAR = -2;
|
||||||
|
[ScriptConstant]
|
||||||
|
public const int PHYS_AXIS_ALL_ANGULAR = -3;
|
||||||
|
|
||||||
// physChangeLinkParams(integer linkNum, [ PHYS_PARAM_*, value, PHYS_PARAM_*, value, ...])
|
// physChangeLinkParams(integer linkNum, [ PHYS_PARAM_*, value, PHYS_PARAM_*, value, ...])
|
||||||
[ScriptInvocation]
|
[ScriptInvocation]
|
||||||
|
|
|
@ -58,6 +58,7 @@ public sealed class BSLinksetConstraints : BSLinkset
|
||||||
public OMV.Quaternion frameInArot;
|
public OMV.Quaternion frameInArot;
|
||||||
public OMV.Vector3 frameInBloc;
|
public OMV.Vector3 frameInBloc;
|
||||||
public OMV.Quaternion frameInBrot;
|
public OMV.Quaternion frameInBrot;
|
||||||
|
public bool useLinearReferenceFrameA;
|
||||||
// Spring
|
// Spring
|
||||||
public bool[] springAxisEnable;
|
public bool[] springAxisEnable;
|
||||||
public float[] springDamping;
|
public float[] springDamping;
|
||||||
|
@ -91,6 +92,7 @@ public sealed class BSLinksetConstraints : BSLinkset
|
||||||
frameInArot = OMV.Quaternion.Identity;
|
frameInArot = OMV.Quaternion.Identity;
|
||||||
frameInBloc = OMV.Vector3.Zero;
|
frameInBloc = OMV.Vector3.Zero;
|
||||||
frameInBrot = OMV.Quaternion.Identity;
|
frameInBrot = OMV.Quaternion.Identity;
|
||||||
|
useLinearReferenceFrameA = true;
|
||||||
springAxisEnable = new bool[6];
|
springAxisEnable = new bool[6];
|
||||||
springDamping = new float[6];
|
springDamping = new float[6];
|
||||||
springStiffness = new float[6];
|
springStiffness = new float[6];
|
||||||
|
@ -145,7 +147,7 @@ public sealed class BSLinksetConstraints : BSLinkset
|
||||||
{
|
{
|
||||||
constrainSpring.SetSolverIterations(solverIterations);
|
constrainSpring.SetSolverIterations(solverIterations);
|
||||||
}
|
}
|
||||||
for (int ii = 0; ii < 6; ii++)
|
for (int ii = 0; ii < springAxisEnable.Length; ii++)
|
||||||
{
|
{
|
||||||
constrainSpring.SetAxisEnable(ii, springAxisEnable[ii]);
|
constrainSpring.SetAxisEnable(ii, springAxisEnable[ii]);
|
||||||
if (springDamping[ii] != BSAPITemplate.SPRING_NOT_SPECIFIED)
|
if (springDamping[ii] != BSAPITemplate.SPRING_NOT_SPECIFIED)
|
||||||
|
@ -401,7 +403,7 @@ public sealed class BSLinksetConstraints : BSLinkset
|
||||||
case ConstraintType.D6_SPRING_CONSTRAINT_TYPE:
|
case ConstraintType.D6_SPRING_CONSTRAINT_TYPE:
|
||||||
constrain = new BSConstraintSpring(m_physicsScene.World, rootPrim.PhysBody, linkInfo.member.PhysBody,
|
constrain = new BSConstraintSpring(m_physicsScene.World, rootPrim.PhysBody, linkInfo.member.PhysBody,
|
||||||
linkInfo.frameInAloc, linkInfo.frameInArot, linkInfo.frameInBloc, linkInfo.frameInBrot,
|
linkInfo.frameInAloc, linkInfo.frameInArot, linkInfo.frameInBloc, linkInfo.frameInBrot,
|
||||||
true /*useLinearReferenceFrameA*/,
|
linkInfo.useLinearReferenceFrameA,
|
||||||
true /*disableCollisionsBetweenLinkedBodies*/);
|
true /*disableCollisionsBetweenLinkedBodies*/);
|
||||||
DetailLog("{0},BSLinksetConstraint.BuildConstraint,spring,root={1},rBody={2},child={3},cBody={4},rLoc={5},cLoc={6}",
|
DetailLog("{0},BSLinksetConstraint.BuildConstraint,spring,root={1},rBody={2},child={3},cBody={4},rLoc={5},cLoc={6}",
|
||||||
rootPrim.LocalID,
|
rootPrim.LocalID,
|
||||||
|
@ -619,6 +621,7 @@ public sealed class BSLinksetConstraints : BSLinkset
|
||||||
bool valueBool;
|
bool valueBool;
|
||||||
OMV.Vector3 valueVector;
|
OMV.Vector3 valueVector;
|
||||||
OMV.Quaternion valueQuaternion;
|
OMV.Quaternion valueQuaternion;
|
||||||
|
int axisLow, axisHigh;
|
||||||
|
|
||||||
int opIndex = 2;
|
int opIndex = 2;
|
||||||
while (opIndex < pParams.Length)
|
while (opIndex < pParams.Length)
|
||||||
|
@ -720,24 +723,32 @@ public sealed class BSLinksetConstraints : BSLinkset
|
||||||
case ExtendedPhysics.PHYS_PARAM_SPRING_AXIS_ENABLE:
|
case ExtendedPhysics.PHYS_PARAM_SPRING_AXIS_ENABLE:
|
||||||
valueInt = (int)pParams[opIndex + 1];
|
valueInt = (int)pParams[opIndex + 1];
|
||||||
valueBool = ((int)pParams[opIndex + 2] != 0);
|
valueBool = ((int)pParams[opIndex + 2] != 0);
|
||||||
if (valueInt >=0 && valueInt < linkInfo.springAxisEnable.Length)
|
GetAxisRange(valueInt, out axisLow, out axisHigh);
|
||||||
linkInfo.springAxisEnable[valueInt] = valueBool;
|
for (int ii = axisLow; ii <= axisHigh; ii++)
|
||||||
|
linkInfo.springAxisEnable[ii] = valueBool;
|
||||||
opIndex += 3;
|
opIndex += 3;
|
||||||
break;
|
break;
|
||||||
case ExtendedPhysics.PHYS_PARAM_SPRING_DAMPING:
|
case ExtendedPhysics.PHYS_PARAM_SPRING_DAMPING:
|
||||||
valueInt = (int)pParams[opIndex + 1];
|
valueInt = (int)pParams[opIndex + 1];
|
||||||
valueFloat = (float)pParams[opIndex + 2];
|
valueFloat = (float)pParams[opIndex + 2];
|
||||||
if (valueInt >=0 && valueInt < linkInfo.springDamping.Length)
|
GetAxisRange(valueInt, out axisLow, out axisHigh);
|
||||||
linkInfo.springDamping[valueInt] = valueFloat;
|
for (int ii = axisLow; ii <= axisHigh; ii++)
|
||||||
|
linkInfo.springDamping[ii] = valueFloat;
|
||||||
opIndex += 3;
|
opIndex += 3;
|
||||||
break;
|
break;
|
||||||
case ExtendedPhysics.PHYS_PARAM_SPRING_STIFFNESS:
|
case ExtendedPhysics.PHYS_PARAM_SPRING_STIFFNESS:
|
||||||
valueInt = (int)pParams[opIndex + 1];
|
valueInt = (int)pParams[opIndex + 1];
|
||||||
valueFloat = (float)pParams[opIndex + 2];
|
valueFloat = (float)pParams[opIndex + 2];
|
||||||
if (valueInt >=0 && valueInt < linkInfo.springStiffness.Length)
|
GetAxisRange(valueInt, out axisLow, out axisHigh);
|
||||||
linkInfo.springStiffness[valueInt] = valueFloat;
|
for (int ii = axisLow; ii <= axisHigh; ii++)
|
||||||
|
linkInfo.springStiffness[ii] = valueFloat;
|
||||||
opIndex += 3;
|
opIndex += 3;
|
||||||
break;
|
break;
|
||||||
|
case ExtendedPhysics.PHYS_PARAM_USE_LINEAR_FRAMEA:
|
||||||
|
valueBool = (bool)pParams[opIndex + 1];
|
||||||
|
linkInfo.useLinearReferenceFrameA = valueBool;
|
||||||
|
opIndex += 2;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -760,6 +771,32 @@ public sealed class BSLinksetConstraints : BSLinkset
|
||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Bullet constraints keep some limit parameters for each linear and angular axis.
|
||||||
|
// Setting same is easier if there is an easy way to see all or types.
|
||||||
|
// This routine returns the array limits for the set of axis.
|
||||||
|
private void GetAxisRange(int rangeSpec, out int low, out int high)
|
||||||
|
{
|
||||||
|
switch (rangeSpec)
|
||||||
|
{
|
||||||
|
case ExtendedPhysics.PHYS_AXIS_ALL_LINEAR:
|
||||||
|
low = 0;
|
||||||
|
high = 2;
|
||||||
|
break;
|
||||||
|
case ExtendedPhysics.PHYS_AXIS_ALL_ANGULAR:
|
||||||
|
low = 3;
|
||||||
|
high = 5;
|
||||||
|
break;
|
||||||
|
case ExtendedPhysics.PHYS_AXIS_ALL:
|
||||||
|
low = 0;
|
||||||
|
high = 5;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
low = high = rangeSpec;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
#endregion // Extension
|
#endregion // Extension
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue