diff --git a/OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/PhysEngineToSceneConnector.cs b/OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/PhysEngineToSceneConnector.cs index 7e1d4d00dd..1ecf73a9d0 100644 --- a/OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/PhysEngineToSceneConnector.cs +++ b/OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/PhysEngineToSceneConnector.cs @@ -108,6 +108,9 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule //m_statsTimer.Elapsed += new System.Timers.ElapsedEventHandler(StatsTimerElapsed); m_sysConfig = sysConfig; + logEnabled = m_sysConfig.GetBoolean("LogEnabled", false); + logDir = m_sysConfig.GetString("LogDir", "."); + //assume we are connecting to the whole scene as one big quark m_subscribedQuarks = new QuarkSubsriptionInfo(0, 0, (int)Constants.RegionSize, (int)Constants.RegionSize); } @@ -255,7 +258,7 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule m_client.Client.Close(); m_client.Close(); } - + LogMessageClose(); } // Listen for messages from a RegionSyncServer @@ -298,12 +301,14 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule // Send a message to a single connected RegionSyncServer private void Send(string msg) { + LogMessage(logOutput, msg); byte[] bmsg = System.Text.Encoding.ASCII.GetBytes(msg + System.Environment.NewLine); Send(bmsg); } private void Send(RegionSyncMessage msg) { + LogMessage(logOutput, msg); Send(msg.ToBytes()); //m_log.WarnFormat("{0} Sent {1}", LogHeader, msg.ToString()); } @@ -342,6 +347,7 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule { //TO FINISH: + LogMessage(logInput, msg); switch (msg.Type) { case RegionSyncMessage.MsgType.RegionName: @@ -378,7 +384,11 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule PhysicsActor pa = FindPhysicsActor(localID); if (pa != null) { - pa.Size = data["size"].AsVector3(); + Vector3 sizeTemp = data["size"].AsVector3(); + if (sizeTemp.Z != 0) + { + // pa.Size = sizeTemp; + } pa.Position = data["position"].AsVector3(); pa.Force = data["force"].AsVector3(); pa.Velocity = data["velocity"].AsVector3(); @@ -509,7 +519,84 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule } #endregion Handlers for events/updates from Scene + #region Message Logging + private bool logInput = false; + private bool logOutput = true; + private bool logEnabled = true; + private class MsgLogger + { + public DateTime startTime; + public string path = null; + public System.IO.TextWriter Log = null; + } + private MsgLogger logWriter = null; + private TimeSpan logMaxFileTime = new TimeSpan(0, 5, 0); // (h,m,s) => 5 minutes + private string logDir = "/stats/stats"; + private object logLocker = new Object(); + + private void LogMessage(bool direction, RegionSyncMessage rsm) + { + if (!logEnabled) return; // save to work of the ToStringFull if not enabled + LogMessage(direction, rsm.ToStringFull()); + } + + private void LogMessage(bool direction, string msg) + { + if (!logEnabled) return; + + lock (logLocker) + { + try + { + DateTime now = DateTime.Now; + if (logWriter == null || (now > logWriter.startTime + logMaxFileTime)) + { + if (logWriter != null && logWriter.Log != null) + { + logWriter.Log.Close(); + logWriter.Log.Dispose(); + logWriter.Log = null; + } + + // First log file or time has expired, start writing to a new log file + logWriter = new MsgLogger(); + logWriter.startTime = now; + logWriter.path = (logDir.Length > 0 ? logDir + System.IO.Path.DirectorySeparatorChar.ToString() : "") + + String.Format("physics-{0}.log", now.ToString("yyyyMMddHHmmss")); + logWriter.Log = new StreamWriter(File.Open(logWriter.path, FileMode.Append, FileAccess.Write)); + } + if (logWriter != null && logWriter.Log != null) + { + StringBuilder buff = new StringBuilder(); + buff.Append(now.ToString("yyyyMMddHHmmss")); + buff.Append(" "); + buff.Append(direction ? "A->S:" : "S->A:"); + buff.Append(msg); + buff.Append("\r\n"); + logWriter.Log.Write(buff.ToString()); + } + } + catch (Exception e) + { + m_log.ErrorFormat("{0}: FAILURE WRITING TO LOGFILE: {1}", LogHeader, e); + logEnabled = false; + } + } + return; + } + + private void LogMessageClose() + { + if (logWriter != null && logWriter.Log != null) + { + logWriter.Log.Close(); + logWriter.Log.Dispose(); + logWriter.Log = null; + logWriter = null; + } + logEnabled = false; + } + #endregion Message Logging } - } diff --git a/OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/RegionSyncClient.cs b/OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/RegionSyncClient.cs index 20131363bf..854ea197c3 100644 --- a/OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/RegionSyncClient.cs +++ b/OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/RegionSyncClient.cs @@ -1023,7 +1023,7 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule public void HandleGrabObject(uint localID, Vector3 offsetPos, IClientAPI remoteClient, List surfaceArgs) { - m_log.DebugFormat("[REGION SYNC CLIENT] HandleGrabObject for {0}", remoteClient.AgentId.ToString()); + // m_log.DebugFormat("[REGION SYNC CLIENT] HandleGrabObject for {0}", remoteClient.AgentId.ToString()); OSDMap data = new OSDMap(4); data["agentID"] = OSD.FromUUID(remoteClient.AgentId); data["localID"] = OSD.FromUInteger(localID); @@ -1034,7 +1034,7 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule public void HandleGrabUpdate(UUID objectID, Vector3 offset, Vector3 pos, IClientAPI remoteClient, List surfaceArgs) { - m_log.DebugFormat("[REGION SYNC CLIENT] HandleGrabUpdate for {0}", remoteClient.AgentId.ToString()); + // m_log.DebugFormat("[REGION SYNC CLIENT] HandleGrabUpdate for {0}", remoteClient.AgentId.ToString()); OSDMap data = new OSDMap(5); data["agentID"] = OSD.FromUUID(remoteClient.AgentId); data["objectID"] = OSD.FromUUID(objectID); @@ -1046,7 +1046,7 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule public void HandleDeGrabObject(uint localID, IClientAPI remoteClient, List surfaceArgs) { - m_log.DebugFormat("[REGION SYNC CLIENT] HandleDeGrabObject for {0}", remoteClient.AgentId.ToString()); + // m_log.DebugFormat("[REGION SYNC CLIENT] HandleDeGrabObject for {0}", remoteClient.AgentId.ToString()); OSDMap data = new OSDMap(3); data["agentID"] = OSD.FromUUID(remoteClient.AgentId); data["localID"] = OSD.FromUInteger(localID); diff --git a/OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/RegionSyncClientView.cs b/OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/RegionSyncClientView.cs index fb690e5ef3..b40d26b7c2 100644 --- a/OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/RegionSyncClientView.cs +++ b/OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/RegionSyncClientView.cs @@ -656,8 +656,8 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule } UUID agentID = data["agentID"].AsUUID(); UUID objectID = data["objectID"].AsUUID(); - m_log.DebugFormat("{0} GrabUpdate for {1}. ObjectID={2}", - LogHeader, agentID.ToString(), objectID.ToString()); + // m_log.DebugFormat("{0} GrabUpdate for {1}. ObjectID={2}", + // LogHeader, agentID.ToString(), objectID.ToString()); Vector3 offset = data["offset"].AsVector3(); Vector3 pos = data["pos"].AsVector3(); OSDArray surfaceArray = (OSDArray)data["surfaceArgs"]; diff --git a/OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/RegionSyncMessage.cs b/OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/RegionSyncMessage.cs index 0f1324172f..793fc367ab 100644 --- a/OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/RegionSyncMessage.cs +++ b/OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/RegionSyncMessage.cs @@ -1,4 +1,5 @@ using System; +using System.Text; using System.IO; using OpenMetaverse; using log4net; @@ -205,6 +206,10 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule { return String.Format("{0} ({1} bytes)", m_type.ToString(), m_data.Length.ToString()); } + public string ToStringFull() + { + return String.Format("{0}:{1})", m_type.ToString(), Encoding.ASCII.GetString(m_data)); + } #endregion public static void HandleSuccess(string header, RegionSyncMessage msg, string message) diff --git a/OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/SceneToPhysEngineConnector.cs b/OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/SceneToPhysEngineConnector.cs index 22b36462b5..b3c62986b5 100644 --- a/OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/SceneToPhysEngineConnector.cs +++ b/OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/SceneToPhysEngineConnector.cs @@ -156,6 +156,7 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule //m_scene.EventManager.OnRezScript += SEConnectorOnRezScript; //m_scene.EventManager.OnScriptReset += SEConnectorOnScriptReset; //m_scene.EventManager.OnUpdateScript += SEConnectorOnUpdateScript; + // Create a thread for the receive loop m_receive_loop = new Thread(new ThreadStart(delegate() { ReceiveLoop(); })); m_receive_loop.Name = Description; diff --git a/OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/SceneToPhysEngineSyncServer.cs b/OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/SceneToPhysEngineSyncServer.cs index 8d91c50f7e..7e18befae6 100644 --- a/OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/SceneToPhysEngineSyncServer.cs +++ b/OpenSim/Region/CoreModules/RegionSync/RegionSyncModule/SceneToPhysEngineSyncServer.cs @@ -273,10 +273,7 @@ namespace OpenSim.Region.CoreModules.RegionSync.RegionSyncModule public void SendUpdate(PhysicsActor pa) { // m_log.DebugFormat("{0}: SendUpdate for {1}", LogHeader, pa.LocalID); - if (pa.lastValues.Changed(pa)) - { - this.m_sceneToPhysEngineConnector.SendPhysUpdateAttributes(pa); - } + this.m_sceneToPhysEngineConnector.SendPhysUpdateAttributes(pa); } #endregion diff --git a/OpenSim/Region/Physics/Manager/PhysicsActor.cs b/OpenSim/Region/Physics/Manager/PhysicsActor.cs index f7c1bf0879..9f59844ea3 100644 --- a/OpenSim/Region/Physics/Manager/PhysicsActor.cs +++ b/OpenSim/Region/Physics/Manager/PhysicsActor.cs @@ -137,16 +137,23 @@ namespace OpenSim.Region.Physics.Manager bool ret = false; if (localID != pa.LocalID) { localID = pa.LocalID; ret = true; } if (size != pa.Size) { size = pa.Size; ret = true; } - if (position != pa.Position) { position = pa.Position; ret = true; } - if (force != pa.Force) { force = pa.Force; ret = true; } - if (velocity != pa.Velocity) { velocity = pa.Velocity; ret = true; } - if (torque != pa.Torque) { torque = pa.Torque; ret = true; } + if (!AlmostEqual(position, pa.Position)) { position = pa.Position; ret = true; } + if (!AlmostEqual(force, pa.Force)) { force = pa.Force; ret = true; } + if (!AlmostEqual(velocity, pa.Velocity)) { velocity = pa.Velocity; ret = true; } + if (!AlmostEqual(torque, pa.Torque)) { torque = pa.Torque; ret = true; } if (orientation != pa.Orientation) { orientation = pa.Orientation; ret = true; } if (isPhysical != pa.IsPhysical) { isPhysical = pa.IsPhysical; ret = true; } if (flying != pa.Flying) { flying = pa.Flying; ret = true; } if (buoyancy != pa.Buoyancy) { buoyancy = pa.Buoyancy; ret = true; } return ret; } + private bool AlmostEqual(Vector3 a, Vector3 b) + { + if (Math.Abs(a.X - b.X) > 0.001) return false; + if (Math.Abs(a.Y - b.Y) > 0.001) return false; + if (Math.Abs(a.Z - b.Z) > 0.001) return false; + return true; + } } public abstract class PhysicsActor diff --git a/OpenSim/Region/Physics/PEPlugin/PEPrim.cs b/OpenSim/Region/Physics/PEPlugin/PEPrim.cs index 0a3baa03b0..4c88485945 100755 --- a/OpenSim/Region/Physics/PEPlugin/PEPrim.cs +++ b/OpenSim/Region/Physics/PEPlugin/PEPrim.cs @@ -102,7 +102,7 @@ public sealed class PEPrim : PhysicsActor } public override uint LocalID { set { _localID = value; - m_log.Debug("[RPE] PEPrim set LocalID"); + // m_log.Debug("[RPE] PEPrim set LocalID"); Prop.Set(_localID, PropType.LocalID, _localID); } get { return _localID; }