From 7b0604dc492b95b0edaeb4de367e1f92d29e85d3 Mon Sep 17 00:00:00 2001 From: Melanie Date: Sun, 23 Dec 2012 19:19:46 +0000 Subject: [PATCH 01/11] Whitespace change to trigger bot --- CONTRIBUTORS.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTORS.txt b/CONTRIBUTORS.txt index 43dea0bd3b..b3187938f1 100644 --- a/CONTRIBUTORS.txt +++ b/CONTRIBUTORS.txt @@ -1,4 +1,4 @@ - <<<>>>>The following people have contributed to OpenSim (Thank you + <<<>>>>The following people have contributed to OpenSim (Thank you for your effort!) = Current OpenSim Developers (in very rough order of appearance) = From bad9cb918a3a51038c0a833b3d644cb3bf4864ad Mon Sep 17 00:00:00 2001 From: Melanie Date: Sun, 23 Dec 2012 19:21:20 +0000 Subject: [PATCH 02/11] White space change to trigger bot --- CONTRIBUTORS.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTORS.txt b/CONTRIBUTORS.txt index b3187938f1..43dea0bd3b 100644 --- a/CONTRIBUTORS.txt +++ b/CONTRIBUTORS.txt @@ -1,4 +1,4 @@ - <<<>>>>The following people have contributed to OpenSim (Thank you + <<<>>>>The following people have contributed to OpenSim (Thank you for your effort!) = Current OpenSim Developers (in very rough order of appearance) = From aaf0ad5898f910c104a5b4784f4a00aceaad53a4 Mon Sep 17 00:00:00 2001 From: Melanie Date: Sun, 23 Dec 2012 19:22:15 +0000 Subject: [PATCH 03/11] Revert "White space change to trigger bot" This reverts commit bad9cb918a3a51038c0a833b3d644cb3bf4864ad. --- CONTRIBUTORS.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTORS.txt b/CONTRIBUTORS.txt index 43dea0bd3b..b3187938f1 100644 --- a/CONTRIBUTORS.txt +++ b/CONTRIBUTORS.txt @@ -1,4 +1,4 @@ - <<<>>>>The following people have contributed to OpenSim (Thank you + <<<>>>>The following people have contributed to OpenSim (Thank you for your effort!) = Current OpenSim Developers (in very rough order of appearance) = From 50ee50bcd5ede60e5662b430481e199f6516e6c4 Mon Sep 17 00:00:00 2001 From: Melanie Date: Sun, 23 Dec 2012 19:23:20 +0000 Subject: [PATCH 04/11] Revert "Whitespace change to trigger bot" This reverts commit 7b0604dc492b95b0edaeb4de367e1f92d29e85d3. --- CONTRIBUTORS.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTORS.txt b/CONTRIBUTORS.txt index b3187938f1..43dea0bd3b 100644 --- a/CONTRIBUTORS.txt +++ b/CONTRIBUTORS.txt @@ -1,4 +1,4 @@ - <<<>>>>The following people have contributed to OpenSim (Thank you + <<<>>>>The following people have contributed to OpenSim (Thank you for your effort!) = Current OpenSim Developers (in very rough order of appearance) = From 92e4f9f412046f8f7926c99c9e56c3a8b6b2edbf Mon Sep 17 00:00:00 2001 From: teravus Date: Sun, 23 Dec 2012 15:21:25 -0500 Subject: [PATCH 05/11] * Initial commit of BulletSimN (BulletSNPlugin). Purely C# implementation of BulletSim. This is designed to be /as close as possible/ to the BulletSim plugin while still being entirely in the managed space to make keeping it up to date easy as possible (no thinking work). This implementation is /slower/ then the c++ version just because it's fully managed, so it's not appropriate for huge sims, but it will run small ones OK. At the moment, it supports all known features of BulletSim. Think of it like.. POS but everything works. To use this plugin, set the physics plugin to BulletSimN. --- .../Physics/BulletSNPlugin/BSCharacter.cs | 814 +++++++++ .../Physics/BulletSNPlugin/BSConstraint.cs | 135 ++ .../BulletSNPlugin/BSConstraint6Dof.cs | 153 ++ .../BulletSNPlugin/BSConstraintCollection.cs | 180 ++ .../BulletSNPlugin/BSConstraintHinge.cs | 57 + .../Physics/BulletSNPlugin/BSDynamics.cs | 1374 ++++++++++++++ .../Physics/BulletSNPlugin/BSLinkset.cs | 333 ++++ .../BulletSNPlugin/BSLinksetCompound.cs | 396 ++++ .../BulletSNPlugin/BSLinksetConstraints.cs | 314 ++++ .../Physics/BulletSNPlugin/BSMaterials.cs | 200 ++ .../Region/Physics/BulletSNPlugin/BSMotors.cs | 347 ++++ .../Region/Physics/BulletSNPlugin/BSParam.cs | 559 ++++++ .../Physics/BulletSNPlugin/BSPhysObject.cs | 345 ++++ .../Region/Physics/BulletSNPlugin/BSPlugin.cs | 81 + .../Region/Physics/BulletSNPlugin/BSPrim.cs | 1467 +++++++++++++++ .../Region/Physics/BulletSNPlugin/BSScene.cs | 954 ++++++++++ .../BulletSNPlugin/BSShapeCollection.cs | 1015 +++++++++++ .../Region/Physics/BulletSNPlugin/BSShapes.cs | 208 +++ .../BulletSNPlugin/BSTerrainHeightmap.cs | 175 ++ .../BulletSNPlugin/BSTerrainManager.cs | 460 +++++ .../Physics/BulletSNPlugin/BSTerrainMesh.cs | 267 +++ .../Physics/BulletSNPlugin/BulletSimAPI.cs | 1604 +++++++++++++++++ .../Physics/BulletSNPlugin/BulletSimData.cs | 280 +++ bin/BulletXNA.dll | Bin 0 -> 614400 bytes bin/BulletXNA.pdb | Bin 0 -> 1875456 bytes prebuild.xml | 34 + 26 files changed, 11752 insertions(+) create mode 100644 OpenSim/Region/Physics/BulletSNPlugin/BSCharacter.cs create mode 100644 OpenSim/Region/Physics/BulletSNPlugin/BSConstraint.cs create mode 100644 OpenSim/Region/Physics/BulletSNPlugin/BSConstraint6Dof.cs create mode 100644 OpenSim/Region/Physics/BulletSNPlugin/BSConstraintCollection.cs create mode 100644 OpenSim/Region/Physics/BulletSNPlugin/BSConstraintHinge.cs create mode 100644 OpenSim/Region/Physics/BulletSNPlugin/BSDynamics.cs create mode 100644 OpenSim/Region/Physics/BulletSNPlugin/BSLinkset.cs create mode 100644 OpenSim/Region/Physics/BulletSNPlugin/BSLinksetCompound.cs create mode 100644 OpenSim/Region/Physics/BulletSNPlugin/BSLinksetConstraints.cs create mode 100644 OpenSim/Region/Physics/BulletSNPlugin/BSMaterials.cs create mode 100644 OpenSim/Region/Physics/BulletSNPlugin/BSMotors.cs create mode 100644 OpenSim/Region/Physics/BulletSNPlugin/BSParam.cs create mode 100644 OpenSim/Region/Physics/BulletSNPlugin/BSPhysObject.cs create mode 100644 OpenSim/Region/Physics/BulletSNPlugin/BSPlugin.cs create mode 100644 OpenSim/Region/Physics/BulletSNPlugin/BSPrim.cs create mode 100644 OpenSim/Region/Physics/BulletSNPlugin/BSScene.cs create mode 100644 OpenSim/Region/Physics/BulletSNPlugin/BSShapeCollection.cs create mode 100644 OpenSim/Region/Physics/BulletSNPlugin/BSShapes.cs create mode 100644 OpenSim/Region/Physics/BulletSNPlugin/BSTerrainHeightmap.cs create mode 100644 OpenSim/Region/Physics/BulletSNPlugin/BSTerrainManager.cs create mode 100644 OpenSim/Region/Physics/BulletSNPlugin/BSTerrainMesh.cs create mode 100644 OpenSim/Region/Physics/BulletSNPlugin/BulletSimAPI.cs create mode 100644 OpenSim/Region/Physics/BulletSNPlugin/BulletSimData.cs create mode 100644 bin/BulletXNA.dll create mode 100644 bin/BulletXNA.pdb diff --git a/OpenSim/Region/Physics/BulletSNPlugin/BSCharacter.cs b/OpenSim/Region/Physics/BulletSNPlugin/BSCharacter.cs new file mode 100644 index 0000000000..4c4e95048f --- /dev/null +++ b/OpenSim/Region/Physics/BulletSNPlugin/BSCharacter.cs @@ -0,0 +1,814 @@ +/* + * 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 copyrightD + * 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 log4net; +using OMV = OpenMetaverse; +using OpenSim.Framework; +using OpenSim.Region.Physics.Manager; + +namespace OpenSim.Region.Physics.BulletSNPlugin +{ +public sealed class BSCharacter : BSPhysObject +{ + private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); + private static readonly string LogHeader = "[BULLETS CHAR]"; + + // private bool _stopped; + private OMV.Vector3 _size; + private bool _grabbed; + private bool _selected; + private OMV.Vector3 _position; + private float _mass; + private float _avatarDensity; + private float _avatarVolume; + private OMV.Vector3 _force; + private OMV.Vector3 _velocity; + private OMV.Vector3 _torque; + private float _collisionScore; + private OMV.Vector3 _acceleration; + private OMV.Quaternion _orientation; + private int _physicsActorType; + private bool _isPhysical; + private bool _flying; + private bool _setAlwaysRun; + private bool _throttleUpdates; + private bool _isColliding; + private bool _collidingObj; + private bool _floatOnWater; + private OMV.Vector3 _rotationalVelocity; + private bool _kinematic; + private float _buoyancy; + + // The friction and velocity of the avatar is modified depending on whether walking or not. + private OMV.Vector3 _appliedVelocity; // the last velocity applied to the avatar + private float _currentFriction; // the friction currently being used (changed by setVelocity). + + private BSVMotor _velocityMotor; + + private OMV.Vector3 _PIDTarget; + private bool _usePID; + private float _PIDTau; + private bool _useHoverPID; + private float _PIDHoverHeight; + private PIDHoverType _PIDHoverType; + private float _PIDHoverTao; + + public BSCharacter(uint localID, String avName, BSScene parent_scene, OMV.Vector3 pos, OMV.Vector3 size, bool isFlying) + : base(parent_scene, localID, avName, "BSCharacter") + { + _physicsActorType = (int)ActorTypes.Agent; + _position = pos; + + // Old versions of ScenePresence passed only the height. If width and/or depth are zero, + // replace with the default values. + _size = size; + if (_size.X == 0f) _size.X = BSParam.AvatarCapsuleDepth; + if (_size.Y == 0f) _size.Y = BSParam.AvatarCapsuleWidth; + + // A motor to control the acceleration and deceleration of the avatar movement. + // _velocityMotor = new BSVMotor("BSCharacter.Velocity", 3f, 5f, BSMotor.InfiniteVector, 1f); + // _velocityMotor = new BSPIDVMotor("BSCharacter.Velocity", 3f, 5f, BSMotor.InfiniteVector, 1f); + // Infinite decay and timescale values so motor only changes current to target values. + _velocityMotor = new BSVMotor("BSCharacter.Velocity", + 0.2f, // time scale + BSMotor.Infinite, // decay time scale + BSMotor.InfiniteVector, // friction timescale + 1f // efficiency + ); + _velocityMotor.PhysicsScene = PhysicsScene; // DEBUG DEBUG so motor will output detail log messages. + + _flying = isFlying; + _orientation = OMV.Quaternion.Identity; + _velocity = OMV.Vector3.Zero; + _appliedVelocity = OMV.Vector3.Zero; + _buoyancy = ComputeBuoyancyFromFlying(isFlying); + _currentFriction = BSParam.AvatarStandingFriction; + _avatarDensity = BSParam.AvatarDensity; + + // The dimensions of the avatar capsule are kept in the scale. + // Physics creates a unit capsule which is scaled by the physics engine. + ComputeAvatarScale(_size); + // set _avatarVolume and _mass based on capsule size, _density and Scale + ComputeAvatarVolumeAndMass(); + DetailLog("{0},BSCharacter.create,call,size={1},scale={2},density={3},volume={4},mass={5}", + LocalID, _size, Scale, _avatarDensity, _avatarVolume, RawMass); + + // do actual creation in taint time + PhysicsScene.TaintedObject("BSCharacter.create", delegate() + { + DetailLog("{0},BSCharacter.create,taint", LocalID); + // New body and shape into PhysBody and PhysShape + PhysicsScene.Shapes.GetBodyAndShape(true, PhysicsScene.World, this); + + SetPhysicalProperties(); + }); + return; + } + + // called when this character is being destroyed and the resources should be released + public override void Destroy() + { + base.Destroy(); + + DetailLog("{0},BSCharacter.Destroy", LocalID); + PhysicsScene.TaintedObject("BSCharacter.destroy", delegate() + { + PhysicsScene.Shapes.DereferenceBody(PhysBody, true, null); + PhysBody.Clear(); + PhysicsScene.Shapes.DereferenceShape(PhysShape, true, null); + PhysShape.Clear(); + }); + } + + private void SetPhysicalProperties() + { + BulletSimAPI.RemoveObjectFromWorld2(PhysicsScene.World.ptr, PhysBody.ptr); + + ZeroMotion(true); + ForcePosition = _position; + // Set the velocity and compute the proper friction + ForceVelocity = _velocity; + // Setting the current and target in the motor will cause it to start computing any deceleration. + _velocityMotor.Reset(); + _velocityMotor.SetCurrent(_velocity); + _velocityMotor.SetTarget(_velocity); + _velocityMotor.Enabled = false; + + // This will enable or disable the flying buoyancy of the avatar. + // Needs to be reset especially when an avatar is recreated after crossing a region boundry. + Flying = _flying; + + BulletSimAPI.SetRestitution2(PhysBody.ptr, BSParam.AvatarRestitution); + BulletSimAPI.SetMargin2(PhysShape.ptr, PhysicsScene.Params.collisionMargin); + BulletSimAPI.SetLocalScaling2(PhysShape.ptr, Scale); + BulletSimAPI.SetContactProcessingThreshold2(PhysBody.ptr, BSParam.ContactProcessingThreshold); + if (BSParam.CcdMotionThreshold > 0f) + { + BulletSimAPI.SetCcdMotionThreshold2(PhysBody.ptr, BSParam.CcdMotionThreshold); + BulletSimAPI.SetCcdSweptSphereRadius2(PhysBody.ptr, BSParam.CcdSweptSphereRadius); + } + + UpdatePhysicalMassProperties(RawMass); + + // Make so capsule does not fall over + BulletSimAPI.SetAngularFactorV2(PhysBody.ptr, OMV.Vector3.Zero); + + BulletSimAPI.AddToCollisionFlags2(PhysBody.ptr, CollisionFlags.CF_CHARACTER_OBJECT); + + BulletSimAPI.AddObjectToWorld2(PhysicsScene.World.ptr, PhysBody.ptr, _position, _orientation); + + // BulletSimAPI.ForceActivationState2(BSBody.ptr, ActivationState.ACTIVE_TAG); + BulletSimAPI.ForceActivationState2(PhysBody.ptr, ActivationState.DISABLE_DEACTIVATION); + BulletSimAPI.UpdateSingleAabb2(PhysicsScene.World.ptr, PhysBody.ptr); + + // Do this after the object has been added to the world + PhysBody.collisionType = CollisionType.Avatar; + PhysBody.ApplyCollisionMask(); + } + + public override void RequestPhysicsterseUpdate() + { + base.RequestPhysicsterseUpdate(); + } + // No one calls this method so I don't know what it could possibly mean + public override bool Stopped { get { return false; } } + + public override OMV.Vector3 Size { + get + { + // Avatar capsule size is kept in the scale parameter. + return _size; + } + + set { + // When an avatar's size is set, only the height is changed. + _size = value; + // Old versions of ScenePresence passed only the height. If width and/or depth are zero, + // replace with the default values. + if (_size.X == 0f) _size.X = BSParam.AvatarCapsuleDepth; + if (_size.Y == 0f) _size.Y = BSParam.AvatarCapsuleWidth; + + ComputeAvatarScale(_size); + ComputeAvatarVolumeAndMass(); + DetailLog("{0},BSCharacter.setSize,call,size={1},scale={2},density={3},volume={4},mass={5}", + LocalID, _size, Scale, _avatarDensity, _avatarVolume, RawMass); + + PhysicsScene.TaintedObject("BSCharacter.setSize", delegate() + { + if (PhysBody.HasPhysicalBody && PhysShape.HasPhysicalShape) + { + BulletSimAPI.SetLocalScaling2(PhysShape.ptr, Scale); + UpdatePhysicalMassProperties(RawMass); + // Make sure this change appears as a property update event + BulletSimAPI.PushUpdate2(PhysBody.ptr); + } + }); + + } + } + + public override PrimitiveBaseShape Shape + { + set { BaseShape = value; } + } + // I want the physics engine to make an avatar capsule + public override BSPhysicsShapeType PreferredPhysicalShape + { + get {return BSPhysicsShapeType.SHAPE_CAPSULE; } + } + + public override bool Grabbed { + set { _grabbed = value; } + } + public override bool Selected { + set { _selected = value; } + } + public override void CrossingFailure() { return; } + public override void link(PhysicsActor obj) { return; } + public override void delink() { return; } + + // Set motion values to zero. + // Do it to the properties so the values get set in the physics engine. + // Push the setting of the values to the viewer. + // Called at taint time! + public override void ZeroMotion(bool inTaintTime) + { + _velocity = OMV.Vector3.Zero; + _velocityMotor.Zero(); + _acceleration = OMV.Vector3.Zero; + _rotationalVelocity = OMV.Vector3.Zero; + + // Zero some other properties directly into the physics engine + PhysicsScene.TaintedObject(inTaintTime, "BSCharacter.ZeroMotion", delegate() + { + if (PhysBody.HasPhysicalBody) + BulletSimAPI.ClearAllForces2(PhysBody.ptr); + }); + } + public override void ZeroAngularMotion(bool inTaintTime) + { + _rotationalVelocity = OMV.Vector3.Zero; + + PhysicsScene.TaintedObject(inTaintTime, "BSCharacter.ZeroMotion", delegate() + { + if (PhysBody.HasPhysicalBody) + { + BulletSimAPI.SetInterpolationAngularVelocity2(PhysBody.ptr, OMV.Vector3.Zero); + BulletSimAPI.SetAngularVelocity2(PhysBody.ptr, OMV.Vector3.Zero); + // The next also get rid of applied linear force but the linear velocity is untouched. + BulletSimAPI.ClearForces2(PhysBody.ptr); + } + }); + } + + + public override void LockAngularMotion(OMV.Vector3 axis) { return; } + + public override OMV.Vector3 RawPosition + { + get { return _position; } + set { _position = value; } + } + public override OMV.Vector3 Position { + get { + // Don't refetch the position because this function is called a zillion times + // _position = BulletSimAPI.GetObjectPosition2(Scene.World.ptr, LocalID); + return _position; + } + set { + _position = value; + PositionSanityCheck(); + + PhysicsScene.TaintedObject("BSCharacter.setPosition", delegate() + { + DetailLog("{0},BSCharacter.SetPosition,taint,pos={1},orient={2}", LocalID, _position, _orientation); + if (PhysBody.HasPhysicalBody) + BulletSimAPI.SetTranslation2(PhysBody.ptr, _position, _orientation); + }); + } + } + public override OMV.Vector3 ForcePosition { + get { + _position = BulletSimAPI.GetPosition2(PhysBody.ptr); + return _position; + } + set { + _position = value; + PositionSanityCheck(); + BulletSimAPI.SetTranslation2(PhysBody.ptr, _position, _orientation); + } + } + + + // Check that the current position is sane and, if not, modify the position to make it so. + // Check for being below terrain or on water. + // Returns 'true' of the position was made sane by some action. + private bool PositionSanityCheck() + { + bool ret = false; + + // TODO: check for out of bounds + if (!PhysicsScene.TerrainManager.IsWithinKnownTerrain(_position)) + { + // The character is out of the known/simulated area. + // Upper levels of code will handle the transition to other areas so, for + // the time, we just ignore the position. + return ret; + } + + // If below the ground, move the avatar up + float terrainHeight = PhysicsScene.TerrainManager.GetTerrainHeightAtXYZ(_position); + if (Position.Z < terrainHeight) + { + DetailLog("{0},BSCharacter.PositionAdjustUnderGround,call,pos={1},terrain={2}", LocalID, _position, terrainHeight); + _position.Z = terrainHeight + 2.0f; + ret = true; + } + if ((CurrentCollisionFlags & CollisionFlags.BS_FLOATS_ON_WATER) != 0) + { + float waterHeight = PhysicsScene.TerrainManager.GetWaterLevelAtXYZ(_position); + if (Position.Z < waterHeight) + { + _position.Z = waterHeight; + ret = true; + } + } + + return ret; + } + + // A version of the sanity check that also makes sure a new position value is + // pushed back to the physics engine. This routine would be used by anyone + // who is not already pushing the value. + private bool PositionSanityCheck(bool inTaintTime) + { + bool ret = false; + if (PositionSanityCheck()) + { + // The new position value must be pushed into the physics engine but we can't + // just assign to "Position" because of potential call loops. + PhysicsScene.TaintedObject(inTaintTime, "BSCharacter.PositionSanityCheck", delegate() + { + DetailLog("{0},BSCharacter.PositionSanityCheck,taint,pos={1},orient={2}", LocalID, _position, _orientation); + if (PhysBody.HasPhysicalBody) + BulletSimAPI.SetTranslation2(PhysBody.ptr, _position, _orientation); + }); + ret = true; + } + return ret; + } + + public override float Mass { get { return _mass; } } + + // used when we only want this prim's mass and not the linkset thing + public override float RawMass { + get {return _mass; } + } + public override void UpdatePhysicalMassProperties(float physMass) + { + OMV.Vector3 localInertia = BulletSimAPI.CalculateLocalInertia2(PhysShape.ptr, physMass); + BulletSimAPI.SetMassProps2(PhysBody.ptr, physMass, localInertia); + } + + public override OMV.Vector3 Force { + get { return _force; } + set { + _force = value; + // m_log.DebugFormat("{0}: Force = {1}", LogHeader, _force); + PhysicsScene.TaintedObject("BSCharacter.SetForce", delegate() + { + DetailLog("{0},BSCharacter.setForce,taint,force={1}", LocalID, _force); + if (PhysBody.HasPhysicalBody) + BulletSimAPI.SetObjectForce2(PhysBody.ptr, _force); + }); + } + } + + public bool TouchingGround() + { + bool ret = BulletSimAPI.RayCastGround(PhysicsScene.World.ptr,_position,_size.Z * 0.55f, PhysBody.ptr); + return ret; + } + // Avatars don't do vehicles + public override int VehicleType { get { return (int)Vehicle.TYPE_NONE; } set { return; } } + public override void VehicleFloatParam(int param, float value) { } + public override void VehicleVectorParam(int param, OMV.Vector3 value) {} + public override void VehicleRotationParam(int param, OMV.Quaternion rotation) { } + public override void VehicleFlags(int param, bool remove) { } + + // Allows the detection of collisions with inherently non-physical prims. see llVolumeDetect for more + public override void SetVolumeDetect(int param) { return; } + + public override OMV.Vector3 GeometricCenter { get { return OMV.Vector3.Zero; } } + public override OMV.Vector3 CenterOfMass { get { return OMV.Vector3.Zero; } } + + // Sets the target in the motor. This starts the changing of the avatar's velocity. + public override OMV.Vector3 TargetVelocity + { + get + { + return _velocityMotor.TargetValue; + } + set + { + DetailLog("{0},BSCharacter.setTargetVelocity,call,vel={1}", LocalID, value); + + if (!_flying) + if ((value.Z >= 0.0001f) || (value.Z <= -0.0001f) || _velocity.Z < -0.0001f) + if (!TouchingGround()) + value.Z = _velocity.Z; + if (_setAlwaysRun) + value *= 1.3f; + + OMV.Vector3 targetVel = value; + + PhysicsScene.TaintedObject("BSCharacter.setTargetVelocity", delegate() + { + + _velocityMotor.Reset(); + _velocityMotor.SetTarget(targetVel); + _velocityMotor.SetCurrent(_velocity); + _velocityMotor.Enabled = true; + + // Make sure a property update happens next step so the motor gets incorporated. + BulletSimAPI.PushUpdate2(PhysBody.ptr); + }); + } + } + // Directly setting velocity means this is what the user really wants now. + public override OMV.Vector3 Velocity { + get { return _velocity; } + set { + _velocity = value; + // m_log.DebugFormat("{0}: set velocity = {1}", LogHeader, _velocity); + PhysicsScene.TaintedObject("BSCharacter.setVelocity", delegate() + { + _velocityMotor.Reset(); + _velocityMotor.SetCurrent(_velocity); + _velocityMotor.SetTarget(_velocity); + // Even though the motor is initialized, it's not used and the velocity goes straight into the avatar. + _velocityMotor.Enabled = false; + + DetailLog("{0},BSCharacter.setVelocity,taint,vel={1}", LocalID, _velocity); + ForceVelocity = _velocity; + }); + } + } + public override OMV.Vector3 ForceVelocity { + get { return _velocity; } + set { + PhysicsScene.AssertInTaintTime("BSCharacter.ForceVelocity"); + + _velocity = value; + // Depending on whether the avatar is moving or not, change the friction + // to keep the avatar from slipping around + if (_velocity.Length() == 0) + { + if (_currentFriction != BSParam.AvatarStandingFriction) + { + _currentFriction = BSParam.AvatarStandingFriction; + if (PhysBody.HasPhysicalBody) + BulletSimAPI.SetFriction2(PhysBody.ptr, _currentFriction); + } + } + else + { + if (_currentFriction != BSParam.AvatarFriction) + { + _currentFriction = BSParam.AvatarFriction; + if (PhysBody.HasPhysicalBody) + BulletSimAPI.SetFriction2(PhysBody.ptr, _currentFriction); + } + } + // Remember the set velocity so we can suppress the reduction by friction, ... + _appliedVelocity = value; + + BulletSimAPI.SetLinearVelocity2(PhysBody.ptr, _velocity); + BulletSimAPI.Activate2(PhysBody.ptr, true); + } + } + public override OMV.Vector3 Torque { + get { return _torque; } + set { _torque = value; + } + } + public override float CollisionScore { + get { return _collisionScore; } + set { _collisionScore = value; + } + } + public override OMV.Vector3 Acceleration { + get { return _acceleration; } + set { _acceleration = value; } + } + public override OMV.Quaternion RawOrientation + { + get { return _orientation; } + set { _orientation = value; } + } + public override OMV.Quaternion Orientation { + get { return _orientation; } + set { + _orientation = value; + // m_log.DebugFormat("{0}: set orientation to {1}", LogHeader, _orientation); + PhysicsScene.TaintedObject("BSCharacter.setOrientation", delegate() + { + if (PhysBody.HasPhysicalBody) + { + // _position = BulletSimAPI.GetPosition2(BSBody.ptr); + BulletSimAPI.SetTranslation2(PhysBody.ptr, _position, _orientation); + } + }); + } + } + // Go directly to Bullet to get/set the value. + public override OMV.Quaternion ForceOrientation + { + get + { + _orientation = BulletSimAPI.GetOrientation2(PhysBody.ptr); + return _orientation; + } + set + { + _orientation = value; + BulletSimAPI.SetTranslation2(PhysBody.ptr, _position, _orientation); + } + } + public override int PhysicsActorType { + get { return _physicsActorType; } + set { _physicsActorType = value; + } + } + public override bool IsPhysical { + get { return _isPhysical; } + set { _isPhysical = value; + } + } + public override bool IsSolid { + get { return true; } + } + public override bool IsStatic { + get { return false; } + } + public override bool Flying { + get { return _flying; } + set { + _flying = value; + + // simulate flying by changing the effect of gravity + Buoyancy = ComputeBuoyancyFromFlying(_flying); + } + } + // Flying is implimented by changing the avatar's buoyancy. + // Would this be done better with a vehicle type? + private float ComputeBuoyancyFromFlying(bool ifFlying) { + return ifFlying ? 1f : 0f; + } + public override bool + SetAlwaysRun { + get { return _setAlwaysRun; } + set { _setAlwaysRun = value; } + } + public override bool ThrottleUpdates { + get { return _throttleUpdates; } + set { _throttleUpdates = value; } + } + public override bool IsColliding { + get { return (CollidingStep == PhysicsScene.SimulationStep); } + set { _isColliding = value; } + } + public override bool CollidingGround { + get { return (CollidingGroundStep == PhysicsScene.SimulationStep); } + set { CollidingGround = value; } + } + public override bool CollidingObj { + get { return _collidingObj; } + set { _collidingObj = value; } + } + public override bool FloatOnWater { + set { + _floatOnWater = value; + PhysicsScene.TaintedObject("BSCharacter.setFloatOnWater", delegate() + { + if (PhysBody.HasPhysicalBody) + { + if (_floatOnWater) + CurrentCollisionFlags = BulletSimAPI.AddToCollisionFlags2(PhysBody.ptr, CollisionFlags.BS_FLOATS_ON_WATER); + else + CurrentCollisionFlags = BulletSimAPI.RemoveFromCollisionFlags2(PhysBody.ptr, CollisionFlags.BS_FLOATS_ON_WATER); + } + }); + } + } + public override OMV.Vector3 RotationalVelocity { + get { return _rotationalVelocity; } + set { _rotationalVelocity = value; } + } + public override OMV.Vector3 ForceRotationalVelocity { + get { return _rotationalVelocity; } + set { _rotationalVelocity = value; } + } + public override bool Kinematic { + get { return _kinematic; } + set { _kinematic = value; } + } + // neg=fall quickly, 0=1g, 1=0g, pos=float up + public override float Buoyancy { + get { return _buoyancy; } + set { _buoyancy = value; + PhysicsScene.TaintedObject("BSCharacter.setBuoyancy", delegate() + { + DetailLog("{0},BSCharacter.setBuoyancy,taint,buoy={1}", LocalID, _buoyancy); + ForceBuoyancy = _buoyancy; + }); + } + } + public override float ForceBuoyancy { + get { return _buoyancy; } + set { + PhysicsScene.AssertInTaintTime("BSCharacter.ForceBuoyancy"); + + _buoyancy = value; + DetailLog("{0},BSCharacter.setForceBuoyancy,taint,buoy={1}", LocalID, _buoyancy); + // Buoyancy is faked by changing the gravity applied to the object + float grav = PhysicsScene.Params.gravity * (1f - _buoyancy); + if (PhysBody.HasPhysicalBody) + BulletSimAPI.SetGravity2(PhysBody.ptr, new OMV.Vector3(0f, 0f, grav)); + } + } + + // Used for MoveTo + public override OMV.Vector3 PIDTarget { + set { _PIDTarget = value; } + } + public override bool PIDActive { + set { _usePID = value; } + } + public override float PIDTau { + set { _PIDTau = value; } + } + + // Used for llSetHoverHeight and maybe vehicle height + // Hover Height will override MoveTo target's Z + public override bool PIDHoverActive { + set { _useHoverPID = value; } + } + public override float PIDHoverHeight { + set { _PIDHoverHeight = value; } + } + public override PIDHoverType PIDHoverType { + set { _PIDHoverType = value; } + } + public override float PIDHoverTau { + set { _PIDHoverTao = value; } + } + + // For RotLookAt + public override OMV.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(OMV.Vector3 force, bool pushforce) { + if (force.IsFinite()) + { + _force.X += force.X; + _force.Y += force.Y; + _force.Z += force.Z; + // m_log.DebugFormat("{0}: AddForce. adding={1}, newForce={2}", LogHeader, force, _force); + PhysicsScene.TaintedObject("BSCharacter.AddForce", delegate() + { + DetailLog("{0},BSCharacter.setAddForce,taint,addedForce={1}", LocalID, _force); + if (PhysBody.HasPhysicalBody) + BulletSimAPI.SetObjectForce2(PhysBody.ptr, _force); + }); + } + else + { + m_log.ErrorFormat("{0}: Got a NaN force applied to a Character", LogHeader); + } + //m_lastUpdateSent = false; + } + + public override void AddAngularForce(OMV.Vector3 force, bool pushforce) { + } + public override void SetMomentum(OMV.Vector3 momentum) { + } + + private void ComputeAvatarScale(OMV.Vector3 size) + { + OMV.Vector3 newScale = size; + // newScale.X = PhysicsScene.Params.avatarCapsuleWidth; + // newScale.Y = PhysicsScene.Params.avatarCapsuleDepth; + + // From the total height, remove the capsule half spheres that are at each end + // The 1.15f came from ODE. Not sure what this factors in. + // newScale.Z = (size.Z * 1.15f) - (newScale.X + newScale.Y); + + // The total scale height is the central cylindar plus the caps on the two ends. + newScale.Z = size.Z + (Math.Min(size.X, size.Y) * 2f); + + // Convert diameters to radii and height to half height -- the way Bullet expects it. + Scale = newScale / 2f; + } + + // set _avatarVolume and _mass based on capsule size, _density and Scale + private void ComputeAvatarVolumeAndMass() + { + _avatarVolume = (float)( + Math.PI + * Scale.X + * Scale.Y // the area of capsule cylinder + * Scale.Z // times height of capsule cylinder + + 1.33333333f + * Math.PI + * Scale.X + * Math.Min(Scale.X, Scale.Y) + * Scale.Y // plus the volume of the capsule end caps + ); + _mass = _avatarDensity * _avatarVolume; + } + + // The physics engine says that properties have updated. Update same and inform + // the world that things have changed. + public override void UpdateProperties(EntityProperties entprop) + { + _position = entprop.Position; + _orientation = entprop.Rotation; + _velocity = entprop.Velocity; + _acceleration = entprop.Acceleration; + _rotationalVelocity = entprop.RotationalVelocity; + + // Do some sanity checking for the avatar. Make sure it's above ground and inbounds. + PositionSanityCheck(true); + + if (_velocityMotor.Enabled) + { + // TODO: Decide if the step parameters should be changed depending on the avatar's + // state (flying, colliding, ...). + + OMV.Vector3 stepVelocity = _velocityMotor.Step(PhysicsScene.LastTimeStep); + + // If falling, we keep the world's downward vector no matter what the other axis specify. + if (!Flying && !IsColliding) + { + stepVelocity.Z = entprop.Velocity.Z; + DetailLog("{0},BSCharacter.UpdateProperties,taint,overrideStepZWithWorldZ,stepVel={1}", LocalID, stepVelocity); + } + + // If the user has said stop and we've stopped applying velocity correction, + // the motor can be turned off. Set the velocity to zero so the zero motion is sent to the viewer. + if (_velocityMotor.TargetValue.ApproxEquals(OMV.Vector3.Zero, 0.01f) && _velocityMotor.ErrorIsZero) + { + stepVelocity = OMV.Vector3.Zero; + _velocityMotor.Enabled = false; + DetailLog("{0},BSCharacter.UpdateProperties,taint,disableVelocityMotor,m={1}", LocalID, _velocityMotor); + } + + _velocity = stepVelocity; + entprop.Velocity = _velocity; + BulletSimAPI.SetLinearVelocity2(PhysBody.ptr, _velocity); + } + + // remember the current and last set values + LastEntityProperties = CurrentEntityProperties; + CurrentEntityProperties = entprop; + + // Tell the linkset about value changes + Linkset.UpdateProperties(this, true); + + // Avatars don't report their changes the usual way. Changes are checked for in the heartbeat loop. + // base.RequestPhysicsterseUpdate(); + + DetailLog("{0},BSCharacter.UpdateProperties,call,pos={1},orient={2},vel={3},accel={4},rotVel={5}", + LocalID, _position, _orientation, _velocity, _acceleration, _rotationalVelocity); + } +} +} diff --git a/OpenSim/Region/Physics/BulletSNPlugin/BSConstraint.cs b/OpenSim/Region/Physics/BulletSNPlugin/BSConstraint.cs new file mode 100644 index 0000000000..426bdc2ea7 --- /dev/null +++ b/OpenSim/Region/Physics/BulletSNPlugin/BSConstraint.cs @@ -0,0 +1,135 @@ +/* + * 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 copyrightD + * 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.Text; +using OpenMetaverse; + +namespace OpenSim.Region.Physics.BulletSNPlugin +{ + +public abstract class BSConstraint : IDisposable +{ + private static string LogHeader = "[BULLETSIM CONSTRAINT]"; + + protected BulletSim m_world; + protected BulletBody m_body1; + protected BulletBody m_body2; + protected BulletConstraint m_constraint; + protected bool m_enabled = false; + + public BulletBody Body1 { get { return m_body1; } } + public BulletBody Body2 { get { return m_body2; } } + public BulletConstraint Constraint { get { return m_constraint; } } + public abstract ConstraintType Type { get; } + public bool IsEnabled { get { return m_enabled; } } + + public BSConstraint() + { + } + + public virtual void Dispose() + { + if (m_enabled) + { + m_enabled = false; + if (m_constraint.HasPhysicalConstraint) + { + bool success = BulletSimAPI.DestroyConstraint2(m_world.ptr, m_constraint.ptr); + m_world.physicsScene.DetailLog("{0},BSConstraint.Dispose,taint,id1={1},body1={2},id2={3},body2={4},success={5}", + BSScene.DetailLogZero, + m_body1.ID, m_body1.ptr.ToString(), + m_body2.ID, m_body2.ptr.ToString(), + success); + m_constraint.Clear(); + } + } + } + + public virtual bool SetLinearLimits(Vector3 low, Vector3 high) + { + bool ret = false; + if (m_enabled) + ret = BulletSimAPI.SetLinearLimits2(m_constraint.ptr, low, high); + return ret; + } + + public virtual bool SetAngularLimits(Vector3 low, Vector3 high) + { + bool ret = false; + if (m_enabled) + ret = BulletSimAPI.SetAngularLimits2(m_constraint.ptr, low, high); + return ret; + } + + public virtual bool SetSolverIterations(float cnt) + { + bool ret = false; + if (m_enabled) + { + BulletSimAPI.SetConstraintNumSolverIterations2(m_constraint.ptr, cnt); + ret = true; + } + return ret; + } + + public virtual bool CalculateTransforms() + { + bool ret = false; + if (m_enabled) + { + // Recompute the internal transforms + BulletSimAPI.CalculateTransforms2(m_constraint.ptr); + ret = true; + } + return ret; + } + + // Reset this constraint making sure it has all its internal structures + // recomputed and is enabled and ready to go. + public virtual bool RecomputeConstraintVariables(float mass) + { + bool ret = false; + if (m_enabled) + { + ret = CalculateTransforms(); + if (ret) + { + // Setting an object's mass to zero (making it static like when it's selected) + // automatically disables the constraints. + // If the link is enabled, be sure to set the constraint itself to enabled. + BulletSimAPI.SetConstraintEnable2(m_constraint.ptr, BSParam.NumericBool(true)); + } + else + { + m_world.physicsScene.Logger.ErrorFormat("{0} CalculateTransforms failed. A={1}, B={2}", LogHeader, Body1.ID, Body2.ID); + } + } + return ret; + } +} +} diff --git a/OpenSim/Region/Physics/BulletSNPlugin/BSConstraint6Dof.cs b/OpenSim/Region/Physics/BulletSNPlugin/BSConstraint6Dof.cs new file mode 100644 index 0000000000..0181d9dffb --- /dev/null +++ b/OpenSim/Region/Physics/BulletSNPlugin/BSConstraint6Dof.cs @@ -0,0 +1,153 @@ +/* + * 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 copyrightD + * 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.Text; +using OpenMetaverse; + +namespace OpenSim.Region.Physics.BulletSNPlugin +{ + +public sealed class BSConstraint6Dof : BSConstraint +{ + private static string LogHeader = "[BULLETSIM 6DOF CONSTRAINT]"; + + public override ConstraintType Type { get { return ConstraintType.D6_CONSTRAINT_TYPE; } } + + // Create a btGeneric6DofConstraint + public BSConstraint6Dof(BulletSim world, BulletBody obj1, BulletBody obj2, + Vector3 frame1, Quaternion frame1rot, + Vector3 frame2, Quaternion frame2rot, + bool useLinearReferenceFrameA, bool disableCollisionsBetweenLinkedBodies) + { + m_world = world; + m_body1 = obj1; + m_body2 = obj2; + m_constraint = new BulletConstraint( + BulletSimAPI.Create6DofConstraint2(m_world.ptr, m_body1.ptr, m_body2.ptr, + frame1, frame1rot, + frame2, frame2rot, + useLinearReferenceFrameA, disableCollisionsBetweenLinkedBodies)); + m_enabled = true; + world.physicsScene.DetailLog("{0},BS6DofConstraint,createFrame,wID={1}, rID={2}, rBody={3}, cID={4}, cBody={5}", + BSScene.DetailLogZero, world.worldID, + obj1.ID, obj1.ptr.ToString(), obj2.ID, obj2.ptr.ToString()); + } + + public BSConstraint6Dof(BulletSim world, BulletBody obj1, BulletBody obj2, + Vector3 joinPoint, + bool useLinearReferenceFrameA, bool disableCollisionsBetweenLinkedBodies) + { + m_world = world; + m_body1 = obj1; + m_body2 = obj2; + if (!obj1.HasPhysicalBody || !obj2.HasPhysicalBody) + { + world.physicsScene.DetailLog("{0},BS6DOFConstraint,badBodyPtr,wID={1}, rID={2}, rBody={3}, cID={4}, cBody={5}", + BSScene.DetailLogZero, world.worldID, + obj1.ID, obj1.ptr.ToString(), obj2.ID, obj2.ptr.ToString()); + world.physicsScene.Logger.ErrorFormat("{0} Attempt to build 6DOF constraint with missing bodies: wID={1}, rID={2}, rBody={3}, cID={4}, cBody={5}", + LogHeader, world.worldID, obj1.ID, obj1.ptr.ToString(), obj2.ID, obj2.ptr.ToString()); + m_enabled = false; + } + else + { + m_constraint = new BulletConstraint( + BulletSimAPI.Create6DofConstraintToPoint2(m_world.ptr, m_body1.ptr, m_body2.ptr, + joinPoint, + useLinearReferenceFrameA, disableCollisionsBetweenLinkedBodies)); + world.physicsScene.DetailLog("{0},BS6DofConstraint,createMidPoint,wID={1}, csrt={2}, rID={3}, rBody={4}, cID={5}, cBody={6}", + BSScene.DetailLogZero, world.worldID, m_constraint.ptr.ToString(), + obj1.ID, obj1.ptr.ToString(), obj2.ID, obj2.ptr.ToString()); + if (!m_constraint.HasPhysicalConstraint) + { + world.physicsScene.Logger.ErrorFormat("{0} Failed creation of 6Dof constraint. rootID={1}, childID={2}", + LogHeader, obj1.ID, obj2.ID); + m_enabled = false; + } + else + { + m_enabled = true; + } + } + } + + public bool SetFrames(Vector3 frameA, Quaternion frameArot, Vector3 frameB, Quaternion frameBrot) + { + bool ret = false; + if (m_enabled) + { + BulletSimAPI.SetFrames2(m_constraint.ptr, frameA, frameArot, frameB, frameBrot); + ret = true; + } + return ret; + } + + public bool SetCFMAndERP(float cfm, float erp) + { + bool ret = false; + if (m_enabled) + { + BulletSimAPI.SetConstraintParam2(m_constraint.ptr, ConstraintParams.BT_CONSTRAINT_STOP_CFM, cfm, ConstraintParamAxis.AXIS_ALL); + BulletSimAPI.SetConstraintParam2(m_constraint.ptr, ConstraintParams.BT_CONSTRAINT_STOP_ERP, erp, ConstraintParamAxis.AXIS_ALL); + BulletSimAPI.SetConstraintParam2(m_constraint.ptr, ConstraintParams.BT_CONSTRAINT_CFM, cfm, ConstraintParamAxis.AXIS_ALL); + ret = true; + } + return ret; + } + + public bool UseFrameOffset(bool useOffset) + { + bool ret = false; + float onOff = useOffset ? ConfigurationParameters.numericTrue : ConfigurationParameters.numericFalse; + if (m_enabled) + ret = BulletSimAPI.UseFrameOffset2(m_constraint.ptr, onOff); + return ret; + } + + public bool TranslationalLimitMotor(bool enable, float targetVelocity, float maxMotorForce) + { + bool ret = false; + float onOff = enable ? ConfigurationParameters.numericTrue : ConfigurationParameters.numericFalse; + if (m_enabled) + { + ret = BulletSimAPI.TranslationalLimitMotor2(m_constraint.ptr, onOff, targetVelocity, maxMotorForce); + m_world.physicsScene.DetailLog("{0},BS6DOFConstraint,TransLimitMotor,enable={1},vel={2},maxForce={3}", + BSScene.DetailLogZero, enable, targetVelocity, maxMotorForce); + } + return ret; + } + + public bool SetBreakingImpulseThreshold(float threshold) + { + bool ret = false; + if (m_enabled) + ret = BulletSimAPI.SetBreakingImpulseThreshold2(m_constraint.ptr, threshold); + return ret; + } +} +} diff --git a/OpenSim/Region/Physics/BulletSNPlugin/BSConstraintCollection.cs b/OpenSim/Region/Physics/BulletSNPlugin/BSConstraintCollection.cs new file mode 100644 index 0000000000..5c00b1a3ce --- /dev/null +++ b/OpenSim/Region/Physics/BulletSNPlugin/BSConstraintCollection.cs @@ -0,0 +1,180 @@ +/* + * 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 copyrightD + * 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.Text; +using log4net; +using OpenMetaverse; + +namespace OpenSim.Region.Physics.BulletSNPlugin +{ + +public sealed class BSConstraintCollection : IDisposable +{ + // private static readonly ILog m_log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); + // private static readonly string LogHeader = "[CONSTRAINT COLLECTION]"; + + delegate bool ConstraintAction(BSConstraint constrain); + + private List m_constraints; + private BulletSim m_world; + + public BSConstraintCollection(BulletSim world) + { + m_world = world; + m_constraints = new List(); + } + + public void Dispose() + { + this.Clear(); + } + + public void Clear() + { + lock (m_constraints) + { + foreach (BSConstraint cons in m_constraints) + { + cons.Dispose(); + } + m_constraints.Clear(); + } + } + + public bool AddConstraint(BSConstraint cons) + { + lock (m_constraints) + { + // There is only one constraint between any bodies. Remove any old just to make sure. + RemoveAndDestroyConstraint(cons.Body1, cons.Body2); + + m_constraints.Add(cons); + } + + return true; + } + + // Get the constraint between two bodies. There can be only one. + // Return 'true' if a constraint was found. + public bool TryGetConstraint(BulletBody body1, BulletBody body2, out BSConstraint returnConstraint) + { + bool found = false; + BSConstraint foundConstraint = null; + + uint lookingID1 = body1.ID; + uint lookingID2 = body2.ID; + lock (m_constraints) + { + foreach (BSConstraint constrain in m_constraints) + { + if ((constrain.Body1.ID == lookingID1 && constrain.Body2.ID == lookingID2) + || (constrain.Body1.ID == lookingID2 && constrain.Body2.ID == lookingID1)) + { + foundConstraint = constrain; + found = true; + break; + } + } + } + returnConstraint = foundConstraint; + return found; + } + + // Remove any constraint between the passed bodies. + // Presumed there is only one such constraint possible. + // Return 'true' if a constraint was found and destroyed. + public bool RemoveAndDestroyConstraint(BulletBody body1, BulletBody body2) + { + bool ret = false; + lock (m_constraints) + { + BSConstraint constrain; + if (this.TryGetConstraint(body1, body2, out constrain)) + { + // remove the constraint from our collection + RemoveAndDestroyConstraint(constrain); + ret = true; + } + } + + return ret; + } + + // The constraint MUST exist in the collection + public bool RemoveAndDestroyConstraint(BSConstraint constrain) + { + lock (m_constraints) + { + // remove the constraint from our collection + m_constraints.Remove(constrain); + } + // tell the engine that all its structures need to be freed + constrain.Dispose(); + // we destroyed something + return true; + } + + // Remove all constraints that reference the passed body. + // Return 'true' if any constraints were destroyed. + public bool RemoveAndDestroyConstraint(BulletBody body1) + { + List toRemove = new List(); + uint lookingID = body1.ID; + lock (m_constraints) + { + foreach (BSConstraint constrain in m_constraints) + { + if (constrain.Body1.ID == lookingID || constrain.Body2.ID == lookingID) + { + toRemove.Add(constrain); + } + } + foreach (BSConstraint constrain in toRemove) + { + m_constraints.Remove(constrain); + constrain.Dispose(); + } + } + return (toRemove.Count > 0); + } + + public bool RecalculateAllConstraints() + { + bool ret = false; + lock (m_constraints) + { + foreach (BSConstraint constrain in m_constraints) + { + constrain.CalculateTransforms(); + ret = true; + } + } + return ret; + } +} +} diff --git a/OpenSim/Region/Physics/BulletSNPlugin/BSConstraintHinge.cs b/OpenSim/Region/Physics/BulletSNPlugin/BSConstraintHinge.cs new file mode 100644 index 0000000000..7951f06b18 --- /dev/null +++ b/OpenSim/Region/Physics/BulletSNPlugin/BSConstraintHinge.cs @@ -0,0 +1,57 @@ +/* + * 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 copyrightD + * 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.Text; +using OpenMetaverse; + +namespace OpenSim.Region.Physics.BulletSNPlugin +{ + +public sealed class BSConstraintHinge : BSConstraint +{ + public override ConstraintType Type { get { return ConstraintType.HINGE_CONSTRAINT_TYPE; } } + + public BSConstraintHinge(BulletSim world, BulletBody obj1, BulletBody obj2, + Vector3 pivotInA, Vector3 pivotInB, + Vector3 axisInA, Vector3 axisInB, + bool useLinearReferenceFrameA, bool disableCollisionsBetweenLinkedBodies) + { + m_world = world; + m_body1 = obj1; + m_body2 = obj2; + m_constraint = new BulletConstraint( + BulletSimAPI.CreateHingeConstraint2(m_world.ptr, m_body1.ptr, m_body2.ptr, + pivotInA, pivotInB, + axisInA, axisInB, + useLinearReferenceFrameA, disableCollisionsBetweenLinkedBodies)); + m_enabled = true; + } + +} + +} diff --git a/OpenSim/Region/Physics/BulletSNPlugin/BSDynamics.cs b/OpenSim/Region/Physics/BulletSNPlugin/BSDynamics.cs new file mode 100644 index 0000000000..72afacc8f1 --- /dev/null +++ b/OpenSim/Region/Physics/BulletSNPlugin/BSDynamics.cs @@ -0,0 +1,1374 @@ +/* + * 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. + * + * The quotations from http://wiki.secondlife.com/wiki/Linden_Vehicle_Tutorial + * are Copyright (c) 2009 Linden Research, Inc and are used under their license + * of Creative Commons Attribution-Share Alike 3.0 + * (http://creativecommons.org/licenses/by-sa/3.0/). + */ + +using System; +using System.Collections.Generic; +using System.Reflection; +using System.Runtime.InteropServices; +using OpenMetaverse; +using OpenSim.Region.Physics.Manager; + +namespace OpenSim.Region.Physics.BulletSNPlugin +{ + public sealed class BSDynamics + { + private static string LogHeader = "[BULLETSIM VEHICLE]"; + + private BSScene PhysicsScene { get; set; } + // the prim this dynamic controller belongs to + private BSPrim Prim { get; set; } + + // mass of the vehicle fetched each time we're calles + private float m_vehicleMass; + + // Vehicle properties + public Vehicle Type { get; set; } + + // private Quaternion m_referenceFrame = Quaternion.Identity; // Axis modifier + private VehicleFlag m_flags = (VehicleFlag) 0; // Boolean settings: + // HOVER_TERRAIN_ONLY + // HOVER_GLOBAL_HEIGHT + // NO_DEFLECTION_UP + // HOVER_WATER_ONLY + // HOVER_UP_ONLY + // LIMIT_MOTOR_UP + // LIMIT_ROLL_ONLY + private Vector3 m_BlockingEndPoint = Vector3.Zero; + private Quaternion m_RollreferenceFrame = Quaternion.Identity; + private Quaternion m_referenceFrame = Quaternion.Identity; + + // Linear properties + private BSVMotor m_linearMotor = new BSVMotor("LinearMotor"); + private Vector3 m_linearMotorDirection = Vector3.Zero; // velocity requested by LSL, decayed by time + private Vector3 m_linearMotorOffset = Vector3.Zero; // the point of force can be offset from the center + private Vector3 m_linearMotorDirectionLASTSET = Vector3.Zero; // velocity requested by LSL + private Vector3 m_linearFrictionTimescale = Vector3.Zero; + private float m_linearMotorDecayTimescale = 0; + private float m_linearMotorTimescale = 0; + private Vector3 m_lastLinearVelocityVector = Vector3.Zero; + private Vector3 m_lastPositionVector = Vector3.Zero; + // private bool m_LinearMotorSetLastFrame = false; + // private Vector3 m_linearMotorOffset = Vector3.Zero; + + //Angular properties + private BSVMotor m_angularMotor = new BSVMotor("AngularMotor"); + private Vector3 m_angularMotorDirection = Vector3.Zero; // angular velocity requested by LSL motor + // private int m_angularMotorApply = 0; // application frame counter + private Vector3 m_angularMotorVelocity = Vector3.Zero; // current angular motor velocity + private float m_angularMotorTimescale = 0; // motor angular velocity ramp up rate + private float m_angularMotorDecayTimescale = 0; // motor angular velocity decay rate + private Vector3 m_angularFrictionTimescale = Vector3.Zero; // body angular velocity decay rate + private Vector3 m_lastAngularVelocity = Vector3.Zero; + private Vector3 m_lastVertAttractor = Vector3.Zero; // what VA was last applied to body + + //Deflection properties + private BSVMotor m_angularDeflectionMotor = new BSVMotor("AngularDeflection"); + private float m_angularDeflectionEfficiency = 0; + private float m_angularDeflectionTimescale = 0; + private float m_linearDeflectionEfficiency = 0; + private float m_linearDeflectionTimescale = 0; + + //Banking properties + private float m_bankingEfficiency = 0; + private float m_bankingMix = 0; + private float m_bankingTimescale = 0; + + //Hover and Buoyancy properties + private BSVMotor m_hoverMotor = new BSVMotor("Hover"); + private float m_VhoverHeight = 0f; + private float m_VhoverEfficiency = 0f; + private float m_VhoverTimescale = 0f; + private float m_VhoverTargetHeight = -1.0f; // if <0 then no hover, else its the current target height + private float m_VehicleBuoyancy = 0f; //KF: m_VehicleBuoyancy is set by VEHICLE_BUOYANCY for a vehicle. + // Modifies gravity. Slider between -1 (double-gravity) and 1 (full anti-gravity) + // KF: So far I have found no good method to combine a script-requested .Z velocity and gravity. + // Therefore only m_VehicleBuoyancy=1 (0g) will use the script-requested .Z velocity. + + //Attractor properties + private BSVMotor m_verticalAttractionMotor = new BSVMotor("VerticalAttraction"); + private float m_verticalAttractionEfficiency = 1.0f; // damped + private float m_verticalAttractionCutoff = 500f; // per the documentation + // Timescale > cutoff means no vert attractor. + private float m_verticalAttractionTimescale = 510f; + + // Just some recomputed constants: + static readonly float PIOverFour = ((float)Math.PI) / 4f; + static readonly float PIOverTwo = ((float)Math.PI) / 2f; + + public BSDynamics(BSScene myScene, BSPrim myPrim) + { + PhysicsScene = myScene; + Prim = myPrim; + Type = Vehicle.TYPE_NONE; + } + + // Return 'true' if this vehicle is doing vehicle things + public bool IsActive + { + get { return Type != Vehicle.TYPE_NONE && Prim.IsPhysical; } + } + + internal void ProcessFloatVehicleParam(Vehicle pParam, float pValue) + { + VDetailLog("{0},ProcessFloatVehicleParam,param={1},val={2}", Prim.LocalID, pParam, pValue); + switch (pParam) + { + case Vehicle.ANGULAR_DEFLECTION_EFFICIENCY: + m_angularDeflectionEfficiency = Math.Max(pValue, 0.01f); + break; + case Vehicle.ANGULAR_DEFLECTION_TIMESCALE: + m_angularDeflectionTimescale = Math.Max(pValue, 0.01f); + break; + case Vehicle.ANGULAR_MOTOR_DECAY_TIMESCALE: + m_angularMotorDecayTimescale = ClampInRange(0.01f, pValue, 120); + m_angularMotor.TargetValueDecayTimeScale = m_angularMotorDecayTimescale; + break; + case Vehicle.ANGULAR_MOTOR_TIMESCALE: + m_angularMotorTimescale = Math.Max(pValue, 0.01f); + m_angularMotor.TimeScale = m_angularMotorTimescale; + break; + case Vehicle.BANKING_EFFICIENCY: + m_bankingEfficiency = ClampInRange(-1f, pValue, 1f); + break; + case Vehicle.BANKING_MIX: + m_bankingMix = Math.Max(pValue, 0.01f); + break; + case Vehicle.BANKING_TIMESCALE: + m_bankingTimescale = Math.Max(pValue, 0.01f); + break; + case Vehicle.BUOYANCY: + m_VehicleBuoyancy = ClampInRange(-1f, pValue, 1f); + break; + case Vehicle.HOVER_EFFICIENCY: + m_VhoverEfficiency = ClampInRange(0f, pValue, 1f); + break; + case Vehicle.HOVER_HEIGHT: + m_VhoverHeight = pValue; + break; + case Vehicle.HOVER_TIMESCALE: + m_VhoverTimescale = Math.Max(pValue, 0.01f); + break; + case Vehicle.LINEAR_DEFLECTION_EFFICIENCY: + m_linearDeflectionEfficiency = Math.Max(pValue, 0.01f); + break; + case Vehicle.LINEAR_DEFLECTION_TIMESCALE: + m_linearDeflectionTimescale = Math.Max(pValue, 0.01f); + break; + case Vehicle.LINEAR_MOTOR_DECAY_TIMESCALE: + m_linearMotorDecayTimescale = ClampInRange(0.01f, pValue, 120); + m_linearMotor.TargetValueDecayTimeScale = m_linearMotorDecayTimescale; + break; + case Vehicle.LINEAR_MOTOR_TIMESCALE: + m_linearMotorTimescale = Math.Max(pValue, 0.01f); + m_linearMotor.TimeScale = m_linearMotorTimescale; + break; + case Vehicle.VERTICAL_ATTRACTION_EFFICIENCY: + m_verticalAttractionEfficiency = ClampInRange(0.1f, pValue, 1f); + m_verticalAttractionMotor.Efficiency = m_verticalAttractionEfficiency; + break; + case Vehicle.VERTICAL_ATTRACTION_TIMESCALE: + m_verticalAttractionTimescale = Math.Max(pValue, 0.01f); + m_verticalAttractionMotor.TimeScale = m_verticalAttractionTimescale; + break; + + // These are vector properties but the engine lets you use a single float value to + // set all of the components to the same value + case Vehicle.ANGULAR_FRICTION_TIMESCALE: + m_angularFrictionTimescale = new Vector3(pValue, pValue, pValue); + m_angularMotor.FrictionTimescale = m_angularFrictionTimescale; + break; + case Vehicle.ANGULAR_MOTOR_DIRECTION: + m_angularMotorDirection = new Vector3(pValue, pValue, pValue); + m_angularMotor.SetTarget(m_angularMotorDirection); + break; + case Vehicle.LINEAR_FRICTION_TIMESCALE: + m_linearFrictionTimescale = new Vector3(pValue, pValue, pValue); + m_linearMotor.FrictionTimescale = m_linearFrictionTimescale; + break; + case Vehicle.LINEAR_MOTOR_DIRECTION: + m_linearMotorDirection = new Vector3(pValue, pValue, pValue); + m_linearMotorDirectionLASTSET = new Vector3(pValue, pValue, pValue); + m_linearMotor.SetTarget(m_linearMotorDirection); + break; + case Vehicle.LINEAR_MOTOR_OFFSET: + m_linearMotorOffset = new Vector3(pValue, pValue, pValue); + break; + + } + }//end ProcessFloatVehicleParam + + internal void ProcessVectorVehicleParam(Vehicle pParam, Vector3 pValue) + { + VDetailLog("{0},ProcessVectorVehicleParam,param={1},val={2}", Prim.LocalID, pParam, pValue); + switch (pParam) + { + case Vehicle.ANGULAR_FRICTION_TIMESCALE: + m_angularFrictionTimescale = new Vector3(pValue.X, pValue.Y, pValue.Z); + m_angularMotor.FrictionTimescale = m_angularFrictionTimescale; + break; + case Vehicle.ANGULAR_MOTOR_DIRECTION: + // Limit requested angular speed to 2 rps= 4 pi rads/sec + pValue.X = ClampInRange(-12.56f, pValue.X, 12.56f); + pValue.Y = ClampInRange(-12.56f, pValue.Y, 12.56f); + pValue.Z = ClampInRange(-12.56f, pValue.Z, 12.56f); + m_angularMotorDirection = new Vector3(pValue.X, pValue.Y, pValue.Z); + m_angularMotor.SetTarget(m_angularMotorDirection); + break; + case Vehicle.LINEAR_FRICTION_TIMESCALE: + m_linearFrictionTimescale = new Vector3(pValue.X, pValue.Y, pValue.Z); + m_linearMotor.FrictionTimescale = m_linearFrictionTimescale; + break; + case Vehicle.LINEAR_MOTOR_DIRECTION: + m_linearMotorDirection = new Vector3(pValue.X, pValue.Y, pValue.Z); + m_linearMotorDirectionLASTSET = new Vector3(pValue.X, pValue.Y, pValue.Z); + m_linearMotor.SetTarget(m_linearMotorDirection); + break; + case Vehicle.LINEAR_MOTOR_OFFSET: + m_linearMotorOffset = new Vector3(pValue.X, pValue.Y, pValue.Z); + break; + case Vehicle.BLOCK_EXIT: + m_BlockingEndPoint = new Vector3(pValue.X, pValue.Y, pValue.Z); + break; + } + }//end ProcessVectorVehicleParam + + internal void ProcessRotationVehicleParam(Vehicle pParam, Quaternion pValue) + { + VDetailLog("{0},ProcessRotationalVehicleParam,param={1},val={2}", Prim.LocalID, pParam, pValue); + switch (pParam) + { + case Vehicle.REFERENCE_FRAME: + m_referenceFrame = pValue; + break; + case Vehicle.ROLL_FRAME: + m_RollreferenceFrame = pValue; + break; + } + }//end ProcessRotationVehicleParam + + internal void ProcessVehicleFlags(int pParam, bool remove) + { + VDetailLog("{0},ProcessVehicleFlags,param={1},remove={2}", Prim.LocalID, pParam, remove); + VehicleFlag parm = (VehicleFlag)pParam; + if (pParam == -1) + m_flags = (VehicleFlag)0; + else + { + if (remove) + m_flags &= ~parm; + else + m_flags |= parm; + } + } + + internal void ProcessTypeChange(Vehicle pType) + { + VDetailLog("{0},ProcessTypeChange,type={1}", Prim.LocalID, pType); + // Set Defaults For Type + Type = pType; + switch (pType) + { + case Vehicle.TYPE_NONE: + m_linearMotorDirection = Vector3.Zero; + m_linearMotorTimescale = 0; + m_linearMotorDecayTimescale = 0; + m_linearFrictionTimescale = new Vector3(0, 0, 0); + + m_angularMotorDirection = Vector3.Zero; + m_angularMotorDecayTimescale = 0; + m_angularMotorTimescale = 0; + m_angularFrictionTimescale = new Vector3(0, 0, 0); + + m_VhoverHeight = 0; + m_VhoverEfficiency = 0; + m_VhoverTimescale = 0; + m_VehicleBuoyancy = 0; + + m_linearDeflectionEfficiency = 1; + m_linearDeflectionTimescale = 1; + + m_angularDeflectionEfficiency = 0; + m_angularDeflectionTimescale = 1000; + + m_verticalAttractionEfficiency = 0; + m_verticalAttractionTimescale = 0; + + m_bankingEfficiency = 0; + m_bankingTimescale = 1000; + m_bankingMix = 1; + + m_referenceFrame = Quaternion.Identity; + m_flags = (VehicleFlag)0; + + break; + + case Vehicle.TYPE_SLED: + m_linearMotorDirection = Vector3.Zero; + m_linearMotorTimescale = 1000; + m_linearMotorDecayTimescale = 120; + m_linearFrictionTimescale = new Vector3(30, 1, 1000); + + m_angularMotorDirection = Vector3.Zero; + m_angularMotorTimescale = 1000; + m_angularMotorDecayTimescale = 120; + m_angularFrictionTimescale = new Vector3(1000, 1000, 1000); + + m_VhoverHeight = 0; + m_VhoverEfficiency = 10; // TODO: this looks wrong!! + m_VhoverTimescale = 10; + m_VehicleBuoyancy = 0; + + m_linearDeflectionEfficiency = 1; + m_linearDeflectionTimescale = 1; + + m_angularDeflectionEfficiency = 1; + m_angularDeflectionTimescale = 1000; + + m_verticalAttractionEfficiency = 0; + m_verticalAttractionTimescale = 0; + + m_bankingEfficiency = 0; + m_bankingTimescale = 10; + m_bankingMix = 1; + + m_referenceFrame = Quaternion.Identity; + m_flags &= ~(VehicleFlag.HOVER_WATER_ONLY + | VehicleFlag.HOVER_TERRAIN_ONLY + | VehicleFlag.HOVER_GLOBAL_HEIGHT + | VehicleFlag.HOVER_UP_ONLY); + m_flags |= (VehicleFlag.NO_DEFLECTION_UP + | VehicleFlag.LIMIT_ROLL_ONLY + | VehicleFlag.LIMIT_MOTOR_UP); + + break; + case Vehicle.TYPE_CAR: + m_linearMotorDirection = Vector3.Zero; + m_linearMotorTimescale = 1; + m_linearMotorDecayTimescale = 60; + m_linearFrictionTimescale = new Vector3(100, 2, 1000); + + m_angularMotorDirection = Vector3.Zero; + m_angularMotorTimescale = 1; + m_angularMotorDecayTimescale = 0.8f; + m_angularFrictionTimescale = new Vector3(1000, 1000, 1000); + + m_VhoverHeight = 0; + m_VhoverEfficiency = 0; + m_VhoverTimescale = 1000; + m_VehicleBuoyancy = 0; + + m_linearDeflectionEfficiency = 1; + m_linearDeflectionTimescale = 2; + + m_angularDeflectionEfficiency = 0; + m_angularDeflectionTimescale = 10; + + m_verticalAttractionEfficiency = 1f; + m_verticalAttractionTimescale = 10f; + + m_bankingEfficiency = -0.2f; + m_bankingMix = 1; + m_bankingTimescale = 1; + + m_referenceFrame = Quaternion.Identity; + m_flags &= ~(VehicleFlag.HOVER_WATER_ONLY + | VehicleFlag.HOVER_TERRAIN_ONLY + | VehicleFlag.HOVER_GLOBAL_HEIGHT); + m_flags |= (VehicleFlag.NO_DEFLECTION_UP + | VehicleFlag.LIMIT_ROLL_ONLY + | VehicleFlag.LIMIT_MOTOR_UP + | VehicleFlag.HOVER_UP_ONLY); + break; + case Vehicle.TYPE_BOAT: + m_linearMotorDirection = Vector3.Zero; + m_linearMotorTimescale = 5; + m_linearMotorDecayTimescale = 60; + m_linearFrictionTimescale = new Vector3(10, 3, 2); + + m_angularMotorDirection = Vector3.Zero; + m_angularMotorTimescale = 4; + m_angularMotorDecayTimescale = 4; + m_angularFrictionTimescale = new Vector3(10,10,10); + + m_VhoverHeight = 0; + m_VhoverEfficiency = 0.5f; + m_VhoverTimescale = 2; + m_VehicleBuoyancy = 1; + + m_linearDeflectionEfficiency = 0.5f; + m_linearDeflectionTimescale = 3; + + m_angularDeflectionEfficiency = 0.5f; + m_angularDeflectionTimescale = 5; + + m_verticalAttractionEfficiency = 0.5f; + m_verticalAttractionTimescale = 5f; + + m_bankingEfficiency = -0.3f; + m_bankingMix = 0.8f; + m_bankingTimescale = 1; + + m_referenceFrame = Quaternion.Identity; + m_flags &= ~(VehicleFlag.HOVER_TERRAIN_ONLY + | VehicleFlag.HOVER_GLOBAL_HEIGHT + | VehicleFlag.LIMIT_ROLL_ONLY + | VehicleFlag.HOVER_UP_ONLY); + m_flags |= (VehicleFlag.NO_DEFLECTION_UP + | VehicleFlag.LIMIT_MOTOR_UP + | VehicleFlag.HOVER_WATER_ONLY); + break; + case Vehicle.TYPE_AIRPLANE: + m_linearMotorDirection = Vector3.Zero; + m_linearMotorTimescale = 2; + m_linearMotorDecayTimescale = 60; + m_linearFrictionTimescale = new Vector3(200, 10, 5); + + m_angularMotorDirection = Vector3.Zero; + m_angularMotorTimescale = 4; + m_angularMotorDecayTimescale = 4; + m_angularFrictionTimescale = new Vector3(20, 20, 20); + + m_VhoverHeight = 0; + m_VhoverEfficiency = 0.5f; + m_VhoverTimescale = 1000; + m_VehicleBuoyancy = 0; + + m_linearDeflectionEfficiency = 0.5f; + m_linearDeflectionTimescale = 3; + + m_angularDeflectionEfficiency = 1; + m_angularDeflectionTimescale = 2; + + m_verticalAttractionEfficiency = 0.9f; + m_verticalAttractionTimescale = 2f; + + m_bankingEfficiency = 1; + m_bankingMix = 0.7f; + m_bankingTimescale = 2; + + m_referenceFrame = Quaternion.Identity; + m_flags &= ~(VehicleFlag.HOVER_WATER_ONLY + | VehicleFlag.HOVER_TERRAIN_ONLY + | VehicleFlag.HOVER_GLOBAL_HEIGHT + | VehicleFlag.HOVER_UP_ONLY + | VehicleFlag.NO_DEFLECTION_UP + | VehicleFlag.LIMIT_MOTOR_UP); + m_flags |= (VehicleFlag.LIMIT_ROLL_ONLY); + break; + case Vehicle.TYPE_BALLOON: + m_linearMotorDirection = Vector3.Zero; + m_linearMotorTimescale = 5; + m_linearFrictionTimescale = new Vector3(5, 5, 5); + m_linearMotorDecayTimescale = 60; + + m_angularMotorDirection = Vector3.Zero; + m_angularMotorTimescale = 6; + m_angularFrictionTimescale = new Vector3(10, 10, 10); + m_angularMotorDecayTimescale = 10; + + m_VhoverHeight = 5; + m_VhoverEfficiency = 0.8f; + m_VhoverTimescale = 10; + m_VehicleBuoyancy = 1; + + m_linearDeflectionEfficiency = 0; + m_linearDeflectionTimescale = 5; + + m_angularDeflectionEfficiency = 0; + m_angularDeflectionTimescale = 5; + + m_verticalAttractionEfficiency = 1f; + m_verticalAttractionTimescale = 100f; + + m_bankingEfficiency = 0; + m_bankingMix = 0.7f; + m_bankingTimescale = 5; + + m_referenceFrame = Quaternion.Identity; + + m_referenceFrame = Quaternion.Identity; + m_flags &= ~(VehicleFlag.HOVER_WATER_ONLY + | VehicleFlag.HOVER_TERRAIN_ONLY + | VehicleFlag.HOVER_UP_ONLY + | VehicleFlag.NO_DEFLECTION_UP + | VehicleFlag.LIMIT_MOTOR_UP); + m_flags |= (VehicleFlag.LIMIT_ROLL_ONLY + | VehicleFlag.HOVER_GLOBAL_HEIGHT); + break; + } + + // Update any physical parameters based on this type. + Refresh(); + + m_linearMotor = new BSVMotor("LinearMotor", m_linearMotorTimescale, + m_linearMotorDecayTimescale, m_linearFrictionTimescale, + 1f); + m_linearMotor.PhysicsScene = PhysicsScene; // DEBUG DEBUG DEBUG (enables detail logging) + + m_angularMotor = new BSVMotor("AngularMotor", m_angularMotorTimescale, + m_angularMotorDecayTimescale, m_angularFrictionTimescale, + 1f); + m_angularMotor.PhysicsScene = PhysicsScene; // DEBUG DEBUG DEBUG (enables detail logging) + + m_verticalAttractionMotor = new BSVMotor("VerticalAttraction", m_verticalAttractionTimescale, + BSMotor.Infinite, BSMotor.InfiniteVector, + m_verticalAttractionEfficiency); + // Z goes away and we keep X and Y + m_verticalAttractionMotor.FrictionTimescale = new Vector3(BSMotor.Infinite, BSMotor.Infinite, 0.1f); + m_verticalAttractionMotor.PhysicsScene = PhysicsScene; // DEBUG DEBUG DEBUG (enables detail logging) + } + + // Some of the properties of this prim may have changed. + // Do any updating needed for a vehicle + public void Refresh() + { + if (IsActive) + { + // Remember the mass so we don't have to fetch it every step + m_vehicleMass = Prim.Linkset.LinksetMass; + + // Friction affects are handled by this vehicle code + float friction = 0f; + BulletSimAPI.SetFriction2(Prim.PhysBody.ptr, friction); + + // Moderate angular movement introduced by Bullet. + // TODO: possibly set AngularFactor and LinearFactor for the type of vehicle. + // Maybe compute linear and angular factor and damping from params. + float angularDamping = BSParam.VehicleAngularDamping; + BulletSimAPI.SetAngularDamping2(Prim.PhysBody.ptr, angularDamping); + + // Vehicles report collision events so we know when it's on the ground + BulletSimAPI.AddToCollisionFlags2(Prim.PhysBody.ptr, CollisionFlags.BS_VEHICLE_COLLISIONS); + + Vector3 localInertia = BulletSimAPI.CalculateLocalInertia2(Prim.PhysShape.ptr, m_vehicleMass); + BulletSimAPI.SetMassProps2(Prim.PhysBody.ptr, m_vehicleMass, localInertia); + BulletSimAPI.UpdateInertiaTensor2(Prim.PhysBody.ptr); + + VDetailLog("{0},BSDynamics.Refresh,mass={1},frict={2},inert={3},aDamp={4}", + Prim.LocalID, m_vehicleMass, friction, localInertia, angularDamping); + } + else + { + BulletSimAPI.RemoveFromCollisionFlags2(Prim.PhysBody.ptr, CollisionFlags.BS_VEHICLE_COLLISIONS); + } + } + + public bool RemoveBodyDependencies(BSPhysObject prim) + { + // If active, we need to add our properties back when the body is rebuilt. + return IsActive; + } + + public void RestoreBodyDependencies(BSPhysObject prim) + { + if (Prim.LocalID != prim.LocalID) + { + // The call should be on us by our prim. Error if not. + PhysicsScene.Logger.ErrorFormat("{0} RestoreBodyDependencies: called by not my prim. passedLocalID={1}, vehiclePrimLocalID={2}", + LogHeader, prim.LocalID, Prim.LocalID); + return; + } + Refresh(); + } + + #region Known vehicle value functions + // Vehicle physical parameters that we buffer from constant getting and setting. + // The "m_known*" values are unknown until they are fetched and the m_knownHas flag is set. + // Changing is remembered and the parameter is stored back into the physics engine only if updated. + // This does two things: 1) saves continuious calls into unmanaged code, and + // 2) signals when a physics property update must happen back to the simulator + // to update values modified for the vehicle. + private int m_knownChanged; + private int m_knownHas; + private float m_knownTerrainHeight; + private float m_knownWaterLevel; + private Vector3 m_knownPosition; + private Vector3 m_knownVelocity; + private Vector3 m_knownForce; + private Quaternion m_knownOrientation; + private Vector3 m_knownRotationalVelocity; + private Vector3 m_knownRotationalForce; + private Vector3 m_knownForwardVelocity; // vehicle relative forward speed + + private const int m_knownChangedPosition = 1 << 0; + private const int m_knownChangedVelocity = 1 << 1; + private const int m_knownChangedForce = 1 << 2; + private const int m_knownChangedOrientation = 1 << 3; + private const int m_knownChangedRotationalVelocity = 1 << 4; + private const int m_knownChangedRotationalForce = 1 << 5; + private const int m_knownChangedTerrainHeight = 1 << 6; + private const int m_knownChangedWaterLevel = 1 << 7; + private const int m_knownChangedForwardVelocity = 1 << 8; + + private void ForgetKnownVehicleProperties() + { + m_knownHas = 0; + m_knownChanged = 0; + } + // Push all the changed values back into the physics engine + private void PushKnownChanged() + { + if (m_knownChanged != 0) + { + if ((m_knownChanged & m_knownChangedPosition) != 0) + Prim.ForcePosition = m_knownPosition; + + if ((m_knownChanged & m_knownChangedOrientation) != 0) + Prim.ForceOrientation = m_knownOrientation; + + if ((m_knownChanged & m_knownChangedVelocity) != 0) + { + Prim.ForceVelocity = m_knownVelocity; + BulletSimAPI.SetInterpolationLinearVelocity2(Prim.PhysBody.ptr, VehicleVelocity); + } + + if ((m_knownChanged & m_knownChangedForce) != 0) + Prim.AddForce((Vector3)m_knownForce, false, true); + + if ((m_knownChanged & m_knownChangedRotationalVelocity) != 0) + { + Prim.ForceRotationalVelocity = m_knownRotationalVelocity; + // Fake out Bullet by making it think the velocity is the same as last time. + BulletSimAPI.SetInterpolationAngularVelocity2(Prim.PhysBody.ptr, m_knownRotationalVelocity); + } + + if ((m_knownChanged & m_knownChangedRotationalForce) != 0) + Prim.AddAngularForce((Vector3)m_knownRotationalForce, false, true); + + // If we set one of the values (ie, the physics engine didn't do it) we must force + // an UpdateProperties event to send the changes up to the simulator. + BulletSimAPI.PushUpdate2(Prim.PhysBody.ptr); + } + m_knownChanged = 0; + } + + // Since the computation of terrain height can be a little involved, this routine + // is used to fetch the height only once for each vehicle simulation step. + private float GetTerrainHeight(Vector3 pos) + { + if ((m_knownHas & m_knownChangedTerrainHeight) == 0) + { + m_knownTerrainHeight = Prim.PhysicsScene.TerrainManager.GetTerrainHeightAtXYZ(pos); + m_knownHas |= m_knownChangedTerrainHeight; + } + return m_knownTerrainHeight; + } + + // Since the computation of water level can be a little involved, this routine + // is used ot fetch the level only once for each vehicle simulation step. + private float GetWaterLevel(Vector3 pos) + { + if ((m_knownHas & m_knownChangedWaterLevel) == 0) + { + m_knownWaterLevel = Prim.PhysicsScene.TerrainManager.GetWaterLevelAtXYZ(pos); + m_knownHas |= m_knownChangedWaterLevel; + } + return (float)m_knownWaterLevel; + } + + private Vector3 VehiclePosition + { + get + { + if ((m_knownHas & m_knownChangedPosition) == 0) + { + m_knownPosition = Prim.ForcePosition; + m_knownHas |= m_knownChangedPosition; + } + return m_knownPosition; + } + set + { + m_knownPosition = value; + m_knownChanged |= m_knownChangedPosition; + m_knownHas |= m_knownChangedPosition; + } + } + + private Quaternion VehicleOrientation + { + get + { + if ((m_knownHas & m_knownChangedOrientation) == 0) + { + m_knownOrientation = Prim.ForceOrientation; + m_knownHas |= m_knownChangedOrientation; + } + return m_knownOrientation; + } + set + { + m_knownOrientation = value; + m_knownChanged |= m_knownChangedOrientation; + m_knownHas |= m_knownChangedOrientation; + } + } + + private Vector3 VehicleVelocity + { + get + { + if ((m_knownHas & m_knownChangedVelocity) == 0) + { + m_knownVelocity = Prim.ForceVelocity; + m_knownHas |= m_knownChangedVelocity; + } + return (Vector3)m_knownVelocity; + } + set + { + m_knownVelocity = value; + m_knownChanged |= m_knownChangedVelocity; + m_knownHas |= m_knownChangedVelocity; + } + } + + private void VehicleAddForce(Vector3 aForce) + { + if ((m_knownHas & m_knownChangedForce) == 0) + { + m_knownForce = Vector3.Zero; + } + m_knownForce += aForce; + m_knownChanged |= m_knownChangedForce; + m_knownHas |= m_knownChangedForce; + } + + private Vector3 VehicleRotationalVelocity + { + get + { + if ((m_knownHas & m_knownChangedRotationalVelocity) == 0) + { + m_knownRotationalVelocity = Prim.ForceRotationalVelocity; + m_knownHas |= m_knownChangedRotationalVelocity; + } + return (Vector3)m_knownRotationalVelocity; + } + set + { + m_knownRotationalVelocity = value; + m_knownChanged |= m_knownChangedRotationalVelocity; + m_knownHas |= m_knownChangedRotationalVelocity; + } + } + private void VehicleAddAngularForce(Vector3 aForce) + { + if ((m_knownHas & m_knownChangedRotationalForce) == 0) + { + m_knownRotationalForce = Vector3.Zero; + } + m_knownRotationalForce += aForce; + m_knownChanged |= m_knownChangedRotationalForce; + m_knownHas |= m_knownChangedRotationalForce; + } + // Vehicle relative forward velocity + private Vector3 VehicleForwardVelocity + { + get + { + if ((m_knownHas & m_knownChangedForwardVelocity) == 0) + { + m_knownForwardVelocity = VehicleVelocity * Quaternion.Inverse(Quaternion.Normalize(VehicleOrientation)); + m_knownHas |= m_knownChangedForwardVelocity; + } + return m_knownForwardVelocity; + } + } + private float VehicleForwardSpeed + { + get + { + return VehicleForwardVelocity.X; + } + } + + #endregion // Known vehicle value functions + + // One step of the vehicle properties for the next 'pTimestep' seconds. + internal void Step(float pTimestep) + { + if (!IsActive) return; + + ForgetKnownVehicleProperties(); + + MoveLinear(pTimestep); + MoveAngular(pTimestep); + + LimitRotation(pTimestep); + + // remember the position so next step we can limit absolute movement effects + m_lastPositionVector = VehiclePosition; + + // If we forced the changing of some vehicle parameters, update the values and + // for the physics engine to note the changes so an UpdateProperties event will happen. + PushKnownChanged(); + + VDetailLog("{0},BSDynamics.Step,done,pos={1},force={2},velocity={3},angvel={4}", + Prim.LocalID, VehiclePosition, Prim.Force, VehicleVelocity, VehicleRotationalVelocity); + } + + // Apply the effect of the linear motor and other linear motions (like hover and float). + private void MoveLinear(float pTimestep) + { + Vector3 linearMotorContribution = m_linearMotor.Step(pTimestep); + + // The movement computed in the linear motor is relative to the vehicle + // coordinates. Rotate the movement to world coordinates. + linearMotorContribution *= VehicleOrientation; + + // ================================================================== + // Buoyancy: force to overcome gravity. + // m_VehicleBuoyancy: -1=2g; 0=1g; 1=0g; + // So, if zero, don't change anything (let gravity happen). If one, negate the effect of gravity. + Vector3 buoyancyContribution = Prim.PhysicsScene.DefaultGravity * m_VehicleBuoyancy; + + Vector3 terrainHeightContribution = ComputeLinearTerrainHeightCorrection(pTimestep); + + Vector3 hoverContribution = ComputeLinearHover(pTimestep); + + ComputeLinearBlockingEndPoint(pTimestep); + + Vector3 limitMotorUpContribution = ComputeLinearMotorUp(pTimestep); + + // ================================================================== + Vector3 newVelocity = linearMotorContribution + + terrainHeightContribution + + hoverContribution + + limitMotorUpContribution; + + Vector3 newForce = buoyancyContribution; + + // If not changing some axis, reduce out velocity + if ((m_flags & (VehicleFlag.NO_X)) != 0) + newVelocity.X = 0; + if ((m_flags & (VehicleFlag.NO_Y)) != 0) + newVelocity.Y = 0; + if ((m_flags & (VehicleFlag.NO_Z)) != 0) + newVelocity.Z = 0; + + // ================================================================== + // Clamp high or low velocities + float newVelocityLengthSq = newVelocity.LengthSquared(); + if (newVelocityLengthSq > 1000f) + { + newVelocity /= newVelocity.Length(); + newVelocity *= 1000f; + } + else if (newVelocityLengthSq < 0.001f) + newVelocity = Vector3.Zero; + + // ================================================================== + // Stuff new linear velocity into the vehicle. + // Since the velocity is just being set, it is not scaled by pTimeStep. Bullet will do that for us. + VehicleVelocity = newVelocity; + + // Other linear forces are applied as forces. + Vector3 totalDownForce = newForce * m_vehicleMass; + if (!totalDownForce.ApproxEquals(Vector3.Zero, 0.01f)) + { + VehicleAddForce(totalDownForce); + } + + VDetailLog("{0}, MoveLinear,done,newVel={1},totDown={2},IsColliding={3}", + Prim.LocalID, newVelocity, totalDownForce, Prim.IsColliding); + VDetailLog("{0}, MoveLinear,done,linContrib={1},terrContrib={2},hoverContrib={3},limitContrib={4},buoyContrib={5}", + Prim.LocalID, + linearMotorContribution, terrainHeightContribution, hoverContribution, + limitMotorUpContribution, buoyancyContribution + ); + + } // end MoveLinear() + + public Vector3 ComputeLinearTerrainHeightCorrection(float pTimestep) + { + Vector3 ret = Vector3.Zero; + // If below the terrain, move us above the ground a little. + // TODO: Consider taking the rotated size of the object or possibly casting a ray. + if (VehiclePosition.Z < GetTerrainHeight(VehiclePosition)) + { + // TODO: correct position by applying force rather than forcing position. + Vector3 newPosition = VehiclePosition; + newPosition.Z = GetTerrainHeight(VehiclePosition) + 1f; + VehiclePosition = newPosition; + VDetailLog("{0}, MoveLinear,terrainHeight,terrainHeight={1},pos={2}", + Prim.LocalID, GetTerrainHeight(VehiclePosition), VehiclePosition); + } + return ret; + } + + public Vector3 ComputeLinearHover(float pTimestep) + { + Vector3 ret = Vector3.Zero; + + // m_VhoverEfficiency: 0=bouncy, 1=totally damped + // m_VhoverTimescale: time to achieve height + if ((m_flags & (VehicleFlag.HOVER_WATER_ONLY | VehicleFlag.HOVER_TERRAIN_ONLY | VehicleFlag.HOVER_GLOBAL_HEIGHT)) != 0) + { + // We should hover, get the target height + if ((m_flags & VehicleFlag.HOVER_WATER_ONLY) != 0) + { + m_VhoverTargetHeight = GetWaterLevel(VehiclePosition) + m_VhoverHeight; + } + if ((m_flags & VehicleFlag.HOVER_TERRAIN_ONLY) != 0) + { + m_VhoverTargetHeight = GetTerrainHeight(VehiclePosition) + m_VhoverHeight; + } + if ((m_flags & VehicleFlag.HOVER_GLOBAL_HEIGHT) != 0) + { + m_VhoverTargetHeight = m_VhoverHeight; + } + + if ((m_flags & VehicleFlag.HOVER_UP_ONLY) != 0) + { + // If body is already heigher, use its height as target height + if (VehiclePosition.Z > m_VhoverTargetHeight) + m_VhoverTargetHeight = VehiclePosition.Z; + } + + if ((m_flags & VehicleFlag.LOCK_HOVER_HEIGHT) != 0) + { + if (Math.Abs(VehiclePosition.Z - m_VhoverTargetHeight) > 0.2f) + { + Vector3 pos = VehiclePosition; + pos.Z = m_VhoverTargetHeight; + VehiclePosition = pos; + } + } + else + { + // Error is positive if below the target and negative if above. + float verticalError = m_VhoverTargetHeight - VehiclePosition.Z; + float verticalCorrectionVelocity = verticalError / m_VhoverTimescale; + + // TODO: implement m_VhoverEfficiency correctly + if (Math.Abs(verticalError) > m_VhoverEfficiency) + { + ret = new Vector3(0f, 0f, verticalCorrectionVelocity); + } + } + + VDetailLog("{0}, MoveLinear,hover,pos={1},ret={2},hoverTS={3},height={4},target={5}", + Prim.LocalID, VehiclePosition, ret, m_VhoverTimescale, m_VhoverHeight, m_VhoverTargetHeight); + } + + return ret; + } + + public bool ComputeLinearBlockingEndPoint(float pTimestep) + { + bool changed = false; + + Vector3 pos = VehiclePosition; + Vector3 posChange = pos - m_lastPositionVector; + if (m_BlockingEndPoint != Vector3.Zero) + { + if (pos.X >= (m_BlockingEndPoint.X - (float)1)) + { + pos.X -= posChange.X + 1; + changed = true; + } + if (pos.Y >= (m_BlockingEndPoint.Y - (float)1)) + { + pos.Y -= posChange.Y + 1; + changed = true; + } + if (pos.Z >= (m_BlockingEndPoint.Z - (float)1)) + { + pos.Z -= posChange.Z + 1; + changed = true; + } + if (pos.X <= 0) + { + pos.X += posChange.X + 1; + changed = true; + } + if (pos.Y <= 0) + { + pos.Y += posChange.Y + 1; + changed = true; + } + if (changed) + { + VehiclePosition = pos; + VDetailLog("{0}, MoveLinear,blockingEndPoint,block={1},origPos={2},pos={3}", + Prim.LocalID, m_BlockingEndPoint, posChange, pos); + } + } + return changed; + } + + // From http://wiki.secondlife.com/wiki/LlSetVehicleFlags : + // Prevent ground vehicles from motoring into the sky. This flag has a subtle effect when + // used with conjunction with banking: the strength of the banking will decay when the + // vehicle no longer experiences collisions. The decay timescale is the same as + // VEHICLE_BANKING_TIMESCALE. This is to help prevent ground vehicles from steering + // when they are in mid jump. + // TODO: this code is wrong. Also, what should it do for boats (height from water)? + // This is just using the ground and a general collision check. Should really be using + // a downward raycast to find what is below. + public Vector3 ComputeLinearMotorUp(float pTimestep) + { + Vector3 ret = Vector3.Zero; + float distanceAboveGround = 0f; + + if ((m_flags & (VehicleFlag.LIMIT_MOTOR_UP)) != 0) + { + float targetHeight = Type == Vehicle.TYPE_BOAT ? GetWaterLevel(VehiclePosition) : GetTerrainHeight(VehiclePosition); + distanceAboveGround = VehiclePosition.Z - targetHeight; + // Not colliding if the vehicle is off the ground + if (!Prim.IsColliding) + { + // downForce = new Vector3(0, 0, -distanceAboveGround / m_bankingTimescale); + ret = new Vector3(0, 0, -distanceAboveGround); + } + // TODO: this calculation is wrong. From the description at + // (http://wiki.secondlife.com/wiki/Category:LSL_Vehicle), the downForce + // has a decay factor. This says this force should + // be computed with a motor. + // TODO: add interaction with banking. + } + VDetailLog("{0}, MoveLinear,limitMotorUp,distAbove={1},colliding={2},ret={3}", + Prim.LocalID, distanceAboveGround, Prim.IsColliding, ret); + return ret; + } + + // ======================================================================= + // ======================================================================= + // Apply the effect of the angular motor. + // The 'contribution' is how much angular correction velocity each function wants. + // All the contributions are added together and the resulting velocity is + // set directly on the vehicle. + private void MoveAngular(float pTimestep) + { + // The user wants this many radians per second angular change? + Vector3 angularMotorContribution = m_angularMotor.Step(pTimestep); + + // ================================================================== + // From http://wiki.secondlife.com/wiki/LlSetVehicleFlags : + // This flag prevents linear deflection parallel to world z-axis. This is useful + // for preventing ground vehicles with large linear deflection, like bumper cars, + // from climbing their linear deflection into the sky. + // That is, NO_DEFLECTION_UP says angular motion should not add any pitch or roll movement + if ((m_flags & (VehicleFlag.NO_DEFLECTION_UP)) != 0) + { + angularMotorContribution.X = 0f; + angularMotorContribution.Y = 0f; + VDetailLog("{0}, MoveAngular,noDeflectionUp,angularMotorContrib={1}", Prim.LocalID, angularMotorContribution); + } + + Vector3 verticalAttractionContribution = ComputeAngularVerticalAttraction(); + + Vector3 deflectionContribution = ComputeAngularDeflection(); + + Vector3 bankingContribution = ComputeAngularBanking(); + + // ================================================================== + m_lastVertAttractor = verticalAttractionContribution; + + m_lastAngularVelocity = angularMotorContribution + + verticalAttractionContribution + + deflectionContribution + + bankingContribution; + + // ================================================================== + // Apply the correction velocity. + // TODO: Should this be applied as an angular force (torque)? + if (!m_lastAngularVelocity.ApproxEquals(Vector3.Zero, 0.01f)) + { + VehicleRotationalVelocity = m_lastAngularVelocity; + + VDetailLog("{0}, MoveAngular,done,nonZero,angMotorContrib={1},vertAttrContrib={2},bankContrib={3},deflectContrib={4},totalContrib={5}", + Prim.LocalID, + angularMotorContribution, verticalAttractionContribution, + bankingContribution, deflectionContribution, + m_lastAngularVelocity + ); + } + else + { + // The vehicle is not adding anything angular wise. + VehicleRotationalVelocity = Vector3.Zero; + VDetailLog("{0}, MoveAngular,done,zero", Prim.LocalID); + } + + // ================================================================== + //Offset section + if (m_linearMotorOffset != Vector3.Zero) + { + //Offset of linear velocity doesn't change the linear velocity, + // but causes a torque to be applied, for example... + // + // IIIII >>> IIIII + // IIIII >>> IIIII + // IIIII >>> IIIII + // ^ + // | Applying a force at the arrow will cause the object to move forward, but also rotate + // + // + // The torque created is the linear velocity crossed with the offset + + // TODO: this computation should be in the linear section + // because that is where we know the impulse being applied. + Vector3 torqueFromOffset = Vector3.Zero; + // torqueFromOffset = Vector3.Cross(m_linearMotorOffset, appliedImpulse); + if (float.IsNaN(torqueFromOffset.X)) + torqueFromOffset.X = 0; + if (float.IsNaN(torqueFromOffset.Y)) + torqueFromOffset.Y = 0; + if (float.IsNaN(torqueFromOffset.Z)) + torqueFromOffset.Z = 0; + + VehicleAddAngularForce(torqueFromOffset * m_vehicleMass); + VDetailLog("{0}, BSDynamic.MoveAngular,motorOffset,applyTorqueImpulse={1}", Prim.LocalID, torqueFromOffset); + } + + } + // From http://wiki.secondlife.com/wiki/Linden_Vehicle_Tutorial: + // Some vehicles, like boats, should always keep their up-side up. This can be done by + // enabling the "vertical attractor" behavior that springs the vehicle's local z-axis to + // the world z-axis (a.k.a. "up"). To take advantage of this feature you would set the + // VEHICLE_VERTICAL_ATTRACTION_TIMESCALE to control the period of the spring frequency, + // and then set the VEHICLE_VERTICAL_ATTRACTION_EFFICIENCY to control the damping. An + // efficiency of 0.0 will cause the spring to wobble around its equilibrium, while an + // efficiency of 1.0 will cause the spring to reach its equilibrium with exponential decay. + public Vector3 ComputeAngularVerticalAttraction() + { + Vector3 ret = Vector3.Zero; + + // If vertical attaction timescale is reasonable + if (m_verticalAttractionTimescale < m_verticalAttractionCutoff) + { + // Take a vector pointing up and convert it from world to vehicle relative coords. + Vector3 verticalError = Vector3.UnitZ * VehicleOrientation; + + // If vertical attraction correction is needed, the vector that was pointing up (UnitZ) + // is now: + // leaning to one side: rotated around the X axis with the Y value going + // from zero (nearly straight up) to one (completely to the side)) or + // leaning front-to-back: rotated around the Y axis with the value of X being between + // zero and one. + // The value of Z is how far the rotation is off with 1 meaning none and 0 being 90 degrees. + + // Y error means needed rotation around X axis and visa versa. + // Since the error goes from zero to one, the asin is the corresponding angle. + ret.X = (float)Math.Asin(verticalError.Y); + // (Tilt forward (positive X) needs to tilt back (rotate negative) around Y axis.) + ret.Y = -(float)Math.Asin(verticalError.X); + + // If verticalError.Z is negative, the vehicle is upside down. Add additional push. + if (verticalError.Z < 0f) + { + ret.X += PIOverFour; + ret.Y += PIOverFour; + } + + // 'ret' is now the necessary velocity to correct tilt in one second. + // Correction happens over a number of seconds. + Vector3 unscaledContrib = ret; + ret /= m_verticalAttractionTimescale; + + VDetailLog("{0}, MoveAngular,verticalAttraction,,verticalError={1},unscaled={2},eff={3},ts={4},vertAttr={5}", + Prim.LocalID, verticalError, unscaledContrib, m_verticalAttractionEfficiency, m_verticalAttractionTimescale, ret); + } + return ret; + } + + // Return the angular correction to correct the direction the vehicle is pointing to be + // the direction is should want to be pointing. + // The vehicle is moving in some direction and correct its orientation to it is pointing + // in that direction. + // TODO: implement reference frame. + public Vector3 ComputeAngularDeflection() + { + Vector3 ret = Vector3.Zero; + return ret; // DEBUG DEBUG DEBUG + // Disable angular deflection for the moment. + // Since angularMotorUp and angularDeflection are computed independently, they will calculate + // approximately the same X or Y correction. When added together (when contributions are combined) + // this creates an over-correction and then wabbling as the target is overshot. + // TODO: rethink how the different correction computations inter-relate. + + if (m_angularDeflectionEfficiency != 0) + { + // The direction the vehicle is moving + Vector3 movingDirection = VehicleVelocity; + movingDirection.Normalize(); + + // The direction the vehicle is pointing + Vector3 pointingDirection = Vector3.UnitX * VehicleOrientation; + pointingDirection.Normalize(); + + // The difference between what is and what should be. + Vector3 deflectionError = movingDirection - pointingDirection; + + // Don't try to correct very large errors (not our job) + if (Math.Abs(deflectionError.X) > PIOverFour) deflectionError.X = 0f; + if (Math.Abs(deflectionError.Y) > PIOverFour) deflectionError.Y = 0f; + if (Math.Abs(deflectionError.Z) > PIOverFour) deflectionError.Z = 0f; + + // ret = m_angularDeflectionCorrectionMotor(1f, deflectionError); + + // Scale the correction by recovery timescale and efficiency + ret = (-deflectionError) * m_angularDeflectionEfficiency; + ret /= m_angularDeflectionTimescale; + + VDetailLog("{0}, MoveAngular,Deflection,movingDir={1},pointingDir={2},deflectError={3},ret={4}", + Prim.LocalID, movingDirection, pointingDirection, deflectionError, ret); + VDetailLog("{0}, MoveAngular,Deflection,fwdSpd={1},defEff={2},defTS={3}", + Prim.LocalID, VehicleForwardSpeed, m_angularDeflectionEfficiency, m_angularDeflectionTimescale); + } + return ret; + } + + // Return an angular change to rotate the vehicle around the Z axis when the vehicle + // is tipped around the X axis. + // From http://wiki.secondlife.com/wiki/Linden_Vehicle_Tutorial: + // The vertical attractor feature must be enabled in order for the banking behavior to + // function. The way banking works is this: a rotation around the vehicle's roll-axis will + // produce a angular velocity around the yaw-axis, causing the vehicle to turn. The magnitude + // of the yaw effect will be proportional to the + // VEHICLE_BANKING_EFFICIENCY, the angle of the roll rotation, and sometimes the vehicle's + // velocity along its preferred axis of motion. + // The VEHICLE_BANKING_EFFICIENCY can vary between -1 and +1. When it is positive then any + // positive rotation (by the right-hand rule) about the roll-axis will effect a + // (negative) torque around the yaw-axis, making it turn to the right--that is the + // vehicle will lean into the turn, which is how real airplanes and motorcycle's work. + // Negating the banking coefficient will make it so that the vehicle leans to the + // outside of the turn (not very "physical" but might allow interesting vehicles so why not?). + // The VEHICLE_BANKING_MIX is a fake (i.e. non-physical) parameter that is useful for making + // banking vehicles do what you want rather than what the laws of physics allow. + // For example, consider a real motorcycle...it must be moving forward in order for + // it to turn while banking, however video-game motorcycles are often configured + // to turn in place when at a dead stop--because they are often easier to control + // that way using the limited interface of the keyboard or game controller. The + // VEHICLE_BANKING_MIX enables combinations of both realistic and non-realistic + // banking by functioning as a slider between a banking that is correspondingly + // totally static (0.0) and totally dynamic (1.0). By "static" we mean that the + // banking effect depends only on the vehicle's rotation about its roll-axis compared + // to "dynamic" where the banking is also proportional to its velocity along its + // roll-axis. Finding the best value of the "mixture" will probably require trial and error. + // The time it takes for the banking behavior to defeat a preexisting angular velocity about the + // world z-axis is determined by the VEHICLE_BANKING_TIMESCALE. So if you want the vehicle to + // bank quickly then give it a banking timescale of about a second or less, otherwise you can + // make a sluggish vehicle by giving it a timescale of several seconds. + public Vector3 ComputeAngularBanking() + { + Vector3 ret = Vector3.Zero; + + if (m_bankingEfficiency != 0 && m_verticalAttractionTimescale < m_verticalAttractionCutoff) + { + // This works by rotating a unit vector to the orientation of the vehicle. The + // roll (tilt) will be Y component of a tilting Z vector (zero for no tilt + // up to one for full over). + Vector3 rollComponents = Vector3.UnitZ * VehicleOrientation; + + // Figure out the yaw value for this much roll. + float turnComponent = rollComponents.Y * rollComponents.Y * m_bankingEfficiency; + // Keep the sign + if (rollComponents.Y < 0f) + turnComponent = -turnComponent; + + // TODO: there must be a better computation of the banking force. + float bankingTurnForce = turnComponent; + + // actual error = static turn error + dynamic turn error + float mixedBankingError = bankingTurnForce * (1f - m_bankingMix) + bankingTurnForce * m_bankingMix * VehicleForwardSpeed; + // TODO: the banking effect should not go to infinity but what to limit it to? + mixedBankingError = ClampInRange(-20f, mixedBankingError, 20f); + + // Build the force vector to change rotation from what it is to what it should be + ret.Z = -mixedBankingError; + + // Don't do it all at once. + ret /= m_bankingTimescale; + + VDetailLog("{0}, MoveAngular,Banking,rollComp={1},speed={2},turnComp={3},bankErr={4},mixedBankErr={5},ret={6}", + Prim.LocalID, rollComponents, VehicleForwardSpeed, turnComponent, bankingTurnForce, mixedBankingError, ret); + } + return ret; + } + + // This is from previous instantiations of XXXDynamics.cs. + // Applies roll reference frame. + // TODO: is this the right way to separate the code to do this operation? + // Should this be in MoveAngular()? + internal void LimitRotation(float timestep) + { + Quaternion rotq = VehicleOrientation; + Quaternion m_rot = rotq; + if (m_RollreferenceFrame != Quaternion.Identity) + { + if (rotq.X >= m_RollreferenceFrame.X) + { + m_rot.X = rotq.X - (m_RollreferenceFrame.X / 2); + } + if (rotq.Y >= m_RollreferenceFrame.Y) + { + m_rot.Y = rotq.Y - (m_RollreferenceFrame.Y / 2); + } + if (rotq.X <= -m_RollreferenceFrame.X) + { + m_rot.X = rotq.X + (m_RollreferenceFrame.X / 2); + } + if (rotq.Y <= -m_RollreferenceFrame.Y) + { + m_rot.Y = rotq.Y + (m_RollreferenceFrame.Y / 2); + } + } + if ((m_flags & VehicleFlag.LOCK_ROTATION) != 0) + { + m_rot.X = 0; + m_rot.Y = 0; + } + if (rotq != m_rot) + { + VehicleOrientation = m_rot; + VDetailLog("{0}, LimitRotation,done,orig={1},new={2}", Prim.LocalID, rotq, m_rot); + } + + } + + private float ClampInRange(float low, float val, float high) + { + return Math.Max(low, Math.Min(val, high)); + // return Utils.Clamp(val, low, high); + } + + // Invoke the detailed logger and output something if it's enabled. + private void VDetailLog(string msg, params Object[] args) + { + if (Prim.PhysicsScene.VehicleLoggingEnabled) + Prim.PhysicsScene.DetailLog(msg, args); + } + } +} diff --git a/OpenSim/Region/Physics/BulletSNPlugin/BSLinkset.cs b/OpenSim/Region/Physics/BulletSNPlugin/BSLinkset.cs new file mode 100644 index 0000000000..253128b4ba --- /dev/null +++ b/OpenSim/Region/Physics/BulletSNPlugin/BSLinkset.cs @@ -0,0 +1,333 @@ +/* + * 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 copyrightD + * 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.Text; + +using OMV = OpenMetaverse; + +namespace OpenSim.Region.Physics.BulletSNPlugin +{ + +// A BSPrim can get individual information about its linkedness attached +// to it through an instance of a subclass of LinksetInfo. +// Each type of linkset will define the information needed for its type. +public abstract class BSLinksetInfo +{ + public virtual void Clear() { } +} + +public abstract class BSLinkset +{ + // private static string LogHeader = "[BULLETSIM LINKSET]"; + + public enum LinksetImplementation + { + Constraint = 0, // linkset tied together with constraints + Compound = 1, // linkset tied together as a compound object + Manual = 2 // linkset tied together manually (code moves all the pieces) + } + // Create the correct type of linkset for this child + public static BSLinkset Factory(BSScene physScene, BSPhysObject parent) + { + BSLinkset ret = null; + + switch ((int)BSParam.LinksetImplementation) + { + case (int)LinksetImplementation.Constraint: + ret = new BSLinksetConstraints(physScene, parent); + break; + case (int)LinksetImplementation.Compound: + ret = new BSLinksetCompound(physScene, parent); + break; + case (int)LinksetImplementation.Manual: + // ret = new BSLinksetManual(physScene, parent); + break; + default: + ret = new BSLinksetCompound(physScene, parent); + break; + } + return ret; + } + + public BSPhysObject LinksetRoot { get; protected set; } + + public BSScene PhysicsScene { get; private set; } + + static int m_nextLinksetID = 1; + public int LinksetID { get; private set; } + + // The children under the root in this linkset. + protected HashSet m_children; + + // We lock the diddling of linkset classes to prevent any badness. + // This locks the modification of the instances of this class. Changes + // to the physical representation is done via the tainting mechenism. + protected object m_linksetActivityLock = new Object(); + + // Some linksets have a preferred physical shape. + // Returns SHAPE_UNKNOWN if there is no preference. Causes the correct shape to be selected. + public virtual BSPhysicsShapeType PreferredPhysicalShape(BSPhysObject requestor) + { + return BSPhysicsShapeType.SHAPE_UNKNOWN; + } + + // We keep the prim's mass in the linkset structure since it could be dependent on other prims + protected float m_mass; + public float LinksetMass + { + get + { + return m_mass; + } + } + + public virtual bool LinksetIsColliding { get { return false; } } + + public OMV.Vector3 CenterOfMass + { + get { return ComputeLinksetCenterOfMass(); } + } + + public OMV.Vector3 GeometricCenter + { + get { return ComputeLinksetGeometricCenter(); } + } + + protected BSLinkset(BSScene scene, BSPhysObject parent) + { + // A simple linkset of one (no children) + LinksetID = m_nextLinksetID++; + // We create LOTS of linksets. + if (m_nextLinksetID <= 0) + m_nextLinksetID = 1; + PhysicsScene = scene; + LinksetRoot = parent; + m_children = new HashSet(); + m_mass = parent.RawMass; + Rebuilding = false; + } + + // Link to a linkset where the child knows the parent. + // Parent changing should not happen so do some sanity checking. + // We return the parent's linkset so the child can track its membership. + // Called at runtime. + public BSLinkset AddMeToLinkset(BSPhysObject child) + { + lock (m_linksetActivityLock) + { + // Don't add the root to its own linkset + if (!IsRoot(child)) + AddChildToLinkset(child); + m_mass = ComputeLinksetMass(); + } + return this; + } + + // Remove a child from a linkset. + // Returns a new linkset for the child which is a linkset of one (just the + // orphened child). + // Called at runtime. + public BSLinkset RemoveMeFromLinkset(BSPhysObject child) + { + lock (m_linksetActivityLock) + { + if (IsRoot(child)) + { + // Cannot remove the root from a linkset. + return this; + } + RemoveChildFromLinkset(child); + m_mass = ComputeLinksetMass(); + } + + // The child is down to a linkset of just itself + return BSLinkset.Factory(PhysicsScene, child); + } + + // Return 'true' if the passed object is the root object of this linkset + public bool IsRoot(BSPhysObject requestor) + { + return (requestor.LocalID == LinksetRoot.LocalID); + } + + public int NumberOfChildren { get { return m_children.Count; } } + + // Return 'true' if this linkset has any children (more than the root member) + public bool HasAnyChildren { get { return (m_children.Count > 0); } } + + // Return 'true' if this child is in this linkset + public bool HasChild(BSPhysObject child) + { + bool ret = false; + lock (m_linksetActivityLock) + { + ret = m_children.Contains(child); + /* Safer version but the above should work + foreach (BSPhysObject bp in m_children) + { + if (child.LocalID == bp.LocalID) + { + ret = true; + break; + } + } + */ + } + return ret; + } + + // Perform an action on each member of the linkset including root prim. + // Depends on the action on whether this should be done at taint time. + public delegate bool ForEachMemberAction(BSPhysObject obj); + public virtual bool ForEachMember(ForEachMemberAction action) + { + bool ret = false; + lock (m_linksetActivityLock) + { + action(LinksetRoot); + foreach (BSPhysObject po in m_children) + { + if (action(po)) + break; + } + } + return ret; + } + + // I am the root of a linkset and a new child is being added + // Called while LinkActivity is locked. + protected abstract void AddChildToLinkset(BSPhysObject child); + + // I am the root of a linkset and one of my children is being removed. + // Safe to call even if the child is not really in my linkset. + protected abstract void RemoveChildFromLinkset(BSPhysObject child); + + // When physical properties are changed the linkset needs to recalculate + // its internal properties. + // May be called at runtime or taint-time. + public abstract void Refresh(BSPhysObject requestor); + + // Flag denoting the linkset is in the process of being rebuilt. + // Used to know not the schedule a rebuild in the middle of a rebuild. + protected bool Rebuilding { get; set; } + + // The object is going dynamic (physical). Do any setup necessary + // for a dynamic linkset. + // Only the state of the passed object can be modified. The rest of the linkset + // has not yet been fully constructed. + // Return 'true' if any properties updated on the passed object. + // Called at taint-time! + public abstract bool MakeDynamic(BSPhysObject child); + + // The object is going static (non-physical). Do any setup necessary + // for a static linkset. + // Return 'true' if any properties updated on the passed object. + // Called at taint-time! + public abstract bool MakeStatic(BSPhysObject child); + + // Called when a parameter update comes from the physics engine for any object + // of the linkset is received. + // Passed flag is update came from physics engine (true) or the user (false). + // Called at taint-time!! + public abstract void UpdateProperties(BSPhysObject physObject, bool physicalUpdate); + + // Routine used when rebuilding the body of the root of the linkset + // Destroy all the constraints have have been made to root. + // This is called when the root body is changing. + // Returns 'true' of something was actually removed and would need restoring + // Called at taint-time!! + public abstract bool RemoveBodyDependencies(BSPrim child); + + // Companion to RemoveBodyDependencies(). If RemoveBodyDependencies() returns 'true', + // this routine will restore the removed constraints. + // Called at taint-time!! + public abstract void RestoreBodyDependencies(BSPrim child); + + // ================================================================ + protected virtual float ComputeLinksetMass() + { + float mass = LinksetRoot.RawMass; + if (HasAnyChildren) + { + lock (m_linksetActivityLock) + { + foreach (BSPhysObject bp in m_children) + { + mass += bp.RawMass; + } + } + } + return mass; + } + + protected virtual OMV.Vector3 ComputeLinksetCenterOfMass() + { + OMV.Vector3 com; + lock (m_linksetActivityLock) + { + com = LinksetRoot.Position * LinksetRoot.RawMass; + float totalMass = LinksetRoot.RawMass; + + foreach (BSPhysObject bp in m_children) + { + com += bp.Position * bp.RawMass; + totalMass += bp.RawMass; + } + if (totalMass != 0f) + com /= totalMass; + } + + return com; + } + + protected virtual OMV.Vector3 ComputeLinksetGeometricCenter() + { + OMV.Vector3 com; + lock (m_linksetActivityLock) + { + com = LinksetRoot.Position; + + foreach (BSPhysObject bp in m_children) + { + com += bp.Position * bp.RawMass; + } + com /= (m_children.Count + 1); + } + + return com; + } + + // Invoke the detailed logger and output something if it's enabled. + protected void DetailLog(string msg, params Object[] args) + { + if (PhysicsScene.PhysicsLogging.Enabled) + PhysicsScene.DetailLog(msg, args); + } + +} +} diff --git a/OpenSim/Region/Physics/BulletSNPlugin/BSLinksetCompound.cs b/OpenSim/Region/Physics/BulletSNPlugin/BSLinksetCompound.cs new file mode 100644 index 0000000000..23a0b8bbf6 --- /dev/null +++ b/OpenSim/Region/Physics/BulletSNPlugin/BSLinksetCompound.cs @@ -0,0 +1,396 @@ +/* + * 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 copyrightD + * 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.Text; + +using OpenSim.Framework; + +using OMV = OpenMetaverse; + +namespace OpenSim.Region.Physics.BulletSNPlugin +{ + +// When a child is linked, the relationship position of the child to the parent +// is remembered so the child's world position can be recomputed when it is +// removed from the linkset. +sealed class BSLinksetCompoundInfo : BSLinksetInfo +{ + public OMV.Vector3 OffsetPos; + public OMV.Quaternion OffsetRot; + public BSLinksetCompoundInfo(OMV.Vector3 p, OMV.Quaternion r) + { + OffsetPos = p; + OffsetRot = r; + } + public override void Clear() + { + OffsetPos = OMV.Vector3.Zero; + OffsetRot = OMV.Quaternion.Identity; + } + public override string ToString() + { + StringBuilder buff = new StringBuilder(); + buff.Append(""); + return buff.ToString(); + } +}; + +public sealed class BSLinksetCompound : BSLinkset +{ + private static string LogHeader = "[BULLETSIM LINKSET COMPOUND]"; + + public BSLinksetCompound(BSScene scene, BSPhysObject parent) : base(scene, parent) + { + } + + // For compound implimented linksets, if there are children, use compound shape for the root. + public override BSPhysicsShapeType PreferredPhysicalShape(BSPhysObject requestor) + { + // Returning 'unknown' means we don't have a preference. + BSPhysicsShapeType ret = BSPhysicsShapeType.SHAPE_UNKNOWN; + if (IsRoot(requestor) && HasAnyChildren) + { + ret = BSPhysicsShapeType.SHAPE_COMPOUND; + } + // DetailLog("{0},BSLinksetCompound.PreferredPhysicalShape,call,shape={1}", LinksetRoot.LocalID, ret); + return ret; + } + + // When physical properties are changed the linkset needs to recalculate + // its internal properties. + public override void Refresh(BSPhysObject requestor) + { + // Something changed so do the rebuilding thing + // ScheduleRebuild(); + } + + // Schedule a refresh to happen after all the other taint processing. + private void ScheduleRebuild(BSPhysObject requestor) + { + DetailLog("{0},BSLinksetCompound.Refresh,schedulingRefresh,rebuilding={1}", + requestor.LocalID, Rebuilding); + // When rebuilding, it is possible to set properties that would normally require a rebuild. + // If already rebuilding, don't request another rebuild. + if (!Rebuilding) + { + PhysicsScene.PostTaintObject("BSLinksetCompound.Refresh", LinksetRoot.LocalID, delegate() + { + if (HasAnyChildren) + RecomputeLinksetCompound(); + }); + } + } + + // The object is going dynamic (physical). Do any setup necessary + // for a dynamic linkset. + // Only the state of the passed object can be modified. The rest of the linkset + // has not yet been fully constructed. + // Return 'true' if any properties updated on the passed object. + // Called at taint-time! + public override bool MakeDynamic(BSPhysObject child) + { + bool ret = false; + DetailLog("{0},BSLinksetCompound.MakeDynamic,call,IsRoot={1}", child.LocalID, IsRoot(child)); + if (IsRoot(child)) + { + // The root is going dynamic. Make sure mass is properly set. + m_mass = ComputeLinksetMass(); + ScheduleRebuild(LinksetRoot); + } + else + { + // The origional prims are removed from the world as the shape of the root compound + // shape takes over. + BulletSimAPI.AddToCollisionFlags2(child.PhysBody.ptr, CollisionFlags.CF_NO_CONTACT_RESPONSE); + BulletSimAPI.ForceActivationState2(child.PhysBody.ptr, ActivationState.DISABLE_SIMULATION); + // We don't want collisions from the old linkset children. + BulletSimAPI.RemoveFromCollisionFlags2(child.PhysBody.ptr, CollisionFlags.BS_SUBSCRIBE_COLLISION_EVENTS); + + child.PhysBody.collisionType = CollisionType.LinksetChild; + + ret = true; + } + return ret; + } + + // The object is going static (non-physical). Do any setup necessary for a static linkset. + // Return 'true' if any properties updated on the passed object. + // This doesn't normally happen -- OpenSim removes the objects from the physical + // world if it is a static linkset. + // Called at taint-time! + public override bool MakeStatic(BSPhysObject child) + { + bool ret = false; + DetailLog("{0},BSLinksetCompound.MakeStatic,call,IsRoot={1}", child.LocalID, IsRoot(child)); + if (IsRoot(child)) + { + ScheduleRebuild(LinksetRoot); + } + else + { + // The non-physical children can come back to life. + BulletSimAPI.RemoveFromCollisionFlags2(child.PhysBody.ptr, CollisionFlags.CF_NO_CONTACT_RESPONSE); + + child.PhysBody.collisionType = CollisionType.LinksetChild; + + // Don't force activation so setting of DISABLE_SIMULATION can stay if used. + BulletSimAPI.Activate2(child.PhysBody.ptr, false); + ret = true; + } + return ret; + } + + public override void UpdateProperties(BSPhysObject updated, bool physicalUpdate) + { + // The user moving a child around requires the rebuilding of the linkset compound shape + // One problem is this happens when a border is crossed -- the simulator implementation + // is to store the position into the group which causes the move of the object + // but it also means all the child positions get updated. + // What would cause an unnecessary rebuild so we make sure the linkset is in a + // region before bothering to do a rebuild. + if (!IsRoot(updated) + && !physicalUpdate + && PhysicsScene.TerrainManager.IsWithinKnownTerrain(LinksetRoot.RawPosition)) + { + updated.LinksetInfo = null; + ScheduleRebuild(updated); + } + } + + // Routine called when rebuilding the body of some member of the linkset. + // Since we don't keep in world relationships, do nothing unless it's a child changing. + // Returns 'true' of something was actually removed and would need restoring + // Called at taint-time!! + public override bool RemoveBodyDependencies(BSPrim child) + { + bool ret = false; + + DetailLog("{0},BSLinksetCompound.RemoveBodyDependencies,refreshIfChild,rID={1},rBody={2},isRoot={3}", + child.LocalID, LinksetRoot.LocalID, LinksetRoot.PhysBody.ptr.ToString(), IsRoot(child)); + + if (!IsRoot(child)) + { + // Because it is a convenient time, recompute child world position and rotation based on + // its position in the linkset. + RecomputeChildWorldPosition(child, true); + } + + // Cannot schedule a refresh/rebuild here because this routine is called when + // the linkset is being rebuilt. + // InternalRefresh(LinksetRoot); + + return ret; + } + + // Companion to RemoveBodyDependencies(). If RemoveBodyDependencies() returns 'true', + // this routine will restore the removed constraints. + // Called at taint-time!! + public override void RestoreBodyDependencies(BSPrim child) + { + } + + // When the linkset is built, the child shape is added to the compound shape relative to the + // root shape. The linkset then moves around but this does not move the actual child + // prim. The child prim's location must be recomputed based on the location of the root shape. + private void RecomputeChildWorldPosition(BSPhysObject child, bool inTaintTime) + { + BSLinksetCompoundInfo lci = child.LinksetInfo as BSLinksetCompoundInfo; + if (lci != null) + { + if (inTaintTime) + { + OMV.Vector3 oldPos = child.RawPosition; + child.ForcePosition = LinksetRoot.RawPosition + lci.OffsetPos; + child.ForceOrientation = LinksetRoot.RawOrientation * lci.OffsetRot; + DetailLog("{0},BSLinksetCompound.RecomputeChildWorldPosition,oldPos={1},lci={2},newPos={3}", + child.LocalID, oldPos, lci, child.RawPosition); + } + else + { + // TaintedObject is not used here so the raw position is set now and not at taint-time. + child.Position = LinksetRoot.RawPosition + lci.OffsetPos; + child.Orientation = LinksetRoot.RawOrientation * lci.OffsetRot; + } + } + else + { + // This happens when children have been added to the linkset but the linkset + // has not been constructed yet. So like, at taint time, adding children to a linkset + // and then changing properties of the children (makePhysical, for instance) + // but the post-print action of actually rebuilding the linkset has not yet happened. + // PhysicsScene.Logger.WarnFormat("{0} Restoring linkset child position failed because of no relative position computed. ID={1}", + // LogHeader, child.LocalID); + DetailLog("{0},BSLinksetCompound.recomputeChildWorldPosition,noRelativePositonInfo", child.LocalID); + } + } + + // ================================================================ + + // Add a new child to the linkset. + // Called while LinkActivity is locked. + protected override void AddChildToLinkset(BSPhysObject child) + { + if (!HasChild(child)) + { + m_children.Add(child); + + DetailLog("{0},BSLinksetCompound.AddChildToLinkset,call,child={1}", LinksetRoot.LocalID, child.LocalID); + + // Rebuild the compound shape with the new child shape included + ScheduleRebuild(child); + } + return; + } + + // Remove the specified child from the linkset. + // Safe to call even if the child is not really in the linkset. + protected override void RemoveChildFromLinkset(BSPhysObject child) + { + if (m_children.Remove(child)) + { + DetailLog("{0},BSLinksetCompound.RemoveChildFromLinkset,call,rID={1},rBody={2},cID={3},cBody={4}", + child.LocalID, + LinksetRoot.LocalID, LinksetRoot.PhysBody.ptr.ToString(), + child.LocalID, child.PhysBody.ptr.ToString()); + + // Cause the child's body to be rebuilt and thus restored to normal operation + RecomputeChildWorldPosition(child, false); + child.ForceBodyShapeRebuild(false); + + if (!HasAnyChildren) + { + // The linkset is now empty. The root needs rebuilding. + LinksetRoot.ForceBodyShapeRebuild(false); + } + else + { + // Rebuild the compound shape with the child removed + ScheduleRebuild(child); + } + } + return; + } + + // Called before the simulation step to make sure the compound based linkset + // is all initialized. + // Constraint linksets are rebuilt every time. + // Note that this works for rebuilding just the root after a linkset is taken apart. + // Called at taint time!! + private void RecomputeLinksetCompound() + { + try + { + // Suppress rebuilding while rebuilding + Rebuilding = true; + + // Cause the root shape to be rebuilt as a compound object with just the root in it + LinksetRoot.ForceBodyShapeRebuild(true); + + DetailLog("{0},BSLinksetCompound.RecomputeLinksetCompound,start,rBody={1},rShape={2},numChildren={3}", + LinksetRoot.LocalID, LinksetRoot.PhysBody, LinksetRoot.PhysShape, NumberOfChildren); + + // Add a shape for each of the other children in the linkset + ForEachMember(delegate(BSPhysObject cPrim) + { + if (!IsRoot(cPrim)) + { + // Compute the displacement of the child from the root of the linkset. + // This info is saved in the child prim so the relationship does not + // change over time and the new child position can be computed + // when the linkset is being disassembled (the linkset may have moved). + BSLinksetCompoundInfo lci = cPrim.LinksetInfo as BSLinksetCompoundInfo; + if (lci == null) + { + // Each child position and rotation is given relative to the root. + OMV.Quaternion invRootOrientation = OMV.Quaternion.Inverse(LinksetRoot.RawOrientation); + OMV.Vector3 displacementPos = (cPrim.RawPosition - LinksetRoot.RawPosition) * invRootOrientation; + OMV.Quaternion displacementRot = cPrim.RawOrientation * invRootOrientation; + + // Save relative position for recomputing child's world position after moving linkset. + lci = new BSLinksetCompoundInfo(displacementPos, displacementRot); + cPrim.LinksetInfo = lci; + DetailLog("{0},BSLinksetCompound.RecomputeLinksetCompound,creatingRelPos,lci={1}", cPrim.LocalID, lci); + } + + DetailLog("{0},BSLinksetCompound.RecomputeLinksetCompound,addMemberToShape,mID={1},mShape={2},dispPos={3},dispRot={4}", + LinksetRoot.LocalID, cPrim.LocalID, cPrim.PhysShape, lci.OffsetPos, lci.OffsetRot); + + if (cPrim.PhysShape.isNativeShape) + { + // A native shape is turning into a hull collision shape because native + // shapes are not shared so we have to hullify it so it will be tracked + // and freed at the correct time. This also solves the scaling problem + // (native shapes scaled but hull/meshes are assumed to not be). + // TODO: decide of the native shape can just be used in the compound shape. + // Use call to CreateGeomNonSpecial(). + BulletShape saveShape = cPrim.PhysShape; + cPrim.PhysShape.Clear(); // Don't let the create free the child's shape + // PhysicsScene.Shapes.CreateGeomNonSpecial(true, cPrim, null); + PhysicsScene.Shapes.CreateGeomMeshOrHull(cPrim, null); + BulletShape newShape = cPrim.PhysShape; + cPrim.PhysShape = saveShape; + BulletSimAPI.AddChildShapeToCompoundShape2(LinksetRoot.PhysShape.ptr, newShape.ptr, lci.OffsetPos, lci.OffsetRot); + } + else + { + // For the shared shapes (meshes and hulls), just use the shape in the child. + // The reference count added here will be decremented when the compound shape + // is destroyed in BSShapeCollection (the child shapes are looped over and dereferenced). + if (PhysicsScene.Shapes.ReferenceShape(cPrim.PhysShape)) + { + PhysicsScene.Logger.ErrorFormat("{0} Rebuilt sharable shape when building linkset! Region={1}, primID={2}, shape={3}", + LogHeader, PhysicsScene.RegionName, cPrim.LocalID, cPrim.PhysShape); + } + BulletSimAPI.AddChildShapeToCompoundShape2(LinksetRoot.PhysShape.ptr, cPrim.PhysShape.ptr, lci.OffsetPos, lci.OffsetRot); + } + } + return false; // 'false' says to move onto the next child in the list + }); + + // With all of the linkset packed into the root prim, it has the mass of everyone. + float linksetMass = LinksetMass; + LinksetRoot.UpdatePhysicalMassProperties(linksetMass); + } + finally + { + Rebuilding = false; + } + + BulletSimAPI.RecalculateCompoundShapeLocalAabb2(LinksetRoot.PhysShape.ptr); + + // DEBUG: see of inter-linkset collisions are causing problems for constraint linksets. + // BulletSimAPI.SetCollisionFilterMask2(LinksetRoot.BSBody.ptr, + // (uint)CollisionFilterGroups.LinksetFilter, (uint)CollisionFilterGroups.LinksetMask); + + } +} +} \ No newline at end of file diff --git a/OpenSim/Region/Physics/BulletSNPlugin/BSLinksetConstraints.cs b/OpenSim/Region/Physics/BulletSNPlugin/BSLinksetConstraints.cs new file mode 100644 index 0000000000..5757e64e78 --- /dev/null +++ b/OpenSim/Region/Physics/BulletSNPlugin/BSLinksetConstraints.cs @@ -0,0 +1,314 @@ +/* + * 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 copyrightD + * 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.Text; + +using OMV = OpenMetaverse; + +namespace OpenSim.Region.Physics.BulletSNPlugin +{ +public sealed class BSLinksetConstraints : BSLinkset +{ + // private static string LogHeader = "[BULLETSIM LINKSET CONSTRAINTS]"; + + public BSLinksetConstraints(BSScene scene, BSPhysObject parent) : base(scene, parent) + { + } + + // When physical properties are changed the linkset needs to recalculate + // its internal properties. + // This is queued in the 'post taint' queue so the + // refresh will happen once after all the other taints are applied. + public override void Refresh(BSPhysObject requestor) + { + // Queue to happen after all the other taint processing + PhysicsScene.PostTaintObject("BSLinksetContraints.Refresh", requestor.LocalID, delegate() + { + if (HasAnyChildren && IsRoot(requestor)) + RecomputeLinksetConstraints(); + }); + } + + // The object is going dynamic (physical). Do any setup necessary + // for a dynamic linkset. + // Only the state of the passed object can be modified. The rest of the linkset + // has not yet been fully constructed. + // Return 'true' if any properties updated on the passed object. + // Called at taint-time! + public override bool MakeDynamic(BSPhysObject child) + { + // What is done for each object in BSPrim is what we want. + return false; + } + + // The object is going static (non-physical). Do any setup necessary for a static linkset. + // Return 'true' if any properties updated on the passed object. + // This doesn't normally happen -- OpenSim removes the objects from the physical + // world if it is a static linkset. + // Called at taint-time! + public override bool MakeStatic(BSPhysObject child) + { + // What is done for each object in BSPrim is what we want. + return false; + } + + // Called at taint-time!! + public override void UpdateProperties(BSPhysObject updated, bool inTaintTime) + { + // Nothing to do for constraints on property updates + } + + // Routine called when rebuilding the body of some member of the linkset. + // Destroy all the constraints have have been made to root and set + // up to rebuild the constraints before the next simulation step. + // Returns 'true' of something was actually removed and would need restoring + // Called at taint-time!! + public override bool RemoveBodyDependencies(BSPrim child) + { + bool ret = false; + + DetailLog("{0},BSLinksetConstraint.RemoveBodyDependencies,removeChildrenForRoot,rID={1},rBody={2}", + child.LocalID, LinksetRoot.LocalID, LinksetRoot.PhysBody.ptr.ToString()); + + lock (m_linksetActivityLock) + { + // Just undo all the constraints for this linkset. Rebuild at the end of the step. + ret = PhysicallyUnlinkAllChildrenFromRoot(LinksetRoot); + // Cause the constraints, et al to be rebuilt before the next simulation step. + Refresh(LinksetRoot); + } + return ret; + } + + // Companion to RemoveBodyDependencies(). If RemoveBodyDependencies() returns 'true', + // this routine will restore the removed constraints. + // Called at taint-time!! + public override void RestoreBodyDependencies(BSPrim child) + { + // The Refresh operation queued by RemoveBodyDependencies() will build any missing constraints. + } + + // ================================================================ + + // Add a new child to the linkset. + // Called while LinkActivity is locked. + protected override void AddChildToLinkset(BSPhysObject child) + { + if (!HasChild(child)) + { + m_children.Add(child); + + DetailLog("{0},BSLinksetConstraints.AddChildToLinkset,call,child={1}", LinksetRoot.LocalID, child.LocalID); + + // Cause constraints and assorted properties to be recomputed before the next simulation step. + Refresh(LinksetRoot); + } + return; + } + + // Remove the specified child from the linkset. + // Safe to call even if the child is not really in my linkset. + protected override void RemoveChildFromLinkset(BSPhysObject child) + { + if (m_children.Remove(child)) + { + BSPhysObject rootx = LinksetRoot; // capture the root and body as of now + BSPhysObject childx = child; + + DetailLog("{0},BSLinksetConstraints.RemoveChildFromLinkset,call,rID={1},rBody={2},cID={3},cBody={4}", + childx.LocalID, + rootx.LocalID, rootx.PhysBody.ptr.ToString(), + childx.LocalID, childx.PhysBody.ptr.ToString()); + + PhysicsScene.TaintedObject("BSLinksetConstraints.RemoveChildFromLinkset", delegate() + { + PhysicallyUnlinkAChildFromRoot(rootx, childx); + }); + // See that the linkset parameters are recomputed at the end of the taint time. + Refresh(LinksetRoot); + } + else + { + // Non-fatal occurance. + // PhysicsScene.Logger.ErrorFormat("{0}: Asked to remove child from linkset that was not in linkset", LogHeader); + } + return; + } + + // Create a constraint between me (root of linkset) and the passed prim (the child). + // Called at taint time! + private void PhysicallyLinkAChildToRoot(BSPhysObject rootPrim, BSPhysObject childPrim) + { + // Don't build the constraint when asked. Put it off until just before the simulation step. + Refresh(rootPrim); + } + + private BSConstraint BuildConstraint(BSPhysObject rootPrim, BSPhysObject childPrim) + { + // Zero motion for children so they don't interpolate + childPrim.ZeroMotion(true); + + // Relative position normalized to the root prim + // Essentually a vector pointing from center of rootPrim to center of childPrim + OMV.Vector3 childRelativePosition = childPrim.Position - rootPrim.Position; + + // real world coordinate of midpoint between the two objects + OMV.Vector3 midPoint = rootPrim.Position + (childRelativePosition / 2); + + DetailLog("{0},BSLinksetConstraint.BuildConstraint,taint,root={1},rBody={2},child={3},cBody={4},rLoc={5},cLoc={6},midLoc={7}", + rootPrim.LocalID, + rootPrim.LocalID, rootPrim.PhysBody.ptr.ToString(), + childPrim.LocalID, childPrim.PhysBody.ptr.ToString(), + rootPrim.Position, childPrim.Position, midPoint); + + // create a constraint that allows no freedom of movement between the two objects + // http://bulletphysics.org/Bullet/phpBB3/viewtopic.php?t=4818 + + BSConstraint6Dof constrain = new BSConstraint6Dof( + PhysicsScene.World, rootPrim.PhysBody, childPrim.PhysBody, midPoint, true, true ); + // PhysicsScene.World, childPrim.BSBody, rootPrim.BSBody, midPoint, true, true ); + + /* NOTE: below is an attempt to build constraint with full frame computation, etc. + * Using the midpoint is easier since it lets the Bullet code manipulate the transforms + * of the objects. + * Code left for future programmers. + // ================================================================================== + // relative position normalized to the root prim + OMV.Quaternion invThisOrientation = OMV.Quaternion.Inverse(rootPrim.Orientation); + OMV.Vector3 childRelativePosition = (childPrim.Position - rootPrim.Position) * invThisOrientation; + + // relative rotation of the child to the parent + OMV.Quaternion childRelativeRotation = invThisOrientation * childPrim.Orientation; + OMV.Quaternion inverseChildRelativeRotation = OMV.Quaternion.Inverse(childRelativeRotation); + + DetailLog("{0},BSLinksetConstraint.PhysicallyLinkAChildToRoot,taint,root={1},child={2}", rootPrim.LocalID, rootPrim.LocalID, childPrim.LocalID); + BS6DofConstraint constrain = new BS6DofConstraint( + PhysicsScene.World, rootPrim.Body, childPrim.Body, + OMV.Vector3.Zero, + OMV.Quaternion.Inverse(rootPrim.Orientation), + OMV.Vector3.Zero, + OMV.Quaternion.Inverse(childPrim.Orientation), + true, + true + ); + // ================================================================================== + */ + + PhysicsScene.Constraints.AddConstraint(constrain); + + // zero linear and angular limits makes the objects unable to move in relation to each other + constrain.SetLinearLimits(OMV.Vector3.Zero, OMV.Vector3.Zero); + constrain.SetAngularLimits(OMV.Vector3.Zero, OMV.Vector3.Zero); + + // tweek the constraint to increase stability + constrain.UseFrameOffset(BSParam.BoolNumeric(BSParam.LinkConstraintUseFrameOffset)); + constrain.TranslationalLimitMotor(BSParam.BoolNumeric(BSParam.LinkConstraintEnableTransMotor), + BSParam.LinkConstraintTransMotorMaxVel, + BSParam.LinkConstraintTransMotorMaxForce); + constrain.SetCFMAndERP(BSParam.LinkConstraintCFM, BSParam.LinkConstraintERP); + if (BSParam.LinkConstraintSolverIterations != 0f) + { + constrain.SetSolverIterations(BSParam.LinkConstraintSolverIterations); + } + return constrain; + } + + // Remove linkage between the linkset root and a particular child + // The root and child bodies are passed in because we need to remove the constraint between + // the bodies that were present at unlink time. + // Called at taint time! + private bool PhysicallyUnlinkAChildFromRoot(BSPhysObject rootPrim, BSPhysObject childPrim) + { + bool ret = false; + DetailLog("{0},BSLinksetConstraint.PhysicallyUnlinkAChildFromRoot,taint,root={1},rBody={2},child={3},cBody={4}", + rootPrim.LocalID, + rootPrim.LocalID, rootPrim.PhysBody.ptr.ToString(), + childPrim.LocalID, childPrim.PhysBody.ptr.ToString()); + + // Find the constraint for this link and get rid of it from the overall collection and from my list + if (PhysicsScene.Constraints.RemoveAndDestroyConstraint(rootPrim.PhysBody, childPrim.PhysBody)) + { + // Make the child refresh its location + BulletSimAPI.PushUpdate2(childPrim.PhysBody.ptr); + ret = true; + } + + return ret; + } + + // Remove linkage between myself and any possible children I might have. + // Returns 'true' of any constraints were destroyed. + // Called at taint time! + private bool PhysicallyUnlinkAllChildrenFromRoot(BSPhysObject rootPrim) + { + DetailLog("{0},BSLinksetConstraint.PhysicallyUnlinkAllChildren,taint", rootPrim.LocalID); + + return PhysicsScene.Constraints.RemoveAndDestroyConstraint(rootPrim.PhysBody); + } + + // Call each of the constraints that make up this linkset and recompute the + // various transforms and variables. Create constraints of not created yet. + // Called before the simulation step to make sure the constraint based linkset + // is all initialized. + // Called at taint time!! + private void RecomputeLinksetConstraints() + { + float linksetMass = LinksetMass; + LinksetRoot.UpdatePhysicalMassProperties(linksetMass); + + // DEBUG: see of inter-linkset collisions are causing problems + // BulletSimAPI.SetCollisionFilterMask2(LinksetRoot.BSBody.ptr, + // (uint)CollisionFilterGroups.LinksetFilter, (uint)CollisionFilterGroups.LinksetMask); + DetailLog("{0},BSLinksetConstraint.RecomputeLinksetConstraints,set,rBody={1},linksetMass={2}", + LinksetRoot.LocalID, LinksetRoot.PhysBody.ptr.ToString(), linksetMass); + + foreach (BSPhysObject child in m_children) + { + // A child in the linkset physically shows the mass of the whole linkset. + // This allows Bullet to apply enough force on the child to move the whole linkset. + // (Also do the mass stuff before recomputing the constraint so mass is not zero.) + child.UpdatePhysicalMassProperties(linksetMass); + + BSConstraint constrain; + if (!PhysicsScene.Constraints.TryGetConstraint(LinksetRoot.PhysBody, child.PhysBody, out constrain)) + { + // If constraint doesn't exist yet, create it. + constrain = BuildConstraint(LinksetRoot, child); + } + constrain.RecomputeConstraintVariables(linksetMass); + + // DEBUG: see of inter-linkset collisions are causing problems + // BulletSimAPI.SetCollisionFilterMask2(child.BSBody.ptr, + // (uint)CollisionFilterGroups.LinksetFilter, (uint)CollisionFilterGroups.LinksetMask); + + // BulletSimAPI.DumpConstraint2(PhysicsScene.World.ptr, constrain.Constraint.ptr); // DEBUG DEBUG + } + + } +} +} diff --git a/OpenSim/Region/Physics/BulletSNPlugin/BSMaterials.cs b/OpenSim/Region/Physics/BulletSNPlugin/BSMaterials.cs new file mode 100644 index 0000000000..732191f9b6 --- /dev/null +++ b/OpenSim/Region/Physics/BulletSNPlugin/BSMaterials.cs @@ -0,0 +1,200 @@ +/* + * 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 copyrightD + * 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.Text; +using System.Reflection; +using Nini.Config; + +namespace OpenSim.Region.Physics.BulletSNPlugin +{ + +public struct MaterialAttributes +{ + // Material type values that correspond with definitions for LSL + public enum Material : int + { + Stone = 0, + Metal, + Glass, + Wood, + Flesh, + Plastic, + Rubber, + Light, + // Hereafter are BulletSim additions + Avatar, + NumberOfTypes // the count of types in the enum. + } + + // Names must be in the order of the above enum. + // These names must coorespond to the lower case field names in the MaterialAttributes + // structure as reflection is used to select the field to put the value in. + public static readonly string[] MaterialAttribs = { "Density", "Friction", "Restitution"}; + + public MaterialAttributes(string t, float d, float f, float r) + { + type = t; + density = d; + friction = f; + restitution = r; + } + public string type; + public float density; + public float friction; + public float restitution; +} + +public static class BSMaterials +{ + // Attributes for each material type + private static readonly MaterialAttributes[] Attributes; + + // Map of material name to material type code + public static readonly Dictionary MaterialMap; + + static BSMaterials() + { + // Attribute sets for both the non-physical and physical instances of materials. + Attributes = new MaterialAttributes[(int)MaterialAttributes.Material.NumberOfTypes * 2]; + + // Map of name to type code. + MaterialMap = new Dictionary(); + MaterialMap.Add("Stone", MaterialAttributes.Material.Stone); + MaterialMap.Add("Metal", MaterialAttributes.Material.Metal); + MaterialMap.Add("Glass", MaterialAttributes.Material.Glass); + MaterialMap.Add("Wood", MaterialAttributes.Material.Wood); + MaterialMap.Add("Flesh", MaterialAttributes.Material.Flesh); + MaterialMap.Add("Plastic", MaterialAttributes.Material.Plastic); + MaterialMap.Add("Rubber", MaterialAttributes.Material.Rubber); + MaterialMap.Add("Light", MaterialAttributes.Material.Light); + MaterialMap.Add("Avatar", MaterialAttributes.Material.Avatar); + } + + // This is where all the default material attributes are defined. + public static void InitializeFromDefaults(ConfigurationParameters parms) + { + // Values from http://wiki.secondlife.com/wiki/PRIM_MATERIAL + float dDensity = parms.defaultDensity; + float dFriction = parms.defaultFriction; + float dRestitution = parms.defaultRestitution; + Attributes[(int)MaterialAttributes.Material.Stone] = + new MaterialAttributes("stone",dDensity, 0.8f, 0.4f); + Attributes[(int)MaterialAttributes.Material.Metal] = + new MaterialAttributes("metal",dDensity, 0.3f, 0.4f); + Attributes[(int)MaterialAttributes.Material.Glass] = + new MaterialAttributes("glass",dDensity, 0.2f, 0.7f); + Attributes[(int)MaterialAttributes.Material.Wood] = + new MaterialAttributes("wood",dDensity, 0.6f, 0.5f); + Attributes[(int)MaterialAttributes.Material.Flesh] = + new MaterialAttributes("flesh",dDensity, 0.9f, 0.3f); + Attributes[(int)MaterialAttributes.Material.Plastic] = + new MaterialAttributes("plastic",dDensity, 0.4f, 0.7f); + Attributes[(int)MaterialAttributes.Material.Rubber] = + new MaterialAttributes("rubber",dDensity, 0.9f, 0.9f); + Attributes[(int)MaterialAttributes.Material.Light] = + new MaterialAttributes("light",dDensity, dFriction, dRestitution); + Attributes[(int)MaterialAttributes.Material.Avatar] = + new MaterialAttributes("avatar",60f, 0.2f, 0f); + + Attributes[(int)MaterialAttributes.Material.Stone + (int)MaterialAttributes.Material.NumberOfTypes] = + new MaterialAttributes("stonePhysical",dDensity, 0.8f, 0.4f); + Attributes[(int)MaterialAttributes.Material.Metal + (int)MaterialAttributes.Material.NumberOfTypes] = + new MaterialAttributes("metalPhysical",dDensity, 0.8f, 0.4f); + Attributes[(int)MaterialAttributes.Material.Glass + (int)MaterialAttributes.Material.NumberOfTypes] = + new MaterialAttributes("glassPhysical",dDensity, 0.8f, 0.7f); + Attributes[(int)MaterialAttributes.Material.Wood + (int)MaterialAttributes.Material.NumberOfTypes] = + new MaterialAttributes("woodPhysical",dDensity, 0.8f, 0.5f); + Attributes[(int)MaterialAttributes.Material.Flesh + (int)MaterialAttributes.Material.NumberOfTypes] = + new MaterialAttributes("fleshPhysical",dDensity, 0.8f, 0.3f); + Attributes[(int)MaterialAttributes.Material.Plastic + (int)MaterialAttributes.Material.NumberOfTypes] = + new MaterialAttributes("plasticPhysical",dDensity, 0.8f, 0.7f); + Attributes[(int)MaterialAttributes.Material.Rubber + (int)MaterialAttributes.Material.NumberOfTypes] = + new MaterialAttributes("rubberPhysical",dDensity, 0.8f, 0.9f); + Attributes[(int)MaterialAttributes.Material.Light + (int)MaterialAttributes.Material.NumberOfTypes] = + new MaterialAttributes("lightPhysical",dDensity, dFriction, dRestitution); + Attributes[(int)MaterialAttributes.Material.Avatar + (int)MaterialAttributes.Material.NumberOfTypes] = + new MaterialAttributes("avatarPhysical",60f, 0.2f, 0f); + } + + // Under the [BulletSim] section, one can change the individual material + // attribute values. The format of the configuration parameter is: + // ["Physical"] = floatValue + // For instance: + // [BulletSim] + // StoneFriction = 0.2 + // FleshRestitutionPhysical = 0.8 + // Materials can have different parameters for their static and + // physical instantiations. When setting the non-physical value, + // both values are changed. Setting the physical value only changes + // the physical value. + public static void InitializefromParameters(IConfig pConfig) + { + foreach (KeyValuePair kvp in MaterialMap) + { + string matName = kvp.Key; + foreach (string attribName in MaterialAttributes.MaterialAttribs) + { + string paramName = matName + attribName; + if (pConfig.Contains(paramName)) + { + float paramValue = pConfig.GetFloat(paramName); + SetAttributeValue((int)kvp.Value, attribName, paramValue); + // set the physical value also + SetAttributeValue((int)kvp.Value + (int)MaterialAttributes.Material.NumberOfTypes, attribName, paramValue); + } + paramName += "Physical"; + if (pConfig.Contains(paramName)) + { + float paramValue = pConfig.GetFloat(paramName); + SetAttributeValue((int)kvp.Value + (int)MaterialAttributes.Material.NumberOfTypes, attribName, paramValue); + } + } + } + } + + // Use reflection to set the value in the attribute structure. + private static void SetAttributeValue(int matType, string attribName, float val) + { + MaterialAttributes thisAttrib = Attributes[matType]; + FieldInfo fieldInfo = thisAttrib.GetType().GetField(attribName.ToLower()); + if (fieldInfo != null) + { + fieldInfo.SetValue(thisAttrib, val); + Attributes[matType] = thisAttrib; + } + } + + // Given a material type, return a structure of attributes. + public static MaterialAttributes GetAttributes(MaterialAttributes.Material type, bool isPhysical) + { + int ind = (int)type; + if (isPhysical) ind += (int)MaterialAttributes.Material.NumberOfTypes; + return Attributes[ind]; + } +} +} diff --git a/OpenSim/Region/Physics/BulletSNPlugin/BSMotors.cs b/OpenSim/Region/Physics/BulletSNPlugin/BSMotors.cs new file mode 100644 index 0000000000..7abc9b2b78 --- /dev/null +++ b/OpenSim/Region/Physics/BulletSNPlugin/BSMotors.cs @@ -0,0 +1,347 @@ +/* + * 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.Text; +using OpenMetaverse; +using OpenSim.Framework; + +namespace OpenSim.Region.Physics.BulletSNPlugin +{ +public abstract class BSMotor +{ + // Timescales and other things can be turned off by setting them to 'infinite'. + public const float Infinite = 12345.6f; + public readonly static Vector3 InfiniteVector = new Vector3(BSMotor.Infinite, BSMotor.Infinite, BSMotor.Infinite); + + public BSMotor(string useName) + { + UseName = useName; + PhysicsScene = null; + Enabled = true; + } + public virtual bool Enabled { get; set; } + public virtual void Reset() { } + public virtual void Zero() { } + public virtual void GenerateTestOutput(float timeStep) { } + + // A name passed at motor creation for easily identifyable debugging messages. + public string UseName { get; private set; } + + // Used only for outputting debug information. Might not be set so check for null. + public BSScene PhysicsScene { get; set; } + protected void MDetailLog(string msg, params Object[] parms) + { + if (PhysicsScene != null) + { + if (PhysicsScene.VehicleLoggingEnabled) + { + PhysicsScene.DetailLog(msg, parms); + } + } + } +} + +// Motor which moves CurrentValue to TargetValue over TimeScale seconds. +// The TargetValue decays in TargetValueDecayTimeScale and +// the CurrentValue will be held back by FrictionTimeScale. +// This motor will "zero itself" over time in that the targetValue will +// decay to zero and the currentValue will follow it to that zero. +// The overall effect is for the returned correction value to go from large +// values (the total difference between current and target minus friction) +// to small and eventually zero values. +// TimeScale and TargetDelayTimeScale may be 'infinite' which means no decay. + +// For instance, if something is moving at speed X and the desired speed is Y, +// CurrentValue is X and TargetValue is Y. As the motor is stepped, new +// values of CurrentValue are returned that approach the TargetValue. +// The feature of decaying TargetValue is so vehicles will eventually +// come to a stop rather than run forever. This can be disabled by +// setting TargetValueDecayTimescale to 'infinite'. +// The change from CurrentValue to TargetValue is linear over TimeScale seconds. +public class BSVMotor : BSMotor +{ + // public Vector3 FrameOfReference { get; set; } + // public Vector3 Offset { get; set; } + + public virtual float TimeScale { get; set; } + public virtual float TargetValueDecayTimeScale { get; set; } + public virtual Vector3 FrictionTimescale { get; set; } + public virtual float Efficiency { get; set; } + + public virtual float ErrorZeroThreshold { get; set; } + + public virtual Vector3 TargetValue { get; protected set; } + public virtual Vector3 CurrentValue { get; protected set; } + public virtual Vector3 LastError { get; protected set; } + + public virtual bool ErrorIsZero + { get { + return (LastError == Vector3.Zero || LastError.LengthSquared() <= ErrorZeroThreshold); + } + } + + public BSVMotor(string useName) + : base(useName) + { + TimeScale = TargetValueDecayTimeScale = BSMotor.Infinite; + Efficiency = 1f; + FrictionTimescale = BSMotor.InfiniteVector; + CurrentValue = TargetValue = Vector3.Zero; + ErrorZeroThreshold = 0.001f; + } + public BSVMotor(string useName, float timeScale, float decayTimeScale, Vector3 frictionTimeScale, float efficiency) + : this(useName) + { + TimeScale = timeScale; + TargetValueDecayTimeScale = decayTimeScale; + FrictionTimescale = frictionTimeScale; + Efficiency = efficiency; + CurrentValue = TargetValue = Vector3.Zero; + } + public void SetCurrent(Vector3 current) + { + CurrentValue = current; + } + public void SetTarget(Vector3 target) + { + TargetValue = target; + } + public override void Zero() + { + base.Zero(); + CurrentValue = TargetValue = Vector3.Zero; + } + + // Compute the next step and return the new current value + public virtual Vector3 Step(float timeStep) + { + if (!Enabled) return TargetValue; + + Vector3 origTarget = TargetValue; // DEBUG + Vector3 origCurrVal = CurrentValue; // DEBUG + + Vector3 correction = Vector3.Zero; + Vector3 error = TargetValue - CurrentValue; + if (!error.ApproxEquals(Vector3.Zero, ErrorZeroThreshold)) + { + correction = Step(timeStep, error); + + CurrentValue += correction; + + // The desired value reduces to zero which also reduces the difference with current. + // If the decay time is infinite, don't decay at all. + float decayFactor = 0f; + if (TargetValueDecayTimeScale != BSMotor.Infinite) + { + decayFactor = (1.0f / TargetValueDecayTimeScale) * timeStep; + TargetValue *= (1f - decayFactor); + } + + // The amount we can correct the error is reduced by the friction + Vector3 frictionFactor = Vector3.Zero; + if (FrictionTimescale != BSMotor.InfiniteVector) + { + // frictionFactor = (Vector3.One / FrictionTimescale) * timeStep; + // Individual friction components can be 'infinite' so compute each separately. + frictionFactor.X = (FrictionTimescale.X == BSMotor.Infinite) ? 0f : (1f / FrictionTimescale.X); + frictionFactor.Y = (FrictionTimescale.Y == BSMotor.Infinite) ? 0f : (1f / FrictionTimescale.Y); + frictionFactor.Z = (FrictionTimescale.Z == BSMotor.Infinite) ? 0f : (1f / FrictionTimescale.Z); + frictionFactor *= timeStep; + CurrentValue *= (Vector3.One - frictionFactor); + } + + MDetailLog("{0}, BSVMotor.Step,nonZero,{1},origCurr={2},origTarget={3},timeStep={4},err={5},corr={6}", + BSScene.DetailLogZero, UseName, origCurrVal, origTarget, + timeStep, error, correction); + MDetailLog("{0}, BSVMotor.Step,nonZero,{1},tgtDecayTS={2},decayFact={3},frictTS={4},frictFact={5},tgt={6},curr={7}", + BSScene.DetailLogZero, UseName, + TargetValueDecayTimeScale, decayFactor, FrictionTimescale, frictionFactor, + TargetValue, CurrentValue); + } + else + { + // Difference between what we have and target is small. Motor is done. + CurrentValue = TargetValue; + MDetailLog("{0}, BSVMotor.Step,zero,{1},origTgt={2},origCurr={3},ret={4}", + BSScene.DetailLogZero, UseName, origCurrVal, origTarget, CurrentValue); + } + + return CurrentValue; + } + public virtual Vector3 Step(float timeStep, Vector3 error) + { + if (!Enabled) return Vector3.Zero; + + LastError = error; + Vector3 returnCorrection = Vector3.Zero; + if (!error.ApproxEquals(Vector3.Zero, ErrorZeroThreshold)) + { + // correction = error / secondsItShouldTakeToCorrect + Vector3 correctionAmount; + if (TimeScale == 0f || TimeScale == BSMotor.Infinite) + correctionAmount = error * timeStep; + else + correctionAmount = error / TimeScale * timeStep; + + returnCorrection = correctionAmount; + MDetailLog("{0}, BSVMotor.Step,nonZero,{1},timeStep={2},timeScale={3},err={4},corr={5}", + BSScene.DetailLogZero, UseName, timeStep, TimeScale, error, correctionAmount); + } + return returnCorrection; + } + + // The user sets all the parameters and calls this which outputs values until error is zero. + public override void GenerateTestOutput(float timeStep) + { + // maximum number of outputs to generate. + int maxOutput = 50; + MDetailLog("{0},BSVMotor.Test,{1},===================================== BEGIN Test Output", BSScene.DetailLogZero, UseName); + MDetailLog("{0},BSVMotor.Test,{1},timeScale={2},targDlyTS={3},frictTS={4},eff={5},curr={6},tgt={7}", + BSScene.DetailLogZero, UseName, + TimeScale, TargetValueDecayTimeScale, FrictionTimescale, Efficiency, + CurrentValue, TargetValue); + + LastError = BSMotor.InfiniteVector; + while (maxOutput-- > 0 && !LastError.ApproxEquals(Vector3.Zero, ErrorZeroThreshold)) + { + Vector3 lastStep = Step(timeStep); + MDetailLog("{0},BSVMotor.Test,{1},cur={2},tgt={3},lastError={4},lastStep={5}", + BSScene.DetailLogZero, UseName, CurrentValue, TargetValue, LastError, lastStep); + } + MDetailLog("{0},BSVMotor.Test,{1},===================================== END Test Output", BSScene.DetailLogZero, UseName); + + + } + + public override string ToString() + { + return String.Format("<{0},curr={1},targ={2},decayTS={3},frictTS={4}>", + UseName, CurrentValue, TargetValue, TargetValueDecayTimeScale, FrictionTimescale); + } +} + +public class BSFMotor : BSMotor +{ + public float TimeScale { get; set; } + public float DecayTimeScale { get; set; } + public float Friction { get; set; } + public float Efficiency { get; set; } + + public float Target { get; private set; } + public float CurrentValue { get; private set; } + + public BSFMotor(string useName, float timeScale, float decayTimescale, float friction, float efficiency) + : base(useName) + { + } + public void SetCurrent(float target) + { + } + public void SetTarget(float target) + { + } + public virtual float Step(float timeStep) + { + return 0f; + } +} + +// Proportional, Integral, Derivitive Motor +// Good description at http://www.answers.com/topic/pid-controller . Includes processes for choosing p, i and d factors. +public class BSPIDVMotor : BSVMotor +{ + // Larger makes more overshoot, smaller means converge quicker. Range of 0.1 to 10. + public Vector3 proportionFactor { get; set; } + public Vector3 integralFactor { get; set; } + public Vector3 derivFactor { get; set; } + + // Arbritrary factor range. + // EfficiencyHigh means move quickly to the correct number. EfficiencyLow means might over correct. + public float EfficiencyHigh = 0.4f; + public float EfficiencyLow = 4.0f; + + // Running integration of the error + Vector3 RunningIntegration { get; set; } + + public BSPIDVMotor(string useName) + : base(useName) + { + proportionFactor = new Vector3(1.00f, 1.00f, 1.00f); + integralFactor = new Vector3(1.00f, 1.00f, 1.00f); + derivFactor = new Vector3(1.00f, 1.00f, 1.00f); + RunningIntegration = Vector3.Zero; + LastError = Vector3.Zero; + } + + public override void Zero() + { + base.Zero(); + } + + public override float Efficiency + { + get { return base.Efficiency; } + set + { + base.Efficiency = Util.Clamp(value, 0f, 1f); + // Compute factors based on efficiency. + // If efficiency is high (1f), use a factor value that moves the error value to zero with little overshoot. + // If efficiency is low (0f), use a factor value that overcorrects. + // TODO: might want to vary contribution of different factor depending on efficiency. + float factor = ((1f - this.Efficiency) * EfficiencyHigh + EfficiencyLow) / 3f; + // float factor = (1f - this.Efficiency) * EfficiencyHigh + EfficiencyLow; + proportionFactor = new Vector3(factor, factor, factor); + integralFactor = new Vector3(factor, factor, factor); + derivFactor = new Vector3(factor, factor, factor); + } + } + + // Ignore Current and Target Values and just advance the PID computation on this error. + public override Vector3 Step(float timeStep, Vector3 error) + { + if (!Enabled) return Vector3.Zero; + + // Add up the error so we can integrate over the accumulated errors + RunningIntegration += error * timeStep; + + // A simple derivitive is the rate of change from the last error. + Vector3 derivFactor = (error - LastError) * timeStep; + LastError = error; + + // Correction = -(proportionOfPresentError + accumulationOfPastError + rateOfChangeOfError) + Vector3 ret = -( + error * proportionFactor + + RunningIntegration * integralFactor + + derivFactor * derivFactor + ); + + return ret; + } +} +} diff --git a/OpenSim/Region/Physics/BulletSNPlugin/BSParam.cs b/OpenSim/Region/Physics/BulletSNPlugin/BSParam.cs new file mode 100644 index 0000000000..0bb167467f --- /dev/null +++ b/OpenSim/Region/Physics/BulletSNPlugin/BSParam.cs @@ -0,0 +1,559 @@ +/* + * 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 copyrightD + * 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.Text; + +using OpenSim.Region.Physics.Manager; + +using OpenMetaverse; +using Nini.Config; + +namespace OpenSim.Region.Physics.BulletSNPlugin +{ +public static class BSParam +{ + // Level of Detail values kept as float because that's what the Meshmerizer wants + public static float MeshLOD { get; private set; } + public static float MeshMegaPrimLOD { get; private set; } + public static float MeshMegaPrimThreshold { get; private set; } + public static float SculptLOD { get; private set; } + + public static float MinimumObjectMass { get; private set; } + public static float MaximumObjectMass { get; private set; } + + public static float LinearDamping { get; private set; } + public static float AngularDamping { get; private set; } + public static float DeactivationTime { get; private set; } + public static float LinearSleepingThreshold { get; private set; } + public static float AngularSleepingThreshold { get; private set; } + public static float CcdMotionThreshold { get; private set; } + public static float CcdSweptSphereRadius { get; private set; } + public static float ContactProcessingThreshold { get; private set; } + + public static bool ShouldMeshSculptedPrim { get; private set; } // cause scuplted prims to get meshed + public static bool ShouldForceSimplePrimMeshing { get; private set; } // if a cube or sphere, let Bullet do internal shapes + public static bool ShouldUseHullsForPhysicalObjects { get; private set; } // 'true' if should create hulls for physical objects + + public static float TerrainImplementation { get; private set; } + public static float TerrainFriction { get; private set; } + public static float TerrainHitFraction { get; private set; } + public static float TerrainRestitution { get; private set; } + public static float TerrainCollisionMargin { get; private set; } + + // Avatar parameters + public static float AvatarFriction { get; private set; } + public static float AvatarStandingFriction { get; private set; } + public static float AvatarDensity { get; private set; } + public static float AvatarRestitution { get; private set; } + public static float AvatarCapsuleWidth { get; private set; } + public static float AvatarCapsuleDepth { get; private set; } + public static float AvatarCapsuleHeight { get; private set; } + public static float AvatarContactProcessingThreshold { get; private set; } + + public static float VehicleAngularDamping { get; private set; } + + public static float LinksetImplementation { get; private set; } + public static float LinkConstraintUseFrameOffset { get; private set; } + public static float LinkConstraintEnableTransMotor { get; private set; } + public static float LinkConstraintTransMotorMaxVel { get; private set; } + public static float LinkConstraintTransMotorMaxForce { get; private set; } + public static float LinkConstraintERP { get; private set; } + public static float LinkConstraintCFM { get; private set; } + public static float LinkConstraintSolverIterations { get; private set; } + + public static float PID_D { get; private set; } // derivative + public static float PID_P { get; private set; } // proportional + + public delegate void ParamUser(BSScene scene, IConfig conf, string paramName, float val); + public delegate float ParamGet(BSScene scene); + public delegate void ParamSet(BSScene scene, string paramName, uint localID, float val); + public delegate void SetOnObject(BSScene scene, BSPhysObject obj, float val); + + public struct ParameterDefn + { + public string name; // string name of the parameter + public string desc; // a short description of what the parameter means + public float defaultValue; // default value if not specified anywhere else + public ParamUser userParam; // get the value from the configuration file + public ParamGet getter; // return the current value stored for this parameter + public ParamSet setter; // set the current value for this parameter + public SetOnObject onObject; // set the value on an object in the physical domain + public ParameterDefn(string n, string d, float v, ParamUser u, ParamGet g, ParamSet s) + { + name = n; + desc = d; + defaultValue = v; + userParam = u; + getter = g; + setter = s; + onObject = null; + } + public ParameterDefn(string n, string d, float v, ParamUser u, ParamGet g, ParamSet s, SetOnObject o) + { + name = n; + desc = d; + defaultValue = v; + userParam = u; + getter = g; + setter = s; + onObject = o; + } + } + + // List of all of the externally visible parameters. + // For each parameter, this table maps a text name to getter and setters. + // To add a new externally referencable/settable parameter, add the paramter storage + // location somewhere in the program and make an entry in this table with the + // getters and setters. + // It is easiest to find an existing definition and copy it. + // Parameter values are floats. Booleans are converted to a floating value. + // + // A ParameterDefn() takes the following parameters: + // -- the text name of the parameter. This is used for console input and ini file. + // -- a short text description of the parameter. This shows up in the console listing. + // -- a default value (float) + // -- a delegate for fetching the parameter from the ini file. + // Should handle fetching the right type from the ini file and converting it. + // -- a delegate for getting the value as a float + // -- a delegate for setting the value from a float + // -- an optional delegate to update the value in the world. Most often used to + // push the new value to an in-world object. + // + // The single letter parameters for the delegates are: + // s = BSScene + // o = BSPhysObject + // p = string parameter name + // l = localID of referenced object + // v = value (float) + // cf = parameter configuration class (for fetching values from ini file) + private static ParameterDefn[] ParameterDefinitions = + { + new ParameterDefn("MeshSculptedPrim", "Whether to create meshes for sculpties", + ConfigurationParameters.numericTrue, + (s,cf,p,v) => { ShouldMeshSculptedPrim = cf.GetBoolean(p, BSParam.BoolNumeric(v)); }, + (s) => { return BSParam.NumericBool(ShouldMeshSculptedPrim); }, + (s,p,l,v) => { ShouldMeshSculptedPrim = BSParam.BoolNumeric(v); } ), + new ParameterDefn("ForceSimplePrimMeshing", "If true, only use primitive meshes for objects", + ConfigurationParameters.numericFalse, + (s,cf,p,v) => { ShouldForceSimplePrimMeshing = cf.GetBoolean(p, BSParam.BoolNumeric(v)); }, + (s) => { return BSParam.NumericBool(ShouldForceSimplePrimMeshing); }, + (s,p,l,v) => { ShouldForceSimplePrimMeshing = BSParam.BoolNumeric(v); } ), + new ParameterDefn("UseHullsForPhysicalObjects", "If true, create hulls for physical objects", + ConfigurationParameters.numericTrue, + (s,cf,p,v) => { ShouldUseHullsForPhysicalObjects = cf.GetBoolean(p, BSParam.BoolNumeric(v)); }, + (s) => { return BSParam.NumericBool(ShouldUseHullsForPhysicalObjects); }, + (s,p,l,v) => { ShouldUseHullsForPhysicalObjects = BSParam.BoolNumeric(v); } ), + + new ParameterDefn("MeshLevelOfDetail", "Level of detail to render meshes (32, 16, 8 or 4. 32=most detailed)", + 8f, + (s,cf,p,v) => { MeshLOD = (float)cf.GetInt(p, (int)v); }, + (s) => { return MeshLOD; }, + (s,p,l,v) => { MeshLOD = v; } ), + new ParameterDefn("MeshLevelOfDetailMegaPrim", "Level of detail to render meshes larger than threshold meters", + 16f, + (s,cf,p,v) => { MeshMegaPrimLOD = (float)cf.GetInt(p, (int)v); }, + (s) => { return MeshMegaPrimLOD; }, + (s,p,l,v) => { MeshMegaPrimLOD = v; } ), + new ParameterDefn("MeshLevelOfDetailMegaPrimThreshold", "Size (in meters) of a mesh before using MeshMegaPrimLOD", + 10f, + (s,cf,p,v) => { MeshMegaPrimThreshold = (float)cf.GetInt(p, (int)v); }, + (s) => { return MeshMegaPrimThreshold; }, + (s,p,l,v) => { MeshMegaPrimThreshold = v; } ), + new ParameterDefn("SculptLevelOfDetail", "Level of detail to render sculpties (32, 16, 8 or 4. 32=most detailed)", + 32f, + (s,cf,p,v) => { SculptLOD = (float)cf.GetInt(p, (int)v); }, + (s) => { return SculptLOD; }, + (s,p,l,v) => { SculptLOD = v; } ), + + new ParameterDefn("MaxSubStep", "In simulation step, maximum number of substeps", + 10f, + (s,cf,p,v) => { s.m_maxSubSteps = cf.GetInt(p, (int)v); }, + (s) => { return (float)s.m_maxSubSteps; }, + (s,p,l,v) => { s.m_maxSubSteps = (int)v; } ), + new ParameterDefn("FixedTimeStep", "In simulation step, seconds of one substep (1/60)", + 1f / 60f, + (s,cf,p,v) => { s.m_fixedTimeStep = cf.GetFloat(p, v); }, + (s) => { return (float)s.m_fixedTimeStep; }, + (s,p,l,v) => { s.m_fixedTimeStep = v; } ), + new ParameterDefn("MaxCollisionsPerFrame", "Max collisions returned at end of each frame", + 2048f, + (s,cf,p,v) => { s.m_maxCollisionsPerFrame = cf.GetInt(p, (int)v); }, + (s) => { return (float)s.m_maxCollisionsPerFrame; }, + (s,p,l,v) => { s.m_maxCollisionsPerFrame = (int)v; } ), + new ParameterDefn("MaxUpdatesPerFrame", "Max updates returned at end of each frame", + 8000f, + (s,cf,p,v) => { s.m_maxUpdatesPerFrame = cf.GetInt(p, (int)v); }, + (s) => { return (float)s.m_maxUpdatesPerFrame; }, + (s,p,l,v) => { s.m_maxUpdatesPerFrame = (int)v; } ), + new ParameterDefn("MaxTaintsToProcessPerStep", "Number of update taints to process before each simulation step", + 500f, + (s,cf,p,v) => { s.m_taintsToProcessPerStep = cf.GetInt(p, (int)v); }, + (s) => { return (float)s.m_taintsToProcessPerStep; }, + (s,p,l,v) => { s.m_taintsToProcessPerStep = (int)v; } ), + new ParameterDefn("MinObjectMass", "Minimum object mass (0.0001)", + 0.0001f, + (s,cf,p,v) => { MinimumObjectMass = cf.GetFloat(p, v); }, + (s) => { return (float)MinimumObjectMass; }, + (s,p,l,v) => { MinimumObjectMass = v; } ), + new ParameterDefn("MaxObjectMass", "Maximum object mass (10000.01)", + 10000.01f, + (s,cf,p,v) => { MaximumObjectMass = cf.GetFloat(p, v); }, + (s) => { return (float)MaximumObjectMass; }, + (s,p,l,v) => { MaximumObjectMass = v; } ), + + new ParameterDefn("PID_D", "Derivitive factor for motion smoothing", + 2200f, + (s,cf,p,v) => { PID_D = cf.GetFloat(p, v); }, + (s) => { return (float)PID_D; }, + (s,p,l,v) => { PID_D = v; } ), + new ParameterDefn("PID_P", "Parameteric factor for motion smoothing", + 900f, + (s,cf,p,v) => { PID_P = cf.GetFloat(p, v); }, + (s) => { return (float)PID_P; }, + (s,p,l,v) => { PID_P = v; } ), + + new ParameterDefn("DefaultFriction", "Friction factor used on new objects", + 0.2f, + (s,cf,p,v) => { s.UnmanagedParams[0].defaultFriction = cf.GetFloat(p, v); }, + (s) => { return s.UnmanagedParams[0].defaultFriction; }, + (s,p,l,v) => { s.UnmanagedParams[0].defaultFriction = v; } ), + new ParameterDefn("DefaultDensity", "Density for new objects" , + 10.000006836f, // Aluminum g/cm3 + (s,cf,p,v) => { s.UnmanagedParams[0].defaultDensity = cf.GetFloat(p, v); }, + (s) => { return s.UnmanagedParams[0].defaultDensity; }, + (s,p,l,v) => { s.UnmanagedParams[0].defaultDensity = v; } ), + new ParameterDefn("DefaultRestitution", "Bouncyness of an object" , + 0f, + (s,cf,p,v) => { s.UnmanagedParams[0].defaultRestitution = cf.GetFloat(p, v); }, + (s) => { return s.UnmanagedParams[0].defaultRestitution; }, + (s,p,l,v) => { s.UnmanagedParams[0].defaultRestitution = v; } ), + new ParameterDefn("CollisionMargin", "Margin around objects before collisions are calculated (must be zero!)", + 0.04f, + (s,cf,p,v) => { s.UnmanagedParams[0].collisionMargin = cf.GetFloat(p, v); }, + (s) => { return s.UnmanagedParams[0].collisionMargin; }, + (s,p,l,v) => { s.UnmanagedParams[0].collisionMargin = v; } ), + new ParameterDefn("Gravity", "Vertical force of gravity (negative means down)", + -9.80665f, + (s,cf,p,v) => { s.UnmanagedParams[0].gravity = cf.GetFloat(p, v); }, + (s) => { return s.UnmanagedParams[0].gravity; }, + (s,p,l,v) => { s.UpdateParameterObject((x)=>{s.UnmanagedParams[0].gravity=x;}, p, PhysParameterEntry.APPLY_TO_NONE, v); }, + (s,o,v) => { BulletSimAPI.SetGravity2(s.World.ptr, new Vector3(0f,0f,v)); } ), + + + new ParameterDefn("LinearDamping", "Factor to damp linear movement per second (0.0 - 1.0)", + 0f, + (s,cf,p,v) => { LinearDamping = cf.GetFloat(p, v); }, + (s) => { return LinearDamping; }, + (s,p,l,v) => { s.UpdateParameterObject((x)=>{LinearDamping=x;}, p, l, v); }, + (s,o,v) => { BulletSimAPI.SetDamping2(o.PhysBody.ptr, v, AngularDamping); } ), + new ParameterDefn("AngularDamping", "Factor to damp angular movement per second (0.0 - 1.0)", + 0f, + (s,cf,p,v) => { AngularDamping = cf.GetFloat(p, v); }, + (s) => { return AngularDamping; }, + (s,p,l,v) => { s.UpdateParameterObject((x)=>{AngularDamping=x;}, p, l, v); }, + (s,o,v) => { BulletSimAPI.SetDamping2(o.PhysBody.ptr, LinearDamping, v); } ), + new ParameterDefn("DeactivationTime", "Seconds before considering an object potentially static", + 0.2f, + (s,cf,p,v) => { DeactivationTime = cf.GetFloat(p, v); }, + (s) => { return DeactivationTime; }, + (s,p,l,v) => { s.UpdateParameterObject((x)=>{DeactivationTime=x;}, p, l, v); }, + (s,o,v) => { BulletSimAPI.SetDeactivationTime2(o.PhysBody.ptr, v); } ), + new ParameterDefn("LinearSleepingThreshold", "Seconds to measure linear movement before considering static", + 0.8f, + (s,cf,p,v) => { LinearSleepingThreshold = cf.GetFloat(p, v); }, + (s) => { return LinearSleepingThreshold; }, + (s,p,l,v) => { s.UpdateParameterObject((x)=>{LinearSleepingThreshold=x;}, p, l, v); }, + (s,o,v) => { BulletSimAPI.SetSleepingThresholds2(o.PhysBody.ptr, v, v); } ), + new ParameterDefn("AngularSleepingThreshold", "Seconds to measure angular movement before considering static", + 1.0f, + (s,cf,p,v) => { AngularSleepingThreshold = cf.GetFloat(p, v); }, + (s) => { return AngularSleepingThreshold; }, + (s,p,l,v) => { s.UpdateParameterObject((x)=>{AngularSleepingThreshold=x;}, p, l, v); }, + (s,o,v) => { BulletSimAPI.SetSleepingThresholds2(o.PhysBody.ptr, v, v); } ), + new ParameterDefn("CcdMotionThreshold", "Continuious collision detection threshold (0 means no CCD)" , + 0f, // set to zero to disable + (s,cf,p,v) => { CcdMotionThreshold = cf.GetFloat(p, v); }, + (s) => { return CcdMotionThreshold; }, + (s,p,l,v) => { s.UpdateParameterObject((x)=>{CcdMotionThreshold=x;}, p, l, v); }, + (s,o,v) => { BulletSimAPI.SetCcdMotionThreshold2(o.PhysBody.ptr, v); } ), + new ParameterDefn("CcdSweptSphereRadius", "Continuious collision detection test radius" , + 0f, + (s,cf,p,v) => { CcdSweptSphereRadius = cf.GetFloat(p, v); }, + (s) => { return CcdSweptSphereRadius; }, + (s,p,l,v) => { s.UpdateParameterObject((x)=>{CcdSweptSphereRadius=x;}, p, l, v); }, + (s,o,v) => { BulletSimAPI.SetCcdSweptSphereRadius2(o.PhysBody.ptr, v); } ), + new ParameterDefn("ContactProcessingThreshold", "Distance between contacts before doing collision check" , + 0.1f, + (s,cf,p,v) => { ContactProcessingThreshold = cf.GetFloat(p, v); }, + (s) => { return ContactProcessingThreshold; }, + (s,p,l,v) => { s.UpdateParameterObject((x)=>{ContactProcessingThreshold=x;}, p, l, v); }, + (s,o,v) => { BulletSimAPI.SetContactProcessingThreshold2(o.PhysBody.ptr, v); } ), + + new ParameterDefn("TerrainImplementation", "Type of shape to use for terrain (0=heightmap, 1=mesh)", + (float)BSTerrainPhys.TerrainImplementation.Mesh, + (s,cf,p,v) => { TerrainImplementation = cf.GetFloat(p,v); }, + (s) => { return TerrainImplementation; }, + (s,p,l,v) => { TerrainImplementation = v; } ), + new ParameterDefn("TerrainFriction", "Factor to reduce movement against terrain surface" , + 0.3f, + (s,cf,p,v) => { TerrainFriction = cf.GetFloat(p, v); }, + (s) => { return TerrainFriction; }, + (s,p,l,v) => { TerrainFriction = v; /* TODO: set on real terrain */} ), + new ParameterDefn("TerrainHitFraction", "Distance to measure hit collisions" , + 0.8f, + (s,cf,p,v) => { TerrainHitFraction = cf.GetFloat(p, v); }, + (s) => { return TerrainHitFraction; }, + (s,p,l,v) => { TerrainHitFraction = v; /* TODO: set on real terrain */ } ), + new ParameterDefn("TerrainRestitution", "Bouncyness" , + 0f, + (s,cf,p,v) => { TerrainRestitution = cf.GetFloat(p, v); }, + (s) => { return TerrainRestitution; }, + (s,p,l,v) => { TerrainRestitution = v; /* TODO: set on real terrain */ } ), + new ParameterDefn("TerrainCollisionMargin", "Margin where collision checking starts" , + 0.04f, + (s,cf,p,v) => { TerrainCollisionMargin = cf.GetFloat(p, v); }, + (s) => { return TerrainCollisionMargin; }, + (s,p,l,v) => { TerrainCollisionMargin = v; /* TODO: set on real terrain */ } ), + + new ParameterDefn("AvatarFriction", "Factor to reduce movement against an avatar. Changed on avatar recreation.", + 0.2f, + (s,cf,p,v) => { AvatarFriction = cf.GetFloat(p, v); }, + (s) => { return AvatarFriction; }, + (s,p,l,v) => { s.UpdateParameterObject((x)=>{AvatarFriction=x;}, p, l, v); } ), + new ParameterDefn("AvatarStandingFriction", "Avatar friction when standing. Changed on avatar recreation.", + 10.0f, + (s,cf,p,v) => { AvatarStandingFriction = cf.GetFloat(p, v); }, + (s) => { return AvatarStandingFriction; }, + (s,p,l,v) => { AvatarStandingFriction = v; } ), + new ParameterDefn("AvatarDensity", "Density of an avatar. Changed on avatar recreation.", + 60f, + (s,cf,p,v) => { AvatarDensity = cf.GetFloat(p, v); }, + (s) => { return AvatarDensity; }, + (s,p,l,v) => { s.UpdateParameterObject((x)=>{AvatarDensity=x;}, p, l, v); } ), + new ParameterDefn("AvatarRestitution", "Bouncyness. Changed on avatar recreation.", + 0f, + (s,cf,p,v) => { AvatarRestitution = cf.GetFloat(p, v); }, + (s) => { return AvatarRestitution; }, + (s,p,l,v) => { s.UpdateParameterObject((x)=>{AvatarRestitution=x;}, p, l, v); } ), + new ParameterDefn("AvatarCapsuleWidth", "The distance between the sides of the avatar capsule", + 0.6f, + (s,cf,p,v) => { AvatarCapsuleWidth = cf.GetFloat(p, v); }, + (s) => { return AvatarCapsuleWidth; }, + (s,p,l,v) => { s.UpdateParameterObject((x)=>{AvatarCapsuleWidth=x;}, p, l, v); } ), + new ParameterDefn("AvatarCapsuleDepth", "The distance between the front and back of the avatar capsule", + 0.45f, + (s,cf,p,v) => { AvatarCapsuleDepth = cf.GetFloat(p, v); }, + (s) => { return AvatarCapsuleDepth; }, + (s,p,l,v) => { s.UpdateParameterObject((x)=>{AvatarCapsuleDepth=x;}, p, l, v); } ), + new ParameterDefn("AvatarCapsuleHeight", "Default height of space around avatar", + 1.5f, + (s,cf,p,v) => { AvatarCapsuleHeight = cf.GetFloat(p, v); }, + (s) => { return AvatarCapsuleHeight; }, + (s,p,l,v) => { s.UpdateParameterObject((x)=>{AvatarCapsuleHeight=x;}, p, l, v); } ), + new ParameterDefn("AvatarContactProcessingThreshold", "Distance from capsule to check for collisions", + 0.1f, + (s,cf,p,v) => { AvatarContactProcessingThreshold = cf.GetFloat(p, v); }, + (s) => { return AvatarContactProcessingThreshold; }, + (s,p,l,v) => { s.UpdateParameterObject((x)=>{AvatarContactProcessingThreshold=x;}, p, l, v); } ), + + new ParameterDefn("VehicleAngularDamping", "Factor to damp vehicle angular movement per second (0.0 - 1.0)", + 0.95f, + (s,cf,p,v) => { VehicleAngularDamping = cf.GetFloat(p, v); }, + (s) => { return VehicleAngularDamping; }, + (s,p,l,v) => { VehicleAngularDamping = v; } ), + + new ParameterDefn("MaxPersistantManifoldPoolSize", "Number of manifolds pooled (0 means default of 4096)", + 0f, + (s,cf,p,v) => { s.UnmanagedParams[0].maxPersistantManifoldPoolSize = cf.GetFloat(p, v); }, + (s) => { return s.UnmanagedParams[0].maxPersistantManifoldPoolSize; }, + (s,p,l,v) => { s.UnmanagedParams[0].maxPersistantManifoldPoolSize = v; } ), + new ParameterDefn("MaxCollisionAlgorithmPoolSize", "Number of collisions pooled (0 means default of 4096)", + 0f, + (s,cf,p,v) => { s.UnmanagedParams[0].maxCollisionAlgorithmPoolSize = cf.GetFloat(p, v); }, + (s) => { return s.UnmanagedParams[0].maxCollisionAlgorithmPoolSize; }, + (s,p,l,v) => { s.UnmanagedParams[0].maxCollisionAlgorithmPoolSize = v; } ), + new ParameterDefn("ShouldDisableContactPoolDynamicAllocation", "Enable to allow large changes in object count", + ConfigurationParameters.numericFalse, + (s,cf,p,v) => { s.UnmanagedParams[0].shouldDisableContactPoolDynamicAllocation = BSParam.NumericBool(cf.GetBoolean(p, BSParam.BoolNumeric(v))); }, + (s) => { return s.UnmanagedParams[0].shouldDisableContactPoolDynamicAllocation; }, + (s,p,l,v) => { s.UnmanagedParams[0].shouldDisableContactPoolDynamicAllocation = v; } ), + new ParameterDefn("ShouldForceUpdateAllAabbs", "Enable to recomputer AABBs every simulator step", + ConfigurationParameters.numericFalse, + (s,cf,p,v) => { s.UnmanagedParams[0].shouldForceUpdateAllAabbs = BSParam.NumericBool(cf.GetBoolean(p, BSParam.BoolNumeric(v))); }, + (s) => { return s.UnmanagedParams[0].shouldForceUpdateAllAabbs; }, + (s,p,l,v) => { s.UnmanagedParams[0].shouldForceUpdateAllAabbs = v; } ), + new ParameterDefn("ShouldRandomizeSolverOrder", "Enable for slightly better stacking interaction", + ConfigurationParameters.numericTrue, + (s,cf,p,v) => { s.UnmanagedParams[0].shouldRandomizeSolverOrder = BSParam.NumericBool(cf.GetBoolean(p, BSParam.BoolNumeric(v))); }, + (s) => { return s.UnmanagedParams[0].shouldRandomizeSolverOrder; }, + (s,p,l,v) => { s.UnmanagedParams[0].shouldRandomizeSolverOrder = v; } ), + new ParameterDefn("ShouldSplitSimulationIslands", "Enable splitting active object scanning islands", + ConfigurationParameters.numericTrue, + (s,cf,p,v) => { s.UnmanagedParams[0].shouldSplitSimulationIslands = BSParam.NumericBool(cf.GetBoolean(p, BSParam.BoolNumeric(v))); }, + (s) => { return s.UnmanagedParams[0].shouldSplitSimulationIslands; }, + (s,p,l,v) => { s.UnmanagedParams[0].shouldSplitSimulationIslands = v; } ), + new ParameterDefn("ShouldEnableFrictionCaching", "Enable friction computation caching", + ConfigurationParameters.numericFalse, + (s,cf,p,v) => { s.UnmanagedParams[0].shouldEnableFrictionCaching = BSParam.NumericBool(cf.GetBoolean(p, BSParam.BoolNumeric(v))); }, + (s) => { return s.UnmanagedParams[0].shouldEnableFrictionCaching; }, + (s,p,l,v) => { s.UnmanagedParams[0].shouldEnableFrictionCaching = v; } ), + new ParameterDefn("NumberOfSolverIterations", "Number of internal iterations (0 means default)", + 0f, // zero says use Bullet default + (s,cf,p,v) => { s.UnmanagedParams[0].numberOfSolverIterations = cf.GetFloat(p, v); }, + (s) => { return s.UnmanagedParams[0].numberOfSolverIterations; }, + (s,p,l,v) => { s.UnmanagedParams[0].numberOfSolverIterations = v; } ), + + new ParameterDefn("LinksetImplementation", "Type of linkset implementation (0=Constraint, 1=Compound, 2=Manual)", + (float)BSLinkset.LinksetImplementation.Compound, + (s,cf,p,v) => { LinksetImplementation = cf.GetFloat(p,v); }, + (s) => { return LinksetImplementation; }, + (s,p,l,v) => { LinksetImplementation = v; } ), + new ParameterDefn("LinkConstraintUseFrameOffset", "For linksets built with constraints, enable frame offsetFor linksets built with constraints, enable frame offset.", + ConfigurationParameters.numericFalse, + (s,cf,p,v) => { LinkConstraintUseFrameOffset = BSParam.NumericBool(cf.GetBoolean(p, BSParam.BoolNumeric(v))); }, + (s) => { return LinkConstraintUseFrameOffset; }, + (s,p,l,v) => { LinkConstraintUseFrameOffset = v; } ), + new ParameterDefn("LinkConstraintEnableTransMotor", "Whether to enable translational motor on linkset constraints", + ConfigurationParameters.numericTrue, + (s,cf,p,v) => { LinkConstraintEnableTransMotor = BSParam.NumericBool(cf.GetBoolean(p, BSParam.BoolNumeric(v))); }, + (s) => { return LinkConstraintEnableTransMotor; }, + (s,p,l,v) => { LinkConstraintEnableTransMotor = v; } ), + new ParameterDefn("LinkConstraintTransMotorMaxVel", "Maximum velocity to be applied by translational motor in linkset constraints", + 5.0f, + (s,cf,p,v) => { LinkConstraintTransMotorMaxVel = cf.GetFloat(p, v); }, + (s) => { return LinkConstraintTransMotorMaxVel; }, + (s,p,l,v) => { LinkConstraintTransMotorMaxVel = v; } ), + new ParameterDefn("LinkConstraintTransMotorMaxForce", "Maximum force to be applied by translational motor in linkset constraints", + 0.1f, + (s,cf,p,v) => { LinkConstraintTransMotorMaxForce = cf.GetFloat(p, v); }, + (s) => { return LinkConstraintTransMotorMaxForce; }, + (s,p,l,v) => { LinkConstraintTransMotorMaxForce = v; } ), + new ParameterDefn("LinkConstraintCFM", "Amount constraint can be violated. 0=no violation, 1=infinite. Default=0.1", + 0.1f, + (s,cf,p,v) => { LinkConstraintCFM = cf.GetFloat(p, v); }, + (s) => { return LinkConstraintCFM; }, + (s,p,l,v) => { LinkConstraintCFM = v; } ), + new ParameterDefn("LinkConstraintERP", "Amount constraint is corrected each tick. 0=none, 1=all. Default = 0.2", + 0.1f, + (s,cf,p,v) => { LinkConstraintERP = cf.GetFloat(p, v); }, + (s) => { return LinkConstraintERP; }, + (s,p,l,v) => { LinkConstraintERP = v; } ), + new ParameterDefn("LinkConstraintSolverIterations", "Number of solver iterations when computing constraint. (0 = Bullet default)", + 40, + (s,cf,p,v) => { LinkConstraintSolverIterations = cf.GetFloat(p, v); }, + (s) => { return LinkConstraintSolverIterations; }, + (s,p,l,v) => { LinkConstraintSolverIterations = v; } ), + + new ParameterDefn("LogPhysicsStatisticsFrames", "Frames between outputting detailed phys stats. (0 is off)", + 0f, + (s,cf,p,v) => { s.UnmanagedParams[0].physicsLoggingFrames = cf.GetInt(p, (int)v); }, + (s) => { return (float)s.UnmanagedParams[0].physicsLoggingFrames; }, + (s,p,l,v) => { s.UnmanagedParams[0].physicsLoggingFrames = (int)v; } ), + }; + + // Convert a boolean to our numeric true and false values + public static float NumericBool(bool b) + { + return (b ? ConfigurationParameters.numericTrue : ConfigurationParameters.numericFalse); + } + + // Convert numeric true and false values to a boolean + public static bool BoolNumeric(float b) + { + return (b == ConfigurationParameters.numericTrue ? true : false); + } + + // Search through the parameter definitions and return the matching + // ParameterDefn structure. + // Case does not matter as names are compared after converting to lower case. + // Returns 'false' if the parameter is not found. + internal static bool TryGetParameter(string paramName, out ParameterDefn defn) + { + bool ret = false; + ParameterDefn foundDefn = new ParameterDefn(); + string pName = paramName.ToLower(); + + foreach (ParameterDefn parm in ParameterDefinitions) + { + if (pName == parm.name.ToLower()) + { + foundDefn = parm; + ret = true; + break; + } + } + defn = foundDefn; + return ret; + } + + // Pass through the settable parameters and set the default values + internal static void SetParameterDefaultValues(BSScene physicsScene) + { + foreach (ParameterDefn parm in ParameterDefinitions) + { + parm.setter(physicsScene, parm.name, PhysParameterEntry.APPLY_TO_NONE, parm.defaultValue); + } + } + + // Get user set values out of the ini file. + internal static void SetParameterConfigurationValues(BSScene physicsScene, IConfig cfg) + { + foreach (ParameterDefn parm in ParameterDefinitions) + { + parm.userParam(physicsScene, cfg, parm.name, parm.defaultValue); + } + } + + internal static PhysParameterEntry[] SettableParameters = new PhysParameterEntry[1]; + + // This creates an array in the correct format for returning the list of + // parameters. This is used by the 'list' option of the 'physics' command. + internal static void BuildParameterTable() + { + if (SettableParameters.Length < ParameterDefinitions.Length) + { + List entries = new List(); + for (int ii = 0; ii < ParameterDefinitions.Length; ii++) + { + ParameterDefn pd = ParameterDefinitions[ii]; + entries.Add(new PhysParameterEntry(pd.name, pd.desc)); + } + + // make the list in alphabetical order for estetic reasons + entries.Sort(delegate(PhysParameterEntry ppe1, PhysParameterEntry ppe2) + { + return ppe1.name.CompareTo(ppe2.name); + }); + + SettableParameters = entries.ToArray(); + } + } + + +} +} diff --git a/OpenSim/Region/Physics/BulletSNPlugin/BSPhysObject.cs b/OpenSim/Region/Physics/BulletSNPlugin/BSPhysObject.cs new file mode 100644 index 0000000000..4096ef8583 --- /dev/null +++ b/OpenSim/Region/Physics/BulletSNPlugin/BSPhysObject.cs @@ -0,0 +1,345 @@ +/* + * 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 copyrightD + * 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.Text; + +using OMV = OpenMetaverse; +using OpenSim.Framework; +using OpenSim.Region.Physics.Manager; + +namespace OpenSim.Region.Physics.BulletSNPlugin +{ +/* + * Class to wrap all objects. + * The rest of BulletSim doesn't need to keep checking for avatars or prims + * unless the difference is significant. + * + * Variables in the physicsl objects are in three forms: + * VariableName: used by the simulator and performs taint operations, etc + * RawVariableName: direct reference to the BulletSim storage for the variable value + * ForceVariableName: direct reference (store and fetch) to the value in the physics engine. + * The last two (and certainly the last one) should be referenced only in taint-time. + */ + +/* + * As of 20121221, the following are the call sequences (going down) for different script physical functions: + * llApplyImpulse llApplyRotImpulse llSetTorque llSetForce + * SOP.ApplyImpulse SOP.ApplyAngularImpulse SOP.SetAngularImpulse SOP.SetForce + * SOG.ApplyImpulse SOG.ApplyAngularImpulse SOG.SetAngularImpulse + * PA.AddForce PA.AddAngularForce PA.Torque = v PA.Force = v + * BS.ApplyCentralForce BS.ApplyTorque + */ + +public abstract class BSPhysObject : PhysicsActor +{ + protected BSPhysObject() + { + } + protected BSPhysObject(BSScene parentScene, uint localID, string name, string typeName) + { + PhysicsScene = parentScene; + LocalID = localID; + PhysObjectName = name; + TypeName = typeName; + + Linkset = BSLinkset.Factory(PhysicsScene, this); + LastAssetBuildFailed = false; + + // Default material type + Material = MaterialAttributes.Material.Wood; + + CollisionCollection = new CollisionEventUpdate(); + SubscribedEventsMs = 0; + CollidingStep = 0; + CollidingGroundStep = 0; + } + + // Tell the object to clean up. + public virtual void Destroy() + { + UnRegisterAllPreStepActions(); + } + + public BSScene PhysicsScene { get; protected set; } + // public override uint LocalID { get; set; } // Use the LocalID definition in PhysicsActor + public string PhysObjectName { get; protected set; } + public string TypeName { get; protected set; } + + public BSLinkset Linkset { get; set; } + public BSLinksetInfo LinksetInfo { get; set; } + + // Return the object mass without calculating it or having side effects + public abstract float RawMass { get; } + // Set the raw mass but also update physical mass properties (inertia, ...) + public abstract void UpdatePhysicalMassProperties(float mass); + + // The last value calculated for the prim's inertia + public OMV.Vector3 Inertia { get; set; } + + // Reference to the physical body (btCollisionObject) of this object + public BulletBody PhysBody; + // Reference to the physical shape (btCollisionShape) of this object + public BulletShape PhysShape; + + // 'true' if the mesh's underlying asset failed to build. + // This will keep us from looping after the first time the build failed. + public bool LastAssetBuildFailed { get; set; } + + // The objects base shape information. Null if not a prim type shape. + public PrimitiveBaseShape BaseShape { get; protected set; } + // Some types of objects have preferred physical representations. + // Returns SHAPE_UNKNOWN if there is no preference. + public virtual BSPhysicsShapeType PreferredPhysicalShape + { + get { return BSPhysicsShapeType.SHAPE_UNKNOWN; } + } + + // When the physical properties are updated, an EntityProperty holds the update values. + // Keep the current and last EntityProperties to enable computation of differences + // between the current update and the previous values. + public EntityProperties CurrentEntityProperties { get; set; } + public EntityProperties LastEntityProperties { get; set; } + + public virtual OMV.Vector3 Scale { get; set; } + public abstract bool IsSolid { get; } + public abstract bool IsStatic { get; } + + // Materialness + public MaterialAttributes.Material Material { get; private set; } + public override void SetMaterial(int material) + { + Material = (MaterialAttributes.Material)material; + } + + // Stop all physical motion. + public abstract void ZeroMotion(bool inTaintTime); + public abstract void ZeroAngularMotion(bool inTaintTime); + + // Step the vehicle simulation for this object. A NOOP if the vehicle was not configured. + public virtual void StepVehicle(float timeStep) { } + + // Update the physical location and motion of the object. Called with data from Bullet. + public abstract void UpdateProperties(EntityProperties entprop); + + public abstract OMV.Vector3 RawPosition { get; set; } + public abstract OMV.Vector3 ForcePosition { get; set; } + + public abstract OMV.Quaternion RawOrientation { get; set; } + public abstract OMV.Quaternion ForceOrientation { get; set; } + + // The system is telling us the velocity it wants to move at. + // protected OMV.Vector3 m_targetVelocity; // use the definition in PhysicsActor + public override OMV.Vector3 TargetVelocity + { + get { return m_targetVelocity; } + set + { + m_targetVelocity = value; + Velocity = value; + } + } + public abstract OMV.Vector3 ForceVelocity { get; set; } + + public abstract OMV.Vector3 ForceRotationalVelocity { get; set; } + + public abstract float ForceBuoyancy { get; set; } + + public virtual bool ForceBodyShapeRebuild(bool inTaintTime) { return false; } + + #region Collisions + + // Requested number of milliseconds between collision events. Zero means disabled. + protected int SubscribedEventsMs { get; set; } + // Given subscription, the time that a collision may be passed up + protected int NextCollisionOkTime { get; set; } + // The simulation step that last had a collision + protected long CollidingStep { get; set; } + // The simulation step that last had a collision with the ground + protected long CollidingGroundStep { get; set; } + // The collision flags we think are set in Bullet + protected CollisionFlags CurrentCollisionFlags { get; set; } + + // The collisions that have been collected this tick + protected CollisionEventUpdate CollisionCollection; + + // The simulation step is telling this object about a collision. + // Return 'true' if a collision was processed and should be sent up. + // Called at taint time from within the Step() function + public virtual bool Collide(uint collidingWith, BSPhysObject collidee, + OMV.Vector3 contactPoint, OMV.Vector3 contactNormal, float pentrationDepth) + { + bool ret = false; + + // The following lines make IsColliding() and IsCollidingGround() work + CollidingStep = PhysicsScene.SimulationStep; + if (collidingWith <= PhysicsScene.TerrainManager.HighestTerrainID) + { + CollidingGroundStep = PhysicsScene.SimulationStep; + } + + // prims in the same linkset cannot collide with each other + if (collidee != null && (this.Linkset.LinksetID == collidee.Linkset.LinksetID)) + { + return ret; + } + + // if someone has subscribed for collision events.... + if (SubscribedEvents()) { + CollisionCollection.AddCollider(collidingWith, new ContactPoint(contactPoint, contactNormal, pentrationDepth)); + DetailLog("{0},{1}.Collison.AddCollider,call,with={2},point={3},normal={4},depth={5}", + LocalID, TypeName, collidingWith, contactPoint, contactNormal, pentrationDepth); + + ret = true; + } + return ret; + } + + // Send the collected collisions into the simulator. + // Called at taint time from within the Step() function thus no locking problems + // with CollisionCollection and ObjectsWithNoMoreCollisions. + // Return 'true' if there were some actual collisions passed up + public virtual bool SendCollisions() + { + bool ret = true; + // If the 'no collision' call, force it to happen right now so quick collision_end + bool force = (CollisionCollection.Count == 0); + + // throttle the collisions to the number of milliseconds specified in the subscription + if (force || (PhysicsScene.SimulationNowTime >= NextCollisionOkTime)) + { + NextCollisionOkTime = PhysicsScene.SimulationNowTime + SubscribedEventsMs; + + // We are called if we previously had collisions. If there are no collisions + // this time, send up one last empty event so OpenSim can sense collision end. + if (CollisionCollection.Count == 0) + { + // If I have no collisions this time, remove me from the list of objects with collisions. + ret = false; + } + + // DetailLog("{0},{1}.SendCollisionUpdate,call,numCollisions={2}", LocalID, TypeName, CollisionCollection.Count); + base.SendCollisionUpdate(CollisionCollection); + + // The CollisionCollection instance is passed around in the simulator. + // Make sure we don't have a handle to that one and that a new one is used for next time. + // This fixes an interesting 'gotcha'. If we call CollisionCollection.Clear() here, + // a race condition is created for the other users of this instance. + CollisionCollection = new CollisionEventUpdate(); + } + return ret; + } + + // Subscribe for collision events. + // Parameter is the millisecond rate the caller wishes collision events to occur. + public override void SubscribeEvents(int ms) { + // DetailLog("{0},{1}.SubscribeEvents,subscribing,ms={2}", LocalID, TypeName, ms); + SubscribedEventsMs = ms; + if (ms > 0) + { + // make sure first collision happens + NextCollisionOkTime = Util.EnvironmentTickCountSubtract(SubscribedEventsMs); + + PhysicsScene.TaintedObject(TypeName+".SubscribeEvents", delegate() + { + if (PhysBody.HasPhysicalBody) + CurrentCollisionFlags = BulletSimAPI.AddToCollisionFlags2(PhysBody.ptr, CollisionFlags.BS_SUBSCRIBE_COLLISION_EVENTS); + }); + } + else + { + // Subscribing for zero or less is the same as unsubscribing + UnSubscribeEvents(); + } + } + public override void UnSubscribeEvents() { + // DetailLog("{0},{1}.UnSubscribeEvents,unsubscribing", LocalID, TypeName); + SubscribedEventsMs = 0; + PhysicsScene.TaintedObject(TypeName+".UnSubscribeEvents", delegate() + { + // Make sure there is a body there because sometimes destruction happens in an un-ideal order. + if (PhysBody.HasPhysicalBody) + CurrentCollisionFlags = BulletSimAPI.RemoveFromCollisionFlags2(PhysBody.ptr, CollisionFlags.BS_SUBSCRIBE_COLLISION_EVENTS); + }); + } + // Return 'true' if the simulator wants collision events + public override bool SubscribedEvents() { + return (SubscribedEventsMs > 0); + } + + #endregion // Collisions + + #region Per Simulation Step actions + // There are some actions that must be performed for a physical object before each simulation step. + // These actions are optional so, rather than scanning all the physical objects and asking them + // if they have anything to do, a physical object registers for an event call before the step is performed. + // This bookkeeping makes it easy to add, remove and clean up after all these registrations. + private Dictionary RegisteredActions = new Dictionary(); + protected void RegisterPreStepAction(string op, uint id, BSScene.PreStepAction actn) + { + string identifier = op + "-" + id.ToString(); + RegisteredActions[identifier] = actn; + PhysicsScene.BeforeStep += actn; + DetailLog("{0},BSPhysObject.RegisterPreStepAction,id={1}", LocalID, identifier); + } + + // Unregister a pre step action. Safe to call if the action has not been registered. + protected void UnRegisterPreStepAction(string op, uint id) + { + string identifier = op + "-" + id.ToString(); + bool removed = false; + if (RegisteredActions.ContainsKey(identifier)) + { + PhysicsScene.BeforeStep -= RegisteredActions[identifier]; + RegisteredActions.Remove(identifier); + removed = true; + } + DetailLog("{0},BSPhysObject.UnRegisterPreStepAction,id={1},removed={2}", LocalID, identifier, removed); + } + + protected void UnRegisterAllPreStepActions() + { + foreach (KeyValuePair kvp in RegisteredActions) + { + PhysicsScene.BeforeStep -= kvp.Value; + } + RegisteredActions.Clear(); + DetailLog("{0},BSPhysObject.UnRegisterAllPreStepActions,", LocalID); + } + + + #endregion // Per Simulation Step actions + + // High performance detailed logging routine used by the physical objects. + protected void DetailLog(string msg, params Object[] args) + { + if (PhysicsScene.PhysicsLogging.Enabled) + PhysicsScene.DetailLog(msg, args); + } + +} +} diff --git a/OpenSim/Region/Physics/BulletSNPlugin/BSPlugin.cs b/OpenSim/Region/Physics/BulletSNPlugin/BSPlugin.cs new file mode 100644 index 0000000000..75963ee5e5 --- /dev/null +++ b/OpenSim/Region/Physics/BulletSNPlugin/BSPlugin.cs @@ -0,0 +1,81 @@ +/* + * 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 copyrightD + * 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 OpenSim.Framework; +using OpenSim.Region.Physics.Manager; +using OpenMetaverse; + +namespace OpenSim.Region.Physics.BulletSNPlugin +{ + /// + /// Entry for a port of Bullet (http://bulletphysics.org/) to OpenSim. + /// This module interfaces to an unmanaged C++ library which makes the + /// actual calls into the Bullet physics engine. + /// The unmanaged library is found in opensim-libs::trunk/unmanaged/BulletSim/. + /// The unmanaged library is compiled and linked statically with Bullet + /// to create BulletSim.dll and libBulletSim.so (for both 32 and 64 bit). + /// +public class BSPlugin : IPhysicsPlugin +{ + //private static readonly log4net.ILog m_log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); + + private BSScene _mScene; + + public BSPlugin() + { + } + + public bool Init() + { + return true; + } + + public PhysicsScene GetScene(String sceneIdentifier) + { + if (_mScene == null) + { + + // If not Windows, loading is performed by the + // Mono loader as specified in + // "bin/Physics/OpenSim.Region.Physics.BulletSNPlugin.dll.config". + + _mScene = new BSScene(sceneIdentifier); + } + return (_mScene); + } + + public string GetName() + { + return ("BulletSimN"); + } + + public void Dispose() + { + } +} +} diff --git a/OpenSim/Region/Physics/BulletSNPlugin/BSPrim.cs b/OpenSim/Region/Physics/BulletSNPlugin/BSPrim.cs new file mode 100644 index 0000000000..a889c2415f --- /dev/null +++ b/OpenSim/Region/Physics/BulletSNPlugin/BSPrim.cs @@ -0,0 +1,1467 @@ +/* + * 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 copyrightD + * 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 System.Collections.Generic; +using System.Xml; +using log4net; +using OMV = OpenMetaverse; +using OpenSim.Framework; +using OpenSim.Region.Physics.Manager; +using OpenSim.Region.Physics.ConvexDecompositionDotNet; + +namespace OpenSim.Region.Physics.BulletSNPlugin +{ + + [Serializable] +public sealed class BSPrim : BSPhysObject +{ + private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); + private static readonly string LogHeader = "[BULLETS PRIM]"; + + // _size is what the user passed. Scale is what we pass to the physics engine with the mesh. + private OMV.Vector3 _size; // the multiplier for each mesh dimension as passed by the user + + private bool _grabbed; + private bool _isSelected; + private bool _isVolumeDetect; + private OMV.Vector3 _position; + private float _mass; // the mass of this object + private float _density; + private OMV.Vector3 _force; + private OMV.Vector3 _velocity; + private OMV.Vector3 _torque; + private float _collisionScore; + private OMV.Vector3 _acceleration; + private OMV.Quaternion _orientation; + private int _physicsActorType; + private bool _isPhysical; + private bool _flying; + private float _friction; + private float _restitution; + private bool _setAlwaysRun; + private bool _throttleUpdates; + private bool _isColliding; + private bool _collidingGround; + private bool _collidingObj; + private bool _floatOnWater; + private OMV.Vector3 _rotationalVelocity; + private bool _kinematic; + private float _buoyancy; + + private BSDynamics _vehicle; + + private OMV.Vector3 _PIDTarget; + private bool _usePID; + private float _PIDTau; + private bool _useHoverPID; + private float _PIDHoverHeight; + private PIDHoverType _PIDHoverType; + private float _PIDHoverTao; + + public BSPrim(uint localID, String primName, BSScene parent_scene, OMV.Vector3 pos, OMV.Vector3 size, + OMV.Quaternion rotation, PrimitiveBaseShape pbs, bool pisPhysical) + : base(parent_scene, localID, primName, "BSPrim") + { + // m_log.DebugFormat("{0}: BSPrim creation of {1}, id={2}", LogHeader, primName, localID); + _physicsActorType = (int)ActorTypes.Prim; + _position = pos; + _size = size; + Scale = size; // prims are the size the user wants them to be (different for BSCharactes). + _orientation = rotation; + _buoyancy = 1f; + _velocity = OMV.Vector3.Zero; + _rotationalVelocity = OMV.Vector3.Zero; + BaseShape = pbs; + _isPhysical = pisPhysical; + _isVolumeDetect = false; + + // Someday set default attributes based on the material but, for now, we don't know the prim material yet. + // MaterialAttributes primMat = BSMaterials.GetAttributes(Material, pisPhysical); + _density = PhysicsScene.Params.defaultDensity; + _friction = PhysicsScene.Params.defaultFriction; + _restitution = PhysicsScene.Params.defaultRestitution; + + _vehicle = new BSDynamics(PhysicsScene, this); // add vehicleness + + _mass = CalculateMass(); + + // No body or shape yet + PhysBody = new BulletBody(LocalID); + PhysShape = new BulletShape(); + + DetailLog("{0},BSPrim.constructor,call", LocalID); + // do the actual object creation at taint time + PhysicsScene.TaintedObject("BSPrim.create", delegate() + { + CreateGeomAndObject(true); + + CurrentCollisionFlags = BulletSimAPI.GetCollisionFlags2(PhysBody.ptr); + }); + } + + // called when this prim is being destroyed and we should free all the resources + public override void Destroy() + { + // m_log.DebugFormat("{0}: Destroy, id={1}", LogHeader, LocalID); + base.Destroy(); + + // Undo any links between me and any other object + BSPhysObject parentBefore = Linkset.LinksetRoot; + int childrenBefore = Linkset.NumberOfChildren; + + Linkset = Linkset.RemoveMeFromLinkset(this); + + DetailLog("{0},BSPrim.Destroy,call,parentBefore={1},childrenBefore={2},parentAfter={3},childrenAfter={4}", + LocalID, parentBefore.LocalID, childrenBefore, Linkset.LinksetRoot.LocalID, Linkset.NumberOfChildren); + + // Undo any vehicle properties + this.VehicleType = (int)Vehicle.TYPE_NONE; + + PhysicsScene.TaintedObject("BSPrim.destroy", delegate() + { + DetailLog("{0},BSPrim.Destroy,taint,", LocalID); + // If there are physical body and shape, release my use of same. + PhysicsScene.Shapes.DereferenceBody(PhysBody, true, null); + PhysBody.Clear(); + PhysicsScene.Shapes.DereferenceShape(PhysShape, true, null); + PhysShape.Clear(); + }); + } + + // No one uses this property. + public override bool Stopped { + get { return false; } + } + public override OMV.Vector3 Size { + get { return _size; } + set { + // We presume the scale and size are the same. If scale must be changed for + // the physical shape, that is done when the geometry is built. + _size = value; + Scale = _size; + ForceBodyShapeRebuild(false); + } + } + + public override PrimitiveBaseShape Shape { + set { + BaseShape = value; + ForceBodyShapeRebuild(false); + } + } + // Whatever the linkset wants is what I want. + public override BSPhysicsShapeType PreferredPhysicalShape + { get { return Linkset.PreferredPhysicalShape(this); } } + + public override bool ForceBodyShapeRebuild(bool inTaintTime) + { + LastAssetBuildFailed = false; + PhysicsScene.TaintedObject(inTaintTime, "BSPrim.ForceBodyShapeRebuild", delegate() + { + _mass = CalculateMass(); // changing the shape changes the mass + CreateGeomAndObject(true); + }); + return true; + } + public override bool Grabbed { + set { _grabbed = value; + } + } + public override bool Selected { + set + { + if (value != _isSelected) + { + _isSelected = value; + PhysicsScene.TaintedObject("BSPrim.setSelected", delegate() + { + DetailLog("{0},BSPrim.selected,taint,selected={1}", LocalID, _isSelected); + SetObjectDynamic(false); + }); + } + } + } + public override void CrossingFailure() { return; } + + // link me to the specified parent + public override void link(PhysicsActor obj) { + BSPrim parent = obj as BSPrim; + if (parent != null) + { + BSPhysObject parentBefore = Linkset.LinksetRoot; + int childrenBefore = Linkset.NumberOfChildren; + + Linkset = parent.Linkset.AddMeToLinkset(this); + + DetailLog("{0},BSPrim.link,call,parentBefore={1}, childrenBefore=={2}, parentAfter={3}, childrenAfter={4}", + LocalID, parentBefore.LocalID, childrenBefore, Linkset.LinksetRoot.LocalID, Linkset.NumberOfChildren); + } + return; + } + + // delink me from my linkset + public override void delink() { + // TODO: decide if this parent checking needs to happen at taint time + // Race condition here: if link() and delink() in same simulation tick, the delink will not happen + + BSPhysObject parentBefore = Linkset.LinksetRoot; + int childrenBefore = Linkset.NumberOfChildren; + + Linkset = Linkset.RemoveMeFromLinkset(this); + + DetailLog("{0},BSPrim.delink,parentBefore={1},childrenBefore={2},parentAfter={3},childrenAfter={4}, ", + LocalID, parentBefore.LocalID, childrenBefore, Linkset.LinksetRoot.LocalID, Linkset.NumberOfChildren); + return; + } + + // Set motion values to zero. + // Do it to the properties so the values get set in the physics engine. + // Push the setting of the values to the viewer. + // Called at taint time! + public override void ZeroMotion(bool inTaintTime) + { + _velocity = OMV.Vector3.Zero; + _acceleration = OMV.Vector3.Zero; + _rotationalVelocity = OMV.Vector3.Zero; + + // Zero some other properties in the physics engine + PhysicsScene.TaintedObject(inTaintTime, "BSPrim.ZeroMotion", delegate() + { + if (PhysBody.HasPhysicalBody) + BulletSimAPI.ClearAllForces2(PhysBody.ptr); + }); + } + public override void ZeroAngularMotion(bool inTaintTime) + { + _rotationalVelocity = OMV.Vector3.Zero; + // Zero some other properties in the physics engine + PhysicsScene.TaintedObject(inTaintTime, "BSPrim.ZeroMotion", delegate() + { + // DetailLog("{0},BSPrim.ZeroAngularMotion,call,rotVel={1}", LocalID, _rotationalVelocity); + if (PhysBody.HasPhysicalBody) + { + BulletSimAPI.SetInterpolationAngularVelocity2(PhysBody.ptr, _rotationalVelocity); + BulletSimAPI.SetAngularVelocity2(PhysBody.ptr, _rotationalVelocity); + } + }); + } + + public override void LockAngularMotion(OMV.Vector3 axis) + { + DetailLog("{0},BSPrim.LockAngularMotion,call,axis={1}", LocalID, axis); + return; + } + + public override OMV.Vector3 RawPosition + { + get { return _position; } + set { _position = value; } + } + public override OMV.Vector3 Position { + get { + /* NOTE: this refetch is not necessary. The simulator knows about linkset children + * and does not fetch this position info for children. Thus this is commented out. + // child prims move around based on their parent. Need to get the latest location + if (!Linkset.IsRoot(this)) + _position = Linkset.PositionGet(this); + */ + + // don't do the GetObjectPosition for root elements because this function is called a zillion times. + // _position = BulletSimAPI.GetObjectPosition2(PhysicsScene.World.ptr, BSBody.ptr); + return _position; + } + set { + // If the position must be forced into the physics engine, use ForcePosition. + // All positions are given in world positions. + if (_position == value) + { + DetailLog("{0},BSPrim.setPosition,taint,positionNotChanging,pos={1},orient={2}", LocalID, _position, _orientation); + return; + } + _position = value; + PositionSanityCheck(false); + + // A linkset might need to know if a component information changed. + Linkset.UpdateProperties(this, false); + + PhysicsScene.TaintedObject("BSPrim.setPosition", delegate() + { + DetailLog("{0},BSPrim.SetPosition,taint,pos={1},orient={2}", LocalID, _position, _orientation); + ForcePosition = _position; + }); + } + } + public override OMV.Vector3 ForcePosition { + get { + _position = BulletSimAPI.GetPosition2(PhysBody.ptr); + return _position; + } + set { + _position = value; + if (PhysBody.HasPhysicalBody) + { + BulletSimAPI.SetTranslation2(PhysBody.ptr, _position, _orientation); + ActivateIfPhysical(false); + } + } + } + + // Check that the current position is sane and, if not, modify the position to make it so. + // Check for being below terrain and being out of bounds. + // Returns 'true' of the position was made sane by some action. + private bool PositionSanityCheck(bool inTaintTime) + { + bool ret = false; + + if (!PhysicsScene.TerrainManager.IsWithinKnownTerrain(_position)) + { + // The physical object is out of the known/simulated area. + // Upper levels of code will handle the transition to other areas so, for + // the time, we just ignore the position. + return ret; + } + + float terrainHeight = PhysicsScene.TerrainManager.GetTerrainHeightAtXYZ(_position); + OMV.Vector3 upForce = OMV.Vector3.Zero; + if (RawPosition.Z < terrainHeight) + { + DetailLog("{0},BSPrim.PositionAdjustUnderGround,call,pos={1},terrain={2}", LocalID, _position, terrainHeight); + float targetHeight = terrainHeight + (Size.Z / 2f); + // Upforce proportional to the distance away from the terrain. Correct the error in 1 sec. + upForce.Z = (terrainHeight - RawPosition.Z) * 1f; + ret = true; + } + + if ((CurrentCollisionFlags & CollisionFlags.BS_FLOATS_ON_WATER) != 0) + { + float waterHeight = PhysicsScene.TerrainManager.GetWaterLevelAtXYZ(_position); + // TODO: a floating motor so object will bob in the water + if (Math.Abs(RawPosition.Z - waterHeight) > 0.1f) + { + // Upforce proportional to the distance away from the water. Correct the error in 1 sec. + upForce.Z = (waterHeight - RawPosition.Z) * 1f; + ret = true; + } + } + + // The above code computes a force to apply to correct any out-of-bounds problems. Apply same. + // TODO: This should be intergrated with a geneal physics action mechanism. + // TODO: This should be moderated with PID'ness. + if (ret) + { + // Apply upforce and overcome gravity. + OMV.Vector3 correctionForce = upForce - PhysicsScene.DefaultGravity; + DetailLog("{0},BSPrim.PositionSanityCheck,applyForce,pos={1},upForce={2},correctionForce={3}", LocalID, _position, upForce, correctionForce); + AddForce(correctionForce, false, inTaintTime); + } + return ret; + } + + // Return the effective mass of the object. + // If there are multiple items in the linkset, add them together for the root + public override float Mass + { + get + { + return Linkset.LinksetMass; + // return _mass; + } + } + + // used when we only want this prim's mass and not the linkset thing + public override float RawMass { + get { return _mass; } + } + // Set the physical mass to the passed mass. + // Note that this does not change _mass! + public override void UpdatePhysicalMassProperties(float physMass) + { + if (IsStatic) + { + Inertia = OMV.Vector3.Zero; + BulletSimAPI.SetMassProps2(PhysBody.ptr, 0f, Inertia); + BulletSimAPI.UpdateInertiaTensor2(PhysBody.ptr); + } + else + { + Inertia = BulletSimAPI.CalculateLocalInertia2(PhysShape.ptr, physMass); + BulletSimAPI.SetMassProps2(PhysBody.ptr, physMass, Inertia); + BulletSimAPI.UpdateInertiaTensor2(PhysBody.ptr); + // center of mass is at the zero of the object + // DEBUG DEBUG BulletSimAPI.SetCenterOfMassByPosRot2(PhysBody.ptr, ForcePosition, ForceOrientation); + DetailLog("{0},BSPrim.UpdateMassProperties,mass={1},localInertia={2}", LocalID, physMass, Inertia); + } + } + + // Is this used? + public override OMV.Vector3 CenterOfMass + { + get { return Linkset.CenterOfMass; } + } + + // Is this used? + public override OMV.Vector3 GeometricCenter + { + get { return Linkset.GeometricCenter; } + } + + public override OMV.Vector3 Force { + get { return _force; } + set { + _force = value; + if (_force != OMV.Vector3.Zero) + { + // If the force is non-zero, it must be reapplied each tick because + // Bullet clears the forces applied last frame. + RegisterPreStepAction("BSPrim.setForce", LocalID, + delegate(float timeStep) + { + DetailLog("{0},BSPrim.setForce,preStep,force={1}", LocalID, _force); + if (PhysBody.HasPhysicalBody) + { + BulletSimAPI.ApplyCentralForce2(PhysBody.ptr, _force); + ActivateIfPhysical(false); + } + } + ); + } + else + { + UnRegisterPreStepAction("BSPrim.setForce", LocalID); + } + } + } + + public override int VehicleType { + get { + return (int)_vehicle.Type; // if we are a vehicle, return that type + } + set { + Vehicle type = (Vehicle)value; + + PhysicsScene.TaintedObject("setVehicleType", delegate() + { + // Done at taint time so we're sure the physics engine is not using the variables + // Vehicle code changes the parameters for this vehicle type. + _vehicle.ProcessTypeChange(type); + ActivateIfPhysical(false); + + // If an active vehicle, register the vehicle code to be called before each step + if (_vehicle.Type == Vehicle.TYPE_NONE) + UnRegisterPreStepAction("BSPrim.Vehicle", LocalID); + else + RegisterPreStepAction("BSPrim.Vehicle", LocalID, _vehicle.Step); + }); + } + } + public override void VehicleFloatParam(int param, float value) + { + PhysicsScene.TaintedObject("BSPrim.VehicleFloatParam", delegate() + { + _vehicle.ProcessFloatVehicleParam((Vehicle)param, value); + ActivateIfPhysical(false); + }); + } + public override void VehicleVectorParam(int param, OMV.Vector3 value) + { + PhysicsScene.TaintedObject("BSPrim.VehicleVectorParam", delegate() + { + _vehicle.ProcessVectorVehicleParam((Vehicle)param, value); + ActivateIfPhysical(false); + }); + } + public override void VehicleRotationParam(int param, OMV.Quaternion rotation) + { + PhysicsScene.TaintedObject("BSPrim.VehicleRotationParam", delegate() + { + _vehicle.ProcessRotationVehicleParam((Vehicle)param, rotation); + ActivateIfPhysical(false); + }); + } + public override void VehicleFlags(int param, bool remove) + { + PhysicsScene.TaintedObject("BSPrim.VehicleFlags", delegate() + { + _vehicle.ProcessVehicleFlags(param, remove); + }); + } + + // Allows the detection of collisions with inherently non-physical prims. see llVolumeDetect for more + public override void SetVolumeDetect(int param) { + bool newValue = (param != 0); + if (_isVolumeDetect != newValue) + { + _isVolumeDetect = newValue; + PhysicsScene.TaintedObject("BSPrim.SetVolumeDetect", delegate() + { + // DetailLog("{0},setVolumeDetect,taint,volDetect={1}", LocalID, _isVolumeDetect); + SetObjectDynamic(true); + }); + } + return; + } + public override OMV.Vector3 Velocity { + get { return _velocity; } + set { + _velocity = value; + PhysicsScene.TaintedObject("BSPrim.setVelocity", delegate() + { + // DetailLog("{0},BSPrim.SetVelocity,taint,vel={1}", LocalID, _velocity); + ForceVelocity = _velocity; + }); + } + } + public override OMV.Vector3 ForceVelocity { + get { return _velocity; } + set { + PhysicsScene.AssertInTaintTime("BSPrim.ForceVelocity"); + + _velocity = value; + if (PhysBody.HasPhysicalBody) + { + BulletSimAPI.SetLinearVelocity2(PhysBody.ptr, _velocity); + ActivateIfPhysical(false); + } + } + } + public override OMV.Vector3 Torque { + get { return _torque; } + set { + _torque = value; + if (_torque != OMV.Vector3.Zero) + { + // If the torque is non-zero, it must be reapplied each tick because + // Bullet clears the forces applied last frame. + RegisterPreStepAction("BSPrim.setTorque", LocalID, + delegate(float timeStep) + { + if (PhysBody.HasPhysicalBody) + AddAngularForce(_torque, false, true); + } + ); + } + else + { + UnRegisterPreStepAction("BSPrim.setTorque", LocalID); + } + // DetailLog("{0},BSPrim.SetTorque,call,torque={1}", LocalID, _torque); + } + } + public override float CollisionScore { + get { return _collisionScore; } + set { _collisionScore = value; + } + } + public override OMV.Vector3 Acceleration { + get { return _acceleration; } + set { _acceleration = value; } + } + public override OMV.Quaternion RawOrientation + { + get { return _orientation; } + set { _orientation = value; } + } + public override OMV.Quaternion Orientation { + get { + /* NOTE: this refetch is not necessary. The simulator knows about linkset children + * and does not fetch this position info for children. Thus this is commented out. + // Children move around because tied to parent. Get a fresh value. + if (!Linkset.IsRoot(this)) + { + _orientation = Linkset.OrientationGet(this); + } + */ + return _orientation; + } + set { + if (_orientation == value) + return; + _orientation = value; + + // A linkset might need to know if a component information changed. + Linkset.UpdateProperties(this, false); + + PhysicsScene.TaintedObject("BSPrim.setOrientation", delegate() + { + if (PhysBody.HasPhysicalBody) + { + // _position = BulletSimAPI.GetObjectPosition2(PhysicsScene.World.ptr, BSBody.ptr); + // DetailLog("{0},BSPrim.setOrientation,taint,pos={1},orient={2}", LocalID, _position, _orientation); + BulletSimAPI.SetTranslation2(PhysBody.ptr, _position, _orientation); + } + }); + } + } + // Go directly to Bullet to get/set the value. + public override OMV.Quaternion ForceOrientation + { + get + { + _orientation = BulletSimAPI.GetOrientation2(PhysBody.ptr); + return _orientation; + } + set + { + _orientation = value; + BulletSimAPI.SetTranslation2(PhysBody.ptr, _position, _orientation); + } + } + public override int PhysicsActorType { + get { return _physicsActorType; } + set { _physicsActorType = value; } + } + public override bool IsPhysical { + get { return _isPhysical; } + set { + if (_isPhysical != value) + { + _isPhysical = value; + PhysicsScene.TaintedObject("BSPrim.setIsPhysical", delegate() + { + // DetailLog("{0},setIsPhysical,taint,isPhys={1}", LocalID, _isPhysical); + SetObjectDynamic(true); + // whether phys-to-static or static-to-phys, the object is not moving. + ZeroMotion(true); + }); + } + } + } + + // An object is static (does not move) if selected or not physical + public override bool IsStatic + { + get { return _isSelected || !IsPhysical; } + } + + // An object is solid if it's not phantom and if it's not doing VolumeDetect + public override bool IsSolid + { + get { return !IsPhantom && !_isVolumeDetect; } + } + + // Make gravity work if the object is physical and not selected + // Called at taint-time!! + private void SetObjectDynamic(bool forceRebuild) + { + // Recreate the physical object if necessary + CreateGeomAndObject(forceRebuild); + } + + // Convert the simulator's physical properties into settings on BulletSim objects. + // There are four flags we're interested in: + // IsStatic: Object does not move, otherwise the object has mass and moves + // isSolid: other objects bounce off of this object + // isVolumeDetect: other objects pass through but can generate collisions + // collisionEvents: whether this object returns collision events + private void UpdatePhysicalParameters() + { + // DetailLog("{0},BSPrim.UpdatePhysicalParameters,entry,body={1},shape={2}", LocalID, BSBody, BSShape); + + // Mangling all the physical properties requires the object not be in the physical world. + // This is a NOOP if the object is not in the world (BulletSim and Bullet ignore objects not found). + BulletSimAPI.RemoveObjectFromWorld2(PhysicsScene.World.ptr, PhysBody.ptr); + + // Set up the object physicalness (does gravity and collisions move this object) + MakeDynamic(IsStatic); + + // Update vehicle specific parameters (after MakeDynamic() so can change physical parameters) + _vehicle.Refresh(); + + // Arrange for collision events if the simulator wants them + EnableCollisions(SubscribedEvents()); + + // Make solid or not (do things bounce off or pass through this object). + MakeSolid(IsSolid); + + BulletSimAPI.AddObjectToWorld2(PhysicsScene.World.ptr, PhysBody.ptr, _position, _orientation); + + // Rebuild its shape + BulletSimAPI.UpdateSingleAabb2(PhysicsScene.World.ptr, PhysBody.ptr); + + // Collision filter can be set only when the object is in the world + PhysBody.ApplyCollisionMask(); + + // Recompute any linkset parameters. + // When going from non-physical to physical, this re-enables the constraints that + // had been automatically disabled when the mass was set to zero. + // For compound based linksets, this enables and disables interactions of the children. + Linkset.Refresh(this); + + DetailLog("{0},BSPrim.UpdatePhysicalParameters,taintExit,static={1},solid={2},mass={3},collide={4},cf={5:X},body={6},shape={7}", + LocalID, IsStatic, IsSolid, _mass, SubscribedEvents(), CurrentCollisionFlags, PhysBody, PhysShape); + } + + // "Making dynamic" means changing to and from static. + // When static, gravity does not effect the object and it is fixed in space. + // When dynamic, the object can fall and be pushed by others. + // This is independent of its 'solidness' which controls what passes through + // this object and what interacts with it. + private void MakeDynamic(bool makeStatic) + { + if (makeStatic) + { + // Become a Bullet 'static' object type + CurrentCollisionFlags = BulletSimAPI.AddToCollisionFlags2(PhysBody.ptr, CollisionFlags.CF_STATIC_OBJECT); + // Stop all movement + ZeroMotion(true); + + // Set various physical properties so other object interact properly + MaterialAttributes matAttrib = BSMaterials.GetAttributes(Material, false); + BulletSimAPI.SetFriction2(PhysBody.ptr, matAttrib.friction); + BulletSimAPI.SetRestitution2(PhysBody.ptr, matAttrib.restitution); + + // Mass is zero which disables a bunch of physics stuff in Bullet + UpdatePhysicalMassProperties(0f); + // Set collision detection parameters + if (BSParam.CcdMotionThreshold > 0f) + { + BulletSimAPI.SetCcdMotionThreshold2(PhysBody.ptr, BSParam.CcdMotionThreshold); + BulletSimAPI.SetCcdSweptSphereRadius2(PhysBody.ptr, BSParam.CcdSweptSphereRadius); + } + + // The activation state is 'disabled' so Bullet will not try to act on it. + // BulletSimAPI.ForceActivationState2(PhysBody.ptr, ActivationState.DISABLE_SIMULATION); + // Start it out sleeping and physical actions could wake it up. + BulletSimAPI.ForceActivationState2(PhysBody.ptr, ActivationState.ISLAND_SLEEPING); + + // This collides like a static object + PhysBody.collisionType = CollisionType.Static; + + // There can be special things needed for implementing linksets + Linkset.MakeStatic(this); + } + else + { + // Not a Bullet static object + CurrentCollisionFlags = BulletSimAPI.RemoveFromCollisionFlags2(PhysBody.ptr, CollisionFlags.CF_STATIC_OBJECT); + + // Set various physical properties so other object interact properly + MaterialAttributes matAttrib = BSMaterials.GetAttributes(Material, true); + BulletSimAPI.SetFriction2(PhysBody.ptr, matAttrib.friction); + BulletSimAPI.SetRestitution2(PhysBody.ptr, matAttrib.restitution); + + // per http://www.bulletphysics.org/Bullet/phpBB3/viewtopic.php?t=3382 + // Since this can be called multiple times, only zero forces when becoming physical + // BulletSimAPI.ClearAllForces2(BSBody.ptr); + + // For good measure, make sure the transform is set through to the motion state + BulletSimAPI.SetTranslation2(PhysBody.ptr, _position, _orientation); + + // Center of mass is at the center of the object + // DEBUG DEBUG BulletSimAPI.SetCenterOfMassByPosRot2(Linkset.LinksetRoot.PhysBody.ptr, _position, _orientation); + + // A dynamic object has mass + UpdatePhysicalMassProperties(RawMass); + + // Set collision detection parameters + if (BSParam.CcdMotionThreshold > 0f) + { + BulletSimAPI.SetCcdMotionThreshold2(PhysBody.ptr, BSParam.CcdMotionThreshold); + BulletSimAPI.SetCcdSweptSphereRadius2(PhysBody.ptr, BSParam.CcdSweptSphereRadius); + } + + // Various values for simulation limits + BulletSimAPI.SetDamping2(PhysBody.ptr, BSParam.LinearDamping, BSParam.AngularDamping); + BulletSimAPI.SetDeactivationTime2(PhysBody.ptr, BSParam.DeactivationTime); + BulletSimAPI.SetSleepingThresholds2(PhysBody.ptr, BSParam.LinearSleepingThreshold, BSParam.AngularSleepingThreshold); + BulletSimAPI.SetContactProcessingThreshold2(PhysBody.ptr, BSParam.ContactProcessingThreshold); + + // This collides like an object. + PhysBody.collisionType = CollisionType.Dynamic; + + // Force activation of the object so Bullet will act on it. + // Must do the ForceActivationState2() to overcome the DISABLE_SIMULATION from static objects. + BulletSimAPI.ForceActivationState2(PhysBody.ptr, ActivationState.ACTIVE_TAG); + + // There might be special things needed for implementing linksets. + Linkset.MakeDynamic(this); + } + } + + // "Making solid" means that other object will not pass through this object. + // To make transparent, we create a Bullet ghost object. + // Note: This expects to be called from the UpdatePhysicalParameters() routine as + // the functions after this one set up the state of a possibly newly created collision body. + private void MakeSolid(bool makeSolid) + { + CollisionObjectTypes bodyType = (CollisionObjectTypes)BulletSimAPI.GetBodyType2(PhysBody.ptr); + if (makeSolid) + { + // Verify the previous code created the correct shape for this type of thing. + if ((bodyType & CollisionObjectTypes.CO_RIGID_BODY) == 0) + { + m_log.ErrorFormat("{0} MakeSolid: physical body of wrong type for solidity. id={1}, type={2}", LogHeader, LocalID, bodyType); + } + CurrentCollisionFlags = BulletSimAPI.RemoveFromCollisionFlags2(PhysBody.ptr, CollisionFlags.CF_NO_CONTACT_RESPONSE); + } + else + { + if ((bodyType & CollisionObjectTypes.CO_GHOST_OBJECT) == 0) + { + m_log.ErrorFormat("{0} MakeSolid: physical body of wrong type for non-solidness. id={1}, type={2}", LogHeader, LocalID, bodyType); + } + CurrentCollisionFlags = BulletSimAPI.AddToCollisionFlags2(PhysBody.ptr, CollisionFlags.CF_NO_CONTACT_RESPONSE); + + // Change collision info from a static object to a ghosty collision object + PhysBody.collisionType = CollisionType.VolumeDetect; + } + } + + // Enable physical actions. Bullet will keep sleeping non-moving physical objects so + // they need waking up when parameters are changed. + // Called in taint-time!! + private void ActivateIfPhysical(bool forceIt) + { + if (IsPhysical && PhysBody.HasPhysicalBody) + BulletSimAPI.Activate2(PhysBody.ptr, forceIt); + } + + // Turn on or off the flag controlling whether collision events are returned to the simulator. + private void EnableCollisions(bool wantsCollisionEvents) + { + if (wantsCollisionEvents) + { + CurrentCollisionFlags = BulletSimAPI.AddToCollisionFlags2(PhysBody.ptr, CollisionFlags.BS_SUBSCRIBE_COLLISION_EVENTS); + } + else + { + CurrentCollisionFlags = BulletSimAPI.RemoveFromCollisionFlags2(PhysBody.ptr, CollisionFlags.BS_SUBSCRIBE_COLLISION_EVENTS); + } + } + + // prims don't fly + public override bool Flying { + get { return _flying; } + set { + _flying = value; + } + } + public override bool SetAlwaysRun { + get { return _setAlwaysRun; } + set { _setAlwaysRun = value; } + } + public override bool ThrottleUpdates { + get { return _throttleUpdates; } + set { _throttleUpdates = value; } + } + public override bool IsColliding { + get { return (CollidingStep == PhysicsScene.SimulationStep); } + set { _isColliding = value; } + } + public override bool CollidingGround { + get { return (CollidingGroundStep == PhysicsScene.SimulationStep); } + set { _collidingGround = value; } + } + public override bool CollidingObj { + get { return _collidingObj; } + set { _collidingObj = value; } + } + public bool IsPhantom { + get { + // SceneObjectPart removes phantom objects from the physics scene + // so, although we could implement touching and such, we never + // are invoked as a phantom object + return false; + } + } + public override bool FloatOnWater { + set { + _floatOnWater = value; + PhysicsScene.TaintedObject("BSPrim.setFloatOnWater", delegate() + { + if (_floatOnWater) + CurrentCollisionFlags = BulletSimAPI.AddToCollisionFlags2(PhysBody.ptr, CollisionFlags.BS_FLOATS_ON_WATER); + else + CurrentCollisionFlags = BulletSimAPI.RemoveFromCollisionFlags2(PhysBody.ptr, CollisionFlags.BS_FLOATS_ON_WATER); + }); + } + } + public override OMV.Vector3 RotationalVelocity { + get { + return _rotationalVelocity; + } + set { + _rotationalVelocity = value; + // m_log.DebugFormat("{0}: RotationalVelocity={1}", LogHeader, _rotationalVelocity); + PhysicsScene.TaintedObject("BSPrim.setRotationalVelocity", delegate() + { + DetailLog("{0},BSPrim.SetRotationalVel,taint,rotvel={1}", LocalID, _rotationalVelocity); + ForceRotationalVelocity = _rotationalVelocity; + }); + } + } + public override OMV.Vector3 ForceRotationalVelocity { + get { + return _rotationalVelocity; + } + set { + _rotationalVelocity = value; + if (PhysBody.HasPhysicalBody) + { + BulletSimAPI.SetAngularVelocity2(PhysBody.ptr, _rotationalVelocity); + ActivateIfPhysical(false); + } + } + } + public override bool Kinematic { + get { return _kinematic; } + set { _kinematic = value; + // m_log.DebugFormat("{0}: Kinematic={1}", LogHeader, _kinematic); + } + } + public override float Buoyancy { + get { return _buoyancy; } + set { + _buoyancy = value; + PhysicsScene.TaintedObject("BSPrim.setBuoyancy", delegate() + { + ForceBuoyancy = _buoyancy; + }); + } + } + public override float ForceBuoyancy { + get { return _buoyancy; } + set { + _buoyancy = value; + // DetailLog("{0},BSPrim.setForceBuoyancy,taint,buoy={1}", LocalID, _buoyancy); + // Buoyancy is faked by changing the gravity applied to the object + if (PhysBody.HasPhysicalBody) + { + float grav = PhysicsScene.Params.gravity * (1f - _buoyancy); + BulletSimAPI.SetGravity2(PhysBody.ptr, new OMV.Vector3(0f, 0f, grav)); + ActivateIfPhysical(false); + } + } + } + + // Used for MoveTo + public override OMV.Vector3 PIDTarget { + set { _PIDTarget = value; } + } + public override bool PIDActive { + set { _usePID = value; } + } + public override float PIDTau { + set { _PIDTau = value; } + } + + // Used for llSetHoverHeight and maybe vehicle height + // Hover Height will override MoveTo target's Z + public override bool PIDHoverActive { + set { _useHoverPID = value; } + } + public override float PIDHoverHeight { + set { _PIDHoverHeight = value; } + } + public override PIDHoverType PIDHoverType { + set { _PIDHoverType = value; } + } + public override float PIDHoverTau { + set { _PIDHoverTao = value; } + } + + // For RotLookAt + public override OMV.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(OMV.Vector3 force, bool pushforce) { + AddForce(force, pushforce, false); + } + // Applying a force just adds this to the total force on the object. + // This added force will only last the next simulation tick. + public void AddForce(OMV.Vector3 force, bool pushforce, bool inTaintTime) { + // for an object, doesn't matter if force is a pushforce or not + if (force.IsFinite()) + { + OMV.Vector3 addForce = force; + DetailLog("{0},BSPrim.addForce,call,force={1}", LocalID, addForce); + PhysicsScene.TaintedObject(inTaintTime, "BSPrim.AddForce", delegate() + { + // Bullet adds this central force to the total force for this tick + DetailLog("{0},BSPrim.addForce,taint,force={1}", LocalID, addForce); + if (PhysBody.HasPhysicalBody) + { + BulletSimAPI.ApplyCentralForce2(PhysBody.ptr, addForce); + ActivateIfPhysical(false); + } + }); + } + else + { + m_log.WarnFormat("{0}: Got a NaN force applied to a prim. LocalID={1}", LogHeader, LocalID); + return; + } + } + + public override void AddAngularForce(OMV.Vector3 force, bool pushforce) { + AddAngularForce(force, pushforce, false); + } + public void AddAngularForce(OMV.Vector3 force, bool pushforce, bool inTaintTime) + { + if (force.IsFinite()) + { + OMV.Vector3 angForce = force; + PhysicsScene.TaintedObject(inTaintTime, "BSPrim.AddAngularForce", delegate() + { + if (PhysBody.HasPhysicalBody) + { + BulletSimAPI.ApplyTorque2(PhysBody.ptr, angForce); + ActivateIfPhysical(false); + } + }); + } + else + { + m_log.WarnFormat("{0}: Got a NaN force applied to a prim. LocalID={1}", LogHeader, LocalID); + return; + } + } + + // A torque impulse. + // ApplyTorqueImpulse adds torque directly to the angularVelocity. + // AddAngularForce accumulates the force and applied it to the angular velocity all at once. + // Computed as: angularVelocity += impulse * inertia; + public void ApplyTorqueImpulse(OMV.Vector3 impulse, bool inTaintTime) + { + OMV.Vector3 applyImpulse = impulse; + PhysicsScene.TaintedObject(inTaintTime, "BSPrim.ApplyTorqueImpulse", delegate() + { + if (PhysBody.HasPhysicalBody) + { + BulletSimAPI.ApplyTorqueImpulse2(PhysBody.ptr, applyImpulse); + ActivateIfPhysical(false); + } + }); + } + + public override void SetMomentum(OMV.Vector3 momentum) { + // DetailLog("{0},BSPrim.SetMomentum,call,mom={1}", LocalID, momentum); + } + #region Mass Calculation + + private float CalculateMass() + { + float volume = _size.X * _size.Y * _size.Z; // default + float tmp; + + float returnMass = 0; + float hollowAmount = (float)BaseShape.ProfileHollow * 2.0e-5f; + float hollowVolume = hollowAmount * hollowAmount; + + switch (BaseShape.ProfileShape) + { + case ProfileShape.Square: + // default box + + if (BaseShape.PathCurve == (byte)Extrusion.Straight) + { + if (hollowAmount > 0.0) + { + switch (BaseShape.HollowShape) + { + case HollowShape.Square: + case HollowShape.Same: + break; + + case HollowShape.Circle: + + hollowVolume *= 0.78539816339f; + break; + + case HollowShape.Triangle: + + hollowVolume *= (0.5f * .5f); + break; + + default: + hollowVolume = 0; + break; + } + volume *= (1.0f - hollowVolume); + } + } + + else if (BaseShape.PathCurve == (byte)Extrusion.Curve1) + { + //a tube + + volume *= 0.78539816339e-2f * (float)(200 - BaseShape.PathScaleX); + tmp= 1.0f -2.0e-2f * (float)(200 - BaseShape.PathScaleY); + volume -= volume*tmp*tmp; + + if (hollowAmount > 0.0) + { + hollowVolume *= hollowAmount; + + switch (BaseShape.HollowShape) + { + case HollowShape.Square: + case HollowShape.Same: + break; + + case HollowShape.Circle: + hollowVolume *= 0.78539816339f;; + break; + + case HollowShape.Triangle: + hollowVolume *= 0.5f * 0.5f; + break; + default: + hollowVolume = 0; + break; + } + volume *= (1.0f - hollowVolume); + } + } + + break; + + case ProfileShape.Circle: + + if (BaseShape.PathCurve == (byte)Extrusion.Straight) + { + volume *= 0.78539816339f; // elipse base + + if (hollowAmount > 0.0) + { + switch (BaseShape.HollowShape) + { + case HollowShape.Same: + case HollowShape.Circle: + break; + + case HollowShape.Square: + hollowVolume *= 0.5f * 2.5984480504799f; + break; + + case HollowShape.Triangle: + hollowVolume *= .5f * 1.27323954473516f; + break; + + default: + hollowVolume = 0; + break; + } + volume *= (1.0f - hollowVolume); + } + } + + else if (BaseShape.PathCurve == (byte)Extrusion.Curve1) + { + volume *= 0.61685027506808491367715568749226e-2f * (float)(200 - BaseShape.PathScaleX); + tmp = 1.0f - .02f * (float)(200 - BaseShape.PathScaleY); + volume *= (1.0f - tmp * tmp); + + if (hollowAmount > 0.0) + { + + // calculate the hollow volume by it's shape compared to the prim shape + hollowVolume *= hollowAmount; + + switch (BaseShape.HollowShape) + { + case HollowShape.Same: + case HollowShape.Circle: + break; + + case HollowShape.Square: + hollowVolume *= 0.5f * 2.5984480504799f; + break; + + case HollowShape.Triangle: + hollowVolume *= .5f * 1.27323954473516f; + break; + + default: + hollowVolume = 0; + break; + } + volume *= (1.0f - hollowVolume); + } + } + break; + + case ProfileShape.HalfCircle: + if (BaseShape.PathCurve == (byte)Extrusion.Curve1) + { + volume *= 0.52359877559829887307710723054658f; + } + break; + + case ProfileShape.EquilateralTriangle: + + if (BaseShape.PathCurve == (byte)Extrusion.Straight) + { + volume *= 0.32475953f; + + if (hollowAmount > 0.0) + { + + // calculate the hollow volume by it's shape compared to the prim shape + switch (BaseShape.HollowShape) + { + case HollowShape.Same: + case HollowShape.Triangle: + hollowVolume *= .25f; + break; + + case HollowShape.Square: + hollowVolume *= 0.499849f * 3.07920140172638f; + break; + + case HollowShape.Circle: + // Hollow shape is a perfect cyllinder in respect to the cube's scale + // Cyllinder hollow volume calculation + + hollowVolume *= 0.1963495f * 3.07920140172638f; + break; + + default: + hollowVolume = 0; + break; + } + volume *= (1.0f - hollowVolume); + } + } + else if (BaseShape.PathCurve == (byte)Extrusion.Curve1) + { + volume *= 0.32475953f; + volume *= 0.01f * (float)(200 - BaseShape.PathScaleX); + tmp = 1.0f - .02f * (float)(200 - BaseShape.PathScaleY); + volume *= (1.0f - tmp * tmp); + + if (hollowAmount > 0.0) + { + + hollowVolume *= hollowAmount; + + switch (BaseShape.HollowShape) + { + case HollowShape.Same: + case HollowShape.Triangle: + hollowVolume *= .25f; + break; + + case HollowShape.Square: + hollowVolume *= 0.499849f * 3.07920140172638f; + break; + + case HollowShape.Circle: + + hollowVolume *= 0.1963495f * 3.07920140172638f; + break; + + default: + hollowVolume = 0; + break; + } + volume *= (1.0f - hollowVolume); + } + } + break; + + default: + break; + } + + + + float taperX1; + float taperY1; + float taperX; + float taperY; + float pathBegin; + float pathEnd; + float profileBegin; + float profileEnd; + + if (BaseShape.PathCurve == (byte)Extrusion.Straight || BaseShape.PathCurve == (byte)Extrusion.Flexible) + { + taperX1 = BaseShape.PathScaleX * 0.01f; + if (taperX1 > 1.0f) + taperX1 = 2.0f - taperX1; + taperX = 1.0f - taperX1; + + taperY1 = BaseShape.PathScaleY * 0.01f; + if (taperY1 > 1.0f) + taperY1 = 2.0f - taperY1; + taperY = 1.0f - taperY1; + } + else + { + taperX = BaseShape.PathTaperX * 0.01f; + if (taperX < 0.0f) + taperX = -taperX; + taperX1 = 1.0f - taperX; + + taperY = BaseShape.PathTaperY * 0.01f; + if (taperY < 0.0f) + taperY = -taperY; + taperY1 = 1.0f - taperY; + + } + + + volume *= (taperX1 * taperY1 + 0.5f * (taperX1 * taperY + taperX * taperY1) + 0.3333333333f * taperX * taperY); + + pathBegin = (float)BaseShape.PathBegin * 2.0e-5f; + pathEnd = 1.0f - (float)BaseShape.PathEnd * 2.0e-5f; + volume *= (pathEnd - pathBegin); + + // this is crude aproximation + profileBegin = (float)BaseShape.ProfileBegin * 2.0e-5f; + profileEnd = 1.0f - (float)BaseShape.ProfileEnd * 2.0e-5f; + volume *= (profileEnd - profileBegin); + + returnMass = _density * volume; + + /* Comment out code that computes the mass of the linkset. That is done in the Linkset class. + if (IsRootOfLinkset) + { + foreach (BSPrim prim in _childrenPrims) + { + returnMass += prim.CalculateMass(); + } + } + */ + + returnMass = Util.Clamp(returnMass, BSParam.MinimumObjectMass, BSParam.MaximumObjectMass); + + return returnMass; + }// end CalculateMass + #endregion Mass Calculation + + // Rebuild the geometry and object. + // This is called when the shape changes so we need to recreate the mesh/hull. + // Called at taint-time!!! + public void CreateGeomAndObject(bool forceRebuild) + { + // If this prim is part of a linkset, we must remove and restore the physical + // links if the body is rebuilt. + bool needToRestoreLinkset = false; + bool needToRestoreVehicle = false; + + // Create the correct physical representation for this type of object. + // Updates PhysBody and PhysShape with the new information. + // Ignore 'forceRebuild'. This routine makes the right choices and changes of necessary. + PhysicsScene.Shapes.GetBodyAndShape(false, PhysicsScene.World, this, null, delegate(BulletBody dBody) + { + // Called if the current prim body is about to be destroyed. + // Remove all the physical dependencies on the old body. + // (Maybe someday make the changing of BSShape an event to be subscribed to by BSLinkset, ...) + needToRestoreLinkset = Linkset.RemoveBodyDependencies(this); + needToRestoreVehicle = _vehicle.RemoveBodyDependencies(this); + }); + + if (needToRestoreLinkset) + { + // If physical body dependencies were removed, restore them + Linkset.RestoreBodyDependencies(this); + } + if (needToRestoreVehicle) + { + // If physical body dependencies were removed, restore them + _vehicle.RestoreBodyDependencies(this); + } + + // Make sure the properties are set on the new object + UpdatePhysicalParameters(); + return; + } + + // The physics engine says that properties have updated. Update same and inform + // the world that things have changed. + // TODO: do we really need to check for changed? Maybe just copy values and call RequestPhysicsterseUpdate() + enum UpdatedProperties { + Position = 1 << 0, + Rotation = 1 << 1, + Velocity = 1 << 2, + Acceleration = 1 << 3, + RotationalVel = 1 << 4 + } + + const float ROTATION_TOLERANCE = 0.01f; + const float VELOCITY_TOLERANCE = 0.001f; + const float POSITION_TOLERANCE = 0.05f; + const float ACCELERATION_TOLERANCE = 0.01f; + const float ROTATIONAL_VELOCITY_TOLERANCE = 0.01f; + + public override void UpdateProperties(EntityProperties entprop) + { + // Updates only for individual prims and for the root object of a linkset. + if (Linkset.IsRoot(this)) + { + // A temporary kludge to suppress the rotational effects introduced on vehicles by Bullet + // TODO: handle physics introduced by Bullet with computed vehicle physics. + if (_vehicle.IsActive) + { + entprop.RotationalVelocity = OMV.Vector3.Zero; + } + + // Assign directly to the local variables so the normal set action does not happen + _position = entprop.Position; + _orientation = entprop.Rotation; + _velocity = entprop.Velocity; + _acceleration = entprop.Acceleration; + _rotationalVelocity = entprop.RotationalVelocity; + + // The sanity check can change the velocity and/or position. + if (IsPhysical && PositionSanityCheck(true)) + { + entprop.Position = _position; + entprop.Velocity = _velocity; + } + + OMV.Vector3 direction = OMV.Vector3.UnitX * _orientation; // DEBUG DEBUG DEBUG + DetailLog("{0},BSPrim.UpdateProperties,call,pos={1},orient={2},dir={3},vel={4},rotVel={5}", + LocalID, _position, _orientation, direction, _velocity, _rotationalVelocity); + + // remember the current and last set values + LastEntityProperties = CurrentEntityProperties; + CurrentEntityProperties = entprop; + + base.RequestPhysicsterseUpdate(); + } + /* + else + { + // For debugging, report the movement of children + DetailLog("{0},BSPrim.UpdateProperties,child,pos={1},orient={2},vel={3},accel={4},rotVel={5}", + LocalID, entprop.Position, entprop.Rotation, entprop.Velocity, + entprop.Acceleration, entprop.RotationalVelocity); + } + */ + + // The linkset implimentation might want to know about this. + Linkset.UpdateProperties(this, true); + } +} +} diff --git a/OpenSim/Region/Physics/BulletSNPlugin/BSScene.cs b/OpenSim/Region/Physics/BulletSNPlugin/BSScene.cs new file mode 100644 index 0000000000..6bcea3f0fc --- /dev/null +++ b/OpenSim/Region/Physics/BulletSNPlugin/BSScene.cs @@ -0,0 +1,954 @@ +/* + * 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 copyrightD + * 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.Runtime.InteropServices; +using System.Text; +using System.Threading; +using OpenSim.Framework; +using OpenSim.Region.Framework; +using OpenSim.Region.CoreModules; +using Logging = OpenSim.Region.CoreModules.Framework.Statistics.Logging; +using OpenSim.Region.Physics.Manager; +using Nini.Config; +using log4net; +using OpenMetaverse; + +// TODOs for BulletSim (for BSScene, BSPrim, BSCharacter and BulletSim) +// Based on material, set density and friction +// More efficient memory usage when passing hull information from BSPrim to BulletSim +// Do attachments need to be handled separately? Need collision events. Do not collide with VolumeDetect +// Implement LockAngularMotion +// Add PID movement operations. What does ScenePresence.MoveToTarget do? +// Check terrain size. 128 or 127? +// Raycast +// +namespace OpenSim.Region.Physics.BulletSNPlugin +{ +public sealed class BSScene : PhysicsScene, IPhysicsParameters +{ + private static readonly ILog m_log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); + private static readonly string LogHeader = "[BULLETS SCENE]"; + + // The name of the region we're working for. + public string RegionName { get; private set; } + + public string BulletSimVersion = "?"; + + public Dictionary PhysObjects; + public BSShapeCollection Shapes; + + // Keeping track of the objects with collisions so we can report begin and end of a collision + public HashSet ObjectsWithCollisions = new HashSet(); + public HashSet ObjectsWithNoMoreCollisions = new HashSet(); + // Keep track of all the avatars so we can send them a collision event + // every tick so OpenSim will update its animation. + private HashSet m_avatars = new HashSet(); + + // let my minuions use my logger + public ILog Logger { get { return m_log; } } + + public IMesher mesher; + public uint WorldID { get; private set; } + public BulletSim World { get; private set; } + + // All the constraints that have been allocated in this instance. + public BSConstraintCollection Constraints { get; private set; } + + // Simulation parameters + internal int m_maxSubSteps; + internal float m_fixedTimeStep; + internal long m_simulationStep = 0; + public long SimulationStep { get { return m_simulationStep; } } + internal int m_taintsToProcessPerStep; + internal float LastTimeStep { get; private set; } + + // Physical objects can register for prestep or poststep events + public delegate void PreStepAction(float timeStep); + public delegate void PostStepAction(float timeStep); + public event PreStepAction BeforeStep; + public event PreStepAction AfterStep; + + // A value of the time now so all the collision and update routines do not have to get their own + // Set to 'now' just before all the prims and actors are called for collisions and updates + public int SimulationNowTime { get; private set; } + + // True if initialized and ready to do simulation steps + private bool m_initialized = false; + + // Flag which is true when processing taints. + // Not guaranteed to be correct all the time (don't depend on this) but good for debugging. + public bool InTaintTime { get; private set; } + + // Pinned memory used to pass step information between managed and unmanaged + internal int m_maxCollisionsPerFrame; + private List m_collisionArray; + //private GCHandle m_collisionArrayPinnedHandle; + + internal int m_maxUpdatesPerFrame; + private List m_updateArray; + //private GCHandle m_updateArrayPinnedHandle; + + + public const uint TERRAIN_ID = 0; // OpenSim senses terrain with a localID of zero + public const uint GROUNDPLANE_ID = 1; + public const uint CHILDTERRAIN_ID = 2; // Terrain allocated based on our mega-prim childre start here + + public float SimpleWaterLevel { get; set; } + public BSTerrainManager TerrainManager { get; private set; } + + public ConfigurationParameters Params + { + get { return UnmanagedParams[0]; } + } + public Vector3 DefaultGravity + { + get { return new Vector3(0f, 0f, Params.gravity); } + } + // Just the Z value of the gravity + public float DefaultGravityZ + { + get { return Params.gravity; } + } + + // When functions in the unmanaged code must be called, it is only + // done at a known time just before the simulation step. The taint + // system saves all these function calls and executes them in + // order before the simulation. + public delegate void TaintCallback(); + private struct TaintCallbackEntry + { + public String ident; + public TaintCallback callback; + public TaintCallbackEntry(string i, TaintCallback c) + { + ident = i; + callback = c; + } + } + private Object _taintLock = new Object(); // lock for using the next object + private List _taintOperations; + private Dictionary _postTaintOperations; + private List _postStepOperations; + + // A pointer to an instance if this structure is passed to the C++ code + // Used to pass basic configuration values to the unmanaged code. + internal ConfigurationParameters[] UnmanagedParams; + //GCHandle m_paramsHandle; + + // Handle to the callback used by the unmanaged code to call into the managed code. + // Used for debug logging. + // Need to store the handle in a persistant variable so it won't be freed. + private BulletSimAPI.DebugLogCallback m_DebugLogCallbackHandle; + + // Sometimes you just have to log everything. + public Logging.LogWriter PhysicsLogging; + private bool m_physicsLoggingEnabled; + private string m_physicsLoggingDir; + private string m_physicsLoggingPrefix; + private int m_physicsLoggingFileMinutes; + private bool m_physicsLoggingDoFlush; + // 'true' of the vehicle code is to log lots of details + public bool VehicleLoggingEnabled { get; private set; } + public bool VehiclePhysicalLoggingEnabled { get; private set; } + + #region Construction and Initialization + public BSScene(string identifier) + { + m_initialized = false; + // we are passed the name of the region we're working for. + RegionName = identifier; + } + + public override void Initialise(IMesher meshmerizer, IConfigSource config) + { + mesher = meshmerizer; + _taintOperations = new List(); + _postTaintOperations = new Dictionary(); + _postStepOperations = new List(); + PhysObjects = new Dictionary(); + Shapes = new BSShapeCollection(this); + + // Allocate pinned memory to pass parameters. + UnmanagedParams = new ConfigurationParameters[1]; + //m_paramsHandle = GCHandle.Alloc(UnmanagedParams, GCHandleType.Pinned); + + // Set default values for physics parameters plus any overrides from the ini file + GetInitialParameterValues(config); + + // allocate more pinned memory close to the above in an attempt to get the memory all together + m_collisionArray = new List(); + //m_collisionArrayPinnedHandle = GCHandle.Alloc(m_collisionArray, GCHandleType.Pinned); + m_updateArray = new List(); + //m_updateArrayPinnedHandle = GCHandle.Alloc(m_updateArray, GCHandleType.Pinned); + + // Enable very detailed logging. + // By creating an empty logger when not logging, the log message invocation code + // can be left in and every call doesn't have to check for null. + if (m_physicsLoggingEnabled) + { + PhysicsLogging = new Logging.LogWriter(m_physicsLoggingDir, m_physicsLoggingPrefix, m_physicsLoggingFileMinutes); + PhysicsLogging.ErrorLogger = m_log; // for DEBUG. Let's the logger output error messages. + } + else + { + PhysicsLogging = new Logging.LogWriter(); + } + + // If Debug logging level, enable logging from the unmanaged code + m_DebugLogCallbackHandle = null; + if (m_log.IsDebugEnabled || PhysicsLogging.Enabled) + { + m_log.DebugFormat("{0}: Initialize: Setting debug callback for unmanaged code", LogHeader); + if (PhysicsLogging.Enabled) + // The handle is saved in a variable to make sure it doesn't get freed after this call + m_DebugLogCallbackHandle = new BulletSimAPI.DebugLogCallback(BulletLoggerPhysLog); + else + m_DebugLogCallbackHandle = new BulletSimAPI.DebugLogCallback(BulletLogger); + } + + // Get the version of the DLL + // TODO: this doesn't work yet. Something wrong with marshaling the returned string. + // BulletSimVersion = BulletSimAPI.GetVersion(); + // m_log.WarnFormat("{0}: BulletSim.dll version='{1}'", LogHeader, BulletSimVersion); + + // The bounding box for the simulated world. The origin is 0,0,0 unless we're + // a child in a mega-region. + // Bullet actually doesn't care about the extents of the simulated + // area. It tracks active objects no matter where they are. + Vector3 worldExtent = new Vector3(Constants.RegionSize, Constants.RegionSize, Constants.RegionHeight); + + // m_log.DebugFormat("{0}: Initialize: Calling BulletSimAPI.Initialize.", LogHeader); + + World = new BulletSim(0, this, BulletSimAPI.Initialize2(worldExtent, UnmanagedParams, + m_maxCollisionsPerFrame, ref m_collisionArray, + m_maxUpdatesPerFrame,ref m_updateArray, + m_DebugLogCallbackHandle)); + + Constraints = new BSConstraintCollection(World); + + TerrainManager = new BSTerrainManager(this); + TerrainManager.CreateInitialGroundPlaneAndTerrain(); + + m_log.WarnFormat("{0} Linksets implemented with {1}", LogHeader, (BSLinkset.LinksetImplementation)BSParam.LinksetImplementation); + + InTaintTime = false; + m_initialized = true; + } + + // All default parameter values are set here. There should be no values set in the + // variable definitions. + private void GetInitialParameterValues(IConfigSource config) + { + ConfigurationParameters parms = new ConfigurationParameters(); + UnmanagedParams[0] = parms; + + BSParam.SetParameterDefaultValues(this); + + if (config != null) + { + // If there are specifications in the ini file, use those values + IConfig pConfig = config.Configs["BulletSim"]; + if (pConfig != null) + { + BSParam.SetParameterConfigurationValues(this, pConfig); + + // Very detailed logging for physics debugging + m_physicsLoggingEnabled = pConfig.GetBoolean("PhysicsLoggingEnabled", false); + m_physicsLoggingDir = pConfig.GetString("PhysicsLoggingDir", "."); + m_physicsLoggingPrefix = pConfig.GetString("PhysicsLoggingPrefix", "physics-%REGIONNAME%-"); + m_physicsLoggingFileMinutes = pConfig.GetInt("PhysicsLoggingFileMinutes", 5); + m_physicsLoggingDoFlush = pConfig.GetBoolean("PhysicsLoggingDoFlush", false); + // Very detailed logging for vehicle debugging + VehicleLoggingEnabled = pConfig.GetBoolean("VehicleLoggingEnabled", false); + VehiclePhysicalLoggingEnabled = pConfig.GetBoolean("VehiclePhysicalLoggingEnabled", false); + + // Do any replacements in the parameters + m_physicsLoggingPrefix = m_physicsLoggingPrefix.Replace("%REGIONNAME%", RegionName); + } + + // The material characteristics. + BSMaterials.InitializeFromDefaults(Params); + if (pConfig != null) + { + // Let the user add new and interesting material property values. + BSMaterials.InitializefromParameters(pConfig); + } + } + } + + // A helper function that handles a true/false parameter and returns the proper float number encoding + float ParamBoolean(IConfig config, string parmName, float deflt) + { + float ret = deflt; + if (config.Contains(parmName)) + { + ret = ConfigurationParameters.numericFalse; + if (config.GetBoolean(parmName, false)) + { + ret = ConfigurationParameters.numericTrue; + } + } + return ret; + } + + // Called directly from unmanaged code so don't do much + private void BulletLogger(string msg) + { + m_log.Debug("[BULLETS UNMANAGED]:" + msg); + } + + // Called directly from unmanaged code so don't do much + private void BulletLoggerPhysLog(string msg) + { + DetailLog("[BULLETS UNMANAGED]:" + msg); + } + + public override void Dispose() + { + // m_log.DebugFormat("{0}: Dispose()", LogHeader); + + // make sure no stepping happens while we're deleting stuff + m_initialized = false; + + foreach (KeyValuePair kvp in PhysObjects) + { + kvp.Value.Destroy(); + } + PhysObjects.Clear(); + + // Now that the prims are all cleaned up, there should be no constraints left + if (Constraints != null) + { + Constraints.Dispose(); + Constraints = null; + } + + if (Shapes != null) + { + Shapes.Dispose(); + Shapes = null; + } + + if (TerrainManager != null) + { + TerrainManager.ReleaseGroundPlaneAndTerrain(); + TerrainManager.Dispose(); + TerrainManager = null; + } + + // Anything left in the unmanaged code should be cleaned out + BulletSimAPI.Shutdown2(World.ptr); + + // Not logging any more + PhysicsLogging.Close(); + } + #endregion // Construction and Initialization + + #region Prim and Avatar addition and removal + + public override PhysicsActor AddAvatar(string avName, Vector3 position, Vector3 size, bool isFlying) + { + m_log.ErrorFormat("{0}: CALL TO AddAvatar in BSScene. NOT IMPLEMENTED", LogHeader); + return null; + } + + public override PhysicsActor AddAvatar(uint localID, string avName, Vector3 position, Vector3 size, bool isFlying) + { + // m_log.DebugFormat("{0}: AddAvatar: {1}", LogHeader, avName); + + if (!m_initialized) return null; + + BSCharacter actor = new BSCharacter(localID, avName, this, position, size, isFlying); + lock (PhysObjects) PhysObjects.Add(localID, actor); + + // TODO: Remove kludge someday. + // We must generate a collision for avatars whether they collide or not. + // This is required by OpenSim to update avatar animations, etc. + lock (m_avatars) m_avatars.Add(actor); + + return actor; + } + + public override void RemoveAvatar(PhysicsActor actor) + { + // m_log.DebugFormat("{0}: RemoveAvatar", LogHeader); + + if (!m_initialized) return; + + BSCharacter bsactor = actor as BSCharacter; + if (bsactor != null) + { + try + { + lock (PhysObjects) PhysObjects.Remove(actor.LocalID); + // Remove kludge someday + lock (m_avatars) m_avatars.Remove(bsactor); + } + catch (Exception e) + { + m_log.WarnFormat("{0}: Attempt to remove avatar that is not in physics scene: {1}", LogHeader, e); + } + bsactor.Destroy(); + // bsactor.dispose(); + } + } + + public override void RemovePrim(PhysicsActor prim) + { + if (!m_initialized) return; + + BSPrim bsprim = prim as BSPrim; + if (bsprim != null) + { + DetailLog("{0},RemovePrim,call", bsprim.LocalID); + // m_log.DebugFormat("{0}: RemovePrim. id={1}/{2}", LogHeader, bsprim.Name, bsprim.LocalID); + try + { + lock (PhysObjects) PhysObjects.Remove(bsprim.LocalID); + } + catch (Exception e) + { + m_log.ErrorFormat("{0}: Attempt to remove prim that is not in physics scene: {1}", LogHeader, e); + } + bsprim.Destroy(); + // bsprim.dispose(); + } + else + { + m_log.ErrorFormat("{0}: Attempt to remove prim that is not a BSPrim type.", LogHeader); + } + } + + public override PhysicsActor AddPrimShape(string primName, PrimitiveBaseShape pbs, Vector3 position, + Vector3 size, Quaternion rotation, bool isPhysical, uint localID) + { + // m_log.DebugFormat("{0}: AddPrimShape2: {1}", LogHeader, primName); + + if (!m_initialized) return null; + + DetailLog("{0},AddPrimShape,call", localID); + + BSPrim prim = new BSPrim(localID, primName, this, position, size, rotation, pbs, isPhysical); + lock (PhysObjects) PhysObjects.Add(localID, prim); + return prim; + } + + // This is a call from the simulator saying that some physical property has been updated. + // The BulletSim driver senses the changing of relevant properties so this taint + // information call is not needed. + public override void AddPhysicsActorTaint(PhysicsActor prim) { } + + #endregion // Prim and Avatar addition and removal + + #region Simulation + // Simulate one timestep + public override float Simulate(float timeStep) + { + // prevent simulation until we've been initialized + if (!m_initialized) return 5.0f; + + LastTimeStep = timeStep; + + int updatedEntityCount = 0; + //Object updatedEntitiesPtr; + int collidersCount = 0; + //Object collidersPtr; + + int beforeTime = 0; + int simTime = 0; + + // update the prim states while we know the physics engine is not busy + int numTaints = _taintOperations.Count; + + InTaintTime = true; // Only used for debugging so locking is not necessary. + + ProcessTaints(); + + // Some of the physical objects requre individual, pre-step calls + TriggerPreStepEvent(timeStep); + + // the prestep actions might have added taints + ProcessTaints(); + + InTaintTime = false; // Only used for debugging so locking is not necessary. + + // step the physical world one interval + m_simulationStep++; + int numSubSteps = 0; + + try + { + //if (VehicleLoggingEnabled) DumpVehicles(); // DEBUG + if (PhysicsLogging.Enabled) beforeTime = Util.EnvironmentTickCount(); + + numSubSteps = BulletSimAPI.PhysicsStep2(World.ptr, timeStep, m_maxSubSteps, m_fixedTimeStep, + out updatedEntityCount, out m_updateArray, out collidersCount, out m_collisionArray); + + if (PhysicsLogging.Enabled) simTime = Util.EnvironmentTickCountSubtract(beforeTime); + DetailLog("{0},Simulate,call, frame={1}, nTaints={2}, simTime={3}, substeps={4}, updates={5}, colliders={6}, objWColl={7}", + DetailLogZero, m_simulationStep, numTaints, simTime, numSubSteps, + updatedEntityCount, collidersCount, ObjectsWithCollisions.Count); + } + catch (Exception e) + { + m_log.WarnFormat("{0},PhysicsStep Exception: nTaints={1}, substeps={2}, updates={3}, colliders={4}, e={5}", + LogHeader, numTaints, numSubSteps, updatedEntityCount, collidersCount, e); + DetailLog("{0},PhysicsStepException,call, nTaints={1}, substeps={2}, updates={3}, colliders={4}", + DetailLogZero, numTaints, numSubSteps, updatedEntityCount, collidersCount); + updatedEntityCount = 0; + collidersCount = 0; + } + + // Don't have to use the pointers passed back since we know it is the same pinned memory we passed in. + + // Get a value for 'now' so all the collision and update routines don't have to get their own. + SimulationNowTime = Util.EnvironmentTickCount(); + + // If there were collisions, process them by sending the event to the prim. + // Collisions must be processed before updates. + if (collidersCount > 0) + { + for (int ii = 0; ii < collidersCount; ii++) + { + uint cA = m_collisionArray[ii].aID; + uint cB = m_collisionArray[ii].bID; + Vector3 point = new Vector3(m_collisionArray[ii].point.X, m_collisionArray[ii].point.Y, + m_collisionArray[ii].point.Z); + Vector3 normal = new Vector3(m_collisionArray[ii].normal.X, m_collisionArray[ii].normal.Y, + m_collisionArray[ii].normal.Z); + SendCollision(cA, cB, point, normal, 0.01f); + SendCollision(cB, cA, point, -normal, 0.01f); + } + } + + // The above SendCollision's batch up the collisions on the objects. + // Now push the collisions into the simulator. + if (ObjectsWithCollisions.Count > 0) + { + foreach (BSPhysObject bsp in ObjectsWithCollisions) + if (!bsp.SendCollisions()) + { + // If the object is done colliding, see that it's removed from the colliding list + ObjectsWithNoMoreCollisions.Add(bsp); + } + } + + // This is a kludge to get avatar movement updates. + // The simulator expects collisions for avatars even if there are have been no collisions. + // The event updates avatar animations and stuff. + // If you fix avatar animation updates, remove this overhead and let normal collision processing happen. + foreach (BSPhysObject bsp in m_avatars) + if (!ObjectsWithCollisions.Contains(bsp)) // don't call avatars twice + bsp.SendCollisions(); + + // Objects that are done colliding are removed from the ObjectsWithCollisions list. + // Not done above because it is inside an iteration of ObjectWithCollisions. + // This complex collision processing is required to create an empty collision + // event call after all collisions have happened on an object. This enables + // the simulator to generate the 'collision end' event. + if (ObjectsWithNoMoreCollisions.Count > 0) + { + foreach (BSPhysObject po in ObjectsWithNoMoreCollisions) + ObjectsWithCollisions.Remove(po); + ObjectsWithNoMoreCollisions.Clear(); + } + // Done with collisions. + + // If any of the objects had updated properties, tell the object it has been changed by the physics engine + if (updatedEntityCount > 0) + { + for (int ii = 0; ii < updatedEntityCount; ii++) + { + + BulletXNA.EntityProperties entprop = m_updateArray[ii]; + BSPhysObject pobj; + if (PhysObjects.TryGetValue(entprop.ID, out pobj)) + { + EntityProperties prop = new EntityProperties() + { + Acceleration = new Vector3(entprop.Acceleration.X, entprop.Acceleration.Y, entprop.Acceleration.Z), + ID = entprop.ID, + Position = new Vector3(entprop.Position.X,entprop.Position.Y,entprop.Position.Z), + Rotation = new Quaternion(entprop.Rotation.X,entprop.Rotation.Y,entprop.Rotation.Z,entprop.Rotation.W), + RotationalVelocity = new Vector3(entprop.AngularVelocity.X,entprop.AngularVelocity.Y,entprop.AngularVelocity.Z), + Velocity = new Vector3(entprop.Velocity.X,entprop.Velocity.Y,entprop.Velocity.Z) + }; + //m_log.Debug(pobj.Name + ":" + prop.ToString() + "\n"); + pobj.UpdateProperties(prop); + } + } + } + + TriggerPostStepEvent(timeStep); + + // The following causes the unmanaged code to output ALL the values found in ALL the objects in the world. + // Only enable this in a limited test world with few objects. + // BulletSimAPI.DumpAllInfo2(World.ptr); // DEBUG DEBUG DEBUG + + // The physics engine returns the number of milliseconds it simulated this call. + // These are summed and normalized to one second and divided by 1000 to give the reported physics FPS. + // Multiply by 55 to give a nominal frame rate of 55. + return (float)numSubSteps * m_fixedTimeStep * 1000f * 55f; + } + + // Something has collided + private void SendCollision(uint localID, uint collidingWith, Vector3 collidePoint, Vector3 collideNormal, float penetration) + { + if (localID <= TerrainManager.HighestTerrainID) + { + return; // don't send collisions to the terrain + } + + BSPhysObject collider; + if (!PhysObjects.TryGetValue(localID, out collider)) + { + // If the object that is colliding cannot be found, just ignore the collision. + DetailLog("{0},BSScene.SendCollision,colliderNotInObjectList,id={1},with={2}", DetailLogZero, localID, collidingWith); + return; + } + + // The terrain is not in the physical object list so 'collidee' can be null when Collide() is called. + BSPhysObject collidee = null; + PhysObjects.TryGetValue(collidingWith, out collidee); + + // DetailLog("{0},BSScene.SendCollision,collide,id={1},with={2}", DetailLogZero, localID, collidingWith); + + if (collider.Collide(collidingWith, collidee, collidePoint, collideNormal, penetration)) + { + // If a collision was posted, remember to send it to the simulator + ObjectsWithCollisions.Add(collider); + } + + return; + } + + #endregion // Simulation + + public override void GetResults() { } + + #region Terrain + + public override void SetTerrain(float[] heightMap) { + TerrainManager.SetTerrain(heightMap); + } + + public override void SetWaterLevel(float baseheight) + { + SimpleWaterLevel = baseheight; + } + + public override void DeleteTerrain() + { + // m_log.DebugFormat("{0}: DeleteTerrain()", LogHeader); + } + + // Although no one seems to check this, I do support combining. + public override bool SupportsCombining() + { + return TerrainManager.SupportsCombining(); + } + // This call says I am a child to region zero in a mega-region. 'pScene' is that + // of region zero, 'offset' is my offset from regions zero's origin, and + // 'extents' is the largest XY that is handled in my region. + public override void Combine(PhysicsScene pScene, Vector3 offset, Vector3 extents) + { + TerrainManager.Combine(pScene, offset, extents); + } + + // Unhook all the combining that I know about. + public override void UnCombine(PhysicsScene pScene) + { + TerrainManager.UnCombine(pScene); + } + + #endregion // Terrain + + public override Dictionary GetTopColliders() + { + return new Dictionary(); + } + + public override bool IsThreaded { get { return false; } } + + #region Taints + // The simulation execution order is: + // Simulate() + // DoOneTimeTaints + // TriggerPreStepEvent + // DoOneTimeTaints + // Step() + // ProcessAndForwardCollisions + // ProcessAndForwardPropertyUpdates + // TriggerPostStepEvent + + // Calls to the PhysicsActors can't directly call into the physics engine + // because it might be busy. We delay changes to a known time. + // We rely on C#'s closure to save and restore the context for the delegate. + public void TaintedObject(String ident, TaintCallback callback) + { + if (!m_initialized) return; + + lock (_taintLock) + { + _taintOperations.Add(new TaintCallbackEntry(ident, callback)); + } + + return; + } + + // Sometimes a potentially tainted operation can be used in and out of taint time. + // This routine executes the command immediately if in taint-time otherwise it is queued. + public void TaintedObject(bool inTaintTime, string ident, TaintCallback callback) + { + if (inTaintTime) + callback(); + else + TaintedObject(ident, callback); + } + + private void TriggerPreStepEvent(float timeStep) + { + PreStepAction actions = BeforeStep; + if (actions != null) + actions(timeStep); + + } + + private void TriggerPostStepEvent(float timeStep) + { + PreStepAction actions = AfterStep; + if (actions != null) + actions(timeStep); + + } + + // When someone tries to change a property on a BSPrim or BSCharacter, the object queues + // a callback into itself to do the actual property change. That callback is called + // here just before the physics engine is called to step the simulation. + public void ProcessTaints() + { + ProcessRegularTaints(); + ProcessPostTaintTaints(); + } + + private void ProcessRegularTaints() + { + if (_taintOperations.Count > 0) // save allocating new list if there is nothing to process + { + // swizzle a new list into the list location so we can process what's there + List oldList; + lock (_taintLock) + { + oldList = _taintOperations; + _taintOperations = new List(); + } + + foreach (TaintCallbackEntry tcbe in oldList) + { + try + { + DetailLog("{0},BSScene.ProcessTaints,doTaint,id={1}", DetailLogZero, tcbe.ident); // DEBUG DEBUG DEBUG + tcbe.callback(); + } + catch (Exception e) + { + m_log.ErrorFormat("{0}: ProcessTaints: {1}: Exception: {2}", LogHeader, tcbe.ident, e); + } + } + oldList.Clear(); + } + } + + // Schedule an update to happen after all the regular taints are processed. + // Note that new requests for the same operation ("ident") for the same object ("ID") + // will replace any previous operation by the same object. + public void PostTaintObject(String ident, uint ID, TaintCallback callback) + { + string uniqueIdent = ident + "-" + ID.ToString(); + lock (_taintLock) + { + _postTaintOperations[uniqueIdent] = new TaintCallbackEntry(uniqueIdent, callback); + } + + return; + } + + // Taints that happen after the normal taint processing but before the simulation step. + private void ProcessPostTaintTaints() + { + if (_postTaintOperations.Count > 0) + { + Dictionary oldList; + lock (_taintLock) + { + oldList = _postTaintOperations; + _postTaintOperations = new Dictionary(); + } + + foreach (KeyValuePair kvp in oldList) + { + try + { + DetailLog("{0},BSScene.ProcessPostTaintTaints,doTaint,id={1}", DetailLogZero, kvp.Key); // DEBUG DEBUG DEBUG + kvp.Value.callback(); + } + catch (Exception e) + { + m_log.ErrorFormat("{0}: ProcessPostTaintTaints: {1}: Exception: {2}", LogHeader, kvp.Key, e); + } + } + oldList.Clear(); + } + } + + // Only used for debugging. Does not change state of anything so locking is not necessary. + public bool AssertInTaintTime(string whereFrom) + { + if (!InTaintTime) + { + DetailLog("{0},BSScene.AssertInTaintTime,NOT IN TAINT TIME,Region={1},Where={2}", DetailLogZero, RegionName, whereFrom); + m_log.ErrorFormat("{0} NOT IN TAINT TIME!! Region={1}, Where={2}", LogHeader, RegionName, whereFrom); + Util.PrintCallStack(); // Prints the stack into the DEBUG log file. + } + return InTaintTime; + } + + #endregion // Taints + + #region INI and command line parameter processing + + #region IPhysicsParameters + // Get the list of parameters this physics engine supports + public PhysParameterEntry[] GetParameterList() + { + BSParam.BuildParameterTable(); + return BSParam.SettableParameters; + } + + // Set parameter on a specific or all instances. + // Return 'false' if not able to set the parameter. + // Setting the value in the m_params block will change the value the physics engine + // will use the next time since it's pinned and shared memory. + // Some of the values require calling into the physics engine to get the new + // value activated ('terrainFriction' for instance). + public bool SetPhysicsParameter(string parm, float val, uint localID) + { + bool ret = false; + BSParam.ParameterDefn theParam; + if (BSParam.TryGetParameter(parm, out theParam)) + { + theParam.setter(this, parm, localID, val); + ret = true; + } + return ret; + } + + // update all the localIDs specified + // If the local ID is APPLY_TO_NONE, just change the default value + // If the localID is APPLY_TO_ALL change the default value and apply the new value to all the lIDs + // If the localID is a specific object, apply the parameter change to only that object + internal delegate void AssignVal(float x); + internal void UpdateParameterObject(AssignVal setDefault, string parm, uint localID, float val) + { + List objectIDs = new List(); + switch (localID) + { + case PhysParameterEntry.APPLY_TO_NONE: + setDefault(val); // setting only the default value + // This will cause a call into the physical world if some operation is specified (SetOnObject). + objectIDs.Add(TERRAIN_ID); + TaintedUpdateParameter(parm, objectIDs, val); + break; + case PhysParameterEntry.APPLY_TO_ALL: + setDefault(val); // setting ALL also sets the default value + lock (PhysObjects) objectIDs = new List(PhysObjects.Keys); + TaintedUpdateParameter(parm, objectIDs, val); + break; + default: + // setting only one localID + objectIDs.Add(localID); + TaintedUpdateParameter(parm, objectIDs, val); + break; + } + } + + // schedule the actual updating of the paramter to when the phys engine is not busy + private void TaintedUpdateParameter(string parm, List lIDs, float val) + { + float xval = val; + List xlIDs = lIDs; + string xparm = parm; + TaintedObject("BSScene.UpdateParameterSet", delegate() { + BSParam.ParameterDefn thisParam; + if (BSParam.TryGetParameter(xparm, out thisParam)) + { + if (thisParam.onObject != null) + { + foreach (uint lID in xlIDs) + { + BSPhysObject theObject = null; + PhysObjects.TryGetValue(lID, out theObject); + thisParam.onObject(this, theObject, xval); + } + } + } + }); + } + + // Get parameter. + // Return 'false' if not able to get the parameter. + public bool GetPhysicsParameter(string parm, out float value) + { + float val = 0f; + bool ret = false; + BSParam.ParameterDefn theParam; + if (BSParam.TryGetParameter(parm, out theParam)) + { + val = theParam.getter(this); + ret = true; + } + value = val; + return ret; + } + + #endregion IPhysicsParameters + + #endregion Runtime settable parameters + + // Invoke the detailed logger and output something if it's enabled. + public void DetailLog(string msg, params Object[] args) + { + PhysicsLogging.Write(msg, args); + // Add the Flush() if debugging crashes. Gets all the messages written out. + if (m_physicsLoggingDoFlush) PhysicsLogging.Flush(); + } + // Used to fill in the LocalID when there isn't one. It's the correct number of characters. + public const string DetailLogZero = "0000000000"; + +} +} diff --git a/OpenSim/Region/Physics/BulletSNPlugin/BSShapeCollection.cs b/OpenSim/Region/Physics/BulletSNPlugin/BSShapeCollection.cs new file mode 100644 index 0000000000..398ece095c --- /dev/null +++ b/OpenSim/Region/Physics/BulletSNPlugin/BSShapeCollection.cs @@ -0,0 +1,1015 @@ +/* + * 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 copyrightD + * 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.Text; +using OMV = OpenMetaverse; +using OpenSim.Framework; +using OpenSim.Region.Physics.Manager; +using OpenSim.Region.Physics.ConvexDecompositionDotNet; + +namespace OpenSim.Region.Physics.BulletSNPlugin +{ +public sealed class BSShapeCollection : IDisposable +{ + private static string LogHeader = "[BULLETSIM SHAPE COLLECTION]"; + + private BSScene PhysicsScene { get; set; } + + private Object m_collectionActivityLock = new Object(); + + // Description of a Mesh + private struct MeshDesc + { + public Object ptr; + public int referenceCount; + public DateTime lastReferenced; + public UInt64 shapeKey; + } + + // Description of a hull. + // Meshes and hulls have the same shape hash key but we only need hulls for efficient collision calculations. + private struct HullDesc + { + public Object ptr; + public int referenceCount; + public DateTime lastReferenced; + public UInt64 shapeKey; + } + + // The sharable set of meshes and hulls. Indexed by their shape hash. + private Dictionary Meshes = new Dictionary(); + private Dictionary Hulls = new Dictionary(); + + private bool DDetail = false; + + public BSShapeCollection(BSScene physScene) + { + PhysicsScene = physScene; + // Set the next to 'true' for very detailed shape update detailed logging (detailed details?) + // While detailed debugging is still active, this is better than commenting out all the + // DetailLog statements. When debugging slows down, this and the protected logging + // statements can be commented/removed. + DDetail = true; + } + + public void Dispose() + { + // TODO!!!!!!!!! + } + + // Callbacks called just before either the body or shape is destroyed. + // Mostly used for changing bodies out from under Linksets. + // Useful for other cases where parameters need saving. + // Passing 'null' says no callback. + public delegate void ShapeDestructionCallback(BulletShape shape); + public delegate void BodyDestructionCallback(BulletBody body); + + // Called to update/change the body and shape for an object. + // First checks the shape and updates that if necessary then makes + // sure the body is of the right type. + // Return 'true' if either the body or the shape changed. + // 'shapeCallback' and 'bodyCallback' are, if non-null, functions called just before + // the current shape or body is destroyed. This allows the caller to remove any + // higher level dependencies on the shape or body. Mostly used for LinkSets to + // remove the physical constraints before the body is destroyed. + // Called at taint-time!! + public bool GetBodyAndShape(bool forceRebuild, BulletSim sim, BSPhysObject prim, + ShapeDestructionCallback shapeCallback, BodyDestructionCallback bodyCallback) + { + PhysicsScene.AssertInTaintTime("BSShapeCollection.GetBodyAndShape"); + + bool ret = false; + + // This lock could probably be pushed down lower but building shouldn't take long + lock (m_collectionActivityLock) + { + // Do we have the correct geometry for this type of object? + // Updates prim.BSShape with information/pointers to shape. + // Returns 'true' of BSShape is changed to a new shape. + bool newGeom = CreateGeom(forceRebuild, prim, shapeCallback); + // If we had to select a new shape geometry for the object, + // rebuild the body around it. + // Updates prim.BSBody with information/pointers to requested body + // Returns 'true' if BSBody was changed. + bool newBody = CreateBody((newGeom || forceRebuild), prim, PhysicsScene.World, + prim.PhysShape, bodyCallback); + ret = newGeom || newBody; + } + DetailLog("{0},BSShapeCollection.GetBodyAndShape,taintExit,force={1},ret={2},body={3},shape={4}", + prim.LocalID, forceRebuild, ret, prim.PhysBody, prim.PhysShape); + + return ret; + } + + public bool GetBodyAndShape(bool forceRebuild, BulletSim sim, BSPhysObject prim) + { + return GetBodyAndShape(forceRebuild, sim, prim, null, null); + } + + // Track another user of a body. + // We presume the caller has allocated the body. + // Bodies only have one user so the body is just put into the world if not already there. + public void ReferenceBody(BulletBody body, bool inTaintTime) + { + lock (m_collectionActivityLock) + { + if (DDetail) DetailLog("{0},BSShapeCollection.ReferenceBody,newBody,body={1}", body.ID, body); + PhysicsScene.TaintedObject(inTaintTime, "BSShapeCollection.ReferenceBody", delegate() + { + if (!BulletSimAPI.IsInWorld2(PhysicsScene.World.ptr, body.ptr)) + { + BulletSimAPI.AddObjectToWorld2(PhysicsScene.World.ptr, body.ptr); + if (DDetail) DetailLog("{0},BSShapeCollection.ReferenceBody,addedToWorld,ref={1}", body.ID, body); + } + }); + } + } + + // Release the usage of a body. + // Called when releasing use of a BSBody. BSShape is handled separately. + public void DereferenceBody(BulletBody body, bool inTaintTime, BodyDestructionCallback bodyCallback ) + { + if (!body.HasPhysicalBody) + return; + + lock (m_collectionActivityLock) + { + PhysicsScene.TaintedObject(inTaintTime, "BSShapeCollection.DereferenceBody", delegate() + { + if (DDetail) DetailLog("{0},BSShapeCollection.DereferenceBody,DestroyingBody,body={1},inTaintTime={2}", + body.ID, body, inTaintTime); + // If the caller needs to know the old body is going away, pass the event up. + if (bodyCallback != null) bodyCallback(body); + + if (BulletSimAPI.IsInWorld2(PhysicsScene.World.ptr, body.ptr)) + { + BulletSimAPI.RemoveObjectFromWorld2(PhysicsScene.World.ptr, body.ptr); + if (DDetail) DetailLog("{0},BSShapeCollection.DereferenceBody,removingFromWorld. Body={1}", body.ID, body); + } + + // Zero any reference to the shape so it is not freed when the body is deleted. + BulletSimAPI.SetCollisionShape2(PhysicsScene.World.ptr, body.ptr, null); + BulletSimAPI.DestroyObject2(PhysicsScene.World.ptr, body.ptr); + }); + } + } + + // Track the datastructures and use count for a shape. + // When creating a hull, this is called first to reference the mesh + // and then again to reference the hull. + // Meshes and hulls for the same shape have the same hash key. + // NOTE that native shapes are not added to the mesh list or removed. + // Returns 'true' if this is the initial reference to the shape. Otherwise reused. + public bool ReferenceShape(BulletShape shape) + { + bool ret = false; + switch (shape.type) + { + case BSPhysicsShapeType.SHAPE_MESH: + MeshDesc meshDesc; + if (Meshes.TryGetValue(shape.shapeKey, out meshDesc)) + { + // There is an existing instance of this mesh. + meshDesc.referenceCount++; + if (DDetail) DetailLog("{0},BSShapeCollection.ReferenceShape,existingMesh,key={1},cnt={2}", + BSScene.DetailLogZero, shape.shapeKey.ToString("X"), meshDesc.referenceCount); + } + else + { + // This is a new reference to a mesh + meshDesc.ptr = shape.ptr; + meshDesc.shapeKey = shape.shapeKey; + // We keep a reference to the underlying IMesh data so a hull can be built + meshDesc.referenceCount = 1; + if (DDetail) DetailLog("{0},BSShapeCollection.ReferenceShape,newMesh,key={1},cnt={2}", + BSScene.DetailLogZero, shape.shapeKey.ToString("X"), meshDesc.referenceCount); + ret = true; + } + meshDesc.lastReferenced = System.DateTime.Now; + Meshes[shape.shapeKey] = meshDesc; + break; + case BSPhysicsShapeType.SHAPE_HULL: + HullDesc hullDesc; + if (Hulls.TryGetValue(shape.shapeKey, out hullDesc)) + { + // There is an existing instance of this hull. + hullDesc.referenceCount++; + if (DDetail) DetailLog("{0},BSShapeCollection.ReferenceShape,existingHull,key={1},cnt={2}", + BSScene.DetailLogZero, shape.shapeKey.ToString("X"), hullDesc.referenceCount); + } + else + { + // This is a new reference to a hull + hullDesc.ptr = shape.ptr; + hullDesc.shapeKey = shape.shapeKey; + hullDesc.referenceCount = 1; + if (DDetail) DetailLog("{0},BSShapeCollection.ReferenceShape,newHull,key={1},cnt={2}", + BSScene.DetailLogZero, shape.shapeKey.ToString("X"), hullDesc.referenceCount); + ret = true; + + } + hullDesc.lastReferenced = System.DateTime.Now; + Hulls[shape.shapeKey] = hullDesc; + break; + case BSPhysicsShapeType.SHAPE_UNKNOWN: + break; + default: + // Native shapes are not tracked and they don't go into any list + break; + } + return ret; + } + + // Release the usage of a shape. + public void DereferenceShape(BulletShape shape, bool inTaintTime, ShapeDestructionCallback shapeCallback) + { + if (!shape.HasPhysicalShape) + return; + + PhysicsScene.TaintedObject(inTaintTime, "BSShapeCollection.DereferenceShape", delegate() + { + if (shape.HasPhysicalShape) + { + if (shape.isNativeShape) + { + // Native shapes are not tracked and are released immediately + if (DDetail) DetailLog("{0},BSShapeCollection.DereferenceShape,deleteNativeShape,ptr={1},taintTime={2}", + BSScene.DetailLogZero, shape.ptr.ToString(), inTaintTime); + if (shapeCallback != null) shapeCallback(shape); + BulletSimAPI.DeleteCollisionShape2(PhysicsScene.World.ptr, shape.ptr); + } + else + { + switch (shape.type) + { + case BSPhysicsShapeType.SHAPE_HULL: + DereferenceHull(shape, shapeCallback); + break; + case BSPhysicsShapeType.SHAPE_MESH: + DereferenceMesh(shape, shapeCallback); + break; + case BSPhysicsShapeType.SHAPE_COMPOUND: + DereferenceCompound(shape, shapeCallback); + break; + case BSPhysicsShapeType.SHAPE_UNKNOWN: + break; + default: + break; + } + } + } + }); + } + + // Count down the reference count for a mesh shape + // Called at taint-time. + private void DereferenceMesh(BulletShape shape, ShapeDestructionCallback shapeCallback) + { + MeshDesc meshDesc; + if (Meshes.TryGetValue(shape.shapeKey, out meshDesc)) + { + meshDesc.referenceCount--; + // TODO: release the Bullet storage + if (shapeCallback != null) shapeCallback(shape); + meshDesc.lastReferenced = System.DateTime.Now; + Meshes[shape.shapeKey] = meshDesc; + if (DDetail) DetailLog("{0},BSShapeCollection.DereferenceMesh,shape={1},refCnt={2}", + BSScene.DetailLogZero, shape, meshDesc.referenceCount); + + } + } + + // Count down the reference count for a hull shape + // Called at taint-time. + private void DereferenceHull(BulletShape shape, ShapeDestructionCallback shapeCallback) + { + HullDesc hullDesc; + if (Hulls.TryGetValue(shape.shapeKey, out hullDesc)) + { + hullDesc.referenceCount--; + // TODO: release the Bullet storage (aging old entries?) + + // Tell upper layers that, if they have dependencies on this shape, this link is going away + if (shapeCallback != null) shapeCallback(shape); + + hullDesc.lastReferenced = System.DateTime.Now; + Hulls[shape.shapeKey] = hullDesc; + if (DDetail) DetailLog("{0},BSShapeCollection.DereferenceHull,shape={1},refCnt={2}", + BSScene.DetailLogZero, shape, hullDesc.referenceCount); + } + } + + // Remove a reference to a compound shape. + // Taking a compound shape apart is a little tricky because if you just delete the + // physical shape, it will free all the underlying children. We can't do that because + // they could be shared. So, this removes each of the children from the compound and + // dereferences them separately before destroying the compound collision object itself. + // Called at taint-time. + private void DereferenceCompound(BulletShape shape, ShapeDestructionCallback shapeCallback) + { + if (!BulletSimAPI.IsCompound2(shape.ptr)) + { + // Failed the sanity check!! + PhysicsScene.Logger.ErrorFormat("{0} Attempt to free a compound shape that is not compound!! type={1}, ptr={2}", + LogHeader, shape.type, shape.ptr.ToString()); + if (DDetail) DetailLog("{0},BSShapeCollection.DereferenceCompound,notACompoundShape,type={1},ptr={2}", + BSScene.DetailLogZero, shape.type, shape.ptr.ToString()); + return; + } + + int numChildren = BulletSimAPI.GetNumberOfCompoundChildren2(shape.ptr); + if (DDetail) DetailLog("{0},BSShapeCollection.DereferenceCompound,shape={1},children={2}", BSScene.DetailLogZero, shape, numChildren); + + for (int ii = numChildren - 1; ii >= 0; ii--) + { + Object childShape = BulletSimAPI.RemoveChildShapeFromCompoundShapeIndex2(shape.ptr, ii); + DereferenceAnonCollisionShape(childShape); + } + BulletSimAPI.DeleteCollisionShape2(PhysicsScene.World.ptr, shape.ptr); + } + + // Sometimes we have a pointer to a collision shape but don't know what type it is. + // Figure out type and call the correct dereference routine. + // Called at taint-time. + private void DereferenceAnonCollisionShape(Object cShape) + { + MeshDesc meshDesc; + HullDesc hullDesc; + + BulletShape shapeInfo = new BulletShape(cShape); + if (TryGetMeshByPtr(cShape, out meshDesc)) + { + shapeInfo.type = BSPhysicsShapeType.SHAPE_MESH; + shapeInfo.shapeKey = meshDesc.shapeKey; + } + else + { + if (TryGetHullByPtr(cShape, out hullDesc)) + { + shapeInfo.type = BSPhysicsShapeType.SHAPE_HULL; + shapeInfo.shapeKey = hullDesc.shapeKey; + } + else + { + if (BulletSimAPI.IsCompound2(cShape)) + { + shapeInfo.type = BSPhysicsShapeType.SHAPE_COMPOUND; + } + else + { + if (BulletSimAPI.IsNativeShape2(cShape)) + { + shapeInfo.isNativeShape = true; + shapeInfo.type = BSPhysicsShapeType.SHAPE_BOX; // (technically, type doesn't matter) + } + } + } + } + + if (DDetail) DetailLog("{0},BSShapeCollection.DereferenceAnonCollisionShape,shape={1}", BSScene.DetailLogZero, shapeInfo); + + if (shapeInfo.type != BSPhysicsShapeType.SHAPE_UNKNOWN) + { + DereferenceShape(shapeInfo, true, null); + } + else + { + PhysicsScene.Logger.ErrorFormat("{0} Could not decypher shape type. Region={1}, addr={2}", + LogHeader, PhysicsScene.RegionName, cShape.ToString()); + } + } + + // Create the geometry information in Bullet for later use. + // The objects needs a hull if it's physical otherwise a mesh is enough. + // if 'forceRebuild' is true, the geometry is unconditionally rebuilt. For meshes and hulls, + // shared geometries will be used. If the parameters of the existing shape are the same + // as this request, the shape is not rebuilt. + // Info in prim.BSShape is updated to the new shape. + // Returns 'true' if the geometry was rebuilt. + // Called at taint-time! + private bool CreateGeom(bool forceRebuild, BSPhysObject prim, ShapeDestructionCallback shapeCallback) + { + bool ret = false; + bool haveShape = false; + + if (!haveShape && prim.PreferredPhysicalShape == BSPhysicsShapeType.SHAPE_CAPSULE) + { + // an avatar capsule is close to a native shape (it is not shared) + GetReferenceToNativeShape(prim, BSPhysicsShapeType.SHAPE_CAPSULE, + FixedShapeKey.KEY_CAPSULE, shapeCallback); + if (DDetail) DetailLog("{0},BSShapeCollection.CreateGeom,avatarCapsule,shape={1}", prim.LocalID, prim.PhysShape); + ret = true; + haveShape = true; + } + + // Compound shapes are handled special as they are rebuilt from scratch. + // This isn't too great a hardship since most of the child shapes will have already been created. + if (!haveShape && prim.PreferredPhysicalShape == BSPhysicsShapeType.SHAPE_COMPOUND) + { + ret = GetReferenceToCompoundShape(prim, shapeCallback); + if (DDetail) DetailLog("{0},BSShapeCollection.CreateGeom,compoundShape,shape={1}", prim.LocalID, prim.PhysShape); + haveShape = true; + } + + if (!haveShape) + { + ret = CreateGeomNonSpecial(forceRebuild, prim, shapeCallback); + } + + return ret; + } + + // Create a mesh/hull shape or a native shape if 'nativeShapePossible' is 'true'. + public bool CreateGeomNonSpecial(bool forceRebuild, BSPhysObject prim, ShapeDestructionCallback shapeCallback) + { + bool ret = false; + bool haveShape = false; + bool nativeShapePossible = true; + PrimitiveBaseShape pbs = prim.BaseShape; + + // If the prim attributes are simple, this could be a simple Bullet native shape + if (!haveShape + && pbs != null + && nativeShapePossible + && ((pbs.SculptEntry && !BSParam.ShouldMeshSculptedPrim) + || (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) ) ) + { + // Get the scale of any existing shape so we can see if the new shape is same native type and same size. + OMV.Vector3 scaleOfExistingShape = OMV.Vector3.Zero; + if (prim.PhysShape.HasPhysicalShape) + scaleOfExistingShape = BulletSimAPI.GetLocalScaling2(prim.PhysShape.ptr); + + if (DDetail) DetailLog("{0},BSShapeCollection.CreateGeom,maybeNative,force={1},primScale={2},primSize={3},primShape={4}", + prim.LocalID, forceRebuild, prim.Scale, prim.Size, prim.PhysShape.type); + + // It doesn't look like Bullet scales spheres so make sure the scales are all equal + if ((pbs.ProfileShape == ProfileShape.HalfCircle && pbs.PathCurve == (byte)Extrusion.Curve1) + && pbs.Scale.X == pbs.Scale.Y && pbs.Scale.Y == pbs.Scale.Z) + { + haveShape = true; + if (forceRebuild + || prim.Scale != scaleOfExistingShape + || prim.PhysShape.type != BSPhysicsShapeType.SHAPE_SPHERE + ) + { + ret = GetReferenceToNativeShape(prim, BSPhysicsShapeType.SHAPE_SPHERE, + FixedShapeKey.KEY_SPHERE, shapeCallback); + if (DDetail) DetailLog("{0},BSShapeCollection.CreateGeom,sphere,force={1},shape={2}", + prim.LocalID, forceRebuild, prim.PhysShape); + } + } + if (!haveShape && pbs.ProfileShape == ProfileShape.Square && pbs.PathCurve == (byte)Extrusion.Straight) + { + haveShape = true; + if (forceRebuild + || prim.Scale != scaleOfExistingShape + || prim.PhysShape.type != BSPhysicsShapeType.SHAPE_BOX + ) + { + ret = GetReferenceToNativeShape( prim, BSPhysicsShapeType.SHAPE_BOX, + FixedShapeKey.KEY_BOX, shapeCallback); + if (DDetail) DetailLog("{0},BSShapeCollection.CreateGeom,box,force={1},shape={2}", + prim.LocalID, forceRebuild, prim.PhysShape); + } + } + } + + // If a simple shape is not happening, create a mesh and possibly a hull. + if (!haveShape && pbs != null) + { + ret = CreateGeomMeshOrHull(prim, shapeCallback); + } + + return ret; + } + + public bool CreateGeomMeshOrHull(BSPhysObject prim, ShapeDestructionCallback shapeCallback) + { + + bool ret = false; + // Note that if it's a native shape, the check for physical/non-physical is not + // made. Native shapes work in either case. + if (prim.IsPhysical && BSParam.ShouldUseHullsForPhysicalObjects) + { + // Update prim.BSShape to reference a hull of this shape. + ret = GetReferenceToHull(prim,shapeCallback); + if (DDetail) DetailLog("{0},BSShapeCollection.CreateGeom,hull,shape={1},key={2}", + prim.LocalID, prim.PhysShape, prim.PhysShape.shapeKey.ToString("X")); + } + else + { + ret = GetReferenceToMesh(prim, shapeCallback); + if (DDetail) DetailLog("{0},BSShapeCollection.CreateGeom,mesh,shape={1},key={2}", + prim.LocalID, prim.PhysShape, prim.PhysShape.shapeKey.ToString("X")); + } + return ret; + } + + // Creates a native shape and assignes it to prim.BSShape. + // "Native" shapes are never shared. they are created here and destroyed in DereferenceShape(). + private bool GetReferenceToNativeShape(BSPhysObject prim, + BSPhysicsShapeType shapeType, FixedShapeKey shapeKey, + ShapeDestructionCallback shapeCallback) + { + // release any previous shape + DereferenceShape(prim.PhysShape, true, shapeCallback); + + BulletShape newShape = BuildPhysicalNativeShape(prim, shapeType, shapeKey); + + // Don't need to do a 'ReferenceShape()' here because native shapes are not shared. + if (DDetail) DetailLog("{0},BSShapeCollection.AddNativeShapeToPrim,create,newshape={1},scale={2}", + prim.LocalID, newShape, prim.Scale); + + // native shapes are scaled by Bullet + prim.PhysShape = newShape; + return true; + } + + private BulletShape BuildPhysicalNativeShape(BSPhysObject prim, BSPhysicsShapeType shapeType, + FixedShapeKey shapeKey) + { + BulletShape newShape; + // Need to make sure the passed shape information is for the native type. + ShapeData nativeShapeData = new ShapeData(); + nativeShapeData.Type = shapeType; + nativeShapeData.ID = prim.LocalID; + nativeShapeData.Scale = prim.Scale; + nativeShapeData.Size = prim.Scale; // unneeded, I think. + nativeShapeData.MeshKey = (ulong)shapeKey; + nativeShapeData.HullKey = (ulong)shapeKey; + + if (shapeType == BSPhysicsShapeType.SHAPE_CAPSULE) + { + // The proper scale has been calculated in the prim. + newShape = new BulletShape( + BulletSimAPI.BuildCapsuleShape2(PhysicsScene.World.ptr, 1f, 1f, prim.Scale) + , shapeType); + if (DDetail) DetailLog("{0},BSShapeCollection.BuiletPhysicalNativeShape,capsule,scale={1}", prim.LocalID, prim.Scale); + } + else + { + // Native shapes are scaled in Bullet so set the scaling to the size + newShape = new BulletShape(BulletSimAPI.BuildNativeShape2(PhysicsScene.World.ptr, nativeShapeData), shapeType); + } + if (!newShape.HasPhysicalShape) + { + PhysicsScene.Logger.ErrorFormat("{0} BuildPhysicalNativeShape failed. ID={1}, shape={2}", + LogHeader, prim.LocalID, shapeType); + } + newShape.shapeKey = (System.UInt64)shapeKey; + newShape.isNativeShape = true; + + return newShape; + } + + // Builds a mesh shape in the physical world and updates prim.BSShape. + // Dereferences previous shape in BSShape and adds a reference for this new shape. + // Returns 'true' of a mesh was actually built. Otherwise . + // Called at taint-time! + private bool GetReferenceToMesh(BSPhysObject prim, ShapeDestructionCallback shapeCallback) + { + BulletShape newShape = new BulletShape(); + + float lod; + System.UInt64 newMeshKey = ComputeShapeKey(prim.Size, prim.BaseShape, out lod); + + // if this new shape is the same as last time, don't recreate the mesh + if (newMeshKey == prim.PhysShape.shapeKey && prim.PhysShape.type == BSPhysicsShapeType.SHAPE_MESH) + return false; + + if (DDetail) DetailLog("{0},BSShapeCollection.GetReferenceToMesh,create,oldKey={1},newKey={2}", + prim.LocalID, prim.PhysShape.shapeKey.ToString("X"), newMeshKey.ToString("X")); + + // Since we're recreating new, get rid of the reference to the previous shape + DereferenceShape(prim.PhysShape, true, shapeCallback); + + newShape = CreatePhysicalMesh(prim.PhysObjectName, newMeshKey, prim.BaseShape, prim.Size, lod); + // Take evasive action if the mesh was not constructed. + newShape = VerifyMeshCreated(newShape, prim); + + ReferenceShape(newShape); + + prim.PhysShape = newShape; + + return true; // 'true' means a new shape has been added to this prim + } + + private BulletShape CreatePhysicalMesh(string objName, System.UInt64 newMeshKey, PrimitiveBaseShape pbs, OMV.Vector3 size, float lod) + { + IMesh meshData = null; + Object meshPtr = null; + MeshDesc meshDesc; + if (Meshes.TryGetValue(newMeshKey, out meshDesc)) + { + // If the mesh has already been built just use it. + meshPtr = meshDesc.ptr; + } + else + { + meshData = PhysicsScene.mesher.CreateMesh(objName, pbs, size, lod, true, false); + + if (meshData != null) + { + int[] indices = meshData.getIndexListAsInt(); + List vertices = meshData.getVertexList(); + + float[] verticesAsFloats = new float[vertices.Count * 3]; + int vi = 0; + foreach (OMV.Vector3 vv in vertices) + { + verticesAsFloats[vi++] = vv.X; + verticesAsFloats[vi++] = vv.Y; + verticesAsFloats[vi++] = vv.Z; + } + + // m_log.DebugFormat("{0}: BSShapeCollection.CreatePhysicalMesh: calling CreateMesh. lid={1}, key={2}, indices={3}, vertices={4}", + // LogHeader, prim.LocalID, newMeshKey, indices.Length, vertices.Count); + + meshPtr = BulletSimAPI.CreateMeshShape2(PhysicsScene.World.ptr, + indices.GetLength(0), indices, vertices.Count, verticesAsFloats); + } + } + BulletShape newShape = new BulletShape(meshPtr, BSPhysicsShapeType.SHAPE_MESH); + newShape.shapeKey = newMeshKey; + + return newShape; + } + + // See that hull shape exists in the physical world and update prim.BSShape. + // We could be creating the hull because scale changed or whatever. + private bool GetReferenceToHull(BSPhysObject prim, ShapeDestructionCallback shapeCallback) + { + BulletShape newShape; + + float lod; + System.UInt64 newHullKey = ComputeShapeKey(prim.Size, prim.BaseShape, out lod); + + // if the hull hasn't changed, don't rebuild it + if (newHullKey == prim.PhysShape.shapeKey && prim.PhysShape.type == BSPhysicsShapeType.SHAPE_HULL) + return false; + + if (DDetail) DetailLog("{0},BSShapeCollection.GetReferenceToHull,create,oldKey={1},newKey={2}", + prim.LocalID, prim.PhysShape.shapeKey.ToString("X"), newHullKey.ToString("X")); + + // Remove usage of the previous shape. + DereferenceShape(prim.PhysShape, true, shapeCallback); + + newShape = CreatePhysicalHull(prim.PhysObjectName, newHullKey, prim.BaseShape, prim.Size, lod); + newShape = VerifyMeshCreated(newShape, prim); + + ReferenceShape(newShape); + + prim.PhysShape = newShape; + return true; // 'true' means a new shape has been added to this prim + } + + List m_hulls; + private BulletShape CreatePhysicalHull(string objName, System.UInt64 newHullKey, PrimitiveBaseShape pbs, OMV.Vector3 size, float lod) + { + + Object hullPtr = null; + HullDesc hullDesc; + if (Hulls.TryGetValue(newHullKey, out hullDesc)) + { + // If the hull shape already is created, just use it. + hullPtr = hullDesc.ptr; + } + else + { + // Build a new hull in the physical world + // Pass true for physicalness as this creates some sort of bounding box which we don't need + IMesh meshData = PhysicsScene.mesher.CreateMesh(objName, pbs, size, lod, true, false); + if (meshData != null) + { + + int[] indices = meshData.getIndexListAsInt(); + List vertices = meshData.getVertexList(); + + //format conversion from IMesh format to DecompDesc format + List convIndices = new List(); + List convVertices = new List(); + for (int ii = 0; ii < indices.GetLength(0); ii++) + { + convIndices.Add(indices[ii]); + } + foreach (OMV.Vector3 vv in vertices) + { + convVertices.Add(new float3(vv.X, vv.Y, vv.Z)); + } + + // setup and do convex hull conversion + m_hulls = new List(); + DecompDesc dcomp = new DecompDesc(); + dcomp.mIndices = convIndices; + dcomp.mVertices = convVertices; + ConvexBuilder convexBuilder = new ConvexBuilder(HullReturn); + // create the hull into the _hulls variable + convexBuilder.process(dcomp); + + // Convert the vertices and indices for passing to unmanaged. + // The hull information is passed as a large floating point array. + // The format is: + // convHulls[0] = number of hulls + // convHulls[1] = number of vertices in first hull + // convHulls[2] = hull centroid X coordinate + // convHulls[3] = hull centroid Y coordinate + // convHulls[4] = hull centroid Z coordinate + // convHulls[5] = first hull vertex X + // convHulls[6] = first hull vertex Y + // convHulls[7] = first hull vertex Z + // convHulls[8] = second hull vertex X + // ... + // convHulls[n] = number of vertices in second hull + // convHulls[n+1] = second hull centroid X coordinate + // ... + // + // TODO: is is very inefficient. Someday change the convex hull generator to return + // data structures that do not need to be converted in order to pass to Bullet. + // And maybe put the values directly into pinned memory rather than marshaling. + int hullCount = m_hulls.Count; + int totalVertices = 1; // include one for the count of the hulls + foreach (ConvexResult cr in m_hulls) + { + totalVertices += 4; // add four for the vertex count and centroid + totalVertices += cr.HullIndices.Count * 3; // we pass just triangles + } + float[] convHulls = new float[totalVertices]; + + convHulls[0] = (float)hullCount; + int jj = 1; + foreach (ConvexResult cr in m_hulls) + { + // copy vertices for index access + float3[] verts = new float3[cr.HullVertices.Count]; + int kk = 0; + foreach (float3 ff in cr.HullVertices) + { + verts[kk++] = ff; + } + + // add to the array one hull's worth of data + convHulls[jj++] = cr.HullIndices.Count; + convHulls[jj++] = 0f; // centroid x,y,z + convHulls[jj++] = 0f; + convHulls[jj++] = 0f; + foreach (int ind in cr.HullIndices) + { + convHulls[jj++] = verts[ind].x; + convHulls[jj++] = verts[ind].y; + convHulls[jj++] = verts[ind].z; + } + } + // create the hull data structure in Bullet + hullPtr = BulletSimAPI.CreateHullShape2(PhysicsScene.World.ptr, hullCount, convHulls); + } + } + + BulletShape newShape = new BulletShape(hullPtr, BSPhysicsShapeType.SHAPE_HULL); + newShape.shapeKey = newHullKey; + + return newShape; + } + + // Callback from convex hull creater with a newly created hull. + // Just add it to our collection of hulls for this shape. + private void HullReturn(ConvexResult result) + { + m_hulls.Add(result); + return; + } + + // Compound shapes are always built from scratch. + // This shouldn't be to bad since most of the parts will be meshes that had been built previously. + private bool GetReferenceToCompoundShape(BSPhysObject prim, ShapeDestructionCallback shapeCallback) + { + // Remove reference to the old shape + // Don't need to do this as the shape is freed when the new root shape is created below. + // DereferenceShape(prim.PhysShape, true, shapeCallback); + + BulletShape cShape = new BulletShape( + BulletSimAPI.CreateCompoundShape2(PhysicsScene.World.ptr, false), BSPhysicsShapeType.SHAPE_COMPOUND); + + // Create the shape for the root prim and add it to the compound shape. Cannot be a native shape. + CreateGeomMeshOrHull(prim, shapeCallback); + BulletSimAPI.AddChildShapeToCompoundShape2(cShape.ptr, prim.PhysShape.ptr, OMV.Vector3.Zero, OMV.Quaternion.Identity); + if (DDetail) DetailLog("{0},BSShapeCollection.GetReferenceToCompoundShape,addRootPrim,compShape={1},rootShape={2}", + prim.LocalID, cShape, prim.PhysShape); + + prim.PhysShape = cShape; + + return true; + } + + // Create a hash of all the shape parameters to be used as a key + // for this particular shape. + private System.UInt64 ComputeShapeKey(OMV.Vector3 size, PrimitiveBaseShape pbs, out float retLod) + { + // level of detail based on size and type of the object + float lod = BSParam.MeshLOD; + if (pbs.SculptEntry) + lod = BSParam.SculptLOD; + + // Mega prims usually get more detail because one can interact with shape approximations at this size. + float maxAxis = Math.Max(size.X, Math.Max(size.Y, size.Z)); + if (maxAxis > BSParam.MeshMegaPrimThreshold) + lod = BSParam.MeshMegaPrimLOD; + + retLod = lod; + return pbs.GetMeshKey(size, lod); + } + // For those who don't want the LOD + private System.UInt64 ComputeShapeKey(OMV.Vector3 size, PrimitiveBaseShape pbs) + { + float lod; + return ComputeShapeKey(size, pbs, out lod); + } + + // The creation of a mesh or hull can fail if an underlying asset is not available. + // There are two cases: 1) the asset is not in the cache and it needs to be fetched; + // and 2) the asset cannot be converted (like failed decompression of JPEG2000s). + // The first case causes the asset to be fetched. The second case requires + // us to not loop forever. + // Called after creating a physical mesh or hull. If the physical shape was created, + // just return. + private BulletShape VerifyMeshCreated(BulletShape newShape, BSPhysObject prim) + { + // If the shape was successfully created, nothing more to do + if (newShape.HasPhysicalShape) + return newShape; + + // If this mesh has an underlying asset and we have not failed getting it before, fetch the asset + if (prim.BaseShape.SculptEntry && !prim.LastAssetBuildFailed && prim.BaseShape.SculptTexture != OMV.UUID.Zero) + { + prim.LastAssetBuildFailed = true; + BSPhysObject xprim = prim; + DetailLog("{0},BSShapeCollection.VerifyMeshCreated,fetchAsset,lID={1},lastFailed={2}", + LogHeader, prim.LocalID, prim.LastAssetBuildFailed); + Util.FireAndForget(delegate + { + RequestAssetDelegate assetProvider = PhysicsScene.RequestAssetMethod; + if (assetProvider != null) + { + BSPhysObject yprim = xprim; // probably not necessary, but, just in case. + assetProvider(yprim.BaseShape.SculptTexture, delegate(AssetBase asset) + { + if (!yprim.BaseShape.SculptEntry) + return; + if (yprim.BaseShape.SculptTexture.ToString() != asset.ID) + return; + + yprim.BaseShape.SculptData = asset.Data; + // This will cause the prim to see that the filler shape is not the right + // one and try again to build the object. + // No race condition with the normal shape setting since the rebuild is at taint time. + yprim.ForceBodyShapeRebuild(false); + + }); + } + }); + } + else + { + if (prim.LastAssetBuildFailed) + { + PhysicsScene.Logger.ErrorFormat("{0} Mesh failed to fetch asset. lID={1}, texture={2}", + LogHeader, prim.LocalID, prim.BaseShape.SculptTexture); + } + } + + // While we figure out the real problem, stick a simple native shape on the object. + BulletShape fillinShape = + BuildPhysicalNativeShape(prim, BSPhysicsShapeType.SHAPE_BOX, FixedShapeKey.KEY_BOX); + + return fillinShape; + } + + // Create a body object in Bullet. + // Updates prim.BSBody with the information about the new body if one is created. + // Returns 'true' if an object was actually created. + // Called at taint-time. + private bool CreateBody(bool forceRebuild, BSPhysObject prim, BulletSim sim, BulletShape shape, + BodyDestructionCallback bodyCallback) + { + bool ret = false; + + // the mesh, hull or native shape must have already been created in Bullet + bool mustRebuild = !prim.PhysBody.HasPhysicalBody; + + // If there is an existing body, verify it's of an acceptable type. + // If not a solid object, body is a GhostObject. Otherwise a RigidBody. + if (!mustRebuild) + { + CollisionObjectTypes bodyType = (CollisionObjectTypes)BulletSimAPI.GetBodyType2(prim.PhysBody.ptr); + if (prim.IsSolid && bodyType != CollisionObjectTypes.CO_RIGID_BODY + || !prim.IsSolid && bodyType != CollisionObjectTypes.CO_GHOST_OBJECT) + { + // If the collisionObject is not the correct type for solidness, rebuild what's there + mustRebuild = true; + } + } + + if (mustRebuild || forceRebuild) + { + // Free any old body + DereferenceBody(prim.PhysBody, true, bodyCallback); + + BulletBody aBody; + Object bodyPtr = null; + if (prim.IsSolid) + { + bodyPtr = BulletSimAPI.CreateBodyFromShape2(sim.ptr, shape.ptr, + prim.LocalID, prim.RawPosition, prim.RawOrientation); + if (DDetail) DetailLog("{0},BSShapeCollection.CreateBody,mesh,ptr={1}", prim.LocalID, bodyPtr.ToString()); + } + else + { + bodyPtr = BulletSimAPI.CreateGhostFromShape2(sim.ptr, shape.ptr, + prim.LocalID, prim.RawPosition, prim.RawOrientation); + if (DDetail) DetailLog("{0},BSShapeCollection.CreateBody,ghost,ptr={1}", prim.LocalID, bodyPtr.ToString()); + } + aBody = new BulletBody(prim.LocalID, bodyPtr); + + ReferenceBody(aBody, true); + + prim.PhysBody = aBody; + + ret = true; + } + + return ret; + } + + private bool TryGetMeshByPtr(Object addr, out MeshDesc outDesc) + { + bool ret = false; + MeshDesc foundDesc = new MeshDesc(); + foreach (MeshDesc md in Meshes.Values) + { + if (md.ptr == addr) + { + foundDesc = md; + ret = true; + break; + } + + } + outDesc = foundDesc; + return ret; + } + + private bool TryGetHullByPtr(Object addr, out HullDesc outDesc) + { + bool ret = false; + HullDesc foundDesc = new HullDesc(); + foreach (HullDesc hd in Hulls.Values) + { + if (hd.ptr == addr) + { + foundDesc = hd; + ret = true; + break; + } + + } + outDesc = foundDesc; + return ret; + } + + private void DetailLog(string msg, params Object[] args) + { + if (PhysicsScene.PhysicsLogging.Enabled) + PhysicsScene.DetailLog(msg, args); + } +} +} diff --git a/OpenSim/Region/Physics/BulletSNPlugin/BSShapes.cs b/OpenSim/Region/Physics/BulletSNPlugin/BSShapes.cs new file mode 100644 index 0000000000..8ff027535c --- /dev/null +++ b/OpenSim/Region/Physics/BulletSNPlugin/BSShapes.cs @@ -0,0 +1,208 @@ +/* + * 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 copyrightD + * 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.Linq; +using System.Text; + +namespace OpenSim.Region.Physics.BulletSNPlugin +{ +public abstract class BSShape +{ + public Object ptr { get; set; } + public BSPhysicsShapeType type { get; set; } + public System.UInt64 key { get; set; } + public int referenceCount { get; set; } + public DateTime lastReferenced { get; set; } + + public BSShape() + { + ptr = null; + type = BSPhysicsShapeType.SHAPE_UNKNOWN; + key = 0; + referenceCount = 0; + lastReferenced = DateTime.Now; + } + + // Get a reference to a physical shape. Create if it doesn't exist + public static BSShape GetShapeReference(BSScene physicsScene, bool forceRebuild, BSPhysObject prim) + { + BSShape ret = null; + + if (prim.PreferredPhysicalShape == BSPhysicsShapeType.SHAPE_CAPSULE) + { + // an avatar capsule is close to a native shape (it is not shared) + ret = BSShapeNative.GetReference(physicsScene, prim, BSPhysicsShapeType.SHAPE_CAPSULE, + FixedShapeKey.KEY_CAPSULE); + physicsScene.DetailLog("{0},BSShape.GetShapeReference,avatarCapsule,shape={1}", prim.LocalID, ret); + } + + // Compound shapes are handled special as they are rebuilt from scratch. + // This isn't too great a hardship since most of the child shapes will already been created. + if (ret == null && prim.PreferredPhysicalShape == BSPhysicsShapeType.SHAPE_COMPOUND) + { + // Getting a reference to a compound shape gets you the compound shape with the root prim shape added + ret = BSShapeCompound.GetReference(prim); + physicsScene.DetailLog("{0},BSShapeCollection.CreateGeom,compoundShape,shape={1}", prim.LocalID, ret); + } + + if (ret == null) + ret = GetShapeReferenceNonSpecial(physicsScene, forceRebuild, prim); + + return ret; + } + public static BSShape GetShapeReferenceNonSpecial(BSScene physicsScene, bool forceRebuild, BSPhysObject prim) + { + return null; + } + public static BSShape GetShapeReferenceNonNative(BSScene physicsScene, bool forceRebuild, BSPhysObject prim) + { + return null; + } + + // Release the use of a physical shape. + public abstract void Dereference(BSScene physicsScene); + + // All shapes have a static call to get a reference to the physical shape + // protected abstract static BSShape GetReference(); + + public override string ToString() + { + StringBuilder buff = new StringBuilder(); + buff.Append(""); + return buff.ToString(); + } +} + +public class BSShapeNull : BSShape +{ + public BSShapeNull() : base() + { + } + public static BSShape GetReference() { return new BSShapeNull(); } + public override void Dereference(BSScene physicsScene) { /* The magic of garbage collection will make this go away */ } +} + +public class BSShapeNative : BSShape +{ + private static string LogHeader = "[BULLETSIM SHAPE NATIVE]"; + public BSShapeNative() : base() + { + } + public static BSShape GetReference(BSScene physicsScene, BSPhysObject prim, + BSPhysicsShapeType shapeType, FixedShapeKey shapeKey) + { + // Native shapes are not shared and are always built anew. + return new BSShapeNative(physicsScene, prim, shapeType, shapeKey); + } + + private BSShapeNative(BSScene physicsScene, BSPhysObject prim, + BSPhysicsShapeType shapeType, FixedShapeKey shapeKey) + { + ShapeData nativeShapeData = new ShapeData(); + nativeShapeData.Type = shapeType; + nativeShapeData.ID = prim.LocalID; + nativeShapeData.Scale = prim.Scale; + nativeShapeData.Size = prim.Scale; + nativeShapeData.MeshKey = (ulong)shapeKey; + nativeShapeData.HullKey = (ulong)shapeKey; + + + if (shapeType == BSPhysicsShapeType.SHAPE_CAPSULE) + { + ptr = BulletSimAPI.BuildCapsuleShape2(physicsScene.World.ptr, 1f, 1f, prim.Scale); + physicsScene.DetailLog("{0},BSShapeCollection.BuiletPhysicalNativeShape,capsule,scale={1}", prim.LocalID, prim.Scale); + } + else + { + ptr = BulletSimAPI.BuildNativeShape2(physicsScene.World.ptr, nativeShapeData); + } + if (ptr == null) + { + physicsScene.Logger.ErrorFormat("{0} BuildPhysicalNativeShape failed. ID={1}, shape={2}", + LogHeader, prim.LocalID, shapeType); + } + type = shapeType; + key = (UInt64)shapeKey; + } + // Make this reference to the physical shape go away since native shapes are not shared. + public override void Dereference(BSScene physicsScene) + { + // Native shapes are not tracked and are released immediately + physicsScene.DetailLog("{0},BSShapeCollection.DereferenceShape,deleteNativeShape,shape={1}", BSScene.DetailLogZero, this); + BulletSimAPI.DeleteCollisionShape2(physicsScene.World.ptr, ptr); + ptr = null; + // Garbage collection will free up this instance. + } +} + +public class BSShapeMesh : BSShape +{ + private static string LogHeader = "[BULLETSIM SHAPE MESH]"; + private static Dictionary Meshes = new Dictionary(); + + public BSShapeMesh() : base() + { + } + public static BSShape GetReference() { return new BSShapeNull(); } + public override void Dereference(BSScene physicsScene) { } +} + +public class BSShapeHull : BSShape +{ + private static string LogHeader = "[BULLETSIM SHAPE HULL]"; + private static Dictionary Hulls = new Dictionary(); + + public BSShapeHull() : base() + { + } + public static BSShape GetReference() { return new BSShapeNull(); } + public override void Dereference(BSScene physicsScene) { } +} + +public class BSShapeCompound : BSShape +{ + private static string LogHeader = "[BULLETSIM SHAPE COMPOUND]"; + public BSShapeCompound() : base() + { + } + public static BSShape GetReference(BSPhysObject prim) + { + return new BSShapeNull(); + } + public override void Dereference(BSScene physicsScene) { } +} +} diff --git a/OpenSim/Region/Physics/BulletSNPlugin/BSTerrainHeightmap.cs b/OpenSim/Region/Physics/BulletSNPlugin/BSTerrainHeightmap.cs new file mode 100644 index 0000000000..252953ba58 --- /dev/null +++ b/OpenSim/Region/Physics/BulletSNPlugin/BSTerrainHeightmap.cs @@ -0,0 +1,175 @@ +/* + * 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 copyrightD + * 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.Text; + +using OpenSim.Framework; +using OpenSim.Region.Framework; +using OpenSim.Region.CoreModules; +using OpenSim.Region.Physics.Manager; + +using Nini.Config; +using log4net; + +using OpenMetaverse; + +namespace OpenSim.Region.Physics.BulletSNPlugin +{ +public sealed class BSTerrainHeightmap : BSTerrainPhys +{ + static string LogHeader = "[BULLETSIM TERRAIN HEIGHTMAP]"; + + BulletHeightMapInfo m_mapInfo = null; + + // Constructor to build a default, flat heightmap terrain. + public BSTerrainHeightmap(BSScene physicsScene, Vector3 regionBase, uint id, Vector3 regionSize) + : base(physicsScene, regionBase, id) + { + Vector3 minTerrainCoords = new Vector3(0f, 0f, BSTerrainManager.HEIGHT_INITIALIZATION - BSTerrainManager.HEIGHT_EQUAL_FUDGE); + Vector3 maxTerrainCoords = new Vector3(regionSize.X, regionSize.Y, BSTerrainManager.HEIGHT_INITIALIZATION); + int totalHeights = (int)maxTerrainCoords.X * (int)maxTerrainCoords.Y; + float[] initialMap = new float[totalHeights]; + for (int ii = 0; ii < totalHeights; ii++) + { + initialMap[ii] = BSTerrainManager.HEIGHT_INITIALIZATION; + } + m_mapInfo = new BulletHeightMapInfo(id, initialMap, null); + m_mapInfo.minCoords = minTerrainCoords; + m_mapInfo.maxCoords = maxTerrainCoords; + m_mapInfo.terrainRegionBase = TerrainBase; + // Don't have to free any previous since we just got here. + BuildHeightmapTerrain(); + } + + // This minCoords and maxCoords passed in give the size of the terrain (min and max Z + // are the high and low points of the heightmap). + public BSTerrainHeightmap(BSScene physicsScene, Vector3 regionBase, uint id, float[] initialMap, + Vector3 minCoords, Vector3 maxCoords) + : base(physicsScene, regionBase, id) + { + m_mapInfo = new BulletHeightMapInfo(id, initialMap, null); + m_mapInfo.minCoords = minCoords; + m_mapInfo.maxCoords = maxCoords; + m_mapInfo.minZ = minCoords.Z; + m_mapInfo.maxZ = maxCoords.Z; + m_mapInfo.terrainRegionBase = TerrainBase; + + // Don't have to free any previous since we just got here. + BuildHeightmapTerrain(); + } + + public override void Dispose() + { + ReleaseHeightMapTerrain(); + } + + // Using the information in m_mapInfo, create the physical representation of the heightmap. + private void BuildHeightmapTerrain() + { + m_mapInfo.Ptr = BulletSimAPI.CreateHeightMapInfo2(PhysicsScene.World.ptr, m_mapInfo.ID, + m_mapInfo.minCoords, m_mapInfo.maxCoords, + m_mapInfo.heightMap, BSParam.TerrainCollisionMargin); + + // Create the terrain shape from the mapInfo + m_mapInfo.terrainShape = new BulletShape(BulletSimAPI.CreateTerrainShape2(m_mapInfo.Ptr), + BSPhysicsShapeType.SHAPE_TERRAIN); + + // The terrain object initial position is at the center of the object + Vector3 centerPos; + centerPos.X = m_mapInfo.minCoords.X + (m_mapInfo.sizeX / 2f); + centerPos.Y = m_mapInfo.minCoords.Y + (m_mapInfo.sizeY / 2f); + centerPos.Z = m_mapInfo.minZ + ((m_mapInfo.maxZ - m_mapInfo.minZ) / 2f + 0.5f); + + m_mapInfo.terrainBody = new BulletBody(m_mapInfo.ID, + BulletSimAPI.CreateBodyWithDefaultMotionState2(m_mapInfo.terrainShape.ptr, + m_mapInfo.ID, centerPos, Quaternion.Identity)); + + // Set current terrain attributes + BulletSimAPI.SetFriction2(m_mapInfo.terrainBody.ptr, BSParam.TerrainFriction); + BulletSimAPI.SetHitFraction2(m_mapInfo.terrainBody.ptr, BSParam.TerrainHitFraction); + BulletSimAPI.SetRestitution2(m_mapInfo.terrainBody.ptr, BSParam.TerrainRestitution); + BulletSimAPI.SetCollisionFlags2(m_mapInfo.terrainBody.ptr, CollisionFlags.CF_STATIC_OBJECT); + + // Return the new terrain to the world of physical objects + BulletSimAPI.AddObjectToWorld2(PhysicsScene.World.ptr, m_mapInfo.terrainBody.ptr, centerPos, Quaternion.Identity); + + // redo its bounding box now that it is in the world + BulletSimAPI.UpdateSingleAabb2(PhysicsScene.World.ptr, m_mapInfo.terrainBody.ptr); + + m_mapInfo.terrainBody.collisionType = CollisionType.Terrain; + m_mapInfo.terrainBody.ApplyCollisionMask(); + + // Make it so the terrain will not move or be considered for movement. + BulletSimAPI.ForceActivationState2(m_mapInfo.terrainBody.ptr, ActivationState.DISABLE_SIMULATION); + + return; + } + + // If there is information in m_mapInfo pointing to physical structures, release same. + private void ReleaseHeightMapTerrain() + { + if (m_mapInfo != null) + { + if (m_mapInfo.terrainBody.HasPhysicalBody) + { + BulletSimAPI.RemoveObjectFromWorld2(PhysicsScene.World.ptr, m_mapInfo.terrainBody.ptr); + // Frees both the body and the shape. + BulletSimAPI.DestroyObject2(PhysicsScene.World.ptr, m_mapInfo.terrainBody.ptr); + BulletSimAPI.ReleaseHeightMapInfo2(m_mapInfo.Ptr); + } + } + m_mapInfo = null; + } + + // The passed position is relative to the base of the region. + public override float GetTerrainHeightAtXYZ(Vector3 pos) + { + float ret = BSTerrainManager.HEIGHT_GETHEIGHT_RET; + + int mapIndex = (int)pos.Y * (int)m_mapInfo.sizeY + (int)pos.X; + try + { + ret = m_mapInfo.heightMap[mapIndex]; + } + catch + { + // Sometimes they give us wonky values of X and Y. Give a warning and return something. + PhysicsScene.Logger.WarnFormat("{0} Bad request for terrain height. terrainBase={1}, pos={2}", + LogHeader, m_mapInfo.terrainRegionBase, pos); + ret = BSTerrainManager.HEIGHT_GETHEIGHT_RET; + } + return ret; + } + + // The passed position is relative to the base of the region. + public override float GetWaterLevelAtXYZ(Vector3 pos) + { + return PhysicsScene.SimpleWaterLevel; + } +} +} diff --git a/OpenSim/Region/Physics/BulletSNPlugin/BSTerrainManager.cs b/OpenSim/Region/Physics/BulletSNPlugin/BSTerrainManager.cs new file mode 100644 index 0000000000..dfad70ed2b --- /dev/null +++ b/OpenSim/Region/Physics/BulletSNPlugin/BSTerrainManager.cs @@ -0,0 +1,460 @@ +/* + * 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 copyrightD + * 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.Text; + +using OpenSim.Framework; +using OpenSim.Region.Framework; +using OpenSim.Region.CoreModules; +using OpenSim.Region.Physics.Manager; + +using Nini.Config; +using log4net; + +using OpenMetaverse; + +namespace OpenSim.Region.Physics.BulletSNPlugin +{ + +// The physical implementation of the terrain is wrapped in this class. +public abstract class BSTerrainPhys : IDisposable +{ + public enum TerrainImplementation + { + Heightmap = 0, + Mesh = 1 + } + + public BSScene PhysicsScene { get; private set; } + // Base of the region in world coordinates. Coordinates inside the region are relative to this. + public Vector3 TerrainBase { get; private set; } + public uint ID { get; private set; } + + public BSTerrainPhys(BSScene physicsScene, Vector3 regionBase, uint id) + { + PhysicsScene = physicsScene; + TerrainBase = regionBase; + ID = id; + } + public abstract void Dispose(); + public abstract float GetTerrainHeightAtXYZ(Vector3 pos); + public abstract float GetWaterLevelAtXYZ(Vector3 pos); +} + +// ========================================================================================== +public sealed class BSTerrainManager : IDisposable +{ + static string LogHeader = "[BULLETSIM TERRAIN MANAGER]"; + + // These height values are fractional so the odd values will be + // noticable when debugging. + public const float HEIGHT_INITIALIZATION = 24.987f; + public const float HEIGHT_INITIAL_LASTHEIGHT = 24.876f; + public const float HEIGHT_GETHEIGHT_RET = 24.765f; + public const float WATER_HEIGHT_GETHEIGHT_RET = 19.998f; + + // If the min and max height are equal, we reduce the min by this + // amount to make sure that a bounding box is built for the terrain. + public const float HEIGHT_EQUAL_FUDGE = 0.2f; + + // Until the whole simulator is changed to pass us the region size, we rely on constants. + public Vector3 DefaultRegionSize = new Vector3(Constants.RegionSize, Constants.RegionSize, Constants.RegionHeight); + + // The scene that I am part of + private BSScene PhysicsScene { get; set; } + + // The ground plane created to keep thing from falling to infinity. + private BulletBody m_groundPlane; + + // If doing mega-regions, if we're region zero we will be managing multiple + // region terrains since region zero does the physics for the whole mega-region. + private Dictionary m_terrains; + + // Flags used to know when to recalculate the height. + private bool m_terrainModified = false; + + // If we are doing mega-regions, terrains are added from TERRAIN_ID to m_terrainCount. + // This is incremented before assigning to new region so it is the last ID allocated. + private uint m_terrainCount = BSScene.CHILDTERRAIN_ID - 1; + public uint HighestTerrainID { get {return m_terrainCount; } } + + // If doing mega-regions, this holds our offset from region zero of + // the mega-regions. "parentScene" points to the PhysicsScene of region zero. + private Vector3 m_worldOffset; + // If the parent region (region 0), this is the extent of the combined regions + // relative to the origin of region zero + private Vector3 m_worldMax; + private PhysicsScene MegaRegionParentPhysicsScene { get; set; } + + public BSTerrainManager(BSScene physicsScene) + { + PhysicsScene = physicsScene; + m_terrains = new Dictionary(); + + // Assume one region of default size + m_worldOffset = Vector3.Zero; + m_worldMax = new Vector3(DefaultRegionSize); + MegaRegionParentPhysicsScene = null; + } + + public void Dispose() + { + ReleaseGroundPlaneAndTerrain(); + } + + // Create the initial instance of terrain and the underlying ground plane. + // This is called from the initialization routine so we presume it is + // safe to call Bullet in real time. We hope no one is moving prims around yet. + public void CreateInitialGroundPlaneAndTerrain() + { + // The ground plane is here to catch things that are trying to drop to negative infinity + BulletShape groundPlaneShape = new BulletShape( + BulletSimAPI.CreateGroundPlaneShape2(BSScene.GROUNDPLANE_ID, 1f, + BSParam.TerrainCollisionMargin), + BSPhysicsShapeType.SHAPE_GROUNDPLANE); + m_groundPlane = new BulletBody(BSScene.GROUNDPLANE_ID, + BulletSimAPI.CreateBodyWithDefaultMotionState2(groundPlaneShape.ptr, BSScene.GROUNDPLANE_ID, + Vector3.Zero, Quaternion.Identity)); + BulletSimAPI.AddObjectToWorld2(PhysicsScene.World.ptr, m_groundPlane.ptr); + BulletSimAPI.UpdateSingleAabb2(PhysicsScene.World.ptr, m_groundPlane.ptr); + // Ground plane does not move + BulletSimAPI.ForceActivationState2(m_groundPlane.ptr, ActivationState.DISABLE_SIMULATION); + // Everything collides with the ground plane. + m_groundPlane.collisionType = CollisionType.Groundplane; + m_groundPlane.ApplyCollisionMask(); + + // Build an initial terrain and put it in the world. This quickly gets replaced by the real region terrain. + BSTerrainPhys initialTerrain = new BSTerrainHeightmap(PhysicsScene, Vector3.Zero, BSScene.TERRAIN_ID, DefaultRegionSize); + m_terrains.Add(Vector3.Zero, initialTerrain); + } + + // Release all the terrain structures we might have allocated + public void ReleaseGroundPlaneAndTerrain() + { + if (m_groundPlane.HasPhysicalBody) + { + if (BulletSimAPI.RemoveObjectFromWorld2(PhysicsScene.World.ptr, m_groundPlane.ptr)) + { + BulletSimAPI.DestroyObject2(PhysicsScene.World.ptr, m_groundPlane.ptr); + } + m_groundPlane.Clear(); + } + + ReleaseTerrain(); + } + + // Release all the terrain we have allocated + public void ReleaseTerrain() + { + lock (m_terrains) + { + foreach (KeyValuePair kvp in m_terrains) + { + kvp.Value.Dispose(); + } + m_terrains.Clear(); + } + } + + // The simulator wants to set a new heightmap for the terrain. + public void SetTerrain(float[] heightMap) { + float[] localHeightMap = heightMap; + // If there are multiple requests for changes to the same terrain between ticks, + // only do that last one. + PhysicsScene.PostTaintObject("TerrainManager.SetTerrain-"+ m_worldOffset.ToString(), 0, delegate() + { + if (m_worldOffset != Vector3.Zero && MegaRegionParentPhysicsScene != null) + { + // If a child of a mega-region, we shouldn't have any terrain allocated for us + ReleaseGroundPlaneAndTerrain(); + // If doing the mega-prim stuff and we are the child of the zero region, + // the terrain is added to our parent + if (MegaRegionParentPhysicsScene is BSScene) + { + DetailLog("{0},SetTerrain.ToParent,offset={1},worldMax={2}", + BSScene.DetailLogZero, m_worldOffset, m_worldMax); + ((BSScene)MegaRegionParentPhysicsScene).TerrainManager.UpdateTerrain( + BSScene.CHILDTERRAIN_ID, localHeightMap, + m_worldOffset, m_worldOffset + DefaultRegionSize, true); + } + } + else + { + // If not doing the mega-prim thing, just change the terrain + DetailLog("{0},SetTerrain.Existing", BSScene.DetailLogZero); + + UpdateTerrain(BSScene.TERRAIN_ID, localHeightMap, + m_worldOffset, m_worldOffset + DefaultRegionSize, true); + } + }); + } + + // If called with no mapInfo for the terrain, this will create a new mapInfo and terrain + // based on the passed information. The 'id' should be either the terrain id or + // BSScene.CHILDTERRAIN_ID. If the latter, a new child terrain ID will be allocated and used. + // The latter feature is for creating child terrains for mega-regions. + // If called with a mapInfo in m_heightMaps and there is an existing terrain body, a new + // terrain shape is created and added to the body. + // This call is most often used to update the heightMap and parameters of the terrain. + // (The above does suggest that some simplification/refactoring is in order.) + // Called during taint-time. + private void UpdateTerrain(uint id, float[] heightMap, + Vector3 minCoords, Vector3 maxCoords, bool inTaintTime) + { + DetailLog("{0},BSTerrainManager.UpdateTerrain,call,minC={1},maxC={2},inTaintTime={3}", + BSScene.DetailLogZero, minCoords, maxCoords, inTaintTime); + + // Find high and low points of passed heightmap. + // The min and max passed in is usually the area objects can be in (maximum + // object height, for instance). The terrain wants the bounding box for the + // terrain so replace passed min and max Z with the actual terrain min/max Z. + float minZ = float.MaxValue; + float maxZ = float.MinValue; + foreach (float height in heightMap) + { + if (height < minZ) minZ = height; + if (height > maxZ) maxZ = height; + } + if (minZ == maxZ) + { + // If min and max are the same, reduce min a little bit so a good bounding box is created. + minZ -= BSTerrainManager.HEIGHT_EQUAL_FUDGE; + } + minCoords.Z = minZ; + maxCoords.Z = maxZ; + + Vector3 terrainRegionBase = new Vector3(minCoords.X, minCoords.Y, 0f); + + lock (m_terrains) + { + BSTerrainPhys terrainPhys; + if (m_terrains.TryGetValue(terrainRegionBase, out terrainPhys)) + { + // There is already a terrain in this spot. Free the old and build the new. + DetailLog("{0},UpdateTerrain:UpdateExisting,call,id={1},base={2},minC={3},maxC={4}", + BSScene.DetailLogZero, id, terrainRegionBase, minCoords, minCoords); + + // Remove old terrain from the collection + m_terrains.Remove(terrainRegionBase); + // Release any physical memory it may be using. + terrainPhys.Dispose(); + + if (MegaRegionParentPhysicsScene == null) + { + BSTerrainPhys newTerrainPhys = BuildPhysicalTerrain(terrainRegionBase, id, heightMap, minCoords, maxCoords); + m_terrains.Add(terrainRegionBase, newTerrainPhys); + + m_terrainModified = true; + } + else + { + // It's possible that Combine() was called after this code was queued. + // If we are a child of combined regions, we don't create any terrain for us. + DetailLog("{0},BSTerrainManager.UpdateTerrain:AmACombineChild,taint", BSScene.DetailLogZero); + + // Get rid of any terrain that may have been allocated for us. + ReleaseGroundPlaneAndTerrain(); + + // I hate doing this, but just bail + return; + } + } + else + { + // We don't know about this terrain so either we are creating a new terrain or + // our mega-prim child is giving us a new terrain to add to the phys world + + // if this is a child terrain, calculate a unique terrain id + uint newTerrainID = id; + if (newTerrainID >= BSScene.CHILDTERRAIN_ID) + newTerrainID = ++m_terrainCount; + + DetailLog("{0},UpdateTerrain:NewTerrain,taint,newID={1},minCoord={2},maxCoord={3}", + BSScene.DetailLogZero, newTerrainID, minCoords, minCoords); + BSTerrainPhys newTerrainPhys = BuildPhysicalTerrain(terrainRegionBase, id, heightMap, minCoords, maxCoords); + m_terrains.Add(terrainRegionBase, newTerrainPhys); + + m_terrainModified = true; + } + } + } + + // TODO: redo terrain implementation selection to allow other base types than heightMap. + private BSTerrainPhys BuildPhysicalTerrain(Vector3 terrainRegionBase, uint id, float[] heightMap, Vector3 minCoords, Vector3 maxCoords) + { + PhysicsScene.Logger.DebugFormat("{0} Terrain for {1}/{2} created with {3}", + LogHeader, PhysicsScene.RegionName, terrainRegionBase, + (BSTerrainPhys.TerrainImplementation)BSParam.TerrainImplementation); + BSTerrainPhys newTerrainPhys = null; + switch ((int)BSParam.TerrainImplementation) + { + case (int)BSTerrainPhys.TerrainImplementation.Heightmap: + newTerrainPhys = new BSTerrainHeightmap(PhysicsScene, terrainRegionBase, id, + heightMap, minCoords, maxCoords); + break; + case (int)BSTerrainPhys.TerrainImplementation.Mesh: + newTerrainPhys = new BSTerrainMesh(PhysicsScene, terrainRegionBase, id, + heightMap, minCoords, maxCoords); + break; + default: + PhysicsScene.Logger.ErrorFormat("{0} Bad terrain implementation specified. Type={1}/{2},Region={3}/{4}", + LogHeader, + (int)BSParam.TerrainImplementation, + BSParam.TerrainImplementation, + PhysicsScene.RegionName, terrainRegionBase); + break; + } + return newTerrainPhys; + } + + // Return 'true' of this position is somewhere in known physical terrain space + public bool IsWithinKnownTerrain(Vector3 pos) + { + Vector3 terrainBaseXYZ; + BSTerrainPhys physTerrain; + return GetTerrainPhysicalAtXYZ(pos, out physTerrain, out terrainBaseXYZ); + } + + // Given an X and Y, find the height of the terrain. + // Since we could be handling multiple terrains for a mega-region, + // the base of the region is calcuated assuming all regions are + // the same size and that is the default. + // Once the heightMapInfo is found, we have all the information to + // compute the offset into the array. + private float lastHeightTX = 999999f; + private float lastHeightTY = 999999f; + private float lastHeight = HEIGHT_INITIAL_LASTHEIGHT; + public float GetTerrainHeightAtXYZ(Vector3 pos) + { + float tX = pos.X; + float tY = pos.Y; + // You'd be surprized at the number of times this routine is called + // with the same parameters as last time. + if (!m_terrainModified && (lastHeightTX == tX) && (lastHeightTY == tY)) + return lastHeight; + m_terrainModified = false; + + lastHeightTX = tX; + lastHeightTY = tY; + float ret = HEIGHT_GETHEIGHT_RET; + + Vector3 terrainBaseXYZ; + BSTerrainPhys physTerrain; + if (GetTerrainPhysicalAtXYZ(pos, out physTerrain, out terrainBaseXYZ)) + { + ret = physTerrain.GetTerrainHeightAtXYZ(pos - terrainBaseXYZ); + } + else + { + PhysicsScene.Logger.ErrorFormat("{0} GetTerrainHeightAtXY: terrain not found: region={1}, x={2}, y={3}", + LogHeader, PhysicsScene.RegionName, tX, tY); + DetailLog("{0},BSTerrainManager.GetTerrainHeightAtXYZ,terrainNotFound,pos={1},base={2}", + BSScene.DetailLogZero, pos, terrainBaseXYZ); + } + lastHeight = ret; + return ret; + } + + public float GetWaterLevelAtXYZ(Vector3 pos) + { + float ret = WATER_HEIGHT_GETHEIGHT_RET; + + Vector3 terrainBaseXYZ; + BSTerrainPhys physTerrain; + if (GetTerrainPhysicalAtXYZ(pos, out physTerrain, out terrainBaseXYZ)) + { + ret = physTerrain.GetWaterLevelAtXYZ(pos); + } + else + { + PhysicsScene.Logger.ErrorFormat("{0} GetWaterHeightAtXY: terrain not found: pos={1}, terrainBase={2}, height={3}", + LogHeader, PhysicsScene.RegionName, pos, terrainBaseXYZ, ret); + } + return ret; + } + + // Given an address, return 'true' of there is a description of that terrain and output + // the descriptor class and the 'base' fo the addresses therein. + private bool GetTerrainPhysicalAtXYZ(Vector3 pos, out BSTerrainPhys outPhysTerrain, out Vector3 outTerrainBase) + { + int offsetX = ((int)(pos.X / (int)DefaultRegionSize.X)) * (int)DefaultRegionSize.X; + int offsetY = ((int)(pos.Y / (int)DefaultRegionSize.Y)) * (int)DefaultRegionSize.Y; + Vector3 terrainBaseXYZ = new Vector3(offsetX, offsetY, 0f); + + BSTerrainPhys physTerrain = null; + lock (m_terrains) + { + m_terrains.TryGetValue(terrainBaseXYZ, out physTerrain); + } + outTerrainBase = terrainBaseXYZ; + outPhysTerrain = physTerrain; + return (physTerrain != null); + } + + // Although no one seems to check this, I do support combining. + public bool SupportsCombining() + { + return true; + } + + // This routine is called two ways: + // One with 'offset' and 'pScene' zero and null but 'extents' giving the maximum + // extent of the combined regions. This is to inform the parent of the size + // of the combined regions. + // and one with 'offset' as the offset of the child region to the base region, + // 'pScene' pointing to the parent and 'extents' of zero. This informs the + // child of its relative base and new parent. + public void Combine(PhysicsScene pScene, Vector3 offset, Vector3 extents) + { + m_worldOffset = offset; + m_worldMax = extents; + MegaRegionParentPhysicsScene = pScene; + if (pScene != null) + { + // We are a child. + // We want m_worldMax to be the highest coordinate of our piece of terrain. + m_worldMax = offset + DefaultRegionSize; + } + DetailLog("{0},BSTerrainManager.Combine,offset={1},extents={2},wOffset={3},wMax={4}", + BSScene.DetailLogZero, offset, extents, m_worldOffset, m_worldMax); + } + + // Unhook all the combining that I know about. + public void UnCombine(PhysicsScene pScene) + { + // Just like ODE, we don't do anything yet. + DetailLog("{0},BSTerrainManager.UnCombine", BSScene.DetailLogZero); + } + + + private void DetailLog(string msg, params Object[] args) + { + PhysicsScene.PhysicsLogging.Write(msg, args); + } +} +} diff --git a/OpenSim/Region/Physics/BulletSNPlugin/BSTerrainMesh.cs b/OpenSim/Region/Physics/BulletSNPlugin/BSTerrainMesh.cs new file mode 100644 index 0000000000..6083dd451a --- /dev/null +++ b/OpenSim/Region/Physics/BulletSNPlugin/BSTerrainMesh.cs @@ -0,0 +1,267 @@ +/* + * 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 copyrightD + * 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.Text; + +using OpenSim.Framework; +using OpenSim.Region.Framework; +using OpenSim.Region.CoreModules; +using OpenSim.Region.Physics.Manager; + +using Nini.Config; +using log4net; + +using OpenMetaverse; + +namespace OpenSim.Region.Physics.BulletSNPlugin +{ +public sealed class BSTerrainMesh : BSTerrainPhys +{ + static string LogHeader = "[BULLETSIM TERRAIN MESH]"; + + private float[] m_savedHeightMap; + int m_sizeX; + int m_sizeY; + + BulletShape m_terrainShape; + BulletBody m_terrainBody; + + public BSTerrainMesh(BSScene physicsScene, Vector3 regionBase, uint id, Vector3 regionSize) + : base(physicsScene, regionBase, id) + { + } + + public BSTerrainMesh(BSScene physicsScene, Vector3 regionBase, uint id /* parameters for making mesh */) + : base(physicsScene, regionBase, id) + { + } + + // Create terrain mesh from a heightmap. + public BSTerrainMesh(BSScene physicsScene, Vector3 regionBase, uint id, float[] initialMap, + Vector3 minCoords, Vector3 maxCoords) + : base(physicsScene, regionBase, id) + { + int indicesCount; + int[] indices; + int verticesCount; + float[] vertices; + + m_savedHeightMap = initialMap; + + m_sizeX = (int)(maxCoords.X - minCoords.X); + m_sizeY = (int)(maxCoords.Y - minCoords.Y); + + if (!BSTerrainMesh.ConvertHeightmapToMesh(PhysicsScene, initialMap, + m_sizeX, m_sizeY, + (float)m_sizeX, (float)m_sizeY, + Vector3.Zero, 1.0f, + out indicesCount, out indices, out verticesCount, out vertices)) + { + // DISASTER!! + PhysicsScene.DetailLog("{0},BSTerrainMesh.create,failedConversionOfHeightmap", ID); + PhysicsScene.Logger.ErrorFormat("{0} Failed conversion of heightmap to mesh! base={1}", LogHeader, TerrainBase); + // Something is very messed up and a crash is in our future. + return; + } + PhysicsScene.DetailLog("{0},BSTerrainMesh.create,meshed,indices={1},indSz={2},vertices={3},vertSz={4}", + ID, indicesCount, indices.Length, verticesCount, vertices.Length); + + m_terrainShape = new BulletShape(BulletSimAPI.CreateMeshShape2(PhysicsScene.World.ptr, + indicesCount, indices, verticesCount, vertices), + BSPhysicsShapeType.SHAPE_MESH); + if (!m_terrainShape.HasPhysicalShape) + { + // DISASTER!! + PhysicsScene.DetailLog("{0},BSTerrainMesh.create,failedCreationOfShape", ID); + physicsScene.Logger.ErrorFormat("{0} Failed creation of terrain mesh! base={1}", LogHeader, TerrainBase); + // Something is very messed up and a crash is in our future. + return; + } + + Vector3 pos = regionBase; + Quaternion rot = Quaternion.Identity; + + m_terrainBody = new BulletBody(id, BulletSimAPI.CreateBodyWithDefaultMotionState2( m_terrainShape.ptr, ID, pos, rot)); + if (!m_terrainBody.HasPhysicalBody) + { + // DISASTER!! + physicsScene.Logger.ErrorFormat("{0} Failed creation of terrain body! base={1}", LogHeader, TerrainBase); + // Something is very messed up and a crash is in our future. + return; + } + + // Set current terrain attributes + BulletSimAPI.SetFriction2(m_terrainBody.ptr, BSParam.TerrainFriction); + BulletSimAPI.SetHitFraction2(m_terrainBody.ptr, BSParam.TerrainHitFraction); + BulletSimAPI.SetRestitution2(m_terrainBody.ptr, BSParam.TerrainRestitution); + BulletSimAPI.SetCollisionFlags2(m_terrainBody.ptr, CollisionFlags.CF_STATIC_OBJECT); + + // Static objects are not very massive. + BulletSimAPI.SetMassProps2(m_terrainBody.ptr, 0f, Vector3.Zero); + + // Put the new terrain to the world of physical objects + BulletSimAPI.AddObjectToWorld2(PhysicsScene.World.ptr, m_terrainBody.ptr, pos, rot); + + // Redo its bounding box now that it is in the world + BulletSimAPI.UpdateSingleAabb2(PhysicsScene.World.ptr, m_terrainBody.ptr); + + m_terrainBody.collisionType = CollisionType.Terrain; + m_terrainBody.ApplyCollisionMask(); + + // Make it so the terrain will not move or be considered for movement. + BulletSimAPI.ForceActivationState2(m_terrainBody.ptr, ActivationState.DISABLE_SIMULATION); + } + + public override void Dispose() + { + if (m_terrainBody.HasPhysicalBody) + { + BulletSimAPI.RemoveObjectFromWorld2(PhysicsScene.World.ptr, m_terrainBody.ptr); + // Frees both the body and the shape. + BulletSimAPI.DestroyObject2(PhysicsScene.World.ptr, m_terrainBody.ptr); + } + } + + public override float GetTerrainHeightAtXYZ(Vector3 pos) + { + // For the moment use the saved heightmap to get the terrain height. + // TODO: raycast downward to find the true terrain below the position. + float ret = BSTerrainManager.HEIGHT_GETHEIGHT_RET; + + int mapIndex = (int)pos.Y * m_sizeY + (int)pos.X; + try + { + ret = m_savedHeightMap[mapIndex]; + } + catch + { + // Sometimes they give us wonky values of X and Y. Give a warning and return something. + PhysicsScene.Logger.WarnFormat("{0} Bad request for terrain height. terrainBase={1}, pos={2}", + LogHeader, TerrainBase, pos); + ret = BSTerrainManager.HEIGHT_GETHEIGHT_RET; + } + return ret; + } + + // The passed position is relative to the base of the region. + public override float GetWaterLevelAtXYZ(Vector3 pos) + { + return PhysicsScene.SimpleWaterLevel; + } + + // Convert the passed heightmap to mesh information suitable for CreateMeshShape2(). + // Return 'true' if successfully created. + public static bool ConvertHeightmapToMesh( + BSScene physicsScene, + float[] heightMap, int sizeX, int sizeY, // parameters of incoming heightmap + float extentX, float extentY, // zero based range for output vertices + Vector3 extentBase, // base to be added to all vertices + float magnification, // number of vertices to create between heightMap coords + out int indicesCountO, out int[] indicesO, + out int verticesCountO, out float[] verticesO) + { + bool ret = false; + + int indicesCount = 0; + int verticesCount = 0; + int[] indices = new int[0]; + float[] vertices = new float[0]; + + // Simple mesh creation which assumes magnification == 1. + // TODO: do a more general solution that scales, adds new vertices and smoothes the result. + + // Create an array of vertices that is sizeX+1 by sizeY+1 (note the loop + // from zero to <= sizeX). The triangle indices are then generated as two triangles + // per heightmap point. There are sizeX by sizeY of these squares. The extra row and + // column of vertices are used to complete the triangles of the last row and column + // of the heightmap. + try + { + // One vertice per heightmap value plus the vertices off the top and bottom edge. + int totalVertices = (sizeX + 1) * (sizeY + 1); + vertices = new float[totalVertices * 3]; + int totalIndices = sizeX * sizeY * 6; + indices = new int[totalIndices]; + + float magX = (float)sizeX / extentX; + float magY = (float)sizeY / extentY; + physicsScene.DetailLog("{0},BSTerrainMesh.ConvertHeightMapToMesh,totVert={1},totInd={2},extentBase={3},magX={4},magY={5}", + BSScene.DetailLogZero, totalVertices, totalIndices, extentBase, magX, magY); + float minHeight = float.MaxValue; + // Note that sizeX+1 vertices are created since there is land between this and the next region. + for (int yy = 0; yy <= sizeY; yy++) + { + for (int xx = 0; xx <= sizeX; xx++) // Hint: the "<=" means we go around sizeX + 1 times + { + int offset = yy * sizeX + xx; + // Extend the height with the height from the last row or column + if (yy == sizeY) offset -= sizeX; + if (xx == sizeX) offset -= 1; + float height = heightMap[offset]; + minHeight = Math.Min(minHeight, height); + vertices[verticesCount + 0] = (float)xx * magX + extentBase.X; + vertices[verticesCount + 1] = (float)yy * magY + extentBase.Y; + vertices[verticesCount + 2] = height + extentBase.Z; + verticesCount += 3; + } + } + verticesCount = verticesCount / 3; + + for (int yy = 0; yy < sizeY; yy++) + { + for (int xx = 0; xx < sizeX; xx++) + { + int offset = yy * (sizeX + 1) + xx; + // Each vertices is presumed to be the upper left corner of a box of two triangles + indices[indicesCount + 0] = offset; + indices[indicesCount + 1] = offset + 1; + indices[indicesCount + 2] = offset + sizeX + 1; // accounting for the extra column + indices[indicesCount + 3] = offset + 1; + indices[indicesCount + 4] = offset + sizeX + 2; + indices[indicesCount + 5] = offset + sizeX + 1; + indicesCount += 6; + } + } + + ret = true; + } + catch (Exception e) + { + physicsScene.Logger.ErrorFormat("{0} Failed conversion of heightmap to mesh. For={1}/{2}, e={3}", + LogHeader, physicsScene.RegionName, extentBase, e); + } + + indicesCountO = indicesCount; + indicesO = indices; + verticesCountO = verticesCount; + verticesO = vertices; + + return ret; + } +} +} diff --git a/OpenSim/Region/Physics/BulletSNPlugin/BulletSimAPI.cs b/OpenSim/Region/Physics/BulletSNPlugin/BulletSimAPI.cs new file mode 100644 index 0000000000..6af59d69b7 --- /dev/null +++ b/OpenSim/Region/Physics/BulletSNPlugin/BulletSimAPI.cs @@ -0,0 +1,1604 @@ +/* + * 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 copyrightD + * 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.IO; +using System.Runtime.InteropServices; +using System.Security; +using System.Text; +using BulletXNA; +using OpenMetaverse; +using BulletXNA.LinearMath; +using BulletXNA.BulletCollision; +using BulletXNA.BulletDynamics; +using BulletXNA.BulletCollision.CollisionDispatch; +using OpenSim.Framework; + +namespace OpenSim.Region.Physics.BulletSNPlugin { + +// Classes to allow some type checking for the API +// These hold pointers to allocated objects in the unmanaged space. + + + + // Constraint type values as defined by Bullet +public enum ConstraintType : int +{ + POINT2POINT_CONSTRAINT_TYPE = 3, + HINGE_CONSTRAINT_TYPE, + CONETWIST_CONSTRAINT_TYPE, + D6_CONSTRAINT_TYPE, + SLIDER_CONSTRAINT_TYPE, + CONTACT_CONSTRAINT_TYPE, + D6_SPRING_CONSTRAINT_TYPE, + MAX_CONSTRAINT_TYPE +} + + +// =============================================================================== +[StructLayout(LayoutKind.Sequential)] +public struct ConvexHull +{ + Vector3 Offset; + int VertexCount; + Vector3[] Vertices; +} +public enum BSPhysicsShapeType +{ + SHAPE_UNKNOWN = 0, + SHAPE_CAPSULE = 1, + SHAPE_BOX = 2, + SHAPE_CONE = 3, + SHAPE_CYLINDER = 4, + SHAPE_SPHERE = 5, + SHAPE_MESH = 6, + SHAPE_HULL = 7, + // following defined by BulletSim + SHAPE_GROUNDPLANE = 20, + SHAPE_TERRAIN = 21, + SHAPE_COMPOUND = 22, + SHAPE_HEIGHTMAP = 23, +}; + +// The native shapes have predefined shape hash keys +public enum FixedShapeKey : ulong +{ + KEY_NONE = 0, + KEY_BOX = 1, + KEY_SPHERE = 2, + KEY_CONE = 3, + KEY_CYLINDER = 4, + KEY_CAPSULE = 5, +} + +[StructLayout(LayoutKind.Sequential)] +public struct ShapeData +{ + public uint ID; + public BSPhysicsShapeType Type; + public Vector3 Position; + public Quaternion Rotation; + public Vector3 Velocity; + public Vector3 Scale; + public float Mass; + public float Buoyancy; + public System.UInt64 HullKey; + public System.UInt64 MeshKey; + public float Friction; + public float Restitution; + public float Collidable; // true of things bump into this + public float Static; // true if a static object. Otherwise gravity, etc. + public float Solid; // true if object cannot be passed through + public Vector3 Size; + + // note that bools are passed as floats since bool size changes by language and architecture + public const float numericTrue = 1f; + public const float numericFalse = 0f; +} +[StructLayout(LayoutKind.Sequential)] +public struct SweepHit +{ + public uint ID; + public float Fraction; + public Vector3 Normal; + public Vector3 Point; +} +[StructLayout(LayoutKind.Sequential)] +public struct RaycastHit +{ + public uint ID; + public float Fraction; + public Vector3 Normal; +} +[StructLayout(LayoutKind.Sequential)] +public struct CollisionDesc +{ + public uint aID; + public uint bID; + public Vector3 point; + public Vector3 normal; +} +[StructLayout(LayoutKind.Sequential)] +public struct EntityProperties +{ + public uint ID; + public Vector3 Position; + public Quaternion Rotation; + public Vector3 Velocity; + public Vector3 Acceleration; + public Vector3 RotationalVelocity; + public override string ToString() + { + return string.Format("ID:{0}, Pos:<{1:F},{2:F},{3:F}>, Rot:<{4:F},{5:F},{6:F},{7:F}>, LVel:<{8:F},{9:F},{10:F}>, AVel:<{11:F},{12:F},{13:F}>", + ID.ToString(), + Position.X,Position.Y,Position.Z, + Rotation.X,Rotation.Y,Rotation.Z,Rotation.W, + Velocity.X,Velocity.Y,Velocity.Z, + RotationalVelocity.X,RotationalVelocity.Y,RotationalVelocity.Z + ); + } +} + +// Format of this structure must match the definition in the C++ code +// NOTE: adding the X causes compile breaks if used. These are unused symbols +// that can be removed from both here and the unmanaged definition of this structure. +[StructLayout(LayoutKind.Sequential)] +public struct ConfigurationParameters +{ + public float defaultFriction; + public float defaultDensity; + public float defaultRestitution; + public float collisionMargin; + public float gravity; + + public float XlinearDamping; + public float XangularDamping; + public float XdeactivationTime; + public float XlinearSleepingThreshold; + public float XangularSleepingThreshold; + public float XccdMotionThreshold; + public float XccdSweptSphereRadius; + public float XcontactProcessingThreshold; + + public float XterrainImplementation; + public float XterrainFriction; + public float XterrainHitFraction; + public float XterrainRestitution; + public float XterrainCollisionMargin; + + public float XavatarFriction; + public float XavatarStandingFriction; + public float XavatarDensity; + public float XavatarRestitution; + public float XavatarCapsuleWidth; + public float XavatarCapsuleDepth; + public float XavatarCapsuleHeight; + public float XavatarContactProcessingThreshold; + + public float XvehicleAngularDamping; + + public float maxPersistantManifoldPoolSize; + public float maxCollisionAlgorithmPoolSize; + public float shouldDisableContactPoolDynamicAllocation; + public float shouldForceUpdateAllAabbs; + public float shouldRandomizeSolverOrder; + public float shouldSplitSimulationIslands; + public float shouldEnableFrictionCaching; + public float numberOfSolverIterations; + + public float XlinksetImplementation; + public float XlinkConstraintUseFrameOffset; + public float XlinkConstraintEnableTransMotor; + public float XlinkConstraintTransMotorMaxVel; + public float XlinkConstraintTransMotorMaxForce; + public float XlinkConstraintERP; + public float XlinkConstraintCFM; + public float XlinkConstraintSolverIterations; + + public float physicsLoggingFrames; + + public const float numericTrue = 1f; + public const float numericFalse = 0f; +} + + +// The states a bullet collision object can have + +public enum ActivationState : uint +{ + UNDEFINED = 0, + ACTIVE_TAG = 1, + ISLAND_SLEEPING = 2, + WANTS_DEACTIVATION = 3, + DISABLE_DEACTIVATION = 4, + DISABLE_SIMULATION = 5, +} + +public enum CollisionObjectTypes : int +{ + CO_COLLISION_OBJECT = 1 << 0, + CO_RIGID_BODY = 1 << 1, + CO_GHOST_OBJECT = 1 << 2, + CO_SOFT_BODY = 1 << 3, + CO_HF_FLUID = 1 << 4, + CO_USER_TYPE = 1 << 5, +} + +// Values used by Bullet and BulletSim to control object properties. +// Bullet's "CollisionFlags" has more to do with operations on the +// object (if collisions happen, if gravity effects it, ...). + [Flags] +public enum CollisionFlags : uint +{ + CF_STATIC_OBJECT = 1 << 0, + CF_KINEMATIC_OBJECT = 1 << 1, + CF_NO_CONTACT_RESPONSE = 1 << 2, + CF_CUSTOM_MATERIAL_CALLBACK = 1 << 3, + CF_CHARACTER_OBJECT = 1 << 4, + CF_DISABLE_VISUALIZE_OBJECT = 1 << 5, + CF_DISABLE_SPU_COLLISION_PROCESS = 1 << 6, + // Following used by BulletSim to control collisions and updates + BS_SUBSCRIBE_COLLISION_EVENTS = 1 << 10, + BS_FLOATS_ON_WATER = 1 << 11, + BS_VEHICLE_COLLISIONS = 1 << 12, + BS_NONE = 0, + BS_ALL = 0xFFFFFFFF, + + // These are the collision flags switched depending on physical state. + // The other flags are used for other things and should not be fooled with. + BS_ACTIVE = CF_STATIC_OBJECT + | CF_KINEMATIC_OBJECT + | CF_NO_CONTACT_RESPONSE +}; + +// Values for collisions groups and masks +public enum CollisionFilterGroups : uint +{ + // Don't use the bit definitions!! Define the use in a + // filter/mask definition below. This way collision interactions + // are more easily debugged. + BNoneGroup = 0, + BDefaultGroup = 1 << 0, + BStaticGroup = 1 << 1, + BKinematicGroup = 1 << 2, + BDebrisGroup = 1 << 3, + BSensorTrigger = 1 << 4, + BCharacterGroup = 1 << 5, + BAllGroup = 0xFFFFFFFF, + // Filter groups defined by BulletSim + BGroundPlaneGroup = 1 << 10, + BTerrainGroup = 1 << 11, + BRaycastGroup = 1 << 12, + BSolidGroup = 1 << 13, + // BLinksetGroup = xx // a linkset proper is either static or dynamic + BLinksetChildGroup = 1 << 14, + // The collsion filters and masked are defined in one place -- don't want them scattered + AvatarGroup = BCharacterGroup, + AvatarMask = BAllGroup, + ObjectGroup = BSolidGroup, + ObjectMask = BAllGroup, + StaticObjectGroup = BStaticGroup, + StaticObjectMask = AvatarGroup | ObjectGroup, // static things don't interact with much + LinksetGroup = BLinksetChildGroup, + LinksetMask = BAllGroup & ~BLinksetChildGroup, // linkset objects don't collide with each other + VolumeDetectGroup = BSensorTrigger, + VolumeDetectMask = ~BSensorTrigger, + TerrainGroup = BTerrainGroup, + TerrainMask = BAllGroup & ~BStaticGroup, // static objects on the ground don't collide + GroundPlaneGroup = BGroundPlaneGroup, + GroundPlaneMask = BAllGroup + +}; + +// CFM controls the 'hardness' of the constraint. 0=fixed, 0..1=violatable. Default=0 +// ERP controls amount of correction per tick. Usable range=0.1..0.8. Default=0.2. +public enum ConstraintParams : int +{ + BT_CONSTRAINT_ERP = 1, // this one is not used in Bullet as of 20120730 + BT_CONSTRAINT_STOP_ERP, + BT_CONSTRAINT_CFM, + BT_CONSTRAINT_STOP_CFM, +}; +public enum ConstraintParamAxis : int +{ + AXIS_LINEAR_X = 0, + AXIS_LINEAR_Y, + AXIS_LINEAR_Z, + AXIS_ANGULAR_X, + AXIS_ANGULAR_Y, + AXIS_ANGULAR_Z, + AXIS_LINEAR_ALL = 20, // these last three added by BulletSim so we don't have to do zillions of calls + AXIS_ANGULAR_ALL, + AXIS_ALL +}; + +// =============================================================================== +static class BulletSimAPI { + private static int m_collisionsThisFrame; + public delegate void DebugLogCallback(string msg); + /// + /// + /// + /// + /// + internal static bool RemoveObjectFromWorld2(object pWorld, object pBody) + { + DiscreteDynamicsWorld world = pWorld as DiscreteDynamicsWorld; + RigidBody body = pBody as RigidBody; + world.RemoveRigidBody(body); + return true; + } + + internal static void SetRestitution2(object pBody, float pRestitution) + { + RigidBody body = pBody as RigidBody; + body.SetRestitution(pRestitution); + } + + internal static void SetMargin2(object pShape, float pMargin) + { + CollisionShape shape = pShape as CollisionShape; + shape.SetMargin(pMargin); + } + + internal static void SetLocalScaling2(object pShape, Vector3 pScale) + { + CollisionShape shape = pShape as CollisionShape; + IndexedVector3 vec = new IndexedVector3(pScale.X, pScale.Y, pScale.Z); + shape.SetLocalScaling(ref vec); + + } + + internal static void SetContactProcessingThreshold2(object pBody, float contactprocessingthreshold) + { + RigidBody body = pBody as RigidBody; + body.SetContactProcessingThreshold(contactprocessingthreshold); + } + + internal static void SetCcdMotionThreshold2(object pBody, float pccdMotionThreashold) + { + RigidBody body = pBody as RigidBody; + body.SetCcdMotionThreshold(pccdMotionThreashold); + } + + internal static void SetCcdSweptSphereRadius2(object pBody, float pCcdSweptSphereRadius) + { + RigidBody body = pBody as RigidBody; + body.SetCcdSweptSphereRadius(pCcdSweptSphereRadius); + } + + internal static void SetAngularFactorV2(object pBody, Vector3 pAngularFactor) + { + RigidBody body = pBody as RigidBody; + body.SetAngularFactor(new IndexedVector3(pAngularFactor.X, pAngularFactor.Y, pAngularFactor.Z)); + } + + internal static CollisionFlags AddToCollisionFlags2(object pBody, CollisionFlags pcollisionFlags) + { + CollisionObject body = pBody as CollisionObject; + CollisionFlags existingcollisionFlags = (CollisionFlags)(uint)body.GetCollisionFlags(); + existingcollisionFlags |= pcollisionFlags; + body.SetCollisionFlags((BulletXNA.BulletCollision.CollisionFlags)(uint)existingcollisionFlags); + return (CollisionFlags) (uint) existingcollisionFlags; + } + + internal static void AddObjectToWorld2(object pWorld, object pBody) + { + RigidBody body = pBody as RigidBody; + DiscreteDynamicsWorld world = pWorld as DiscreteDynamicsWorld; + //if (!(body.GetCollisionShape().GetShapeType() == BroadphaseNativeTypes.STATIC_PLANE_PROXYTYPE && body.GetCollisionShape().GetShapeType() == BroadphaseNativeTypes.TERRAIN_SHAPE_PROXYTYPE)) + + world.AddRigidBody(body); + + //if (body.GetBroadphaseHandle() != null) + // world.UpdateSingleAabb(body); + } + + internal static void AddObjectToWorld2(object pWorld, object pBody, Vector3 _position, Quaternion _orientation) + { + RigidBody body = pBody as RigidBody; + DiscreteDynamicsWorld world = pWorld as DiscreteDynamicsWorld; + //if (!(body.GetCollisionShape().GetShapeType() == BroadphaseNativeTypes.STATIC_PLANE_PROXYTYPE && body.GetCollisionShape().GetShapeType() == BroadphaseNativeTypes.TERRAIN_SHAPE_PROXYTYPE)) + + world.AddRigidBody(body); + IndexedVector3 vposition = new IndexedVector3(_position.X, _position.Y, _position.Z); + IndexedQuaternion vquaternion = new IndexedQuaternion(_orientation.X, _orientation.Y, _orientation.Z, + _orientation.W); + IndexedMatrix mat = IndexedMatrix.CreateFromQuaternion(vquaternion); + mat._origin = vposition; + body.SetWorldTransform(mat); + //if (body.GetBroadphaseHandle() != null) + // world.UpdateSingleAabb(body); + } + + internal static void ForceActivationState2(object pBody, ActivationState pActivationState) + { + CollisionObject body = pBody as CollisionObject; + body.ForceActivationState((BulletXNA.BulletCollision.ActivationState)(uint)pActivationState); + } + + internal static void UpdateSingleAabb2(object pWorld, object pBody) + { + CollisionObject body = pBody as CollisionObject; + DiscreteDynamicsWorld world = pWorld as DiscreteDynamicsWorld; + world.UpdateSingleAabb(body); + } + + internal static bool SetCollisionGroupMask2(object pBody, uint pGroup, uint pMask) + { + RigidBody body = pBody as RigidBody; + body.GetBroadphaseHandle().m_collisionFilterGroup = (BulletXNA.BulletCollision.CollisionFilterGroups) pGroup; + body.GetBroadphaseHandle().m_collisionFilterGroup = (BulletXNA.BulletCollision.CollisionFilterGroups) pGroup; + if ((uint) body.GetBroadphaseHandle().m_collisionFilterGroup == 0) + return false; + return true; + } + + internal static void ClearAllForces2(object pBody) + { + CollisionObject body = pBody as CollisionObject; + IndexedVector3 zeroVector = new IndexedVector3(0, 0, 0); + body.SetInterpolationLinearVelocity(ref zeroVector); + body.SetInterpolationAngularVelocity(ref zeroVector); + IndexedMatrix bodytransform = body.GetWorldTransform(); + + body.SetInterpolationWorldTransform(ref bodytransform); + + if (body is RigidBody) + { + RigidBody rigidbody = body as RigidBody; + rigidbody.SetLinearVelocity(zeroVector); + rigidbody.SetAngularVelocity(zeroVector); + rigidbody.ClearForces(); + } + } + + internal static void SetInterpolationAngularVelocity2(object pBody, Vector3 pVector3) + { + RigidBody body = pBody as RigidBody; + IndexedVector3 vec = new IndexedVector3(pVector3.X, pVector3.Y, pVector3.Z); + body.SetInterpolationAngularVelocity(ref vec); + } + + internal static void SetAngularVelocity2(object pBody, Vector3 pVector3) + { + RigidBody body = pBody as RigidBody; + IndexedVector3 vec = new IndexedVector3(pVector3.X, pVector3.Y, pVector3.Z); + body.SetAngularVelocity(ref vec); + } + + internal static void ClearForces2(object pBody) + { + RigidBody body = pBody as RigidBody; + body.ClearForces(); + } + + internal static void SetTranslation2(object pBody, Vector3 _position, Quaternion _orientation) + { + RigidBody body = pBody as RigidBody; + IndexedVector3 vposition = new IndexedVector3(_position.X, _position.Y, _position.Z); + IndexedQuaternion vquaternion = new IndexedQuaternion(_orientation.X, _orientation.Y, _orientation.Z, + _orientation.W); + IndexedMatrix mat = IndexedMatrix.CreateFromQuaternion(vquaternion); + mat._origin = vposition; + body.SetWorldTransform(mat); + + } + + internal static Vector3 GetPosition2(object pBody) + { + RigidBody body = pBody as RigidBody; + IndexedVector3 pos = body.GetInterpolationWorldTransform()._origin; + return new Vector3(pos.X, pos.Y, pos.Z); + } + + internal static Vector3 CalculateLocalInertia2(object pShape, float pphysMass) + { + CollisionShape shape = pShape as CollisionShape; + IndexedVector3 inertia = IndexedVector3.Zero; + shape.CalculateLocalInertia(pphysMass, out inertia); + return new Vector3(inertia.X, inertia.Y, inertia.Z); + } + + internal static void SetMassProps2(object pBody, float pphysMass, Vector3 plocalInertia) + { + RigidBody body = pBody as RigidBody; + IndexedVector3 inertia = new IndexedVector3(plocalInertia.X, plocalInertia.Y, plocalInertia.Z); + body.SetMassProps(pphysMass, inertia); + } + + + internal static void SetObjectForce2(object pBody, Vector3 _force) + { + RigidBody body = pBody as RigidBody; + IndexedVector3 force = new IndexedVector3(_force.X, _force.Y, _force.Z); + body.SetTotalForce(ref force); + } + + internal static void SetFriction2(object pBody, float _currentFriction) + { + RigidBody body = pBody as RigidBody; + body.SetFriction(_currentFriction); + } + + internal static void SetLinearVelocity2(object pBody, Vector3 _velocity) + { + RigidBody body = pBody as RigidBody; + IndexedVector3 velocity = new IndexedVector3(_velocity.X, _velocity.Y, _velocity.Z); + body.SetLinearVelocity(velocity); + } + + internal static void Activate2(object pBody, bool pforceactivation) + { + RigidBody body = pBody as RigidBody; + body.Activate(pforceactivation); + + } + + internal static Quaternion GetOrientation2(object pBody) + { + RigidBody body = pBody as RigidBody; + IndexedQuaternion mat = body.GetInterpolationWorldTransform().GetRotation(); + return new Quaternion(mat.X, mat.Y, mat.Z, mat.W); + } + + internal static CollisionFlags RemoveFromCollisionFlags2(object pBody, CollisionFlags pcollisionFlags) + { + RigidBody body = pBody as RigidBody; + CollisionFlags existingcollisionFlags = (CollisionFlags)(uint)body.GetCollisionFlags(); + existingcollisionFlags &= ~pcollisionFlags; + body.SetCollisionFlags((BulletXNA.BulletCollision.CollisionFlags)(uint)existingcollisionFlags); + return (CollisionFlags)(uint)existingcollisionFlags; + } + + internal static void SetGravity2(object pBody, Vector3 pGravity) + { + RigidBody body = pBody as RigidBody; + IndexedVector3 gravity = new IndexedVector3(pGravity.X, pGravity.Y, pGravity.Z); + body.SetGravity(gravity); + } + + internal static bool DestroyConstraint2(object pBody, object pConstraint) + { + RigidBody body = pBody as RigidBody; + TypedConstraint constraint = pConstraint as TypedConstraint; + body.RemoveConstraintRef(constraint); + return true; + } + + internal static bool SetLinearLimits2(object pConstraint, Vector3 low, Vector3 high) + { + Generic6DofConstraint constraint = pConstraint as Generic6DofConstraint; + IndexedVector3 lowlimit = new IndexedVector3(low.X, low.Y, low.Z); + IndexedVector3 highlimit = new IndexedVector3(high.X, high.Y, high.Z); + constraint.SetLinearLowerLimit(lowlimit); + constraint.SetLinearUpperLimit(highlimit); + return true; + } + + internal static bool SetAngularLimits2(object pConstraint, Vector3 low, Vector3 high) + { + Generic6DofConstraint constraint = pConstraint as Generic6DofConstraint; + IndexedVector3 lowlimit = new IndexedVector3(low.X, low.Y, low.Z); + IndexedVector3 highlimit = new IndexedVector3(high.X, high.Y, high.Z); + constraint.SetAngularLowerLimit(lowlimit); + constraint.SetAngularUpperLimit(highlimit); + return true; + } + + internal static void SetConstraintNumSolverIterations2(object pConstraint, float cnt) + { + Generic6DofConstraint constraint = pConstraint as Generic6DofConstraint; + constraint.SetOverrideNumSolverIterations((int)cnt); + } + + internal static void CalculateTransforms2(object pConstraint) + { + Generic6DofConstraint constraint = pConstraint as Generic6DofConstraint; + constraint.CalculateTransforms(); + } + + internal static void SetConstraintEnable2(object pConstraint, float p_2) + { + Generic6DofConstraint constraint = pConstraint as Generic6DofConstraint; + constraint.SetEnabled((p_2 == 0) ? false : true); + } + + + //BulletSimAPI.Create6DofConstraint2(m_world.ptr, m_body1.ptr, m_body2.ptr,frame1, frame1rot,frame2, frame2rot,useLinearReferenceFrameA, disableCollisionsBetweenLinkedBodies)); + internal static object Create6DofConstraint2(object pWorld, object pBody1, object pBody2, Vector3 pframe1, Quaternion pframe1rot, Vector3 pframe2, Quaternion pframe2rot, bool puseLinearReferenceFrameA, bool pdisableCollisionsBetweenLinkedBodies) + + { + DiscreteDynamicsWorld world = pWorld as DiscreteDynamicsWorld; + RigidBody body1 = pBody1 as RigidBody; + RigidBody body2 = pBody2 as RigidBody; + IndexedVector3 frame1v = new IndexedVector3(pframe1.X, pframe1.Y, pframe1.Z); + IndexedQuaternion frame1rot = new IndexedQuaternion(pframe1rot.X, pframe1rot.Y, pframe1rot.Z, pframe1rot.W); + IndexedMatrix frame1 = IndexedMatrix.CreateFromQuaternion(frame1rot); + frame1._origin = frame1v; + + IndexedVector3 frame2v = new IndexedVector3(pframe2.X, pframe2.Y, pframe2.Z); + IndexedQuaternion frame2rot = new IndexedQuaternion(pframe2rot.X, pframe2rot.Y, pframe2rot.Z, pframe2rot.W); + IndexedMatrix frame2 = IndexedMatrix.CreateFromQuaternion(frame2rot); + frame2._origin = frame1v; + + Generic6DofConstraint consttr = new Generic6DofConstraint(body1, body2, ref frame1, ref frame2, + puseLinearReferenceFrameA); + consttr.CalculateTransforms(); + world.AddConstraint(consttr,pdisableCollisionsBetweenLinkedBodies); + + return consttr; + } + + + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + internal static object Create6DofConstraintToPoint2(object pWorld, object pBody1, object pBody2, Vector3 pjoinPoint, bool puseLinearReferenceFrameA, bool pdisableCollisionsBetweenLinkedBodies) + { + DiscreteDynamicsWorld world = pWorld as DiscreteDynamicsWorld; + RigidBody body1 = pBody1 as RigidBody; + RigidBody body2 = pBody2 as RigidBody; + IndexedMatrix frame1 = new IndexedMatrix(IndexedBasisMatrix.Identity, new IndexedVector3(0, 0, 0)); + IndexedMatrix frame2 = new IndexedMatrix(IndexedBasisMatrix.Identity, new IndexedVector3(0, 0, 0)); + + IndexedVector3 joinPoint = new IndexedVector3(pjoinPoint.X, pjoinPoint.Y, pjoinPoint.Z); + IndexedMatrix mat = IndexedMatrix.Identity; + mat._origin = new IndexedVector3(pjoinPoint.X, pjoinPoint.Y, pjoinPoint.Z); + frame1._origin = body1.GetWorldTransform().Inverse()*joinPoint; + frame2._origin = body2.GetWorldTransform().Inverse()*joinPoint; + + Generic6DofConstraint consttr = new Generic6DofConstraint(body1, body2, ref frame1, ref frame2, puseLinearReferenceFrameA); + consttr.CalculateTransforms(); + world.AddConstraint(consttr, pdisableCollisionsBetweenLinkedBodies); + + return consttr; + } + //SetFrames2(m_constraint.ptr, frameA, frameArot, frameB, frameBrot); + internal static void SetFrames2(object pConstraint, Vector3 pframe1, Quaternion pframe1rot, Vector3 pframe2, Quaternion pframe2rot) + { + Generic6DofConstraint constraint = pConstraint as Generic6DofConstraint; + IndexedVector3 frame1v = new IndexedVector3(pframe1.X, pframe1.Y, pframe1.Z); + IndexedQuaternion frame1rot = new IndexedQuaternion(pframe1rot.X, pframe1rot.Y, pframe1rot.Z, pframe1rot.W); + IndexedMatrix frame1 = IndexedMatrix.CreateFromQuaternion(frame1rot); + frame1._origin = frame1v; + + IndexedVector3 frame2v = new IndexedVector3(pframe2.X, pframe2.Y, pframe2.Z); + IndexedQuaternion frame2rot = new IndexedQuaternion(pframe2rot.X, pframe2rot.Y, pframe2rot.Z, pframe2rot.W); + IndexedMatrix frame2 = IndexedMatrix.CreateFromQuaternion(frame2rot); + frame2._origin = frame1v; + constraint.SetFrames(ref frame1, ref frame2); + } + + + + + internal static bool IsInWorld2(object pWorld, object pShapeObj) + { + DiscreteDynamicsWorld world = pWorld as DiscreteDynamicsWorld; + CollisionObject shape = pShapeObj as CollisionObject; + return world.IsInWorld(shape); + } + + internal static void SetInterpolationLinearVelocity2(object pBody, Vector3 VehicleVelocity) + { + RigidBody body = pBody as RigidBody; + IndexedVector3 velocity = new IndexedVector3(VehicleVelocity.X, VehicleVelocity.Y, VehicleVelocity.Z); + body.SetInterpolationLinearVelocity(ref velocity); + } + + internal static bool UseFrameOffset2(object pConstraint, float onOff) + { + Generic6DofConstraint constraint = pConstraint as Generic6DofConstraint; + constraint.SetUseFrameOffset((onOff == 0) ? false : true); + return true; + } + //SetBreakingImpulseThreshold2(m_constraint.ptr, threshold); + internal static bool SetBreakingImpulseThreshold2(object pConstraint, float threshold) + { + Generic6DofConstraint constraint = pConstraint as Generic6DofConstraint; + constraint.SetBreakingImpulseThreshold(threshold); + return true; + } + //BulletSimAPI.SetAngularDamping2(Prim.PhysBody.ptr, angularDamping); + internal static void SetAngularDamping2(object pBody, float angularDamping) + { + RigidBody body = pBody as RigidBody; + float lineardamping = body.GetLinearDamping(); + body.SetDamping(lineardamping, angularDamping); + + } + + internal static void UpdateInertiaTensor2(object pBody) + { + RigidBody body = pBody as RigidBody; + body.UpdateInertiaTensor(); + } + + internal static void RecalculateCompoundShapeLocalAabb2( object pCompoundShape) + { + + CompoundShape shape = pCompoundShape as CompoundShape; + shape.RecalculateLocalAabb(); + } + + //BulletSimAPI.GetCollisionFlags2(PhysBody.ptr) + internal static CollisionFlags GetCollisionFlags2(object pBody) + { + RigidBody body = pBody as RigidBody; + uint flags = (uint)body.GetCollisionFlags(); + return (CollisionFlags) flags; + } + + internal static void SetDamping2(object pBody, float pLinear, float pAngular) + { + RigidBody body = pBody as RigidBody; + body.SetDamping(pLinear, pAngular); + } + //PhysBody.ptr, PhysicsScene.Params.deactivationTime); + internal static void SetDeactivationTime2(object pBody, float pDeactivationTime) + { + RigidBody body = pBody as RigidBody; + body.SetDeactivationTime(pDeactivationTime); + } + //SetSleepingThresholds2(PhysBody.ptr, PhysicsScene.Params.linearSleepingThreshold, PhysicsScene.Params.angularSleepingThreshold); + internal static void SetSleepingThresholds2(object pBody, float plinearSleepingThreshold, float pangularSleepingThreshold) + { + RigidBody body = pBody as RigidBody; + body.SetSleepingThresholds(plinearSleepingThreshold, pangularSleepingThreshold); + } + + internal static CollisionObjectTypes GetBodyType2(object pBody) + { + RigidBody body = pBody as RigidBody; + return (CollisionObjectTypes)(int) body.GetInternalType(); + } + + //BulletSimAPI.ApplyCentralForce2(PhysBody.ptr, fSum); + internal static void ApplyCentralForce2(object pBody, Vector3 pfSum) + { + RigidBody body = pBody as RigidBody; + IndexedVector3 fSum = new IndexedVector3(pfSum.X, pfSum.Y, pfSum.Z); + body.ApplyCentralForce(ref fSum); + } + internal static void ApplyCentralImpulse2(object pBody, Vector3 pfSum) + { + RigidBody body = pBody as RigidBody; + IndexedVector3 fSum = new IndexedVector3(pfSum.X, pfSum.Y, pfSum.Z); + body.ApplyCentralImpulse(ref fSum); + } + internal static void ApplyTorque2(object pBody, Vector3 pfSum) + { + RigidBody body = pBody as RigidBody; + IndexedVector3 fSum = new IndexedVector3(pfSum.X, pfSum.Y, pfSum.Z); + body.ApplyTorque(ref fSum); + } + internal static void ApplyTorqueImpulse2(object pBody, Vector3 pfSum) + { + RigidBody body = pBody as RigidBody; + IndexedVector3 fSum = new IndexedVector3(pfSum.X, pfSum.Y, pfSum.Z); + body.ApplyTorqueImpulse(ref fSum); + } + + internal static void DumpRigidBody2(object p, object p_2) + { + //TODO: + } + + internal static void DumpCollisionShape2(object p, object p_2) + { + //TODO: + } + + internal static void DestroyObject2(object p, object p_2) + { + //TODO: + } + + internal static void Shutdown2(object pWorld) + { + DiscreteDynamicsWorld world = pWorld as DiscreteDynamicsWorld; + world.Cleanup(); + } + + internal static void DeleteCollisionShape2(object p, object p_2) + { + //TODO: + } + //(sim.ptr, shape.ptr, prim.LocalID, prim.RawPosition, prim.RawOrientation); + + internal static object CreateBodyFromShape2(object pWorld, object pShape, uint pLocalID, Vector3 pRawPosition, Quaternion pRawOrientation) + { + CollisionWorld world = pWorld as CollisionWorld; + IndexedMatrix mat = + IndexedMatrix.CreateFromQuaternion(new IndexedQuaternion(pRawOrientation.X, pRawOrientation.Y, + pRawOrientation.Z, pRawOrientation.W)); + mat._origin = new IndexedVector3(pRawPosition.X, pRawPosition.Y, pRawPosition.Z); + CollisionShape shape = pShape as CollisionShape; + //UpdateSingleAabb2(world, shape); + // TODO: Feed Update array into null + RigidBody body = new RigidBody(0,new SimMotionState(world,pLocalID,mat,null),shape,IndexedVector3.Zero); + + body.SetUserPointer(pLocalID); + return body; + } + + + internal static object CreateBodyWithDefaultMotionState2( object pShape, uint pLocalID, Vector3 pRawPosition, Quaternion pRawOrientation) + { + + IndexedMatrix mat = + IndexedMatrix.CreateFromQuaternion(new IndexedQuaternion(pRawOrientation.X, pRawOrientation.Y, + pRawOrientation.Z, pRawOrientation.W)); + mat._origin = new IndexedVector3(pRawPosition.X, pRawPosition.Y, pRawPosition.Z); + + CollisionShape shape = pShape as CollisionShape; + + // TODO: Feed Update array into null + RigidBody body = new RigidBody(0, new DefaultMotionState( mat, IndexedMatrix.Identity), shape, IndexedVector3.Zero); + body.SetWorldTransform(mat); + body.SetUserPointer(pLocalID); + return body; + } + //(m_mapInfo.terrainBody.ptr, CollisionFlags.CF_STATIC_OBJECT); + internal static void SetCollisionFlags2(object pBody, CollisionFlags collisionFlags) + { + RigidBody body = pBody as RigidBody; + body.SetCollisionFlags((BulletXNA.BulletCollision.CollisionFlags) (uint) collisionFlags); + } + //(m_mapInfo.terrainBody.ptr, PhysicsScene.Params.terrainHitFraction); + internal static void SetHitFraction2(object pBody, float pHitFraction) + { + RigidBody body = pBody as RigidBody; + body.SetHitFraction(pHitFraction); + } + //BuildCapsuleShape2(physicsScene.World.ptr, 1f, 1f, prim.Scale); + internal static object BuildCapsuleShape2(object pWorld, float pRadius, float pHeight, Vector3 pScale) + { + DiscreteDynamicsWorld world = pWorld as DiscreteDynamicsWorld; + IndexedVector3 scale = new IndexedVector3(pScale.X, pScale.Y, pScale.Z); + CapsuleShapeZ capsuleShapeZ = new CapsuleShapeZ(pRadius, pHeight); + capsuleShapeZ.SetMargin(world.WorldSettings.Params.collisionMargin); + capsuleShapeZ.SetLocalScaling(ref scale); + + return capsuleShapeZ; + } + + public static object Initialize2(Vector3 worldExtent, ConfigurationParameters[] o, int mMaxCollisionsPerFrame, ref List collisionArray, int mMaxUpdatesPerFrame, ref List updateArray, object mDebugLogCallbackHandle) + { + CollisionWorld.WorldData.ParamData p = new CollisionWorld.WorldData.ParamData(); + + p.angularDamping = o[0].XangularDamping; + p.defaultFriction = o[0].defaultFriction; + p.defaultFriction = o[0].defaultFriction; + p.defaultDensity = o[0].defaultDensity; + p.defaultRestitution = o[0].defaultRestitution; + p.collisionMargin = o[0].collisionMargin; + p.gravity = o[0].gravity; + + p.linearDamping = o[0].XlinearDamping; + p.angularDamping = o[0].XangularDamping; + p.deactivationTime = o[0].XdeactivationTime; + p.linearSleepingThreshold = o[0].XlinearSleepingThreshold; + p.angularSleepingThreshold = o[0].XangularSleepingThreshold; + p.ccdMotionThreshold = o[0].XccdMotionThreshold; + p.ccdSweptSphereRadius = o[0].XccdSweptSphereRadius; + p.contactProcessingThreshold = o[0].XcontactProcessingThreshold; + + p.terrainImplementation = o[0].XterrainImplementation; + p.terrainFriction = o[0].XterrainFriction; + + p.terrainHitFraction = o[0].XterrainHitFraction; + p.terrainRestitution = o[0].XterrainRestitution; + p.terrainCollisionMargin = o[0].XterrainCollisionMargin; + + p.avatarFriction = o[0].XavatarFriction; + p.avatarStandingFriction = o[0].XavatarStandingFriction; + p.avatarDensity = o[0].XavatarDensity; + p.avatarRestitution = o[0].XavatarRestitution; + p.avatarCapsuleWidth = o[0].XavatarCapsuleWidth; + p.avatarCapsuleDepth = o[0].XavatarCapsuleDepth; + p.avatarCapsuleHeight = o[0].XavatarCapsuleHeight; + p.avatarContactProcessingThreshold = o[0].XavatarContactProcessingThreshold; + + p.vehicleAngularDamping = o[0].XvehicleAngularDamping; + + p.maxPersistantManifoldPoolSize = o[0].maxPersistantManifoldPoolSize; + p.maxCollisionAlgorithmPoolSize = o[0].maxCollisionAlgorithmPoolSize; + p.shouldDisableContactPoolDynamicAllocation = o[0].shouldDisableContactPoolDynamicAllocation; + p.shouldForceUpdateAllAabbs = o[0].shouldForceUpdateAllAabbs; + p.shouldRandomizeSolverOrder = o[0].shouldRandomizeSolverOrder; + p.shouldSplitSimulationIslands = o[0].shouldSplitSimulationIslands; + p.shouldEnableFrictionCaching = o[0].shouldEnableFrictionCaching; + p.numberOfSolverIterations = o[0].numberOfSolverIterations; + + p.linksetImplementation = o[0].XlinksetImplementation; + p.linkConstraintUseFrameOffset = o[0].XlinkConstraintUseFrameOffset; + p.linkConstraintEnableTransMotor = o[0].XlinkConstraintEnableTransMotor; + p.linkConstraintTransMotorMaxVel = o[0].XlinkConstraintTransMotorMaxVel; + p.linkConstraintTransMotorMaxForce = o[0].XlinkConstraintTransMotorMaxForce; + p.linkConstraintERP = o[0].XlinkConstraintERP; + p.linkConstraintCFM = o[0].XlinkConstraintCFM; + p.linkConstraintSolverIterations = o[0].XlinkConstraintSolverIterations; + p.physicsLoggingFrames = o[0].physicsLoggingFrames; + DefaultCollisionConstructionInfo ccci = new DefaultCollisionConstructionInfo(); + + DefaultCollisionConfiguration cci = new DefaultCollisionConfiguration(); + CollisionDispatcher m_dispatcher = new CollisionDispatcher(cci); + + + if (p.maxPersistantManifoldPoolSize > 0) + cci.m_persistentManifoldPoolSize = (int)p.maxPersistantManifoldPoolSize; + if (p.shouldDisableContactPoolDynamicAllocation !=0) + m_dispatcher.SetDispatcherFlags(DispatcherFlags.CD_DISABLE_CONTACTPOOL_DYNAMIC_ALLOCATION); + //if (p.maxCollisionAlgorithmPoolSize >0 ) + + DbvtBroadphase m_broadphase = new DbvtBroadphase(); + //IndexedVector3 aabbMin = new IndexedVector3(0, 0, 0); + //IndexedVector3 aabbMax = new IndexedVector3(256, 256, 256); + + //AxisSweep3Internal m_broadphase2 = new AxisSweep3Internal(ref aabbMin, ref aabbMax, Convert.ToInt32(0xfffe), 0xffff, ushort.MaxValue/2, null, true); + m_broadphase.GetOverlappingPairCache().SetInternalGhostPairCallback(new GhostPairCallback()); + + SequentialImpulseConstraintSolver m_solver = new SequentialImpulseConstraintSolver(); + + DiscreteDynamicsWorld world = new DiscreteDynamicsWorld(m_dispatcher, m_broadphase, m_solver, cci); + world.UpdatedObjects = updateArray; + world.UpdatedCollisions = collisionArray; + world.WorldSettings.Params = p; + world.SetForceUpdateAllAabbs(p.shouldForceUpdateAllAabbs != 0); + world.GetSolverInfo().m_solverMode = SolverMode.SOLVER_USE_WARMSTARTING | SolverMode.SOLVER_SIMD; + if (p.shouldRandomizeSolverOrder != 0) + world.GetSolverInfo().m_solverMode |= SolverMode.SOLVER_RANDMIZE_ORDER; + + world.GetSimulationIslandManager().SetSplitIslands(p.shouldSplitSimulationIslands != 0); + //world.GetDispatchInfo().m_enableSatConvex Not implemented in C# port + + if (p.shouldEnableFrictionCaching != 0) + world.GetSolverInfo().m_solverMode |= SolverMode.SOLVER_ENABLE_FRICTION_DIRECTION_CACHING; + + if (p.numberOfSolverIterations > 0) + world.GetSolverInfo().m_numIterations = (int) p.numberOfSolverIterations; + + + world.GetSolverInfo().m_damping = world.WorldSettings.Params.linearDamping; + world.GetSolverInfo().m_restitution = world.WorldSettings.Params.defaultRestitution; + world.GetSolverInfo().m_globalCfm = 0.0f; + world.GetSolverInfo().m_tau = 0.6f; + world.GetSolverInfo().m_friction = 0.3f; + world.GetSolverInfo().m_maxErrorReduction = 20f; + world.GetSolverInfo().m_numIterations = 10; + world.GetSolverInfo().m_erp = 0.2f; + world.GetSolverInfo().m_erp2 = 0.1f; + world.GetSolverInfo().m_sor = 1.0f; + world.GetSolverInfo().m_splitImpulse = false; + world.GetSolverInfo().m_splitImpulsePenetrationThreshold = -0.02f; + world.GetSolverInfo().m_linearSlop = 0.0f; + world.GetSolverInfo().m_warmstartingFactor = 0.85f; + world.GetSolverInfo().m_restingContactRestitutionThreshold = 2; + world.SetForceUpdateAllAabbs(true); + + + world.SetGravity(new IndexedVector3(0,0,p.gravity)); + + return world; + } + //m_constraint.ptr, ConstraintParams.BT_CONSTRAINT_STOP_CFM, cfm, ConstraintParamAxis.AXIS_ALL + internal static bool SetConstraintParam2(object pConstraint, ConstraintParams paramIndex, float paramvalue, ConstraintParamAxis axis) + { + Generic6DofConstraint constrain = pConstraint as Generic6DofConstraint; + if (axis == ConstraintParamAxis.AXIS_LINEAR_ALL || axis == ConstraintParamAxis.AXIS_ALL) + { + constrain.SetParam((BulletXNA.BulletDynamics.ConstraintParams) (int) paramIndex, paramvalue, 0); + constrain.SetParam((BulletXNA.BulletDynamics.ConstraintParams) (int) paramIndex, paramvalue, 1); + constrain.SetParam((BulletXNA.BulletDynamics.ConstraintParams) (int) paramIndex, paramvalue, 2); + } + if (axis == ConstraintParamAxis.AXIS_ANGULAR_ALL || axis == ConstraintParamAxis.AXIS_ALL) + { + constrain.SetParam((BulletXNA.BulletDynamics.ConstraintParams)(int)paramIndex, paramvalue, 3); + constrain.SetParam((BulletXNA.BulletDynamics.ConstraintParams)(int)paramIndex, paramvalue, 4); + constrain.SetParam((BulletXNA.BulletDynamics.ConstraintParams)(int)paramIndex, paramvalue, 5); + } + if (axis == ConstraintParamAxis.AXIS_LINEAR_ALL) + { + constrain.SetParam((BulletXNA.BulletDynamics.ConstraintParams)(int)paramIndex, paramvalue, (int)axis); + } + return true; + } + + internal static bool PushUpdate2(object pCollisionObject) + { + bool ret = false; + RigidBody rb = pCollisionObject as RigidBody; + if (rb != null) + { + SimMotionState sms = rb.GetMotionState() as SimMotionState; + if (sms != null) + { + IndexedMatrix wt = IndexedMatrix.Identity; + sms.GetWorldTransform(out wt); + sms.SetWorldTransform(ref wt, true); + ret = true; + } + } + return ret; + + } + + internal static bool IsCompound2(object pShape) + { + CollisionShape shape = pShape as CollisionShape; + return shape.IsCompound(); + } + internal static bool IsPloyhedral2(object pShape) + { + CollisionShape shape = pShape as CollisionShape; + return shape.IsPolyhedral(); + } + internal static bool IsConvex2d2(object pShape) + { + CollisionShape shape = pShape as CollisionShape; + return shape.IsConvex2d(); + } + internal static bool IsConvex2(object pShape) + { + CollisionShape shape = pShape as CollisionShape; + return shape.IsConvex(); + } + internal static bool IsNonMoving2(object pShape) + { + CollisionShape shape = pShape as CollisionShape; + return shape.IsNonMoving(); + } + internal static bool IsConcave2(object pShape) + { + CollisionShape shape = pShape as CollisionShape; + return shape.IsConcave(); + } + internal static bool IsInfinite2(object pShape) + { + CollisionShape shape = pShape as CollisionShape; + return shape.IsInfinite(); + } + internal static bool IsNativeShape2(object pShape) + { + CollisionShape shape = pShape as CollisionShape; + bool ret; + switch (shape.GetShapeType()) + { + case BroadphaseNativeTypes.BOX_SHAPE_PROXYTYPE: + case BroadphaseNativeTypes.CONE_SHAPE_PROXYTYPE: + case BroadphaseNativeTypes.SPHERE_SHAPE_PROXYTYPE: + case BroadphaseNativeTypes.CYLINDER_SHAPE_PROXYTYPE: + ret = true; + break; + default: + ret = false; + break; + } + return ret; + } + //sim.ptr, shape.ptr,prim.LocalID, prim.RawPosition, prim.RawOrientation + internal static object CreateGhostFromShape2(object pWorld, object pShape, uint pLocalID, Vector3 pRawPosition, Quaternion pRawOrientation) + { + IndexedMatrix bodyTransform = new IndexedMatrix(); + bodyTransform._origin = new IndexedVector3(pRawPosition.X, pRawPosition.Y, pRawPosition.Z); + bodyTransform.SetRotation(new IndexedQuaternion(pRawOrientation.X,pRawOrientation.Y,pRawOrientation.Z,pRawOrientation.W)); + GhostObject gObj = new PairCachingGhostObject(); + gObj.SetWorldTransform(bodyTransform); + CollisionShape shape = pShape as CollisionShape; + gObj.SetCollisionShape(shape); + gObj.SetUserPointer(pLocalID); + // TODO: Add to Special CollisionObjects! + return gObj; + } + + public static void SetCollisionShape2(object pWorld, object pObj, object pShape) + { + var world = pWorld as DiscreteDynamicsWorld; + var obj = pObj as CollisionObject; + var shape = pShape as CollisionShape; + obj.SetCollisionShape(shape); + + } + //(PhysicsScene.World.ptr, nativeShapeData) + internal static object BuildNativeShape2(object pWorld, ShapeData pShapeData) + { + var world = pWorld as DiscreteDynamicsWorld; + CollisionShape shape = null; + switch (pShapeData.Type) + { + case BSPhysicsShapeType.SHAPE_BOX: + shape = new BoxShape(new IndexedVector3(0.5f,0.5f,0.5f)); + break; + case BSPhysicsShapeType.SHAPE_CONE: + shape = new ConeShapeZ(0.5f, 1.0f); + break; + case BSPhysicsShapeType.SHAPE_CYLINDER: + shape = new CylinderShapeZ(new IndexedVector3(0.5f, 0.5f, 0.5f)); + break; + case BSPhysicsShapeType.SHAPE_SPHERE: + shape = new SphereShape(0.5f); + break; + + } + if (shape != null) + { + IndexedVector3 scaling = new IndexedVector3(pShapeData.Scale.X, pShapeData.Scale.Y, pShapeData.Scale.Z); + shape.SetMargin(world.WorldSettings.Params.collisionMargin); + shape.SetLocalScaling(ref scaling); + + } + return shape; + } + //PhysicsScene.World.ptr, false + internal static object CreateCompoundShape2(object pWorld, bool enableDynamicAabbTree) + { + return new CompoundShape(enableDynamicAabbTree); + } + + internal static int GetNumberOfCompoundChildren2(object pCompoundShape) + { + var compoundshape = pCompoundShape as CompoundShape; + return compoundshape.GetNumChildShapes(); + } + //LinksetRoot.PhysShape.ptr, newShape.ptr, displacementPos, displacementRot + internal static void AddChildShapeToCompoundShape2(object pCShape, object paddShape, Vector3 displacementPos, Quaternion displacementRot) + { + IndexedMatrix relativeTransform = new IndexedMatrix(); + var compoundshape = pCShape as CompoundShape; + var addshape = paddShape as CollisionShape; + + relativeTransform._origin = new IndexedVector3(displacementPos.X, displacementPos.Y, displacementPos.Z); + relativeTransform.SetRotation(new IndexedQuaternion(displacementRot.X,displacementRot.Y,displacementRot.Z,displacementRot.W)); + compoundshape.AddChildShape(ref relativeTransform, addshape); + + } + + internal static object RemoveChildShapeFromCompoundShapeIndex2(object pCShape, int pii) + { + var compoundshape = pCShape as CompoundShape; + CollisionShape ret = null; + ret = compoundshape.GetChildShape(pii); + compoundshape.RemoveChildShapeByIndex(pii); + return ret; + } + + internal static object CreateGroundPlaneShape2(uint pLocalId, float pheight, float pcollisionMargin) + { + StaticPlaneShape m_planeshape = new StaticPlaneShape(new IndexedVector3(0,0,1),(int)pheight ); + m_planeshape.SetMargin(pcollisionMargin); + m_planeshape.SetUserPointer(pLocalId); + return m_planeshape; + } + + internal static object CreateHingeConstraint2(object pWorld, object pBody1, object ppBody2, Vector3 ppivotInA, Vector3 ppivotInB, Vector3 paxisInA, Vector3 paxisInB, bool puseLinearReferenceFrameA, bool pdisableCollisionsBetweenLinkedBodies) + { + HingeConstraint constrain = null; + var rb1 = pBody1 as RigidBody; + var rb2 = ppBody2 as RigidBody; + if (rb1 != null && rb2 != null) + { + IndexedVector3 pivotInA = new IndexedVector3(ppivotInA.X, ppivotInA.Y, ppivotInA.Z); + IndexedVector3 pivotInB = new IndexedVector3(ppivotInB.X, ppivotInB.Y, ppivotInB.Z); + IndexedVector3 axisInA = new IndexedVector3(paxisInA.X, paxisInA.Y, paxisInA.Z); + IndexedVector3 axisInB = new IndexedVector3(paxisInB.X, paxisInB.Y, paxisInB.Z); + var world = pWorld as DiscreteDynamicsWorld; + world.AddConstraint(constrain, pdisableCollisionsBetweenLinkedBodies); + } + return constrain; + } + + internal static bool ReleaseHeightMapInfo2(object pMapInfo) + { + if (pMapInfo != null) + { + BulletHeightMapInfo mapinfo = pMapInfo as BulletHeightMapInfo; + if (mapinfo.heightMap != null) + mapinfo.heightMap = null; + + + } + return true; + } + + internal static object CreateHullShape2(object pWorld, int pHullCount, float[] pConvHulls) + { + CompoundShape compoundshape = new CompoundShape(false); + var world = pWorld as DiscreteDynamicsWorld; + + + compoundshape.SetMargin(world.WorldSettings.Params.collisionMargin); + int ii = 1; + + for (int i = 0; i < pHullCount; i++) + { + int vertexCount = (int) pConvHulls[ii]; + + IndexedVector3 centroid = new IndexedVector3(pConvHulls[ii + 1], pConvHulls[ii + 2], pConvHulls[ii + 3]); + IndexedMatrix childTrans = IndexedMatrix.Identity; + childTrans._origin = centroid; + + List virts = new List(); + int ender = ((ii + 4) + (vertexCount*3)); + for (int iii = ii + 4; iii < ender; iii+=3) + { + + virts.Add(new IndexedVector3(pConvHulls[iii], pConvHulls[iii + 1], pConvHulls[iii +2])); + } + ConvexHullShape convexShape = new ConvexHullShape(virts, vertexCount); + convexShape.SetMargin(world.WorldSettings.Params.collisionMargin); + compoundshape.AddChildShape(ref childTrans, convexShape); + ii += (vertexCount*3 + 4); + } + + + return compoundshape; + } + + internal static object CreateMeshShape2(object pWorld, int pIndicesCount, int[] indices, int pVerticesCount, float[] verticesAsFloats) + { + //DumpRaw(indices,verticesAsFloats,pIndicesCount,pVerticesCount); + + for (int iter = 0; iter < pVerticesCount; iter++) + { + if (verticesAsFloats[iter] > 0 && verticesAsFloats[iter] < 0.0001) verticesAsFloats[iter] = 0; + if (verticesAsFloats[iter] < 0 && verticesAsFloats[iter] > -0.0001) verticesAsFloats[iter] = 0; + } + + ObjectArray indicesarr = new ObjectArray(indices); + ObjectArray vertices = new ObjectArray(verticesAsFloats); + DumpRaw(indicesarr,vertices,pIndicesCount,pVerticesCount); + var world = pWorld as DiscreteDynamicsWorld; + IndexedMesh mesh = new IndexedMesh(); + mesh.m_indexType = PHY_ScalarType.PHY_INTEGER; + mesh.m_numTriangles = pIndicesCount/3; + mesh.m_numVertices = pVerticesCount; + mesh.m_triangleIndexBase = indicesarr; + mesh.m_vertexBase = vertices; + mesh.m_vertexStride = 3; + mesh.m_vertexType = PHY_ScalarType.PHY_FLOAT; + mesh.m_triangleIndexStride = 3; + + TriangleIndexVertexArray tribuilder = new TriangleIndexVertexArray(); + tribuilder.AddIndexedMesh(mesh, PHY_ScalarType.PHY_INTEGER); + BvhTriangleMeshShape meshShape = new BvhTriangleMeshShape(tribuilder, true,true); + meshShape.SetMargin(world.WorldSettings.Params.collisionMargin); + // world.UpdateSingleAabb(meshShape); + return meshShape; + + } + public static void DumpRaw(ObjectArrayindices, ObjectArray vertices, int pIndicesCount,int pVerticesCount ) + { + + String fileName = "objTest3.raw"; + String completePath = System.IO.Path.Combine(Util.configDir(), fileName); + StreamWriter sw = new StreamWriter(completePath); + IndexedMesh mesh = new IndexedMesh(); + + mesh.m_indexType = PHY_ScalarType.PHY_INTEGER; + mesh.m_numTriangles = pIndicesCount / 3; + mesh.m_numVertices = pVerticesCount; + mesh.m_triangleIndexBase = indices; + mesh.m_vertexBase = vertices; + mesh.m_vertexStride = 3; + mesh.m_vertexType = PHY_ScalarType.PHY_FLOAT; + mesh.m_triangleIndexStride = 3; + + TriangleIndexVertexArray tribuilder = new TriangleIndexVertexArray(); + tribuilder.AddIndexedMesh(mesh, PHY_ScalarType.PHY_INTEGER); + + + + for (int i = 0; i < pVerticesCount; i++) + { + + string s = vertices[indices[i * 3]].ToString("0.0000"); + s += " " + vertices[indices[i * 3 + 1]].ToString("0.0000"); + s += " " + vertices[indices[i * 3 + 2]].ToString("0.0000"); + + sw.Write(s + "\n"); + } + + sw.Close(); + } + public static void DumpRaw(int[] indices, float[] vertices, int pIndicesCount, int pVerticesCount) + { + + String fileName = "objTest6.raw"; + String completePath = System.IO.Path.Combine(Util.configDir(), fileName); + StreamWriter sw = new StreamWriter(completePath); + IndexedMesh mesh = new IndexedMesh(); + + mesh.m_indexType = PHY_ScalarType.PHY_INTEGER; + mesh.m_numTriangles = pIndicesCount / 3; + mesh.m_numVertices = pVerticesCount; + mesh.m_triangleIndexBase = indices; + mesh.m_vertexBase = vertices; + mesh.m_vertexStride = 3; + mesh.m_vertexType = PHY_ScalarType.PHY_FLOAT; + mesh.m_triangleIndexStride = 3; + + TriangleIndexVertexArray tribuilder = new TriangleIndexVertexArray(); + tribuilder.AddIndexedMesh(mesh, PHY_ScalarType.PHY_INTEGER); + + + sw.WriteLine("Indices"); + sw.WriteLine(string.Format("int[] indices = new int[{0}];",pIndicesCount)); + for (int iter = 0; iter < indices.Length; iter++) + { + sw.WriteLine(string.Format("indices[{0}]={1};",iter,indices[iter])); + } + sw.WriteLine("VerticesFloats"); + sw.WriteLine(string.Format("float[] vertices = new float[{0}];", pVerticesCount)); + for (int iter = 0; iter < vertices.Length; iter++) + { + sw.WriteLine(string.Format("Vertices[{0}]={1};", iter, vertices[iter].ToString("0.0000"))); + } + + // for (int i = 0; i < pVerticesCount; i++) + // { + // + // string s = vertices[indices[i * 3]].ToString("0.0000"); + // s += " " + vertices[indices[i * 3 + 1]].ToString("0.0000"); + // s += " " + vertices[indices[i * 3 + 2]].ToString("0.0000"); + // + // sw.Write(s + "\n"); + //} + + sw.Close(); + } + //PhysicsScene.World.ptr, m_mapInfo.ID, m_mapInfo.minCoords, m_mapInfo.maxCoords, m_mapInfo.heightMap, PhysicsScene.Params.terrainCollisionMargin + internal static object CreateHeightMapInfo2(object pWorld, uint pId, Vector3 pminCoords, Vector3 pmaxCoords, float[] pheightMap, float pCollisionMargin) + { + BulletHeightMapInfo mapInfo = new BulletHeightMapInfo(pId, pheightMap, null); + mapInfo.heightMap = null; + mapInfo.minCoords = pminCoords; + mapInfo.maxCoords = pmaxCoords; + mapInfo.sizeX = (int) (pmaxCoords.X - pminCoords.X); + mapInfo.sizeY = (int) (pmaxCoords.Y - pminCoords.Y); + mapInfo.ID = pId; + mapInfo.minZ = pminCoords.Z; + mapInfo.maxZ = pmaxCoords.Z; + mapInfo.collisionMargin = pCollisionMargin; + if (mapInfo.minZ == mapInfo.maxZ) + mapInfo.minZ -= 0.2f; + mapInfo.heightMap = pheightMap; + + return mapInfo; + + } + + internal static object CreateTerrainShape2(object pMapInfo) + { + BulletHeightMapInfo mapinfo = pMapInfo as BulletHeightMapInfo; + const int upAxis = 2; + const float scaleFactor = 1.0f; + HeightfieldTerrainShape terrainShape = new HeightfieldTerrainShape((int)mapinfo.sizeX, (int)mapinfo.sizeY, + mapinfo.heightMap, scaleFactor, + mapinfo.minZ, mapinfo.maxZ, upAxis, + false); + terrainShape.SetMargin(mapinfo.collisionMargin + 0.5f); + terrainShape.SetUseDiamondSubdivision(true); + terrainShape.SetUserPointer(mapinfo.ID); + return terrainShape; + } + + internal static bool TranslationalLimitMotor2(object pConstraint, float ponOff, float targetVelocity, float maxMotorForce) + { + TypedConstraint tconstrain = pConstraint as TypedConstraint; + bool onOff = ponOff != 0; + bool ret = false; + + switch (tconstrain.GetConstraintType()) + { + case TypedConstraintType.D6_CONSTRAINT_TYPE: + Generic6DofConstraint constrain = pConstraint as Generic6DofConstraint; + constrain.GetTranslationalLimitMotor().m_enableMotor[0] = onOff; + constrain.GetTranslationalLimitMotor().m_targetVelocity[0] = targetVelocity; + constrain.GetTranslationalLimitMotor().m_maxMotorForce[0] = maxMotorForce; + ret = true; + break; + } + + + return ret; + + } + + internal static int PhysicsStep2(object pWorld, float timeStep, int m_maxSubSteps, float m_fixedTimeStep, out int updatedEntityCount, out List updatedEntities, out int collidersCount, out Listcolliders) + { + int epic = PhysicsStepint2(pWorld, timeStep, m_maxSubSteps, m_fixedTimeStep, out updatedEntityCount, out updatedEntities, + out collidersCount, out colliders); + return epic; + } + + private static int PhysicsStepint2(object pWorld,float timeStep, int m_maxSubSteps, float m_fixedTimeStep, out int updatedEntityCount, out List updatedEntities, out int collidersCount, out List colliders) + { + int numSimSteps = 0; + + + //if (updatedEntities is null) + // updatedEntities = new List(); + + //if (colliders is null) + // colliders = new List(); + + + if (pWorld is DiscreteDynamicsWorld) + { + DiscreteDynamicsWorld world = pWorld as DiscreteDynamicsWorld; + + numSimSteps = world.StepSimulation(timeStep, m_maxSubSteps, m_fixedTimeStep); + int updates = 0; + + updatedEntityCount = world.UpdatedObjects.Count; + updatedEntities = new List(world.UpdatedObjects); + updatedEntityCount = updatedEntities.Count; + world.UpdatedObjects.Clear(); + + + collidersCount = world.UpdatedCollisions.Count; + colliders = new List(world.UpdatedCollisions); + + world.UpdatedCollisions.Clear(); + m_collisionsThisFrame = 0; + int numManifolds = world.GetDispatcher().GetNumManifolds(); + for (int j = 0; j < numManifolds; j++) + { + PersistentManifold contactManifold = world.GetDispatcher().GetManifoldByIndexInternal(j); + int numContacts = contactManifold.GetNumContacts(); + if (numContacts == 0) + continue; + + CollisionObject objA = contactManifold.GetBody0() as CollisionObject; + CollisionObject objB = contactManifold.GetBody1() as CollisionObject; + + ManifoldPoint manifoldPoint = contactManifold.GetContactPoint(0); + IndexedVector3 contactPoint = manifoldPoint.GetPositionWorldOnB(); + IndexedVector3 contactNormal = -manifoldPoint.m_normalWorldOnB; // make relative to A + + RecordCollision(world, objA, objB, contactPoint, contactNormal); + m_collisionsThisFrame ++; + if (m_collisionsThisFrame >= 9999999) + break; + + + } + + + } + else + { + //if (updatedEntities is null) + updatedEntities = new List(); + updatedEntityCount = 0; + //if (colliders is null) + colliders = new List(); + collidersCount = 0; + } + return numSimSteps; + } + + private static void RecordCollision(CollisionWorld world,CollisionObject objA, CollisionObject objB, IndexedVector3 contact, IndexedVector3 norm) + { + + IndexedVector3 contactNormal = norm; + if ((objA.GetCollisionFlags() & BulletXNA.BulletCollision.CollisionFlags.BS_WANTS_COLLISIONS) == 0 && + (objB.GetCollisionFlags() & BulletXNA.BulletCollision.CollisionFlags.BS_WANTS_COLLISIONS) == 0) + { + return; + } + uint idA = (uint)objA.GetUserPointer(); + uint idB = (uint)objB.GetUserPointer(); + if (idA > idB) + { + uint temp = idA; + idA = idB; + idB = temp; + contactNormal = -contactNormal; + } + + ulong collisionID = ((ulong) idA << 32) | idB; + + BulletXNA.CollisionDesc cDesc = new BulletXNA.CollisionDesc() + { + aID = idA, + bID = idB, + point = contact, + normal = contactNormal + }; + world.UpdatedCollisions.Add(cDesc); + m_collisionsThisFrame++; + + + } + private static EntityProperties GetDebugProperties(object pWorld, object pBody) + { + EntityProperties ent = new EntityProperties(); + DiscreteDynamicsWorld world = pWorld as DiscreteDynamicsWorld; + RigidBody body = pBody as RigidBody; + IndexedMatrix transform = body.GetWorldTransform(); + IndexedVector3 LinearVelocity = body.GetInterpolationLinearVelocity(); + IndexedVector3 AngularVelocity = body.GetInterpolationAngularVelocity(); + IndexedQuaternion rotation = transform.GetRotation(); + ent.Acceleration = Vector3.Zero; + ent.ID = (uint)body.GetUserPointer(); + ent.Position = new Vector3(transform._origin.X,transform._origin.Y,transform._origin.Z); + ent.Rotation = new Quaternion(rotation.X,rotation.Y,rotation.Z,rotation.W); + ent.Velocity = new Vector3(LinearVelocity.X, LinearVelocity.Y, LinearVelocity.Z); + ent.RotationalVelocity = new Vector3(AngularVelocity.X, AngularVelocity.Y, AngularVelocity.Z); + return ent; + + + } + + + internal static Vector3 GetLocalScaling2(object pBody) + { + CollisionShape shape = pBody as CollisionShape; + IndexedVector3 scale = shape.GetLocalScaling(); + return new Vector3(scale.X,scale.Y,scale.Z); + } + + internal static bool RayCastGround(object pWorld, Vector3 _RayOrigin, float pRayHeight, object NotMe) + { + DynamicsWorld world = pWorld as DynamicsWorld; + if (world != null) + { + if (NotMe is CollisionObject || NotMe is RigidBody) + { + CollisionObject AvoidBody = NotMe as CollisionObject; + + IndexedVector3 rOrigin = new IndexedVector3(_RayOrigin.X, _RayOrigin.Y, _RayOrigin.Z); + IndexedVector3 rEnd = new IndexedVector3(_RayOrigin.X, _RayOrigin.Y, _RayOrigin.Z - pRayHeight); + using ( + ClosestNotMeRayResultCallback rayCallback = new ClosestNotMeRayResultCallback(rOrigin, + rEnd, AvoidBody) + ) + { + world.RayTest(ref rOrigin, ref rEnd, rayCallback); + if (rayCallback.HasHit()) + { + IndexedVector3 hitLocation = rayCallback.m_hitPointWorld; + + } + return rayCallback.HasHit(); + } + } + } + return false; + } +} +} diff --git a/OpenSim/Region/Physics/BulletSNPlugin/BulletSimData.cs b/OpenSim/Region/Physics/BulletSNPlugin/BulletSimData.cs new file mode 100644 index 0000000000..a1ed8d86c3 --- /dev/null +++ b/OpenSim/Region/Physics/BulletSNPlugin/BulletSimData.cs @@ -0,0 +1,280 @@ +/* + * 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 copyrightD + * 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.Text; +using OMV = OpenMetaverse; + +namespace OpenSim.Region.Physics.BulletSNPlugin +{ +// Classes to allow some type checking for the API +// These hold pointers to allocated objects in the unmanaged space. + +// The physics engine controller class created at initialization +public struct BulletSim +{ + public BulletSim(uint worldId, BSScene bss, object xx) + { + ptr = xx; + worldID = worldId; + physicsScene = bss; + } + public object ptr; + public uint worldID; + // The scene is only in here so very low level routines have a handle to print debug/error messages + public BSScene physicsScene; +} + +// An allocated Bullet btRigidBody +public struct BulletBody +{ + public BulletBody(uint id) : this(id, null) + { + } + public BulletBody(uint id, object xx) + { + ID = id; + ptr = xx; + collisionType = CollisionType.Static; + } + public object ptr; + public uint ID; + public CollisionType collisionType; + + public void Clear() + { + ptr = null; + } + public bool HasPhysicalBody { get { return ptr != null; } } + + // Apply the specificed collision mask into the physical world + public void ApplyCollisionMask() + { + // Should assert the body has been added to the physical world. + // (The collision masks are stored in the collision proxy cache which only exists for + // a collision body that is in the world.) + BulletSimAPI.SetCollisionGroupMask2(ptr, + BulletSimData.CollisionTypeMasks[collisionType].group, + BulletSimData.CollisionTypeMasks[collisionType].mask); + } + + public override string ToString() + { + StringBuilder buff = new StringBuilder(); + buff.Append(""); + return buff.ToString(); + } +} + +public struct BulletShape +{ + public BulletShape(object xx) : this(xx, BSPhysicsShapeType.SHAPE_UNKNOWN) + { + } + public BulletShape(object xx, BSPhysicsShapeType typ) + { + ptr = xx; + type = typ; + shapeKey = (System.UInt64)FixedShapeKey.KEY_NONE; + isNativeShape = false; + } + public object ptr; + public BSPhysicsShapeType type; + public System.UInt64 shapeKey; + public bool isNativeShape; + + public void Clear() + { + ptr = null; + } + public bool HasPhysicalShape { get { return ptr != null; } } + + public override string ToString() + { + StringBuilder buff = new StringBuilder(); + buff.Append(""); + return buff.ToString(); + } +} + +// An allocated Bullet btConstraint +public struct BulletConstraint +{ + public BulletConstraint(object xx) + { + ptr = xx; + } + public object ptr; + + public void Clear() + { + ptr = null; + } + public bool HasPhysicalConstraint { get { return ptr != null; } } +} + +// An allocated HeightMapThing which holds various heightmap info. +// Made a class rather than a struct so there would be only one +// instance of this and C# will pass around pointers rather +// than making copies. +public class BulletHeightMapInfo +{ + public BulletHeightMapInfo(uint id, float[] hm, object xx) { + ID = id; + Ptr = xx; + heightMap = hm; + terrainRegionBase = OMV.Vector3.Zero; + minCoords = new OMV.Vector3(100f, 100f, 25f); + maxCoords = new OMV.Vector3(101f, 101f, 26f); + minZ = maxZ = 0f; + sizeX = sizeY = 256f; + } + public uint ID; + public object Ptr; + public float[] heightMap; + public OMV.Vector3 terrainRegionBase; + public OMV.Vector3 minCoords; + public OMV.Vector3 maxCoords; + public float sizeX, sizeY; + public float minZ, maxZ; + public BulletShape terrainShape; + public BulletBody terrainBody; + + public float collisionMargin { get; set; } +} + +// The general class of collsion object. +public enum CollisionType +{ + Avatar, + Groundplane, + Terrain, + Static, + Dynamic, + VolumeDetect, + // Linkset, // A linkset should be either Static or Dynamic + LinksetChild, + Unknown +}; + +// Hold specification of group and mask collision flags for a CollisionType +public struct CollisionTypeFilterGroup +{ + public CollisionTypeFilterGroup(CollisionType t, uint g, uint m) + { + type = t; + group = g; + mask = m; + } + public CollisionType type; + public uint group; + public uint mask; +}; + + /* NOTE: old definitions kept for reference. Delete when things are working. + // The collsion filters and masked are defined in one place -- don't want them scattered + AvatarGroup = BCharacterGroup, + AvatarMask = BAllGroup, + ObjectGroup = BSolidGroup, + ObjectMask = BAllGroup, + StaticObjectGroup = BStaticGroup, + StaticObjectMask = AvatarGroup | ObjectGroup, // static things don't interact with much + LinksetGroup = BLinksetGroup, + LinksetMask = BAllGroup, + LinksetChildGroup = BLinksetChildGroup, + LinksetChildMask = BNoneGroup, // Linkset children disappear from the world + VolumeDetectGroup = BSensorTrigger, + VolumeDetectMask = ~BSensorTrigger, + TerrainGroup = BTerrainGroup, + TerrainMask = BAllGroup & ~BStaticGroup, // static objects on the ground don't collide + GroundPlaneGroup = BGroundPlaneGroup, + GroundPlaneMask = BAllGroup + */ + +public static class BulletSimData +{ + +// Map of collisionTypes to flags for collision groups and masks. +// As mentioned above, don't use the CollisionFilterGroups definitions directly in the code +// but, instead, use references to this dictionary. Finding and debugging +// collision flag problems will be made easier. +public static Dictionary CollisionTypeMasks + = new Dictionary() +{ + { CollisionType.Avatar, + new CollisionTypeFilterGroup(CollisionType.Avatar, + (uint)CollisionFilterGroups.BCharacterGroup, + (uint)CollisionFilterGroups.BAllGroup) + }, + { CollisionType.Groundplane, + new CollisionTypeFilterGroup(CollisionType.Groundplane, + (uint)CollisionFilterGroups.BGroundPlaneGroup, + (uint)CollisionFilterGroups.BAllGroup) + }, + { CollisionType.Terrain, + new CollisionTypeFilterGroup(CollisionType.Terrain, + (uint)CollisionFilterGroups.BTerrainGroup, + (uint)(CollisionFilterGroups.BAllGroup & ~CollisionFilterGroups.BStaticGroup)) + }, + { CollisionType.Static, + new CollisionTypeFilterGroup(CollisionType.Static, + (uint)CollisionFilterGroups.BStaticGroup, + (uint)(CollisionFilterGroups.BCharacterGroup | CollisionFilterGroups.BSolidGroup)) + }, + { CollisionType.Dynamic, + new CollisionTypeFilterGroup(CollisionType.Dynamic, + (uint)CollisionFilterGroups.BSolidGroup, + (uint)(CollisionFilterGroups.BAllGroup)) + }, + { CollisionType.VolumeDetect, + new CollisionTypeFilterGroup(CollisionType.VolumeDetect, + (uint)CollisionFilterGroups.BSensorTrigger, + (uint)(~CollisionFilterGroups.BSensorTrigger)) + }, + { CollisionType.LinksetChild, + new CollisionTypeFilterGroup(CollisionType.LinksetChild, + (uint)CollisionFilterGroups.BTerrainGroup, + (uint)(CollisionFilterGroups.BNoneGroup)) + }, +}; + +} +} diff --git a/bin/BulletXNA.dll b/bin/BulletXNA.dll new file mode 100644 index 0000000000000000000000000000000000000000..1e3f04253f06eb6016cf3c3e51b4fd16f8d0581c GIT binary patch literal 614400 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

j!TeD?I`h3^? z4R`>*@I?z^OkuuY+&KwYo5Lg(z|l*woQ#eki9!3F`xs&*Q3du9SA&XOG|~wm*2?Msmo~l~_HbN3? zg%n##c!fC7pAKLX#02W~M6`i7AkkIiS?XAi9->?6X!fx&sqn)WqQaM{1V+M@Od*;k zzK+@;kn~)K)&urMvL2{)1NC6x`-b7ReyF;VUTT)18F`~Fr*&-85;lN)EqI``VCgo8 zn<1(D)9cMOnwO0zqwC65^Ac+5am^1ywg8Ae6;Q(k7utlbO84SESd7)w`QqtWa>vW z_0MLh^WfhB*z5hCV+r+oUrAo02T^*wOcJ<vCl7_i=O2i4&UhiuOX(vl@3T()OY3_|Y(M%5;__Z?u$l*jFTcOV?U zj+N#d`Y3X^J)!D{mFlkxMEJ0fe-OxDk}?aKT*q90m4jRf$c9X-{{~TZ&tlu{{nsqi zaeMzy7MgH-|B!_y-QGWDp{aq;dbjt_S)6LUnRzY_|H4n^*0)wvKtq8PpodjlFDiGk z&c=|z8mmIRr#`Zp8O>SH*;4*uDEG>ZM_@Ogw8b(x~i%|p)N zi*Z>@|9Zx?`p?6|joGf`GGp$WYekdTppY4 zVKBLGdqkEa?CwE(`!;q}(RZ{v2@j8fd$~}XRTA9|jlzyd%uU63!xWRQ;^0bQQVv&TpxJ1=7_0%($R?3*&Xy6o6Y10+0{8w-G=V51>$?dkZrvaE}D*aaNWslhwlh zO#sQfR@EGaeL`)nttZi+ucjsqPxZs9i>g9SIrI|n0<)@I2Uw(14GLNr9h9^3IVfgj zGvhC(DO$JDHdFv+1DzGJ$7~^Y{Ow+oLHXNlCmDUGlmC_4 zc3V-℘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 AnE(I) literal 0 HcmV?d00001 diff --git a/bin/BulletXNA.pdb b/bin/BulletXNA.pdb new file mode 100644 index 0000000000000000000000000000000000000000..4b83b83f2881d90a004c352b1d48c7b980259962 GIT binary patch literal 1875456 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

  • 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%0AwU%6$Zv^d}-Iu42 zYp;vT_Ift9ImC7IF^FqbW6S?UpD1uHajo%jQP;zCDgSkrdJ*9i#{2X6Uv!M}zg81_ z%#{|*-!kNUBva13;+ZpXm7F?jW+>ql#`}|;Qj330mopw4Dx5z9W&r-SIQ|{nI!-Da z{eJ2ED!icnj^rDF@Agp}^JVVaLaqjlnEn>b-+833>0M4&`*H{rsAOGC`u0K!=l%M! z7@MBPSbx^HEqGa1I$2p)iOsdhI@rs~esfc20$JES>J{%C}%sr&)@p#IA5l(W{Izo_&$Dce5w3F zst;3-hPVOUDw8_o0_4w9iE0?gmc+HK&%$vUdRQ0VT8EZ(F(g zVPn08oDA30l@2>T&%QrO@4pp~_J^oB>7BOa*DFq=c-XOWb{^V0A|7iUkNXe7!;WDS zzB7u{PW?FG0mtJ(Q0p~c%)&!?W5=Nhcj8t0yZ#N1$HSo3JsttIzVQ{X54aJuY3oBC z>AbX_aT-VCZpWPoxAL#mwAA~gO@vh%zXpo;*FlxT<7qro{FG;Q%$WU-*>5<0TfkQM z{btN3b+-I^p4;&pd#3m;qb9w^{9+%wMrWm{Ysx2rF?bs|4mur}ZufSJ% z_ybVovJ+IT{b3xR&Sg*CDXsFhW35Ew$6y-9D;^o%s~UcPl2H$cVtX3Q&{haI9^R6qD;X2-SIf!c>DvD zUV0x?J798P%2ai$3)Y6%yMm3u^FS7bOkI=vNbF6pj{=*4v%%xQIiTFjz~anzeI$hl%c&EXX zU3c6rFwa!)Tkuv*#@BJ>we7#N_fw}3zp|{Ik%M~yV|mhbgY8qZ*PD)xM<-BquXD^J z-^j6#XQ~Uo8_plhTIj9q>^+0pyu?{T&`@X^R0XYqHb6U|x1csJv(F7GfJ&ewv>Mt3 zZHL~1^s!1uXb@Bgl|w6_b4Te%-XPN`q#NUlncxB){JMXzc&_SM2}t>0Rk`SsT*e%|)d5 zWuM+LHRFnTX`%G0jZMeD{Camk{$;Ymf0^`sJ9VE^*!3{wwGCtUN}{KYk>2#?V*LEd z%QtyZaTN|nGB?bOV_E~tS>pw7o@){1G-B3dqVG4$oJ&@pIQ$sE){lg#D~cl=1N22r zD4u>`3-BzkJ=h<#eRVE6H(giS{7<;u)#>~8&UX9;fhWR;_fw8f>fZW7p4&XkzK?UT zc))#{)8cXg^; z(%+kjNG2B=ijFLV%Aq8*8rlGDgLXkj%cv~;`m5xS(OAiw{N~JIxnR=Ng_*T8N=xRH z&ZsIct|(3EfsJ@p81L_JZCGtayvV24HV)Hf%=h!kJKv^K?(|uT&K^+Cu%bTu0}sAO zMrEaXU}a9kX;%O0$CJ5ay=3hIb_8jMNtI(akUF9=b@d>hI-os5<4ryA<+<}RJYiI} z`zW(kuNdpU)gP6=U%%VoB(ozNYuQZs54_x!|8NdTspX)H^768pvdW6Q@;Q~&WwmqX zGYxu43K8!E#TMw~D;MbQ^?yUX5SFzV!f7< z&3T%Gn)B!#xaK^1|B#yV=-lLUAiK8U%l1c8@q|&?_M%)T{u`F95%2^4sQi6@SmOL@ zJnqfwWatZTyK^M!vH$;4!mCXDIvL-g7<0Xk0NjIzmhZ%8RaDL@HOqmfPR+%=gfQ~& z{q#hKDEOvWhp>M`FU#VZX|Lt;b?+d5W_@1m*{&-d|7q)SW}d;on3fjI-#1|T@ho{(w|MM$BQu`4E*=La zo;QhSwU4Ks@6CNYYM09(Tb~j-2gVpJi8IVHW-UQ$eNsa!~WnX<%3I z3XrivbS0=c*i~RY$QhOB*qua{C8thBJTF{PVCKJETV4nnC?r1!y zv)iY}aw$EwY!ha$64tb}u|@EcT#G@;wIt?m?

    %)R)?F%f1e|)bY5{g_V5!2qS&w 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

      IQ`sVA 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 literal 0 HcmV?d00001 diff --git a/prebuild.xml b/prebuild.xml index 14ffc997cd..741b660cbc 100644 --- a/prebuild.xml +++ b/prebuild.xml @@ -1756,6 +1756,40 @@ + + + + ../../../../bin/Physics/ + + + + + ../../../../bin/Physics/ + + + + ../../../../bin/ + + + + + + + + + + + + + + + + + + + + + From cb4949fc15765f0e2389a20b26077bbbdffbb1b0 Mon Sep 17 00:00:00 2001 From: teravus Date: Sun, 23 Dec 2012 15:24:15 -0500 Subject: [PATCH 06/11] * Added third party license for Bullet-xna. --- ThirdPartyLicenses/Bullet-XNA.txt | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 ThirdPartyLicenses/Bullet-XNA.txt diff --git a/ThirdPartyLicenses/Bullet-XNA.txt b/ThirdPartyLicenses/Bullet-XNA.txt new file mode 100644 index 0000000000..5d8899ba57 --- /dev/null +++ b/ThirdPartyLicenses/Bullet-XNA.txt @@ -0,0 +1,23 @@ +/* + * C# / XNA port of Bullet (c) 2011 Mark Neale + * http://code.google.com/p/bullet-xna/ + * + * Bullet Continuous Collision Detection and Physics Library + * Copyright (c) 2003-2008 Erwin Coumans http://www.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. + */ \ No newline at end of file From 1a841dfc599c8fe8c81105fd0a6ae6d511da2d6c Mon Sep 17 00:00:00 2001 From: teravus Date: Sun, 23 Dec 2012 15:44:29 -0500 Subject: [PATCH 07/11] * Update Example to include BulletSimN option and description. --- bin/OpenSim.ini.example | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/bin/OpenSim.ini.example b/bin/OpenSim.ini.example index e591a69355..8ce508accc 100644 --- a/bin/OpenSim.ini.example +++ b/bin/OpenSim.ini.example @@ -210,12 +210,13 @@ ;; Choose one of the physics engines below ;# {physics} {} {Select physics engine} {OpenDynamicsEngine BulletSim basicphysics POS} OpenDynamicsEngine ;; OpenDynamicsEngine is by some distance the most developed physics engine - ;; BulletSim is incomplete and experimental but in active development + ;; BulletSim is incomplete and experimental but in active development. BulletSimN is a purely C# version of BulletSim. ;; basicphysics effectively does not model physics at all, making all - ;; objects phantom + ;; objects phantom. ;; Default is OpenDynamicsEngine ; physics = OpenDynamicsEngine ; physics = BulletSim + ; physics = BulletSimN ; physics = basicphysics ; physics = POS From 93188706073fa23aa037456f5ec2d52605257d89 Mon Sep 17 00:00:00 2001 From: teravus Date: Sun, 23 Dec 2012 16:17:18 -0500 Subject: [PATCH 08/11] * Update BulletSimN terrain implementation to default to Heightfield, it's less CPU intensive. --- OpenSim/Region/Physics/BulletSNPlugin/BSParam.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OpenSim/Region/Physics/BulletSNPlugin/BSParam.cs b/OpenSim/Region/Physics/BulletSNPlugin/BSParam.cs index 0bb167467f..20c0939871 100644 --- a/OpenSim/Region/Physics/BulletSNPlugin/BSParam.cs +++ b/OpenSim/Region/Physics/BulletSNPlugin/BSParam.cs @@ -315,7 +315,7 @@ public static class BSParam (s,o,v) => { BulletSimAPI.SetContactProcessingThreshold2(o.PhysBody.ptr, v); } ), new ParameterDefn("TerrainImplementation", "Type of shape to use for terrain (0=heightmap, 1=mesh)", - (float)BSTerrainPhys.TerrainImplementation.Mesh, + (float)BSTerrainPhys.TerrainImplementation.Heightmap, (s,cf,p,v) => { TerrainImplementation = cf.GetFloat(p,v); }, (s) => { return TerrainImplementation; }, (s,p,l,v) => { TerrainImplementation = v; } ), From 80cee1b85a646045c02e2bb675056d532ce2fe27 Mon Sep 17 00:00:00 2001 From: Robert Adams Date: Mon, 24 Dec 2012 08:56:02 -0800 Subject: [PATCH 09/11] BulletSim: Fix single physical prim reporting its mass as zero. Properly return root mass as mass of just the root prim rather than the mass of the linkset. SOG has the logic to add the masses together to get the linkset mass. Update TODO list. --- .../Physics/BulletSPlugin/BSCharacter.cs | 9 +-- .../Region/Physics/BulletSPlugin/BSLinkset.cs | 20 +++--- .../BulletSPlugin/BSLinksetCompound.cs | 13 ++-- .../BulletSPlugin/BSLinksetConstraints.cs | 6 +- .../Physics/BulletSPlugin/BSPhysObject.cs | 3 +- .../Region/Physics/BulletSPlugin/BSPrim.cs | 71 ++++++++++++------- .../Physics/BulletSPlugin/BulletSimTODO.txt | 15 +++- 7 files changed, 83 insertions(+), 54 deletions(-) diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSCharacter.cs b/OpenSim/Region/Physics/BulletSPlugin/BSCharacter.cs index 8e059eec19..bf0545afb1 100644 --- a/OpenSim/Region/Physics/BulletSPlugin/BSCharacter.cs +++ b/OpenSim/Region/Physics/BulletSPlugin/BSCharacter.cs @@ -174,7 +174,7 @@ public sealed class BSCharacter : BSPhysObject BulletSimAPI.SetCcdSweptSphereRadius2(PhysBody.ptr, BSParam.CcdSweptSphereRadius); } - UpdatePhysicalMassProperties(RawMass); + UpdatePhysicalMassProperties(RawMass, false); // Make so capsule does not fall over BulletSimAPI.SetAngularFactorV2(PhysBody.ptr, OMV.Vector3.Zero); @@ -224,7 +224,7 @@ public sealed class BSCharacter : BSPhysObject if (PhysBody.HasPhysicalBody && PhysShape.HasPhysicalShape) { BulletSimAPI.SetLocalScaling2(PhysShape.ptr, Scale); - UpdatePhysicalMassProperties(RawMass); + UpdatePhysicalMassProperties(RawMass, true); // Make sure this change appears as a property update event BulletSimAPI.PushUpdate2(PhysBody.ptr); } @@ -390,7 +390,7 @@ public sealed class BSCharacter : BSPhysObject public override float RawMass { get {return _mass; } } - public override void UpdatePhysicalMassProperties(float physMass) + public override void UpdatePhysicalMassProperties(float physMass, bool inWorld) { OMV.Vector3 localInertia = BulletSimAPI.CalculateLocalInertia2(PhysShape.ptr, physMass); BulletSimAPI.SetMassProps2(PhysBody.ptr, physMass, localInertia); @@ -772,8 +772,9 @@ public sealed class BSCharacter : BSPhysObject // the motor can be turned off. Set the velocity to zero so the zero motion is sent to the viewer. if (_velocityMotor.TargetValue.ApproxEquals(OMV.Vector3.Zero, 0.01f) && _velocityMotor.ErrorIsZero) { - stepVelocity = OMV.Vector3.Zero; _velocityMotor.Enabled = false; + stepVelocity = OMV.Vector3.Zero; + ZeroMotion(true); DetailLog("{0},BSCharacter.UpdateProperties,taint,disableVelocityMotor,m={1}", LocalID, _velocityMotor); } diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSLinkset.cs b/OpenSim/Region/Physics/BulletSPlugin/BSLinkset.cs index 8580928f15..756faedb21 100755 --- a/OpenSim/Region/Physics/BulletSPlugin/BSLinkset.cs +++ b/OpenSim/Region/Physics/BulletSPlugin/BSLinkset.cs @@ -97,14 +97,7 @@ public abstract class BSLinkset } // We keep the prim's mass in the linkset structure since it could be dependent on other prims - protected float m_mass; - public float LinksetMass - { - get - { - return m_mass; - } - } + public float LinksetMass { get; protected set; } public virtual bool LinksetIsColliding { get { return false; } } @@ -128,7 +121,7 @@ public abstract class BSLinkset PhysicsScene = scene; LinksetRoot = parent; m_children = new HashSet(); - m_mass = parent.RawMass; + LinksetMass = parent.RawMass; Rebuilding = false; } @@ -143,7 +136,7 @@ public abstract class BSLinkset // Don't add the root to its own linkset if (!IsRoot(child)) AddChildToLinkset(child); - m_mass = ComputeLinksetMass(); + LinksetMass = ComputeLinksetMass(); } return this; } @@ -162,7 +155,7 @@ public abstract class BSLinkset return this; } RemoveChildFromLinkset(child); - m_mass = ComputeLinksetMass(); + LinksetMass = ComputeLinksetMass(); } // The child is down to a linkset of just itself @@ -230,7 +223,10 @@ public abstract class BSLinkset // When physical properties are changed the linkset needs to recalculate // its internal properties. // May be called at runtime or taint-time. - public abstract void Refresh(BSPhysObject requestor); + public virtual void Refresh(BSPhysObject requestor) + { + LinksetMass = ComputeLinksetMass(); + } // Flag denoting the linkset is in the process of being rebuilt. // Used to know not the schedule a rebuild in the middle of a rebuild. diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSLinksetCompound.cs b/OpenSim/Region/Physics/BulletSPlugin/BSLinksetCompound.cs index 2a7b72c376..d5cbf5f9e8 100755 --- a/OpenSim/Region/Physics/BulletSPlugin/BSLinksetCompound.cs +++ b/OpenSim/Region/Physics/BulletSPlugin/BSLinksetCompound.cs @@ -5,7 +5,7 @@ * 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. + * notice, this list of conditions and the following disclat simer. * * Redistributions in binary form must reproduce the above copyrightD * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. @@ -89,6 +89,8 @@ public sealed class BSLinksetCompound : BSLinkset // its internal properties. public override void Refresh(BSPhysObject requestor) { + base.Refresh(requestor); + // Something changed so do the rebuilding thing // ScheduleRebuild(); } @@ -96,13 +98,13 @@ public sealed class BSLinksetCompound : BSLinkset // Schedule a refresh to happen after all the other taint processing. private void ScheduleRebuild(BSPhysObject requestor) { - DetailLog("{0},BSLinksetCompound.Refresh,schedulingRefresh,rebuilding={1}", + DetailLog("{0},BSLinksetCompound.ScheduleRebuild,,rebuilding={1}", requestor.LocalID, Rebuilding); // When rebuilding, it is possible to set properties that would normally require a rebuild. // If already rebuilding, don't request another rebuild. if (!Rebuilding) { - PhysicsScene.PostTaintObject("BSLinksetCompound.Refresh", LinksetRoot.LocalID, delegate() + PhysicsScene.PostTaintObject("BSLinksetCompound.ScheduleRebuild", LinksetRoot.LocalID, delegate() { if (HasAnyChildren) RecomputeLinksetCompound(); @@ -123,7 +125,6 @@ public sealed class BSLinksetCompound : BSLinkset if (IsRoot(child)) { // The root is going dynamic. Make sure mass is properly set. - m_mass = ComputeLinksetMass(); ScheduleRebuild(LinksetRoot); } else @@ -377,8 +378,8 @@ public sealed class BSLinksetCompound : BSLinkset }); // With all of the linkset packed into the root prim, it has the mass of everyone. - float linksetMass = LinksetMass; - LinksetRoot.UpdatePhysicalMassProperties(linksetMass); + LinksetMass = LinksetMass; + LinksetRoot.UpdatePhysicalMassProperties(LinksetMass, true); } finally { diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSLinksetConstraints.cs b/OpenSim/Region/Physics/BulletSPlugin/BSLinksetConstraints.cs index d95f223b71..6b592e75e4 100755 --- a/OpenSim/Region/Physics/BulletSPlugin/BSLinksetConstraints.cs +++ b/OpenSim/Region/Physics/BulletSPlugin/BSLinksetConstraints.cs @@ -46,6 +46,8 @@ public sealed class BSLinksetConstraints : BSLinkset // refresh will happen once after all the other taints are applied. public override void Refresh(BSPhysObject requestor) { + base.Refresh(requestor); + // Queue to happen after all the other taint processing PhysicsScene.PostTaintObject("BSLinksetContraints.Refresh", requestor.LocalID, delegate() { @@ -279,7 +281,7 @@ public sealed class BSLinksetConstraints : BSLinkset private void RecomputeLinksetConstraints() { float linksetMass = LinksetMass; - LinksetRoot.UpdatePhysicalMassProperties(linksetMass); + LinksetRoot.UpdatePhysicalMassProperties(linksetMass, true); // DEBUG: see of inter-linkset collisions are causing problems // BulletSimAPI.SetCollisionFilterMask2(LinksetRoot.BSBody.ptr, @@ -292,7 +294,7 @@ public sealed class BSLinksetConstraints : BSLinkset // A child in the linkset physically shows the mass of the whole linkset. // This allows Bullet to apply enough force on the child to move the whole linkset. // (Also do the mass stuff before recomputing the constraint so mass is not zero.) - child.UpdatePhysicalMassProperties(linksetMass); + child.UpdatePhysicalMassProperties(linksetMass, true); BSConstraint constrain; if (!PhysicsScene.Constraints.TryGetConstraint(LinksetRoot.PhysBody, child.PhysBody, out constrain)) diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSPhysObject.cs b/OpenSim/Region/Physics/BulletSPlugin/BSPhysObject.cs index c76f869d81..4bed535b72 100755 --- a/OpenSim/Region/Physics/BulletSPlugin/BSPhysObject.cs +++ b/OpenSim/Region/Physics/BulletSPlugin/BSPhysObject.cs @@ -96,7 +96,8 @@ public abstract class BSPhysObject : PhysicsActor // Return the object mass without calculating it or having side effects public abstract float RawMass { get; } // Set the raw mass but also update physical mass properties (inertia, ...) - public abstract void UpdatePhysicalMassProperties(float mass); + // 'inWorld' true if the object has already been added to the dynamic world. + public abstract void UpdatePhysicalMassProperties(float mass, bool inWorld); // The last value calculated for the prim's inertia public OMV.Vector3 Inertia { get; set; } diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs b/OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs index 26b8df5e06..159f79f922 100644 --- a/OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs +++ b/OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs @@ -115,6 +115,8 @@ public sealed class BSPrim : BSPhysObject PhysBody = new BulletBody(LocalID); PhysShape = new BulletShape(); + Linkset.Refresh(this); + DetailLog("{0},BSPrim.constructor,call", LocalID); // do the actual object creation at taint time PhysicsScene.TaintedObject("BSPrim.create", delegate() @@ -384,13 +386,13 @@ public sealed class BSPrim : BSPhysObject } // Return the effective mass of the object. - // If there are multiple items in the linkset, add them together for the root + // The definition of this call is to return the mass of the prim. + // If the simulator cares about the mass of the linkset, it will sum it itself. public override float Mass { get { - return Linkset.LinksetMass; - // return _mass; + return _mass; } } @@ -400,22 +402,41 @@ public sealed class BSPrim : BSPhysObject } // Set the physical mass to the passed mass. // Note that this does not change _mass! - public override void UpdatePhysicalMassProperties(float physMass) + public override void UpdatePhysicalMassProperties(float physMass, bool inWorld) { - if (IsStatic) + if (PhysBody.HasPhysicalBody) { - Inertia = OMV.Vector3.Zero; - BulletSimAPI.SetMassProps2(PhysBody.ptr, 0f, Inertia); - BulletSimAPI.UpdateInertiaTensor2(PhysBody.ptr); - } - else - { - Inertia = BulletSimAPI.CalculateLocalInertia2(PhysShape.ptr, physMass); - BulletSimAPI.SetMassProps2(PhysBody.ptr, physMass, Inertia); - BulletSimAPI.UpdateInertiaTensor2(PhysBody.ptr); - // center of mass is at the zero of the object - // DEBUG DEBUG BulletSimAPI.SetCenterOfMassByPosRot2(PhysBody.ptr, ForcePosition, ForceOrientation); - DetailLog("{0},BSPrim.UpdateMassProperties,mass={1},localInertia={2}", LocalID, physMass, Inertia); + if (IsStatic) + { + Inertia = OMV.Vector3.Zero; + BulletSimAPI.SetMassProps2(PhysBody.ptr, 0f, Inertia); + BulletSimAPI.UpdateInertiaTensor2(PhysBody.ptr); + } + else + { + if (inWorld) + { + // Changing interesting properties doesn't change proxy and collision cache + // information. The Bullet solution is to re-add the object to the world + // after parameters are changed. + BulletSimAPI.RemoveObjectFromWorld2(PhysicsScene.World.ptr, PhysBody.ptr); + } + + float grav = PhysicsScene.Params.gravity * (1f - _buoyancy); + BulletSimAPI.SetGravity2(PhysBody.ptr, new OMV.Vector3(0f, 0f, grav)); + + Inertia = BulletSimAPI.CalculateLocalInertia2(PhysShape.ptr, physMass); + BulletSimAPI.SetMassProps2(PhysBody.ptr, physMass, Inertia); + BulletSimAPI.UpdateInertiaTensor2(PhysBody.ptr); + // center of mass is at the zero of the object + // DEBUG DEBUG BulletSimAPI.SetCenterOfMassByPosRot2(PhysBody.ptr, ForcePosition, ForceOrientation); + DetailLog("{0},BSPrim.UpdateMassProperties,mass={1},localInertia={2}", LocalID, physMass, Inertia); + + if (inWorld) + { + BulletSimAPI.AddObjectToWorld2(PhysicsScene.World.ptr, PhysBody.ptr); + } + } } } @@ -714,7 +735,7 @@ public sealed class BSPrim : BSPhysObject Linkset.Refresh(this); DetailLog("{0},BSPrim.UpdatePhysicalParameters,taintExit,static={1},solid={2},mass={3},collide={4},cf={5:X},body={6},shape={7}", - LocalID, IsStatic, IsSolid, _mass, SubscribedEvents(), CurrentCollisionFlags, PhysBody, PhysShape); + LocalID, IsStatic, IsSolid, Mass, SubscribedEvents(), CurrentCollisionFlags, PhysBody, PhysShape); } // "Making dynamic" means changing to and from static. @@ -737,7 +758,7 @@ public sealed class BSPrim : BSPhysObject BulletSimAPI.SetRestitution2(PhysBody.ptr, matAttrib.restitution); // Mass is zero which disables a bunch of physics stuff in Bullet - UpdatePhysicalMassProperties(0f); + UpdatePhysicalMassProperties(0f, false); // Set collision detection parameters if (BSParam.CcdMotionThreshold > 0f) { @@ -777,7 +798,7 @@ public sealed class BSPrim : BSPhysObject // DEBUG DEBUG BulletSimAPI.SetCenterOfMassByPosRot2(Linkset.LinksetRoot.PhysBody.ptr, _position, _orientation); // A dynamic object has mass - UpdatePhysicalMassProperties(RawMass); + UpdatePhysicalMassProperties(RawMass, false); // Set collision detection parameters if (BSParam.CcdMotionThreshold > 0f) @@ -950,13 +971,9 @@ public sealed class BSPrim : BSPhysObject set { _buoyancy = value; // DetailLog("{0},BSPrim.setForceBuoyancy,taint,buoy={1}", LocalID, _buoyancy); - // Buoyancy is faked by changing the gravity applied to the object - if (PhysBody.HasPhysicalBody) - { - float grav = PhysicsScene.Params.gravity * (1f - _buoyancy); - BulletSimAPI.SetGravity2(PhysBody.ptr, new OMV.Vector3(0f, 0f, grav)); - ActivateIfPhysical(false); - } + // Force the recalculation of the various inertia,etc variables in the object + UpdatePhysicalMassProperties(_mass, true); + ActivateIfPhysical(false); } } diff --git a/OpenSim/Region/Physics/BulletSPlugin/BulletSimTODO.txt b/OpenSim/Region/Physics/BulletSPlugin/BulletSimTODO.txt index 9a7e965246..0f27d67de6 100755 --- a/OpenSim/Region/Physics/BulletSPlugin/BulletSimTODO.txt +++ b/OpenSim/Region/Physics/BulletSPlugin/BulletSimTODO.txt @@ -1,11 +1,17 @@ CURRENT PRIORITIES ================================================= -Smooth avatar movement with motor - Should motor update be all at taint-time? +Smooth avatar movement with motor (DONE) + Should motor update be all at taint-time? (Yes, DONE) + Fix avatar slowly sliding when standing (zero motion when stopped) +llApplyImpulse() + Compare mass/movement in OS and SL. Calibrate actions. +llSetBuoyancy() +Boats float low in the water Enable vehicle border crossings (at least as poorly as ODE) Terrain skirts Avatar created in previous region and not new region when crossing border Vehicle recreated in new sim at small Z value (offset from root value?) (DONE) +Add material densities to the material types. Vehicle movement on terrain smoothness Vehicle script tuning/debugging Avanti speed script @@ -52,6 +58,8 @@ Incorporate inter-relationship of angular corrections. For instance, angularDefl BULLETSIM TODO LIST: ================================================= +In SL, perfect spheres don't seem to have rolling friction. Add special case. +Avatar density is WAY off. Compare and calibrate with what's in SL. Revisit CollisionMargin. Builders notice the 0.04 spacing between prims. Duplicating a physical prim causes old prim to jump away Dup a phys prim and the original become unselected and thus interacts w/ selected prim. @@ -82,6 +90,9 @@ Linkset.Position and Linkset.Orientation requre rewrite to properly return Implement LockAngularMotion -- implements llSetStatus(ROTATE_AXIS_*, T/F) Should the different PID factors have non-equal contributions for different values of Efficiency? +Selecting and deselecting physical objects causes CPU processing time to jump + http://www.youtube.com/watch?v=Hjg57fWg8yI&hd=1 + put thousand physical objects, select and deselect same. CPU time will be large. LINKSETS ====================================================== From 4759a8acee97fa175c078ec72d9b8cf0db96121b Mon Sep 17 00:00:00 2001 From: Robert Adams Date: Mon, 24 Dec 2012 20:16:10 -0800 Subject: [PATCH 10/11] BulletSim: Default avatar density changed to 3.5 which is WAY closer to the SL value. Fixed frictin values for physical materials which were just wrong which caused things that should have slipped to not. --- .../Region/Physics/BulletSPlugin/BSMaterials.cs | 16 ++++++++-------- OpenSim/Region/Physics/BulletSPlugin/BSParam.cs | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSMaterials.cs b/OpenSim/Region/Physics/BulletSPlugin/BSMaterials.cs index c113a436e9..92d62ff9ea 100755 --- a/OpenSim/Region/Physics/BulletSPlugin/BSMaterials.cs +++ b/OpenSim/Region/Physics/BulletSPlugin/BSMaterials.cs @@ -119,26 +119,26 @@ public static class BSMaterials Attributes[(int)MaterialAttributes.Material.Light] = new MaterialAttributes("light",dDensity, dFriction, dRestitution); Attributes[(int)MaterialAttributes.Material.Avatar] = - new MaterialAttributes("avatar",60f, 0.2f, 0f); + new MaterialAttributes("avatar",3.5f, 0.2f, 0f); Attributes[(int)MaterialAttributes.Material.Stone + (int)MaterialAttributes.Material.NumberOfTypes] = new MaterialAttributes("stonePhysical",dDensity, 0.8f, 0.4f); Attributes[(int)MaterialAttributes.Material.Metal + (int)MaterialAttributes.Material.NumberOfTypes] = - new MaterialAttributes("metalPhysical",dDensity, 0.8f, 0.4f); + new MaterialAttributes("metalPhysical",dDensity, 0.3f, 0.4f); Attributes[(int)MaterialAttributes.Material.Glass + (int)MaterialAttributes.Material.NumberOfTypes] = - new MaterialAttributes("glassPhysical",dDensity, 0.8f, 0.7f); + new MaterialAttributes("glassPhysical",dDensity, 0.2f, 0.7f); Attributes[(int)MaterialAttributes.Material.Wood + (int)MaterialAttributes.Material.NumberOfTypes] = - new MaterialAttributes("woodPhysical",dDensity, 0.8f, 0.5f); + new MaterialAttributes("woodPhysical",dDensity, 0.6f, 0.5f); Attributes[(int)MaterialAttributes.Material.Flesh + (int)MaterialAttributes.Material.NumberOfTypes] = - new MaterialAttributes("fleshPhysical",dDensity, 0.8f, 0.3f); + new MaterialAttributes("fleshPhysical",dDensity, 0.9f, 0.3f); Attributes[(int)MaterialAttributes.Material.Plastic + (int)MaterialAttributes.Material.NumberOfTypes] = - new MaterialAttributes("plasticPhysical",dDensity, 0.8f, 0.7f); + new MaterialAttributes("plasticPhysical",dDensity, 0.4f, 0.7f); Attributes[(int)MaterialAttributes.Material.Rubber + (int)MaterialAttributes.Material.NumberOfTypes] = - new MaterialAttributes("rubberPhysical",dDensity, 0.8f, 0.9f); + new MaterialAttributes("rubberPhysical",dDensity, 0.9f, 0.9f); Attributes[(int)MaterialAttributes.Material.Light + (int)MaterialAttributes.Material.NumberOfTypes] = new MaterialAttributes("lightPhysical",dDensity, dFriction, dRestitution); Attributes[(int)MaterialAttributes.Material.Avatar + (int)MaterialAttributes.Material.NumberOfTypes] = - new MaterialAttributes("avatarPhysical",60f, 0.2f, 0f); + new MaterialAttributes("avatarPhysical",3.5f, 0.2f, 0f); } // Under the [BulletSim] section, one can change the individual material diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSParam.cs b/OpenSim/Region/Physics/BulletSPlugin/BSParam.cs index 5558ad5927..7454718af2 100755 --- a/OpenSim/Region/Physics/BulletSPlugin/BSParam.cs +++ b/OpenSim/Region/Physics/BulletSPlugin/BSParam.cs @@ -351,7 +351,7 @@ public static class BSParam (s) => { return AvatarStandingFriction; }, (s,p,l,v) => { AvatarStandingFriction = v; } ), new ParameterDefn("AvatarDensity", "Density of an avatar. Changed on avatar recreation.", - 60f, + 3.5f, (s,cf,p,v) => { AvatarDensity = cf.GetFloat(p, v); }, (s) => { return AvatarDensity; }, (s,p,l,v) => { s.UpdateParameterObject((x)=>{AvatarDensity=x;}, p, l, v); } ), From bbc5a5089f79a4c5543f4a3f1cd4ffaf1de8c07e Mon Sep 17 00:00:00 2001 From: Robert Adams Date: Mon, 24 Dec 2012 20:18:06 -0800 Subject: [PATCH 11/11] BulletSim: Rename some of the interface structures (BulletWorld, ...) to get ready for... Start creation of BulletAPITemplate. This defines the abstract interface functions. Following commits will move over to the new interface. This will enable switching between the managed and unmanaged version of Bullet. --- .../Physics/BulletSPlugin/BSConstraint.cs | 2 +- .../Physics/BulletSPlugin/BSConstraint6Dof.cs | 4 +- .../BulletSPlugin/BSConstraintCollection.cs | 4 +- .../BulletSPlugin/BSConstraintHinge.cs | 2 +- .../Region/Physics/BulletSPlugin/BSScene.cs | 4 +- .../BulletSPlugin/BSShapeCollection.cs | 6 +- .../Physics/BulletSPlugin/BulletSimAPI.cs | 392 ++++++++++++++++++ .../Physics/BulletSPlugin/BulletSimData.cs | 4 +- .../Physics/BulletSPlugin/BulletSimTODO.txt | 7 + 9 files changed, 412 insertions(+), 13 deletions(-) diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSConstraint.cs b/OpenSim/Region/Physics/BulletSPlugin/BSConstraint.cs index e77fb50206..59584b2e16 100755 --- a/OpenSim/Region/Physics/BulletSPlugin/BSConstraint.cs +++ b/OpenSim/Region/Physics/BulletSPlugin/BSConstraint.cs @@ -36,7 +36,7 @@ public abstract class BSConstraint : IDisposable { private static string LogHeader = "[BULLETSIM CONSTRAINT]"; - protected BulletSim m_world; + protected BulletWorld m_world; protected BulletBody m_body1; protected BulletBody m_body2; protected BulletConstraint m_constraint; diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSConstraint6Dof.cs b/OpenSim/Region/Physics/BulletSPlugin/BSConstraint6Dof.cs index b07355555f..b9468706f0 100755 --- a/OpenSim/Region/Physics/BulletSPlugin/BSConstraint6Dof.cs +++ b/OpenSim/Region/Physics/BulletSPlugin/BSConstraint6Dof.cs @@ -39,7 +39,7 @@ public sealed class BSConstraint6Dof : BSConstraint public override ConstraintType Type { get { return ConstraintType.D6_CONSTRAINT_TYPE; } } // Create a btGeneric6DofConstraint - public BSConstraint6Dof(BulletSim world, BulletBody obj1, BulletBody obj2, + public BSConstraint6Dof(BulletWorld world, BulletBody obj1, BulletBody obj2, Vector3 frame1, Quaternion frame1rot, Vector3 frame2, Quaternion frame2rot, bool useLinearReferenceFrameA, bool disableCollisionsBetweenLinkedBodies) @@ -58,7 +58,7 @@ public sealed class BSConstraint6Dof : BSConstraint obj1.ID, obj1.ptr.ToString("X"), obj2.ID, obj2.ptr.ToString("X")); } - public BSConstraint6Dof(BulletSim world, BulletBody obj1, BulletBody obj2, + public BSConstraint6Dof(BulletWorld world, BulletBody obj1, BulletBody obj2, Vector3 joinPoint, bool useLinearReferenceFrameA, bool disableCollisionsBetweenLinkedBodies) { diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSConstraintCollection.cs b/OpenSim/Region/Physics/BulletSPlugin/BSConstraintCollection.cs index a9fd826528..2aeff25035 100755 --- a/OpenSim/Region/Physics/BulletSPlugin/BSConstraintCollection.cs +++ b/OpenSim/Region/Physics/BulletSPlugin/BSConstraintCollection.cs @@ -41,9 +41,9 @@ public sealed class BSConstraintCollection : IDisposable delegate bool ConstraintAction(BSConstraint constrain); private List m_constraints; - private BulletSim m_world; + private BulletWorld m_world; - public BSConstraintCollection(BulletSim world) + public BSConstraintCollection(BulletWorld world) { m_world = world; m_constraints = new List(); diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSConstraintHinge.cs b/OpenSim/Region/Physics/BulletSPlugin/BSConstraintHinge.cs index ed3ffa7f3b..a5378b9f64 100755 --- a/OpenSim/Region/Physics/BulletSPlugin/BSConstraintHinge.cs +++ b/OpenSim/Region/Physics/BulletSPlugin/BSConstraintHinge.cs @@ -36,7 +36,7 @@ public sealed class BSConstraintHinge : BSConstraint { public override ConstraintType Type { get { return ConstraintType.HINGE_CONSTRAINT_TYPE; } } - public BSConstraintHinge(BulletSim world, BulletBody obj1, BulletBody obj2, + public BSConstraintHinge(BulletWorld world, BulletBody obj1, BulletBody obj2, Vector3 pivotInA, Vector3 pivotInB, Vector3 axisInA, Vector3 axisInB, bool useLinearReferenceFrameA, bool disableCollisionsBetweenLinkedBodies) diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSScene.cs b/OpenSim/Region/Physics/BulletSPlugin/BSScene.cs index e8e0d50b57..0022e45cde 100644 --- a/OpenSim/Region/Physics/BulletSPlugin/BSScene.cs +++ b/OpenSim/Region/Physics/BulletSPlugin/BSScene.cs @@ -74,7 +74,7 @@ public sealed class BSScene : PhysicsScene, IPhysicsParameters public IMesher mesher; public uint WorldID { get; private set; } - public BulletSim World { get; private set; } + public BulletWorld World { get; private set; } // All the constraints that have been allocated in this instance. public BSConstraintCollection Constraints { get; private set; } @@ -242,7 +242,7 @@ public sealed class BSScene : PhysicsScene, IPhysicsParameters Vector3 worldExtent = new Vector3(Constants.RegionSize, Constants.RegionSize, Constants.RegionHeight); // m_log.DebugFormat("{0}: Initialize: Calling BulletSimAPI.Initialize.", LogHeader); - World = new BulletSim(0, this, BulletSimAPI.Initialize2(worldExtent, m_paramsHandle.AddrOfPinnedObject(), + World = new BulletWorld(0, this, BulletSimAPI.Initialize2(worldExtent, m_paramsHandle.AddrOfPinnedObject(), m_maxCollisionsPerFrame, m_collisionArrayPinnedHandle.AddrOfPinnedObject(), m_maxUpdatesPerFrame, m_updateArrayPinnedHandle.AddrOfPinnedObject(), m_DebugLogCallbackHandle)); diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSShapeCollection.cs b/OpenSim/Region/Physics/BulletSPlugin/BSShapeCollection.cs index 939d5e9797..65ebcaa35c 100755 --- a/OpenSim/Region/Physics/BulletSPlugin/BSShapeCollection.cs +++ b/OpenSim/Region/Physics/BulletSPlugin/BSShapeCollection.cs @@ -98,7 +98,7 @@ public sealed class BSShapeCollection : IDisposable // higher level dependencies on the shape or body. Mostly used for LinkSets to // remove the physical constraints before the body is destroyed. // Called at taint-time!! - public bool GetBodyAndShape(bool forceRebuild, BulletSim sim, BSPhysObject prim, + public bool GetBodyAndShape(bool forceRebuild, BulletWorld sim, BSPhysObject prim, ShapeDestructionCallback shapeCallback, BodyDestructionCallback bodyCallback) { PhysicsScene.AssertInTaintTime("BSShapeCollection.GetBodyAndShape"); @@ -126,7 +126,7 @@ public sealed class BSShapeCollection : IDisposable return ret; } - public bool GetBodyAndShape(bool forceRebuild, BulletSim sim, BSPhysObject prim) + public bool GetBodyAndShape(bool forceRebuild, BulletWorld sim, BSPhysObject prim) { return GetBodyAndShape(forceRebuild, sim, prim, null, null); } @@ -918,7 +918,7 @@ public sealed class BSShapeCollection : IDisposable // Updates prim.BSBody with the information about the new body if one is created. // Returns 'true' if an object was actually created. // Called at taint-time. - private bool CreateBody(bool forceRebuild, BSPhysObject prim, BulletSim sim, BulletShape shape, + private bool CreateBody(bool forceRebuild, BSPhysObject prim, BulletWorld sim, BulletShape shape, BodyDestructionCallback bodyCallback) { bool ret = false; diff --git a/OpenSim/Region/Physics/BulletSPlugin/BulletSimAPI.cs b/OpenSim/Region/Physics/BulletSPlugin/BulletSimAPI.cs index 7857eaa411..afe5bcad96 100644 --- a/OpenSim/Region/Physics/BulletSPlugin/BulletSimAPI.cs +++ b/OpenSim/Region/Physics/BulletSPlugin/BulletSimAPI.cs @@ -288,6 +288,398 @@ public enum ConstraintParamAxis : int AXIS_ALL }; +public abstract class BulletSimAPITemplate +{ +// Initialization and simulation +public abstract BulletWorld Initialize2(Vector3 maxPosition, IntPtr parms, + int maxCollisions, IntPtr collisionArray, + int maxUpdates, IntPtr updateArray + ); + +public abstract bool UpdateParameter2(BulletWorld world, uint localID, String parm, float value); + +public abstract void SetHeightMap2(BulletWorld world, float[] heightmap); + +public abstract void Shutdown2(BulletWorld sim); + +public abstract int PhysicsStep2(BulletWorld world, float timeStep, int maxSubSteps, float fixedTimeStep, + out int updatedEntityCount, + out IntPtr updatedEntitiesPtr, + out int collidersCount, + out IntPtr collidersPtr); + +public abstract bool PushUpdate2(BulletBody obj); + +// ===================================================================================== +// Mesh, hull, shape and body creation helper routines +public abstract BulletShape CreateMeshShape2(BulletWorld world, + int indicesCount, [MarshalAs(UnmanagedType.LPArray)] int[] indices, + int verticesCount, [MarshalAs(UnmanagedType.LPArray)] float[] vertices ); + +public abstract BulletShape CreateHullShape2(BulletWorld world, + int hullCount, [MarshalAs(UnmanagedType.LPArray)] float[] hulls); + +public abstract BulletShape BuildHullShapeFromMesh2(BulletWorld world, BulletShape meshShape); + +public abstract BulletShape BuildNativeShape2(BulletWorld world, ShapeData shapeData); + +public abstract bool IsNativeShape2(BulletShape shape); + +public abstract void SetShapeCollisionMargin(BulletShape shape, float margin); + +public abstract BulletShape BuildCapsuleShape2(BulletWorld world, float radius, float height, Vector3 scale); + +public abstract BulletShape CreateCompoundShape2(BulletWorld sim, bool enableDynamicAabbTree); + +public abstract int GetNumberOfCompoundChildren2(BulletShape cShape); + +public abstract void AddChildShapeToCompoundShape2(BulletShape cShape, BulletShape addShape, Vector3 pos, Quaternion rot); + +public abstract BulletShape GetChildShapeFromCompoundShapeIndex2(BulletShape cShape, int indx); + +public abstract BulletShape RemoveChildShapeFromCompoundShapeIndex2(BulletShape cShape, int indx); + +public abstract void RemoveChildShapeFromCompoundShape2(BulletShape cShape, BulletShape removeShape); + +public abstract void RecalculateCompoundShapeLocalAabb2(BulletShape cShape); + +public abstract BulletShape DuplicateCollisionShape2(BulletWorld sim, BulletShape srcShape, uint id); + +public abstract BulletBody CreateBodyFromShapeAndInfo2(BulletWorld sim, BulletShape shape, uint id, IntPtr constructionInfo); + +public abstract bool DeleteCollisionShape2(BulletWorld world, BulletShape shape); + +public abstract int GetBodyType2(BulletBody obj); + +public abstract BulletBody CreateBodyFromShape2(BulletWorld sim, BulletShape shape, uint id, Vector3 pos, Quaternion rot); + +public abstract BulletBody CreateBodyWithDefaultMotionState2(BulletShape shape, uint id, Vector3 pos, Quaternion rot); + +public abstract BulletBody CreateGhostFromShape2(BulletWorld sim, BulletShape shape, uint id, Vector3 pos, Quaternion rot); + +public abstract IntPtr AllocateBodyInfo2(BulletBody obj); + +public abstract void ReleaseBodyInfo2(IntPtr obj); + +public abstract void DestroyObject2(BulletWorld sim, BulletBody obj); + +// ===================================================================================== +// Terrain creation and helper routines +public abstract IntPtr CreateHeightMapInfo2(BulletWorld sim, uint id, Vector3 minCoords, Vector3 maxCoords, + [MarshalAs(UnmanagedType.LPArray)] float[] heightMap, float collisionMargin); + +public abstract IntPtr FillHeightMapInfo2(BulletWorld sim, IntPtr mapInfo, uint id, Vector3 minCoords, Vector3 maxCoords, + [MarshalAs(UnmanagedType.LPArray)] float[] heightMap, float collisionMargin); + +public abstract bool ReleaseHeightMapInfo2(IntPtr heightMapInfo); + +public abstract BulletBody CreateGroundPlaneShape2(uint id, float height, float collisionMargin); + +public abstract BulletBody CreateTerrainShape2(IntPtr mapInfo); + +// ===================================================================================== +// Constraint creation and helper routines +public abstract BulletConstraint Create6DofConstraint2(BulletWorld world, BulletBody obj1, BulletBody obj2, + Vector3 frame1loc, Quaternion frame1rot, + Vector3 frame2loc, Quaternion frame2rot, + bool useLinearReferenceFrameA, bool disableCollisionsBetweenLinkedBodies); + +public abstract BulletConstraint Create6DofConstraintToPoint2(BulletWorld world, BulletBody obj1, BulletBody obj2, + Vector3 joinPoint, + bool useLinearReferenceFrameA, bool disableCollisionsBetweenLinkedBodies); + +public abstract BulletConstraint CreateHingeConstraint2(BulletWorld world, BulletBody obj1, BulletBody obj2, + Vector3 pivotinA, Vector3 pivotinB, + Vector3 axisInA, Vector3 axisInB, + bool useLinearReferenceFrameA, bool disableCollisionsBetweenLinkedBodies); + +public abstract void SetConstraintEnable2(BulletConstraint constrain, float numericTrueFalse); + +public abstract void SetConstraintNumSolverIterations2(BulletConstraint constrain, float iterations); + +public abstract bool SetFrames2(BulletConstraint constrain, + Vector3 frameA, Quaternion frameArot, Vector3 frameB, Quaternion frameBrot); + +public abstract bool SetLinearLimits2(BulletConstraint constrain, Vector3 low, Vector3 hi); + +public abstract bool SetAngularLimits2(BulletConstraint constrain, Vector3 low, Vector3 hi); + +public abstract bool UseFrameOffset2(BulletConstraint constrain, float enable); + +public abstract bool TranslationalLimitMotor2(BulletConstraint constrain, float enable, float targetVel, float maxMotorForce); + +public abstract bool SetBreakingImpulseThreshold2(BulletConstraint constrain, float threshold); + +public abstract bool CalculateTransforms2(BulletConstraint constrain); + +public abstract bool SetConstraintParam2(BulletConstraint constrain, ConstraintParams paramIndex, float value, ConstraintParamAxis axis); + +public abstract bool DestroyConstraint2(BulletWorld world, BulletConstraint constrain); + +// ===================================================================================== +// btCollisionWorld entries +public abstract void UpdateSingleAabb2(BulletWorld world, BulletBody obj); + +public abstract void UpdateAabbs2(BulletWorld world); + +public abstract bool GetForceUpdateAllAabbs2(BulletWorld world); + +public abstract void SetForceUpdateAllAabbs2(BulletWorld world, bool force); + +// ===================================================================================== +// btDynamicsWorld entries +public abstract bool AddObjectToWorld2(BulletWorld world, BulletBody obj); + +public abstract bool RemoveObjectFromWorld2(BulletWorld world, BulletBody obj); + +public abstract bool AddConstraintToWorld2(BulletWorld world, BulletConstraint constrain, bool disableCollisionsBetweenLinkedObjects); + +public abstract bool RemoveConstraintFromWorld2(BulletWorld world, BulletConstraint constrain); +// ===================================================================================== +// btCollisionObject entries +public abstract Vector3 GetAnisotripicFriction2(BulletConstraint constrain); + +public abstract Vector3 SetAnisotripicFriction2(BulletConstraint constrain, Vector3 frict); + +public abstract bool HasAnisotripicFriction2(BulletConstraint constrain); + +public abstract void SetContactProcessingThreshold2(BulletBody obj, float val); + +public abstract float GetContactProcessingThreshold2(BulletBody obj); + +public abstract bool IsStaticObject2(BulletBody obj); + +public abstract bool IsKinematicObject2(BulletBody obj); + +public abstract bool IsStaticOrKinematicObject2(BulletBody obj); + +public abstract bool HasContactResponse2(BulletBody obj); + +public abstract void SetCollisionShape2(BulletWorld sim, BulletBody obj, BulletBody shape); + +public abstract BulletShape GetCollisionShape2(BulletBody obj); + +public abstract int GetActivationState2(BulletBody obj); + +public abstract void SetActivationState2(BulletBody obj, int state); + +public abstract void SetDeactivationTime2(BulletBody obj, float dtime); + +public abstract float GetDeactivationTime2(BulletBody obj); + +public abstract void ForceActivationState2(BulletBody obj, ActivationState state); + +public abstract void Activate2(BulletBody obj, bool forceActivation); + +public abstract bool IsActive2(BulletBody obj); + +public abstract void SetRestitution2(BulletBody obj, float val); + +public abstract float GetRestitution2(BulletBody obj); + +public abstract void SetFriction2(BulletBody obj, float val); + +public abstract float GetFriction2(BulletBody obj); + + /* Haven't defined the type 'Transform' +public abstract Transform GetWorldTransform2(BulletBody obj); + +public abstract void setWorldTransform2(BulletBody obj, Transform trans); + */ + +public abstract Vector3 GetPosition2(BulletBody obj); + +public abstract Quaternion GetOrientation2(BulletBody obj); + +public abstract void SetTranslation2(BulletBody obj, Vector3 position, Quaternion rotation); + +public abstract IntPtr GetBroadphaseHandle2(BulletBody obj); + +public abstract void SetBroadphaseHandle2(BulletBody obj, IntPtr handle); + + /* +public abstract Transform GetInterpolationWorldTransform2(IntPtr obj); + +public abstract void SetInterpolationWorldTransform2(IntPtr obj, Transform trans); + */ + +public abstract void SetInterpolationLinearVelocity2(BulletBody obj, Vector3 vel); + +public abstract void SetInterpolationAngularVelocity2(BulletBody obj, Vector3 vel); + +public abstract void SetInterpolationVelocity2(BulletBody obj, Vector3 linearVel, Vector3 angularVel); + +public abstract float GetHitFraction2(BulletBody obj); + +public abstract void SetHitFraction2(BulletBody obj, float val); + +public abstract CollisionFlags GetCollisionFlags2(BulletBody obj); + +public abstract CollisionFlags SetCollisionFlags2(BulletBody obj, CollisionFlags flags); + +public abstract CollisionFlags AddToCollisionFlags2(BulletBody obj, CollisionFlags flags); + +public abstract CollisionFlags RemoveFromCollisionFlags2(BulletBody obj, CollisionFlags flags); + +public abstract float GetCcdMotionThreshold2(BulletBody obj); + +public abstract void SetCcdMotionThreshold2(BulletBody obj, float val); + +public abstract float GetCcdSweptSphereRadius2(BulletBody obj); + +public abstract void SetCcdSweptSphereRadius2(BulletBody obj, float val); + +public abstract IntPtr GetUserPointer2(BulletBody obj); + +public abstract void SetUserPointer2(BulletBody obj, IntPtr val); + +// ===================================================================================== +// btRigidBody entries +public abstract void ApplyGravity2(BulletBody obj); + +public abstract void SetGravity2(BulletBody obj, Vector3 val); + +public abstract Vector3 GetGravity2(BulletBody obj); + +public abstract void SetDamping2(BulletBody obj, float lin_damping, float ang_damping); + +public abstract void SetLinearDamping2(BulletBody obj, float lin_damping); + +public abstract void SetAngularDamping2(BulletBody obj, float ang_damping); + +public abstract float GetLinearDamping2(BulletBody obj); + +public abstract float GetAngularDamping2(BulletBody obj); + +public abstract float GetLinearSleepingThreshold2(BulletBody obj); + + +public abstract void ApplyDamping2(BulletBody obj, float timeStep); + +public abstract void SetMassProps2(BulletBody obj, float mass, Vector3 inertia); + +public abstract Vector3 GetLinearFactor2(BulletBody obj); + +public abstract void SetLinearFactor2(BulletBody obj, Vector3 factor); + + /* +public abstract void SetCenterOfMassTransform2(BulletBody obj, Transform trans); + */ + +public abstract void SetCenterOfMassByPosRot2(BulletBody obj, Vector3 pos, Quaternion rot); + +// Add a force to the object as if its mass is one. +public abstract void ApplyCentralForce2(BulletBody obj, Vector3 force); + +// Set the force being applied to the object as if its mass is one. +public abstract void SetObjectForce2(BulletBody obj, Vector3 force); + +public abstract Vector3 GetTotalForce2(BulletBody obj); + +public abstract Vector3 GetTotalTorque2(BulletBody obj); + +public abstract Vector3 GetInvInertiaDiagLocal2(BulletBody obj); + +public abstract void SetInvInertiaDiagLocal2(BulletBody obj, Vector3 inert); + +public abstract void SetSleepingThresholds2(BulletBody obj, float lin_threshold, float ang_threshold); + +public abstract void ApplyTorque2(BulletBody obj, Vector3 torque); + +// Apply force at the given point. Will add torque to the object. +public abstract void ApplyForce2(BulletBody obj, Vector3 force, Vector3 pos); + +// Apply impulse to the object. Same as "ApplycentralForce" but force scaled by object's mass. +public abstract void ApplyCentralImpulse2(BulletBody obj, Vector3 imp); + +// Apply impulse to the object's torque. Force is scaled by object's mass. +public abstract void ApplyTorqueImpulse2(BulletBody obj, Vector3 imp); + +// Apply impulse at the point given. For is scaled by object's mass and effects both linear and angular forces. +public abstract void ApplyImpulse2(BulletBody obj, Vector3 imp, Vector3 pos); + +public abstract void ClearForces2(BulletBody obj); + +public abstract void ClearAllForces2(BulletBody obj); + +public abstract void UpdateInertiaTensor2(BulletBody obj); + + + /* +public abstract Transform GetCenterOfMassTransform2(BulletBody obj); + */ + +public abstract Vector3 GetLinearVelocity2(BulletBody obj); + +public abstract Vector3 GetAngularVelocity2(BulletBody obj); + +public abstract void SetLinearVelocity2(BulletBody obj, Vector3 val); + +public abstract void SetAngularVelocity2(BulletBody obj, Vector3 angularVelocity); + +public abstract Vector3 GetVelocityInLocalPoint2(BulletBody obj, Vector3 pos); + +public abstract void Translate2(BulletBody obj, Vector3 trans); + +public abstract void UpdateDeactivation2(BulletBody obj, float timeStep); + +public abstract bool WantsSleeping2(BulletBody obj); + +public abstract void SetAngularFactor2(BulletBody obj, float factor); + +public abstract void SetAngularFactorV2(BulletBody obj, Vector3 factor); + +public abstract Vector3 GetAngularFactor2(BulletBody obj); + +public abstract bool IsInWorld2(BulletBody obj); + +public abstract void AddConstraintRef2(BulletBody obj, BulletConstraint constrain); + +public abstract void RemoveConstraintRef2(BulletBody obj, BulletConstraint constrain); + +public abstract BulletConstraint GetConstraintRef2(BulletBody obj, int index); + +public abstract int GetNumConstraintRefs2(BulletBody obj); + +public abstract bool SetCollisionGroupMask2(BulletBody body, uint filter, uint mask); + +// ===================================================================================== +// btCollisionShape entries + +public abstract float GetAngularMotionDisc2(BulletShape shape); + +public abstract float GetContactBreakingThreshold2(BulletShape shape, float defaultFactor); + +public abstract bool IsPolyhedral2(BulletShape shape); + +public abstract bool IsConvex2d2(BulletShape shape); + +public abstract bool IsConvex2(BulletShape shape); + +public abstract bool IsNonMoving2(BulletShape shape); + +public abstract bool IsConcave2(BulletShape shape); + +public abstract bool IsCompound2(BulletShape shape); + +public abstract bool IsSoftBody2(BulletShape shape); + +public abstract bool IsInfinite2(BulletShape shape); + +public abstract void SetLocalScaling2(BulletShape shape, Vector3 scale); + +public abstract Vector3 GetLocalScaling2(BulletShape shape); + +public abstract Vector3 CalculateLocalInertia2(BulletShape shape, float mass); + +public abstract int GetShapeType2(BulletShape shape); + +public abstract void SetMargin2(BulletShape shape, float val); + +public abstract float GetMargin2(BulletShape shape); + +}; + // =============================================================================== static class BulletSimAPI { // =============================================================================== diff --git a/OpenSim/Region/Physics/BulletSPlugin/BulletSimData.cs b/OpenSim/Region/Physics/BulletSPlugin/BulletSimData.cs index 662177ffe9..36d38d4c99 100755 --- a/OpenSim/Region/Physics/BulletSPlugin/BulletSimData.cs +++ b/OpenSim/Region/Physics/BulletSPlugin/BulletSimData.cs @@ -35,9 +35,9 @@ namespace OpenSim.Region.Physics.BulletSPlugin // These hold pointers to allocated objects in the unmanaged space. // The physics engine controller class created at initialization -public struct BulletSim +public struct BulletWorld { - public BulletSim(uint worldId, BSScene bss, IntPtr xx) + public BulletWorld(uint worldId, BSScene bss, IntPtr xx) { ptr = xx; worldID = worldId; diff --git a/OpenSim/Region/Physics/BulletSPlugin/BulletSimTODO.txt b/OpenSim/Region/Physics/BulletSPlugin/BulletSimTODO.txt index 0f27d67de6..35cb8f3d49 100755 --- a/OpenSim/Region/Physics/BulletSPlugin/BulletSimTODO.txt +++ b/OpenSim/Region/Physics/BulletSPlugin/BulletSimTODO.txt @@ -146,6 +146,13 @@ Is there are more efficient method of implementing pre and post step actions? See http://www.codeproject.com/Articles/29922/Weak-Events-in-C Physics Arena central pyramid: why is one side permiable? +Enforce physical parameter min/max: + Gravity: [-1, 28] + Friction: [0, 255] + Density: [1, 22587] + Restitution [0, 1] + http://wiki.secondlife.com/wiki/Physics_Material_Settings_test +Avatar attachments have no mass? http://forums-archive.secondlife.com/54/f0/31796/1.html INTERNAL IMPROVEMENT/CLEANUP =================================================

      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%0DRhD#4*e;0mm!ON2QSE`+@o2ar>?%XmFGp`4 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