diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index 85b1242cbe..515332f5c3 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs @@ -1386,10 +1386,12 @@ namespace OpenSim.Region.Framework.Scenes int tmpPhysicsMS, tmpPhysicsMS2, tmpAgentMS, tmpTempOnRezMS, evMS, backMS, terMS; int previousFrameTick; int maintc; + int sleepMS; + int framestart; while (!m_shuttingDown && (endFrame == null || Frame < endFrame)) { - maintc = Util.EnvironmentTickCount(); + framestart = Util.EnvironmentTickCount(); ++Frame; // m_log.DebugFormat("[SCENE]: Processing frame {0} in {1}", Frame, RegionInfo.RegionName); @@ -1476,7 +1478,7 @@ namespace OpenSim.Region.Framework.Scenes // landMS = Util.EnvironmentTickCountSubtract(ldMS); //} - frameMS = Util.EnvironmentTickCountSubtract(maintc); + // frameMS = Util.EnvironmentTickCountSubtract(maintc); otherMS = tempOnRezMS + eventMS + backupMS + terrainMS + landMS; // if (Frame%m_update_avatars == 0) @@ -1491,7 +1493,7 @@ namespace OpenSim.Region.Framework.Scenes // frameMS currently records work frame times, not total frame times (work + any required sleep to // reach min frame time. - StatsReporter.addFrameMS(frameMS); + // StatsReporter.addFrameMS(frameMS); StatsReporter.addAgentMS(agentMS); StatsReporter.addPhysicsMS(physicsMS + physicsMS2); @@ -1548,14 +1550,22 @@ namespace OpenSim.Region.Framework.Scenes previousFrameTick = m_lastFrameTick; m_lastFrameTick = Util.EnvironmentTickCount(); - maintc = Util.EnvironmentTickCountSubtract(m_lastFrameTick, maintc); + maintc = Util.EnvironmentTickCountSubtract(m_lastFrameTick, framestart); maintc = (int)(MinFrameTime * 1000) - maintc; m_firstHeartbeat = false; + + sleepMS = Util.EnvironmentTickCount(); + if (maintc > 0) Thread.Sleep(maintc); + sleepMS = Util.EnvironmentTickCountSubtract(sleepMS); + frameMS = Util.EnvironmentTickCountSubtract(framestart); + StatsReporter.addSleepMS(sleepMS); + StatsReporter.addFrameMS(frameMS); + // Optionally warn if a frame takes double the amount of time that it should. if (DebugUpdates && Util.EnvironmentTickCountSubtract( diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs index c47db97229..66a652089c 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs @@ -2339,7 +2339,7 @@ namespace OpenSim.Region.Framework.Scenes { pa.PIDHoverHeight = height; pa.PIDHoverType = hoverType; - pa.PIDTau = tau; + pa.PIDHoverTau = tau; pa.PIDHoverActive = true; } else @@ -2664,19 +2664,21 @@ namespace OpenSim.Region.Framework.Scenes Quaternion oldRootRotation = linkPart.RotationOffset; linkPart.OffsetPosition = linkPart.GroupPosition - AbsolutePosition; - linkPart.ParentID = m_rootPart.LocalId; - linkPart.GroupPosition = AbsolutePosition; - Vector3 axPos = linkPart.OffsetPosition; + linkPart.ParentID = m_rootPart.LocalId; + + linkPart.GroupPosition = AbsolutePosition; + + Vector3 axPos = linkPart.OffsetPosition; Quaternion parentRot = m_rootPart.RotationOffset; axPos *= Quaternion.Inverse(parentRot); - linkPart.OffsetPosition = axPos; + Quaternion oldRot = linkPart.RotationOffset; Quaternion newRot = Quaternion.Inverse(parentRot) * oldRot; linkPart.RotationOffset = newRot; - linkPart.ParentID = m_rootPart.LocalId; +// linkPart.ParentID = m_rootPart.LocalId; done above if (m_rootPart.LinkNum == 0) m_rootPart.LinkNum = 1; @@ -3707,16 +3709,25 @@ namespace OpenSim.Region.Framework.Scenes if (togroup) { - // related to group - if ((change & ObjectChangeType.Position) != 0) + // related to group + if ((change & (ObjectChangeType.Rotation | ObjectChangeType.Position)) != 0) { - group.AbsolutePosition = data.position; - updateType = updatetype.groupterse; - } - if ((change & ObjectChangeType.Rotation) != 0) - { - group.RootPart.UpdateRotation(data.rotation); - updateType = updatetype.none; + if ((change & ObjectChangeType.Rotation) != 0) + { + group.RootPart.UpdateRotation(data.rotation); + updateType = updatetype.none; + } + if ((change & ObjectChangeType.Position) != 0) + { + group.AbsolutePosition = data.position; + updateType = updatetype.groupterse; + } + else + // ugly rotation update of all parts + { + group.AbsolutePosition = AbsolutePosition; + } + } if ((change & ObjectChangeType.Scale) != 0) { @@ -3741,10 +3752,10 @@ namespace OpenSim.Region.Framework.Scenes if (part == group.RootPart) { - if ((change & ObjectChangeType.Position) != 0) - group.UpdateRootPosition(data.position); if ((change & ObjectChangeType.Rotation) != 0) group.UpdateRootRotation(data.rotation); + if ((change & ObjectChangeType.Position) != 0) + group.UpdateRootPosition(data.position); if ((change & ObjectChangeType.Scale) != 0) part.Resize(data.scale); } diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index ebfc1bd0ff..18a396f1ef 100644 --- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs @@ -755,7 +755,7 @@ namespace OpenSim.Region.Framework.Scenes m_movementAnimationUpdateCounter = 0; if (Animator != null) { - if(ParentID == 0) // skip it if sitting + if(ParentID == 0 && !SitGround) // skip it if sitting Animator.UpdateMovementAnimations(); } else diff --git a/OpenSim/Region/Framework/Scenes/SimStatsReporter.cs b/OpenSim/Region/Framework/Scenes/SimStatsReporter.cs index 5c56264ec4..94f1b151b7 100644 --- a/OpenSim/Region/Framework/Scenes/SimStatsReporter.cs +++ b/OpenSim/Region/Framework/Scenes/SimStatsReporter.cs @@ -75,7 +75,20 @@ namespace OpenSim.Region.Framework.Scenes OutPacketsPerSecond = 18, PendingDownloads = 19, PendingUploads = 20, + VirtualSizeKB = 21, + ResidentSizeKB = 22, + PendingLocalUploads = 23, UnAckedBytes = 24, + PhysicsPinnedTasks = 25, + PhysicsLODTasks = 26, + PhysicsStepMS = 27, + PhysicsShapeMS = 28, + PhysicsOtherMS = 29, + PhysicsMemory = 30, + ScriptEPS = 31, + SimSpareTime = 32, + SimSleepTime = 33, + IOPumpTime = 34 } /// @@ -123,7 +136,7 @@ namespace OpenSim.Region.Framework.Scenes // saved last reported value so there is something available for llGetRegionFPS private float lastReportedSimFPS = 0; - private float[] lastReportedSimStats = new float[21]; + private float[] lastReportedSimStats = new float[23]; private float m_pfps = 0; /// @@ -142,6 +155,8 @@ namespace OpenSim.Region.Framework.Scenes private int m_physicsMS = 0; private int m_imageMS = 0; private int m_otherMS = 0; + private int m_sleeptimeMS = 0; + //Ckrinke: (3-21-08) Comment out to remove a compiler warning. Bring back into play when needed. //Ckrinke private int m_scriptMS = 0; @@ -200,7 +215,7 @@ namespace OpenSim.Region.Framework.Scenes private void statsHeartBeat(object sender, EventArgs e) { - SimStatsPacket.StatBlock[] sb = new SimStatsPacket.StatBlock[21]; + SimStatsPacket.StatBlock[] sb = new SimStatsPacket.StatBlock[23]; SimStatsPacket.RegionBlock rb = new SimStatsPacket.RegionBlock(); // Know what's not thread safe in Mono... modifying timers. @@ -238,18 +253,38 @@ namespace OpenSim.Region.Framework.Scenes physfps = 0; #endregion + float factor = 1 / statsUpdateFactor; + if (reportedFPS <= 0) + reportedFPS = 1; + + float perframe = 1.0f / (float)reportedFPS; + + float TotalFrameTime = m_frameMS * perframe; + + float targetframetime = 1100.0f / (float)m_nominalReportedFps; + + float sparetime; + if (TotalFrameTime > targetframetime ) + sparetime = 0; + else + { + sparetime = m_frameMS - m_physicsMS - m_agentMS; + sparetime *= perframe; + if (sparetime < 0) + sparetime = 0; + else if (sparetime > TotalFrameTime) + sparetime = TotalFrameTime; + } - //Our time dilation is 0.91 when we're running a full speed, - // therefore to make sure we get an appropriate range, - // we have to factor in our error. (0.10f * statsUpdateFactor) - // multiplies the fix for the error times the amount of times it'll occur a second - // / 10 divides the value by the number of times the sim heartbeat runs (10fps) - // Then we divide the whole amount by the amount of seconds pass in between stats updates. + // other MS is actually simulation time + // m_otherMS = m_frameMS - m_physicsMS - m_imageMS - m_netMS - m_agentMS; + // m_imageMS m_netMS are not included in m_frameMS - // 'statsUpdateFactor' is how often stats packets are sent in seconds. Used below to change - // values to X-per-second values. + m_otherMS = m_frameMS - m_physicsMS - m_agentMS - m_sleeptimeMS; + if (m_otherMS < 0) + m_otherMS = 0; - for (int i = 0; i < 21; i++) + for (int i = 0; i < 23; i++) { sb[i] = new SimStatsPacket.StatBlock(); } @@ -279,19 +314,25 @@ namespace OpenSim.Region.Framework.Scenes sb[7].StatValue = m_activePrim; sb[8].StatID = (uint)Stats.FrameMS; - sb[8].StatValue = m_frameMS / statsUpdateFactor; + // sb[8].StatValue = m_frameMS / statsUpdateFactor; + sb[8].StatValue = TotalFrameTime; sb[9].StatID = (uint)Stats.NetMS; - sb[9].StatValue = m_netMS / statsUpdateFactor; + // sb[9].StatValue = m_netMS / statsUpdateFactor; + sb[9].StatValue = m_netMS * perframe; sb[10].StatID = (uint)Stats.PhysicsMS; - sb[10].StatValue = m_physicsMS / statsUpdateFactor; + // sb[10].StatValue = m_physicsMS / statsUpdateFactor; + sb[10].StatValue = m_physicsMS * perframe; sb[11].StatID = (uint)Stats.ImageMS ; - sb[11].StatValue = m_imageMS / statsUpdateFactor; + // sb[11].StatValue = m_imageMS / statsUpdateFactor; + sb[11].StatValue = m_imageMS * perframe; sb[12].StatID = (uint)Stats.OtherMS; - sb[12].StatValue = m_otherMS / statsUpdateFactor; + // sb[12].StatValue = m_otherMS / statsUpdateFactor; + sb[12].StatValue = m_otherMS * perframe; + sb[13].StatID = (uint)Stats.InPacketsPerSecond; sb[13].StatValue = (m_inPacketsPerSecond / statsUpdateFactor); @@ -303,7 +344,8 @@ namespace OpenSim.Region.Framework.Scenes sb[15].StatValue = m_unAckedBytes; sb[16].StatID = (uint)Stats.AgentMS; - sb[16].StatValue = m_agentMS / statsUpdateFactor; +// sb[16].StatValue = m_agentMS / statsUpdateFactor; + sb[16].StatValue = m_agentMS * perframe; sb[17].StatID = (uint)Stats.PendingDownloads; sb[17].StatValue = m_pendingDownloads; @@ -316,8 +358,14 @@ namespace OpenSim.Region.Framework.Scenes sb[20].StatID = (uint)Stats.ScriptLinesPerSecond; sb[20].StatValue = m_scriptLinesPerSecond / statsUpdateFactor; - - for (int i = 0; i < 21; i++) + + sb[21].StatID = (uint)Stats.SimSpareTime; + sb[21].StatValue = sparetime; + + sb[22].StatID = (uint)Stats.SimSleepTime; + sb[22].StatValue = m_sleeptimeMS * perframe; + + for (int i = 0; i < 23; i++) { lastReportedSimStats[i] = sb[i].StatValue; } @@ -358,6 +406,7 @@ namespace OpenSim.Region.Framework.Scenes m_physicsMS = 0; m_imageMS = 0; m_otherMS = 0; + m_sleeptimeMS = 0; //Ckrinke This variable is not used, so comment to remove compiler warning until it is used. //Ckrinke m_scriptMS = 0; @@ -484,6 +533,11 @@ namespace OpenSim.Region.Framework.Scenes m_otherMS += ms; } + public void addSleepMS(int ms) + { + m_sleeptimeMS += ms; + } + public void AddPendingDownloads(int count) { m_pendingDownloads += count; diff --git a/OpenSim/Region/Physics/ChOdePlugin/ODEPrim.cs b/OpenSim/Region/Physics/ChOdePlugin/ODEPrim.cs index 77ea2aff0f..5b743e8a02 100644 --- a/OpenSim/Region/Physics/ChOdePlugin/ODEPrim.cs +++ b/OpenSim/Region/Physics/ChOdePlugin/ODEPrim.cs @@ -461,6 +461,13 @@ namespace OpenSim.Region.Physics.OdePlugin } } + public override bool IsVolumeDtc + { + set { return; } + get { return m_isVolumeDetect; } + + } + public override bool Phantom { get { return m_isphantom; } @@ -598,6 +605,7 @@ namespace OpenSim.Region.Physics.OdePlugin } } + public override Vector3 CenterOfMass { get { return Vector3.Zero; } @@ -1372,6 +1380,25 @@ namespace OpenSim.Region.Physics.OdePlugin } } + + private void UpdateDataFromGeom() + { + if (prim_geom != IntPtr.Zero) + { + d.Quaternion qtmp; + d.GeomCopyQuaternion(prim_geom, out qtmp); + _orientation.W = qtmp.W; + _orientation.X = qtmp.X; + _orientation.Y = qtmp.Y; + _orientation.Z = qtmp.Z; + + d.Vector3 lpos = d.GeomGetPosition(prim_geom); + _position.X = lpos.X; + _position.Y = lpos.Y; + _position.Z = lpos.Z; + } + } + public void disableBody() { //this kills the body so things like 'mesh' can re-create it. @@ -1400,25 +1427,31 @@ namespace OpenSim.Region.Physics.OdePlugin } } - d.BodyDestroy(Body); + UpdateDataFromGeom(); + lock (childrenPrim) { if (childrenPrim.Count > 0) { foreach (OdePrim prm in childrenPrim) { - if (prm.m_NoColide && prm.prim_geom != IntPtr.Zero) + if (prm.prim_geom != IntPtr.Zero) { - d.GeomSetCategoryBits(prm.prim_geom, 0); - d.GeomSetCollideBits(prm.prim_geom, 0); - d.GeomDisable(prm.prim_geom); - } + if (prm.m_NoColide) + { + d.GeomSetCategoryBits(prm.prim_geom, 0); + d.GeomSetCollideBits(prm.prim_geom, 0); + d.GeomDisable(prm.prim_geom); + } + prm.UpdateDataFromGeom(); + } _parent_scene.remActivePrim(prm); prm.Body = IntPtr.Zero; } } } + d.BodyDestroy(Body); Body = IntPtr.Zero; } } diff --git a/OpenSim/Region/Physics/UbitOdePlugin/ODECharacter.cs b/OpenSim/Region/Physics/UbitOdePlugin/ODECharacter.cs index 6ffcb9e145..8b5b989d8d 100644 --- a/OpenSim/Region/Physics/UbitOdePlugin/ODECharacter.cs +++ b/OpenSim/Region/Physics/UbitOdePlugin/ODECharacter.cs @@ -346,12 +346,11 @@ namespace OpenSim.Region.Physics.OdePlugin m_iscollidingObj = true; // m_iscollidingObj = value; -/* + if (m_iscollidingObj) m_pidControllerActive = false; else m_pidControllerActive = true; - */ } } diff --git a/OpenSim/Region/Physics/UbitOdePlugin/ODEPrim.cs b/OpenSim/Region/Physics/UbitOdePlugin/ODEPrim.cs index dc6c18d220..2d587ab53a 100644 --- a/OpenSim/Region/Physics/UbitOdePlugin/ODEPrim.cs +++ b/OpenSim/Region/Physics/UbitOdePlugin/ODEPrim.cs @@ -2467,15 +2467,14 @@ namespace OpenSim.Region.Physics.OdePlugin { if (prim_geom != IntPtr.Zero) { - d.Quaternion qtmp = new d.Quaternion { }; + d.Quaternion qtmp; d.GeomCopyQuaternion(prim_geom, out qtmp); _orientation.W = qtmp.W; _orientation.X = qtmp.X; _orientation.Y = qtmp.Y; _orientation.Z = qtmp.Z; - d.Vector3 lpos; - d.GeomCopyPosition(prim_geom, out lpos); + d.Vector3 lpos = d.GeomGetPosition(prim_geom); _position.X = lpos.X; _position.Y = lpos.Y; _position.Z = lpos.Z; @@ -3565,8 +3564,7 @@ namespace OpenSim.Region.Physics.OdePlugin { bool lastZeroFlag = _zeroFlag; - d.Vector3 lpos; - d.GeomCopyPosition(prim_geom, out lpos); // root position that is seem by rest of simulator + d.Vector3 lpos = d.GeomGetPosition(prim_geom); d.Quaternion ori; d.GeomCopyQuaternion(prim_geom, out ori);