*TEST* diferent avatar collider
parent
f21d990820
commit
8aa5fdb6a3
|
@ -571,7 +571,18 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
set
|
set
|
||||||
{
|
{
|
||||||
m_bodyRot = value;
|
m_bodyRot = value;
|
||||||
// m_log.DebugFormat("[SCENE PRESENCE]: Body rot for {0} set to {1}", Name, m_bodyRot);
|
// m_log.DebugFormat("[SCENE PRESENCE]: Body rot for {0} set to {1}", Name, m_bodyRot);
|
||||||
|
if (PhysicsActor != null)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
PhysicsActor.Orientation = value;
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
m_log.Error("[SCENE PRESENCE]: Orientation " + e.Message);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3435,7 +3446,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
|
|
||||||
PhysicsActor = scene.AddAvatar(
|
PhysicsActor = scene.AddAvatar(
|
||||||
LocalId, Firstname + "." + Lastname, pVec,
|
LocalId, Firstname + "." + Lastname, pVec,
|
||||||
new Vector3(0f, 0f, Appearance.AvatarHeight), isFlying);
|
new Vector3(0.45f, 0.6f, Appearance.AvatarHeight), isFlying);
|
||||||
|
|
||||||
//PhysicsActor.OnRequestTerseUpdate += SendTerseUpdateToAllClients;
|
//PhysicsActor.OnRequestTerseUpdate += SendTerseUpdateToAllClients;
|
||||||
PhysicsActor.OnCollisionUpdate += PhysicsCollisionUpdate;
|
PhysicsActor.OnCollisionUpdate += PhysicsCollisionUpdate;
|
||||||
|
|
|
@ -79,6 +79,8 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
private Vector3 _target_velocity;
|
private Vector3 _target_velocity;
|
||||||
private Vector3 _acceleration;
|
private Vector3 _acceleration;
|
||||||
private Vector3 m_rotationalVelocity;
|
private Vector3 m_rotationalVelocity;
|
||||||
|
private Vector3 m_size;
|
||||||
|
private Quaternion m_orientation;
|
||||||
private float m_mass = 80f;
|
private float m_mass = 80f;
|
||||||
public float m_density = 60f;
|
public float m_density = 60f;
|
||||||
private bool m_pidControllerActive = true;
|
private bool m_pidControllerActive = true;
|
||||||
|
@ -86,10 +88,17 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
public float PID_P = 900.0f;
|
public float PID_P = 900.0f;
|
||||||
//private static float POSTURE_SERVO = 10000.0f;
|
//private static float POSTURE_SERVO = 10000.0f;
|
||||||
|
|
||||||
public float CAPSULE_RADIUS = 0.37f;
|
|
||||||
public float CAPSULE_LENGTH = 2.140599f;
|
|
||||||
|
|
||||||
const float CAP_OFFSET = -.2f; // compensation of SL size offset plus spheric collision shape bottom
|
private float m_invElipSizeX;
|
||||||
|
private float m_invElipSizeY;
|
||||||
|
|
||||||
|
private float feetOff = 0;
|
||||||
|
private float feetSZ = 0.5f;
|
||||||
|
const float feetScale = 0.9f;
|
||||||
|
const float invFeetScale = 1.0f / 0.9f;
|
||||||
|
const float sizeZAdjust = 0.15f;
|
||||||
|
private float boneOff = 0;
|
||||||
|
|
||||||
|
|
||||||
public float walkDivisor = 1.3f;
|
public float walkDivisor = 1.3f;
|
||||||
public float runDivisor = 0.8f;
|
public float runDivisor = 0.8f;
|
||||||
|
@ -127,10 +136,16 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
// we do land collisions not ode | CollisionCategories.Land);
|
// we do land collisions not ode | CollisionCategories.Land);
|
||||||
public IntPtr Body = IntPtr.Zero;
|
public IntPtr Body = IntPtr.Zero;
|
||||||
private OdeScene _parent_scene;
|
private OdeScene _parent_scene;
|
||||||
public IntPtr Shell = IntPtr.Zero;
|
public IntPtr topbox = IntPtr.Zero;
|
||||||
|
public IntPtr midbox = IntPtr.Zero;
|
||||||
|
public IntPtr feetbox = IntPtr.Zero;
|
||||||
|
public IntPtr bonebox = IntPtr.Zero;
|
||||||
|
|
||||||
public IntPtr Amotor = IntPtr.Zero;
|
public IntPtr Amotor = IntPtr.Zero;
|
||||||
|
|
||||||
public d.Mass ShellMass;
|
public d.Mass ShellMass;
|
||||||
// public bool collidelock = false;
|
|
||||||
|
|
||||||
|
|
||||||
public int m_eventsubscription = 0;
|
public int m_eventsubscription = 0;
|
||||||
private int m_cureventsubscription = 0;
|
private int m_cureventsubscription = 0;
|
||||||
|
@ -145,7 +160,7 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public OdeCharacter(String avName, OdeScene parent_scene, Vector3 pos, Vector3 size, float pid_d, float pid_p, float capsule_radius, float density, float walk_divisor, float rundivisor)
|
public OdeCharacter(String avName, OdeScene parent_scene, Vector3 pos, Vector3 pSize, float pid_d, float pid_p, float density, float walk_divisor, float rundivisor)
|
||||||
{
|
{
|
||||||
m_uuid = UUID.Random();
|
m_uuid = UUID.Random();
|
||||||
|
|
||||||
|
@ -171,9 +186,20 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
|
|
||||||
PID_D = pid_d;
|
PID_D = pid_d;
|
||||||
PID_P = pid_p;
|
PID_P = pid_p;
|
||||||
CAPSULE_RADIUS = capsule_radius;
|
|
||||||
|
m_size.X = pSize.X;
|
||||||
|
m_size.Y = pSize.Y;
|
||||||
|
m_size.Z = pSize.Z;
|
||||||
|
|
||||||
|
if(m_size.X <0.01f)
|
||||||
|
m_size.X = 0.01f;
|
||||||
|
if(m_size.Y <0.01f)
|
||||||
|
m_size.Y = 0.01f;
|
||||||
|
if(m_size.Z <0.01f)
|
||||||
|
m_size.Z = 0.01f;
|
||||||
|
|
||||||
|
m_orientation = Quaternion.Identity;
|
||||||
m_density = density;
|
m_density = density;
|
||||||
m_mass = 80f; // sure we have a default
|
|
||||||
|
|
||||||
// force lower density for testing
|
// force lower density for testing
|
||||||
m_density = 3.0f;
|
m_density = 3.0f;
|
||||||
|
@ -183,8 +209,7 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
walkDivisor = walk_divisor;
|
walkDivisor = walk_divisor;
|
||||||
runDivisor = rundivisor;
|
runDivisor = rundivisor;
|
||||||
|
|
||||||
CAPSULE_LENGTH = size.Z - CAPSULE_RADIUS + CAP_OFFSET;
|
m_mass = m_density * m_size.X * m_size.Y * m_size.Z; ; // sure we have a default
|
||||||
//m_log.Info("[SIZE]: " + CAPSULE_LENGTH.ToString());
|
|
||||||
|
|
||||||
m_isPhysical = false; // current status: no ODE information exists
|
m_isPhysical = false; // current status: no ODE information exists
|
||||||
|
|
||||||
|
@ -426,14 +451,21 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public override Vector3 Size
|
public override Vector3 Size
|
||||||
{
|
{
|
||||||
get {
|
get
|
||||||
float d = CAPSULE_RADIUS * 2;
|
{
|
||||||
return new Vector3(d, d, (CAPSULE_LENGTH + CAPSULE_RADIUS - CAP_OFFSET));
|
return m_size;
|
||||||
}
|
}
|
||||||
set
|
set
|
||||||
{
|
{
|
||||||
if (value.IsFinite())
|
if (value.IsFinite())
|
||||||
{
|
{
|
||||||
|
if(value.X <0.01f)
|
||||||
|
value.X = 0.01f;
|
||||||
|
if(value.Y <0.01f)
|
||||||
|
value.Y = 0.01f;
|
||||||
|
if(value.Z <0.01f)
|
||||||
|
value.Z = 0.01f;
|
||||||
|
|
||||||
AddChange(changes.Size, value);
|
AddChange(changes.Size, value);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -459,8 +491,7 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
float AVvolume = (float)(Math.PI * CAPSULE_RADIUS * CAPSULE_RADIUS * (1.3333333333f * CAPSULE_RADIUS + CAPSULE_LENGTH));
|
return m_density * m_size.X * m_size.Y * m_size.Z;
|
||||||
return m_density * AVvolume;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
public override void link(PhysicsActor obj)
|
public override void link(PhysicsActor obj)
|
||||||
|
@ -578,9 +609,14 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
|
|
||||||
public override Quaternion Orientation
|
public override Quaternion Orientation
|
||||||
{
|
{
|
||||||
get { return Quaternion.Identity; }
|
get { return m_orientation; }
|
||||||
set
|
set
|
||||||
{
|
{
|
||||||
|
// fakeori = value;
|
||||||
|
// givefakeori++;
|
||||||
|
|
||||||
|
value.Normalize();
|
||||||
|
AddChange(changes.Orientation, value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -632,32 +668,65 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
AddChange(changes.Momentum, momentum);
|
AddChange(changes.Momentum, momentum);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// WARNING: This MUST NOT be called outside of ProcessTaints, else we can have unsynchronized access
|
|
||||||
// to ODE internals. ProcessTaints is called from within thread-locked Simulate(), so it is the only
|
|
||||||
// place that is safe to call this routine AvatarGeomAndBodyCreation.
|
|
||||||
private void AvatarGeomAndBodyCreation(float npositionX, float npositionY, float npositionZ)
|
private void AvatarGeomAndBodyCreation(float npositionX, float npositionY, float npositionZ)
|
||||||
{
|
{
|
||||||
|
// sizes one day should came from visual parameters
|
||||||
|
float sz = m_size.Z + sizeZAdjust;
|
||||||
|
|
||||||
|
m_invElipSizeX = 1.0f / m_size.X;
|
||||||
|
m_invElipSizeY = 1.0f / m_size.Y;
|
||||||
|
|
||||||
|
float topsx = m_size.X;
|
||||||
|
float midsx = m_size.X;
|
||||||
|
float feetsx = m_size.X * feetScale;
|
||||||
|
float bonesx = feetsx * 0.2f;
|
||||||
|
|
||||||
|
float topsy = m_size.Y * 0.5f;
|
||||||
|
float midsy = m_size.Y;
|
||||||
|
float feetsy = m_size.Y * feetScale;
|
||||||
|
float bonesy = feetsy * 0.2f;
|
||||||
|
|
||||||
|
float topsz = sz * 0.15f;
|
||||||
|
float feetsz = sz * 0.3f;
|
||||||
|
if (feetsz > 0.6f)
|
||||||
|
feetsz = 0.6f;
|
||||||
|
|
||||||
|
float midsz = sz - topsz - feetsz;
|
||||||
|
float bonesz = sz;
|
||||||
|
|
||||||
|
float bot = -sz * 0.5f;
|
||||||
|
|
||||||
|
boneOff = bot + 0.3f;
|
||||||
|
|
||||||
|
float feetz = bot + feetsz * 0.5f;
|
||||||
|
bot += feetsz;
|
||||||
|
|
||||||
|
feetOff = bot;
|
||||||
|
feetSZ = feetsz;
|
||||||
|
|
||||||
|
float midz = bot + midsz * 0.5f;
|
||||||
|
bot += midsz;
|
||||||
|
float topz = bot + topsz * 0.5f;
|
||||||
|
|
||||||
_parent_scene.waitForSpaceUnlock(_parent_scene.ActiveSpace);
|
_parent_scene.waitForSpaceUnlock(_parent_scene.ActiveSpace);
|
||||||
if (CAPSULE_LENGTH <= 0)
|
|
||||||
{
|
|
||||||
m_log.Warn("[PHYSICS]: The capsule size you specified in opensim.ini is invalid! Setting it to the smallest possible size!");
|
|
||||||
CAPSULE_LENGTH = 0.01f;
|
|
||||||
|
|
||||||
}
|
feetbox = d.CreateBox(_parent_scene.ActiveSpace, feetsx, feetsy, feetsz);
|
||||||
|
d.GeomSetCategoryBits(feetbox, (uint)m_collisionCategories);
|
||||||
|
d.GeomSetCollideBits(feetbox, (uint)m_collisionFlags);
|
||||||
|
|
||||||
if (CAPSULE_RADIUS <= 0)
|
midbox = d.CreateBox(_parent_scene.ActiveSpace, midsx, midsy, midsz);
|
||||||
{
|
d.GeomSetCategoryBits(midbox, (uint)m_collisionCategories);
|
||||||
m_log.Warn("[PHYSICS]: The capsule size you specified in opensim.ini is invalid! Setting it to the smallest possible size!");
|
d.GeomSetCollideBits(midbox, (uint)m_collisionFlags);
|
||||||
CAPSULE_RADIUS = 0.01f;
|
|
||||||
|
|
||||||
}
|
topbox = d.CreateBox(_parent_scene.ActiveSpace, topsx, topsy, topsz);
|
||||||
Shell = d.CreateCapsule(_parent_scene.ActiveSpace, CAPSULE_RADIUS, CAPSULE_LENGTH);
|
d.GeomSetCategoryBits(topbox, (uint)m_collisionCategories);
|
||||||
|
d.GeomSetCollideBits(topbox, (uint)m_collisionFlags);
|
||||||
|
|
||||||
d.GeomSetCategoryBits(Shell, (uint)m_collisionCategories);
|
bonebox = d.CreateBox(_parent_scene.ActiveSpace, bonesx, bonesy, bonesz);
|
||||||
d.GeomSetCollideBits(Shell, (uint)m_collisionFlags);
|
d.GeomSetCategoryBits(bonebox, (uint)m_collisionCategories);
|
||||||
|
d.GeomSetCollideBits(bonebox, (uint)m_collisionFlags);
|
||||||
|
|
||||||
d.MassSetCapsule(out ShellMass, m_density, 3, CAPSULE_RADIUS, CAPSULE_LENGTH);
|
d.MassSetBox(out ShellMass, m_density, m_size.X , m_size.Y, m_size.Z);
|
||||||
|
|
||||||
m_mass = ShellMass.mass; // update mass
|
m_mass = ShellMass.mass; // update mass
|
||||||
|
|
||||||
|
@ -688,7 +757,14 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
_position.Z = npositionZ;
|
_position.Z = npositionZ;
|
||||||
|
|
||||||
d.BodySetMass(Body, ref ShellMass);
|
d.BodySetMass(Body, ref ShellMass);
|
||||||
d.GeomSetBody(Shell, Body);
|
d.GeomSetBody(feetbox, Body);
|
||||||
|
d.GeomSetBody(midbox, Body);
|
||||||
|
d.GeomSetBody(topbox, Body);
|
||||||
|
d.GeomSetBody(bonebox, Body);
|
||||||
|
|
||||||
|
d.GeomSetOffsetPosition(feetbox, 0, 0, feetz);
|
||||||
|
d.GeomSetOffsetPosition(midbox, 0, 0, midz);
|
||||||
|
d.GeomSetOffsetPosition(topbox, 0, 0, topz);
|
||||||
|
|
||||||
// The purpose of the AMotor here is to keep the avatar's physical
|
// The purpose of the AMotor here is to keep the avatar's physical
|
||||||
// surrogate from rotating while moving
|
// surrogate from rotating while moving
|
||||||
|
@ -748,15 +824,152 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
Body = IntPtr.Zero;
|
Body = IntPtr.Zero;
|
||||||
}
|
}
|
||||||
|
|
||||||
//kill the Geometry
|
//kill the Geoms
|
||||||
if (Shell != IntPtr.Zero)
|
if (topbox != IntPtr.Zero)
|
||||||
{
|
{
|
||||||
// _parent_scene.geom_name_map.Remove(Shell);
|
_parent_scene.actor_name_map.Remove(topbox);
|
||||||
_parent_scene.actor_name_map.Remove(Shell);
|
|
||||||
_parent_scene.waitForSpaceUnlock(_parent_scene.ActiveSpace);
|
_parent_scene.waitForSpaceUnlock(_parent_scene.ActiveSpace);
|
||||||
d.GeomDestroy(Shell);
|
d.GeomDestroy(topbox);
|
||||||
Shell = IntPtr.Zero;
|
topbox = IntPtr.Zero;
|
||||||
}
|
}
|
||||||
|
if (midbox != IntPtr.Zero)
|
||||||
|
{
|
||||||
|
_parent_scene.actor_name_map.Remove(midbox);
|
||||||
|
_parent_scene.waitForSpaceUnlock(_parent_scene.ActiveSpace);
|
||||||
|
d.GeomDestroy(midbox);
|
||||||
|
midbox = IntPtr.Zero;
|
||||||
|
}
|
||||||
|
if (feetbox != IntPtr.Zero)
|
||||||
|
{
|
||||||
|
_parent_scene.actor_name_map.Remove(feetbox);
|
||||||
|
_parent_scene.waitForSpaceUnlock(_parent_scene.ActiveSpace);
|
||||||
|
d.GeomDestroy(feetbox);
|
||||||
|
feetbox = IntPtr.Zero;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (bonebox != IntPtr.Zero)
|
||||||
|
{
|
||||||
|
_parent_scene.actor_name_map.Remove(bonebox);
|
||||||
|
_parent_scene.waitForSpaceUnlock(_parent_scene.ActiveSpace);
|
||||||
|
d.GeomDestroy(bonebox);
|
||||||
|
bonebox = IntPtr.Zero;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool Collide(IntPtr me, bool reverse, ref d.ContactGeom contact)
|
||||||
|
{
|
||||||
|
|
||||||
|
if (me == bonebox) // inner bone
|
||||||
|
{
|
||||||
|
if (contact.pos.Z - _position.Z < boneOff)
|
||||||
|
IsColliding = true;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (me == topbox) // keep a box head
|
||||||
|
return true;
|
||||||
|
|
||||||
|
// rotate elipsoide assuming only rotation around Z
|
||||||
|
float ca = m_orientation.W * m_orientation.W - m_orientation.Z * m_orientation.Z;
|
||||||
|
float sa = 2 * m_orientation.W * m_orientation.Z;
|
||||||
|
|
||||||
|
float isx;
|
||||||
|
float isy;
|
||||||
|
|
||||||
|
if (me == feetbox) // feet have narrow bounds
|
||||||
|
{
|
||||||
|
|
||||||
|
isx = m_invElipSizeX * invFeetScale;
|
||||||
|
isy = m_invElipSizeY * invFeetScale;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
isx = m_invElipSizeX;
|
||||||
|
isy = m_invElipSizeY;
|
||||||
|
}
|
||||||
|
|
||||||
|
float a = isx * ca - isy * sa;
|
||||||
|
float b = isx * sa + isy * ca;
|
||||||
|
|
||||||
|
float offx = contact.pos.X - _position.X;
|
||||||
|
float er = offx * a;
|
||||||
|
er *= er;
|
||||||
|
|
||||||
|
float offy = contact.pos.Y - _position.Y;
|
||||||
|
float ty = offy * b;
|
||||||
|
er += ty * ty;
|
||||||
|
|
||||||
|
if (me == midbox)
|
||||||
|
{
|
||||||
|
if (er > 4.0f) // no collision
|
||||||
|
return false;
|
||||||
|
if (er < 0.2f)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
float t = offx * offx + offy * offy;
|
||||||
|
t = (float)Math.Sqrt(t);
|
||||||
|
t = 1 / t;
|
||||||
|
offx *= t;
|
||||||
|
offy *= t;
|
||||||
|
|
||||||
|
if (reverse)
|
||||||
|
{
|
||||||
|
contact.normal.X = offx;
|
||||||
|
contact.normal.Y = offy;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
contact.normal.X = -offx;
|
||||||
|
contact.normal.Y = -offy;
|
||||||
|
}
|
||||||
|
|
||||||
|
contact.normal.Z = 0;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
else if (me == feetbox)
|
||||||
|
{
|
||||||
|
float c = feetSZ * 2;
|
||||||
|
float h = contact.pos.Z - _position.Z;
|
||||||
|
float offz = h - feetOff; // distance from top of feetbox
|
||||||
|
|
||||||
|
float tz = offz / c;
|
||||||
|
er += tz * tz;
|
||||||
|
|
||||||
|
if (er > 4.0f) // no collision
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (er > 0.2f)
|
||||||
|
{
|
||||||
|
float t = offx * offx + offy * offy + offz * offz;
|
||||||
|
t = (float)Math.Sqrt(t);
|
||||||
|
t = 1 / t;
|
||||||
|
offx *= t;
|
||||||
|
offy *= t;
|
||||||
|
offz *= t;
|
||||||
|
|
||||||
|
if (reverse)
|
||||||
|
{
|
||||||
|
contact.normal.X = offx;
|
||||||
|
contact.normal.Y = offy;
|
||||||
|
contact.normal.Z = offz;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
contact.normal.X = -offx;
|
||||||
|
contact.normal.Y = -offy;
|
||||||
|
contact.normal.Z = -offz;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(h < boneOff)
|
||||||
|
IsColliding = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -776,10 +989,10 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
// so force it back to identity
|
// so force it back to identity
|
||||||
|
|
||||||
d.Quaternion qtmp;
|
d.Quaternion qtmp;
|
||||||
qtmp.W = 1;
|
qtmp.W = m_orientation.W;
|
||||||
qtmp.X = 0;
|
qtmp.X = m_orientation.X;
|
||||||
qtmp.Y = 0;
|
qtmp.Y = m_orientation.Y;
|
||||||
qtmp.Z = 0;
|
qtmp.Z = m_orientation.Z;
|
||||||
d.BodySetQuaternion(Body, ref qtmp);
|
d.BodySetQuaternion(Body, ref qtmp);
|
||||||
|
|
||||||
if (m_pidControllerActive == false)
|
if (m_pidControllerActive == false)
|
||||||
|
@ -843,7 +1056,7 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
//******************************************
|
//******************************************
|
||||||
// colide with land
|
// colide with land
|
||||||
d.AABB aabb;
|
d.AABB aabb;
|
||||||
d.GeomGetAABB(Shell, out aabb);
|
d.GeomGetAABB(feetbox, out aabb);
|
||||||
float chrminZ = aabb.MinZ - 0.04f; // move up a bit
|
float chrminZ = aabb.MinZ - 0.04f; // move up a bit
|
||||||
Vector3 posch = localpos;
|
Vector3 posch = localpos;
|
||||||
|
|
||||||
|
@ -1182,20 +1395,14 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
{
|
{
|
||||||
if (NewStatus)
|
if (NewStatus)
|
||||||
{
|
{
|
||||||
// Create avatar capsule and related ODE data
|
AvatarGeomAndBodyDestroy();
|
||||||
if ((Shell != IntPtr.Zero))
|
|
||||||
{
|
|
||||||
// a lost shell ?
|
|
||||||
m_log.Warn("[PHYSICS]: re-creating the following avatar ODE data, even though it already exists - "
|
|
||||||
+ (Shell != IntPtr.Zero ? "Shell " : "")
|
|
||||||
+ (Body != IntPtr.Zero ? "Body " : "")
|
|
||||||
+ (Amotor != IntPtr.Zero ? "Amotor " : ""));
|
|
||||||
AvatarGeomAndBodyDestroy();
|
|
||||||
}
|
|
||||||
|
|
||||||
AvatarGeomAndBodyCreation(_position.X, _position.Y, _position.Z);
|
AvatarGeomAndBodyCreation(_position.X, _position.Y, _position.Z);
|
||||||
|
|
||||||
_parent_scene.actor_name_map[Shell] = (PhysicsActor)this;
|
_parent_scene.actor_name_map[topbox] = (PhysicsActor)this;
|
||||||
|
_parent_scene.actor_name_map[midbox] = (PhysicsActor)this;
|
||||||
|
_parent_scene.actor_name_map[feetbox] = (PhysicsActor)this;
|
||||||
|
_parent_scene.actor_name_map[bonebox] = (PhysicsActor)this;
|
||||||
_parent_scene.AddCharacter(this);
|
_parent_scene.AddCharacter(this);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -1224,37 +1431,29 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
private void changeSize(Vector3 Size)
|
private void changeSize(Vector3 pSize)
|
||||||
{
|
{
|
||||||
if (Size.IsFinite())
|
if (pSize.IsFinite())
|
||||||
{
|
{
|
||||||
float caplen = Size.Z;
|
// for now only look to Z changes since viewers also don't change X and Y
|
||||||
|
if (pSize.Z != m_size.Z)
|
||||||
caplen = caplen - CAPSULE_RADIUS + CAP_OFFSET;
|
|
||||||
|
|
||||||
if (caplen != CAPSULE_LENGTH)
|
|
||||||
{
|
{
|
||||||
if (Shell != IntPtr.Zero && Body != IntPtr.Zero && Amotor != IntPtr.Zero)
|
AvatarGeomAndBodyDestroy();
|
||||||
{
|
|
||||||
AvatarGeomAndBodyDestroy();
|
|
||||||
|
|
||||||
float prevCapsule = CAPSULE_LENGTH;
|
|
||||||
CAPSULE_LENGTH = caplen;
|
|
||||||
|
|
||||||
AvatarGeomAndBodyCreation(_position.X, _position.Y,
|
float oldsz = m_size.Z;
|
||||||
_position.Z + (CAPSULE_LENGTH - prevCapsule) * 0.5f);
|
m_size = pSize;
|
||||||
|
|
||||||
Velocity = Vector3.Zero;
|
|
||||||
|
|
||||||
_parent_scene.actor_name_map[Shell] = (PhysicsActor)this;
|
AvatarGeomAndBodyCreation(_position.X, _position.Y,
|
||||||
}
|
_position.Z + (m_size.Z - oldsz) * 0.5f);
|
||||||
else
|
|
||||||
{
|
Velocity = Vector3.Zero;
|
||||||
m_log.Warn("[PHYSICS]: trying to change capsule size, but the following ODE data is missing - "
|
|
||||||
+ (Shell == IntPtr.Zero ? "Shell " : "")
|
_parent_scene.actor_name_map[topbox] = (PhysicsActor)this;
|
||||||
+ (Body == IntPtr.Zero ? "Body " : "")
|
_parent_scene.actor_name_map[midbox] = (PhysicsActor)this;
|
||||||
+ (Amotor == IntPtr.Zero ? "Amotor " : ""));
|
_parent_scene.actor_name_map[feetbox] = (PhysicsActor)this;
|
||||||
}
|
_parent_scene.actor_name_map[bonebox] = (PhysicsActor)this;
|
||||||
}
|
}
|
||||||
m_freemove = false;
|
m_freemove = false;
|
||||||
m_pidControllerActive = true;
|
m_pidControllerActive = true;
|
||||||
|
@ -1276,6 +1475,14 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
|
|
||||||
private void changeOrientation(Quaternion newOri)
|
private void changeOrientation(Quaternion newOri)
|
||||||
{
|
{
|
||||||
|
d.Quaternion myrot = new d.Quaternion();
|
||||||
|
myrot.X = newOri.X;
|
||||||
|
myrot.Y = newOri.Y;
|
||||||
|
myrot.Z = newOri.Z;
|
||||||
|
myrot.W = newOri.W;
|
||||||
|
float t = d.JointGetAMotorAngle(Amotor, 2);
|
||||||
|
d.BodySetQuaternion(Body,ref myrot);
|
||||||
|
m_orientation = newOri;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void changeVelocity(Vector3 newVel)
|
private void changeVelocity(Vector3 newVel)
|
||||||
|
@ -1365,7 +1572,7 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
|
|
||||||
public bool DoAChange(changes what, object arg)
|
public bool DoAChange(changes what, object arg)
|
||||||
{
|
{
|
||||||
if (Shell == IntPtr.Zero && what != changes.Add && what != changes.Remove)
|
if (topbox == IntPtr.Zero && what != changes.Add && what != changes.Remove)
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
|
@ -840,6 +840,8 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
{
|
{
|
||||||
case (int)ActorTypes.Agent:
|
case (int)ActorTypes.Agent:
|
||||||
{
|
{
|
||||||
|
dop1foot = true;
|
||||||
|
|
||||||
AvanormOverride = true;
|
AvanormOverride = true;
|
||||||
Vector3 tmp = p2.Position - p1.Position;
|
Vector3 tmp = p2.Position - p1.Position;
|
||||||
normoverride = p2.Velocity - p1.Velocity;
|
normoverride = p2.Velocity - p1.Velocity;
|
||||||
|
@ -883,6 +885,10 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
switch (p2.PhysicsActorType)
|
switch (p2.PhysicsActorType)
|
||||||
{
|
{
|
||||||
case (int)ActorTypes.Agent:
|
case (int)ActorTypes.Agent:
|
||||||
|
|
||||||
|
|
||||||
|
dop2foot = true;
|
||||||
|
|
||||||
AvanormOverride = true;
|
AvanormOverride = true;
|
||||||
|
|
||||||
Vector3 tmp = p2.Position - p1.Position;
|
Vector3 tmp = p2.Position - p1.Position;
|
||||||
|
@ -1017,6 +1023,7 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
IntPtr Joint;
|
IntPtr Joint;
|
||||||
|
|
||||||
int i = 0;
|
int i = 0;
|
||||||
|
int ncontacts = 0;
|
||||||
while(true)
|
while(true)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
@ -1031,7 +1038,28 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
else
|
else
|
||||||
|
|
||||||
{
|
{
|
||||||
|
if(dop1foot)
|
||||||
|
{
|
||||||
|
if (!(((OdeCharacter)p1).Collide(g1,false, ref curContact)))
|
||||||
|
{
|
||||||
|
if (++i >= count)
|
||||||
|
break;
|
||||||
|
else
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if(dop2foot)
|
||||||
|
{
|
||||||
|
if(!(((OdeCharacter) p2).Collide(g2,true,ref curContact)))
|
||||||
|
{
|
||||||
|
if (++i >= count)
|
||||||
|
break;
|
||||||
|
else
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
if (AvanormOverride)
|
if (AvanormOverride)
|
||||||
{
|
{
|
||||||
if (curContact.depth > 0.3f)
|
if (curContact.depth > 0.3f)
|
||||||
|
@ -1081,34 +1109,31 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
{
|
{
|
||||||
float sz = p2.Size.Z;
|
float sz = p2.Size.Z;
|
||||||
Vector3 vtmp = p2.Position;
|
Vector3 vtmp = p2.Position;
|
||||||
float ppos = curContact.pos.Z - vtmp.Z + (sz - avCapRadius) * 0.5f;
|
vtmp.Z -= sz * 0.5f;
|
||||||
|
vtmp.Z += 0.5f;
|
||||||
|
float ppos = vtmp.Z - curContact.pos.Z;
|
||||||
if (ppos > 0f)
|
if (ppos > 0f)
|
||||||
{
|
{
|
||||||
if (!p2.Flying)
|
if (!p2.Flying)
|
||||||
{
|
{
|
||||||
d.AABB aabb;
|
|
||||||
d.GeomGetAABB(g1, out aabb);
|
|
||||||
float tmp = vtmp.Z - sz * .18f;
|
float tmp = vtmp.Z - sz * .18f;
|
||||||
|
vtmp.X = curContact.pos.X - vtmp.X;
|
||||||
if (aabb.MaxZ < tmp)
|
vtmp.Y = curContact.pos.Y - vtmp.Y;
|
||||||
{
|
vtmp.Z = curContact.pos.Z - vtmp.Z;
|
||||||
vtmp.X = curContact.pos.X - vtmp.X;
|
vtmp.Normalize();
|
||||||
vtmp.Y = curContact.pos.Y - vtmp.Y;
|
curContact.normal.X = vtmp.X;
|
||||||
vtmp.Z = -0.2f;
|
curContact.normal.Y = vtmp.Y;
|
||||||
vtmp.Normalize();
|
curContact.normal.Z = vtmp.Z;
|
||||||
curContact.normal.X = vtmp.X;
|
|
||||||
curContact.normal.Y = vtmp.Y;
|
|
||||||
curContact.normal.Z = vtmp.Z;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
// else
|
||||||
p2.IsColliding = true;
|
p2.IsColliding = true;
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
ncontacts++;
|
||||||
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);
|
||||||
|
|
||||||
|
@ -1134,7 +1159,8 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
collision_accounting_events(p1, p2, maxDepthContact);
|
if(ncontacts > 0)
|
||||||
|
collision_accounting_events(p1, p2, maxDepthContact);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
if (notskipedcount > geomContactPointsStartthrottle)
|
if (notskipedcount > geomContactPointsStartthrottle)
|
||||||
|
@ -1234,14 +1260,17 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
{
|
{
|
||||||
foreach (OdeCharacter chr in _characters)
|
foreach (OdeCharacter chr in _characters)
|
||||||
{
|
{
|
||||||
if (chr == null || chr.Shell == IntPtr.Zero || chr.Body == IntPtr.Zero)
|
if (chr == null || chr.Body == IntPtr.Zero)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
chr.IsColliding = false;
|
chr.IsColliding = false;
|
||||||
// chr.CollidingGround = false; not done here
|
// chr.CollidingGround = false; not done here
|
||||||
chr.CollidingObj = false;
|
chr.CollidingObj = false;
|
||||||
// do colisions with static space
|
// do colisions with static space
|
||||||
d.SpaceCollide2(StaticSpace, chr.Shell, IntPtr.Zero, nearCallback);
|
d.SpaceCollide2(StaticSpace, chr.topbox, IntPtr.Zero, nearCallback);
|
||||||
|
d.SpaceCollide2(StaticSpace, chr.midbox, IntPtr.Zero, nearCallback);
|
||||||
|
d.SpaceCollide2(StaticSpace, chr.feetbox, IntPtr.Zero, nearCallback);
|
||||||
|
d.SpaceCollide2(StaticSpace, chr.bonebox, IntPtr.Zero, nearCallback);
|
||||||
// no coll with gnd
|
// no coll with gnd
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1334,7 +1363,7 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
pos.X = position.X;
|
pos.X = position.X;
|
||||||
pos.Y = position.Y;
|
pos.Y = position.Y;
|
||||||
pos.Z = position.Z;
|
pos.Z = position.Z;
|
||||||
OdeCharacter newAv = new OdeCharacter(avName, this, pos, size, avPIDD, avPIDP, avCapRadius, avDensity, avMovementDivisorWalk, avMovementDivisorRun);
|
OdeCharacter newAv = new OdeCharacter(avName, this, pos, size, avPIDD, avPIDP, avDensity, avMovementDivisorWalk, avMovementDivisorRun);
|
||||||
newAv.Flying = isFlying;
|
newAv.Flying = isFlying;
|
||||||
newAv.MinimumGroundFlightOffset = minimumGroundFlightOffset;
|
newAv.MinimumGroundFlightOffset = minimumGroundFlightOffset;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue