diff options
author | Robert Adams | 2013-04-07 14:05:35 -0700 |
---|---|---|
committer | Robert Adams | 2013-04-08 06:27:44 -0700 |
commit | a7a1b8b7e9269b446e3396a35153b00942c1e35b (patch) | |
tree | df4c7041eb9a2819dd6e17aa2f95768a552f31e3 | |
parent | BulletSim: complete movement of physical object action code out of the (diff) | |
download | opensim-SC-a7a1b8b7e9269b446e3396a35153b00942c1e35b.zip opensim-SC-a7a1b8b7e9269b446e3396a35153b00942c1e35b.tar.gz opensim-SC-a7a1b8b7e9269b446e3396a35153b00942c1e35b.tar.bz2 opensim-SC-a7a1b8b7e9269b446e3396a35153b00942c1e35b.tar.xz |
BulletSim: clean up actor code so routines use the same coding pattern.
Fix a few enabling problems.
10 files changed, 137 insertions, 123 deletions
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSActorAvatarMove.cs b/OpenSim/Region/Physics/BulletSPlugin/BSActorAvatarMove.cs index 634a898..8416740 100755 --- a/OpenSim/Region/Physics/BulletSPlugin/BSActorAvatarMove.cs +++ b/OpenSim/Region/Physics/BulletSPlugin/BSActorAvatarMove.cs | |||
@@ -67,14 +67,6 @@ public class BSActorAvatarMove : BSActor | |||
67 | { | 67 | { |
68 | m_physicsScene.DetailLog("{0},BSActorAvatarMove,refresh", m_controllingPrim.LocalID); | 68 | m_physicsScene.DetailLog("{0},BSActorAvatarMove,refresh", m_controllingPrim.LocalID); |
69 | 69 | ||
70 | // If not active any more, get rid of me (shouldn't ever happen, but just to be safe) | ||
71 | if (m_controllingPrim.RawForce == OMV.Vector3.Zero) | ||
72 | { | ||
73 | m_physicsScene.DetailLog("{0},BSActorAvatarMove,refresh,notAvatarMove,removing={1}", m_controllingPrim.LocalID, ActorName); | ||
74 | m_controllingPrim.PhysicalActors.RemoveAndRelease(ActorName); | ||
75 | return; | ||
76 | } | ||
77 | |||
78 | // If the object is physically active, add the hoverer prestep action | 70 | // If the object is physically active, add the hoverer prestep action |
79 | if (isActive) | 71 | if (isActive) |
80 | { | 72 | { |
@@ -95,14 +87,19 @@ public class BSActorAvatarMove : BSActor | |||
95 | // Nothing to do for the hoverer since it is all software at pre-step action time. | 87 | // Nothing to do for the hoverer since it is all software at pre-step action time. |
96 | } | 88 | } |
97 | 89 | ||
90 | // Usually called when target velocity changes to set the current velocity and the target | ||
91 | // into the movement motor. | ||
98 | public void SetVelocityAndTarget(OMV.Vector3 vel, OMV.Vector3 targ, bool inTaintTime) | 92 | public void SetVelocityAndTarget(OMV.Vector3 vel, OMV.Vector3 targ, bool inTaintTime) |
99 | { | 93 | { |
100 | m_physicsScene.TaintedObject(inTaintTime, "BSActorAvatarMove.setVelocityAndTarget", delegate() | 94 | m_physicsScene.TaintedObject(inTaintTime, "BSActorAvatarMove.setVelocityAndTarget", delegate() |
101 | { | 95 | { |
102 | m_velocityMotor.Reset(); | 96 | if (m_velocityMotor != null) |
103 | m_velocityMotor.SetTarget(targ); | 97 | { |
104 | m_velocityMotor.SetCurrent(vel); | 98 | m_velocityMotor.Reset(); |
105 | m_velocityMotor.Enabled = true; | 99 | m_velocityMotor.SetTarget(targ); |
100 | m_velocityMotor.SetCurrent(vel); | ||
101 | m_velocityMotor.Enabled = true; | ||
102 | } | ||
106 | }); | 103 | }); |
107 | } | 104 | } |
108 | 105 | ||
@@ -119,6 +116,7 @@ public class BSActorAvatarMove : BSActor | |||
119 | 1f // efficiency | 116 | 1f // efficiency |
120 | ); | 117 | ); |
121 | // _velocityMotor.PhysicsScene = PhysicsScene; // DEBUG DEBUG so motor will output detail log messages. | 118 | // _velocityMotor.PhysicsScene = PhysicsScene; // DEBUG DEBUG so motor will output detail log messages. |
119 | SetVelocityAndTarget(m_controllingPrim.RawVelocity, m_controllingPrim.TargetVelocity, true /* inTaintTime */); | ||
122 | 120 | ||
123 | m_physicsScene.BeforeStep += Mover; | 121 | m_physicsScene.BeforeStep += Mover; |
124 | } | 122 | } |
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSActorHover.cs b/OpenSim/Region/Physics/BulletSPlugin/BSActorHover.cs index 8dd3700..e8310df 100755 --- a/OpenSim/Region/Physics/BulletSPlugin/BSActorHover.cs +++ b/OpenSim/Region/Physics/BulletSPlugin/BSActorHover.cs | |||
@@ -67,12 +67,10 @@ public class BSActorHover : BSActor | |||
67 | { | 67 | { |
68 | m_physicsScene.DetailLog("{0},BSActorHover,refresh", m_controllingPrim.LocalID); | 68 | m_physicsScene.DetailLog("{0},BSActorHover,refresh", m_controllingPrim.LocalID); |
69 | 69 | ||
70 | // If not active any more, get rid of me (shouldn't ever happen, but just to be safe) | 70 | // If not active any more, turn me off |
71 | if (!m_controllingPrim.HoverActive) | 71 | if (!m_controllingPrim.HoverActive) |
72 | { | 72 | { |
73 | m_physicsScene.DetailLog("{0},BSActorHover,refresh,notHovering,removing={1}", m_controllingPrim.LocalID, ActorName); | 73 | SetEnabled(false); |
74 | m_controllingPrim.PhysicalActors.RemoveAndRelease(ActorName); | ||
75 | return; | ||
76 | } | 74 | } |
77 | 75 | ||
78 | // If the object is physically active, add the hoverer prestep action | 76 | // If the object is physically active, add the hoverer prestep action |
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSActorLockAxis.cs b/OpenSim/Region/Physics/BulletSPlugin/BSActorLockAxis.cs index c40a499..09ee32b 100755 --- a/OpenSim/Region/Physics/BulletSPlugin/BSActorLockAxis.cs +++ b/OpenSim/Region/Physics/BulletSPlugin/BSActorLockAxis.cs | |||
@@ -36,7 +36,6 @@ namespace OpenSim.Region.Physics.BulletSPlugin | |||
36 | { | 36 | { |
37 | public class BSActorLockAxis : BSActor | 37 | public class BSActorLockAxis : BSActor |
38 | { | 38 | { |
39 | bool TryExperimentalLockAxisCode = true; | ||
40 | BSConstraint LockAxisConstraint = null; | 39 | BSConstraint LockAxisConstraint = null; |
41 | 40 | ||
42 | public BSActorLockAxis(BSScene physicsScene, BSPhysObject pObj, string actorName) | 41 | public BSActorLockAxis(BSScene physicsScene, BSPhysObject pObj, string actorName) |
@@ -69,18 +68,13 @@ public class BSActorLockAxis : BSActor | |||
69 | // If all the axis are free, we don't need to exist | 68 | // If all the axis are free, we don't need to exist |
70 | if (m_controllingPrim.LockedAxis == m_controllingPrim.LockedAxisFree) | 69 | if (m_controllingPrim.LockedAxis == m_controllingPrim.LockedAxisFree) |
71 | { | 70 | { |
72 | m_physicsScene.DetailLog("{0},BSActorLockAxis,refresh,allAxisFree,removing={1}", m_controllingPrim.LocalID, ActorName); | 71 | Enabled = false; |
73 | m_controllingPrim.PhysicalActors.RemoveAndRelease(ActorName); | ||
74 | return; | ||
75 | } | 72 | } |
73 | |||
76 | // If the object is physically active, add the axis locking constraint | 74 | // If the object is physically active, add the axis locking constraint |
77 | if (Enabled | 75 | if (isActive) |
78 | && m_controllingPrim.IsPhysicallyActive | ||
79 | && TryExperimentalLockAxisCode | ||
80 | && m_controllingPrim.LockedAxis != m_controllingPrim.LockedAxisFree) | ||
81 | { | 76 | { |
82 | if (LockAxisConstraint == null) | 77 | AddAxisLockConstraint(); |
83 | AddAxisLockConstraint(); | ||
84 | } | 78 | } |
85 | else | 79 | else |
86 | { | 80 | { |
@@ -108,58 +102,61 @@ public class BSActorLockAxis : BSActor | |||
108 | 102 | ||
109 | private void AddAxisLockConstraint() | 103 | private void AddAxisLockConstraint() |
110 | { | 104 | { |
111 | // Lock that axis by creating a 6DOF constraint that has one end in the world and | 105 | if (LockAxisConstraint == null) |
112 | // the other in the object. | 106 | { |
113 | // http://www.bulletphysics.org/Bullet/phpBB3/viewtopic.php?p=20817 | 107 | // Lock that axis by creating a 6DOF constraint that has one end in the world and |
114 | // http://www.bulletphysics.org/Bullet/phpBB3/viewtopic.php?p=26380 | 108 | // the other in the object. |
109 | // http://www.bulletphysics.org/Bullet/phpBB3/viewtopic.php?p=20817 | ||
110 | // http://www.bulletphysics.org/Bullet/phpBB3/viewtopic.php?p=26380 | ||
115 | 111 | ||
116 | // Remove any existing axis constraint (just to be sure) | 112 | // Remove any existing axis constraint (just to be sure) |
117 | RemoveAxisLockConstraint(); | 113 | RemoveAxisLockConstraint(); |
118 | 114 | ||
119 | BSConstraint6Dof axisConstrainer = new BSConstraint6Dof(m_physicsScene.World, m_controllingPrim.PhysBody, | 115 | BSConstraint6Dof axisConstrainer = new BSConstraint6Dof(m_physicsScene.World, m_controllingPrim.PhysBody, |
120 | OMV.Vector3.Zero, OMV.Quaternion.Identity, | 116 | OMV.Vector3.Zero, OMV.Quaternion.Identity, |
121 | false /* useLinearReferenceFrameB */, true /* disableCollisionsBetweenLinkedBodies */); | 117 | false /* useLinearReferenceFrameB */, true /* disableCollisionsBetweenLinkedBodies */); |
122 | LockAxisConstraint = axisConstrainer; | 118 | LockAxisConstraint = axisConstrainer; |
123 | m_physicsScene.Constraints.AddConstraint(LockAxisConstraint); | 119 | m_physicsScene.Constraints.AddConstraint(LockAxisConstraint); |
124 | 120 | ||
125 | // The constraint is tied to the world and oriented to the prim. | 121 | // The constraint is tied to the world and oriented to the prim. |
126 | 122 | ||
127 | // Free to move linearly in the region | 123 | // Free to move linearly in the region |
128 | OMV.Vector3 linearLow = OMV.Vector3.Zero; | 124 | OMV.Vector3 linearLow = OMV.Vector3.Zero; |
129 | OMV.Vector3 linearHigh = m_physicsScene.TerrainManager.DefaultRegionSize; | 125 | OMV.Vector3 linearHigh = m_physicsScene.TerrainManager.DefaultRegionSize; |
130 | axisConstrainer.SetLinearLimits(linearLow, linearHigh); | 126 | axisConstrainer.SetLinearLimits(linearLow, linearHigh); |
131 | 127 | ||
132 | // Angular with some axis locked | 128 | // Angular with some axis locked |
133 | float fPI = (float)Math.PI; | 129 | float fPI = (float)Math.PI; |
134 | OMV.Vector3 angularLow = new OMV.Vector3(-fPI, -fPI, -fPI); | 130 | OMV.Vector3 angularLow = new OMV.Vector3(-fPI, -fPI, -fPI); |
135 | OMV.Vector3 angularHigh = new OMV.Vector3(fPI, fPI, fPI); | 131 | OMV.Vector3 angularHigh = new OMV.Vector3(fPI, fPI, fPI); |
136 | if (m_controllingPrim.LockedAxis.X != 1f) | 132 | if (m_controllingPrim.LockedAxis.X != 1f) |
137 | { | 133 | { |
138 | angularLow.X = 0f; | 134 | angularLow.X = 0f; |
139 | angularHigh.X = 0f; | 135 | angularHigh.X = 0f; |
140 | } | 136 | } |
141 | if (m_controllingPrim.LockedAxis.Y != 1f) | 137 | if (m_controllingPrim.LockedAxis.Y != 1f) |
142 | { | 138 | { |
143 | angularLow.Y = 0f; | 139 | angularLow.Y = 0f; |
144 | angularHigh.Y = 0f; | 140 | angularHigh.Y = 0f; |
145 | } | 141 | } |
146 | if (m_controllingPrim.LockedAxis.Z != 1f) | 142 | if (m_controllingPrim.LockedAxis.Z != 1f) |
147 | { | 143 | { |
148 | angularLow.Z = 0f; | 144 | angularLow.Z = 0f; |
149 | angularHigh.Z = 0f; | 145 | angularHigh.Z = 0f; |
150 | } | 146 | } |
151 | if (!axisConstrainer.SetAngularLimits(angularLow, angularHigh)) | 147 | if (!axisConstrainer.SetAngularLimits(angularLow, angularHigh)) |
152 | { | 148 | { |
153 | m_physicsScene.DetailLog("{0},BSActorLockAxis.AddAxisLockConstraint,failedSetAngularLimits", m_controllingPrim.LocalID); | 149 | m_physicsScene.DetailLog("{0},BSActorLockAxis.AddAxisLockConstraint,failedSetAngularLimits", m_controllingPrim.LocalID); |
154 | } | 150 | } |
155 | 151 | ||
156 | m_physicsScene.DetailLog("{0},BSActorLockAxis.AddAxisLockConstraint,create,linLow={1},linHi={2},angLow={3},angHi={4}", | 152 | m_physicsScene.DetailLog("{0},BSActorLockAxis.AddAxisLockConstraint,create,linLow={1},linHi={2},angLow={3},angHi={4}", |
157 | m_controllingPrim.LocalID, linearLow, linearHigh, angularLow, angularHigh); | 153 | m_controllingPrim.LocalID, linearLow, linearHigh, angularLow, angularHigh); |
158 | 154 | ||
159 | // Constants from one of the posts mentioned above and used in Bullet's ConstraintDemo. | 155 | // Constants from one of the posts mentioned above and used in Bullet's ConstraintDemo. |
160 | axisConstrainer.TranslationalLimitMotor(true /* enable */, 5.0f, 0.1f); | 156 | axisConstrainer.TranslationalLimitMotor(true /* enable */, 5.0f, 0.1f); |
161 | 157 | ||
162 | axisConstrainer.RecomputeConstraintVariables(m_controllingPrim.RawMass); | 158 | axisConstrainer.RecomputeConstraintVariables(m_controllingPrim.RawMass); |
159 | } | ||
163 | } | 160 | } |
164 | 161 | ||
165 | private void RemoveAxisLockConstraint() | 162 | private void RemoveAxisLockConstraint() |
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSActorMoveToTarget.cs b/OpenSim/Region/Physics/BulletSPlugin/BSActorMoveToTarget.cs index 3517ef2..16c2b14 100755 --- a/OpenSim/Region/Physics/BulletSPlugin/BSActorMoveToTarget.cs +++ b/OpenSim/Region/Physics/BulletSPlugin/BSActorMoveToTarget.cs | |||
@@ -67,15 +67,12 @@ public class BSActorMoveToTarget : BSActor | |||
67 | { | 67 | { |
68 | m_physicsScene.DetailLog("{0},BSActorMoveToTarget,refresh", m_controllingPrim.LocalID); | 68 | m_physicsScene.DetailLog("{0},BSActorMoveToTarget,refresh", m_controllingPrim.LocalID); |
69 | 69 | ||
70 | // If not active any more, get rid of me (shouldn't ever happen, but just to be safe) | 70 | // If not active any more... |
71 | if (!m_controllingPrim.HoverActive) | 71 | if (!m_controllingPrim.MoveToTargetActive) |
72 | { | 72 | { |
73 | m_physicsScene.DetailLog("{0},BSActorMoveToTarget,refresh,notMoveToTarget,removing={1}", m_controllingPrim.LocalID, ActorName); | 73 | Enabled = false; |
74 | m_controllingPrim.PhysicalActors.RemoveAndRelease(ActorName); | ||
75 | return; | ||
76 | } | 74 | } |
77 | 75 | ||
78 | // If the object is physically active, add the hoverer prestep action | ||
79 | if (isActive) | 76 | if (isActive) |
80 | { | 77 | { |
81 | ActivateMoveToTarget(); | 78 | ActivateMoveToTarget(); |
@@ -92,7 +89,7 @@ public class BSActorMoveToTarget : BSActor | |||
92 | // BSActor.RemoveBodyDependencies() | 89 | // BSActor.RemoveBodyDependencies() |
93 | public override void RemoveBodyDependencies() | 90 | public override void RemoveBodyDependencies() |
94 | { | 91 | { |
95 | // Nothing to do for the hoverer since it is all software at pre-step action time. | 92 | // Nothing to do for the moveToTarget since it is all software at pre-step action time. |
96 | } | 93 | } |
97 | 94 | ||
98 | // If a hover motor has not been created, create one and start the hovering. | 95 | // If a hover motor has not been created, create one and start the hovering. |
@@ -144,7 +141,6 @@ public class BSActorMoveToTarget : BSActor | |||
144 | m_physicsScene.DetailLog("{0},BSPrim.PIDTarget,zeroMovement,movePos={1},pos={2},mass={3}", | 141 | m_physicsScene.DetailLog("{0},BSPrim.PIDTarget,zeroMovement,movePos={1},pos={2},mass={3}", |
145 | m_controllingPrim.LocalID, movePosition, m_controllingPrim.RawPosition, m_controllingPrim.Mass); | 142 | m_controllingPrim.LocalID, movePosition, m_controllingPrim.RawPosition, m_controllingPrim.Mass); |
146 | m_controllingPrim.ForcePosition = m_targetMotor.TargetValue; | 143 | m_controllingPrim.ForcePosition = m_targetMotor.TargetValue; |
147 | m_targetMotor.Enabled = false; | ||
148 | } | 144 | } |
149 | else | 145 | else |
150 | { | 146 | { |
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSActorSetForce.cs b/OpenSim/Region/Physics/BulletSPlugin/BSActorSetForce.cs index d942490..3ad138d 100755 --- a/OpenSim/Region/Physics/BulletSPlugin/BSActorSetForce.cs +++ b/OpenSim/Region/Physics/BulletSPlugin/BSActorSetForce.cs | |||
@@ -71,7 +71,7 @@ public class BSActorSetForce : BSActor | |||
71 | if (m_controllingPrim.RawForce == OMV.Vector3.Zero) | 71 | if (m_controllingPrim.RawForce == OMV.Vector3.Zero) |
72 | { | 72 | { |
73 | m_physicsScene.DetailLog("{0},BSActorSetForce,refresh,notSetForce,removing={1}", m_controllingPrim.LocalID, ActorName); | 73 | m_physicsScene.DetailLog("{0},BSActorSetForce,refresh,notSetForce,removing={1}", m_controllingPrim.LocalID, ActorName); |
74 | m_controllingPrim.PhysicalActors.RemoveAndRelease(ActorName); | 74 | Enabled = false; |
75 | return; | 75 | return; |
76 | } | 76 | } |
77 | 77 | ||
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSActorSetTorque.cs b/OpenSim/Region/Physics/BulletSPlugin/BSActorSetTorque.cs index e0f719f..159a3a8 100755 --- a/OpenSim/Region/Physics/BulletSPlugin/BSActorSetTorque.cs +++ b/OpenSim/Region/Physics/BulletSPlugin/BSActorSetTorque.cs | |||
@@ -70,8 +70,8 @@ public class BSActorSetTorque : BSActor | |||
70 | // If not active any more, get rid of me (shouldn't ever happen, but just to be safe) | 70 | // If not active any more, get rid of me (shouldn't ever happen, but just to be safe) |
71 | if (m_controllingPrim.RawTorque == OMV.Vector3.Zero) | 71 | if (m_controllingPrim.RawTorque == OMV.Vector3.Zero) |
72 | { | 72 | { |
73 | m_physicsScene.DetailLog("{0},BSActorSetTorque,refresh,notSetTorque,removing={1}", m_controllingPrim.LocalID, ActorName); | 73 | m_physicsScene.DetailLog("{0},BSActorSetTorque,refresh,notSetTorque,disabling={1}", m_controllingPrim.LocalID, ActorName); |
74 | m_controllingPrim.PhysicalActors.RemoveAndRelease(ActorName); | 74 | Enabled = false; |
75 | return; | 75 | return; |
76 | } | 76 | } |
77 | 77 | ||
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSActors.cs b/OpenSim/Region/Physics/BulletSPlugin/BSActors.cs index fb4d452..12a8817 100755 --- a/OpenSim/Region/Physics/BulletSPlugin/BSActors.cs +++ b/OpenSim/Region/Physics/BulletSPlugin/BSActors.cs | |||
@@ -42,24 +42,36 @@ public class BSActorCollection | |||
42 | } | 42 | } |
43 | public void Add(string name, BSActor actor) | 43 | public void Add(string name, BSActor actor) |
44 | { | 44 | { |
45 | m_actors[name] = actor; | 45 | lock (m_actors) |
46 | { | ||
47 | if (!m_actors.ContainsKey(name)) | ||
48 | { | ||
49 | m_actors[name] = actor; | ||
50 | } | ||
51 | } | ||
46 | } | 52 | } |
47 | public bool RemoveAndRelease(string name) | 53 | public bool RemoveAndRelease(string name) |
48 | { | 54 | { |
49 | bool ret = false; | 55 | bool ret = false; |
50 | if (m_actors.ContainsKey(name)) | 56 | lock (m_actors) |
51 | { | 57 | { |
52 | BSActor beingRemoved = m_actors[name]; | 58 | if (m_actors.ContainsKey(name)) |
53 | beingRemoved.Dispose(); | 59 | { |
54 | m_actors.Remove(name); | 60 | BSActor beingRemoved = m_actors[name]; |
55 | ret = true; | 61 | m_actors.Remove(name); |
62 | beingRemoved.Dispose(); | ||
63 | ret = true; | ||
64 | } | ||
56 | } | 65 | } |
57 | return ret; | 66 | return ret; |
58 | } | 67 | } |
59 | public void Clear() | 68 | public void Clear() |
60 | { | 69 | { |
61 | Release(); | 70 | lock (m_actors) |
62 | m_actors.Clear(); | 71 | { |
72 | Release(); | ||
73 | m_actors.Clear(); | ||
74 | } | ||
63 | } | 75 | } |
64 | public void Dispose() | 76 | public void Dispose() |
65 | { | 77 | { |
@@ -69,15 +81,22 @@ public class BSActorCollection | |||
69 | { | 81 | { |
70 | return m_actors.ContainsKey(name); | 82 | return m_actors.ContainsKey(name); |
71 | } | 83 | } |
84 | public bool TryGetActor(string actorName, out BSActor theActor) | ||
85 | { | ||
86 | return m_actors.TryGetValue(actorName, out theActor); | ||
87 | } | ||
72 | public void ForEachActor(Action<BSActor> act) | 88 | public void ForEachActor(Action<BSActor> act) |
73 | { | 89 | { |
74 | foreach (KeyValuePair<string, BSActor> kvp in m_actors) | 90 | lock (m_actors) |
75 | act(kvp.Value); | 91 | { |
92 | foreach (KeyValuePair<string, BSActor> kvp in m_actors) | ||
93 | act(kvp.Value); | ||
94 | } | ||
76 | } | 95 | } |
77 | 96 | ||
78 | public void Enable(bool enabl) | 97 | public void Enable(bool enabl) |
79 | { | 98 | { |
80 | ForEachActor(a => a.Enable(enabl)); | 99 | ForEachActor(a => a.SetEnabled(enabl)); |
81 | } | 100 | } |
82 | public void Release() | 101 | public void Release() |
83 | { | 102 | { |
@@ -106,7 +125,7 @@ public abstract class BSActor | |||
106 | { | 125 | { |
107 | protected BSScene m_physicsScene { get; private set; } | 126 | protected BSScene m_physicsScene { get; private set; } |
108 | protected BSPhysObject m_controllingPrim { get; private set; } | 127 | protected BSPhysObject m_controllingPrim { get; private set; } |
109 | protected bool Enabled { get; set; } | 128 | public virtual bool Enabled { get; set; } |
110 | public string ActorName { get; private set; } | 129 | public string ActorName { get; private set; } |
111 | 130 | ||
112 | public BSActor(BSScene physicsScene, BSPhysObject pObj, string actorName) | 131 | public BSActor(BSScene physicsScene, BSPhysObject pObj, string actorName) |
@@ -122,8 +141,10 @@ public abstract class BSActor | |||
122 | { | 141 | { |
123 | get { return Enabled; } | 142 | get { return Enabled; } |
124 | } | 143 | } |
125 | // Turn the actor on an off. | 144 | |
126 | public virtual void Enable(bool setEnabled) | 145 | // Turn the actor on an off. Only used by ActorCollection to set all enabled/disabled. |
146 | // Anyone else should assign true/false to 'Enabled'. | ||
147 | public void SetEnabled(bool setEnabled) | ||
127 | { | 148 | { |
128 | Enabled = setEnabled; | 149 | Enabled = setEnabled; |
129 | } | 150 | } |
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSCharacter.cs b/OpenSim/Region/Physics/BulletSPlugin/BSCharacter.cs index 09c9b16..a0d58d3 100644 --- a/OpenSim/Region/Physics/BulletSPlugin/BSCharacter.cs +++ b/OpenSim/Region/Physics/BulletSPlugin/BSCharacter.cs | |||
@@ -160,6 +160,9 @@ public sealed class BSCharacter : BSPhysObject | |||
160 | // Make so capsule does not fall over | 160 | // Make so capsule does not fall over |
161 | PhysicsScene.PE.SetAngularFactorV(PhysBody, OMV.Vector3.Zero); | 161 | PhysicsScene.PE.SetAngularFactorV(PhysBody, OMV.Vector3.Zero); |
162 | 162 | ||
163 | // The avatar mover sets some parameters. | ||
164 | PhysicalActors.Refresh(); | ||
165 | |||
163 | PhysicsScene.PE.AddToCollisionFlags(PhysBody, CollisionFlags.CF_CHARACTER_OBJECT); | 166 | PhysicsScene.PE.AddToCollisionFlags(PhysBody, CollisionFlags.CF_CHARACTER_OBJECT); |
164 | 167 | ||
165 | PhysicsScene.PE.AddObjectToWorld(PhysicsScene.World, PhysBody); | 168 | PhysicsScene.PE.AddObjectToWorld(PhysicsScene.World, PhysBody); |
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSPhysObject.cs b/OpenSim/Region/Physics/BulletSPlugin/BSPhysObject.cs index 644bc7e..64bf395 100755 --- a/OpenSim/Region/Physics/BulletSPlugin/BSPhysObject.cs +++ b/OpenSim/Region/Physics/BulletSPlugin/BSPhysObject.cs | |||
@@ -282,30 +282,31 @@ public abstract class BSPhysObject : PhysicsActor | |||
282 | 282 | ||
283 | // 'actors' act on the physical object to change or constrain its motion. These can range from | 283 | // 'actors' act on the physical object to change or constrain its motion. These can range from |
284 | // hovering to complex vehicle motion. | 284 | // hovering to complex vehicle motion. |
285 | // May be called at non-taint time as this just adds the actor to the action list and the real | ||
286 | // work is done during the simulation step. | ||
287 | // Note that, if the actor is already in the list and we are disabling same, the actor is just left | ||
288 | // in the list disabled. | ||
285 | public delegate BSActor CreateActor(); | 289 | public delegate BSActor CreateActor(); |
286 | public void CreateRemoveActor(bool createRemove, string actorName, bool inTaintTime, CreateActor creator) | 290 | public void EnableActor(bool enableActor, string actorName, CreateActor creator) |
287 | { | 291 | { |
288 | if (createRemove) | 292 | lock (PhysicalActors) |
289 | { | 293 | { |
290 | PhysicsScene.TaintedObject(inTaintTime, "BSPrim.CreateRemoveActor:" + actorName, delegate() | 294 | BSActor theActor; |
295 | if (PhysicalActors.TryGetActor(actorName, out theActor)) | ||
291 | { | 296 | { |
292 | if (!PhysicalActors.HasActor(actorName)) | 297 | // The actor already exists so just turn it on or off |
293 | { | 298 | theActor.Enabled = enableActor; |
294 | DetailLog("{0},BSPrim.CreateRemoveActor,taint,registerActor,a={1}", LocalID, actorName); | 299 | } |
295 | PhysicalActors.Add(actorName, creator()); | 300 | else |
296 | } | ||
297 | }); | ||
298 | } | ||
299 | else | ||
300 | { | ||
301 | PhysicsScene.TaintedObject(inTaintTime, "BSPrim.CreateRemoveActor:" + actorName, delegate() | ||
302 | { | 301 | { |
303 | if (PhysicalActors.HasActor(actorName)) | 302 | // The actor does not exist. If it should, create it. |
303 | if (enableActor) | ||
304 | { | 304 | { |
305 | DetailLog("{0},BSPrim.CreateRemoveActor,taint,unregisterActor,a={1}", LocalID, actorName); | 305 | theActor = creator(); |
306 | PhysicalActors.RemoveAndRelease(actorName); | 306 | PhysicalActors.Add(actorName, theActor); |
307 | theActor.Enabled = true; | ||
307 | } | 308 | } |
308 | }); | 309 | } |
309 | } | 310 | } |
310 | } | 311 | } |
311 | 312 | ||
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs b/OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs index 71fea59..16c7a90 100644 --- a/OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs +++ b/OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs | |||
@@ -95,6 +95,7 @@ public class BSPrim : BSPhysObject | |||
95 | _isPhysical = pisPhysical; | 95 | _isPhysical = pisPhysical; |
96 | _isVolumeDetect = false; | 96 | _isVolumeDetect = false; |
97 | 97 | ||
98 | // We keep a handle to the vehicle actor so we can set vehicle parameters later. | ||
98 | VehicleActor = new BSDynamics(PhysicsScene, this, VehicleActorName); | 99 | VehicleActor = new BSDynamics(PhysicsScene, this, VehicleActorName); |
99 | PhysicalActors.Add(VehicleActorName, VehicleActor); | 100 | PhysicalActors.Add(VehicleActorName, VehicleActor); |
100 | 101 | ||
@@ -264,7 +265,7 @@ public class BSPrim : BSPhysObject | |||
264 | if (axis.Z != 1) locking.Z = 0f; | 265 | if (axis.Z != 1) locking.Z = 0f; |
265 | LockedAxis = locking; | 266 | LockedAxis = locking; |
266 | 267 | ||
267 | CreateRemoveActor(LockedAxis != LockedAxisFree /* creatActor */, LockedAxisActorName, false /* inTaintTime */, delegate() | 268 | EnableActor(LockedAxis != LockedAxisFree, LockedAxisActorName, delegate() |
268 | { | 269 | { |
269 | return new BSActorLockAxis(PhysicsScene, this, LockedAxisActorName); | 270 | return new BSActorLockAxis(PhysicsScene, this, LockedAxisActorName); |
270 | }); | 271 | }); |
@@ -501,7 +502,7 @@ public class BSPrim : BSPhysObject | |||
501 | get { return RawForce; } | 502 | get { return RawForce; } |
502 | set { | 503 | set { |
503 | RawForce = value; | 504 | RawForce = value; |
504 | CreateRemoveActor(RawForce == OMV.Vector3.Zero, SetForceActorName, false /* inTaintTime */, delegate() | 505 | EnableActor(RawForce != OMV.Vector3.Zero, SetForceActorName, delegate() |
505 | { | 506 | { |
506 | return new BSActorSetForce(PhysicsScene, this, SetForceActorName); | 507 | return new BSActorSetForce(PhysicsScene, this, SetForceActorName); |
507 | }); | 508 | }); |
@@ -510,14 +511,13 @@ public class BSPrim : BSPhysObject | |||
510 | 511 | ||
511 | public override int VehicleType { | 512 | public override int VehicleType { |
512 | get { | 513 | get { |
513 | return (int)VehicleActor.Type; // if we are a vehicle, return that type | 514 | return (int)VehicleActor.Type; |
514 | } | 515 | } |
515 | set { | 516 | set { |
516 | Vehicle type = (Vehicle)value; | 517 | Vehicle type = (Vehicle)value; |
517 | 518 | ||
518 | PhysicsScene.TaintedObject("setVehicleType", delegate() | 519 | PhysicsScene.TaintedObject("setVehicleType", delegate() |
519 | { | 520 | { |
520 | // Done at taint time so we're sure the physics engine is not using the variables | ||
521 | // Vehicle code changes the parameters for this vehicle type. | 521 | // Vehicle code changes the parameters for this vehicle type. |
522 | VehicleActor.ProcessTypeChange(type); | 522 | VehicleActor.ProcessTypeChange(type); |
523 | ActivateIfPhysical(false); | 523 | ActivateIfPhysical(false); |
@@ -669,11 +669,11 @@ public class BSPrim : BSPhysObject | |||
669 | get { return RawTorque; } | 669 | get { return RawTorque; } |
670 | set { | 670 | set { |
671 | RawTorque = value; | 671 | RawTorque = value; |
672 | CreateRemoveActor(RawTorque == OMV.Vector3.Zero, SetTorqueActorName, false /* inTaintTime */, delegate() | 672 | EnableActor(RawTorque != OMV.Vector3.Zero, SetTorqueActorName, delegate() |
673 | { | 673 | { |
674 | return new BSActorSetTorque(PhysicsScene, this, SetTorqueActorName); | 674 | return new BSActorSetTorque(PhysicsScene, this, SetTorqueActorName); |
675 | }); | 675 | }); |
676 | // DetailLog("{0},BSPrim.SetTorque,call,torque={1}", LocalID, _torque); | 676 | DetailLog("{0},BSPrim.SetTorque,call,torque={1}", LocalID, RawTorque); |
677 | } | 677 | } |
678 | } | 678 | } |
679 | public override OMV.Vector3 Acceleration { | 679 | public override OMV.Vector3 Acceleration { |
@@ -786,7 +786,6 @@ public class BSPrim : BSPhysObject | |||
786 | MakeDynamic(IsStatic); | 786 | MakeDynamic(IsStatic); |
787 | 787 | ||
788 | // Update vehicle specific parameters (after MakeDynamic() so can change physical parameters) | 788 | // Update vehicle specific parameters (after MakeDynamic() so can change physical parameters) |
789 | VehicleActor.Refresh(); | ||
790 | PhysicalActors.Refresh(); | 789 | PhysicalActors.Refresh(); |
791 | 790 | ||
792 | // Arrange for collision events if the simulator wants them | 791 | // Arrange for collision events if the simulator wants them |
@@ -1037,7 +1036,7 @@ public class BSPrim : BSPhysObject | |||
1037 | public override bool PIDActive { | 1036 | public override bool PIDActive { |
1038 | set { | 1037 | set { |
1039 | base.MoveToTargetActive = value; | 1038 | base.MoveToTargetActive = value; |
1040 | CreateRemoveActor(MoveToTargetActive, MoveToTargetActorName, false /* inTaintTime */, delegate() | 1039 | EnableActor(MoveToTargetActive, MoveToTargetActorName, delegate() |
1041 | { | 1040 | { |
1042 | return new BSActorMoveToTarget(PhysicsScene, this, MoveToTargetActorName); | 1041 | return new BSActorMoveToTarget(PhysicsScene, this, MoveToTargetActorName); |
1043 | }); | 1042 | }); |
@@ -1049,7 +1048,7 @@ public class BSPrim : BSPhysObject | |||
1049 | public override bool PIDHoverActive { | 1048 | public override bool PIDHoverActive { |
1050 | set { | 1049 | set { |
1051 | base.HoverActive = value; | 1050 | base.HoverActive = value; |
1052 | CreateRemoveActor(HoverActive /* creatActor */, HoverActorName, false /* inTaintTime */, delegate() | 1051 | EnableActor(HoverActive, HoverActorName, delegate() |
1053 | { | 1052 | { |
1054 | return new BSActorHover(PhysicsScene, this, HoverActorName); | 1053 | return new BSActorHover(PhysicsScene, this, HoverActorName); |
1055 | }); | 1054 | }); |
@@ -1458,7 +1457,7 @@ public class BSPrim : BSPhysObject | |||
1458 | { | 1457 | { |
1459 | // Create the correct physical representation for this type of object. | 1458 | // Create the correct physical representation for this type of object. |
1460 | // Updates base.PhysBody and base.PhysShape with the new information. | 1459 | // Updates base.PhysBody and base.PhysShape with the new information. |
1461 | // Ignore 'forceRebuild'. This routine makes the right choices and changes of necessary. | 1460 | // Ignore 'forceRebuild'. 'GetBodyAndShape' makes the right choices and changes of necessary. |
1462 | PhysicsScene.Shapes.GetBodyAndShape(false /*forceRebuild */, PhysicsScene.World, this, null, delegate(BulletBody dBody) | 1461 | PhysicsScene.Shapes.GetBodyAndShape(false /*forceRebuild */, PhysicsScene.World, this, null, delegate(BulletBody dBody) |
1463 | { | 1462 | { |
1464 | // Called if the current prim body is about to be destroyed. | 1463 | // Called if the current prim body is about to be destroyed. |
@@ -1472,9 +1471,9 @@ public class BSPrim : BSPhysObject | |||
1472 | return; | 1471 | return; |
1473 | } | 1472 | } |
1474 | 1473 | ||
1474 | // Called at taint-time | ||
1475 | protected virtual void RemoveBodyDependencies() | 1475 | protected virtual void RemoveBodyDependencies() |
1476 | { | 1476 | { |
1477 | VehicleActor.RemoveBodyDependencies(); | ||
1478 | PhysicalActors.RemoveBodyDependencies(); | 1477 | PhysicalActors.RemoveBodyDependencies(); |
1479 | } | 1478 | } |
1480 | 1479 | ||
@@ -1482,6 +1481,7 @@ public class BSPrim : BSPhysObject | |||
1482 | // the world that things have changed. | 1481 | // the world that things have changed. |
1483 | public override void UpdateProperties(EntityProperties entprop) | 1482 | public override void UpdateProperties(EntityProperties entprop) |
1484 | { | 1483 | { |
1484 | // Let anyone (like the actors) modify the updated properties before they are pushed into the object and the simulator. | ||
1485 | TriggerPreUpdatePropertyAction(ref entprop); | 1485 | TriggerPreUpdatePropertyAction(ref entprop); |
1486 | 1486 | ||
1487 | // DetailLog("{0},BSPrim.UpdateProperties,entry,entprop={1}", LocalID, entprop); // DEBUG DEBUG | 1487 | // DetailLog("{0},BSPrim.UpdateProperties,entry,entprop={1}", LocalID, entprop); // DEBUG DEBUG |