Merge branch 'ubitwork' into avination
commit
0797736fba
|
@ -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));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
{
|
{
|
||||||
|
@ -1495,6 +1498,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
m_sceneGraph.UpdatePresences();
|
m_sceneGraph.UpdatePresences();
|
||||||
|
|
||||||
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(
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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
|
||||||
|
@ -114,7 +115,7 @@ namespace OpenSim.Region.Physics.Manager
|
||||||
m_objCollisionList.Add(localID, contact);
|
m_objCollisionList.Add(localID, contact);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (m_objCollisionList[localID].PenetrationDepth < contact.PenetrationDepth)
|
if (m_objCollisionList[localID].PenetrationDepth < contact.PenetrationDepth)
|
||||||
m_objCollisionList[localID] = contact;
|
m_objCollisionList[localID] = contact;
|
||||||
}
|
}
|
||||||
|
@ -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; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
{
|
{
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
@ -1162,36 +1120,23 @@ 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();
|
||||||
|
|
||||||
if (p1.IsVolumeDtc)
|
if (p1.IsVolumeDtc)
|
||||||
p2events = false;
|
p2events = false;
|
||||||
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;
|
||||||
|
@ -1200,71 +1145,22 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
vel -= p1.Velocity;
|
vel -= p1.Velocity;
|
||||||
|
|
||||||
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)
|
||||||
|
|
Loading…
Reference in New Issue