aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/Physics/OdePlugin
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region/Physics/OdePlugin')
-rw-r--r--OpenSim/Region/Physics/OdePlugin/ODECharacter.cs62
-rw-r--r--OpenSim/Region/Physics/OdePlugin/ODEPrim.cs226
-rw-r--r--OpenSim/Region/Physics/OdePlugin/OdePlugin.cs208
3 files changed, 212 insertions, 284 deletions
diff --git a/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs b/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs
index 4165484..5024b5d 100644
--- a/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs
+++ b/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs
@@ -36,7 +36,7 @@ namespace OpenSim.Region.Physics.OdePlugin
36 /// <summary> 36 /// <summary>
37 /// Various properties that ODE uses for AMotors but isn't exposed in ODE.NET so we must define them ourselves. 37 /// Various properties that ODE uses for AMotors but isn't exposed in ODE.NET so we must define them ourselves.
38 /// </summary> 38 /// </summary>
39 39
40 public enum dParam : int 40 public enum dParam : int
41 { 41 {
42 LowStop = 0, 42 LowStop = 0,
@@ -106,7 +106,7 @@ namespace OpenSim.Region.Physics.OdePlugin
106 private CollisionCategories m_collisionFlags = (CollisionCategories.Geom 106 private CollisionCategories m_collisionFlags = (CollisionCategories.Geom
107 | CollisionCategories.Space 107 | CollisionCategories.Space
108 | CollisionCategories.Body 108 | CollisionCategories.Body
109 | CollisionCategories.Character 109 | CollisionCategories.Character
110 | CollisionCategories.Land); 110 | CollisionCategories.Land);
111 public IntPtr Body; 111 public IntPtr Body;
112 private OdeScene _parent_scene; 112 private OdeScene _parent_scene;
@@ -145,7 +145,7 @@ namespace OpenSim.Region.Physics.OdePlugin
145 { 145 {
146 m_colliderarr[i] = false; 146 m_colliderarr[i] = false;
147 } 147 }
148 CAPSULE_LENGTH = (size.Z - ((size.Z * height_fudge_factor))); 148 CAPSULE_LENGTH = (size.Z - ((size.Z * height_fudge_factor)));
149 149
150 lock (OdeScene.OdeLock) 150 lock (OdeScene.OdeLock)
151 { 151 {
@@ -338,7 +338,7 @@ namespace OpenSim.Region.Physics.OdePlugin
338 } 338 }
339 339
340 /// <summary> 340 /// <summary>
341 /// turn the PID controller on or off. 341 /// turn the PID controller on or off.
342 /// The PID Controller will turn on all by itself in many situations 342 /// The PID Controller will turn on all by itself in many situations
343 /// </summary> 343 /// </summary>
344 /// <param name="status"></param> 344 /// <param name="status"></param>
@@ -354,7 +354,7 @@ namespace OpenSim.Region.Physics.OdePlugin
354 354
355 /// <summary> 355 /// <summary>
356 /// This 'puts' an avatar somewhere in the physics space. 356 /// This 'puts' an avatar somewhere in the physics space.
357 /// Not really a good choice unless you 'know' it's a good 357 /// Not really a good choice unless you 'know' it's a good
358 /// spot otherwise you're likely to orbit the avatar. 358 /// spot otherwise you're likely to orbit the avatar.
359 /// </summary> 359 /// </summary>
360 public override PhysicsVector Position 360 public override PhysicsVector Position
@@ -389,7 +389,7 @@ namespace OpenSim.Region.Physics.OdePlugin
389 lock (OdeScene.OdeLock) 389 lock (OdeScene.OdeLock)
390 { 390 {
391 d.JointDestroy(Amotor); 391 d.JointDestroy(Amotor);
392 392
393 PhysicsVector SetSize = value; 393 PhysicsVector SetSize = value;
394 float prevCapsule = CAPSULE_LENGTH; 394 float prevCapsule = CAPSULE_LENGTH;
395 float capsuleradius = CAPSULE_RADIUS; 395 float capsuleradius = CAPSULE_RADIUS;
@@ -405,7 +405,7 @@ namespace OpenSim.Region.Physics.OdePlugin
405 AvatarGeomAndBodyCreation(_position.X, _position.Y, 405 AvatarGeomAndBodyCreation(_position.X, _position.Y,
406 _position.Z + (Math.Abs(CAPSULE_LENGTH - prevCapsule) * 2), m_tensor); 406 _position.Z + (Math.Abs(CAPSULE_LENGTH - prevCapsule) * 2), m_tensor);
407 Velocity = new PhysicsVector(0f, 0f, 0f); 407 Velocity = new PhysicsVector(0f, 0f, 0f);
408 408
409 } 409 }
410 _parent_scene.geom_name_map[Shell] = m_name; 410 _parent_scene.geom_name_map[Shell] = m_name;
411 _parent_scene.actor_name_map[Shell] = (PhysicsActor) this; 411 _parent_scene.actor_name_map[Shell] = (PhysicsActor) this;
@@ -423,7 +423,7 @@ namespace OpenSim.Region.Physics.OdePlugin
423 int dAMotorEuler = 1; 423 int dAMotorEuler = 1;
424 _parent_scene.waitForSpaceUnlock(_parent_scene.space); 424 _parent_scene.waitForSpaceUnlock(_parent_scene.space);
425 Shell = d.CreateCapsule(_parent_scene.space, CAPSULE_RADIUS, CAPSULE_LENGTH); 425 Shell = d.CreateCapsule(_parent_scene.space, CAPSULE_RADIUS, CAPSULE_LENGTH);
426 426
427 d.GeomSetCategoryBits(Shell, (int)m_collisionCategories); 427 d.GeomSetCategoryBits(Shell, (int)m_collisionCategories);
428 d.GeomSetCollideBits(Shell, (int)m_collisionFlags); 428 d.GeomSetCollideBits(Shell, (int)m_collisionFlags);
429 429
@@ -442,8 +442,8 @@ namespace OpenSim.Region.Physics.OdePlugin
442 442
443 d.GeomSetBody(Shell, Body); 443 d.GeomSetBody(Shell, Body);
444 444
445 445
446 // The purpose of the AMotor here is to keep the avatar's physical 446 // The purpose of the AMotor here is to keep the avatar's physical
447 // surrogate from rotating while moving 447 // surrogate from rotating while moving
448 Amotor = d.JointCreateAMotor(_parent_scene.world, IntPtr.Zero); 448 Amotor = d.JointCreateAMotor(_parent_scene.world, IntPtr.Zero);
449 d.JointAttach(Amotor, Body, IntPtr.Zero); 449 d.JointAttach(Amotor, Body, IntPtr.Zero);
@@ -455,7 +455,7 @@ namespace OpenSim.Region.Physics.OdePlugin
455 d.JointSetAMotorAngle(Amotor, 0, 0); 455 d.JointSetAMotorAngle(Amotor, 0, 0);
456 d.JointSetAMotorAngle(Amotor, 1, 0); 456 d.JointSetAMotorAngle(Amotor, 1, 0);
457 d.JointSetAMotorAngle(Amotor, 2, 0); 457 d.JointSetAMotorAngle(Amotor, 2, 0);
458 458
459 // These lowstops and high stops are effectively (no wiggle room) 459 // These lowstops and high stops are effectively (no wiggle room)
460 d.JointSetAMotorParam(Amotor, (int)dParam.LowStop, -0.000000000001f); 460 d.JointSetAMotorParam(Amotor, (int)dParam.LowStop, -0.000000000001f);
461 d.JointSetAMotorParam(Amotor, (int)dParam.LoStop3, -0.000000000001f); 461 d.JointSetAMotorParam(Amotor, (int)dParam.LoStop3, -0.000000000001f);
@@ -464,23 +464,23 @@ namespace OpenSim.Region.Physics.OdePlugin
464 d.JointSetAMotorParam(Amotor, (int)dParam.HiStop3, 0.000000000001f); 464 d.JointSetAMotorParam(Amotor, (int)dParam.HiStop3, 0.000000000001f);
465 d.JointSetAMotorParam(Amotor, (int)dParam.HiStop2, 0.000000000001f); 465 d.JointSetAMotorParam(Amotor, (int)dParam.HiStop2, 0.000000000001f);
466 466
467 // Fudge factor is 1f by default, we're setting it to 0. We don't want it to Fudge or the 467 // Fudge factor is 1f by default, we're setting it to 0. We don't want it to Fudge or the
468 // capped cyllinder will fall over 468 // capped cyllinder will fall over
469 d.JointSetAMotorParam(Amotor, (int)dParam.FudgeFactor, 0f); 469 d.JointSetAMotorParam(Amotor, (int)dParam.FudgeFactor, 0f);
470 d.JointSetAMotorParam(Amotor, (int)dParam.FMax, tensor); 470 d.JointSetAMotorParam(Amotor, (int)dParam.FMax, tensor);
471 471
472 //d.Matrix3 bodyrotation = d.BodyGetRotation(Body); 472 //d.Matrix3 bodyrotation = d.BodyGetRotation(Body);
473 //d.QfromR( 473 //d.QfromR(
474 //d.Matrix3 checkrotation = new d.Matrix3(0.7071068,0.5, -0.7071068, 474 //d.Matrix3 checkrotation = new d.Matrix3(0.7071068,0.5, -0.7071068,
475 // 475 //
476 //m_log.Info("[PHYSICSAV]: Rotation: " + bodyrotation.M00 + " : " + bodyrotation.M01 + " : " + bodyrotation.M02 + " : " + bodyrotation.M10 + " : " + bodyrotation.M11 + " : " + bodyrotation.M12 + " : " + bodyrotation.M20 + " : " + bodyrotation.M21 + " : " + bodyrotation.M22); 476 //m_log.Info("[PHYSICSAV]: Rotation: " + bodyrotation.M00 + " : " + bodyrotation.M01 + " : " + bodyrotation.M02 + " : " + bodyrotation.M10 + " : " + bodyrotation.M11 + " : " + bodyrotation.M12 + " : " + bodyrotation.M20 + " : " + bodyrotation.M21 + " : " + bodyrotation.M22);
477 //standupStraight(); 477 //standupStraight();
478 478
479 479
480 480
481 } 481 }
482 482
483 // 483 //
484 /// <summary> 484 /// <summary>
485 /// Uses the capped cyllinder volume formula to calculate the avatar's mass. 485 /// Uses the capped cyllinder volume formula to calculate the avatar's mass.
486 /// This may be used in calculations in the scene/scenepresence 486 /// This may be used in calculations in the scene/scenepresence
@@ -508,13 +508,13 @@ namespace OpenSim.Region.Physics.OdePlugin
508 508
509 } 509 }
510 510
511// This code is very useful. Written by DanX0r. We're just not using it right now. 511// This code is very useful. Written by DanX0r. We're just not using it right now.
512// Commented out to prevent a warning. 512// Commented out to prevent a warning.
513// 513//
514// private void standupStraight() 514// private void standupStraight()
515// { 515// {
516// // The purpose of this routine here is to quickly stabilize the Body while it's popped up in the air. 516// // The purpose of this routine here is to quickly stabilize the Body while it's popped up in the air.
517// // The amotor needs a few seconds to stabilize so without it, the avatar shoots up sky high when you 517// // The amotor needs a few seconds to stabilize so without it, the avatar shoots up sky high when you
518// // change appearance and when you enter the simulator 518// // change appearance and when you enter the simulator
519// // After this routine is done, the amotor stabilizes much quicker 519// // After this routine is done, the amotor stabilizes much quicker
520// d.Vector3 feet; 520// d.Vector3 feet;
@@ -558,7 +558,7 @@ namespace OpenSim.Region.Physics.OdePlugin
558 if (_zeroFlag) 558 if (_zeroFlag)
559 return new PhysicsVector(0f, 0f, 0f); 559 return new PhysicsVector(0f, 0f, 0f);
560 m_lastUpdateSent = false; 560 m_lastUpdateSent = false;
561 return _velocity; 561 return _velocity;
562 } 562 }
563 set 563 set
564 { 564 {
@@ -601,7 +601,7 @@ namespace OpenSim.Region.Physics.OdePlugin
601 } 601 }
602 602
603 /// <summary> 603 /// <summary>
604 /// Adds the force supplied to the Target Velocity 604 /// Adds the force supplied to the Target Velocity
605 /// The PID controller takes this target velocity and tries to make it a reality 605 /// The PID controller takes this target velocity and tries to make it a reality
606 /// </summary> 606 /// </summary>
607 /// <param name="force"></param> 607 /// <param name="force"></param>
@@ -616,7 +616,7 @@ namespace OpenSim.Region.Physics.OdePlugin
616 // _target_velocity.Y += force.Y; 616 // _target_velocity.Y += force.Y;
617 //_target_velocity.Z += force.Z; 617 //_target_velocity.Z += force.Z;
618 } 618 }
619 else 619 else
620 { 620 {
621 m_pidControllerActive = true; 621 m_pidControllerActive = true;
622 _target_velocity.X += force.X; 622 _target_velocity.X += force.X;
@@ -637,7 +637,7 @@ namespace OpenSim.Region.Physics.OdePlugin
637 d.BodyAddForce(Body, force.X, force.Y, force.Z); 637 d.BodyAddForce(Body, force.X, force.Y, force.Z);
638 //d.BodySetRotation(Body, ref m_StandUpRotation); 638 //d.BodySetRotation(Body, ref m_StandUpRotation);
639 //standupStraight(); 639 //standupStraight();
640 640
641 } 641 }
642 } 642 }
643 643
@@ -655,16 +655,16 @@ namespace OpenSim.Region.Physics.OdePlugin
655 { 655 {
656 // no lock; for now it's only called from within Simulate() 656 // no lock; for now it's only called from within Simulate()
657 657
658 // If the PID Controller isn't active then we set our force 658 // If the PID Controller isn't active then we set our force
659 // calculating base velocity to the current position 659 // calculating base velocity to the current position
660 660
661 661
662 if (m_pidControllerActive == false) 662 if (m_pidControllerActive == false)
663 { 663 {
664 _zeroPosition = d.BodyGetPosition(Body); 664 _zeroPosition = d.BodyGetPosition(Body);
665 } 665 }
666 //PidStatus = true; 666 //PidStatus = true;
667 667
668 PhysicsVector vec = new PhysicsVector(); 668 PhysicsVector vec = new PhysicsVector();
669 d.Vector3 vel = d.BodyGetLinearVel(Body); 669 d.Vector3 vel = d.BodyGetLinearVel(Body);
670 float movementdivisor = 1f; 670 float movementdivisor = 1f;
@@ -798,13 +798,13 @@ namespace OpenSim.Region.Physics.OdePlugin
798 _velocity.X = 0.0f; 798 _velocity.X = 0.0f;
799 _velocity.Y = 0.0f; 799 _velocity.Y = 0.0f;
800 _velocity.Z = 0.0f; 800 _velocity.Z = 0.0f;
801 801
802 // Did we send out the 'stopped' message? 802 // Did we send out the 'stopped' message?
803 if (!m_lastUpdateSent) 803 if (!m_lastUpdateSent)
804 { 804 {
805 m_lastUpdateSent = true; 805 m_lastUpdateSent = true;
806 //base.RequestPhysicsterseUpdate(); 806 //base.RequestPhysicsterseUpdate();
807 807
808 } 808 }
809 } 809 }
810 else 810 else
@@ -815,7 +815,7 @@ namespace OpenSim.Region.Physics.OdePlugin
815 _velocity.Y = (vec.Y); 815 _velocity.Y = (vec.Y);
816 816
817 _velocity.Z = (vec.Z); 817 _velocity.Z = (vec.Z);
818 818
819 if (_velocity.Z < -6 && !m_hackSentFall) 819 if (_velocity.Z < -6 && !m_hackSentFall)
820 { 820 {
821 m_hackSentFall = true; 821 m_hackSentFall = true;
@@ -849,7 +849,7 @@ namespace OpenSim.Region.Physics.OdePlugin
849 849
850 d.GeomDestroy(Shell); 850 d.GeomDestroy(Shell);
851 _parent_scene.geom_name_map.Remove(Shell); 851 _parent_scene.geom_name_map.Remove(Shell);
852 852
853 //kill the body 853 //kill the body
854 d.BodyDestroy(Body); 854 d.BodyDestroy(Body);
855 } 855 }
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 }
diff --git a/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs b/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs
index d795e45..c663fb0 100644
--- a/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs
+++ b/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs
@@ -42,7 +42,7 @@ using OpenSim.Region.Physics.Manager;
42namespace OpenSim.Region.Physics.OdePlugin 42namespace OpenSim.Region.Physics.OdePlugin
43{ 43{
44 /// <summary> 44 /// <summary>
45 /// ODE plugin 45 /// ODE plugin
46 /// </summary> 46 /// </summary>
47 public class OdePlugin : IPhysicsPlugin 47 public class OdePlugin : IPhysicsPlugin
48 { 48 {
@@ -51,7 +51,6 @@ namespace OpenSim.Region.Physics.OdePlugin
51 private CollisionLocker ode; 51 private CollisionLocker ode;
52 private OdeScene _mScene; 52 private OdeScene _mScene;
53 53
54
55 public OdePlugin() 54 public OdePlugin()
56 { 55 {
57 ode = new CollisionLocker(); 56 ode = new CollisionLocker();
@@ -81,15 +80,13 @@ namespace OpenSim.Region.Physics.OdePlugin
81 } 80 }
82 } 81 }
83 82
84 83 public enum StatusIndicators : int
85 public enum StatusIndicators : int
86 { 84 {
87 Generic = 0, 85 Generic = 0,
88 Start = 1, 86 Start = 1,
89 End = 2 87 End = 2
90 } 88 }
91 89
92
93 public struct sCollisionData 90 public struct sCollisionData
94 { 91 {
95 public uint ColliderLocalId; 92 public uint ColliderLocalId;
@@ -165,7 +162,6 @@ namespace OpenSim.Region.Physics.OdePlugin
165 private float mAvatarObjectContactFriction = 75f; 162 private float mAvatarObjectContactFriction = 75f;
166 private float mAvatarObjectContactBounce = 0.1f; 163 private float mAvatarObjectContactBounce = 0.1f;
167 164
168
169 private float avPIDD = 3200f; 165 private float avPIDD = 3200f;
170 private float avPIDP = 1400f; 166 private float avPIDP = 1400f;
171 private float avCapRadius = 0.37f; 167 private float avCapRadius = 0.37f;
@@ -175,13 +171,12 @@ namespace OpenSim.Region.Physics.OdePlugin
175 private float avMovementDivisorWalk = 1.3f; 171 private float avMovementDivisorWalk = 1.3f;
176 private float avMovementDivisorRun = 0.8f; 172 private float avMovementDivisorRun = 0.8f;
177 173
178
179 private float[] _heightmap; 174 private float[] _heightmap;
180 175
181 private float[] _watermap; 176 private float[] _watermap;
182 177
183 private float[] _origheightmap; 178 private float[] _origheightmap;
184 179
185 private d.NearCallback nearCallback; 180 private d.NearCallback nearCallback;
186 public d.TriCallback triCallback; 181 public d.TriCallback triCallback;
187 public d.TriArrayCallback triArrayCallback; 182 public d.TriArrayCallback triArrayCallback;
@@ -200,7 +195,6 @@ namespace OpenSim.Region.Physics.OdePlugin
200 private d.Contact AvatarMovementTerrainContact; 195 private d.Contact AvatarMovementTerrainContact;
201 private d.Contact WaterContact; 196 private d.Contact WaterContact;
202 197
203
204//Ckrinke: Comment out until used. We declare it, initialize it, but do not use it 198//Ckrinke: Comment out until used. We declare it, initialize it, but do not use it
205//Ckrinke private int m_randomizeWater = 200; 199//Ckrinke private int m_randomizeWater = 200;
206 private int m_physicsiterations = 10; 200 private int m_physicsiterations = 10;
@@ -233,7 +227,6 @@ namespace OpenSim.Region.Physics.OdePlugin
233 227
234 private IConfigSource m_config; 228 private IConfigSource m_config;
235 229
236
237 /// <summary> 230 /// <summary>
238 /// Initiailizes the scene 231 /// Initiailizes the scene
239 /// Sets many properties that ODE requires to be stable 232 /// Sets many properties that ODE requires to be stable
@@ -245,44 +238,34 @@ namespace OpenSim.Region.Physics.OdePlugin
245 nearCallback = near; 238 nearCallback = near;
246 triCallback = TriCallback; 239 triCallback = TriCallback;
247 triArrayCallback = TriArrayCallback; 240 triArrayCallback = TriArrayCallback;
248
249
250
251 241
252 lock (OdeLock) 242 lock (OdeLock)
253 { 243 {
254 244 // Create the world and the first space
255 // Creat the world and the first space
256 world = d.WorldCreate(); 245 world = d.WorldCreate();
257 space = d.HashSpaceCreate(IntPtr.Zero); 246 space = d.HashSpaceCreate(IntPtr.Zero);
258 247
259 contactgroup = d.JointGroupCreate(0); 248 contactgroup = d.JointGroupCreate(0);
260 //contactgroup 249 //contactgroup
261 250
262
263
264
265 d.WorldSetAutoDisableFlag(world, false); 251 d.WorldSetAutoDisableFlag(world, false);
266
267 } 252 }
268 253
269 // zero out a heightmap array float array (single dimention [flattened])) 254 // zero out a heightmap array float array (single dimention [flattened]))
270 _heightmap = new float[514*514]; 255 _heightmap = new float[514*514];
271 _watermap = new float[258 * 258]; 256 _watermap = new float[258 * 258];
272 257
273 // Zero out the prim spaces array (we split our space into smaller spaces so 258 // Zero out the prim spaces array (we split our space into smaller spaces so
274 // we can hit test less. 259 // we can hit test less.
275
276 } 260 }
277 261
278
279 // Initialize the mesh plugin 262 // Initialize the mesh plugin
280 public override void Initialise(IMesher meshmerizer, IConfigSource config) 263 public override void Initialise(IMesher meshmerizer, IConfigSource config)
281 { 264 {
282 mesher = meshmerizer; 265 mesher = meshmerizer;
283 m_config = config; 266 m_config = config;
284 // Defaults 267 // Defaults
285 268
286 if (Environment.OSVersion.Platform == PlatformID.Unix) 269 if (Environment.OSVersion.Platform == PlatformID.Unix)
287 { 270 {
288 avPIDD = 3200.0f; 271 avPIDD = 3200.0f;
@@ -349,10 +332,7 @@ namespace OpenSim.Region.Physics.OdePlugin
349 avPIDP = physicsconfig.GetFloat("av_pid_proportional_win", 900.0f); 332 avPIDP = physicsconfig.GetFloat("av_pid_proportional_win", 900.0f);
350 avStandupTensor = physicsconfig.GetFloat("av_capsule_standup_tensor_win", 550000f); 333 avStandupTensor = physicsconfig.GetFloat("av_capsule_standup_tensor_win", 550000f);
351 } 334 }
352
353
354 } 335 }
355
356 } 336 }
357 337
358 staticPrimspace = new IntPtr[(int)(300 / metersInSpace), (int)(300 / metersInSpace)]; 338 staticPrimspace = new IntPtr[(int)(300 / metersInSpace), (int)(300 / metersInSpace)];
@@ -361,8 +341,8 @@ namespace OpenSim.Region.Physics.OdePlugin
361 contact.surface.mu = nmAvatarObjectContactFriction; 341 contact.surface.mu = nmAvatarObjectContactFriction;
362 contact.surface.bounce = nmAvatarObjectContactBounce; 342 contact.surface.bounce = nmAvatarObjectContactBounce;
363 343
364 // Terrain contact friction and Bounce 344 // Terrain contact friction and Bounce
365 // This is the *non* moving version. Use this when an avatar 345 // This is the *non* moving version. Use this when an avatar
366 // isn't moving to keep it in place better 346 // isn't moving to keep it in place better
367 TerrainContact.surface.mode |= d.ContactFlags.SoftERP; 347 TerrainContact.surface.mode |= d.ContactFlags.SoftERP;
368 TerrainContact.surface.mu = nmTerrainContactFriction; 348 TerrainContact.surface.mu = nmTerrainContactFriction;
@@ -376,7 +356,7 @@ namespace OpenSim.Region.Physics.OdePlugin
376 WaterContact.surface.soft_erp = 0.010f; 356 WaterContact.surface.soft_erp = 0.010f;
377 357
378 // Prim contact friction and bounce 358 // Prim contact friction and bounce
379 // THis is the *non* moving version of friction and bounce 359 // THis is the *non* moving version of friction and bounce
380 // Use this when an avatar comes in contact with a prim 360 // Use this when an avatar comes in contact with a prim
381 // and is moving 361 // and is moving
382 AvatarMovementprimContact.surface.mu = mAvatarObjectContactFriction; 362 AvatarMovementprimContact.surface.mu = mAvatarObjectContactFriction;
@@ -409,7 +389,6 @@ namespace OpenSim.Region.Physics.OdePlugin
409 staticPrimspace[i, j] = IntPtr.Zero; 389 staticPrimspace[i, j] = IntPtr.Zero;
410 } 390 }
411 } 391 }
412
413 } 392 }
414 393
415 internal void waitForSpaceUnlock(IntPtr space) 394 internal void waitForSpaceUnlock(IntPtr space)
@@ -439,17 +418,17 @@ namespace OpenSim.Region.Physics.OdePlugin
439 private void near(IntPtr space, IntPtr g1, IntPtr g2) 418 private void near(IntPtr space, IntPtr g1, IntPtr g2)
440 { 419 {
441 // no lock here! It's invoked from within Simulate(), which is thread-locked 420 // no lock here! It's invoked from within Simulate(), which is thread-locked
442 421
443 // Test if we're collidng a geom with a space. 422 // Test if we're colliding a geom with a space.
444 // If so we have to drill down into the space recursively 423 // If so we have to drill down into the space recursively
445 424
446 if (d.GeomIsSpace(g1) || d.GeomIsSpace(g2)) 425 if (d.GeomIsSpace(g1) || d.GeomIsSpace(g2))
447 { 426 {
448 if (g1 == (IntPtr)0 || g2 == (IntPtr)0) 427 if (g1 == (IntPtr)0 || g2 == (IntPtr)0)
449 return; 428 return;
450 // Separating static prim geometry spaces. 429 // Separating static prim geometry spaces.
451 // We'll be calling near recursivly if one 430 // We'll be calling near recursivly if one
452 // of them is a space to find all of the 431 // of them is a space to find all of the
453 // contact points in the space 432 // contact points in the space
454 try 433 try
455 { 434 {
@@ -462,13 +441,12 @@ namespace OpenSim.Region.Physics.OdePlugin
462 } 441 }
463 //Colliding a space or a geom with a space or a geom. so drill down 442 //Colliding a space or a geom with a space or a geom. so drill down
464 443
465 //Collide all geoms in each space.. 444 //Collide all geoms in each space..
466 //if (d.GeomIsSpace(g1)) d.SpaceCollide(g1, IntPtr.Zero, nearCallback); 445 //if (d.GeomIsSpace(g1)) d.SpaceCollide(g1, IntPtr.Zero, nearCallback);
467 //if (d.GeomIsSpace(g2)) d.SpaceCollide(g2, IntPtr.Zero, nearCallback); 446 //if (d.GeomIsSpace(g2)) d.SpaceCollide(g2, IntPtr.Zero, nearCallback);
468 return; 447 return;
469 } 448 }
470 449
471
472 if (g1 == (IntPtr)0 || g2 == (IntPtr)0) 450 if (g1 == (IntPtr)0 || g2 == (IntPtr)0)
473 return; 451 return;
474 452
@@ -499,23 +477,17 @@ namespace OpenSim.Region.Physics.OdePlugin
499 int count = 0; 477 int count = 0;
500 try 478 try
501 { 479 {
502
503 // Colliding Geom To Geom 480 // Colliding Geom To Geom
504 // This portion of the function 'was' blatantly ripped off from BoxStack.cs 481 // This portion of the function 'was' blatantly ripped off from BoxStack.cs
505
506
507
508 482
509 if (g1 == g2) 483 if (g1 == g2)
510 return; // Can't collide with yourself 484 return; // Can't collide with yourself
511 485
512 if (b1 != IntPtr.Zero && b2 != IntPtr.Zero && d.AreConnectedExcluding(b1, b2, d.JointType.Contact)) 486 if (b1 != IntPtr.Zero && b2 != IntPtr.Zero && d.AreConnectedExcluding(b1, b2, d.JointType.Contact))
513 return; 487 return;
514 488
515 lock (contacts) 489 lock (contacts)
516 { 490 {
517
518
519 count = d.Collide(g1, g2, contacts.GetLength(0), contacts, d.ContactGeom.SizeOf); 491 count = d.Collide(g1, g2, contacts.GetLength(0), contacts, d.ContactGeom.SizeOf);
520 } 492 }
521 } 493 }
@@ -527,7 +499,7 @@ namespace OpenSim.Region.Physics.OdePlugin
527 } 499 }
528 catch (AccessViolationException) 500 catch (AccessViolationException)
529 { 501 {
530 502
531 m_log.Warn("[PHYSICS]: Unable to collide test an object"); 503 m_log.Warn("[PHYSICS]: Unable to collide test an object");
532 return; 504 return;
533 } 505 }
@@ -539,6 +511,7 @@ namespace OpenSim.Region.Physics.OdePlugin
539 { 511 {
540 p1 = PANull; 512 p1 = PANull;
541 } 513 }
514
542 if (!actor_name_map.TryGetValue(g2, out p2)) 515 if (!actor_name_map.TryGetValue(g2, out p2))
543 { 516 {
544 p2 = PANull; 517 p2 = PANull;
@@ -554,14 +527,10 @@ namespace OpenSim.Region.Physics.OdePlugin
554 // If we're colliding with terrain, use 'TerrainContact' instead of contact. 527 // If we're colliding with terrain, use 'TerrainContact' instead of contact.
555 // allows us to have different settings 528 // allows us to have different settings
556 529
557
558
559 // We only need to test p2 for 'jump crouch purposes' 530 // We only need to test p2 for 'jump crouch purposes'
560 p2.IsColliding = true; 531 p2.IsColliding = true;
561 532
562 //if ((framecount % m_returncollisions) == 0) 533 //if ((framecount % m_returncollisions) == 0)
563
564
565 534
566 switch (p1.PhysicsActorType) 535 switch (p1.PhysicsActorType)
567 { 536 {
@@ -588,41 +557,39 @@ namespace OpenSim.Region.Physics.OdePlugin
588 { 557 {
589 //This is disabled at the moment only because it needs more tweaking 558 //This is disabled at the moment only because it needs more tweaking
590 //It will eventually be uncommented 559 //It will eventually be uncommented
591 560
592 if (contacts[i].depth >= 1.00f) 561 if (contacts[i].depth >= 1.00f)
593 { 562 {
594 //m_log.Debug("[PHYSICS]: " + contacts[i].depth.ToString()); 563 //m_log.Debug("[PHYSICS]: " + contacts[i].depth.ToString());
595 } 564 }
596 565
597 //If you interpenetrate a prim with an agent 566 //If you interpenetrate a prim with an agent
598 if ((p2.PhysicsActorType == (int) ActorTypes.Agent && 567 if ((p2.PhysicsActorType == (int) ActorTypes.Agent &&
599 p1.PhysicsActorType == (int) ActorTypes.Prim) || 568 p1.PhysicsActorType == (int) ActorTypes.Prim) ||
600 (p1.PhysicsActorType == (int) ActorTypes.Agent && 569 (p1.PhysicsActorType == (int) ActorTypes.Agent &&
601 p2.PhysicsActorType == (int) ActorTypes.Prim)) 570 p2.PhysicsActorType == (int) ActorTypes.Prim))
602 { 571 {
603
604
605 # region disabled code1 572 # region disabled code1
606 //contacts[i].depth = contacts[i].depth * 4.15f; 573 //contacts[i].depth = contacts[i].depth * 4.15f;
607 /* 574 /*
608 if (p2.PhysicsActorType == (int) ActorTypes.Agent) 575 if (p2.PhysicsActorType == (int) ActorTypes.Agent)
609 { 576 {
610 p2.CollidingObj = true; 577 p2.CollidingObj = true;
611 contacts[i].depth = 0.003f; 578 contacts[i].depth = 0.003f;
612 p2.Velocity = p2.Velocity + new PhysicsVector(0, 0, 2.5f); 579 p2.Velocity = p2.Velocity + new PhysicsVector(0, 0, 2.5f);
613 OdeCharacter character = (OdeCharacter) p2; 580 OdeCharacter character = (OdeCharacter) p2;
614 character.SetPidStatus(true); 581 character.SetPidStatus(true);
615 contacts[i].pos = new d.Vector3(contacts[i].pos.X + (p1.Size.X / 2), contacts[i].pos.Y + (p1.Size.Y / 2), contacts[i].pos.Z + (p1.Size.Z / 2)); 582 contacts[i].pos = new d.Vector3(contacts[i].pos.X + (p1.Size.X / 2), contacts[i].pos.Y + (p1.Size.Y / 2), contacts[i].pos.Z + (p1.Size.Z / 2));
616 583
617 } 584 }
618 else 585 else
619 { 586 {
620 587
621 //contacts[i].depth = 0.0000000f; 588 //contacts[i].depth = 0.0000000f;
622 } 589 }
623 if (p1.PhysicsActorType == (int) ActorTypes.Agent) 590 if (p1.PhysicsActorType == (int) ActorTypes.Agent)
624 { 591 {
625 592
626 p1.CollidingObj = true; 593 p1.CollidingObj = true;
627 contacts[i].depth = 0.003f; 594 contacts[i].depth = 0.003f;
628 p1.Velocity = p1.Velocity + new PhysicsVector(0, 0, 2.5f); 595 p1.Velocity = p1.Velocity + new PhysicsVector(0, 0, 2.5f);
@@ -632,14 +599,12 @@ namespace OpenSim.Region.Physics.OdePlugin
632 } 599 }
633 else 600 else
634 { 601 {
635 602
636 //contacts[i].depth = 0.0000000f; 603 //contacts[i].depth = 0.0000000f;
637 } 604 }
638 */ 605 */
639 #endregion 606 #endregion
640
641 } 607 }
642
643 608
644 // If you interpenetrate a prim with another prim 609 // If you interpenetrate a prim with another prim
645 if (p1.PhysicsActorType == (int) ActorTypes.Prim && p2.PhysicsActorType == (int) ActorTypes.Prim) 610 if (p1.PhysicsActorType == (int) ActorTypes.Prim && p2.PhysicsActorType == (int) ActorTypes.Prim)
@@ -649,7 +614,6 @@ namespace OpenSim.Region.Physics.OdePlugin
649 //OdePrim op2 = (OdePrim)p2; 614 //OdePrim op2 = (OdePrim)p2;
650 //op1.m_collisionscore++; 615 //op1.m_collisionscore++;
651 //op2.m_collisionscore++; 616 //op2.m_collisionscore++;
652
653 617
654 //if (op1.m_collisionscore > 8000 || op2.m_collisionscore > 8000) 618 //if (op1.m_collisionscore > 8000 || op2.m_collisionscore > 8000)
655 //{ 619 //{
@@ -658,11 +622,10 @@ namespace OpenSim.Region.Physics.OdePlugin
658 //op2.m_taintdisable = true; 622 //op2.m_taintdisable = true;
659 //AddPhysicsActorTaint(p2); 623 //AddPhysicsActorTaint(p2);
660 //} 624 //}
661 625
662 //if (contacts[i].depth >= 0.25f) 626 //if (contacts[i].depth >= 0.25f)
663 //{ 627 //{
664 // Don't collide, one or both prim will expld. 628 // Don't collide, one or both prim will expld.
665
666 629
667 //op1.m_interpenetrationcount++; 630 //op1.m_interpenetrationcount++;
668 //op2.m_interpenetrationcount++; 631 //op2.m_interpenetrationcount++;
@@ -678,17 +641,17 @@ namespace OpenSim.Region.Physics.OdePlugin
678 //AddPhysicsActorTaint(p2); 641 //AddPhysicsActorTaint(p2);
679 //} 642 //}
680 643
681
682 //contacts[i].depth = contacts[i].depth / 8f; 644 //contacts[i].depth = contacts[i].depth / 8f;
683 //contacts[i].normal = new d.Vector3(0, 0, 1); 645 //contacts[i].normal = new d.Vector3(0, 0, 1);
684 //} 646 //}
685 //if (op1.m_disabled || op2.m_disabled) 647 //if (op1.m_disabled || op2.m_disabled)
686 //{ 648 //{
687 //Manually disabled objects stay disabled 649 //Manually disabled objects stay disabled
688 //contacts[i].depth = 0f; 650 //contacts[i].depth = 0f;
689 //} 651 //}
690 #endregion 652 #endregion
691 } 653 }
654
692 if (contacts[i].depth >= 1.00f) 655 if (contacts[i].depth >= 1.00f)
693 { 656 {
694 //m_log.Info("[P]: " + contacts[i].depth.ToString()); 657 //m_log.Info("[P]: " + contacts[i].depth.ToString());
@@ -713,6 +676,7 @@ namespace OpenSim.Region.Physics.OdePlugin
713 else 676 else
714 { 677 {
715 } 678 }
679
716 if (p1.PhysicsActorType == (int) ActorTypes.Agent) 680 if (p1.PhysicsActorType == (int) ActorTypes.Agent)
717 { 681 {
718 OdeCharacter character = (OdeCharacter)p1; 682 OdeCharacter character = (OdeCharacter)p1;
@@ -738,7 +702,7 @@ namespace OpenSim.Region.Physics.OdePlugin
738 702
739 if (contacts[i].depth >= 0f) 703 if (contacts[i].depth >= 0f)
740 { 704 {
741 // If we're collidng against terrain 705 // If we're colliding against terrain
742 if (name1 == "Terrain" || name2 == "Terrain") 706 if (name1 == "Terrain" || name2 == "Terrain")
743 { 707 {
744 // If we're moving 708 // If we're moving
@@ -760,12 +724,11 @@ namespace OpenSim.Region.Physics.OdePlugin
760 { 724 {
761 if ((p2.PhysicsActorType == (int)ActorTypes.Prim)) 725 if ((p2.PhysicsActorType == (int)ActorTypes.Prim))
762 { 726 {
763
764 } 727 }
765 else 728 else
766 { 729 {
767
768 } 730 }
731
769 //WaterContact.surface.soft_cfm = 0.0000f; 732 //WaterContact.surface.soft_cfm = 0.0000f;
770 //WaterContact.surface.soft_erp = 0.00000f; 733 //WaterContact.surface.soft_erp = 0.00000f;
771 if (contacts[i].depth > 0.1f) 734 if (contacts[i].depth > 0.1f)
@@ -775,7 +738,7 @@ namespace OpenSim.Region.Physics.OdePlugin
775 //contacts[i].pos = new d.Vector3(0, 0, contacts[i].pos.Z - 5f); 738 //contacts[i].pos = new d.Vector3(0, 0, contacts[i].pos.Z - 5f);
776 } 739 }
777 WaterContact.geom = contacts[i]; 740 WaterContact.geom = contacts[i];
778 741
779 joint = d.JointCreateContact(world, contactgroup, ref WaterContact); 742 joint = d.JointCreateContact(world, contactgroup, ref WaterContact);
780 743
781 //m_log.Info("[PHYSICS]: Prim Water Contact" + contacts[i].depth); 744 //m_log.Info("[PHYSICS]: Prim Water Contact" + contacts[i].depth);
@@ -806,7 +769,7 @@ namespace OpenSim.Region.Physics.OdePlugin
806 { 769 {
807 // If there are more then 3 contact points, it's likely 770 // If there are more then 3 contact points, it's likely
808 // that we've got a pile of objects 771 // that we've got a pile of objects
809 // 772 //
810 // We don't want to send out hundreds of terse updates over and over again 773 // We don't want to send out hundreds of terse updates over and over again
811 // so lets throttle them and send them again after it's somewhat sorted out. 774 // so lets throttle them and send them again after it's somewhat sorted out.
812 p2.ThrottleUpdates = true; 775 p2.ThrottleUpdates = true;
@@ -814,7 +777,6 @@ namespace OpenSim.Region.Physics.OdePlugin
814 //System.Console.WriteLine(count.ToString()); 777 //System.Console.WriteLine(count.ToString());
815 //System.Console.WriteLine("near: A collision was detected between {1} and {2}", 0, name1, name2); 778 //System.Console.WriteLine("near: A collision was detected between {1} and {2}", 0, name1, name2);
816 } 779 }
817
818 } 780 }
819 781
820 private void collision_accounting_events(PhysicsActor p1, PhysicsActor p2, float collisiondepth) 782 private void collision_accounting_events(PhysicsActor p1, PhysicsActor p2, float collisiondepth)
@@ -831,7 +793,7 @@ namespace OpenSim.Region.Physics.OdePlugin
831 { 793 {
832 case ActorTypes.Agent: 794 case ActorTypes.Agent:
833 cc2 = (OdeCharacter)p2; 795 cc2 = (OdeCharacter)p2;
834 796
835 obj1LocalID = cc2.m_localID; 797 obj1LocalID = cc2.m_localID;
836 switch ((ActorTypes)p1.PhysicsActorType) 798 switch ((ActorTypes)p1.PhysicsActorType)
837 { 799 {
@@ -840,7 +802,7 @@ namespace OpenSim.Region.Physics.OdePlugin
840 obj2LocalID = cc1.m_localID; 802 obj2LocalID = cc1.m_localID;
841 cc1.AddCollisionEvent(cc2.m_localID, collisiondepth); 803 cc1.AddCollisionEvent(cc2.m_localID, collisiondepth);
842 //ctype = (int)CollisionCategories.Character; 804 //ctype = (int)CollisionCategories.Character;
843 805
844 //if (cc1.CollidingObj) 806 //if (cc1.CollidingObj)
845 //cStartStop = (int)StatusIndicators.Generic; 807 //cStartStop = (int)StatusIndicators.Generic;
846 //else 808 //else
@@ -858,7 +820,7 @@ namespace OpenSim.Region.Physics.OdePlugin
858 //cStartStop = (int)StatusIndicators.Generic; 820 //cStartStop = (int)StatusIndicators.Generic;
859 //else 821 //else
860 //cStartStop = (int)StatusIndicators.Start; 822 //cStartStop = (int)StatusIndicators.Start;
861 823
862 //returncollisions = true; 824 //returncollisions = true;
863 break; 825 break;
864 826
@@ -869,14 +831,12 @@ namespace OpenSim.Region.Physics.OdePlugin
869 //returncollisions = true; 831 //returncollisions = true;
870 break; 832 break;
871 } 833 }
872
873 834
874
875 cc2.AddCollisionEvent(obj2LocalID, collisiondepth); 835 cc2.AddCollisionEvent(obj2LocalID, collisiondepth);
876 break; 836 break;
877 case ActorTypes.Prim: 837 case ActorTypes.Prim:
878 cp2 = (OdePrim)p2; 838 cp2 = (OdePrim)p2;
879 839
880 obj1LocalID = cp2.m_localID; 840 obj1LocalID = cp2.m_localID;
881 switch ((ActorTypes)p1.PhysicsActorType) 841 switch ((ActorTypes)p1.PhysicsActorType)
882 { 842 {
@@ -891,7 +851,7 @@ namespace OpenSim.Region.Physics.OdePlugin
891 //else 851 //else
892 //cStartStop = (int)StatusIndicators.Start; 852 //cStartStop = (int)StatusIndicators.Start;
893 //returncollisions = true; 853 //returncollisions = true;
894 854
895 break; 855 break;
896 case ActorTypes.Prim: 856 case ActorTypes.Prim:
897 cp1 = (OdePrim)p1; 857 cp1 = (OdePrim)p1;
@@ -903,7 +863,7 @@ namespace OpenSim.Region.Physics.OdePlugin
903 //cStartStop = (int)StatusIndicators.Generic; 863 //cStartStop = (int)StatusIndicators.Generic;
904 //else 864 //else
905 //cStartStop = (int)StatusIndicators.Start; 865 //cStartStop = (int)StatusIndicators.Start;
906 866
907 //returncollisions = true; 867 //returncollisions = true;
908 break; 868 break;
909 869
@@ -911,11 +871,11 @@ namespace OpenSim.Region.Physics.OdePlugin
911 case ActorTypes.Unknown: 871 case ActorTypes.Unknown:
912 obj2LocalID = 0; 872 obj2LocalID = 0;
913 //ctype = (int)CollisionCategories.Land; 873 //ctype = (int)CollisionCategories.Land;
914 874
915 //returncollisions = true; 875 //returncollisions = true;
916 break; 876 break;
917 } 877 }
918 878
919 cp2.AddCollisionEvent(obj2LocalID, collisiondepth); 879 cp2.AddCollisionEvent(obj2LocalID, collisiondepth);
920 break; 880 break;
921 } 881 }
@@ -999,7 +959,7 @@ namespace OpenSim.Region.Physics.OdePlugin
999 /// <param name="timeStep"></param> 959 /// <param name="timeStep"></param>
1000 private void collision_optimized(float timeStep) 960 private void collision_optimized(float timeStep)
1001 { 961 {
1002 962
1003 foreach (OdeCharacter chr in _characters) 963 foreach (OdeCharacter chr in _characters)
1004 { 964 {
1005 // Reset the collision values to false 965 // Reset the collision values to false
@@ -1008,7 +968,7 @@ namespace OpenSim.Region.Physics.OdePlugin
1008 chr.IsColliding = false; 968 chr.IsColliding = false;
1009 chr.CollidingGround = false; 969 chr.CollidingGround = false;
1010 chr.CollidingObj = false; 970 chr.CollidingObj = false;
1011 971
1012 // test the avatar's geometry for collision with the space 972 // test the avatar's geometry for collision with the space
1013 // This will return near and the space that they are the closest to 973 // This will return near and the space that they are the closest to
1014 // And we'll run this again against the avatar and the space segment 974 // And we'll run this again against the avatar and the space segment
@@ -1029,15 +989,11 @@ namespace OpenSim.Region.Physics.OdePlugin
1029 //forcedZ = true; 989 //forcedZ = true;
1030 //} 990 //}
1031 } 991 }
1032
1033 992
1034
1035 lock (_activeprims) 993 lock (_activeprims)
1036 { 994 {
1037
1038 foreach (OdePrim chr in _activeprims) 995 foreach (OdePrim chr in _activeprims)
1039 { 996 {
1040
1041 if (d.BodyIsEnabled(chr.Body) && (!chr.m_disabled)) 997 if (d.BodyIsEnabled(chr.Body) && (!chr.m_disabled))
1042 { 998 {
1043 try 999 try
@@ -1049,18 +1005,14 @@ namespace OpenSim.Region.Physics.OdePlugin
1049 else 1005 else
1050 m_log.Debug("[PHYSICS]: unable to collide test active prim against space. The space was zero, the geom was zero or it was in the process of being removed"); 1006 m_log.Debug("[PHYSICS]: unable to collide test active prim against space. The space was zero, the geom was zero or it was in the process of being removed");
1051 } 1007 }
1052
1053 } 1008 }
1054 catch (AccessViolationException) 1009 catch (AccessViolationException)
1055 { 1010 {
1056 m_log.Warn("[PHYSICS]: Unable to space collide"); 1011 m_log.Warn("[PHYSICS]: Unable to space collide");
1057 } 1012 }
1058
1059 } 1013 }
1060
1061 } 1014 }
1062 } 1015 }
1063
1064 } 1016 }
1065 1017
1066 #endregion 1018 #endregion
@@ -1077,7 +1029,6 @@ namespace OpenSim.Region.Physics.OdePlugin
1077 { 1029 {
1078 if (!_collisionEventPrim.Contains(obj)) 1030 if (!_collisionEventPrim.Contains(obj))
1079 _collisionEventPrim.Add(obj); 1031 _collisionEventPrim.Add(obj);
1080
1081 } 1032 }
1082 } 1033 }
1083 1034
@@ -1090,7 +1041,6 @@ namespace OpenSim.Region.Physics.OdePlugin
1090 } 1041 }
1091 } 1042 }
1092 1043
1093
1094 #region Add/Remove Entities 1044 #region Add/Remove Entities
1095 1045
1096 public override PhysicsActor AddAvatar(string avName, PhysicsVector position, PhysicsVector size) 1046 public override PhysicsActor AddAvatar(string avName, PhysicsVector position, PhysicsVector size)
@@ -1131,8 +1081,6 @@ namespace OpenSim.Region.Physics.OdePlugin
1131 rot.y = rotation.y; 1081 rot.y = rotation.y;
1132 rot.z = rotation.z; 1082 rot.z = rotation.z;
1133 1083
1134
1135
1136 OdePrim newPrim; 1084 OdePrim newPrim;
1137 lock (OdeLock) 1085 lock (OdeLock)
1138 { 1086 {
@@ -1141,7 +1089,6 @@ namespace OpenSim.Region.Physics.OdePlugin
1141 _prims.Add(newPrim); 1089 _prims.Add(newPrim);
1142 } 1090 }
1143 1091
1144
1145 return newPrim; 1092 return newPrim;
1146 } 1093 }
1147 1094
@@ -1178,11 +1125,9 @@ namespace OpenSim.Region.Physics.OdePlugin
1178 1125
1179 result = AddPrim(primName, position, size, rotation, mesh, pbs, isPhysical); 1126 result = AddPrim(primName, position, size, rotation, mesh, pbs, isPhysical);
1180 1127
1181
1182 return result; 1128 return result;
1183 } 1129 }
1184 1130
1185
1186 public void remActivePrim(OdePrim deactivatePrim) 1131 public void remActivePrim(OdePrim deactivatePrim)
1187 { 1132 {
1188 lock (_activeprims) 1133 lock (_activeprims)
@@ -1210,8 +1155,8 @@ namespace OpenSim.Region.Physics.OdePlugin
1210 /// This is called from within simulate but outside the locked portion 1155 /// This is called from within simulate but outside the locked portion
1211 /// We need to do our own locking here 1156 /// We need to do our own locking here
1212 /// Essentially, we need to remove the prim from our space segment, whatever segment it's in. 1157 /// Essentially, we need to remove the prim from our space segment, whatever segment it's in.
1213 /// 1158 ///
1214 /// If there are no more prim in the segment, we need to empty (spacedestroy)the segment and reclaim memory 1159 /// If there are no more prim in the segment, we need to empty (spacedestroy)the segment and reclaim memory
1215 /// that the space was using. 1160 /// that the space was using.
1216 /// </summary> 1161 /// </summary>
1217 /// <param name="prim"></param> 1162 /// <param name="prim"></param>
@@ -1226,7 +1171,6 @@ namespace OpenSim.Region.Physics.OdePlugin
1226 { 1171 {
1227 prim.ResetTaints(); 1172 prim.ResetTaints();
1228 1173
1229
1230 if (prim.IsPhysical) 1174 if (prim.IsPhysical)
1231 { 1175 {
1232 prim.disableBody(); 1176 prim.disableBody();
@@ -1267,7 +1211,6 @@ namespace OpenSim.Region.Physics.OdePlugin
1267 { 1211 {
1268 m_log.Warn("[PHYSICS]: Unable to remove prim from physics scene"); 1212 m_log.Warn("[PHYSICS]: Unable to remove prim from physics scene");
1269 } 1213 }
1270
1271 } 1214 }
1272 catch (AccessViolationException) 1215 catch (AccessViolationException)
1273 { 1216 {
@@ -1297,8 +1240,6 @@ namespace OpenSim.Region.Physics.OdePlugin
1297 //} 1240 //}
1298 //} 1241 //}
1299 } 1242 }
1300
1301
1302 } 1243 }
1303 } 1244 }
1304 } 1245 }
@@ -1337,12 +1278,11 @@ namespace OpenSim.Region.Physics.OdePlugin
1337 /// <returns>a pointer to the new space it's in</returns> 1278 /// <returns>a pointer to the new space it's in</returns>
1338 public IntPtr recalculateSpaceForGeom(IntPtr geom, PhysicsVector pos, IntPtr currentspace) 1279 public IntPtr recalculateSpaceForGeom(IntPtr geom, PhysicsVector pos, IntPtr currentspace)
1339 { 1280 {
1340 1281 // Called from setting the Position and Size of an ODEPrim so
1341 // Called from setting the Position and Size of an ODEPrim so
1342 // it's already in locked space. 1282 // it's already in locked space.
1343 1283
1344 // we don't want to remove the main space 1284 // we don't want to remove the main space
1345 // we don't need to test physical here because this function should 1285 // we don't need to test physical here because this function should
1346 // never be called if the prim is physical(active) 1286 // never be called if the prim is physical(active)
1347 1287
1348 // All physical prim end up in the root space 1288 // All physical prim end up in the root space
@@ -1399,7 +1339,7 @@ namespace OpenSim.Region.Physics.OdePlugin
1399 waitForSpaceUnlock(space); 1339 waitForSpaceUnlock(space);
1400 d.SpaceRemove(space, currentspace); 1340 d.SpaceRemove(space, currentspace);
1401 // free up memory used by the space. 1341 // free up memory used by the space.
1402 1342
1403 //d.SpaceDestroy(currentspace); 1343 //d.SpaceDestroy(currentspace);
1404 resetSpaceArrayItemToZero(currentspace); 1344 resetSpaceArrayItemToZero(currentspace);
1405 } 1345 }
@@ -1418,7 +1358,6 @@ namespace OpenSim.Region.Physics.OdePlugin
1418 { 1358 {
1419 if (d.SpaceQuery(currentspace, geom)) 1359 if (d.SpaceQuery(currentspace, geom))
1420 { 1360 {
1421
1422 if (d.GeomIsSpace(currentspace)) 1361 if (d.GeomIsSpace(currentspace))
1423 { 1362 {
1424 waitForSpaceUnlock(currentspace); 1363 waitForSpaceUnlock(currentspace);
@@ -1453,8 +1392,8 @@ namespace OpenSim.Region.Physics.OdePlugin
1453 } 1392 }
1454 } 1393 }
1455 1394
1456 // The routines in the Position and Size sections do the 'inserting' into the space, 1395 // The routines in the Position and Size sections do the 'inserting' into the space,
1457 // so all we have to do is make sure that the space that we're putting the prim into 1396 // so all we have to do is make sure that the space that we're putting the prim into
1458 // is in the 'main' space. 1397 // is in the 'main' space.
1459 int[] iprimspaceArrItem = calculateSpaceArrayItemFromPos(pos); 1398 int[] iprimspaceArrItem = calculateSpaceArrayItemFromPos(pos);
1460 IntPtr newspace = calculateSpaceForGeom(pos); 1399 IntPtr newspace = calculateSpaceForGeom(pos);
@@ -1492,11 +1431,11 @@ namespace OpenSim.Region.Physics.OdePlugin
1492 public IntPtr calculateSpaceForGeom(PhysicsVector pos) 1431 public IntPtr calculateSpaceForGeom(PhysicsVector pos)
1493 { 1432 {
1494 IntPtr locationbasedspace =IntPtr.Zero; 1433 IntPtr locationbasedspace =IntPtr.Zero;
1495 1434
1496 int[] xyspace = calculateSpaceArrayItemFromPos(pos); 1435 int[] xyspace = calculateSpaceArrayItemFromPos(pos);
1497 //m_log.Info("[Physics]: Attempting to use arrayItem: " + xyspace[0].ToString() + "," + xyspace[1].ToString()); 1436 //m_log.Info("[Physics]: Attempting to use arrayItem: " + xyspace[0].ToString() + "," + xyspace[1].ToString());
1498 locationbasedspace = staticPrimspace[xyspace[0], xyspace[1]]; 1437 locationbasedspace = staticPrimspace[xyspace[0], xyspace[1]];
1499 1438
1500 //locationbasedspace = space; 1439 //locationbasedspace = space;
1501 return locationbasedspace; 1440 return locationbasedspace;
1502 } 1441 }
@@ -1523,13 +1462,10 @@ namespace OpenSim.Region.Physics.OdePlugin
1523 if (returnint[1] < 0) 1462 if (returnint[1] < 0)
1524 returnint[1] = 0; 1463 returnint[1] = 0;
1525 1464
1526
1527 return returnint; 1465 return returnint;
1528 } 1466 }
1529 #endregion
1530
1531
1532 1467
1468 #endregion
1533 1469
1534 /// <summary> 1470 /// <summary>
1535 /// Routine to figure out if we need to mesh this prim with our mesher 1471 /// Routine to figure out if we need to mesh this prim with our mesher
@@ -1564,7 +1500,6 @@ namespace OpenSim.Region.Physics.OdePlugin
1564 return false; 1500 return false;
1565 } 1501 }
1566 1502
1567
1568 /// <summary> 1503 /// <summary>
1569 /// Called after our prim properties are set Scale, position etc. 1504 /// Called after our prim properties are set Scale, position etc.
1570 /// We use this event queue like method to keep changes to the physical scene occuring in the threadlocked mutex 1505 /// We use this event queue like method to keep changes to the physical scene occuring in the threadlocked mutex
@@ -1586,7 +1521,7 @@ namespace OpenSim.Region.Physics.OdePlugin
1586 1521
1587 /// <summary> 1522 /// <summary>
1588 /// This is our main simulate loop 1523 /// This is our main simulate loop
1589 /// It's thread locked by a Mutex in the scene. 1524 /// It's thread locked by a Mutex in the scene.
1590 /// It holds Collisions, it instructs ODE to step through the physical reactions 1525 /// It holds Collisions, it instructs ODE to step through the physical reactions
1591 /// It moves the objects around in memory 1526 /// It moves the objects around in memory
1592 /// It calls the methods that report back to the object owners.. (scenepresence, SceneObjectGroup) 1527 /// It calls the methods that report back to the object owners.. (scenepresence, SceneObjectGroup)
@@ -1597,7 +1532,7 @@ namespace OpenSim.Region.Physics.OdePlugin
1597 { 1532 {
1598 if (framecount >= int.MaxValue) 1533 if (framecount >= int.MaxValue)
1599 framecount = 0; 1534 framecount = 0;
1600 1535
1601 framecount++; 1536 framecount++;
1602 1537
1603 float fps = 0; 1538 float fps = 0;
@@ -1605,12 +1540,11 @@ namespace OpenSim.Region.Physics.OdePlugin
1605 step_time += timeStep; 1540 step_time += timeStep;
1606 1541
1607 1542
1608 // If We're loaded down by something else, 1543 // If We're loaded down by something else,
1609 // or debugging with the Visual Studio project on pause 1544 // or debugging with the Visual Studio project on pause
1610 // skip a few frames to catch up gracefully. 1545 // skip a few frames to catch up gracefully.
1611 // without shooting the physicsactors all over the place 1546 // without shooting the physicsactors all over the place
1612 1547
1613
1614 if (step_time >= m_SkipFramesAtms) 1548 if (step_time >= m_SkipFramesAtms)
1615 { 1549 {
1616 // Instead of trying to catch up, it'll do 5 physics frames only 1550 // Instead of trying to catch up, it'll do 5 physics frames only
@@ -1623,7 +1557,7 @@ namespace OpenSim.Region.Physics.OdePlugin
1623 } 1557 }
1624 lock (OdeLock) 1558 lock (OdeLock)
1625 { 1559 {
1626 // Process 10 frames if the sim is running normal.. 1560 // Process 10 frames if the sim is running normal..
1627 // process 5 frames if the sim is running slow 1561 // process 5 frames if the sim is running slow
1628 //try 1562 //try
1629 //{ 1563 //{
@@ -1642,13 +1576,13 @@ namespace OpenSim.Region.Physics.OdePlugin
1642 //(step_time == 0.004f, there's 250 of those per second. Times the step time/step size 1576 //(step_time == 0.004f, there's 250 of those per second. Times the step time/step size
1643 step_time = 0.09375f; 1577 step_time = 0.09375f;
1644 fps = (step_time/ODE_STEPSIZE) * 1000; 1578 fps = (step_time/ODE_STEPSIZE) * 1000;
1645 1579
1646 while (step_time > 0.0f) 1580 while (step_time > 0.0f)
1647 { 1581 {
1648 //lock (ode) 1582 //lock (ode)
1649 //{ 1583 //{
1650 //if (!ode.lockquery()) 1584 //if (!ode.lockquery())
1651 //{ 1585 //{
1652 // ode.dlock(world); 1586 // ode.dlock(world);
1653 try 1587 try
1654 { 1588 {
@@ -1661,9 +1595,8 @@ namespace OpenSim.Region.Physics.OdePlugin
1661 } 1595 }
1662 } 1596 }
1663 1597
1664
1665 bool processedtaints = false; 1598 bool processedtaints = false;
1666 1599
1667 lock (_taintedPrim) 1600 lock (_taintedPrim)
1668 { 1601 {
1669 foreach (OdePrim prim in _taintedPrim) 1602 foreach (OdePrim prim in _taintedPrim)
@@ -1679,10 +1612,9 @@ namespace OpenSim.Region.Physics.OdePlugin
1679 processedtaints = true; 1612 processedtaints = true;
1680 prim.m_collisionscore = 0; 1613 prim.m_collisionscore = 0;
1681 } 1614 }
1682 1615
1683 if (processedtaints) 1616 if (processedtaints)
1684 _taintedPrim = new List<OdePrim>(); 1617 _taintedPrim = new List<OdePrim>();
1685
1686 } 1618 }
1687 1619
1688 lock (_activeprims) 1620 lock (_activeprims)
@@ -1696,7 +1628,6 @@ namespace OpenSim.Region.Physics.OdePlugin
1696 1628
1697 //if ((framecount % m_randomizeWater) == 0) 1629 //if ((framecount % m_randomizeWater) == 0)
1698 // randomizeWater(waterlevel); 1630 // randomizeWater(waterlevel);
1699
1700 1631
1701 collision_optimized(timeStep); 1632 collision_optimized(timeStep);
1702 1633
@@ -1718,7 +1649,6 @@ namespace OpenSim.Region.Physics.OdePlugin
1718 pobj.SendCollisions(); 1649 pobj.SendCollisions();
1719 break; 1650 break;
1720 } 1651 }
1721
1722 } 1652 }
1723 } 1653 }
1724 1654
@@ -1726,13 +1656,13 @@ namespace OpenSim.Region.Physics.OdePlugin
1726 1656
1727 d.JointGroupEmpty(contactgroup); 1657 d.JointGroupEmpty(contactgroup);
1728 //ode.dunlock(world); 1658 //ode.dunlock(world);
1729 } 1659 }
1730 catch (Exception e) 1660 catch (Exception e)
1731 { 1661 {
1732 m_log.Error("[PHYSICS]: " + e.Message.ToString() + e.TargetSite.ToString()); 1662 m_log.Error("[PHYSICS]: " + e.Message.ToString() + e.TargetSite.ToString());
1733 ode.dunlock(world); 1663 ode.dunlock(world);
1734 } 1664 }
1735 1665
1736 step_time -= ODE_STEPSIZE; 1666 step_time -= ODE_STEPSIZE;
1737 i++; 1667 i++;
1738 //} 1668 //}
@@ -1765,7 +1695,6 @@ namespace OpenSim.Region.Physics.OdePlugin
1765 } 1695 }
1766 } 1696 }
1767 } 1697 }
1768
1769 } 1698 }
1770 return fps; 1699 return fps;
1771 } 1700 }
@@ -1780,7 +1709,7 @@ namespace OpenSim.Region.Physics.OdePlugin
1780 get { return (false); } 1709 get { return (false); }
1781 } 1710 }
1782 1711
1783 #region ODE Specific Terrain Fixes 1712 #region ODE Specific Terrain Fixes
1784 public float[] ResizeTerrain512NearestNeighbour(float[] heightMap) 1713 public float[] ResizeTerrain512NearestNeighbour(float[] heightMap)
1785 { 1714 {
1786 float[] returnarr = new float[262144]; 1715 float[] returnarr = new float[262144];
@@ -1800,7 +1729,7 @@ namespace OpenSim.Region.Physics.OdePlugin
1800 // This particular way is quick but it only works on a multiple of the original 1729 // This particular way is quick but it only works on a multiple of the original
1801 1730
1802 // The idea behind this method can be described with the following diagrams 1731 // The idea behind this method can be described with the following diagrams
1803 // second pass and third pass happen in the same loop really.. just separated 1732 // second pass and third pass happen in the same loop really.. just separated
1804 // them to show what this does. 1733 // them to show what this does.
1805 1734
1806 // First Pass 1735 // First Pass
@@ -1893,6 +1822,7 @@ namespace OpenSim.Region.Physics.OdePlugin
1893 1822
1894 return returnarr; 1823 return returnarr;
1895 } 1824 }
1825
1896 public float[] ResizeTerrain512Interpolation(float[] heightMap) 1826 public float[] ResizeTerrain512Interpolation(float[] heightMap)
1897 { 1827 {
1898 float[] returnarr = new float[262144]; 1828 float[] returnarr = new float[262144];
@@ -1912,7 +1842,7 @@ namespace OpenSim.Region.Physics.OdePlugin
1912 // This particular way is quick but it only works on a multiple of the original 1842 // This particular way is quick but it only works on a multiple of the original
1913 1843
1914 // The idea behind this method can be described with the following diagrams 1844 // The idea behind this method can be described with the following diagrams
1915 // second pass and third pass happen in the same loop really.. just separated 1845 // second pass and third pass happen in the same loop really.. just separated
1916 // them to show what this does. 1846 // them to show what this does.
1917 1847
1918 // First Pass 1848 // First Pass
@@ -2139,7 +2069,6 @@ namespace OpenSim.Region.Physics.OdePlugin
2139 // m_log.Info((baseheight - 0.1f) + ((float)fluidRandomizer.Next(1, 9) / 10f)); 2069 // m_log.Info((baseheight - 0.1f) + ((float)fluidRandomizer.Next(1, 9) / 10f));
2140 } 2070 }
2141 2071
2142
2143 lock (OdeLock) 2072 lock (OdeLock)
2144 { 2073 {
2145 if (!(WaterGeom == (IntPtr)0)) 2074 if (!(WaterGeom == (IntPtr)0))
@@ -2183,7 +2112,6 @@ namespace OpenSim.Region.Physics.OdePlugin
2183 { 2112 {
2184 lock (OdeLock) 2113 lock (OdeLock)
2185 { 2114 {
2186
2187 foreach (OdePrim prm in _prims) 2115 foreach (OdePrim prm in _prims)
2188 { 2116 {
2189 RemovePrim(prm); 2117 RemovePrim(prm);