diff options
Diffstat (limited to 'OpenSim/Region/Physics/BulletSPlugin/BSCharacter.cs')
-rw-r--r-- | OpenSim/Region/Physics/BulletSPlugin/BSCharacter.cs | 39 |
1 files changed, 27 insertions, 12 deletions
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSCharacter.cs b/OpenSim/Region/Physics/BulletSPlugin/BSCharacter.cs index f33c124..4c195e1 100644 --- a/OpenSim/Region/Physics/BulletSPlugin/BSCharacter.cs +++ b/OpenSim/Region/Physics/BulletSPlugin/BSCharacter.cs | |||
@@ -78,11 +78,17 @@ public sealed class BSCharacter : BSPhysObject | |||
78 | private float _PIDHoverTao; | 78 | private float _PIDHoverTao; |
79 | 79 | ||
80 | public BSCharacter(uint localID, String avName, BSScene parent_scene, OMV.Vector3 pos, OMV.Vector3 size, bool isFlying) | 80 | public BSCharacter(uint localID, String avName, BSScene parent_scene, OMV.Vector3 pos, OMV.Vector3 size, bool isFlying) |
81 | : base(parent_scene, localID, avName, "BSCharacter") | ||
81 | { | 82 | { |
82 | base.BaseInitialize(parent_scene, localID, avName, "BSCharacter"); | ||
83 | _physicsActorType = (int)ActorTypes.Agent; | 83 | _physicsActorType = (int)ActorTypes.Agent; |
84 | _position = pos; | 84 | _position = pos; |
85 | |||
86 | // Old versions of ScenePresence passed only the height. If width and/or depth are zero, | ||
87 | // replace with the default values. | ||
85 | _size = size; | 88 | _size = size; |
89 | if (_size.X == 0f) _size.X = PhysicsScene.Params.avatarCapsuleDepth; | ||
90 | if (_size.Y == 0f) _size.Y = PhysicsScene.Params.avatarCapsuleWidth; | ||
91 | |||
86 | _flying = isFlying; | 92 | _flying = isFlying; |
87 | _orientation = OMV.Quaternion.Identity; | 93 | _orientation = OMV.Quaternion.Identity; |
88 | _velocity = OMV.Vector3.Zero; | 94 | _velocity = OMV.Vector3.Zero; |
@@ -131,6 +137,10 @@ public sealed class BSCharacter : BSPhysObject | |||
131 | // Set the velocity and compute the proper friction | 137 | // Set the velocity and compute the proper friction |
132 | ForceVelocity = _velocity; | 138 | ForceVelocity = _velocity; |
133 | 139 | ||
140 | // This will enable or disable the flying buoyancy of the avatar. | ||
141 | // Needs to be reset especially when an avatar is recreated after crossing a region boundry. | ||
142 | Flying = _flying; | ||
143 | |||
134 | BulletSimAPI.SetRestitution2(PhysBody.ptr, PhysicsScene.Params.avatarRestitution); | 144 | BulletSimAPI.SetRestitution2(PhysBody.ptr, PhysicsScene.Params.avatarRestitution); |
135 | BulletSimAPI.SetMargin2(PhysShape.ptr, PhysicsScene.Params.collisionMargin); | 145 | BulletSimAPI.SetMargin2(PhysShape.ptr, PhysicsScene.Params.collisionMargin); |
136 | BulletSimAPI.SetLocalScaling2(PhysShape.ptr, Scale); | 146 | BulletSimAPI.SetLocalScaling2(PhysShape.ptr, Scale); |
@@ -171,8 +181,7 @@ public sealed class BSCharacter : BSPhysObject | |||
171 | get | 181 | get |
172 | { | 182 | { |
173 | // Avatar capsule size is kept in the scale parameter. | 183 | // Avatar capsule size is kept in the scale parameter. |
174 | // return _size; | 184 | return _size; |
175 | return new OMV.Vector3(Scale.X * 2f, Scale.Y * 2f, Scale.Z); | ||
176 | } | 185 | } |
177 | 186 | ||
178 | set { | 187 | set { |
@@ -180,8 +189,8 @@ public sealed class BSCharacter : BSPhysObject | |||
180 | _size = value; | 189 | _size = value; |
181 | ComputeAvatarScale(_size); | 190 | ComputeAvatarScale(_size); |
182 | ComputeAvatarVolumeAndMass(); | 191 | ComputeAvatarVolumeAndMass(); |
183 | DetailLog("{0},BSCharacter.setSize,call,scale={1},density={2},volume={3},mass={4}", | 192 | DetailLog("{0},BSCharacter.setSize,call,size={1},scale={2},density={3},volume={4},mass={5}", |
184 | LocalID, Scale, _avatarDensity, _avatarVolume, RawMass); | 193 | LocalID, _size, Scale, _avatarDensity, _avatarVolume, RawMass); |
185 | 194 | ||
186 | PhysicsScene.TaintedObject("BSCharacter.setSize", delegate() | 195 | PhysicsScene.TaintedObject("BSCharacter.setSize", delegate() |
187 | { | 196 | { |
@@ -199,9 +208,9 @@ public sealed class BSCharacter : BSPhysObject | |||
199 | set { BaseShape = value; } | 208 | set { BaseShape = value; } |
200 | } | 209 | } |
201 | // I want the physics engine to make an avatar capsule | 210 | // I want the physics engine to make an avatar capsule |
202 | public override ShapeData.PhysicsShapeType PreferredPhysicalShape | 211 | public override BSPhysicsShapeType PreferredPhysicalShape |
203 | { | 212 | { |
204 | get {return ShapeData.PhysicsShapeType.SHAPE_AVATAR; } | 213 | get {return BSPhysicsShapeType.SHAPE_CAPSULE; } |
205 | } | 214 | } |
206 | 215 | ||
207 | public override bool Grabbed { | 216 | public override bool Grabbed { |
@@ -610,13 +619,19 @@ public sealed class BSCharacter : BSPhysObject | |||
610 | // The 'size' given by the simulator is the mid-point of the avatar | 619 | // The 'size' given by the simulator is the mid-point of the avatar |
611 | // and X and Y are unspecified. | 620 | // and X and Y are unspecified. |
612 | 621 | ||
613 | OMV.Vector3 newScale = OMV.Vector3.Zero; | 622 | OMV.Vector3 newScale = size; |
614 | newScale.X = PhysicsScene.Params.avatarCapsuleRadius; | 623 | // newScale.X = PhysicsScene.Params.avatarCapsuleWidth; |
615 | newScale.Y = PhysicsScene.Params.avatarCapsuleRadius; | 624 | // newScale.Y = PhysicsScene.Params.avatarCapsuleDepth; |
616 | 625 | ||
617 | // From the total height, remove the capsule half spheres that are at each end | 626 | // From the total height, remove the capsule half spheres that are at each end |
618 | newScale.Z = size.Z- (newScale.X + newScale.Y); | 627 | // The 1.15f came from ODE. Not sure what this factors in. |
619 | Scale = newScale; | 628 | // newScale.Z = (size.Z * 1.15f) - (newScale.X + newScale.Y); |
629 | |||
630 | // The total scale height is the central cylindar plus the caps on the two ends. | ||
631 | newScale.Z = size.Z + (Math.Min(size.X, size.Y) * 2f); | ||
632 | |||
633 | // Convert diameters to radii and height to half height -- the way Bullet expects it. | ||
634 | Scale = newScale / 2f; | ||
620 | } | 635 | } |
621 | 636 | ||
622 | // set _avatarVolume and _mass based on capsule size, _density and Scale | 637 | // set _avatarVolume and _mass based on capsule size, _density and Scale |