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