Merge branch 'ubitwork' into avination

avinationmerge
Melanie 2012-07-17 10:25:13 +02:00
commit 0797736fba
11 changed files with 395 additions and 459 deletions

View File

@ -288,9 +288,8 @@ namespace OpenSim.Framework.Servers.HttpServer
{ {
foreach (PollServiceHttpRequest req in m_retryRequests) foreach (PollServiceHttpRequest req in m_retryRequests)
{ {
m_server.DoHTTPGruntWork( DoHTTPGruntWork(m_server,req,
req.PollServiceArgs.NoEvents(req.RequestID, req.PollServiceArgs.Id), req.PollServiceArgs.NoEvents(req.RequestID, req.PollServiceArgs.Id));
new OSHttpResponse(new HttpResponse(req.HttpContext, req.Request), req.HttpContext));
} }
} }
catch catch
@ -311,9 +310,8 @@ namespace OpenSim.Framework.Servers.HttpServer
try try
{ {
wreq = m_requests.Dequeue(0); wreq = m_requests.Dequeue(0);
m_server.DoHTTPGruntWork( DoHTTPGruntWork(m_server,wreq,
wreq.PollServiceArgs.NoEvents(wreq.RequestID, wreq.PollServiceArgs.Id), wreq.PollServiceArgs.NoEvents(wreq.RequestID, wreq.PollServiceArgs.Id));
new OSHttpResponse(new HttpResponse(wreq.HttpContext, wreq.Request), wreq.HttpContext));
} }
catch catch
{ {
@ -357,8 +355,7 @@ namespace OpenSim.Framework.Servers.HttpServer
try try
{ {
Hashtable responsedata = req.PollServiceArgs.GetEvents(req.RequestID, req.PollServiceArgs.Id, str.ReadToEnd()); Hashtable responsedata = req.PollServiceArgs.GetEvents(req.RequestID, req.PollServiceArgs.Id, str.ReadToEnd());
m_server.DoHTTPGruntWork(responsedata, DoHTTPGruntWork(m_server, req, responsedata);
new OSHttpResponse(new HttpResponse(req.HttpContext, req.Request), req.HttpContext));
} }
catch (ObjectDisposedException) // Browser aborted before we could read body, server closed the stream catch (ObjectDisposedException) // Browser aborted before we could read body, server closed the stream
{ {
@ -374,8 +371,8 @@ namespace OpenSim.Framework.Servers.HttpServer
if ((Environment.TickCount - req.RequestTime) > req.PollServiceArgs.TimeOutms) if ((Environment.TickCount - req.RequestTime) > req.PollServiceArgs.TimeOutms)
{ {
m_server.DoHTTPGruntWork(req.PollServiceArgs.NoEvents(req.RequestID, req.PollServiceArgs.Id), DoHTTPGruntWork(m_server, req,
new OSHttpResponse(new HttpResponse(req.HttpContext, req.Request), req.HttpContext)); req.PollServiceArgs.NoEvents(req.RequestID, req.PollServiceArgs.Id));
} }
else else
{ {
@ -390,6 +387,46 @@ namespace OpenSim.Framework.Servers.HttpServer
} }
} }
} }
// DoHTTPGruntWork changed, not sending response
// do the same work around as core
internal static void DoHTTPGruntWork(BaseHttpServer server, PollServiceHttpRequest req, Hashtable responsedata)
{
OSHttpResponse response
= new OSHttpResponse(new HttpResponse(req.HttpContext, req.Request), req.HttpContext);
byte[] buffer = server.DoHTTPGruntWork(responsedata, response);
response.SendChunked = false;
response.ContentLength64 = buffer.Length;
response.ContentEncoding = Encoding.UTF8;
try
{
response.OutputStream.Write(buffer, 0, buffer.Length);
}
catch (Exception ex)
{
m_log.Warn(string.Format("[POLL SERVICE WORKER THREAD]: Error ", ex));
}
finally
{
//response.OutputStream.Close();
try
{
response.OutputStream.Flush();
response.Send();
//if (!response.KeepAlive && response.ReuseContext)
// response.FreeContext();
}
catch (Exception e)
{
m_log.Warn(String.Format("[POLL SERVICE WORKER THREAD]: Error ", e));
}
}
}
} }
} }

View File

@ -225,7 +225,6 @@ namespace OpenSim.Region.Framework.Scenes
private int backupMS; private int backupMS;
private int terrainMS; private int terrainMS;
private int landMS; private int landMS;
private int spareMS;
/// <summary> /// <summary>
/// Tick at which the last frame was processed. /// Tick at which the last frame was processed.
@ -1434,16 +1433,20 @@ namespace OpenSim.Region.Framework.Scenes
endFrame = Frame + frames; endFrame = Frame + frames;
float physicsFPS = 0f; float physicsFPS = 0f;
int previousFrameTick, tmpMS; int tmpMS;
int maintc = Util.EnvironmentTickCount(); int previousFrameTick;
int maintc;
int sleepMS;
int framestart;
while (!m_shuttingDown && (endFrame == null || Frame < endFrame)) while (!m_shuttingDown && (endFrame == null || Frame < endFrame))
{ {
framestart = Util.EnvironmentTickCount();
++Frame; ++Frame;
// m_log.DebugFormat("[SCENE]: Processing frame {0} in {1}", Frame, RegionInfo.RegionName); // m_log.DebugFormat("[SCENE]: Processing frame {0} in {1}", Frame, RegionInfo.RegionName);
agentMS = tempOnRezMS = eventMS = backupMS = terrainMS = landMS = spareMS = 0; agentMS = tempOnRezMS = eventMS = backupMS = terrainMS = landMS = 0;
try try
{ {
@ -1496,6 +1499,7 @@ namespace OpenSim.Region.Framework.Scenes
agentMS += Util.EnvironmentTickCountSubtract(tmpMS); agentMS += Util.EnvironmentTickCountSubtract(tmpMS);
// Delete temp-on-rez stuff // Delete temp-on-rez stuff
if (Frame % m_update_temp_cleaning == 0 && !m_cleaningTemps) if (Frame % m_update_temp_cleaning == 0 && !m_cleaningTemps)
{ {
@ -1573,37 +1577,38 @@ namespace OpenSim.Region.Framework.Scenes
Watchdog.UpdateThread(); Watchdog.UpdateThread();
previousFrameTick = m_lastFrameTick;
m_lastFrameTick = Util.EnvironmentTickCount();
tmpMS = Util.EnvironmentTickCountSubtract(m_lastFrameTick, maintc);
tmpMS = (int)(MinFrameTime * 1000) - tmpMS;
m_firstHeartbeat = false;
if (tmpMS > 0)
{
Thread.Sleep(tmpMS);
spareMS += tmpMS;
}
frameMS = Util.EnvironmentTickCountSubtract(maintc);
maintc = Util.EnvironmentTickCount();
otherMS = tempOnRezMS + eventMS + backupMS + terrainMS + landMS; otherMS = tempOnRezMS + eventMS + backupMS + terrainMS + landMS;
// if (Frame%m_update_avatars == 0)
// UpdateInWorldTime();
StatsReporter.AddPhysicsFPS(physicsFPS); StatsReporter.AddPhysicsFPS(physicsFPS);
StatsReporter.AddTimeDilation(TimeDilation); StatsReporter.AddTimeDilation(TimeDilation);
StatsReporter.AddFPS(1); StatsReporter.AddFPS(1);
StatsReporter.addFrameMS(frameMS);
StatsReporter.addAgentMS(agentMS); StatsReporter.addAgentMS(agentMS);
StatsReporter.addPhysicsMS(physicsMS + physicsMS2); StatsReporter.addPhysicsMS(physicsMS + physicsMS2);
StatsReporter.addOtherMS(otherMS); StatsReporter.addOtherMS(otherMS);
StatsReporter.AddSpareMS(spareMS);
StatsReporter.addScriptLines(m_sceneGraph.GetScriptLPS()); StatsReporter.addScriptLines(m_sceneGraph.GetScriptLPS());
previousFrameTick = m_lastFrameTick;
m_lastFrameTick = Util.EnvironmentTickCount();
tmpMS = Util.EnvironmentTickCountSubtract(m_lastFrameTick, framestart);
tmpMS = (int)(MinFrameTime * 1000) - tmpMS;
m_firstHeartbeat = false;
sleepMS = Util.EnvironmentTickCount();
if (tmpMS > 0)
Thread.Sleep(tmpMS);
sleepMS = Util.EnvironmentTickCountSubtract(sleepMS);
frameMS = Util.EnvironmentTickCountSubtract(framestart);
StatsReporter.addSleepMS(sleepMS);
StatsReporter.addFrameMS(frameMS);
// if (Frame%m_update_avatars == 0)
// UpdateInWorldTime();
// Optionally warn if a frame takes double the amount of time that it should. // Optionally warn if a frame takes double the amount of time that it should.
if (DebugUpdates if (DebugUpdates
&& Util.EnvironmentTickCountSubtract( && Util.EnvironmentTickCountSubtract(

View File

@ -3066,7 +3066,7 @@ namespace OpenSim.Region.Framework.Scenes
part.LinkNum = linkNum; part.LinkNum = linkNum;
// Compute the new position of this SOP relative to the group position // Compute the new position of this SOP relative to the group position
part.OffsetPosition = part.GroupPosition - AbsolutePosition; part.OffsetPosition = newPos - AbsolutePosition;
// (radams1 20120711: I don't know why part.OffsetPosition is set multiple times. // (radams1 20120711: I don't know why part.OffsetPosition is set multiple times.
// It would have the affect of setting the physics engine position multiple // It would have the affect of setting the physics engine position multiple
@ -3087,7 +3087,8 @@ namespace OpenSim.Region.Framework.Scenes
// Since this SOP's state has changed, push those changes into the physics engine // Since this SOP's state has changed, push those changes into the physics engine
// and the simulator. // and the simulator.
part.UpdatePrimFlags(UsesPhysics, IsTemporary, IsPhantom, IsVolumeDetect, false); // done on caller
// part.UpdatePrimFlags(UsesPhysics, IsTemporary, IsPhantom, IsVolumeDetect, false);
} }
/// <summary> /// <summary>

View File

@ -4964,7 +4964,7 @@ namespace OpenSim.Region.Framework.Scenes
pa.OnCollisionUpdate -= PhysicsCollision; pa.OnCollisionUpdate -= PhysicsCollision;
bool hassound = (CollisionSoundType >= 0 && !VolumeDetectActive); bool hassound = (!VolumeDetectActive && CollisionSoundType >= 0 && ((Flags & PrimFlags.Physics) != 0));
scriptEvents CombinedEvents = AggregateScriptEvents; scriptEvents CombinedEvents = AggregateScriptEvents;

View File

@ -164,7 +164,7 @@ namespace OpenSim.Region.Framework.Scenes
// saved last reported value so there is something available for llGetRegionFPS // saved last reported value so there is something available for llGetRegionFPS
private float lastReportedSimFPS; private float lastReportedSimFPS;
private float[] lastReportedSimStats = new float[22]; private float[] lastReportedSimStats = new float[23];
private float m_pfps; private float m_pfps;
/// <summary> /// <summary>
@ -178,12 +178,13 @@ namespace OpenSim.Region.Framework.Scenes
private int m_objectUpdates; private int m_objectUpdates;
private int m_frameMS; private int m_frameMS;
private int m_spareMS;
private int m_netMS; private int m_netMS;
private int m_agentMS; private int m_agentMS;
private int m_physicsMS; private int m_physicsMS;
private int m_imageMS; private int m_imageMS;
private int m_otherMS; private int m_otherMS;
private int m_sleeptimeMS;
//Ckrinke: (3-21-08) Comment out to remove a compiler warning. Bring back into play when needed. //Ckrinke: (3-21-08) Comment out to remove a compiler warning. Bring back into play when needed.
//Ckrinke private int m_scriptMS = 0; //Ckrinke private int m_scriptMS = 0;
@ -260,7 +261,7 @@ namespace OpenSim.Region.Framework.Scenes
private void statsHeartBeat(object sender, EventArgs e) private void statsHeartBeat(object sender, EventArgs e)
{ {
SimStatsPacket.StatBlock[] sb = new SimStatsPacket.StatBlock[22]; SimStatsPacket.StatBlock[] sb = new SimStatsPacket.StatBlock[23];
SimStatsPacket.RegionBlock rb = new SimStatsPacket.RegionBlock(); SimStatsPacket.RegionBlock rb = new SimStatsPacket.RegionBlock();
// Know what's not thread safe in Mono... modifying timers. // Know what's not thread safe in Mono... modifying timers.
@ -298,6 +299,8 @@ namespace OpenSim.Region.Framework.Scenes
physfps = 0; physfps = 0;
#endregion #endregion
float factor = 1 / m_statsUpdateFactor;
if (reportedFPS <= 0) if (reportedFPS <= 0)
reportedFPS = 1; reportedFPS = 1;
@ -308,9 +311,22 @@ 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
{
sparetime = m_frameMS - m_physicsMS - m_agentMS;
sparetime *= perframe;
if (sparetime < 0)
sparetime = 0;
else if (sparetime > TotalFrameTime)
sparetime = TotalFrameTime;
sleeptime = m_sleeptimeMS * perframe;
} }
m_rootAgents = m_scene.SceneGraph.GetRootAgentCount(); m_rootAgents = m_scene.SceneGraph.GetRootAgentCount();
@ -327,19 +343,11 @@ namespace OpenSim.Region.Framework.Scenes
// m_otherMS = m_frameMS - m_physicsMS - m_imageMS - m_netMS - m_agentMS; // m_otherMS = m_frameMS - m_physicsMS - m_imageMS - m_netMS - m_agentMS;
// m_imageMS m_netMS are not included in m_frameMS // m_imageMS m_netMS are not included in m_frameMS
m_otherMS = m_frameMS - m_physicsMS - m_agentMS; m_otherMS = m_frameMS - m_physicsMS - m_agentMS - m_sleeptimeMS;
if (m_otherMS < 0) if (m_otherMS < 0)
m_otherMS = 0; m_otherMS = 0;
uint thisFrame = m_scene.Frame; for (int i = 0; i < 23; i++)
float framesUpdated = (float)(thisFrame - m_lastUpdateFrame) * m_reportedFpsCorrectionFactor;
m_lastUpdateFrame = thisFrame;
// Avoid div-by-zero if somehow we've not updated any frames.
if (framesUpdated == 0)
framesUpdated = 1;
for (int i = 0; i < 22; i++)
{ {
sb[i] = new SimStatsPacket.StatBlock(); sb[i] = new SimStatsPacket.StatBlock();
} }
@ -369,19 +377,19 @@ namespace OpenSim.Region.Framework.Scenes
sb[7].StatValue = m_activePrim; sb[7].StatValue = m_activePrim;
sb[8].StatID = (uint)Stats.FrameMS; sb[8].StatID = (uint)Stats.FrameMS;
sb[8].StatValue = m_frameMS / framesUpdated; sb[8].StatValue = TotalFrameTime;
sb[9].StatID = (uint)Stats.NetMS; sb[9].StatID = (uint)Stats.NetMS;
sb[9].StatValue = m_netMS / framesUpdated; sb[9].StatValue = m_netMS * perframe;
sb[10].StatID = (uint)Stats.PhysicsMS; sb[10].StatID = (uint)Stats.PhysicsMS;
sb[10].StatValue = m_physicsMS / framesUpdated; sb[10].StatValue = m_physicsMS * perframe;
sb[11].StatID = (uint)Stats.ImageMS ; sb[11].StatID = (uint)Stats.ImageMS ;
sb[11].StatValue = m_imageMS / framesUpdated; sb[11].StatValue = m_imageMS * perframe;
sb[12].StatID = (uint)Stats.OtherMS; sb[12].StatID = (uint)Stats.OtherMS;
sb[12].StatValue = m_otherMS / framesUpdated; sb[12].StatValue = m_otherMS * perframe;
sb[13].StatID = (uint)Stats.InPacketsPerSecond; sb[13].StatID = (uint)Stats.InPacketsPerSecond;
sb[13].StatValue = (m_inPacketsPerSecond / m_statsUpdateFactor); sb[13].StatValue = (m_inPacketsPerSecond / m_statsUpdateFactor);
@ -393,7 +401,7 @@ namespace OpenSim.Region.Framework.Scenes
sb[15].StatValue = m_unAckedBytes; sb[15].StatValue = m_unAckedBytes;
sb[16].StatID = (uint)Stats.AgentMS; sb[16].StatID = (uint)Stats.AgentMS;
sb[16].StatValue = m_agentMS / framesUpdated; sb[16].StatValue = m_agentMS * perframe;
sb[17].StatID = (uint)Stats.PendingDownloads; sb[17].StatID = (uint)Stats.PendingDownloads;
sb[17].StatValue = m_pendingDownloads; sb[17].StatValue = m_pendingDownloads;
@ -408,7 +416,10 @@ namespace OpenSim.Region.Framework.Scenes
sb[20].StatValue = m_scriptLinesPerSecond / m_statsUpdateFactor; sb[20].StatValue = m_scriptLinesPerSecond / m_statsUpdateFactor;
sb[21].StatID = (uint)Stats.SimSpareMs; sb[21].StatID = (uint)Stats.SimSpareMs;
sb[21].StatValue = m_spareMS / framesUpdated; sb[21].StatValue = sparetime;
sb[22].StatID = (uint)Stats.SimSleepMs;
sb[22].StatValue = sleeptime;
for (int i = 0; i < 22; i++) for (int i = 0; i < 22; i++)
{ {
@ -441,13 +452,14 @@ namespace OpenSim.Region.Framework.Scenes
// Need to change things so that stats source can indicate whether they are per second or // Need to change things so that stats source can indicate whether they are per second or
// per frame. // per frame.
if (tuple.Key.EndsWith("MS")) if (tuple.Key.EndsWith("MS"))
m_lastReportedExtraSimStats[tuple.Key] = tuple.Value / framesUpdated; m_lastReportedExtraSimStats[tuple.Key] = tuple.Value * perframe;
else else
m_lastReportedExtraSimStats[tuple.Key] = tuple.Value / m_statsUpdateFactor; m_lastReportedExtraSimStats[tuple.Key] = tuple.Value / m_statsUpdateFactor;
} }
} }
} }
// LastReportedObjectUpdates = m_objectUpdates / m_statsUpdateFactor;
ResetValues(); ResetValues();
} }
} }
@ -470,7 +482,8 @@ namespace OpenSim.Region.Framework.Scenes
m_physicsMS = 0; m_physicsMS = 0;
m_imageMS = 0; m_imageMS = 0;
m_otherMS = 0; m_otherMS = 0;
m_spareMS = 0; // m_spareMS = 0;
m_sleeptimeMS = 0;
//Ckrinke This variable is not used, so comment to remove compiler warning until it is used. //Ckrinke This variable is not used, so comment to remove compiler warning until it is used.
//Ckrinke m_scriptMS = 0; //Ckrinke m_scriptMS = 0;
@ -549,11 +562,6 @@ namespace OpenSim.Region.Framework.Scenes
m_frameMS += ms; m_frameMS += ms;
} }
public void AddSpareMS(int ms)
{
m_spareMS += ms;
}
public void addNetMS(int ms) public void addNetMS(int ms)
{ {
m_netMS += ms; m_netMS += ms;
@ -579,6 +587,11 @@ namespace OpenSim.Region.Framework.Scenes
m_otherMS += ms; m_otherMS += ms;
} }
public void addSleepMS(int ms)
{
m_sleeptimeMS += ms;
}
public void AddPendingDownloads(int count) public void AddPendingDownloads(int count)
{ {
m_pendingDownloads += count; m_pendingDownloads += count;

View File

@ -43,7 +43,8 @@ namespace OpenSim.Region.Physics.Manager
Unknown = 0, Unknown = 0,
Agent = 1, Agent = 1,
Prim = 2, Prim = 2,
Ground = 3 Ground = 3,
Water = 4
} }
public enum PIDHoverType 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 /// 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. /// water. This is not a problem due to the formatting of names given by prims and avatars.
/// </remarks> /// </remarks>
public string Name { get; protected set; } public string Name { get; set; }
/// <summary> /// <summary>
/// This is being used by ODE joint code. /// 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) public virtual void RaiseOutOfBounds(Vector3 pos)
{ {
// Make a temporary copy of the event to avoid possibility of // Make a temporary copy of the event to avoid possibility of
@ -258,10 +254,7 @@ namespace OpenSim.Region.Physics.Manager
handler(e); handler(e);
} }
public virtual void SetMaterial (int material) public virtual void SetMaterial (int material) { }
{
}
public virtual float Density { get; set; } public virtual float Density { get; set; }
public virtual float GravModifier { get; set; } public virtual float GravModifier { get; set; }
public virtual float Friction { 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 SubscribeEvents(int ms);
public abstract void UnSubscribeEvents(); public abstract void UnSubscribeEvents();
public abstract bool SubscribedEvents(); 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 public class NullPhysicsActor : PhysicsActor
{ {
private ActorTypes m_actorType = ActorTypes.Unknown;
public override bool Stopped public override bool Stopped
{ {
get{ return false; } get{ return true; }
} }
public override Vector3 Position public override Vector3 Position
@ -396,6 +397,7 @@ namespace OpenSim.Region.Physics.Manager
public override uint LocalID public override uint LocalID
{ {
get { return 0; }
set { return; } set { return; }
} }
@ -455,49 +457,17 @@ namespace OpenSim.Region.Physics.Manager
set { return; } 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 PrimitiveBaseShape Shape { set { return; }}
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 Vector3 Velocity public override Vector3 Velocity
{ {
@ -517,9 +487,7 @@ namespace OpenSim.Region.Physics.Manager
set { } set { }
} }
public override void CrossingFailure() public override void CrossingFailure() {}
{
}
public override Quaternion Orientation public override Quaternion Orientation
{ {
@ -559,8 +527,20 @@ namespace OpenSim.Region.Physics.Manager
public override int PhysicsActorType public override int PhysicsActorType
{ {
get { return (int) ActorTypes.Unknown; } get { return (int)m_actorType; }
set { return; } 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 public override bool Kinematic
@ -569,26 +549,11 @@ namespace OpenSim.Region.Physics.Manager
set { return; } set { return; }
} }
public override void link(PhysicsActor obj) 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 delink() public override void AddAngularForce(Vector3 force, bool pushforce) { }
{
}
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 public override Vector3 RotationalVelocity
{ {
@ -610,22 +575,10 @@ namespace OpenSim.Region.Physics.Manager
public override float APIDStrength { set { return; } } public override float APIDStrength { set { return; } }
public override float APIDDamping { set { return; } } public override float APIDDamping { set { return; } }
public override void SetMomentum(Vector3 momentum) 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 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 bool m_freemove = false;
// private CollisionLocker ode; // private CollisionLocker ode;
private string m_name = String.Empty; // private string m_name = String.Empty;
// other filter control // other filter control
int m_colliderfilter = 0; int m_colliderfilter = 0;
int m_colliderGroundfilter = 0; int m_colliderGroundfilter = 0;
@ -183,7 +183,7 @@ namespace OpenSim.Region.Physics.OdePlugin
m_isPhysical = false; // current status: no ODE information exists m_isPhysical = false; // current status: no ODE information exists
m_name = avName; Name = avName;
AddChange(changes.Add, null); AddChange(changes.Add, null);
} }
@ -218,6 +218,11 @@ namespace OpenSim.Region.Physics.OdePlugin
set { m_localID = value; } set { m_localID = value; }
} }
public override PhysicsActor ParentActor
{
get { return (PhysicsActor)this; }
}
public override bool Grabbed public override bool Grabbed
{ {
set { return; } set { return; }
@ -740,7 +745,7 @@ namespace OpenSim.Region.Physics.OdePlugin
//kill the Geometry //kill the Geometry
if (Shell != IntPtr.Zero) 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.actor_name_map.Remove(Shell);
_parent_scene.waitForSpaceUnlock(_parent_scene.ActiveSpace); _parent_scene.waitForSpaceUnlock(_parent_scene.ActiveSpace);
d.GeomDestroy(Shell); d.GeomDestroy(Shell);
@ -1115,7 +1120,7 @@ namespace OpenSim.Region.Physics.OdePlugin
m_eventsubscription = 0; m_eventsubscription = 0;
} }
public void AddCollisionEvent(uint CollidedWith, ContactPoint contact) public override void AddCollisionEvent(uint CollidedWith, ContactPoint contact)
{ {
if (CollisionEventsThisFrame == null) if (CollisionEventsThisFrame == null)
CollisionEventsThisFrame = new CollisionEventUpdate(); CollisionEventsThisFrame = new CollisionEventUpdate();
@ -1184,7 +1189,7 @@ namespace OpenSim.Region.Physics.OdePlugin
} }
AvatarGeomAndBodyCreation(_position.X, _position.Y, _position.Z); 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.actor_name_map[Shell] = (PhysicsActor)this;
_parent_scene.AddCharacter(this); _parent_scene.AddCharacter(this);
} }
@ -1236,7 +1241,6 @@ namespace OpenSim.Region.Physics.OdePlugin
Velocity = Vector3.Zero; Velocity = Vector3.Zero;
_parent_scene.geom_name_map[Shell] = m_name;
_parent_scene.actor_name_map[Shell] = (PhysicsActor)this; _parent_scene.actor_name_map[Shell] = (PhysicsActor)this;
} }
else else

View File

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

View File

@ -470,56 +470,77 @@ namespace OpenSim.Region.Physics.OdePlugin
if (p2 == null) if (p2 == null)
{ {
string name; /*
string name;
if (!m_scene.geom_name_map.TryGetValue(g2, out name)) if (!m_scene.geom_name_map.TryGetValue(g2, out name))
return; return;
if (name == "Terrain") if (name == "Terrain")
{ {
// land colision // land colision
if ((CurrentRayFilter & RayFilterFlags.land) == 0) if ((CurrentRayFilter & RayFilterFlags.land) == 0)
return; return;
} }
else if (name == "Water") else if (name == "Water")
{ {
if ((CurrentRayFilter & RayFilterFlags.water) == 0) if ((CurrentRayFilter & RayFilterFlags.water) == 0)
return; return;
} }
else else
return; return;
*/
return;
} }
else else
{ {
if (p2 is OdePrim) switch (p2.PhysicsActorType)
{ {
RayFilterFlags thisFlags; case (int)ActorTypes.Prim:
if (p2.IsPhysical) RayFilterFlags thisFlags;
thisFlags = RayFilterFlags.physical;
else
thisFlags = RayFilterFlags.nonphysical;
if (p2.Phantom) if (p2.IsPhysical)
thisFlags |= RayFilterFlags.phantom; thisFlags = RayFilterFlags.physical;
else
thisFlags = RayFilterFlags.nonphysical;
if (p2.IsVolumeDtc) if (p2.Phantom)
thisFlags |= RayFilterFlags.volumedtc; thisFlags |= RayFilterFlags.phantom;
if ((thisFlags & CurrentRayFilter) == 0) if (p2.IsVolumeDtc)
thisFlags |= RayFilterFlags.volumedtc;
if ((thisFlags & CurrentRayFilter) == 0)
return;
ID = ((OdePrim)p2).LocalID;
break;
case (int)ActorTypes.Agent:
if ((CurrentRayFilter & RayFilterFlags.agent) == 0)
return;
else
ID = ((OdeCharacter)p2).LocalID;
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; return;
break;
ID = ((OdePrim)p2).LocalID;
} }
else if (p2 is OdeCharacter)
{
if ((CurrentRayFilter & RayFilterFlags.agent) == 0)
return;
else
ID = ((OdeCharacter)p2).LocalID;
}
else //??
return;
} }
d.ContactGeom curcontact = new d.ContactGeom(); d.ContactGeom curcontact = new d.ContactGeom();

View File

@ -903,7 +903,7 @@ namespace OdeAPI
public static extern GeomClassID GeomGetClass(IntPtr geom); public static extern GeomClassID GeomGetClass(IntPtr geom);
[DllImport("ode", CallingConvention = CallingConvention.Cdecl, EntryPoint = "dGeomGetData"), SuppressUnmanagedCodeSecurity] [DllImport("ode", CallingConvention = CallingConvention.Cdecl, EntryPoint = "dGeomGetData"), SuppressUnmanagedCodeSecurity]
public static extern IntPtr GeomGetData(IntPtr geom); public static extern IntPtr GeomGetData(IntPtr geom);
[DllImport("ode", CallingConvention = CallingConvention.Cdecl, EntryPoint = "dGeomGetOffsetPosition"), SuppressUnmanagedCodeSecurity] [DllImport("ode", CallingConvention = CallingConvention.Cdecl, EntryPoint = "dGeomGetOffsetPosition"), SuppressUnmanagedCodeSecurity]
public extern unsafe static Vector3* GeomGetOffsetPositionUnsafe(IntPtr geom); public extern unsafe static Vector3* GeomGetOffsetPositionUnsafe(IntPtr geom);
@ -1096,8 +1096,8 @@ namespace OdeAPI
[DllImport("ode", CallingConvention = CallingConvention.Cdecl, EntryPoint = "dGeomSetConvex"), SuppressUnmanagedCodeSecurity] [DllImport("ode", CallingConvention = CallingConvention.Cdecl, EntryPoint = "dGeomSetConvex"), SuppressUnmanagedCodeSecurity]
public static extern IntPtr GeomSetConvex(IntPtr geom, dReal[] planes, int planeCount, dReal[] points, int pointCount, int[] polygons); public static extern IntPtr GeomSetConvex(IntPtr geom, dReal[] planes, int planeCount, dReal[] points, int pointCount, int[] polygons);
[DllImport("ode", CallingConvention = CallingConvention.Cdecl, EntryPoint = "dGeomSetData"), SuppressUnmanagedCodeSecurity] [DllImport("ode", CallingConvention = CallingConvention.Cdecl, EntryPoint = "dGeomSetData"), SuppressUnmanagedCodeSecurity]
public static extern void GeomSetData(IntPtr geom, IntPtr data); public static extern void GeomSetData(IntPtr geom, IntPtr data);
[DllImport("ode", CallingConvention = CallingConvention.Cdecl, EntryPoint = "dGeomSetOffsetPosition"), SuppressUnmanagedCodeSecurity] [DllImport("ode", CallingConvention = CallingConvention.Cdecl, EntryPoint = "dGeomSetOffsetPosition"), SuppressUnmanagedCodeSecurity]
public static extern void GeomSetOffsetPosition(IntPtr geom, dReal x, dReal y, dReal z); public static extern void GeomSetOffsetPosition(IntPtr geom, dReal x, dReal y, dReal z);

View File

@ -203,9 +203,9 @@ namespace OpenSim.Region.Physics.OdePlugin
private float waterlevel = 0f; private float waterlevel = 0f;
private int framecount = 0; private int framecount = 0;
private IntPtr WaterGeom = IntPtr.Zero; // private IntPtr WaterGeom = IntPtr.Zero;
private IntPtr WaterHeightmapData = IntPtr.Zero; // private IntPtr WaterHeightmapData = IntPtr.Zero;
private GCHandle WaterMapHandler = new GCHandle(); // private GCHandle WaterMapHandler = new GCHandle();
public float avPIDD = 2200f; // make it visible public float avPIDD = 2200f; // make it visible
public float avPIDP = 900f; // make it visible public float avPIDP = 900f; // make it visible
@ -251,7 +251,7 @@ namespace OpenSim.Region.Physics.OdePlugin
private List<PhysicsActor> _collisionEventPrimRemove = new List<PhysicsActor>(); private List<PhysicsActor> _collisionEventPrimRemove = new List<PhysicsActor>();
private HashSet<OdeCharacter> _badCharacter = new HashSet<OdeCharacter>(); 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>(); public Dictionary<IntPtr, PhysicsActor> actor_name_map = new Dictionary<IntPtr, PhysicsActor>();
private float contactsurfacelayer = 0.002f; private float contactsurfacelayer = 0.002f;
@ -274,7 +274,7 @@ namespace OpenSim.Region.Physics.OdePlugin
private int m_physicsiterations = 10; private int m_physicsiterations = 10;
private const float m_SkipFramesAtms = 0.40f; // Drop frames gracefully at a 400 ms lag 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; private float step_time = 0.0f;
public IntPtr world; 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)) if (b1 != IntPtr.Zero && b2 != IntPtr.Zero && d.AreConnectedExcluding(b1, b2, d.JointType.Contact))
return; return;
if(d.GeomGetCategoryBits(g1) == (uint)CollisionCategories.VolumeDtc || if(d.GeomGetCategoryBits(g1) == (uint)CollisionCategories.VolumeDtc ||
d.GeomGetCategoryBits(g1) == (uint)CollisionCategories.VolumeDtc) d.GeomGetCategoryBits(g1) == (uint)CollisionCategories.VolumeDtc)
{ {
@ -738,7 +739,7 @@ namespace OpenSim.Region.Physics.OdePlugin
return; return;
} }
// id contacts done // contacts done
if (count == 0) if (count == 0)
return; return;
@ -748,12 +749,14 @@ namespace OpenSim.Region.Physics.OdePlugin
if (!actor_name_map.TryGetValue(g1, out p1)) 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)) 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 // update actors collision score
@ -765,7 +768,6 @@ namespace OpenSim.Region.Physics.OdePlugin
p2.CollisionScore = 0; p2.CollisionScore = 0;
p2.CollisionScore += count; p2.CollisionScore += count;
// get first contact // get first contact
d.ContactGeom curContact = new d.ContactGeom(); d.ContactGeom curContact = new d.ContactGeom();
if (!GetCurContactGeom(0, ref curContact)) if (!GetCurContactGeom(0, ref curContact))
@ -798,7 +800,6 @@ namespace OpenSim.Region.Physics.OdePlugin
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);
String name = null;
bool dop1foot = false; bool dop1foot = false;
bool dop2foot = false; bool dop2foot = false;
bool ignore = false; bool ignore = false;
@ -830,34 +831,16 @@ namespace OpenSim.Region.Physics.OdePlugin
switch (p2.PhysicsActorType) switch (p2.PhysicsActorType)
{ {
case (int)ActorTypes.Agent: 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; p1.CollidingObj = true;
p2.CollidingObj = true; p2.CollidingObj = true;
break; break;
case (int)ActorTypes.Prim: 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) if (p2.Velocity.LengthSquared() > 0.0f)
p2.CollidingObj = true; p2.CollidingObj = true;
dop1foot = true; dop1foot = true;
break; break;
default: default:
ignore = true; // avatar to terrain and water ignored ignore = true; // avatar to terrain and water ignored
break; break;
@ -869,9 +852,6 @@ namespace OpenSim.Region.Physics.OdePlugin
switch (p2.PhysicsActorType) switch (p2.PhysicsActorType)
{ {
case (int)ActorTypes.Agent: case (int)ActorTypes.Agent:
// p1.getContactData(ref contactdata1);
// p2.getContactData(ref contactdata2);
AvanormOverride = true; AvanormOverride = true;
Vector3 tmp = p2.Position - p1.Position; Vector3 tmp = p2.Position - p1.Position;
@ -894,16 +874,12 @@ namespace OpenSim.Region.Physics.OdePlugin
bounce = 0; bounce = 0;
mu = 0; mu = 0;
cfm = 0.0001f; 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; dop2foot = true;
if (p1.Velocity.LengthSquared() > 0.0f) if (p1.Velocity.LengthSquared() > 0.0f)
p1.CollidingObj = true; p1.CollidingObj = true;
break; break;
case (int)ActorTypes.Prim: case (int)ActorTypes.Prim:
if ((p1.Velocity - p2.Velocity).LengthSquared() > 0.0f) if ((p1.Velocity - p2.Velocity).LengthSquared() > 0.0f)
{ {
@ -933,95 +909,77 @@ namespace OpenSim.Region.Physics.OdePlugin
mu *= frictionMovementMult; mu *= frictionMovementMult;
break; break;
default:
if (geom_name_map.TryGetValue(g2, out name)) case (int)ActorTypes.Ground:
p1.getContactData(ref contactdata1);
bounce = contactdata1.bounce * TerrainBounce;
mu = (float)Math.Sqrt(contactdata1.mu * TerrainFriction);
if (Math.Abs(p1.Velocity.X) > 0.1f || Math.Abs(p1.Velocity.Y) > 0.1f)
mu *= frictionMovementMult;
p1.CollidingGround = true;
cfm = p1.Mass;
dscale = 10 / cfm;
dscale = (float)Math.Sqrt(dscale);
if (dscale > 1.0f)
dscale = 1.0f;
erpscale = cfm * 0.01f;
cfm = 0.0001f / cfm;
if (cfm > 0.01f)
cfm = 0.01f;
else if (cfm < 0.00001f)
cfm = 0.00001f;
if (d.GeomGetClass(g1) == d.GeomClassID.TriMeshClass)
{ {
if (name == "Terrain") if (curContact.side1 > 0)
{ IgnoreNegSides = true;
p1.getContactData(ref contactdata1);
bounce = contactdata1.bounce * TerrainBounce;
mu = (float)Math.Sqrt(contactdata1.mu * TerrainFriction);
if (Math.Abs(p1.Velocity.X) > 0.1f || Math.Abs(p1.Velocity.Y) > 0.1f)
mu *= frictionMovementMult;
p1.CollidingGround = true;
cfm = p1.Mass;
dscale = 10 / cfm;
dscale = (float)Math.Sqrt(dscale);
if (dscale > 1.0f)
dscale = 1.0f;
erpscale = cfm * 0.01f;
cfm = 0.0001f / cfm;
if (cfm > 0.01f)
cfm = 0.01f;
else if (cfm < 0.00001f)
cfm = 0.00001f;
if (d.GeomGetClass(g1) == d.GeomClassID.TriMeshClass)
{
if (curContact.side1 > 0)
IgnoreNegSides = true;
}
}
else if (name == "Water")
{
ignore = true;
}
} }
else break;
ignore = true;
case (int)ActorTypes.Water:
default:
ignore = true;
break; break;
} }
break; break;
default: case (int)ActorTypes.Ground:
if (geom_name_map.TryGetValue(g1, out name)) if (p2.PhysicsActorType == (int)ActorTypes.Prim)
{ {
if (name == "Terrain") p2.CollidingGround = true;
{ p2.getContactData(ref contactdata2);
if (p2.PhysicsActorType == (int)ActorTypes.Prim) bounce = contactdata2.bounce * TerrainBounce;
{ mu = (float)Math.Sqrt(contactdata2.mu * TerrainFriction);
p2.CollidingGround = true;
p2.getContactData(ref contactdata2);
bounce = contactdata2.bounce * TerrainBounce;
mu = (float)Math.Sqrt(contactdata2.mu * TerrainFriction);
cfm = p2.Mass; cfm = p2.Mass;
dscale = 10 / cfm; dscale = 10 / cfm;
dscale = (float)Math.Sqrt(dscale); dscale = (float)Math.Sqrt(dscale);
if (dscale > 1.0f) if (dscale > 1.0f)
dscale = 1.0f; dscale = 1.0f;
erpscale = cfm * 0.01f; erpscale = cfm * 0.01f;
cfm = 0.0001f / cfm; cfm = 0.0001f / cfm;
if (cfm > 0.01f) if (cfm > 0.01f)
cfm = 0.01f; cfm = 0.01f;
else if (cfm < 0.00001f) else if (cfm < 0.00001f)
cfm = 0.00001f; cfm = 0.00001f;
if (curContact.side1 > 0) // should be 2 ? if (curContact.side1 > 0) // should be 2 ?
IgnoreNegSides = true; IgnoreNegSides = true;
if (Math.Abs(p2.Velocity.X) > 0.1f || Math.Abs(p2.Velocity.Y) > 0.1f) if (Math.Abs(p2.Velocity.X) > 0.1f || Math.Abs(p2.Velocity.Y) > 0.1f)
mu *= frictionMovementMult; mu *= frictionMovementMult;
}
else
ignore = true;
}
else if (name == "Water" &&
(p2.PhysicsActorType == (int)ActorTypes.Prim || p2.PhysicsActorType == (int)ActorTypes.Agent))
{
ignore = true;
}
} }
else else
ignore = true; ignore = true;
break; break;
}
case (int)ActorTypes.Water:
default:
break;
}
if (ignore) if (ignore)
return; return;
@ -1165,16 +1123,9 @@ namespace OpenSim.Region.Physics.OdePlugin
} }
private void collision_accounting_events(PhysicsActor p1, PhysicsActor p2, ContactPoint contact) 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; uint obj2LocalID = 0;
bool p1events = p1.SubscribedEvents(); bool p1events = p1.SubscribedEvents();
bool p2events = p2.SubscribedEvents(); bool p2events = p2.SubscribedEvents();
@ -1183,15 +1134,9 @@ namespace OpenSim.Region.Physics.OdePlugin
if (p2.IsVolumeDtc) if (p2.IsVolumeDtc)
p1events = false; p1events = false;
if (!(p2events || p1events)) if (!p2events && !p1events)
return; return;
if (p1events)
AddCollisionEventReporting(p1);
if (p2events)
AddCollisionEventReporting(p2);
Vector3 vel = Vector3.Zero; Vector3 vel = Vector3.Zero;
if (p2 != null && p2.IsPhysical) if (p2 != null && p2.IsPhysical)
vel = p2.Velocity; vel = p2.Velocity;
@ -1202,69 +1147,20 @@ namespace OpenSim.Region.Physics.OdePlugin
contact.RelativeSpeed = Vector3.Dot(vel, contact.SurfaceNormal); contact.RelativeSpeed = Vector3.Dot(vel, contact.SurfaceNormal);
switch ((ActorTypes)p1.PhysicsActorType) switch ((ActorTypes)p1.PhysicsActorType)
{ {
case ActorTypes.Agent: case ActorTypes.Agent:
cc1 = (OdeCharacter)p1;
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;
}
break;
case ActorTypes.Ground:
case ActorTypes.Unknown:
default:
obj2LocalID = 0;
break;
}
if (p1events)
{
contact.SurfaceNormal = -contact.SurfaceNormal;
cc1.AddCollisionEvent(obj2LocalID, contact);
}
break;
case ActorTypes.Prim: case ActorTypes.Prim:
{
if (p1 is OdePrim)
{
cp1 = (OdePrim)p1;
cp1Parent = cp1.Parent;
switch ((ActorTypes)p2.PhysicsActorType) switch ((ActorTypes)p2.PhysicsActorType)
{ {
case ActorTypes.Agent: case ActorTypes.Agent:
if (p2 is OdeCharacter)
{
cc2 = (OdeCharacter)p2;
obj2LocalID = cc2.LocalID;
if (p2events)
cc2.AddCollisionEvent(cp1Parent.LocalID, contact);
}
break;
case ActorTypes.Prim: case ActorTypes.Prim:
if (p2events)
if (p2 is OdePrim) {
{ AddCollisionEventReporting(p2);
cp2 = (OdePrim)p2; p2.AddCollisionEvent(p1.ParentActor.LocalID, contact);
if (p2events) }
cp2.AddCollisionEvent(cp1Parent.LocalID, contact); obj2LocalID = p2.ParentActor.LocalID;
cp2 = cp2.Parent;
obj2LocalID = cp2.LocalID;
}
break; break;
case ActorTypes.Ground: case ActorTypes.Ground:
@ -1272,41 +1168,28 @@ namespace OpenSim.Region.Physics.OdePlugin
default: default:
obj2LocalID = 0; obj2LocalID = 0;
break; break;
}
if (p1events)
{
contact.SurfaceNormal = -contact.SurfaceNormal;
cp1.AddCollisionEvent(obj2LocalID, contact);
}
} }
break; if (p1events)
{
contact.SurfaceNormal = -contact.SurfaceNormal;
AddCollisionEventReporting(p1);
p1.AddCollisionEvent(obj2LocalID, contact);
}
break;
}
case ActorTypes.Ground: case ActorTypes.Ground:
case ActorTypes.Unknown: case ActorTypes.Unknown:
default: default:
switch ((ActorTypes)p2.PhysicsActorType) {
if (p2events && !p2.IsVolumeDtc)
{ {
case ActorTypes.Agent: AddCollisionEventReporting(p2);
if (p2 is OdeCharacter) p2.AddCollisionEvent(0, contact);
{
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);
}
break;
} }
break; break;
} }
} }
}
/// <summary> /// <summary>
/// This is our collision testing routine in ODE /// This is our collision testing routine in ODE
@ -2369,6 +2252,7 @@ namespace OpenSim.Region.Physics.OdePlugin
RegionTerrain.Remove(pOffset); RegionTerrain.Remove(pOffset);
if (GroundGeom != IntPtr.Zero) if (GroundGeom != IntPtr.Zero)
{ {
actor_name_map.Remove(GroundGeom);
d.GeomDestroy(GroundGeom); d.GeomDestroy(GroundGeom);
if (TerrainHeightFieldHeights.ContainsKey(GroundGeom)) if (TerrainHeightFieldHeights.ContainsKey(GroundGeom))
@ -2394,27 +2278,32 @@ namespace OpenSim.Region.Physics.OdePlugin
d.GeomSetCategoryBits(GroundGeom, (uint)(CollisionCategories.Land)); d.GeomSetCategoryBits(GroundGeom, (uint)(CollisionCategories.Land));
d.GeomSetCollideBits(GroundGeom, 0); d.GeomSetCollideBits(GroundGeom, 0);
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();
Quaternion q1 = Quaternion.CreateFromAxisAngle(new Vector3(1, 0, 0), 1.5707f);
Quaternion q2 = Quaternion.CreateFromAxisAngle(new Vector3(0, 1, 0), 1.5707f);
q1 = q1 * q2;
Vector3 v3;
float angle;
q1.GetAxisAngle(out v3, out angle);
d.RFromAxisAndAngle(out R, v3.X, v3.Y, v3.Z, angle);
d.GeomSetRotation(GroundGeom, ref R);
d.GeomSetPosition(GroundGeom, pOffset.X + (float)Constants.RegionSize * 0.5f, pOffset.Y + (float)Constants.RegionSize * 0.5f, 0);
RegionTerrain.Add(pOffset, GroundGeom);
TerrainHeightFieldHeights.Add(GroundGeom, _heightmap);
TerrainHeightFieldHeightsHandlers.Add(GroundGeom, _heightmaphandler);
} }
geom_name_map[GroundGeom] = "Terrain";
d.Matrix3 R = new d.Matrix3();
Quaternion q1 = Quaternion.CreateFromAxisAngle(new Vector3(1, 0, 0), 1.5707f);
Quaternion q2 = Quaternion.CreateFromAxisAngle(new Vector3(0, 1, 0), 1.5707f);
q1 = q1 * q2;
Vector3 v3;
float angle;
q1.GetAxisAngle(out v3, out angle);
d.RFromAxisAndAngle(out R, v3.X, v3.Y, v3.Z, angle);
d.GeomSetRotation(GroundGeom, ref R);
d.GeomSetPosition(GroundGeom, pOffset.X + (float)Constants.RegionSize * 0.5f, pOffset.Y + (float)Constants.RegionSize * 0.5f, 0);
RegionTerrain.Add(pOffset, GroundGeom);
TerrainHeightFieldHeights.Add(GroundGeom, _heightmap);
TerrainHeightFieldHeightsHandlers.Add(GroundGeom, _heightmaphandler);
} }
} }
@ -2478,6 +2367,7 @@ namespace OpenSim.Region.Physics.OdePlugin
RegionTerrain.Remove(pOffset); RegionTerrain.Remove(pOffset);
if (GroundGeom != IntPtr.Zero) if (GroundGeom != IntPtr.Zero)
{ {
actor_name_map.Remove(GroundGeom);
d.GeomDestroy(GroundGeom); d.GeomDestroy(GroundGeom);
if (TerrainHeightFieldHeights.ContainsKey(GroundGeom)) if (TerrainHeightFieldHeights.ContainsKey(GroundGeom))
@ -2509,13 +2399,18 @@ namespace OpenSim.Region.Physics.OdePlugin
d.GeomSetCategoryBits(GroundGeom, (uint)(CollisionCategories.Land)); d.GeomSetCategoryBits(GroundGeom, (uint)(CollisionCategories.Land));
d.GeomSetCollideBits(GroundGeom, 0); d.GeomSetCollideBits(GroundGeom, 0);
} PhysicsActor pa = new NullPhysicsActor();
geom_name_map[GroundGeom] = "Terrain"; pa.Name = "Terrain";
pa.PhysicsActorType = (int)ActorTypes.Ground;
actor_name_map[GroundGeom] = pa;
d.GeomSetPosition(GroundGeom, pOffset.X + (float)Constants.RegionSize * 0.5f, pOffset.Y + (float)Constants.RegionSize * 0.5f, 0); // geom_name_map[GroundGeom] = "Terrain";
RegionTerrain.Add(pOffset, GroundGeom);
TerrainHeightFieldHeights.Add(GroundGeom, _heightmap); d.GeomSetPosition(GroundGeom, pOffset.X + (float)Constants.RegionSize * 0.5f, pOffset.Y + (float)Constants.RegionSize * 0.5f, 0);
TerrainHeightFieldHeightsHandlers.Add(GroundGeom, _heightmaphandler); RegionTerrain.Add(pOffset, GroundGeom);
TerrainHeightFieldHeights.Add(GroundGeom, _heightmap);
TerrainHeightFieldHeightsHandlers.Add(GroundGeom, _heightmaphandler);
}
} }
} }
@ -2596,9 +2491,9 @@ namespace OpenSim.Region.Physics.OdePlugin
public override void SetWaterLevel(float baseheight) public override void SetWaterLevel(float baseheight)
{ {
waterlevel = baseheight; waterlevel = baseheight;
randomizeWater(waterlevel); // randomizeWater(waterlevel);
} }
/*
public void randomizeWater(float baseheight) public void randomizeWater(float baseheight)
{ {
const uint heightmapWidth = Constants.RegionSize + 2; const uint heightmapWidth = Constants.RegionSize + 2;
@ -2632,6 +2527,7 @@ namespace OpenSim.Region.Physics.OdePlugin
{ {
if (WaterGeom != IntPtr.Zero) if (WaterGeom != IntPtr.Zero)
{ {
actor_name_map.Remove(WaterGeom);
d.GeomDestroy(WaterGeom); d.GeomDestroy(WaterGeom);
d.GeomHeightfieldDataDestroy(WaterHeightmapData); d.GeomHeightfieldDataDestroy(WaterHeightmapData);
WaterGeom = IntPtr.Zero; WaterGeom = IntPtr.Zero;
@ -2654,7 +2550,13 @@ namespace OpenSim.Region.Physics.OdePlugin
d.GeomSetCategoryBits(WaterGeom, (uint)(CollisionCategories.Water)); d.GeomSetCategoryBits(WaterGeom, (uint)(CollisionCategories.Water));
d.GeomSetCollideBits(WaterGeom, 0); 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(); d.Matrix3 R = new d.Matrix3();
@ -2672,7 +2574,7 @@ namespace OpenSim.Region.Physics.OdePlugin
} }
} }
} }
*/
public override void Dispose() public override void Dispose()
{ {
lock (OdeLock) lock (OdeLock)
@ -2722,7 +2624,7 @@ namespace OpenSim.Region.Physics.OdePlugin
TerrainHeightFieldHeightsHandlers.Clear(); TerrainHeightFieldHeightsHandlers.Clear();
TerrainHeightFieldHeights.Clear(); TerrainHeightFieldHeights.Clear();
/*
if (WaterGeom != IntPtr.Zero) if (WaterGeom != IntPtr.Zero)
{ {
d.GeomDestroy(WaterGeom); d.GeomDestroy(WaterGeom);
@ -2734,7 +2636,7 @@ namespace OpenSim.Region.Physics.OdePlugin
if (WaterMapHandler.IsAllocated) if (WaterMapHandler.IsAllocated)
WaterMapHandler.Free(); WaterMapHandler.Free();
} }
*/
if (ContactgeomsArray != IntPtr.Zero) if (ContactgeomsArray != IntPtr.Zero)
Marshal.FreeHGlobal(ContactgeomsArray); Marshal.FreeHGlobal(ContactgeomsArray);
if (GlobalContactsArray != IntPtr.Zero) if (GlobalContactsArray != IntPtr.Zero)