diff options
Diffstat (limited to 'OpenSim')
-rw-r--r-- | OpenSim/Framework/Util.cs | 12 | ||||
-rw-r--r-- | OpenSim/Region/Physics/BulletSPlugin/BSCharacter.cs | 3 | ||||
-rw-r--r-- | OpenSim/Region/Physics/BulletSPlugin/BSDynamics.cs | 3 | ||||
-rwxr-xr-x | OpenSim/Region/Physics/BulletSPlugin/BSPhysObject.cs | 10 | ||||
-rw-r--r-- | OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs | 33 | ||||
-rwxr-xr-x | OpenSim/Region/Physics/BulletSPlugin/BulletSimTODO.txt | 6 |
6 files changed, 43 insertions, 24 deletions
diff --git a/OpenSim/Framework/Util.cs b/OpenSim/Framework/Util.cs index f511494..f6c9d15 100644 --- a/OpenSim/Framework/Util.cs +++ b/OpenSim/Framework/Util.cs | |||
@@ -299,6 +299,18 @@ namespace OpenSim.Framework | |||
299 | x; | 299 | x; |
300 | } | 300 | } |
301 | 301 | ||
302 | // Clamp the maximum magnitude of a vector | ||
303 | public static Vector3 ClampV(Vector3 x, float max) | ||
304 | { | ||
305 | Vector3 ret = x; | ||
306 | float lenSq = x.LengthSquared(); | ||
307 | if (lenSq > (max * max)) | ||
308 | { | ||
309 | x = x / x.Length() * max; | ||
310 | } | ||
311 | return x; | ||
312 | } | ||
313 | |||
302 | // Inclusive, within range test (true if equal to the endpoints) | 314 | // Inclusive, within range test (true if equal to the endpoints) |
303 | public static bool InRange<T>(T x, T min, T max) | 315 | public static bool InRange<T>(T x, T min, T max) |
304 | where T : IComparable<T> | 316 | where T : IComparable<T> |
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSCharacter.cs b/OpenSim/Region/Physics/BulletSPlugin/BSCharacter.cs index 87a06c1..6d5e23f 100644 --- a/OpenSim/Region/Physics/BulletSPlugin/BSCharacter.cs +++ b/OpenSim/Region/Physics/BulletSPlugin/BSCharacter.cs | |||
@@ -652,6 +652,9 @@ public sealed class BSCharacter : BSPhysObject | |||
652 | public override bool IsStatic { | 652 | public override bool IsStatic { |
653 | get { return false; } | 653 | get { return false; } |
654 | } | 654 | } |
655 | public override bool IsPhysicallyActive { | ||
656 | get { return true; } | ||
657 | } | ||
655 | public override bool Flying { | 658 | public override bool Flying { |
656 | get { return _flying; } | 659 | get { return _flying; } |
657 | set { | 660 | set { |
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSDynamics.cs b/OpenSim/Region/Physics/BulletSPlugin/BSDynamics.cs index 6601479..f2c7cec 100644 --- a/OpenSim/Region/Physics/BulletSPlugin/BSDynamics.cs +++ b/OpenSim/Region/Physics/BulletSPlugin/BSDynamics.cs | |||
@@ -35,6 +35,7 @@ using System.Collections.Generic; | |||
35 | using System.Reflection; | 35 | using System.Reflection; |
36 | using System.Runtime.InteropServices; | 36 | using System.Runtime.InteropServices; |
37 | using OpenMetaverse; | 37 | using OpenMetaverse; |
38 | using OpenSim.Framework; | ||
38 | using OpenSim.Region.Physics.Manager; | 39 | using OpenSim.Region.Physics.Manager; |
39 | 40 | ||
40 | namespace OpenSim.Region.Physics.BulletSPlugin | 41 | namespace OpenSim.Region.Physics.BulletSPlugin |
@@ -154,7 +155,7 @@ namespace OpenSim.Region.Physics.BulletSPlugin | |||
154 | // Return 'true' if this vehicle is doing vehicle things | 155 | // Return 'true' if this vehicle is doing vehicle things |
155 | public bool IsActive | 156 | public bool IsActive |
156 | { | 157 | { |
157 | get { return (Type != Vehicle.TYPE_NONE && !Prim.IsStatic); } | 158 | get { return (Type != Vehicle.TYPE_NONE && Prim.IsPhysicallyActive); } |
158 | } | 159 | } |
159 | 160 | ||
160 | #region Vehicle parameter setting | 161 | #region Vehicle parameter setting |
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSPhysObject.cs b/OpenSim/Region/Physics/BulletSPlugin/BSPhysObject.cs index 821f470..bac0427 100755 --- a/OpenSim/Region/Physics/BulletSPlugin/BSPhysObject.cs +++ b/OpenSim/Region/Physics/BulletSPlugin/BSPhysObject.cs | |||
@@ -139,6 +139,11 @@ public abstract class BSPhysObject : PhysicsActor | |||
139 | public abstract bool IsStatic { get; } | 139 | public abstract bool IsStatic { get; } |
140 | public abstract bool IsSelected { get; } | 140 | public abstract bool IsSelected { get; } |
141 | 141 | ||
142 | // It can be confusing for an actor to know if it should move or update an object | ||
143 | // depeneding on the setting of 'selected', 'physical, ... | ||
144 | // This flag is the true test -- if true, the object is being acted on in the physical world | ||
145 | public abstract bool IsPhysicallyActive { get; } | ||
146 | |||
142 | // Materialness | 147 | // Materialness |
143 | public MaterialAttributes.Material Material { get; private set; } | 148 | public MaterialAttributes.Material Material { get; private set; } |
144 | public override void SetMaterial(int material) | 149 | public override void SetMaterial(int material) |
@@ -302,8 +307,9 @@ public abstract class BSPhysObject : PhysicsActor | |||
302 | public virtual bool SendCollisions() | 307 | public virtual bool SendCollisions() |
303 | { | 308 | { |
304 | bool ret = true; | 309 | bool ret = true; |
310 | |||
305 | // If the 'no collision' call, force it to happen right now so quick collision_end | 311 | // If the 'no collision' call, force it to happen right now so quick collision_end |
306 | bool force = (CollisionCollection.Count == 0); | 312 | bool force = (CollisionCollection.Count == 0 && CollisionsLastTick.Count != 0); |
307 | 313 | ||
308 | // throttle the collisions to the number of milliseconds specified in the subscription | 314 | // throttle the collisions to the number of milliseconds specified in the subscription |
309 | if (force || (PhysicsScene.SimulationNowTime >= NextCollisionOkTime)) | 315 | if (force || (PhysicsScene.SimulationNowTime >= NextCollisionOkTime)) |
@@ -318,7 +324,7 @@ public abstract class BSPhysObject : PhysicsActor | |||
318 | ret = false; | 324 | ret = false; |
319 | } | 325 | } |
320 | 326 | ||
321 | // DetailLog("{0},{1}.SendCollisionUpdate,call,numCollisions={2}", LocalID, TypeName, CollisionCollection.Count); | 327 | DetailLog("{0},{1}.SendCollisionUpdate,call,numCollisions={2}", LocalID, TypeName, CollisionCollection.Count); |
322 | base.SendCollisionUpdate(CollisionCollection); | 328 | base.SendCollisionUpdate(CollisionCollection); |
323 | 329 | ||
324 | // Remember the collisions from this tick for some collision specific processing. | 330 | // Remember the collisions from this tick for some collision specific processing. |
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs b/OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs index 79fe632..7aa2d92 100644 --- a/OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs +++ b/OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs | |||
@@ -132,8 +132,8 @@ public sealed class BSPrim : BSPhysObject | |||
132 | base.Destroy(); | 132 | base.Destroy(); |
133 | 133 | ||
134 | // Undo any links between me and any other object | 134 | // Undo any links between me and any other object |
135 | BSPhysObject parentBefore = Linkset.LinksetRoot; | 135 | BSPhysObject parentBefore = Linkset.LinksetRoot; // DEBUG DEBUG |
136 | int childrenBefore = Linkset.NumberOfChildren; | 136 | int childrenBefore = Linkset.NumberOfChildren; // DEBUG DEBUG |
137 | 137 | ||
138 | Linkset = Linkset.RemoveMeFromLinkset(this); | 138 | Linkset = Linkset.RemoveMeFromLinkset(this); |
139 | 139 | ||
@@ -727,6 +727,12 @@ public sealed class BSPrim : BSPhysObject | |||
727 | get { return !IsPhantom && !_isVolumeDetect; } | 727 | get { return !IsPhantom && !_isVolumeDetect; } |
728 | } | 728 | } |
729 | 729 | ||
730 | // The object is moving and is actively being dynamic in the physical world | ||
731 | public override bool IsPhysicallyActive | ||
732 | { | ||
733 | get { return !_isSelected && IsPhysical; } | ||
734 | } | ||
735 | |||
730 | // Make gravity work if the object is physical and not selected | 736 | // Make gravity work if the object is physical and not selected |
731 | // Called at taint-time!! | 737 | // Called at taint-time!! |
732 | private void SetObjectDynamic(bool forceRebuild) | 738 | private void SetObjectDynamic(bool forceRebuild) |
@@ -1174,18 +1180,11 @@ public sealed class BSPrim : BSPhysObject | |||
1174 | // This added force will only last the next simulation tick. | 1180 | // This added force will only last the next simulation tick. |
1175 | public void AddForce(OMV.Vector3 force, bool pushforce, bool inTaintTime) { | 1181 | public void AddForce(OMV.Vector3 force, bool pushforce, bool inTaintTime) { |
1176 | // for an object, doesn't matter if force is a pushforce or not | 1182 | // for an object, doesn't matter if force is a pushforce or not |
1177 | if (!IsStatic) | 1183 | if (IsPhysicallyActive) |
1178 | { | 1184 | { |
1179 | if (force.IsFinite()) | 1185 | if (force.IsFinite()) |
1180 | { | 1186 | { |
1181 | float magnitude = force.Length(); | 1187 | OMV.Vector3 addForce = Util.ClampV(force, BSParam.MaxAddForceMagnitude); |
1182 | if (magnitude > BSParam.MaxAddForceMagnitude) | ||
1183 | { | ||
1184 | // Force has a limit | ||
1185 | force = force / magnitude * BSParam.MaxAddForceMagnitude; | ||
1186 | } | ||
1187 | |||
1188 | OMV.Vector3 addForce = force; | ||
1189 | // DetailLog("{0},BSPrim.addForce,call,force={1}", LocalID, addForce); | 1188 | // DetailLog("{0},BSPrim.addForce,call,force={1}", LocalID, addForce); |
1190 | 1189 | ||
1191 | PhysicsScene.TaintedObject(inTaintTime, "BSPrim.AddForce", delegate() | 1190 | PhysicsScene.TaintedObject(inTaintTime, "BSPrim.AddForce", delegate() |
@@ -1209,19 +1208,13 @@ public sealed class BSPrim : BSPhysObject | |||
1209 | 1208 | ||
1210 | public void AddForceImpulse(OMV.Vector3 impulse, bool pushforce, bool inTaintTime) { | 1209 | public void AddForceImpulse(OMV.Vector3 impulse, bool pushforce, bool inTaintTime) { |
1211 | // for an object, doesn't matter if force is a pushforce or not | 1210 | // for an object, doesn't matter if force is a pushforce or not |
1212 | if (!IsStatic) | 1211 | if (!IsPhysicallyActive) |
1213 | { | 1212 | { |
1214 | if (impulse.IsFinite()) | 1213 | if (impulse.IsFinite()) |
1215 | { | 1214 | { |
1216 | float magnitude = impulse.Length(); | 1215 | OMV.Vector3 addImpulse = Util.ClampV(impulse, BSParam.MaxAddForceMagnitude); |
1217 | if (magnitude > BSParam.MaxAddForceMagnitude) | ||
1218 | { | ||
1219 | // Force has a limit | ||
1220 | impulse = impulse / magnitude * BSParam.MaxAddForceMagnitude; | ||
1221 | } | ||
1222 | |||
1223 | // DetailLog("{0},BSPrim.addForceImpulse,call,impulse={1}", LocalID, impulse); | 1216 | // DetailLog("{0},BSPrim.addForceImpulse,call,impulse={1}", LocalID, impulse); |
1224 | OMV.Vector3 addImpulse = impulse; | 1217 | |
1225 | PhysicsScene.TaintedObject(inTaintTime, "BSPrim.AddImpulse", delegate() | 1218 | PhysicsScene.TaintedObject(inTaintTime, "BSPrim.AddImpulse", delegate() |
1226 | { | 1219 | { |
1227 | // Bullet adds this impulse immediately to the velocity | 1220 | // Bullet adds this impulse immediately to the velocity |
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BulletSimTODO.txt b/OpenSim/Region/Physics/BulletSPlugin/BulletSimTODO.txt index d4545f7..9bfec19 100755 --- a/OpenSim/Region/Physics/BulletSPlugin/BulletSimTODO.txt +++ b/OpenSim/Region/Physics/BulletSPlugin/BulletSimTODO.txt | |||
@@ -16,6 +16,7 @@ vehicle angular banking | |||
16 | Avatars walking up stairs (HALF DONE) | 16 | Avatars walking up stairs (HALF DONE) |
17 | Radius of the capsule affects ability to climb edges. | 17 | Radius of the capsule affects ability to climb edges. |
18 | Vehicle movement on terrain smoothness | 18 | Vehicle movement on terrain smoothness |
19 | When is force introduced by SetForce removed? The prestep action could go forever. | ||
19 | Boats float low in the water (DONE) | 20 | Boats float low in the water (DONE) |
20 | Avatar movement | 21 | Avatar movement |
21 | flying into a wall doesn't stop avatar who keeps appearing to move through the obstacle (DONE) | 22 | flying into a wall doesn't stop avatar who keeps appearing to move through the obstacle (DONE) |
@@ -72,8 +73,11 @@ Incorporate inter-relationship of angular corrections. For instance, angularDefl | |||
72 | 73 | ||
73 | GENERAL TODO LIST: | 74 | GENERAL TODO LIST: |
74 | ================================================= | 75 | ================================================= |
76 | Implement llSetPhysicalMaterial. | ||
77 | Implement llSetForceAndTorque. | ||
75 | Implement an avatar mesh shape. The Bullet capsule is way too limited. | 78 | Implement an avatar mesh shape. The Bullet capsule is way too limited. |
76 | Consider just hand creating a vertex/index array in a new BSShapeAvatar. | 79 | Consider just hand creating a vertex/index array in a new BSShapeAvatar. |
80 | Verify/fix phantom, volume-detect objects do not fall to infinity. Should stop at terrain. | ||
77 | Revisit CollisionMargin. Builders notice the 0.04 spacing between prims. | 81 | Revisit CollisionMargin. Builders notice the 0.04 spacing between prims. |
78 | Duplicating a physical prim causes old prim to jump away | 82 | Duplicating a physical prim causes old prim to jump away |
79 | Dup a phys prim and the original become unselected and thus interacts w/ selected prim. | 83 | Dup a phys prim and the original become unselected and thus interacts w/ selected prim. |
@@ -121,7 +125,7 @@ Physical and phantom will drop through the terrain | |||
121 | LINKSETS | 125 | LINKSETS |
122 | ====================================================== | 126 | ====================================================== |
123 | Editing a child of a linkset causes the child to go phantom | 127 | Editing a child of a linkset causes the child to go phantom |
124 | Move a child prim once when it is physical and can never move it again without it going phantom | 128 | Move a child prim once when it is physical and can never move it again without it going phantom |
125 | Offset the center of the linkset to be the geometric center of all the prims | 129 | Offset the center of the linkset to be the geometric center of all the prims |
126 | Not quite the same as the center-of-gravity | 130 | Not quite the same as the center-of-gravity |
127 | Linksets should allow collisions to individual children | 131 | Linksets should allow collisions to individual children |