diff options
Diffstat (limited to 'OpenSim/Region/Physics')
-rwxr-xr-x | OpenSim/Region/Physics/BulletSPlugin/BSLinksetConstraints.cs | 53 |
1 files changed, 45 insertions, 8 deletions
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSLinksetConstraints.cs b/OpenSim/Region/Physics/BulletSPlugin/BSLinksetConstraints.cs index f623231..ff5ac0e 100755 --- a/OpenSim/Region/Physics/BulletSPlugin/BSLinksetConstraints.cs +++ b/OpenSim/Region/Physics/BulletSPlugin/BSLinksetConstraints.cs | |||
@@ -58,6 +58,7 @@ public sealed class BSLinksetConstraints : BSLinkset | |||
58 | public OMV.Quaternion frameInArot; | 58 | public OMV.Quaternion frameInArot; |
59 | public OMV.Vector3 frameInBloc; | 59 | public OMV.Vector3 frameInBloc; |
60 | public OMV.Quaternion frameInBrot; | 60 | public OMV.Quaternion frameInBrot; |
61 | public bool useLinearReferenceFrameA; | ||
61 | // Spring | 62 | // Spring |
62 | public bool[] springAxisEnable; | 63 | public bool[] springAxisEnable; |
63 | public float[] springDamping; | 64 | public float[] springDamping; |
@@ -91,6 +92,7 @@ public sealed class BSLinksetConstraints : BSLinkset | |||
91 | frameInArot = OMV.Quaternion.Identity; | 92 | frameInArot = OMV.Quaternion.Identity; |
92 | frameInBloc = OMV.Vector3.Zero; | 93 | frameInBloc = OMV.Vector3.Zero; |
93 | frameInBrot = OMV.Quaternion.Identity; | 94 | frameInBrot = OMV.Quaternion.Identity; |
95 | useLinearReferenceFrameA = true; | ||
94 | springAxisEnable = new bool[6]; | 96 | springAxisEnable = new bool[6]; |
95 | springDamping = new float[6]; | 97 | springDamping = new float[6]; |
96 | springStiffness = new float[6]; | 98 | springStiffness = new float[6]; |
@@ -145,7 +147,7 @@ public sealed class BSLinksetConstraints : BSLinkset | |||
145 | { | 147 | { |
146 | constrainSpring.SetSolverIterations(solverIterations); | 148 | constrainSpring.SetSolverIterations(solverIterations); |
147 | } | 149 | } |
148 | for (int ii = 0; ii < 6; ii++) | 150 | for (int ii = 0; ii < springAxisEnable.Length; ii++) |
149 | { | 151 | { |
150 | constrainSpring.SetAxisEnable(ii, springAxisEnable[ii]); | 152 | constrainSpring.SetAxisEnable(ii, springAxisEnable[ii]); |
151 | if (springDamping[ii] != BSAPITemplate.SPRING_NOT_SPECIFIED) | 153 | if (springDamping[ii] != BSAPITemplate.SPRING_NOT_SPECIFIED) |
@@ -401,7 +403,7 @@ public sealed class BSLinksetConstraints : BSLinkset | |||
401 | case ConstraintType.D6_SPRING_CONSTRAINT_TYPE: | 403 | case ConstraintType.D6_SPRING_CONSTRAINT_TYPE: |
402 | constrain = new BSConstraintSpring(m_physicsScene.World, rootPrim.PhysBody, linkInfo.member.PhysBody, | 404 | constrain = new BSConstraintSpring(m_physicsScene.World, rootPrim.PhysBody, linkInfo.member.PhysBody, |
403 | linkInfo.frameInAloc, linkInfo.frameInArot, linkInfo.frameInBloc, linkInfo.frameInBrot, | 405 | linkInfo.frameInAloc, linkInfo.frameInArot, linkInfo.frameInBloc, linkInfo.frameInBrot, |
404 | true /*useLinearReferenceFrameA*/, | 406 | linkInfo.useLinearReferenceFrameA, |
405 | true /*disableCollisionsBetweenLinkedBodies*/); | 407 | true /*disableCollisionsBetweenLinkedBodies*/); |
406 | DetailLog("{0},BSLinksetConstraint.BuildConstraint,spring,root={1},rBody={2},child={3},cBody={4},rLoc={5},cLoc={6}", | 408 | DetailLog("{0},BSLinksetConstraint.BuildConstraint,spring,root={1},rBody={2},child={3},cBody={4},rLoc={5},cLoc={6}", |
407 | rootPrim.LocalID, | 409 | rootPrim.LocalID, |
@@ -619,6 +621,7 @@ public sealed class BSLinksetConstraints : BSLinkset | |||
619 | bool valueBool; | 621 | bool valueBool; |
620 | OMV.Vector3 valueVector; | 622 | OMV.Vector3 valueVector; |
621 | OMV.Quaternion valueQuaternion; | 623 | OMV.Quaternion valueQuaternion; |
624 | int axisLow, axisHigh; | ||
622 | 625 | ||
623 | int opIndex = 2; | 626 | int opIndex = 2; |
624 | while (opIndex < pParams.Length) | 627 | while (opIndex < pParams.Length) |
@@ -720,24 +723,32 @@ public sealed class BSLinksetConstraints : BSLinkset | |||
720 | case ExtendedPhysics.PHYS_PARAM_SPRING_AXIS_ENABLE: | 723 | case ExtendedPhysics.PHYS_PARAM_SPRING_AXIS_ENABLE: |
721 | valueInt = (int)pParams[opIndex + 1]; | 724 | valueInt = (int)pParams[opIndex + 1]; |
722 | valueBool = ((int)pParams[opIndex + 2] != 0); | 725 | valueBool = ((int)pParams[opIndex + 2] != 0); |
723 | if (valueInt >=0 && valueInt < linkInfo.springAxisEnable.Length) | 726 | GetAxisRange(valueInt, out axisLow, out axisHigh); |
724 | linkInfo.springAxisEnable[valueInt] = valueBool; | 727 | for (int ii = axisLow; ii <= axisHigh; ii++) |
728 | linkInfo.springAxisEnable[ii] = valueBool; | ||
725 | opIndex += 3; | 729 | opIndex += 3; |
726 | break; | 730 | break; |
727 | case ExtendedPhysics.PHYS_PARAM_SPRING_DAMPING: | 731 | case ExtendedPhysics.PHYS_PARAM_SPRING_DAMPING: |
728 | valueInt = (int)pParams[opIndex + 1]; | 732 | valueInt = (int)pParams[opIndex + 1]; |
729 | valueFloat = (float)pParams[opIndex + 2]; | 733 | valueFloat = (float)pParams[opIndex + 2]; |
730 | if (valueInt >=0 && valueInt < linkInfo.springDamping.Length) | 734 | GetAxisRange(valueInt, out axisLow, out axisHigh); |
731 | linkInfo.springDamping[valueInt] = valueFloat; | 735 | for (int ii = axisLow; ii <= axisHigh; ii++) |
736 | linkInfo.springDamping[ii] = valueFloat; | ||
732 | opIndex += 3; | 737 | opIndex += 3; |
733 | break; | 738 | break; |
734 | case ExtendedPhysics.PHYS_PARAM_SPRING_STIFFNESS: | 739 | case ExtendedPhysics.PHYS_PARAM_SPRING_STIFFNESS: |
735 | valueInt = (int)pParams[opIndex + 1]; | 740 | valueInt = (int)pParams[opIndex + 1]; |
736 | valueFloat = (float)pParams[opIndex + 2]; | 741 | valueFloat = (float)pParams[opIndex + 2]; |
737 | if (valueInt >=0 && valueInt < linkInfo.springStiffness.Length) | 742 | GetAxisRange(valueInt, out axisLow, out axisHigh); |
738 | linkInfo.springStiffness[valueInt] = valueFloat; | 743 | for (int ii = axisLow; ii <= axisHigh; ii++) |
744 | linkInfo.springStiffness[ii] = valueFloat; | ||
739 | opIndex += 3; | 745 | opIndex += 3; |
740 | break; | 746 | break; |
747 | case ExtendedPhysics.PHYS_PARAM_USE_LINEAR_FRAMEA: | ||
748 | valueBool = (bool)pParams[opIndex + 1]; | ||
749 | linkInfo.useLinearReferenceFrameA = valueBool; | ||
750 | opIndex += 2; | ||
751 | break; | ||
741 | default: | 752 | default: |
742 | break; | 753 | break; |
743 | } | 754 | } |
@@ -760,6 +771,32 @@ public sealed class BSLinksetConstraints : BSLinkset | |||
760 | } | 771 | } |
761 | return ret; | 772 | return ret; |
762 | } | 773 | } |
774 | |||
775 | // Bullet constraints keep some limit parameters for each linear and angular axis. | ||
776 | // Setting same is easier if there is an easy way to see all or types. | ||
777 | // This routine returns the array limits for the set of axis. | ||
778 | private void GetAxisRange(int rangeSpec, out int low, out int high) | ||
779 | { | ||
780 | switch (rangeSpec) | ||
781 | { | ||
782 | case ExtendedPhysics.PHYS_AXIS_ALL_LINEAR: | ||
783 | low = 0; | ||
784 | high = 2; | ||
785 | break; | ||
786 | case ExtendedPhysics.PHYS_AXIS_ALL_ANGULAR: | ||
787 | low = 3; | ||
788 | high = 5; | ||
789 | break; | ||
790 | case ExtendedPhysics.PHYS_AXIS_ALL: | ||
791 | low = 0; | ||
792 | high = 5; | ||
793 | break; | ||
794 | default: | ||
795 | low = high = rangeSpec; | ||
796 | break; | ||
797 | } | ||
798 | return; | ||
799 | } | ||
763 | #endregion // Extension | 800 | #endregion // Extension |
764 | 801 | ||
765 | } | 802 | } |