Merge branch 'master' of ssh://opensimulator.org/var/git/opensim
commit
1e72e1b258
|
@ -43,12 +43,10 @@ public sealed class BSCharacter : BSPhysObject
|
|||
private OMV.Vector3 _size;
|
||||
private bool _grabbed;
|
||||
private bool _selected;
|
||||
private OMV.Vector3 _position;
|
||||
private float _mass;
|
||||
private float _avatarVolume;
|
||||
private float _collisionScore;
|
||||
private OMV.Vector3 _acceleration;
|
||||
private OMV.Quaternion _orientation;
|
||||
private int _physicsActorType;
|
||||
private bool _isPhysical;
|
||||
private bool _flying;
|
||||
|
@ -70,10 +68,10 @@ public sealed class BSCharacter : BSPhysObject
|
|||
: base(parent_scene, localID, avName, "BSCharacter")
|
||||
{
|
||||
_physicsActorType = (int)ActorTypes.Agent;
|
||||
_position = pos;
|
||||
RawPosition = pos;
|
||||
|
||||
_flying = isFlying;
|
||||
_orientation = OMV.Quaternion.Identity;
|
||||
RawOrientation = OMV.Quaternion.Identity;
|
||||
RawVelocity = OMV.Vector3.Zero;
|
||||
_buoyancy = ComputeBuoyancyFromFlying(isFlying);
|
||||
Friction = BSParam.AvatarStandingFriction;
|
||||
|
@ -133,7 +131,7 @@ public sealed class BSCharacter : BSPhysObject
|
|||
PhysScene.PE.RemoveObjectFromWorld(PhysScene.World, PhysBody);
|
||||
|
||||
ZeroMotion(true);
|
||||
ForcePosition = _position;
|
||||
ForcePosition = RawPosition;
|
||||
|
||||
// Set the velocity
|
||||
if (m_moveActor != null)
|
||||
|
@ -272,38 +270,33 @@ public sealed class BSCharacter : BSPhysObject
|
|||
|
||||
public override void LockAngularMotion(OMV.Vector3 axis) { return; }
|
||||
|
||||
public override OMV.Vector3 RawPosition
|
||||
{
|
||||
get { return _position; }
|
||||
set { _position = value; }
|
||||
}
|
||||
public override OMV.Vector3 Position {
|
||||
get {
|
||||
// Don't refetch the position because this function is called a zillion times
|
||||
// _position = PhysicsScene.PE.GetObjectPosition(Scene.World, LocalID);
|
||||
return _position;
|
||||
// RawPosition = PhysicsScene.PE.GetObjectPosition(Scene.World, LocalID);
|
||||
return RawPosition;
|
||||
}
|
||||
set {
|
||||
_position = value;
|
||||
RawPosition = value;
|
||||
|
||||
PhysScene.TaintedObject("BSCharacter.setPosition", delegate()
|
||||
{
|
||||
DetailLog("{0},BSCharacter.SetPosition,taint,pos={1},orient={2}", LocalID, _position, _orientation);
|
||||
DetailLog("{0},BSCharacter.SetPosition,taint,pos={1},orient={2}", LocalID, RawPosition, RawOrientation);
|
||||
PositionSanityCheck();
|
||||
ForcePosition = _position;
|
||||
ForcePosition = RawPosition;
|
||||
});
|
||||
}
|
||||
}
|
||||
public override OMV.Vector3 ForcePosition {
|
||||
get {
|
||||
_position = PhysScene.PE.GetPosition(PhysBody);
|
||||
return _position;
|
||||
RawPosition = PhysScene.PE.GetPosition(PhysBody);
|
||||
return RawPosition;
|
||||
}
|
||||
set {
|
||||
_position = value;
|
||||
RawPosition = value;
|
||||
if (PhysBody.HasPhysicalBody)
|
||||
{
|
||||
PhysScene.PE.SetTranslation(PhysBody, _position, _orientation);
|
||||
PhysScene.PE.SetTranslation(PhysBody, RawPosition, RawOrientation);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -331,16 +324,16 @@ public sealed class BSCharacter : BSPhysObject
|
|||
float terrainHeight = PhysScene.TerrainManager.GetTerrainHeightAtXYZ(RawPosition);
|
||||
if (Position.Z < terrainHeight)
|
||||
{
|
||||
DetailLog("{0},BSCharacter.PositionSanityCheck,adjustForUnderGround,pos={1},terrain={2}", LocalID, _position, terrainHeight);
|
||||
_position.Z = terrainHeight + BSParam.AvatarBelowGroundUpCorrectionMeters;
|
||||
DetailLog("{0},BSCharacter.PositionSanityCheck,adjustForUnderGround,pos={1},terrain={2}", LocalID, RawPosition, terrainHeight);
|
||||
RawPosition = new OMV.Vector3(RawPosition.X, RawPosition.Y, terrainHeight + BSParam.AvatarBelowGroundUpCorrectionMeters);
|
||||
ret = true;
|
||||
}
|
||||
if ((CurrentCollisionFlags & CollisionFlags.BS_FLOATS_ON_WATER) != 0)
|
||||
{
|
||||
float waterHeight = PhysScene.TerrainManager.GetWaterLevelAtXYZ(_position);
|
||||
float waterHeight = PhysScene.TerrainManager.GetWaterLevelAtXYZ(RawPosition);
|
||||
if (Position.Z < waterHeight)
|
||||
{
|
||||
_position.Z = waterHeight;
|
||||
RawPosition = new OMV.Vector3(RawPosition.X, RawPosition.Y, waterHeight);
|
||||
ret = true;
|
||||
}
|
||||
}
|
||||
|
@ -360,8 +353,8 @@ public sealed class BSCharacter : BSPhysObject
|
|||
// just assign to "Position" because of potential call loops.
|
||||
PhysScene.TaintedObject(inTaintTime, "BSCharacter.PositionSanityCheck", delegate()
|
||||
{
|
||||
DetailLog("{0},BSCharacter.PositionSanityCheck,taint,pos={1},orient={2}", LocalID, _position, _orientation);
|
||||
ForcePosition = _position;
|
||||
DetailLog("{0},BSCharacter.PositionSanityCheck,taint,pos={1},orient={2}", LocalID, RawPosition, RawOrientation);
|
||||
ForcePosition = RawPosition;
|
||||
});
|
||||
ret = true;
|
||||
}
|
||||
|
@ -466,19 +459,14 @@ public sealed class BSCharacter : BSPhysObject
|
|||
get { return _acceleration; }
|
||||
set { _acceleration = value; }
|
||||
}
|
||||
public override OMV.Quaternion RawOrientation
|
||||
{
|
||||
get { return _orientation; }
|
||||
set { _orientation = value; }
|
||||
}
|
||||
public override OMV.Quaternion Orientation {
|
||||
get { return _orientation; }
|
||||
get { return RawOrientation; }
|
||||
set {
|
||||
// Orientation is set zillions of times when an avatar is walking. It's like
|
||||
// the viewer doesn't trust us.
|
||||
if (_orientation != value)
|
||||
if (RawOrientation != value)
|
||||
{
|
||||
_orientation = value;
|
||||
RawOrientation = value;
|
||||
PhysScene.TaintedObject("BSCharacter.setOrientation", delegate()
|
||||
{
|
||||
// Bullet assumes we know what we are doing when forcing orientation
|
||||
|
@ -486,10 +474,10 @@ public sealed class BSCharacter : BSPhysObject
|
|||
// This forces rotation to be only around the Z axis and doesn't change any of the other axis.
|
||||
// This keeps us from flipping the capsule over which the veiwer does not understand.
|
||||
float oRoll, oPitch, oYaw;
|
||||
_orientation.GetEulerAngles(out oRoll, out oPitch, out oYaw);
|
||||
RawOrientation.GetEulerAngles(out oRoll, out oPitch, out oYaw);
|
||||
OMV.Quaternion trimmedOrientation = OMV.Quaternion.CreateFromEulers(0f, 0f, oYaw);
|
||||
// DetailLog("{0},BSCharacter.setOrientation,taint,val={1},valDir={2},conv={3},convDir={4}",
|
||||
// LocalID, _orientation, OMV.Vector3.UnitX * _orientation,
|
||||
// LocalID, RawOrientation, OMV.Vector3.UnitX * RawOrientation,
|
||||
// trimmedOrientation, OMV.Vector3.UnitX * trimmedOrientation);
|
||||
ForceOrientation = trimmedOrientation;
|
||||
});
|
||||
|
@ -501,16 +489,16 @@ public sealed class BSCharacter : BSPhysObject
|
|||
{
|
||||
get
|
||||
{
|
||||
_orientation = PhysScene.PE.GetOrientation(PhysBody);
|
||||
return _orientation;
|
||||
RawOrientation = PhysScene.PE.GetOrientation(PhysBody);
|
||||
return RawOrientation;
|
||||
}
|
||||
set
|
||||
{
|
||||
_orientation = value;
|
||||
RawOrientation = value;
|
||||
if (PhysBody.HasPhysicalBody)
|
||||
{
|
||||
// _position = PhysicsScene.PE.GetPosition(BSBody);
|
||||
PhysScene.PE.SetTranslation(PhysBody, _position, _orientation);
|
||||
// RawPosition = PhysicsScene.PE.GetPosition(BSBody);
|
||||
PhysScene.PE.SetTranslation(PhysBody, RawPosition, RawOrientation);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -723,9 +711,9 @@ public sealed class BSCharacter : BSPhysObject
|
|||
{
|
||||
// Don't change position if standing on a stationary object.
|
||||
if (!IsStationary)
|
||||
_position = entprop.Position;
|
||||
RawPosition = entprop.Position;
|
||||
|
||||
_orientation = entprop.Rotation;
|
||||
RawOrientation = entprop.Rotation;
|
||||
|
||||
// Smooth velocity. OpenSimulator is VERY sensitive to changes in velocity of the avatar
|
||||
// and will send agent updates to the clients if velocity changes by more than
|
||||
|
@ -740,8 +728,8 @@ public sealed class BSCharacter : BSPhysObject
|
|||
// Do some sanity checking for the avatar. Make sure it's above ground and inbounds.
|
||||
if (PositionSanityCheck(true))
|
||||
{
|
||||
DetailLog("{0},BSCharacter.UpdateProperties,updatePosForSanity,pos={1}", LocalID, _position);
|
||||
entprop.Position = _position;
|
||||
DetailLog("{0},BSCharacter.UpdateProperties,updatePosForSanity,pos={1}", LocalID, RawPosition);
|
||||
entprop.Position = RawPosition;
|
||||
}
|
||||
|
||||
// remember the current and last set values
|
||||
|
@ -755,7 +743,7 @@ public sealed class BSCharacter : BSPhysObject
|
|||
// base.RequestPhysicsterseUpdate();
|
||||
|
||||
DetailLog("{0},BSCharacter.UpdateProperties,call,pos={1},orient={2},vel={3},accel={4},rotVel={5}",
|
||||
LocalID, _position, _orientation, RawVelocity, _acceleration, _rotationalVelocity);
|
||||
LocalID, RawPosition, RawOrientation, RawVelocity, _acceleration, _rotationalVelocity);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -144,7 +144,7 @@ namespace OpenSim.Region.Physics.BulletSPlugin
|
|||
public void SetupVehicleDebugging()
|
||||
{
|
||||
enableAngularVerticalAttraction = true;
|
||||
enableAngularDeflection = false;
|
||||
enableAngularDeflection = true;
|
||||
enableAngularBanking = true;
|
||||
if (BSParam.VehicleDebuggingEnable)
|
||||
{
|
||||
|
@ -173,7 +173,7 @@ namespace OpenSim.Region.Physics.BulletSPlugin
|
|||
switch (pParam)
|
||||
{
|
||||
case Vehicle.ANGULAR_DEFLECTION_EFFICIENCY:
|
||||
m_angularDeflectionEfficiency = Math.Max(pValue, 0.01f);
|
||||
m_angularDeflectionEfficiency = ClampInRange(0f, pValue, 1f);
|
||||
break;
|
||||
case Vehicle.ANGULAR_DEFLECTION_TIMESCALE:
|
||||
m_angularDeflectionTimescale = Math.Max(pValue, 0.01f);
|
||||
|
@ -1512,11 +1512,7 @@ namespace OpenSim.Region.Physics.BulletSPlugin
|
|||
// in that direction.
|
||||
// TODO: implement reference frame.
|
||||
public void ComputeAngularDeflection()
|
||||
{
|
||||
// Since angularMotorUp and angularDeflection are computed independently, they will calculate
|
||||
// approximately the same X or Y correction. When added together (when contributions are combined)
|
||||
// this creates an over-correction and then wabbling as the target is overshot.
|
||||
// TODO: rethink how the different correction computations inter-relate.
|
||||
{
|
||||
|
||||
if (enableAngularDeflection && m_angularDeflectionEfficiency != 0 && VehicleForwardSpeed > 0.2)
|
||||
{
|
||||
|
@ -1531,10 +1527,14 @@ namespace OpenSim.Region.Physics.BulletSPlugin
|
|||
|
||||
// The direction the vehicle is pointing
|
||||
Vector3 pointingDirection = Vector3.UnitX * VehicleOrientation;
|
||||
pointingDirection.Normalize();
|
||||
//Predict where the Vehicle will be pointing after AngularVelocity change is applied. This will keep
|
||||
// from overshooting and allow this correction to merge with the Vertical Attraction peacefully.
|
||||
Vector3 predictedPointingDirection = pointingDirection * Quaternion.CreateFromAxisAngle(VehicleRotationalVelocity, 0f);
|
||||
predictedPointingDirection.Normalize();
|
||||
|
||||
// The difference between what is and what should be.
|
||||
Vector3 deflectionError = movingDirection - pointingDirection;
|
||||
// Vector3 deflectionError = movingDirection - predictedPointingDirection;
|
||||
Vector3 deflectionError = Vector3.Cross(movingDirection, predictedPointingDirection);
|
||||
|
||||
// Don't try to correct very large errors (not our job)
|
||||
// if (Math.Abs(deflectionError.X) > PIOverFour) deflectionError.X = PIOverTwo * Math.Sign(deflectionError.X);
|
||||
|
@ -1547,15 +1547,16 @@ namespace OpenSim.Region.Physics.BulletSPlugin
|
|||
// ret = m_angularDeflectionCorrectionMotor(1f, deflectionError);
|
||||
|
||||
// Scale the correction by recovery timescale and efficiency
|
||||
deflectContributionV = (-deflectionError) * m_angularDeflectionEfficiency;
|
||||
deflectContributionV /= m_angularDeflectionTimescale;
|
||||
|
||||
VehicleRotationalVelocity += deflectContributionV * VehicleOrientation;
|
||||
// Not modeling a spring so clamp the scale to no more then the arc
|
||||
deflectContributionV = (-deflectionError) * ClampInRange(0, m_angularDeflectionEfficiency/m_angularDeflectionTimescale,1f);
|
||||
//deflectContributionV /= m_angularDeflectionTimescale;
|
||||
|
||||
// VehicleRotationalVelocity += deflectContributionV * VehicleOrientation;
|
||||
VehicleRotationalVelocity += deflectContributionV;
|
||||
VDetailLog("{0}, MoveAngular,Deflection,movingDir={1},pointingDir={2},deflectError={3},ret={4}",
|
||||
ControllingPrim.LocalID, movingDirection, pointingDirection, deflectionError, deflectContributionV);
|
||||
VDetailLog("{0}, MoveAngular,Deflection,fwdSpd={1},defEff={2},defTS={3}",
|
||||
ControllingPrim.LocalID, VehicleForwardSpeed, m_angularDeflectionEfficiency, m_angularDeflectionTimescale);
|
||||
VDetailLog("{0}, MoveAngular,Deflection,fwdSpd={1},defEff={2},defTS={3},PredictedPointingDir={4}",
|
||||
ControllingPrim.LocalID, VehicleForwardSpeed, m_angularDeflectionEfficiency, m_angularDeflectionTimescale, predictedPointingDirection);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -197,10 +197,10 @@ public abstract class BSPhysObject : PhysicsActor
|
|||
// Update the physical location and motion of the object. Called with data from Bullet.
|
||||
public abstract void UpdateProperties(EntityProperties entprop);
|
||||
|
||||
public abstract OMV.Vector3 RawPosition { get; set; }
|
||||
public virtual OMV.Vector3 RawPosition { get; set; }
|
||||
public abstract OMV.Vector3 ForcePosition { get; set; }
|
||||
|
||||
public abstract OMV.Quaternion RawOrientation { get; set; }
|
||||
public virtual OMV.Quaternion RawOrientation { get; set; }
|
||||
public abstract OMV.Quaternion ForceOrientation { get; set; }
|
||||
|
||||
public OMV.Vector3 RawVelocity { get; set; }
|
||||
|
|
|
@ -51,12 +51,8 @@ public class BSPrim : BSPhysObject
|
|||
private bool _isSelected;
|
||||
private bool _isVolumeDetect;
|
||||
|
||||
// _position is what the simulator thinks the positions of the prim is.
|
||||
private OMV.Vector3 _position;
|
||||
|
||||
private float _mass; // the mass of this object
|
||||
private OMV.Vector3 _acceleration;
|
||||
private OMV.Quaternion _orientation;
|
||||
private int _physicsActorType;
|
||||
private bool _isPhysical;
|
||||
private bool _flying;
|
||||
|
@ -88,10 +84,10 @@ public class BSPrim : BSPhysObject
|
|||
{
|
||||
// m_log.DebugFormat("{0}: BSPrim creation of {1}, id={2}", LogHeader, primName, localID);
|
||||
_physicsActorType = (int)ActorTypes.Prim;
|
||||
_position = pos;
|
||||
RawPosition = pos;
|
||||
_size = size;
|
||||
Scale = size; // prims are the size the user wants them to be (different for BSCharactes).
|
||||
_orientation = rotation;
|
||||
RawOrientation = rotation;
|
||||
_buoyancy = 0f;
|
||||
RawVelocity = OMV.Vector3.Zero;
|
||||
_rotationalVelocity = OMV.Vector3.Zero;
|
||||
|
@ -270,46 +266,42 @@ public class BSPrim : BSPhysObject
|
|||
return;
|
||||
}
|
||||
|
||||
public override OMV.Vector3 RawPosition
|
||||
{
|
||||
get { return _position; }
|
||||
set { _position = value; }
|
||||
}
|
||||
public override OMV.Vector3 Position {
|
||||
get {
|
||||
// don't do the GetObjectPosition for root elements because this function is called a zillion times.
|
||||
// _position = ForcePosition;
|
||||
return _position;
|
||||
// RawPosition = ForcePosition;
|
||||
return RawPosition;
|
||||
}
|
||||
set {
|
||||
// If the position must be forced into the physics engine, use ForcePosition.
|
||||
// All positions are given in world positions.
|
||||
if (_position == value)
|
||||
if (RawPosition == value)
|
||||
{
|
||||
DetailLog("{0},BSPrim.setPosition,call,positionNotChanging,pos={1},orient={2}", LocalID, _position, _orientation);
|
||||
DetailLog("{0},BSPrim.setPosition,call,positionNotChanging,pos={1},orient={2}", LocalID, RawPosition, RawOrientation);
|
||||
return;
|
||||
}
|
||||
_position = value;
|
||||
RawPosition = value;
|
||||
PositionSanityCheck(false);
|
||||
|
||||
PhysScene.TaintedObject("BSPrim.setPosition", delegate()
|
||||
{
|
||||
DetailLog("{0},BSPrim.SetPosition,taint,pos={1},orient={2}", LocalID, _position, _orientation);
|
||||
ForcePosition = _position;
|
||||
DetailLog("{0},BSPrim.SetPosition,taint,pos={1},orient={2}", LocalID, RawPosition, RawOrientation);
|
||||
ForcePosition = RawPosition;
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
// NOTE: overloaded by BSPrimDisplaced to handle offset for center-of-gravity.
|
||||
public override OMV.Vector3 ForcePosition {
|
||||
get {
|
||||
_position = PhysScene.PE.GetPosition(PhysBody);
|
||||
return _position;
|
||||
RawPosition = PhysScene.PE.GetPosition(PhysBody);
|
||||
return RawPosition;
|
||||
}
|
||||
set {
|
||||
_position = value;
|
||||
RawPosition = value;
|
||||
if (PhysBody.HasPhysicalBody)
|
||||
{
|
||||
PhysScene.PE.SetTranslation(PhysBody, _position, _orientation);
|
||||
PhysScene.PE.SetTranslation(PhysBody, RawPosition, RawOrientation);
|
||||
ActivateIfPhysical(false);
|
||||
}
|
||||
}
|
||||
|
@ -343,10 +335,10 @@ public class BSPrim : BSPhysObject
|
|||
float targetHeight = terrainHeight + (Size.Z / 2f);
|
||||
// If the object is below ground it just has to be moved up because pushing will
|
||||
// not get it through the terrain
|
||||
_position.Z = targetHeight;
|
||||
RawPosition = new OMV.Vector3(RawPosition.X, RawPosition.Y, targetHeight);
|
||||
if (inTaintTime)
|
||||
{
|
||||
ForcePosition = _position;
|
||||
ForcePosition = RawPosition;
|
||||
}
|
||||
// If we are throwing the object around, zero its other forces
|
||||
ZeroMotion(inTaintTime);
|
||||
|
@ -355,7 +347,7 @@ public class BSPrim : BSPhysObject
|
|||
|
||||
if ((CurrentCollisionFlags & CollisionFlags.BS_FLOATS_ON_WATER) != 0)
|
||||
{
|
||||
float waterHeight = PhysScene.TerrainManager.GetWaterLevelAtXYZ(_position);
|
||||
float waterHeight = PhysScene.TerrainManager.GetWaterLevelAtXYZ(RawPosition);
|
||||
// TODO: a floating motor so object will bob in the water
|
||||
if (Math.Abs(RawPosition.Z - waterHeight) > 0.1f)
|
||||
{
|
||||
|
@ -364,7 +356,7 @@ public class BSPrim : BSPhysObject
|
|||
|
||||
// Apply upforce and overcome gravity.
|
||||
OMV.Vector3 correctionForce = upForce - PhysScene.DefaultGravity;
|
||||
DetailLog("{0},BSPrim.PositionSanityCheck,applyForce,pos={1},upForce={2},correctionForce={3}", LocalID, _position, upForce, correctionForce);
|
||||
DetailLog("{0},BSPrim.PositionSanityCheck,applyForce,pos={1},upForce={2},correctionForce={3}", LocalID, RawPosition, upForce, correctionForce);
|
||||
AddForce(correctionForce, false, inTaintTime);
|
||||
ret = true;
|
||||
}
|
||||
|
@ -383,11 +375,11 @@ public class BSPrim : BSPhysObject
|
|||
uint wayOutThere = Constants.RegionSize * Constants.RegionSize;
|
||||
// There have been instances of objects getting thrown way out of bounds and crashing
|
||||
// the border crossing code.
|
||||
if ( _position.X < -Constants.RegionSize || _position.X > wayOutThere
|
||||
|| _position.Y < -Constants.RegionSize || _position.Y > wayOutThere
|
||||
|| _position.Z < -Constants.RegionSize || _position.Z > wayOutThere)
|
||||
if ( RawPosition.X < -Constants.RegionSize || RawPosition.X > wayOutThere
|
||||
|| RawPosition.Y < -Constants.RegionSize || RawPosition.Y > wayOutThere
|
||||
|| RawPosition.Z < -Constants.RegionSize || RawPosition.Z > wayOutThere)
|
||||
{
|
||||
_position = new OMV.Vector3(10, 10, 50);
|
||||
RawPosition = new OMV.Vector3(10, 10, 50);
|
||||
ZeroMotion(inTaintTime);
|
||||
ret = true;
|
||||
}
|
||||
|
@ -713,23 +705,19 @@ public class BSPrim : BSPhysObject
|
|||
get { return _acceleration; }
|
||||
set { _acceleration = value; }
|
||||
}
|
||||
public override OMV.Quaternion RawOrientation
|
||||
{
|
||||
get { return _orientation; }
|
||||
set { _orientation = value; }
|
||||
}
|
||||
|
||||
public override OMV.Quaternion Orientation {
|
||||
get {
|
||||
return _orientation;
|
||||
return RawOrientation;
|
||||
}
|
||||
set {
|
||||
if (_orientation == value)
|
||||
if (RawOrientation == value)
|
||||
return;
|
||||
_orientation = value;
|
||||
RawOrientation = value;
|
||||
|
||||
PhysScene.TaintedObject("BSPrim.setOrientation", delegate()
|
||||
{
|
||||
ForceOrientation = _orientation;
|
||||
ForceOrientation = RawOrientation;
|
||||
});
|
||||
}
|
||||
}
|
||||
|
@ -738,14 +726,14 @@ public class BSPrim : BSPhysObject
|
|||
{
|
||||
get
|
||||
{
|
||||
_orientation = PhysScene.PE.GetOrientation(PhysBody);
|
||||
return _orientation;
|
||||
RawOrientation = PhysScene.PE.GetOrientation(PhysBody);
|
||||
return RawOrientation;
|
||||
}
|
||||
set
|
||||
{
|
||||
_orientation = value;
|
||||
RawOrientation = value;
|
||||
if (PhysBody.HasPhysicalBody)
|
||||
PhysScene.PE.SetTranslation(PhysBody, _position, _orientation);
|
||||
PhysScene.PE.SetTranslation(PhysBody, RawPosition, RawOrientation);
|
||||
}
|
||||
}
|
||||
public override int PhysicsActorType {
|
||||
|
@ -889,7 +877,7 @@ public class BSPrim : BSPhysObject
|
|||
// PhysicsScene.PE.ClearAllForces(BSBody);
|
||||
|
||||
// For good measure, make sure the transform is set through to the motion state
|
||||
ForcePosition = _position;
|
||||
ForcePosition = RawPosition;
|
||||
ForceVelocity = RawVelocity;
|
||||
ForceRotationalVelocity = _rotationalVelocity;
|
||||
|
||||
|
@ -1543,8 +1531,8 @@ public class BSPrim : BSPhysObject
|
|||
// DetailLog("{0},BSPrim.UpdateProperties,entry,entprop={1}", LocalID, entprop); // DEBUG DEBUG
|
||||
|
||||
// Assign directly to the local variables so the normal set actions do not happen
|
||||
_position = entprop.Position;
|
||||
_orientation = entprop.Rotation;
|
||||
RawPosition = entprop.Position;
|
||||
RawOrientation = entprop.Rotation;
|
||||
// DEBUG DEBUG DEBUG -- smooth velocity changes a bit. The simulator seems to be
|
||||
// very sensitive to velocity changes.
|
||||
if (entprop.Velocity == OMV.Vector3.Zero || !entprop.Velocity.ApproxEquals(RawVelocity, BSParam.UpdateVelocityChangeThreshold))
|
||||
|
@ -1557,13 +1545,13 @@ public class BSPrim : BSPhysObject
|
|||
// The sanity check can change the velocity and/or position.
|
||||
if (PositionSanityCheck(true /* inTaintTime */ ))
|
||||
{
|
||||
entprop.Position = _position;
|
||||
entprop.Position = RawPosition;
|
||||
entprop.Velocity = RawVelocity;
|
||||
entprop.RotationalVelocity = _rotationalVelocity;
|
||||
entprop.Acceleration = _acceleration;
|
||||
}
|
||||
|
||||
OMV.Vector3 direction = OMV.Vector3.UnitX * _orientation; // DEBUG DEBUG DEBUG
|
||||
OMV.Vector3 direction = OMV.Vector3.UnitX * RawOrientation; // DEBUG DEBUG DEBUG
|
||||
DetailLog("{0},BSPrim.UpdateProperties,call,entProp={1},dir={2}", LocalID, entprop, direction);
|
||||
|
||||
// remember the current and last set values
|
||||
|
|
|
@ -23,11 +23,6 @@
|
|||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* The quotations from http://wiki.secondlife.com/wiki/Linden_Vehicle_Tutorial
|
||||
* are Copyright (c) 2009 Linden Research, Inc and are used under their license
|
||||
* of Creative Commons Attribution-Share Alike 3.0
|
||||
* (http://creativecommons.org/licenses/by-sa/3.0/).
|
||||
*/
|
||||
|
||||
using System;
|
||||
|
@ -115,7 +110,7 @@ public class BSPrimDisplaced : BSPrim
|
|||
public override Vector3 ForcePosition
|
||||
{
|
||||
get {
|
||||
OMV.Vector3 physPosition = base.ForcePosition;
|
||||
OMV.Vector3 physPosition = PhysScene.PE.GetPosition(PhysBody);
|
||||
if (PositionDisplacement != OMV.Vector3.Zero)
|
||||
{
|
||||
// If there is some displacement, return the physical position (center-of-mass)
|
||||
|
@ -125,6 +120,7 @@ public class BSPrimDisplaced : BSPrim
|
|||
LocalID, physPosition, displacement, physPosition - displacement);
|
||||
physPosition -= displacement;
|
||||
}
|
||||
RawPosition = physPosition;
|
||||
return physPosition;
|
||||
}
|
||||
set
|
||||
|
|
Loading…
Reference in New Issue