BulletSim: remove all special vehicle code from BSScene. Replace per-frame updates for vehicles with per-frame action registration. One fewer special case.
parent
a54392d7cc
commit
5b2cbc0ae6
|
@ -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);
|
||||||
|
|
|
@ -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)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue