diff options
Diffstat (limited to 'OpenSim/Region/Physics')
-rw-r--r-- | OpenSim/Region/Physics/BulletSPlugin/BSDynamics.cs | 130 | ||||
-rw-r--r-- | OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs | 1 | ||||
-rw-r--r-- | OpenSim/Region/Physics/BulletSPlugin/BSScene.cs | 60 |
3 files changed, 146 insertions, 45 deletions
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSDynamics.cs b/OpenSim/Region/Physics/BulletSPlugin/BSDynamics.cs index eb20eb3..bef7aec 100644 --- a/OpenSim/Region/Physics/BulletSPlugin/BSDynamics.cs +++ b/OpenSim/Region/Physics/BulletSPlugin/BSDynamics.cs | |||
@@ -131,8 +131,9 @@ namespace OpenSim.Region.Physics.BulletSPlugin | |||
131 | m_type = Vehicle.TYPE_NONE; | 131 | m_type = Vehicle.TYPE_NONE; |
132 | } | 132 | } |
133 | 133 | ||
134 | internal void ProcessFloatVehicleParam(Vehicle pParam, float pValue) | 134 | internal void ProcessFloatVehicleParam(Vehicle pParam, float pValue, float timestep) |
135 | { | 135 | { |
136 | DetailLog("{0},ProcessFloatVehicleParam,param={1},val={2}", m_prim.LocalID, pParam, pValue); | ||
136 | switch (pParam) | 137 | switch (pParam) |
137 | { | 138 | { |
138 | case Vehicle.ANGULAR_DEFLECTION_EFFICIENCY: | 139 | case Vehicle.ANGULAR_DEFLECTION_EFFICIENCY: |
@@ -229,8 +230,9 @@ namespace OpenSim.Region.Physics.BulletSPlugin | |||
229 | } | 230 | } |
230 | }//end ProcessFloatVehicleParam | 231 | }//end ProcessFloatVehicleParam |
231 | 232 | ||
232 | internal void ProcessVectorVehicleParam(Vehicle pParam, Vector3 pValue) | 233 | internal void ProcessVectorVehicleParam(Vehicle pParam, Vector3 pValue, float timestep) |
233 | { | 234 | { |
235 | DetailLog("{0},ProcessVectorVehicleParam,param={1},val={2}", m_prim.LocalID, pParam, pValue); | ||
234 | switch (pParam) | 236 | switch (pParam) |
235 | { | 237 | { |
236 | case Vehicle.ANGULAR_FRICTION_TIMESCALE: | 238 | case Vehicle.ANGULAR_FRICTION_TIMESCALE: |
@@ -265,6 +267,7 @@ namespace OpenSim.Region.Physics.BulletSPlugin | |||
265 | 267 | ||
266 | internal void ProcessRotationVehicleParam(Vehicle pParam, Quaternion pValue) | 268 | internal void ProcessRotationVehicleParam(Vehicle pParam, Quaternion pValue) |
267 | { | 269 | { |
270 | DetailLog("{0},ProcessRotationalVehicleParam,param={1},val={2}", m_prim.LocalID, pParam, pValue); | ||
268 | switch (pParam) | 271 | switch (pParam) |
269 | { | 272 | { |
270 | case Vehicle.REFERENCE_FRAME: | 273 | case Vehicle.REFERENCE_FRAME: |
@@ -278,6 +281,7 @@ namespace OpenSim.Region.Physics.BulletSPlugin | |||
278 | 281 | ||
279 | internal void ProcessVehicleFlags(int pParam, bool remove) | 282 | internal void ProcessVehicleFlags(int pParam, bool remove) |
280 | { | 283 | { |
284 | DetailLog("{0},ProcessVehicleFlags,param={1},remove={2}", m_prim.LocalID, pParam, remove); | ||
281 | if (remove) | 285 | if (remove) |
282 | { | 286 | { |
283 | if (pParam == -1) | 287 | if (pParam == -1) |
@@ -434,6 +438,7 @@ namespace OpenSim.Region.Physics.BulletSPlugin | |||
434 | 438 | ||
435 | internal void ProcessTypeChange(Vehicle pType) | 439 | internal void ProcessTypeChange(Vehicle pType) |
436 | { | 440 | { |
441 | DetailLog("{0},ProcessTypeChange,type={1}", m_prim.LocalID, pType); | ||
437 | // Set Defaults For Type | 442 | // Set Defaults For Type |
438 | m_type = pType; | 443 | m_type = pType; |
439 | switch (pType) | 444 | switch (pType) |
@@ -594,7 +599,6 @@ namespace OpenSim.Region.Physics.BulletSPlugin | |||
594 | m_flags |= (VehicleFlag.LIMIT_ROLL_ONLY); | 599 | m_flags |= (VehicleFlag.LIMIT_ROLL_ONLY); |
595 | m_Hoverflags |= (VehicleFlag.HOVER_GLOBAL_HEIGHT); | 600 | m_Hoverflags |= (VehicleFlag.HOVER_GLOBAL_HEIGHT); |
596 | break; | 601 | break; |
597 | |||
598 | } | 602 | } |
599 | }//end SetDefaultsForType | 603 | }//end SetDefaultsForType |
600 | 604 | ||
@@ -609,12 +613,17 @@ namespace OpenSim.Region.Physics.BulletSPlugin | |||
609 | MoveLinear(pTimestep, pParentScene); | 613 | MoveLinear(pTimestep, pParentScene); |
610 | MoveAngular(pTimestep); | 614 | MoveAngular(pTimestep); |
611 | LimitRotation(pTimestep); | 615 | LimitRotation(pTimestep); |
616 | DetailLog("{0},step,pos={1},force={2},velocity={3},angvel={4}", | ||
617 | m_prim.LocalID, m_prim.Position, m_prim.Force, m_prim.Velocity, m_prim.RotationalVelocity); | ||
612 | }// end Step | 618 | }// end Step |
613 | 619 | ||
614 | private void MoveLinear(float pTimestep, BSScene _pParentScene) | 620 | private void MoveLinear(float pTimestep, BSScene _pParentScene) |
615 | { | 621 | { |
616 | if (!m_linearMotorDirection.ApproxEquals(Vector3.Zero, 0.01f)) // requested m_linearMotorDirection is significant | 622 | if (!m_linearMotorDirection.ApproxEquals(Vector3.Zero, 0.01f)) // requested m_linearMotorDirection is significant |
617 | { | 623 | { |
624 | Vector3 origDir = m_linearMotorDirection; | ||
625 | Vector3 origVel = m_lastLinearVelocityVector; | ||
626 | |||
618 | // add drive to body | 627 | // add drive to body |
619 | Vector3 addAmount = m_linearMotorDirection/(m_linearMotorTimescale/pTimestep); | 628 | Vector3 addAmount = m_linearMotorDirection/(m_linearMotorTimescale/pTimestep); |
620 | m_lastLinearVelocityVector += (addAmount*10); // lastLinearVelocityVector is the current body velocity vector? | 629 | m_lastLinearVelocityVector += (addAmount*10); // lastLinearVelocityVector is the current body velocity vector? |
@@ -630,9 +639,10 @@ namespace OpenSim.Region.Physics.BulletSPlugin | |||
630 | 639 | ||
631 | // decay applied velocity | 640 | // decay applied velocity |
632 | Vector3 decayfraction = ((Vector3.One/(m_linearMotorDecayTimescale/pTimestep))); | 641 | Vector3 decayfraction = ((Vector3.One/(m_linearMotorDecayTimescale/pTimestep))); |
633 | //Console.WriteLine("decay: " + decayfraction); | ||
634 | m_linearMotorDirection -= m_linearMotorDirection * decayfraction * 0.5f; | 642 | m_linearMotorDirection -= m_linearMotorDirection * decayfraction * 0.5f; |
635 | //Console.WriteLine("actual: " + m_linearMotorDirection); | 643 | |
644 | DetailLog("{0},MoveLinear,nonZero,origdir={1},origvel={2},add={3},decay={4},dir={5},vel={6}", | ||
645 | m_prim.LocalID, origDir, origVel, addAmount, decayfraction, m_linearMotorDirection, m_lastLinearVelocityVector); | ||
636 | } | 646 | } |
637 | else | 647 | else |
638 | { // requested is not significant | 648 | { // requested is not significant |
@@ -643,63 +653,66 @@ namespace OpenSim.Region.Physics.BulletSPlugin | |||
643 | 653 | ||
644 | // convert requested object velocity to world-referenced vector | 654 | // convert requested object velocity to world-referenced vector |
645 | m_dir = m_lastLinearVelocityVector; | 655 | m_dir = m_lastLinearVelocityVector; |
646 | Quaternion rot = m_prim.Orientation; | 656 | m_dir *= m_prim.Orientation; |
647 | Quaternion rotq = new Quaternion(rot.X, rot.Y, rot.Z, rot.W); // rotq = rotation of object | 657 | |
648 | m_dir *= rotq; // apply obj rotation to velocity vector | 658 | // Add the various forces into m_dir which will be our new direction vector (velocity) |
649 | 659 | ||
650 | // add Gravity andBuoyancy | 660 | // add Gravity and Buoyancy |
651 | // KF: So far I have found no good method to combine a script-requested | 661 | // KF: So far I have found no good method to combine a script-requested |
652 | // .Z velocity and gravity. Therefore only 0g will used script-requested | 662 | // .Z velocity and gravity. Therefore only 0g will used script-requested |
653 | // .Z velocity. >0g (m_VehicleBuoyancy < 1) will used modified gravity only. | 663 | // .Z velocity. >0g (m_VehicleBuoyancy < 1) will used modified gravity only. |
654 | Vector3 grav = Vector3.Zero; | 664 | Vector3 grav = Vector3.Zero; |
655 | // There is some gravity, make a gravity force vector | 665 | // There is some gravity, make a gravity force vector that is applied after object velocity. |
656 | // that is applied after object velocity. | ||
657 | float objMass = m_prim.Mass; | ||
658 | // m_VehicleBuoyancy: -1=2g; 0=1g; 1=0g; | 666 | // m_VehicleBuoyancy: -1=2g; 0=1g; 1=0g; |
659 | grav.Z = _pParentScene.DefaultGravity.Z * objMass * (1f - m_VehicleBuoyancy); | 667 | grav.Z = _pParentScene.DefaultGravity.Z * m_prim.Mass * (1f - m_VehicleBuoyancy); |
660 | // Preserve the current Z velocity | 668 | // Preserve the current Z velocity |
661 | Vector3 vel_now = m_prim.Velocity; | 669 | Vector3 vel_now = m_prim.Velocity; |
662 | m_dir.Z = vel_now.Z; // Preserve the accumulated falling velocity | 670 | m_dir.Z = vel_now.Z; // Preserve the accumulated falling velocity |
663 | 671 | ||
664 | Vector3 pos = m_prim.Position; | 672 | Vector3 pos = m_prim.Position; |
673 | Vector3 posChange = pos; | ||
665 | // 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); | 674 | // 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); |
666 | Vector3 posChange = new Vector3(); | ||
667 | posChange.X = pos.X - m_lastPositionVector.X; | ||
668 | posChange.Y = pos.Y - m_lastPositionVector.Y; | ||
669 | posChange.Z = pos.Z - m_lastPositionVector.Z; | ||
670 | double Zchange = Math.Abs(posChange.Z); | 675 | double Zchange = Math.Abs(posChange.Z); |
671 | if (m_BlockingEndPoint != Vector3.Zero) | 676 | if (m_BlockingEndPoint != Vector3.Zero) |
672 | { | 677 | { |
678 | bool changed = false; | ||
673 | if (pos.X >= (m_BlockingEndPoint.X - (float)1)) | 679 | if (pos.X >= (m_BlockingEndPoint.X - (float)1)) |
674 | { | 680 | { |
675 | pos.X -= posChange.X + 1; | 681 | pos.X -= posChange.X + 1; |
676 | m_prim.Position = pos; | 682 | changed = true; |
677 | } | 683 | } |
678 | if (pos.Y >= (m_BlockingEndPoint.Y - (float)1)) | 684 | if (pos.Y >= (m_BlockingEndPoint.Y - (float)1)) |
679 | { | 685 | { |
680 | pos.Y -= posChange.Y + 1; | 686 | pos.Y -= posChange.Y + 1; |
681 | m_prim.Position = pos; | 687 | changed = true; |
682 | } | 688 | } |
683 | if (pos.Z >= (m_BlockingEndPoint.Z - (float)1)) | 689 | if (pos.Z >= (m_BlockingEndPoint.Z - (float)1)) |
684 | { | 690 | { |
685 | pos.Z -= posChange.Z + 1; | 691 | pos.Z -= posChange.Z + 1; |
686 | m_prim.Position = pos; | 692 | changed = true; |
687 | } | 693 | } |
688 | if (pos.X <= 0) | 694 | if (pos.X <= 0) |
689 | { | 695 | { |
690 | pos.X += posChange.X + 1; | 696 | pos.X += posChange.X + 1; |
691 | m_prim.Position = pos; | 697 | changed = true; |
692 | } | 698 | } |
693 | if (pos.Y <= 0) | 699 | if (pos.Y <= 0) |
694 | { | 700 | { |
695 | pos.Y += posChange.Y + 1; | 701 | pos.Y += posChange.Y + 1; |
702 | changed = true; | ||
703 | } | ||
704 | if (changed) | ||
705 | { | ||
696 | m_prim.Position = pos; | 706 | m_prim.Position = pos; |
707 | DetailLog("{0},MoveLinear,blockingEndPoint,block={1},origPos={2},pos={3}", | ||
708 | m_prim.LocalID, m_BlockingEndPoint, posChange, pos); | ||
697 | } | 709 | } |
698 | } | 710 | } |
699 | if (pos.Z < _pParentScene.GetTerrainHeightAtXY(pos.X, pos.Y)) | 711 | if (pos.Z < _pParentScene.GetTerrainHeightAtXY(pos.X, pos.Y)) |
700 | { | 712 | { |
701 | pos.Z = _pParentScene.GetTerrainHeightAtXY(pos.X, pos.Y) + 2; | 713 | pos.Z = _pParentScene.GetTerrainHeightAtXY(pos.X, pos.Y) + 2; |
702 | m_prim.Position = pos; | 714 | m_prim.Position = pos; |
715 | DetailLog("{0},MoveLinear,terrainHeight,pos={1}", m_prim.LocalID, pos); | ||
703 | } | 716 | } |
704 | 717 | ||
705 | // Check if hovering | 718 | // Check if hovering |
@@ -746,6 +759,8 @@ namespace OpenSim.Region.Physics.BulletSPlugin | |||
746 | } | 759 | } |
747 | } | 760 | } |
748 | 761 | ||
762 | DetailLog("{0},MoveLinear,hover,pos={1},dir={2},height={3},target={4}", m_prim.LocalID, pos, m_dir, m_VhoverHeight, m_VhoverTargetHeight); | ||
763 | |||
749 | // m_VhoverEfficiency = 0f; // 0=boucy, 1=Crit.damped | 764 | // m_VhoverEfficiency = 0f; // 0=boucy, 1=Crit.damped |
750 | // m_VhoverTimescale = 0f; // time to acheive height | 765 | // m_VhoverTimescale = 0f; // time to acheive height |
751 | // pTimestep is time since last frame,in secs | 766 | // pTimestep is time since last frame,in secs |
@@ -774,12 +789,13 @@ namespace OpenSim.Region.Physics.BulletSPlugin | |||
774 | { | 789 | { |
775 | grav.Z = (float)(grav.Z * 1.125); | 790 | grav.Z = (float)(grav.Z * 1.125); |
776 | } | 791 | } |
777 | float terraintemp = _pParentScene.GetTerrainHeightAtXY(pos.X, pos.Y); | 792 | float terraintemp = _pParentScene.GetTerrainHeightAtXYZ(pos); |
778 | float postemp = (pos.Z - terraintemp); | 793 | float postemp = (pos.Z - terraintemp); |
779 | if (postemp > 2.5f) | 794 | if (postemp > 2.5f) |
780 | { | 795 | { |
781 | grav.Z = (float)(grav.Z * 1.037125); | 796 | grav.Z = (float)(grav.Z * 1.037125); |
782 | } | 797 | } |
798 | DetailLog("{0},MoveLinear,limitMotorUp,grav={1}", m_prim.LocalID, grav); | ||
783 | //End Experimental Values | 799 | //End Experimental Values |
784 | } | 800 | } |
785 | if ((m_flags & (VehicleFlag.NO_X)) != 0) | 801 | if ((m_flags & (VehicleFlag.NO_X)) != 0) |
@@ -803,29 +819,35 @@ namespace OpenSim.Region.Physics.BulletSPlugin | |||
803 | m_prim.Force = grav; | 819 | m_prim.Force = grav; |
804 | 820 | ||
805 | 821 | ||
806 | // apply friction | 822 | // Apply friction |
807 | Vector3 decayamount = Vector3.One / (m_linearFrictionTimescale / pTimestep); | 823 | Vector3 decayamount = Vector3.One / (m_linearFrictionTimescale / pTimestep); |
808 | m_lastLinearVelocityVector -= m_lastLinearVelocityVector * decayamount; | 824 | m_lastLinearVelocityVector -= m_lastLinearVelocityVector * decayamount; |
825 | |||
826 | DetailLog("{0},MoveLinear,done,pos={1},vel={2},force={3},decay={4}", | ||
827 | m_prim.LocalID, m_lastPositionVector, m_dir, grav, decayamount); | ||
828 | |||
809 | } // end MoveLinear() | 829 | } // end MoveLinear() |
810 | 830 | ||
811 | private void MoveAngular(float pTimestep) | 831 | private void MoveAngular(float pTimestep) |
812 | { | 832 | { |
813 | /* | 833 | // m_angularMotorDirection // angular velocity requested by LSL motor |
814 | private Vector3 m_angularMotorDirection = Vector3.Zero; // angular velocity requested by LSL motor | 834 | // m_angularMotorApply // application frame counter |
815 | private int m_angularMotorApply = 0; // application frame counter | 835 | // m_angularMotorVelocity // current angular motor velocity (ramps up and down) |
816 | private float m_angularMotorVelocity = 0; // current angular motor velocity (ramps up and down) | 836 | // m_angularMotorTimescale // motor angular velocity ramp up rate |
817 | private float m_angularMotorTimescale = 0; // motor angular velocity ramp up rate | 837 | // m_angularMotorDecayTimescale // motor angular velocity decay rate |
818 | private float m_angularMotorDecayTimescale = 0; // motor angular velocity decay rate | 838 | // m_angularFrictionTimescale // body angular velocity decay rate |
819 | private Vector3 m_angularFrictionTimescale = Vector3.Zero; // body angular velocity decay rate | 839 | // m_lastAngularVelocity // what was last applied to body |
820 | private Vector3 m_lastAngularVelocity = Vector3.Zero; // what was last applied to body | ||
821 | */ | ||
822 | 840 | ||
823 | // Get what the body is doing, this includes 'external' influences | 841 | // Get what the body is doing, this includes 'external' influences |
824 | Vector3 angularVelocity = m_prim.RotationalVelocity; | 842 | Vector3 angularVelocity = m_prim.RotationalVelocity; |
825 | // Vector3 angularVelocity = Vector3.Zero; | ||
826 | 843 | ||
827 | if (m_angularMotorApply > 0) | 844 | if (m_angularMotorApply > 0) |
828 | { | 845 | { |
846 | // Rather than snapping the angular motor velocity from the old value to | ||
847 | // a newly set velocity, this routine steps the value from the previous | ||
848 | // value (m_angularMotorVelocity) to the requested value (m_angularMotorDirection). | ||
849 | // There are m_angularMotorApply steps. | ||
850 | Vector3 origAngularVelocity = m_angularMotorVelocity; | ||
829 | // ramp up to new value | 851 | // ramp up to new value |
830 | // current velocity += error / (time to get there / step interval) | 852 | // current velocity += error / (time to get there / step interval) |
831 | // requested speed - last motor speed | 853 | // requested speed - last motor speed |
@@ -833,23 +855,21 @@ namespace OpenSim.Region.Physics.BulletSPlugin | |||
833 | m_angularMotorVelocity.Y += (m_angularMotorDirection.Y - m_angularMotorVelocity.Y) / (m_angularMotorTimescale / pTimestep); | 855 | m_angularMotorVelocity.Y += (m_angularMotorDirection.Y - m_angularMotorVelocity.Y) / (m_angularMotorTimescale / pTimestep); |
834 | m_angularMotorVelocity.Z += (m_angularMotorDirection.Z - m_angularMotorVelocity.Z) / (m_angularMotorTimescale / pTimestep); | 856 | m_angularMotorVelocity.Z += (m_angularMotorDirection.Z - m_angularMotorVelocity.Z) / (m_angularMotorTimescale / pTimestep); |
835 | 857 | ||
858 | DetailLog("{0},MoveAngular,angularMotorApply,apply={1},origvel={2},dir={3},vel={4}", | ||
859 | m_prim.LocalID,m_angularMotorApply,origAngularVelocity, m_angularMotorDirection, m_angularMotorVelocity); | ||
860 | |||
836 | m_angularMotorApply--; // This is done so that if script request rate is less than phys frame rate the expected | 861 | m_angularMotorApply--; // This is done so that if script request rate is less than phys frame rate the expected |
837 | // velocity may still be acheived. | 862 | // velocity may still be acheived. |
838 | } | 863 | } |
839 | else | 864 | else |
840 | { | 865 | { |
841 | // no motor recently applied, keep the body velocity | 866 | // No motor recently applied, keep the body velocity |
842 | /* m_angularMotorVelocity.X = angularVelocity.X; | ||
843 | m_angularMotorVelocity.Y = angularVelocity.Y; | ||
844 | m_angularMotorVelocity.Z = angularVelocity.Z; */ | ||
845 | |||
846 | // and decay the velocity | 867 | // and decay the velocity |
847 | m_angularMotorVelocity -= m_angularMotorVelocity / (m_angularMotorDecayTimescale / pTimestep); | 868 | m_angularMotorVelocity -= m_angularMotorVelocity / (m_angularMotorDecayTimescale / pTimestep); |
848 | } // end motor section | 869 | } // end motor section |
849 | 870 | ||
850 | // Vertical attractor section | 871 | // Vertical attractor section |
851 | Vector3 vertattr = Vector3.Zero; | 872 | Vector3 vertattr = Vector3.Zero; |
852 | |||
853 | if (m_verticalAttractionTimescale < 300) | 873 | if (m_verticalAttractionTimescale < 300) |
854 | { | 874 | { |
855 | float VAservo = 0.2f / (m_verticalAttractionTimescale * pTimestep); | 875 | float VAservo = 0.2f / (m_verticalAttractionTimescale * pTimestep); |
@@ -871,7 +891,6 @@ namespace OpenSim.Region.Physics.BulletSPlugin | |||
871 | // Error is 0 (no error) to +/- 2 (max error) | 891 | // Error is 0 (no error) to +/- 2 (max error) |
872 | // scale it by VAservo | 892 | // scale it by VAservo |
873 | verterr = verterr * VAservo; | 893 | verterr = verterr * VAservo; |
874 | //if (frcount == 0) Console.WriteLine("VAerr=" + verterr); | ||
875 | 894 | ||
876 | // As the body rotates around the X axis, then verterr.Y increases; Rotated around Y then .X increases, so | 895 | // As the body rotates around the X axis, then verterr.Y increases; Rotated around Y then .X increases, so |
877 | // Change Body angular velocity X based on Y, and Y based on X. Z is not changed. | 896 | // Change Body angular velocity X based on Y, and Y based on X. Z is not changed. |
@@ -884,11 +903,15 @@ namespace OpenSim.Region.Physics.BulletSPlugin | |||
884 | vertattr.X += bounce * angularVelocity.X; | 903 | vertattr.X += bounce * angularVelocity.X; |
885 | vertattr.Y += bounce * angularVelocity.Y; | 904 | vertattr.Y += bounce * angularVelocity.Y; |
886 | 905 | ||
906 | DetailLog("{0},MoveAngular,verticalAttraction,verterr={1},bounce={2},vertattr={3}", | ||
907 | m_prim.LocalID, verterr, bounce, vertattr); | ||
908 | |||
887 | } // else vertical attractor is off | 909 | } // else vertical attractor is off |
888 | 910 | ||
889 | // m_lastVertAttractor = vertattr; | 911 | // m_lastVertAttractor = vertattr; |
890 | 912 | ||
891 | // Bank section tba | 913 | // Bank section tba |
914 | |||
892 | // Deflection section tba | 915 | // Deflection section tba |
893 | 916 | ||
894 | // Sum velocities | 917 | // Sum velocities |
@@ -898,11 +921,13 @@ namespace OpenSim.Region.Physics.BulletSPlugin | |||
898 | { | 921 | { |
899 | m_lastAngularVelocity.X = 0; | 922 | m_lastAngularVelocity.X = 0; |
900 | m_lastAngularVelocity.Y = 0; | 923 | m_lastAngularVelocity.Y = 0; |
924 | DetailLog("{0},MoveAngular,noDeflectionUp,lastAngular={1}", m_prim.LocalID, m_lastAngularVelocity); | ||
901 | } | 925 | } |
902 | 926 | ||
903 | if (m_lastAngularVelocity.ApproxEquals(Vector3.Zero, 0.01f)) | 927 | if (m_lastAngularVelocity.ApproxEquals(Vector3.Zero, 0.01f)) |
904 | { | 928 | { |
905 | m_lastAngularVelocity = Vector3.Zero; // Reduce small value to zero. | 929 | m_lastAngularVelocity = Vector3.Zero; // Reduce small value to zero. |
930 | DetailLog("{0},MoveAngular,zeroSmallValues,lastAngular={1}", m_prim.LocalID, m_lastAngularVelocity); | ||
906 | } | 931 | } |
907 | 932 | ||
908 | // apply friction | 933 | // apply friction |
@@ -912,10 +937,13 @@ namespace OpenSim.Region.Physics.BulletSPlugin | |||
912 | // Apply to the body | 937 | // Apply to the body |
913 | m_prim.RotationalVelocity = m_lastAngularVelocity; | 938 | m_prim.RotationalVelocity = m_lastAngularVelocity; |
914 | 939 | ||
940 | DetailLog("{0},MoveAngular,done,decay={1},lastAngular={2}", m_prim.LocalID, decayamount, m_lastAngularVelocity); | ||
941 | } //end MoveAngular | ||
942 | |||
915 | } //end MoveAngular | 943 | } //end MoveAngular |
916 | internal void LimitRotation(float timestep) | 944 | internal void LimitRotation(float timestep) |
917 | { | 945 | { |
918 | Quaternion rotq = m_prim.Orientation; // rotq = rotation of object | 946 | Quaternion rotq = m_prim.Orientation; |
919 | Quaternion m_rot = rotq; | 947 | Quaternion m_rot = rotq; |
920 | bool changed = false; | 948 | bool changed = false; |
921 | if (m_RollreferenceFrame != Quaternion.Identity) | 949 | if (m_RollreferenceFrame != Quaternion.Identity) |
@@ -923,18 +951,22 @@ namespace OpenSim.Region.Physics.BulletSPlugin | |||
923 | if (rotq.X >= m_RollreferenceFrame.X) | 951 | if (rotq.X >= m_RollreferenceFrame.X) |
924 | { | 952 | { |
925 | m_rot.X = rotq.X - (m_RollreferenceFrame.X / 2); | 953 | m_rot.X = rotq.X - (m_RollreferenceFrame.X / 2); |
954 | changed = true; | ||
926 | } | 955 | } |
927 | if (rotq.Y >= m_RollreferenceFrame.Y) | 956 | if (rotq.Y >= m_RollreferenceFrame.Y) |
928 | { | 957 | { |
929 | m_rot.Y = rotq.Y - (m_RollreferenceFrame.Y / 2); | 958 | m_rot.Y = rotq.Y - (m_RollreferenceFrame.Y / 2); |
959 | changed = true; | ||
930 | } | 960 | } |
931 | if (rotq.X <= -m_RollreferenceFrame.X) | 961 | if (rotq.X <= -m_RollreferenceFrame.X) |
932 | { | 962 | { |
933 | m_rot.X = rotq.X + (m_RollreferenceFrame.X / 2); | 963 | m_rot.X = rotq.X + (m_RollreferenceFrame.X / 2); |
964 | changed = true; | ||
934 | } | 965 | } |
935 | if (rotq.Y <= -m_RollreferenceFrame.Y) | 966 | if (rotq.Y <= -m_RollreferenceFrame.Y) |
936 | { | 967 | { |
937 | m_rot.Y = rotq.Y + (m_RollreferenceFrame.Y / 2); | 968 | m_rot.Y = rotq.Y + (m_RollreferenceFrame.Y / 2); |
969 | changed = true; | ||
938 | } | 970 | } |
939 | changed = true; | 971 | changed = true; |
940 | } | 972 | } |
@@ -944,8 +976,22 @@ namespace OpenSim.Region.Physics.BulletSPlugin | |||
944 | m_rot.Y = 0; | 976 | m_rot.Y = 0; |
945 | changed = true; | 977 | changed = true; |
946 | } | 978 | } |
979 | if ((m_flags & VehicleFlag.LOCK_ROTATION) != 0) | ||
980 | { | ||
981 | m_rot.X = 0; | ||
982 | m_rot.Y = 0; | ||
983 | changed = true; | ||
984 | } | ||
947 | if (changed) | 985 | if (changed) |
948 | m_prim.Orientation = m_rot; | 986 | m_prim.Orientation = m_rot; |
987 | |||
988 | DetailLog("{0},LimitRotation,done,changed={1},orig={2},new={3}", m_prim.LocalID, changed, rotq, m_rot); | ||
989 | } | ||
990 | |||
991 | // Invoke the detailed logger and output something if it's enabled. | ||
992 | private void DetailLog(string msg, params Object[] args) | ||
993 | { | ||
994 | m_prim.Scene.VehicleLogging.Write(msg, args); | ||
949 | } | 995 | } |
950 | } | 996 | } |
951 | } | 997 | } |
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs b/OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs index 23b276e..227696e 100644 --- a/OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs +++ b/OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs | |||
@@ -52,6 +52,7 @@ public sealed class BSPrim : PhysicsActor | |||
52 | private List<ConvexResult> _hulls; | 52 | private List<ConvexResult> _hulls; |
53 | 53 | ||
54 | private BSScene _scene; | 54 | private BSScene _scene; |
55 | public BSScene Scene { get { return _scene; } } | ||
55 | private String _avName; | 56 | private String _avName; |
56 | private uint _localID = 0; | 57 | private uint _localID = 0; |
57 | 58 | ||
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSScene.cs b/OpenSim/Region/Physics/BulletSPlugin/BSScene.cs index 150326e..c4b4332 100644 --- a/OpenSim/Region/Physics/BulletSPlugin/BSScene.cs +++ b/OpenSim/Region/Physics/BulletSPlugin/BSScene.cs | |||
@@ -29,12 +29,13 @@ using System.Collections.Generic; | |||
29 | using System.Runtime.InteropServices; | 29 | using System.Runtime.InteropServices; |
30 | using System.Text; | 30 | using System.Text; |
31 | using System.Threading; | 31 | using System.Threading; |
32 | using Nini.Config; | ||
33 | using log4net; | ||
34 | using OpenSim.Framework; | 32 | using OpenSim.Framework; |
33 | using OpenSim.Region.CoreModules.Framework.Statistics.Logging; | ||
34 | using OpenSim.Region.Framework; | ||
35 | using OpenSim.Region.Physics.Manager; | 35 | using OpenSim.Region.Physics.Manager; |
36 | using Nini.Config; | ||
37 | using log4net; | ||
36 | using OpenMetaverse; | 38 | using OpenMetaverse; |
37 | using OpenSim.Region.Framework; | ||
38 | 39 | ||
39 | // TODOs for BulletSim (for BSScene, BSPrim, BSCharacter and BulletSim) | 40 | // TODOs for BulletSim (for BSScene, BSPrim, BSCharacter and BulletSim) |
40 | // Debug linkset | 41 | // Debug linkset |
@@ -158,6 +159,19 @@ public class BSScene : PhysicsScene, IPhysicsParameters | |||
158 | 159 | ||
159 | private BulletSimAPI.DebugLogCallback m_DebugLogCallbackHandle; | 160 | private BulletSimAPI.DebugLogCallback m_DebugLogCallbackHandle; |
160 | 161 | ||
162 | // Sometimes you just have to log everything. | ||
163 | public LogWriter PhysicsLogging; | ||
164 | private bool m_physicsLoggingEnabled; | ||
165 | private string m_physicsLoggingDir; | ||
166 | private string m_physicsLoggingPrefix; | ||
167 | private int m_physicsLoggingFileMinutes; | ||
168 | |||
169 | public LogWriter VehicleLogging; | ||
170 | private bool m_vehicleLoggingEnabled; | ||
171 | private string m_vehicleLoggingDir; | ||
172 | private string m_vehicleLoggingPrefix; | ||
173 | private int m_vehicleLoggingFileMinutes; | ||
174 | |||
161 | public BSScene(string identifier) | 175 | public BSScene(string identifier) |
162 | { | 176 | { |
163 | m_initialized = false; | 177 | m_initialized = false; |
@@ -178,6 +192,26 @@ public class BSScene : PhysicsScene, IPhysicsParameters | |||
178 | m_updateArray = new EntityProperties[m_maxUpdatesPerFrame]; | 192 | m_updateArray = new EntityProperties[m_maxUpdatesPerFrame]; |
179 | m_updateArrayPinnedHandle = GCHandle.Alloc(m_updateArray, GCHandleType.Pinned); | 193 | m_updateArrayPinnedHandle = GCHandle.Alloc(m_updateArray, GCHandleType.Pinned); |
180 | 194 | ||
195 | // Enable very detailed logging. | ||
196 | // By creating an empty logger when not logging, the log message invocation code | ||
197 | // can be left in and every call doesn't have to check for null. | ||
198 | if (m_physicsLoggingEnabled) | ||
199 | { | ||
200 | PhysicsLogging = new LogWriter(m_physicsLoggingDir, m_physicsLoggingPrefix, m_physicsLoggingFileMinutes); | ||
201 | } | ||
202 | else | ||
203 | { | ||
204 | PhysicsLogging = new LogWriter(); | ||
205 | } | ||
206 | if (m_vehicleLoggingEnabled) | ||
207 | { | ||
208 | VehicleLogging = new LogWriter(m_vehicleLoggingDir, m_vehicleLoggingPrefix, m_vehicleLoggingFileMinutes); | ||
209 | } | ||
210 | else | ||
211 | { | ||
212 | VehicleLogging = new LogWriter(); | ||
213 | } | ||
214 | |||
181 | // Get the version of the DLL | 215 | // Get the version of the DLL |
182 | // TODO: this doesn't work yet. Something wrong with marshaling the returned string. | 216 | // TODO: this doesn't work yet. Something wrong with marshaling the returned string. |
183 | // BulletSimVersion = BulletSimAPI.GetVersion(); | 217 | // BulletSimVersion = BulletSimAPI.GetVersion(); |
@@ -321,6 +355,17 @@ public class BSScene : PhysicsScene, IPhysicsParameters | |||
321 | parms.shouldSplitSimulationIslands = ParamBoolean(pConfig, "ShouldSplitSimulationIslands", parms.shouldSplitSimulationIslands); | 355 | parms.shouldSplitSimulationIslands = ParamBoolean(pConfig, "ShouldSplitSimulationIslands", parms.shouldSplitSimulationIslands); |
322 | parms.shouldEnableFrictionCaching = ParamBoolean(pConfig, "ShouldEnableFrictionCaching", parms.shouldEnableFrictionCaching); | 356 | parms.shouldEnableFrictionCaching = ParamBoolean(pConfig, "ShouldEnableFrictionCaching", parms.shouldEnableFrictionCaching); |
323 | parms.numberOfSolverIterations = pConfig.GetFloat("NumberOfSolverIterations", parms.numberOfSolverIterations); | 357 | parms.numberOfSolverIterations = pConfig.GetFloat("NumberOfSolverIterations", parms.numberOfSolverIterations); |
358 | |||
359 | // Very detailed logging for physics debugging | ||
360 | m_physicsLoggingEnabled = pConfig.GetBoolean("PhysicsLoggingEnabled", false); | ||
361 | m_physicsLoggingDir = pConfig.GetString("PhysicsLoggingDir", "."); | ||
362 | m_physicsLoggingPrefix = pConfig.GetString("PhysicsLoggingPrefix", "physics-"); | ||
363 | m_physicsLoggingFileMinutes = pConfig.GetInt("PhysicsLoggingFileMinutes", 5); | ||
364 | // Very detailed logging for vehicle debugging | ||
365 | m_vehicleLoggingEnabled = pConfig.GetBoolean("VehicleLoggingEnabled", false); | ||
366 | m_vehicleLoggingDir = pConfig.GetString("VehicleLoggingDir", "."); | ||
367 | m_vehicleLoggingPrefix = pConfig.GetString("VehicleLoggingPrefix", "vehicle-"); | ||
368 | m_vehicleLoggingFileMinutes = pConfig.GetInt("VehicleLoggingFileMinutes", 5); | ||
324 | } | 369 | } |
325 | } | 370 | } |
326 | m_params[0] = parms; | 371 | m_params[0] = parms; |
@@ -560,8 +605,17 @@ public class BSScene : PhysicsScene, IPhysicsParameters | |||
560 | }); | 605 | }); |
561 | } | 606 | } |
562 | 607 | ||
608 | // Someday we will have complex terrain with caves and tunnels | ||
609 | // For the moment, it's flat and convex | ||
610 | public float GetTerrainHeightAtXYZ(Vector3 loc) | ||
611 | { | ||
612 | return GetTerrainHeightAtXY(loc.X, loc.Y); | ||
613 | } | ||
614 | |||
563 | public float GetTerrainHeightAtXY(float tX, float tY) | 615 | public float GetTerrainHeightAtXY(float tX, float tY) |
564 | { | 616 | { |
617 | if (tX < 0 || tX >= Constants.RegionSize || tY < 0 || tY >= Constants.RegionSize) | ||
618 | return 30; | ||
565 | return m_heightMap[((int)tX) * Constants.RegionSize + ((int)tY)]; | 619 | return m_heightMap[((int)tX) * Constants.RegionSize + ((int)tY)]; |
566 | } | 620 | } |
567 | 621 | ||