diff --git a/OpenSim/Region/CoreModules/LightShare/LightShareModule.cs b/OpenSim/Region/CoreModules/LightShare/LightShareModule.cs index f49641f1a7..f524490523 100644 --- a/OpenSim/Region/CoreModules/LightShare/LightShareModule.cs +++ b/OpenSim/Region/CoreModules/LightShare/LightShareModule.cs @@ -153,6 +153,9 @@ namespace OpenSim.Region.CoreModules.World.LightShare public void SendProfileToClient(IClientAPI client, RegionLightShareData wl) { + if (client == null) + return; + if (m_enableWindlight) { if (m_scene.RegionInfo.WindlightSettings.valid) diff --git a/OpenSim/Region/CoreModules/Scripting/ScriptModuleComms/ScriptModuleCommsModule.cs b/OpenSim/Region/CoreModules/Scripting/ScriptModuleComms/ScriptModuleCommsModule.cs index 98396ff803..dc54c3f821 100644 --- a/OpenSim/Region/CoreModules/Scripting/ScriptModuleComms/ScriptModuleCommsModule.cs +++ b/OpenSim/Region/CoreModules/Scripting/ScriptModuleComms/ScriptModuleCommsModule.cs @@ -361,6 +361,22 @@ namespace OpenSim.Region.OptionalModules.Scripting.ScriptModuleComms return null; } + /// + /// Get all registered constants + /// + public Dictionary GetConstants() + { + Dictionary ret = new Dictionary(); + + lock (m_constants) + { + foreach (KeyValuePair kvp in m_constants) + ret[kvp.Key] = kvp.Value; + } + + return ret; + } + #endregion } diff --git a/OpenSim/Region/Framework/Interfaces/IScriptModuleComms.cs b/OpenSim/Region/Framework/Interfaces/IScriptModuleComms.cs index 93930ce43b..70ff9549e8 100644 --- a/OpenSim/Region/Framework/Interfaces/IScriptModuleComms.cs +++ b/OpenSim/Region/Framework/Interfaces/IScriptModuleComms.cs @@ -27,6 +27,7 @@ using System; using System.Reflection; +using System.Collections.Generic; using OpenMetaverse; namespace OpenSim.Region.Framework.Interfaces @@ -131,6 +132,7 @@ namespace OpenSim.Region.Framework.Interfaces /// Name of constant /// Value of constant or null if none found. object LookupModConstant(string cname); + Dictionary GetConstants(); // For use ONLY by the script API void RaiseEvent(UUID script, string id, string module, string command, string key); diff --git a/OpenSim/Region/Framework/Scenes/EventManager.cs b/OpenSim/Region/Framework/Scenes/EventManager.cs index e2414ebd21..8691b91d3f 100644 --- a/OpenSim/Region/Framework/Scenes/EventManager.cs +++ b/OpenSim/Region/Framework/Scenes/EventManager.cs @@ -2947,6 +2947,7 @@ namespace OpenSim.Region.Framework.Scenes { foreach (Action d in handler.GetInvocationList()) { + m_log.InfoFormat("[EVENT MANAGER]: TriggerSceneShuttingDown invoque {0}", d.Method.Name.ToString()); try { d(s); @@ -2959,6 +2960,7 @@ namespace OpenSim.Region.Framework.Scenes } } } + m_log.Info("[EVENT MANAGER]: TriggerSceneShuttingDown done"); } public void TriggerOnRegionStarted(Scene scene) diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index 4282b46c56..254333301e 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs @@ -1335,9 +1335,11 @@ namespace OpenSim.Region.Framework.Scenes // Stop all client threads. ForEachScenePresence(delegate(ScenePresence avatar) { avatar.ControllingClient.Close(); }); - m_log.Debug("[SCENE]: Persisting changed objects"); + m_log.Debug("[SCENE]: TriggerSceneShuttingDown"); EventManager.TriggerSceneShuttingDown(this); + m_log.Debug("[SCENE]: Persisting changed objects"); + EntityBase[] entities = GetEntities(); foreach (EntityBase entity in entities) { @@ -1347,6 +1349,7 @@ namespace OpenSim.Region.Framework.Scenes } } + m_log.Debug("[SCENE]: Graph close"); m_sceneGraph.Close(); if (!GridService.DeregisterRegion(RegionInfo.RegionID)) @@ -1359,6 +1362,7 @@ namespace OpenSim.Region.Framework.Scenes // attempt to reference a null or disposed physics scene. if (PhysicsScene != null) { + m_log.Debug("[SCENE]: Dispose Physics"); PhysicsScene phys = PhysicsScene; // remove the physics engine from both Scene and SceneGraph PhysicsScene = null; @@ -1401,6 +1405,9 @@ namespace OpenSim.Region.Framework.Scenes } // m_lastUpdate = Util.EnvironmentTickCount(); +// m_sceneGraph.PreparePhysicsSimulation(); + + m_heartbeatThread = Watchdog.StartThread( Heartbeat, string.Format("Heartbeat ({0})", RegionInfo.RegionName), ThreadPriority.Normal, false, false); diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs index 5714fdd6c3..2191cfa4d4 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs @@ -813,7 +813,7 @@ namespace OpenSim.Region.Framework.Scenes actor.Orientation = GetWorldRotation(); // Tell the physics engines that this prim changed. - if (ParentGroup.Scene != null) + if (ParentGroup.Scene != null && ParentGroup.Scene.PhysicsScene != null) ParentGroup.Scene.PhysicsScene.AddPhysicsActorTaint(actor); } diff --git a/OpenSim/Region/Physics/UbitMeshing/Meshmerizer.cs b/OpenSim/Region/Physics/UbitMeshing/Meshmerizer.cs index 29fdda4af6..6e1a105bff 100644 --- a/OpenSim/Region/Physics/UbitMeshing/Meshmerizer.cs +++ b/OpenSim/Region/Physics/UbitMeshing/Meshmerizer.cs @@ -1057,25 +1057,22 @@ namespace OpenSim.Region.Physics.Meshing mesh.RefCount++; return mesh; } - } - // try to find a identical mesh on meshs recently released - lock (m_uniqueReleasedMeshes) - { - m_uniqueReleasedMeshes.TryGetValue(key, out mesh); - if (mesh != null) + // try to find a identical mesh on meshs recently released + lock (m_uniqueReleasedMeshes) { - m_uniqueReleasedMeshes.Remove(key); - lock (m_uniqueMeshes) + m_uniqueReleasedMeshes.TryGetValue(key, out mesh); + if (mesh != null) { + m_uniqueReleasedMeshes.Remove(key); try { m_uniqueMeshes.Add(key, mesh); } catch { } + mesh.RefCount = 1; + return mesh; } - mesh.RefCount = 1; - return mesh; } } return null; @@ -1108,25 +1105,22 @@ namespace OpenSim.Region.Physics.Meshing mesh.RefCount++; return mesh; } - } - // try to find a identical mesh on meshs recently released - lock (m_uniqueReleasedMeshes) - { - m_uniqueReleasedMeshes.TryGetValue(key, out mesh); - if (mesh != null) + // try to find a identical mesh on meshs recently released + lock (m_uniqueReleasedMeshes) { - m_uniqueReleasedMeshes.Remove(key); - lock (m_uniqueMeshes) + m_uniqueReleasedMeshes.TryGetValue(key, out mesh); + if (mesh != null) { + m_uniqueReleasedMeshes.Remove(key); try { m_uniqueMeshes.Add(key, mesh); } catch { } + mesh.RefCount = 1; + return mesh; } - mesh.RefCount = 1; - return mesh; } } diff --git a/OpenSim/Region/Physics/UbitOdePlugin/ODEMeshWorker.cs b/OpenSim/Region/Physics/UbitOdePlugin/ODEMeshWorker.cs index 73dd2fd49b..5030cec783 100644 --- a/OpenSim/Region/Physics/UbitOdePlugin/ODEMeshWorker.cs +++ b/OpenSim/Region/Physics/UbitOdePlugin/ODEMeshWorker.cs @@ -914,8 +914,9 @@ namespace OpenSim.Region.Physics.OdePlugin if (repData.pbs.SculptTexture != repData.assetID) return; - repData.pbs.SculptData = new byte[asset.Data.Length]; - asset.Data.CopyTo(repData.pbs.SculptData,0); +// repData.pbs.SculptData = new byte[asset.Data.Length]; +// asset.Data.CopyTo(repData.pbs.SculptData,0); + repData.pbs.SculptData = asset.Data; repData.meshState = MeshState.AssetOK; m_worker.AssetLoaded(repData); } diff --git a/OpenSim/Region/Physics/UbitOdePlugin/ODEPrim.cs b/OpenSim/Region/Physics/UbitOdePlugin/ODEPrim.cs index ce67cc469e..76e42d4417 100644 --- a/OpenSim/Region/Physics/UbitOdePlugin/ODEPrim.cs +++ b/OpenSim/Region/Physics/UbitOdePlugin/ODEPrim.cs @@ -1108,6 +1108,8 @@ namespace OpenSim.Region.Physics.OdePlugin ODEPhysRepData repData = _parent_scene.m_meshWorker.NewActorPhysRep(this, _pbs, _size, m_shapetype); primVolume = repData.volume; + m_OBB = repData.OBB; + m_OBBOffset = repData.OBBOffset; UpdatePrimBodyData(); } diff --git a/OpenSim/Region/Physics/UbitOdePlugin/OdeScene.cs b/OpenSim/Region/Physics/UbitOdePlugin/OdeScene.cs index b98f177e86..54bc29f2f8 100644 --- a/OpenSim/Region/Physics/UbitOdePlugin/OdeScene.cs +++ b/OpenSim/Region/Physics/UbitOdePlugin/OdeScene.cs @@ -1689,11 +1689,10 @@ namespace OpenSim.Region.Physics.OdePlugin /// public override float Simulate(float timeStep) { - DateTime now = DateTime.UtcNow; TimeSpan timedif = now - m_lastframe; - m_lastframe = now; timeStep = (float)timedif.TotalSeconds; + m_lastframe = now; // acumulate time so we can reduce error step_time += timeStep; @@ -1704,6 +1703,7 @@ namespace OpenSim.Region.Physics.OdePlugin if (framecount < 0) framecount = 0; + framecount++; int curphysiteractions; @@ -1714,9 +1714,8 @@ namespace OpenSim.Region.Physics.OdePlugin else curphysiteractions = m_physicsiterations; - int nodeframes = 0; - // checkThread(); + int nodeframes = 0; lock (SimulationLock) lock(OdeLock) @@ -1733,7 +1732,11 @@ namespace OpenSim.Region.Physics.OdePlugin d.WorldSetQuickStepNumIterations(world, curphysiteractions); - while (step_time > HalfOdeStep && nodeframes < 10) //limit number of steps so we don't say here for ever + int loopstartMS = Util.EnvironmentTickCount(); + int looptimeMS = 0; + + + while (step_time > HalfOdeStep) { try { @@ -1742,9 +1745,8 @@ namespace OpenSim.Region.Physics.OdePlugin if (ChangesQueue.Count > 0) { - int ttmpstart = Util.EnvironmentTickCount(); + int changestartMS = Util.EnvironmentTickCount(); int ttmp; - while (ChangesQueue.Dequeue(out item)) { if (item.actor != null) @@ -1762,7 +1764,7 @@ namespace OpenSim.Region.Physics.OdePlugin item.actor.Name, item.what.ToString()); } } - ttmp = Util.EnvironmentTickCountSubtract(ttmpstart); + ttmp = Util.EnvironmentTickCountSubtract(changestartMS); if (ttmp > 20) break; } @@ -1873,9 +1875,12 @@ namespace OpenSim.Region.Physics.OdePlugin // ode.dunlock(world); } - step_time -= ODE_STEPSIZE; nodeframes++; + + looptimeMS = Util.EnvironmentTickCountSubtract(loopstartMS); + if (looptimeMS > 100) + break; } lock (_badCharacter) @@ -1963,7 +1968,7 @@ namespace OpenSim.Region.Physics.OdePlugin // think time dilation as to do with dinamic step size that we dont' have // even so tell something to world - if (nodeframes < 10) // we did the requested loops + if (looptimeMS < 100) // we did the requested loops m_timeDilation = 1.0f; else if (step_time > 0) { @@ -1972,6 +1977,7 @@ namespace OpenSim.Region.Physics.OdePlugin m_timeDilation = 1; if (step_time > m_SkipFramesAtms) step_time = 0; + m_lastframe = DateTime.UtcNow; // skip also the time lost } } @@ -2344,7 +2350,7 @@ namespace OpenSim.Region.Physics.OdePlugin } } } - IntPtr HeightmapData = d.GeomHeightfieldDataCreate(); + IntPtr HeightmapData = d.GeomUbitTerrainDataCreate(); const int wrap = 0; float thickness = hfmin; diff --git a/OpenSim/Services/Connectors/Neighbour/NeighbourServicesConnector.cs b/OpenSim/Services/Connectors/Neighbour/NeighbourServicesConnector.cs index 7429293c3c..7688e0fb3a 100644 --- a/OpenSim/Services/Connectors/Neighbour/NeighbourServicesConnector.cs +++ b/OpenSim/Services/Connectors/Neighbour/NeighbourServicesConnector.cs @@ -153,9 +153,9 @@ namespace OpenSim.Services.Connectors } catch (Exception e) { - m_log.WarnFormat( - "[NEIGHBOUR SERVICE CONNCTOR]: Unable to send HelloNeighbour from {0} to {1}. Exception {2}{3}", - thisRegion.RegionName, region.RegionName, e.Message, e.StackTrace); +// m_log.WarnFormat( +// "[NEIGHBOUR SERVICE CONNCTOR]: Unable to send HelloNeighbour from {0} to {1}. Exception {2}{3}", +// thisRegion.RegionName, region.RegionName, e.Message, e.StackTrace); return false; } @@ -202,4 +202,4 @@ namespace OpenSim.Services.Connectors return true; } } -} \ No newline at end of file +}