aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/Physics/BulletSPlugin
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region/Physics/BulletSPlugin')
-rw-r--r--OpenSim/Region/Physics/BulletSPlugin/BSDynamics.cs96
1 files changed, 57 insertions, 39 deletions
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSDynamics.cs b/OpenSim/Region/Physics/BulletSPlugin/BSDynamics.cs
index cbfd7e3..4ba2f62 100644
--- a/OpenSim/Region/Physics/BulletSPlugin/BSDynamics.cs
+++ b/OpenSim/Region/Physics/BulletSPlugin/BSDynamics.cs
@@ -92,7 +92,7 @@ namespace OpenSim.Region.Physics.BulletSPlugin
92 private float m_angularMotorDecayTimescale = 0; // motor angular velocity decay rate 92 private float m_angularMotorDecayTimescale = 0; // motor angular velocity decay rate
93 private Vector3 m_angularFrictionTimescale = Vector3.Zero; // body angular velocity decay rate 93 private Vector3 m_angularFrictionTimescale = Vector3.Zero; // body angular velocity decay rate
94 private Vector3 m_lastAngularVelocity = Vector3.Zero; // what was last applied to body 94 private Vector3 m_lastAngularVelocity = Vector3.Zero; // what was last applied to body
95 // private Vector3 m_lastVertAttractor = Vector3.Zero; // what VA was last applied to body 95 private Vector3 m_lastVertAttractor = Vector3.Zero; // what VA was last applied to body
96 96
97 //Deflection properties 97 //Deflection properties
98 // private float m_angularDeflectionEfficiency = 0; 98 // private float m_angularDeflectionEfficiency = 0;
@@ -352,8 +352,9 @@ namespace OpenSim.Region.Physics.BulletSPlugin
352 // m_bankingMix = 1; 352 // m_bankingMix = 1;
353 // m_bankingTimescale = 1; 353 // m_bankingTimescale = 1;
354 // m_referenceFrame = Quaternion.Identity; 354 // m_referenceFrame = Quaternion.Identity;
355 m_flags |= (VehicleFlag.NO_DEFLECTION_UP | VehicleFlag.LIMIT_ROLL_ONLY | 355 m_flags |= (VehicleFlag.NO_DEFLECTION_UP
356 VehicleFlag.LIMIT_MOTOR_UP); 356 | VehicleFlag.LIMIT_ROLL_ONLY
357 | VehicleFlag.LIMIT_MOTOR_UP);
357 m_flags &= ~(VehicleFlag.HOVER_WATER_ONLY | VehicleFlag.HOVER_TERRAIN_ONLY | VehicleFlag.HOVER_GLOBAL_HEIGHT); 358 m_flags &= ~(VehicleFlag.HOVER_WATER_ONLY | VehicleFlag.HOVER_TERRAIN_ONLY | VehicleFlag.HOVER_GLOBAL_HEIGHT);
358 m_flags |= (VehicleFlag.HOVER_UP_ONLY); 359 m_flags |= (VehicleFlag.HOVER_UP_ONLY);
359 break; 360 break;
@@ -380,12 +381,13 @@ namespace OpenSim.Region.Physics.BulletSPlugin
380 // m_bankingMix = 0.8f; 381 // m_bankingMix = 0.8f;
381 // m_bankingTimescale = 1; 382 // m_bankingTimescale = 1;
382 // m_referenceFrame = Quaternion.Identity; 383 // m_referenceFrame = Quaternion.Identity;
383 m_flags &= ~(VehicleFlag.HOVER_TERRAIN_ONLY | 384 m_flags &= ~(VehicleFlag.HOVER_TERRAIN_ONLY
384 VehicleFlag.HOVER_GLOBAL_HEIGHT | VehicleFlag.HOVER_UP_ONLY); 385 | VehicleFlag.HOVER_GLOBAL_HEIGHT
385 m_flags &= ~(VehicleFlag.LIMIT_ROLL_ONLY); 386 | VehicleFlag.LIMIT_ROLL_ONLY
386 m_flags |= (VehicleFlag.NO_DEFLECTION_UP | 387 | VehicleFlag.HOVER_UP_ONLY);
387 VehicleFlag.LIMIT_MOTOR_UP); 388 m_flags |= (VehicleFlag.NO_DEFLECTION_UP
388 m_flags |= (VehicleFlag.HOVER_WATER_ONLY); 389 | VehicleFlag.LIMIT_MOTOR_UP
390 | VehicleFlag.HOVER_WATER_ONLY);
389 break; 391 break;
390 case Vehicle.TYPE_AIRPLANE: 392 case Vehicle.TYPE_AIRPLANE:
391 m_linearFrictionTimescale = new Vector3(200, 10, 5); 393 m_linearFrictionTimescale = new Vector3(200, 10, 5);
@@ -410,9 +412,12 @@ namespace OpenSim.Region.Physics.BulletSPlugin
410 // m_bankingMix = 0.7f; 412 // m_bankingMix = 0.7f;
411 // m_bankingTimescale = 2; 413 // m_bankingTimescale = 2;
412 // m_referenceFrame = Quaternion.Identity; 414 // m_referenceFrame = Quaternion.Identity;
413 m_flags &= ~(VehicleFlag.HOVER_WATER_ONLY | VehicleFlag.HOVER_TERRAIN_ONLY | 415 m_flags &= ~(VehicleFlag.HOVER_WATER_ONLY
414 VehicleFlag.HOVER_GLOBAL_HEIGHT | VehicleFlag.HOVER_UP_ONLY); 416 | VehicleFlag.HOVER_TERRAIN_ONLY
415 m_flags &= ~(VehicleFlag.NO_DEFLECTION_UP | VehicleFlag.LIMIT_MOTOR_UP); 417 | VehicleFlag.HOVER_GLOBAL_HEIGHT
418 | VehicleFlag.HOVER_UP_ONLY
419 | VehicleFlag.NO_DEFLECTION_UP
420 | VehicleFlag.LIMIT_MOTOR_UP);
416 m_flags |= (VehicleFlag.LIMIT_ROLL_ONLY); 421 m_flags |= (VehicleFlag.LIMIT_ROLL_ONLY);
417 break; 422 break;
418 case Vehicle.TYPE_BALLOON: 423 case Vehicle.TYPE_BALLOON:
@@ -438,11 +443,13 @@ namespace OpenSim.Region.Physics.BulletSPlugin
438 // m_bankingMix = 0.7f; 443 // m_bankingMix = 0.7f;
439 // m_bankingTimescale = 5; 444 // m_bankingTimescale = 5;
440 // m_referenceFrame = Quaternion.Identity; 445 // m_referenceFrame = Quaternion.Identity;
441 m_flags &= ~(VehicleFlag.HOVER_WATER_ONLY | VehicleFlag.HOVER_TERRAIN_ONLY | 446 m_flags &= ~(VehicleFlag.HOVER_WATER_ONLY
442 VehicleFlag.HOVER_UP_ONLY); 447 | VehicleFlag.HOVER_TERRAIN_ONLY
443 m_flags &= ~(VehicleFlag.NO_DEFLECTION_UP | VehicleFlag.LIMIT_MOTOR_UP); 448 | VehicleFlag.HOVER_UP_ONLY
444 m_flags |= (VehicleFlag.LIMIT_ROLL_ONLY); 449 | VehicleFlag.NO_DEFLECTION_UP
445 m_flags |= (VehicleFlag.HOVER_GLOBAL_HEIGHT); 450 | VehicleFlag.LIMIT_MOTOR_UP);
451 m_flags |= (VehicleFlag.LIMIT_ROLL_ONLY
452 | VehicleFlag.HOVER_GLOBAL_HEIGHT);
446 break; 453 break;
447 } 454 }
448 }//end SetDefaultsForType 455 }//end SetDefaultsForType
@@ -451,7 +458,8 @@ namespace OpenSim.Region.Physics.BulletSPlugin
451 // Do any updating needed for a vehicle 458 // Do any updating needed for a vehicle
452 public void Refresh() 459 public void Refresh()
453 { 460 {
454 if (Type == Vehicle.TYPE_NONE) return; 461 if (!IsActive)
462 return;
455 463
456 // Set the prim's inertia to zero. The vehicle code handles that and this 464 // Set the prim's inertia to zero. The vehicle code handles that and this
457 // removes the torque action introduced by Bullet. 465 // removes the torque action introduced by Bullet.
@@ -470,7 +478,7 @@ namespace OpenSim.Region.Physics.BulletSPlugin
470 LimitRotation(pTimestep); 478 LimitRotation(pTimestep);
471 479
472 // remember the position so next step we can limit absolute movement effects 480 // remember the position so next step we can limit absolute movement effects
473 m_lastPositionVector = Prim.Position; 481 m_lastPositionVector = Prim.ForcePosition;
474 482
475 VDetailLog("{0},BSDynamics.Step,done,pos={1},force={2},velocity={3},angvel={4}", 483 VDetailLog("{0},BSDynamics.Step,done,pos={1},force={2},velocity={3},angvel={4}",
476 Prim.LocalID, Prim.Position, Prim.Force, Prim.Velocity, Prim.RotationalVelocity); 484 Prim.LocalID, Prim.Position, Prim.Force, Prim.Velocity, Prim.RotationalVelocity);
@@ -524,7 +532,7 @@ namespace OpenSim.Region.Physics.BulletSPlugin
524 } 532 }
525 533
526 // convert requested object velocity to object relative vector 534 // convert requested object velocity to object relative vector
527 Quaternion rotq = Prim.Orientation; 535 Quaternion rotq = Prim.ForceOrientation;
528 m_newVelocity = m_lastLinearVelocityVector * rotq; 536 m_newVelocity = m_lastLinearVelocityVector * rotq;
529 537
530 // Add the various forces into m_dir which will be our new direction vector (velocity) 538 // Add the various forces into m_dir which will be our new direction vector (velocity)
@@ -541,19 +549,19 @@ namespace OpenSim.Region.Physics.BulletSPlugin
541 m_dir.Z = vel_now.Z; // Preserve the accumulated falling velocity 549 m_dir.Z = vel_now.Z; // Preserve the accumulated falling velocity
542 */ 550 */
543 551
544 Vector3 pos = Prim.Position; 552 Vector3 pos = Prim.ForcePosition;
545// Vector3 accel = new Vector3(-(m_dir.X - m_lastLinearVelocityVector.X / 0.1f), -(m_dir.Y - m_lastLinearVelocityVector.Y / 0.1f), m_dir.Z - m_lastLinearVelocityVector.Z / 0.1f); 553// Vector3 accel = new Vector3(-(m_dir.X - m_lastLinearVelocityVector.X / 0.1f), -(m_dir.Y - m_lastLinearVelocityVector.Y / 0.1f), m_dir.Z - m_lastLinearVelocityVector.Z / 0.1f);
546 554
547 // If below the terrain, move us above the ground a little. 555 // If below the terrain, move us above the ground a little.
548 float terrainHeight = Prim.PhysicsScene.TerrainManager.GetTerrainHeightAtXYZ(pos); 556 float terrainHeight = Prim.PhysicsScene.TerrainManager.GetTerrainHeightAtXYZ(pos);
549 // Taking the rotated size doesn't work here because m_prim.Size is the size of the root prim and not the linkset. 557 // Taking the rotated size doesn't work here because m_prim.Size is the size of the root prim and not the linkset.
550 // Need to add a m_prim.LinkSet.Size similar to m_prim.LinkSet.Mass. 558 // Need to add a m_prim.LinkSet.Size similar to m_prim.LinkSet.Mass.
551 // Vector3 rotatedSize = m_prim.Size * m_prim.Orientation; 559 // Vector3 rotatedSize = m_prim.Size * m_prim.ForceOrientation;
552 // if (rotatedSize.Z < terrainHeight) 560 // if (rotatedSize.Z < terrainHeight)
553 if (pos.Z < terrainHeight) 561 if (pos.Z < terrainHeight)
554 { 562 {
555 pos.Z = terrainHeight + 2; 563 pos.Z = terrainHeight + 2;
556 Prim.Position = pos; 564 Prim.ForcePosition = pos;
557 VDetailLog("{0},MoveLinear,terrainHeight,terrainHeight={1},pos={2}", Prim.LocalID, terrainHeight, pos); 565 VDetailLog("{0},MoveLinear,terrainHeight,terrainHeight={1},pos={2}", Prim.LocalID, terrainHeight, pos);
558 } 566 }
559 567
@@ -583,7 +591,7 @@ namespace OpenSim.Region.Physics.BulletSPlugin
583 { 591 {
584 if ((pos.Z - m_VhoverTargetHeight) > .2 || (pos.Z - m_VhoverTargetHeight) < -.2) 592 if ((pos.Z - m_VhoverTargetHeight) > .2 || (pos.Z - m_VhoverTargetHeight) < -.2)
585 { 593 {
586 Prim.Position = pos; 594 Prim.ForcePosition = pos;
587 } 595 }
588 } 596 }
589 else 597 else
@@ -635,12 +643,13 @@ namespace OpenSim.Region.Physics.BulletSPlugin
635 } 643 }
636 if (changed) 644 if (changed)
637 { 645 {
638 Prim.Position = pos; 646 Prim.ForcePosition = pos;
639 VDetailLog("{0},MoveLinear,blockingEndPoint,block={1},origPos={2},pos={3}", 647 VDetailLog("{0},MoveLinear,blockingEndPoint,block={1},origPos={2},pos={3}",
640 Prim.LocalID, m_BlockingEndPoint, posChange, pos); 648 Prim.LocalID, m_BlockingEndPoint, posChange, pos);
641 } 649 }
642 } 650 }
643 651
652 // Limit absolute vertical change
644 float Zchange = Math.Abs(posChange.Z); 653 float Zchange = Math.Abs(posChange.Z);
645 if ((m_flags & (VehicleFlag.LIMIT_MOTOR_UP)) != 0) 654 if ((m_flags & (VehicleFlag.LIMIT_MOTOR_UP)) != 0)
646 { 655 {
@@ -659,6 +668,8 @@ namespace OpenSim.Region.Physics.BulletSPlugin
659 grav.Z = (float)(grav.Z * 1.037125); 668 grav.Z = (float)(grav.Z * 1.037125);
660 VDetailLog("{0},MoveLinear,limitMotorUp,grav={1}", Prim.LocalID, grav); 669 VDetailLog("{0},MoveLinear,limitMotorUp,grav={1}", Prim.LocalID, grav);
661 } 670 }
671
672 // If not changing some axis, reduce out velocity
662 if ((m_flags & (VehicleFlag.NO_X)) != 0) 673 if ((m_flags & (VehicleFlag.NO_X)) != 0)
663 m_newVelocity.X = 0; 674 m_newVelocity.X = 0;
664 if ((m_flags & (VehicleFlag.NO_Y)) != 0) 675 if ((m_flags & (VehicleFlag.NO_Y)) != 0)
@@ -701,19 +712,19 @@ namespace OpenSim.Region.Physics.BulletSPlugin
701 // a newly set velocity, this routine steps the value from the previous 712 // a newly set velocity, this routine steps the value from the previous
702 // value (m_angularMotorVelocity) to the requested value (m_angularMotorDirection). 713 // value (m_angularMotorVelocity) to the requested value (m_angularMotorDirection).
703 // There are m_angularMotorApply steps. 714 // There are m_angularMotorApply steps.
704 Vector3 origAngularVelocity = m_angularMotorVelocity; 715 Vector3 origVel = m_angularMotorVelocity;
716 Vector3 origDir = m_angularMotorDirection;
717
705 // ramp up to new value 718 // ramp up to new value
706 // current velocity += error / ( time to get there / step interval) 719 // new velocity += error / ( time to get there / step interval)
707 // requested speed - last motor speed 720 // requested speed - last motor speed
708 m_angularMotorVelocity.X += (m_angularMotorDirection.X - m_angularMotorVelocity.X) / (m_angularMotorTimescale / pTimestep); 721 m_angularMotorVelocity.X += (m_angularMotorDirection.X - m_angularMotorVelocity.X) / (m_angularMotorTimescale / pTimestep);
709 m_angularMotorVelocity.Y += (m_angularMotorDirection.Y - m_angularMotorVelocity.Y) / (m_angularMotorTimescale / pTimestep); 722 m_angularMotorVelocity.Y += (m_angularMotorDirection.Y - m_angularMotorVelocity.Y) / (m_angularMotorTimescale / pTimestep);
710 m_angularMotorVelocity.Z += (m_angularMotorDirection.Z - m_angularMotorVelocity.Z) / (m_angularMotorTimescale / pTimestep); 723 m_angularMotorVelocity.Z += (m_angularMotorDirection.Z - m_angularMotorVelocity.Z) / (m_angularMotorTimescale / pTimestep);
711 724
712 VDetailLog("{0},MoveAngular,angularMotorApply,apply={1},angTScale={2},timeStep={3},origvel={4},dir={5},vel={6}", 725 VDetailLog("{0},MoveAngular,angularMotorApply,apply={1},angTScale={2},timeStep={3},origvel={4},origDir={5},vel={6}",
713 Prim.LocalID, m_angularMotorApply, m_angularMotorTimescale, pTimestep, origAngularVelocity, m_angularMotorDirection, m_angularMotorVelocity); 726 Prim.LocalID, m_angularMotorApply, m_angularMotorTimescale, pTimestep, origVel, origDir, m_angularMotorVelocity);
714 727
715 // This is done so that if script request rate is less than phys frame rate the expected
716 // velocity may still be acheived.
717 m_angularMotorApply--; 728 m_angularMotorApply--;
718 } 729 }
719 else 730 else
@@ -727,25 +738,32 @@ namespace OpenSim.Region.Physics.BulletSPlugin
727 738
728 // Vertical attractor section 739 // Vertical attractor section
729 Vector3 vertattr = Vector3.Zero; 740 Vector3 vertattr = Vector3.Zero;
730 if (m_verticalAttractionTimescale < 300) 741 Vector3 deflection = Vector3.Zero;
742 Vector3 banking = Vector3.Zero;
743
744 if (m_verticalAttractionTimescale < 300 && m_lastAngularVelocity != Vector3.Zero)
731 { 745 {
732 float VAservo = 0.2f / (m_verticalAttractionTimescale / pTimestep); 746 float VAservo = 0.2f / (m_verticalAttractionTimescale / pTimestep);
747 VAservo *= (m_verticalAttractionEfficiency * m_verticalAttractionEfficiency);
748
733 // get present body rotation 749 // get present body rotation
734 Quaternion rotq = Prim.Orientation; 750 Quaternion rotq = Prim.ForceOrientation;
735 // make a vector pointing up 751 // vector pointing up
736 Vector3 verterr = Vector3.Zero; 752 Vector3 verterr = Vector3.Zero;
737 verterr.Z = 1.0f; 753 verterr.Z = 1.0f;
754
738 // rotate it to Body Angle 755 // rotate it to Body Angle
739 verterr = verterr * rotq; 756 verterr = verterr * rotq;
740 // verterr.X and .Y are the World error ammounts. They are 0 when there is no error (Vehicle Body is 'vertical'), and .Z will be 1. 757 // verterr.X and .Y are the World error amounts. They are 0 when there is no error (Vehicle Body is 'vertical'), and .Z will be 1.
741 // As the body leans to its side |.X| will increase to 1 and .Z fall to 0. As body inverts |.X| will fall and .Z will go 758 // As the body leans to its side |.X| will increase to 1 and .Z fall to 0. As body inverts |.X| will fall and .Z will go
742 // negative. Similar for tilt and |.Y|. .X and .Y must be modulated to prevent a stable inverted body. 759 // negative. Similar for tilt and |.Y|. .X and .Y must be modulated to prevent a stable inverted body.
760
761 // Error is 0 (no error) to +/- 2 (max error)
743 if (verterr.Z < 0.0f) 762 if (verterr.Z < 0.0f)
744 { 763 {
745 verterr.X = 2.0f - verterr.X; 764 verterr.X = 2.0f - verterr.X;
746 verterr.Y = 2.0f - verterr.Y; 765 verterr.Y = 2.0f - verterr.Y;
747 } 766 }
748 // Error is 0 (no error) to +/- 2 (max error)
749 // scale it by VAservo 767 // scale it by VAservo
750 verterr = verterr * VAservo; 768 verterr = verterr * VAservo;
751 769
@@ -765,7 +783,7 @@ namespace OpenSim.Region.Physics.BulletSPlugin
765 783
766 } // else vertical attractor is off 784 } // else vertical attractor is off
767 785
768 // m_lastVertAttractor = vertattr; 786 m_lastVertAttractor = vertattr;
769 787
770 // Bank section tba 788 // Bank section tba
771 789
@@ -799,7 +817,7 @@ namespace OpenSim.Region.Physics.BulletSPlugin
799 817
800 internal void LimitRotation(float timestep) 818 internal void LimitRotation(float timestep)
801 { 819 {
802 Quaternion rotq = Prim.Orientation; 820 Quaternion rotq = Prim.ForceOrientation;
803 Quaternion m_rot = rotq; 821 Quaternion m_rot = rotq;
804 bool changed = false; 822 bool changed = false;
805 if (m_RollreferenceFrame != Quaternion.Identity) 823 if (m_RollreferenceFrame != Quaternion.Identity)
@@ -834,7 +852,7 @@ namespace OpenSim.Region.Physics.BulletSPlugin
834 } 852 }
835 if (changed) 853 if (changed)
836 { 854 {
837 Prim.Orientation = m_rot; 855 Prim.ForceOrientation = m_rot;
838 VDetailLog("{0},LimitRotation,done,orig={1},new={2}", Prim.LocalID, rotq, m_rot); 856 VDetailLog("{0},LimitRotation,done,orig={1},new={2}", Prim.LocalID, rotq, m_rot);
839 } 857 }
840 858