aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/Physics/BulletSPlugin
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region/Physics/BulletSPlugin')
-rwxr-xr-xOpenSim/Region/Physics/BulletSPlugin/BSLinksetCompound.cs11
-rwxr-xr-xOpenSim/Region/Physics/BulletSPlugin/BSParam.cs3
-rwxr-xr-xOpenSim/Region/Physics/BulletSPlugin/BSPrimDisplaced.cs26
-rwxr-xr-xOpenSim/Region/Physics/BulletSPlugin/BSPrimLinkable.cs19
4 files changed, 39 insertions, 20 deletions
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSLinksetCompound.cs b/OpenSim/Region/Physics/BulletSPlugin/BSLinksetCompound.cs
index 308cf13..30f6c8c 100755
--- a/OpenSim/Region/Physics/BulletSPlugin/BSLinksetCompound.cs
+++ b/OpenSim/Region/Physics/BulletSPlugin/BSLinksetCompound.cs
@@ -315,7 +315,6 @@ public sealed class BSLinksetCompound : BSLinkset
315 // Note that this works for rebuilding just the root after a linkset is taken apart. 315 // Note that this works for rebuilding just the root after a linkset is taken apart.
316 // Called at taint time!! 316 // Called at taint time!!
317 private bool UseBulletSimRootOffsetHack = false; // Attempt to have Bullet track the coords of root compound shape 317 private bool UseBulletSimRootOffsetHack = false; // Attempt to have Bullet track the coords of root compound shape
318 private bool disableCOM = true; // For basic linkset debugging, turn off the center-of-mass setting
319 private void RecomputeLinksetCompound() 318 private void RecomputeLinksetCompound()
320 { 319 {
321 try 320 try
@@ -331,9 +330,7 @@ public sealed class BSLinksetCompound : BSLinkset
331 // There is no reason to build all this physical stuff for a non-physical linkset. 330 // There is no reason to build all this physical stuff for a non-physical linkset.
332 if (!LinksetRoot.IsPhysicallyActive) 331 if (!LinksetRoot.IsPhysicallyActive)
333 { 332 {
334 // Clean up any old linkset shape and make sure the root shape is set to the root object.
335 DetailLog("{0},BSLinksetCompound.RecomputeLinksetCompound,notPhysical", LinksetRoot.LocalID); 333 DetailLog("{0},BSLinksetCompound.RecomputeLinksetCompound,notPhysical", LinksetRoot.LocalID);
336
337 return; // Note the 'finally' clause at the botton which will get executed. 334 return; // Note the 'finally' clause at the botton which will get executed.
338 } 335 }
339 336
@@ -347,9 +344,9 @@ public sealed class BSLinksetCompound : BSLinkset
347 344
348 OMV.Quaternion invRootOrientation = OMV.Quaternion.Normalize(OMV.Quaternion.Inverse(LinksetRoot.RawOrientation)); 345 OMV.Quaternion invRootOrientation = OMV.Quaternion.Normalize(OMV.Quaternion.Inverse(LinksetRoot.RawOrientation));
349 346
350 // 'centerDisplacement' is the value to subtract from children to give physical offset position 347 // 'centerDisplacementV' is the value to subtract from children to give physical offset position
351 OMV.Vector3 centerDisplacementV = (centerOfMassW - LinksetRoot.RawPosition) * invRootOrientation; 348 OMV.Vector3 centerDisplacementV = (centerOfMassW - LinksetRoot.RawPosition) * invRootOrientation;
352 if (UseBulletSimRootOffsetHack || disableCOM) 349 if (UseBulletSimRootOffsetHack || !BSParam.LinksetOffsetCenterOfMass)
353 { 350 {
354 centerDisplacementV = OMV.Vector3.Zero; 351 centerDisplacementV = OMV.Vector3.Zero;
355 LinksetRoot.ClearDisplacement(); 352 LinksetRoot.ClearDisplacement();
@@ -357,6 +354,8 @@ public sealed class BSLinksetCompound : BSLinkset
357 else 354 else
358 { 355 {
359 LinksetRoot.SetEffectiveCenterOfMassDisplacement(centerDisplacementV); 356 LinksetRoot.SetEffectiveCenterOfMassDisplacement(centerDisplacementV);
357 // The actual center-of-mass could have been set by the user.
358 centerDisplacementV = LinksetRoot.PositionDisplacement;
360 } 359 }
361 DetailLog("{0},BSLinksetCompound.RecomputeLinksetCompound,COM,rootPos={1},com={2},comDisp={3}", 360 DetailLog("{0},BSLinksetCompound.RecomputeLinksetCompound,COM,rootPos={1},com={2},comDisp={3}",
362 LinksetRoot.LocalID, LinksetRoot.RawPosition, centerOfMassW, centerDisplacementV); 361 LinksetRoot.LocalID, LinksetRoot.RawPosition, centerOfMassW, centerDisplacementV);
@@ -409,7 +408,7 @@ public sealed class BSLinksetCompound : BSLinkset
409 { 408 {
410 // Enable the physical position updator to return the position and rotation of the root shape. 409 // Enable the physical position updator to return the position and rotation of the root shape.
411 // This enables a feature in the C++ code to return the world coordinates of the first shape in the 410 // This enables a feature in the C++ code to return the world coordinates of the first shape in the
412 // compound shape. This eleviates the need to offset the returned physical position by the 411 // compound shape. This aleviates the need to offset the returned physical position by the
413 // center-of-mass offset. 412 // center-of-mass offset.
414 m_physicsScene.PE.AddToCollisionFlags(LinksetRoot.PhysBody, CollisionFlags.BS_RETURN_ROOT_COMPOUND_SHAPE); 413 m_physicsScene.PE.AddToCollisionFlags(LinksetRoot.PhysBody, CollisionFlags.BS_RETURN_ROOT_COMPOUND_SHAPE);
415 } 414 }
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSParam.cs b/OpenSim/Region/Physics/BulletSPlugin/BSParam.cs
index d17c8e7..0f84bf7 100755
--- a/OpenSim/Region/Physics/BulletSPlugin/BSParam.cs
+++ b/OpenSim/Region/Physics/BulletSPlugin/BSParam.cs
@@ -176,6 +176,7 @@ public static class BSParam
176 176
177 // Linkset implementation parameters 177 // Linkset implementation parameters
178 public static float LinksetImplementation { get; private set; } 178 public static float LinksetImplementation { get; private set; }
179 public static bool LinksetOffsetCenterOfMass { get; private set; }
179 public static bool LinkConstraintUseFrameOffset { get; private set; } 180 public static bool LinkConstraintUseFrameOffset { get; private set; }
180 public static bool LinkConstraintEnableTransMotor { get; private set; } 181 public static bool LinkConstraintEnableTransMotor { get; private set; }
181 public static float LinkConstraintTransMotorMaxVel { get; private set; } 182 public static float LinkConstraintTransMotorMaxVel { get; private set; }
@@ -684,6 +685,8 @@ public static class BSParam
684 685
685 new ParameterDefn<float>("LinksetImplementation", "Type of linkset implementation (0=Constraint, 1=Compound, 2=Manual)", 686 new ParameterDefn<float>("LinksetImplementation", "Type of linkset implementation (0=Constraint, 1=Compound, 2=Manual)",
686 (float)BSLinkset.LinksetImplementation.Compound ), 687 (float)BSLinkset.LinksetImplementation.Compound ),
688 new ParameterDefn<bool>("LinksetOffsetCenterOfMass", "If 'true', compute linkset center-of-mass and offset linkset position to account for same",
689 false ),
687 new ParameterDefn<bool>("LinkConstraintUseFrameOffset", "For linksets built with constraints, enable frame offsetFor linksets built with constraints, enable frame offset.", 690 new ParameterDefn<bool>("LinkConstraintUseFrameOffset", "For linksets built with constraints, enable frame offsetFor linksets built with constraints, enable frame offset.",
688 false ), 691 false ),
689 new ParameterDefn<bool>("LinkConstraintEnableTransMotor", "Whether to enable translational motor on linkset constraints", 692 new ParameterDefn<bool>("LinkConstraintEnableTransMotor", "Whether to enable translational motor on linkset constraints",
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSPrimDisplaced.cs b/OpenSim/Region/Physics/BulletSPlugin/BSPrimDisplaced.cs
index f5ee671..9a05349 100755
--- a/OpenSim/Region/Physics/BulletSPlugin/BSPrimDisplaced.cs
+++ b/OpenSim/Region/Physics/BulletSPlugin/BSPrimDisplaced.cs
@@ -44,12 +44,12 @@ namespace OpenSim.Region.Physics.BulletSPlugin
44{ 44{
45public class BSPrimDisplaced : BSPrim 45public class BSPrimDisplaced : BSPrim
46{ 46{
47 // The purpose of this module is to do any mapping between what the simulator thinks 47 // The purpose of this subclass is to do any mapping between what the simulator thinks
48 // the prim position and orientation is and what the physical position/orientation. 48 // the prim position and orientation is and what the physical position/orientation.
49 // This difference happens because Bullet assumes the center-of-mass is the <0,0,0> 49 // This difference happens because Bullet assumes the center-of-mass is the <0,0,0>
50 // of the prim/linkset. The simulator tracks the location of the prim/linkset by 50 // of the prim/linkset. The simulator, on the other hand, tracks the location of
51 // the location of the root prim. So, if center-of-mass is anywhere but the origin 51 // the prim/linkset by the location of the root prim. So, if center-of-mass is anywhere
52 // of the root prim, the physical origin is displaced from the simulator origin. 52 // but the origin of the root prim, the physical origin is displaced from the simulator origin.
53 // 53 //
54 // This routine works by capturing the Force* setting of position/orientation/... and 54 // This routine works by capturing the Force* setting of position/orientation/... and
55 // adjusting the simulator values (being set) into the physical values. 55 // adjusting the simulator values (being set) into the physical values.
@@ -61,6 +61,7 @@ public class BSPrimDisplaced : BSPrim
61 61
62 public virtual OMV.Vector3 PositionDisplacement { get; set; } 62 public virtual OMV.Vector3 PositionDisplacement { get; set; }
63 public virtual OMV.Quaternion OrientationDisplacement { get; set; } 63 public virtual OMV.Quaternion OrientationDisplacement { get; set; }
64 public virtual OMV.Quaternion OrientationDisplacementOrigInv { get; set; }
64 65
65 public BSPrimDisplaced(uint localID, String primName, BSScene parent_scene, OMV.Vector3 pos, OMV.Vector3 size, 66 public BSPrimDisplaced(uint localID, String primName, BSScene parent_scene, OMV.Vector3 pos, OMV.Vector3 size,
66 OMV.Quaternion rotation, PrimitiveBaseShape pbs, bool pisPhysical) 67 OMV.Quaternion rotation, PrimitiveBaseShape pbs, bool pisPhysical)
@@ -99,7 +100,8 @@ public class BSPrimDisplaced : BSPrim
99 // Remember the displacement from root as well as the origional rotation of the 100 // Remember the displacement from root as well as the origional rotation of the
100 // new center-of-mass. 101 // new center-of-mass.
101 PositionDisplacement = comDisp; 102 PositionDisplacement = comDisp;
102 OrientationDisplacement = OMV.Quaternion.Identity; 103 OrientationDisplacement = Quaternion.Normalize(RawOrientation);
104 OrientationDisplacementOrigInv = Quaternion.Inverse(OrientationDisplacement);
103 } 105 }
104 } 106 }
105 107
@@ -110,7 +112,7 @@ public class BSPrimDisplaced : BSPrim
110 { 112 {
111 if (PositionDisplacement != OMV.Vector3.Zero) 113 if (PositionDisplacement != OMV.Vector3.Zero)
112 { 114 {
113 OMV.Vector3 displacedPos = value - (PositionDisplacement * RawOrientation); 115 OMV.Vector3 displacedPos = value - (PositionDisplacement * (OrientationDisplacementOrigInv * RawOrientation));
114 DetailLog("{0},BSPrimDisplaced.ForcePosition,val={1},disp={2},newPos={3}", LocalID, value, PositionDisplacement, displacedPos); 116 DetailLog("{0},BSPrimDisplaced.ForcePosition,val={1},disp={2},newPos={3}", LocalID, value, PositionDisplacement, displacedPos);
115 base.ForcePosition = displacedPos; 117 base.ForcePosition = displacedPos;
116 } 118 }
@@ -126,7 +128,8 @@ public class BSPrimDisplaced : BSPrim
126 get { return base.ForceOrientation; } 128 get { return base.ForceOrientation; }
127 set 129 set
128 { 130 {
129 // TODO: 131 // Changing orientation also changes the position of the center-of-mass since
132 // the orientation passed is for a rotation around the root prim's center.
130 base.ForceOrientation = value; 133 base.ForceOrientation = value;
131 } 134 }
132 } 135 }
@@ -150,10 +153,13 @@ public class BSPrimDisplaced : BSPrim
150 // Undo any center-of-mass displacement that might have been done. 153 // Undo any center-of-mass displacement that might have been done.
151 if (PositionDisplacement != OMV.Vector3.Zero || OrientationDisplacement != OMV.Quaternion.Identity) 154 if (PositionDisplacement != OMV.Vector3.Zero || OrientationDisplacement != OMV.Quaternion.Identity)
152 { 155 {
153 // Correct for any rotation around the center-of-mass 156 // The origional shape was offset from 'zero' by PositionDisplacement and rotated by OrientationDisplacement.
154 // TODO!!! 157 // These physical locations and rotation must be back converted to be centered around the displaced
158 // root shape.
159
160 // The root position is the reported position displaced by the rotated displacement.
161 OMV.Vector3 displacedPos = entprop.Position + (PositionDisplacement * (entprop.Rotation * OrientationDisplacementOrigInv));
155 162
156 OMV.Vector3 displacedPos = entprop.Position + (PositionDisplacement * entprop.Rotation);
157 DetailLog("{0},BSPrimDisplaced.ForcePosition,physPos={1},disp={2},newPos={3}", LocalID, entprop.Position, PositionDisplacement, displacedPos); 163 DetailLog("{0},BSPrimDisplaced.ForcePosition,physPos={1},disp={2},newPos={3}", LocalID, entprop.Position, PositionDisplacement, displacedPos);
158 entprop.Position = displacedPos; 164 entprop.Position = displacedPos;
159 // entprop.Rotation = something; 165 // entprop.Rotation = something;
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSPrimLinkable.cs b/OpenSim/Region/Physics/BulletSPlugin/BSPrimLinkable.cs
index 87eed98..6d7de35 100755
--- a/OpenSim/Region/Physics/BulletSPlugin/BSPrimLinkable.cs
+++ b/OpenSim/Region/Physics/BulletSPlugin/BSPrimLinkable.cs
@@ -37,6 +37,12 @@ namespace OpenSim.Region.Physics.BulletSPlugin
37{ 37{
38public class BSPrimLinkable : BSPrimDisplaced 38public class BSPrimLinkable : BSPrimDisplaced
39{ 39{
40 // The purpose of this subclass is to add linkset functionality to the prim. This overrides
41 // operations necessary for keeping the linkset created and, additionally, this
42 // calls the linkset implementation for its creation and management.
43
44 // This adds the overrides for link() and delink() so the prim is linkable.
45
40 public BSLinkset Linkset { get; set; } 46 public BSLinkset Linkset { get; set; }
41 // The index of this child prim. 47 // The index of this child prim.
42 public int LinksetChildIndex { get; set; } 48 public int LinksetChildIndex { get; set; }
@@ -69,8 +75,8 @@ public class BSPrimLinkable : BSPrimDisplaced
69 BSPrimLinkable parent = obj as BSPrimLinkable; 75 BSPrimLinkable parent = obj as BSPrimLinkable;
70 if (parent != null) 76 if (parent != null)
71 { 77 {
72 BSPhysObject parentBefore = Linkset.LinksetRoot; 78 BSPhysObject parentBefore = Linkset.LinksetRoot; // DEBUG
73 int childrenBefore = Linkset.NumberOfChildren; 79 int childrenBefore = Linkset.NumberOfChildren; // DEBUG
74 80
75 Linkset = parent.Linkset.AddMeToLinkset(this); 81 Linkset = parent.Linkset.AddMeToLinkset(this);
76 82
@@ -85,8 +91,8 @@ public class BSPrimLinkable : BSPrimDisplaced
85 // TODO: decide if this parent checking needs to happen at taint time 91 // TODO: decide if this parent checking needs to happen at taint time
86 // Race condition here: if link() and delink() in same simulation tick, the delink will not happen 92 // Race condition here: if link() and delink() in same simulation tick, the delink will not happen
87 93
88 BSPhysObject parentBefore = Linkset.LinksetRoot; 94 BSPhysObject parentBefore = Linkset.LinksetRoot; // DEBUG
89 int childrenBefore = Linkset.NumberOfChildren; 95 int childrenBefore = Linkset.NumberOfChildren; // DEBUG
90 96
91 Linkset = Linkset.RemoveMeFromLinkset(this); 97 Linkset = Linkset.RemoveMeFromLinkset(this);
92 98
@@ -128,6 +134,7 @@ public class BSPrimLinkable : BSPrimDisplaced
128 get { return Linkset.LinksetMass; } 134 get { return Linkset.LinksetMass; }
129 } 135 }
130 136
137 // Refresh the linkset structure and parameters when the prim's physical parameters are changed.
131 public override void UpdatePhysicalParameters() 138 public override void UpdatePhysicalParameters()
132 { 139 {
133 base.UpdatePhysicalParameters(); 140 base.UpdatePhysicalParameters();
@@ -139,6 +146,7 @@ public class BSPrimLinkable : BSPrimDisplaced
139 Linkset.Refresh(this); 146 Linkset.Refresh(this);
140 } 147 }
141 148
149 // When the prim is made dynamic or static, the linkset needs to change.
142 protected override void MakeDynamic(bool makeStatic) 150 protected override void MakeDynamic(bool makeStatic)
143 { 151 {
144 base.MakeDynamic(makeStatic); 152 base.MakeDynamic(makeStatic);
@@ -155,6 +163,8 @@ public class BSPrimLinkable : BSPrimDisplaced
155 base.RemoveDependencies(); 163 base.RemoveDependencies();
156 } 164 }
157 165
166 // Called after a simulation step for the changes in physical object properties.
167 // Do any filtering/modification needed for linksets.
158 public override void UpdateProperties(EntityProperties entprop) 168 public override void UpdateProperties(EntityProperties entprop)
159 { 169 {
160 if (Linkset.IsRoot(this)) 170 if (Linkset.IsRoot(this))
@@ -176,6 +186,7 @@ public class BSPrimLinkable : BSPrimDisplaced
176 Linkset.UpdateProperties(UpdatedProperties.EntPropUpdates, this); 186 Linkset.UpdateProperties(UpdatedProperties.EntPropUpdates, this);
177 } 187 }
178 188
189 // Called after a simulation step to post a collision with this object.
179 public override bool Collide(uint collidingWith, BSPhysObject collidee, 190 public override bool Collide(uint collidingWith, BSPhysObject collidee,
180 OMV.Vector3 contactPoint, OMV.Vector3 contactNormal, float pentrationDepth) 191 OMV.Vector3 contactPoint, OMV.Vector3 contactNormal, float pentrationDepth)
181 { 192 {