From 6f542f73d4aacc0b92c2ebcff84b4ce2c8d9433b Mon Sep 17 00:00:00 2001 From: Justin Clark-Casey (justincc) Date: Fri, 16 Sep 2011 23:57:16 +0100 Subject: Stop the avatar stalling on its first boarder cross when using the ODE plugin When upgrading the previously child agent to a root, the code was setting the Size parameter on the ODECharacter PhysicsActor. This in turn reset Velocity, which cause the border stall. I'm fixing this by commenting out the Velocity = Vector3.Zero lines since they don't appear to play a useful purpose --- OpenSim/Region/Physics/OdePlugin/ODECharacter.cs | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) (limited to 'OpenSim/Region/Physics') diff --git a/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs b/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs index 0a0d13f..4cc8c59 100644 --- a/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs +++ b/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs @@ -464,10 +464,12 @@ namespace OpenSim.Region.Physics.OdePlugin m_pidControllerActive = true; Vector3 SetSize = value; - m_tainted_CAPSULE_LENGTH = (SetSize.Z*1.15f) - CAPSULE_RADIUS*2.0f; - //m_log.Info("[SIZE]: " + CAPSULE_LENGTH.ToString()); + m_tainted_CAPSULE_LENGTH = (SetSize.Z * 1.15f) - CAPSULE_RADIUS * 2.0f; +// m_log.Info("[SIZE]: " + CAPSULE_LENGTH); - Velocity = Vector3.Zero; + // If we reset velocity here, then an avatar stalls when it crosses a border for the first time + // (as the height of the new root agent is set). +// Velocity = Vector3.Zero; _parent_scene.AddPhysicsActorTaint(this); } @@ -785,6 +787,8 @@ namespace OpenSim.Region.Physics.OdePlugin { m_log.Warn("[PHYSICS]: Got a NaN velocity from Scene in a Character"); } + +// m_log.DebugFormat("[PHYSICS]: Set target velocity of {0}", _target_velocity); } } @@ -1325,7 +1329,8 @@ namespace OpenSim.Region.Physics.OdePlugin { if (Shell != IntPtr.Zero && Body != IntPtr.Zero && Amotor != IntPtr.Zero) { - +// m_log.DebugFormat("[PHYSICS]: Changing capsule size"); + m_pidControllerActive = true; // no lock needed on _parent_scene.OdeLock because we are called from within the thread lock in OdePlugin's simulate() d.JointDestroy(Amotor); @@ -1336,7 +1341,10 @@ namespace OpenSim.Region.Physics.OdePlugin d.GeomDestroy(Shell); AvatarGeomAndBodyCreation(_position.X, _position.Y, _position.Z + (Math.Abs(CAPSULE_LENGTH - prevCapsule) * 2), m_tensor); - Velocity = Vector3.Zero; + + // As with Size, we reset velocity. However, this isn't strictly necessary since it doesn't + // appear to stall initial region crossings when done here. Being done for consistency. +// Velocity = Vector3.Zero; _parent_scene.geom_name_map[Shell] = m_name; _parent_scene.actor_name_map[Shell] = (PhysicsActor)this; @@ -1361,7 +1369,6 @@ namespace OpenSim.Region.Physics.OdePlugin _position.Z = m_taintPosition.Z; } } - } internal void AddCollisionFrameTime(int p) -- cgit v1.1 From f95033812402aaf31a9f2f66c946165d2d79669f Mon Sep 17 00:00:00 2001 From: Justin Clark-Casey (justincc) Date: Sat, 17 Sep 2011 01:09:25 +0100 Subject: Remove old bullet DotNET and X libraries in preparation for BulletS These weren't working properly anyway. You will need to rerun prebuild.sh/.bat after this commit, and maybe "nant clean" as well. --- .../Physics/BulletDotNETPlugin/AssemblyInfo.cs | 58 - .../BulletDotNETPlugin/BulletDotNETCharacter.cs | 1191 --------- .../BulletDotNETPlugin/BulletDotNETPlugin.cs | 65 - .../BulletDotNETPluginStructs.cs | 60 - .../Physics/BulletDotNETPlugin/BulletDotNETPrim.cs | 2767 -------------------- .../BulletDotNETPlugin/BulletDotNETScene.cs | 776 ------ .../Region/Physics/BulletXPlugin/AssemblyInfo.cs | 58 - .../Region/Physics/BulletXPlugin/BulletXPlugin.cs | 1855 ------------- .../BulletXPlugin/TriangleIndexVertexArray.cs | 197 -- 9 files changed, 7027 deletions(-) delete mode 100644 OpenSim/Region/Physics/BulletDotNETPlugin/AssemblyInfo.cs delete mode 100644 OpenSim/Region/Physics/BulletDotNETPlugin/BulletDotNETCharacter.cs delete mode 100644 OpenSim/Region/Physics/BulletDotNETPlugin/BulletDotNETPlugin.cs delete mode 100644 OpenSim/Region/Physics/BulletDotNETPlugin/BulletDotNETPluginStructs.cs delete mode 100644 OpenSim/Region/Physics/BulletDotNETPlugin/BulletDotNETPrim.cs delete mode 100644 OpenSim/Region/Physics/BulletDotNETPlugin/BulletDotNETScene.cs delete mode 100644 OpenSim/Region/Physics/BulletXPlugin/AssemblyInfo.cs delete mode 100644 OpenSim/Region/Physics/BulletXPlugin/BulletXPlugin.cs delete mode 100644 OpenSim/Region/Physics/BulletXPlugin/TriangleIndexVertexArray.cs (limited to 'OpenSim/Region/Physics') diff --git a/OpenSim/Region/Physics/BulletDotNETPlugin/AssemblyInfo.cs b/OpenSim/Region/Physics/BulletDotNETPlugin/AssemblyInfo.cs deleted file mode 100644 index 2830325..0000000 --- a/OpenSim/Region/Physics/BulletDotNETPlugin/AssemblyInfo.cs +++ /dev/null @@ -1,58 +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.Reflection; -using System.Runtime.InteropServices; - -// Information about this assembly is defined by the following -// attributes. -// -// change them to the information which is associated with the assembly -// you compile. - -[assembly : AssemblyTitle("BulletDotNETPlugin")] -[assembly : AssemblyDescription("")] -[assembly : AssemblyConfiguration("")] -[assembly : AssemblyCompany("http://opensimulator.org")] -[assembly : AssemblyProduct("OdePlugin")] -[assembly : AssemblyCopyright("Copyright (c) OpenSimulator.org Developers 2007-2009")] -[assembly : AssemblyTrademark("")] -[assembly : AssemblyCulture("")] - -// This sets the default COM visibility of types in the assembly to invisible. -// If you need to expose a type to COM, use [ComVisible(true)] on that type. - -[assembly : ComVisible(false)] - -// The assembly version has following format : -// -// Major.Minor.Build.Revision -// -// You can specify all values by your own or you can build default build and revision -// numbers with the '*' character (the default): - -[assembly : AssemblyVersion("0.6.3.*")] diff --git a/OpenSim/Region/Physics/BulletDotNETPlugin/BulletDotNETCharacter.cs b/OpenSim/Region/Physics/BulletDotNETPlugin/BulletDotNETCharacter.cs deleted file mode 100644 index ac4e2b9..0000000 --- a/OpenSim/Region/Physics/BulletDotNETPlugin/BulletDotNETCharacter.cs +++ /dev/null @@ -1,1191 +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; -using System.Reflection; -using BulletDotNET; -using OpenMetaverse; -using OpenSim.Framework; -using OpenSim.Region.Physics.Manager; -using log4net; - -namespace OpenSim.Region.Physics.BulletDotNETPlugin -{ - public class BulletDotNETCharacter : PhysicsActor - { - private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); - - public btRigidBody Body; - public btCollisionShape Shell; - public btVector3 tempVector1; - public btVector3 tempVector2; - public btVector3 tempVector3; - public btVector3 tempVector4; - - public btVector3 tempVector5RayCast; - public btVector3 tempVector6RayCast; - public btVector3 tempVector7RayCast; - - public btQuaternion tempQuat1; - public btTransform tempTrans1; - - public ClosestNotMeRayResultCallback ClosestCastResult; - private btTransform m_bodyTransform; - private btVector3 m_bodyPosition; - private btVector3 m_CapsuleOrientationAxis; - private btQuaternion m_bodyOrientation; - private btDefaultMotionState m_bodyMotionState; - private btGeneric6DofConstraint m_aMotor; - // private Vector3 m_movementComparision; - private Vector3 m_position; - private Vector3 m_zeroPosition; - private bool m_zeroFlag = false; - private bool m_lastUpdateSent = false; - private Vector3 m_velocity; - private Vector3 m_target_velocity; - private Vector3 m_acceleration; - private Vector3 m_rotationalVelocity; - private bool m_pidControllerActive = true; - public float PID_D = 80.0f; - public float PID_P = 90.0f; - public float CAPSULE_RADIUS = 0.37f; - public float CAPSULE_LENGTH = 2.140599f; - public float heightFudgeFactor = 0.52f; - public float walkDivisor = 1.3f; - public float runDivisor = 0.8f; - private float m_mass = 80f; - public float m_density = 60f; - private bool m_flying = false; - private bool m_iscolliding = false; - private bool m_iscollidingGround = false; - private bool m_wascolliding = false; - private bool m_wascollidingGround = false; - private bool m_iscollidingObj = false; - private bool m_alwaysRun = false; - private bool m_hackSentFall = false; - private bool m_hackSentFly = false; - public uint m_localID = 0; - public bool m_returnCollisions = false; - // taints and their non-tainted counterparts - public bool m_isPhysical = false; // the current physical status - public bool m_tainted_isPhysical = false; // set when the physical status is tainted (false=not existing in physics engine, true=existing) - private float m_tainted_CAPSULE_LENGTH; // set when the capsule length changes. - private bool m_taintRemove = false; - // private bool m_taintedPosition = false; - // private Vector3 m_taintedPosition_value; - private Vector3 m_taintedForce; - - private float m_buoyancy = 0f; - - // private CollisionLocker ode; - - // private string m_name = String.Empty; - - private bool[] m_colliderarr = new bool[11]; - private bool[] m_colliderGroundarr = new bool[11]; - - private BulletDotNETScene m_parent_scene; - - public int m_eventsubscription = 0; - private CollisionEventUpdate CollisionEventsThisFrame = null; - private int m_requestedUpdateFrequency = 0; - - public BulletDotNETCharacter(string avName, BulletDotNETScene parent_scene, Vector3 pos, Vector3 size, float pid_d, float pid_p, float capsule_radius, float tensor, float density, float height_fudge_factor, float walk_divisor, float rundivisor) - { - m_position = pos; - m_zeroPosition = pos; - m_parent_scene = parent_scene; - PID_D = pid_d; - PID_P = pid_p; - CAPSULE_RADIUS = capsule_radius; - m_density = density; - heightFudgeFactor = height_fudge_factor; - walkDivisor = walk_divisor; - runDivisor = rundivisor; - - for (int i = 0; i < 11; i++) - { - m_colliderarr[i] = false; - } - for (int i = 0; i < 11; i++) - { - m_colliderGroundarr[i] = false; - } - CAPSULE_LENGTH = (size.Z * 1.15f) - CAPSULE_RADIUS * 2.0f; - m_tainted_CAPSULE_LENGTH = CAPSULE_LENGTH; - m_isPhysical = false; // current status: no ODE information exists - m_tainted_isPhysical = true; // new tainted status: need to create ODE information - - m_parent_scene.AddPhysicsActorTaint(this); - - // m_name = avName; - tempVector1 = new btVector3(0, 0, 0); - tempVector2 = new btVector3(0, 0, 0); - tempVector3 = new btVector3(0, 0, 0); - tempVector4 = new btVector3(0, 0, 0); - - tempVector5RayCast = new btVector3(0, 0, 0); - tempVector6RayCast = new btVector3(0, 0, 0); - tempVector7RayCast = new btVector3(0, 0, 0); - - tempQuat1 = new btQuaternion(0, 0, 0, 1); - tempTrans1 = new btTransform(tempQuat1, tempVector1); - // m_movementComparision = new PhysicsVector(0, 0, 0); - m_CapsuleOrientationAxis = new btVector3(1, 0, 1); - } - - /// - /// This creates the Avatar's physical Surrogate at the position supplied - /// - /// - /// - /// - - // WARNING: This MUST NOT be called outside of ProcessTaints, else we can have unsynchronized access - // to ODE internals. ProcessTaints is called from within thread-locked Simulate(), so it is the only - // place that is safe to call this routine AvatarGeomAndBodyCreation. - private void AvatarGeomAndBodyCreation(float npositionX, float npositionY, float npositionZ) - { - - if (CAPSULE_LENGTH <= 0) - { - m_log.Warn("[PHYSICS]: The capsule size you specified in opensim.ini is invalid! Setting it to the smallest possible size!"); - CAPSULE_LENGTH = 0.01f; - - } - - if (CAPSULE_RADIUS <= 0) - { - m_log.Warn("[PHYSICS]: The capsule size you specified in opensim.ini is invalid! Setting it to the smallest possible size!"); - CAPSULE_RADIUS = 0.01f; - - } - - Shell = new btCapsuleShape(CAPSULE_RADIUS, CAPSULE_LENGTH); - - if (m_bodyPosition == null) - m_bodyPosition = new btVector3(npositionX, npositionY, npositionZ); - - m_bodyPosition.setValue(npositionX, npositionY, npositionZ); - - if (m_bodyOrientation == null) - m_bodyOrientation = new btQuaternion(m_CapsuleOrientationAxis, (Utils.DEG_TO_RAD * 90)); - - if (m_bodyTransform == null) - m_bodyTransform = new btTransform(m_bodyOrientation, m_bodyPosition); - else - { - m_bodyTransform.Dispose(); - m_bodyTransform = new btTransform(m_bodyOrientation, m_bodyPosition); - } - - if (m_bodyMotionState == null) - m_bodyMotionState = new btDefaultMotionState(m_bodyTransform); - else - m_bodyMotionState.setWorldTransform(m_bodyTransform); - - m_mass = Mass; - - Body = new btRigidBody(m_mass, m_bodyMotionState, Shell); - // this is used for self identification. User localID instead of body handle - Body.setUserPointer(new IntPtr((int)m_localID)); - - if (ClosestCastResult != null) - ClosestCastResult.Dispose(); - ClosestCastResult = new ClosestNotMeRayResultCallback(Body); - - m_parent_scene.AddRigidBody(Body); - Body.setActivationState(4); - if (m_aMotor != null) - { - if (m_aMotor.Handle != IntPtr.Zero) - { - m_parent_scene.getBulletWorld().removeConstraint(m_aMotor); - m_aMotor.Dispose(); - } - m_aMotor = null; - } - - m_aMotor = new btGeneric6DofConstraint(Body, m_parent_scene.TerrainBody, - m_parent_scene.TransZero, - m_parent_scene.TransZero, false); - m_aMotor.setAngularLowerLimit(m_parent_scene.VectorZero); - m_aMotor.setAngularUpperLimit(m_parent_scene.VectorZero); - - - } - public void Remove() - { - m_taintRemove = true; - } - public override bool Stopped - { - get { return m_zeroFlag; } - } - - public override Vector3 Size - { - get { return new Vector3(CAPSULE_RADIUS * 2, CAPSULE_RADIUS * 2, CAPSULE_LENGTH); } - set - { - m_pidControllerActive = true; - - Vector3 SetSize = value; - m_tainted_CAPSULE_LENGTH = (SetSize.Z * 1.15f) - CAPSULE_RADIUS * 2.0f; - //m_log.Info("[SIZE]: " + CAPSULE_LENGTH.ToString()); - - Velocity = Vector3.Zero; - - m_parent_scene.AddPhysicsActorTaint(this); - } - } - - /// - /// turn the PID controller on or off. - /// The PID Controller will turn on all by itself in many situations - /// - /// - public void SetPidStatus(bool status) - { - m_pidControllerActive = status; - } - - public override PrimitiveBaseShape Shape - { - set { return; } - } - - public override uint LocalID - { - set { m_localID = value; } - } - - public override bool Grabbed - { - set { return; } - } - - public override bool Selected - { - set { return; } - } - - - public override void CrossingFailure() - { - - } - - public override void link(PhysicsActor obj) - { - - } - - public override void delink() - { - - } - - public override void LockAngularMotion(Vector3 axis) - { - - } - - public override Vector3 Position - { - get { return m_position; } - set - { - // m_taintedPosition_value = value; - m_position = value; - // m_taintedPosition = true; - } - } - - public override float Mass - { - get - { - float AVvolume = (float)(Math.PI * Math.Pow(CAPSULE_RADIUS, 2) * CAPSULE_LENGTH); - return m_density * AVvolume; - } - } - - public override Vector3 Force - { - get { return m_target_velocity; } - set { return; } - } - - public override int VehicleType - { - get { return 0; } - set { return; } - } - - public override void VehicleFloatParam(int param, float value) - { - - } - - public override void VehicleVectorParam(int param, Vector3 value) - { - - } - - public override void VehicleRotationParam(int param, Quaternion rotation) - { - - } - - public override void VehicleFlags(int param, bool remove) - { - - } - - public override void SetVolumeDetect(int param) - { - - } - - public override Vector3 GeometricCenter - { - get { return Vector3.Zero; } - } - - public override Vector3 CenterOfMass - { - get { return Vector3.Zero; } - } - - public override Vector3 Velocity - { - get - { - if (m_zeroFlag) - return Vector3.Zero; - m_lastUpdateSent = false; - return m_velocity; - } - set - { - m_pidControllerActive = true; - m_target_velocity = value; - } - } - - public override Vector3 Torque - { - get { return Vector3.Zero; } - set { return; } - } - - public override float CollisionScore - { - get { return 0f; } - set { } - } - - public override Vector3 Acceleration - { - get { return m_acceleration; } - } - - public override Quaternion Orientation - { - get { return Quaternion.Identity; } - set - { - - } - } - - public override int PhysicsActorType - { - get { return (int)ActorTypes.Agent; } - set { return; } - } - - public override bool IsPhysical - { - get { return false; } - set { return; } - } - - public override bool Flying - { - get { return m_flying; } - set { m_flying = value; } - } - - public override bool SetAlwaysRun - { - get { return m_alwaysRun; } - set { m_alwaysRun = value; } - } - - - public override bool ThrottleUpdates - { - get { return false; } - set { return; } - } - - /// - /// Returns if the avatar is colliding in general. - /// This includes the ground and objects and avatar. - /// - public override bool IsColliding - { - get { return m_iscolliding; } - set - { - int i; - int truecount = 0; - int falsecount = 0; - - if (m_colliderarr.Length >= 10) - { - for (i = 0; i < 10; i++) - { - m_colliderarr[i] = m_colliderarr[i + 1]; - } - } - m_colliderarr[10] = value; - - for (i = 0; i < 11; i++) - { - if (m_colliderarr[i]) - { - truecount++; - } - else - { - falsecount++; - } - } - - // Equal truecounts and false counts means we're colliding with something. - m_log.DebugFormat("[PHYSICS]: TrueCount:{0}, FalseCount:{1}",truecount,falsecount); - if (falsecount > 1.2 * truecount) - { - m_iscolliding = false; - } - else - { - m_iscolliding = true; - } - if (m_wascolliding != m_iscolliding) - { - //base.SendCollisionUpdate(new CollisionEventUpdate()); - } - m_wascolliding = m_iscolliding; - } - } - - /// - /// Returns if an avatar is colliding with the ground - /// - public override bool CollidingGround - { - get { return m_iscollidingGround; } - set - { - // Collisions against the ground are not really reliable - // So, to get a consistant value we have to average the current result over time - // Currently we use 1 second = 10 calls to this. - int i; - int truecount = 0; - int falsecount = 0; - - if (m_colliderGroundarr.Length >= 10) - { - for (i = 0; i < 10; i++) - { - m_colliderGroundarr[i] = m_colliderGroundarr[i + 1]; - } - } - m_colliderGroundarr[10] = value; - - for (i = 0; i < 11; i++) - { - if (m_colliderGroundarr[i]) - { - truecount++; - } - else - { - falsecount++; - } - } - - // Equal truecounts and false counts means we're colliding with something. - - if (falsecount > 1.2 * truecount) - { - m_iscollidingGround = false; - } - else - { - m_iscollidingGround = true; - } - if (m_wascollidingGround != m_iscollidingGround) - { - //base.SendCollisionUpdate(new CollisionEventUpdate()); - } - m_wascollidingGround = m_iscollidingGround; - } - } - - /// - /// Returns if the avatar is colliding with an object - /// - public override bool CollidingObj - { - get { return m_iscollidingObj; } - set - { - m_iscollidingObj = value; - if (value) - m_pidControllerActive = false; - else - m_pidControllerActive = true; - } - } - - - public override bool FloatOnWater - { - set { return; } - } - - public override Vector3 RotationalVelocity - { - get { return m_rotationalVelocity; } - set { m_rotationalVelocity = value; } - } - - public override bool Kinematic - { - get { return false; } - set { } - } - - public override float Buoyancy - { - get { return m_buoyancy; } - set { m_buoyancy = value; } - } - - public override Vector3 PIDTarget { set { return; } } - public override bool PIDActive { set { return; } } - public override float PIDTau { set { return; } } - - public override bool PIDHoverActive - { - set { return; } - } - - public override float PIDHoverHeight - { - set { return; } - } - - public override PIDHoverType PIDHoverType - { - set { return; } - } - - public override float PIDHoverTau - { - set { return; } - } - - - public override Quaternion APIDTarget - { - set { return; } - } - - public override bool APIDActive - { - set { return; } - } - - public override float APIDStrength - { - set { return; } - } - - public override float APIDDamping - { - set { return; } - } - - /// - /// Adds the force supplied to the Target Velocity - /// The PID controller takes this target velocity and tries to make it a reality - /// - /// - /// Is this a push by a script? - public override void AddForce(Vector3 force, bool pushforce) - { - if (pushforce) - { - m_pidControllerActive = false; - force *= 100f; - doForce(force, false); - //System.Console.WriteLine("Push!"); - //_target_velocity.X += force.X; - // _target_velocity.Y += force.Y; - //_target_velocity.Z += force.Z; - } - else - { - m_pidControllerActive = true; - m_target_velocity.X += force.X; - m_target_velocity.Y += force.Y; - m_target_velocity.Z += force.Z; - } - //m_lastUpdateSent = false; - } - - public void doForce(Vector3 force, bool now) - { - - tempVector3.setValue(force.X, force.Y, force.Z); - if (now) - { - Body.applyCentralForce(tempVector3); - } - else - { - m_taintedForce += force; - m_parent_scene.AddPhysicsActorTaint(this); - } - } - - public void doImpulse(Vector3 force, bool now) - { - - tempVector3.setValue(force.X, force.Y, force.Z); - if (now) - { - Body.applyCentralImpulse(tempVector3); - } - else - { - m_taintedForce += force; - m_parent_scene.AddPhysicsActorTaint(this); - } - } - - public override void AddAngularForce(Vector3 force, bool pushforce) - { - - } - - public override void SetMomentum(Vector3 momentum) - { - - } - - public override void SubscribeEvents(int ms) - { - m_eventsubscription = ms; - m_requestedUpdateFrequency = ms; - m_parent_scene.addCollisionEventReporting(this); - } - - public override void UnSubscribeEvents() - { - m_parent_scene.remCollisionEventReporting(this); - m_eventsubscription = 0; - m_requestedUpdateFrequency = 0; - } - - public override bool SubscribedEvents() - { - if (m_eventsubscription > 0) - return true; - return false; - } - - public void AddCollision(uint collideWith, ContactPoint contact) - { - if (CollisionEventsThisFrame == null) - { - CollisionEventsThisFrame = new CollisionEventUpdate(); - } - CollisionEventsThisFrame.addCollider(collideWith, contact); - } - - public void SendCollisions() - { - if (m_eventsubscription >= m_requestedUpdateFrequency) - { - if (CollisionEventsThisFrame != null) - { - base.SendCollisionUpdate(CollisionEventsThisFrame); - } - CollisionEventsThisFrame = new CollisionEventUpdate(); - m_eventsubscription = 0; - } - return; - } - - internal void Dispose() - { - if (Body.isInWorld()) - m_parent_scene.removeFromWorld(Body); - - if (m_aMotor.Handle != IntPtr.Zero) - m_parent_scene.getBulletWorld().removeConstraint(m_aMotor); - - m_aMotor.Dispose(); m_aMotor = null; - ClosestCastResult.Dispose(); ClosestCastResult = null; - Body.Dispose(); Body = null; - Shell.Dispose(); Shell = null; - tempQuat1.Dispose(); - tempTrans1.Dispose(); - tempVector1.Dispose(); - tempVector2.Dispose(); - tempVector3.Dispose(); - tempVector4.Dispose(); - tempVector5RayCast.Dispose(); - tempVector6RayCast.Dispose(); - - } - - public void ProcessTaints(float timestep) - { - - if (m_tainted_isPhysical != m_isPhysical) - { - if (m_tainted_isPhysical) - { - // Create avatar capsule and related ODE data - if (!(Shell == null && Body == null)) - { - m_log.Warn("[PHYSICS]: re-creating the following avatar ODE data, even though it already exists - " - + (Shell != null ? "Shell " : "") - + (Body != null ? "Body " : "")); - } - AvatarGeomAndBodyCreation(m_position.X, m_position.Y, m_position.Z); - - - } - else - { - // destroy avatar capsule and related ODE data - - Dispose(); - tempVector1 = new btVector3(0, 0, 0); - tempVector2 = new btVector3(0, 0, 0); - tempVector3 = new btVector3(0, 0, 0); - tempVector4 = new btVector3(0, 0, 0); - - tempVector5RayCast = new btVector3(0, 0, 0); - tempVector6RayCast = new btVector3(0, 0, 0); - tempVector7RayCast = new btVector3(0, 0, 0); - - tempQuat1 = new btQuaternion(0, 0, 0, 1); - tempTrans1 = new btTransform(tempQuat1, tempVector1); - // m_movementComparision = new PhysicsVector(0, 0, 0); - m_CapsuleOrientationAxis = new btVector3(1, 0, 1); - } - - m_isPhysical = m_tainted_isPhysical; - } - - if (m_tainted_CAPSULE_LENGTH != CAPSULE_LENGTH) - { - if (Body != null) - { - - m_pidControllerActive = true; - // no lock needed on _parent_scene.OdeLock because we are called from within the thread lock in OdePlugin's simulate() - //d.JointDestroy(Amotor); - float prevCapsule = CAPSULE_LENGTH; - CAPSULE_LENGTH = m_tainted_CAPSULE_LENGTH; - //m_log.Info("[SIZE]: " + CAPSULE_LENGTH.ToString()); - Dispose(); - - tempVector1 = new btVector3(0, 0, 0); - tempVector2 = new btVector3(0, 0, 0); - tempVector3 = new btVector3(0, 0, 0); - tempVector4 = new btVector3(0, 0, 0); - - tempVector5RayCast = new btVector3(0, 0, 0); - tempVector6RayCast = new btVector3(0, 0, 0); - tempVector7RayCast = new btVector3(0, 0, 0); - - tempQuat1 = new btQuaternion(0, 0, 0, 1); - tempTrans1 = new btTransform(tempQuat1, tempVector1); - // m_movementComparision = new PhysicsVector(0, 0, 0); - m_CapsuleOrientationAxis = new btVector3(1, 0, 1); - - AvatarGeomAndBodyCreation(m_position.X, m_position.Y, - m_position.Z + (Math.Abs(CAPSULE_LENGTH - prevCapsule) * 2)); - Velocity = Vector3.Zero; - - } - else - { - m_log.Warn("[PHYSICS]: trying to change capsule size, but the following ODE data is missing - " - + (Shell == null ? "Shell " : "") - + (Body == null ? "Body " : "")); - } - } - if (m_taintRemove) - { - Dispose(); - } - } - - /// - /// Called from Simulate - /// This is the avatar's movement control + PID Controller - /// - /// - public void Move(float timeStep) - { - // no lock; for now it's only called from within Simulate() - - // If the PID Controller isn't active then we set our force - // calculating base velocity to the current position - if (Body == null) - return; - tempTrans1.Dispose(); - tempTrans1 = Body.getInterpolationWorldTransform(); - tempVector1.Dispose(); - tempVector1 = tempTrans1.getOrigin(); - tempVector2.Dispose(); - tempVector2 = Body.getInterpolationLinearVelocity(); - - if (m_pidControllerActive == false) - { - m_zeroPosition.X = tempVector1.getX(); - m_zeroPosition.Y = tempVector1.getY(); - m_zeroPosition.Z = tempVector1.getZ(); - } - //PidStatus = true; - - Vector3 vec = Vector3.Zero; - - Vector3 vel = new Vector3(tempVector2.getX(), tempVector2.getY(), tempVector2.getZ()); - - float movementdivisor = 1f; - - if (!m_alwaysRun) - { - movementdivisor = walkDivisor; - } - else - { - movementdivisor = runDivisor; - } - - // if velocity is zero, use position control; otherwise, velocity control - if (m_target_velocity.X == 0.0f && m_target_velocity.Y == 0.0f && m_target_velocity.Z == 0.0f && m_iscolliding) - { - // keep track of where we stopped. No more slippin' & slidin' - if (!m_zeroFlag) - { - m_zeroFlag = true; - m_zeroPosition.X = tempVector1.getX(); - m_zeroPosition.Y = tempVector1.getY(); - m_zeroPosition.Z = tempVector1.getZ(); - } - if (m_pidControllerActive) - { - // We only want to deactivate the PID Controller if we think we want to have our surrogate - // react to the physics scene by moving it's position. - // Avatar to Avatar collisions - // Prim to avatar collisions - - Vector3 pos = new Vector3(tempVector1.getX(), tempVector1.getY(), tempVector1.getZ()); - vec.X = (m_target_velocity.X - vel.X) * (PID_D) + (m_zeroPosition.X - pos.X) * (PID_P * 2); - vec.Y = (m_target_velocity.Y - vel.Y) * (PID_D) + (m_zeroPosition.Y - pos.Y) * (PID_P * 2); - if (m_flying) - { - vec.Z = (m_target_velocity.Z - vel.Z) * (PID_D) + (m_zeroPosition.Z - pos.Z) * PID_P; - } - } - //PidStatus = true; - } - else - { - m_pidControllerActive = true; - m_zeroFlag = false; - if (m_iscolliding && !m_flying) - { - // We're standing on something - vec.X = ((m_target_velocity.X / movementdivisor) - vel.X) * (PID_D); - vec.Y = ((m_target_velocity.Y / movementdivisor) - vel.Y) * (PID_D); - } - else if (m_iscolliding && m_flying) - { - // We're flying and colliding with something - vec.X = ((m_target_velocity.X / movementdivisor) - vel.X) * (PID_D / 16); - vec.Y = ((m_target_velocity.Y / movementdivisor) - vel.Y) * (PID_D / 16); - } - else if (!m_iscolliding && m_flying) - { - // we're in mid air suspended - vec.X = ((m_target_velocity.X / movementdivisor) - vel.X) * (PID_D / 6); - vec.Y = ((m_target_velocity.Y / movementdivisor) - vel.Y) * (PID_D / 6); - - // We don't want linear velocity to cause our avatar to bounce, so we check target Z and actual velocity X, Y - // rebound preventing - if (m_target_velocity.Z < 0.025f && m_velocity.X < 0.25f && m_velocity.Y < 0.25f) - m_zeroFlag = true; - } - - if (m_iscolliding && !m_flying && m_target_velocity.Z > 0.0f) - { - // We're colliding with something and we're not flying but we're moving - // This means we're walking or running. - Vector3 pos = new Vector3(tempVector1.getX(), tempVector1.getY(), tempVector1.getZ()); - vec.Z = (m_target_velocity.Z - vel.Z) * PID_D + (m_zeroPosition.Z - pos.Z) * PID_P; - if (m_target_velocity.X > 0) - { - vec.X = ((m_target_velocity.X - vel.X) / 1.2f) * PID_D; - } - if (m_target_velocity.Y > 0) - { - vec.Y = ((m_target_velocity.Y - vel.Y) / 1.2f) * PID_D; - } - } - else if (!m_iscolliding && !m_flying) - { - // we're not colliding and we're not flying so that means we're falling! - // m_iscolliding includes collisions with the ground. - - // d.Vector3 pos = d.BodyGetPosition(Body); - if (m_target_velocity.X > 0) - { - vec.X = ((m_target_velocity.X - vel.X) / 1.2f) * PID_D; - } - if (m_target_velocity.Y > 0) - { - vec.Y = ((m_target_velocity.Y - vel.Y) / 1.2f) * PID_D; - } - } - - - if (m_flying) - { - vec.Z = (m_target_velocity.Z - vel.Z) * (PID_D); - } - } - if (m_flying) - { - // Slight PID correction - vec.Z += (((-1 * m_parent_scene.gravityz) * m_mass) * 0.06f); - - - //auto fly height. Kitto Flora - //d.Vector3 pos = d.BodyGetPosition(Body); - float target_altitude = m_parent_scene.GetTerrainHeightAtXY(m_position.X, m_position.Y) + 5.0f; - - if (m_position.Z < target_altitude) - { - vec.Z += (target_altitude - m_position.Z) * PID_P * 5.0f; - } - - } - if (Body != null && (((m_target_velocity.X > 0.2f || m_target_velocity.X < -0.2f) || (m_target_velocity.Y > 0.2f || m_target_velocity.Y < -0.2f)))) - { - Body.setFriction(0.001f); - //m_log.DebugFormat("[PHYSICS]: Avatar force applied: {0}, Target:{1}", vec.ToString(), m_target_velocity.ToString()); - } - - if (Body != null) - { - int activationstate = Body.getActivationState(); - if (activationstate == 0) - { - Body.forceActivationState(1); - } - - - } - doImpulse(vec, true); - } - - /// - /// Updates the reported position and velocity. This essentially sends the data up to ScenePresence. - /// - public void UpdatePositionAndVelocity() - { - if (Body == null) - return; - //int val = Environment.TickCount; - CheckIfStandingOnObject(); - //m_log.DebugFormat("time:{0}", Environment.TickCount - val); - - //IsColliding = Body.checkCollideWith(m_parent_scene.TerrainBody); - - tempTrans1.Dispose(); - tempTrans1 = Body.getInterpolationWorldTransform(); - tempVector1.Dispose(); - tempVector1 = tempTrans1.getOrigin(); - tempVector2.Dispose(); - tempVector2 = Body.getInterpolationLinearVelocity(); - - // no lock; called from Simulate() -- if you call this from elsewhere, gotta lock or do Monitor.Enter/Exit! - Vector3 vec = new Vector3(tempVector1.getX(), tempVector1.getY(), tempVector1.getZ()); - - // kluge to keep things in bounds. ODE lets dead avatars drift away (they should be removed!) - if (vec.X < -10.0f) vec.X = 0.0f; - if (vec.Y < -10.0f) vec.Y = 0.0f; - if (vec.X > (int)Constants.RegionSize + 10.2f) vec.X = (int)Constants.RegionSize + 10.2f; - if (vec.Y > (int)Constants.RegionSize + 10.2f) vec.Y = (int)Constants.RegionSize + 10.2f; - - m_position.X = vec.X; - m_position.Y = vec.Y; - m_position.Z = vec.Z; - - // Did we move last? = zeroflag - // This helps keep us from sliding all over - - if (m_zeroFlag) - { - m_velocity.X = 0.0f; - m_velocity.Y = 0.0f; - m_velocity.Z = 0.0f; - - // Did we send out the 'stopped' message? - if (!m_lastUpdateSent) - { - m_lastUpdateSent = true; - //base.RequestPhysicsterseUpdate(); - - } - } - else - { - m_lastUpdateSent = false; - vec = new Vector3(tempVector2.getX(), tempVector2.getY(), tempVector2.getZ()); - m_velocity.X = (vec.X); - m_velocity.Y = (vec.Y); - - m_velocity.Z = (vec.Z); - //m_log.Debug(m_target_velocity); - if (m_velocity.Z < -6 && !m_hackSentFall) - { - m_hackSentFall = true; - m_pidControllerActive = false; - } - else if (m_flying && !m_hackSentFly) - { - //m_hackSentFly = true; - //base.SendCollisionUpdate(new CollisionEventUpdate()); - } - else - { - m_hackSentFly = false; - m_hackSentFall = false; - } - } - if (Body != null) - { - if (Body.getFriction() < 0.9f) - Body.setFriction(0.9f); - } - //if (Body != null) - // Body.clearForces(); - } - - public void CheckIfStandingOnObject() - { - - float capsuleHalfHeight = ((CAPSULE_LENGTH + 2*CAPSULE_RADIUS)*0.5f); - - tempVector5RayCast.setValue(m_position.X, m_position.Y, m_position.Z); - tempVector6RayCast.setValue(m_position.X, m_position.Y, m_position.Z - 1 * capsuleHalfHeight * 1.1f); - - - ClosestCastResult.Dispose(); - ClosestCastResult = new ClosestNotMeRayResultCallback(Body); - - try - { - m_parent_scene.getBulletWorld().rayTest(tempVector5RayCast, tempVector6RayCast, ClosestCastResult); - } - catch (AccessViolationException) - { - m_log.Debug("BAD!"); - } - if (ClosestCastResult.hasHit()) - { - - if (tempVector7RayCast != null) - tempVector7RayCast.Dispose(); - - //tempVector7RayCast = ClosestCastResult.getHitPointWorld(); - - /*if (tempVector7RayCast == null) // null == no result also - { - CollidingObj = false; - IsColliding = false; - CollidingGround = false; - - return; - } - float zVal = tempVector7RayCast.getZ(); - if (zVal != 0) - m_log.Debug("[PHYSICS]: HAAAA"); - if (zVal < m_position.Z && zVal > ((CAPSULE_LENGTH + 2 * CAPSULE_RADIUS) *0.5f)) - { - CollidingObj = true; - IsColliding = true; - } - else - { - CollidingObj = false; - IsColliding = false; - CollidingGround = false; - }*/ - - //height+2*radius = capsule full length - //CollidingObj = true; - //IsColliding = true; - m_iscolliding = true; - } - else - { - //CollidingObj = false; - //IsColliding = false; - //CollidingGround = false; - m_iscolliding = false; - } - } - } - -} diff --git a/OpenSim/Region/Physics/BulletDotNETPlugin/BulletDotNETPlugin.cs b/OpenSim/Region/Physics/BulletDotNETPlugin/BulletDotNETPlugin.cs deleted file mode 100644 index cf75c48..0000000 --- a/OpenSim/Region/Physics/BulletDotNETPlugin/BulletDotNETPlugin.cs +++ /dev/null @@ -1,65 +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 OpenSim.Region.Physics.Manager; - -namespace OpenSim.Region.Physics.BulletDotNETPlugin -{ - public class BulletDotNetPlugin : IPhysicsPlugin - { - private BulletDotNETScene m_scene; - private const string m_pluginName = "BulletDotNETPlugin"; - - #region IPhysicsPlugin Members - - public bool Init() - { - return true; - } - - public PhysicsScene GetScene(string sceneIdentifier) - { - if (m_scene == null) - { - m_scene = new BulletDotNETScene(sceneIdentifier); - } - return m_scene; - } - - public string GetName() - { - return m_pluginName; - } - - public void Dispose() - { - - } - - #endregion - } -} \ No newline at end of file diff --git a/OpenSim/Region/Physics/BulletDotNETPlugin/BulletDotNETPluginStructs.cs b/OpenSim/Region/Physics/BulletDotNETPlugin/BulletDotNETPluginStructs.cs deleted file mode 100644 index 578c22a..0000000 --- a/OpenSim/Region/Physics/BulletDotNETPlugin/BulletDotNETPluginStructs.cs +++ /dev/null @@ -1,60 +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; - -public enum StatusIndicators : int -{ - Generic = 0, - Start = 1, - End = 2 -} - -public struct sCollisionData -{ - public uint ColliderLocalId; - public uint CollidedWithLocalId; - public int NumberOfCollisions; - public int CollisionType; - public int StatusIndicator; - public int lastframe; -} - -[Flags] -public enum CollisionCategories : int -{ - Disabled = 0, - Geom = 0x00000001, - Body = 0x00000002, - Space = 0x00000004, - Character = 0x00000008, - Land = 0x00000010, - Water = 0x00000020, - Wind = 0x00000040, - Sensor = 0x00000080, - Selected = 0x00000100 -} \ No newline at end of file diff --git a/OpenSim/Region/Physics/BulletDotNETPlugin/BulletDotNETPrim.cs b/OpenSim/Region/Physics/BulletDotNETPlugin/BulletDotNETPrim.cs deleted file mode 100644 index dc3229a..0000000 --- a/OpenSim/Region/Physics/BulletDotNETPlugin/BulletDotNETPrim.cs +++ /dev/null @@ -1,2767 +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; -using System.Collections.Generic; -using System.Reflection; -using System.Runtime.InteropServices; -using System.Threading; -using log4net; -using OpenMetaverse; -using BulletDotNET; -using OpenSim.Framework; -using OpenSim.Region.Physics.Manager; - - -namespace OpenSim.Region.Physics.BulletDotNETPlugin -{ - public class BulletDotNETPrim : PhysicsActor - { - private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); - - private Vector3 _position; - private Vector3 m_zeroPosition; - private Vector3 _velocity; - private Vector3 _torque; - private Vector3 m_lastVelocity; - private Vector3 m_lastposition; - private Quaternion m_lastorientation = Quaternion.Identity; - private Vector3 m_rotationalVelocity; - private Vector3 _size; - private Vector3 _acceleration; - // private d.Vector3 _zeroPosition = new d.Vector3(0.0f, 0.0f, 0.0f); - private Quaternion _orientation; - private Vector3 m_taintposition; - private Vector3 m_taintsize; - private Vector3 m_taintVelocity; - private Vector3 m_taintTorque; - private Quaternion m_taintrot; - private Vector3 m_angularlock = Vector3.One; - private Vector3 m_taintAngularLock = Vector3.One; - // private btGeneric6DofConstraint Amotor; - - private Vector3 m_PIDTarget; - private float m_PIDTau; - private float m_PIDHoverHeight; - private float m_PIDHoverTau; - private bool m_useHoverPID; - private PIDHoverType m_PIDHoverType = PIDHoverType.Ground; - private float m_targetHoverHeight; - private float m_groundHeight; - private float m_waterHeight; - private float PID_D = 35f; - private float PID_G = 25f; - // private float m_tensor = 5f; - // private int body_autodisable_frames = 20; - private IMesh primMesh; - - private bool m_usePID; - - private const CollisionCategories m_default_collisionFlags = (CollisionCategories.Geom - | CollisionCategories.Space - | CollisionCategories.Body - | CollisionCategories.Character - ); - - private bool m_taintshape; - private bool m_taintPhysics; - // private bool m_collidesLand = true; - private bool m_collidesWater; - public bool m_returnCollisions; - - // Default we're a Geometry - // private CollisionCategories m_collisionCategories = (CollisionCategories.Geom); - - // Default, Collide with Other Geometries, spaces and Bodies - // private CollisionCategories m_collisionFlags = m_default_collisionFlags; - - public bool m_taintremove; - public bool m_taintdisable; - public bool m_disabled; - public bool m_taintadd; - public bool m_taintselected; - public bool m_taintCollidesWater; - - public uint m_localID; - - //public GCHandle gc; - // private CollisionLocker ode; - - private bool m_taintforce; - private bool m_taintaddangularforce; - private Vector3 m_force; - private List m_forcelist = new List(); - private List m_angularforcelist = new List(); - - private IMesh _mesh; - private PrimitiveBaseShape _pbs; - private BulletDotNETScene _parent_scene; - public btCollisionShape prim_geom; - public IntPtr _triMeshData; - - private PhysicsActor _parent; - private PhysicsActor m_taintparent; - - private List childrenPrim = new List(); - - private bool iscolliding; - private bool m_isphysical; - private bool m_isSelected; - - internal bool m_isVolumeDetect; // If true, this prim only detects collisions but doesn't collide actively - - private bool m_throttleUpdates; - // private int throttleCounter; - public int m_interpenetrationcount; - public float m_collisionscore; - public int m_roundsUnderMotionThreshold; - private int m_crossingfailures; - - public float m_buoyancy; - - public bool outofBounds; - private float m_density = 10.000006836f; // Aluminum g/cm3; - - public bool _zeroFlag; - private bool m_lastUpdateSent; - - - private String m_primName; - private Vector3 _target_velocity; - - public int m_eventsubscription; - private int m_requestedUpdateFrequency = 0; - private CollisionEventUpdate CollisionEventsThisFrame = null; - - public volatile bool childPrim; - - private btVector3 tempPosition1; - private btVector3 tempPosition2; - private btVector3 tempPosition3; - private btVector3 tempSize1; - private btVector3 tempSize2; - private btVector3 tempLinearVelocity1; - private btVector3 tempLinearVelocity2; - private btVector3 tempAngularVelocity1; - private btVector3 tempAngularVelocity2; - private btVector3 tempInertia1; - private btVector3 tempInertia2; - private btVector3 tempAddForce; - private btQuaternion tempOrientation1; - private btQuaternion tempOrientation2; - private btMotionState tempMotionState1; - private btMotionState tempMotionState2; - private btMotionState tempMotionState3; - private btTransform tempTransform1; - private btTransform tempTransform2; - private btTransform tempTransform3; - private btTransform tempTransform4; - private btTriangleIndexVertexArray btshapeArray; - private btVector3 AxisLockAngleHigh; - private btVector3 AxisLockLinearLow; - private btVector3 AxisLockLinearHigh; - private bool forceenable = false; - - private btGeneric6DofConstraint m_aMotor; - - public btRigidBody Body; - - public BulletDotNETPrim(String primName, BulletDotNETScene parent_scene, Vector3 pos, Vector3 size, - Quaternion rotation, IMesh mesh, PrimitiveBaseShape pbs, bool pisPhysical) - { - tempPosition1 = new btVector3(0, 0, 0); - tempPosition2 = new btVector3(0, 0, 0); - tempPosition3 = new btVector3(0, 0, 0); - tempSize1 = new btVector3(0, 0, 0); - tempSize2 = new btVector3(0, 0, 0); - tempLinearVelocity1 = new btVector3(0, 0, 0); - tempLinearVelocity2 = new btVector3(0, 0, 0); - tempAngularVelocity1 = new btVector3(0, 0, 0); - tempAngularVelocity2 = new btVector3(0, 0, 0); - tempInertia1 = new btVector3(0, 0, 0); - tempInertia2 = new btVector3(0, 0, 0); - tempOrientation1 = new btQuaternion(0, 0, 0, 1); - tempOrientation2 = new btQuaternion(0, 0, 0, 1); - _parent_scene = parent_scene; - tempTransform1 = new btTransform(_parent_scene.QuatIdentity, _parent_scene.VectorZero); - tempTransform2 = new btTransform(_parent_scene.QuatIdentity, _parent_scene.VectorZero); ; - tempTransform3 = new btTransform(_parent_scene.QuatIdentity, _parent_scene.VectorZero); ; - tempTransform4 = new btTransform(_parent_scene.QuatIdentity, _parent_scene.VectorZero); ; - - tempMotionState1 = new btDefaultMotionState(_parent_scene.TransZero); - tempMotionState2 = new btDefaultMotionState(_parent_scene.TransZero); - tempMotionState3 = new btDefaultMotionState(_parent_scene.TransZero); - - - AxisLockLinearLow = new btVector3(-1 * (int)Constants.RegionSize, -1 * (int)Constants.RegionSize, -1 * (int)Constants.RegionSize); - int regionsize = (int)Constants.RegionSize; - - if (regionsize == 256) - regionsize = 512; - - AxisLockLinearHigh = new btVector3((int)Constants.RegionSize, (int)Constants.RegionSize, (int)Constants.RegionSize); - - _target_velocity = Vector3.Zero; - _velocity = Vector3.Zero; - _position = pos; - m_taintposition = pos; - PID_D = parent_scene.bodyPIDD; - PID_G = parent_scene.bodyPIDG; - m_density = parent_scene.geomDefaultDensity; - // m_tensor = parent_scene.bodyMotorJointMaxforceTensor; - // body_autodisable_frames = parent_scene.bodyFramesAutoDisable; - - prim_geom = null; - Body = null; - - if (size.X <= 0) size.X = 0.01f; - if (size.Y <= 0) size.Y = 0.01f; - if (size.Z <= 0) size.Z = 0.01f; - - _size = size; - m_taintsize = _size; - _acceleration = Vector3.Zero; - m_rotationalVelocity = Vector3.Zero; - _orientation = rotation; - m_taintrot = _orientation; - _mesh = mesh; - _pbs = pbs; - - _parent_scene = parent_scene; - - if (pos.Z < 0) - m_isphysical = false; - else - { - m_isphysical = pisPhysical; - // If we're physical, we need to be in the master space for now. - // linksets *should* be in a space together.. but are not currently - } - m_primName = primName; - m_taintadd = true; - _parent_scene.AddPhysicsActorTaint(this); - - } - - #region PhysicsActor overrides - - public override bool Stopped - { - get { return _zeroFlag; } - } - - public override Vector3 Size - { - get { return _size; } - set { _size = value; } - } - - public override PrimitiveBaseShape Shape - { - set - { - _pbs = value; - m_taintshape = true; - } - } - - public override uint LocalID - { - set - { - //m_log.Info("[PHYSICS]: Setting TrackerID: " + value); - m_localID = value; - } - } - - public override bool Grabbed - { - set { return; } - } - - public override bool Selected - { - set - { - // This only makes the object not collidable if the object - // is physical or the object is modified somehow *IN THE FUTURE* - // without this, if an avatar selects prim, they can walk right - // through it while it's selected - m_collisionscore = 0; - if ((m_isphysical && !_zeroFlag) || !value) - { - m_taintselected = value; - _parent_scene.AddPhysicsActorTaint(this); - } - else - { - m_taintselected = value; - m_isSelected = value; - } - } - } - - public override void CrossingFailure() - { - m_crossingfailures++; - if (m_crossingfailures > _parent_scene.geomCrossingFailuresBeforeOutofbounds) - { - base.RaiseOutOfBounds(_position); - return; - } - else if (m_crossingfailures == _parent_scene.geomCrossingFailuresBeforeOutofbounds) - { - m_log.Warn("[PHYSICS]: Too many crossing failures for: " + m_primName); - } - } - public override void link(PhysicsActor obj) - { - m_taintparent = obj; - } - - public override void delink() - { - m_taintparent = null; - } - - public override void LockAngularMotion(Vector3 axis) - { - m_log.DebugFormat("[axislock]: <{0},{1},{2}>", axis.X, axis.Y, axis.Z); - m_taintAngularLock = axis; - } - - public override Vector3 Position - { - get { return _position; } - - set - { - _position = value; - //m_log.Info("[PHYSICS]: " + _position.ToString()); - } - } - - public override float Mass - { - get { return CalculateMass(); } - } - - public override Vector3 Force - { - //get { return Vector3.Zero; } - get { return m_force; } - set { m_force = value; } - } - - public override int VehicleType - { - get { return 0; } - set { return; } - } - - public override void VehicleFloatParam(int param, float value) - { - //TODO: - } - - public override void VehicleVectorParam(int param, Vector3 value) - { - //TODO: - } - - public override void VehicleRotationParam(int param, Quaternion rotation) - { - //TODO: - } - - public override void VehicleFlags(int param, bool remove) - { - - } - - public override void SetVolumeDetect(int param) - { - //TODO: GhostObject - m_isVolumeDetect = (param != 0); - - } - - public override Vector3 GeometricCenter - { - get { return Vector3.Zero; } - } - - public override Vector3 CenterOfMass - { - get { return Vector3.Zero; } - } - - public override Vector3 Velocity - { - get - { - // Averate previous velocity with the new one so - // client object interpolation works a 'little' better - Vector3 returnVelocity; - returnVelocity.X = (m_lastVelocity.X + _velocity.X) / 2; - returnVelocity.Y = (m_lastVelocity.Y + _velocity.Y) / 2; - returnVelocity.Z = (m_lastVelocity.Z + _velocity.Z) / 2; - return returnVelocity; - } - set - { - _velocity = value; - - m_taintVelocity = value; - _parent_scene.AddPhysicsActorTaint(this); - } - } - - public override Vector3 Torque - { - get - { - if (!m_isphysical || Body.Handle == IntPtr.Zero) - return Vector3.Zero; - - return _torque; - } - - set - { - m_taintTorque = value; - _parent_scene.AddPhysicsActorTaint(this); - } - } - - public override float CollisionScore - { - get { return m_collisionscore; } - set { m_collisionscore = value; } - } - - public override Vector3 Acceleration - { - get { return _acceleration; } - } - - public override Quaternion Orientation - { - get { return _orientation; } - set { _orientation = value; } - } - - public override int PhysicsActorType - { - get { return (int)ActorTypes.Prim; } - set { return; } - } - - public override bool IsPhysical - { - get { return m_isphysical; } - set { m_isphysical = value; } - } - - public override bool Flying - { - // no flying prims for you - get { return false; } - set { } - } - - public override bool SetAlwaysRun - { - get { return false; } - set { return; } - } - - public override bool ThrottleUpdates - { - get { return m_throttleUpdates; } - set { m_throttleUpdates = value; } - } - - public override bool IsColliding - { - get { return iscolliding; } - set { iscolliding = value; } - } - - public override bool CollidingGround - { - get { return false; } - set { return; } - } - - public override bool CollidingObj - { - get { return false; } - set { return; } - } - - public override bool FloatOnWater - { - set - { - m_taintCollidesWater = value; - _parent_scene.AddPhysicsActorTaint(this); - } - } - - public override Vector3 RotationalVelocity - { - get - { - Vector3 pv = Vector3.Zero; - if (_zeroFlag) - return pv; - m_lastUpdateSent = false; - - if (m_rotationalVelocity.ApproxEquals(pv, 0.2f)) - return pv; - - return m_rotationalVelocity; - } - set { m_rotationalVelocity = value; } - } - - public override bool Kinematic - { - get { return false; } - set { } - } - - public override float Buoyancy - { - get { return m_buoyancy; } - set { m_buoyancy = value; } - } - - public override Vector3 PIDTarget { set { m_PIDTarget = value; ; } } - public override bool PIDActive { set { m_usePID = value; } } - public override float PIDTau { set { m_PIDTau = value; } } - - public override float PIDHoverHeight { set { m_PIDHoverHeight = value; ; } } - public override bool PIDHoverActive { set { m_useHoverPID = value; } } - public override PIDHoverType PIDHoverType { set { m_PIDHoverType = value; } } - public override float PIDHoverTau { set { m_PIDHoverTau = value; } } - - public override Quaternion APIDTarget { set { return; } } - public override bool APIDActive { set { return; } } - public override float APIDStrength { set { return; } } - public override float APIDDamping { set { return; } } - - public override void AddForce(Vector3 force, bool pushforce) - { - m_forcelist.Add(force); - m_taintforce = true; - //m_log.Info("[PHYSICS]: Added Force:" + force.ToString() + " to prim at " + Position.ToString()); - } - - public override void AddAngularForce(Vector3 force, bool pushforce) - { - m_angularforcelist.Add(force); - m_taintaddangularforce = true; - } - - public override void SetMomentum(Vector3 momentum) - { - } - - public override void SubscribeEvents(int ms) - { - m_eventsubscription = ms; - m_requestedUpdateFrequency = ms; - _parent_scene.addCollisionEventReporting(this); - } - - public override void UnSubscribeEvents() - { - _parent_scene.remCollisionEventReporting(this); - m_eventsubscription = 0; - m_requestedUpdateFrequency = 0; - } - - public override bool SubscribedEvents() - { - return (m_eventsubscription > 0); - } - - #endregion - - public void AddCollision(uint collideWith, ContactPoint contact) - { - if (CollisionEventsThisFrame == null) - { - CollisionEventsThisFrame = new CollisionEventUpdate(); - } - CollisionEventsThisFrame.addCollider(collideWith, contact); - } - - public void SendCollisions() - { - if (m_eventsubscription >= m_requestedUpdateFrequency) - { - if (CollisionEventsThisFrame != null) - { - base.SendCollisionUpdate(CollisionEventsThisFrame); - } - CollisionEventsThisFrame = null; - // m_eventsubscription = 0; - } - return; - } - - internal void Dispose() - { - //TODO: - DisableAxisMotor(); - DisposeOfBody(); - SetCollisionShape(null); - - if (tempMotionState3 != null && tempMotionState3.Handle != IntPtr.Zero) - { - tempMotionState3.Dispose(); - tempMotionState3 = null; - } - - if (tempMotionState2 != null && tempMotionState2.Handle != IntPtr.Zero) - { - tempMotionState2.Dispose(); - tempMotionState2 = null; - } - - if (tempMotionState1 != null && tempMotionState1.Handle != IntPtr.Zero) - { - tempMotionState1.Dispose(); - tempMotionState1 = null; - } - - if (tempTransform4 != null && tempTransform4.Handle != IntPtr.Zero) - { - tempTransform4.Dispose(); - tempTransform4 = null; - } - - if (tempTransform3 != null && tempTransform3.Handle != IntPtr.Zero) - { - tempTransform3.Dispose(); - tempTransform3 = null; - } - - if (tempTransform2 != null && tempTransform2.Handle != IntPtr.Zero) - { - tempTransform2.Dispose(); - tempTransform2 = null; - } - - if (tempTransform1 != null && tempTransform1.Handle != IntPtr.Zero) - { - tempTransform1.Dispose(); - tempTransform1 = null; - } - - if (tempOrientation2 != null && tempOrientation2.Handle != IntPtr.Zero) - { - tempOrientation2.Dispose(); - tempOrientation2 = null; - } - - if (tempOrientation1 != null && tempOrientation1.Handle != IntPtr.Zero) - { - tempOrientation1.Dispose(); - tempOrientation1 = null; - } - - if (tempInertia1 != null && tempInertia1.Handle != IntPtr.Zero) - { - tempInertia1.Dispose(); - tempInertia1 = null; - } - - if (tempInertia2 != null && tempInertia2.Handle != IntPtr.Zero) - { - tempInertia2.Dispose(); - tempInertia1 = null; - } - - - if (tempAngularVelocity2 != null && tempAngularVelocity2.Handle != IntPtr.Zero) - { - tempAngularVelocity2.Dispose(); - tempAngularVelocity2 = null; - } - - if (tempAngularVelocity1 != null && tempAngularVelocity1.Handle != IntPtr.Zero) - { - tempAngularVelocity1.Dispose(); - tempAngularVelocity1 = null; - } - - if (tempLinearVelocity2 != null && tempLinearVelocity2.Handle != IntPtr.Zero) - { - tempLinearVelocity2.Dispose(); - tempLinearVelocity2 = null; - } - - if (tempLinearVelocity1 != null && tempLinearVelocity1.Handle != IntPtr.Zero) - { - tempLinearVelocity1.Dispose(); - tempLinearVelocity1 = null; - } - - if (tempSize2 != null && tempSize2.Handle != IntPtr.Zero) - { - tempSize2.Dispose(); - tempSize2 = null; - } - - if (tempSize1 != null && tempSize1.Handle != IntPtr.Zero) - { - tempSize1.Dispose(); - tempSize1 = null; - } - - if (tempPosition3 != null && tempPosition3.Handle != IntPtr.Zero) - { - tempPosition3.Dispose(); - tempPosition3 = null; - } - - if (tempPosition2 != null && tempPosition2.Handle != IntPtr.Zero) - { - tempPosition2.Dispose(); - tempPosition2 = null; - } - - if (tempPosition1 != null && tempPosition1.Handle != IntPtr.Zero) - { - tempPosition1.Dispose(); - tempPosition1 = null; - } - if (AxisLockLinearLow != null && AxisLockLinearLow.Handle != IntPtr.Zero) - { - AxisLockLinearLow.Dispose(); - AxisLockLinearLow = null; - } - if (AxisLockLinearHigh != null && AxisLockLinearHigh.Handle != IntPtr.Zero) - { - AxisLockLinearHigh.Dispose(); - AxisLockLinearHigh = null; - } - - } - - - - public void ProcessTaints(float timestep) - { - if (m_taintadd) - { - // m_log.Debug("[PHYSICS]: TaintAdd"); - changeadd(timestep); - } - - if (prim_geom == null) - { - CreateGeom(IntPtr.Zero, primMesh); - - if (IsPhysical) - SetBody(Mass); - else - SetBody(0); - // m_log.Debug("[PHYSICS]: GEOM_DOESNT_EXSIT"); - } - - if (prim_geom.Handle == IntPtr.Zero) - { - CreateGeom(IntPtr.Zero, primMesh); - - if (IsPhysical) - SetBody(Mass); - else - SetBody(0); - // m_log.Debug("[PHYSICS]: GEOM_DOESNT_EXSIT"); - - } - - if (!_position.ApproxEquals(m_taintposition, 0f)) - { - // m_log.Debug("[PHYSICS]: TaintMove"); - changemove(timestep); - } - if (m_taintrot != _orientation) - { - // m_log.Debug("[PHYSICS]: TaintRotate"); - rotate(timestep); - } // - - if (m_taintPhysics != m_isphysical && !(m_taintparent != _parent)) - { - // m_log.Debug("[PHYSICS]: TaintPhysics"); - changePhysicsStatus(timestep); - } - // - - if (!_size.ApproxEquals(m_taintsize, 0f)) - { - // m_log.Debug("[PHYSICS]: TaintSize"); - changesize(timestep); - } - - // - - if (m_taintshape) - { - // m_log.Debug("[PHYSICS]: TaintShape"); - changeshape(timestep); - } // - - if (m_taintforce) - { - // m_log.Debug("[PHYSICS]: TaintForce"); - changeAddForce(timestep); - } - if (m_taintaddangularforce) - { - // m_log.Debug("[PHYSICS]: TaintAngularForce"); - changeAddAngularForce(timestep); - } - if (!m_taintTorque.ApproxEquals(Vector3.Zero, 0.001f)) - { - // m_log.Debug("[PHYSICS]: TaintTorque"); - changeSetTorque(timestep); - } - if (m_taintdisable) - { - // m_log.Debug("[PHYSICS]: TaintDisable"); - changedisable(timestep); - } - if (m_taintselected != m_isSelected) - { - // m_log.Debug("[PHYSICS]: TaintSelected"); - changeSelectedStatus(timestep); - } - if (!m_taintVelocity.ApproxEquals(Vector3.Zero, 0.001f)) - { - // m_log.Debug("[PHYSICS]: TaintVelocity"); - changevelocity(timestep); - } - if (m_taintparent != _parent) - { - // m_log.Debug("[PHYSICS]: TaintLink"); - changelink(timestep); - } - if (m_taintCollidesWater != m_collidesWater) - { - changefloatonwater(timestep); - } - if (!m_angularlock.ApproxEquals(m_taintAngularLock, 0)) - { - // m_log.Debug("[PHYSICS]: TaintAngularLock"); - changeAngularLock(timestep); - } - if (m_taintremove) - { - DisposeOfBody(); - Dispose(); - } - - } - - #region Physics Scene Change Action routines - - private void changeadd(float timestep) - { - //SetCollisionShape(null); - // Construction of new prim - if (Body != null) - { - if (Body.Handle != IntPtr.Zero) - { - DisableAxisMotor(); - _parent_scene.removeFromWorld(this, Body); - //Body.Dispose(); - } - //Body = null; - // TODO: dispose parts that make up body - } - if (_parent_scene.needsMeshing(_pbs)) - { - // Don't need to re-enable body.. it's done in SetMesh - float meshlod = _parent_scene.meshSculptLOD; - - if (IsPhysical) - meshlod = _parent_scene.MeshSculptphysicalLOD; - - IMesh mesh = _parent_scene.mesher.CreateMesh(SOPName, _pbs, _size, meshlod, IsPhysical); - // createmesh returns null when it doesn't mesh. - CreateGeom(IntPtr.Zero, mesh); - } - else - { - _mesh = null; - CreateGeom(IntPtr.Zero, null); - } - - if (IsPhysical) - SetBody(Mass); - else - SetBody(0); - //changeSelectedStatus(timestep); - m_taintadd = false; - - } - - private void changemove(float timestep) - { - - // m_log.Debug("[PHYSICS]: _________ChangeMove"); - if (!m_isphysical) - { - tempTransform2 = Body.getWorldTransform(); - btQuaternion quat = tempTransform2.getRotation(); - tempPosition2.setValue(_position.X, _position.Y, _position.Z); - tempTransform2.Dispose(); - tempTransform2 = new btTransform(quat, tempPosition2); - Body.setWorldTransform(tempTransform2); - - changeSelectedStatus(timestep); - - resetCollisionAccounting(); - } - else - { - if (Body != null) - { - if (Body.Handle != IntPtr.Zero) - { - DisableAxisMotor(); - _parent_scene.removeFromWorld(this, Body); - //Body.Dispose(); - } - //Body = null; - // TODO: dispose parts that make up body - } - /* - if (_parent_scene.needsMeshing(_pbs)) - { - // Don't need to re-enable body.. it's done in SetMesh - float meshlod = _parent_scene.meshSculptLOD; - - if (IsPhysical) - meshlod = _parent_scene.MeshSculptphysicalLOD; - - IMesh mesh = _parent_scene.mesher.CreateMesh(SOPName, _pbs, _size, meshlod, IsPhysical); - // createmesh returns null when it doesn't mesh. - CreateGeom(IntPtr.Zero, mesh); - } - else - { - _mesh = null; - CreateGeom(IntPtr.Zero, null); - } - SetCollisionShape(prim_geom); - */ - if (m_isphysical) - SetBody(Mass); - else - SetBody(0); - changeSelectedStatus(timestep); - - resetCollisionAccounting(); - } - m_taintposition = _position; - } - - private void rotate(float timestep) - { - // m_log.Debug("[PHYSICS]: _________ChangeRotate"); - tempTransform2 = Body.getWorldTransform(); - tempOrientation2 = new btQuaternion(_orientation.X, _orientation.Y, _orientation.Z, _orientation.W); - tempTransform2.setRotation(tempOrientation2); - Body.setWorldTransform(tempTransform2); - - resetCollisionAccounting(); - m_taintrot = _orientation; - } - - private void changePhysicsStatus(float timestep) - { - if (Body != null) - { - if (Body.Handle != IntPtr.Zero) - { - DisableAxisMotor(); - _parent_scene.removeFromWorld(this, Body); - //Body.Dispose(); - } - //Body = null; - // TODO: dispose parts that make up body - } - // m_log.Debug("[PHYSICS]: _________ChangePhysics"); - - ProcessGeomCreation(); - - if (m_isphysical) - SetBody(Mass); - else - SetBody(0); - changeSelectedStatus(timestep); - - resetCollisionAccounting(); - m_taintPhysics = m_isphysical; - } - - - - internal void ProcessGeomCreation() - { - if (_parent_scene.needsMeshing(_pbs)) - { - ProcessGeomCreationAsTriMesh(Vector3.Zero, Quaternion.Identity); - // createmesh returns null when it doesn't mesh. - CreateGeom(IntPtr.Zero, _mesh); - } - else - { - _mesh = null; - CreateGeom(IntPtr.Zero, null); - } - SetCollisionShape(prim_geom); - } - - internal bool NeedsMeshing() - { - return _parent_scene.needsMeshing(_pbs); - } - - internal void ProcessGeomCreationAsTriMesh(Vector3 positionOffset, Quaternion orientation) - { - // Don't need to re-enable body.. it's done in SetMesh - float meshlod = _parent_scene.meshSculptLOD; - - if (IsPhysical) - meshlod = _parent_scene.MeshSculptphysicalLOD; - - IMesh mesh = _parent_scene.mesher.CreateMesh(SOPName, _pbs, _size, meshlod, IsPhysical); - if (!positionOffset.ApproxEquals(Vector3.Zero, 0.001f) || orientation != Quaternion.Identity) - { - - float[] xyz = new float[3]; - xyz[0] = positionOffset.X; - xyz[1] = positionOffset.Y; - xyz[2] = positionOffset.Z; - - Matrix4 m4 = Matrix4.CreateFromQuaternion(orientation); - - float[,] matrix = new float[3, 3]; - - matrix[0, 0] = m4.M11; - matrix[0, 1] = m4.M12; - matrix[0, 2] = m4.M13; - matrix[1, 0] = m4.M21; - matrix[1, 1] = m4.M22; - matrix[1, 2] = m4.M23; - matrix[2, 0] = m4.M31; - matrix[2, 1] = m4.M32; - matrix[2, 2] = m4.M33; - - - mesh.TransformLinear(matrix, xyz); - - - - } - - _mesh = mesh; - } - - private void changesize(float timestep) - { - if (Body != null) - { - if (Body.Handle != IntPtr.Zero) - { - DisableAxisMotor(); - _parent_scene.removeFromWorld(this, Body); - //Body.Dispose(); - } - //Body = null; - // TODO: dispose parts that make up body - } - - // m_log.Debug("[PHYSICS]: _________ChangeSize"); - SetCollisionShape(null); - // Construction of new prim - ProcessGeomCreation(); - - if (IsPhysical) - SetBody(Mass); - else - SetBody(0); - - m_taintsize = _size; - - } - - private void changeshape(float timestep) - { - if (Body != null) - { - if (Body.Handle != IntPtr.Zero) - { - DisableAxisMotor(); - _parent_scene.removeFromWorld(this, Body); - //Body.Dispose(); - } - //Body = null; - // TODO: dispose parts that make up body - } - // Cleanup of old prim geometry and Bodies - if (IsPhysical && Body != null && Body.Handle != IntPtr.Zero) - { - if (childPrim) - { - if (_parent != null) - { - BulletDotNETPrim parent = (BulletDotNETPrim)_parent; - parent.ChildDelink(this); - } - } - else - { - //disableBody(); - } - } - try - { - //SetCollisionShape(null); - } - catch (System.AccessViolationException) - { - //prim_geom = IntPtr.Zero; - m_log.Error("[PHYSICS]: PrimGeom dead"); - } - - // we don't need to do space calculation because the client sends a position update also. - if (_size.X <= 0) _size.X = 0.01f; - if (_size.Y <= 0) _size.Y = 0.01f; - if (_size.Z <= 0) _size.Z = 0.01f; - // Construction of new prim - - ProcessGeomCreation(); - - tempPosition1.setValue(_position.X, _position.Y, _position.Z); - if (tempOrientation1.Handle != IntPtr.Zero) - tempOrientation1.Dispose(); - tempOrientation1 = new btQuaternion(_orientation.X, Orientation.Y, _orientation.Z, _orientation.W); - if (tempTransform1 != null && tempTransform1.Handle != IntPtr.Zero) - tempTransform1.Dispose(); - tempTransform1 = new btTransform(tempOrientation1, tempPosition1); - - - - - //d.GeomBoxSetLengths(prim_geom, _size.X, _size.Y, _size.Z); - if (IsPhysical) - { - SetBody(Mass); - // Re creates body on size. - // EnableBody also does setMass() - - } - else - { - SetBody(0); - } - - changeSelectedStatus(timestep); - if (childPrim) - { - if (_parent is BulletDotNETPrim) - { - BulletDotNETPrim parent = (BulletDotNETPrim)_parent; - parent.ChildSetGeom(this); - } - } - resetCollisionAccounting(); - - m_taintshape = false; - } - - private void resetCollisionAccounting() - { - m_collisionscore = 0; - } - - private void ChildSetGeom(BulletDotNETPrim bulletDotNETPrim) - { - // TODO: throw new NotImplementedException(); - } - - private void changeAddForce(float timestep) - { - if (!m_isSelected) - { - lock (m_forcelist) - { - //m_log.Info("[PHYSICS]: dequeing forcelist"); - if (IsPhysical) - { - Vector3 iforce = Vector3.Zero; - for (int i = 0; i < m_forcelist.Count; i++) - { - iforce = iforce + m_forcelist[i]; - } - - if (Body != null && Body.Handle != IntPtr.Zero) - { - if (tempAddForce != null && tempAddForce.Handle != IntPtr.Zero) - tempAddForce.Dispose(); - enableBodySoft(); - tempAddForce = new btVector3(iforce.X, iforce.Y, iforce.Z); - Body.applyCentralImpulse(tempAddForce); - } - } - m_forcelist.Clear(); - } - - m_collisionscore = 0; - m_interpenetrationcount = 0; - } - - m_taintforce = false; - - } - - private void changeAddAngularForce(float timestep) - { - if (!m_isSelected) - { - lock (m_angularforcelist) - { - //m_log.Info("[PHYSICS]: dequeing forcelist"); - if (IsPhysical) - { - Vector3 iforce = Vector3.Zero; - for (int i = 0; i < m_angularforcelist.Count; i++) - { - iforce = iforce + m_angularforcelist[i]; - } - - if (Body != null && Body.Handle != IntPtr.Zero) - { - if (tempAddForce != null && tempAddForce.Handle != IntPtr.Zero) - tempAddForce.Dispose(); - enableBodySoft(); - tempAddForce = new btVector3(iforce.X, iforce.Y, iforce.Z); - Body.applyTorqueImpulse(tempAddForce); - } - - } - m_angularforcelist.Clear(); - } - - m_collisionscore = 0; - m_interpenetrationcount = 0; - } - - m_taintaddangularforce = false; - } - - private void changeSetTorque(float timestep) - { - if (!m_isSelected) - { - if (IsPhysical) - { - if (Body != null && Body.Handle != IntPtr.Zero) - { - tempAngularVelocity2.setValue(m_taintTorque.X, m_taintTorque.Y, m_taintTorque.Z); - Body.applyTorque(tempAngularVelocity2); - } - } - } - m_taintTorque = Vector3.Zero; - } - - private void changedisable(float timestep) - { - // TODO: throw new NotImplementedException(); - } - - private void changeSelectedStatus(float timestep) - { - // TODO: throw new NotImplementedException(); - if (m_taintselected) - { - // Body.setCollisionFlags((int)ContactFlags.CF_NO_CONTACT_RESPONSE); - disableBodySoft(); - - } - else - { - // Body.setCollisionFlags(0 | (int)ContactFlags.CF_CUSTOM_MATERIAL_CALLBACK); - enableBodySoft(); - } - m_isSelected = m_taintselected; - - } - - private void changevelocity(float timestep) - { - if (!m_isSelected) - { - if (IsPhysical) - { - if (Body != null && Body.Handle != IntPtr.Zero) - { - tempLinearVelocity2.setValue(m_taintVelocity.X, m_taintVelocity.Y, m_taintVelocity.Z); - Body.setLinearVelocity(tempLinearVelocity2); - } - } - - //resetCollisionAccounting(); - } - m_taintVelocity = Vector3.Zero; - } - - private void changelink(float timestep) - { - if (IsPhysical) - { - // Construction of new prim - if (Body != null) - { - if (Body.Handle != IntPtr.Zero) - { - DisableAxisMotor(); - _parent_scene.removeFromWorld(this, Body); - //Body.Dispose(); - } - //Body = null; - // TODO: dispose parts that make up body - } - - if (_parent == null && m_taintparent != null) - { - - if (m_taintparent is BulletDotNETPrim) - { - BulletDotNETPrim obj = (BulletDotNETPrim)m_taintparent; - obj.ParentPrim(this); - childPrim = true; - - } - } - else if (_parent != null && m_taintparent == null) - { - if (_parent is BulletDotNETPrim) - { - BulletDotNETPrim obj = (BulletDotNETPrim)_parent; - obj.ChildDelink(obj); - - childPrim = false; - } - } - - if (m_taintparent != null) - { - Vector3 taintparentPosition = m_taintparent.Position; - taintparentPosition.Z = m_taintparent.Position.Z + 0.02f; - m_taintparent.Position = taintparentPosition; - _parent_scene.AddPhysicsActorTaint(m_taintparent); - } - } - _parent = m_taintparent; - - m_taintPhysics = m_isphysical; - - } - - private void changefloatonwater(float timestep) - { - // TODO: throw new NotImplementedException(); - } - - private void changeAngularLock(float timestep) - { - if (IsPhysical && Body != null && Body.Handle != IntPtr.Zero) - { - if (_parent == null) - { - if (!m_taintAngularLock.ApproxEquals(Vector3.One, 0f)) - { - //d.BodySetFiniteRotationMode(Body, 0); - //d.BodySetFiniteRotationAxis(Body,m_taintAngularLock.X,m_taintAngularLock.Y,m_taintAngularLock.Z); - EnableAxisMotor(m_taintAngularLock); - } - else - { - DisableAxisMotor(); - } - } - - } - m_angularlock = m_taintAngularLock; - - } - #endregion - - - - - internal void Move(float timestep) - { - //TODO: - float fx = 0; - float fy = 0; - float fz = 0; - - if (IsPhysical && Body != null && Body.Handle != IntPtr.Zero && !m_isSelected) - { - float m_mass = CalculateMass(); - - fz = 0f; - //m_log.Info(m_collisionFlags.ToString()); - - if (m_buoyancy != 0) - { - if (m_buoyancy > 0) - { - fz = (((-1 * _parent_scene.gravityz) * m_buoyancy) * m_mass) * 0.035f; - - //d.Vector3 l_velocity = d.BodyGetLinearVel(Body); - //m_log.Info("Using Buoyancy: " + buoyancy + " G: " + (_parent_scene.gravityz * m_buoyancy) + "mass:" + m_mass + " Pos: " + Position.ToString()); - } - else - { - fz = (-1 * (((-1 * _parent_scene.gravityz) * (-1 * m_buoyancy)) * m_mass) * 0.035f); - } - } - - if (m_usePID) - { - PID_D = 61f; - PID_G = 65f; - //if (!d.BodyIsEnabled(Body)) - //d.BodySetForce(Body, 0f, 0f, 0f); - // If we're using the PID controller, then we have no gravity - fz = ((-1 * _parent_scene.gravityz) * m_mass) * 1.025f; - - // no lock; for now it's only called from within Simulate() - - // If the PID Controller isn't active then we set our force - // calculating base velocity to the current position - - if ((m_PIDTau < 1) && (m_PIDTau != 0)) - { - //PID_G = PID_G / m_PIDTau; - m_PIDTau = 1; - } - - if ((PID_G - m_PIDTau) <= 0) - { - PID_G = m_PIDTau + 1; - } - - // TODO: NEED btVector3 for Linear Velocity - // NEED btVector3 for Position - - Vector3 pos = _position; //TODO: Insert values gotten from bullet - Vector3 vel = _velocity; - - _target_velocity = - new Vector3( - (m_PIDTarget.X - pos.X) * ((PID_G - m_PIDTau) * timestep), - (m_PIDTarget.Y - pos.Y) * ((PID_G - m_PIDTau) * timestep), - (m_PIDTarget.Z - pos.Z) * ((PID_G - m_PIDTau) * timestep) - ); - - if (_target_velocity.ApproxEquals(Vector3.Zero, 0.1f)) - { - - /* TODO: Do Bullet equiv - * - d.BodySetPosition(Body, m_PIDTarget.X, m_PIDTarget.Y, m_PIDTarget.Z); - d.BodySetLinearVel(Body, 0, 0, 0); - d.BodyAddForce(Body, 0, 0, fz); - return; - */ - } - else - { - _zeroFlag = false; - - fx = ((_target_velocity.X) - vel.X) * (PID_D); - fy = ((_target_velocity.Y) - vel.Y) * (PID_D); - fz = fz + ((_target_velocity.Z - vel.Z) * (PID_D) * m_mass); - - } - - } - - if (m_useHoverPID && !m_usePID) - { - // If we're using the PID controller, then we have no gravity - fz = (-1 * _parent_scene.gravityz) * m_mass; - - // no lock; for now it's only called from within Simulate() - - // If the PID Controller isn't active then we set our force - // calculating base velocity to the current position - - if ((m_PIDTau < 1)) - { - PID_G = PID_G / m_PIDTau; - } - - if ((PID_G - m_PIDTau) <= 0) - { - PID_G = m_PIDTau + 1; - } - Vector3 pos = Vector3.Zero; //TODO: Insert values gotten from bullet - Vector3 vel = Vector3.Zero; - - // determine what our target height really is based on HoverType - switch (m_PIDHoverType) - { - case PIDHoverType.Absolute: - m_targetHoverHeight = m_PIDHoverHeight; - break; - case PIDHoverType.Ground: - m_groundHeight = _parent_scene.GetTerrainHeightAtXY(pos.X, pos.Y); - m_targetHoverHeight = m_groundHeight + m_PIDHoverHeight; - break; - case PIDHoverType.GroundAndWater: - m_groundHeight = _parent_scene.GetTerrainHeightAtXY(pos.X, pos.Y); - m_waterHeight = _parent_scene.GetWaterLevel(); - if (m_groundHeight > m_waterHeight) - { - m_targetHoverHeight = m_groundHeight + m_PIDHoverHeight; - } - else - { - m_targetHoverHeight = m_waterHeight + m_PIDHoverHeight; - } - break; - case PIDHoverType.Water: - m_waterHeight = _parent_scene.GetWaterLevel(); - m_targetHoverHeight = m_waterHeight + m_PIDHoverHeight; - break; - } - - - _target_velocity = - new Vector3(0.0f, 0.0f, - (m_targetHoverHeight - pos.Z) * ((PID_G - m_PIDHoverTau) * timestep) - ); - - // if velocity is zero, use position control; otherwise, velocity control - - if (_target_velocity.ApproxEquals(Vector3.Zero, 0.1f)) - { - - /* TODO: Do Bullet Equiv - d.BodySetPosition(Body, pos.X, pos.Y, m_targetHoverHeight); - d.BodySetLinearVel(Body, vel.X, vel.Y, 0); - d.BodyAddForce(Body, 0, 0, fz); - */ - if (Body != null && Body.Handle != IntPtr.Zero) - { - Body.setLinearVelocity(_parent_scene.VectorZero); - Body.clearForces(); - } - return; - } - else - { - _zeroFlag = false; - - // We're flying and colliding with something - fz = fz + ((_target_velocity.Z - vel.Z) * (PID_D) * m_mass); - } - } - - fx *= m_mass; - fy *= m_mass; - //fz *= m_mass; - - fx += m_force.X; - fy += m_force.Y; - fz += m_force.Z; - - //m_log.Info("[OBJPID]: X:" + fx.ToString() + " Y:" + fy.ToString() + " Z:" + fz.ToString()); - if (fx != 0 || fy != 0 || fz != 0) - { - /* - * TODO: Do Bullet Equiv - if (!d.BodyIsEnabled(Body)) - { - d.BodySetLinearVel(Body, 0f, 0f, 0f); - d.BodySetForce(Body, 0, 0, 0); - enableBodySoft(); - } - */ - if (!Body.isActive()) - { - Body.clearForces(); - enableBodySoft(); - } - // 35x10 = 350n times the mass per second applied maximum. - - float nmax = 35f * m_mass; - float nmin = -35f * m_mass; - - - if (fx > nmax) - fx = nmax; - if (fx < nmin) - fx = nmin; - if (fy > nmax) - fy = nmax; - if (fy < nmin) - fy = nmin; - - // TODO: Do Bullet Equiv - // d.BodyAddForce(Body, fx, fy, fz); - if (Body != null && Body.Handle != IntPtr.Zero) - { - Body.activate(true); - if (tempAddForce != null && tempAddForce.Handle != IntPtr.Zero) - tempAddForce.Dispose(); - - tempAddForce = new btVector3(fx * 0.01f, fy * 0.01f, fz * 0.01f); - Body.applyCentralImpulse(tempAddForce); - } - } - else - { - // if no forces on the prim, make sure everything is zero - Body.clearForces(); - enableBodySoft(); - } - } - else - { - if (m_zeroPosition == null) - m_zeroPosition = Vector3.Zero; - m_zeroPosition = _position; - return; - } - } - - - - - #region Mass Calculation - - private float CalculateMass() - { - float volume = 0; - - // No material is passed to the physics engines yet.. soo.. - // we're using the m_density constant in the class definition - - float returnMass = 0; - - switch (_pbs.ProfileShape) - { - case ProfileShape.Square: - // Profile Volume - - volume = _size.X * _size.Y * _size.Z; - - // If the user has 'hollowed out' - // ProfileHollow is one of those 0 to 50000 values :P - // we like percentages better.. so turning into a percentage - - if (((float)_pbs.ProfileHollow / 50000f) > 0.0) - { - float hollowAmount = (float)_pbs.ProfileHollow / 50000f; - - // calculate the hollow volume by it's shape compared to the prim shape - float hollowVolume = 0; - switch (_pbs.HollowShape) - { - case HollowShape.Square: - case HollowShape.Same: - // Cube Hollow volume calculation - float hollowsizex = _size.X * hollowAmount; - float hollowsizey = _size.Y * hollowAmount; - float hollowsizez = _size.Z * hollowAmount; - hollowVolume = hollowsizex * hollowsizey * hollowsizez; - break; - - case HollowShape.Circle: - // Hollow shape is a perfect cyllinder in respect to the cube's scale - // Cyllinder hollow volume calculation - float hRadius = _size.X / 2; - float hLength = _size.Z; - - // pi * r2 * h - hollowVolume = ((float)(Math.PI * Math.Pow(hRadius, 2) * hLength) * hollowAmount); - break; - - case HollowShape.Triangle: - // Equilateral Triangular Prism volume hollow calculation - // Triangle is an Equilateral Triangular Prism with aLength = to _size.Y - - float aLength = _size.Y; - // 1/2 abh - hollowVolume = (float)((0.5 * aLength * _size.X * _size.Z) * hollowAmount); - break; - - default: - hollowVolume = 0; - break; - } - volume = volume - hollowVolume; - } - - break; - case ProfileShape.Circle: - if (_pbs.PathCurve == (byte)Extrusion.Straight) - { - // Cylinder - float volume1 = (float)(Math.PI * Math.Pow(_size.X / 2, 2) * _size.Z); - float volume2 = (float)(Math.PI * Math.Pow(_size.Y / 2, 2) * _size.Z); - - // Approximating the cylinder's irregularity. - if (volume1 > volume2) - { - volume = (float)volume1 - (volume1 - volume2); - } - else if (volume2 > volume1) - { - volume = (float)volume2 - (volume2 - volume1); - } - else - { - // Regular cylinder - volume = volume1; - } - } - else - { - // We don't know what the shape is yet, so use default - volume = _size.X * _size.Y * _size.Z; - } - // If the user has 'hollowed out' - // ProfileHollow is one of those 0 to 50000 values :P - // we like percentages better.. so turning into a percentage - - if (((float)_pbs.ProfileHollow / 50000f) > 0.0) - { - float hollowAmount = (float)_pbs.ProfileHollow / 50000f; - - // calculate the hollow volume by it's shape compared to the prim shape - float hollowVolume = 0; - switch (_pbs.HollowShape) - { - case HollowShape.Same: - case HollowShape.Circle: - // Hollow shape is a perfect cyllinder in respect to the cube's scale - // Cyllinder hollow volume calculation - float hRadius = _size.X / 2; - float hLength = _size.Z; - - // pi * r2 * h - hollowVolume = ((float)(Math.PI * Math.Pow(hRadius, 2) * hLength) * hollowAmount); - break; - - case HollowShape.Square: - // Cube Hollow volume calculation - float hollowsizex = _size.X * hollowAmount; - float hollowsizey = _size.Y * hollowAmount; - float hollowsizez = _size.Z * hollowAmount; - hollowVolume = hollowsizex * hollowsizey * hollowsizez; - break; - - case HollowShape.Triangle: - // Equilateral Triangular Prism volume hollow calculation - // Triangle is an Equilateral Triangular Prism with aLength = to _size.Y - - float aLength = _size.Y; - // 1/2 abh - hollowVolume = (float)((0.5 * aLength * _size.X * _size.Z) * hollowAmount); - break; - - default: - hollowVolume = 0; - break; - } - volume = volume - hollowVolume; - } - break; - - case ProfileShape.HalfCircle: - if (_pbs.PathCurve == (byte)Extrusion.Curve1) - { - if (_size.X == _size.Y && _size.Z == _size.X) - { - // regular sphere - // v = 4/3 * pi * r^3 - float sradius3 = (float)Math.Pow((_size.X / 2), 3); - volume = (float)((4 / 3f) * Math.PI * sradius3); - } - else - { - // we treat this as a box currently - volume = _size.X * _size.Y * _size.Z; - } - } - else - { - // We don't know what the shape is yet, so use default - volume = _size.X * _size.Y * _size.Z; - } - break; - - case ProfileShape.EquilateralTriangle: - /* - v = (abs((xB*yA-xA*yB)+(xC*yB-xB*yC)+(xA*yC-xC*yA))/2) * h - - // seed mesh - Vertex MM = new Vertex(-0.25f, -0.45f, 0.0f); - Vertex PM = new Vertex(+0.5f, 0f, 0.0f); - Vertex PP = new Vertex(-0.25f, +0.45f, 0.0f); - */ - float xA = -0.25f * _size.X; - float yA = -0.45f * _size.Y; - - float xB = 0.5f * _size.X; - float yB = 0; - - float xC = -0.25f * _size.X; - float yC = 0.45f * _size.Y; - - volume = (float)((Math.Abs((xB * yA - xA * yB) + (xC * yB - xB * yC) + (xA * yC - xC * yA)) / 2) * _size.Z); - - // If the user has 'hollowed out' - // ProfileHollow is one of those 0 to 50000 values :P - // we like percentages better.. so turning into a percentage - float fhollowFactor = ((float)_pbs.ProfileHollow / 1.9f); - if (((float)fhollowFactor / 50000f) > 0.0) - { - float hollowAmount = (float)fhollowFactor / 50000f; - - // calculate the hollow volume by it's shape compared to the prim shape - float hollowVolume = 0; - switch (_pbs.HollowShape) - { - case HollowShape.Same: - case HollowShape.Triangle: - // Equilateral Triangular Prism volume hollow calculation - // Triangle is an Equilateral Triangular Prism with aLength = to _size.Y - - float aLength = _size.Y; - // 1/2 abh - hollowVolume = (float)((0.5 * aLength * _size.X * _size.Z) * hollowAmount); - break; - - case HollowShape.Square: - // Cube Hollow volume calculation - float hollowsizex = _size.X * hollowAmount; - float hollowsizey = _size.Y * hollowAmount; - float hollowsizez = _size.Z * hollowAmount; - hollowVolume = hollowsizex * hollowsizey * hollowsizez; - break; - - case HollowShape.Circle: - // Hollow shape is a perfect cyllinder in respect to the cube's scale - // Cyllinder hollow volume calculation - float hRadius = _size.X / 2; - float hLength = _size.Z; - - // pi * r2 * h - hollowVolume = ((float)((Math.PI * Math.Pow(hRadius, 2) * hLength) / 2) * hollowAmount); - break; - - default: - hollowVolume = 0; - break; - } - volume = volume - hollowVolume; - } - break; - - default: - // we don't have all of the volume formulas yet so - // use the common volume formula for all - volume = _size.X * _size.Y * _size.Z; - break; - } - - // Calculate Path cut effect on volume - // Not exact, in the triangle hollow example - // They should never be zero or less then zero.. - // we'll ignore it if it's less then zero - - // ProfileEnd and ProfileBegin are values - // from 0 to 50000 - - // Turning them back into percentages so that I can cut that percentage off the volume - - float PathCutEndAmount = _pbs.ProfileEnd; - float PathCutStartAmount = _pbs.ProfileBegin; - if (((PathCutStartAmount + PathCutEndAmount) / 50000f) > 0.0f) - { - float pathCutAmount = ((PathCutStartAmount + PathCutEndAmount) / 50000f); - - // Check the return amount for sanity - if (pathCutAmount >= 0.99f) - pathCutAmount = 0.99f; - - volume = volume - (volume * pathCutAmount); - } - UInt16 taperX = _pbs.PathScaleX; - UInt16 taperY = _pbs.PathScaleY; - float taperFactorX = 0; - float taperFactorY = 0; - - // Mass = density * volume - if (taperX != 100) - { - if (taperX > 100) - { - taperFactorX = 1.0f - ((float)taperX / 200); - //m_log.Warn("taperTopFactorX: " + extr.taperTopFactorX.ToString()); - } - else - { - taperFactorX = 1.0f - ((100 - (float)taperX) / 100); - //m_log.Warn("taperBotFactorX: " + extr.taperBotFactorX.ToString()); - } - volume = (float)volume * ((taperFactorX / 3f) + 0.001f); - } - - if (taperY != 100) - { - if (taperY > 100) - { - taperFactorY = 1.0f - ((float)taperY / 200); - //m_log.Warn("taperTopFactorY: " + extr.taperTopFactorY.ToString()); - } - else - { - taperFactorY = 1.0f - ((100 - (float)taperY) / 100); - //m_log.Warn("taperBotFactorY: " + extr.taperBotFactorY.ToString()); - } - volume = (float)volume * ((taperFactorY / 3f) + 0.001f); - } - returnMass = m_density * volume; - if (returnMass <= 0) returnMass = 0.0001f;//ckrinke: Mass must be greater then zero. - - - - // Recursively calculate mass - bool HasChildPrim = false; - lock (childrenPrim) - { - if (childrenPrim.Count > 0) - { - HasChildPrim = true; - } - - } - if (HasChildPrim) - { - BulletDotNETPrim[] childPrimArr = new BulletDotNETPrim[0]; - - lock (childrenPrim) - childPrimArr = childrenPrim.ToArray(); - - for (int i = 0; i < childPrimArr.Length; i++) - { - if (childPrimArr[i] != null && !childPrimArr[i].m_taintremove) - returnMass += childPrimArr[i].CalculateMass(); - // failsafe, this shouldn't happen but with OpenSim, you never know :) - if (i > 256) - break; - } - } - - - - - - return returnMass; - } - - #endregion - - - public void CreateGeom(IntPtr m_targetSpace, IMesh p_mesh) - { - // m_log.Debug("[PHYSICS]: _________CreateGeom"); - if (p_mesh != null) - { - //_mesh = _parent_scene.mesher.CreateMesh(m_primName, _pbs, _size, _parent_scene.meshSculptLOD, IsPhysical); - _mesh = p_mesh; - setMesh(_parent_scene, _mesh); - - } - else - { - if (_pbs.ProfileShape == ProfileShape.HalfCircle && _pbs.PathCurve == (byte)Extrusion.Curve1) - { - if (_size.X == _size.Y && _size.Y == _size.Z && _size.X == _size.Z) - { - if (((_size.X / 2f) > 0f)) - { - //SetGeom to a Regular Sphere - if (tempSize1 == null) - tempSize1 = new btVector3(0, 0, 0); - tempSize1.setValue(_size.X * 0.5f, _size.Y * 0.5f, _size.Z * 0.5f); - SetCollisionShape(new btSphereShape(_size.X * 0.5f)); - } - else - { - // uses halfextents - if (tempSize1 == null) - tempSize1 = new btVector3(0, 0, 0); - tempSize1.setValue(_size.X * 0.5f, _size.Y * 0.5f, _size.Z * 0.5f); - SetCollisionShape(new btBoxShape(tempSize1)); - } - } - else - { - // uses halfextents - if (tempSize1 == null) - tempSize1 = new btVector3(0, 0, 0); - tempSize1.setValue(_size.X * 0.5f, _size.Y * 0.5f, _size.Z * 0.5f); - SetCollisionShape(new btBoxShape(tempSize1)); - } - - } - else - { - if (tempSize1 == null) - tempSize1 = new btVector3(0, 0, 0); - // uses halfextents - tempSize1.setValue(_size.X * 0.5f, _size.Y * 0.5f, _size.Z * 0.5f); - SetCollisionShape(new btBoxShape(tempSize1)); - } - } - } - - private void setMesh(BulletDotNETScene _parent_scene, IMesh mesh) - { - // TODO: Set Collision Body Mesh - // This sleeper is there to moderate how long it takes between - // setting up the mesh and pre-processing it when we get rapid fire mesh requests on a single object - // m_log.Debug("_________SetMesh"); - Thread.Sleep(10); - - //Kill Body so that mesh can re-make the geom - if (IsPhysical && Body != null && Body.Handle != IntPtr.Zero) - { - if (childPrim) - { - if (_parent != null) - { - BulletDotNETPrim parent = (BulletDotNETPrim)_parent; - parent.ChildDelink(this); - } - } - else - { - //disableBody(); - } - } - - //IMesh oldMesh = primMesh; - - //primMesh = mesh; - - //float[] vertexList = primMesh.getVertexListAsFloatLocked(); // Note, that vertextList is pinned in memory - //int[] indexList = primMesh.getIndexListAsIntLocked(); // Also pinned, needs release after usage - ////Array.Reverse(indexList); - //primMesh.releaseSourceMeshData(); // free up the original mesh data to save memory - - IMesh oldMesh = primMesh; - - primMesh = mesh; - - float[] vertexList = mesh.getVertexListAsFloatLocked(); // Note, that vertextList is pinned in memory - int[] indexList = mesh.getIndexListAsIntLocked(); // Also pinned, needs release after usage - //Array.Reverse(indexList); - mesh.releaseSourceMeshData(); // free up the original mesh data to save memory - - - int VertexCount = vertexList.GetLength(0) / 3; - int IndexCount = indexList.GetLength(0); - - if (btshapeArray != null && btshapeArray.Handle != IntPtr.Zero) - btshapeArray.Dispose(); - //Array.Reverse(indexList); - btshapeArray = new btTriangleIndexVertexArray(IndexCount / 3, indexList, (3 * sizeof(int)), - VertexCount, vertexList, 3 * sizeof(float)); - SetCollisionShape(new btGImpactMeshShape(btshapeArray)); - //((btGImpactMeshShape) prim_geom).updateBound(); - ((btGImpactMeshShape)prim_geom).setLocalScaling(new btVector3(1, 1, 1)); - ((btGImpactMeshShape)prim_geom).updateBound(); - _parent_scene.SetUsingGImpact(); - //if (oldMesh != null) - //{ - // oldMesh.releasePinned(); - // oldMesh = null; - //} - - } - - private void SetCollisionShape(btCollisionShape shape) - { - /* - if (shape == null) - m_log.Debug("[PHYSICS]:SetShape!Null"); - else - m_log.Debug("[PHYSICS]:SetShape!"); - - if (Body != null) - { - DisposeOfBody(); - } - - if (prim_geom != null) - { - prim_geom.Dispose(); - prim_geom = null; - } - */ - prim_geom = shape; - - //Body.set - } - - public void SetBody(float mass) - { - - if (!IsPhysical || childrenPrim.Count == 0) - { - if (tempMotionState1 != null && tempMotionState1.Handle != IntPtr.Zero) - tempMotionState1.Dispose(); - if (tempTransform2 != null && tempTransform2.Handle != IntPtr.Zero) - tempTransform2.Dispose(); - if (tempOrientation2 != null && tempOrientation2.Handle != IntPtr.Zero) - tempOrientation2.Dispose(); - - if (tempPosition2 != null && tempPosition2.Handle != IntPtr.Zero) - tempPosition2.Dispose(); - - tempOrientation2 = new btQuaternion(_orientation.X, _orientation.Y, _orientation.Z, _orientation.W); - tempPosition2 = new btVector3(_position.X, _position.Y, _position.Z); - tempTransform2 = new btTransform(tempOrientation2, tempPosition2); - tempMotionState1 = new btDefaultMotionState(tempTransform2, _parent_scene.TransZero); - if (tempInertia1 != null && tempInertia1.Handle != IntPtr.Zero) - tempInertia1.Dispose(); - tempInertia1 = new btVector3(0, 0, 0); - - - prim_geom.calculateLocalInertia(mass, tempInertia1); - - if (mass != 0) - _parent_scene.addActivePrim(this); - else - _parent_scene.remActivePrim(this); - - // Body = new btRigidBody(mass, tempMotionState1, prim_geom); - //else - // Body = new btRigidBody(mass, tempMotionState1, prim_geom, tempInertia1); - if (Body == null) - { - Body = new btRigidBody(mass, tempMotionState1, prim_geom, tempInertia1); - // add localID so we can later map bullet object back to OpenSim object - Body.setUserPointer(new IntPtr((int)m_localID)); - } - - - if (prim_geom is btGImpactMeshShape) - { - ((btGImpactMeshShape)prim_geom).setLocalScaling(new btVector3(1, 1, 1)); - ((btGImpactMeshShape)prim_geom).updateBound(); - } - //Body.setCollisionFlags(Body.getCollisionFlags() | (int)ContactFlags.CF_CUSTOM_MATERIAL_CALLBACK); - //Body.setUserPointer((IntPtr) (int)m_localID); - _parent_scene.AddPrimToScene(this); - } - else - { - // bool hasTrimesh = false; - lock (childrenPrim) - { - foreach (BulletDotNETPrim chld in childrenPrim) - { - if (chld == null) - continue; - - // if (chld.NeedsMeshing()) - // hasTrimesh = true; - } - } - - //if (hasTrimesh) - //{ - ProcessGeomCreationAsTriMesh(Vector3.Zero, Quaternion.Identity); - // createmesh returns null when it doesn't mesh. - - /* - if (_mesh is Mesh) - { - } - else - { - m_log.Warn("[PHYSICS]: Can't link a OpenSim.Region.Physics.Meshing.Mesh object"); - return; - } - */ - - - - foreach (BulletDotNETPrim chld in childrenPrim) - { - if (chld == null) - continue; - Vector3 offset = chld.Position - Position; - Vector3 pos = new Vector3(offset.X, offset.Y, offset.Z); - pos *= Quaternion.Inverse(Orientation); - //pos *= Orientation; - offset = pos; - chld.ProcessGeomCreationAsTriMesh(offset, chld.Orientation); - - _mesh.Append(chld._mesh); - - - } - setMesh(_parent_scene, _mesh); - - //} - - if (tempMotionState1 != null && tempMotionState1.Handle != IntPtr.Zero) - tempMotionState1.Dispose(); - if (tempTransform2 != null && tempTransform2.Handle != IntPtr.Zero) - tempTransform2.Dispose(); - if (tempOrientation2 != null && tempOrientation2.Handle != IntPtr.Zero) - tempOrientation2.Dispose(); - - if (tempPosition2 != null && tempPosition2.Handle != IntPtr.Zero) - tempPosition2.Dispose(); - - tempOrientation2 = new btQuaternion(_orientation.X, _orientation.Y, _orientation.Z, _orientation.W); - tempPosition2 = new btVector3(_position.X, _position.Y, _position.Z); - tempTransform2 = new btTransform(tempOrientation2, tempPosition2); - tempMotionState1 = new btDefaultMotionState(tempTransform2, _parent_scene.TransZero); - if (tempInertia1 != null && tempInertia1.Handle != IntPtr.Zero) - tempInertia1.Dispose(); - tempInertia1 = new btVector3(0, 0, 0); - - - prim_geom.calculateLocalInertia(mass, tempInertia1); - - if (mass != 0) - _parent_scene.addActivePrim(this); - else - _parent_scene.remActivePrim(this); - - // Body = new btRigidBody(mass, tempMotionState1, prim_geom); - //else - // Body = new btRigidBody(mass, tempMotionState1, prim_geom, tempInertia1); - if (Body == null) - { - Body = new btRigidBody(mass, tempMotionState1, prim_geom, tempInertia1); - // each body has the localID stored into it so we can identify collision objects - Body.setUserPointer(new IntPtr((int)m_localID)); - } - - if (prim_geom is btGImpactMeshShape) - { - ((btGImpactMeshShape)prim_geom).setLocalScaling(new btVector3(1, 1, 1)); - ((btGImpactMeshShape)prim_geom).updateBound(); - } - _parent_scene.AddPrimToScene(this); - - } - - if (IsPhysical) - changeAngularLock(0); - } - - private void DisposeOfBody() - { - if (Body != null) - { - if (Body.Handle != IntPtr.Zero) - { - DisableAxisMotor(); - _parent_scene.removeFromWorld(this, Body); - Body.Dispose(); - } - Body = null; - // TODO: dispose parts that make up body - } - } - - private void ChildDelink(BulletDotNETPrim pPrim) - { - // Okay, we have a delinked child.. need to rebuild the body. - lock (childrenPrim) - { - foreach (BulletDotNETPrim prm in childrenPrim) - { - prm.childPrim = true; - prm.disableBody(); - - } - } - disableBody(); - - lock (childrenPrim) - { - childrenPrim.Remove(pPrim); - } - - - - - if (Body != null && Body.Handle != IntPtr.Zero) - { - _parent_scene.remActivePrim(this); - } - - - - lock (childrenPrim) - { - foreach (BulletDotNETPrim prm in childrenPrim) - { - ParentPrim(prm); - } - } - - } - - internal void ParentPrim(BulletDotNETPrim prm) - { - if (prm == null) - return; - - - - lock (childrenPrim) - { - if (!childrenPrim.Contains(prm)) - { - childrenPrim.Add(prm); - } - } - - - } - - public void disableBody() - { - //this kills the body so things like 'mesh' can re-create it. - /* - lock (this) - { - if (!childPrim) - { - if (Body != null && Body.Handle != IntPtr.Zero) - { - _parent_scene.remActivePrim(this); - - m_collisionCategories &= ~CollisionCategories.Body; - m_collisionFlags &= ~(CollisionCategories.Wind | CollisionCategories.Land); - - if (prim_geom != null && prim_geom.Handle != IntPtr.Zero) - { - // TODO: Set Category bits and Flags - } - - // TODO: destroy body - DisposeOfBody(); - - lock (childrenPrim) - { - if (childrenPrim.Count > 0) - { - foreach (BulletDotNETPrim prm in childrenPrim) - { - _parent_scene.remActivePrim(prm); - prm.DisposeOfBody(); - prm.SetCollisionShape(null); - } - } - - } - - DisposeOfBody(); - } - } - else - { - _parent_scene.remActivePrim(this); - m_collisionCategories &= ~CollisionCategories.Body; - m_collisionFlags &= ~(CollisionCategories.Wind | CollisionCategories.Land); - - if (prim_geom != null && prim_geom.Handle != IntPtr.Zero) - { - // TODO: Set Category bits and Flags - } - - DisposeOfBody(); - } - - } - */ - DisableAxisMotor(); - m_disabled = true; - m_collisionscore = 0; - } - - public void disableBodySoft() - { - m_disabled = true; - - if (m_isphysical && Body.Handle != IntPtr.Zero) - { - Body.clearForces(); - Body.forceActivationState(0); - - } - - } - - public void enableBodySoft() - { - if (!childPrim) - { - if (m_isphysical && Body.Handle != IntPtr.Zero) - { - Body.clearForces(); - Body.forceActivationState(4); - forceenable = true; - - } - m_disabled = false; - } - } - - public void enableBody() - { - if (!childPrim) - { - //SetCollisionShape(prim_geom); - if (IsPhysical) - SetBody(Mass); - else - SetBody(0); - - // TODO: Set Collision Category Bits and Flags - // TODO: Set Auto Disable data - - m_interpenetrationcount = 0; - m_collisionscore = 0; - m_disabled = false; - // The body doesn't already have a finite rotation mode set here - if ((!m_angularlock.ApproxEquals(Vector3.Zero, 0f)) && _parent == null) - { - // TODO: Create Angular Motor on Axis Lock! - } - _parent_scene.addActivePrim(this); - } - } - - public void UpdatePositionAndVelocity() - { - if (!m_isSelected) - { - if (_parent == null) - { - Vector3 pv = Vector3.Zero; - bool lastZeroFlag = _zeroFlag; - if (tempPosition3 != null && tempPosition3.Handle != IntPtr.Zero) - tempPosition3.Dispose(); - if (tempTransform3 != null && tempTransform3.Handle != IntPtr.Zero) - tempTransform3.Dispose(); - - if (tempOrientation2 != null && tempOrientation2.Handle != IntPtr.Zero) - tempOrientation2.Dispose(); - - if (tempAngularVelocity1 != null && tempAngularVelocity1.Handle != IntPtr.Zero) - tempAngularVelocity1.Dispose(); - - if (tempLinearVelocity1 != null && tempLinearVelocity1.Handle != IntPtr.Zero) - tempLinearVelocity1.Dispose(); - - - - tempTransform3 = Body.getInterpolationWorldTransform(); - tempPosition3 = tempTransform3.getOrigin(); // vec - tempOrientation2 = tempTransform3.getRotation(); // ori - tempAngularVelocity1 = Body.getInterpolationAngularVelocity(); //rotvel - tempLinearVelocity1 = Body.getInterpolationLinearVelocity(); // vel - - _torque = new Vector3(tempAngularVelocity1.getX(), tempAngularVelocity1.getX(), - tempAngularVelocity1.getZ()); - Vector3 l_position = Vector3.Zero; - Quaternion l_orientation = Quaternion.Identity; - m_lastposition = _position; - m_lastorientation = _orientation; - - l_position.X = tempPosition3.getX(); - l_position.Y = tempPosition3.getY(); - l_position.Z = tempPosition3.getZ(); - l_orientation.X = tempOrientation2.getX(); - l_orientation.Y = tempOrientation2.getY(); - l_orientation.Z = tempOrientation2.getZ(); - l_orientation.W = tempOrientation2.getW(); - - if (l_position.X > ((int)Constants.RegionSize - 0.05f) || l_position.X < 0f || l_position.Y > ((int)Constants.RegionSize - 0.05f) || l_position.Y < 0f) - { - //base.RaiseOutOfBounds(l_position); - - if (m_crossingfailures < _parent_scene.geomCrossingFailuresBeforeOutofbounds) - { - _position = l_position; - //_parent_scene.remActivePrim(this); - if (_parent == null) - base.RequestPhysicsterseUpdate(); - return; - } - else - { - if (_parent == null) - base.RaiseOutOfBounds(l_position); - return; - } - } - - if (l_position.Z < -200000f) - { - // This is so prim that get lost underground don't fall forever and suck up - // - // Sim resources and memory. - // Disables the prim's movement physics.... - // It's a hack and will generate a console message if it fails. - - //IsPhysical = false; - //if (_parent == null) - //base.RaiseOutOfBounds(_position); - - _acceleration.X = 0; - _acceleration.Y = 0; - _acceleration.Z = 0; - - _velocity.X = 0; - _velocity.Y = 0; - _velocity.Z = 0; - m_rotationalVelocity.X = 0; - m_rotationalVelocity.Y = 0; - m_rotationalVelocity.Z = 0; - - if (_parent == null) - base.RequestPhysicsterseUpdate(); - - m_throttleUpdates = false; - // throttleCounter = 0; - _zeroFlag = true; - //outofBounds = true; - } - - if ((Math.Abs(m_lastposition.X - l_position.X) < 0.02) - && (Math.Abs(m_lastposition.Y - l_position.Y) < 0.02) - && (Math.Abs(m_lastposition.Z - l_position.Z) < 0.02) - && (1.0 - Math.Abs(Quaternion.Dot(m_lastorientation, l_orientation)) < 0.01)) - { - _zeroFlag = true; - m_throttleUpdates = false; - } - else - { - //m_log.Debug(Math.Abs(m_lastposition.X - l_position.X).ToString()); - _zeroFlag = false; - } - - if (_zeroFlag) - { - _velocity.X = 0.0f; - _velocity.Y = 0.0f; - _velocity.Z = 0.0f; - - _acceleration.X = 0; - _acceleration.Y = 0; - _acceleration.Z = 0; - - //_orientation.w = 0f; - //_orientation.X = 0f; - //_orientation.Y = 0f; - //_orientation.Z = 0f; - m_rotationalVelocity.X = 0; - m_rotationalVelocity.Y = 0; - m_rotationalVelocity.Z = 0; - if (!m_lastUpdateSent) - { - m_throttleUpdates = false; - // throttleCounter = 0; - m_rotationalVelocity = pv; - - if (_parent == null) - base.RequestPhysicsterseUpdate(); - - m_lastUpdateSent = true; - } - } - else - { - if (lastZeroFlag != _zeroFlag) - { - if (_parent == null) - base.RequestPhysicsterseUpdate(); - } - - m_lastVelocity = _velocity; - - _position = l_position; - - _velocity.X = tempLinearVelocity1.getX(); - _velocity.Y = tempLinearVelocity1.getY(); - _velocity.Z = tempLinearVelocity1.getZ(); - - _acceleration = ((_velocity - m_lastVelocity) / 0.1f); - _acceleration = new Vector3(_velocity.X - m_lastVelocity.X / 0.1f, - _velocity.Y - m_lastVelocity.Y / 0.1f, - _velocity.Z - m_lastVelocity.Z / 0.1f); - //m_log.Info("[PHYSICS]: V1: " + _velocity + " V2: " + m_lastVelocity + " Acceleration: " + _acceleration.ToString()); - - if (_velocity.ApproxEquals(pv, 0.5f)) - { - m_rotationalVelocity = pv; - } - else - { - m_rotationalVelocity = new Vector3(tempAngularVelocity1.getX(), tempAngularVelocity1.getY(), tempAngularVelocity1.getZ()); - } - - //m_log.Debug("ODE: " + m_rotationalVelocity.ToString()); - - _orientation.X = l_orientation.X; - _orientation.Y = l_orientation.Y; - _orientation.Z = l_orientation.Z; - _orientation.W = l_orientation.W; - m_lastUpdateSent = false; - - //if (!m_throttleUpdates || throttleCounter > _parent_scene.geomUpdatesPerThrottledUpdate) - //{ - if (_parent == null) - base.RequestPhysicsterseUpdate(); - // } - // else - // { - // throttleCounter++; - //} - - } - m_lastposition = l_position; - if (forceenable) - { - Body.forceActivationState(1); - forceenable = false; - } - } - else - { - // Not a body.. so Make sure the client isn't interpolating - _velocity.X = 0; - _velocity.Y = 0; - _velocity.Z = 0; - - _acceleration.X = 0; - _acceleration.Y = 0; - _acceleration.Z = 0; - - m_rotationalVelocity.X = 0; - m_rotationalVelocity.Y = 0; - m_rotationalVelocity.Z = 0; - _zeroFlag = true; - } - } - } - - - internal void setPrimForRemoval() - { - m_taintremove = true; - } - - internal void EnableAxisMotor(Vector3 axislock) - { - if (m_aMotor != null) - DisableAxisMotor(); - - if (Body == null) - return; - - if (Body.Handle == IntPtr.Zero) - return; - - if (AxisLockAngleHigh != null && AxisLockAngleHigh.Handle != IntPtr.Zero) - AxisLockAngleHigh.Dispose(); - - - - m_aMotor = new btGeneric6DofConstraint(Body, _parent_scene.TerrainBody, _parent_scene.TransZero, - _parent_scene.TransZero, false); - - float endNoLock = (360 * Utils.DEG_TO_RAD); - AxisLockAngleHigh = new btVector3((axislock.X == 0) ? 0 : endNoLock, (axislock.Y == 0) ? 0 : endNoLock, (axislock.Z == 0) ? 0 : endNoLock); - - m_aMotor.setAngularLowerLimit(_parent_scene.VectorZero); - m_aMotor.setAngularUpperLimit(AxisLockAngleHigh); - m_aMotor.setLinearLowerLimit(AxisLockLinearLow); - m_aMotor.setLinearUpperLimit(AxisLockLinearHigh); - _parent_scene.getBulletWorld().addConstraint((btTypedConstraint)m_aMotor); - //m_aMotor. - - - } - internal void DisableAxisMotor() - { - if (m_aMotor != null && m_aMotor.Handle != IntPtr.Zero) - { - _parent_scene.getBulletWorld().removeConstraint(m_aMotor); - m_aMotor.Dispose(); - m_aMotor = null; - } - } - - } -} - diff --git a/OpenSim/Region/Physics/BulletDotNETPlugin/BulletDotNETScene.cs b/OpenSim/Region/Physics/BulletDotNETPlugin/BulletDotNETScene.cs deleted file mode 100644 index 0d1bd82..0000000 --- a/OpenSim/Region/Physics/BulletDotNETPlugin/BulletDotNETScene.cs +++ /dev/null @@ -1,776 +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; -using System.Collections.Generic; -using System.Reflection; -using System.IO; -using System.Diagnostics; -using System.Threading; -using log4net; -using Nini.Config; -using OpenSim.Framework; -using OpenSim.Region.Physics.Manager; -using OpenMetaverse; -using BulletDotNET; - -namespace OpenSim.Region.Physics.BulletDotNETPlugin -{ - public class BulletDotNETScene : PhysicsScene - { - private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); - - // private string m_sceneIdentifier = string.Empty; - - private List m_characters = new List(); - private Dictionary m_charactersLocalID = new Dictionary(); - private List m_prims = new List(); - private Dictionary m_primsLocalID = new Dictionary(); - private List m_activePrims = new List(); - private List m_taintedActors = new List(); - private btDiscreteDynamicsWorld m_world; - private btAxisSweep3 m_broadphase; - private btCollisionConfiguration m_collisionConfiguration; - private btConstraintSolver m_solver; - private btCollisionDispatcher m_dispatcher; - private btHeightfieldTerrainShape m_terrainShape; - public btRigidBody TerrainBody; - private btVector3 m_terrainPosition; - private btVector3 m_gravity; - public btMotionState m_terrainMotionState; - public btTransform m_terrainTransform; - public btVector3 VectorZero; - public btQuaternion QuatIdentity; - public btTransform TransZero; - - public float geomDefaultDensity = 10.000006836f; - - private float avPIDD = 65f; - private float avPIDP = 21f; - private float avCapRadius = 0.37f; - private float avStandupTensor = 2000000f; - private float avDensity = 80f; - private float avHeightFudgeFactor = 0.52f; - private float avMovementDivisorWalk = 1.8f; - private float avMovementDivisorRun = 0.8f; - - // private float minimumGroundFlightOffset = 3f; - - public bool meshSculptedPrim = true; - - public float meshSculptLOD = 32; - public float MeshSculptphysicalLOD = 16; - - public float bodyPIDD = 35f; - public float bodyPIDG = 25; - internal int geomCrossingFailuresBeforeOutofbounds = 4; - - public float bodyMotorJointMaxforceTensor = 2; - - public int bodyFramesAutoDisable = 20; - - public float WorldTimeStep = 10f/60f; - public const float WorldTimeComp = 1/60f; - public float gravityz = -9.8f; - - private float[] _origheightmap; // Used for Fly height. Kitto Flora - private bool usingGImpactAlgorithm = false; - - // private IConfigSource m_config; - private readonly btVector3 worldAabbMin = new btVector3(-10f, -10f, 0); - private readonly btVector3 worldAabbMax = new btVector3((int)Constants.RegionSize + 10f, (int)Constants.RegionSize + 10f, 9000); - - public IMesher mesher; - private ContactAddedCallbackHandler m_CollisionInterface; - - public BulletDotNETScene(string sceneIdentifier) - { - // m_sceneIdentifier = sceneIdentifier; - VectorZero = new btVector3(0, 0, 0); - QuatIdentity = new btQuaternion(0, 0, 0, 1); - TransZero = new btTransform(QuatIdentity, VectorZero); - m_gravity = new btVector3(0, 0, gravityz); - _origheightmap = new float[(int)Constants.RegionSize * (int)Constants.RegionSize]; - - } - - public override void Initialise(IMesher meshmerizer, IConfigSource config) - { - mesher = meshmerizer; - // m_config = config; - /* - if (Environment.OSVersion.Platform == PlatformID.Unix) - { - m_log.Fatal("[BulletDotNET]: This configuration is not supported on *nix currently"); - Thread.Sleep(5000); - Environment.Exit(0); - } - */ - m_broadphase = new btAxisSweep3(worldAabbMin, worldAabbMax, 16000); - m_collisionConfiguration = new btDefaultCollisionConfiguration(); - m_solver = new btSequentialImpulseConstraintSolver(); - m_dispatcher = new btCollisionDispatcher(m_collisionConfiguration); - m_world = new btDiscreteDynamicsWorld(m_dispatcher, m_broadphase, m_solver, m_collisionConfiguration); - m_world.setGravity(m_gravity); - EnableCollisionInterface(); - - - } - - public override PhysicsActor AddAvatar(string avName, Vector3 position, Vector3 size, bool isFlying) - { - BulletDotNETCharacter chr = new BulletDotNETCharacter(avName, this, position, size, avPIDD, avPIDP, - avCapRadius, avStandupTensor, avDensity, - avHeightFudgeFactor, avMovementDivisorWalk, - avMovementDivisorRun); - try - { - m_characters.Add(chr); - m_charactersLocalID.Add(chr.m_localID, chr); - } - catch - { - // noop if it's already there - m_log.Debug("[PHYSICS] BulletDotNet: adding duplicate avatar localID"); - } - AddPhysicsActorTaint(chr); - return chr; - } - - public override void RemoveAvatar(PhysicsActor actor) - { - BulletDotNETCharacter chr = (BulletDotNETCharacter) actor; - - m_charactersLocalID.Remove(chr.m_localID); - m_characters.Remove(chr); - m_world.removeRigidBody(chr.Body); - m_world.removeCollisionObject(chr.Body); - - chr.Remove(); - AddPhysicsActorTaint(chr); - //chr = null; - } - - public override void RemovePrim(PhysicsActor prim) - { - if (prim is BulletDotNETPrim) - { - - BulletDotNETPrim p = (BulletDotNETPrim)prim; - - p.setPrimForRemoval(); - AddPhysicsActorTaint(prim); - //RemovePrimThreadLocked(p); - - } - } - - private PhysicsActor AddPrim(String name, Vector3 position, Vector3 size, Quaternion rotation, - IMesh mesh, PrimitiveBaseShape pbs, bool isphysical) - { - Vector3 pos = position; - //pos.X = position.X; - //pos.Y = position.Y; - //pos.Z = position.Z; - Vector3 siz = Vector3.Zero; - siz.X = size.X; - siz.Y = size.Y; - siz.Z = size.Z; - Quaternion rot = rotation; - - BulletDotNETPrim newPrim; - - newPrim = new BulletDotNETPrim(name, this, pos, siz, rot, mesh, pbs, isphysical); - - //lock (m_prims) - // m_prims.Add(newPrim); - - - return newPrim; - } - - public override PhysicsActor AddPrimShape(string primName, PrimitiveBaseShape pbs, Vector3 position, Vector3 size, Quaternion rotation, bool isPhysical, uint localid) - { - PhysicsActor result; - IMesh mesh = null; - - //switch (pbs.ProfileShape) - //{ - // case ProfileShape.Square: - // //support simple box & hollow box now; later, more shapes - // if (needsMeshing(pbs)) - // { - // mesh = mesher.CreateMesh(primName, pbs, size, 32f, isPhysical); - // } - - // break; - //} - - if (needsMeshing(pbs)) - mesh = mesher.CreateMesh(primName, pbs, size, 32f, isPhysical); - - result = AddPrim(primName, position, size, rotation, mesh, pbs, isPhysical); - - return result; - } - - public override void AddPhysicsActorTaint(PhysicsActor prim) - { - lock (m_taintedActors) - { - if (!m_taintedActors.Contains(prim)) - { - m_taintedActors.Add(prim); - } - } - } - internal void SetUsingGImpact() - { - if (!usingGImpactAlgorithm) - btGImpactCollisionAlgorithm.registerAlgorithm(m_dispatcher); - usingGImpactAlgorithm = true; - } - - public override float Simulate(float timeStep) - { - - lock (m_taintedActors) - { - foreach (PhysicsActor act in m_taintedActors) - { - if (act is BulletDotNETCharacter) - ((BulletDotNETCharacter) act).ProcessTaints(timeStep); - if (act is BulletDotNETPrim) - ((BulletDotNETPrim)act).ProcessTaints(timeStep); - } - m_taintedActors.Clear(); - } - - lock (m_characters) - { - foreach (BulletDotNETCharacter chr in m_characters) - { - chr.Move(timeStep); - } - } - - lock (m_prims) - { - foreach (BulletDotNETPrim prim in m_prims) - { - if (prim != null) - prim.Move(timeStep); - } - } - float steps = m_world.stepSimulation(timeStep, 10, WorldTimeComp); - - foreach (BulletDotNETCharacter chr in m_characters) - { - chr.UpdatePositionAndVelocity(); - } - - foreach (BulletDotNETPrim prm in m_activePrims) - { - /* - if (prm != null) - if (prm.Body != null) - */ - prm.UpdatePositionAndVelocity(); - } - if (m_CollisionInterface != null) - { - List primsWithCollisions = new List(); - List charactersWithCollisions = new List(); - - // get the collisions that happened this tick - List collisions = m_CollisionInterface.GetContactList(); - // passed back the localID of the prim so we can associate the prim - foreach (BulletDotNET.ContactAddedCallbackHandler.ContactInfo ci in collisions) - { - // ContactPoint = { contactPoint, contactNormal, penetrationDepth } - ContactPoint contact = new ContactPoint(new Vector3(ci.pX, ci.pY, ci.pZ), - new Vector3(ci.nX, ci.nY, ci.nZ), ci.depth); - - ProcessContact(ci.contact, ci.contactWith, contact, ref primsWithCollisions, ref charactersWithCollisions); - ProcessContact(ci.contactWith, ci.contact, contact, ref primsWithCollisions, ref charactersWithCollisions); - - } - m_CollisionInterface.Clear(); - // for those prims and characters that had collisions cause collision events - foreach (BulletDotNETPrim bdnp in primsWithCollisions) - { - bdnp.SendCollisions(); - } - foreach (BulletDotNETCharacter bdnc in charactersWithCollisions) - { - bdnc.SendCollisions(); - } - } - return steps; - } - - private void ProcessContact(uint cont, uint contWith, ContactPoint contact, - ref List primsWithCollisions, - ref List charactersWithCollisions) - { - BulletDotNETPrim bdnp; - // collisions with a normal prim? - if (m_primsLocalID.TryGetValue(cont, out bdnp)) - { - // Added collision event to the prim. This creates a pile of events - // that will be sent to any subscribed listeners. - bdnp.AddCollision(contWith, contact); - if (!primsWithCollisions.Contains(bdnp)) - { - primsWithCollisions.Add(bdnp); - } - } - else - { - BulletDotNETCharacter bdnc; - // if not a prim, maybe it's one of the characters - if (m_charactersLocalID.TryGetValue(cont, out bdnc)) - { - bdnc.AddCollision(contWith, contact); - if (!charactersWithCollisions.Contains(bdnc)) - { - charactersWithCollisions.Add(bdnc); - } - } - } - } - - public override void GetResults() - { - - } - - public override void SetTerrain(float[] heightMap) - { - if (m_terrainShape != null) - DeleteTerrain(); - - float hfmax = -9000; - float hfmin = 90000; - - for (int i = 0; i hfmax) ? heightMap[i] : hfmax; - } - // store this for later reference. - // Note, we're storing it after we check it for anomolies above - _origheightmap = heightMap; - - hfmin = 0; - hfmax = 256; - - m_terrainShape = new btHeightfieldTerrainShape((int)Constants.RegionSize, (int)Constants.RegionSize, heightMap, - 1.0f, hfmin, hfmax, (int)btHeightfieldTerrainShape.UPAxis.Z, - (int)btHeightfieldTerrainShape.PHY_ScalarType.PHY_FLOAT, false); - float AabbCenterX = Constants.RegionSize/2f; - float AabbCenterY = Constants.RegionSize/2f; - - float AabbCenterZ = 0; - float temphfmin, temphfmax; - - temphfmin = hfmin; - temphfmax = hfmax; - - if (temphfmin < 0) - { - temphfmax = 0 - temphfmin; - temphfmin = 0 - temphfmin; - } - else if (temphfmin > 0) - { - temphfmax = temphfmax + (0 - temphfmin); - //temphfmin = temphfmin + (0 - temphfmin); - } - AabbCenterZ = temphfmax/2f; - - if (m_terrainPosition == null) - { - m_terrainPosition = new btVector3(AabbCenterX, AabbCenterY, AabbCenterZ); - } - else - { - try - { - m_terrainPosition.setValue(AabbCenterX, AabbCenterY, AabbCenterZ); - } - catch (ObjectDisposedException) - { - m_terrainPosition = new btVector3(AabbCenterX, AabbCenterY, AabbCenterZ); - } - } - if (m_terrainMotionState != null) - { - m_terrainMotionState.Dispose(); - m_terrainMotionState = null; - } - m_terrainTransform = new btTransform(QuatIdentity, m_terrainPosition); - m_terrainMotionState = new btDefaultMotionState(m_terrainTransform); - TerrainBody = new btRigidBody(0, m_terrainMotionState, m_terrainShape); - TerrainBody.setUserPointer((IntPtr)0); - m_world.addRigidBody(TerrainBody); - - - } - - public override void SetWaterLevel(float baseheight) - { - - } - - public override void DeleteTerrain() - { - if (TerrainBody != null) - { - m_world.removeRigidBody(TerrainBody); - } - - if (m_terrainShape != null) - { - m_terrainShape.Dispose(); - m_terrainShape = null; - } - - if (m_terrainMotionState != null) - { - m_terrainMotionState.Dispose(); - m_terrainMotionState = null; - } - - if (m_terrainTransform != null) - { - m_terrainTransform.Dispose(); - m_terrainTransform = null; - } - - if (m_terrainPosition != null) - { - m_terrainPosition.Dispose(); - m_terrainPosition = null; - } - } - - public override void Dispose() - { - disposeAllBodies(); - m_world.Dispose(); - m_broadphase.Dispose(); - ((btDefaultCollisionConfiguration) m_collisionConfiguration).Dispose(); - ((btSequentialImpulseConstraintSolver) m_solver).Dispose(); - worldAabbMax.Dispose(); - worldAabbMin.Dispose(); - VectorZero.Dispose(); - QuatIdentity.Dispose(); - m_gravity.Dispose(); - VectorZero = null; - QuatIdentity = null; - } - - public override Dictionary GetTopColliders() - { - return new Dictionary(); - } - - public btDiscreteDynamicsWorld getBulletWorld() - { - return m_world; - } - - private void disposeAllBodies() - { - lock (m_prims) - { - m_primsLocalID.Clear(); - foreach (BulletDotNETPrim prim in m_prims) - { - if (prim.Body != null) - m_world.removeRigidBody(prim.Body); - - prim.Dispose(); - } - m_prims.Clear(); - - foreach (BulletDotNETCharacter chr in m_characters) - { - if (chr.Body != null) - m_world.removeRigidBody(chr.Body); - chr.Dispose(); - } - m_characters.Clear(); - } - } - - public override bool IsThreaded - { - get { return false; } - } - - internal void addCollisionEventReporting(PhysicsActor bulletDotNETCharacter) - { - //TODO: FIXME: - } - - internal void remCollisionEventReporting(PhysicsActor bulletDotNETCharacter) - { - //TODO: FIXME: - } - - internal void AddRigidBody(btRigidBody Body) - { - m_world.addRigidBody(Body); - } - [Obsolete("bad!")] - internal void removeFromWorld(btRigidBody body) - { - - m_world.removeRigidBody(body); - } - - internal void removeFromWorld(BulletDotNETPrim prm ,btRigidBody body) - { - lock (m_prims) - { - if (m_prims.Contains(prm)) - { - m_world.removeRigidBody(body); - } - remActivePrim(prm); - m_primsLocalID.Remove(prm.m_localID); - m_prims.Remove(prm); - } - - } - - internal float GetWaterLevel() - { - throw new NotImplementedException(); - } - - // Recovered for use by fly height. Kitto Flora - public float GetTerrainHeightAtXY(float x, float y) - { - // Teravus: Kitto, this code causes recurring errors that stall physics permenantly unless - // the values are checked, so checking below. - // Is there any reason that we don't do this in ScenePresence? - // The only physics engine that benefits from it in the physics plugin is this one - - if (x > (int)Constants.RegionSize || y > (int)Constants.RegionSize || - x < 0.001f || y < 0.001f) - return 0; - - return _origheightmap[(int)y * Constants.RegionSize + (int)x]; - } - // End recovered. Kitto Flora - - /// - /// Routine to figure out if we need to mesh this prim with our mesher - /// - /// - /// - public bool needsMeshing(PrimitiveBaseShape pbs) - { - // most of this is redundant now as the mesher will return null if it cant mesh a prim - // but we still need to check for sculptie meshing being enabled so this is the most - // convenient place to do it for now... - - // //if (pbs.PathCurve == (byte)Primitive.PathCurve.Circle && pbs.ProfileCurve == (byte)Primitive.ProfileCurve.Circle && pbs.PathScaleY <= 0.75f) - // //m_log.Debug("needsMeshing: " + " pathCurve: " + pbs.PathCurve.ToString() + " profileCurve: " + pbs.ProfileCurve.ToString() + " pathScaleY: " + Primitive.UnpackPathScale(pbs.PathScaleY).ToString()); - int iPropertiesNotSupportedDefault = 0; - - if (pbs.SculptEntry && !meshSculptedPrim) - { -#if SPAM - m_log.Warn("NonMesh"); -#endif - return false; - } - - // if it's a standard box or sphere with no cuts, hollows, twist or top shear, return false since ODE can use an internal representation for the prim - if ((pbs.ProfileShape == ProfileShape.Square && pbs.PathCurve == (byte)Extrusion.Straight) - || (pbs.ProfileShape == ProfileShape.HalfCircle && pbs.PathCurve == (byte)Extrusion.Curve1 - && pbs.Scale.X == pbs.Scale.Y && pbs.Scale.Y == pbs.Scale.Z)) - { - - if (pbs.ProfileBegin == 0 && pbs.ProfileEnd == 0 - && pbs.ProfileHollow == 0 - && pbs.PathTwist == 0 && pbs.PathTwistBegin == 0 - && pbs.PathBegin == 0 && pbs.PathEnd == 0 - && pbs.PathTaperX == 0 && pbs.PathTaperY == 0 - && pbs.PathScaleX == 100 && pbs.PathScaleY == 100 - && pbs.PathShearX == 0 && pbs.PathShearY == 0) - { -#if SPAM - m_log.Warn("NonMesh"); -#endif - return false; - } - } - - if (pbs.ProfileHollow != 0) - iPropertiesNotSupportedDefault++; - - if ((pbs.PathBegin != 0) || pbs.PathEnd != 0) - iPropertiesNotSupportedDefault++; - - if ((pbs.PathTwistBegin != 0) || (pbs.PathTwist != 0)) - iPropertiesNotSupportedDefault++; - - if ((pbs.ProfileBegin != 0) || pbs.ProfileEnd != 0) - iPropertiesNotSupportedDefault++; - - if ((pbs.PathScaleX != 100) || (pbs.PathScaleY != 100)) - iPropertiesNotSupportedDefault++; - - if ((pbs.PathShearX != 0) || (pbs.PathShearY != 0)) - iPropertiesNotSupportedDefault++; - - if (pbs.ProfileShape == ProfileShape.Circle && pbs.PathCurve == (byte)Extrusion.Straight) - iPropertiesNotSupportedDefault++; - - if (pbs.ProfileShape == ProfileShape.HalfCircle && pbs.PathCurve == (byte)Extrusion.Curve1 && (pbs.Scale.X != pbs.Scale.Y || pbs.Scale.Y != pbs.Scale.Z || pbs.Scale.Z != pbs.Scale.X)) - iPropertiesNotSupportedDefault++; - - if (pbs.ProfileShape == ProfileShape.HalfCircle && pbs.PathCurve == (byte)Extrusion.Curve1) - iPropertiesNotSupportedDefault++; - - // test for torus - if ((pbs.ProfileCurve & 0x07) == (byte)ProfileShape.Square) - { - if (pbs.PathCurve == (byte)Extrusion.Curve1) - { - iPropertiesNotSupportedDefault++; - } - } - else if ((pbs.ProfileCurve & 0x07) == (byte)ProfileShape.Circle) - { - if (pbs.PathCurve == (byte)Extrusion.Straight) - { - iPropertiesNotSupportedDefault++; - } - - // ProfileCurve seems to combine hole shape and profile curve so we need to only compare against the lower 3 bits - else if (pbs.PathCurve == (byte)Extrusion.Curve1) - { - iPropertiesNotSupportedDefault++; - } - } - else if ((pbs.ProfileCurve & 0x07) == (byte)ProfileShape.HalfCircle) - { - if (pbs.PathCurve == (byte)Extrusion.Curve1 || pbs.PathCurve == (byte)Extrusion.Curve2) - { - iPropertiesNotSupportedDefault++; - } - } - else if ((pbs.ProfileCurve & 0x07) == (byte)ProfileShape.EquilateralTriangle) - { - if (pbs.PathCurve == (byte)Extrusion.Straight) - { - iPropertiesNotSupportedDefault++; - } - else if (pbs.PathCurve == (byte)Extrusion.Curve1) - { - iPropertiesNotSupportedDefault++; - } - } - - - if (iPropertiesNotSupportedDefault == 0) - { -#if SPAM - m_log.Warn("NonMesh"); -#endif - return false; - } -#if SPAM - m_log.Debug("Mesh"); -#endif - return true; - } - - internal void addActivePrim(BulletDotNETPrim pPrim) - { - lock (m_activePrims) - { - if (!m_activePrims.Contains(pPrim)) - { - m_activePrims.Add(pPrim); - } - } - } - - public void remActivePrim(BulletDotNETPrim pDeactivatePrim) - { - lock (m_activePrims) - { - m_activePrims.Remove(pDeactivatePrim); - } - } - - internal void AddPrimToScene(BulletDotNETPrim pPrim) - { - lock (m_prims) - { - if (!m_prims.Contains(pPrim)) - { - try - { - m_prims.Add(pPrim); - m_primsLocalID.Add(pPrim.m_localID, pPrim); - } - catch - { - // noop if it's already there - m_log.Debug("[PHYSICS] BulletDotNet: adding duplicate prim localID"); - } - m_world.addRigidBody(pPrim.Body); - // m_log.Debug("[PHYSICS] added prim to scene"); - } - } - } - internal void EnableCollisionInterface() - { - if (m_CollisionInterface == null) - { - m_CollisionInterface = new ContactAddedCallbackHandler(m_world); - // m_world.SetCollisionAddedCallback(m_CollisionInterface); - } - } - - - - } -} diff --git a/OpenSim/Region/Physics/BulletXPlugin/AssemblyInfo.cs b/OpenSim/Region/Physics/BulletXPlugin/AssemblyInfo.cs deleted file mode 100644 index 6383f26..0000000 --- a/OpenSim/Region/Physics/BulletXPlugin/AssemblyInfo.cs +++ /dev/null @@ -1,58 +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.Reflection; -using System.Runtime.InteropServices; - -// Information about this assembly is defined by the following -// attributes. -// -// change them to the information which is associated with the assembly -// you compile. - -[assembly : AssemblyTitle("BulletXPlugin")] -[assembly : AssemblyDescription("")] -[assembly : AssemblyConfiguration("")] -[assembly : AssemblyCompany("http://opensimulator.org")] -[assembly : AssemblyProduct("BulletXPlugin")] -[assembly : AssemblyCopyright("Copyright (c) OpenSimulator.org Developers 2007-2009")] -[assembly : AssemblyTrademark("")] -[assembly : AssemblyCulture("")] - -// This sets the default COM visibility of types in the assembly to invisible. -// If you need to expose a type to COM, use [ComVisible(true)] on that type. - -[assembly : ComVisible(false)] - -// The assembly version has following format : -// -// Major.Minor.Build.Revision -// -// You can specify all values by your own or you can build default build and revision -// numbers with the '*' character (the default): - -[assembly : AssemblyVersion("0.6.5.*")] diff --git a/OpenSim/Region/Physics/BulletXPlugin/BulletXPlugin.cs b/OpenSim/Region/Physics/BulletXPlugin/BulletXPlugin.cs deleted file mode 100644 index df62dbc..0000000 --- a/OpenSim/Region/Physics/BulletXPlugin/BulletXPlugin.cs +++ /dev/null @@ -1,1855 +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. - */ - -#region References - -using System; -using System.Collections.Generic; -using OpenMetaverse; -using MonoXnaCompactMaths; -using OpenSim.Framework; -using OpenSim.Region.Physics.Manager; -using XnaDevRu.BulletX; -using XnaDevRu.BulletX.Dynamics; -using Nini.Config; -using Vector3 = MonoXnaCompactMaths.Vector3; -using Quaternion = MonoXnaCompactMaths.Quaternion; - -#endregion - -namespace OpenSim.Region.Physics.BulletXPlugin -{ - /// - /// BulletXConversions are called now BulletXMaths - /// This Class converts objects and types for BulletX and give some operations - /// - public class BulletXMaths - { - //private static readonly log4net.ILog m_log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); - - //Vector3 - public static Vector3 PhysicsVectorToXnaVector3(OpenMetaverse.Vector3 physicsVector) - { - return new Vector3(physicsVector.X, physicsVector.Y, physicsVector.Z); - } - - public static OpenMetaverse.Vector3 XnaVector3ToPhysicsVector(Vector3 xnaVector3) - { - return new OpenMetaverse.Vector3(xnaVector3.X, xnaVector3.Y, xnaVector3.Z); - } - - //Quaternion - public static Quaternion QuaternionToXnaQuaternion(OpenMetaverse.Quaternion quaternion) - { - return new Quaternion(quaternion.X, quaternion.Y, quaternion.Z, quaternion.W); - } - - public static OpenMetaverse.Quaternion XnaQuaternionToQuaternion(Quaternion xnaQuaternion) - { - return new OpenMetaverse.Quaternion(xnaQuaternion.W, xnaQuaternion.X, xnaQuaternion.Y, xnaQuaternion.Z); - } - - //Next methods are extracted from XnaDevRu.BulletX(See 3rd party license): - //- SetRotation (class MatrixOperations) - //- GetRotation (class MatrixOperations) - //- GetElement (class MathHelper) - //- SetElement (class MathHelper) - internal static void SetRotation(ref Matrix m, Quaternion q) - { - float d = q.LengthSquared(); - float s = 2f/d; - float xs = q.X*s, ys = q.Y*s, zs = q.Z*s; - float wx = q.W*xs, wy = q.W*ys, wz = q.W*zs; - float xx = q.X*xs, xy = q.X*ys, xz = q.X*zs; - float yy = q.Y*ys, yz = q.Y*zs, zz = q.Z*zs; - m = new Matrix(1 - (yy + zz), xy - wz, xz + wy, 0, - xy + wz, 1 - (xx + zz), yz - wx, 0, - xz - wy, yz + wx, 1 - (xx + yy), 0, - m.M41, m.M42, m.M43, 1); - } - - internal static Quaternion GetRotation(Matrix m) - { - Quaternion q; - - float trace = m.M11 + m.M22 + m.M33; - - if (trace > 0) - { - float s = (float) Math.Sqrt(trace + 1); - q.W = s*0.5f; - s = 0.5f/s; - - q.X = (m.M32 - m.M23)*s; - q.Y = (m.M13 - m.M31)*s; - q.Z = (m.M21 - m.M12)*s; - } - else - { - q.X = q.Y = q.Z = q.W = 0f; - - int i = m.M11 < m.M22 - ? - (m.M22 < m.M33 ? 2 : 1) - : - (m.M11 < m.M33 ? 2 : 0); - int j = (i + 1)%3; - int k = (i + 2)%3; - - float s = (float) Math.Sqrt(GetElement(m, i, i) - GetElement(m, j, j) - GetElement(m, k, k) + 1); - SetElement(ref q, i, s*0.5f); - s = 0.5f/s; - - q.W = (GetElement(m, k, j) - GetElement(m, j, k))*s; - SetElement(ref q, j, (GetElement(m, j, i) + GetElement(m, i, j))*s); - SetElement(ref q, k, (GetElement(m, k, i) + GetElement(m, i, k))*s); - } - - return q; - } - - internal static float SetElement(ref Quaternion q, int index, float value) - { - switch (index) - { - case 0: - q.X = value; - break; - case 1: - q.Y = value; - break; - case 2: - q.Z = value; - break; - case 3: - q.W = value; - break; - } - - return 0; - } - - internal static float GetElement(Matrix mat, int row, int col) - { - switch (row) - { - case 0: - switch (col) - { - case 0: - return mat.M11; - case 1: - return mat.M12; - case 2: - return mat.M13; - } - break; - case 1: - switch (col) - { - case 0: - return mat.M21; - case 1: - return mat.M22; - case 2: - return mat.M23; - } - break; - case 2: - switch (col) - { - case 0: - return mat.M31; - case 1: - return mat.M32; - case 2: - return mat.M33; - } - break; - } - - return 0; - } - } - - /// - /// PhysicsPlugin Class for BulletX - /// - public class BulletXPlugin : IPhysicsPlugin - { - private BulletXScene _mScene; - - public BulletXPlugin() - { - } - - public bool Init() - { - return true; - } - - public PhysicsScene GetScene(string sceneIdentifier) - { - if (_mScene == null) - { - _mScene = new BulletXScene(sceneIdentifier); - } - return (_mScene); - } - - public string GetName() - { - return ("modified_BulletX"); //Changed!! "BulletXEngine" To "modified_BulletX" - } - - public void Dispose() - { - } - } - - - // Class to detect and debug collisions - // Mainly used for debugging purposes - internal class CollisionDispatcherLocal : CollisionDispatcher - { - private BulletXScene relatedScene; - - public CollisionDispatcherLocal(BulletXScene s) - : base() - { - relatedScene = s; - } - - public override bool NeedsCollision(CollisionObject bodyA, CollisionObject bodyB) - { - RigidBody rb; - BulletXCharacter bxcA = null; - BulletXPrim bxpA = null; - Type t = bodyA.GetType(); - if (t == typeof (RigidBody)) - { - rb = (RigidBody) bodyA; - relatedScene._characters.TryGetValue(rb, out bxcA); - relatedScene._prims.TryGetValue(rb, out bxpA); - } -// String nameA; -// if (bxcA != null) -// nameA = bxcA._name; -// else if (bxpA != null) -// nameA = bxpA._name; -// else -// nameA = "null"; - - - - BulletXCharacter bxcB = null; - BulletXPrim bxpB = null; - t = bodyB.GetType(); - if (t == typeof (RigidBody)) - { - rb = (RigidBody) bodyB; - relatedScene._characters.TryGetValue(rb, out bxcB); - relatedScene._prims.TryGetValue(rb, out bxpB); - } - -// String nameB; -// if (bxcB != null) -// nameB = bxcB._name; -// else if (bxpB != null) -// nameB = bxpB._name; -// else - // nameB = "null"; - bool needsCollision;// = base.NeedsCollision(bodyA, bodyB); - int c1 = 3; - int c2 = 3; - - //////////////////////////////////////////////////////// - //BulletX Mesh Collisions - //added by Jed zhu - //data: May 07,2005 - //////////////////////////////////////////////////////// - #region BulletXMeshCollisions Fields - - - if (bxcA != null && bxpB != null) - c1 = Collision(bxcA, bxpB); - if (bxpA != null && bxcB != null) - c2 = Collision(bxcB, bxpA); - if (c1 < 2) - needsCollision = (c1 > 0) ? true : false; - else if (c2 < 2) - needsCollision = (c2 > 0) ? true : false; - else - needsCollision = base.NeedsCollision(bodyA, bodyB); - - - #endregion - - - //m_log.DebugFormat("[BulletX]: A collision was detected between {0} and {1} --> {2}", nameA, nameB, - //needsCollision); - - - return needsCollision; - } - //added by jed zhu - //calculas the collision between the Prim and Actor - // - private int Collision(BulletXCharacter actorA, BulletXPrim primB) - { - int[] indexBase; - Vector3[] vertexBase; - Vector3 vNormal; - // Vector3 vP1; - // Vector3 vP2; - // Vector3 vP3; - IMesh mesh = primB.GetMesh(); - - float fdistance; - if (primB == null) - return 3; - if (mesh == null) - return 2; - if (actorA == null) - return 3; - - int iVertexCount = mesh.getVertexList().Count; - int iIndexCount = mesh.getIndexListAsInt().Length; - if (iVertexCount == 0) - return 3; - if (iIndexCount == 0) - return 3; - lock (BulletXScene.BulletXLock) - { - indexBase = mesh.getIndexListAsInt(); - vertexBase = new Vector3[iVertexCount]; - - for (int i = 0; i < iVertexCount; i++) - { - OpenMetaverse.Vector3 v = mesh.getVertexList()[i]; - if (v != null) // Note, null has special meaning. See meshing code for details - vertexBase[i] = BulletXMaths.PhysicsVectorToXnaVector3(v); - else - vertexBase[i] = Vector3.Zero; - } - - for (int ix = 0; ix < iIndexCount; ix += 3) - { - int ia = indexBase[ix + 0]; - int ib = indexBase[ix + 1]; - int ic = indexBase[ix + 2]; - // - Vector3 v1 = vertexBase[ib] - vertexBase[ia]; - Vector3 v2 = vertexBase[ic] - vertexBase[ia]; - - Vector3.Cross(ref v1, ref v2, out vNormal); - Vector3.Normalize(ref vNormal, out vNormal); - - fdistance = Vector3.Dot(vNormal, vertexBase[ia]) + 0.50f; - if (preCheckCollision(actorA, vNormal, fdistance) == 1) - { - if (CheckCollision(actorA, ia, ib, ic, vNormal, vertexBase) == 1) - { - //PhysicsVector v = actorA.Position; - //Vector3 v3 = BulletXMaths.PhysicsVectorToXnaVector3(v); - //Vector3 vp = vNormal * (fdistance - Vector3.Dot(vNormal, v3) + 0.2f); - //actorA.Position += BulletXMaths.XnaVector3ToPhysicsVector(vp); - return 1; - } - } - } - } - - - return 0; - } - //added by jed zhu - //return value 1: need second check - //return value 0: no need check - - private int preCheckCollision(BulletXActor actA, Vector3 vNormal, float fDist) - { - float fstartSide; - OpenMetaverse.Vector3 v = actA.Position; - Vector3 v3 = BulletXMaths.PhysicsVectorToXnaVector3(v); - - fstartSide = Vector3.Dot(vNormal, v3) - fDist; - if (fstartSide > 0) return 0; - else return 1; - } - //added by jed zhu - private int CheckCollision(BulletXActor actA, int ia, int ib, int ic, Vector3 vNormal, Vector3[] vertBase) - { - Vector3 perPlaneNormal; - float fPerPlaneDist; - OpenMetaverse.Vector3 v = actA.Position; - Vector3 v3 = BulletXMaths.PhysicsVectorToXnaVector3(v); - //check AB - Vector3 v1; - v1 = vertBase[ib] - vertBase[ia]; - Vector3.Cross(ref vNormal, ref v1, out perPlaneNormal); - Vector3.Normalize(ref perPlaneNormal, out perPlaneNormal); - - if (Vector3.Dot((vertBase[ic] - vertBase[ia]), perPlaneNormal) < 0) - perPlaneNormal = -perPlaneNormal; - fPerPlaneDist = Vector3.Dot(perPlaneNormal, vertBase[ia]) - 0.50f; - - - - if ((Vector3.Dot(perPlaneNormal, v3) - fPerPlaneDist) < 0) - return 0; - fPerPlaneDist = Vector3.Dot(perPlaneNormal, vertBase[ic]) + 0.50f; - if ((Vector3.Dot(perPlaneNormal, v3) - fPerPlaneDist) > 0) - return 0; - - //check BC - - v1 = vertBase[ic] - vertBase[ib]; - Vector3.Cross(ref vNormal, ref v1, out perPlaneNormal); - Vector3.Normalize(ref perPlaneNormal, out perPlaneNormal); - - if (Vector3.Dot((vertBase[ia] - vertBase[ib]), perPlaneNormal) < 0) - perPlaneNormal = -perPlaneNormal; - fPerPlaneDist = Vector3.Dot(perPlaneNormal, vertBase[ib]) - 0.50f; - - - if ((Vector3.Dot(perPlaneNormal, v3) - fPerPlaneDist) < 0) - return 0; - fPerPlaneDist = Vector3.Dot(perPlaneNormal, vertBase[ia]) + 0.50f; - if ((Vector3.Dot(perPlaneNormal, v3) - fPerPlaneDist) > 0) - return 0; - //check CA - v1 = vertBase[ia] - vertBase[ic]; - Vector3.Cross(ref vNormal, ref v1, out perPlaneNormal); - Vector3.Normalize(ref perPlaneNormal, out perPlaneNormal); - - if (Vector3.Dot((vertBase[ib] - vertBase[ic]), perPlaneNormal) < 0) - perPlaneNormal = -perPlaneNormal; - fPerPlaneDist = Vector3.Dot(perPlaneNormal, vertBase[ic]) - 0.50f; - - - if ((Vector3.Dot(perPlaneNormal, v3) - fPerPlaneDist) < 0) - return 0; - fPerPlaneDist = Vector3.Dot(perPlaneNormal, vertBase[ib]) + 0.50f; - if ((Vector3.Dot(perPlaneNormal, v3) - fPerPlaneDist) > 0) - return 0; - - return 1; - - } - } - - /// - /// PhysicsScene Class for BulletX - /// - public class BulletXScene : PhysicsScene - { - #region BulletXScene Fields - - public DiscreteDynamicsWorld ddWorld; - private CollisionDispatcher cDispatcher; - private OverlappingPairCache opCache; - private SequentialImpulseConstraintSolver sicSolver; - public static Object BulletXLock = new Object(); - - private const int minXY = 0; - private const int minZ = 0; - private const int maxXY = (int)Constants.RegionSize; - private const int maxZ = 4096; - private const int maxHandles = 32766; //Why? I don't know - private const float gravity = 9.8f; - private const float heightLevel0 = 77.0f; - private const float heightLevel1 = 200.0f; - private const float lowGravityFactor = 0.2f; - //OpenSim calls Simulate 10 times per seconds. So FPS = "Simulate Calls" * simulationSubSteps = 100 FPS - private const int simulationSubSteps = 10; - //private float[] _heightmap; - private BulletXPlanet _simFlatPlanet; - internal Dictionary _characters = new Dictionary(); - internal Dictionary _prims = new Dictionary(); - - public IMesher mesher; - // private IConfigSource m_config; - - // protected internal String identifier; - - public BulletXScene(String sceneIdentifier) - { - //identifier = sceneIdentifier; - cDispatcher = new CollisionDispatcherLocal(this); - Vector3 worldMinDim = new Vector3((float)minXY, (float)minXY, (float)minZ); - Vector3 worldMaxDim = new Vector3((float)maxXY, (float)maxXY, (float)maxZ); - opCache = new AxisSweep3(worldMinDim, worldMaxDim, maxHandles); - sicSolver = new SequentialImpulseConstraintSolver(); - - lock (BulletXLock) - { - ddWorld = new DiscreteDynamicsWorld(cDispatcher, opCache, sicSolver); - ddWorld.Gravity = new Vector3(0, 0, -gravity); - } - //this._heightmap = new float[65536]; - } - - public static float Gravity - { - get { return gravity; } - } - - public static float HeightLevel0 - { - get { return heightLevel0; } - } - - public static float HeightLevel1 - { - get { return heightLevel1; } - } - - public static float LowGravityFactor - { - get { return lowGravityFactor; } - } - - public static int MaxXY - { - get { return maxXY; } - } - - public static int MaxZ - { - get { return maxZ; } - } - - private List _forgottenRigidBodies = new List(); - internal string is_ex_message = "Can't remove rigidBody!: "; - - #endregion - - public BulletXScene() - { - cDispatcher = new CollisionDispatcherLocal(this); - Vector3 worldMinDim = new Vector3((float) minXY, (float) minXY, (float) minZ); - Vector3 worldMaxDim = new Vector3((float) maxXY, (float) maxXY, (float) maxZ); - opCache = new AxisSweep3(worldMinDim, worldMaxDim, maxHandles); - sicSolver = new SequentialImpulseConstraintSolver(); - - lock (BulletXLock) - { - ddWorld = new DiscreteDynamicsWorld(cDispatcher, opCache, sicSolver); - ddWorld.Gravity = new Vector3(0, 0, -gravity); - } - //this._heightmap = new float[65536]; - } - - public override void Initialise(IMesher meshmerizer, IConfigSource config) - { - mesher = meshmerizer; - // m_config = config; - } - - public override void Dispose() - { - - } - - public override Dictionary GetTopColliders() - { - Dictionary returncolliders = new Dictionary(); - return returncolliders; - } - - public override void SetWaterLevel(float baseheight) - { - - } - - public override PhysicsActor AddAvatar(string avName, OpenMetaverse.Vector3 position, OpenMetaverse.Vector3 size, bool isFlying) - { - OpenMetaverse.Vector3 pos = OpenMetaverse.Vector3.Zero; - pos.X = position.X; - pos.Y = position.Y; - pos.Z = position.Z + 20; - BulletXCharacter newAv = null; - lock (BulletXLock) - { - newAv = new BulletXCharacter(avName, this, pos); - _characters.Add(newAv.RigidBody, newAv); - } - newAv.Flying = isFlying; - return newAv; - } - - public override void RemoveAvatar(PhysicsActor actor) - { - if (actor is BulletXCharacter) - { - lock (BulletXLock) - { - try - { - ddWorld.RemoveRigidBody(((BulletXCharacter) actor).RigidBody); - } - catch (Exception ex) - { - BulletXMessage(is_ex_message + ex.Message, true); - ((BulletXCharacter) actor).RigidBody.ActivationState = ActivationState.DisableSimulation; - AddForgottenRigidBody(((BulletXCharacter) actor).RigidBody); - } - _characters.Remove(((BulletXCharacter) actor).RigidBody); - } - GC.Collect(); - } - } - - public override PhysicsActor AddPrimShape(string primName, PrimitiveBaseShape pbs, OpenMetaverse.Vector3 position, - OpenMetaverse.Vector3 size, OpenMetaverse.Quaternion rotation, bool isPhysical, uint localid) - { - PhysicsActor result; - - switch (pbs.ProfileShape) - { - case ProfileShape.Square: - /// support simple box & hollow box now; later, more shapes - if (pbs.ProfileHollow == 0) - { - result = AddPrim(primName, position, size, rotation, null, null, isPhysical); - } - else - { - IMesh mesh = mesher.CreateMesh(primName, pbs, size, 32f, isPhysical); - result = AddPrim(primName, position, size, rotation, mesh, pbs, isPhysical); - } - break; - - default: - result = AddPrim(primName, position, size, rotation, null, null, isPhysical); - break; - } - - return result; - } - - public PhysicsActor AddPrim(String name, OpenMetaverse.Vector3 position, OpenMetaverse.Vector3 size, OpenMetaverse.Quaternion rotation, - IMesh mesh, PrimitiveBaseShape pbs, bool isPhysical) - { - BulletXPrim newPrim = null; - lock (BulletXLock) - { - newPrim = new BulletXPrim(name, this, position, size, rotation, mesh, pbs, isPhysical); - _prims.Add(newPrim.RigidBody, newPrim); - } - return newPrim; - } - - public override void RemovePrim(PhysicsActor prim) - { - if (prim is BulletXPrim) - { - lock (BulletXLock) - { - try - { - ddWorld.RemoveRigidBody(((BulletXPrim) prim).RigidBody); - } - catch (Exception ex) - { - BulletXMessage(is_ex_message + ex.Message, true); - ((BulletXPrim) prim).RigidBody.ActivationState = ActivationState.DisableSimulation; - AddForgottenRigidBody(((BulletXPrim) prim).RigidBody); - } - _prims.Remove(((BulletXPrim) prim).RigidBody); - } - GC.Collect(); - } - } - - public override void AddPhysicsActorTaint(PhysicsActor prim) - { - } - - public override float Simulate(float timeStep) - { - float fps = 0; - lock (BulletXLock) - { - //Try to remove garbage - RemoveForgottenRigidBodies(); - //End of remove - MoveAPrimitives(timeStep); - - - fps = (timeStep*simulationSubSteps); - - ddWorld.StepSimulation(timeStep, simulationSubSteps, timeStep); - //Extra Heightmap Validation: BulletX's HeightFieldTerrain somestimes doesn't work so fine. - ValidateHeightForAll(); - //End heightmap validation. - UpdateKineticsForAll(); - } - return fps; - } - - private void MoveAPrimitives(float timeStep) - { - foreach (BulletXCharacter actor in _characters.Values) - { - actor.Move(timeStep); - } - } - - private void ValidateHeightForAll() - { - float _height; - foreach (BulletXCharacter actor in _characters.Values) - { - //_height = HeightValue(actor.RigidBodyPosition); - _height = _simFlatPlanet.HeightValue(actor.RigidBodyPosition); - actor.ValidateHeight(_height); - //if (_simFlatPlanet.heightIsNotValid(actor.RigidBodyPosition, out _height)) actor.ValidateHeight(_height); - } - foreach (BulletXPrim prim in _prims.Values) - { - //_height = HeightValue(prim.RigidBodyPosition); - _height = _simFlatPlanet.HeightValue(prim.RigidBodyPosition); - prim.ValidateHeight(_height); - //if (_simFlatPlanet.heightIsNotValid(prim.RigidBodyPosition, out _height)) prim.ValidateHeight(_height); - } - //foreach (BulletXCharacter actor in _characters) - //{ - // actor.ValidateHeight(0); - //} - //foreach (BulletXPrim prim in _prims) - //{ - // prim.ValidateHeight(0); - //} - } - - private void UpdateKineticsForAll() - { - //UpdatePosition > UpdateKinetics. - //Not only position will be updated, also velocity cause acceleration. - foreach (BulletXCharacter actor in _characters.Values) - { - actor.UpdateKinetics(); - } - foreach (BulletXPrim prim in _prims.Values) - { - prim.UpdateKinetics(); - } - //if (this._simFlatPlanet!=null) this._simFlatPlanet.Restore(); - } - - public override void GetResults() - { - } - - public override bool IsThreaded - { - get - { - return (false); // for now we won't be multithreaded - } - } - - public override void SetTerrain(float[] heightMap) - { - ////As the same as ODE, heightmap (x,y) must be swapped for BulletX - //for (int i = 0; i < 65536; i++) - //{ - // // this._heightmap[i] = (double)heightMap[i]; - // // dbm (danx0r) -- heightmap x,y must be swapped for Ode (should fix ODE, but for now...) - // int x = i & 0xff; - // int y = i >> 8; - // this._heightmap[i] = heightMap[x * 256 + y]; - //} - - //float[] swappedHeightMap = new float[65536]; - ////As the same as ODE, heightmap (x,y) must be swapped for BulletX - //for (int i = 0; i < 65536; i++) - //{ - // // this._heightmap[i] = (double)heightMap[i]; - // // dbm (danx0r) -- heightmap x,y must be swapped for Ode (should fix ODE, but for now...) - // int x = i & 0xff; - // int y = i >> 8; - // swappedHeightMap[i] = heightMap[x * 256 + y]; - //} - DeleteTerrain(); - //There is a BulletXLock inside the constructor of BulletXPlanet - //this._simFlatPlanet = new BulletXPlanet(this, swappedHeightMap); - _simFlatPlanet = new BulletXPlanet(this, heightMap); - //this._heightmap = heightMap; - } - - public override void DeleteTerrain() - { - if (_simFlatPlanet != null) - { - lock (BulletXLock) - { - try - { - ddWorld.RemoveRigidBody(_simFlatPlanet.RigidBody); - } - catch (Exception ex) - { - BulletXMessage(is_ex_message + ex.Message, true); - _simFlatPlanet.RigidBody.ActivationState = ActivationState.DisableSimulation; - AddForgottenRigidBody(_simFlatPlanet.RigidBody); - } - } - _simFlatPlanet = null; - GC.Collect(); - BulletXMessage("Terrain erased!", false); - } - - - - //this._heightmap = null; - } - - - - internal void AddForgottenRigidBody(RigidBody forgottenRigidBody) - { - _forgottenRigidBodies.Add(forgottenRigidBody); - } - - private void RemoveForgottenRigidBodies() - { - RigidBody forgottenRigidBody; - int nRigidBodies = _forgottenRigidBodies.Count; - for (int i = nRigidBodies - 1; i >= 0; i--) - { - forgottenRigidBody = _forgottenRigidBodies[i]; - try - { - ddWorld.RemoveRigidBody(forgottenRigidBody); - _forgottenRigidBodies.Remove(forgottenRigidBody); - BulletXMessage("Forgotten Rigid Body Removed", false); - } - catch (Exception ex) - { - BulletXMessage("Can't remove forgottenRigidBody!: " + ex.Message, false); - } - } - GC.Collect(); - } - - internal static void BulletXMessage(string message, bool isWarning) - { - PhysicsPluginManager.PhysicsPluginMessage("[Modified BulletX]:\t" + message, isWarning); - } - - //temp - //private float HeightValue(MonoXnaCompactMaths.Vector3 position) - //{ - // int li_x, li_y; - // float height; - // li_x = (int)Math.Round(position.X); if (li_x < 0) li_x = 0; - // li_y = (int)Math.Round(position.Y); if (li_y < 0) li_y = 0; - - // height = this._heightmap[li_y * 256 + li_x]; - // if (height < 0) height = 0; - // else if (height > maxZ) height = maxZ; - - // return height; - //} - } - - /// - /// Generic Physics Actor for BulletX inherit from PhysicActor - /// - public class BulletXActor : PhysicsActor - { - protected bool flying = false; - protected bool _physical = false; - protected OpenMetaverse.Vector3 _position; - protected OpenMetaverse.Vector3 _velocity; - protected OpenMetaverse.Vector3 _size; - protected OpenMetaverse.Vector3 _acceleration; - protected OpenMetaverse.Quaternion _orientation; - protected OpenMetaverse.Vector3 m_rotationalVelocity; - protected RigidBody rigidBody; - protected int m_PhysicsActorType; - private Boolean iscolliding = false; - internal string _name; - - public BulletXActor(String name) - { - _name = name; - } - - public override bool Stopped - { - get { return false; } - } - - public override OpenMetaverse.Vector3 Position - { - get { return _position; } - set - { - lock (BulletXScene.BulletXLock) - { - _position = value; - Translate(); - } - } - } - - public override OpenMetaverse.Vector3 RotationalVelocity - { - get { return m_rotationalVelocity; } - set { m_rotationalVelocity = value; } - } - - public override OpenMetaverse.Vector3 Velocity - { - get { return _velocity; } - set - { - lock (BulletXScene.BulletXLock) - { - //Static objects don' have linear velocity - if (_physical) - { - _velocity = value; - Speed(); - } - else - { - _velocity = OpenMetaverse.Vector3.Zero; - } - } - } - } - public override float CollisionScore - { - get { return 0f; } - set { } - } - public override OpenMetaverse.Vector3 Size - { - get { return _size; } - set - { - lock (BulletXScene.BulletXLock) - { - _size = value; - } - } - } - - public override OpenMetaverse.Vector3 Force - { - get { return OpenMetaverse.Vector3.Zero; } - set { return; } - } - - public override int VehicleType - { - get { return 0; } - set { return; } - } - - public override void VehicleFloatParam(int param, float value) - { - - } - - public override void VehicleVectorParam(int param, OpenMetaverse.Vector3 value) - { - - } - - public override void VehicleRotationParam(int param, OpenMetaverse.Quaternion rotation) - { - - } - - public override void VehicleFlags(int param, bool remove) - { - - } - - public override void SetVolumeDetect(int param) - { - - } - - public override OpenMetaverse.Vector3 CenterOfMass - { - get { return OpenMetaverse.Vector3.Zero; } - } - - public override OpenMetaverse.Vector3 GeometricCenter - { - get { return OpenMetaverse.Vector3.Zero; } - } - - public override PrimitiveBaseShape Shape - { - set { return; } - } - - public override bool SetAlwaysRun - { - get { return false; } - set { return; } - } - - public override OpenMetaverse.Vector3 Acceleration - { - get { return _acceleration; } - } - - public override OpenMetaverse.Quaternion Orientation - { - get { return _orientation; } - set - { - lock (BulletXScene.BulletXLock) - { - _orientation = value; - ReOrient(); - } - } - } - public override void link(PhysicsActor obj) - { - - } - - public override void delink() - { - - } - - public override void LockAngularMotion(OpenMetaverse.Vector3 axis) - { - - } - - public override float Mass - { - get { return ActorMass; } - } - - public virtual float ActorMass - { - get { return 0; } - } - - public override int PhysicsActorType - { - get { return (int) m_PhysicsActorType; } - set { m_PhysicsActorType = value; } - } - - public RigidBody RigidBody - { - get { return rigidBody; } - } - - public Vector3 RigidBodyPosition - { - get { return rigidBody.CenterOfMassPosition; } - } - - public override bool IsPhysical - { - get { return _physical; } - set { _physical = value; } - } - - public override bool Flying - { - get { return flying; } - set { flying = value; } - } - - public override bool ThrottleUpdates - { - get { return false; } - set { return; } - } - - public override bool IsColliding - { - get { return iscolliding; } - set { iscolliding = value; } - } - - public override bool CollidingGround - { - get { return false; } - set { return; } - } - - public override bool CollidingObj - { - get { return false; } - set { return; } - } - - public override uint LocalID - { - set { return; } - } - - public override bool Grabbed - { - set { return; } - } - - public override bool Selected - { - set { return; } - } - - public override float Buoyancy - { - get { return 0f; } - set { return; } - } - - public override bool FloatOnWater - { - set { return; } - } - - public virtual void SetAcceleration(OpenMetaverse.Vector3 accel) - { - lock (BulletXScene.BulletXLock) - { - _acceleration = accel; - } - } - - public override bool Kinematic - { - get { return false; } - set { } - } - - public override void AddForce(OpenMetaverse.Vector3 force, bool pushforce) - { - } - public override OpenMetaverse.Vector3 Torque - { - get { return OpenMetaverse.Vector3.Zero; } - set { return; } - } - public override void AddAngularForce(OpenMetaverse.Vector3 force, bool pushforce) - { - } - - public override void SetMomentum(OpenMetaverse.Vector3 momentum) - { - } - - internal virtual void ValidateHeight(float heighmapPositionValue) - { - } - - internal virtual void UpdateKinetics() - { - } - - #region Methods for updating values of RigidBody - - protected internal void Translate() - { - Translate(_position); - } - - protected internal void Translate(OpenMetaverse.Vector3 _newPos) - { - Vector3 _translation; - _translation = BulletXMaths.PhysicsVectorToXnaVector3(_newPos) - rigidBody.CenterOfMassPosition; - rigidBody.Translate(_translation); - } - - protected internal void Speed() - { - Speed(_velocity); - } - - protected internal void Speed(OpenMetaverse.Vector3 _newSpeed) - { - Vector3 _speed; - _speed = BulletXMaths.PhysicsVectorToXnaVector3(_newSpeed); - rigidBody.LinearVelocity = _speed; - } - - protected internal void ReOrient() - { - ReOrient(_orientation); - } - - protected internal void ReOrient(OpenMetaverse.Quaternion _newOrient) - { - Quaternion _newOrientation; - _newOrientation = BulletXMaths.QuaternionToXnaQuaternion(_newOrient); - Matrix _comTransform = rigidBody.CenterOfMassTransform; - BulletXMaths.SetRotation(ref _comTransform, _newOrientation); - rigidBody.CenterOfMassTransform = _comTransform; - } - - protected internal void ReSize() - { - ReSize(_size); - } - - protected internal virtual void ReSize(OpenMetaverse.Vector3 _newSize) - { - } - - public virtual void ScheduleTerseUpdate() - { - base.RequestPhysicsterseUpdate(); - } - - #endregion - - public override void CrossingFailure() - { - - } - public override OpenMetaverse.Vector3 PIDTarget { set { return; } } - public override bool PIDActive { set { return; } } - public override float PIDTau { set { return; } } - - public override float PIDHoverHeight { set { return; } } - public override bool PIDHoverActive { set { return; } } - public override PIDHoverType PIDHoverType { set { return; } } - public override float PIDHoverTau { set { return; } } - - public override OpenMetaverse.Quaternion APIDTarget - { - set { return; } - } - - public override bool APIDActive - { - set { return; } - } - - public override float APIDStrength - { - set { return; } - } - - public override float APIDDamping - { - set { return; } - } - - - public override void SubscribeEvents(int ms) - { - - } - public override void UnSubscribeEvents() - { - - } - public override bool SubscribedEvents() - { - return false; - } - } - - /// - /// PhysicsActor Character Class for BulletX - /// - public class BulletXCharacter : BulletXActor - { - public BulletXCharacter(BulletXScene parent_scene, OpenMetaverse.Vector3 pos) - : this(String.Empty, parent_scene, pos) - { - } - - public BulletXCharacter(String avName, BulletXScene parent_scene, OpenMetaverse.Vector3 pos) - : this(avName, parent_scene, pos, OpenMetaverse.Vector3.Zero, OpenMetaverse.Vector3.Zero, OpenMetaverse.Vector3.Zero, - OpenMetaverse.Quaternion.Identity) - { - } - - public BulletXCharacter(String avName, BulletXScene parent_scene, OpenMetaverse.Vector3 pos, OpenMetaverse.Vector3 velocity, - OpenMetaverse.Vector3 size, OpenMetaverse.Vector3 acceleration, OpenMetaverse.Quaternion orientation) - : base(avName) - { - //This fields will be removed. They're temporal - float _sizeX = 0.5f; - float _sizeY = 0.5f; - float _sizeZ = 1.6f; - //. - _position = pos; - _velocity = velocity; - _size = size; - //--- - _size.X = _sizeX; - _size.Y = _sizeY; - _size.Z = _sizeZ; - //. - _acceleration = acceleration; - _orientation = orientation; - _physical = true; - - float _mass = 50.0f; //This depends of avatar's dimensions - //For RigidBody Constructor. The next values might change - float _linearDamping = 0.0f; - float _angularDamping = 0.0f; - float _friction = 0.5f; - float _restitution = 0.0f; - Matrix _startTransform = Matrix.Identity; - Matrix _centerOfMassOffset = Matrix.Identity; - lock (BulletXScene.BulletXLock) - { - _startTransform.Translation = BulletXMaths.PhysicsVectorToXnaVector3(pos); - //CollisionShape _collisionShape = new BoxShape(new MonoXnaCompactMaths.Vector3(1.0f, 1.0f, 1.60f)); - //For now, like ODE, collisionShape = sphere of radious = 1.0 - CollisionShape _collisionShape = new SphereShape(1.0f); - DefaultMotionState _motionState = new DefaultMotionState(_startTransform, _centerOfMassOffset); - Vector3 _localInertia = new Vector3(); - _collisionShape.CalculateLocalInertia(_mass, out _localInertia); //Always when mass > 0 - rigidBody = - new RigidBody(_mass, _motionState, _collisionShape, _localInertia, _linearDamping, _angularDamping, - _friction, _restitution); - //rigidBody.ActivationState = ActivationState.DisableDeactivation; - //It's seems that there are a bug with rigidBody constructor and its CenterOfMassPosition - Vector3 _vDebugTranslation; - _vDebugTranslation = _startTransform.Translation - rigidBody.CenterOfMassPosition; - rigidBody.Translate(_vDebugTranslation); - parent_scene.ddWorld.AddRigidBody(rigidBody); - } - } - - public override int PhysicsActorType - { - get { return (int) ActorTypes.Agent; } - set { return; } - } - - public override OpenMetaverse.Vector3 Position - { - get { return base.Position; } - set { base.Position = value; } - } - - public override OpenMetaverse.Vector3 Velocity - { - get { return base.Velocity; } - set { base.Velocity = value; } - } - - public override OpenMetaverse.Vector3 Size - { - get { return base.Size; } - set { base.Size = value; } - } - - public override OpenMetaverse.Vector3 Acceleration - { - get { return base.Acceleration; } - } - - public override OpenMetaverse.Quaternion Orientation - { - get { return base.Orientation; } - set { base.Orientation = value; } - } - - public override bool Flying - { - get { return base.Flying; } - set { base.Flying = value; } - } - - public override bool IsColliding - { - get { return base.IsColliding; } - set { base.IsColliding = value; } - } - - public override bool Kinematic - { - get { return base.Kinematic; } - set { base.Kinematic = value; } - } - - public override void SetAcceleration(OpenMetaverse.Vector3 accel) - { - base.SetAcceleration(accel); - } - - public override void AddForce(OpenMetaverse.Vector3 force, bool pushforce) - { - base.AddForce(force, pushforce); - } - - public override void SetMomentum(OpenMetaverse.Vector3 momentum) - { - base.SetMomentum(momentum); - } - - internal void Move(float timeStep) - { - Vector3 vec = new Vector3(); - //At this point it's supossed that: - //_velocity == rigidBody.LinearVelocity - vec.X = _velocity.X; - vec.Y = _velocity.Y; - vec.Z = _velocity.Z; - if ((vec.X != 0.0f) || (vec.Y != 0.0f) || (vec.Z != 0.0f)) rigidBody.Activate(); - if (flying) - { - //Antigravity with movement - if (_position.Z <= BulletXScene.HeightLevel0) - { - vec.Z += BulletXScene.Gravity*timeStep; - } - //Lowgravity with movement - else if ((_position.Z > BulletXScene.HeightLevel0) - && (_position.Z <= BulletXScene.HeightLevel1)) - { - vec.Z += BulletXScene.Gravity*timeStep*(1.0f - BulletXScene.LowGravityFactor); - } - //Lowgravity with... - else if (_position.Z > BulletXScene.HeightLevel1) - { - if (vec.Z > 0) //no movement - vec.Z = BulletXScene.Gravity*timeStep*(1.0f - BulletXScene.LowGravityFactor); - else - vec.Z += BulletXScene.Gravity*timeStep*(1.0f - BulletXScene.LowGravityFactor); - } - } - rigidBody.LinearVelocity = vec; - } - - //This validation is very basic - internal override void ValidateHeight(float heighmapPositionValue) - { - if (rigidBody.CenterOfMassPosition.Z < heighmapPositionValue + _size.Z/2.0f) - { - Matrix m = rigidBody.WorldTransform; - Vector3 v3 = m.Translation; - v3.Z = heighmapPositionValue + _size.Z/2.0f; - m.Translation = v3; - rigidBody.WorldTransform = m; - //When an Avie touch the ground it's vertical velocity it's reduced to ZERO - Speed(new OpenMetaverse.Vector3(rigidBody.LinearVelocity.X, rigidBody.LinearVelocity.Y, 0.0f)); - } - } - - internal override void UpdateKinetics() - { - _position = BulletXMaths.XnaVector3ToPhysicsVector(rigidBody.CenterOfMassPosition); - _velocity = BulletXMaths.XnaVector3ToPhysicsVector(rigidBody.LinearVelocity); - //Orientation it seems that it will be the default. - ReOrient(); - } - } - - /// - /// PhysicsActor Prim Class for BulletX - /// - public class BulletXPrim : BulletXActor - { - //Density it will depends of material. - //For now all prims have the same density, all prims are made of water. Be water my friend! :D - private const float _density = 1000.0f; - private BulletXScene _parent_scene; - private OpenMetaverse.Vector3 m_prev_position; - private bool m_lastUpdateSent = false; - //added by jed zhu - private IMesh _mesh; - public IMesh GetMesh() { return _mesh; } - - - - public BulletXPrim(String primName, BulletXScene parent_scene, OpenMetaverse.Vector3 pos, OpenMetaverse.Vector3 size, - OpenMetaverse.Quaternion rotation, IMesh mesh, PrimitiveBaseShape pbs, bool isPhysical) - : this( - primName, parent_scene, pos, OpenMetaverse.Vector3.Zero, size, OpenMetaverse.Vector3.Zero, rotation, mesh, pbs, - isPhysical) - { - } - - public BulletXPrim(String primName, BulletXScene parent_scene, OpenMetaverse.Vector3 pos, OpenMetaverse.Vector3 velocity, - OpenMetaverse.Vector3 size, - OpenMetaverse.Vector3 acceleration, OpenMetaverse.Quaternion rotation, IMesh mesh, PrimitiveBaseShape pbs, - bool isPhysical) - : base(primName) - { - if ((size.X == 0) || (size.Y == 0) || (size.Z == 0)) - throw new Exception("Size 0"); - if (OpenMetaverse.Quaternion.Normalize(rotation).Length() == 0f) - rotation = OpenMetaverse.Quaternion.Identity; - - _position = pos; - _physical = isPhysical; - _velocity = _physical ? velocity : OpenMetaverse.Vector3.Zero; - _size = size; - _acceleration = acceleration; - _orientation = rotation; - - _parent_scene = parent_scene; - - CreateRigidBody(parent_scene, mesh, pos, size); - } - - public override int PhysicsActorType - { - get { return (int) ActorTypes.Prim; } - set { return; } - } - - public override OpenMetaverse.Vector3 Position - { - get { return base.Position; } - set { base.Position = value; } - } - - public override OpenMetaverse.Vector3 Velocity - { - get { return base.Velocity; } - set { base.Velocity = value; } - } - - public override OpenMetaverse.Vector3 Size - { - get { return _size; } - set - { - lock (BulletXScene.BulletXLock) - { - _size = value; - ReSize(); - } - } - } - - public override OpenMetaverse.Vector3 Acceleration - { - get { return base.Acceleration; } - } - - public override OpenMetaverse.Quaternion Orientation - { - get { return base.Orientation; } - set { base.Orientation = value; } - } - - public override float ActorMass - { - get - { - //For now all prims are boxes - return (_physical ? 1 : 0)*_density*_size.X*_size.Y*_size.Z; - } - } - - public override bool IsPhysical - { - get { return base.IsPhysical; } - set - { - base.IsPhysical = value; - if (value) - { - //--- - PhysicsPluginManager.PhysicsPluginMessage("Physical - Recreate", true); - //--- - ReCreateRigidBody(_size); - } - else - { - //--- - PhysicsPluginManager.PhysicsPluginMessage("Physical - SetMassProps", true); - //--- - rigidBody.SetMassProps(Mass, new Vector3()); - } - } - } - - public override bool Flying - { - get { return base.Flying; } - set { base.Flying = value; } - } - - public override bool IsColliding - { - get { return base.IsColliding; } - set { base.IsColliding = value; } - } - - public override bool Kinematic - { - get { return base.Kinematic; } - set { base.Kinematic = value; } - } - - public override void SetAcceleration(OpenMetaverse.Vector3 accel) - { - lock (BulletXScene.BulletXLock) - { - _acceleration = accel; - } - } - - public override void AddForce(OpenMetaverse.Vector3 force, bool pushforce) - { - base.AddForce(force,pushforce); - } - - public override void SetMomentum(OpenMetaverse.Vector3 momentum) - { - base.SetMomentum(momentum); - } - - internal override void ValidateHeight(float heighmapPositionValue) - { - if (rigidBody.CenterOfMassPosition.Z < heighmapPositionValue + _size.Z/2.0f) - { - Matrix m = rigidBody.WorldTransform; - Vector3 v3 = m.Translation; - v3.Z = heighmapPositionValue + _size.Z/2.0f; - m.Translation = v3; - rigidBody.WorldTransform = m; - //When a Prim touch the ground it's vertical velocity it's reduced to ZERO - //Static objects don't have linear velocity - if (_physical) - Speed(new OpenMetaverse.Vector3(rigidBody.LinearVelocity.X, rigidBody.LinearVelocity.Y, 0.0f)); - } - } - - internal override void UpdateKinetics() - { - if (_physical) //Updates properties. Prim updates its properties physically - { - _position = BulletXMaths.XnaVector3ToPhysicsVector(rigidBody.CenterOfMassPosition); - - _velocity = BulletXMaths.XnaVector3ToPhysicsVector(rigidBody.LinearVelocity); - _orientation = BulletXMaths.XnaQuaternionToQuaternion(rigidBody.Orientation); - - if ((Math.Abs(m_prev_position.X - _position.X) < 0.03) - && (Math.Abs(m_prev_position.Y - _position.Y) < 0.03) - && (Math.Abs(m_prev_position.Z - _position.Z) < 0.03)) - { - if (!m_lastUpdateSent) - { - _velocity = OpenMetaverse.Vector3.Zero; - base.ScheduleTerseUpdate(); - m_lastUpdateSent = true; - } - } - else - { - m_lastUpdateSent = false; - base.ScheduleTerseUpdate(); - } - m_prev_position = _position; - } - else //Doesn't updates properties. That's a cancel - { - Translate(); - //Speed(); //<- Static objects don't have linear velocity - ReOrient(); - } - } - - #region Methods for updating values of RigidBody - - protected internal void CreateRigidBody(BulletXScene parent_scene, IMesh mesh, OpenMetaverse.Vector3 pos, - OpenMetaverse.Vector3 size) - { - //For RigidBody Constructor. The next values might change - float _linearDamping = 0.0f; - float _angularDamping = 0.0f; - float _friction = 1.0f; - float _restitution = 0.0f; - Matrix _startTransform = Matrix.Identity; - Matrix _centerOfMassOffset = Matrix.Identity; - //added by jed zhu - _mesh = mesh; - - lock (BulletXScene.BulletXLock) - { - _startTransform.Translation = BulletXMaths.PhysicsVectorToXnaVector3(pos); - //For now all prims are boxes - CollisionShape _collisionShape; - if (mesh == null) - { - _collisionShape = new BoxShape(BulletXMaths.PhysicsVectorToXnaVector3(size)/2.0f); - } - else - { - int iVertexCount = mesh.getVertexList().Count; - int[] indices = mesh.getIndexListAsInt(); - Vector3[] v3Vertices = new Vector3[iVertexCount]; - for (int i = 0; i < iVertexCount; i++) - { - OpenMetaverse.Vector3 v = mesh.getVertexList()[i]; - if (v != null) // Note, null has special meaning. See meshing code for details - v3Vertices[i] = BulletXMaths.PhysicsVectorToXnaVector3(v); - else - v3Vertices[i] = Vector3.Zero; - } - TriangleIndexVertexArray triMesh = new TriangleIndexVertexArray(indices, v3Vertices); - - _collisionShape = new TriangleMeshShape(triMesh); - } - DefaultMotionState _motionState = new DefaultMotionState(_startTransform, _centerOfMassOffset); - Vector3 _localInertia = new Vector3(); - if (_physical) _collisionShape.CalculateLocalInertia(Mass, out _localInertia); //Always when mass > 0 - rigidBody = - new RigidBody(Mass, _motionState, _collisionShape, _localInertia, _linearDamping, _angularDamping, - _friction, _restitution); - //rigidBody.ActivationState = ActivationState.DisableDeactivation; - //It's seems that there are a bug with rigidBody constructor and its CenterOfMassPosition - Vector3 _vDebugTranslation; - _vDebugTranslation = _startTransform.Translation - rigidBody.CenterOfMassPosition; - rigidBody.Translate(_vDebugTranslation); - //--- - parent_scene.ddWorld.AddRigidBody(rigidBody); - } - } - - protected internal void ReCreateRigidBody(OpenMetaverse.Vector3 size) - { - //There is a bug when trying to remove a rigidBody that is colliding with something.. - try - { - _parent_scene.ddWorld.RemoveRigidBody(rigidBody); - } - catch (Exception ex) - { - BulletXScene.BulletXMessage(_parent_scene.is_ex_message + ex.Message, true); - rigidBody.ActivationState = ActivationState.DisableSimulation; - _parent_scene.AddForgottenRigidBody(rigidBody); - } - CreateRigidBody(_parent_scene, null, _position, size); - // Note, null for the meshing definitely is wrong. It's here for the moment to apease the compiler - if (_physical) Speed(); //Static objects don't have linear velocity - ReOrient(); - GC.Collect(); - } - - protected internal override void ReSize(OpenMetaverse.Vector3 _newSize) - { - //I wonder to know how to resize with a simple instruction in BulletX. It seems that for now there isn't - //so i have to do it manually. That's recreating rigidbody - ReCreateRigidBody(_newSize); - } - - #endregion - } - - /// - /// This Class manage a HeighField as a RigidBody. This is for to be added in the BulletXScene - /// - internal class BulletXPlanet - { - private OpenMetaverse.Vector3 _staticPosition; -// private Vector3 _staticVelocity; -// private OpenMetaverse.Quaternion _staticOrientation; - private float _mass; - // private BulletXScene _parentscene; - internal float[] _heightField; - private RigidBody _flatPlanet; - - internal RigidBody RigidBody - { - get { return _flatPlanet; } - } - - internal BulletXPlanet(BulletXScene parent_scene, float[] heightField) - { - _staticPosition = new OpenMetaverse.Vector3(BulletXScene.MaxXY / 2, BulletXScene.MaxXY / 2, 0); -// _staticVelocity = new PhysicsVector(); -// _staticOrientation = OpenMetaverse.Quaternion.Identity; - _mass = 0; //No active - // _parentscene = parent_scene; - _heightField = heightField; - - float _linearDamping = 0.0f; - float _angularDamping = 0.0f; - float _friction = 0.5f; - float _restitution = 0.0f; - Matrix _startTransform = Matrix.Identity; - Matrix _centerOfMassOffset = Matrix.Identity; - - lock (BulletXScene.BulletXLock) - { - try - { - _startTransform.Translation = BulletXMaths.PhysicsVectorToXnaVector3(_staticPosition); - CollisionShape _collisionShape = - new HeightfieldTerrainShape(BulletXScene.MaxXY, BulletXScene.MaxXY, _heightField, - (float) BulletXScene.MaxZ, 2, true, false); - DefaultMotionState _motionState = new DefaultMotionState(_startTransform, _centerOfMassOffset); - Vector3 _localInertia = new Vector3(); - //_collisionShape.CalculateLocalInertia(_mass, out _localInertia); //Always when mass > 0 - _flatPlanet = - new RigidBody(_mass, _motionState, _collisionShape, _localInertia, _linearDamping, - _angularDamping, _friction, _restitution); - //It's seems that there are a bug with rigidBody constructor and its CenterOfMassPosition - Vector3 _vDebugTranslation; - _vDebugTranslation = _startTransform.Translation - _flatPlanet.CenterOfMassPosition; - _flatPlanet.Translate(_vDebugTranslation); - parent_scene.ddWorld.AddRigidBody(_flatPlanet); - } - catch (Exception ex) - { - BulletXScene.BulletXMessage(ex.Message, true); - } - } - BulletXScene.BulletXMessage("BulletXPlanet created.", false); - } - - internal float HeightValue(Vector3 position) - { - int li_x, li_y; - float height; - li_x = (int) Math.Round(position.X); - if (li_x < 0) li_x = 0; - if (li_x >= BulletXScene.MaxXY) li_x = BulletXScene.MaxXY - 1; - li_y = (int) Math.Round(position.Y); - if (li_y < 0) li_y = 0; - if (li_y >= BulletXScene.MaxXY) li_y = BulletXScene.MaxXY - 1; - - height = ((HeightfieldTerrainShape) _flatPlanet.CollisionShape).getHeightFieldValue(li_x, li_y); - if (height < 0) height = 0; - else if (height > BulletXScene.MaxZ) height = BulletXScene.MaxZ; - - return height; - } - } -} diff --git a/OpenSim/Region/Physics/BulletXPlugin/TriangleIndexVertexArray.cs b/OpenSim/Region/Physics/BulletXPlugin/TriangleIndexVertexArray.cs deleted file mode 100644 index 637cf6e..0000000 --- a/OpenSim/Region/Physics/BulletXPlugin/TriangleIndexVertexArray.cs +++ /dev/null @@ -1,197 +0,0 @@ -/* - Bullet for XNA Copyright (c) 2003-2007 Vsevolod Klementjev http://www.codeplex.com/xnadevru - Bullet original C++ version Copyright (c) 2003-2007 Erwin Coumans http://bulletphysics.com - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -/* - This file contains a class TriangleIndexVertexArray. I tried using the class with the same name - from the BulletX implementation and found it unusable for the purpose of using triangle meshes - within BulletX as the implementation was painfully incomplete. - The attempt to derive from the original class failed as viable members were hidden. - Fiddling around with BulletX itself was not my intention. - So I copied the class to the BulletX-plugin and modified it. - If you want to fiddle around with it it's up to you to move all this to BulletX. - If someone someday implements the missing functionality in BulletX, feel free to remove this class. - It's just an ugly hack. -*/ - -using System; -using System.Collections.Generic; -using MonoXnaCompactMaths; -using XnaDevRu.BulletX; - -namespace OpenSim.Region.Physics.BulletXPlugin -{ - /// - /// IndexedMesh indexes into existing vertex and index arrays, in a similar way OpenGL glDrawElements - /// instead of the number of indices, we pass the number of triangles - /// - public struct IndexedMesh - { - private int _numTriangles; - private int[] _triangleIndexBase; - private int _triangleIndexStride; - private int _numVertices; - private Vector3[] _vertexBase; - private int _vertexStride; - - public IndexedMesh(int numTriangleIndices, int[] triangleIndexBase, int triangleIndexStride, int numVertices, - Vector3[] vertexBase, int vertexStride) - { - _numTriangles = numTriangleIndices; - _triangleIndexBase = triangleIndexBase; - _triangleIndexStride = triangleIndexStride; - _vertexBase = vertexBase; - _numVertices = numVertices; - _vertexStride = vertexStride; - } - - public IndexedMesh(int[] triangleIndexBase, Vector3[] vertexBase) - { - _numTriangles = triangleIndexBase.Length; - _triangleIndexBase = triangleIndexBase; - _triangleIndexStride = 32; - _vertexBase = vertexBase; - _numVertices = vertexBase.Length; - _vertexStride = 24; - } - - public int TriangleCount - { - get { return _numTriangles; } - set { _numTriangles = value; } - } - - public int[] TriangleIndexBase - { - get { return _triangleIndexBase; } - set { _triangleIndexBase = value; } - } - - public int TriangleIndexStride - { - get { return _triangleIndexStride; } - set { _triangleIndexStride = value; } - } - - public int VertexCount - { - get { return _numVertices; } - set { _numVertices = value; } - } - - public Vector3[] VertexBase - { - get { return _vertexBase; } - set { _vertexBase = value; } - } - - public int VertexStride - { - get { return _vertexStride; } - set { _vertexStride = value; } - } - } - - /// - /// TriangleIndexVertexArray allows to use multiple meshes, by indexing into existing triangle/index arrays. - /// Additional meshes can be added using addIndexedMesh - /// - public class TriangleIndexVertexArray : StridingMeshInterface - { - private List _indexedMeshes = new List(); - - public TriangleIndexVertexArray() - { - } - - public TriangleIndexVertexArray(int numTriangleIndices, int[] triangleIndexBase, int triangleIndexStride, - int numVertices, Vector3[] vertexBase, int vertexStride) - { - IndexedMesh mesh = new IndexedMesh(); - mesh.TriangleCount = numTriangleIndices; - mesh.TriangleIndexBase = triangleIndexBase; - mesh.TriangleIndexStride = triangleIndexStride; - mesh.VertexBase = vertexBase; - mesh.VertexCount = numVertices; - mesh.VertexStride = vertexStride; - - AddIndexedMesh(mesh); - } - - public TriangleIndexVertexArray(int[] triangleIndexBase, Vector3[] vertexBase) - : this(triangleIndexBase.Length, triangleIndexBase, 32, vertexBase.Length, vertexBase, 24) - { - } - - public void AddIndexedMesh(IndexedMesh indexedMesh) - { - _indexedMeshes.Add(indexedMesh); - } - - public override void GetLockedVertexIndexBase(out List verts, out List indicies, out int numfaces, - int subpart) - { - throw new Exception("The method or operation is not implemented."); - } - - public override void GetLockedReadOnlyVertexIndexBase(out List verts, out List indicies, - out int numfaces, int subpart) - { - IndexedMesh m = _indexedMeshes[0]; - Vector3[] vertexBase = m.VertexBase; - verts = new List(); - foreach (Vector3 v in vertexBase) - { - verts.Add(v); - } - int[] indexBase = m.TriangleIndexBase; - indicies = new List(); - foreach (int i in indexBase) - { - indicies.Add(i); - } - numfaces = vertexBase.GetLength(0); - } - - public override void UnLockVertexBase(int subpart) - { - throw new Exception("The method or operation is not implemented."); - } - - public override void UnLockReadOnlyVertexBase(int subpart) - { - } - - public override int SubPartsCount() - { - return _indexedMeshes.Count; - } - - public override void PreallocateVertices(int numverts) - { - throw new Exception("The method or operation is not implemented."); - } - - public override void PreallocateIndices(int numindices) - { - throw new Exception("The method or operation is not implemented."); - } - } -} -- cgit v1.1 From 1e798136c3458b8255fcb6341713bf9dbb689f4b Mon Sep 17 00:00:00 2001 From: Justin Clark-Casey (justincc) Date: Sat, 17 Sep 2011 01:33:55 +0100 Subject: adjust some whitespace to trigger another build, to check the last failure was just a glitch --- OpenSim/Region/Physics/OdePlugin/ODEPrim.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'OpenSim/Region/Physics') diff --git a/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs b/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs index 924d7c2..ac92b8b 100644 --- a/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs +++ b/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs @@ -1526,6 +1526,7 @@ Console.WriteLine("changeadd 1"); { if (Body == IntPtr.Zero) enableBody(); + //Prim auto disable after 20 frames, //if you move it, re-enable the prim manually. if (_parent != null) @@ -1536,6 +1537,7 @@ Console.WriteLine("changeadd 1"); m_linkJoint = IntPtr.Zero; } } + if (Body != IntPtr.Zero) { d.BodySetPosition(Body, _position.X, _position.Y, _position.Z); @@ -1599,7 +1601,6 @@ Console.WriteLine(" JointCreateFixed"); float fy = 0; float fz = 0; - if (IsPhysical && (Body != IntPtr.Zero) && !m_isSelected && !childPrim) // KF: Only move root prims. { if (m_vehicle.Type != Vehicle.TYPE_NONE) @@ -1818,7 +1819,6 @@ Console.WriteLine(" JointCreateFixed"); // 35x10 = 350n times the mass per second applied maximum. float nmax = 35f * m_mass; float nmin = -35f * m_mass; - if (fx > nmax) fx = nmax; -- cgit v1.1