diff options
Diffstat (limited to '')
-rwxr-xr-x | OpenSim/Region/Physics/BulletSPlugin/BSConstraint.cs | 79 |
1 files changed, 33 insertions, 46 deletions
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSConstraint.cs b/OpenSim/Region/Physics/BulletSPlugin/BSConstraint.cs index ea3093a..25084d8 100755 --- a/OpenSim/Region/Physics/BulletSPlugin/BSConstraint.cs +++ b/OpenSim/Region/Physics/BulletSPlugin/BSConstraint.cs | |||
@@ -32,35 +32,26 @@ using OpenMetaverse; | |||
32 | namespace OpenSim.Region.Physics.BulletSPlugin | 32 | namespace OpenSim.Region.Physics.BulletSPlugin |
33 | { | 33 | { |
34 | 34 | ||
35 | public class BSConstraint : IDisposable | 35 | public abstract class BSConstraint : IDisposable |
36 | { | 36 | { |
37 | private BulletSim m_world; | 37 | protected BulletSim m_world; |
38 | private BulletBody m_body1; | 38 | protected BulletBody m_body1; |
39 | private BulletBody m_body2; | 39 | protected BulletBody m_body2; |
40 | private BulletConstraint m_constraint; | 40 | protected BulletConstraint m_constraint; |
41 | private bool m_enabled = false; | 41 | protected bool m_enabled = false; |
42 | 42 | ||
43 | public BSConstraint(BulletSim world, BulletBody obj1, BulletBody obj2, | 43 | public BSConstraint() |
44 | Vector3 frame1, Quaternion frame1rot, | ||
45 | Vector3 frame2, Quaternion frame2rot | ||
46 | ) | ||
47 | { | 44 | { |
48 | m_world = world; | ||
49 | m_body1 = obj1; | ||
50 | m_body2 = obj2; | ||
51 | m_constraint = new BulletConstraint(BulletSimAPI.CreateConstraint2(m_world.Ptr, m_body1.Ptr, m_body2.Ptr, | ||
52 | frame1, frame1rot, | ||
53 | frame2, frame2rot, | ||
54 | true /*useLinearReferenceFrameA*/, true /*disableCollisionsBetweenLinkedBodies*/)); | ||
55 | m_enabled = true; | ||
56 | } | 45 | } |
57 | 46 | ||
58 | public void Dispose() | 47 | public virtual void Dispose() |
59 | { | 48 | { |
60 | if (m_enabled) | 49 | if (m_enabled) |
61 | { | 50 | { |
62 | // BulletSimAPI.RemoveConstraint(m_world.ID, m_body1.ID, m_body2.ID); | 51 | // BulletSimAPI.RemoveConstraint(m_world.ID, m_body1.ID, m_body2.ID); |
63 | BulletSimAPI.DestroyConstraint2(m_world.Ptr, m_constraint.Ptr); | 52 | bool success = BulletSimAPI.DestroyConstraint2(m_world.Ptr, m_constraint.Ptr); |
53 | m_world.scene.DetailLog("{0},BSConstraint.Dispose,taint,body1={1},body2={2},success={3}", BSScene.DetailLogZero, m_body1.ID, m_body2.ID, success); | ||
54 | m_constraint.Ptr = System.IntPtr.Zero; | ||
64 | m_enabled = false; | 55 | m_enabled = false; |
65 | } | 56 | } |
66 | } | 57 | } |
@@ -68,7 +59,7 @@ public class BSConstraint : IDisposable | |||
68 | public BulletBody Body1 { get { return m_body1; } } | 59 | public BulletBody Body1 { get { return m_body1; } } |
69 | public BulletBody Body2 { get { return m_body2; } } | 60 | public BulletBody Body2 { get { return m_body2; } } |
70 | 61 | ||
71 | public bool SetLinearLimits(Vector3 low, Vector3 high) | 62 | public virtual bool SetLinearLimits(Vector3 low, Vector3 high) |
72 | { | 63 | { |
73 | bool ret = false; | 64 | bool ret = false; |
74 | if (m_enabled) | 65 | if (m_enabled) |
@@ -76,7 +67,7 @@ public class BSConstraint : IDisposable | |||
76 | return ret; | 67 | return ret; |
77 | } | 68 | } |
78 | 69 | ||
79 | public bool SetAngularLimits(Vector3 low, Vector3 high) | 70 | public virtual bool SetAngularLimits(Vector3 low, Vector3 high) |
80 | { | 71 | { |
81 | bool ret = false; | 72 | bool ret = false; |
82 | if (m_enabled) | 73 | if (m_enabled) |
@@ -84,40 +75,36 @@ public class BSConstraint : IDisposable | |||
84 | return ret; | 75 | return ret; |
85 | } | 76 | } |
86 | 77 | ||
87 | public bool SetCFMAndERP(float cfm, float erp) | 78 | public virtual bool CalculateTransforms() |
88 | { | ||
89 | bool ret = true; | ||
90 | BulletSimAPI.SetConstraintParam2(m_constraint.Ptr, ConstraintParams.BT_CONSTRAINT_STOP_CFM, cfm, ConstraintParamAxis.AXIS_ALL); | ||
91 | BulletSimAPI.SetConstraintParam2(m_constraint.Ptr, ConstraintParams.BT_CONSTRAINT_STOP_ERP, erp, ConstraintParamAxis.AXIS_ALL); | ||
92 | BulletSimAPI.SetConstraintParam2(m_constraint.Ptr, ConstraintParams.BT_CONSTRAINT_CFM, cfm, ConstraintParamAxis.AXIS_ALL); | ||
93 | return ret; | ||
94 | } | ||
95 | |||
96 | public bool UseFrameOffset(bool useOffset) | ||
97 | { | ||
98 | bool ret = false; | ||
99 | float onOff = useOffset ? ConfigurationParameters.numericTrue : ConfigurationParameters.numericFalse; | ||
100 | if (m_enabled) | ||
101 | ret = BulletSimAPI.UseFrameOffset2(m_constraint.Ptr, onOff); | ||
102 | return ret; | ||
103 | } | ||
104 | |||
105 | public bool TranslationalLimitMotor(bool enable, float targetVelocity, float maxMotorForce) | ||
106 | { | 79 | { |
107 | bool ret = false; | 80 | bool ret = false; |
108 | float onOff = enable ? ConfigurationParameters.numericTrue : ConfigurationParameters.numericFalse; | ||
109 | if (m_enabled) | 81 | if (m_enabled) |
110 | ret = BulletSimAPI.TranslationalLimitMotor2(m_constraint.Ptr, onOff, targetVelocity, maxMotorForce); | 82 | { |
83 | // Recompute the internal transforms | ||
84 | BulletSimAPI.CalculateTransforms2(m_constraint.Ptr); | ||
85 | ret = true; | ||
86 | } | ||
111 | return ret; | 87 | return ret; |
112 | } | 88 | } |
113 | 89 | ||
114 | public bool CalculateTransforms() | 90 | // Reset this constraint making sure it has all its internal structures |
91 | // recomputed and is enabled and ready to go. | ||
92 | public virtual bool RecomputeConstraintVariables(float mass) | ||
115 | { | 93 | { |
116 | bool ret = false; | 94 | bool ret = false; |
117 | if (m_enabled) | 95 | if (m_enabled) |
118 | { | 96 | { |
119 | BulletSimAPI.CalculateTransforms2(m_constraint.Ptr); | 97 | ret = CalculateTransforms(); |
120 | ret = true; | 98 | if (ret) |
99 | { | ||
100 | // m_world.scene.PhysicsLogging.Write("{0},BSConstraint.RecomputeConstraintVariables,taint,enabling,A={1},B={2}", | ||
101 | // BSScene.DetailLogZero, Body1.ID, Body2.ID); | ||
102 | BulletSimAPI.SetConstraintEnable2(m_constraint.Ptr, m_world.scene.NumericBool(true)); | ||
103 | } | ||
104 | else | ||
105 | { | ||
106 | m_world.scene.Logger.ErrorFormat("[BULLETSIM CONSTRAINT] CalculateTransforms failed. A={0}, B={1}", Body1.ID, Body2.ID); | ||
107 | } | ||
121 | } | 108 | } |
122 | return ret; | 109 | return ret; |
123 | } | 110 | } |