BulletSim: remove all special vehicle code from BSScene. Replace per-frame updates for vehicles with per-frame action registration. One fewer special case.

0.7.5-pf-bulletsim
Robert Adams 2012-12-21 23:24:31 -08:00
parent a54392d7cc
commit 5b2cbc0ae6
2 changed files with 20 additions and 101 deletions

View File

@ -465,15 +465,18 @@ public sealed class BSPrim : BSPhysObject
set { set {
Vehicle type = (Vehicle)value; Vehicle type = (Vehicle)value;
// Tell the scene about the vehicle so it will get processing each frame.
PhysicsScene.VehicleInSceneTypeChanged(this, type);
PhysicsScene.TaintedObject("setVehicleType", delegate() PhysicsScene.TaintedObject("setVehicleType", delegate()
{ {
// Done at taint time so we're sure the physics engine is not using the variables // Done at taint time so we're sure the physics engine is not using the variables
// Vehicle code changes the parameters for this vehicle type. // Vehicle code changes the parameters for this vehicle type.
_vehicle.ProcessTypeChange(type); _vehicle.ProcessTypeChange(type);
ActivateIfPhysical(false); ActivateIfPhysical(false);
// If an active vehicle, register the vehicle code to be called before each step
if (_vehicle.Type == Vehicle.TYPE_NONE)
UnRegisterPreStepAction("BSPrim.Vehicle", LocalID);
else
RegisterPreStepAction("BSPrim.Vehicle", LocalID, _vehicle.Step);
}); });
} }
} }
@ -509,23 +512,6 @@ public sealed class BSPrim : BSPhysObject
}); });
} }
// Called each simulation step to advance vehicle characteristics.
// Called from Scene when doing simulation step so we're in taint processing time.
public override void StepVehicle(float timeStep)
{
if (IsPhysical && _vehicle.IsActive)
{
_vehicle.Step(timeStep);
/* // TEST TEST DEBUG DEBUG -- trying to reduce the extra action of Bullet simulation step
PhysicsScene.PostTaintObject("BSPrim.StepVehicles", LocalID, delegate()
{
// This resets the interpolation values and recomputes the tensor variables
BulletSimAPI.SetCenterOfMassByPosRot2(BSBody.ptr, ForcePosition, ForceOrientation);
});
*/
}
}
// Allows the detection of collisions with inherently non-physical prims. see llVolumeDetect for more // Allows the detection of collisions with inherently non-physical prims. see llVolumeDetect for more
public override void SetVolumeDetect(int param) { public override void SetVolumeDetect(int param) {
bool newValue = (param != 0); bool newValue = (param != 0);

View File

@ -69,10 +69,6 @@ public sealed class BSScene : PhysicsScene, IPhysicsParameters
// every tick so OpenSim will update its animation. // every tick so OpenSim will update its animation.
private HashSet<BSPhysObject> m_avatars = new HashSet<BSPhysObject>(); private HashSet<BSPhysObject> m_avatars = new HashSet<BSPhysObject>();
// List of all the objects that have vehicle properties and should be called
// to update each physics step.
private List<BSPhysObject> m_vehicles = new List<BSPhysObject>();
// let my minuions use my logger // let my minuions use my logger
public ILog Logger { get { return m_log; } } public ILog Logger { get { return m_log; } }
@ -480,21 +476,25 @@ public sealed class BSScene : PhysicsScene, IPhysicsParameters
// update the prim states while we know the physics engine is not busy // update the prim states while we know the physics engine is not busy
int numTaints = _taintOperations.Count; int numTaints = _taintOperations.Count;
InTaintTime = true; // Only used for debugging so locking is not necessary.
ProcessTaints(); ProcessTaints();
// Some of the prims operate with special vehicle properties // Some of the physical objects requre individual, pre-step calls
DoPreStepActions(timeStep); DoPreStepActions(timeStep);
// the prestep actions might have added taints // the prestep actions might have added taints
ProcessTaints(); ProcessTaints();
InTaintTime = false; // Only used for debugging so locking is not necessary.
// step the physical world one interval // step the physical world one interval
m_simulationStep++; m_simulationStep++;
int numSubSteps = 0; int numSubSteps = 0;
try try
{ {
if (VehiclePhysicalLoggingEnabled) DumpVehicles(); // DEBUG
if (PhysicsLogging.Enabled) beforeTime = Util.EnvironmentTickCount(); if (PhysicsLogging.Enabled) beforeTime = Util.EnvironmentTickCount();
numSubSteps = BulletSimAPI.PhysicsStep2(World.ptr, timeStep, m_maxSubSteps, m_fixedTimeStep, numSubSteps = BulletSimAPI.PhysicsStep2(World.ptr, timeStep, m_maxSubSteps, m_fixedTimeStep,
@ -504,7 +504,6 @@ public sealed class BSScene : PhysicsScene, IPhysicsParameters
DetailLog("{0},Simulate,call, frame={1}, nTaints={2}, simTime={3}, substeps={4}, updates={5}, colliders={6}, objWColl={7}", DetailLog("{0},Simulate,call, frame={1}, nTaints={2}, simTime={3}, substeps={4}, updates={5}, colliders={6}, objWColl={7}",
DetailLogZero, m_simulationStep, numTaints, simTime, numSubSteps, DetailLogZero, m_simulationStep, numTaints, simTime, numSubSteps,
updatedEntityCount, collidersCount, ObjectsWithCollisions.Count); updatedEntityCount, collidersCount, ObjectsWithCollisions.Count);
if (VehiclePhysicalLoggingEnabled) DumpVehicles(); // DEBUG
} }
catch (Exception e) catch (Exception e)
{ {
@ -701,15 +700,21 @@ public sealed class BSScene : PhysicsScene, IPhysicsParameters
TaintedObject(ident, callback); TaintedObject(ident, callback);
} }
private void DoPreStepActions(float timeStep)
{
PreStepAction actions = BeforeStep;
if (actions != null)
actions(timeStep);
}
// When someone tries to change a property on a BSPrim or BSCharacter, the object queues // When someone tries to change a property on a BSPrim or BSCharacter, the object queues
// a callback into itself to do the actual property change. That callback is called // a callback into itself to do the actual property change. That callback is called
// here just before the physics engine is called to step the simulation. // here just before the physics engine is called to step the simulation.
public void ProcessTaints() public void ProcessTaints()
{ {
InTaintTime = true; // Only used for debugging so locking is not necessary.
ProcessRegularTaints(); ProcessRegularTaints();
ProcessPostTaintTaints(); ProcessPostTaintTaints();
InTaintTime = false;
} }
private void ProcessRegularTaints() private void ProcessRegularTaints()
@ -871,68 +876,6 @@ public sealed class BSScene : PhysicsScene, IPhysicsParameters
#endregion // Taints #endregion // Taints
#region Vehicles
public void VehicleInSceneTypeChanged(BSPrim vehic, Vehicle newType)
{
RemoveVehiclePrim(vehic);
if (newType != Vehicle.TYPE_NONE)
{
// make it so the scene will call us each tick to do vehicle things
AddVehiclePrim(vehic);
}
}
// Make so the scene will call this prim for vehicle actions each tick.
// Safe to call if prim is already in the vehicle list.
public void AddVehiclePrim(BSPrim vehicle)
{
lock (m_vehicles)
{
if (!m_vehicles.Contains(vehicle))
{
m_vehicles.Add(vehicle);
}
}
}
// Remove a prim from our list of vehicles.
// Safe to call if the prim is not in the vehicle list.
public void RemoveVehiclePrim(BSPrim vehicle)
{
lock (m_vehicles)
{
if (m_vehicles.Contains(vehicle))
{
m_vehicles.Remove(vehicle);
}
}
}
private void DoPreStepActions(float timeStep)
{
InTaintTime = true; // Only used for debugging so locking is not necessary.
ProcessVehicles(timeStep);
PreStepAction actions = BeforeStep;
if (actions != null)
actions(timeStep);
InTaintTime = false;
}
// Some prims have extra vehicle actions
// Called at taint time!
private void ProcessVehicles(float timeStep)
{
foreach (BSPhysObject pobj in m_vehicles)
{
pobj.StepVehicle(timeStep);
}
}
#endregion Vehicles
#region INI and command line parameter processing #region INI and command line parameter processing
#region IPhysicsParameters #region IPhysicsParameters
@ -1033,16 +976,6 @@ public sealed class BSScene : PhysicsScene, IPhysicsParameters
#endregion Runtime settable parameters #endregion Runtime settable parameters
// Debugging routine for dumping detailed physical information for vehicle prims
private void DumpVehicles()
{
foreach (BSPrim prim in m_vehicles)
{
BulletSimAPI.DumpRigidBody2(World.ptr, prim.PhysBody.ptr);
BulletSimAPI.DumpCollisionShape2(World.ptr, prim.PhysShape.ptr);
}
}
// Invoke the detailed logger and output something if it's enabled. // Invoke the detailed logger and output something if it's enabled.
public void DetailLog(string msg, params Object[] args) public void DetailLog(string msg, params Object[] args)
{ {