Merge branch 'master' of opensimulator.org:/var/git/opensim
commit
367b7d7e5e
|
@ -801,7 +801,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
|
||||||
int newSizeX = finalDestination.RegionSizeX;
|
int newSizeX = finalDestination.RegionSizeX;
|
||||||
int newSizeY = finalDestination.RegionSizeY;
|
int newSizeY = finalDestination.RegionSizeY;
|
||||||
|
|
||||||
bool OutSideViewRange = NeedsNewAgent(sp.DrawDistance, oldRegionX, newRegionX, oldRegionY, newRegionY,
|
bool OutSideViewRange = NeedsNewAgent(sp.RegionViewDistance, oldRegionX, newRegionX, oldRegionY, newRegionY,
|
||||||
oldSizeX, oldSizeY, newSizeX, newSizeY);
|
oldSizeX, oldSizeY, newSizeX, newSizeY);
|
||||||
|
|
||||||
if (OutSideViewRange)
|
if (OutSideViewRange)
|
||||||
|
@ -1338,7 +1338,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
|
||||||
// This returns 'true' if the new region already has a child agent for our
|
// This returns 'true' if the new region already has a child agent for our
|
||||||
// incoming agent. The implication is that, if 'false', we have to create the
|
// incoming agent. The implication is that, if 'false', we have to create the
|
||||||
// child and then teleport into the region.
|
// child and then teleport into the region.
|
||||||
protected virtual bool NeedsNewAgent(float drawdist, uint oldRegionX, uint newRegionX, uint oldRegionY, uint newRegionY,
|
protected virtual bool NeedsNewAgent(float viewdist, uint oldRegionX, uint newRegionX, uint oldRegionY, uint newRegionY,
|
||||||
int oldsizeX, int oldsizeY, int newsizeX, int newsizeY)
|
int oldsizeX, int oldsizeY, int newsizeX, int newsizeY)
|
||||||
{
|
{
|
||||||
if (m_regionCombinerModule != null && m_regionCombinerModule.IsRootForMegaregion(Scene.RegionInfo.RegionID))
|
if (m_regionCombinerModule != null && m_regionCombinerModule.IsRootForMegaregion(Scene.RegionInfo.RegionID))
|
||||||
|
@ -1353,7 +1353,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
|
||||||
return !(newRegionX >= swCorner.X && newRegionX <= neCorner.X && newRegionY >= swCorner.Y && newRegionY <= neCorner.Y);
|
return !(newRegionX >= swCorner.X && newRegionX <= neCorner.X && newRegionY >= swCorner.Y && newRegionY <= neCorner.Y);
|
||||||
}
|
}
|
||||||
|
|
||||||
return Util.IsOutsideView(drawdist, oldRegionX, newRegionX, oldRegionY, newRegionY,
|
return Util.IsOutsideView(viewdist, oldRegionX, newRegionX, oldRegionY, newRegionY,
|
||||||
oldsizeX, oldsizeY, newsizeX, newsizeY);
|
oldsizeX, oldsizeY, newsizeX, newsizeY);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2449,7 +2449,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
|
||||||
// view to include everything in the megaregion
|
// view to include everything in the megaregion
|
||||||
if (m_regionCombinerModule == null || !m_regionCombinerModule.IsRootForMegaregion(Scene.RegionInfo.RegionID))
|
if (m_regionCombinerModule == null || !m_regionCombinerModule.IsRootForMegaregion(Scene.RegionInfo.RegionID))
|
||||||
{
|
{
|
||||||
uint dd = (uint)avatar.DrawDistance;
|
uint dd = (uint)avatar.RegionViewDistance;
|
||||||
|
|
||||||
// until avatar movement updates client connections, we need to seend at least this current region imediate Neighbors
|
// until avatar movement updates client connections, we need to seend at least this current region imediate Neighbors
|
||||||
uint ddX = Math.Max(dd, Constants.RegionSize);
|
uint ddX = Math.Max(dd, Constants.RegionSize);
|
||||||
|
|
|
@ -179,7 +179,7 @@ namespace OpenSim.Region.CoreModules.World.Permissions
|
||||||
m_RegionManagerIsGod = Util.GetConfigVarFromSections<bool>(config, "region_manager_is_god",
|
m_RegionManagerIsGod = Util.GetConfigVarFromSections<bool>(config, "region_manager_is_god",
|
||||||
new string[] { "Startup", "Permissions" }, false);
|
new string[] { "Startup", "Permissions" }, false);
|
||||||
m_ParcelOwnerIsGod = Util.GetConfigVarFromSections<bool>(config, "parcel_owner_is_god",
|
m_ParcelOwnerIsGod = Util.GetConfigVarFromSections<bool>(config, "parcel_owner_is_god",
|
||||||
new string[] { "Startup", "Permissions" }, true);
|
new string[] { "Startup", "Permissions" }, false);
|
||||||
|
|
||||||
m_SimpleBuildPermissions = Util.GetConfigVarFromSections<bool>(config, "simple_build_permissions",
|
m_SimpleBuildPermissions = Util.GetConfigVarFromSections<bool>(config, "simple_build_permissions",
|
||||||
new string[] { "Startup", "Permissions" }, false);
|
new string[] { "Startup", "Permissions" }, false);
|
||||||
|
|
|
@ -296,6 +296,12 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
get { return m_maxDrawDistance; }
|
get { return m_maxDrawDistance; }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected float m_maxRegionViewDistance = 255f;
|
||||||
|
public float MaxRegionViewDistance
|
||||||
|
{
|
||||||
|
get { return m_maxRegionViewDistance; }
|
||||||
|
}
|
||||||
|
|
||||||
private List<string> m_AllowedViewers = new List<string>();
|
private List<string> m_AllowedViewers = new List<string>();
|
||||||
private List<string> m_BannedViewers = new List<string>();
|
private List<string> m_BannedViewers = new List<string>();
|
||||||
|
|
||||||
|
@ -972,12 +978,16 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
|
|
||||||
m_defaultDrawDistance = startupConfig.GetFloat("DefaultDrawDistance", m_defaultDrawDistance);
|
m_defaultDrawDistance = startupConfig.GetFloat("DefaultDrawDistance", m_defaultDrawDistance);
|
||||||
m_maxDrawDistance = startupConfig.GetFloat("MaxDrawDistance", m_maxDrawDistance);
|
m_maxDrawDistance = startupConfig.GetFloat("MaxDrawDistance", m_maxDrawDistance);
|
||||||
|
m_maxRegionViewDistance = startupConfig.GetFloat("MaxRegionsViewDistance", m_maxRegionViewDistance);
|
||||||
|
|
||||||
LegacySitOffsets = startupConfig.GetBoolean("LegacyOpenSimSitOffsets", LegacySitOffsets);
|
LegacySitOffsets = startupConfig.GetBoolean("LegacyOpenSimSitOffsets", LegacySitOffsets);
|
||||||
|
|
||||||
if (m_defaultDrawDistance > m_maxDrawDistance)
|
if (m_defaultDrawDistance > m_maxDrawDistance)
|
||||||
m_defaultDrawDistance = m_maxDrawDistance;
|
m_defaultDrawDistance = m_maxDrawDistance;
|
||||||
|
|
||||||
|
if (m_maxRegionViewDistance > m_maxDrawDistance)
|
||||||
|
m_maxRegionViewDistance = m_maxDrawDistance;
|
||||||
|
|
||||||
UseBackup = startupConfig.GetBoolean("UseSceneBackup", UseBackup);
|
UseBackup = startupConfig.GetBoolean("UseSceneBackup", UseBackup);
|
||||||
if (!UseBackup)
|
if (!UseBackup)
|
||||||
m_log.InfoFormat("[SCENE]: Backup has been disabled for {0}", RegionInfo.RegionName);
|
m_log.InfoFormat("[SCENE]: Backup has been disabled for {0}", RegionInfo.RegionName);
|
||||||
|
|
|
@ -583,6 +583,14 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public float RegionViewDistance
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return Util.Clamp(m_drawDistance, 32f, m_scene.MaxRegionViewDistance);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public bool AllowMovement { get; set; }
|
public bool AllowMovement { get; set; }
|
||||||
|
|
||||||
private bool m_setAlwaysRun;
|
private bool m_setAlwaysRun;
|
||||||
|
@ -3557,6 +3565,16 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
if (Appearance.AvatarSize != m_lastSize)
|
if (Appearance.AvatarSize != m_lastSize)
|
||||||
SendAvatarDataToAllAgents();
|
SendAvatarDataToAllAgents();
|
||||||
|
|
||||||
|
// Send terse position update if not sitting and position, velocity, or rotation
|
||||||
|
// has changed significantly from last sent update
|
||||||
|
if (!IsSatOnObject && (
|
||||||
|
!Rotation.ApproxEquals(m_lastRotation, ROTATION_TOLERANCE)
|
||||||
|
|| !Velocity.ApproxEquals(m_lastVelocity, VELOCITY_TOLERANCE)
|
||||||
|
|| !m_pos.ApproxEquals(m_lastPosition, POSITION_LARGETOLERANCE)
|
||||||
|
|| (!m_pos.ApproxEquals(m_lastPosition, POSITION_SMALLTOLERANCE) && Velocity.LengthSquared() < LOWVELOCITYSQ )
|
||||||
|
) )
|
||||||
|
{
|
||||||
|
/*
|
||||||
if (!IsSatOnObject)
|
if (!IsSatOnObject)
|
||||||
{
|
{
|
||||||
// this does need to be more complex later
|
// this does need to be more complex later
|
||||||
|
@ -3580,8 +3598,9 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
&& vel.LengthSquared() < LOWVELOCITYSQ
|
&& vel.LengthSquared() < LOWVELOCITYSQ
|
||||||
))
|
))
|
||||||
{
|
{
|
||||||
|
*/
|
||||||
SendTerseUpdateToAllClients();
|
SendTerseUpdateToAllClients();
|
||||||
}
|
// }
|
||||||
}
|
}
|
||||||
CheckForSignificantMovement();
|
CheckForSignificantMovement();
|
||||||
}
|
}
|
||||||
|
@ -4199,7 +4218,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
|
|
||||||
// m_log.Debug("---> x: " + x + "; newx:" + newRegionX + "; Abs:" + (int)Math.Abs((int)(x - newRegionX)));
|
// m_log.Debug("---> x: " + x + "; newx:" + newRegionX + "; Abs:" + (int)Math.Abs((int)(x - newRegionX)));
|
||||||
// m_log.Debug("---> y: " + y + "; newy:" + newRegionY + "; Abs:" + (int)Math.Abs((int)(y - newRegionY)));
|
// m_log.Debug("---> y: " + y + "; newy:" + newRegionY + "; Abs:" + (int)Math.Abs((int)(y - newRegionY)));
|
||||||
if (Util.IsOutsideView(DrawDistance, x, newRegionX, y, newRegionY,
|
if (Util.IsOutsideView(RegionViewDistance, x, newRegionX, y, newRegionY,
|
||||||
regInfo.sizeX, regInfo.sizeY, newRegionSizeX, newRegionSizeY))
|
regInfo.sizeX, regInfo.sizeY, newRegionSizeX, newRegionSizeY))
|
||||||
{
|
{
|
||||||
byebyeRegions.Add(handle);
|
byebyeRegions.Add(handle);
|
||||||
|
@ -4210,7 +4229,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (Util.IsOutsideView(DrawDistance, x, newRegionX, y, newRegionY,
|
if (Util.IsOutsideView(RegionViewDistance, x, newRegionX, y, newRegionY,
|
||||||
(int)Constants.RegionSize, (int)Constants.RegionSize, newRegionSizeX, newRegionSizeY))
|
(int)Constants.RegionSize, (int)Constants.RegionSize, newRegionSizeX, newRegionSizeY))
|
||||||
{
|
{
|
||||||
byebyeRegions.Add(handle);
|
byebyeRegions.Add(handle);
|
||||||
|
@ -5773,8 +5792,8 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
// respect region owner and managers
|
// respect region owner and managers
|
||||||
if(m_scene.RegionInfo.EstateSettings.IsEstateManagerOrOwner(m_uuid))
|
// if(m_scene.RegionInfo.EstateSettings.IsEstateManagerOrOwner(m_uuid))
|
||||||
return true;
|
// return true;
|
||||||
|
|
||||||
if (!m_scene.RegionInfo.EstateSettings.AllowDirectTeleport)
|
if (!m_scene.RegionInfo.EstateSettings.AllowDirectTeleport)
|
||||||
{
|
{
|
||||||
|
@ -5804,8 +5823,9 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
|| (m_teleportFlags & adicionalLandPointFlags) != 0)
|
|| (m_teleportFlags & adicionalLandPointFlags) != 0)
|
||||||
{
|
{
|
||||||
if (land.LandData.LandingType == (byte)LandingType.LandingPoint &&
|
if (land.LandData.LandingType == (byte)LandingType.LandingPoint &&
|
||||||
land.LandData.UserLocation != Vector3.Zero &&
|
land.LandData.UserLocation != Vector3.Zero )
|
||||||
land.LandData.OwnerID != m_uuid )
|
// &&
|
||||||
|
// land.LandData.OwnerID != m_uuid )
|
||||||
{
|
{
|
||||||
pos = land.LandData.UserLocation;
|
pos = land.LandData.UserLocation;
|
||||||
if(land.LandData.UserLookAt != Vector3.Zero)
|
if(land.LandData.UserLookAt != Vector3.Zero)
|
||||||
|
|
|
@ -47,10 +47,9 @@ public class BSActorAvatarMove : BSActor
|
||||||
// The amount the step up is applying. Used to smooth stair walking.
|
// The amount the step up is applying. Used to smooth stair walking.
|
||||||
float m_lastStepUp;
|
float m_lastStepUp;
|
||||||
|
|
||||||
// Jumping happens over several frames. If use applies up force while colliding, start the
|
// There are times the velocity is set but we don't want to inforce stationary until the
|
||||||
// jump and allow the jump to continue for this number of frames.
|
// real velocity drops.
|
||||||
int m_jumpFrames = 0;
|
bool m_waitingForLowVelocityForStationary = false;
|
||||||
float m_jumpVelocity = 0f;
|
|
||||||
|
|
||||||
public BSActorAvatarMove(BSScene physicsScene, BSPhysObject pObj, string actorName)
|
public BSActorAvatarMove(BSScene physicsScene, BSPhysObject pObj, string actorName)
|
||||||
: base(physicsScene, pObj, actorName)
|
: base(physicsScene, pObj, actorName)
|
||||||
|
@ -117,11 +116,19 @@ public class BSActorAvatarMove : BSActor
|
||||||
m_velocityMotor.SetTarget(targ);
|
m_velocityMotor.SetTarget(targ);
|
||||||
m_velocityMotor.SetCurrent(vel);
|
m_velocityMotor.SetCurrent(vel);
|
||||||
m_velocityMotor.Enabled = true;
|
m_velocityMotor.Enabled = true;
|
||||||
|
m_physicsScene.DetailLog("{0},BSCharacter.MoveMotor,SetVelocityAndTarget,vel={1}, targ={2}",
|
||||||
|
m_controllingPrim.LocalID, vel, targ);
|
||||||
|
m_waitingForLowVelocityForStationary = false;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
// If a hover motor has not been created, create one and start the hovering.
|
public void SuppressStationayCheckUntilLowVelocity()
|
||||||
|
{
|
||||||
|
m_waitingForLowVelocityForStationary = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// If a movement motor has not been created, create one and start the hovering.
|
||||||
private void ActivateAvatarMove()
|
private void ActivateAvatarMove()
|
||||||
{
|
{
|
||||||
if (m_velocityMotor == null)
|
if (m_velocityMotor == null)
|
||||||
|
@ -133,13 +140,14 @@ public class BSActorAvatarMove : BSActor
|
||||||
1f // efficiency
|
1f // efficiency
|
||||||
);
|
);
|
||||||
m_velocityMotor.ErrorZeroThreshold = BSParam.AvatarStopZeroThreshold;
|
m_velocityMotor.ErrorZeroThreshold = BSParam.AvatarStopZeroThreshold;
|
||||||
// _velocityMotor.PhysicsScene = PhysicsScene; // DEBUG DEBUG so motor will output detail log messages.
|
// m_velocityMotor.PhysicsScene = m_controllingPrim.PhysScene; // DEBUG DEBUG so motor will output detail log messages.
|
||||||
SetVelocityAndTarget(m_controllingPrim.RawVelocity, m_controllingPrim.TargetVelocity, true /* inTaintTime */);
|
SetVelocityAndTarget(m_controllingPrim.RawVelocity, m_controllingPrim.TargetVelocity, true /* inTaintTime */);
|
||||||
|
|
||||||
m_physicsScene.BeforeStep += Mover;
|
m_physicsScene.BeforeStep += Mover;
|
||||||
m_controllingPrim.OnPreUpdateProperty += Process_OnPreUpdateProperty;
|
m_controllingPrim.OnPreUpdateProperty += Process_OnPreUpdateProperty;
|
||||||
|
|
||||||
m_walkingUpStairs = 0;
|
m_walkingUpStairs = 0;
|
||||||
|
m_waitingForLowVelocityForStationary = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -190,12 +198,15 @@ public class BSActorAvatarMove : BSActor
|
||||||
// if colliding with something stationary and we're not doing volume detect .
|
// if colliding with something stationary and we're not doing volume detect .
|
||||||
if (!m_controllingPrim.ColliderIsMoving && !m_controllingPrim.ColliderIsVolumeDetect)
|
if (!m_controllingPrim.ColliderIsMoving && !m_controllingPrim.ColliderIsVolumeDetect)
|
||||||
{
|
{
|
||||||
m_physicsScene.DetailLog("{0},BSCharacter.MoveMotor,collidingWithStationary,totalForce={1}, vel={2}", /* DEBUG */
|
if (m_waitingForLowVelocityForStationary)
|
||||||
m_controllingPrim.LocalID, m_physicsScene.PE.GetTotalForce(m_controllingPrim.PhysBody), m_controllingPrim.Velocity); /* DEBUG */
|
{
|
||||||
// If velocity is very small, assume it is movement creep and suppress it.
|
// if waiting for velocity to drop and it has finally dropped, we can be stationary
|
||||||
// Applying push forces (Character.AddForce) should move the avatar and that is only seen here as velocity.
|
if (m_controllingPrim.RawVelocity.LengthSquared() < BSParam.AvatarStopZeroThresholdSquared)
|
||||||
if ( (m_controllingPrim.Velocity.LengthSquared() < BSParam.AvatarStopZeroThresholdSquared)
|
{
|
||||||
&& (m_physicsScene.PE.GetTotalForce(m_controllingPrim.PhysBody).LengthSquared() < BSParam.AvatarStopZeroThresholdSquared) )
|
m_waitingForLowVelocityForStationary = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!m_waitingForLowVelocityForStationary)
|
||||||
{
|
{
|
||||||
m_physicsScene.DetailLog("{0},BSCharacter.MoveMotor,collidingWithStationary,zeroingMotion", m_controllingPrim.LocalID);
|
m_physicsScene.DetailLog("{0},BSCharacter.MoveMotor,collidingWithStationary,zeroingMotion", m_controllingPrim.LocalID);
|
||||||
m_controllingPrim.IsStationary = true;
|
m_controllingPrim.IsStationary = true;
|
||||||
|
@ -203,8 +214,8 @@ public class BSActorAvatarMove : BSActor
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
m_physicsScene.DetailLog("{0},BSCharacter.MoveMotor,collidingWithStationary,not zeroing because velocity={1}",
|
m_physicsScene.DetailLog("{0},BSCharacter.MoveMotor,waitingForLowVel,rawvel={1}",
|
||||||
m_controllingPrim.LocalID, m_controllingPrim.Velocity);
|
m_controllingPrim.LocalID, m_controllingPrim.RawVelocity.Length());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -250,50 +261,24 @@ public class BSActorAvatarMove : BSActor
|
||||||
m_physicsScene.PE.SetFriction(m_controllingPrim.PhysBody, m_controllingPrim.Friction);
|
m_physicsScene.PE.SetFriction(m_controllingPrim.PhysBody, m_controllingPrim.Friction);
|
||||||
}
|
}
|
||||||
|
|
||||||
// If not flying and not colliding, assume falling and keep the downward motion component.
|
// 'm_velocityMotor is used for walking, flying, and jumping and will thus have the correct values
|
||||||
// This check is done here for the next jump test.
|
// for Z. But in come cases it must be over-ridden. Like when falling or jumping.
|
||||||
if (!m_controllingPrim.Flying && !m_controllingPrim.IsColliding)
|
|
||||||
{
|
|
||||||
stepVelocity.Z = m_controllingPrim.RawVelocity.Z;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Colliding and not flying with an upward force. The avatar must be trying to jump.
|
float realVelocityZ = m_controllingPrim.RawVelocity.Z;
|
||||||
if (!m_controllingPrim.Flying && m_controllingPrim.IsColliding && stepVelocity.Z > 0)
|
|
||||||
{
|
|
||||||
// We allow the upward force to happen for this many frames.
|
|
||||||
m_jumpFrames = BSParam.AvatarJumpFrames;
|
|
||||||
m_jumpVelocity = stepVelocity.Z;
|
|
||||||
}
|
|
||||||
|
|
||||||
// The case where the avatar is not colliding and is not flying is special.
|
// If not flying and falling, we over-ride the stepping motor so we can fall to the ground
|
||||||
// The avatar is either falling or jumping and the user can be applying force to the avatar
|
if (!m_controllingPrim.Flying && realVelocityZ < 0)
|
||||||
// (force in some direction or force up or down).
|
|
||||||
// If the avatar has negative Z velocity and is not colliding, presume we're falling and keep the velocity.
|
|
||||||
// If the user is trying to apply upward force but we're not colliding, assume the avatar
|
|
||||||
// is trying to jump and don't apply the upward force if not touching the ground any more.
|
|
||||||
if (!m_controllingPrim.Flying && !m_controllingPrim.IsColliding)
|
|
||||||
{
|
{
|
||||||
// If upward velocity is being applied, this must be a jump and only allow that to go on so long
|
// Can't fall faster than this
|
||||||
if (m_jumpFrames > 0)
|
if (realVelocityZ < BSParam.AvatarTerminalVelocity)
|
||||||
{
|
{
|
||||||
// Since not touching the ground, only apply upward force for so long.
|
realVelocityZ = BSParam.AvatarTerminalVelocity;
|
||||||
m_jumpFrames--;
|
|
||||||
stepVelocity.Z = m_jumpVelocity;
|
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
stepVelocity.Z = realVelocityZ;
|
||||||
// Since we're not affected by anything, the avatar must be falling and we do not want that to be too fast.
|
|
||||||
if (m_controllingPrim.RawVelocity.Z < BSParam.AvatarTerminalVelocity)
|
|
||||||
{
|
|
||||||
stepVelocity.Z = BSParam.AvatarTerminalVelocity;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
stepVelocity.Z = m_controllingPrim.RawVelocity.Z;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// DetailLog("{0},BSCharacter.MoveMotor,taint,overrideStepZWithWorldZ,stepVel={1}", LocalID, stepVelocity);
|
|
||||||
}
|
}
|
||||||
|
// m_physicsScene.DetailLog("{0},BSCharacter.MoveMotor,DEBUG,motorCurrent={1},realZ={2},flying={3},collid={4},jFrames={5}",
|
||||||
|
// m_controllingPrim.LocalID, m_velocityMotor.CurrentValue, realVelocityZ, m_controllingPrim.Flying, m_controllingPrim.IsColliding, m_jumpFrames);
|
||||||
|
|
||||||
//Alicia: Maintain minimum height when flying.
|
//Alicia: Maintain minimum height when flying.
|
||||||
// SL has a flying effect that keeps the avatar flying above the ground by some margin
|
// SL has a flying effect that keeps the avatar flying above the ground by some margin
|
||||||
|
@ -304,6 +289,8 @@ public class BSActorAvatarMove : BSActor
|
||||||
|
|
||||||
if( m_controllingPrim.Position.Z < hover_height)
|
if( m_controllingPrim.Position.Z < hover_height)
|
||||||
{
|
{
|
||||||
|
m_physicsScene.DetailLog("{0},BSCharacter.MoveMotor,addingUpforceForGroundMargin,height={1},hoverHeight={2}",
|
||||||
|
m_controllingPrim.LocalID, m_controllingPrim.Position.Z, hover_height);
|
||||||
stepVelocity.Z += BSParam.AvatarFlyingGroundUpForce;
|
stepVelocity.Z += BSParam.AvatarFlyingGroundUpForce;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -328,11 +315,7 @@ public class BSActorAvatarMove : BSActor
|
||||||
if (m_controllingPrim.IsStationary)
|
if (m_controllingPrim.IsStationary)
|
||||||
{
|
{
|
||||||
entprop.Position = m_controllingPrim.RawPosition;
|
entprop.Position = m_controllingPrim.RawPosition;
|
||||||
// Suppress small movement velocity
|
entprop.Velocity = OMV.Vector3.Zero;
|
||||||
if (entprop.Velocity.LengthSquared() < BSParam.AvatarStopZeroThresholdSquared) {
|
|
||||||
m_physicsScene.DetailLog("{0},BSCharacter.MoveMotor,OnPreUpdate,zeroing velocity={1}", m_controllingPrim.LocalID, entprop.Velocity);
|
|
||||||
entprop.Velocity = OMV.Vector3.Zero;
|
|
||||||
}
|
|
||||||
m_physicsScene.PE.SetTranslation(m_controllingPrim.PhysBody, entprop.Position, entprop.Rotation);
|
m_physicsScene.PE.SetTranslation(m_controllingPrim.PhysBody, entprop.Position, entprop.Rotation);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -211,7 +211,7 @@ public class BSActorMoveToTarget : BSActor
|
||||||
// Add enough force to overcome the mass of the object
|
// Add enough force to overcome the mass of the object
|
||||||
addedForce *= m_controllingPrim.Mass;
|
addedForce *= m_controllingPrim.Mass;
|
||||||
|
|
||||||
m_controllingPrim.AddForce(addedForce, false /* pushForce */, true /* inTaintTime */);
|
m_controllingPrim.AddForce(true /* inTaintTime */, addedForce);
|
||||||
}
|
}
|
||||||
m_physicsScene.DetailLog("{0},BSActorMoveToTarget.Mover3,move,fromPos={1},addedForce={2}",
|
m_physicsScene.DetailLog("{0},BSActorMoveToTarget.Mover3,move,fromPos={1},addedForce={2}",
|
||||||
m_controllingPrim.LocalID, origPosition, addedForce);
|
m_controllingPrim.LocalID, origPosition, addedForce);
|
||||||
|
|
|
@ -127,7 +127,7 @@ public class BSActorSetTorque : BSActor
|
||||||
m_physicsScene.DetailLog("{0},BSActorSetTorque,preStep,force={1}", m_controllingPrim.LocalID, m_controllingPrim.RawTorque);
|
m_physicsScene.DetailLog("{0},BSActorSetTorque,preStep,force={1}", m_controllingPrim.LocalID, m_controllingPrim.RawTorque);
|
||||||
if (m_controllingPrim.PhysBody.HasPhysicalBody)
|
if (m_controllingPrim.PhysBody.HasPhysicalBody)
|
||||||
{
|
{
|
||||||
m_controllingPrim.AddAngularForce(m_controllingPrim.RawTorque, false, true);
|
m_controllingPrim.AddAngularForce(true /* inTaintTime */, m_controllingPrim.RawTorque);
|
||||||
m_controllingPrim.ActivateIfPhysical(false);
|
m_controllingPrim.ActivateIfPhysical(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -89,6 +89,7 @@ public sealed class BSCharacter : BSPhysObject
|
||||||
_buoyancy = ComputeBuoyancyFromFlying(isFlying);
|
_buoyancy = ComputeBuoyancyFromFlying(isFlying);
|
||||||
Friction = BSParam.AvatarStandingFriction;
|
Friction = BSParam.AvatarStandingFriction;
|
||||||
Density = BSParam.AvatarDensity;
|
Density = BSParam.AvatarDensity;
|
||||||
|
_isPhysical = true;
|
||||||
|
|
||||||
// Old versions of ScenePresence passed only the height. If width and/or depth are zero,
|
// Old versions of ScenePresence passed only the height. If width and/or depth are zero,
|
||||||
// replace with the default values.
|
// replace with the default values.
|
||||||
|
@ -457,7 +458,7 @@ public sealed class BSCharacter : BSPhysObject
|
||||||
get { return RawVelocity; }
|
get { return RawVelocity; }
|
||||||
set {
|
set {
|
||||||
RawVelocity = value;
|
RawVelocity = value;
|
||||||
OMV.Vector3 vel = RawVelocity;
|
OMV.Vector3 vel = RawVelocity;
|
||||||
|
|
||||||
DetailLog("{0}: set Velocity = {1}", LocalID, value);
|
DetailLog("{0}: set Velocity = {1}", LocalID, value);
|
||||||
|
|
||||||
|
@ -662,10 +663,10 @@ public sealed class BSCharacter : BSPhysObject
|
||||||
addForce *= Mass * BSParam.AvatarAddForcePushFactor;
|
addForce *= Mass * BSParam.AvatarAddForcePushFactor;
|
||||||
|
|
||||||
DetailLog("{0},BSCharacter.addForce,call,force={1},addForce={2},push={3},mass={4}", LocalID, force, addForce, pushforce, Mass);
|
DetailLog("{0},BSCharacter.addForce,call,force={1},addForce={2},push={3},mass={4}", LocalID, force, addForce, pushforce, Mass);
|
||||||
AddForce(addForce, pushforce, false);
|
AddForce(false, addForce);
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void AddForce(OMV.Vector3 force, bool pushforce, bool inTaintTime) {
|
public override void AddForce(bool inTaintTime, OMV.Vector3 force) {
|
||||||
if (force.IsFinite())
|
if (force.IsFinite())
|
||||||
{
|
{
|
||||||
OMV.Vector3 addForce = Util.ClampV(force, BSParam.MaxAddForceMagnitude);
|
OMV.Vector3 addForce = Util.ClampV(force, BSParam.MaxAddForceMagnitude);
|
||||||
|
@ -683,6 +684,10 @@ public sealed class BSCharacter : BSPhysObject
|
||||||
PhysScene.PE.ApplyCentralForce(PhysBody, addForce);
|
PhysScene.PE.ApplyCentralForce(PhysBody, addForce);
|
||||||
PhysScene.PE.Activate(PhysBody, true);
|
PhysScene.PE.Activate(PhysBody, true);
|
||||||
}
|
}
|
||||||
|
if (m_moveActor != null)
|
||||||
|
{
|
||||||
|
m_moveActor.SuppressStationayCheckUntilLowVelocity();
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -692,7 +697,7 @@ public sealed class BSCharacter : BSPhysObject
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void AddAngularForce(OMV.Vector3 force, bool pushforce, bool inTaintTime) {
|
public override void AddAngularForce(bool inTaintTime, OMV.Vector3 force) {
|
||||||
}
|
}
|
||||||
public override void SetMomentum(OMV.Vector3 momentum) {
|
public override void SetMomentum(OMV.Vector3 momentum) {
|
||||||
}
|
}
|
||||||
|
|
|
@ -768,7 +768,7 @@ namespace OpenSim.Region.PhysicsModule.BulletS
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((m_knownChanged & m_knownChangedForce) != 0)
|
if ((m_knownChanged & m_knownChangedForce) != 0)
|
||||||
ControllingPrim.AddForce((Vector3)m_knownForce, false /*pushForce*/, true /*inTaintTime*/);
|
ControllingPrim.AddForce(false /* inTaintTime */, (Vector3)m_knownForce);
|
||||||
|
|
||||||
if ((m_knownChanged & m_knownChangedForceImpulse) != 0)
|
if ((m_knownChanged & m_knownChangedForceImpulse) != 0)
|
||||||
ControllingPrim.AddForceImpulse((Vector3)m_knownForceImpulse, false /*pushforce*/, true /*inTaintTime*/);
|
ControllingPrim.AddForceImpulse((Vector3)m_knownForceImpulse, false /*pushforce*/, true /*inTaintTime*/);
|
||||||
|
@ -784,7 +784,7 @@ namespace OpenSim.Region.PhysicsModule.BulletS
|
||||||
|
|
||||||
if ((m_knownChanged & m_knownChangedRotationalForce) != 0)
|
if ((m_knownChanged & m_knownChangedRotationalForce) != 0)
|
||||||
{
|
{
|
||||||
ControllingPrim.AddAngularForce((Vector3)m_knownRotationalForce, false /*pushForce*/, true /*inTaintTime*/);
|
ControllingPrim.AddAngularForce(true /* inTaintTime */, (Vector3)m_knownRotationalForce);
|
||||||
}
|
}
|
||||||
|
|
||||||
// If we set one of the values (ie, the physics engine didn't do it) we must force
|
// If we set one of the values (ie, the physics engine didn't do it) we must force
|
||||||
|
|
|
@ -633,7 +633,7 @@ public static class BSParam
|
||||||
new ParameterDefn<float>("AvatarAddForcePushFactor", "BSCharacter.AddForce is multiplied by this and mass to be like other physics engines",
|
new ParameterDefn<float>("AvatarAddForcePushFactor", "BSCharacter.AddForce is multiplied by this and mass to be like other physics engines",
|
||||||
0.315f ),
|
0.315f ),
|
||||||
new ParameterDefn<float>("AvatarStopZeroThreshold", "Movement velocity below which avatar is assumed to be stopped",
|
new ParameterDefn<float>("AvatarStopZeroThreshold", "Movement velocity below which avatar is assumed to be stopped",
|
||||||
0.1f,
|
0.4f,
|
||||||
(s) => { return (float)AvatarStopZeroThreshold; },
|
(s) => { return (float)AvatarStopZeroThreshold; },
|
||||||
(s,v) => { AvatarStopZeroThreshold = v; AvatarStopZeroThresholdSquared = v * v; } ),
|
(s,v) => { AvatarStopZeroThreshold = v; AvatarStopZeroThresholdSquared = v * v; } ),
|
||||||
new ParameterDefn<float>("AvatarBelowGroundUpCorrectionMeters", "Meters to move avatar up if it seems to be below ground",
|
new ParameterDefn<float>("AvatarBelowGroundUpCorrectionMeters", "Meters to move avatar up if it seems to be below ground",
|
||||||
|
|
|
@ -245,10 +245,10 @@ public abstract class BSPhysObject : PhysicsActor
|
||||||
|
|
||||||
public override void AddAngularForce(OMV.Vector3 force, bool pushforce)
|
public override void AddAngularForce(OMV.Vector3 force, bool pushforce)
|
||||||
{
|
{
|
||||||
AddAngularForce(force, pushforce, false);
|
AddAngularForce(false, force);
|
||||||
}
|
}
|
||||||
public abstract void AddAngularForce(OMV.Vector3 force, bool pushforce, bool inTaintTime);
|
public abstract void AddAngularForce(bool inTaintTime, OMV.Vector3 force);
|
||||||
public abstract void AddForce(OMV.Vector3 force, bool pushforce, bool inTaintTime);
|
public abstract void AddForce(bool inTaintTime, OMV.Vector3 force);
|
||||||
|
|
||||||
public abstract OMV.Vector3 ForceRotationalVelocity { get; set; }
|
public abstract OMV.Vector3 ForceRotationalVelocity { get; set; }
|
||||||
|
|
||||||
|
@ -505,17 +505,20 @@ public abstract class BSPhysObject : PhysicsActor
|
||||||
// Collision sound requires a velocity to know it should happen. This is a lot of computation for a little used feature.
|
// Collision sound requires a velocity to know it should happen. This is a lot of computation for a little used feature.
|
||||||
OMV.Vector3 relvel = OMV.Vector3.Zero;
|
OMV.Vector3 relvel = OMV.Vector3.Zero;
|
||||||
if (IsPhysical)
|
if (IsPhysical)
|
||||||
relvel = Velocity;
|
relvel = RawVelocity;
|
||||||
if (collidee != null && collidee.IsPhysical)
|
if (collidee != null && collidee.IsPhysical)
|
||||||
relvel -= collidee.Velocity;
|
relvel -= collidee.RawVelocity;
|
||||||
newContact.RelativeSpeed = OMV.Vector3.Dot(relvel, contactNormal);
|
newContact.RelativeSpeed = OMV.Vector3.Dot(relvel, contactNormal);
|
||||||
|
// DetailLog("{0},{1}.Collision.AddCollider,vel={2},contee.vel={3},relvel={4},relspeed={5}",
|
||||||
|
// LocalID, TypeName, RawVelocity, (collidee == null ? OMV.Vector3.Zero : collidee.RawVelocity), relvel, newContact.RelativeSpeed);
|
||||||
|
|
||||||
lock (PhysScene.CollisionLock)
|
lock (PhysScene.CollisionLock)
|
||||||
{
|
{
|
||||||
CollisionCollection.AddCollider(collideeLocalID, newContact);
|
CollisionCollection.AddCollider(collideeLocalID, newContact);
|
||||||
}
|
}
|
||||||
DetailLog("{0},{1}.Collision.AddCollider,call,with={2},point={3},normal={4},depth={5},colliderMoving={6}",
|
DetailLog("{0},{1}.Collision.AddCollider,call,with={2},point={3},normal={4},depth={5},speed={6},colliderMoving={7}",
|
||||||
LocalID, TypeName, collideeLocalID, contactPoint, contactNormal, pentrationDepth, ColliderIsMoving);
|
LocalID, TypeName, collideeLocalID, contactPoint, contactNormal, pentrationDepth,
|
||||||
|
newContact.RelativeSpeed, ColliderIsMoving);
|
||||||
|
|
||||||
ret = true;
|
ret = true;
|
||||||
}
|
}
|
||||||
|
|
|
@ -394,7 +394,7 @@ public class BSPrim : BSPhysObject
|
||||||
// Apply upforce and overcome gravity.
|
// Apply upforce and overcome gravity.
|
||||||
OMV.Vector3 correctionForce = upForce - PhysScene.DefaultGravity;
|
OMV.Vector3 correctionForce = upForce - PhysScene.DefaultGravity;
|
||||||
DetailLog("{0},BSPrim.PositionSanityCheck,applyForce,pos={1},upForce={2},correctionForce={3}", LocalID, RawPosition, upForce, correctionForce);
|
DetailLog("{0},BSPrim.PositionSanityCheck,applyForce,pos={1},upForce={2},correctionForce={3}", LocalID, RawPosition, upForce, correctionForce);
|
||||||
AddForce(correctionForce, false, inTaintTime);
|
AddForce(inTaintTime, correctionForce);
|
||||||
ret = true;
|
ret = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1249,14 +1249,18 @@ public class BSPrim : BSPhysObject
|
||||||
// Per documentation, max force is limited.
|
// Per documentation, max force is limited.
|
||||||
OMV.Vector3 addForce = Util.ClampV(force, BSParam.MaxAddForceMagnitude);
|
OMV.Vector3 addForce = Util.ClampV(force, BSParam.MaxAddForceMagnitude);
|
||||||
|
|
||||||
// Since this force is being applied in only one step, make this a force per second.
|
// Push forces seem to be scaled differently (follow pattern in ubODE)
|
||||||
addForce /= PhysScene.LastTimeStep;
|
if (!pushforce) {
|
||||||
AddForce(addForce, pushforce, false /* inTaintTime */);
|
// Since this force is being applied in only one step, make this a force per second.
|
||||||
|
addForce /= PhysScene.LastTimeStep;
|
||||||
|
}
|
||||||
|
|
||||||
|
AddForce(false /* inTaintTime */, addForce);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Applying a force just adds this to the total force on the object.
|
// Applying a force just adds this to the total force on the object.
|
||||||
// This added force will only last the next simulation tick.
|
// This added force will only last the next simulation tick.
|
||||||
public override void AddForce(OMV.Vector3 force, bool pushforce, bool inTaintTime) {
|
public override void AddForce(bool inTaintTime, OMV.Vector3 force) {
|
||||||
// for an object, doesn't matter if force is a pushforce or not
|
// for an object, doesn't matter if force is a pushforce or not
|
||||||
if (IsPhysicallyActive)
|
if (IsPhysicallyActive)
|
||||||
{
|
{
|
||||||
|
@ -1315,7 +1319,7 @@ public class BSPrim : BSPhysObject
|
||||||
}
|
}
|
||||||
|
|
||||||
// BSPhysObject.AddAngularForce()
|
// BSPhysObject.AddAngularForce()
|
||||||
public override void AddAngularForce(OMV.Vector3 force, bool pushforce, bool inTaintTime)
|
public override void AddAngularForce(bool inTaintTime, OMV.Vector3 force)
|
||||||
{
|
{
|
||||||
if (force.IsFinite())
|
if (force.IsFinite())
|
||||||
{
|
{
|
||||||
|
|
|
@ -400,9 +400,9 @@
|
||||||
;; Allow region managers to assume god powers in regions they manage
|
;; Allow region managers to assume god powers in regions they manage
|
||||||
; region_manager_is_god = false
|
; region_manager_is_god = false
|
||||||
|
|
||||||
;# {parcel_owner_is_god} {} {Allow parcel owner gods} {true false} true
|
;# {parcel_owner_is_god} {} {Allow parcel owner gods} {true false} false
|
||||||
;; Allow parcel owners to assume god powers in their parcels
|
;; Allow parcel owners to assume god powers in their parcels
|
||||||
; parcel_owner_is_god = true
|
; parcel_owner_is_god = false
|
||||||
|
|
||||||
;# {simple_build_permissions} {} {Allow building in parcel by access list (no groups)} {true false} false
|
;# {simple_build_permissions} {} {Allow building in parcel by access list (no groups)} {true false} false
|
||||||
;; More control over permissions
|
;; More control over permissions
|
||||||
|
|
|
@ -161,13 +161,19 @@
|
||||||
; Warning! Don't use this with regions that have existing content!, This will likely break them
|
; Warning! Don't use this with regions that have existing content!, This will likely break them
|
||||||
CombineContiguousRegions = false
|
CombineContiguousRegions = false
|
||||||
|
|
||||||
; Extend the region's draw distance; 255m is the default which includes
|
; the default view range. Viewers override this ( no major effect still )
|
||||||
; one neighbor on each side of the current region, 767m would go three
|
|
||||||
; neighbors on each side for a total of 49 regions in view. Warning, unless
|
|
||||||
; all the regions have the same drawdistance, you will end up with strange
|
|
||||||
; effects because the agents that get closed may be inconsistent.
|
|
||||||
DefaultDrawDistance = 255.0
|
DefaultDrawDistance = 255.0
|
||||||
|
|
||||||
|
; limit the maximum view range ( no effect still (does limit MaxRegionsViewDistance) )
|
||||||
|
MaxDrawDistance = 512
|
||||||
|
|
||||||
|
; the maximum distance to tell a viewer to connect to a neighbour region, so it can be seen
|
||||||
|
; (it is limited by MaxDrawDistance above)
|
||||||
|
; less than 256 shows imediate neighbours; 512 also second imediate neighbours etc
|
||||||
|
; more than 512m can cause viewers problems specially in case of dense regions.
|
||||||
|
; curretly this distance is from current region borders.
|
||||||
|
MaxRegionsViewDistance = 255
|
||||||
|
|
||||||
; If you have only one region in an instance, or to avoid the many bugs
|
; If you have only one region in an instance, or to avoid the many bugs
|
||||||
; that you can trigger in modules by restarting a region, set this to
|
; that you can trigger in modules by restarting a region, set this to
|
||||||
; true to make the entire instance exit instead of restarting the region.
|
; true to make the entire instance exit instead of restarting the region.
|
||||||
|
@ -412,7 +418,7 @@
|
||||||
; please note that this still doesn't duplicate SL, and is not intended to
|
; please note that this still doesn't duplicate SL, and is not intended to
|
||||||
;region_owner_is_god = true
|
;region_owner_is_god = true
|
||||||
;region_manager_is_god = false
|
;region_manager_is_god = false
|
||||||
;parcel_owner_is_god = true
|
;parcel_owner_is_god = false
|
||||||
|
|
||||||
; Control user types that are allowed to create new scripts
|
; Control user types that are allowed to create new scripts
|
||||||
; Only enforced if serviceside_object_permissions is true
|
; Only enforced if serviceside_object_permissions is true
|
||||||
|
|
Loading…
Reference in New Issue