diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSDynamics.cs b/OpenSim/Region/Physics/BulletSPlugin/BSDynamics.cs index ef68471a29..5887249621 100644 --- a/OpenSim/Region/Physics/BulletSPlugin/BSDynamics.cs +++ b/OpenSim/Region/Physics/BulletSPlugin/BSDynamics.cs @@ -87,7 +87,7 @@ namespace OpenSim.Region.Physics.BulletSPlugin private float m_angularMotorTimescale = 0; // motor angular velocity ramp up rate private float m_angularMotorDecayTimescale = 0; // motor angular velocity decay rate private Vector3 m_angularFrictionTimescale = Vector3.Zero; // body angular velocity decay rate - private Vector3 m_lastAngularCorrection = Vector3.Zero; + private Vector3 m_lastAngularVelocity = Vector3.Zero; private Vector3 m_lastVertAttractor = Vector3.Zero; // what VA was last applied to body //Deflection properties @@ -128,7 +128,7 @@ namespace OpenSim.Region.Physics.BulletSPlugin // Return 'true' if this vehicle is doing vehicle things public bool IsActive { - get { return Type != Vehicle.TYPE_NONE; } + get { return Type != Vehicle.TYPE_NONE && Prim.IsPhysical; } } internal void ProcessFloatVehicleParam(Vehicle pParam, float pValue) @@ -664,6 +664,7 @@ namespace OpenSim.Region.Physics.BulletSPlugin // an UpdateProperties event to send the changes up to the simulator. BulletSimAPI.PushUpdate2(Prim.PhysBody.ptr); } + m_knownChanged = 0; } // Since the computation of terrain height can be a little involved, this routine @@ -993,11 +994,12 @@ namespace OpenSim.Region.Physics.BulletSPlugin public Vector3 ComputeLinearMotorUp(float pTimestep) { Vector3 ret = Vector3.Zero; + float distanceAboveGround = 0f; if ((m_flags & (VehicleFlag.LIMIT_MOTOR_UP)) != 0) { float targetHeight = Type == Vehicle.TYPE_BOAT ? GetWaterLevel(VehiclePosition) : GetTerrainHeight(VehiclePosition); - float distanceAboveGround = VehiclePosition.Z - targetHeight; + distanceAboveGround = VehiclePosition.Z - targetHeight; // Not colliding if the vehicle is off the ground if (!Prim.IsColliding) { @@ -1010,9 +1012,9 @@ namespace OpenSim.Region.Physics.BulletSPlugin // has a decay factor. This says this force should // be computed with a motor. // TODO: add interaction with banking. - VDetailLog("{0}, MoveLinear,limitMotorUp,distAbove={1},colliding={2},ret={3}", - Prim.LocalID, distanceAboveGround, Prim.IsColliding, ret); } + VDetailLog("{0}, MoveLinear,limitMotorUp,distAbove={1},colliding={2},ret={3}", + Prim.LocalID, distanceAboveGround, Prim.IsColliding, ret); return ret; } @@ -1049,8 +1051,7 @@ namespace OpenSim.Region.Physics.BulletSPlugin // ================================================================== m_lastVertAttractor = verticalAttractionContribution; - // Sum corrections - m_lastAngularCorrection = angularMotorContribution + m_lastAngularVelocity = angularMotorContribution + verticalAttractionContribution + deflectionContribution + bankingContribution; @@ -1058,19 +1059,15 @@ namespace OpenSim.Region.Physics.BulletSPlugin // ================================================================== // Apply the correction velocity. // TODO: Should this be applied as an angular force (torque)? - if (!m_lastAngularCorrection.ApproxEquals(Vector3.Zero, 0.01f)) + if (!m_lastAngularVelocity.ApproxEquals(Vector3.Zero, 0.01f)) { - // DEBUG DEBUG DEBUG: optionally scale the angular velocity. Debugging SL vs ODE turning functions. - Vector3 scaledCorrection = m_lastAngularCorrection; - if (PhysicsScene.VehicleScaleAngularVelocityByTimestep) - scaledCorrection *= pTimestep; - VehicleRotationalVelocity = scaledCorrection; + VehicleRotationalVelocity = m_lastAngularVelocity; - VDetailLog("{0}, MoveAngular,done,nonZero,angMotorContrib={1},vertAttrContrib={2},bankContrib={3},deflectContrib={4},totalContrib={5},scaledCorr={6}", + VDetailLog("{0}, MoveAngular,done,nonZero,angMotorContrib={1},vertAttrContrib={2},bankContrib={3},deflectContrib={4},totalContrib={5}", Prim.LocalID, angularMotorContribution, verticalAttractionContribution, bankingContribution, deflectionContribution, - m_lastAngularCorrection, scaledCorrection + m_lastAngularVelocity ); } else @@ -1124,18 +1121,18 @@ namespace OpenSim.Region.Physics.BulletSPlugin { Vector3 ret = Vector3.Zero; - // If vertical attaction timescale is reasonable and we applied an angular force last time... + // If vertical attaction timescale is reasonable if (m_verticalAttractionTimescale < m_verticalAttractionCutoff) { // Take a vector pointing up and convert it from world to vehicle relative coords. Vector3 verticalError = Vector3.UnitZ * VehicleOrientation; - verticalError.Normalize(); // If vertical attraction correction is needed, the vector that was pointing up (UnitZ) - // is now leaning to one side (rotated around the X axis) and the Y value will - // go from zero (nearly straight up) to one (completely to the side) or leaning - // front-to-back (rotated around the Y axis) and the value of X will be between - // zero and one. + // is now: + // leaning to one side: rotated around the X axis with the Y value going + // from zero (nearly straight up) to one (completely to the side)) or + // leaning front-to-back: rotated around the Y axis with the value of X being between + // zero and one. // The value of Z is how far the rotation is off with 1 meaning none and 0 being 90 degrees. // If verticalError.Z is negative, the vehicle is upside down. Add additional push. diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSLinksetCompound.cs b/OpenSim/Region/Physics/BulletSPlugin/BSLinksetCompound.cs index 4d4f7123bc..2a7b72c376 100755 --- a/OpenSim/Region/Physics/BulletSPlugin/BSLinksetCompound.cs +++ b/OpenSim/Region/Physics/BulletSPlugin/BSLinksetCompound.cs @@ -94,10 +94,10 @@ public sealed class BSLinksetCompound : BSLinkset } // Schedule a refresh to happen after all the other taint processing. - private void ScheduleRebuild() + private void ScheduleRebuild(BSPhysObject requestor) { DetailLog("{0},BSLinksetCompound.Refresh,schedulingRefresh,rebuilding={1}", - LinksetRoot.LocalID, Rebuilding); + requestor.LocalID, Rebuilding); // When rebuilding, it is possible to set properties that would normally require a rebuild. // If already rebuilding, don't request another rebuild. if (!Rebuilding) @@ -124,7 +124,7 @@ public sealed class BSLinksetCompound : BSLinkset { // The root is going dynamic. Make sure mass is properly set. m_mass = ComputeLinksetMass(); - ScheduleRebuild(); + ScheduleRebuild(LinksetRoot); } else { @@ -153,7 +153,7 @@ public sealed class BSLinksetCompound : BSLinkset DetailLog("{0},BSLinksetCompound.MakeStatic,call,IsRoot={1}", child.LocalID, IsRoot(child)); if (IsRoot(child)) { - ScheduleRebuild(); + ScheduleRebuild(LinksetRoot); } else { @@ -182,7 +182,7 @@ public sealed class BSLinksetCompound : BSLinkset && PhysicsScene.TerrainManager.IsWithinKnownTerrain(LinksetRoot.RawPosition)) { updated.LinksetInfo = null; - ScheduleRebuild(); + ScheduleRebuild(updated); } } @@ -266,7 +266,7 @@ public sealed class BSLinksetCompound : BSLinkset DetailLog("{0},BSLinksetCompound.AddChildToLinkset,call,child={1}", LinksetRoot.LocalID, child.LocalID); // Rebuild the compound shape with the new child shape included - ScheduleRebuild(); + ScheduleRebuild(child); } return; } @@ -294,7 +294,7 @@ public sealed class BSLinksetCompound : BSLinkset else { // Rebuild the compound shape with the child removed - ScheduleRebuild(); + ScheduleRebuild(child); } } return; diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSMotors.cs b/OpenSim/Region/Physics/BulletSPlugin/BSMotors.cs index cf0a9dc4ab..e0faf4ed1a 100755 --- a/OpenSim/Region/Physics/BulletSPlugin/BSMotors.cs +++ b/OpenSim/Region/Physics/BulletSPlugin/BSMotors.cs @@ -134,8 +134,6 @@ public class BSVMotor : BSMotor Vector3 addAmount = (TargetValue - CurrentValue)/TimeScale * timeStep; CurrentValue += addAmount; - returnCurrent = CurrentValue; - // The desired value reduces to zero which also reduces the difference with current. // If the decay time is infinite, don't decay at all. float decayFactor = 0f; @@ -156,6 +154,8 @@ public class BSVMotor : BSMotor CurrentValue *= (Vector3.One - frictionFactor); } + returnCurrent = CurrentValue; + MDetailLog("{0}, BSVMotor.Step,nonZero,{1},origCurr={2},origTarget={3},timeStep={4},timeScale={5},addAmnt={6},targetDecay={7},decayFact={8},fricTS={9},frictFact={10}", BSScene.DetailLogZero, UseName, origCurrVal, origTarget, timeStep, TimeScale, addAmount, diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSScene.cs b/OpenSim/Region/Physics/BulletSPlugin/BSScene.cs index 7b44574c69..069cb0da88 100644 --- a/OpenSim/Region/Physics/BulletSPlugin/BSScene.cs +++ b/OpenSim/Region/Physics/BulletSPlugin/BSScene.cs @@ -189,7 +189,6 @@ public sealed class BSScene : PhysicsScene, IPhysicsParameters // 'true' of the vehicle code is to log lots of details public bool VehicleLoggingEnabled { get; private set; } public bool VehiclePhysicalLoggingEnabled { get; private set; } - public bool VehicleScaleAngularVelocityByTimestep { get; private set; } #region Construction and Initialization public BSScene(string identifier) @@ -1239,11 +1238,6 @@ public sealed class BSScene : PhysicsScene, IPhysicsParameters (s,cf,p,v) => { s.m_params[0].vehicleAngularDamping = cf.GetFloat(p, v); }, (s) => { return s.m_params[0].vehicleAngularDamping; }, (s,p,l,v) => { s.m_params[0].vehicleAngularDamping = v; } ), - new ParameterDefn("VehicleScaleAngularVelocityByTimestep", "If true, scale angular turning by timestep", - ConfigurationParameters.numericFalse, - (s,cf,p,v) => { s.VehicleScaleAngularVelocityByTimestep = cf.GetBoolean(p, s.BoolNumeric(v)); }, - (s) => { return s.NumericBool(s.VehicleScaleAngularVelocityByTimestep); }, - (s,p,l,v) => { s.VehicleScaleAngularVelocityByTimestep = s.BoolNumeric(v); } ), new ParameterDefn("MaxPersistantManifoldPoolSize", "Number of manifolds pooled (0 means default of 4096)", 0f, diff --git a/OpenSim/Region/Physics/BulletSPlugin/BulletSimTODO.txt b/OpenSim/Region/Physics/BulletSPlugin/BulletSimTODO.txt index 31dd790ff3..0d9a156d86 100755 --- a/OpenSim/Region/Physics/BulletSPlugin/BulletSimTODO.txt +++ b/OpenSim/Region/Physics/BulletSPlugin/BulletSimTODO.txt @@ -5,7 +5,7 @@ Eliminate all crashes (DONEish) Border crossing of physical linkset (DONE) Enable vehicle border crossings (at least as poorly as ODE) Avatar created in previous region and not new region when crossing border - Vehicle recreated in new sim at small Z value (offset from root value?) + Vehicle recreated in new sim at small Z value (offset from root value?) (DONE) Calibrate turning radius limitMotorUp calibration (more down?) study PID motors (include 'efficiency' implementation