BulletSim: implementation of setting spring specific physical parameters. Add setting of linkset type to physChangeLinkParams. Lots of detail logging for setting of linkset constraint parameters.
parent
6ade1c6c76
commit
2e32b2aacb
|
@ -367,6 +367,7 @@ public class ExtendedPhysics : INonSharedRegionModule
|
||||||
// Code for specifying params.
|
// Code for specifying params.
|
||||||
// The choice if 14400 is arbitrary and only serves to catch parameter code misuse.
|
// The choice if 14400 is arbitrary and only serves to catch parameter code misuse.
|
||||||
public const int PHYS_PARAM_MIN = 14401;
|
public const int PHYS_PARAM_MIN = 14401;
|
||||||
|
|
||||||
[ScriptConstant]
|
[ScriptConstant]
|
||||||
public const int PHYS_PARAM_FRAMEINA_LOC = 14401;
|
public const int PHYS_PARAM_FRAMEINA_LOC = 14401;
|
||||||
[ScriptConstant]
|
[ScriptConstant]
|
||||||
|
@ -401,7 +402,10 @@ public class ExtendedPhysics : INonSharedRegionModule
|
||||||
public const int PHYS_PARAM_SPRING_DAMPING = 14416;
|
public const int PHYS_PARAM_SPRING_DAMPING = 14416;
|
||||||
[ScriptConstant]
|
[ScriptConstant]
|
||||||
public const int PHYS_PARAM_SPRING_STIFFNESS = 14417;
|
public const int PHYS_PARAM_SPRING_STIFFNESS = 14417;
|
||||||
public const int PHYS_PARAM_MAX = 14417;
|
[ScriptConstant]
|
||||||
|
public const int PHYS_PARAM_LINK_TYPE = 14418;
|
||||||
|
|
||||||
|
public const int PHYS_PARAM_MAX = 14418;
|
||||||
|
|
||||||
// physChangeLinkParams(integer linkNum, [ PHYS_PARAM_*, value, PHYS_PARAM_*, value, ...])
|
// physChangeLinkParams(integer linkNum, [ PHYS_PARAM_*, value, PHYS_PARAM_*, value, ...])
|
||||||
[ScriptInvocation]
|
[ScriptInvocation]
|
||||||
|
|
|
@ -59,9 +59,11 @@ public class BSConstraint6Dof : BSConstraint
|
||||||
frame2, frame2rot,
|
frame2, frame2rot,
|
||||||
useLinearReferenceFrameA, disableCollisionsBetweenLinkedBodies);
|
useLinearReferenceFrameA, disableCollisionsBetweenLinkedBodies);
|
||||||
m_enabled = true;
|
m_enabled = true;
|
||||||
world.physicsScene.DetailLog("{0},BS6DofConstraint,createFrame,wID={1}, rID={2}, rBody={3}, cID={4}, cBody={5}",
|
PhysicsScene.DetailLog("{0},BS6DofConstraint,create,wID={1}, rID={2}, rBody={3}, cID={4}, cBody={5}",
|
||||||
BSScene.DetailLogZero, world.worldID,
|
m_body1.ID, world.worldID,
|
||||||
obj1.ID, obj1.AddrString, obj2.ID, obj2.AddrString);
|
obj1.ID, obj1.AddrString, obj2.ID, obj2.AddrString);
|
||||||
|
PhysicsScene.DetailLog("{0},BS6DofConstraint,create, f1Loc={1},f1Rot={2},f2Loc={3},f2Rot={4},usefA={5},disCol={6}",
|
||||||
|
m_body1.ID, frame1, frame1rot, frame2, frame2rot, useLinearReferenceFrameA, disableCollisionsBetweenLinkedBodies);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 6 Dof constraint based on a midpoint between the two constrained bodies
|
// 6 Dof constraint based on a midpoint between the two constrained bodies
|
||||||
|
@ -86,9 +88,11 @@ public class BSConstraint6Dof : BSConstraint
|
||||||
m_constraint = PhysicsScene.PE.Create6DofConstraintToPoint(m_world, m_body1, m_body2,
|
m_constraint = PhysicsScene.PE.Create6DofConstraintToPoint(m_world, m_body1, m_body2,
|
||||||
joinPoint,
|
joinPoint,
|
||||||
useLinearReferenceFrameA, disableCollisionsBetweenLinkedBodies);
|
useLinearReferenceFrameA, disableCollisionsBetweenLinkedBodies);
|
||||||
|
|
||||||
PhysicsScene.DetailLog("{0},BS6DofConstraint,createMidPoint,wID={1}, csrt={2}, rID={3}, rBody={4}, cID={5}, cBody={6}",
|
PhysicsScene.DetailLog("{0},BS6DofConstraint,createMidPoint,wID={1}, csrt={2}, rID={3}, rBody={4}, cID={5}, cBody={6}",
|
||||||
BSScene.DetailLogZero, world.worldID, m_constraint.AddrString,
|
m_body1.ID, world.worldID, m_constraint.AddrString,
|
||||||
obj1.ID, obj1.AddrString, obj2.ID, obj2.AddrString);
|
obj1.ID, obj1.AddrString, obj2.ID, obj2.AddrString);
|
||||||
|
|
||||||
if (!m_constraint.HasPhysicalConstraint)
|
if (!m_constraint.HasPhysicalConstraint)
|
||||||
{
|
{
|
||||||
world.physicsScene.Logger.ErrorFormat("{0} Failed creation of 6Dof constraint. rootID={1}, childID={2}",
|
world.physicsScene.Logger.ErrorFormat("{0} Failed creation of 6Dof constraint. rootID={1}, childID={2}",
|
||||||
|
@ -113,8 +117,10 @@ public class BSConstraint6Dof : BSConstraint
|
||||||
frameInBloc, frameInBrot,
|
frameInBloc, frameInBrot,
|
||||||
useLinearReferenceFrameB, disableCollisionsBetweenLinkedBodies);
|
useLinearReferenceFrameB, disableCollisionsBetweenLinkedBodies);
|
||||||
m_enabled = true;
|
m_enabled = true;
|
||||||
world.physicsScene.DetailLog("{0},BS6DofConstraint,createFixed,wID={1},rID={2},rBody={3}",
|
PhysicsScene.DetailLog("{0},BS6DofConstraint,createFixed,wID={1},rID={2},rBody={3}",
|
||||||
BSScene.DetailLogZero, world.worldID, obj1.ID, obj1.AddrString);
|
m_body1.ID, world.worldID, obj1.ID, obj1.AddrString);
|
||||||
|
PhysicsScene.DetailLog("{0},BS6DofConstraint,createFixed, fBLoc={1},fBRot={2},usefA={3},disCol={4}",
|
||||||
|
m_body1.ID, frameInBloc, frameInBrot, useLinearReferenceFrameB, disableCollisionsBetweenLinkedBodies);
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool SetFrames(Vector3 frameA, Quaternion frameArot, Vector3 frameB, Quaternion frameBrot)
|
public bool SetFrames(Vector3 frameA, Quaternion frameArot, Vector3 frameB, Quaternion frameBrot)
|
||||||
|
|
|
@ -47,37 +47,42 @@ public sealed class BSConstraintSpring : BSConstraint6Dof
|
||||||
useLinearReferenceFrameA, disableCollisionsBetweenLinkedBodies);
|
useLinearReferenceFrameA, disableCollisionsBetweenLinkedBodies);
|
||||||
m_enabled = true;
|
m_enabled = true;
|
||||||
|
|
||||||
world.physicsScene.DetailLog("{0},BSConstraintSpring,createFrame,wID={1}, rID={2}, rBody={3}, cID={4}, cBody={5}",
|
PhysicsScene.DetailLog("{0},BSConstraintSpring,create,wID={1}, rID={2}, rBody={3}, cID={4}, cBody={5}",
|
||||||
BSScene.DetailLogZero, world.worldID,
|
obj1.ID, world.worldID, obj1.ID, obj1.AddrString, obj2.ID, obj2.AddrString);
|
||||||
obj1.ID, obj1.AddrString, obj2.ID, obj2.AddrString);
|
PhysicsScene.DetailLog("{0},BSConstraintSpring,create, f1Loc={1},f1Rot={2},f2Loc={3},f2Rot={4},usefA={5},disCol={6}",
|
||||||
|
m_body1.ID, frame1Loc, frame1Rot, frame2Loc, frame2Rot, useLinearReferenceFrameA, disableCollisionsBetweenLinkedBodies);
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool SetEnable(int index, bool axisEnable)
|
public bool SetEnable(int pIndex, bool pAxisEnable)
|
||||||
{
|
{
|
||||||
bool ret = false;
|
PhysicsScene.DetailLog("{0},BSConstraintSpring.SetEnable,obj1ID={1},obj2ID={2},indx={3},enable={4}",
|
||||||
|
m_body1.ID, m_body1.ID, m_body2.ID, pIndex, pAxisEnable);
|
||||||
return ret;
|
PhysicsScene.PE.SpringEnable(m_constraint, pIndex, BSParam.NumericBool(pAxisEnable));
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool SetStiffness(int index, float stiffness)
|
public bool SetStiffness(int pIndex, float pStiffness)
|
||||||
{
|
{
|
||||||
bool ret = false;
|
PhysicsScene.DetailLog("{0},BSConstraintSpring.SetStiffness,obj1ID={1},obj2ID={2},indx={3},enable={4}",
|
||||||
|
m_body1.ID, m_body1.ID, m_body2.ID, pIndex, pStiffness);
|
||||||
return ret;
|
PhysicsScene.PE.SpringSetStiffness(m_constraint, pIndex, pStiffness);
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool SetDamping(int index, float damping)
|
public bool SetDamping(int pIndex, float pDamping)
|
||||||
{
|
{
|
||||||
bool ret = false;
|
PhysicsScene.DetailLog("{0},BSConstraintSpring.SetDamping,obj1ID={1},obj2ID={2},indx={3},enable={4}",
|
||||||
|
m_body1.ID, m_body1.ID, m_body2.ID, pIndex, pDamping);
|
||||||
return ret;
|
PhysicsScene.PE.SpringSetDamping(m_constraint, pIndex, pDamping);
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool SetEquilibriumPoint(int index, float eqPoint)
|
public bool SetEquilibriumPoint(int pIndex, float pEqPoint)
|
||||||
{
|
{
|
||||||
bool ret = false;
|
PhysicsScene.DetailLog("{0},BSConstraintSpring.SetEquilibriumPoint,obj1ID={1},obj2ID={2},indx={3},enable={4}",
|
||||||
|
m_body1.ID, m_body1.ID, m_body2.ID, pIndex, pEqPoint);
|
||||||
return ret;
|
PhysicsScene.PE.SpringSetEquilibriumPoint(m_constraint, pIndex, pEqPoint);
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -67,6 +67,7 @@ public sealed class BSLinksetConstraints : BSLinkset
|
||||||
{
|
{
|
||||||
constraint = null;
|
constraint = null;
|
||||||
ResetLink();
|
ResetLink();
|
||||||
|
member.PhysScene.DetailLog("{0},BSLinkInfoConstraint.creation", member.LocalID);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set all the parameters for this constraint to a fixed, non-movable constraint.
|
// Set all the parameters for this constraint to a fixed, non-movable constraint.
|
||||||
|
@ -91,11 +92,13 @@ public sealed class BSLinksetConstraints : BSLinkset
|
||||||
frameInBrot = OMV.Quaternion.Identity;
|
frameInBrot = OMV.Quaternion.Identity;
|
||||||
springDamping = -1f;
|
springDamping = -1f;
|
||||||
springStiffness = -1f;
|
springStiffness = -1f;
|
||||||
|
member.PhysScene.DetailLog("{0},BSLinkInfoConstraint.ResetLink", member.LocalID);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Given a constraint, apply the current constraint parameters to same.
|
// Given a constraint, apply the current constraint parameters to same.
|
||||||
public override void SetLinkParameters(BSConstraint constrain)
|
public override void SetLinkParameters(BSConstraint constrain)
|
||||||
{
|
{
|
||||||
|
member.PhysScene.DetailLog("{0},BSLinkInfoConstraint.SetLinkParameters,type={1}", member.LocalID, constraintType);
|
||||||
switch (constraintType)
|
switch (constraintType)
|
||||||
{
|
{
|
||||||
case ConstraintType.FIXED_CONSTRAINT_TYPE:
|
case ConstraintType.FIXED_CONSTRAINT_TYPE:
|
||||||
|
@ -139,7 +142,7 @@ public sealed class BSLinksetConstraints : BSLinkset
|
||||||
if (springDamping != -1)
|
if (springDamping != -1)
|
||||||
constrainSpring.SetDamping(ii, springDamping);
|
constrainSpring.SetDamping(ii, springDamping);
|
||||||
if (springStiffness != -1)
|
if (springStiffness != -1)
|
||||||
constrainSpring.SetStiffness(ii, springStiffness);
|
constrainSpring.SetStiffness(ii, springStiffness);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -155,7 +158,6 @@ public sealed class BSLinksetConstraints : BSLinkset
|
||||||
public override bool ShouldUpdateChildProperties()
|
public override bool ShouldUpdateChildProperties()
|
||||||
{
|
{
|
||||||
bool ret = true;
|
bool ret = true;
|
||||||
|
|
||||||
if (constraintType == ConstraintType.FIXED_CONSTRAINT_TYPE)
|
if (constraintType == ConstraintType.FIXED_CONSTRAINT_TYPE)
|
||||||
ret = false;
|
ret = false;
|
||||||
|
|
||||||
|
@ -193,10 +195,16 @@ public sealed class BSLinksetConstraints : BSLinkset
|
||||||
{
|
{
|
||||||
// Queue to happen after all the other taint processing
|
// Queue to happen after all the other taint processing
|
||||||
m_physicsScene.PostTaintObject("BSLinksetContraints.Refresh", requestor.LocalID, delegate()
|
m_physicsScene.PostTaintObject("BSLinksetContraints.Refresh", requestor.LocalID, delegate()
|
||||||
|
{
|
||||||
|
if (HasAnyChildren)
|
||||||
{
|
{
|
||||||
if (HasAnyChildren)
|
// Constraints that have not been changed are not rebuild but make sure
|
||||||
RecomputeLinksetConstraints();
|
// the constraint of the requestor is rebuilt.
|
||||||
});
|
PhysicallyUnlinkAChildFromRoot(LinksetRoot, requestor);
|
||||||
|
// Rebuild the linkset and all its constraints.
|
||||||
|
RecomputeLinksetConstraints();
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -415,13 +423,22 @@ public sealed class BSLinksetConstraints : BSLinkset
|
||||||
rootPrim.LocalID, rootPrim.PhysBody.AddrString,
|
rootPrim.LocalID, rootPrim.PhysBody.AddrString,
|
||||||
childPrim.LocalID, childPrim.PhysBody.AddrString);
|
childPrim.LocalID, childPrim.PhysBody.AddrString);
|
||||||
|
|
||||||
// Find the constraint for this link and get rid of it from the overall collection and from my list
|
// If asked to unlink root from root, just remove all the constraints
|
||||||
if (m_physicsScene.Constraints.RemoveAndDestroyConstraint(rootPrim.PhysBody, childPrim.PhysBody))
|
if (rootPrim == childPrim || childPrim == LinksetRoot)
|
||||||
{
|
{
|
||||||
// Make the child refresh its location
|
PhysicallyUnlinkAllChildrenFromRoot(LinksetRoot);
|
||||||
m_physicsScene.PE.PushUpdate(childPrim.PhysBody);
|
|
||||||
ret = true;
|
ret = true;
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Find the constraint for this link and get rid of it from the overall collection and from my list
|
||||||
|
if (m_physicsScene.Constraints.RemoveAndDestroyConstraint(rootPrim.PhysBody, childPrim.PhysBody))
|
||||||
|
{
|
||||||
|
// Make the child refresh its location
|
||||||
|
m_physicsScene.PE.PushUpdate(childPrim.PhysBody);
|
||||||
|
ret = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -521,8 +538,6 @@ public sealed class BSLinksetConstraints : BSLinkset
|
||||||
BSLinkInfoConstraint linkInfoC = linkInfo as BSLinkInfoConstraint;
|
BSLinkInfoConstraint linkInfoC = linkInfo as BSLinkInfoConstraint;
|
||||||
if (linkInfoC != null)
|
if (linkInfoC != null)
|
||||||
{
|
{
|
||||||
// Setting to fixed is easy. The reset state is the fixed link configuration.
|
|
||||||
linkInfoC.ResetLink();
|
|
||||||
linkInfoC.constraintType = (ConstraintType)requestedType;
|
linkInfoC.constraintType = (ConstraintType)requestedType;
|
||||||
ret = (object)true;
|
ret = (object)true;
|
||||||
DetailLog("{0},BSLinksetConstraint.ChangeLinkType,link={1},type={2}",
|
DetailLog("{0},BSLinksetConstraint.ChangeLinkType,link={1},type={2}",
|
||||||
|
@ -589,6 +604,7 @@ public sealed class BSLinksetConstraints : BSLinkset
|
||||||
BSLinkInfoConstraint linkInfo = baseLinkInfo as BSLinkInfoConstraint;
|
BSLinkInfoConstraint linkInfo = baseLinkInfo as BSLinkInfoConstraint;
|
||||||
if (linkInfo != null)
|
if (linkInfo != null)
|
||||||
{
|
{
|
||||||
|
int valueInt;
|
||||||
float valueFloat;
|
float valueFloat;
|
||||||
bool valueBool;
|
bool valueBool;
|
||||||
OMV.Vector3 valueVector;
|
OMV.Vector3 valueVector;
|
||||||
|
@ -602,6 +618,20 @@ public sealed class BSLinksetConstraints : BSLinkset
|
||||||
linkInfo.member.LocalID, thisOp, pParams[opIndex+1]);
|
linkInfo.member.LocalID, thisOp, pParams[opIndex+1]);
|
||||||
switch (thisOp)
|
switch (thisOp)
|
||||||
{
|
{
|
||||||
|
case ExtendedPhysics.PHYS_PARAM_LINK_TYPE:
|
||||||
|
valueInt = (int)pParams[opIndex + 1];
|
||||||
|
ConstraintType valueType = (ConstraintType)valueInt;
|
||||||
|
if (valueType == ConstraintType.FIXED_CONSTRAINT_TYPE
|
||||||
|
|| valueType == ConstraintType.D6_CONSTRAINT_TYPE
|
||||||
|
|| valueType == ConstraintType.D6_SPRING_CONSTRAINT_TYPE
|
||||||
|
|| valueType == ConstraintType.HINGE_CONSTRAINT_TYPE
|
||||||
|
|| valueType == ConstraintType.CONETWIST_CONSTRAINT_TYPE
|
||||||
|
|| valueType == ConstraintType.SLIDER_CONSTRAINT_TYPE)
|
||||||
|
{
|
||||||
|
linkInfo.constraintType = valueType;
|
||||||
|
}
|
||||||
|
opIndex += 2;
|
||||||
|
break;
|
||||||
case ExtendedPhysics.PHYS_PARAM_FRAMEINA_LOC:
|
case ExtendedPhysics.PHYS_PARAM_FRAMEINA_LOC:
|
||||||
valueVector = (OMV.Vector3)pParams[opIndex + 1];
|
valueVector = (OMV.Vector3)pParams[opIndex + 1];
|
||||||
linkInfo.frameInAloc = valueVector;
|
linkInfo.frameInAloc = valueVector;
|
||||||
|
|
Loading…
Reference in New Issue