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.
|
||||
// The choice if 14400 is arbitrary and only serves to catch parameter code misuse.
|
||||
public const int PHYS_PARAM_MIN = 14401;
|
||||
|
||||
[ScriptConstant]
|
||||
public const int PHYS_PARAM_FRAMEINA_LOC = 14401;
|
||||
[ScriptConstant]
|
||||
|
@ -401,7 +402,10 @@ public class ExtendedPhysics : INonSharedRegionModule
|
|||
public const int PHYS_PARAM_SPRING_DAMPING = 14416;
|
||||
[ScriptConstant]
|
||||
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, ...])
|
||||
[ScriptInvocation]
|
||||
|
|
|
@ -59,9 +59,11 @@ public class BSConstraint6Dof : BSConstraint
|
|||
frame2, frame2rot,
|
||||
useLinearReferenceFrameA, disableCollisionsBetweenLinkedBodies);
|
||||
m_enabled = true;
|
||||
world.physicsScene.DetailLog("{0},BS6DofConstraint,createFrame,wID={1}, rID={2}, rBody={3}, cID={4}, cBody={5}",
|
||||
BSScene.DetailLogZero, world.worldID,
|
||||
PhysicsScene.DetailLog("{0},BS6DofConstraint,create,wID={1}, rID={2}, rBody={3}, cID={4}, cBody={5}",
|
||||
m_body1.ID, world.worldID,
|
||||
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
|
||||
|
@ -86,9 +88,11 @@ public class BSConstraint6Dof : BSConstraint
|
|||
m_constraint = PhysicsScene.PE.Create6DofConstraintToPoint(m_world, m_body1, m_body2,
|
||||
joinPoint,
|
||||
useLinearReferenceFrameA, disableCollisionsBetweenLinkedBodies);
|
||||
|
||||
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);
|
||||
|
||||
if (!m_constraint.HasPhysicalConstraint)
|
||||
{
|
||||
world.physicsScene.Logger.ErrorFormat("{0} Failed creation of 6Dof constraint. rootID={1}, childID={2}",
|
||||
|
@ -113,8 +117,10 @@ public class BSConstraint6Dof : BSConstraint
|
|||
frameInBloc, frameInBrot,
|
||||
useLinearReferenceFrameB, disableCollisionsBetweenLinkedBodies);
|
||||
m_enabled = true;
|
||||
world.physicsScene.DetailLog("{0},BS6DofConstraint,createFixed,wID={1},rID={2},rBody={3}",
|
||||
BSScene.DetailLogZero, world.worldID, obj1.ID, obj1.AddrString);
|
||||
PhysicsScene.DetailLog("{0},BS6DofConstraint,createFixed,wID={1},rID={2},rBody={3}",
|
||||
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)
|
||||
|
|
|
@ -47,37 +47,42 @@ public sealed class BSConstraintSpring : BSConstraint6Dof
|
|||
useLinearReferenceFrameA, disableCollisionsBetweenLinkedBodies);
|
||||
m_enabled = true;
|
||||
|
||||
world.physicsScene.DetailLog("{0},BSConstraintSpring,createFrame,wID={1}, rID={2}, rBody={3}, cID={4}, cBody={5}",
|
||||
BSScene.DetailLogZero, world.worldID,
|
||||
obj1.ID, obj1.AddrString, obj2.ID, obj2.AddrString);
|
||||
PhysicsScene.DetailLog("{0},BSConstraintSpring,create,wID={1}, rID={2}, rBody={3}, cID={4}, cBody={5}",
|
||||
obj1.ID, world.worldID, 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;
|
||||
|
||||
return ret;
|
||||
PhysicsScene.DetailLog("{0},BSConstraintSpring.SetEnable,obj1ID={1},obj2ID={2},indx={3},enable={4}",
|
||||
m_body1.ID, m_body1.ID, m_body2.ID, pIndex, pAxisEnable);
|
||||
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;
|
||||
|
||||
return ret;
|
||||
PhysicsScene.DetailLog("{0},BSConstraintSpring.SetStiffness,obj1ID={1},obj2ID={2},indx={3},enable={4}",
|
||||
m_body1.ID, m_body1.ID, m_body2.ID, pIndex, pStiffness);
|
||||
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;
|
||||
|
||||
return ret;
|
||||
PhysicsScene.DetailLog("{0},BSConstraintSpring.SetDamping,obj1ID={1},obj2ID={2},indx={3},enable={4}",
|
||||
m_body1.ID, m_body1.ID, m_body2.ID, pIndex, pDamping);
|
||||
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;
|
||||
|
||||
return ret;
|
||||
PhysicsScene.DetailLog("{0},BSConstraintSpring.SetEquilibriumPoint,obj1ID={1},obj2ID={2},indx={3},enable={4}",
|
||||
m_body1.ID, m_body1.ID, m_body2.ID, pIndex, pEqPoint);
|
||||
PhysicsScene.PE.SpringSetEquilibriumPoint(m_constraint, pIndex, pEqPoint);
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -67,6 +67,7 @@ public sealed class BSLinksetConstraints : BSLinkset
|
|||
{
|
||||
constraint = null;
|
||||
ResetLink();
|
||||
member.PhysScene.DetailLog("{0},BSLinkInfoConstraint.creation", member.LocalID);
|
||||
}
|
||||
|
||||
// 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;
|
||||
springDamping = -1f;
|
||||
springStiffness = -1f;
|
||||
member.PhysScene.DetailLog("{0},BSLinkInfoConstraint.ResetLink", member.LocalID);
|
||||
}
|
||||
|
||||
// Given a constraint, apply the current constraint parameters to same.
|
||||
public override void SetLinkParameters(BSConstraint constrain)
|
||||
{
|
||||
member.PhysScene.DetailLog("{0},BSLinkInfoConstraint.SetLinkParameters,type={1}", member.LocalID, constraintType);
|
||||
switch (constraintType)
|
||||
{
|
||||
case ConstraintType.FIXED_CONSTRAINT_TYPE:
|
||||
|
@ -139,7 +142,7 @@ public sealed class BSLinksetConstraints : BSLinkset
|
|||
if (springDamping != -1)
|
||||
constrainSpring.SetDamping(ii, springDamping);
|
||||
if (springStiffness != -1)
|
||||
constrainSpring.SetStiffness(ii, springStiffness);
|
||||
constrainSpring.SetStiffness(ii, springStiffness);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
@ -155,7 +158,6 @@ public sealed class BSLinksetConstraints : BSLinkset
|
|||
public override bool ShouldUpdateChildProperties()
|
||||
{
|
||||
bool ret = true;
|
||||
|
||||
if (constraintType == ConstraintType.FIXED_CONSTRAINT_TYPE)
|
||||
ret = false;
|
||||
|
||||
|
@ -193,10 +195,16 @@ public sealed class BSLinksetConstraints : BSLinkset
|
|||
{
|
||||
// Queue to happen after all the other taint processing
|
||||
m_physicsScene.PostTaintObject("BSLinksetContraints.Refresh", requestor.LocalID, delegate()
|
||||
{
|
||||
if (HasAnyChildren)
|
||||
{
|
||||
if (HasAnyChildren)
|
||||
RecomputeLinksetConstraints();
|
||||
});
|
||||
// Constraints that have not been changed are not rebuild but make sure
|
||||
// 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,
|
||||
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 (m_physicsScene.Constraints.RemoveAndDestroyConstraint(rootPrim.PhysBody, childPrim.PhysBody))
|
||||
// If asked to unlink root from root, just remove all the constraints
|
||||
if (rootPrim == childPrim || childPrim == LinksetRoot)
|
||||
{
|
||||
// Make the child refresh its location
|
||||
m_physicsScene.PE.PushUpdate(childPrim.PhysBody);
|
||||
PhysicallyUnlinkAllChildrenFromRoot(LinksetRoot);
|
||||
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;
|
||||
}
|
||||
|
@ -521,8 +538,6 @@ public sealed class BSLinksetConstraints : BSLinkset
|
|||
BSLinkInfoConstraint linkInfoC = linkInfo as BSLinkInfoConstraint;
|
||||
if (linkInfoC != null)
|
||||
{
|
||||
// Setting to fixed is easy. The reset state is the fixed link configuration.
|
||||
linkInfoC.ResetLink();
|
||||
linkInfoC.constraintType = (ConstraintType)requestedType;
|
||||
ret = (object)true;
|
||||
DetailLog("{0},BSLinksetConstraint.ChangeLinkType,link={1},type={2}",
|
||||
|
@ -589,6 +604,7 @@ public sealed class BSLinksetConstraints : BSLinkset
|
|||
BSLinkInfoConstraint linkInfo = baseLinkInfo as BSLinkInfoConstraint;
|
||||
if (linkInfo != null)
|
||||
{
|
||||
int valueInt;
|
||||
float valueFloat;
|
||||
bool valueBool;
|
||||
OMV.Vector3 valueVector;
|
||||
|
@ -602,6 +618,20 @@ public sealed class BSLinksetConstraints : BSLinkset
|
|||
linkInfo.member.LocalID, thisOp, pParams[opIndex+1]);
|
||||
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:
|
||||
valueVector = (OMV.Vector3)pParams[opIndex + 1];
|
||||
linkInfo.frameInAloc = valueVector;
|
||||
|
|
Loading…
Reference in New Issue