diff options
author | Justin Clark-Casey (justincc) | 2014-11-29 00:12:11 +0000 |
---|---|---|
committer | Justin Clark-Casey (justincc) | 2014-11-29 00:12:11 +0000 |
commit | 265fe349e00b3ece59ec02e56f83bb7623e9d962 (patch) | |
tree | 42afe816271f54a017fe5f731d905e923ef5d67b /OpenSim/Region/Physics/BulletSPlugin/BSCharacter.cs | |
parent | Avoid repeated lag-generating continuous attempts to retrieve HG service Urls... (diff) | |
download | opensim-SC-265fe349e00b3ece59ec02e56f83bb7623e9d962.zip opensim-SC-265fe349e00b3ece59ec02e56f83bb7623e9d962.tar.gz opensim-SC-265fe349e00b3ece59ec02e56f83bb7623e9d962.tar.bz2 opensim-SC-265fe349e00b3ece59ec02e56f83bb7623e9d962.tar.xz |
Somewhat improve avatar region crossings by properly preserving velocity when avatar enters the new region.
This commit addresses the following issues were causing velocity to be set to 0 on the new region, disrupting flight in particular
* Full avatar updates contained no velocity information, which does appear to have some effect in testing.
* BulletSim was always setting the velocity to 0 for the new BSCharacter. Now, physics engines take a velocity parameter when setting up characters so we can avoid this.
This patch applies to both Bullet and ODE.
Diffstat (limited to '')
-rw-r--r-- | OpenSim/Region/Physics/BulletSPlugin/BSCharacter.cs | 41 |
1 files changed, 31 insertions, 10 deletions
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSCharacter.cs b/OpenSim/Region/Physics/BulletSPlugin/BSCharacter.cs index 4c54f9f..f29784a 100644 --- a/OpenSim/Region/Physics/BulletSPlugin/BSCharacter.cs +++ b/OpenSim/Region/Physics/BulletSPlugin/BSCharacter.cs | |||
@@ -64,15 +64,25 @@ public sealed class BSCharacter : BSPhysObject | |||
64 | private bool _usePID; | 64 | private bool _usePID; |
65 | private float _PIDTau; | 65 | private float _PIDTau; |
66 | 66 | ||
67 | public BSCharacter(uint localID, String avName, BSScene parent_scene, OMV.Vector3 pos, OMV.Vector3 size, bool isFlying) | 67 | // public override OMV.Vector3 RawVelocity |
68 | // { get { return base.RawVelocity; } | ||
69 | // set { | ||
70 | // if (value != base.RawVelocity) | ||
71 | // Util.PrintCallStack(); | ||
72 | // Console.WriteLine("Set rawvel to {0}", value); | ||
73 | // base.RawVelocity = value; } | ||
74 | // } | ||
75 | |||
76 | public BSCharacter( | ||
77 | uint localID, String avName, BSScene parent_scene, OMV.Vector3 pos, OMV.Vector3 vel, OMV.Vector3 size, bool isFlying) | ||
68 | : base(parent_scene, localID, avName, "BSCharacter") | 78 | : base(parent_scene, localID, avName, "BSCharacter") |
69 | { | 79 | { |
70 | _physicsActorType = (int)ActorTypes.Agent; | 80 | _physicsActorType = (int)ActorTypes.Agent; |
71 | RawPosition = pos; | 81 | RawPosition = pos; |
72 | 82 | ||
73 | _flying = isFlying; | 83 | _flying = isFlying; |
74 | RawOrientation = OMV.Quaternion.Identity; | 84 | RawOrientation = OMV.Quaternion.Identity; |
75 | RawVelocity = OMV.Vector3.Zero; | 85 | RawVelocity = vel; |
76 | _buoyancy = ComputeBuoyancyFromFlying(isFlying); | 86 | _buoyancy = ComputeBuoyancyFromFlying(isFlying); |
77 | Friction = BSParam.AvatarStandingFriction; | 87 | Friction = BSParam.AvatarStandingFriction; |
78 | Density = BSParam.AvatarDensity; | 88 | Density = BSParam.AvatarDensity; |
@@ -89,13 +99,15 @@ public sealed class BSCharacter : BSPhysObject | |||
89 | // set _avatarVolume and _mass based on capsule size, _density and Scale | 99 | // set _avatarVolume and _mass based on capsule size, _density and Scale |
90 | ComputeAvatarVolumeAndMass(); | 100 | ComputeAvatarVolumeAndMass(); |
91 | 101 | ||
92 | DetailLog("{0},BSCharacter.create,call,size={1},scale={2},density={3},volume={4},mass={5},pos={6}", | 102 | DetailLog( |
93 | LocalID, _size, Scale, Density, _avatarVolume, RawMass, pos); | 103 | "{0},BSCharacter.create,call,size={1},scale={2},density={3},volume={4},mass={5},pos={6},vel={7}", |
104 | LocalID, _size, Scale, Density, _avatarVolume, RawMass, pos, vel); | ||
94 | 105 | ||
95 | // do actual creation in taint time | 106 | // do actual creation in taint time |
96 | PhysScene.TaintedObject(LocalID, "BSCharacter.create", delegate() | 107 | PhysScene.TaintedObject(LocalID, "BSCharacter.create", delegate() |
97 | { | 108 | { |
98 | DetailLog("{0},BSCharacter.create,taint", LocalID); | 109 | DetailLog("{0},BSCharacter.create,taint", LocalID); |
110 | |||
99 | // New body and shape into PhysBody and PhysShape | 111 | // New body and shape into PhysBody and PhysShape |
100 | PhysScene.Shapes.GetBodyAndShape(true, PhysScene.World, this); | 112 | PhysScene.Shapes.GetBodyAndShape(true, PhysScene.World, this); |
101 | 113 | ||
@@ -142,6 +154,7 @@ public sealed class BSCharacter : BSPhysObject | |||
142 | m_moveActor.SetVelocityAndTarget(RawVelocity, RawVelocity, false); | 154 | m_moveActor.SetVelocityAndTarget(RawVelocity, RawVelocity, false); |
143 | 155 | ||
144 | ForceVelocity = RawVelocity; | 156 | ForceVelocity = RawVelocity; |
157 | TargetVelocity = RawVelocity; | ||
145 | 158 | ||
146 | // This will enable or disable the flying buoyancy of the avatar. | 159 | // This will enable or disable the flying buoyancy of the avatar. |
147 | // Needs to be reset especially when an avatar is recreated after crossing a region boundry. | 160 | // Needs to be reset especially when an avatar is recreated after crossing a region boundry. |
@@ -256,7 +269,6 @@ public sealed class BSCharacter : BSPhysObject | |||
256 | // Called at taint time! | 269 | // Called at taint time! |
257 | public override void ZeroMotion(bool inTaintTime) | 270 | public override void ZeroMotion(bool inTaintTime) |
258 | { | 271 | { |
259 | RawVelocity = OMV.Vector3.Zero; | ||
260 | _acceleration = OMV.Vector3.Zero; | 272 | _acceleration = OMV.Vector3.Zero; |
261 | _rotationalVelocity = OMV.Vector3.Zero; | 273 | _rotationalVelocity = OMV.Vector3.Zero; |
262 | 274 | ||
@@ -267,6 +279,7 @@ public sealed class BSCharacter : BSPhysObject | |||
267 | PhysScene.PE.ClearAllForces(PhysBody); | 279 | PhysScene.PE.ClearAllForces(PhysBody); |
268 | }); | 280 | }); |
269 | } | 281 | } |
282 | |||
270 | public override void ZeroAngularMotion(bool inTaintTime) | 283 | public override void ZeroAngularMotion(bool inTaintTime) |
271 | { | 284 | { |
272 | _rotationalVelocity = OMV.Vector3.Zero; | 285 | _rotationalVelocity = OMV.Vector3.Zero; |
@@ -441,32 +454,40 @@ public sealed class BSCharacter : BSPhysObject | |||
441 | get { return RawVelocity; } | 454 | get { return RawVelocity; } |
442 | set { | 455 | set { |
443 | RawVelocity = value; | 456 | RawVelocity = value; |
444 | // m_log.DebugFormat("{0}: set velocity = {1}", LogHeader, RawVelocity); | 457 | OMV.Vector3 vel = RawVelocity; |
458 | |||
459 | DetailLog("{0}: set Velocity = {1}", LogHeader, value); | ||
460 | |||
445 | PhysScene.TaintedObject(LocalID, "BSCharacter.setVelocity", delegate() | 461 | PhysScene.TaintedObject(LocalID, "BSCharacter.setVelocity", delegate() |
446 | { | 462 | { |
447 | if (m_moveActor != null) | 463 | if (m_moveActor != null) |
448 | m_moveActor.SetVelocityAndTarget(RawVelocity, RawVelocity, true /* inTaintTime */); | 464 | m_moveActor.SetVelocityAndTarget(vel, vel, true /* inTaintTime */); |
449 | 465 | ||
450 | DetailLog("{0},BSCharacter.setVelocity,taint,vel={1}", LocalID, RawVelocity); | 466 | m_log.DebugFormat("{0},BSCharacter.setVelocity,taint,vel={1}", LocalID, vel); |
451 | ForceVelocity = RawVelocity; | 467 | ForceVelocity = vel; |
452 | }); | 468 | }); |
453 | } | 469 | } |
454 | } | 470 | } |
471 | |||
455 | public override OMV.Vector3 ForceVelocity { | 472 | public override OMV.Vector3 ForceVelocity { |
456 | get { return RawVelocity; } | 473 | get { return RawVelocity; } |
457 | set { | 474 | set { |
458 | PhysScene.AssertInTaintTime("BSCharacter.ForceVelocity"); | 475 | PhysScene.AssertInTaintTime("BSCharacter.ForceVelocity"); |
476 | // Util.PrintCallStack(); | ||
477 | DetailLog("{0}: set ForceVelocity = {1}", LogHeader, value); | ||
459 | 478 | ||
460 | RawVelocity = value; | 479 | RawVelocity = value; |
461 | PhysScene.PE.SetLinearVelocity(PhysBody, RawVelocity); | 480 | PhysScene.PE.SetLinearVelocity(PhysBody, RawVelocity); |
462 | PhysScene.PE.Activate(PhysBody, true); | 481 | PhysScene.PE.Activate(PhysBody, true); |
463 | } | 482 | } |
464 | } | 483 | } |
484 | |||
465 | public override OMV.Vector3 Torque { | 485 | public override OMV.Vector3 Torque { |
466 | get { return RawTorque; } | 486 | get { return RawTorque; } |
467 | set { RawTorque = value; | 487 | set { RawTorque = value; |
468 | } | 488 | } |
469 | } | 489 | } |
490 | |||
470 | public override float CollisionScore { | 491 | public override float CollisionScore { |
471 | get { return _collisionScore; } | 492 | get { return _collisionScore; } |
472 | set { _collisionScore = value; | 493 | set { _collisionScore = value; |