diff options
Diffstat (limited to 'OpenSim/Region/Physics/BulletSPlugin/BSCharacter.cs')
-rw-r--r-- | OpenSim/Region/Physics/BulletSPlugin/BSCharacter.cs | 41 |
1 files changed, 23 insertions, 18 deletions
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSCharacter.cs b/OpenSim/Region/Physics/BulletSPlugin/BSCharacter.cs index 291dfcd..fc18960 100644 --- a/OpenSim/Region/Physics/BulletSPlugin/BSCharacter.cs +++ b/OpenSim/Region/Physics/BulletSPlugin/BSCharacter.cs | |||
@@ -93,7 +93,7 @@ public sealed class BSCharacter : BSPhysObject | |||
93 | LocalID, _size, Scale, Density, _avatarVolume, RawMass, pos); | 93 | LocalID, _size, Scale, Density, _avatarVolume, RawMass, pos); |
94 | 94 | ||
95 | // do actual creation in taint time | 95 | // do actual creation in taint time |
96 | PhysScene.TaintedObject("BSCharacter.create", delegate() | 96 | PhysScene.TaintedObject(LocalID, "BSCharacter.create", delegate() |
97 | { | 97 | { |
98 | DetailLog("{0},BSCharacter.create,taint", LocalID); | 98 | DetailLog("{0},BSCharacter.create,taint", LocalID); |
99 | // New body and shape into PhysBody and PhysShape | 99 | // New body and shape into PhysBody and PhysShape |
@@ -121,7 +121,7 @@ public sealed class BSCharacter : BSPhysObject | |||
121 | base.Destroy(); | 121 | base.Destroy(); |
122 | 122 | ||
123 | DetailLog("{0},BSCharacter.Destroy", LocalID); | 123 | DetailLog("{0},BSCharacter.Destroy", LocalID); |
124 | PhysScene.TaintedObject("BSCharacter.destroy", delegate() | 124 | PhysScene.TaintedObject(LocalID, "BSCharacter.destroy", delegate() |
125 | { | 125 | { |
126 | PhysScene.Shapes.DereferenceBody(PhysBody, null /* bodyCallback */); | 126 | PhysScene.Shapes.DereferenceBody(PhysBody, null /* bodyCallback */); |
127 | PhysBody.Clear(); | 127 | PhysBody.Clear(); |
@@ -209,7 +209,7 @@ public sealed class BSCharacter : BSPhysObject | |||
209 | DetailLog("{0},BSCharacter.setSize,call,size={1},scale={2},density={3},volume={4},mass={5}", | 209 | DetailLog("{0},BSCharacter.setSize,call,size={1},scale={2},density={3},volume={4},mass={5}", |
210 | LocalID, _size, Scale, Density, _avatarVolume, RawMass); | 210 | LocalID, _size, Scale, Density, _avatarVolume, RawMass); |
211 | 211 | ||
212 | PhysScene.TaintedObject("BSCharacter.setSize", delegate() | 212 | PhysScene.TaintedObject(LocalID, "BSCharacter.setSize", delegate() |
213 | { | 213 | { |
214 | if (PhysBody.HasPhysicalBody && PhysShape.physShapeInfo.HasPhysicalShape) | 214 | if (PhysBody.HasPhysicalBody && PhysShape.physShapeInfo.HasPhysicalShape) |
215 | { | 215 | { |
@@ -257,7 +257,7 @@ public sealed class BSCharacter : BSPhysObject | |||
257 | _rotationalVelocity = OMV.Vector3.Zero; | 257 | _rotationalVelocity = OMV.Vector3.Zero; |
258 | 258 | ||
259 | // Zero some other properties directly into the physics engine | 259 | // Zero some other properties directly into the physics engine |
260 | PhysScene.TaintedObject(inTaintTime, "BSCharacter.ZeroMotion", delegate() | 260 | PhysScene.TaintedObject(inTaintTime, LocalID, "BSCharacter.ZeroMotion", delegate() |
261 | { | 261 | { |
262 | if (PhysBody.HasPhysicalBody) | 262 | if (PhysBody.HasPhysicalBody) |
263 | PhysScene.PE.ClearAllForces(PhysBody); | 263 | PhysScene.PE.ClearAllForces(PhysBody); |
@@ -267,7 +267,7 @@ public sealed class BSCharacter : BSPhysObject | |||
267 | { | 267 | { |
268 | _rotationalVelocity = OMV.Vector3.Zero; | 268 | _rotationalVelocity = OMV.Vector3.Zero; |
269 | 269 | ||
270 | PhysScene.TaintedObject(inTaintTime, "BSCharacter.ZeroMotion", delegate() | 270 | PhysScene.TaintedObject(inTaintTime, LocalID, "BSCharacter.ZeroMotion", delegate() |
271 | { | 271 | { |
272 | if (PhysBody.HasPhysicalBody) | 272 | if (PhysBody.HasPhysicalBody) |
273 | { | 273 | { |
@@ -291,7 +291,7 @@ public sealed class BSCharacter : BSPhysObject | |||
291 | set { | 291 | set { |
292 | RawPosition = value; | 292 | RawPosition = value; |
293 | 293 | ||
294 | PhysScene.TaintedObject("BSCharacter.setPosition", delegate() | 294 | PhysScene.TaintedObject(LocalID, "BSCharacter.setPosition", delegate() |
295 | { | 295 | { |
296 | DetailLog("{0},BSCharacter.SetPosition,taint,pos={1},orient={2}", LocalID, RawPosition, RawOrientation); | 296 | DetailLog("{0},BSCharacter.SetPosition,taint,pos={1},orient={2}", LocalID, RawPosition, RawOrientation); |
297 | PositionSanityCheck(); | 297 | PositionSanityCheck(); |
@@ -363,7 +363,7 @@ public sealed class BSCharacter : BSPhysObject | |||
363 | { | 363 | { |
364 | // The new position value must be pushed into the physics engine but we can't | 364 | // The new position value must be pushed into the physics engine but we can't |
365 | // just assign to "Position" because of potential call loops. | 365 | // just assign to "Position" because of potential call loops. |
366 | PhysScene.TaintedObject(inTaintTime, "BSCharacter.PositionSanityCheck", delegate() | 366 | PhysScene.TaintedObject(inTaintTime, LocalID, "BSCharacter.PositionSanityCheck", delegate() |
367 | { | 367 | { |
368 | DetailLog("{0},BSCharacter.PositionSanityCheck,taint,pos={1},orient={2}", LocalID, RawPosition, RawOrientation); | 368 | DetailLog("{0},BSCharacter.PositionSanityCheck,taint,pos={1},orient={2}", LocalID, RawPosition, RawOrientation); |
369 | ForcePosition = RawPosition; | 369 | ForcePosition = RawPosition; |
@@ -390,7 +390,7 @@ public sealed class BSCharacter : BSPhysObject | |||
390 | set { | 390 | set { |
391 | RawForce = value; | 391 | RawForce = value; |
392 | // m_log.DebugFormat("{0}: Force = {1}", LogHeader, _force); | 392 | // m_log.DebugFormat("{0}: Force = {1}", LogHeader, _force); |
393 | PhysScene.TaintedObject("BSCharacter.SetForce", delegate() | 393 | PhysScene.TaintedObject(LocalID, "BSCharacter.SetForce", delegate() |
394 | { | 394 | { |
395 | DetailLog("{0},BSCharacter.setForce,taint,force={1}", LocalID, RawForce); | 395 | DetailLog("{0},BSCharacter.setForce,taint,force={1}", LocalID, RawForce); |
396 | if (PhysBody.HasPhysicalBody) | 396 | if (PhysBody.HasPhysicalBody) |
@@ -438,7 +438,7 @@ public sealed class BSCharacter : BSPhysObject | |||
438 | set { | 438 | set { |
439 | RawVelocity = value; | 439 | RawVelocity = value; |
440 | // m_log.DebugFormat("{0}: set velocity = {1}", LogHeader, RawVelocity); | 440 | // m_log.DebugFormat("{0}: set velocity = {1}", LogHeader, RawVelocity); |
441 | PhysScene.TaintedObject("BSCharacter.setVelocity", delegate() | 441 | PhysScene.TaintedObject(LocalID, "BSCharacter.setVelocity", delegate() |
442 | { | 442 | { |
443 | if (m_moveActor != null) | 443 | if (m_moveActor != null) |
444 | m_moveActor.SetVelocityAndTarget(RawVelocity, RawVelocity, true /* inTaintTime */); | 444 | m_moveActor.SetVelocityAndTarget(RawVelocity, RawVelocity, true /* inTaintTime */); |
@@ -480,7 +480,7 @@ public sealed class BSCharacter : BSPhysObject | |||
480 | if (RawOrientation != value) | 480 | if (RawOrientation != value) |
481 | { | 481 | { |
482 | RawOrientation = value; | 482 | RawOrientation = value; |
483 | PhysScene.TaintedObject("BSCharacter.setOrientation", delegate() | 483 | PhysScene.TaintedObject(LocalID, "BSCharacter.setOrientation", delegate() |
484 | { | 484 | { |
485 | // Bullet assumes we know what we are doing when forcing orientation | 485 | // Bullet assumes we know what we are doing when forcing orientation |
486 | // so it lets us go against all the rules and just compensates for them later. | 486 | // so it lets us go against all the rules and just compensates for them later. |
@@ -560,7 +560,7 @@ public sealed class BSCharacter : BSPhysObject | |||
560 | public override bool FloatOnWater { | 560 | public override bool FloatOnWater { |
561 | set { | 561 | set { |
562 | _floatOnWater = value; | 562 | _floatOnWater = value; |
563 | PhysScene.TaintedObject("BSCharacter.setFloatOnWater", delegate() | 563 | PhysScene.TaintedObject(LocalID, "BSCharacter.setFloatOnWater", delegate() |
564 | { | 564 | { |
565 | if (PhysBody.HasPhysicalBody) | 565 | if (PhysBody.HasPhysicalBody) |
566 | { | 566 | { |
@@ -588,7 +588,7 @@ public sealed class BSCharacter : BSPhysObject | |||
588 | public override float Buoyancy { | 588 | public override float Buoyancy { |
589 | get { return _buoyancy; } | 589 | get { return _buoyancy; } |
590 | set { _buoyancy = value; | 590 | set { _buoyancy = value; |
591 | PhysScene.TaintedObject("BSCharacter.setBuoyancy", delegate() | 591 | PhysScene.TaintedObject(LocalID, "BSCharacter.setBuoyancy", delegate() |
592 | { | 592 | { |
593 | DetailLog("{0},BSCharacter.setBuoyancy,taint,buoy={1}", LocalID, _buoyancy); | 593 | DetailLog("{0},BSCharacter.setBuoyancy,taint,buoy={1}", LocalID, _buoyancy); |
594 | ForceBuoyancy = _buoyancy; | 594 | ForceBuoyancy = _buoyancy; |
@@ -633,7 +633,7 @@ public sealed class BSCharacter : BSPhysObject | |||
633 | OMV.Vector3 addForce = Util.ClampV(force, BSParam.MaxAddForceMagnitude); | 633 | OMV.Vector3 addForce = Util.ClampV(force, BSParam.MaxAddForceMagnitude); |
634 | // DetailLog("{0},BSCharacter.addForce,call,force={1}", LocalID, addForce); | 634 | // DetailLog("{0},BSCharacter.addForce,call,force={1}", LocalID, addForce); |
635 | 635 | ||
636 | PhysScene.TaintedObject(inTaintTime, "BSCharacter.AddForce", delegate() | 636 | PhysScene.TaintedObject(inTaintTime, LocalID, "BSCharacter.AddForce", delegate() |
637 | { | 637 | { |
638 | // Bullet adds this central force to the total force for this tick | 638 | // Bullet adds this central force to the total force for this tick |
639 | // DetailLog("{0},BSCharacter.addForce,taint,force={1}", LocalID, addForce); | 639 | // DetailLog("{0},BSCharacter.addForce,taint,force={1}", LocalID, addForce); |
@@ -676,18 +676,20 @@ public sealed class BSCharacter : BSPhysObject | |||
676 | float heightAdjust = BSParam.AvatarHeightMidFudge; | 676 | float heightAdjust = BSParam.AvatarHeightMidFudge; |
677 | if (BSParam.AvatarHeightLowFudge != 0f || BSParam.AvatarHeightHighFudge != 0f) | 677 | if (BSParam.AvatarHeightLowFudge != 0f || BSParam.AvatarHeightHighFudge != 0f) |
678 | { | 678 | { |
679 | // An avatar is between 1.61 and 2.12 meters. Midpoint is 1.87m. | 679 | const float AVATAR_LOW = 1.1f; |
680 | // The "times 4" relies on the fact that the difference from the midpoint to the extremes is exactly 0.25 | 680 | const float AVATAR_MID = 1.775f; // 1.87f |
681 | float midHeightOffset = size.Z - 1.87f; | 681 | const float AVATAR_HI = 2.45f; |
682 | // An avatar is between 1.1 and 2.45 meters. Midpoint is 1.775m. | ||
683 | float midHeightOffset = size.Z - AVATAR_MID; | ||
682 | if (midHeightOffset < 0f) | 684 | if (midHeightOffset < 0f) |
683 | { | 685 | { |
684 | // Small avatar. Add the adjustment based on the distance from midheight | 686 | // Small avatar. Add the adjustment based on the distance from midheight |
685 | heightAdjust += -1f * midHeightOffset * 4f * BSParam.AvatarHeightLowFudge; | 687 | heightAdjust += ((-1f * midHeightOffset) / (AVATAR_MID - AVATAR_LOW)) * BSParam.AvatarHeightLowFudge; |
686 | } | 688 | } |
687 | else | 689 | else |
688 | { | 690 | { |
689 | // Large avatar. Add the adjustment based on the distance from midheight | 691 | // Large avatar. Add the adjustment based on the distance from midheight |
690 | heightAdjust += midHeightOffset * 4f * BSParam.AvatarHeightHighFudge; | 692 | heightAdjust += ((midHeightOffset) / (AVATAR_HI - AVATAR_MID)) * BSParam.AvatarHeightHighFudge; |
691 | } | 693 | } |
692 | } | 694 | } |
693 | // The total scale height is the central cylindar plus the caps on the two ends. | 695 | // The total scale height is the central cylindar plus the caps on the two ends. |
@@ -698,6 +700,9 @@ public sealed class BSCharacter : BSPhysObject | |||
698 | if (newScale.Z < 0) | 700 | if (newScale.Z < 0) |
699 | newScale.Z = 0.1f; | 701 | newScale.Z = 0.1f; |
700 | 702 | ||
703 | DetailLog("{0},BSCharacter.ComputerAvatarScale,size={1},lowF={2},midF={3},hiF={4},adj={5},newScale={6}", | ||
704 | LocalID, size, BSParam.AvatarHeightLowFudge, BSParam.AvatarHeightMidFudge, BSParam.AvatarHeightHighFudge, heightAdjust, newScale); | ||
705 | |||
701 | return newScale; | 706 | return newScale; |
702 | } | 707 | } |
703 | 708 | ||