aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region/Physics/OdePlugin/ODEPrim.cs')
-rw-r--r--OpenSim/Region/Physics/OdePlugin/ODEPrim.cs226
1 files changed, 113 insertions, 113 deletions
diff --git a/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs b/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs
index 37a8b77..f1886e4 100644
--- a/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs
+++ b/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs
@@ -111,7 +111,7 @@ namespace OpenSim.Region.Physics.OdePlugin
111 private IntPtr _linkJointGroup = (IntPtr)0; 111 private IntPtr _linkJointGroup = (IntPtr)0;
112 private PhysicsActor _parent = null; 112 private PhysicsActor _parent = null;
113 private PhysicsActor m_taintparent = null; 113 private PhysicsActor m_taintparent = null;
114 114
115 private bool iscolliding = false; 115 private bool iscolliding = false;
116 private bool m_isphysical = false; 116 private bool m_isphysical = false;
117 private bool m_isSelected = false; 117 private bool m_isSelected = false;
@@ -202,7 +202,7 @@ namespace OpenSim.Region.Physics.OdePlugin
202 m_taintadd = true; 202 m_taintadd = true;
203 _parent_scene.AddPhysicsActorTaint(this); 203 _parent_scene.AddPhysicsActorTaint(this);
204 // don't do .add() here; old geoms get recycled with the same hash 204 // don't do .add() here; old geoms get recycled with the same hash
205 205
206 } 206 }
207 207
208 public override int PhysicsActorType 208 public override int PhysicsActorType
@@ -232,9 +232,9 @@ namespace OpenSim.Region.Physics.OdePlugin
232 public override bool Selected 232 public override bool Selected
233 { 233 {
234 set { 234 set {
235 // This only makes the object not collidable if the object 235 // This only makes the object not collidable if the object
236 // is physical or the object is modified somehow *IN THE FUTURE* 236 // is physical or the object is modified somehow *IN THE FUTURE*
237 // without this, if an avatar selects prim, they can walk right 237 // without this, if an avatar selects prim, they can walk right
238 // through it while it's selected 238 // through it while it's selected
239 239
240 if ((m_isphysical && !_zeroFlag) || !value) 240 if ((m_isphysical && !_zeroFlag) || !value)
@@ -262,7 +262,7 @@ namespace OpenSim.Region.Physics.OdePlugin
262 d.GeomSetCollideBits(prim_geom, (int)m_collisionFlags); 262 d.GeomSetCollideBits(prim_geom, (int)m_collisionFlags);
263 } 263 }
264 //m_log.Warn("Setting Geom to: " + prim_geom); 264 //m_log.Warn("Setting Geom to: " + prim_geom);
265 265
266 } 266 }
267 267
268 public void enableBodySoft() 268 public void enableBodySoft()
@@ -277,7 +277,7 @@ namespace OpenSim.Region.Physics.OdePlugin
277 public void disableBodySoft() 277 public void disableBodySoft()
278 { 278 {
279 m_disabled = true; 279 m_disabled = true;
280 280
281 if (m_isphysical) 281 if (m_isphysical)
282 if (Body != (IntPtr)0) 282 if (Body != (IntPtr)0)
283 d.BodyDisable(Body); 283 d.BodyDisable(Body);
@@ -307,7 +307,7 @@ namespace OpenSim.Region.Physics.OdePlugin
307 307
308 d.BodySetAutoDisableFlag(Body, true); 308 d.BodySetAutoDisableFlag(Body, true);
309 d.BodySetAutoDisableSteps(Body, 20); 309 d.BodySetAutoDisableSteps(Body, 20);
310 310
311 m_interpenetrationcount = 0; 311 m_interpenetrationcount = 0;
312 m_collisionscore = 0; 312 m_collisionscore = 0;
313 m_disabled = false; 313 m_disabled = false;
@@ -327,7 +327,7 @@ namespace OpenSim.Region.Physics.OdePlugin
327 { 327 {
328 float volume = 0; 328 float volume = 0;
329 329
330 // No material is passed to the physics engines yet.. soo.. 330 // No material is passed to the physics engines yet.. soo..
331 // we're using the m_density constant in the class definition 331 // we're using the m_density constant in the class definition
332 332
333 333
@@ -340,7 +340,7 @@ namespace OpenSim.Region.Physics.OdePlugin
340 340
341 volume = _size.X*_size.Y*_size.Z; 341 volume = _size.X*_size.Y*_size.Z;
342 342
343 // If the user has 'hollowed out' 343 // If the user has 'hollowed out'
344 // ProfileHollow is one of those 0 to 50000 values :P 344 // ProfileHollow is one of those 0 to 50000 values :P
345 // we like percentages better.. so turning into a percentage 345 // we like percentages better.. so turning into a percentage
346 346
@@ -415,7 +415,7 @@ namespace OpenSim.Region.Physics.OdePlugin
415 // We don't know what the shape is yet, so use default 415 // We don't know what the shape is yet, so use default
416 volume = _size.X * _size.Y * _size.Z; 416 volume = _size.X * _size.Y * _size.Z;
417 } 417 }
418 // If the user has 'hollowed out' 418 // If the user has 'hollowed out'
419 // ProfileHollow is one of those 0 to 50000 values :P 419 // ProfileHollow is one of those 0 to 50000 values :P
420 // we like percentages better.. so turning into a percentage 420 // we like percentages better.. so turning into a percentage
421 421
@@ -427,8 +427,8 @@ namespace OpenSim.Region.Physics.OdePlugin
427 float hollowVolume = 0; 427 float hollowVolume = 0;
428 switch (_pbs.HollowShape) 428 switch (_pbs.HollowShape)
429 { 429 {
430 430
431 case HollowShape.Same: 431 case HollowShape.Same:
432 case HollowShape.Circle: 432 case HollowShape.Circle:
433 // Hollow shape is a perfect cyllinder in respect to the cube's scale 433 // Hollow shape is a perfect cyllinder in respect to the cube's scale
434 // Cyllinder hollow volume calculation 434 // Cyllinder hollow volume calculation
@@ -447,7 +447,7 @@ namespace OpenSim.Region.Physics.OdePlugin
447 hollowVolume = hollowsizex * hollowsizey * hollowsizez; 447 hollowVolume = hollowsizex * hollowsizey * hollowsizez;
448 break; 448 break;
449 449
450 450
451 451
452 case HollowShape.Triangle: 452 case HollowShape.Triangle:
453 // Equilateral Triangular Prism volume hollow calculation 453 // Equilateral Triangular Prism volume hollow calculation
@@ -465,7 +465,7 @@ namespace OpenSim.Region.Physics.OdePlugin
465 volume = volume - hollowVolume; 465 volume = volume - hollowVolume;
466 } 466 }
467 break; 467 break;
468 468
469 case ProfileShape.HalfCircle: 469 case ProfileShape.HalfCircle:
470 if (_pbs.PathCurve == (byte)Extrusion.Curve1) 470 if (_pbs.PathCurve == (byte)Extrusion.Curve1)
471 { 471 {
@@ -490,13 +490,13 @@ namespace OpenSim.Region.Physics.OdePlugin
490 } 490 }
491 break; 491 break;
492 case ProfileShape.EquilateralTriangle: 492 case ProfileShape.EquilateralTriangle:
493 /* 493 /*
494 v = (abs((xB*yA-xA*yB)+(xC*yB-xB*yC)+(xA*yC-xC*yA))/2) * h 494 v = (abs((xB*yA-xA*yB)+(xC*yB-xB*yC)+(xA*yC-xC*yA))/2) * h
495 495
496 // seed mesh 496 // seed mesh
497 Vertex MM = new Vertex(-0.25f, -0.45f, 0.0f); 497 Vertex MM = new Vertex(-0.25f, -0.45f, 0.0f);
498 Vertex PM = new Vertex(+0.5f, 0f, 0.0f); 498 Vertex PM = new Vertex(+0.5f, 0f, 0.0f);
499 Vertex PP = new Vertex(-0.25f, +0.45f, 0.0f); 499 Vertex PP = new Vertex(-0.25f, +0.45f, 0.0f);
500 */ 500 */
501 float xA = -0.25f * _size.X; 501 float xA = -0.25f * _size.X;
502 float yA = -0.45f * _size.Y; 502 float yA = -0.45f * _size.Y;
@@ -509,7 +509,7 @@ namespace OpenSim.Region.Physics.OdePlugin
509 509
510 volume = (float)((Math.Abs((xB * yA - xA * yB) + (xC * yB - xB * yC) + (xA * yC - xC * yA)) / 2) * _size.Z); 510 volume = (float)((Math.Abs((xB * yA - xA * yB) + (xC * yB - xB * yC) + (xA * yC - xC * yA)) / 2) * _size.Z);
511 511
512 // If the user has 'hollowed out' 512 // If the user has 'hollowed out'
513 // ProfileHollow is one of those 0 to 50000 values :P 513 // ProfileHollow is one of those 0 to 50000 values :P
514 // we like percentages better.. so turning into a percentage 514 // we like percentages better.. so turning into a percentage
515 float fhollowFactor = ((float)_pbs.ProfileHollow / 1.9f); 515 float fhollowFactor = ((float)_pbs.ProfileHollow / 1.9f);
@@ -521,7 +521,7 @@ namespace OpenSim.Region.Physics.OdePlugin
521 float hollowVolume = 0; 521 float hollowVolume = 0;
522 switch (_pbs.HollowShape) 522 switch (_pbs.HollowShape)
523 { 523 {
524 524
525 case HollowShape.Same: 525 case HollowShape.Same:
526 case HollowShape.Triangle: 526 case HollowShape.Triangle:
527 // Equilateral Triangular Prism volume hollow calculation 527 // Equilateral Triangular Prism volume hollow calculation
@@ -550,7 +550,7 @@ namespace OpenSim.Region.Physics.OdePlugin
550 hollowVolume = ((float)((Math.PI * Math.Pow(hRadius, 2) * hLength)/2) * hollowAmount); 550 hollowVolume = ((float)((Math.PI * Math.Pow(hRadius, 2) * hLength)/2) * hollowAmount);
551 break; 551 break;
552 552
553 553
554 default: 554 default:
555 hollowVolume = 0; 555 hollowVolume = 0;
556 break; 556 break;
@@ -560,7 +560,7 @@ namespace OpenSim.Region.Physics.OdePlugin
560 break; 560 break;
561 561
562 default: 562 default:
563 // we don't have all of the volume formulas yet so 563 // we don't have all of the volume formulas yet so
564 // use the common volume formula for all 564 // use the common volume formula for all
565 volume = _size.X*_size.Y*_size.Z; 565 volume = _size.X*_size.Y*_size.Z;
566 break; 566 break;
@@ -568,7 +568,7 @@ namespace OpenSim.Region.Physics.OdePlugin
568 568
569 // Calculate Path cut effect on volume 569 // Calculate Path cut effect on volume
570 // Not exact, in the triangle hollow example 570 // Not exact, in the triangle hollow example
571 // They should never be zero or less then zero.. 571 // They should never be zero or less then zero..
572 // we'll ignore it if it's less then zero 572 // we'll ignore it if it's less then zero
573 573
574 // ProfileEnd and ProfileBegin are values 574 // ProfileEnd and ProfileBegin are values
@@ -672,11 +672,11 @@ namespace OpenSim.Region.Physics.OdePlugin
672 672
673 public void setMesh(OdeScene parent_scene, IMesh mesh) 673 public void setMesh(OdeScene parent_scene, IMesh mesh)
674 { 674 {
675 // This sleeper is there to moderate how long it takes between 675 // This sleeper is there to moderate how long it takes between
676 // setting up the mesh and pre-processing it when we get rapid fire mesh requests on a single object 676 // setting up the mesh and pre-processing it when we get rapid fire mesh requests on a single object
677 677
678 Thread.Sleep(10); 678 Thread.Sleep(10);
679 679
680 //Kill Body so that mesh can re-make the geom 680 //Kill Body so that mesh can re-make the geom
681 if (IsPhysical && Body != (IntPtr) 0) 681 if (IsPhysical && Body != (IntPtr) 0)
682 { 682 {
@@ -694,9 +694,9 @@ namespace OpenSim.Region.Physics.OdePlugin
694 3*sizeof (int)); 694 3*sizeof (int));
695 d.GeomTriMeshDataPreprocess(_triMeshData); 695 d.GeomTriMeshDataPreprocess(_triMeshData);
696 696
697 697
698 _parent_scene.waitForSpaceUnlock(m_targetSpace); 698 _parent_scene.waitForSpaceUnlock(m_targetSpace);
699 699
700 try 700 try
701 { 701 {
702 if (prim_geom == (IntPtr)0) 702 if (prim_geom == (IntPtr)0)
@@ -706,7 +706,7 @@ namespace OpenSim.Region.Physics.OdePlugin
706 } 706 }
707 catch (AccessViolationException) 707 catch (AccessViolationException)
708 { 708 {
709 709
710 m_log.Error("[PHYSICS]: MESH LOCKED"); 710 m_log.Error("[PHYSICS]: MESH LOCKED");
711 return; 711 return;
712 } 712 }
@@ -715,7 +715,7 @@ namespace OpenSim.Region.Physics.OdePlugin
715 // Recreate the body 715 // Recreate the body
716 m_interpenetrationcount = 0; 716 m_interpenetrationcount = 0;
717 m_collisionscore = 0; 717 m_collisionscore = 0;
718 718
719 enableBody(); 719 enableBody();
720 720
721 } 721 }
@@ -724,7 +724,7 @@ namespace OpenSim.Region.Physics.OdePlugin
724 public void ProcessTaints(float timestep) 724 public void ProcessTaints(float timestep)
725 { 725 {
726 726
727 727
728 if (m_taintadd) 728 if (m_taintadd)
729 { 729 {
730 changeadd(timestep); 730 changeadd(timestep);
@@ -779,7 +779,7 @@ namespace OpenSim.Region.Physics.OdePlugin
779 } 779 }
780 780
781 private void changeAngularLock(float timestep) 781 private void changeAngularLock(float timestep)
782 { 782 {
783 // do we have a Physical object? 783 // do we have a Physical object?
784 if (Body != IntPtr.Zero) 784 if (Body != IntPtr.Zero)
785 { 785 {
@@ -809,7 +809,7 @@ namespace OpenSim.Region.Physics.OdePlugin
809 809
810 private void changelink(float timestep) 810 private void changelink(float timestep)
811 { 811 {
812 812
813 if (_parent == null && m_taintparent != null) 813 if (_parent == null && m_taintparent != null)
814 { 814 {
815 if (m_taintparent.PhysicsActorType == (int)ActorTypes.Prim) 815 if (m_taintparent.PhysicsActorType == (int)ActorTypes.Prim)
@@ -834,14 +834,14 @@ namespace OpenSim.Region.Physics.OdePlugin
834 m_linkJoint = (IntPtr)0; 834 m_linkJoint = (IntPtr)0;
835 835
836 } 836 }
837 837
838 838
839 _parent = m_taintparent; 839 _parent = m_taintparent;
840 } 840 }
841 841
842 private void changeSelectedStatus(float timestep) 842 private void changeSelectedStatus(float timestep)
843 { 843 {
844 844
845 if (m_taintselected) 845 if (m_taintselected)
846 { 846 {
847 847
@@ -849,9 +849,9 @@ namespace OpenSim.Region.Physics.OdePlugin
849 m_collisionCategories = CollisionCategories.Selected; 849 m_collisionCategories = CollisionCategories.Selected;
850 m_collisionFlags = (CollisionCategories.Sensor | CollisionCategories.Space); 850 m_collisionFlags = (CollisionCategories.Sensor | CollisionCategories.Space);
851 851
852 // We do the body disable soft twice because 'in theory' a collision could have happened 852 // We do the body disable soft twice because 'in theory' a collision could have happened
853 // in between the disabling and the collision properties setting 853 // in between the disabling and the collision properties setting
854 // which would wake the physical body up from a soft disabling and potentially cause it to fall 854 // which would wake the physical body up from a soft disabling and potentially cause it to fall
855 // through the ground. 855 // through the ground.
856 856
857 if (m_isphysical) 857 if (m_isphysical)
@@ -873,9 +873,9 @@ namespace OpenSim.Region.Physics.OdePlugin
873 } 873 }
874 else 874 else
875 { 875 {
876 876
877 m_collisionCategories = CollisionCategories.Geom; 877 m_collisionCategories = CollisionCategories.Geom;
878 878
879 if (m_isphysical) 879 if (m_isphysical)
880 m_collisionCategories |= CollisionCategories.Body; 880 m_collisionCategories |= CollisionCategories.Body;
881 881
@@ -898,10 +898,10 @@ namespace OpenSim.Region.Physics.OdePlugin
898 enableBodySoft(); 898 enableBodySoft();
899 } 899 }
900 900
901 901
902 } 902 }
903 903
904 904
905 resetCollisionAccounting(); 905 resetCollisionAccounting();
906 m_isSelected = m_taintselected; 906 m_isSelected = m_taintselected;
907 } 907 }
@@ -918,21 +918,21 @@ namespace OpenSim.Region.Physics.OdePlugin
918 m_taintselected = m_isSelected; 918 m_taintselected = m_isSelected;
919 919
920 m_taintsize = _size; 920 m_taintsize = _size;
921 921
922 922
923 m_taintshape = false; 923 m_taintshape = false;
924 924
925 m_taintforce = false; 925 m_taintforce = false;
926 926
927 m_taintdisable = false; 927 m_taintdisable = false;
928 928
929 m_taintVelocity = PhysicsVector.Zero; 929 m_taintVelocity = PhysicsVector.Zero;
930 } 930 }
931 public void changeadd(float timestep) 931 public void changeadd(float timestep)
932 { 932 {
933 933
934 934
935 935
936 int[] iprimspaceArrItem = _parent_scene.calculateSpaceArrayItemFromPos(_position); 936 int[] iprimspaceArrItem = _parent_scene.calculateSpaceArrayItemFromPos(_position);
937 IntPtr targetspace = _parent_scene.calculateSpaceForGeom(_position); 937 IntPtr targetspace = _parent_scene.calculateSpaceForGeom(_position);
938 938
@@ -941,7 +941,7 @@ namespace OpenSim.Region.Physics.OdePlugin
941 941
942 m_targetSpace = targetspace; 942 m_targetSpace = targetspace;
943 943
944 944
945 945
946 if (_mesh != null) 946 if (_mesh != null)
947 { 947 {
@@ -1010,7 +1010,7 @@ namespace OpenSim.Region.Physics.OdePlugin
1010 { 1010 {
1011 m_log.Warn("[PHYSICS]: Unable to create physics proxy for object"); 1011 m_log.Warn("[PHYSICS]: Unable to create physics proxy for object");
1012 ode.dunlock(_parent_scene.world); 1012 ode.dunlock(_parent_scene.world);
1013 return; 1013 return;
1014 } 1014 }
1015 } 1015 }
1016 } 1016 }
@@ -1060,7 +1060,7 @@ namespace OpenSim.Region.Physics.OdePlugin
1060 1060
1061 1061
1062 } 1062 }
1063 1063
1064 _parent_scene.geom_name_map[prim_geom] = this.m_primName; 1064 _parent_scene.geom_name_map[prim_geom] = this.m_primName;
1065 _parent_scene.actor_name_map[prim_geom] = (PhysicsActor)this; 1065 _parent_scene.actor_name_map[prim_geom] = (PhysicsActor)this;
1066 1066
@@ -1072,7 +1072,7 @@ namespace OpenSim.Region.Physics.OdePlugin
1072 } 1072 }
1073 public void changemove(float timestep) 1073 public void changemove(float timestep)
1074 { 1074 {
1075 1075
1076 1076
1077 1077
1078 if (m_isphysical) 1078 if (m_isphysical)
@@ -1080,7 +1080,7 @@ namespace OpenSim.Region.Physics.OdePlugin
1080 // This is a fallback.. May no longer be necessary. 1080 // This is a fallback.. May no longer be necessary.
1081 if (Body == (IntPtr) 0) 1081 if (Body == (IntPtr) 0)
1082 enableBody(); 1082 enableBody();
1083 //Prim auto disable after 20 frames, 1083 //Prim auto disable after 20 frames,
1084 //if you move it, re-enable the prim manually. 1084 //if you move it, re-enable the prim manually.
1085 if (_parent != null) 1085 if (_parent != null)
1086 { 1086 {
@@ -1102,7 +1102,7 @@ namespace OpenSim.Region.Physics.OdePlugin
1102 } 1102 }
1103 } 1103 }
1104 d.BodyEnable(Body); 1104 d.BodyEnable(Body);
1105 1105
1106 } 1106 }
1107 else 1107 else
1108 { 1108 {
@@ -1122,10 +1122,10 @@ namespace OpenSim.Region.Physics.OdePlugin
1122 d.SpaceAdd(m_targetSpace, prim_geom); 1122 d.SpaceAdd(m_targetSpace, prim_geom);
1123 } 1123 }
1124 } 1124 }
1125 1125
1126 1126
1127 changeSelectedStatus(timestep); 1127 changeSelectedStatus(timestep);
1128 1128
1129 resetCollisionAccounting(); 1129 resetCollisionAccounting();
1130 m_taintposition = _position; 1130 m_taintposition = _position;
1131 } 1131 }
@@ -1140,42 +1140,42 @@ namespace OpenSim.Region.Physics.OdePlugin
1140 { 1140 {
1141 float PID_D = 2200.0f; 1141 float PID_D = 2200.0f;
1142 //float PID_P = 900.0f; 1142 //float PID_P = 900.0f;
1143 1143
1144 1144
1145 float m_mass = CalculateMass(); 1145 float m_mass = CalculateMass();
1146 1146
1147 fz = 0f; 1147 fz = 0f;
1148 //m_log.Info(m_collisionFlags.ToString()); 1148 //m_log.Info(m_collisionFlags.ToString());
1149 1149
1150 1150
1151 1151
1152 1152
1153 if (m_buoyancy != 0) 1153 if (m_buoyancy != 0)
1154 { 1154 {
1155 1155
1156 if (m_buoyancy > 0) 1156 if (m_buoyancy > 0)
1157 { 1157 {
1158 fz = (((-1 * _parent_scene.gravityz) * m_buoyancy) * m_mass); 1158 fz = (((-1 * _parent_scene.gravityz) * m_buoyancy) * m_mass);
1159 1159
1160 //d.Vector3 l_velocity = d.BodyGetLinearVel(Body); 1160 //d.Vector3 l_velocity = d.BodyGetLinearVel(Body);
1161 //m_log.Info("Using Buoyancy: " + buoyancy + " G: " + (_parent_scene.gravityz * m_buoyancy) + "mass:" + m_mass + " Pos: " + Position.ToString()); 1161 //m_log.Info("Using Buoyancy: " + buoyancy + " G: " + (_parent_scene.gravityz * m_buoyancy) + "mass:" + m_mass + " Pos: " + Position.ToString());
1162 } 1162 }
1163 else 1163 else
1164 { 1164 {
1165 fz = (-1 * (((-1 * _parent_scene.gravityz) * (-1 * m_buoyancy)) * m_mass)); 1165 fz = (-1 * (((-1 * _parent_scene.gravityz) * (-1 * m_buoyancy)) * m_mass));
1166 } 1166 }
1167 1167
1168 1168
1169 } 1169 }
1170 1170
1171 if (m_usePID) 1171 if (m_usePID)
1172 { 1172 {
1173 // If we're using the PID controller, then we have no gravity 1173 // If we're using the PID controller, then we have no gravity
1174 fz = (-1 * _parent_scene.gravityz) * this.Mass; 1174 fz = (-1 * _parent_scene.gravityz) * this.Mass;
1175 1175
1176 // no lock; for now it's only called from within Simulate() 1176 // no lock; for now it's only called from within Simulate()
1177 1177
1178 // If the PID Controller isn't active then we set our force 1178 // If the PID Controller isn't active then we set our force
1179 // calculating base velocity to the current position 1179 // calculating base velocity to the current position
1180 if (Environment.OSVersion.Platform == PlatformID.Unix) 1180 if (Environment.OSVersion.Platform == PlatformID.Unix)
1181 { 1181 {
@@ -1189,7 +1189,7 @@ namespace OpenSim.Region.Physics.OdePlugin
1189 } 1189 }
1190 PID_D = 35f; 1190 PID_D = 35f;
1191 1191
1192 1192
1193 //PID_P = 1.0f; 1193 //PID_P = 1.0f;
1194 float PID_G = 25; 1194 float PID_G = 25;
1195 1195
@@ -1197,7 +1197,7 @@ namespace OpenSim.Region.Physics.OdePlugin
1197 { 1197 {
1198 PID_G = PID_G / m_PIDTau; 1198 PID_G = PID_G / m_PIDTau;
1199 } 1199 }
1200 1200
1201 1201
1202 if ((PID_G - m_PIDTau) <= 0) 1202 if ((PID_G - m_PIDTau) <= 0)
1203 { 1203 {
@@ -1205,15 +1205,15 @@ namespace OpenSim.Region.Physics.OdePlugin
1205 } 1205 }
1206 //PidStatus = true; 1206 //PidStatus = true;
1207 1207
1208 1208
1209 1209
1210 1210
1211 PhysicsVector vec = new PhysicsVector(); 1211 PhysicsVector vec = new PhysicsVector();
1212 d.Vector3 vel = d.BodyGetLinearVel(Body); 1212 d.Vector3 vel = d.BodyGetLinearVel(Body);
1213 1213
1214 1214
1215 d.Vector3 pos = d.BodyGetPosition(Body); 1215 d.Vector3 pos = d.BodyGetPosition(Body);
1216 _target_velocity = 1216 _target_velocity =
1217 new PhysicsVector( 1217 new PhysicsVector(
1218 (m_PIDTarget.X - pos.X) * ((PID_G - m_PIDTau) * timestep), 1218 (m_PIDTarget.X - pos.X) * ((PID_G - m_PIDTau) * timestep),
1219 (m_PIDTarget.Y - pos.Y) * ((PID_G - m_PIDTau) * timestep), 1219 (m_PIDTarget.Y - pos.Y) * ((PID_G - m_PIDTau) * timestep),
@@ -1222,18 +1222,18 @@ namespace OpenSim.Region.Physics.OdePlugin
1222 1222
1223 1223
1224 // if velocity is zero, use position control; otherwise, velocity control 1224 // if velocity is zero, use position control; otherwise, velocity control
1225 1225
1226 if (_target_velocity.IsIdentical(PhysicsVector.Zero,0.1f)) 1226 if (_target_velocity.IsIdentical(PhysicsVector.Zero,0.1f))
1227 { 1227 {
1228 // keep track of where we stopped. No more slippin' & slidin' 1228 // keep track of where we stopped. No more slippin' & slidin'
1229 1229
1230 1230
1231 // We only want to deactivate the PID Controller if we think we want to have our surrogate 1231 // We only want to deactivate the PID Controller if we think we want to have our surrogate
1232 // react to the physics scene by moving it's position. 1232 // react to the physics scene by moving it's position.
1233 // Avatar to Avatar collisions 1233 // Avatar to Avatar collisions
1234 // Prim to avatar collisions 1234 // Prim to avatar collisions
1235 1235
1236 1236
1237 //fx = (_target_velocity.X - vel.X) * (PID_D) + (_zeroPosition.X - pos.X) * (PID_P * 2); 1237 //fx = (_target_velocity.X - vel.X) * (PID_D) + (_zeroPosition.X - pos.X) * (PID_P * 2);
1238 //fy = (_target_velocity.Y - vel.Y) * (PID_D) + (_zeroPosition.Y - pos.Y) * (PID_P * 2); 1238 //fy = (_target_velocity.Y - vel.Y) * (PID_D) + (_zeroPosition.Y - pos.Y) * (PID_P * 2);
1239 //fz = fz + (_target_velocity.Z - vel.Z) * (PID_D) + (_zeroPosition.Z - pos.Z) * PID_P; 1239 //fz = fz + (_target_velocity.Z - vel.Z) * (PID_D) + (_zeroPosition.Z - pos.Z) * PID_P;
@@ -1245,27 +1245,27 @@ namespace OpenSim.Region.Physics.OdePlugin
1245 } 1245 }
1246 else 1246 else
1247 { 1247 {
1248 1248
1249 _zeroFlag = false; 1249 _zeroFlag = false;
1250 1250
1251 // We're flying and colliding with something 1251 // We're flying and colliding with something
1252 fx = ((_target_velocity.X) - vel.X) * (PID_D); 1252 fx = ((_target_velocity.X) - vel.X) * (PID_D);
1253 fy = ((_target_velocity.Y) - vel.Y) * (PID_D); 1253 fy = ((_target_velocity.Y) - vel.Y) * (PID_D);
1254
1255 1254
1256 1255
1257 1256
1257
1258 // vec.Z = (_target_velocity.Z - vel.Z) * PID_D + (_zeroPosition.Z - pos.Z) * PID_P; 1258 // vec.Z = (_target_velocity.Z - vel.Z) * PID_D + (_zeroPosition.Z - pos.Z) * PID_P;
1259 1259
1260 fz = fz + ((_target_velocity.Z - vel.Z) * (PID_D) * m_mass); 1260 fz = fz + ((_target_velocity.Z - vel.Z) * (PID_D) * m_mass);
1261 } 1261 }
1262 1262
1263 } 1263 }
1264 1264
1265 fx *= m_mass; 1265 fx *= m_mass;
1266 fy *= m_mass; 1266 fy *= m_mass;
1267 //fz *= m_mass; 1267 //fz *= m_mass;
1268 1268
1269 //m_log.Info("[OBJPID]: X:" + fx.ToString() + " Y:" + fy.ToString() + " Z:" + fz.ToString()); 1269 //m_log.Info("[OBJPID]: X:" + fx.ToString() + " Y:" + fy.ToString() + " Z:" + fz.ToString());
1270 if (fx != 0 || fy != 0 || fz != 0) 1270 if (fx != 0 || fy != 0 || fz != 0)
1271 { 1271 {
@@ -1285,7 +1285,7 @@ namespace OpenSim.Region.Physics.OdePlugin
1285 1285
1286 public void rotate(float timestep) 1286 public void rotate(float timestep)
1287 { 1287 {
1288 1288
1289 1289
1290 d.Quaternion myrot = new d.Quaternion(); 1290 d.Quaternion myrot = new d.Quaternion();
1291 myrot.W = _orientation.w; 1291 myrot.W = _orientation.w;
@@ -1299,7 +1299,7 @@ namespace OpenSim.Region.Physics.OdePlugin
1299 if (!m_angularlock.IsIdentical(new PhysicsVector(1, 1, 1), 0)) 1299 if (!m_angularlock.IsIdentical(new PhysicsVector(1, 1, 1), 0))
1300 createAMotor(m_angularlock); 1300 createAMotor(m_angularlock);
1301 } 1301 }
1302 1302
1303 resetCollisionAccounting(); 1303 resetCollisionAccounting();
1304 m_taintrot = _orientation; 1304 m_taintrot = _orientation;
1305 } 1305 }
@@ -1313,21 +1313,21 @@ namespace OpenSim.Region.Physics.OdePlugin
1313 1313
1314 public void changedisable(float timestep) 1314 public void changedisable(float timestep)
1315 { 1315 {
1316 1316
1317 m_disabled = true; 1317 m_disabled = true;
1318 if (Body != (IntPtr)0) 1318 if (Body != (IntPtr)0)
1319 { 1319 {
1320 d.BodyDisable(Body); 1320 d.BodyDisable(Body);
1321 Body = (IntPtr)0; 1321 Body = (IntPtr)0;
1322 } 1322 }
1323 1323
1324 1324
1325 m_taintdisable = false; 1325 m_taintdisable = false;
1326 } 1326 }
1327 1327
1328 public void changePhysicsStatus(float timestep) 1328 public void changePhysicsStatus(float timestep)
1329 { 1329 {
1330 1330
1331 1331
1332 if (m_isphysical == true) 1332 if (m_isphysical == true)
1333 { 1333 {
@@ -1352,7 +1352,7 @@ namespace OpenSim.Region.Physics.OdePlugin
1352 1352
1353 public void changesize(float timestamp) 1353 public void changesize(float timestamp)
1354 { 1354 {
1355 1355
1356 //if (!_parent_scene.geom_name_map.ContainsKey(prim_geom)) 1356 //if (!_parent_scene.geom_name_map.ContainsKey(prim_geom))
1357 //{ 1357 //{
1358 // m_taintsize = _size; 1358 // m_taintsize = _size;
@@ -1369,7 +1369,7 @@ namespace OpenSim.Region.Physics.OdePlugin
1369 { 1369 {
1370 // Cleanup meshing here 1370 // Cleanup meshing here
1371 } 1371 }
1372 //kill body to rebuild 1372 //kill body to rebuild
1373 if (IsPhysical && Body != (IntPtr) 0) 1373 if (IsPhysical && Body != (IntPtr) 0)
1374 { 1374 {
1375 disableBody(); 1375 disableBody();
@@ -1531,7 +1531,7 @@ namespace OpenSim.Region.Physics.OdePlugin
1531 { 1531 {
1532 m_collisionFlags |= CollisionCategories.Water; 1532 m_collisionFlags |= CollisionCategories.Water;
1533 } 1533 }
1534 else 1534 else
1535 { 1535 {
1536 m_collisionFlags &= ~CollisionCategories.Water; 1536 m_collisionFlags &= ~CollisionCategories.Water;
1537 } 1537 }
@@ -1541,7 +1541,7 @@ namespace OpenSim.Region.Physics.OdePlugin
1541 1541
1542 public void changeshape(float timestamp) 1542 public void changeshape(float timestamp)
1543 { 1543 {
1544 1544
1545 string oldname = _parent_scene.geom_name_map[prim_geom]; 1545 string oldname = _parent_scene.geom_name_map[prim_geom];
1546 1546
1547 // Cleanup of old prim geometry and Bodies 1547 // Cleanup of old prim geometry and Bodies
@@ -1579,7 +1579,7 @@ namespace OpenSim.Region.Physics.OdePlugin
1579 // Re creates body on size. 1579 // Re creates body on size.
1580 // EnableBody also does setMass() 1580 // EnableBody also does setMass()
1581 enableBody(); 1581 enableBody();
1582 1582
1583 } 1583 }
1584 } 1584 }
1585 else 1585 else
@@ -1684,7 +1684,7 @@ namespace OpenSim.Region.Physics.OdePlugin
1684 d.BodyEnable(Body); 1684 d.BodyEnable(Body);
1685 } 1685 }
1686 } 1686 }
1687 1687
1688 1688
1689 _parent_scene.geom_name_map[prim_geom] = oldname; 1689 _parent_scene.geom_name_map[prim_geom] = oldname;
1690 1690
@@ -1698,7 +1698,7 @@ namespace OpenSim.Region.Physics.OdePlugin
1698 { 1698 {
1699 if (!m_isSelected) 1699 if (!m_isSelected)
1700 { 1700 {
1701 1701
1702 1702
1703 1703
1704 lock (m_forcelist) 1704 lock (m_forcelist)
@@ -1728,7 +1728,7 @@ namespace OpenSim.Region.Physics.OdePlugin
1728 { 1728 {
1729 if (!m_isSelected) 1729 if (!m_isSelected)
1730 { 1730 {
1731 1731
1732 1732
1733 Thread.Sleep(20); 1733 Thread.Sleep(20);
1734 if (IsPhysical) 1734 if (IsPhysical)
@@ -1737,8 +1737,8 @@ namespace OpenSim.Region.Physics.OdePlugin
1737 { 1737 {
1738 d.BodySetLinearVel(Body, m_taintVelocity.X, m_taintVelocity.Y, m_taintVelocity.Z); 1738 d.BodySetLinearVel(Body, m_taintVelocity.X, m_taintVelocity.Y, m_taintVelocity.Z);
1739 } 1739 }
1740 } 1740 }
1741 1741
1742 //resetCollisionAccounting(); 1742 //resetCollisionAccounting();
1743 } 1743 }
1744 m_taintVelocity = PhysicsVector.Zero; 1744 m_taintVelocity = PhysicsVector.Zero;
@@ -1794,7 +1794,7 @@ namespace OpenSim.Region.Physics.OdePlugin
1794 { 1794 {
1795 get { return _position; } 1795 get { return _position; }
1796 1796
1797 set { _position = value; 1797 set { _position = value;
1798 //m_log.Info("[PHYSICS]: " + _position.ToString()); 1798 //m_log.Info("[PHYSICS]: " + _position.ToString());
1799 } 1799 }
1800 } 1800 }
@@ -1838,7 +1838,7 @@ namespace OpenSim.Region.Physics.OdePlugin
1838 { 1838 {
1839 get 1839 get
1840 { 1840 {
1841 // Averate previous velocity with the new one so 1841 // Averate previous velocity with the new one so
1842 // client object interpolation works a 'little' better 1842 // client object interpolation works a 'little' better
1843 PhysicsVector returnVelocity = new PhysicsVector(); 1843 PhysicsVector returnVelocity = new PhysicsVector();
1844 returnVelocity.X = (m_lastVelocity.X + _velocity.X)/2; 1844 returnVelocity.X = (m_lastVelocity.X + _velocity.X)/2;
@@ -1849,7 +1849,7 @@ namespace OpenSim.Region.Physics.OdePlugin
1849 set 1849 set
1850 { 1850 {
1851 _velocity = value; 1851 _velocity = value;
1852 1852
1853 m_taintVelocity = value; 1853 m_taintVelocity = value;
1854 _parent_scene.AddPhysicsActorTaint(this); 1854 _parent_scene.AddPhysicsActorTaint(this);
1855 } 1855 }
@@ -1898,11 +1898,11 @@ namespace OpenSim.Region.Physics.OdePlugin
1898 if (_zeroFlag) 1898 if (_zeroFlag)
1899 return pv; 1899 return pv;
1900 m_lastUpdateSent = false; 1900 m_lastUpdateSent = false;
1901 1901
1902 if (m_rotationalVelocity.IsIdentical(pv, 0.2f)) 1902 if (m_rotationalVelocity.IsIdentical(pv, 0.2f))
1903 return pv; 1903 return pv;
1904 1904
1905 return m_rotationalVelocity; 1905 return m_rotationalVelocity;
1906 } 1906 }
1907 set { m_rotationalVelocity = value; } 1907 set { m_rotationalVelocity = value; }
1908 } 1908 }
@@ -1948,7 +1948,7 @@ namespace OpenSim.Region.Physics.OdePlugin
1948 } 1948 }
1949 1949
1950 public void UpdatePositionAndVelocity() 1950 public void UpdatePositionAndVelocity()
1951 { 1951 {
1952 // no lock; called from Simulate() -- if you call this from elsewhere, gotta lock or do Monitor.Enter/Exit! 1952 // no lock; called from Simulate() -- if you call this from elsewhere, gotta lock or do Monitor.Enter/Exit!
1953 if (_parent != null) 1953 if (_parent != null)
1954 { 1954 {
@@ -1963,7 +1963,7 @@ namespace OpenSim.Region.Physics.OdePlugin
1963 d.Quaternion ori = d.BodyGetQuaternion(Body); 1963 d.Quaternion ori = d.BodyGetQuaternion(Body);
1964 d.Vector3 vel = d.BodyGetLinearVel(Body); 1964 d.Vector3 vel = d.BodyGetLinearVel(Body);
1965 d.Vector3 rotvel = d.BodyGetAngularVel(Body); 1965 d.Vector3 rotvel = d.BodyGetAngularVel(Body);
1966 1966
1967 PhysicsVector l_position = new PhysicsVector(); 1967 PhysicsVector l_position = new PhysicsVector();
1968 1968
1969 // kluge to keep things in bounds. ODE lets dead avatars drift away (they should be removed!) 1969 // kluge to keep things in bounds. ODE lets dead avatars drift away (they should be removed!)
@@ -2000,16 +2000,16 @@ namespace OpenSim.Region.Physics.OdePlugin
2000 2000
2001 if (l_position.Z < 0) 2001 if (l_position.Z < 0)
2002 { 2002 {
2003 // This is so prim that get lost underground don't fall forever and suck up 2003 // This is so prim that get lost underground don't fall forever and suck up
2004 // 2004 //
2005 // Sim resources and memory. 2005 // Sim resources and memory.
2006 // Disables the prim's movement physics.... 2006 // Disables the prim's movement physics....
2007 // It's a hack and will generate a console message if it fails. 2007 // It's a hack and will generate a console message if it fails.
2008 2008
2009 //IsPhysical = false; 2009 //IsPhysical = false;
2010 if (_parent == null) 2010 if (_parent == null)
2011 base.RaiseOutOfBounds(_position); 2011 base.RaiseOutOfBounds(_position);
2012 2012
2013 _acceleration.X = 0; 2013 _acceleration.X = 0;
2014 _acceleration.Y = 0; 2014 _acceleration.Y = 0;
2015 _acceleration.Z = 0; 2015 _acceleration.Z = 0;
@@ -2020,10 +2020,10 @@ namespace OpenSim.Region.Physics.OdePlugin
2020 m_rotationalVelocity.X = 0; 2020 m_rotationalVelocity.X = 0;
2021 m_rotationalVelocity.Y = 0; 2021 m_rotationalVelocity.Y = 0;
2022 m_rotationalVelocity.Z = 0; 2022 m_rotationalVelocity.Z = 0;
2023 2023
2024 if (_parent == null) 2024 if (_parent == null)
2025 base.RequestPhysicsterseUpdate(); 2025 base.RequestPhysicsterseUpdate();
2026 2026
2027 m_throttleUpdates = false; 2027 m_throttleUpdates = false;
2028 throttleCounter = 0; 2028 throttleCounter = 0;
2029 _zeroFlag = true; 2029 _zeroFlag = true;
@@ -2065,10 +2065,10 @@ namespace OpenSim.Region.Physics.OdePlugin
2065 m_throttleUpdates = false; 2065 m_throttleUpdates = false;
2066 throttleCounter = 0; 2066 throttleCounter = 0;
2067 m_rotationalVelocity = pv; 2067 m_rotationalVelocity = pv;
2068 2068
2069 if (_parent == null) 2069 if (_parent == null)
2070 base.RequestPhysicsterseUpdate(); 2070 base.RequestPhysicsterseUpdate();
2071 2071
2072 m_lastUpdateSent = true; 2072 m_lastUpdateSent = true;
2073 } 2073 }
2074 } 2074 }
@@ -2087,11 +2087,11 @@ namespace OpenSim.Region.Physics.OdePlugin
2087 _velocity.X = vel.X; 2087 _velocity.X = vel.X;
2088 _velocity.Y = vel.Y; 2088 _velocity.Y = vel.Y;
2089 _velocity.Z = vel.Z; 2089 _velocity.Z = vel.Z;
2090 2090
2091 _acceleration = ((_velocity - m_lastVelocity) / 0.1f); 2091 _acceleration = ((_velocity - m_lastVelocity) / 0.1f);
2092 _acceleration = new PhysicsVector(_velocity.X - m_lastVelocity.X / 0.1f, _velocity.Y - m_lastVelocity.Y / 0.1f, _velocity.Z - m_lastVelocity.Z / 0.1f); 2092 _acceleration = new PhysicsVector(_velocity.X - m_lastVelocity.X / 0.1f, _velocity.Y - m_lastVelocity.Y / 0.1f, _velocity.Z - m_lastVelocity.Z / 0.1f);
2093 //m_log.Info("[PHYSICS]: V1: " + _velocity + " V2: " + m_lastVelocity + " Acceleration: " + _acceleration.ToString()); 2093 //m_log.Info("[PHYSICS]: V1: " + _velocity + " V2: " + m_lastVelocity + " Acceleration: " + _acceleration.ToString());
2094 2094
2095 if (_velocity.IsIdentical(pv, 0.5f)) 2095 if (_velocity.IsIdentical(pv, 0.5f))
2096 { 2096 {
2097 m_rotationalVelocity = pv; 2097 m_rotationalVelocity = pv;
@@ -2173,7 +2173,7 @@ namespace OpenSim.Region.Physics.OdePlugin
2173 { 2173 {
2174 m_tensor = 5f; 2174 m_tensor = 5f;
2175 } 2175 }
2176 2176
2177 float axisnum = 3; 2177 float axisnum = 3;
2178 2178
2179 axisnum = (axisnum - (axis.X + axis.Y + axis.Z)); 2179 axisnum = (axisnum - (axis.X + axis.Y + axis.Z));
@@ -2222,7 +2222,7 @@ namespace OpenSim.Region.Physics.OdePlugin
2222 d.JointSetAMotorParam(Amotor, (int)dParam.HiStop, 0.000000000001f); 2222 d.JointSetAMotorParam(Amotor, (int)dParam.HiStop, 0.000000000001f);
2223 d.JointSetAMotorParam(Amotor, (int)dParam.HiStop3, 0.000000000001f); 2223 d.JointSetAMotorParam(Amotor, (int)dParam.HiStop3, 0.000000000001f);
2224 d.JointSetAMotorParam(Amotor, (int)dParam.HiStop2, 0.000000000001f); 2224 d.JointSetAMotorParam(Amotor, (int)dParam.HiStop2, 0.000000000001f);
2225 2225
2226 d.JointSetAMotorParam(Amotor, (int)dParam.FudgeFactor, 0f); 2226 d.JointSetAMotorParam(Amotor, (int)dParam.FudgeFactor, 0f);
2227 d.JointSetAMotorParam(Amotor, (int)dParam.FMax, m_tensor); 2227 d.JointSetAMotorParam(Amotor, (int)dParam.FMax, m_tensor);
2228 } 2228 }