messing around... Let terrain and water have nullphysicsactors, let

nullphyscisactors have a type water, ground or unknown (default). having
this removed geom to name mapping no longer needed. Made some more methods
comum to prims and characters acessible via PhysActor allowing for a more
uniform access. ...
avinationmerge
UbitUmarov 2012-07-15 00:50:00 +01:00
parent a492b6f693
commit 62df82b74d
6 changed files with 267 additions and 387 deletions

View File

@ -43,7 +43,8 @@ namespace OpenSim.Region.Physics.Manager
Unknown = 0,
Agent = 1,
Prim = 2,
Ground = 3
Ground = 3,
Water = 4
}
public enum PIDHoverType
@ -202,7 +203,7 @@ namespace OpenSim.Region.Physics.Manager
/// XXX: Bizarrely, this cannot be "Terrain" or "Water" right now unless it really is simulating terrain or
/// water. This is not a problem due to the formatting of names given by prims and avatars.
/// </remarks>
public string Name { get; protected set; }
public string Name { get; set; }
/// <summary>
/// This is being used by ODE joint code.
@ -230,11 +231,6 @@ namespace OpenSim.Region.Physics.Manager
}
}
public virtual byte[] Serialize(bool PhysIsRunning)
{
return new byte[0];
}
public virtual void RaiseOutOfBounds(Vector3 pos)
{
// Make a temporary copy of the event to avoid possibility of
@ -258,10 +254,7 @@ namespace OpenSim.Region.Physics.Manager
handler(e);
}
public virtual void SetMaterial (int material)
{
}
public virtual void SetMaterial (int material) { }
public virtual float Density { get; set; }
public virtual float GravModifier { get; set; }
public virtual float Friction { get; set; }
@ -373,13 +366,21 @@ namespace OpenSim.Region.Physics.Manager
public abstract void SubscribeEvents(int ms);
public abstract void UnSubscribeEvents();
public abstract bool SubscribedEvents();
public virtual void AddCollisionEvent(uint CollidedWith, ContactPoint contact) { }
// Warning in a parent part it returns itself, not null
public virtual PhysicsActor ParentActor { get { return this; } }
}
public class NullPhysicsActor : PhysicsActor
{
private ActorTypes m_actorType = ActorTypes.Unknown;
public override bool Stopped
{
get{ return false; }
get{ return true; }
}
public override Vector3 Position
@ -396,6 +397,7 @@ namespace OpenSim.Region.Physics.Manager
public override uint LocalID
{
get { return 0; }
set { return; }
}
@ -455,49 +457,17 @@ namespace OpenSim.Region.Physics.Manager
set { return; }
}
public override void VehicleFloatParam(int param, float value)
{
}
public override void VehicleFloatParam(int param, float value) {}
public override void VehicleVectorParam(int param, Vector3 value) { }
public override void VehicleRotationParam(int param, Quaternion rotation) { }
public override void VehicleFlags(int param, bool remove) { }
public override void SetVolumeDetect(int param) {}
public override void SetMaterial(int material) {}
public override Vector3 CenterOfMass { get { return Vector3.Zero; }}
public override void VehicleVectorParam(int param, Vector3 value)
{
public override Vector3 GeometricCenter { get { return Vector3.Zero; }}
}
public override void VehicleRotationParam(int param, Quaternion rotation)
{
}
public override void VehicleFlags(int param, bool remove)
{
}
public override void SetVolumeDetect(int param)
{
}
public override void SetMaterial(int material)
{
}
public override Vector3 CenterOfMass
{
get { return Vector3.Zero; }
}
public override Vector3 GeometricCenter
{
get { return Vector3.Zero; }
}
public override PrimitiveBaseShape Shape
{
set { return; }
}
public override PrimitiveBaseShape Shape { set { return; }}
public override Vector3 Velocity
{
@ -517,9 +487,7 @@ namespace OpenSim.Region.Physics.Manager
set { }
}
public override void CrossingFailure()
{
}
public override void CrossingFailure() {}
public override Quaternion Orientation
{
@ -559,8 +527,20 @@ namespace OpenSim.Region.Physics.Manager
public override int PhysicsActorType
{
get { return (int) ActorTypes.Unknown; }
set { return; }
get { return (int)m_actorType; }
set {
ActorTypes type = (ActorTypes)value;
switch (type)
{
case ActorTypes.Ground:
case ActorTypes.Water:
m_actorType = type;
break;
default:
m_actorType = ActorTypes.Unknown;
break;
}
}
}
public override bool Kinematic
@ -569,26 +549,11 @@ namespace OpenSim.Region.Physics.Manager
set { return; }
}
public override void link(PhysicsActor obj)
{
}
public override void delink()
{
}
public override void LockAngularMotion(Vector3 axis)
{
}
public override void AddForce(Vector3 force, bool pushforce)
{
}
public override void AddAngularForce(Vector3 force, bool pushforce)
{
}
public override void link(PhysicsActor obj) { }
public override void delink() { }
public override void LockAngularMotion(Vector3 axis) { }
public override void AddForce(Vector3 force, bool pushforce) { }
public override void AddAngularForce(Vector3 force, bool pushforce) { }
public override Vector3 RotationalVelocity
{
@ -610,22 +575,10 @@ namespace OpenSim.Region.Physics.Manager
public override float APIDStrength { set { return; } }
public override float APIDDamping { set { return; } }
public override void SetMomentum(Vector3 momentum)
{
}
public override void SubscribeEvents(int ms)
{
}
public override void UnSubscribeEvents()
{
}
public override bool SubscribedEvents()
{
return false;
}
public override void SetMomentum(Vector3 momentum) { }
public override void SubscribeEvents(int ms) { }
public override void UnSubscribeEvents() { }
public override bool SubscribedEvents() { return false; }
}
}

View File

@ -106,7 +106,7 @@ namespace OpenSim.Region.Physics.OdePlugin
private bool m_freemove = false;
// private CollisionLocker ode;
private string m_name = String.Empty;
// private string m_name = String.Empty;
// other filter control
int m_colliderfilter = 0;
int m_colliderGroundfilter = 0;
@ -183,7 +183,7 @@ namespace OpenSim.Region.Physics.OdePlugin
m_isPhysical = false; // current status: no ODE information exists
m_name = avName;
Name = avName;
AddChange(changes.Add, null);
}
@ -218,6 +218,11 @@ namespace OpenSim.Region.Physics.OdePlugin
set { m_localID = value; }
}
public override PhysicsActor ParentActor
{
get { return (PhysicsActor)this; }
}
public override bool Grabbed
{
set { return; }
@ -740,7 +745,7 @@ namespace OpenSim.Region.Physics.OdePlugin
//kill the Geometry
if (Shell != IntPtr.Zero)
{
_parent_scene.geom_name_map.Remove(Shell);
// _parent_scene.geom_name_map.Remove(Shell);
_parent_scene.actor_name_map.Remove(Shell);
_parent_scene.waitForSpaceUnlock(_parent_scene.ActiveSpace);
d.GeomDestroy(Shell);
@ -1115,7 +1120,7 @@ namespace OpenSim.Region.Physics.OdePlugin
m_eventsubscription = 0;
}
public void AddCollisionEvent(uint CollidedWith, ContactPoint contact)
public override void AddCollisionEvent(uint CollidedWith, ContactPoint contact)
{
if (CollisionEventsThisFrame == null)
CollisionEventsThisFrame = new CollisionEventUpdate();
@ -1184,7 +1189,7 @@ namespace OpenSim.Region.Physics.OdePlugin
}
AvatarGeomAndBodyCreation(_position.X, _position.Y, _position.Z);
_parent_scene.geom_name_map[Shell] = m_name;
_parent_scene.actor_name_map[Shell] = (PhysicsActor)this;
_parent_scene.AddCharacter(this);
}
@ -1236,7 +1241,6 @@ namespace OpenSim.Region.Physics.OdePlugin
Velocity = Vector3.Zero;
_parent_scene.geom_name_map[Shell] = m_name;
_parent_scene.actor_name_map[Shell] = (PhysicsActor)this;
}
else

View File

@ -176,7 +176,7 @@ namespace OpenSim.Region.Physics.OdePlugin
private bool m_lastUpdateSent;
public IntPtr Body = IntPtr.Zero;
public String Name { get; private set; }
// public String Name { get; private set; }
private Vector3 _target_velocity;
public Vector3 primOOBsize; // prim real dimensions from mesh
@ -295,14 +295,14 @@ namespace OpenSim.Region.Physics.OdePlugin
set { m_localID = value; }
}
public OdePrim Parent
public override PhysicsActor ParentActor
{
get
{
if (childPrim)
return (OdePrim)_parent;
return _parent;
else
return this;
return (PhysicsActor)this;
}
}
@ -950,7 +950,7 @@ namespace OpenSim.Region.Physics.OdePlugin
_parent_scene.RemoveCollisionEventReporting(this);
}
public void AddCollisionEvent(uint CollidedWith, ContactPoint contact)
public override void AddCollisionEvent(uint CollidedWith, ContactPoint contact)
{
if (CollisionEventsThisFrame == null)
CollisionEventsThisFrame = new CollisionEventUpdate();
@ -1431,6 +1431,7 @@ namespace OpenSim.Region.Physics.OdePlugin
//Console.WriteLine("SetGeom to " + prim_geom + " for " + Name);
if (prim_geom != IntPtr.Zero)
{
if (m_NoColide)
{
d.GeomSetCategoryBits(prim_geom, 0);
@ -1452,7 +1453,6 @@ namespace OpenSim.Region.Physics.OdePlugin
CalcPrimBodyData();
_parent_scene.geom_name_map[prim_geom] = Name;
_parent_scene.actor_name_map[prim_geom] = this;
}
@ -1526,7 +1526,7 @@ namespace OpenSim.Region.Physics.OdePlugin
{
if (prim_geom != IntPtr.Zero)
{
_parent_scene.geom_name_map.Remove(prim_geom);
// _parent_scene.geom_name_map.Remove(prim_geom);
_parent_scene.actor_name_map.Remove(prim_geom);
try
{

View File

@ -470,6 +470,7 @@ namespace OpenSim.Region.Physics.OdePlugin
if (p2 == null)
{
/*
string name;
if (!m_scene.geom_name_map.TryGetValue(g2, out name))
@ -488,11 +489,15 @@ namespace OpenSim.Region.Physics.OdePlugin
}
else
return;
*/
return;
}
else
{
if (p2 is OdePrim)
switch (p2.PhysicsActorType)
{
case (int)ActorTypes.Prim:
RayFilterFlags thisFlags;
if (p2.IsPhysical)
@ -510,16 +515,32 @@ namespace OpenSim.Region.Physics.OdePlugin
return;
ID = ((OdePrim)p2).LocalID;
}
else if (p2 is OdeCharacter)
{
break;
case (int)ActorTypes.Agent:
if ((CurrentRayFilter & RayFilterFlags.agent) == 0)
return;
else
ID = ((OdeCharacter)p2).LocalID;
}
else //??
break;
case (int)ActorTypes.Ground:
if ((CurrentRayFilter & RayFilterFlags.land) == 0)
return;
break;
case (int)ActorTypes.Water:
if ((CurrentRayFilter & RayFilterFlags.water) == 0)
return;
break;
default:
return;
break;
}
}
d.ContactGeom curcontact = new d.ContactGeom();

View File

@ -251,7 +251,7 @@ namespace OpenSim.Region.Physics.OdePlugin
private List<PhysicsActor> _collisionEventPrimRemove = new List<PhysicsActor>();
private HashSet<OdeCharacter> _badCharacter = new HashSet<OdeCharacter>();
public Dictionary<IntPtr, String> geom_name_map = new Dictionary<IntPtr, String>();
// public Dictionary<IntPtr, String> geom_name_map = new Dictionary<IntPtr, String>();
public Dictionary<IntPtr, PhysicsActor> actor_name_map = new Dictionary<IntPtr, PhysicsActor>();
private float contactsurfacelayer = 0.002f;
@ -274,7 +274,7 @@ namespace OpenSim.Region.Physics.OdePlugin
private int m_physicsiterations = 10;
private const float m_SkipFramesAtms = 0.40f; // Drop frames gracefully at a 400 ms lag
private PhysicsActor PANull = new NullPhysicsActor();
// private PhysicsActor PANull = new NullPhysicsActor();
private float step_time = 0.0f;
public IntPtr world;
@ -713,6 +713,7 @@ namespace OpenSim.Region.Physics.OdePlugin
if (b1 != IntPtr.Zero && b2 != IntPtr.Zero && d.AreConnectedExcluding(b1, b2, d.JointType.Contact))
return;
if(d.GeomGetCategoryBits(g1) == (uint)CollisionCategories.VolumeDtc ||
d.GeomGetCategoryBits(g1) == (uint)CollisionCategories.VolumeDtc)
{
@ -738,7 +739,7 @@ namespace OpenSim.Region.Physics.OdePlugin
return;
}
// id contacts done
// contacts done
if (count == 0)
return;
@ -748,12 +749,14 @@ namespace OpenSim.Region.Physics.OdePlugin
if (!actor_name_map.TryGetValue(g1, out p1))
{
p1 = PANull;
m_log.WarnFormat("[PHYSICS]: failed actor mapping for geom 1");
return;
}
if (!actor_name_map.TryGetValue(g2, out p2))
{
p2 = PANull;
m_log.WarnFormat("[PHYSICS]: failed actor mapping for geom 2");
return;
}
// update actors collision score
@ -765,7 +768,6 @@ namespace OpenSim.Region.Physics.OdePlugin
p2.CollisionScore = 0;
p2.CollisionScore += count;
// get first contact
d.ContactGeom curContact = new d.ContactGeom();
if (!GetCurContactGeom(0, ref curContact))
@ -798,7 +800,6 @@ namespace OpenSim.Region.Physics.OdePlugin
ContactData contactdata1 = new ContactData(0, 0, false);
ContactData contactdata2 = new ContactData(0, 0, false);
String name = null;
bool dop1foot = false;
bool dop2foot = false;
bool ignore = false;
@ -830,34 +831,16 @@ namespace OpenSim.Region.Physics.OdePlugin
switch (p2.PhysicsActorType)
{
case (int)ActorTypes.Agent:
/*
p1.getContactData(ref contactdata1);
p2.getContactData(ref contactdata2);
mu = (float)Math.Sqrt(contactdata1.mu * contactdata2.mu);
if ((Math.Abs(p2.Velocity.X - p1.Velocity.X) > 0.1f || Math.Abs(p2.Velocity.Y - p1.Velocity.Y) > 0.1f))
mu *= frictionMovementMult;
*/
p1.CollidingObj = true;
p2.CollidingObj = true;
break;
case (int)ActorTypes.Prim:
/*
p1.getContactData(ref contactdata1);
p2.getContactData(ref contactdata2);
mu = (float)Math.Sqrt(contactdata1.mu * contactdata2.mu);
if ((Math.Abs(p2.Velocity.X - p1.Velocity.X) > 0.1f || Math.Abs(p2.Velocity.Y - p1.Velocity.Y) > 0.1f))
mu *= frictionMovementMult;
*/
if (p2.Velocity.LengthSquared() > 0.0f)
p2.CollidingObj = true;
dop1foot = true;
break;
default:
ignore = true; // avatar to terrain and water ignored
break;
@ -869,9 +852,6 @@ namespace OpenSim.Region.Physics.OdePlugin
switch (p2.PhysicsActorType)
{
case (int)ActorTypes.Agent:
// p1.getContactData(ref contactdata1);
// p2.getContactData(ref contactdata2);
AvanormOverride = true;
Vector3 tmp = p2.Position - p1.Position;
@ -894,16 +874,12 @@ namespace OpenSim.Region.Physics.OdePlugin
bounce = 0;
mu = 0;
cfm = 0.0001f;
/*
mu = (float)Math.Sqrt(contactdata1.mu * contactdata2.mu);
if ((Math.Abs(p2.Velocity.X - p1.Velocity.X) > 0.1f || Math.Abs(p2.Velocity.Y - p1.Velocity.Y) > 0.1f))
mu *= frictionMovementMult;
*/
dop2foot = true;
if (p1.Velocity.LengthSquared() > 0.0f)
p1.CollidingObj = true;
break;
case (int)ActorTypes.Prim:
if ((p1.Velocity - p2.Velocity).LengthSquared() > 0.0f)
{
@ -933,11 +909,8 @@ namespace OpenSim.Region.Physics.OdePlugin
mu *= frictionMovementMult;
break;
default:
if (geom_name_map.TryGetValue(g2, out name))
{
if (name == "Terrain")
{
case (int)ActorTypes.Ground:
p1.getContactData(ref contactdata1);
bounce = contactdata1.bounce * TerrainBounce;
mu = (float)Math.Sqrt(contactdata1.mu * TerrainFriction);
@ -962,24 +935,16 @@ namespace OpenSim.Region.Physics.OdePlugin
if (curContact.side1 > 0)
IgnoreNegSides = true;
}
}
else if (name == "Water")
{
ignore = true;
}
}
else
ignore = true;
break;
}
break;
case (int)ActorTypes.Water:
default:
if (geom_name_map.TryGetValue(g1, out name))
{
if (name == "Terrain")
{
ignore = true;
break;
}
break;
case (int)ActorTypes.Ground:
if (p2.PhysicsActorType == (int)ActorTypes.Prim)
{
p2.CollidingGround = true;
@ -1009,19 +974,12 @@ namespace OpenSim.Region.Physics.OdePlugin
}
else
ignore = true;
break;
}
else if (name == "Water" &&
(p2.PhysicsActorType == (int)ActorTypes.Prim || p2.PhysicsActorType == (int)ActorTypes.Agent))
{
ignore = true;
}
}
else
ignore = true;
case (int)ActorTypes.Water:
default:
break;
}
if (ignore)
return;
@ -1166,15 +1124,8 @@ namespace OpenSim.Region.Physics.OdePlugin
private void collision_accounting_events(PhysicsActor p1, PhysicsActor p2, ContactPoint contact)
{
OdeCharacter cc1;
OdePrim cp1;
OdeCharacter cc2;
OdePrim cp2;
OdePrim cp1Parent;
OdePrim cp2Parent;
uint obj2LocalID = 0;
bool p1events = p1.SubscribedEvents();
bool p2events = p2.SubscribedEvents();
@ -1183,15 +1134,9 @@ namespace OpenSim.Region.Physics.OdePlugin
if (p2.IsVolumeDtc)
p1events = false;
if (!(p2events || p1events))
if (!p2events && !p1events)
return;
if (p1events)
AddCollisionEventReporting(p1);
if (p2events)
AddCollisionEventReporting(p2);
Vector3 vel = Vector3.Zero;
if (p2 != null && p2.IsPhysical)
vel = p2.Velocity;
@ -1204,25 +1149,18 @@ namespace OpenSim.Region.Physics.OdePlugin
switch ((ActorTypes)p1.PhysicsActorType)
{
case ActorTypes.Agent:
cc1 = (OdeCharacter)p1;
case ActorTypes.Prim:
{
switch ((ActorTypes)p2.PhysicsActorType)
{
case ActorTypes.Agent:
cc2 = (OdeCharacter)p2;
obj2LocalID = cc2.LocalID;
if (p2events)
cc2.AddCollisionEvent(cc1.LocalID, contact);
break;
case ActorTypes.Prim:
if (p2 is OdePrim)
{
cp2 = (OdePrim)p2;
if (p2events)
cp2.AddCollisionEvent(cc1.LocalID, contact);
cp2 = cp2.Parent;
obj2LocalID = cp2.LocalID;
{
AddCollisionEventReporting(p2);
p2.AddCollisionEvent(p1.ParentActor.LocalID, contact);
}
obj2LocalID = p2.ParentActor.LocalID;
break;
case ActorTypes.Ground:
@ -1234,77 +1172,22 @@ namespace OpenSim.Region.Physics.OdePlugin
if (p1events)
{
contact.SurfaceNormal = -contact.SurfaceNormal;
cc1.AddCollisionEvent(obj2LocalID, contact);
AddCollisionEventReporting(p1);
p1.AddCollisionEvent(obj2LocalID, contact);
}
break;
case ActorTypes.Prim:
if (p1 is OdePrim)
{
cp1 = (OdePrim)p1;
cp1Parent = cp1.Parent;
switch ((ActorTypes)p2.PhysicsActorType)
{
case ActorTypes.Agent:
if (p2 is OdeCharacter)
{
cc2 = (OdeCharacter)p2;
obj2LocalID = cc2.LocalID;
if (p2events)
cc2.AddCollisionEvent(cp1Parent.LocalID, contact);
}
break;
case ActorTypes.Prim:
if (p2 is OdePrim)
{
cp2 = (OdePrim)p2;
if (p2events)
cp2.AddCollisionEvent(cp1Parent.LocalID, contact);
cp2 = cp2.Parent;
obj2LocalID = cp2.LocalID;
}
break;
case ActorTypes.Ground:
case ActorTypes.Unknown:
default:
obj2LocalID = 0;
break;
}
if (p1events)
{
contact.SurfaceNormal = -contact.SurfaceNormal;
cp1.AddCollisionEvent(obj2LocalID, contact);
}
}
break;
case ActorTypes.Ground:
case ActorTypes.Unknown:
default:
switch ((ActorTypes)p2.PhysicsActorType)
if (p2events && !p2.IsVolumeDtc)
{
case ActorTypes.Agent:
if (p2 is OdeCharacter)
{
cc2 = (OdeCharacter)p2;
obj2LocalID = cc2.LocalID;
if (p2events)
cc2.AddCollisionEvent(0, contact);
}
break;
case ActorTypes.Prim:
if (p2 is OdePrim)
{
cp2 = (OdePrim)p2;
obj2LocalID = cp2.LocalID;
if (p2events)
cp2.AddCollisionEvent(0, contact);
AddCollisionEventReporting(p2);
p2.AddCollisionEvent(0, contact);
}
break;
}
break;
}
}
@ -2369,6 +2252,7 @@ namespace OpenSim.Region.Physics.OdePlugin
RegionTerrain.Remove(pOffset);
if (GroundGeom != IntPtr.Zero)
{
actor_name_map.Remove(GroundGeom);
d.GeomDestroy(GroundGeom);
if (TerrainHeightFieldHeights.ContainsKey(GroundGeom))
@ -2394,8 +2278,12 @@ namespace OpenSim.Region.Physics.OdePlugin
d.GeomSetCategoryBits(GroundGeom, (uint)(CollisionCategories.Land));
d.GeomSetCollideBits(GroundGeom, 0);
}
geom_name_map[GroundGeom] = "Terrain";
PhysicsActor pa = new NullPhysicsActor();
pa.Name = "Terrain";
pa.PhysicsActorType = (int)ActorTypes.Ground;
actor_name_map[GroundGeom] = pa;
// geom_name_map[GroundGeom] = "Terrain";
d.Matrix3 R = new d.Matrix3();
@ -2417,6 +2305,7 @@ namespace OpenSim.Region.Physics.OdePlugin
TerrainHeightFieldHeightsHandlers.Add(GroundGeom, _heightmaphandler);
}
}
}
public void UbitSetTerrain(float[] heightMap, Vector3 pOffset)
{
@ -2478,6 +2367,7 @@ namespace OpenSim.Region.Physics.OdePlugin
RegionTerrain.Remove(pOffset);
if (GroundGeom != IntPtr.Zero)
{
actor_name_map.Remove(GroundGeom);
d.GeomDestroy(GroundGeom);
if (TerrainHeightFieldHeights.ContainsKey(GroundGeom))
@ -2509,8 +2399,12 @@ namespace OpenSim.Region.Physics.OdePlugin
d.GeomSetCategoryBits(GroundGeom, (uint)(CollisionCategories.Land));
d.GeomSetCollideBits(GroundGeom, 0);
}
geom_name_map[GroundGeom] = "Terrain";
PhysicsActor pa = new NullPhysicsActor();
pa.Name = "Terrain";
pa.PhysicsActorType = (int)ActorTypes.Ground;
actor_name_map[GroundGeom] = pa;
// geom_name_map[GroundGeom] = "Terrain";
d.GeomSetPosition(GroundGeom, pOffset.X + (float)Constants.RegionSize * 0.5f, pOffset.Y + (float)Constants.RegionSize * 0.5f, 0);
RegionTerrain.Add(pOffset, GroundGeom);
@ -2518,6 +2412,7 @@ namespace OpenSim.Region.Physics.OdePlugin
TerrainHeightFieldHeightsHandlers.Add(GroundGeom, _heightmaphandler);
}
}
}
public override void DeleteTerrain()
@ -2632,6 +2527,7 @@ namespace OpenSim.Region.Physics.OdePlugin
{
if (WaterGeom != IntPtr.Zero)
{
actor_name_map.Remove(WaterGeom);
d.GeomDestroy(WaterGeom);
d.GeomHeightfieldDataDestroy(WaterHeightmapData);
WaterGeom = IntPtr.Zero;
@ -2654,7 +2550,13 @@ namespace OpenSim.Region.Physics.OdePlugin
d.GeomSetCategoryBits(WaterGeom, (uint)(CollisionCategories.Water));
d.GeomSetCollideBits(WaterGeom, 0);
geom_name_map[WaterGeom] = "Water";
PhysicsActor pa = new NullPhysicsActor();
pa.Name = "Water";
pa.PhysicsActorType = (int)ActorTypes.Water;
actor_name_map[WaterGeom] = pa;
// geom_name_map[WaterGeom] = "Water";
d.Matrix3 R = new d.Matrix3();