* Preliminary work with the ODEPlugin to collect collision data.
parent
94c39c793a
commit
abacfba287
|
@ -545,6 +545,9 @@ namespace OpenSim.Region.Environment.Scenes
|
|||
new Quaternion(dupe.RootPart.RotationOffset.W, dupe.RootPart.RotationOffset.X,
|
||||
dupe.RootPart.RotationOffset.Y, dupe.RootPart.RotationOffset.Z),
|
||||
dupe.RootPart.PhysActor.IsPhysical);
|
||||
|
||||
dupe.RootPart.PhysActor.LocalID = dupe.RootPart.LocalId;
|
||||
|
||||
dupe.RootPart.DoPhysicsPropertyUpdate(dupe.RootPart.PhysActor.IsPhysical, true);
|
||||
}
|
||||
// Now we've made a copy that replaces this one, we need to
|
||||
|
|
|
@ -785,7 +785,7 @@ namespace OpenSim.Region.Environment.Scenes
|
|||
new PhysicsVector(Scale.X, Scale.Y, Scale.Z),
|
||||
new Quaternion(RotationOffset.W, RotationOffset.X,
|
||||
RotationOffset.Y, RotationOffset.Z), RigidBody);
|
||||
|
||||
PhysActor.LocalID = LocalId;
|
||||
|
||||
DoPhysicsPropertyUpdate(RigidBody, true);
|
||||
}
|
||||
|
@ -1305,6 +1305,7 @@ namespace OpenSim.Region.Environment.Scenes
|
|||
new PhysicsVector(Scale.X, Scale.Y, Scale.Z),
|
||||
new Quaternion(RotationOffset.W, RotationOffset.X,
|
||||
RotationOffset.Y, RotationOffset.Z), usePhysics);
|
||||
PhysActor.LocalID = LocalId;
|
||||
DoPhysicsPropertyUpdate(usePhysics, true);
|
||||
}
|
||||
else
|
||||
|
|
|
@ -1809,6 +1809,7 @@ namespace OpenSim.Region.Environment.Scenes
|
|||
}
|
||||
//m_physicsActor.OnRequestTerseUpdate += SendTerseUpdateToAllClients;
|
||||
m_physicsActor.OnCollisionUpdate += PhysicsCollisionUpdate;
|
||||
m_physicsActor.LocalID = LocalId;
|
||||
}
|
||||
|
||||
// Event called by the physics plugin to tell the avatar about a collision.
|
||||
|
|
|
@ -90,6 +90,7 @@ namespace OpenSim.Region.Environment.Scenes
|
|||
new PhysicsVector(rootPart.Scale.X, rootPart.Scale.Y, rootPart.Scale.Z),
|
||||
new Quaternion(rootPart.RotationOffset.W, rootPart.RotationOffset.X,
|
||||
rootPart.RotationOffset.Y, rootPart.RotationOffset.Z), UsePhysics);
|
||||
rootPart.PhysActor.LocalID = rootPart.LocalId;
|
||||
rootPart.DoPhysicsPropertyUpdate(UsePhysics, true);
|
||||
}
|
||||
primCount++;
|
||||
|
@ -192,6 +193,9 @@ namespace OpenSim.Region.Environment.Scenes
|
|||
new PhysicsVector(rootPart.Scale.X, rootPart.Scale.Y, rootPart.Scale.Z),
|
||||
new Quaternion(rootPart.RotationOffset.W, rootPart.RotationOffset.X,
|
||||
rootPart.RotationOffset.Y, rootPart.RotationOffset.Z), UsePhysics);
|
||||
|
||||
rootPart.PhysActor.LocalID = rootPart.LocalId;
|
||||
|
||||
rootPart.DoPhysicsPropertyUpdate(UsePhysics, true);
|
||||
rootPart.Velocity = receivedVelocity;
|
||||
}
|
||||
|
|
|
@ -52,28 +52,28 @@ namespace OpenSim.Region.Physics.Manager
|
|||
|
||||
|
||||
public int m_colliderType;
|
||||
public bool m_startOrEnd;
|
||||
public int m_GenericStartEnd;
|
||||
//public uint m_LocalID;
|
||||
public List<uint> m_objCollisionList;
|
||||
|
||||
public CollisionEventUpdate(uint localID, int colliderType, bool startOrEnd, List<uint> objCollisionList)
|
||||
public CollisionEventUpdate(uint localID, int colliderType, int GenericStartEnd, List<uint> objCollisionList)
|
||||
{
|
||||
m_colliderType = colliderType;
|
||||
m_startOrEnd = startOrEnd;
|
||||
m_GenericStartEnd = GenericStartEnd;
|
||||
m_objCollisionList = objCollisionList;
|
||||
}
|
||||
|
||||
public CollisionEventUpdate(bool startOrEnd)
|
||||
{
|
||||
m_colliderType = (int) ActorTypes.Unknown;
|
||||
m_startOrEnd = startOrEnd;
|
||||
m_GenericStartEnd = m_GenericStartEnd;
|
||||
m_objCollisionList = null;
|
||||
}
|
||||
|
||||
public CollisionEventUpdate()
|
||||
{
|
||||
m_colliderType = (int) ActorTypes.Unknown;
|
||||
m_startOrEnd = false;
|
||||
m_GenericStartEnd = 1;
|
||||
m_objCollisionList = null;
|
||||
}
|
||||
|
||||
|
@ -83,10 +83,10 @@ namespace OpenSim.Region.Physics.Manager
|
|||
set { m_colliderType = value; }
|
||||
}
|
||||
|
||||
public bool startOrEnd
|
||||
public int GenericStartEnd
|
||||
{
|
||||
get { return m_startOrEnd; }
|
||||
set { m_startOrEnd = value; }
|
||||
get { return m_GenericStartEnd; }
|
||||
set { m_GenericStartEnd = value; }
|
||||
}
|
||||
|
||||
public void addCollider(uint localID)
|
||||
|
|
|
@ -86,6 +86,7 @@ namespace OpenSim.Region.Physics.OdePlugin
|
|||
private bool m_hackSentFall = false;
|
||||
private bool m_hackSentFly = false;
|
||||
public uint m_localID = 0;
|
||||
public bool m_returnCollisions = false;
|
||||
|
||||
private float m_buoyancy = 0f;
|
||||
|
||||
|
|
|
@ -61,6 +61,7 @@ namespace OpenSim.Region.Physics.OdePlugin
|
|||
private bool m_taintPhysics = false;
|
||||
private bool m_collidesLand = true;
|
||||
private bool m_collidesWater = false;
|
||||
public bool m_returnCollisions = false;
|
||||
|
||||
// Default we're a Geometry
|
||||
private CollisionCategories m_collisionCategories = (CollisionCategories.Geom );
|
||||
|
@ -203,7 +204,9 @@ namespace OpenSim.Region.Physics.OdePlugin
|
|||
|
||||
public override uint LocalID
|
||||
{
|
||||
set { m_localID = value; }
|
||||
set {
|
||||
//m_log.Info("[PHYSICS]: Setting TrackerID: " + value);
|
||||
m_localID = value; }
|
||||
}
|
||||
|
||||
public override bool Grabbed
|
||||
|
|
|
@ -79,6 +79,25 @@ namespace OpenSim.Region.Physics.OdePlugin
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
public enum StatusIndicators : int
|
||||
{
|
||||
Generic = 0,
|
||||
Start = 1,
|
||||
End = 2
|
||||
}
|
||||
|
||||
|
||||
public struct sCollisionData
|
||||
{
|
||||
public uint ColliderLocalId;
|
||||
public uint CollidedWithLocalId;
|
||||
public int NumberOfCollisions;
|
||||
public int CollisionType;
|
||||
public int StatusIndicator;
|
||||
public int lastframe;
|
||||
}
|
||||
|
||||
[Flags]
|
||||
public enum CollisionCategories : int
|
||||
{
|
||||
|
@ -97,6 +116,7 @@ namespace OpenSim.Region.Physics.OdePlugin
|
|||
public class OdeScene : PhysicsScene
|
||||
{
|
||||
private static readonly log4net.ILog m_log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
|
||||
private Dictionary<string, sCollisionData> m_storedCollisions = new Dictionary<string, sCollisionData>();
|
||||
|
||||
CollisionLocker ode;
|
||||
|
||||
|
@ -110,6 +130,8 @@ namespace OpenSim.Region.Physics.OdePlugin
|
|||
|
||||
private float waterlevel = 0f;
|
||||
private int framecount = 0;
|
||||
private int m_returncollisions = 10;
|
||||
|
||||
private IntPtr contactgroup;
|
||||
private IntPtr LandGeom = (IntPtr) 0;
|
||||
|
||||
|
@ -146,10 +168,20 @@ namespace OpenSim.Region.Physics.OdePlugin
|
|||
private float step_time = 0.0f;
|
||||
private int ms = 0;
|
||||
public IntPtr world;
|
||||
private bool returncollisions = false;
|
||||
private uint obj1LocalID = 0;
|
||||
private uint obj2LocalID = 0;
|
||||
private int ctype = 0;
|
||||
private OdeCharacter cc1;
|
||||
private OdePrim cp1;
|
||||
private OdeCharacter cc2;
|
||||
private OdePrim cp2;
|
||||
private int cStartStop = 0;
|
||||
private string cDictKey = "";
|
||||
|
||||
public IntPtr space;
|
||||
|
||||
private IntPtr tmpSpace;
|
||||
//private IntPtr tmpSpace;
|
||||
// split static geometry collision handling into spaces of 30 meters
|
||||
public IntPtr[,] staticPrimspace = new IntPtr[(int) (300/metersInSpace),(int) (300/metersInSpace)];
|
||||
|
||||
|
@ -357,10 +389,10 @@ namespace OpenSim.Region.Physics.OdePlugin
|
|||
|
||||
lock (contacts)
|
||||
{
|
||||
if (g1 == (IntPtr)0)
|
||||
m_log.Info("g1=0");
|
||||
if (g2 == (IntPtr)0)
|
||||
m_log.Info("g2=0");
|
||||
//if (g1 == (IntPtr)0)
|
||||
//m_log.Info("g1=0");
|
||||
//if (g2 == (IntPtr)0)
|
||||
//m_log.Info("g2=0");
|
||||
|
||||
count = d.Collide(g1, g2, contacts.GetLength(0), contacts, d.ContactGeom.SizeOf);
|
||||
}
|
||||
|
@ -400,6 +432,10 @@ namespace OpenSim.Region.Physics.OdePlugin
|
|||
// We only need to test p2 for 'jump crouch purposes'
|
||||
p2.IsColliding = true;
|
||||
|
||||
if ((framecount % m_returncollisions) == 0)
|
||||
collision_accounting_events(p1, p2);
|
||||
|
||||
|
||||
switch (p1.PhysicsActorType)
|
||||
{
|
||||
case (int)ActorTypes.Agent:
|
||||
|
@ -437,6 +473,8 @@ namespace OpenSim.Region.Physics.OdePlugin
|
|||
(p1.PhysicsActorType == (int) ActorTypes.Agent &&
|
||||
p2.PhysicsActorType == (int) ActorTypes.Prim))
|
||||
{
|
||||
|
||||
|
||||
# region disabled code1
|
||||
//contacts[i].depth = contacts[i].depth * 4.15f;
|
||||
/*
|
||||
|
@ -472,6 +510,7 @@ namespace OpenSim.Region.Physics.OdePlugin
|
|||
}
|
||||
*/
|
||||
#endregion
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
@ -651,6 +690,132 @@ namespace OpenSim.Region.Physics.OdePlugin
|
|||
|
||||
}
|
||||
|
||||
private void collision_accounting_events(PhysicsActor p1, PhysicsActor p2)
|
||||
{
|
||||
obj1LocalID = 0;
|
||||
returncollisions = false;
|
||||
obj2LocalID = 0;
|
||||
ctype = 0;
|
||||
cStartStop = 0;
|
||||
|
||||
switch ((ActorTypes)p2.PhysicsActorType)
|
||||
{
|
||||
case ActorTypes.Agent:
|
||||
cc2 = (OdeCharacter)p2;
|
||||
if (cc2.m_returnCollisions)
|
||||
{
|
||||
obj1LocalID = cc2.m_localID;
|
||||
switch ((ActorTypes)p1.PhysicsActorType)
|
||||
{
|
||||
case ActorTypes.Agent:
|
||||
cc1 = (OdeCharacter)p1;
|
||||
obj2LocalID = cc1.m_localID;
|
||||
ctype = (int)CollisionCategories.Character;
|
||||
|
||||
if (cc1.CollidingObj)
|
||||
cStartStop = (int)StatusIndicators.Generic;
|
||||
else
|
||||
cStartStop = (int)StatusIndicators.Start;
|
||||
|
||||
returncollisions = true;
|
||||
break;
|
||||
case ActorTypes.Prim:
|
||||
cp1 = (OdePrim)p1;
|
||||
obj2LocalID = cp1.m_localID;
|
||||
ctype = (int)CollisionCategories.Geom;
|
||||
|
||||
if (cp1.CollidingObj)
|
||||
cStartStop = (int)StatusIndicators.Generic;
|
||||
else
|
||||
cStartStop = (int)StatusIndicators.Start;
|
||||
|
||||
returncollisions = true;
|
||||
break;
|
||||
|
||||
case ActorTypes.Ground:
|
||||
case ActorTypes.Unknown:
|
||||
obj2LocalID = 0;
|
||||
ctype = (int)CollisionCategories.Land;
|
||||
returncollisions = true;
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
break;
|
||||
case ActorTypes.Prim:
|
||||
cp2 = (OdePrim)p2;
|
||||
if (cp2.m_returnCollisions)
|
||||
{
|
||||
obj1LocalID = cp2.m_localID;
|
||||
switch ((ActorTypes)p1.PhysicsActorType)
|
||||
{
|
||||
case ActorTypes.Agent:
|
||||
cc1 = (OdeCharacter)p1;
|
||||
obj2LocalID = cc1.m_localID;
|
||||
ctype = (int)CollisionCategories.Character;
|
||||
|
||||
if (cc1.CollidingObj)
|
||||
cStartStop = (int)StatusIndicators.Generic;
|
||||
else
|
||||
cStartStop = (int)StatusIndicators.Start;
|
||||
returncollisions = true;
|
||||
|
||||
break;
|
||||
case ActorTypes.Prim:
|
||||
cp1 = (OdePrim)p1;
|
||||
obj2LocalID = cp1.m_localID;
|
||||
ctype = (int)CollisionCategories.Geom;
|
||||
|
||||
if (cp1.CollidingObj)
|
||||
cStartStop = (int)StatusIndicators.Generic;
|
||||
else
|
||||
cStartStop = (int)StatusIndicators.Start;
|
||||
|
||||
returncollisions = true;
|
||||
break;
|
||||
|
||||
case ActorTypes.Ground:
|
||||
case ActorTypes.Unknown:
|
||||
obj2LocalID = 0;
|
||||
ctype = (int)CollisionCategories.Land;
|
||||
|
||||
returncollisions = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
if (returncollisions)
|
||||
{
|
||||
|
||||
lock (m_storedCollisions)
|
||||
{
|
||||
cDictKey = obj1LocalID.ToString() + obj2LocalID.ToString() + cStartStop.ToString() + ctype.ToString();
|
||||
if (m_storedCollisions.ContainsKey(cDictKey))
|
||||
{
|
||||
sCollisionData objd = m_storedCollisions[cDictKey];
|
||||
objd.NumberOfCollisions += 1;
|
||||
objd.lastframe = framecount;
|
||||
m_storedCollisions[cDictKey] = objd;
|
||||
}
|
||||
else
|
||||
{
|
||||
sCollisionData objd = new sCollisionData();
|
||||
objd.ColliderLocalId = obj1LocalID;
|
||||
objd.CollidedWithLocalId = obj2LocalID;
|
||||
objd.CollisionType = ctype;
|
||||
objd.NumberOfCollisions = 1;
|
||||
objd.lastframe = framecount;
|
||||
objd.StatusIndicator = cStartStop;
|
||||
m_storedCollisions.Add(cDictKey, objd);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public int TriArrayCallback(IntPtr trimesh, IntPtr refObject, int[] triangleIndex, int triCount)
|
||||
{
|
||||
/* String name1 = null;
|
||||
|
|
|
@ -134,17 +134,17 @@ namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase
|
|||
|
||||
public void collision_start(uint localID, LLUUID itemID)
|
||||
{
|
||||
myScriptEngine.m_EventQueueManager.AddToScriptQueue(localID, itemID, "collision_start", EventQueueManager.llDetectNull);
|
||||
myScriptEngine.m_EventQueueManager.AddToScriptQueue(localID, itemID, "collision_start", EventQueueManager.llDetectNull, new object[] { (int)1 });
|
||||
}
|
||||
|
||||
public void collision(uint localID, LLUUID itemID)
|
||||
{
|
||||
myScriptEngine.m_EventQueueManager.AddToScriptQueue(localID, itemID, "collision", EventQueueManager.llDetectNull);
|
||||
myScriptEngine.m_EventQueueManager.AddToScriptQueue(localID, itemID, "collision", EventQueueManager.llDetectNull, new object[] { (int)1 });
|
||||
}
|
||||
|
||||
public void collision_end(uint localID, LLUUID itemID)
|
||||
{
|
||||
myScriptEngine.m_EventQueueManager.AddToScriptQueue(localID, itemID, "collision_end", EventQueueManager.llDetectNull);
|
||||
myScriptEngine.m_EventQueueManager.AddToScriptQueue(localID, itemID, "collision_end", EventQueueManager.llDetectNull, new object[] { (int)1 });
|
||||
}
|
||||
|
||||
public void land_collision_start(uint localID, LLUUID itemID)
|
||||
|
|
Loading…
Reference in New Issue