From 65925027f11e8124de9287281d8cd6fac9a2895c Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Sun, 16 Oct 2022 22:36:09 +0100 Subject: [PATCH] c# things on physics; remove unused file (runprebuild) --- OpenSim/Framework/ClientManager.cs | 2 +- .../PhysicsModules/SharedBase/PhysicsActor.cs | 19 +- .../PhysicsModules/SharedBase/PhysicsScene.cs | 2 +- .../SharedBase/PhysicsVector.cs | 186 --------------- .../PhysicsModules/ubOde/ODECharacter.cs | 78 +++---- .../PhysicsModules/ubOde/ODEDynamics.cs | 101 ++++---- .../Region/PhysicsModules/ubOde/ODEPrim.cs | 215 +++++++++--------- .../Region/PhysicsModules/ubOde/ODEScene.cs | 156 +++++++------ .../PhysicsModules/ubOde/ODESitAvatar.cs | 13 +- 9 files changed, 283 insertions(+), 489 deletions(-) delete mode 100644 OpenSim/Region/PhysicsModules/SharedBase/PhysicsVector.cs diff --git a/OpenSim/Framework/ClientManager.cs b/OpenSim/Framework/ClientManager.cs index 07fcc0d6d2..05829b869d 100644 --- a/OpenSim/Framework/ClientManager.cs +++ b/OpenSim/Framework/ClientManager.cs @@ -191,7 +191,7 @@ namespace OpenSim.Framework IClientAPI[] localArray; lock (m_syncRoot) { - if (m_array == null) + if (m_array is null) { if (m_dictbyUUID.Count == 0) return; diff --git a/OpenSim/Region/PhysicsModules/SharedBase/PhysicsActor.cs b/OpenSim/Region/PhysicsModules/SharedBase/PhysicsActor.cs index 573ff23042..690f3840e9 100644 --- a/OpenSim/Region/PhysicsModules/SharedBase/PhysicsActor.cs +++ b/OpenSim/Region/PhysicsModules/SharedBase/PhysicsActor.cs @@ -137,23 +137,22 @@ namespace OpenSim.Region.PhysicsModules.SharedBase public void AddCollider(uint localID, ContactPoint contact) { - if (m_objCollisionList.TryGetValue(localID, out ContactPoint oldcp)) + ref ContactPoint curcp = ref CollectionsMarshal.GetValueRefOrAddDefault(m_objCollisionList, localID, out bool ex); + if (ex) { - float lastVel = oldcp.RelativeSpeed; - if (oldcp.PenetrationDepth < contact.PenetrationDepth) + if (curcp.PenetrationDepth < contact.PenetrationDepth) { - if (Math.Abs(lastVel) > Math.Abs(contact.RelativeSpeed)) - contact.RelativeSpeed = lastVel; - m_objCollisionList[localID] = contact; + if (Math.Abs(curcp.PenetrationDepth) > Math.Abs(contact.RelativeSpeed)) + contact.RelativeSpeed = curcp.PenetrationDepth; + curcp = contact; } - else if (Math.Abs(lastVel) < Math.Abs(contact.RelativeSpeed)) + else if (MathF.Abs(curcp.RelativeSpeed) < MathF.Abs(contact.RelativeSpeed)) { - oldcp.RelativeSpeed = contact.RelativeSpeed; - m_objCollisionList[localID] = oldcp; + curcp.RelativeSpeed = contact.RelativeSpeed; } } else - m_objCollisionList.Add(localID, contact); + curcp = contact; } /// diff --git a/OpenSim/Region/PhysicsModules/SharedBase/PhysicsScene.cs b/OpenSim/Region/PhysicsModules/SharedBase/PhysicsScene.cs index cba8e6f57f..e3b5d8bd1b 100644 --- a/OpenSim/Region/PhysicsModules/SharedBase/PhysicsScene.cs +++ b/OpenSim/Region/PhysicsModules/SharedBase/PhysicsScene.cs @@ -161,7 +161,7 @@ namespace OpenSim.Region.PhysicsModules.SharedBase { PhysicsActor ret = AddAvatar(avName, position, velocity, size, isFlying); - if (ret != null) + if (ret is not null) ret.LocalID = localID; return ret; diff --git a/OpenSim/Region/PhysicsModules/SharedBase/PhysicsVector.cs b/OpenSim/Region/PhysicsModules/SharedBase/PhysicsVector.cs deleted file mode 100644 index 5aae42ff08..0000000000 --- a/OpenSim/Region/PhysicsModules/SharedBase/PhysicsVector.cs +++ /dev/null @@ -1,186 +0,0 @@ -/* - * Copyright (c) Contributors, http://opensimulator.org/ - * See CONTRIBUTORS.TXT for a full list of copyright holders. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the OpenSimulator Project nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -using System; - -namespace OpenSim.Region.PhysicsModules.SharedBase -{ - /*public class PhysicsVector - { - public float X; - public float Y; - public float Z; - - public Vector3() - { - } - - public Vector3(float x, float y, float z) - { - X = x; - Y = y; - Z = z; - } - - public Vector3(Vector3 pv) : this(pv.X, pv.Y, pv.Z) - { - } - - public void setValues(float x, float y, float z) - { - X = x; - Y = y; - Z = z; - } - - public static readonly PhysicsVector Zero = new PhysicsVector(0f, 0f, 0f); - - public override string ToString() - { - return "<" + X + "," + Y + "," + Z + ">"; - } - - /// - /// These routines are the easiest way to store XYZ values in an Vector3 without requiring 3 calls. - /// - /// - public byte[] GetBytes() - { - byte[] byteArray = new byte[12]; - - Buffer.BlockCopy(BitConverter.GetBytes(X), 0, byteArray, 0, 4); - Buffer.BlockCopy(BitConverter.GetBytes(Y), 0, byteArray, 4, 4); - Buffer.BlockCopy(BitConverter.GetBytes(Z), 0, byteArray, 8, 4); - - if (!BitConverter.IsLittleEndian) - { - Array.Reverse(byteArray, 0, 4); - Array.Reverse(byteArray, 4, 4); - Array.Reverse(byteArray, 8, 4); - } - - return byteArray; - } - - public void FromBytes(byte[] byteArray, int pos) - { - byte[] conversionBuffer = null; - if (!BitConverter.IsLittleEndian) - { - // Big endian architecture - if (conversionBuffer == null) - conversionBuffer = new byte[12]; - - Buffer.BlockCopy(byteArray, pos, conversionBuffer, 0, 12); - - Array.Reverse(conversionBuffer, 0, 4); - Array.Reverse(conversionBuffer, 4, 4); - Array.Reverse(conversionBuffer, 8, 4); - - X = BitConverter.ToSingle(conversionBuffer, 0); - Y = BitConverter.ToSingle(conversionBuffer, 4); - Z = BitConverter.ToSingle(conversionBuffer, 8); - } - else - { - // Little endian architecture - X = BitConverter.ToSingle(byteArray, pos); - Y = BitConverter.ToSingle(byteArray, pos + 4); - Z = BitConverter.ToSingle(byteArray, pos + 8); - } - } - - // Operations - public static PhysicsVector operator +(Vector3 a, Vector3 b) - { - return new PhysicsVector(a.X + b.X, a.Y + b.Y, a.Z + b.Z); - } - - public static PhysicsVector operator -(Vector3 a, Vector3 b) - { - return new PhysicsVector(a.X - b.X, a.Y - b.Y, a.Z - b.Z); - } - - public static PhysicsVector cross(Vector3 a, Vector3 b) - { - return new PhysicsVector(a.Y*b.Z - a.Z*b.Y, a.Z*b.X - a.X*b.Z, a.X*b.Y - a.Y*b.X); - } - - public float length() - { - return (float) Math.Sqrt(X*X + Y*Y + Z*Z); - } - - public static float GetDistanceTo(Vector3 a, Vector3 b) - { - float dx = a.X - b.X; - float dy = a.Y - b.Y; - float dz = a.Z - b.Z; - return (float) Math.Sqrt(dx * dx + dy * dy + dz * dz); - } - - public static PhysicsVector operator /(Vector3 v, float f) - { - return new PhysicsVector(v.X/f, v.Y/f, v.Z/f); - } - - public static PhysicsVector operator *(Vector3 v, float f) - { - return new PhysicsVector(v.X*f, v.Y*f, v.Z*f); - } - - public static PhysicsVector operator *(float f, Vector3 v) - { - return v*f; - } - - public static bool isFinite(Vector3 v) - { - if (v == null) - return false; - if (Single.IsInfinity(v.X) || Single.IsNaN(v.X)) - return false; - if (Single.IsInfinity(v.Y) || Single.IsNaN(v.Y)) - return false; - if (Single.IsInfinity(v.Z) || Single.IsNaN(v.Z)) - return false; - - return true; - } - - public virtual bool IsIdentical(Vector3 v, float tolerance) - { - PhysicsVector diff = this - v; - float d = diff.length(); - if (d <= tolerance) - return true; - - return false; - } - - }*/ -} diff --git a/OpenSim/Region/PhysicsModules/ubOde/ODECharacter.cs b/OpenSim/Region/PhysicsModules/ubOde/ODECharacter.cs index e556e5a758..53c6b63720 100644 --- a/OpenSim/Region/PhysicsModules/ubOde/ODECharacter.cs +++ b/OpenSim/Region/PhysicsModules/ubOde/ODECharacter.cs @@ -155,7 +155,7 @@ namespace OpenSim.Region.PhysicsModule.ubOde public int m_eventsubscription = 0; private int m_cureventsubscription = 0; - private readonly CollisionEventUpdate CollisionEventsThisFrame = new CollisionEventUpdate(); + private readonly CollisionEventUpdate CollisionEventsThisFrame = new(); private bool SentEmptyCollisionsEvent; public bool bad = false; @@ -602,9 +602,11 @@ namespace OpenSim.Region.PhysicsModule.ubOde if (size.Z < 0.01f) size.Z = 0.01f; - strAvatarSize st = new strAvatarSize(); - st.size = size; - st.offset = feetOffset; + strAvatarSize st = new() + { + size = size, + offset = feetOffset + }; AddChange(changes.AvatarSize, st); } else @@ -1085,7 +1087,7 @@ namespace OpenSim.Region.PhysicsModule.ubOde if (r > 1.0f) return false; - float dp = 1.0f - (float)Math.Sqrt(r); + float dp = 1.0f - MathF.Sqrt(r); if (dp > 0.05f) dp = 0.05f; @@ -1147,7 +1149,7 @@ namespace OpenSim.Region.PhysicsModule.ubOde float tdp = contact.depth; float t = offset.X; - t = Math.Abs(t); + t = MathF.Abs(t); if (t > 1e-6) { tdp /= t; @@ -1298,8 +1300,8 @@ namespace OpenSim.Region.PhysicsModule.ubOde float terrainheight = m_parent_scene.GetTerrainHeightAtXY(tmpX, tmpY); if (aabbminz < terrainheight) { - if (ctz.Z < 0) - ctz.Z = 0; + if (ctz.Z < 0f) + ctz.Z = 0f; if (!m_haveLastFallVel) { @@ -1317,9 +1319,9 @@ namespace OpenSim.Region.PhysicsModule.ubOde vec.Z += -vel.Z * PID_D; if (n.Z < 0.4f) { - vec.X = depth * PID_P * 50 - vel.X * PID_D; + vec.X = depth * PID_P * 50f - vel.X * PID_D; vec.X *= n.X; - vec.Y = depth * PID_P * 50 - vel.Y * PID_D; + vec.Y = depth * PID_P * 50f - vel.Y * PID_D; vec.Y *= n.Y; vec.Z *= n.Z; if (n.Z < 0.1f) @@ -1350,14 +1352,14 @@ namespace OpenSim.Region.PhysicsModule.ubOde m_iscollidingGround = true; - ContactPoint contact = new ContactPoint(); - contact.PenetrationDepth = depth; - contact.Position.X = _position.X; - contact.Position.Y = _position.Y; - contact.Position.Z = terrainheight; - contact.SurfaceNormal = -n; - contact.RelativeSpeed = Vector3.Dot(m_lastFallVel,n); - contact.CharacterFeet = true; + ContactPoint contact = new() + { + PenetrationDepth = depth, + Position = new( _position.X, _position.Y, terrainheight), + SurfaceNormal = -n, + RelativeSpeed = Vector3.Dot(m_lastFallVel, n), + CharacterFeet = true + }; AddCollisionEvent(0,contact); m_lastFallVel = vel; @@ -1412,7 +1414,7 @@ namespace OpenSim.Region.PhysicsModule.ubOde float fz = (m_targetHoverHeight - _position.Z); // if error is zero, use position control; otherwise, velocity control - if (Math.Abs(fz) < 0.01f) + if (MathF.Abs(fz) < 0.01f) { ctz.Z = 0; } @@ -1421,11 +1423,11 @@ namespace OpenSim.Region.PhysicsModule.ubOde _zeroFlag = false; fz /= m_PIDHoverTau; - float tmp = Math.Abs(fz); - if (tmp > 50) - fz = 50 * Math.Sign(fz); - else if (tmp < 0.1) - fz = 0.1f * Math.Sign(fz); + float tmp = MathF.Abs(fz); + if (tmp > 50f) + fz = 50f * MathF.Sign(fz); + else if (tmp < 0.1f) + fz = 0.1f * MathF.Sign(fz); ctz.Z = fz; } @@ -1444,14 +1446,14 @@ namespace OpenSim.Region.PhysicsModule.ubOde // movement relative to surface if moving on it // dont disturbe vertical movement, ie jumps - if (m_iscolliding && !m_flying && ctz.Z == 0 && m_collideNormal.Z > 0.2f && m_collideNormal.Z < 0.94f) + if (m_iscolliding && !m_flying && ctz.Z == 0f && m_collideNormal.Z > 0.2f && m_collideNormal.Z < 0.94f) { float p = ctz.X * m_collideNormal.X + ctz.Y * m_collideNormal.Y; - ctz.X *= (float)Math.Sqrt(1 - m_collideNormal.X * m_collideNormal.X); - ctz.Y *= (float)Math.Sqrt(1 - m_collideNormal.Y * m_collideNormal.Y); + ctz.X *= MathF.Sqrt(1 - m_collideNormal.X * m_collideNormal.X); + ctz.Y *= MathF.Sqrt(1 - m_collideNormal.Y * m_collideNormal.Y); ctz.Z -= p; - if (ctz.Z < 0) - ctz.Z *= 2; + if (ctz.Z < 0f) + ctz.Z *= 2f; } } @@ -1535,9 +1537,9 @@ namespace OpenSim.Region.PhysicsModule.ubOde { } - if (Math.Abs(ctz.X) > Math.Abs(vel.X)) + if (MathF.Abs(ctz.X) > MathF.Abs(vel.X)) vec.X += (ctz.X - vel.X) * PID_D; - if (Math.Abs(ctz.Y) > Math.Abs(vel.Y)) + if (MathF.Abs(ctz.Y) > MathF.Abs(vel.Y)) vec.Y += (ctz.Y - vel.Y) * PID_D; } } @@ -1642,22 +1644,22 @@ namespace OpenSim.Region.PhysicsModule.ubOde [MethodImpl(MethodImplOptions.AggressiveInlining)] public void round(ref Vector3 v, int digits) { - v.X = (float)Math.Round(v.X, digits); - v.Y = (float)Math.Round(v.Y, digits); - v.Z = (float)Math.Round(v.Z, digits); + v.X = MathF.Round(v.X, digits); + v.Y = MathF.Round(v.Y, digits); + v.Z = MathF.Round(v.Z, digits); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public void SetSmooth(ref Vector3 dst, ref Vector3 value, int rounddigits) { dst.X = 0.4f * dst.X + 0.6f * value.X; - dst.X = (float)Math.Round(dst.X, rounddigits); + dst.X = MathF.Round(dst.X, rounddigits); dst.Y = 0.4f * dst.Y + 0.6f * value.Y; - dst.Y = (float)Math.Round(dst.Y, rounddigits); + dst.Y = MathF.Round(dst.Y, rounddigits); dst.Z = 0.4f * dst.Z + 0.6f * value.Z; - dst.Z = (float)Math.Round(dst.Z, rounddigits); + dst.Z = MathF.Round(dst.Z, rounddigits); } /// @@ -1998,7 +2000,7 @@ namespace OpenSim.Region.PhysicsModule.ubOde float t = m_orientation2D.W * m_orientation2D.W + m_orientation2D.Z * m_orientation2D.Z; if (t > 0) { - t = 1.0f / (float)Math.Sqrt(t); + t = 1.0f / MathF.Sqrt(t); m_orientation2D.W *= t; m_orientation2D.Z *= t; } diff --git a/OpenSim/Region/PhysicsModules/ubOde/ODEDynamics.cs b/OpenSim/Region/PhysicsModules/ubOde/ODEDynamics.cs index 00a695c2be..f2ad0fa523 100644 --- a/OpenSim/Region/PhysicsModules/ubOde/ODEDynamics.cs +++ b/OpenSim/Region/PhysicsModules/ubOde/ODEDynamics.cs @@ -53,8 +53,8 @@ namespace OpenSim.Region.PhysicsModule.ubOde get { return m_type; } } - private OdePrim rootPrim; - private ODEScene _pParentScene; + private readonly OdePrim rootPrim; + private readonly ODEScene _pParentScene; // Vehicle properties // WARNING this are working copies for internel use @@ -77,27 +77,27 @@ namespace OpenSim.Region.PhysicsModule.ubOde // Linear properties private Vector3 m_linearMotorDirection = Vector3.Zero; // velocity requested by LSL, decayed by time - private Vector3 m_linearFrictionTimescale = new Vector3(1000, 1000, 1000); - private float m_linearMotorDecayTimescale = 120; - private float m_linearMotorTimescale = 1000; + private Vector3 m_linearFrictionTimescale = new(1000f, 1000f, 1000f); + private float m_linearMotorDecayTimescale = 120f; + private float m_linearMotorTimescale = 1000f; private Vector3 m_linearMotorOffset = Vector3.Zero; //Angular properties private Vector3 m_angularMotorDirection = Vector3.Zero; // angular velocity requested by LSL motor - private float m_angularMotorTimescale = 1000; // motor angular velocity ramp up rate - private float m_angularMotorDecayTimescale = 120; // motor angular velocity decay rate - private Vector3 m_angularFrictionTimescale = new Vector3(1000, 1000, 1000); // body angular velocity decay rate + private float m_angularMotorTimescale = 1000f; // motor angular velocity ramp up rate + private float m_angularMotorDecayTimescale = 120f; // motor angular velocity decay rate + private Vector3 m_angularFrictionTimescale = new(1000f, 1000f, 1000f); // body angular velocity decay rate //Deflection properties - private float m_angularDeflectionEfficiency = 0; - private float m_angularDeflectionTimescale = 1000; - private float m_linearDeflectionEfficiency = 0; - private float m_linearDeflectionTimescale = 1000; + private float m_angularDeflectionEfficiency = 0f; + private float m_angularDeflectionTimescale = 1000f; + private float m_linearDeflectionEfficiency = 0f; + private float m_linearDeflectionTimescale = 1000f; //Banking properties - private float m_bankingEfficiency = 0; - private float m_bankingMix = 0; - private float m_bankingTimescale = 1000; + private float m_bankingEfficiency = 0f; + private float m_bankingMix = 0f; + private float m_bankingTimescale = 1000f; //Hover and Buoyancy properties private float m_VhoverHeight = 0f; @@ -122,8 +122,8 @@ namespace OpenSim.Region.PhysicsModule.ubOde private float m_ffactor = 1.0f; - private float m_timestep = 0.02f; - private float m_invtimestep = 50; + private readonly float m_timestep = 0.02f; + private readonly float m_invtimestep = 50; float m_ampwr; @@ -687,10 +687,9 @@ namespace OpenSim.Region.PhysicsModule.ubOde return vec; } - private const float pi = (float)Math.PI; - private const float halfpi = 0.5f * (float)Math.PI; - private const float twopi = 2.0f * pi; - + private const float pi = MathF.PI; + private const float halfpi = 0.5f * MathF.PI; + public static Vector3 ubRot2Euler(Quaternion rot) { // returns roll in X @@ -707,28 +706,28 @@ namespace OpenSim.Region.PhysicsModule.ubOde { vec.X = 0; vec.Y = -halfpi; - vec.Z = (float)(-2d * Math.Atan(rot.X / rot.W)); + vec.Z = -2f * MathF.Atan(rot.X / rot.W); } else if (zX > 0.49999f) { vec.X = 0; vec.Y = halfpi; - vec.Z = (float)(2d * Math.Atan(rot.X / rot.W)); + vec.Z = 2f * MathF.Atan(rot.X / rot.W); } else { - vec.Y = (float)Math.Asin(2 * zX); + vec.Y = MathF.Asin(2 * zX); float sqw = rot.W * rot.W; float minuszY = rot.X * rot.W - rot.Y * rot.Z; float zZ = rot.Z * rot.Z + sqw - 0.5f; - vec.X = (float)Math.Atan2(minuszY, zZ); + vec.X = MathF.Atan2(minuszY, zZ); float yX = rot.Z * rot.W - rot.X * rot.Y; //( have negative ?) float yY = rot.X * rot.X + sqw - 0.5f; - vec.Z = (float)Math.Atan2(yX, yY); + vec.Z = MathF.Atan2(yX, yY); } return vec; } @@ -752,25 +751,23 @@ namespace OpenSim.Region.PhysicsModule.ubOde } else { - pitch = (float)Math.Asin(2 * zX); + pitch = MathF.Asin(2 * zX); float minuszY = rot.X * rot.W - rot.Y * rot.Z; float zZ = rot.Z * rot.Z + rot.W * rot.W - 0.5f; - roll = (float)Math.Atan2(minuszY, zZ); + roll = MathF.Atan2(minuszY, zZ); } - return ; } internal void Step() { IntPtr Body = rootPrim.Body; - SafeNativeMethods.Mass dmass; - SafeNativeMethods.BodyGetMass(Body, out dmass); + SafeNativeMethods.BodyGetMass(Body, out SafeNativeMethods.Mass dmass); SafeNativeMethods.Quaternion rot = SafeNativeMethods.BodyGetQuaternion(Body); - Quaternion objrotq = new Quaternion(rot.X, rot.Y, rot.Z, rot.W); // rotq = rotation of object + Quaternion objrotq = new(rot.X, rot.Y, rot.Z, rot.W); // rotq = rotation of object Quaternion rotq = objrotq; // rotq = rotation of object rotq *= m_referenceFrame; // rotq is now rotation in vehicle reference frame Quaternion irotq = Quaternion.Inverse(rotq); @@ -781,7 +778,7 @@ namespace OpenSim.Region.PhysicsModule.ubOde Vector3 curAngVel; // angular velocity in world Vector3 force = Vector3.Zero; // actually linear aceleration until mult by mass in world frame Vector3 torque = Vector3.Zero;// actually angular aceleration until mult by Inertia in vehicle frame - SafeNativeMethods.Vector3 dtorque = new SafeNativeMethods.Vector3(); + SafeNativeMethods.Vector3 dtorque = new(); dvtmp = SafeNativeMethods.BodyGetLinearVel(Body); curVel.X = dvtmp.X; @@ -946,7 +943,7 @@ namespace OpenSim.Region.PhysicsModule.ubOde tmpV.Z = -curLocalVel.Z / m_linearFrictionTimescale.Z; tmpV *= rotq; // to world - if(ldampZ != 0 && Math.Abs(ldampZ) > Math.Abs(tmpV.Z)) + if(ldampZ != 0 && MathF.Abs(ldampZ) > MathF.Abs(tmpV.Z)) tmpV.Z = ldampZ; force.X += tmpV.X; force.Y += tmpV.Y; @@ -956,18 +953,14 @@ namespace OpenSim.Region.PhysicsModule.ubOde // vertical atractor if (verticalAttractionTimescale < 300) { - float roll; - float pitch; - float ftmp = m_invtimestep / verticalAttractionTimescale / verticalAttractionTimescale; + float ftmp2 = 0.5f * m_verticalAttractionEfficiency * m_invtimestep; - float ftmp2; - ftmp2 = 0.5f * m_verticalAttractionEfficiency * m_invtimestep; m_amdampX = ftmp2; m_ampwr = 1.0f - 0.8f * m_verticalAttractionEfficiency; - GetRollPitch(irotq, out roll, out pitch); + GetRollPitch(irotq, out float roll, out float pitch); if (roll > halfpi) roll = pi - roll; @@ -991,7 +984,7 @@ namespace OpenSim.Region.PhysicsModule.ubOde torque.Y += effpitch * ftmp; } - if (bankingEfficiency != 0 && Math.Abs(effroll) > 0.01) + if (bankingEfficiency != 0 && MathF.Abs(effroll) > 0.01f) { float broll = effroll; @@ -1004,7 +997,7 @@ namespace OpenSim.Region.PhysicsModule.ubOde broll *= m_bankingEfficiency; if (m_bankingMix != 0) { - float vfact = Math.Abs(curLocalVel.X) / 10.0f; + float vfact = MathF.Abs(curLocalVel.X) / 10.0f; if (vfact > 1.0f) vfact = 1.0f; if (curLocalVel.X >= 0) @@ -1014,7 +1007,7 @@ namespace OpenSim.Region.PhysicsModule.ubOde } // make z rot be in world Z not local as seems to be in sl - broll = broll / m_bankingTimescale; + broll /= m_bankingTimescale; tmpV = Zrot(irotq); @@ -1024,7 +1017,7 @@ namespace OpenSim.Region.PhysicsModule.ubOde torque.Y += tmpV.Y; torque.Z += tmpV.Z; - m_amdampZ = Math.Abs(m_bankingEfficiency) / m_bankingTimescale; + m_amdampZ = MathF.Abs(m_bankingEfficiency) / m_bankingTimescale; m_amdampY = m_amdampZ; } @@ -1053,12 +1046,12 @@ namespace OpenSim.Region.PhysicsModule.ubOde float tmp; // get out of x == 0 plane - if(Math.Abs(dirv.X) < 0.001f) + if(MathF.Abs(dirv.X) < 0.001f) dirv.X = 0.001f; - if (Math.Abs(dirv.Z) > 0.01) + if (MathF.Abs(dirv.Z) > 0.01f) { - tmp = -(float)Math.Atan2(dirv.Z, dirv.X) * m_angularMotorDirection.Y; + tmp = -MathF.Atan2(dirv.Z, dirv.X) * m_angularMotorDirection.Y; if(tmp < -4f) tmp = -4f; else if(tmp > 4f) @@ -1069,11 +1062,11 @@ namespace OpenSim.Region.PhysicsModule.ubOde else torque.Y -= curLocalAngVel.Y * m_invtimestep; - if (Math.Abs(dirv.Y) > 0.01) + if (MathF.Abs(dirv.Y) > 0.01f) { if(mousemodebank) { - tmp = -(float)Math.Atan2(dirv.Y, dirv.X) * m_angularMotorDirection.X; + tmp = -MathF.Atan2(dirv.Y, dirv.X) * m_angularMotorDirection.X; if(tmp < -4f) tmp = -4f; else if(tmp > 4f) @@ -1082,7 +1075,7 @@ namespace OpenSim.Region.PhysicsModule.ubOde } else { - tmp = (float)Math.Atan2(dirv.Y, dirv.X) * m_angularMotorDirection.Z; + tmp = MathF.Atan2(dirv.Y, dirv.X) * m_angularMotorDirection.Z; tmp *= invamts; if(tmp < -4f) tmp = -4f; @@ -1147,14 +1140,14 @@ namespace OpenSim.Region.PhysicsModule.ubOde float ftmp = m_angularDeflectionEfficiency / m_angularDeflectionTimescale; - if (Math.Abs(dirv.Z) > 0.01) + if (MathF.Abs(dirv.Z) > 0.01f) { - torque.Y += - (float)Math.Atan2(dirv.Z, dirv.X) * ftmp; + torque.Y -= MathF.Atan2(dirv.Z, dirv.X) * ftmp; } - if (Math.Abs(dirv.Y) > 0.01) + if (MathF.Abs(dirv.Y) > 0.01f) { - torque.Z += (float)Math.Atan2(dirv.Y, dirv.X) * ftmp; + torque.Z += MathF.Atan2(dirv.Y, dirv.X) * ftmp; } } diff --git a/OpenSim/Region/PhysicsModules/ubOde/ODEPrim.cs b/OpenSim/Region/PhysicsModules/ubOde/ODEPrim.cs index ec4a7a8300..bc62d2f90b 100644 --- a/OpenSim/Region/PhysicsModules/ubOde/ODEPrim.cs +++ b/OpenSim/Region/PhysicsModules/ubOde/ODEPrim.cs @@ -90,7 +90,7 @@ namespace OpenSim.Region.PhysicsModule.ubOde private float m_targetHoverHeight; private float m_buoyancy; //KF: m_buoyancy should be set by llSetBuoyancy() for non-vehicle. - private int m_body_autodisable_frames; + private readonly int m_body_autodisable_frames; public int m_bodydisablecontrol = 0; private float m_gravmod = 1.0f; @@ -117,7 +117,7 @@ namespace OpenSim.Region.PhysicsModule.ubOde public bool m_disabled; private IMesh m_mesh; - private readonly object m_meshlock = new object(); + private readonly object m_meshlock = new(); private PrimitiveBaseShape m_pbs; private UUID? m_assetID; @@ -134,7 +134,7 @@ namespace OpenSim.Region.PhysicsModule.ubOde private PhysicsActor _parent; - private List childrenPrim = new List(); + private readonly List childrenPrim = new(); public float m_collisionscore; private int m_colliderfilter = 0; @@ -478,8 +478,10 @@ namespace OpenSim.Region.PhysicsModule.ubOde return _parent.GetInertiaData(); else { - inertia = new PhysicsInertiaData(); - inertia.TotalMass = -1; + inertia = new PhysicsInertiaData + { + TotalMass = -1 + }; return inertia; } } @@ -489,16 +491,16 @@ namespace OpenSim.Region.PhysicsModule.ubOde // double buffering if(m_fakeInertiaOverride != null) { - SafeNativeMethods.Mass objdmass = new SafeNativeMethods.Mass(); + SafeNativeMethods.Mass objdmass = new(); objdmass.I.M00 = m_fakeInertiaOverride.Inertia.X; objdmass.I.M11 = m_fakeInertiaOverride.Inertia.Y; objdmass.I.M22 = m_fakeInertiaOverride.Inertia.Z; objdmass.mass = m_fakeInertiaOverride.TotalMass; - if(Math.Abs(m_fakeInertiaOverride.InertiaRotation.W) < 0.999) + if(MathF.Abs(m_fakeInertiaOverride.InertiaRotation.W) < 0.999) { - SafeNativeMethods.Matrix3 inertiarotmat = new SafeNativeMethods.Matrix3(); + SafeNativeMethods.Matrix3 inertiarotmat = new(); SafeNativeMethods.RfromQ(ref inertiarotmat, ref m_fakeInertiaOverride.InertiaRotation); SafeNativeMethods.MassRotate(ref objdmass, ref inertiarotmat); } @@ -525,7 +527,7 @@ namespace OpenSim.Region.PhysicsModule.ubOde } SafeNativeMethods.Vector3 dtmp; - SafeNativeMethods.Mass m = new SafeNativeMethods.Mass(); + SafeNativeMethods.Mass m = new(); lock(m_parentScene.OdeLock) { SafeNativeMethods.AllocateODEDataForThread(0); @@ -533,10 +535,10 @@ namespace OpenSim.Region.PhysicsModule.ubOde SafeNativeMethods.BodyGetMass(Body, out m); } - Vector3 cm = new Vector3(-dtmp.X, -dtmp.Y, -dtmp.Z); + Vector3 cm = new(-dtmp.X, -dtmp.Y, -dtmp.Z); inertia.CenterOfMass = cm; - inertia.Inertia = new Vector3(m.I.M00, m.I.M11, m.I.M22); - inertia.InertiaRotation = new Vector4(m.I.M01, m.I.M02 , m.I.M12, 0); + inertia.Inertia = new(m.I.M00, m.I.M11, m.I.M22); + inertia.InertiaRotation = new(m.I.M01, m.I.M02 , m.I.M12, 0); return inertia; } @@ -576,7 +578,7 @@ namespace OpenSim.Region.PhysicsModule.ubOde { Vector3 Ptot = SafeNativeMethods.GeomGetPositionOMV(m_prim_geom); Quaternion q = SafeNativeMethods.GeomGetQuaternionOMV(m_prim_geom); - Ptot = Ptot + m_OBBOffset * q; + Ptot += m_OBBOffset * q; return Ptot; /* float tmass = _mass; @@ -901,36 +903,44 @@ namespace OpenSim.Region.PhysicsModule.ubOde [MethodImpl(MethodImplOptions.AggressiveInlining)] public override void VehicleFloatParam(int param, float value) { - strVehicleFloatParam fp = new strVehicleFloatParam(); - fp.param = param; - fp.value = value; + strVehicleFloatParam fp = new() + { + param = param, + value = value + }; AddChange(changes.VehicleFloatParam, fp); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public override void VehicleVectorParam(int param, Vector3 value) { - strVehicleVectorParam fp = new strVehicleVectorParam(); - fp.param = param; - fp.value = value; + strVehicleVectorParam fp = new() + { + param = param, + value = value + }; AddChange(changes.VehicleVectorParam, fp); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public override void VehicleRotationParam(int param, Quaternion value) { - strVehicleQuatParam fp = new strVehicleQuatParam(); - fp.param = param; - fp.value = value; + strVehicleQuatParam fp = new() + { + param = param, + value = value + }; AddChange(changes.VehicleRotationParam, fp); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public override void VehicleFlags(int param, bool value) { - strVehicleBoolParam bp = new strVehicleBoolParam(); - bp.param = param; - bp.value = value; + strVehicleBoolParam bp = new() + { + param = param, + value = value + }; AddChange(changes.VehicleFlags, bp); } @@ -1148,10 +1158,8 @@ namespace OpenSim.Region.PhysicsModule.ubOde { m_eventsubscription = ms; m_cureventsubscription = 0; - if (CollisionEvents == null) - CollisionEvents = new CollisionEventUpdate(); - if (CollisionVDTCEvents == null) - CollisionVDTCEvents = new CollisionEventUpdate(); + CollisionEvents ??= new CollisionEventUpdate(); + CollisionVDTCEvents ??= new CollisionEventUpdate(); SentEmptyCollisionsEvent = false; } @@ -1175,8 +1183,7 @@ namespace OpenSim.Region.PhysicsModule.ubOde [MethodImpl(MethodImplOptions.AggressiveInlining)] public override void AddCollisionEvent(uint CollidedWith, ContactPoint contact) { - if (CollisionEvents == null) - CollisionEvents = new CollisionEventUpdate(); + CollisionEvents ??= new CollisionEventUpdate(); CollisionEvents.AddCollider(CollidedWith, contact); m_parentScene.AddCollisionEventReporting(this); @@ -1185,8 +1192,7 @@ namespace OpenSim.Region.PhysicsModule.ubOde [MethodImpl(MethodImplOptions.AggressiveInlining)] public override void AddVDTCCollisionEvent(uint CollidedWith, ContactPoint contact) { - if (CollisionVDTCEvents == null) - CollisionVDTCEvents = new CollisionEventUpdate(); + CollisionVDTCEvents ??= new CollisionEventUpdate(); CollisionVDTCEvents.AddCollider(CollidedWith, contact); m_parentScene.AddCollisionEventReporting(this); @@ -1324,7 +1330,7 @@ namespace OpenSim.Region.PhysicsModule.ubOde m_targetSpace = IntPtr.Zero; - m_isphysical = pos.Z < Constants.MinSimulationHeight || pos.Z > Constants.MaxSimulationHeight ? false : pisPhysical; + m_isphysical = pos.Z >= Constants.MinSimulationHeight && pos.Z <= Constants.MaxSimulationHeight && pisPhysical; m_fakeisphysical = m_isphysical; m_isVolumeDetect = false; @@ -1652,17 +1658,12 @@ namespace OpenSim.Region.PhysicsModule.ubOde private bool GetMeshGeom() { - IntPtr vertices, indices; - int vertexCount, indexCount; - int vertexStride, triStride; - IMesh mesh = m_mesh; - - if (mesh == null) + if (mesh is null) return false; - mesh.getVertexListAsPtrToFloatArray(out vertices, out vertexStride, out vertexCount); - mesh.getIndexListAsPtrToIntArray(out indices, out triStride, out indexCount); + mesh.getVertexListAsPtrToFloatArray(out IntPtr vertices, out int vertexStride, out int vertexCount); + mesh.getIndexListAsPtrToIntArray(out IntPtr indices, out int triStride, out int indexCount); if (vertexCount == 0 || indexCount == 0) { @@ -1756,7 +1757,7 @@ namespace OpenSim.Region.PhysicsModule.ubOde if (!hasMesh) { - IntPtr geo = IntPtr.Zero; + IntPtr geo; if (m_pbs.ProfileShape == ProfileShape.HalfCircle && m_pbs.PathCurve == (byte)Extrusion.Curve1 && m_size.X == m_size.Y && m_size.Y == m_size.Z) @@ -1911,11 +1912,11 @@ namespace OpenSim.Region.PhysicsModule.ubOde Body = SafeNativeMethods.BodyCreate(m_parentScene.world); // set the body rotation - SafeNativeMethods.Matrix3 mymat = new SafeNativeMethods.Matrix3(); + SafeNativeMethods.Matrix3 mymat = new(); SafeNativeMethods.RfromQ(ref mymat, ref m_orientation); SafeNativeMethods.BodySetRotation(Body, ref mymat); - SafeNativeMethods.Mass objdmass = new SafeNativeMethods.Mass { }; + SafeNativeMethods.Mass objdmass = new(); if (noInertiaOverride) @@ -1927,8 +1928,8 @@ namespace OpenSim.Region.PhysicsModule.ubOde // recompute full object inertia if needed if (childrenPrim.Count > 0) { - SafeNativeMethods.Matrix3 mat = new SafeNativeMethods.Matrix3(); - SafeNativeMethods.Mass tmpdmass = new SafeNativeMethods.Mass { }; + SafeNativeMethods.Matrix3 mat = new(); + SafeNativeMethods.Mass tmpdmass; Vector3 rcm; rcm = m_position; @@ -2017,9 +2018,9 @@ namespace OpenSim.Region.PhysicsModule.ubOde objdmass.mass = m_InertiaOverride.TotalMass; - if(Math.Abs(m_InertiaOverride.InertiaRotation.W) < 0.999) + if(MathF.Abs(m_InertiaOverride.InertiaRotation.W) < 0.999f) { - SafeNativeMethods.Matrix3 inertiarotmat = new SafeNativeMethods.Matrix3(); + SafeNativeMethods.Matrix3 inertiarotmat = new(); SafeNativeMethods.RfromQ(ref inertiarotmat, ref m_InertiaOverride.InertiaRotation); SafeNativeMethods.MassRotate(ref objdmass, ref inertiarotmat); } @@ -2233,14 +2234,8 @@ namespace OpenSim.Region.PhysicsModule.ubOde private void FixInertia(Vector3 NewPos,Quaternion newrot) { - SafeNativeMethods.Matrix3 mat = new SafeNativeMethods.Matrix3(); - SafeNativeMethods.Quaternion quat = new SafeNativeMethods.Quaternion(); - - SafeNativeMethods.Mass tmpdmass = new SafeNativeMethods.Mass { }; - SafeNativeMethods.Mass objdmass = new SafeNativeMethods.Mass { }; - - SafeNativeMethods.BodyGetMass(Body, out tmpdmass); - objdmass = tmpdmass; + SafeNativeMethods.BodyGetMass(Body, out SafeNativeMethods.Mass tmpdmass); + SafeNativeMethods.Mass objdmass = tmpdmass; SafeNativeMethods.Vector3 dobjpos; SafeNativeMethods.Vector3 thispos; @@ -2252,7 +2247,7 @@ namespace OpenSim.Region.PhysicsModule.ubOde tmpdmass = primdMass; // transform to object frame - mat = SafeNativeMethods.GeomGetOffsetRotation(m_prim_geom); + SafeNativeMethods.Matrix3 mat = SafeNativeMethods.GeomGetOffsetRotation(m_prim_geom); SafeNativeMethods.MassRotate(ref tmpdmass, ref mat); thispos = SafeNativeMethods.GeomGetOffsetPosition(m_prim_geom); @@ -2271,10 +2266,13 @@ namespace OpenSim.Region.PhysicsModule.ubOde m_position = NewPos; SafeNativeMethods.GeomSetOffsetWorldPosition(m_prim_geom, NewPos.X, NewPos.Y, NewPos.Z); m_orientation = newrot; - quat.X = newrot.X; - quat.Y = newrot.Y; - quat.Z = newrot.Z; - quat.W = newrot.W; + SafeNativeMethods.Quaternion quat = new() + { + X = newrot.X, + Y = newrot.Y, + Z = newrot.Z, + W = newrot.W + }; SafeNativeMethods.GeomSetOffsetWorldQuaternion(m_prim_geom, ref quat); mat = SafeNativeMethods.GeomGetOffsetRotation(m_prim_geom); @@ -2309,15 +2307,14 @@ namespace OpenSim.Region.PhysicsModule.ubOde private void FixInertia(Vector3 NewPos) { - SafeNativeMethods.Matrix3 primmat = new SafeNativeMethods.Matrix3(); - SafeNativeMethods.Mass tmpdmass = new SafeNativeMethods.Mass { }; - SafeNativeMethods.Mass objdmass = new SafeNativeMethods.Mass { }; - SafeNativeMethods.Mass primmass = new SafeNativeMethods.Mass { }; + SafeNativeMethods.Matrix3 primmat; + SafeNativeMethods.Mass tmpdmass; + SafeNativeMethods.Mass primmass; SafeNativeMethods.Vector3 dobjpos; SafeNativeMethods.Vector3 thispos; - SafeNativeMethods.BodyGetMass(Body, out objdmass); + SafeNativeMethods.BodyGetMass(Body, out SafeNativeMethods.Mass objdmass); // get prim own inertia in its local frame primmass = primdMass; @@ -2373,18 +2370,16 @@ namespace OpenSim.Region.PhysicsModule.ubOde private void FixInertia(Quaternion newrot) { - SafeNativeMethods.Matrix3 mat = new SafeNativeMethods.Matrix3(); - SafeNativeMethods.Quaternion quat = new SafeNativeMethods.Quaternion(); + SafeNativeMethods.Matrix3 mat; + SafeNativeMethods.Quaternion quat = new(); - SafeNativeMethods.Mass tmpdmass = new SafeNativeMethods.Mass { }; - SafeNativeMethods.Mass objdmass = new SafeNativeMethods.Mass { }; SafeNativeMethods.Vector3 dobjpos; SafeNativeMethods.Vector3 thispos; - SafeNativeMethods.BodyGetMass(Body, out objdmass); + SafeNativeMethods.BodyGetMass(Body, out SafeNativeMethods.Mass objdmass); // get prim own inertia in its local frame - tmpdmass = primdMass; + SafeNativeMethods.Mass tmpdmass = primdMass; mat = SafeNativeMethods.GeomGetOffsetRotation(m_prim_geom); SafeNativeMethods.MassRotate(ref tmpdmass, ref mat); // transform to object frame @@ -2957,7 +2952,7 @@ namespace OpenSim.Region.PhysicsModule.ubOde { if (newOri.NotEqual(m_orientation)) { - SafeNativeMethods.Quaternion myrot = new SafeNativeMethods.Quaternion() + SafeNativeMethods.Quaternion myrot = new() { X = newOri.X, Y = newOri.Y, @@ -2987,7 +2982,7 @@ namespace OpenSim.Region.PhysicsModule.ubOde { if (newOri.NotEqual(m_orientation)) { - SafeNativeMethods.Quaternion myrot = new SafeNativeMethods.Quaternion() + SafeNativeMethods.Quaternion myrot = new() { X = newOri.X, Y = newOri.Y, @@ -3020,7 +3015,7 @@ namespace OpenSim.Region.PhysicsModule.ubOde { if (newOri.NotEqual(m_orientation)) { - SafeNativeMethods.Quaternion myrot = new SafeNativeMethods.Quaternion() + SafeNativeMethods.Quaternion myrot = new() { X = newOri.X, Y = newOri.Y, @@ -3054,7 +3049,7 @@ namespace OpenSim.Region.PhysicsModule.ubOde { if (newOri.NotEqual(m_orientation)) { - SafeNativeMethods.Quaternion myrot = new SafeNativeMethods.Quaternion() + SafeNativeMethods.Quaternion myrot = new() { X = newOri.X, Y = newOri.Y, @@ -3157,11 +3152,13 @@ namespace OpenSim.Region.PhysicsModule.ubOde if (m_prim_geom != IntPtr.Zero) { SafeNativeMethods.GeomSetPosition(m_prim_geom, m_position.X, m_position.Y, m_position.Z); - SafeNativeMethods.Quaternion myrot = new SafeNativeMethods.Quaternion(); - myrot.X = m_orientation.X; - myrot.Y = m_orientation.Y; - myrot.Z = m_orientation.Z; - myrot.W = m_orientation.W; + SafeNativeMethods.Quaternion myrot = new() + { + X = m_orientation.X, + Y = m_orientation.Y, + Z = m_orientation.Z, + W = m_orientation.W + }; SafeNativeMethods.GeomSetQuaternion(m_prim_geom, ref myrot); } @@ -3234,11 +3231,13 @@ namespace OpenSim.Region.PhysicsModule.ubOde if (m_prim_geom != IntPtr.Zero) { SafeNativeMethods.GeomSetPosition(m_prim_geom, m_position.X, m_position.Y, m_position.Z); - SafeNativeMethods.Quaternion myrot = new SafeNativeMethods.Quaternion(); - myrot.X = m_orientation.X; - myrot.Y = m_orientation.Y; - myrot.Z = m_orientation.Z; - myrot.W = m_orientation.W; + SafeNativeMethods.Quaternion myrot = new() + { + X = m_orientation.X, + Y = m_orientation.Y, + Z = m_orientation.Z, + W = m_orientation.W + }; SafeNativeMethods.GeomSetQuaternion(m_prim_geom, ref myrot); } @@ -3367,7 +3366,7 @@ namespace OpenSim.Region.PhysicsModule.ubOde float len = newVel.LengthSquared(); if (len > 100000.0f) // limit to 100m/s { - len = 100.0f / (float)Math.Sqrt(len); + len = 100.0f / MathF.Sqrt(len); newVel *= len; } @@ -3395,7 +3394,7 @@ namespace OpenSim.Region.PhysicsModule.ubOde float len = newAngVel.LengthSquared(); if (len > m_parentScene.maxAngVelocitySQ) { - len = m_parentScene.maximumAngularVelocity / (float)Math.Sqrt(len); + len = m_parentScene.maximumAngularVelocity / MathF.Sqrt(len); newAngVel *= len; } @@ -3456,8 +3455,7 @@ namespace OpenSim.Region.PhysicsModule.ubOde [MethodImpl(MethodImplOptions.AggressiveInlining)] public void changeSetVehicle(VehicleData vdata) { - if (m_vehicle == null) - m_vehicle = new ODEDynamics(this); + m_vehicle ??= new ODEDynamics(this); m_vehicle.DoSetVehicle(vdata); } @@ -3471,8 +3469,7 @@ namespace OpenSim.Region.PhysicsModule.ubOde } else { - if (m_vehicle == null) - m_vehicle = new ODEDynamics(this); + m_vehicle ??= new ODEDynamics(this); m_vehicle.ProcessTypeChange((Vehicle)value); } @@ -3742,7 +3739,7 @@ namespace OpenSim.Region.PhysicsModule.ubOde fz = (m_targetHoverHeight - lpos.Z); // if error is zero, use position control; otherwise, velocity control - if (Math.Abs(fz) < 0.01f) + if (MathF.Abs(fz) < 0.01f) { SafeNativeMethods.BodySetPosition(Body, lpos.X, lpos.Y, m_targetHoverHeight); SafeNativeMethods.BodySetLinearVel(Body, vel.X, vel.Y, 0); @@ -3911,13 +3908,13 @@ namespace OpenSim.Region.PhysicsModule.ubOde angerror = 0.0005f; } - if ( - (Math.Abs(m_position.X - lpos.X) < poserror) - && (Math.Abs(m_position.Y - lpos.Y) < poserror) - && (Math.Abs(m_position.Z - lpos.Z) < poserror) - && (Math.Abs(m_orientation.X - ori.X) < angerror) - && (Math.Abs(m_orientation.Y - ori.Y) < angerror) - && (Math.Abs(m_orientation.Z - ori.Z) < angerror) // ignore W + if ( + (MathF.Abs(m_position.X - lpos.X) < poserror) + && (MathF.Abs(m_position.Y - lpos.Y) < poserror) + && (MathF.Abs(m_position.Z - lpos.Z) < poserror) + && (MathF.Abs(m_orientation.X - ori.X) < angerror) + && (MathF.Abs(m_orientation.Y - ori.Y) < angerror) + && (MathF.Abs(m_orientation.Z - ori.Z) < angerror) // ignore W ) _zeroFlag = true; else @@ -3943,14 +3940,11 @@ namespace OpenSim.Region.PhysicsModule.ubOde { Vector3 vel = SafeNativeMethods.BodyGetLinearVelOMV(Body); m_acceleration = _velocity; - - if ((Math.Abs(vel.X) < 0.005f) && - (Math.Abs(vel.Y) < 0.005f) && - (Math.Abs(vel.Z) < 0.005f)) + if (vel.ApproxZero(0.005f)) { _velocity = Vector3.Zero; float t = -m_sceneInverseTimeStep; - m_acceleration = m_acceleration * t; + m_acceleration *= t; } else { @@ -3958,18 +3952,13 @@ namespace OpenSim.Region.PhysicsModule.ubOde m_acceleration = (_velocity - m_acceleration) * m_sceneInverseTimeStep; } - if ((Math.Abs(m_acceleration.X) < 0.01f) && - (Math.Abs(m_acceleration.Y) < 0.01f) && - (Math.Abs(m_acceleration.Z) < 0.01f)) + if (m_acceleration.ApproxZero(0.01f)) { m_acceleration = Vector3.Zero; } vel = SafeNativeMethods.BodyGetAngularVelOMV(Body); - if ((Math.Abs(vel.X) < 0.0001) && - (Math.Abs(vel.Y) < 0.0001) && - (Math.Abs(vel.Z) < 0.0001) - ) + if (vel.ApproxZero(0.0001f)) { m_rotationalVelocity = Vector3.Zero; } diff --git a/OpenSim/Region/PhysicsModules/ubOde/ODEScene.cs b/OpenSim/Region/PhysicsModules/ubOde/ODEScene.cs index 86429b5870..ef83c0a69a 100644 --- a/OpenSim/Region/PhysicsModules/ubOde/ODEScene.cs +++ b/OpenSim/Region/PhysicsModules/ubOde/ODEScene.cs @@ -177,8 +177,8 @@ namespace OpenSim.Region.PhysicsModule.ubOde const float commonContactCFM = 0.0001f; const float commomContactSLIP = 0f; - float TerrainBounce = 0.001f; - float TerrainFriction = 0.3f; + readonly float TerrainBounce = 0.001f; + readonly float TerrainFriction = 0.3f; public float AvatarFriction = 0;// 0.9f * 0.5f; @@ -223,33 +223,33 @@ namespace OpenSim.Region.PhysicsModule.ubOde private SafeNativeMethods.NearCallback NearCallback; - private readonly Dictionary _prims = new Dictionary(); - private readonly HashSet _characters = new HashSet(); - private readonly HashSet _activeprims = new HashSet(); - private readonly HashSet _activegroups = new HashSet(); + private readonly Dictionary _prims = new(); + private readonly HashSet _characters = new(); + private readonly HashSet _activeprims = new(); + private readonly HashSet _activegroups = new(); public List _charactersList; - public readonly ConcurrentQueue ChangesQueue = new ConcurrentQueue(); + public readonly ConcurrentQueue ChangesQueue = new(); /// /// A list of actors that should receive collision events. /// - private readonly List _collisionEventPrim = new List(); - private readonly List _collisionEventPrimRemove = new List(); + private readonly Dictionary _collisionEventPrim = new(); + private readonly List _collisionEventPrimRemove = new(); - private readonly List _badCharacter = new List(); - public readonly Dictionary actor_name_map = new Dictionary(); + private readonly List _badCharacter = new(); + public readonly Dictionary actor_name_map = new(); - private float contactsurfacelayer = 0.002f; + private readonly float contactsurfacelayer = 0.002f; - private int contactsPerCollision = 80; + private readonly int contactsPerCollision = 80; internal IntPtr ContactgeomsArray = IntPtr.Zero; internal SafeNativeMethods.ContactGeom[] m_contacts; internal GCHandle m_contactsHandler; private IntPtr GlobalContactsArray; - private SafeNativeMethods.Contact contactSharedForJoints = new SafeNativeMethods.Contact(); + private SafeNativeMethods.Contact contactSharedForJoints = new(); const int maxContactJoints = 6000; private volatile int ContactJointCount = 0; @@ -260,12 +260,12 @@ namespace OpenSim.Region.PhysicsModule.ubOde public IntPtr TerrainGeom; private float[] m_terrainHeights; - private GCHandle m_terrainHeightsHandler = new GCHandle(); + private GCHandle m_terrainHeightsHandler = new(); private IntPtr HeightmapData; private int m_lastRegionWidth; private int m_lastRegionHeight; - private int m_physicsiterations = 15; + private readonly int m_physicsiterations = 15; private const float m_SkipFramesAtms = 0.40f; // Drop frames gracefully at a 400 ms lag //private PhysicsActor PANull = new NullPhysicsActor(); private float step_time = 0.0f; @@ -282,13 +282,13 @@ namespace OpenSim.Region.PhysicsModule.ubOde public IntPtr ActiveSpace; // space for active prims public IntPtr StaticSpace; // space for the static things around - public readonly object OdeLock = new object(); - public static readonly object SimulationLock = new object(); + public readonly object OdeLock = new(); + public static readonly object SimulationLock = new(); public IMesher mesher; public IConfigSource m_config; - public Vector2 WorldExtents = new Vector2((int)Constants.RegionSize, (int)Constants.RegionSize); + public Vector2 WorldExtents = new((int)Constants.RegionSize, (int)Constants.RegionSize); private ODERayCastRequestManager m_rayCastManager; public ODEMeshWorker m_meshWorker; @@ -362,7 +362,7 @@ namespace OpenSim.Region.PhysicsModule.ubOde ActiveSpace = SafeNativeMethods.SimpleSpaceCreate(TopSpace); float sx = m_regionWidth + 16; float sy = m_regionHeight + 16; - SafeNativeMethods.Vector3 px = new SafeNativeMethods.Vector3(sx * 0.5f, sy * 0.5f, 0); + SafeNativeMethods.Vector3 px = new(sx * 0.5f, sy * 0.5f, 0); if (sx < sy) sx = sy; int dp = Util.intLog2((uint)sx); @@ -546,12 +546,12 @@ namespace OpenSim.Region.PhysicsModule.ubOde contactSharedForJoints.geom.pos = contactGeom.pos; contactSharedForJoints.geom.normal = contactGeom.normal; - IntPtr contact = new IntPtr(GlobalContactsArray.ToInt64() + (Int64)(ContactJointCount * SafeNativeMethods.Contact.unmanagedSizeOf)); + IntPtr contact = new(GlobalContactsArray.ToInt64() + (Int64)(ContactJointCount * SafeNativeMethods.Contact.unmanagedSizeOf)); Marshal.StructureToPtr(contactSharedForJoints, contact, false); return SafeNativeMethods.JointCreateContactPtr(world, JointContactGroup, contact); } - SafeNativeMethods.ContactGeom altWorkContact = new SafeNativeMethods.ContactGeom(); + SafeNativeMethods.ContactGeom altWorkContact = new(); /// /// This is our near callback. A geometry is near a body @@ -635,7 +635,7 @@ namespace OpenSim.Region.PhysicsModule.ubOde // do volume detection case if ((p1.IsVolumeDtc || p2.IsVolumeDtc)) { - ContactPoint volDepthContact = new ContactPoint( + ContactPoint volDepthContact = new( new Vector3(m_contacts[0].pos.X, m_contacts[0].pos.Y, m_contacts[0].pos.Z), new Vector3(m_contacts[0].normal.X, m_contacts[0].normal.Y, m_contacts[0].normal.Z), m_contacts[0].depth, false @@ -650,8 +650,8 @@ namespace OpenSim.Region.PhysicsModule.ubOde float bounce = 0; //bool IgnoreNegSides = false; - ContactData contactdata1 = new ContactData(0, 0, false); - ContactData contactdata2 = new ContactData(0, 0, false); + ContactData contactdata1 = new(0, 0, false); + ContactData contactdata2 = new(0, 0, false); bool dop1ava = false; bool dop2ava = false; @@ -760,7 +760,7 @@ namespace OpenSim.Region.PhysicsModule.ubOde bool FeetCollision = false; int ncontacts = 0; - ContactPoint maxDepthContact = new ContactPoint(); + ContactPoint maxDepthContact = new(); float minDepth = float.MaxValue; float maxDepth = float.MinValue; @@ -879,16 +879,11 @@ namespace OpenSim.Region.PhysicsModule.ubOde if (count == 0) return; - // get first contact - - ContactData contactdata1 = new ContactData(0, 0, false); - ContactData contactdata2 = new ContactData(0, 0, false); - IntPtr Joint; bool FeetCollision = false; int ncontacts = 0; - ContactPoint maxDepthContact = new ContactPoint(); + ContactPoint maxDepthContact = new(); float minDepth = float.MaxValue; float maxDepth = float.MinValue; @@ -946,7 +941,6 @@ namespace OpenSim.Region.PhysicsModule.ubOde private void collision_accounting_events(PhysicsActor p1, PhysicsActor p2, ContactPoint contact) { - uint obj2LocalID = 0; // update actors collision score if (p1.CollisionScore < float.MaxValue) @@ -974,6 +968,8 @@ namespace OpenSim.Region.PhysicsModule.ubOde contact.RelativeSpeed = Vector3.Dot(vel, contact.SurfaceNormal); + uint obj2LocalID; + switch ((ActorTypes)p1.PhysicsActorType) { case ActorTypes.Agent: @@ -1185,8 +1181,7 @@ namespace OpenSim.Region.PhysicsModule.ubOde /// public void AddCollisionEventReporting(PhysicsActor obj) { - if (!_collisionEventPrim.Contains(obj)) - _collisionEventPrim.Add(obj); + _collisionEventPrim[obj.LocalID] = obj; } /// @@ -1215,10 +1210,12 @@ namespace OpenSim.Region.PhysicsModule.ubOde public override PhysicsActor AddAvatar(uint localID, string avName, Vector3 position, Vector3 size, float feetOffset, bool isFlying) { - OdeCharacter newAv = new OdeCharacter(localID, avName, this, position, - size, feetOffset, avDensity, avMovementDivisorWalk, avMovementDivisorRun); - newAv.Flying = isFlying; - newAv.MinimumGroundFlightOffset = minimumGroundFlightOffset; + OdeCharacter newAv = new(localID, avName, this, position, + size, feetOffset, avDensity, avMovementDivisorWalk, avMovementDivisorRun) + { + Flying = isFlying, + MinimumGroundFlightOffset = minimumGroundFlightOffset + }; return newAv; } @@ -1346,9 +1343,8 @@ namespace OpenSim.Region.PhysicsModule.ubOde { // As with all ODE physics operations, we don't remove the prim immediately but signal that it should be // removed in the next physics simulate pass. - if (prim is OdePrim) + if (prim is OdePrim p) { - OdePrim p = (OdePrim)prim; p.setPrimForRemoval(); } } @@ -1401,15 +1397,15 @@ namespace OpenSim.Region.PhysicsModule.ubOde public bool haveActor(PhysicsActor actor) { - if (actor is OdePrim) + if (actor is OdePrim prim) { lock (_prims) - return _prims.ContainsKey(((OdePrim)actor).m_baseLocalID); + return _prims.ContainsKey(prim.m_baseLocalID); } - else if (actor is OdeCharacter) + else if (actor is OdeCharacter ch) { lock (_characters) - return _characters.Contains((OdeCharacter)actor); + return _characters.Contains(ch); } return false; } @@ -1496,7 +1492,7 @@ namespace OpenSim.Region.PhysicsModule.ubOde { if (world == IntPtr.Zero) return; - ODEchangeitem item = new ODEchangeitem + ODEchangeitem item = new() { actor = _actor, what = _what, @@ -1539,8 +1535,8 @@ namespace OpenSim.Region.PhysicsModule.ubOde { lock (SimulationLock) { - if (item.actor is OdeCharacter) - ((OdeCharacter)item.actor).DoAChange(item.what, item.arg); + if (item.actor is OdeCharacter character) + character.DoAChange(item.what, item.arg); else if (((OdePrim)item.actor).DoAChange(item.what, item.arg)) RemovePrimThreadLocked((OdePrim)item.actor); } @@ -1623,8 +1619,8 @@ namespace OpenSim.Region.PhysicsModule.ubOde { lock (SimulationLock) { - if (item.actor is OdeCharacter) - ((OdeCharacter)item.actor).DoAChange(item.what, item.arg); + if (item.actor is OdeCharacter ch) + ch.DoAChange(item.what, item.arg); else if (((OdePrim)item.actor).DoAChange(item.what, item.arg)) RemovePrimThreadLocked((OdePrim)item.actor); } @@ -1685,26 +1681,26 @@ namespace OpenSim.Region.PhysicsModule.ubOde lock (_collisionEventPrimRemove) { foreach (PhysicsActor obj in _collisionEventPrimRemove) - _collisionEventPrim.Remove(obj); + _collisionEventPrim.Remove(obj.LocalID); _collisionEventPrimRemove.Clear(); } - List sleepers = new List(); - foreach (PhysicsActor obj in _collisionEventPrim) + List sleepers = new(); + foreach (PhysicsActor obj in _collisionEventPrim.Values) { switch ((ActorTypes)obj.PhysicsActorType) { case ActorTypes.Agent: OdeCharacter cobj = (OdeCharacter)obj; - cobj.SendCollisions((int)(odetimestepMS)); + cobj.SendCollisions(odetimestepMS); break; case ActorTypes.Prim: OdePrim pobj = (OdePrim)obj; if (!pobj.m_outbounds) { - pobj.SendCollisions((int)(odetimestepMS)); + pobj.SendCollisions(odetimestepMS); lock(SimulationLock) { if(pobj.Body != IntPtr.Zero && !pobj.m_isSelected && @@ -2185,7 +2181,7 @@ namespace OpenSim.Region.PhysicsModule.ubOde foreach (OdePrim prm in _prims.Values) { prm.DoAChange(changes.Remove, null); - _collisionEventPrim.Remove(prm); + _collisionEventPrim.Remove(prm.LocalID); } _prims.Clear(); } @@ -2255,7 +2251,7 @@ namespace OpenSim.Region.PhysicsModule.ubOde { if (retMethod != null) { - ODERayRequest req = new ODERayRequest() + ODERayRequest req = new() { actor = null, callbackMethod = retMethod, @@ -2273,14 +2269,16 @@ namespace OpenSim.Region.PhysicsModule.ubOde { if (retMethod != null) { - ODERayRequest req = new ODERayRequest(); - req.actor = null; - req.callbackMethod = retMethod; - req.length = length; - req.Normal = direction; - req.Origin = position; - req.Count = Count; - req.filter = RayFilterFlags.AllPrims; + ODERayRequest req = new() + { + actor = null, + callbackMethod = retMethod, + length = length, + Normal = direction, + Origin = position, + Count = Count, + filter = RayFilterFlags.AllPrims + }; m_rayCastManager.QueueRequest(req); } @@ -2288,8 +2286,8 @@ namespace OpenSim.Region.PhysicsModule.ubOde public override List RaycastWorld(Vector3 position, Vector3 direction, float length, int Count) { - List ourresults = new List(); - object SyncObject = new object(); + List ourresults = new(); + object SyncObject = new(); RayCallback retMethod = delegate(List results) { @@ -2300,7 +2298,7 @@ namespace OpenSim.Region.PhysicsModule.ubOde } }; - ODERayRequest req = new ODERayRequest + ODERayRequest req = new() { actor = null, callbackMethod = retMethod, @@ -2328,8 +2326,8 @@ namespace OpenSim.Region.PhysicsModule.ubOde public override object RaycastWorld(Vector3 position, Vector3 direction, float length, int Count, RayFilterFlags filter) { - object SyncObject = new object(); - List ourresults = new List(); + object SyncObject = new(); + List ourresults = new(); RayCallback retMethod = delegate(List results) { @@ -2340,7 +2338,7 @@ namespace OpenSim.Region.PhysicsModule.ubOde } }; - ODERayRequest req = new ODERayRequest() + ODERayRequest req = new() { actor = null, callbackMethod = retMethod, @@ -2367,10 +2365,10 @@ namespace OpenSim.Region.PhysicsModule.ubOde return new List(); IntPtr geom; - if (actor is OdePrim) - geom = ((OdePrim)actor).m_prim_geom; - else if (actor is OdeCharacter) - geom = ((OdePrim)actor).m_prim_geom; + if (actor is OdePrim prim) + geom = prim.m_prim_geom; + else if (actor is OdeCharacter ch) + geom = ch.collider; else return new List(); @@ -2378,7 +2376,7 @@ namespace OpenSim.Region.PhysicsModule.ubOde return new List(); List ourResults = null; - object SyncObject = new object(); + object SyncObject = new(); RayCallback retMethod = delegate(List results) { @@ -2389,7 +2387,7 @@ namespace OpenSim.Region.PhysicsModule.ubOde } }; - ODERayRequest req = new ODERayRequest + ODERayRequest req = new() { actor = actor, callbackMethod = retMethod, @@ -2416,8 +2414,8 @@ namespace OpenSim.Region.PhysicsModule.ubOde { Util.FireAndForget( delegate { - ODESitAvatar sitAvatar = new ODESitAvatar(this, m_rayCastManager); - if(sitAvatar != null) + ODESitAvatar sitAvatar = new(this, m_rayCastManager); + if(sitAvatar is not null) sitAvatar.Sit(actor, AbsolutePosition, CameraPosition, offset, AvatarSize, PhysicsSitResponse); }); return 1; diff --git a/OpenSim/Region/PhysicsModules/ubOde/ODESitAvatar.cs b/OpenSim/Region/PhysicsModules/ubOde/ODESitAvatar.cs index 374b74ddd3..3f86ab2a64 100644 --- a/OpenSim/Region/PhysicsModules/ubOde/ODESitAvatar.cs +++ b/OpenSim/Region/PhysicsModules/ubOde/ODESitAvatar.cs @@ -45,15 +45,14 @@ namespace OpenSim.Region.PhysicsModule.ubOde m_raymanager = raymanager; } - private static readonly Vector3 SitAjust = new Vector3(0, 0, 0.4f); + private static readonly Vector3 SitAjust = new(0, 0, 0.4f); private const RayFilterFlags RaySitFlags = RayFilterFlags.AllPrims | RayFilterFlags.ClosestHit; private void RotAroundZ(float x, float y, ref Quaternion ori) { - double ang = Math.Atan2(y, x); - ang *= 0.5d; - float s = (float)Math.Sin(ang); - float c = (float)Math.Cos(ang); + float ang = 0.5f * MathF.Atan2(y, x); + float s = MathF.Sin(ang); + float c = MathF.Cos(ang); ori.X = 0; ori.Y = 0; @@ -64,7 +63,7 @@ namespace OpenSim.Region.PhysicsModule.ubOde public void Sit(PhysicsActor actor, Vector3 avPos, Vector3 avCameraPosition, Vector3 offset, Vector3 avOffset, SitAvatarCallback PhysicsSitResponse) { - if (!m_scene.haveActor(actor) || !(actor is OdePrim) || ((OdePrim)actor).m_prim_geom == IntPtr.Zero) + if (!m_scene.haveActor(actor) || actor is not OdePrim || ((OdePrim)actor).m_prim_geom == IntPtr.Zero) { PhysicsSitResponse(-1, actor.LocalID, offset, Quaternion.Identity); return; @@ -205,7 +204,7 @@ namespace OpenSim.Region.PhysicsModule.ubOde if (rayResults.Count == 0) break; - if (Math.Abs(rayResults[0].Normal.Z) < 0.7f) + if (MathF.Abs(rayResults[0].Normal.Z) < 0.7f) { rayDist -= rayResults[0].Depth; if (rayDist < 0f)