Merge branch 'avination' into careminster
commit
fe029cf4e8
|
@ -70,6 +70,8 @@ namespace OpenSim.Framework
|
||||||
|
|
||||||
public delegate void StopAnim(IClientAPI remoteClient, UUID animID);
|
public delegate void StopAnim(IClientAPI remoteClient, UUID animID);
|
||||||
|
|
||||||
|
public delegate void ChangeAnim(UUID animID, bool addOrRemove, bool sendPack);
|
||||||
|
|
||||||
public delegate void LinkObjects(IClientAPI remoteClient, uint parent, List<uint> children);
|
public delegate void LinkObjects(IClientAPI remoteClient, uint parent, List<uint> children);
|
||||||
|
|
||||||
public delegate void DelinkObjects(List<uint> primIds, IClientAPI client);
|
public delegate void DelinkObjects(List<uint> primIds, IClientAPI client);
|
||||||
|
@ -791,6 +793,7 @@ namespace OpenSim.Framework
|
||||||
event ObjectDrop OnObjectDrop;
|
event ObjectDrop OnObjectDrop;
|
||||||
event StartAnim OnStartAnim;
|
event StartAnim OnStartAnim;
|
||||||
event StopAnim OnStopAnim;
|
event StopAnim OnStopAnim;
|
||||||
|
event ChangeAnim OnChangeAnim;
|
||||||
event LinkObjects OnLinkObjects;
|
event LinkObjects OnLinkObjects;
|
||||||
event DelinkObjects OnDelinkObjects;
|
event DelinkObjects OnDelinkObjects;
|
||||||
event RequestMapBlocks OnRequestMapBlocks;
|
event RequestMapBlocks OnRequestMapBlocks;
|
||||||
|
|
|
@ -98,6 +98,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||||
public event AvatarPickerRequest OnAvatarPickerRequest;
|
public event AvatarPickerRequest OnAvatarPickerRequest;
|
||||||
public event StartAnim OnStartAnim;
|
public event StartAnim OnStartAnim;
|
||||||
public event StopAnim OnStopAnim;
|
public event StopAnim OnStopAnim;
|
||||||
|
public event ChangeAnim OnChangeAnim;
|
||||||
public event Action<IClientAPI> OnRequestAvatarsData;
|
public event Action<IClientAPI> OnRequestAvatarsData;
|
||||||
public event LinkObjects OnLinkObjects;
|
public event LinkObjects OnLinkObjects;
|
||||||
public event DelinkObjects OnDelinkObjects;
|
public event DelinkObjects OnDelinkObjects;
|
||||||
|
@ -6386,7 +6387,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
#endregion
|
#endregion
|
||||||
|
/*
|
||||||
StartAnim handlerStartAnim = null;
|
StartAnim handlerStartAnim = null;
|
||||||
StopAnim handlerStopAnim = null;
|
StopAnim handlerStopAnim = null;
|
||||||
|
|
||||||
|
@ -6409,6 +6410,25 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return true;
|
||||||
|
*/
|
||||||
|
ChangeAnim handlerChangeAnim = null;
|
||||||
|
|
||||||
|
for (int i = 0; i < AgentAni.AnimationList.Length; i++)
|
||||||
|
{
|
||||||
|
handlerChangeAnim = OnChangeAnim;
|
||||||
|
if (handlerChangeAnim != null)
|
||||||
|
{
|
||||||
|
handlerChangeAnim(AgentAni.AnimationList[i].AnimID, AgentAni.AnimationList[i].StartAnim, false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
handlerChangeAnim = OnChangeAnim;
|
||||||
|
if (handlerChangeAnim != null)
|
||||||
|
{
|
||||||
|
handlerChangeAnim(UUID.Zero, false, true);
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -117,6 +117,22 @@ namespace OpenSim.Region.Framework.Scenes.Animation
|
||||||
SendAnimPack();
|
SendAnimPack();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void avnChangeAnim(UUID animID, bool addRemove, bool sendPack)
|
||||||
|
{
|
||||||
|
if (m_scenePresence.IsChildAgent)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (animID != UUID.Zero)
|
||||||
|
{
|
||||||
|
if (addRemove)
|
||||||
|
m_animations.Add(animID, m_scenePresence.ControllingClient.NextAnimationSequenceNumber, UUID.Zero);
|
||||||
|
else
|
||||||
|
m_animations.Remove(animID);
|
||||||
|
}
|
||||||
|
if(sendPack)
|
||||||
|
SendAnimPack();
|
||||||
|
}
|
||||||
|
|
||||||
// Called from scripts
|
// Called from scripts
|
||||||
public void RemoveAnimation(string name)
|
public void RemoveAnimation(string name)
|
||||||
{
|
{
|
||||||
|
|
|
@ -789,6 +789,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
ControllingClient.OnSetAlwaysRun += HandleSetAlwaysRun;
|
ControllingClient.OnSetAlwaysRun += HandleSetAlwaysRun;
|
||||||
ControllingClient.OnStartAnim += HandleStartAnim;
|
ControllingClient.OnStartAnim += HandleStartAnim;
|
||||||
ControllingClient.OnStopAnim += HandleStopAnim;
|
ControllingClient.OnStopAnim += HandleStopAnim;
|
||||||
|
ControllingClient.OnChangeAnim += avnHandleChangeAnim;
|
||||||
ControllingClient.OnForceReleaseControls += HandleForceReleaseControls;
|
ControllingClient.OnForceReleaseControls += HandleForceReleaseControls;
|
||||||
ControllingClient.OnAutoPilotGo += MoveToTarget;
|
ControllingClient.OnAutoPilotGo += MoveToTarget;
|
||||||
|
|
||||||
|
@ -2437,6 +2438,13 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
Animator.RemoveAnimation(animID);
|
Animator.RemoveAnimation(animID);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void avnHandleChangeAnim(UUID animID, bool addRemove,bool sendPack)
|
||||||
|
{
|
||||||
|
Animator.avnChangeAnim(animID, addRemove, sendPack);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Rotate the avatar to the given rotation and apply a movement in the given relative vector
|
/// Rotate the avatar to the given rotation and apply a movement in the given relative vector
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|
|
@ -264,8 +264,12 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
float targetframetime = 1100.0f / (float)m_nominalReportedFps;
|
float targetframetime = 1100.0f / (float)m_nominalReportedFps;
|
||||||
|
|
||||||
float sparetime;
|
float sparetime;
|
||||||
|
float sleeptime;
|
||||||
if (TotalFrameTime > targetframetime)
|
if (TotalFrameTime > targetframetime)
|
||||||
|
{
|
||||||
sparetime = 0;
|
sparetime = 0;
|
||||||
|
sleeptime = 0;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
sparetime = m_frameMS - m_physicsMS - m_agentMS;
|
sparetime = m_frameMS - m_physicsMS - m_agentMS;
|
||||||
|
@ -274,6 +278,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
sparetime = 0;
|
sparetime = 0;
|
||||||
else if (sparetime > TotalFrameTime)
|
else if (sparetime > TotalFrameTime)
|
||||||
sparetime = TotalFrameTime;
|
sparetime = TotalFrameTime;
|
||||||
|
sleeptime = m_sleeptimeMS * perframe;
|
||||||
}
|
}
|
||||||
|
|
||||||
// other MS is actually simulation time
|
// other MS is actually simulation time
|
||||||
|
@ -363,7 +368,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
sb[21].StatValue = sparetime;
|
sb[21].StatValue = sparetime;
|
||||||
|
|
||||||
sb[22].StatID = (uint)Stats.SimSleepTime;
|
sb[22].StatID = (uint)Stats.SimSleepTime;
|
||||||
sb[22].StatValue = m_sleeptimeMS * perframe;
|
sb[22].StatValue = sleeptime;
|
||||||
|
|
||||||
for (int i = 0; i < 23; i++)
|
for (int i = 0; i < 23; i++)
|
||||||
{
|
{
|
||||||
|
|
|
@ -669,6 +669,7 @@ namespace OpenSim.Region.OptionalModules.Agent.InternetRelayClientView.Server
|
||||||
public event ObjectDrop OnObjectDrop;
|
public event ObjectDrop OnObjectDrop;
|
||||||
public event StartAnim OnStartAnim;
|
public event StartAnim OnStartAnim;
|
||||||
public event StopAnim OnStopAnim;
|
public event StopAnim OnStopAnim;
|
||||||
|
public event ChangeAnim OnChangeAnim;
|
||||||
public event LinkObjects OnLinkObjects;
|
public event LinkObjects OnLinkObjects;
|
||||||
public event DelinkObjects OnDelinkObjects;
|
public event DelinkObjects OnDelinkObjects;
|
||||||
public event RequestMapBlocks OnRequestMapBlocks;
|
public event RequestMapBlocks OnRequestMapBlocks;
|
||||||
|
|
|
@ -194,6 +194,7 @@ namespace OpenSim.Region.OptionalModules.World.NPC
|
||||||
public event ObjectDrop OnObjectDrop;
|
public event ObjectDrop OnObjectDrop;
|
||||||
public event StartAnim OnStartAnim;
|
public event StartAnim OnStartAnim;
|
||||||
public event StopAnim OnStopAnim;
|
public event StopAnim OnStopAnim;
|
||||||
|
public event ChangeAnim OnChangeAnim;
|
||||||
public event LinkObjects OnLinkObjects;
|
public event LinkObjects OnLinkObjects;
|
||||||
public event DelinkObjects OnDelinkObjects;
|
public event DelinkObjects OnDelinkObjects;
|
||||||
public event RequestMapBlocks OnRequestMapBlocks;
|
public event RequestMapBlocks OnRequestMapBlocks;
|
||||||
|
|
|
@ -1006,9 +1006,9 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (velLengthSquared > 625.0f) // 25m/s apply breaks
|
if (velLengthSquared > 2500.0f) // 50m/s apply breaks
|
||||||
{
|
{
|
||||||
breakfactor = 0.31f * m_mass;
|
breakfactor = 0.16f * m_mass;
|
||||||
vec.X -= breakfactor * vel.X;
|
vec.X -= breakfactor * vel.X;
|
||||||
vec.Y -= breakfactor * vel.Y;
|
vec.Y -= breakfactor * vel.Y;
|
||||||
vec.Z -= breakfactor * vel.Z;
|
vec.Z -= breakfactor * vel.Z;
|
||||||
|
|
|
@ -63,6 +63,9 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
private OdeScene _pParentScene;
|
private OdeScene _pParentScene;
|
||||||
|
|
||||||
// Vehicle properties
|
// Vehicle properties
|
||||||
|
// WARNING this are working copies for internel use
|
||||||
|
// their values may not be the corresponding parameter
|
||||||
|
|
||||||
private Quaternion m_referenceFrame = Quaternion.Identity; // Axis modifier
|
private Quaternion m_referenceFrame = Quaternion.Identity; // Axis modifier
|
||||||
private Quaternion m_RollreferenceFrame = Quaternion.Identity; // what hell is this ?
|
private Quaternion m_RollreferenceFrame = Quaternion.Identity; // what hell is this ?
|
||||||
|
|
||||||
|
@ -244,6 +247,7 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
if (pValue < m_timestep) pValue = m_timestep;
|
if (pValue < m_timestep) pValue = m_timestep;
|
||||||
else if (pValue > 120) pValue = 120;
|
else if (pValue > 120) pValue = 120;
|
||||||
m_angularMotorDecayTimescale = pValue * m_invtimestep;
|
m_angularMotorDecayTimescale = pValue * m_invtimestep;
|
||||||
|
m_amDecay = 1.0f - 1.0f / m_angularMotorDecayTimescale;
|
||||||
break;
|
break;
|
||||||
case Vehicle.ANGULAR_MOTOR_TIMESCALE:
|
case Vehicle.ANGULAR_MOTOR_TIMESCALE:
|
||||||
if (pValue < m_timestep) pValue = m_timestep;
|
if (pValue < m_timestep) pValue = m_timestep;
|
||||||
|
@ -293,6 +297,7 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
if (pValue < m_timestep) pValue = m_timestep;
|
if (pValue < m_timestep) pValue = m_timestep;
|
||||||
else if (pValue > 120) pValue = 120;
|
else if (pValue > 120) pValue = 120;
|
||||||
m_linearMotorDecayTimescale = (0.2f +pValue) * m_invtimestep;
|
m_linearMotorDecayTimescale = (0.2f +pValue) * m_invtimestep;
|
||||||
|
m_lmDecay = (1.0f - 1.0f / m_linearMotorDecayTimescale);
|
||||||
break;
|
break;
|
||||||
case Vehicle.LINEAR_MOTOR_TIMESCALE:
|
case Vehicle.LINEAR_MOTOR_TIMESCALE:
|
||||||
if (pValue < m_timestep) pValue = m_timestep;
|
if (pValue < m_timestep) pValue = m_timestep;
|
||||||
|
@ -320,7 +325,7 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
if (len > 12.566f)
|
if (len > 12.566f)
|
||||||
m_angularMotorDirection *= (12.566f / len);
|
m_angularMotorDirection *= (12.566f / len);
|
||||||
|
|
||||||
m_amEfect = 1.0f / m_angularMotorTimescale; // turn it on
|
m_amEfect = 1.0f ; // turn it on
|
||||||
m_amDecay = 1.0f - 1.0f / m_angularMotorDecayTimescale;
|
m_amDecay = 1.0f - 1.0f / m_angularMotorDecayTimescale;
|
||||||
|
|
||||||
if (rootPrim.Body != IntPtr.Zero && !d.BodyIsEnabled(rootPrim.Body)
|
if (rootPrim.Body != IntPtr.Zero && !d.BodyIsEnabled(rootPrim.Body)
|
||||||
|
@ -338,7 +343,7 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
m_linearMotorDirection *= (100.0f / len);
|
m_linearMotorDirection *= (100.0f / len);
|
||||||
|
|
||||||
m_lmDecay = 1.0f - 1.0f / m_linearMotorDecayTimescale;
|
m_lmDecay = 1.0f - 1.0f / m_linearMotorDecayTimescale;
|
||||||
m_lmEfect = 1.0f / m_linearMotorTimescale; // turn it on
|
m_lmEfect = 1.0f; // turn it on
|
||||||
|
|
||||||
m_ffactor = 0.01f;
|
m_ffactor = 0.01f;
|
||||||
if (rootPrim.Body != IntPtr.Zero && !d.BodyIsEnabled(rootPrim.Body)
|
if (rootPrim.Body != IntPtr.Zero && !d.BodyIsEnabled(rootPrim.Body)
|
||||||
|
@ -374,7 +379,7 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
if (len > 12.566f)
|
if (len > 12.566f)
|
||||||
m_angularMotorDirection *= (12.566f / len);
|
m_angularMotorDirection *= (12.566f / len);
|
||||||
|
|
||||||
m_amEfect = 1.0f / m_angularMotorTimescale; // turn it on
|
m_amEfect = 1.0f; // turn it on
|
||||||
m_amDecay = 1.0f - 1.0f / m_angularMotorDecayTimescale;
|
m_amDecay = 1.0f - 1.0f / m_angularMotorDecayTimescale;
|
||||||
|
|
||||||
if (rootPrim.Body != IntPtr.Zero && !d.BodyIsEnabled(rootPrim.Body)
|
if (rootPrim.Body != IntPtr.Zero && !d.BodyIsEnabled(rootPrim.Body)
|
||||||
|
@ -393,11 +398,9 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
if (len > 100.0f)
|
if (len > 100.0f)
|
||||||
m_linearMotorDirection *= (100.0f / len);
|
m_linearMotorDirection *= (100.0f / len);
|
||||||
|
|
||||||
m_lmEfect = 1.0f / m_linearMotorTimescale; // turn it on
|
m_lmEfect = 1.0f; // turn it on
|
||||||
m_lmDecay = 1.0f - 1.0f / m_linearMotorDecayTimescale;
|
m_lmDecay = 1.0f - 1.0f / m_linearMotorDecayTimescale;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
m_ffactor = 0.01f;
|
m_ffactor = 0.01f;
|
||||||
if (rootPrim.Body != IntPtr.Zero && !d.BodyIsEnabled(rootPrim.Body)
|
if (rootPrim.Body != IntPtr.Zero && !d.BodyIsEnabled(rootPrim.Body)
|
||||||
&& !rootPrim.m_isSelected && !rootPrim.m_disabled)
|
&& !rootPrim.m_isSelected && !rootPrim.m_disabled)
|
||||||
|
@ -747,6 +750,9 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
{
|
{
|
||||||
IntPtr Body = rootPrim.Body;
|
IntPtr Body = rootPrim.Body;
|
||||||
|
|
||||||
|
d.Mass dmass;
|
||||||
|
d.BodyGetMass(Body, out dmass);
|
||||||
|
|
||||||
d.Quaternion rot = d.BodyGetQuaternion(Body);
|
d.Quaternion rot = d.BodyGetQuaternion(Body);
|
||||||
Quaternion objrotq = new Quaternion(rot.X, rot.Y, rot.Z, rot.W); // rotq = rotation of object
|
Quaternion objrotq = new Quaternion(rot.X, rot.Y, rot.Z, rot.W); // rotq = rotation of object
|
||||||
Quaternion rotq = objrotq; // rotq = rotation of object
|
Quaternion rotq = objrotq; // rotq = rotation of object
|
||||||
|
@ -776,10 +782,10 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
float ldampZ = 0;
|
float ldampZ = 0;
|
||||||
|
|
||||||
// linear motor
|
// linear motor
|
||||||
if (m_lmEfect > 0.001 && m_linearMotorTimescale < 1000)
|
if (m_lmEfect > 0.01 && m_linearMotorTimescale < 1000)
|
||||||
{
|
{
|
||||||
tmpV = m_linearMotorDirection - curLocalVel; // velocity error
|
tmpV = m_linearMotorDirection - curLocalVel; // velocity error
|
||||||
tmpV *= m_lmEfect; // error to correct in this timestep
|
tmpV *= m_lmEfect / m_linearMotorTimescale; // error to correct in this timestep
|
||||||
tmpV *= rotq; // to world
|
tmpV *= rotq; // to world
|
||||||
|
|
||||||
if ((m_flags & VehicleFlag.LIMIT_MOTOR_UP) != 0)
|
if ((m_flags & VehicleFlag.LIMIT_MOTOR_UP) != 0)
|
||||||
|
@ -788,7 +794,7 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
if (m_linearMotorOffset.X != 0 || m_linearMotorOffset.Y != 0 || m_linearMotorOffset.Z != 0)
|
if (m_linearMotorOffset.X != 0 || m_linearMotorOffset.Y != 0 || m_linearMotorOffset.Z != 0)
|
||||||
{
|
{
|
||||||
// have offset, do it now
|
// have offset, do it now
|
||||||
tmpV *= rootPrim.Mass;
|
tmpV *= dmass.mass;
|
||||||
d.BodyAddForceAtRelPos(Body, tmpV.X, tmpV.Y, tmpV.Z, m_linearMotorOffset.X, m_linearMotorOffset.Y, m_linearMotorOffset.Z);
|
d.BodyAddForceAtRelPos(Body, tmpV.X, tmpV.Y, tmpV.Z, m_linearMotorOffset.X, m_linearMotorOffset.Y, m_linearMotorOffset.Z);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -799,9 +805,7 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
}
|
}
|
||||||
|
|
||||||
m_lmEfect *= m_lmDecay;
|
m_lmEfect *= m_lmDecay;
|
||||||
|
m_ffactor = 0.01f + 1e-4f * curVel.LengthSquared();
|
||||||
// m_ffactor = 0.01f + 1e-4f * curVel.LengthSquared();
|
|
||||||
m_ffactor = 0;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -1007,7 +1011,7 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
if (m_amEfect > 0.01 && m_angularMotorTimescale < 1000)
|
if (m_amEfect > 0.01 && m_angularMotorTimescale < 1000)
|
||||||
{
|
{
|
||||||
tmpV = m_angularMotorDirection - curLocalAngVel; // velocity error
|
tmpV = m_angularMotorDirection - curLocalAngVel; // velocity error
|
||||||
tmpV *= m_amEfect; // error to correct in this timestep
|
tmpV *= m_amEfect / m_angularMotorTimescale; // error to correct in this timestep
|
||||||
torque.X += tmpV.X * m_ampwr;
|
torque.X += tmpV.X * m_ampwr;
|
||||||
torque.Y += tmpV.Y * m_ampwr;
|
torque.Y += tmpV.Y * m_ampwr;
|
||||||
torque.Z += tmpV.Z;
|
torque.Z += tmpV.Z;
|
||||||
|
@ -1057,13 +1061,11 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
d.Mass dmass;
|
|
||||||
d.BodyGetMass(Body,out dmass);
|
|
||||||
|
|
||||||
if (force.X != 0 || force.Y != 0 || force.Z != 0)
|
if (force.X != 0 || force.Y != 0 || force.Z != 0)
|
||||||
{
|
{
|
||||||
force *= dmass.mass;
|
force *= dmass.mass;
|
||||||
d.BodySetForce(Body, force.X, force.Y, force.Z);
|
d.BodyAddForce(Body, force.X, force.Y, force.Z);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (torque.X != 0 || torque.Y != 0 || torque.Z != 0)
|
if (torque.X != 0 || torque.Y != 0 || torque.Z != 0)
|
||||||
|
|
|
@ -537,7 +537,7 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
// Essentially Steps * m_physicsiterations
|
// Essentially Steps * m_physicsiterations
|
||||||
d.WorldSetQuickStepNumIterations(world, m_physicsiterations);
|
d.WorldSetQuickStepNumIterations(world, m_physicsiterations);
|
||||||
|
|
||||||
d.WorldSetContactMaxCorrectingVel(world, 50.0f);
|
d.WorldSetContactMaxCorrectingVel(world, 60.0f);
|
||||||
|
|
||||||
spacesPerMeter = 1 / metersInSpace;
|
spacesPerMeter = 1 / metersInSpace;
|
||||||
spaceGridMaxX = (int)(WorldExtents.X * spacesPerMeter);
|
spaceGridMaxX = (int)(WorldExtents.X * spacesPerMeter);
|
||||||
|
@ -754,15 +754,16 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
}
|
}
|
||||||
|
|
||||||
// big messy collision analises
|
// big messy collision analises
|
||||||
|
|
||||||
|
Vector3 normoverride = Vector3.Zero; //damm c#
|
||||||
|
|
||||||
float mu = 0;
|
float mu = 0;
|
||||||
float bounce = 0;
|
float bounce = 0;
|
||||||
float cfm = 0.0001f;
|
float cfm = 0.0001f;
|
||||||
float erp = 0.1f;
|
|
||||||
float erpscale = 1.0f;
|
float erpscale = 1.0f;
|
||||||
float dscale = 1.0f;
|
float dscale = 1.0f;
|
||||||
bool IgnoreNegSides = false;
|
bool IgnoreNegSides = false;
|
||||||
|
|
||||||
|
|
||||||
ContactData contactdata1 = new ContactData(0, 0, false);
|
ContactData contactdata1 = new ContactData(0, 0, false);
|
||||||
ContactData contactdata2 = new ContactData(0, 0, false);
|
ContactData contactdata2 = new ContactData(0, 0, false);
|
||||||
|
|
||||||
|
@ -770,14 +771,30 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
bool dop1foot = false;
|
bool dop1foot = false;
|
||||||
bool dop2foot = false;
|
bool dop2foot = false;
|
||||||
bool ignore = false;
|
bool ignore = false;
|
||||||
|
bool AvanormOverride = false;
|
||||||
|
|
||||||
switch (p1.PhysicsActorType)
|
switch (p1.PhysicsActorType)
|
||||||
{
|
{
|
||||||
case (int)ActorTypes.Agent:
|
case (int)ActorTypes.Agent:
|
||||||
{
|
{
|
||||||
bounce = 0;
|
AvanormOverride = true;
|
||||||
mu = 0;
|
Vector3 tmp = p2.Position - p1.Position;
|
||||||
cfm = 0.0001f;
|
normoverride = p2.Velocity - p1.Velocity;
|
||||||
|
mu = normoverride.LengthSquared();
|
||||||
|
|
||||||
|
if (mu > 1e-6)
|
||||||
|
{
|
||||||
|
mu = 1.0f / (float)Math.Sqrt(mu);
|
||||||
|
normoverride *= mu;
|
||||||
|
mu = Vector3.Dot(tmp, normoverride);
|
||||||
|
if (mu > 0)
|
||||||
|
normoverride *= -1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
tmp.Normalize();
|
||||||
|
normoverride = -tmp;
|
||||||
|
}
|
||||||
|
|
||||||
switch (p2.PhysicsActorType)
|
switch (p2.PhysicsActorType)
|
||||||
{
|
{
|
||||||
|
@ -824,6 +841,25 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
// p1.getContactData(ref contactdata1);
|
// p1.getContactData(ref contactdata1);
|
||||||
// p2.getContactData(ref contactdata2);
|
// p2.getContactData(ref contactdata2);
|
||||||
|
|
||||||
|
AvanormOverride = true;
|
||||||
|
|
||||||
|
Vector3 tmp = p2.Position - p1.Position;
|
||||||
|
normoverride = p2.Velocity - p1.Velocity;
|
||||||
|
mu = normoverride.LengthSquared();
|
||||||
|
if (mu > 1e-6)
|
||||||
|
{
|
||||||
|
mu = 1.0f / (float)Math.Sqrt(mu);
|
||||||
|
normoverride *= mu;
|
||||||
|
mu = Vector3.Dot(tmp, normoverride);
|
||||||
|
if (mu > 0)
|
||||||
|
normoverride *= -1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
tmp.Normalize();
|
||||||
|
normoverride = -tmp;
|
||||||
|
}
|
||||||
|
|
||||||
bounce = 0;
|
bounce = 0;
|
||||||
mu = 0;
|
mu = 0;
|
||||||
cfm = 0.0001f;
|
cfm = 0.0001f;
|
||||||
|
@ -974,6 +1010,13 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
if (dop2foot && (p2.Position.Z - curContact.pos.Z) > (p2.Size.Z - avCapRadius) * 0.5f)
|
if (dop2foot && (p2.Position.Z - curContact.pos.Z) > (p2.Size.Z - avCapRadius) * 0.5f)
|
||||||
p2.IsColliding = true;
|
p2.IsColliding = true;
|
||||||
|
|
||||||
|
if (AvanormOverride && curContact.depth > 0.3f)
|
||||||
|
{
|
||||||
|
curContact.normal.X = normoverride.X;
|
||||||
|
curContact.normal.Y = normoverride.Y;
|
||||||
|
curContact.normal.Z = normoverride.Z;
|
||||||
|
}
|
||||||
|
|
||||||
Joint = CreateContacJoint(ref curContact, mu, bounce, cfm, erpscale, dscale);
|
Joint = CreateContacJoint(ref curContact, mu, bounce, cfm, erpscale, dscale);
|
||||||
d.JointAttach(Joint, b1, b2);
|
d.JointAttach(Joint, b1, b2);
|
||||||
|
|
||||||
|
|
|
@ -86,6 +86,7 @@ namespace OpenSim.Tests.Common.Mock
|
||||||
public event ObjectDrop OnObjectDrop;
|
public event ObjectDrop OnObjectDrop;
|
||||||
public event StartAnim OnStartAnim;
|
public event StartAnim OnStartAnim;
|
||||||
public event StopAnim OnStopAnim;
|
public event StopAnim OnStopAnim;
|
||||||
|
public event ChangeAnim OnChangeAnim;
|
||||||
public event LinkObjects OnLinkObjects;
|
public event LinkObjects OnLinkObjects;
|
||||||
public event DelinkObjects OnDelinkObjects;
|
public event DelinkObjects OnDelinkObjects;
|
||||||
public event RequestMapBlocks OnRequestMapBlocks;
|
public event RequestMapBlocks OnRequestMapBlocks;
|
||||||
|
|
Loading…
Reference in New Issue