* Added smoother handling of interpenetrating physical objects.
* Fixes: * -- duplicating Active physical object causes objects to explode in opposite directions * -- Rezzing objects too close to you avatar causes avatar to shoot around in odd directions * Vanityafrisby
parent
a5c641e92d
commit
de32006f9a
|
@ -17,6 +17,7 @@ OpenSim Developers
|
||||||
* Babblefrog
|
* Babblefrog
|
||||||
* Tedd
|
* Tedd
|
||||||
* justincc (International Business Machines Corp.)
|
* justincc (International Business Machines Corp.)
|
||||||
|
* Teravus (w3z)
|
||||||
|
|
||||||
Patches
|
Patches
|
||||||
|
|
||||||
|
|
|
@ -332,6 +332,7 @@ namespace OpenSim.Region.Environment.Scenes
|
||||||
// If agent is a root agent.
|
// If agent is a root agent.
|
||||||
if (!agent.IsChildAgent)
|
if (!agent.IsChildAgent)
|
||||||
{
|
{
|
||||||
|
|
||||||
//agent.ControllingClient.new
|
//agent.ControllingClient.new
|
||||||
//this.CommsManager.InterRegion.InformRegionOfChildAgent(otherRegion.RegionHandle, agent.ControllingClient.RequestClientInfo());
|
//this.CommsManager.InterRegion.InformRegionOfChildAgent(otherRegion.RegionHandle, agent.ControllingClient.RequestClientInfo());
|
||||||
InformClientOfNeighbor(agent, otherRegion);
|
InformClientOfNeighbor(agent, otherRegion);
|
||||||
|
|
|
@ -174,7 +174,7 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
}
|
}
|
||||||
if (m_wascolliding != m_iscolliding)
|
if (m_wascolliding != m_iscolliding)
|
||||||
{
|
{
|
||||||
base.SendCollisionUpdate(new CollisionEventUpdate());
|
//base.SendCollisionUpdate(new CollisionEventUpdate());
|
||||||
|
|
||||||
}
|
}
|
||||||
m_wascolliding = m_iscolliding;
|
m_wascolliding = m_iscolliding;
|
||||||
|
@ -527,7 +527,7 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
if (_velocity.Z < -6 && !m_hackSentFall)
|
if (_velocity.Z < -6 && !m_hackSentFall)
|
||||||
{
|
{
|
||||||
m_hackSentFall = true;
|
m_hackSentFall = true;
|
||||||
base.SendCollisionUpdate(new CollisionEventUpdate());
|
//base.SendCollisionUpdate(new CollisionEventUpdate());
|
||||||
m_pidControllerActive = false;
|
m_pidControllerActive = false;
|
||||||
}
|
}
|
||||||
else if (flying && !m_hackSentFly)
|
else if (flying && !m_hackSentFly)
|
||||||
|
|
|
@ -281,37 +281,84 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (name1 == "Terrain" || name2 == "Terrain")
|
// we don't want prim or avatar to explode
|
||||||
|
#region InterPenetration Handling - Unintended physics explosions
|
||||||
|
if (contacts[i].depth >= 0.08f)
|
||||||
{
|
{
|
||||||
if ((p2.PhysicsActorType == (int)ActorTypes.Agent) && (Math.Abs(p2.Velocity.X) > 0.01f || Math.Abs(p2.Velocity.Y) > 0.01f))
|
if (contacts[i].depth >= 1.00f)
|
||||||
{
|
{
|
||||||
AvatarMovementTerrainContact.geom = contacts[i];
|
//MainLog.Instance.Debug("PHYSICS",contacts[i].depth.ToString());
|
||||||
joint = d.JointCreateContact(world, contactgroup, ref AvatarMovementTerrainContact);
|
}
|
||||||
|
// If you interpenetrate a prim with an agent
|
||||||
|
if ((p2.PhysicsActorType == (int)ActorTypes.Agent && p1.PhysicsActorType == (int)ActorTypes.Prim) || (p1.PhysicsActorType == (int)ActorTypes.Agent && p2.PhysicsActorType == (int)ActorTypes.Prim))
|
||||||
|
{
|
||||||
|
|
||||||
|
if (p2.PhysicsActorType == (int)ActorTypes.Agent)
|
||||||
|
{
|
||||||
|
p2.CollidingObj = true;
|
||||||
|
contacts[i].depth = 0.003f;
|
||||||
|
p2.Velocity = p2.Velocity + new PhysicsVector(0, 0, 2.5f);
|
||||||
|
contacts[i].pos = new d.Vector3(contacts[i].pos.X + (p1.Size.X / 2), contacts[i].pos.Y + (p1.Size.Y / 2), contacts[i].pos.Z + (p1.Size.Z / 2));
|
||||||
|
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
contacts[i].depth = 0.0000000f;
|
||||||
|
}
|
||||||
|
if (p1.PhysicsActorType == (int)ActorTypes.Agent)
|
||||||
|
{
|
||||||
|
p1.CollidingObj = true;
|
||||||
|
contacts[i].depth = 0.003f;
|
||||||
|
p1.Velocity = p1.Velocity + new PhysicsVector(0, 0, 2.5f);
|
||||||
|
contacts[i].pos = new d.Vector3(contacts[i].pos.X + (p2.Size.X / 2), contacts[i].pos.Y + (p2.Size.Y / 2), contacts[i].pos.Z + (p2.Size.Z / 2));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
contacts[i].depth = 0.0000000f;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// If you interpenetrate a prim with another prim
|
||||||
|
if (p1.PhysicsActorType == (int)ActorTypes.Prim && p2.PhysicsActorType == (int)ActorTypes.Prim)
|
||||||
|
{
|
||||||
|
// Don't collide, one or both prim will explode.
|
||||||
|
contacts[i].depth = 0.0f;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
if (contacts[i].depth > 0f)
|
||||||
|
{
|
||||||
|
if (name1 == "Terrain" || name2 == "Terrain")
|
||||||
|
{
|
||||||
|
|
||||||
|
if ((p2.PhysicsActorType == (int)ActorTypes.Agent) && (Math.Abs(p2.Velocity.X) > 0.01f || Math.Abs(p2.Velocity.Y) > 0.01f))
|
||||||
|
{
|
||||||
|
AvatarMovementTerrainContact.geom = contacts[i];
|
||||||
|
joint = d.JointCreateContact(world, contactgroup, ref AvatarMovementTerrainContact);
|
||||||
|
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
TerrainContact.geom = contacts[i];
|
||||||
|
joint = d.JointCreateContact(world, contactgroup, ref TerrainContact);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
TerrainContact.geom = contacts[i];
|
if ((p2.PhysicsActorType == (int)ActorTypes.Agent) && (Math.Abs(p2.Velocity.X) > 0.01f || Math.Abs(p2.Velocity.Y) > 0.01f))
|
||||||
joint = d.JointCreateContact(world, contactgroup, ref TerrainContact);
|
{
|
||||||
|
AvatarMovementprimContact.geom = contacts[i];
|
||||||
|
joint = d.JointCreateContact(world, contactgroup, ref AvatarMovementprimContact);
|
||||||
|
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
contact.geom = contacts[i];
|
||||||
|
joint = d.JointCreateContact(world, contactgroup, ref contact);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
d.JointAttach(joint, b1, b2);
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
if ((p2.PhysicsActorType == (int)ActorTypes.Agent) && (Math.Abs(p2.Velocity.X) > 0.01f || Math.Abs(p2.Velocity.Y) > 0.01f))
|
|
||||||
{
|
|
||||||
AvatarMovementprimContact.geom = contacts[i];
|
|
||||||
joint = d.JointCreateContact(world, contactgroup, ref AvatarMovementprimContact);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
contact.geom = contacts[i];
|
|
||||||
joint = d.JointCreateContact(world, contactgroup, ref contact);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
d.JointAttach(joint, b1, b2);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if (count > 3)
|
if (count > 3)
|
||||||
{
|
{
|
||||||
|
@ -334,7 +381,7 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
}
|
}
|
||||||
// If the sim is running slow this frame,
|
// If the sim is running slow this frame,
|
||||||
// don't process collision for prim!
|
// don't process collision for prim!
|
||||||
if (timeStep < (m_SkipFramesAtms / 2))
|
if (timeStep < (m_SkipFramesAtms / 3))
|
||||||
{
|
{
|
||||||
foreach (OdePrim chr in _activeprims)
|
foreach (OdePrim chr in _activeprims)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue