From 846d2df2458d1a6669819a2f103d0c1e6bbf12d4 Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Fri, 18 Mar 2022 02:20:40 +0000 Subject: [PATCH] replace util.clip by utils.clamp (from libomv), and a few more cosmetics --- OpenSim/Framework/Util.cs | 39 ++++++++++-------- .../Scripting/EMailModules/EmailModule2.cs | 20 ++++----- .../CoreModules/World/Sound/SoundModule.cs | 2 +- .../Framework/Scenes/SceneObjectPart.cs | 4 +- .../Region/PhysicsModules/BulletS/BSPrim.cs | 24 +++++------ OpenSim/Region/PhysicsModules/Ode/ODEPrim.cs | 6 +-- .../PhysicsModules/ubOde/ODECharacter.cs | 14 +++---- .../Region/PhysicsModules/ubOde/ODEPrim.cs | 16 +++---- bin/OpenMetaverse.Rendering.Meshmerizer.dll | Bin 20480 -> 20480 bytes bin/OpenMetaverse.StructuredData.dll | Bin 126976 -> 126976 bytes bin/OpenMetaverse.dll | Bin 2179072 -> 2179072 bytes bin/OpenMetaverseTypes.dll | Bin 159744 -> 159744 bytes 12 files changed, 63 insertions(+), 62 deletions(-) diff --git a/OpenSim/Framework/Util.cs b/OpenSim/Framework/Util.cs index 488b044c2c..4130b9f9af 100644 --- a/OpenSim/Framework/Util.cs +++ b/OpenSim/Framework/Util.cs @@ -1116,35 +1116,41 @@ namespace OpenSim.Framework return true; } + [MethodImpl(MethodImplOptions.AggressiveInlining)] public static double UnixTimeSinceEpochSecs() { TimeSpan t = DateTime.UtcNow - UnixEpoch; return t.TotalSeconds; } + [MethodImpl(MethodImplOptions.AggressiveInlining)] public static int UnixTimeSinceEpoch() { TimeSpan t = DateTime.UtcNow - UnixEpoch; return (int)t.TotalSeconds; } + [MethodImpl(MethodImplOptions.AggressiveInlining)] public static ulong UnixTimeSinceEpoch_uS() { TimeSpan t = DateTime.UtcNow - UnixEpoch; return (ulong)(t.TotalMilliseconds * 1000); } + [MethodImpl(MethodImplOptions.AggressiveInlining)] public static int ToUnixTime(DateTime stamp) { TimeSpan t = stamp.ToUniversalTime() - UnixEpoch; return (int)t.TotalSeconds; } + [MethodImpl(MethodImplOptions.AggressiveInlining)] public static DateTime ToDateTime(ulong seconds) { return UnixEpoch.AddSeconds(seconds); } + [MethodImpl(MethodImplOptions.AggressiveInlining)] public static DateTime ToDateTime(int seconds) { return UnixEpoch.AddSeconds(seconds); @@ -1155,7 +1161,7 @@ namespace OpenSim.Framework /// /// /// - + [MethodImpl(MethodImplOptions.AggressiveInlining)] public static string Md5Hash(string data) { return Md5Hash(data, Encoding.Default); @@ -1170,6 +1176,7 @@ namespace OpenSim.Framework return sb.ToString(); } + [MethodImpl(MethodImplOptions.AggressiveInlining)] private static byte[] ComputeMD5Hash(string data, Encoding encoding) { using (MD5 md5 = MD5.Create()) @@ -1237,11 +1244,13 @@ namespace OpenSim.Framework return new string(chars); } + [MethodImpl(MethodImplOptions.AggressiveInlining)] public static string SHA1Hash(string data, Encoding enc) { return SHA1Hash(enc.GetBytes(data)); } + [MethodImpl(MethodImplOptions.AggressiveInlining)] public static string SHA1Hash(string data) { return SHA1Hash(Encoding.Default.GetBytes(data)); @@ -1266,6 +1275,7 @@ namespace OpenSim.Framework return ret; } + [MethodImpl(MethodImplOptions.AggressiveInlining)] public static UUID ComputeSHA1UUID(string src) { return ComputeSHA1UUID(Encoding.Default.GetBytes(src)); @@ -1332,6 +1342,7 @@ namespace OpenSim.Framework return false; } + [MethodImpl(MethodImplOptions.AggressiveInlining)] public static string FieldToString(byte[] bytes) { return FieldToString(bytes, String.Empty); @@ -1416,6 +1427,7 @@ namespace OpenSim.Framework /// /// URL Standard Format /// A resolved IP Address + [MethodImpl(MethodImplOptions.AggressiveInlining)] public static IPAddress GetHostFromURL(string url) { return GetHostFromDNS(url.Split(new char[] { '/', ':' })[3]); @@ -1544,6 +1556,7 @@ namespace OpenSim.Framework return getEndPoint(ia, port); } + [MethodImpl(MethodImplOptions.AggressiveInlining)] public static Uri GetURI(string protocol, string hostname, int port, string path) { return new UriBuilder(protocol, hostname, port, path).Uri; @@ -1553,6 +1566,7 @@ namespace OpenSim.Framework /// Gets a list of all local system IP addresses /// /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] public static IPAddress[] GetLocalHosts() { return Dns.GetHostAddresses(Dns.GetHostName()); @@ -1641,6 +1655,7 @@ namespace OpenSim.Framework /// /// path /// safe path + [MethodImpl(MethodImplOptions.AggressiveInlining)] public static string SafePath(string path) { return Regex.Replace(path, regexInvalidPathChars, String.Empty); @@ -1651,6 +1666,7 @@ namespace OpenSim.Framework /// /// filename /// safe filename + [MethodImpl(MethodImplOptions.AggressiveInlining)] public static string SafeFileName(string filename) { return Regex.Replace(filename, regexInvalidFileChars, String.Empty); @@ -1669,21 +1685,25 @@ namespace OpenSim.Framework return temp; } + [MethodImpl(MethodImplOptions.AggressiveInlining)] public static string assetsDir() { return Path.Combine(configDir(), "assets"); } + [MethodImpl(MethodImplOptions.AggressiveInlining)] public static string inventoryDir() { return Path.Combine(configDir(), "inventory"); } + [MethodImpl(MethodImplOptions.AggressiveInlining)] public static string configDir() { return "."; } + [MethodImpl(MethodImplOptions.AggressiveInlining)] public static string dataDir() { return "."; @@ -1715,6 +1735,7 @@ namespace OpenSim.Framework return "./OpenSimStats.log"; } + [MethodImpl(MethodImplOptions.AggressiveInlining)] public static string logDir() { return Path.GetDirectoryName(logFile()); @@ -1987,22 +2008,6 @@ namespace OpenSim.Framework #endregion - public static float Clip(float x, float min, float max) - { - return Math.Min(Math.Max(x, min), max); - } - - public static int Clip(int x, int min, int max) - { - return Math.Min(Math.Max(x, min), max); - } - - public static Vector3 Clip(Vector3 vec, float min, float max) - { - return new Vector3(Clip(vec.X, min, max), Clip(vec.Y, min, max), - Clip(vec.Z, min, max)); - } - /// /// Convert an UUID to a raw uuid string. Right now this is a string without hyphens. /// diff --git a/OpenSim/Region/CoreModules/Scripting/EMailModules/EmailModule2.cs b/OpenSim/Region/CoreModules/Scripting/EMailModules/EmailModule2.cs index 0e497265c6..673b6ce408 100644 --- a/OpenSim/Region/CoreModules/Scripting/EMailModules/EmailModule2.cs +++ b/OpenSim/Region/CoreModules/Scripting/EMailModules/EmailModule2.cs @@ -234,10 +234,9 @@ namespace OpenSim.Region.CoreModules.Scripting.EmailModules SceneObjectPart part = s.GetSceneObjectPart(objectID); if (part != null) { - ObjectRegionName = s.RegionInfo.RegionName; - uint localX = s.RegionInfo.WorldLocX; - uint localY = s.RegionInfo.WorldLocY; - ObjectRegionName = ObjectRegionName + " (" + localX + ", " + localY + ")"; + RegionInfo sri = s.RegionInfo; + ObjectRegionName = sri.RegionName; + ObjectRegionName = ObjectRegionName + " (" + sri.WorldLocX + ", " + sri.WorldLocY + ")"; return part; } } @@ -261,13 +260,11 @@ namespace OpenSim.Region.CoreModules.Scripting.EmailModules } public static bool smptValidateServerCertificate(object sender, X509Certificate certificate, - X509Chain chain, SslPolicyErrors sslPolicyErrors) + X509Chain chain, SslPolicyErrors sslPolicyErrors) { - if ((sslPolicyErrors & m_SMTP_SslPolicyErrorsMask) == SslPolicyErrors.None) - return true; - - return false; + return (sslPolicyErrors & m_SMTP_SslPolicyErrorsMask) == SslPolicyErrors.None; } + /// /// SendMail function utilized by llEMail /// @@ -352,15 +349,14 @@ namespace OpenSim.Region.CoreModules.Scripting.EmailModules { // inter object email, keep it in the family Email email = new Email(); - email.time = ((int)((DateTime.UtcNow - new DateTime(1970,1,1,0,0,0)).TotalSeconds)).ToString(); + email.time = Util.UnixTimeSinceEpoch().ToString(); email.subject = subject; email.sender = objectID.ToString() + "@" + m_InterObjectHostname; email.message = "Object-Name: " + LastObjectName + "\nRegion: " + LastObjectRegionName + "\nLocal-Position: " + LastObjectPosition + "\n\n" + body; - string guid = address.Substring(0, address.IndexOf("@")); - UUID toID = new UUID(guid); + UUID toID = new UUID(mailTo.Name); if (IsLocal(toID)) // TODO FIX check to see if it is local { diff --git a/OpenSim/Region/CoreModules/World/Sound/SoundModule.cs b/OpenSim/Region/CoreModules/World/Sound/SoundModule.cs index a3d19cb0fb..3143a2e22a 100644 --- a/OpenSim/Region/CoreModules/World/Sound/SoundModule.cs +++ b/OpenSim/Region/CoreModules/World/Sound/SoundModule.cs @@ -301,7 +301,7 @@ namespace OpenSim.Region.CoreModules.World.Sound if (!m_scene.TryGetSceneObjectPart(objectID, out part)) return; - volume = Util.Clip((float)volume, 0, 1); + volume = Utils.Clamp(volume, 0, 1); UUID parentID = part.ParentGroup.UUID; diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs index 4b087966d0..e9cecfe8e0 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs @@ -3807,9 +3807,9 @@ namespace OpenSim.Region.Framework.Scenes /// public void SetFaceColorAlpha(int face, Vector3 color, double ?alpha) { - Vector3 clippedColor = Util.Clip(color, 0.0f, 1.0f); + Vector3 clippedColor = Vector3.Clamp(color, 0.0f, 1.0f); float clippedAlpha = alpha.HasValue ? - Util.Clip((float)alpha.Value, 0.0f, 1.0f) : 0; + Utils.Clamp((float)alpha.Value, 0.0f, 1.0f) : 0; // The only way to get a deep copy/ If we don't do this, we can // never detect color changes further down. diff --git a/OpenSim/Region/PhysicsModules/BulletS/BSPrim.cs b/OpenSim/Region/PhysicsModules/BulletS/BSPrim.cs index 8865a33f16..7ac739d936 100644 --- a/OpenSim/Region/PhysicsModules/BulletS/BSPrim.cs +++ b/OpenSim/Region/PhysicsModules/BulletS/BSPrim.cs @@ -1756,8 +1756,8 @@ namespace OpenSim.Region.PhysicsModule.BulletS break; case ExtendedPhysics.PHYS_AXIS_LIMIT_LINEAR_X: this.LockedLinearAxis.X = LockedAxis; - this.LockedLinearAxisLow.X = Util.Clip(low, -linearMax, linearMax); - this.LockedLinearAxisHigh.X = Util.Clip(high, -linearMax, linearMax); + this.LockedLinearAxisLow.X = OMV.Utils.Clamp(low, -linearMax, linearMax); + this.LockedLinearAxisHigh.X = OMV.Utils.Clamp(high, -linearMax, linearMax); break; case ExtendedPhysics.PHYS_AXIS_LOCK_LINEAR_Y: this.LockedLinearAxis.Y = LockedAxis; @@ -1766,8 +1766,8 @@ namespace OpenSim.Region.PhysicsModule.BulletS break; case ExtendedPhysics.PHYS_AXIS_LIMIT_LINEAR_Y: this.LockedLinearAxis.Y = LockedAxis; - this.LockedLinearAxisLow.Y = Util.Clip(low, -linearMax, linearMax); - this.LockedLinearAxisHigh.Y = Util.Clip(high, -linearMax, linearMax); + this.LockedLinearAxisLow.Y = OMV.Utils.Clamp(low, -linearMax, linearMax); + this.LockedLinearAxisHigh.Y = OMV.Utils.Clamp(high, -linearMax, linearMax); break; case ExtendedPhysics.PHYS_AXIS_LOCK_LINEAR_Z: this.LockedLinearAxis.Z = LockedAxis; @@ -1776,8 +1776,8 @@ namespace OpenSim.Region.PhysicsModule.BulletS break; case ExtendedPhysics.PHYS_AXIS_LIMIT_LINEAR_Z: this.LockedLinearAxis.Z = LockedAxis; - this.LockedLinearAxisLow.Z = Util.Clip(low, -linearMax, linearMax); - this.LockedLinearAxisHigh.Z = Util.Clip(high, -linearMax, linearMax); + this.LockedLinearAxisLow.Z = OMV.Utils.Clamp(low, -linearMax, linearMax); + this.LockedLinearAxisHigh.Z = OMV.Utils.Clamp(high, -linearMax, linearMax); break; case ExtendedPhysics.PHYS_AXIS_LOCK_ANGULAR: this.LockedAngularAxis = new OMV.Vector3(LockedAxis, LockedAxis, LockedAxis); @@ -1791,8 +1791,8 @@ namespace OpenSim.Region.PhysicsModule.BulletS break; case ExtendedPhysics.PHYS_AXIS_LIMIT_ANGULAR_X: this.LockedAngularAxis.X = LockedAxis; - this.LockedAngularAxisLow.X = Util.Clip(low, -angularMax, angularMax); - this.LockedAngularAxisHigh.X = Util.Clip(high, -angularMax, angularMax); + this.LockedAngularAxisLow.X = OMV.Utils.Clamp(low, -angularMax, angularMax); + this.LockedAngularAxisHigh.X = OMV.Utils.Clamp(high, -angularMax, angularMax); break; case ExtendedPhysics.PHYS_AXIS_LOCK_ANGULAR_Y: this.LockedAngularAxis.Y = LockedAxis; @@ -1801,8 +1801,8 @@ namespace OpenSim.Region.PhysicsModule.BulletS break; case ExtendedPhysics.PHYS_AXIS_LIMIT_ANGULAR_Y: this.LockedAngularAxis.Y = LockedAxis; - this.LockedAngularAxisLow.Y = Util.Clip(low, -angularMax, angularMax); - this.LockedAngularAxisHigh.Y = Util.Clip(high, -angularMax, angularMax); + this.LockedAngularAxisLow.Y = OMV.Utils.Clamp(low, -angularMax, angularMax); + this.LockedAngularAxisHigh.Y = OMV.Utils.Clamp(high, -angularMax, angularMax); break; case ExtendedPhysics.PHYS_AXIS_LOCK_ANGULAR_Z: this.LockedAngularAxis.Z = LockedAxis; @@ -1811,8 +1811,8 @@ namespace OpenSim.Region.PhysicsModule.BulletS break; case ExtendedPhysics.PHYS_AXIS_LIMIT_ANGULAR_Z: this.LockedAngularAxis.Z = LockedAxis; - this.LockedAngularAxisLow.Z = Util.Clip(low, -angularMax, angularMax); - this.LockedAngularAxisHigh.Z = Util.Clip(high, -angularMax, angularMax); + this.LockedAngularAxisLow.Z = OMV.Utils.Clamp(low, -angularMax, angularMax); + this.LockedAngularAxisHigh.Z = OMV.Utils.Clamp(high, -angularMax, angularMax); break; case ExtendedPhysics.PHYS_AXIS_UNLOCK_LINEAR: this.LockedLinearAxis = LockedAxisFree; diff --git a/OpenSim/Region/PhysicsModules/Ode/ODEPrim.cs b/OpenSim/Region/PhysicsModules/Ode/ODEPrim.cs index 7c9f3b45cf..d7792f42e1 100644 --- a/OpenSim/Region/PhysicsModules/Ode/ODEPrim.cs +++ b/OpenSim/Region/PhysicsModules/Ode/ODEPrim.cs @@ -2667,9 +2667,9 @@ Console.WriteLine(" JointCreateFixed"); SafeNativeMethods.AllocateODEDataForThread(0); - _position.X = Util.Clip(_position.X, 0.5f, _parent_scene.WorldExtents.X - 0.5f); - _position.Y = Util.Clip(_position.Y, 0.5f, _parent_scene.WorldExtents.Y - 0.5f); - _position.Z = Util.Clip(_position.Z + 0.2f, -100f, 50000f); + _position.X = Utils.Clamp(_position.X, 0.5f, _parent_scene.WorldExtents.X - 0.5f); + _position.Y = Utils.Clamp(_position.Y, 0.5f, _parent_scene.WorldExtents.Y - 0.5f); + _position.Z = Utils.Clamp(_position.Z + 0.2f, -100f, 50000f); m_lastposition = _position; _velocity.X = 0; diff --git a/OpenSim/Region/PhysicsModules/ubOde/ODECharacter.cs b/OpenSim/Region/PhysicsModules/ubOde/ODECharacter.cs index 245fbd14df..59096037aa 100644 --- a/OpenSim/Region/PhysicsModules/ubOde/ODECharacter.cs +++ b/OpenSim/Region/PhysicsModules/ubOde/ODECharacter.cs @@ -1159,9 +1159,6 @@ namespace OpenSim.Region.PhysicsModule.ubOde m_bodydisablecontrol = 0; - SafeNativeMethods.Vector3 dtmp = SafeNativeMethods.BodyGetPosition(Body); - Vector3 localpos = new Vector3(dtmp.X,dtmp.Y,dtmp.Z); - // the Amotor still lets avatar rotation to drift during colisions // so force it back to identity @@ -1172,10 +1169,8 @@ namespace OpenSim.Region.PhysicsModule.ubOde qtmp.Z = m_orientation2D.Z; SafeNativeMethods.BodySetQuaternion(Body,ref qtmp); - if(m_pidControllerActive == false) - { - _zeroPosition = localpos; - } + SafeNativeMethods.Vector3 dtmp = SafeNativeMethods.BodyGetPosition(Body); + Vector3 localpos = new Vector3(dtmp.X, dtmp.Y, dtmp.Z); // check outbounds forcing to be in world bool fixbody = false; @@ -1220,6 +1215,11 @@ namespace OpenSim.Region.PhysicsModule.ubOde localpos.Z = 128f; } + if (m_pidControllerActive == false) + { + _zeroPosition = localpos; + } + if (fixbody) { m_freemove = false; diff --git a/OpenSim/Region/PhysicsModules/ubOde/ODEPrim.cs b/OpenSim/Region/PhysicsModules/ubOde/ODEPrim.cs index 787d83fda4..9ad304faee 100644 --- a/OpenSim/Region/PhysicsModules/ubOde/ODEPrim.cs +++ b/OpenSim/Region/PhysicsModules/ubOde/ODEPrim.cs @@ -972,9 +972,9 @@ namespace OpenSim.Region.PhysicsModule.ubOde { if (m_outbounds) { - _position.X = Util.Clip(_position.X, 0.5f, _parent_scene.WorldExtents.X - 0.5f); - _position.Y = Util.Clip(_position.Y, 0.5f, _parent_scene.WorldExtents.Y - 0.5f); - _position.Z = Util.Clip(_position.Z + 0.2f, Constants.MinSimulationHeight, Constants.MaxSimulationHeight); + _position.X = Utils.Clamp(_position.X, 0.5f, _parent_scene.WorldExtents.X - 0.5f); + _position.Y = Utils.Clamp(_position.Y, 0.5f, _parent_scene.WorldExtents.Y - 0.5f); + _position.Z = Utils.Clamp(_position.Z + 0.2f, Constants.MinSimulationHeight, Constants.MaxSimulationHeight); m_lastposition = _position; _velocity.X = 0; @@ -3815,7 +3815,7 @@ namespace OpenSim.Region.PhysicsModule.ubOde { m_outbounds = true; - lpos.Z = Util.Clip(lpos.Z, -100f, 100000f); + lpos.Z = Utils.Clamp(lpos.Z, -100f, 100000f); m_acceleration.X = 0; m_acceleration.Y = 0; m_acceleration.Z = 0; @@ -3845,22 +3845,22 @@ namespace OpenSim.Region.PhysicsModule.ubOde if (lpos.X < 0f) { - _position.X = Util.Clip(lpos.X, -2f, -0.1f); + _position.X = Utils.Clamp(lpos.X, -2f, -0.1f); m_outbounds = true; } else if (lpos.X > _parent_scene.WorldExtents.X) { - _position.X = Util.Clip(lpos.X, _parent_scene.WorldExtents.X + 0.1f, _parent_scene.WorldExtents.X + 2f); + _position.X = Utils.Clamp(lpos.X, _parent_scene.WorldExtents.X + 0.1f, _parent_scene.WorldExtents.X + 2f); m_outbounds = true; } if (lpos.Y < 0f) { - _position.Y = Util.Clip(lpos.Y, -2f, -0.1f); + _position.Y = Utils.Clamp(lpos.Y, -2f, -0.1f); m_outbounds = true; } else if (lpos.Y > _parent_scene.WorldExtents.Y) { - _position.Y = Util.Clip(lpos.Y, _parent_scene.WorldExtents.Y + 0.1f, _parent_scene.WorldExtents.Y + 2f); + _position.Y = Utils.Clamp(lpos.Y, _parent_scene.WorldExtents.Y + 0.1f, _parent_scene.WorldExtents.Y + 2f); m_outbounds = true; } diff --git a/bin/OpenMetaverse.Rendering.Meshmerizer.dll b/bin/OpenMetaverse.Rendering.Meshmerizer.dll index 0ac81ef60f9c5bc0dd4b6b1393d631810018c8f9..34ed2b782a0591a6f75d6ebb3d6f4ed6978d7108 100755 GIT binary patch delta 46 zcmV+}0MY+|paFoO0g#9T2Iw=fi*X|YLJqV3BdP}wGYN?l1>%xGuI{1@NVKxlv$!ir EB%Y-bmjD0& delta 46 zcmV+}0MY+|paFoO0g#9TX23A9i*X|YvUIclBdP}wB96?HNvn}hgD*8m<){%Av$!ir EB*oDa2mk;8 diff --git a/bin/OpenMetaverse.StructuredData.dll b/bin/OpenMetaverse.StructuredData.dll index dc6c557859ac100b3370c67f9f2a44e1d358872b..5c89d06bd07a5cc849481b37b4812d89513208ed 100755 GIT binary patch delta 42 zcmV+_0M-A1;0J)<2at#Z1n4t?i?xdZ8K@Ax0!*5yI{8I`X5EB!L-@P5w5S10N04t5 AM*si- delta 42 zcmV+_0M-A1;0J)<2at#ZN4_k9i?xdZ8K@ALQY`}W^1nil)0BI=ifj?Lw5S10N0jvw A5&!@I diff --git a/bin/OpenMetaverse.dll b/bin/OpenMetaverse.dll index 593ba1eddb1591cf25e1bd0f334a8df13fdb8982..3c7e2353f9c655d413397d1d3a546918a490e0ef 100755 GIT binary patch delta 261 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 delta 5599 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