aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs26
-rw-r--r--OpenSim/Region/Physics/BulletSPlugin/BSScene.cs95
2 files changed, 20 insertions, 101 deletions
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs b/OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs
index d137b2a..26b8df5 100644
--- a/OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs
+++ b/OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs
@@ -465,15 +465,18 @@ public sealed class BSPrim : BSPhysObject
465 set { 465 set {
466 Vehicle type = (Vehicle)value; 466 Vehicle type = (Vehicle)value;
467 467
468 // Tell the scene about the vehicle so it will get processing each frame.
469 PhysicsScene.VehicleInSceneTypeChanged(this, type);
470
471 PhysicsScene.TaintedObject("setVehicleType", delegate() 468 PhysicsScene.TaintedObject("setVehicleType", delegate()
472 { 469 {
473 // Done at taint time so we're sure the physics engine is not using the variables 470 // Done at taint time so we're sure the physics engine is not using the variables
474 // Vehicle code changes the parameters for this vehicle type. 471 // Vehicle code changes the parameters for this vehicle type.
475 _vehicle.ProcessTypeChange(type); 472 _vehicle.ProcessTypeChange(type);
476 ActivateIfPhysical(false); 473 ActivateIfPhysical(false);
474
475 // If an active vehicle, register the vehicle code to be called before each step
476 if (_vehicle.Type == Vehicle.TYPE_NONE)
477 UnRegisterPreStepAction("BSPrim.Vehicle", LocalID);
478 else
479 RegisterPreStepAction("BSPrim.Vehicle", LocalID, _vehicle.Step);
477 }); 480 });
478 } 481 }
479 } 482 }
@@ -509,23 +512,6 @@ public sealed class BSPrim : BSPhysObject
509 }); 512 });
510 } 513 }
511 514
512 // Called each simulation step to advance vehicle characteristics.
513 // Called from Scene when doing simulation step so we're in taint processing time.
514 public override void StepVehicle(float timeStep)
515 {
516 if (IsPhysical && _vehicle.IsActive)
517 {
518 _vehicle.Step(timeStep);
519 /* // TEST TEST DEBUG DEBUG -- trying to reduce the extra action of Bullet simulation step
520 PhysicsScene.PostTaintObject("BSPrim.StepVehicles", LocalID, delegate()
521 {
522 // This resets the interpolation values and recomputes the tensor variables
523 BulletSimAPI.SetCenterOfMassByPosRot2(BSBody.ptr, ForcePosition, ForceOrientation);
524 });
525 */
526 }
527 }
528
529 // Allows the detection of collisions with inherently non-physical prims. see llVolumeDetect for more 515 // Allows the detection of collisions with inherently non-physical prims. see llVolumeDetect for more
530 public override void SetVolumeDetect(int param) { 516 public override void SetVolumeDetect(int param) {
531 bool newValue = (param != 0); 517 bool newValue = (param != 0);
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSScene.cs b/OpenSim/Region/Physics/BulletSPlugin/BSScene.cs
index eb47178..3a129a4 100644
--- a/OpenSim/Region/Physics/BulletSPlugin/BSScene.cs
+++ b/OpenSim/Region/Physics/BulletSPlugin/BSScene.cs
@@ -69,10 +69,6 @@ public sealed class BSScene : PhysicsScene, IPhysicsParameters
69 // every tick so OpenSim will update its animation. 69 // every tick so OpenSim will update its animation.
70 private HashSet<BSPhysObject> m_avatars = new HashSet<BSPhysObject>(); 70 private HashSet<BSPhysObject> m_avatars = new HashSet<BSPhysObject>();
71 71
72 // List of all the objects that have vehicle properties and should be called
73 // to update each physics step.
74 private List<BSPhysObject> m_vehicles = new List<BSPhysObject>();
75
76 // let my minuions use my logger 72 // let my minuions use my logger
77 public ILog Logger { get { return m_log; } } 73 public ILog Logger { get { return m_log; } }
78 74
@@ -480,21 +476,25 @@ public sealed class BSScene : PhysicsScene, IPhysicsParameters
480 476
481 // update the prim states while we know the physics engine is not busy 477 // update the prim states while we know the physics engine is not busy
482 int numTaints = _taintOperations.Count; 478 int numTaints = _taintOperations.Count;
479
480 InTaintTime = true; // Only used for debugging so locking is not necessary.
481
483 ProcessTaints(); 482 ProcessTaints();
484 483
485 // Some of the prims operate with special vehicle properties 484 // Some of the physical objects requre individual, pre-step calls
486 DoPreStepActions(timeStep); 485 DoPreStepActions(timeStep);
487 486
488 // the prestep actions might have added taints 487 // the prestep actions might have added taints
489 ProcessTaints(); 488 ProcessTaints();
490 489
490 InTaintTime = false; // Only used for debugging so locking is not necessary.
491
491 // step the physical world one interval 492 // step the physical world one interval
492 m_simulationStep++; 493 m_simulationStep++;
493 int numSubSteps = 0; 494 int numSubSteps = 0;
494 495
495 try 496 try
496 { 497 {
497 if (VehiclePhysicalLoggingEnabled) DumpVehicles(); // DEBUG
498 if (PhysicsLogging.Enabled) beforeTime = Util.EnvironmentTickCount(); 498 if (PhysicsLogging.Enabled) beforeTime = Util.EnvironmentTickCount();
499 499
500 numSubSteps = BulletSimAPI.PhysicsStep2(World.ptr, timeStep, m_maxSubSteps, m_fixedTimeStep, 500 numSubSteps = BulletSimAPI.PhysicsStep2(World.ptr, timeStep, m_maxSubSteps, m_fixedTimeStep,
@@ -504,7 +504,6 @@ public sealed class BSScene : PhysicsScene, IPhysicsParameters
504 DetailLog("{0},Simulate,call, frame={1}, nTaints={2}, simTime={3}, substeps={4}, updates={5}, colliders={6}, objWColl={7}", 504 DetailLog("{0},Simulate,call, frame={1}, nTaints={2}, simTime={3}, substeps={4}, updates={5}, colliders={6}, objWColl={7}",
505 DetailLogZero, m_simulationStep, numTaints, simTime, numSubSteps, 505 DetailLogZero, m_simulationStep, numTaints, simTime, numSubSteps,
506 updatedEntityCount, collidersCount, ObjectsWithCollisions.Count); 506 updatedEntityCount, collidersCount, ObjectsWithCollisions.Count);
507 if (VehiclePhysicalLoggingEnabled) DumpVehicles(); // DEBUG
508 } 507 }
509 catch (Exception e) 508 catch (Exception e)
510 { 509 {
@@ -701,15 +700,21 @@ public sealed class BSScene : PhysicsScene, IPhysicsParameters
701 TaintedObject(ident, callback); 700 TaintedObject(ident, callback);
702 } 701 }
703 702
703 private void DoPreStepActions(float timeStep)
704 {
705 PreStepAction actions = BeforeStep;
706 if (actions != null)
707 actions(timeStep);
708
709 }
710
704 // When someone tries to change a property on a BSPrim or BSCharacter, the object queues 711 // When someone tries to change a property on a BSPrim or BSCharacter, the object queues
705 // a callback into itself to do the actual property change. That callback is called 712 // a callback into itself to do the actual property change. That callback is called
706 // here just before the physics engine is called to step the simulation. 713 // here just before the physics engine is called to step the simulation.
707 public void ProcessTaints() 714 public void ProcessTaints()
708 { 715 {
709 InTaintTime = true; // Only used for debugging so locking is not necessary.
710 ProcessRegularTaints(); 716 ProcessRegularTaints();
711 ProcessPostTaintTaints(); 717 ProcessPostTaintTaints();
712 InTaintTime = false;
713 } 718 }
714 719
715 private void ProcessRegularTaints() 720 private void ProcessRegularTaints()
@@ -871,68 +876,6 @@ public sealed class BSScene : PhysicsScene, IPhysicsParameters
871 876
872 #endregion // Taints 877 #endregion // Taints
873 878
874 #region Vehicles
875
876 public void VehicleInSceneTypeChanged(BSPrim vehic, Vehicle newType)
877 {
878 RemoveVehiclePrim(vehic);
879 if (newType != Vehicle.TYPE_NONE)
880 {
881 // make it so the scene will call us each tick to do vehicle things
882 AddVehiclePrim(vehic);
883 }
884 }
885
886 // Make so the scene will call this prim for vehicle actions each tick.
887 // Safe to call if prim is already in the vehicle list.
888 public void AddVehiclePrim(BSPrim vehicle)
889 {
890 lock (m_vehicles)
891 {
892 if (!m_vehicles.Contains(vehicle))
893 {
894 m_vehicles.Add(vehicle);
895 }
896 }
897 }
898
899 // Remove a prim from our list of vehicles.
900 // Safe to call if the prim is not in the vehicle list.
901 public void RemoveVehiclePrim(BSPrim vehicle)
902 {
903 lock (m_vehicles)
904 {
905 if (m_vehicles.Contains(vehicle))
906 {
907 m_vehicles.Remove(vehicle);
908 }
909 }
910 }
911
912 private void DoPreStepActions(float timeStep)
913 {
914 InTaintTime = true; // Only used for debugging so locking is not necessary.
915 ProcessVehicles(timeStep);
916
917 PreStepAction actions = BeforeStep;
918 if (actions != null)
919 actions(timeStep);
920
921 InTaintTime = false;
922
923 }
924
925 // Some prims have extra vehicle actions
926 // Called at taint time!
927 private void ProcessVehicles(float timeStep)
928 {
929 foreach (BSPhysObject pobj in m_vehicles)
930 {
931 pobj.StepVehicle(timeStep);
932 }
933 }
934 #endregion Vehicles
935
936 #region INI and command line parameter processing 879 #region INI and command line parameter processing
937 880
938 #region IPhysicsParameters 881 #region IPhysicsParameters
@@ -1033,16 +976,6 @@ public sealed class BSScene : PhysicsScene, IPhysicsParameters
1033 976
1034 #endregion Runtime settable parameters 977 #endregion Runtime settable parameters
1035 978
1036 // Debugging routine for dumping detailed physical information for vehicle prims
1037 private void DumpVehicles()
1038 {
1039 foreach (BSPrim prim in m_vehicles)
1040 {
1041 BulletSimAPI.DumpRigidBody2(World.ptr, prim.PhysBody.ptr);
1042 BulletSimAPI.DumpCollisionShape2(World.ptr, prim.PhysShape.ptr);
1043 }
1044 }
1045
1046 // Invoke the detailed logger and output something if it's enabled. 979 // Invoke the detailed logger and output something if it's enabled.
1047 public void DetailLog(string msg, params Object[] args) 980 public void DetailLog(string msg, params Object[] args)
1048 { 981 {