diff --git a/OpenSim/Data/PGSQL/PGSQLFSAssetData.cs b/OpenSim/Data/PGSQL/PGSQLFSAssetData.cs
index 59b857c61f..def1f4a173 100644
--- a/OpenSim/Data/PGSQL/PGSQLFSAssetData.cs
+++ b/OpenSim/Data/PGSQL/PGSQLFSAssetData.cs
@@ -183,7 +183,7 @@ namespace OpenSim.Data.PGSQL
catch(Exception e)
{
m_log.Error("[PGSQL FSASSETS] Failed to store asset with ID " + meta.ID);
- m_log.Error(e.ToString());
+ m_log.Error(e.ToString());
return false;
}
}
diff --git a/OpenSim/Framework/Servers/HttpServer/OSHttpServer/HttpInput.cs b/OpenSim/Framework/Servers/HttpServer/OSHttpServer/HttpInput.cs
index c6585b197c..e4701903a3 100644
--- a/OpenSim/Framework/Servers/HttpServer/OSHttpServer/HttpInput.cs
+++ b/OpenSim/Framework/Servers/HttpServer/OSHttpServer/HttpInput.cs
@@ -33,7 +33,7 @@ namespace OSHttpServer
/// form name.
/// if set to true all changes will be ignored.
/// this constructor should only be used by Empty
- protected HttpInput(string name, bool ignoreChanges)
+ protected HttpInput(string name, bool ignoreChanges)
{
_name = name;
_ignoreChanges = ignoreChanges;
diff --git a/OpenSim/Framework/Servers/HttpServer/OSHttpServer/HttpInputItem.cs b/OpenSim/Framework/Servers/HttpServer/OSHttpServer/HttpInputItem.cs
index 0ab7690618..2172c7da52 100644
--- a/OpenSim/Framework/Servers/HttpServer/OSHttpServer/HttpInputItem.cs
+++ b/OpenSim/Framework/Servers/HttpServer/OSHttpServer/HttpInputItem.cs
@@ -17,18 +17,18 @@ namespace OSHttpServer
///
public class HttpInputItem : IHttpInput
{
- /// Representation of a non-initialized .
+ /// Representation of a non-initialized .
public static readonly HttpInputItem Empty = new HttpInputItem(string.Empty, true);
private readonly IDictionary _items = new Dictionary();
private readonly List _values = new List();
private string _name;
private readonly bool _ignoreChanges;
-
- ///
- /// Initializes an input item setting its name/identifier and value
- ///
- /// Parameter name/id
- /// Parameter value
+
+ ///
+ /// Initializes an input item setting its name/identifier and value
+ ///
+ /// Parameter name/id
+ /// Parameter value
public HttpInputItem(string name, string value)
{
Name = name;
@@ -41,20 +41,20 @@ namespace OSHttpServer
_ignoreChanges = ignore;
}
- /// Creates a deep copy of the item specified
- /// The item to copy
- /// The function makes a deep copy of quite a lot which can be slow
- public HttpInputItem(HttpInputItem item)
- {
- foreach (KeyValuePair pair in item._items)
- _items.Add(pair.Key, pair.Value);
-
- foreach (string value in item._values)
- _values.Add(value);
-
- _ignoreChanges = item._ignoreChanges;
- _name = item.Name;
- }
+ /// Creates a deep copy of the item specified
+ /// The item to copy
+ /// The function makes a deep copy of quite a lot which can be slow
+ public HttpInputItem(HttpInputItem item)
+ {
+ foreach (KeyValuePair pair in item._items)
+ _items.Add(pair.Key, pair.Value);
+
+ foreach (string value in item._values)
+ _values.Add(value);
+
+ _ignoreChanges = item._ignoreChanges;
+ _name = item.Name;
+ }
///
/// Number of values
@@ -147,16 +147,16 @@ namespace OSHttpServer
return _items.ContainsKey(name) && _items[name].Value != null;
}
- /// Returns a formatted representation of the instance with the values of all contained parameters
+ /// Returns a formatted representation of the instance with the values of all contained parameters
public override string ToString()
{
return ToString(string.Empty);
}
- ///
- /// Outputs the string in a formatted manner
- ///
- /// A prefix to append, used internally
+ ///
+ /// Outputs the string in a formatted manner
+ ///
+ /// A prefix to append, used internally
/// produce a query string
public string ToString(string prefix, bool asQuerySting)
{
diff --git a/OpenSim/Framework/Servers/HttpServer/OSHttpServer/HttpParam.cs b/OpenSim/Framework/Servers/HttpServer/OSHttpServer/HttpParam.cs
index c1a14b6a57..7c0f056a69 100644
--- a/OpenSim/Framework/Servers/HttpServer/OSHttpServer/HttpParam.cs
+++ b/OpenSim/Framework/Servers/HttpServer/OSHttpServer/HttpParam.cs
@@ -17,7 +17,7 @@ namespace OSHttpServer
private List _items = new List();
- /// Initialises the class to hold a value either from a post request or a querystring request
+ /// Initialises the class to hold a value either from a post request or a querystring request
public HttpParam(IHttpInput form, IHttpInput query)
{
m_form = form;
diff --git a/OpenSim/Framework/Servers/HttpServer/OSHttpServer/IHttpRequestParser.cs b/OpenSim/Framework/Servers/HttpServer/OSHttpServer/IHttpRequestParser.cs
index 953fab343c..9f192b5552 100644
--- a/OpenSim/Framework/Servers/HttpServer/OSHttpServer/IHttpRequestParser.cs
+++ b/OpenSim/Framework/Servers/HttpServer/OSHttpServer/IHttpRequestParser.cs
@@ -49,15 +49,15 @@ namespace OSHttpServer
///
event EventHandler HeaderReceived;
- ///
- /// Clear parser state.
- ///
- void Clear();
+ ///
+ /// Clear parser state.
+ ///
+ void Clear();
- ///
- /// Gets or sets the log writer.
- ///
- ILogWriter LogWriter { get; set; }
+ ///
+ /// Gets or sets the log writer.
+ ///
+ ILogWriter LogWriter { get; set; }
}
///
diff --git a/OpenSim/Framework/Servers/HttpServer/OSHttpServer/RequestCookies.cs b/OpenSim/Framework/Servers/HttpServer/OSHttpServer/RequestCookies.cs
index 3a7f05de6e..13ade76600 100644
--- a/OpenSim/Framework/Servers/HttpServer/OSHttpServer/RequestCookies.cs
+++ b/OpenSim/Framework/Servers/HttpServer/OSHttpServer/RequestCookies.cs
@@ -146,10 +146,10 @@ namespace OSHttpServer
#endregion
- ///
- /// Remove a cookie from the collection.
- ///
- /// Name of cookie.
+ ///
+ /// Remove a cookie from the collection.
+ ///
+ /// Name of cookie.
public void Remove(string cookieName)
{
lock (_items)
diff --git a/OpenSim/Region/Application/OpenSimBase.cs b/OpenSim/Region/Application/OpenSimBase.cs
index db0c358eec..59a893d0d0 100755
--- a/OpenSim/Region/Application/OpenSimBase.cs
+++ b/OpenSim/Region/Application/OpenSimBase.cs
@@ -1030,7 +1030,7 @@ namespace OpenSim
regInfo.EstateSettings = EstateDataService.LoadEstateSettings(regInfo.RegionID, false);
if (regInfo.EstateSettings.EstateID != 0)
- return false; // estate info in the database did not change
+ return false; // estate info in the database did not change
m_log.WarnFormat("[ESTATE] Region {0} is not part of an estate.", regInfo.RegionName);
@@ -1161,10 +1161,10 @@ namespace OpenSim
MainConsole.Instance.Output("Joining the estate failed. Please try again.");
}
}
- }
+ }
- return true; // need to update the database
- }
+ return true; // need to update the database
+ }
}
public class OpenSimConfigSource
diff --git a/OpenSim/Region/OptionalModules/World/AutoBackup/AutoBackupModule.cs b/OpenSim/Region/OptionalModules/World/AutoBackup/AutoBackupModule.cs
index e5bb59d9d8..2f706257fd 100755
--- a/OpenSim/Region/OptionalModules/World/AutoBackup/AutoBackupModule.cs
+++ b/OpenSim/Region/OptionalModules/World/AutoBackup/AutoBackupModule.cs
@@ -65,9 +65,9 @@ namespace OpenSim.Region.OptionalModules.World.AutoBackup
/// AutoBackupModuleEnabled: True/False. Default: False. If True, use the auto backup module.
/// if false module is disable and all rest is ignored
/// AutoBackupInterval: Double, non-negative value. Default: 720 (12 hours).
- /// The number of minutes between each backup attempt.
+ /// The number of minutes between each backup attempt.
/// AutoBackupDir: String. Default: "." (the current directory).
- /// A directory (absolute or relative) where backups should be saved.
+ /// A directory (absolute or relative) where backups should be saved.
/// AutoBackupKeepFilesForDays remove files older than this number of days. 0 disables
///
/// Next can be set on OpenSim.ini, as default, and or per region in Regions.ini
@@ -81,14 +81,14 @@ namespace OpenSim.Region.OptionalModules.World.AutoBackup
/// AutoBackupKeepFilesForDays
/// Backup files older than this value (in days) are deleted during the current backup process, 0 will disable this and keep all backup files indefinitely
/// AutoBackupScript: String. Default: not specified (disabled).
- /// File path to an executable script or binary to run when an automatic backup is taken.
+ /// File path to an executable script or binary to run when an automatic backup is taken.
/// The file should really be (Windows) an .exe or .bat, or (Linux/Mac) a shell script or binary.
/// Trying to "run" directories, or things with weird file associations on Win32, might cause unexpected results!
- /// argv[1] of the executed file/script will be the file name of the generated OAR.
- /// If the process can't be spawned for some reason (file not found, no execute permission, etc), write a warning to the console.
+ /// argv[1] of the executed file/script will be the file name of the generated OAR.
+ /// If the process can't be spawned for some reason (file not found, no execute permission, etc), write a warning to the console.
/// AutoBackupNaming: string. Default: Time.
- /// One of three strings (case insensitive):
- /// "Time": Current timestamp is appended to file name. An existing file will never be overwritten.
+ /// One of three strings (case insensitive):
+ /// "Time": Current timestamp is appended to file name. An existing file will never be overwritten.
/// "Sequential": A number is appended to the file name. So if RegionName_x.oar exists, we'll save to RegionName_{x+1}.oar next. An existing file will never be overwritten.
/// "Overwrite": Always save to file named "${AutoBackupDir}/RegionName.oar", even if we have to overwrite an existing file.
///
diff --git a/OpenSim/Region/PhysicsModules/BulletS/BSAPIUnman.cs b/OpenSim/Region/PhysicsModules/BulletS/BSAPIUnman.cs
index 840e453b0c..595bc7443b 100755
--- a/OpenSim/Region/PhysicsModules/BulletS/BSAPIUnman.cs
+++ b/OpenSim/Region/PhysicsModules/BulletS/BSAPIUnman.cs
@@ -37,2106 +37,2105 @@ using OpenMetaverse;
namespace OpenSim.Region.PhysicsModule.BulletS
{
-public sealed class BSAPIUnman : BSAPITemplate
-{
-
-private sealed class BulletWorldUnman : BulletWorld
-{
- public IntPtr ptr;
- public BulletWorldUnman(uint id, BSScene physScene, IntPtr xx)
- : base(id, physScene)
+ public sealed class BSAPIUnman : BSAPITemplate
{
- ptr = xx;
+
+ private sealed class BulletWorldUnman : BulletWorld
+ {
+ public IntPtr ptr;
+ public BulletWorldUnman(uint id, BSScene physScene, IntPtr xx)
+ : base(id, physScene)
+ {
+ ptr = xx;
+ }
+ }
+
+ private sealed class BulletBodyUnman : BulletBody
+ {
+ public IntPtr ptr;
+ public BulletBodyUnman(uint id, IntPtr xx)
+ : base(id)
+ {
+ ptr = xx;
+ }
+ public override bool HasPhysicalBody
+ {
+ get { return ptr != IntPtr.Zero; }
+ }
+ public override void Clear()
+ {
+ ptr = IntPtr.Zero;
+ }
+ public override string AddrString
+ {
+ get { return ptr.ToString("X"); }
+ }
+ }
+
+ private sealed class BulletShapeUnman : BulletShape
+ {
+ public IntPtr ptr;
+ public BulletShapeUnman(IntPtr xx, BSPhysicsShapeType typ)
+ : base()
+ {
+ ptr = xx;
+ shapeType = typ;
+ }
+ public override bool HasPhysicalShape
+ {
+ get { return ptr != IntPtr.Zero; }
+ }
+ public override void Clear()
+ {
+ ptr = IntPtr.Zero;
+ }
+ public override BulletShape Clone()
+ {
+ return new BulletShapeUnman(ptr, shapeType);
+ }
+ public override bool ReferenceSame(BulletShape other)
+ {
+ BulletShapeUnman otheru = other as BulletShapeUnman;
+ return (otheru != null) && (this.ptr == otheru.ptr);
+
+ }
+ public override string AddrString
+ {
+ get { return ptr.ToString("X"); }
+ }
+ }
+
+ private sealed class BulletConstraintUnman : BulletConstraint
+ {
+ public BulletConstraintUnman(IntPtr xx) : base()
+ {
+ ptr = xx;
+ }
+ public IntPtr ptr;
+
+ public override void Clear()
+ {
+ ptr = IntPtr.Zero;
+ }
+ public override bool HasPhysicalConstraint { get { return ptr != IntPtr.Zero; } }
+
+ // Used for log messages for a unique display of the memory/object allocated to this instance
+ public override string AddrString
+ {
+ get { return ptr.ToString("X"); }
+ }
+ }
+
+ // We pin the memory passed between the managed and unmanaged code.
+ GCHandle m_paramsHandle;
+ private GCHandle m_collisionArrayPinnedHandle;
+ private GCHandle m_updateArrayPinnedHandle;
+
+ // 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 BSAPICPP.DebugLogCallback m_DebugLogCallbackHandle;
+
+ private BSScene PhysicsScene { get; set; }
+
+ public override string BulletEngineName { get { return "BulletUnmanaged"; } }
+ public override string BulletEngineVersion { get; protected set; }
+
+ public BSAPIUnman(string paramName, BSScene physScene)
+ {
+ PhysicsScene = physScene;
+
+ // Do something fancy with the paramName to get the right DLL implementation
+ // like "Bullet-2.80-OpenCL-Intel" loading the version for Intel based OpenCL implementation, etc.
+ if (Util.IsWindows())
+ Util.LoadArchSpecificWindowsDll("BulletSim.dll");
+ // If not Windows, loading is performed by the
+ // Mono loader as specified in
+ // "bin/Physics/OpenSim.Region.Physics.BulletSPlugin.dll.config".
+ }
+
+ // Initialization and simulation
+ public override BulletWorld Initialize(Vector3 maxPosition, ConfigurationParameters parms,
+ int maxCollisions, ref CollisionDesc[] collisionArray,
+ int maxUpdates, ref EntityProperties[] updateArray
+ )
+ {
+ // Pin down the memory that will be used to pass object collisions and updates back from unmanaged code
+ m_paramsHandle = GCHandle.Alloc(parms, GCHandleType.Pinned);
+ m_collisionArrayPinnedHandle = GCHandle.Alloc(collisionArray, GCHandleType.Pinned);
+ m_updateArrayPinnedHandle = GCHandle.Alloc(updateArray, GCHandleType.Pinned);
+
+ // If Debug logging level, enable logging from the unmanaged code
+ m_DebugLogCallbackHandle = null;
+ if (BSScene.m_log.IsDebugEnabled && PhysicsScene.PhysicsLogging.Enabled)
+ {
+ BSScene.m_log.DebugFormat("{0}: Initialize: Setting debug callback for unmanaged code", BSScene.LogHeader);
+ if (PhysicsScene.PhysicsLogging.Enabled)
+ // The handle is saved in a variable to make sure it doesn't get freed after this call
+ m_DebugLogCallbackHandle = new BSAPICPP.DebugLogCallback(BulletLoggerPhysLog);
+ else
+ m_DebugLogCallbackHandle = new BSAPICPP.DebugLogCallback(BulletLogger);
+ }
+
+ // Get the version of the DLL
+ // TODO: this doesn't work yet. Something wrong with marshaling the returned string.
+ // BulletEngineVersion = BulletSimAPI.GetVersion2();
+ BulletEngineVersion = "";
+
+ // Call the unmanaged code with the buffers and other information
+ return new BulletWorldUnman(0, PhysicsScene, BSAPICPP.Initialize2(maxPosition, m_paramsHandle.AddrOfPinnedObject(),
+ maxCollisions, m_collisionArrayPinnedHandle.AddrOfPinnedObject(),
+ maxUpdates, m_updateArrayPinnedHandle.AddrOfPinnedObject(),
+ m_DebugLogCallbackHandle));
+
+ }
+
+ // Called directly from unmanaged code so don't do much
+ private void BulletLogger(string msg)
+ {
+ BSScene.m_log.Debug("[BULLETS UNMANAGED]:" + msg);
+ }
+
+ // Called directly from unmanaged code so don't do much
+ private void BulletLoggerPhysLog(string msg)
+ {
+ PhysicsScene.DetailLog("[BULLETS UNMANAGED]:" + msg);
+ }
+
+ public override int PhysicsStep(BulletWorld world, float timeStep, int maxSubSteps, float fixedTimeStep,
+ out int updatedEntityCount, out int collidersCount)
+ {
+ BulletWorldUnman worldu = world as BulletWorldUnman;
+ return BSAPICPP.PhysicsStep2(worldu.ptr, timeStep, maxSubSteps, fixedTimeStep, out updatedEntityCount, out collidersCount);
+ }
+
+ public override void Shutdown(BulletWorld world)
+ {
+ BulletWorldUnman worldu = world as BulletWorldUnman;
+ BSAPICPP.Shutdown2(worldu.ptr);
+
+ if (m_paramsHandle.IsAllocated)
+ {
+ m_paramsHandle.Free();
+ }
+ if (m_collisionArrayPinnedHandle.IsAllocated)
+ {
+ m_collisionArrayPinnedHandle.Free();
+ }
+ if (m_updateArrayPinnedHandle.IsAllocated)
+ {
+ m_updateArrayPinnedHandle.Free();
+ }
+ }
+
+ public override bool PushUpdate(BulletBody obj)
+ {
+ BulletBodyUnman bodyu = obj as BulletBodyUnman;
+ return BSAPICPP.PushUpdate2(bodyu.ptr);
+ }
+
+ public override bool UpdateParameter(BulletWorld world, uint localID, String parm, float value)
+ {
+ BulletWorldUnman worldu = world as BulletWorldUnman;
+ return BSAPICPP.UpdateParameter2(worldu.ptr, localID, parm, value);
+ }
+
+ // =====================================================================================
+ // Mesh, hull, shape and body creation helper routines
+ public override BulletShape CreateMeshShape(BulletWorld world,
+ int indicesCount, int[] indices,
+ int verticesCount, float[] vertices)
+ {
+ BulletWorldUnman worldu = world as BulletWorldUnman;
+ return new BulletShapeUnman(
+ BSAPICPP.CreateMeshShape2(worldu.ptr, indicesCount, indices, verticesCount, vertices),
+ BSPhysicsShapeType.SHAPE_MESH);
+ }
+
+ public override BulletShape CreateGImpactShape(BulletWorld world,
+ int indicesCount, int[] indices,
+ int verticesCount, float[] vertices)
+ {
+ BulletWorldUnman worldu = world as BulletWorldUnman;
+ return new BulletShapeUnman(
+ BSAPICPP.CreateGImpactShape2(worldu.ptr, indicesCount, indices, verticesCount, vertices),
+ BSPhysicsShapeType.SHAPE_GIMPACT);
+ }
+
+ public override BulletShape CreateHullShape(BulletWorld world, int hullCount, float[] hulls)
+ {
+ BulletWorldUnman worldu = world as BulletWorldUnman;
+ return new BulletShapeUnman(
+ BSAPICPP.CreateHullShape2(worldu.ptr, hullCount, hulls),
+ BSPhysicsShapeType.SHAPE_HULL);
+ }
+
+ public override BulletShape BuildHullShapeFromMesh(BulletWorld world, BulletShape meshShape, HACDParams parms)
+ {
+ BulletWorldUnman worldu = world as BulletWorldUnman;
+ BulletShapeUnman shapeu = meshShape as BulletShapeUnman;
+ return new BulletShapeUnman(
+ BSAPICPP.BuildHullShapeFromMesh2(worldu.ptr, shapeu.ptr, parms),
+ BSPhysicsShapeType.SHAPE_HULL);
+ }
+
+ public override BulletShape BuildConvexHullShapeFromMesh(BulletWorld world, BulletShape meshShape)
+ {
+ BulletWorldUnman worldu = world as BulletWorldUnman;
+ BulletShapeUnman shapeu = meshShape as BulletShapeUnman;
+ return new BulletShapeUnman(
+ BSAPICPP.BuildConvexHullShapeFromMesh2(worldu.ptr, shapeu.ptr),
+ BSPhysicsShapeType.SHAPE_CONVEXHULL);
+ }
+
+ public override BulletShape CreateConvexHullShape(BulletWorld world,
+ int indicesCount, int[] indices,
+ int verticesCount, float[] vertices)
+ {
+ BulletWorldUnman worldu = world as BulletWorldUnman;
+ return new BulletShapeUnman(
+ BSAPICPP.CreateConvexHullShape2(worldu.ptr, indicesCount, indices, verticesCount, vertices),
+ BSPhysicsShapeType.SHAPE_CONVEXHULL);
+ }
+
+ public override BulletShape BuildNativeShape(BulletWorld world, ShapeData shapeData)
+ {
+ BulletWorldUnman worldu = world as BulletWorldUnman;
+ return new BulletShapeUnman(BSAPICPP.BuildNativeShape2(worldu.ptr, shapeData), shapeData.Type);
+ }
+
+ public override bool IsNativeShape(BulletShape shape)
+ {
+ BulletShapeUnman shapeu = shape as BulletShapeUnman;
+ if (shapeu != null && shapeu.HasPhysicalShape)
+ return BSAPICPP.IsNativeShape2(shapeu.ptr);
+ return false;
+ }
+
+ public override void SetShapeCollisionMargin(BulletShape shape, float margin)
+ {
+ BulletShapeUnman shapeu = shape as BulletShapeUnman;
+ if (shapeu != null && shapeu.HasPhysicalShape)
+ BSAPICPP.SetShapeCollisionMargin(shapeu.ptr, margin);
+ }
+
+ public override BulletShape BuildCapsuleShape(BulletWorld world, float radius, float height, Vector3 scale)
+ {
+ BulletWorldUnman worldu = world as BulletWorldUnman;
+ return new BulletShapeUnman(
+ BSAPICPP.BuildCapsuleShape2(worldu.ptr, radius, height, scale),
+ BSPhysicsShapeType.SHAPE_CAPSULE);
+ }
+
+ public override BulletShape CreateCompoundShape(BulletWorld world, bool enableDynamicAabbTree)
+ {
+ BulletWorldUnman worldu = world as BulletWorldUnman;
+ return new BulletShapeUnman(
+ BSAPICPP.CreateCompoundShape2(worldu.ptr, enableDynamicAabbTree),
+ BSPhysicsShapeType.SHAPE_COMPOUND);
+
+ }
+
+ public override int GetNumberOfCompoundChildren(BulletShape shape)
+ {
+ BulletShapeUnman shapeu = shape as BulletShapeUnman;
+ if (shapeu != null && shapeu.HasPhysicalShape)
+ return BSAPICPP.GetNumberOfCompoundChildren2(shapeu.ptr);
+ return 0;
+ }
+
+ public override void AddChildShapeToCompoundShape(BulletShape shape, BulletShape addShape, Vector3 pos, Quaternion rot)
+ {
+ BulletShapeUnman shapeu = shape as BulletShapeUnman;
+ BulletShapeUnman addShapeu = addShape as BulletShapeUnman;
+ BSAPICPP.AddChildShapeToCompoundShape2(shapeu.ptr, addShapeu.ptr, pos, rot);
+ }
+
+ public override BulletShape GetChildShapeFromCompoundShapeIndex(BulletShape shape, int indx)
+ {
+ BulletShapeUnman shapeu = shape as BulletShapeUnman;
+ return new BulletShapeUnman(BSAPICPP.GetChildShapeFromCompoundShapeIndex2(shapeu.ptr, indx), BSPhysicsShapeType.SHAPE_UNKNOWN);
+ }
+
+ public override BulletShape RemoveChildShapeFromCompoundShapeIndex(BulletShape shape, int indx)
+ {
+ BulletShapeUnman shapeu = shape as BulletShapeUnman;
+ return new BulletShapeUnman(BSAPICPP.RemoveChildShapeFromCompoundShapeIndex2(shapeu.ptr, indx), BSPhysicsShapeType.SHAPE_UNKNOWN);
+ }
+
+ public override void RemoveChildShapeFromCompoundShape(BulletShape shape, BulletShape removeShape)
+ {
+ BulletShapeUnman shapeu = shape as BulletShapeUnman;
+ BulletShapeUnman removeShapeu = removeShape as BulletShapeUnman;
+ BSAPICPP.RemoveChildShapeFromCompoundShape2(shapeu.ptr, removeShapeu.ptr);
+ }
+
+ public override void UpdateChildTransform(BulletShape pShape, int childIndex, Vector3 pos, Quaternion rot, bool shouldRecalculateLocalAabb)
+ {
+ BulletShapeUnman shapeu = pShape as BulletShapeUnman;
+ BSAPICPP.UpdateChildTransform2(shapeu.ptr, childIndex, pos, rot, shouldRecalculateLocalAabb);
+ }
+
+ public override void RecalculateCompoundShapeLocalAabb(BulletShape shape)
+ {
+ BulletShapeUnman shapeu = shape as BulletShapeUnman;
+ BSAPICPP.RecalculateCompoundShapeLocalAabb2(shapeu.ptr);
+ }
+
+ public override BulletShape DuplicateCollisionShape(BulletWorld world, BulletShape srcShape, uint id)
+ {
+ BulletWorldUnman worldu = world as BulletWorldUnman;
+ BulletShapeUnman srcShapeu = srcShape as BulletShapeUnman;
+ return new BulletShapeUnman(BSAPICPP.DuplicateCollisionShape2(worldu.ptr, srcShapeu.ptr, id), srcShape.shapeType);
+ }
+
+ public override bool DeleteCollisionShape(BulletWorld world, BulletShape shape)
+ {
+ BulletWorldUnman worldu = world as BulletWorldUnman;
+ BulletShapeUnman shapeu = shape as BulletShapeUnman;
+ return BSAPICPP.DeleteCollisionShape2(worldu.ptr, shapeu.ptr);
+ }
+
+ public override CollisionObjectTypes GetBodyType(BulletBody obj)
+ {
+ BulletBodyUnman bodyu = obj as BulletBodyUnman;
+ return (CollisionObjectTypes)BSAPICPP.GetBodyType2(bodyu.ptr);
+ }
+
+ public override BulletBody CreateBodyFromShape(BulletWorld world, BulletShape shape, uint id, Vector3 pos, Quaternion rot)
+ {
+ BulletWorldUnman worldu = world as BulletWorldUnman;
+ BulletShapeUnman shapeu = shape as BulletShapeUnman;
+ return new BulletBodyUnman(id, BSAPICPP.CreateBodyFromShape2(worldu.ptr, shapeu.ptr, id, pos, rot));
+ }
+
+ public override BulletBody CreateBodyWithDefaultMotionState(BulletShape shape, uint id, Vector3 pos, Quaternion rot)
+ {
+ BulletShapeUnman shapeu = shape as BulletShapeUnman;
+ return new BulletBodyUnman(id, BSAPICPP.CreateBodyWithDefaultMotionState2(shapeu.ptr, id, pos, rot));
+ }
+
+ public override BulletBody CreateGhostFromShape(BulletWorld world, BulletShape shape, uint id, Vector3 pos, Quaternion rot)
+ {
+ BulletWorldUnman worldu = world as BulletWorldUnman;
+ BulletShapeUnman shapeu = shape as BulletShapeUnman;
+ return new BulletBodyUnman(id, BSAPICPP.CreateGhostFromShape2(worldu.ptr, shapeu.ptr, id, pos, rot));
+ }
+
+ public override void DestroyObject(BulletWorld world, BulletBody obj)
+ {
+ BulletWorldUnman worldu = world as BulletWorldUnman;
+ BulletBodyUnman bodyu = obj as BulletBodyUnman;
+ BSAPICPP.DestroyObject2(worldu.ptr, bodyu.ptr);
+ }
+
+ // =====================================================================================
+ // Terrain creation and helper routines
+ public override BulletShape CreateGroundPlaneShape(uint id, float height, float collisionMargin)
+ {
+ return new BulletShapeUnman(BSAPICPP.CreateGroundPlaneShape2(id, height, collisionMargin), BSPhysicsShapeType.SHAPE_GROUNDPLANE);
+ }
+
+ public override BulletShape CreateTerrainShape(uint id, Vector3 size, float minHeight, float maxHeight, float[] heightMap,
+ float scaleFactor, float collisionMargin)
+ {
+ return new BulletShapeUnman(BSAPICPP.CreateTerrainShape2(id, size, minHeight, maxHeight, heightMap, scaleFactor, collisionMargin),
+ BSPhysicsShapeType.SHAPE_TERRAIN);
+ }
+
+ // =====================================================================================
+ // Constraint creation and helper routines
+ public override BulletConstraint Create6DofConstraint(BulletWorld world, BulletBody obj1, BulletBody obj2,
+ Vector3 frame1loc, Quaternion frame1rot,
+ Vector3 frame2loc, Quaternion frame2rot,
+ bool useLinearReferenceFrameA, bool disableCollisionsBetweenLinkedBodies)
+ {
+ BulletWorldUnman worldu = world as BulletWorldUnman;
+ BulletBodyUnman bodyu1 = obj1 as BulletBodyUnman;
+ BulletBodyUnman bodyu2 = obj2 as BulletBodyUnman;
+ return new BulletConstraintUnman(BSAPICPP.Create6DofConstraint2(worldu.ptr, bodyu1.ptr, bodyu2.ptr, frame1loc, frame1rot,
+ frame2loc, frame2rot, useLinearReferenceFrameA, disableCollisionsBetweenLinkedBodies));
+ }
+
+ public override BulletConstraint Create6DofConstraintToPoint(BulletWorld world, BulletBody obj1, BulletBody obj2,
+ Vector3 joinPoint,
+ bool useLinearReferenceFrameA, bool disableCollisionsBetweenLinkedBodies)
+ {
+ BulletWorldUnman worldu = world as BulletWorldUnman;
+ BulletBodyUnman bodyu1 = obj1 as BulletBodyUnman;
+ BulletBodyUnman bodyu2 = obj2 as BulletBodyUnman;
+ return new BulletConstraintUnman(BSAPICPP.Create6DofConstraintToPoint2(worldu.ptr, bodyu1.ptr, bodyu2.ptr,
+ joinPoint, useLinearReferenceFrameA, disableCollisionsBetweenLinkedBodies));
+ }
+
+ public override BulletConstraint Create6DofConstraintFixed(BulletWorld world, BulletBody obj1,
+ Vector3 frameInBloc, Quaternion frameInBrot,
+ bool useLinearReferenceFrameB, bool disableCollisionsBetweenLinkedBodies)
+ {
+ BulletWorldUnman worldu = world as BulletWorldUnman;
+ BulletBodyUnman bodyu1 = obj1 as BulletBodyUnman;
+ return new BulletConstraintUnman(BSAPICPP.Create6DofConstraintFixed2(worldu.ptr, bodyu1.ptr,
+ frameInBloc, frameInBrot, useLinearReferenceFrameB, disableCollisionsBetweenLinkedBodies));
+ }
+
+ public override BulletConstraint Create6DofSpringConstraint(BulletWorld world, BulletBody obj1, BulletBody obj2,
+ Vector3 frame1loc, Quaternion frame1rot,
+ Vector3 frame2loc, Quaternion frame2rot,
+ bool useLinearReferenceFrameA, bool disableCollisionsBetweenLinkedBodies)
+ {
+ BulletWorldUnman worldu = world as BulletWorldUnman;
+ BulletBodyUnman bodyu1 = obj1 as BulletBodyUnman;
+ BulletBodyUnman bodyu2 = obj2 as BulletBodyUnman;
+ return new BulletConstraintUnman(BSAPICPP.Create6DofSpringConstraint2(worldu.ptr, bodyu1.ptr, bodyu2.ptr, frame1loc, frame1rot,
+ frame2loc, frame2rot, useLinearReferenceFrameA, disableCollisionsBetweenLinkedBodies));
+ }
+
+ public override BulletConstraint CreateHingeConstraint(BulletWorld world, BulletBody obj1, BulletBody obj2,
+ Vector3 pivotinA, Vector3 pivotinB,
+ Vector3 axisInA, Vector3 axisInB,
+ bool useLinearReferenceFrameA, bool disableCollisionsBetweenLinkedBodies)
+ {
+ BulletWorldUnman worldu = world as BulletWorldUnman;
+ BulletBodyUnman bodyu1 = obj1 as BulletBodyUnman;
+ BulletBodyUnman bodyu2 = obj2 as BulletBodyUnman;
+ return new BulletConstraintUnman(BSAPICPP.CreateHingeConstraint2(worldu.ptr, bodyu1.ptr, bodyu2.ptr,
+ pivotinA, pivotinB, axisInA, axisInB, useLinearReferenceFrameA, disableCollisionsBetweenLinkedBodies));
+ }
+
+ public override BulletConstraint CreateSliderConstraint(BulletWorld world, BulletBody obj1, BulletBody obj2,
+ Vector3 frame1loc, Quaternion frame1rot,
+ Vector3 frame2loc, Quaternion frame2rot,
+ bool useLinearReferenceFrameA, bool disableCollisionsBetweenLinkedBodies)
+ {
+ BulletWorldUnman worldu = world as BulletWorldUnman;
+ BulletBodyUnman bodyu1 = obj1 as BulletBodyUnman;
+ BulletBodyUnman bodyu2 = obj2 as BulletBodyUnman;
+ return new BulletConstraintUnman(BSAPICPP.CreateSliderConstraint2(worldu.ptr, bodyu1.ptr, bodyu2.ptr, frame1loc, frame1rot,
+ frame2loc, frame2rot, useLinearReferenceFrameA, disableCollisionsBetweenLinkedBodies));
+ }
+
+ public override BulletConstraint CreateConeTwistConstraint(BulletWorld world, BulletBody obj1, BulletBody obj2,
+ Vector3 frame1loc, Quaternion frame1rot,
+ Vector3 frame2loc, Quaternion frame2rot,
+ bool disableCollisionsBetweenLinkedBodies)
+ {
+ BulletWorldUnman worldu = world as BulletWorldUnman;
+ BulletBodyUnman bodyu1 = obj1 as BulletBodyUnman;
+ BulletBodyUnman bodyu2 = obj2 as BulletBodyUnman;
+ return new BulletConstraintUnman(BSAPICPP.CreateConeTwistConstraint2(worldu.ptr, bodyu1.ptr, bodyu2.ptr, frame1loc, frame1rot,
+ frame2loc, frame2rot, disableCollisionsBetweenLinkedBodies));
+ }
+
+ public override BulletConstraint CreateGearConstraint(BulletWorld world, BulletBody obj1, BulletBody obj2,
+ Vector3 axisInA, Vector3 axisInB,
+ float ratio, bool disableCollisionsBetweenLinkedBodies)
+ {
+ BulletWorldUnman worldu = world as BulletWorldUnman;
+ BulletBodyUnman bodyu1 = obj1 as BulletBodyUnman;
+ BulletBodyUnman bodyu2 = obj2 as BulletBodyUnman;
+ return new BulletConstraintUnman(BSAPICPP.CreateGearConstraint2(worldu.ptr, bodyu1.ptr, bodyu2.ptr, axisInA, axisInB,
+ ratio, disableCollisionsBetweenLinkedBodies));
+ }
+
+ public override BulletConstraint CreatePoint2PointConstraint(BulletWorld world, BulletBody obj1, BulletBody obj2,
+ Vector3 pivotInA, Vector3 pivotInB,
+ bool disableCollisionsBetweenLinkedBodies)
+ {
+ BulletWorldUnman worldu = world as BulletWorldUnman;
+ BulletBodyUnman bodyu1 = obj1 as BulletBodyUnman;
+ BulletBodyUnman bodyu2 = obj2 as BulletBodyUnman;
+ return new BulletConstraintUnman(BSAPICPP.CreatePoint2PointConstraint2(worldu.ptr, bodyu1.ptr, bodyu2.ptr, pivotInA, pivotInB,
+ disableCollisionsBetweenLinkedBodies));
+ }
+
+ public override void SetConstraintEnable(BulletConstraint constrain, float numericTrueFalse)
+ {
+ BulletConstraintUnman constrainu = constrain as BulletConstraintUnman;
+ BSAPICPP.SetConstraintEnable2(constrainu.ptr, numericTrueFalse);
+ }
+
+ public override void SetConstraintNumSolverIterations(BulletConstraint constrain, float iterations)
+ {
+ BulletConstraintUnman constrainu = constrain as BulletConstraintUnman;
+ BSAPICPP.SetConstraintNumSolverIterations2(constrainu.ptr, iterations);
+ }
+
+ public override bool SetFrames(BulletConstraint constrain,
+ Vector3 frameA, Quaternion frameArot, Vector3 frameB, Quaternion frameBrot)
+ {
+ BulletConstraintUnman constrainu = constrain as BulletConstraintUnman;
+ return BSAPICPP.SetFrames2(constrainu.ptr, frameA, frameArot, frameB, frameBrot);
+ }
+
+ public override bool SetLinearLimits(BulletConstraint constrain, Vector3 low, Vector3 hi)
+ {
+ BulletConstraintUnman constrainu = constrain as BulletConstraintUnman;
+ return BSAPICPP.SetLinearLimits2(constrainu.ptr, low, hi);
+ }
+
+ public override bool SetAngularLimits(BulletConstraint constrain, Vector3 low, Vector3 hi)
+ {
+ BulletConstraintUnman constrainu = constrain as BulletConstraintUnman;
+ return BSAPICPP.SetAngularLimits2(constrainu.ptr, low, hi);
+ }
+
+ public override bool UseFrameOffset(BulletConstraint constrain, float enable)
+ {
+ BulletConstraintUnman constrainu = constrain as BulletConstraintUnman;
+ return BSAPICPP.UseFrameOffset2(constrainu.ptr, enable);
+ }
+
+ public override bool TranslationalLimitMotor(BulletConstraint constrain, float enable, float targetVel, float maxMotorForce)
+ {
+ BulletConstraintUnman constrainu = constrain as BulletConstraintUnman;
+ return BSAPICPP.TranslationalLimitMotor2(constrainu.ptr, enable, targetVel, maxMotorForce);
+ }
+
+ public override bool SetBreakingImpulseThreshold(BulletConstraint constrain, float threshold)
+ {
+ BulletConstraintUnman constrainu = constrain as BulletConstraintUnman;
+ return BSAPICPP.SetBreakingImpulseThreshold2(constrainu.ptr, threshold);
+ }
+
+ public override bool HingeSetLimits(BulletConstraint constrain, float low, float high, float softness, float bias, float relaxation)
+ {
+ BulletConstraintUnman constrainu = constrain as BulletConstraintUnman;
+ return BSAPICPP.HingeSetLimits2(constrainu.ptr, low, high, softness, bias, relaxation);
+ }
+
+ public override bool SpringEnable(BulletConstraint constrain, int index, float numericTrueFalse)
+ {
+ BulletConstraintUnman constrainu = constrain as BulletConstraintUnman;
+ return BSAPICPP.ConstraintSpringEnable2(constrainu.ptr, index, numericTrueFalse);
+ }
+
+ public override bool SpringSetEquilibriumPoint(BulletConstraint constrain, int index, float equilibriumPoint)
+ {
+ BulletConstraintUnman constrainu = constrain as BulletConstraintUnman;
+ return BSAPICPP.ConstraintSpringSetEquilibriumPoint2(constrainu.ptr, index, equilibriumPoint);
+ }
+
+ public override bool SpringSetStiffness(BulletConstraint constrain, int index, float stiffnesss)
+ {
+ BulletConstraintUnman constrainu = constrain as BulletConstraintUnman;
+ return BSAPICPP.ConstraintSpringSetStiffness2(constrainu.ptr, index, stiffnesss);
+ }
+
+ public override bool SpringSetDamping(BulletConstraint constrain, int index, float damping)
+ {
+ BulletConstraintUnman constrainu = constrain as BulletConstraintUnman;
+ return BSAPICPP.ConstraintSpringSetDamping2(constrainu.ptr, index, damping);
+ }
+
+ public override bool SliderSetLimits(BulletConstraint constrain, int lowerUpper, int linAng, float val)
+ {
+ BulletConstraintUnman constrainu = constrain as BulletConstraintUnman;
+ return BSAPICPP.SliderSetLimits2(constrainu.ptr, lowerUpper, linAng, val);
+ }
+
+ public override bool SliderSet(BulletConstraint constrain, int softRestDamp, int dirLimOrtho, int linAng, float val)
+ {
+ BulletConstraintUnman constrainu = constrain as BulletConstraintUnman;
+ return BSAPICPP.SliderSet2(constrainu.ptr, softRestDamp, dirLimOrtho, linAng, val);
+ }
+
+ public override bool SliderMotorEnable(BulletConstraint constrain, int linAng, float numericTrueFalse)
+ {
+ BulletConstraintUnman constrainu = constrain as BulletConstraintUnman;
+ return BSAPICPP.SliderMotorEnable2(constrainu.ptr, linAng, numericTrueFalse);
+ }
+
+ public override bool SliderMotor(BulletConstraint constrain, int forceVel, int linAng, float val)
+ {
+ BulletConstraintUnman constrainu = constrain as BulletConstraintUnman;
+ return BSAPICPP.SliderMotor2(constrainu.ptr, forceVel, linAng, val);
+ }
+
+ public override bool CalculateTransforms(BulletConstraint constrain)
+ {
+ BulletConstraintUnman constrainu = constrain as BulletConstraintUnman;
+ return BSAPICPP.CalculateTransforms2(constrainu.ptr);
+ }
+
+ public override bool SetConstraintParam(BulletConstraint constrain, ConstraintParams paramIndex, float value, ConstraintParamAxis axis)
+ {
+ BulletConstraintUnman constrainu = constrain as BulletConstraintUnman;
+ return BSAPICPP.SetConstraintParam2(constrainu.ptr, paramIndex, value, axis);
+ }
+
+ public override bool DestroyConstraint(BulletWorld world, BulletConstraint constrain)
+ {
+ BulletWorldUnman worldu = world as BulletWorldUnman;
+ BulletConstraintUnman constrainu = constrain as BulletConstraintUnman;
+ return BSAPICPP.DestroyConstraint2(worldu.ptr, constrainu.ptr);
+ }
+
+ // =====================================================================================
+ // btCollisionWorld entries
+ public override void UpdateSingleAabb(BulletWorld world, BulletBody obj)
+ {
+ BulletWorldUnman worldu = world as BulletWorldUnman;
+ BulletBodyUnman bodyu = obj as BulletBodyUnman;
+ BSAPICPP.UpdateSingleAabb2(worldu.ptr, bodyu.ptr);
+ }
+
+ public override void UpdateAabbs(BulletWorld world)
+ {
+ BulletWorldUnman worldu = world as BulletWorldUnman;
+ BSAPICPP.UpdateAabbs2(worldu.ptr);
+ }
+
+ public override bool GetForceUpdateAllAabbs(BulletWorld world)
+ {
+ BulletWorldUnman worldu = world as BulletWorldUnman;
+ return BSAPICPP.GetForceUpdateAllAabbs2(worldu.ptr);
+ }
+
+ public override void SetForceUpdateAllAabbs(BulletWorld world, bool force)
+ {
+ BulletWorldUnman worldu = world as BulletWorldUnman;
+ BSAPICPP.SetForceUpdateAllAabbs2(worldu.ptr, force);
+ }
+
+ // =====================================================================================
+ // btDynamicsWorld entries
+ public override bool AddObjectToWorld(BulletWorld world, BulletBody obj)
+ {
+ BulletWorldUnman worldu = world as BulletWorldUnman;
+ BulletBodyUnman bodyu = obj as BulletBodyUnman;
+
+ // Bullet resets several variables when an object is added to the world.
+ // Gravity is reset to world default depending on the static/dynamic
+ // type. Of course, the collision flags in the broadphase proxy are initialized to default.
+ Vector3 origGrav = BSAPICPP.GetGravity2(bodyu.ptr);
+
+ bool ret = BSAPICPP.AddObjectToWorld2(worldu.ptr, bodyu.ptr);
+
+ if (ret)
+ {
+ BSAPICPP.SetGravity2(bodyu.ptr, origGrav);
+ obj.ApplyCollisionMask(world.physicsScene);
+ }
+ return ret;
+ }
+
+ public override bool RemoveObjectFromWorld(BulletWorld world, BulletBody obj)
+ {
+ BulletWorldUnman worldu = world as BulletWorldUnman;
+ BulletBodyUnman bodyu = obj as BulletBodyUnman;
+ return BSAPICPP.RemoveObjectFromWorld2(worldu.ptr, bodyu.ptr);
+ }
+
+ public override bool ClearCollisionProxyCache(BulletWorld world, BulletBody obj)
+ {
+ BulletWorldUnman worldu = world as BulletWorldUnman;
+ BulletBodyUnman bodyu = obj as BulletBodyUnman;
+ return BSAPICPP.ClearCollisionProxyCache2(worldu.ptr, bodyu.ptr);
+ }
+
+ public override bool AddConstraintToWorld(BulletWorld world, BulletConstraint constrain, bool disableCollisionsBetweenLinkedObjects)
+ {
+ BulletWorldUnman worldu = world as BulletWorldUnman;
+ BulletConstraintUnman constrainu = constrain as BulletConstraintUnman;
+ return BSAPICPP.AddConstraintToWorld2(worldu.ptr, constrainu.ptr, disableCollisionsBetweenLinkedObjects);
+ }
+
+ public override bool RemoveConstraintFromWorld(BulletWorld world, BulletConstraint constrain)
+ {
+ BulletWorldUnman worldu = world as BulletWorldUnman;
+ BulletConstraintUnman constrainu = constrain as BulletConstraintUnman;
+ return BSAPICPP.RemoveConstraintFromWorld2(worldu.ptr, constrainu.ptr);
+ }
+ // =====================================================================================
+ // btCollisionObject entries
+ public override Vector3 GetAnisotripicFriction(BulletConstraint constrain)
+ {
+ BulletConstraintUnman constrainu = constrain as BulletConstraintUnman;
+ return BSAPICPP.GetAnisotripicFriction2(constrainu.ptr);
+ }
+
+ public override Vector3 SetAnisotripicFriction(BulletConstraint constrain, Vector3 frict)
+ {
+ BulletConstraintUnman constrainu = constrain as BulletConstraintUnman;
+ return BSAPICPP.SetAnisotripicFriction2(constrainu.ptr, frict);
+ }
+
+ public override bool HasAnisotripicFriction(BulletConstraint constrain)
+ {
+ BulletConstraintUnman constrainu = constrain as BulletConstraintUnman;
+ return BSAPICPP.HasAnisotripicFriction2(constrainu.ptr);
+ }
+
+ public override void SetContactProcessingThreshold(BulletBody obj, float val)
+ {
+ BulletBodyUnman bodyu = obj as BulletBodyUnman;
+ BSAPICPP.SetContactProcessingThreshold2(bodyu.ptr, val);
+ }
+
+ public override float GetContactProcessingThreshold(BulletBody obj)
+ {
+ BulletBodyUnman bodyu = obj as BulletBodyUnman;
+ return BSAPICPP.GetContactProcessingThreshold2(bodyu.ptr);
+ }
+
+ public override bool IsStaticObject(BulletBody obj)
+ {
+ BulletBodyUnman bodyu = obj as BulletBodyUnman;
+ return BSAPICPP.IsStaticObject2(bodyu.ptr);
+ }
+
+ public override bool IsKinematicObject(BulletBody obj)
+ {
+ BulletBodyUnman bodyu = obj as BulletBodyUnman;
+ return BSAPICPP.IsKinematicObject2(bodyu.ptr);
+ }
+
+ public override bool IsStaticOrKinematicObject(BulletBody obj)
+ {
+ BulletBodyUnman bodyu = obj as BulletBodyUnman;
+ return BSAPICPP.IsStaticOrKinematicObject2(bodyu.ptr);
+ }
+
+ public override bool HasContactResponse(BulletBody obj)
+ {
+ BulletBodyUnman bodyu = obj as BulletBodyUnman;
+ return BSAPICPP.HasContactResponse2(bodyu.ptr);
+ }
+
+ public override void SetCollisionShape(BulletWorld world, BulletBody obj, BulletShape shape)
+ {
+ BulletWorldUnman worldu = world as BulletWorldUnman;
+ BulletBodyUnman bodyu = obj as BulletBodyUnman;
+ BulletShapeUnman shapeu = shape as BulletShapeUnman;
+ if (worldu != null && bodyu != null)
+ {
+ // Special case to allow the caller to zero out the reference to any physical shape
+ if (shapeu != null)
+ BSAPICPP.SetCollisionShape2(worldu.ptr, bodyu.ptr, shapeu.ptr);
+ else
+ BSAPICPP.SetCollisionShape2(worldu.ptr, bodyu.ptr, IntPtr.Zero);
+ }
+ }
+
+ public override BulletShape GetCollisionShape(BulletBody obj)
+ {
+ BulletBodyUnman bodyu = obj as BulletBodyUnman;
+ return new BulletShapeUnman(BSAPICPP.GetCollisionShape2(bodyu.ptr), BSPhysicsShapeType.SHAPE_UNKNOWN);
+ }
+
+ public override int GetActivationState(BulletBody obj)
+ {
+ BulletBodyUnman bodyu = obj as BulletBodyUnman;
+ return BSAPICPP.GetActivationState2(bodyu.ptr);
+ }
+
+ public override void SetActivationState(BulletBody obj, int state)
+ {
+ BulletBodyUnman bodyu = obj as BulletBodyUnman;
+ BSAPICPP.SetActivationState2(bodyu.ptr, state);
+ }
+
+ public override void SetDeactivationTime(BulletBody obj, float dtime)
+ {
+ BulletBodyUnman bodyu = obj as BulletBodyUnman;
+ BSAPICPP.SetDeactivationTime2(bodyu.ptr, dtime);
+ }
+
+ public override float GetDeactivationTime(BulletBody obj)
+ {
+ BulletBodyUnman bodyu = obj as BulletBodyUnman;
+ return BSAPICPP.GetDeactivationTime2(bodyu.ptr);
+ }
+
+ public override void ForceActivationState(BulletBody obj, ActivationState state)
+ {
+ BulletBodyUnman bodyu = obj as BulletBodyUnman;
+ BSAPICPP.ForceActivationState2(bodyu.ptr, state);
+ }
+
+ public override void Activate(BulletBody obj, bool forceActivation)
+ {
+ BulletBodyUnman bodyu = obj as BulletBodyUnman;
+ BSAPICPP.Activate2(bodyu.ptr, forceActivation);
+ }
+
+ public override bool IsActive(BulletBody obj)
+ {
+ BulletBodyUnman bodyu = obj as BulletBodyUnman;
+ return BSAPICPP.IsActive2(bodyu.ptr);
+ }
+
+ public override void SetRestitution(BulletBody obj, float val)
+ {
+ BulletBodyUnman bodyu = obj as BulletBodyUnman;
+ BSAPICPP.SetRestitution2(bodyu.ptr, val);
+ }
+
+ public override float GetRestitution(BulletBody obj)
+ {
+ BulletBodyUnman bodyu = obj as BulletBodyUnman;
+ return BSAPICPP.GetRestitution2(bodyu.ptr);
+ }
+
+ public override void SetFriction(BulletBody obj, float val)
+ {
+ BulletBodyUnman bodyu = obj as BulletBodyUnman;
+ BSAPICPP.SetFriction2(bodyu.ptr, val);
+ }
+
+ public override float GetFriction(BulletBody obj)
+ {
+ BulletBodyUnman bodyu = obj as BulletBodyUnman;
+ return BSAPICPP.GetFriction2(bodyu.ptr);
+ }
+
+ public override Vector3 GetPosition(BulletBody obj)
+ {
+ BulletBodyUnman bodyu = obj as BulletBodyUnman;
+ return BSAPICPP.GetPosition2(bodyu.ptr);
+ }
+
+ public override Quaternion GetOrientation(BulletBody obj)
+ {
+ BulletBodyUnman bodyu = obj as BulletBodyUnman;
+ return BSAPICPP.GetOrientation2(bodyu.ptr);
+ }
+
+ public override void SetTranslation(BulletBody obj, Vector3 position, Quaternion rotation)
+ {
+ BulletBodyUnman bodyu = obj as BulletBodyUnman;
+ BSAPICPP.SetTranslation2(bodyu.ptr, position, rotation);
+ }
+
+ /*
+ public override IntPtr GetBroadphaseHandle(BulletBody obj)
+ {
+ BulletBodyUnman bodyu = obj as BulletBodyUnman;
+ return BSAPICPP.GetBroadphaseHandle2(bodyu.ptr);
+ }
+
+ public override void SetBroadphaseHandle(BulletBody obj, IntPtr handle)
+ {
+ BulletBodyUnman bodyu = obj as BulletBodyUnman;
+ BSAPICPP.SetUserPointer2(bodyu.ptr, handle);
+ }
+ */
+
+ public override void SetInterpolationLinearVelocity(BulletBody obj, Vector3 vel)
+ {
+ BulletBodyUnman bodyu = obj as BulletBodyUnman;
+ BSAPICPP.SetInterpolationLinearVelocity2(bodyu.ptr, vel);
+ }
+
+ public override void SetInterpolationAngularVelocity(BulletBody obj, Vector3 vel)
+ {
+ BulletBodyUnman bodyu = obj as BulletBodyUnman;
+ BSAPICPP.SetInterpolationAngularVelocity2(bodyu.ptr, vel);
+ }
+
+ public override void SetInterpolationVelocity(BulletBody obj, Vector3 linearVel, Vector3 angularVel)
+ {
+ BulletBodyUnman bodyu = obj as BulletBodyUnman;
+ BSAPICPP.SetInterpolationVelocity2(bodyu.ptr, linearVel, angularVel);
+ }
+
+ public override float GetHitFraction(BulletBody obj)
+ {
+ BulletBodyUnman bodyu = obj as BulletBodyUnman;
+ return BSAPICPP.GetHitFraction2(bodyu.ptr);
+ }
+
+ public override void SetHitFraction(BulletBody obj, float val)
+ {
+ BulletBodyUnman bodyu = obj as BulletBodyUnman;
+ BSAPICPP.SetHitFraction2(bodyu.ptr, val);
+ }
+
+ public override CollisionFlags GetCollisionFlags(BulletBody obj)
+ {
+ BulletBodyUnman bodyu = obj as BulletBodyUnman;
+ return BSAPICPP.GetCollisionFlags2(bodyu.ptr);
+ }
+
+ public override CollisionFlags SetCollisionFlags(BulletBody obj, CollisionFlags flags)
+ {
+ BulletBodyUnman bodyu = obj as BulletBodyUnman;
+ return BSAPICPP.SetCollisionFlags2(bodyu.ptr, flags);
+ }
+
+ public override CollisionFlags AddToCollisionFlags(BulletBody obj, CollisionFlags flags)
+ {
+ BulletBodyUnman bodyu = obj as BulletBodyUnman;
+ return BSAPICPP.AddToCollisionFlags2(bodyu.ptr, flags);
+ }
+
+ public override CollisionFlags RemoveFromCollisionFlags(BulletBody obj, CollisionFlags flags)
+ {
+ BulletBodyUnman bodyu = obj as BulletBodyUnman;
+ return BSAPICPP.RemoveFromCollisionFlags2(bodyu.ptr, flags);
+ }
+
+ public override float GetCcdMotionThreshold(BulletBody obj)
+ {
+ BulletBodyUnman bodyu = obj as BulletBodyUnman;
+ return BSAPICPP.GetCcdMotionThreshold2(bodyu.ptr);
+ }
+
+
+ public override void SetCcdMotionThreshold(BulletBody obj, float val)
+ {
+ BulletBodyUnman bodyu = obj as BulletBodyUnman;
+ BSAPICPP.SetCcdMotionThreshold2(bodyu.ptr, val);
+ }
+
+ public override float GetCcdSweptSphereRadius(BulletBody obj)
+ {
+ BulletBodyUnman bodyu = obj as BulletBodyUnman;
+ return BSAPICPP.GetCcdSweptSphereRadius2(bodyu.ptr);
+ }
+
+ public override void SetCcdSweptSphereRadius(BulletBody obj, float val)
+ {
+ BulletBodyUnman bodyu = obj as BulletBodyUnman;
+ BSAPICPP.SetCcdSweptSphereRadius2(bodyu.ptr, val);
+ }
+
+ public override IntPtr GetUserPointer(BulletBody obj)
+ {
+ BulletBodyUnman bodyu = obj as BulletBodyUnman;
+ return BSAPICPP.GetUserPointer2(bodyu.ptr);
+ }
+
+ public override void SetUserPointer(BulletBody obj, IntPtr val)
+ {
+ BulletBodyUnman bodyu = obj as BulletBodyUnman;
+ BSAPICPP.SetUserPointer2(bodyu.ptr, val);
+ }
+
+ // =====================================================================================
+ // btRigidBody entries
+ public override void ApplyGravity(BulletBody obj)
+ {
+ BulletBodyUnman bodyu = obj as BulletBodyUnman;
+ BSAPICPP.ApplyGravity2(bodyu.ptr);
+ }
+
+ public override void SetGravity(BulletBody obj, Vector3 val)
+ {
+ BulletBodyUnman bodyu = obj as BulletBodyUnman;
+ BSAPICPP.SetGravity2(bodyu.ptr, val);
+ }
+
+ public override Vector3 GetGravity(BulletBody obj)
+ {
+ BulletBodyUnman bodyu = obj as BulletBodyUnman;
+ return BSAPICPP.GetGravity2(bodyu.ptr);
+ }
+
+ public override void SetDamping(BulletBody obj, float lin_damping, float ang_damping)
+ {
+ BulletBodyUnman bodyu = obj as BulletBodyUnman;
+ BSAPICPP.SetDamping2(bodyu.ptr, lin_damping, ang_damping);
+ }
+
+ public override void SetLinearDamping(BulletBody obj, float lin_damping)
+ {
+ BulletBodyUnman bodyu = obj as BulletBodyUnman;
+ BSAPICPP.SetLinearDamping2(bodyu.ptr, lin_damping);
+ }
+
+ public override void SetAngularDamping(BulletBody obj, float ang_damping)
+ {
+ BulletBodyUnman bodyu = obj as BulletBodyUnman;
+ BSAPICPP.SetAngularDamping2(bodyu.ptr, ang_damping);
+ }
+
+ public override float GetLinearDamping(BulletBody obj)
+ {
+ BulletBodyUnman bodyu = obj as BulletBodyUnman;
+ return BSAPICPP.GetLinearDamping2(bodyu.ptr);
+ }
+
+ public override float GetAngularDamping(BulletBody obj)
+ {
+ BulletBodyUnman bodyu = obj as BulletBodyUnman;
+ return BSAPICPP.GetAngularDamping2(bodyu.ptr);
+ }
+
+ public override float GetLinearSleepingThreshold(BulletBody obj)
+ {
+ BulletBodyUnman bodyu = obj as BulletBodyUnman;
+ return BSAPICPP.GetLinearSleepingThreshold2(bodyu.ptr);
+ }
+
+ public override void ApplyDamping(BulletBody obj, float timeStep)
+ {
+ BulletBodyUnman bodyu = obj as BulletBodyUnman;
+ BSAPICPP.ApplyDamping2(bodyu.ptr, timeStep);
+ }
+
+ public override void SetMassProps(BulletBody obj, float mass, Vector3 inertia)
+ {
+ BulletBodyUnman bodyu = obj as BulletBodyUnman;
+ BSAPICPP.SetMassProps2(bodyu.ptr, mass, inertia);
+ }
+
+ public override Vector3 GetLinearFactor(BulletBody obj)
+ {
+ BulletBodyUnman bodyu = obj as BulletBodyUnman;
+ return BSAPICPP.GetLinearFactor2(bodyu.ptr);
+ }
+
+ public override void SetLinearFactor(BulletBody obj, Vector3 factor)
+ {
+ BulletBodyUnman bodyu = obj as BulletBodyUnman;
+ BSAPICPP.SetLinearFactor2(bodyu.ptr, factor);
+ }
+
+ public override void SetCenterOfMassByPosRot(BulletBody obj, Vector3 pos, Quaternion rot)
+ {
+ BulletBodyUnman bodyu = obj as BulletBodyUnman;
+ BSAPICPP.SetCenterOfMassByPosRot2(bodyu.ptr, pos, rot);
+ }
+
+ // Add a force to the object as if its mass is one.
+ // Deep down in Bullet: m_totalForce += force*m_linearFactor;
+ public override void ApplyCentralForce(BulletBody obj, Vector3 force)
+ {
+ BulletBodyUnman bodyu = obj as BulletBodyUnman;
+ BSAPICPP.ApplyCentralForce2(bodyu.ptr, force);
+ }
+
+ // Set the force being applied to the object as if its mass is one.
+ public override void SetObjectForce(BulletBody obj, Vector3 force)
+ {
+ BulletBodyUnman bodyu = obj as BulletBodyUnman;
+ BSAPICPP.SetObjectForce2(bodyu.ptr, force);
+ }
+
+ public override Vector3 GetTotalForce(BulletBody obj)
+ {
+ BulletBodyUnman bodyu = obj as BulletBodyUnman;
+ return BSAPICPP.GetTotalForce2(bodyu.ptr);
+ }
+
+ public override Vector3 GetTotalTorque(BulletBody obj)
+ {
+ BulletBodyUnman bodyu = obj as BulletBodyUnman;
+ return BSAPICPP.GetTotalTorque2(bodyu.ptr);
+ }
+
+ public override Vector3 GetInvInertiaDiagLocal(BulletBody obj)
+ {
+ BulletBodyUnman bodyu = obj as BulletBodyUnman;
+ return BSAPICPP.GetInvInertiaDiagLocal2(bodyu.ptr);
+ }
+
+ public override void SetInvInertiaDiagLocal(BulletBody obj, Vector3 inert)
+ {
+ BulletBodyUnman bodyu = obj as BulletBodyUnman;
+ BSAPICPP.SetInvInertiaDiagLocal2(bodyu.ptr, inert);
+ }
+
+ public override void SetSleepingThresholds(BulletBody obj, float lin_threshold, float ang_threshold)
+ {
+ BulletBodyUnman bodyu = obj as BulletBodyUnman;
+ BSAPICPP.SetSleepingThresholds2(bodyu.ptr, lin_threshold, ang_threshold);
+ }
+
+ // Deep down in Bullet: m_totalTorque += torque*m_angularFactor;
+ public override void ApplyTorque(BulletBody obj, Vector3 torque)
+ {
+ BulletBodyUnman bodyu = obj as BulletBodyUnman;
+ BSAPICPP.ApplyTorque2(bodyu.ptr, torque);
+ }
+
+ // Apply force at the given point. Will add torque to the object.
+ // Deep down in Bullet: applyCentralForce(force);
+ // applyTorque(rel_pos.cross(force*m_linearFactor));
+ public override void ApplyForce(BulletBody obj, Vector3 force, Vector3 pos)
+ {
+ BulletBodyUnman bodyu = obj as BulletBodyUnman;
+ BSAPICPP.ApplyForce2(bodyu.ptr, force, pos);
+ }
+
+ // Apply impulse to the object. Same as "ApplycentralForce" but force scaled by object's mass.
+ // Deep down in Bullet: m_linearVelocity += impulse *m_linearFactor * m_inverseMass;
+ public override void ApplyCentralImpulse(BulletBody obj, Vector3 imp)
+ {
+ BulletBodyUnman bodyu = obj as BulletBodyUnman;
+ BSAPICPP.ApplyCentralImpulse2(bodyu.ptr, imp);
+ }
+
+ // Apply impulse to the object's torque. Force is scaled by object's mass.
+ // Deep down in Bullet: m_angularVelocity += m_invInertiaTensorWorld * torque * m_angularFactor;
+ public override void ApplyTorqueImpulse(BulletBody obj, Vector3 imp)
+ {
+ BulletBodyUnman bodyu = obj as BulletBodyUnman;
+ BSAPICPP.ApplyTorqueImpulse2(bodyu.ptr, imp);
+ }
+
+ // Apply impulse at the point given. For is scaled by object's mass and effects both linear and angular forces.
+ // Deep down in Bullet: applyCentralImpulse(impulse);
+ // applyTorqueImpulse(rel_pos.cross(impulse*m_linearFactor));
+ public override void ApplyImpulse(BulletBody obj, Vector3 imp, Vector3 pos)
+ {
+ BulletBodyUnman bodyu = obj as BulletBodyUnman;
+ BSAPICPP.ApplyImpulse2(bodyu.ptr, imp, pos);
+ }
+
+ public override void ClearForces(BulletBody obj)
+ {
+ BulletBodyUnman bodyu = obj as BulletBodyUnman;
+ BSAPICPP.ClearForces2(bodyu.ptr);
+ }
+
+ public override void ClearAllForces(BulletBody obj)
+ {
+ BulletBodyUnman bodyu = obj as BulletBodyUnman;
+ BSAPICPP.ClearAllForces2(bodyu.ptr);
+ }
+
+ public override void UpdateInertiaTensor(BulletBody obj)
+ {
+ BulletBodyUnman bodyu = obj as BulletBodyUnman;
+ BSAPICPP.UpdateInertiaTensor2(bodyu.ptr);
+ }
+
+ public override Vector3 GetLinearVelocity(BulletBody obj)
+ {
+ BulletBodyUnman bodyu = obj as BulletBodyUnman;
+ return BSAPICPP.GetLinearVelocity2(bodyu.ptr);
+ }
+
+ public override Vector3 GetAngularVelocity(BulletBody obj)
+ {
+ BulletBodyUnman bodyu = obj as BulletBodyUnman;
+ return BSAPICPP.GetAngularVelocity2(bodyu.ptr);
+ }
+
+ public override void SetLinearVelocity(BulletBody obj, Vector3 vel)
+ {
+ BulletBodyUnman bodyu = obj as BulletBodyUnman;
+ BSAPICPP.SetLinearVelocity2(bodyu.ptr, vel);
+ }
+
+ public override void SetAngularVelocity(BulletBody obj, Vector3 angularVelocity)
+ {
+ BulletBodyUnman bodyu = obj as BulletBodyUnman;
+ BSAPICPP.SetAngularVelocity2(bodyu.ptr, angularVelocity);
+ }
+
+ public override Vector3 GetVelocityInLocalPoint(BulletBody obj, Vector3 pos)
+ {
+ BulletBodyUnman bodyu = obj as BulletBodyUnman;
+ return BSAPICPP.GetVelocityInLocalPoint2(bodyu.ptr, pos);
+ }
+
+ public override void Translate(BulletBody obj, Vector3 trans)
+ {
+ BulletBodyUnman bodyu = obj as BulletBodyUnman;
+ BSAPICPP.Translate2(bodyu.ptr, trans);
+ }
+
+ public override void UpdateDeactivation(BulletBody obj, float timeStep)
+ {
+ BulletBodyUnman bodyu = obj as BulletBodyUnman;
+ BSAPICPP.UpdateDeactivation2(bodyu.ptr, timeStep);
+ }
+
+ public override bool WantsSleeping(BulletBody obj)
+ {
+ BulletBodyUnman bodyu = obj as BulletBodyUnman;
+ return BSAPICPP.WantsSleeping2(bodyu.ptr);
+ }
+
+ public override void SetAngularFactor(BulletBody obj, float factor)
+ {
+ BulletBodyUnman bodyu = obj as BulletBodyUnman;
+ BSAPICPP.SetAngularFactor2(bodyu.ptr, factor);
+ }
+
+ public override void SetAngularFactorV(BulletBody obj, Vector3 factor)
+ {
+ BulletBodyUnman bodyu = obj as BulletBodyUnman;
+ BSAPICPP.SetAngularFactorV2(bodyu.ptr, factor);
+ }
+
+ public override Vector3 GetAngularFactor(BulletBody obj)
+ {
+ BulletBodyUnman bodyu = obj as BulletBodyUnman;
+ return BSAPICPP.GetAngularFactor2(bodyu.ptr);
+ }
+
+ public override bool IsInWorld(BulletWorld world, BulletBody obj)
+ {
+ BulletBodyUnman bodyu = obj as BulletBodyUnman;
+ return BSAPICPP.IsInWorld2(bodyu.ptr);
+ }
+
+ public override void AddConstraintRef(BulletBody obj, BulletConstraint constrain)
+ {
+ BulletBodyUnman bodyu = obj as BulletBodyUnman;
+ BulletConstraintUnman constrainu = constrain as BulletConstraintUnman;
+ BSAPICPP.AddConstraintRef2(bodyu.ptr, constrainu.ptr);
+ }
+
+ public override void RemoveConstraintRef(BulletBody obj, BulletConstraint constrain)
+ {
+ BulletBodyUnman bodyu = obj as BulletBodyUnman;
+ BulletConstraintUnman constrainu = constrain as BulletConstraintUnman;
+ BSAPICPP.RemoveConstraintRef2(bodyu.ptr, constrainu.ptr);
+ }
+
+ public override BulletConstraint GetConstraintRef(BulletBody obj, int index)
+ {
+ BulletBodyUnman bodyu = obj as BulletBodyUnman;
+ return new BulletConstraintUnman(BSAPICPP.GetConstraintRef2(bodyu.ptr, index));
+ }
+
+ public override int GetNumConstraintRefs(BulletBody obj)
+ {
+ BulletBodyUnman bodyu = obj as BulletBodyUnman;
+ return BSAPICPP.GetNumConstraintRefs2(bodyu.ptr);
+ }
+
+ public override bool SetCollisionGroupMask(BulletBody body, uint filter, uint mask)
+ {
+ BulletBodyUnman bodyu = body as BulletBodyUnman;
+ return BSAPICPP.SetCollisionGroupMask2(bodyu.ptr, filter, mask);
+ }
+
+ // =====================================================================================
+ // btCollisionShape entries
+
+ public override float GetAngularMotionDisc(BulletShape shape)
+ {
+ BulletShapeUnman shapeu = shape as BulletShapeUnman;
+ return BSAPICPP.GetAngularMotionDisc2(shapeu.ptr);
+ }
+
+ public override float GetContactBreakingThreshold(BulletShape shape, float defaultFactor)
+ {
+ BulletShapeUnman shapeu = shape as BulletShapeUnman;
+ return BSAPICPP.GetContactBreakingThreshold2(shapeu.ptr, defaultFactor);
+ }
+
+ public override bool IsPolyhedral(BulletShape shape)
+ {
+ BulletShapeUnman shapeu = shape as BulletShapeUnman;
+ return BSAPICPP.IsPolyhedral2(shapeu.ptr);
+ }
+
+ public override bool IsConvex2d(BulletShape shape)
+ {
+ BulletShapeUnman shapeu = shape as BulletShapeUnman;
+ return BSAPICPP.IsConvex2d2(shapeu.ptr);
+ }
+
+ public override bool IsConvex(BulletShape shape)
+ {
+ BulletShapeUnman shapeu = shape as BulletShapeUnman;
+ return BSAPICPP.IsConvex2(shapeu.ptr);
+ }
+
+ public override bool IsNonMoving(BulletShape shape)
+ {
+ BulletShapeUnman shapeu = shape as BulletShapeUnman;
+ return BSAPICPP.IsNonMoving2(shapeu.ptr);
+ }
+
+ public override bool IsConcave(BulletShape shape)
+ {
+ BulletShapeUnman shapeu = shape as BulletShapeUnman;
+ return BSAPICPP.IsConcave2(shapeu.ptr);
+ }
+
+ public override bool IsCompound(BulletShape shape)
+ {
+ BulletShapeUnman shapeu = shape as BulletShapeUnman;
+ return BSAPICPP.IsCompound2(shapeu.ptr);
+ }
+
+ public override bool IsSoftBody(BulletShape shape)
+ {
+ BulletShapeUnman shapeu = shape as BulletShapeUnman;
+ return BSAPICPP.IsSoftBody2(shapeu.ptr);
+ }
+
+ public override bool IsInfinite(BulletShape shape)
+ {
+ BulletShapeUnman shapeu = shape as BulletShapeUnman;
+ return BSAPICPP.IsInfinite2(shapeu.ptr);
+ }
+
+ public override void SetLocalScaling(BulletShape shape, Vector3 scale)
+ {
+ BulletShapeUnman shapeu = shape as BulletShapeUnman;
+ BSAPICPP.SetLocalScaling2(shapeu.ptr, scale);
+ }
+
+ public override Vector3 GetLocalScaling(BulletShape shape)
+ {
+ BulletShapeUnman shapeu = shape as BulletShapeUnman;
+ return BSAPICPP.GetLocalScaling2(shapeu.ptr);
+ }
+
+ public override Vector3 CalculateLocalInertia(BulletShape shape, float mass)
+ {
+ BulletShapeUnman shapeu = shape as BulletShapeUnman;
+ return BSAPICPP.CalculateLocalInertia2(shapeu.ptr, mass);
+ }
+
+ public override int GetShapeType(BulletShape shape)
+ {
+ BulletShapeUnman shapeu = shape as BulletShapeUnman;
+ return BSAPICPP.GetShapeType2(shapeu.ptr);
+ }
+
+ public override void SetMargin(BulletShape shape, float val)
+ {
+ BulletShapeUnman shapeu = shape as BulletShapeUnman;
+ BSAPICPP.SetMargin2(shapeu.ptr, val);
+ }
+
+ public override float GetMargin(BulletShape shape)
+ {
+ BulletShapeUnman shapeu = shape as BulletShapeUnman;
+ return BSAPICPP.GetMargin2(shapeu.ptr);
+ }
+
+ // =====================================================================================
+ // Raycast
+ public override SweepHit ConvexSweepTest2(BulletWorld world, BulletBody sweepObject, Vector3 from, Vector3 to, float margin) {
+ BulletWorldUnman worldu = world as BulletWorldUnman;
+ BulletBodyUnman bodyu = sweepObject as BulletBodyUnman;
+ return BSAPICPP.ConvexSweepTest2(worldu.ptr, bodyu.ptr, from, to, margin);
+ }
+
+ public override RaycastHit RayTest2(BulletWorld world, Vector3 from, Vector3 to, uint filterGroup, uint filterMask) {
+ BulletWorldUnman worldu = world as BulletWorldUnman;
+ return BSAPICPP.RayTest2(worldu.ptr, from, to, filterGroup, filterMask);
+ }
+
+ // =====================================================================================
+ // Debugging
+ public override void DumpRigidBody(BulletWorld world, BulletBody collisionObject)
+ {
+ BulletWorldUnman worldu = world as BulletWorldUnman;
+ BulletBodyUnman bodyu = collisionObject as BulletBodyUnman;
+ BSAPICPP.DumpRigidBody2(worldu.ptr, bodyu.ptr);
+ }
+
+ public override void DumpCollisionShape(BulletWorld world, BulletShape collisionShape)
+ {
+ BulletWorldUnman worldu = world as BulletWorldUnman;
+ BulletShapeUnman shapeu = collisionShape as BulletShapeUnman;
+ BSAPICPP.DumpCollisionShape2(worldu.ptr, shapeu.ptr);
+ }
+
+ public override void DumpConstraint(BulletWorld world, BulletConstraint constrain)
+ {
+ BulletWorldUnman worldu = world as BulletWorldUnman;
+ BulletConstraintUnman constrainu = constrain as BulletConstraintUnman;
+ BSAPICPP.DumpConstraint2(worldu.ptr, constrainu.ptr);
+ }
+
+ public override void DumpActivationInfo(BulletWorld world)
+ {
+ BulletWorldUnman worldu = world as BulletWorldUnman;
+ BSAPICPP.DumpActivationInfo2(worldu.ptr);
+ }
+
+ public override void DumpAllInfo(BulletWorld world)
+ {
+ BulletWorldUnman worldu = world as BulletWorldUnman;
+ BSAPICPP.DumpAllInfo2(worldu.ptr);
+ }
+
+ public override void DumpPhysicsStatistics(BulletWorld world)
+ {
+ BulletWorldUnman worldu = world as BulletWorldUnman;
+ BSAPICPP.DumpPhysicsStatistics2(worldu.ptr);
+ }
+ public override void ResetBroadphasePool(BulletWorld world)
+ {
+ BulletWorldUnman worldu = world as BulletWorldUnman;
+ BSAPICPP.ResetBroadphasePool(worldu.ptr);
+ }
+ public override void ResetConstraintSolver(BulletWorld world)
+ {
+ BulletWorldUnman worldu = world as BulletWorldUnman;
+ BSAPICPP.ResetConstraintSolver(worldu.ptr);
+ }
+
+ // =====================================================================================
+ // =====================================================================================
+ // =====================================================================================
+ // =====================================================================================
+ // =====================================================================================
+ // The actual interface to the unmanaged code
+ static class BSAPICPP
+ {
+ // ===============================================================================
+ // Link back to the managed code for outputting log messages
+ [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
+ public delegate void DebugLogCallback([MarshalAs(UnmanagedType.LPStr)]string msg);
+
+ // ===============================================================================
+ // Initialization and simulation
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern IntPtr Initialize2(Vector3 maxPosition, IntPtr parms,
+ int maxCollisions, IntPtr collisionArray,
+ int maxUpdates, IntPtr updateArray,
+ DebugLogCallback logRoutine);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern int PhysicsStep2(IntPtr world, float timeStep, int maxSubSteps, float fixedTimeStep,
+ out int updatedEntityCount, out int collidersCount);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern void Shutdown2(IntPtr sim);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern bool PushUpdate2(IntPtr obj);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern bool UpdateParameter2(IntPtr world, uint localID, String parm, float value);
+
+ // =====================================================================================
+ // Mesh, hull, shape and body creation helper routines
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern IntPtr CreateMeshShape2(IntPtr world,
+ int indicesCount, [MarshalAs(UnmanagedType.LPArray)] int[] indices,
+ int verticesCount, [MarshalAs(UnmanagedType.LPArray)] float[] vertices );
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern IntPtr CreateGImpactShape2(IntPtr world,
+ int indicesCount, [MarshalAs(UnmanagedType.LPArray)] int[] indices,
+ int verticesCount, [MarshalAs(UnmanagedType.LPArray)] float[] vertices );
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern IntPtr CreateHullShape2(IntPtr world,
+ int hullCount, [MarshalAs(UnmanagedType.LPArray)] float[] hulls);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern IntPtr BuildHullShapeFromMesh2(IntPtr world, IntPtr meshShape, HACDParams parms);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern IntPtr BuildConvexHullShapeFromMesh2(IntPtr world, IntPtr meshShape);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern IntPtr CreateConvexHullShape2(IntPtr world,
+ int indicesCount, [MarshalAs(UnmanagedType.LPArray)] int[] indices,
+ int verticesCount, [MarshalAs(UnmanagedType.LPArray)] float[] vertices );
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern IntPtr BuildNativeShape2(IntPtr world, ShapeData shapeData);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern bool IsNativeShape2(IntPtr shape);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern void SetShapeCollisionMargin(IntPtr shape, float margin);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern IntPtr BuildCapsuleShape2(IntPtr world, float radius, float height, Vector3 scale);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern IntPtr CreateCompoundShape2(IntPtr sim, bool enableDynamicAabbTree);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern int GetNumberOfCompoundChildren2(IntPtr cShape);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern void AddChildShapeToCompoundShape2(IntPtr cShape, IntPtr addShape, Vector3 pos, Quaternion rot);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern IntPtr GetChildShapeFromCompoundShapeIndex2(IntPtr cShape, int indx);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern IntPtr RemoveChildShapeFromCompoundShapeIndex2(IntPtr cShape, int indx);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern void RemoveChildShapeFromCompoundShape2(IntPtr cShape, IntPtr removeShape);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern void UpdateChildTransform2(IntPtr pShape, int childIndex, Vector3 pos, Quaternion rot, bool shouldRecalculateLocalAabb);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern void RecalculateCompoundShapeLocalAabb2(IntPtr cShape);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern IntPtr DuplicateCollisionShape2(IntPtr sim, IntPtr srcShape, uint id);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern bool DeleteCollisionShape2(IntPtr world, IntPtr shape);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern int GetBodyType2(IntPtr obj);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern IntPtr CreateBodyFromShape2(IntPtr sim, IntPtr shape, uint id, Vector3 pos, Quaternion rot);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern IntPtr CreateBodyWithDefaultMotionState2(IntPtr shape, uint id, Vector3 pos, Quaternion rot);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern IntPtr CreateGhostFromShape2(IntPtr sim, IntPtr shape, uint id, Vector3 pos, Quaternion rot);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern void DestroyObject2(IntPtr sim, IntPtr obj);
+
+ // =====================================================================================
+ // Terrain creation and helper routines
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern IntPtr CreateGroundPlaneShape2(uint id, float height, float collisionMargin);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern IntPtr CreateTerrainShape2(uint id, Vector3 size, float minHeight, float maxHeight,
+ [MarshalAs(UnmanagedType.LPArray)] float[] heightMap,
+ float scaleFactor, float collisionMargin);
+
+ // =====================================================================================
+ // Constraint creation and helper routines
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern IntPtr Create6DofConstraint2(IntPtr world, IntPtr obj1, IntPtr obj2,
+ Vector3 frame1loc, Quaternion frame1rot,
+ Vector3 frame2loc, Quaternion frame2rot,
+ bool useLinearReferenceFrameA, bool disableCollisionsBetweenLinkedBodies);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern IntPtr Create6DofConstraintToPoint2(IntPtr world, IntPtr obj1, IntPtr obj2,
+ Vector3 joinPoint,
+ bool useLinearReferenceFrameA, bool disableCollisionsBetweenLinkedBodies);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern IntPtr Create6DofConstraintFixed2(IntPtr world, IntPtr obj1,
+ Vector3 frameInBloc, Quaternion frameInBrot,
+ bool useLinearReferenceFrameB, bool disableCollisionsBetweenLinkedBodies);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern IntPtr Create6DofSpringConstraint2(IntPtr world, IntPtr obj1, IntPtr obj2,
+ Vector3 frame1loc, Quaternion frame1rot,
+ Vector3 frame2loc, Quaternion frame2rot,
+ bool useLinearReferenceFrameA, bool disableCollisionsBetweenLinkedBodies);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern IntPtr CreateHingeConstraint2(IntPtr world, IntPtr obj1, IntPtr obj2,
+ Vector3 pivotinA, Vector3 pivotinB,
+ Vector3 axisInA, Vector3 axisInB,
+ bool useLinearReferenceFrameA, bool disableCollisionsBetweenLinkedBodies);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern IntPtr CreateSliderConstraint2(IntPtr world, IntPtr obj1, IntPtr obj2,
+ Vector3 frameInAloc, Quaternion frameInArot,
+ Vector3 frameInBloc, Quaternion frameInBrot,
+ bool useLinearReferenceFrameA, bool disableCollisionsBetweenLinkedBodies);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern IntPtr CreateConeTwistConstraint2(IntPtr world, IntPtr obj1, IntPtr obj2,
+ Vector3 frameInAloc, Quaternion frameInArot,
+ Vector3 frameInBloc, Quaternion frameInBrot,
+ bool disableCollisionsBetweenLinkedBodies);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern IntPtr CreateGearConstraint2(IntPtr world, IntPtr obj1, IntPtr obj2,
+ Vector3 axisInA, Vector3 axisInB,
+ float ratio, bool disableCollisionsBetweenLinkedBodies);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern IntPtr CreatePoint2PointConstraint2(IntPtr world, IntPtr obj1, IntPtr obj2,
+ Vector3 pivotInA, Vector3 pivotInB,
+ bool disableCollisionsBetweenLinkedBodies);
+
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern void SetConstraintEnable2(IntPtr constrain, float numericTrueFalse);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern void SetConstraintNumSolverIterations2(IntPtr constrain, float iterations);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern bool SetFrames2(IntPtr constrain,
+ Vector3 frameA, Quaternion frameArot, Vector3 frameB, Quaternion frameBrot);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern bool SetLinearLimits2(IntPtr constrain, Vector3 low, Vector3 hi);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern bool SetAngularLimits2(IntPtr constrain, Vector3 low, Vector3 hi);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern bool UseFrameOffset2(IntPtr constrain, float enable);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern bool TranslationalLimitMotor2(IntPtr constrain, float enable, float targetVel, float maxMotorForce);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern bool SetBreakingImpulseThreshold2(IntPtr constrain, float threshold);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern bool HingeSetLimits2(IntPtr constrain, float low, float high, float softness, float bias, float relaxation);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern bool ConstraintSpringEnable2(IntPtr constrain, int index, float numericTrueFalse);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern bool ConstraintSpringSetEquilibriumPoint2(IntPtr constrain, int index, float equilibriumPoint);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern bool ConstraintSpringSetStiffness2(IntPtr constrain, int index, float stiffness);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern bool ConstraintSpringSetDamping2(IntPtr constrain, int index, float damping);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern bool SliderSetLimits2(IntPtr constrain, int lowerUpper, int linAng, float val);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern bool SliderSet2(IntPtr constrain, int softRestDamp, int dirLimOrtho, int linAng, float val);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern bool SliderMotorEnable2(IntPtr constrain, int linAng, float numericTrueFalse);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern bool SliderMotor2(IntPtr constrain, int forceVel, int linAng, float val);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern bool CalculateTransforms2(IntPtr constrain);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern bool SetConstraintParam2(IntPtr constrain, ConstraintParams paramIndex, float value, ConstraintParamAxis axis);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern bool DestroyConstraint2(IntPtr world, IntPtr constrain);
+
+ // =====================================================================================
+ // btCollisionWorld entries
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern void UpdateSingleAabb2(IntPtr world, IntPtr obj);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern void UpdateAabbs2(IntPtr world);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern bool GetForceUpdateAllAabbs2(IntPtr world);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern void SetForceUpdateAllAabbs2(IntPtr world, bool force);
+
+ // =====================================================================================
+ // btDynamicsWorld entries
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern bool AddObjectToWorld2(IntPtr world, IntPtr obj);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern bool RemoveObjectFromWorld2(IntPtr world, IntPtr obj);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern bool ClearCollisionProxyCache2(IntPtr world, IntPtr obj);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern bool AddConstraintToWorld2(IntPtr world, IntPtr constrain, bool disableCollisionsBetweenLinkedObjects);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern bool RemoveConstraintFromWorld2(IntPtr world, IntPtr constrain);
+ // =====================================================================================
+ // btCollisionObject entries
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern Vector3 GetAnisotripicFriction2(IntPtr constrain);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern Vector3 SetAnisotripicFriction2(IntPtr constrain, Vector3 frict);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern bool HasAnisotripicFriction2(IntPtr constrain);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern void SetContactProcessingThreshold2(IntPtr obj, float val);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern float GetContactProcessingThreshold2(IntPtr obj);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern bool IsStaticObject2(IntPtr obj);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern bool IsKinematicObject2(IntPtr obj);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern bool IsStaticOrKinematicObject2(IntPtr obj);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern bool HasContactResponse2(IntPtr obj);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern void SetCollisionShape2(IntPtr sim, IntPtr obj, IntPtr shape);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern IntPtr GetCollisionShape2(IntPtr obj);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern int GetActivationState2(IntPtr obj);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern void SetActivationState2(IntPtr obj, int state);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern void SetDeactivationTime2(IntPtr obj, float dtime);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern float GetDeactivationTime2(IntPtr obj);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern void ForceActivationState2(IntPtr obj, ActivationState state);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern void Activate2(IntPtr obj, bool forceActivation);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern bool IsActive2(IntPtr obj);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern void SetRestitution2(IntPtr obj, float val);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern float GetRestitution2(IntPtr obj);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern void SetFriction2(IntPtr obj, float val);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern float GetFriction2(IntPtr obj);
+
+ /* Haven't defined the type 'Transform'
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern Transform GetWorldTransform2(IntPtr obj);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern void setWorldTransform2(IntPtr obj, Transform trans);
+ */
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern Vector3 GetPosition2(IntPtr obj);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern Quaternion GetOrientation2(IntPtr obj);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern void SetTranslation2(IntPtr obj, Vector3 position, Quaternion rotation);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern IntPtr GetBroadphaseHandle2(IntPtr obj);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern void SetBroadphaseHandle2(IntPtr obj, IntPtr handle);
+
+ /*
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern Transform GetInterpolationWorldTransform2(IntPtr obj);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern void SetInterpolationWorldTransform2(IntPtr obj, Transform trans);
+ */
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern void SetInterpolationLinearVelocity2(IntPtr obj, Vector3 vel);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern void SetInterpolationAngularVelocity2(IntPtr obj, Vector3 vel);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern void SetInterpolationVelocity2(IntPtr obj, Vector3 linearVel, Vector3 angularVel);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern float GetHitFraction2(IntPtr obj);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern void SetHitFraction2(IntPtr obj, float val);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern CollisionFlags GetCollisionFlags2(IntPtr obj);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern CollisionFlags SetCollisionFlags2(IntPtr obj, CollisionFlags flags);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern CollisionFlags AddToCollisionFlags2(IntPtr obj, CollisionFlags flags);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern CollisionFlags RemoveFromCollisionFlags2(IntPtr obj, CollisionFlags flags);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern float GetCcdMotionThreshold2(IntPtr obj);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern void SetCcdMotionThreshold2(IntPtr obj, float val);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern float GetCcdSweptSphereRadius2(IntPtr obj);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern void SetCcdSweptSphereRadius2(IntPtr obj, float val);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern IntPtr GetUserPointer2(IntPtr obj);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern void SetUserPointer2(IntPtr obj, IntPtr val);
+
+ // =====================================================================================
+ // btRigidBody entries
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern void ApplyGravity2(IntPtr obj);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern void SetGravity2(IntPtr obj, Vector3 val);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern Vector3 GetGravity2(IntPtr obj);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern void SetDamping2(IntPtr obj, float lin_damping, float ang_damping);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern void SetLinearDamping2(IntPtr obj, float lin_damping);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern void SetAngularDamping2(IntPtr obj, float ang_damping);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern float GetLinearDamping2(IntPtr obj);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern float GetAngularDamping2(IntPtr obj);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern float GetLinearSleepingThreshold2(IntPtr obj);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern float GetAngularSleepingThreshold2(IntPtr obj);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern void ApplyDamping2(IntPtr obj, float timeStep);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern void SetMassProps2(IntPtr obj, float mass, Vector3 inertia);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern Vector3 GetLinearFactor2(IntPtr obj);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern void SetLinearFactor2(IntPtr obj, Vector3 factor);
+
+ /*
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern void SetCenterOfMassTransform2(IntPtr obj, Transform trans);
+ */
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern void SetCenterOfMassByPosRot2(IntPtr obj, Vector3 pos, Quaternion rot);
+
+ // Add a force to the object as if its mass is one.
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern void ApplyCentralForce2(IntPtr obj, Vector3 force);
+
+ // Set the force being applied to the object as if its mass is one.
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern void SetObjectForce2(IntPtr obj, Vector3 force);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern Vector3 GetTotalForce2(IntPtr obj);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern Vector3 GetTotalTorque2(IntPtr obj);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern Vector3 GetInvInertiaDiagLocal2(IntPtr obj);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern void SetInvInertiaDiagLocal2(IntPtr obj, Vector3 inert);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern void SetSleepingThresholds2(IntPtr obj, float lin_threshold, float ang_threshold);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern void ApplyTorque2(IntPtr obj, Vector3 torque);
+
+ // Apply force at the given point. Will add torque to the object.
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern void ApplyForce2(IntPtr obj, Vector3 force, Vector3 pos);
+
+ // Apply impulse to the object. Same as "ApplycentralForce" but force scaled by object's mass.
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern void ApplyCentralImpulse2(IntPtr obj, Vector3 imp);
+
+ // Apply impulse to the object's torque. Force is scaled by object's mass.
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern void ApplyTorqueImpulse2(IntPtr obj, Vector3 imp);
+
+ // Apply impulse at the point given. For is scaled by object's mass and effects both linear and angular forces.
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern void ApplyImpulse2(IntPtr obj, Vector3 imp, Vector3 pos);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern void ClearForces2(IntPtr obj);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern void ClearAllForces2(IntPtr obj);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern void UpdateInertiaTensor2(IntPtr obj);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern Vector3 GetCenterOfMassPosition2(IntPtr obj);
+
+ /*
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern Transform GetCenterOfMassTransform2(IntPtr obj);
+ */
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern Vector3 GetLinearVelocity2(IntPtr obj);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern Vector3 GetAngularVelocity2(IntPtr obj);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern void SetLinearVelocity2(IntPtr obj, Vector3 val);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern void SetAngularVelocity2(IntPtr obj, Vector3 angularVelocity);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern Vector3 GetVelocityInLocalPoint2(IntPtr obj, Vector3 pos);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern void Translate2(IntPtr obj, Vector3 trans);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern void UpdateDeactivation2(IntPtr obj, float timeStep);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern bool WantsSleeping2(IntPtr obj);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern void SetAngularFactor2(IntPtr obj, float factor);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern void SetAngularFactorV2(IntPtr obj, Vector3 factor);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern Vector3 GetAngularFactor2(IntPtr obj);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern bool IsInWorld2(IntPtr obj);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern void AddConstraintRef2(IntPtr obj, IntPtr constrain);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern void RemoveConstraintRef2(IntPtr obj, IntPtr constrain);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern IntPtr GetConstraintRef2(IntPtr obj, int index);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern int GetNumConstraintRefs2(IntPtr obj);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern bool SetCollisionGroupMask2(IntPtr body, uint filter, uint mask);
+
+ // =====================================================================================
+ // btCollisionShape entries
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern float GetAngularMotionDisc2(IntPtr shape);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern float GetContactBreakingThreshold2(IntPtr shape, float defaultFactor);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern bool IsPolyhedral2(IntPtr shape);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern bool IsConvex2d2(IntPtr shape);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern bool IsConvex2(IntPtr shape);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern bool IsNonMoving2(IntPtr shape);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern bool IsConcave2(IntPtr shape);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern bool IsCompound2(IntPtr shape);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern bool IsSoftBody2(IntPtr shape);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern bool IsInfinite2(IntPtr shape);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern void SetLocalScaling2(IntPtr shape, Vector3 scale);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern Vector3 GetLocalScaling2(IntPtr shape);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern Vector3 CalculateLocalInertia2(IntPtr shape, float mass);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern int GetShapeType2(IntPtr shape);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern void SetMargin2(IntPtr shape, float val);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern float GetMargin2(IntPtr shape);
+
+
+ // =====================================================================================
+ // Raycast
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern SweepHit ConvexSweepTest2(IntPtr sim, IntPtr obj, Vector3 from, Vector3 to, float margin);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern RaycastHit RayTest2(IntPtr sim, Vector3 from, Vector3 to, uint filterGroup, uint filterMask);
+
+ // =====================================================================================
+ // Debugging
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern void DumpRigidBody2(IntPtr sim, IntPtr collisionObject);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern void DumpCollisionShape2(IntPtr sim, IntPtr collisionShape);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern void DumpMapInfo2(IntPtr sim, IntPtr manInfo);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern void DumpConstraint2(IntPtr sim, IntPtr constrain);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern void DumpActivationInfo2(IntPtr sim);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern void DumpAllInfo2(IntPtr sim);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern void DumpPhysicsStatistics2(IntPtr sim);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern void ResetBroadphasePool(IntPtr sim);
+
+ [DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
+ public static extern void ResetConstraintSolver(IntPtr sim);
+
+ }
}
}
-
-private sealed class BulletBodyUnman : BulletBody
-{
- public IntPtr ptr;
- public BulletBodyUnman(uint id, IntPtr xx)
- : base(id)
- {
- ptr = xx;
- }
- public override bool HasPhysicalBody
- {
- get { return ptr != IntPtr.Zero; }
- }
- public override void Clear()
- {
- ptr = IntPtr.Zero;
- }
- public override string AddrString
- {
- get { return ptr.ToString("X"); }
- }
-}
-
-private sealed class BulletShapeUnman : BulletShape
-{
- public IntPtr ptr;
- public BulletShapeUnman(IntPtr xx, BSPhysicsShapeType typ)
- : base()
- {
- ptr = xx;
- shapeType = typ;
- }
- public override bool HasPhysicalShape
- {
- get { return ptr != IntPtr.Zero; }
- }
- public override void Clear()
- {
- ptr = IntPtr.Zero;
- }
- public override BulletShape Clone()
- {
- return new BulletShapeUnman(ptr, shapeType);
- }
- public override bool ReferenceSame(BulletShape other)
- {
- BulletShapeUnman otheru = other as BulletShapeUnman;
- return (otheru != null) && (this.ptr == otheru.ptr);
-
- }
- public override string AddrString
- {
- get { return ptr.ToString("X"); }
- }
-}
-private sealed class BulletConstraintUnman : BulletConstraint
-{
- public BulletConstraintUnman(IntPtr xx) : base()
- {
- ptr = xx;
- }
- public IntPtr ptr;
-
- public override void Clear()
- {
- ptr = IntPtr.Zero;
- }
- public override bool HasPhysicalConstraint { get { return ptr != IntPtr.Zero; } }
-
- // Used for log messages for a unique display of the memory/object allocated to this instance
- public override string AddrString
- {
- get { return ptr.ToString("X"); }
- }
-}
-
-// We pin the memory passed between the managed and unmanaged code.
-GCHandle m_paramsHandle;
-private GCHandle m_collisionArrayPinnedHandle;
-private GCHandle m_updateArrayPinnedHandle;
-
-// 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 BSAPICPP.DebugLogCallback m_DebugLogCallbackHandle;
-
-private BSScene PhysicsScene { get; set; }
-
-public override string BulletEngineName { get { return "BulletUnmanaged"; } }
-public override string BulletEngineVersion { get; protected set; }
-
-public BSAPIUnman(string paramName, BSScene physScene)
-{
- PhysicsScene = physScene;
-
- // Do something fancy with the paramName to get the right DLL implementation
- // like "Bullet-2.80-OpenCL-Intel" loading the version for Intel based OpenCL implementation, etc.
- if (Util.IsWindows())
- Util.LoadArchSpecificWindowsDll("BulletSim.dll");
- // If not Windows, loading is performed by the
- // Mono loader as specified in
- // "bin/Physics/OpenSim.Region.Physics.BulletSPlugin.dll.config".
-}
-
-// Initialization and simulation
-public override BulletWorld Initialize(Vector3 maxPosition, ConfigurationParameters parms,
- int maxCollisions, ref CollisionDesc[] collisionArray,
- int maxUpdates, ref EntityProperties[] updateArray
- )
-{
- // Pin down the memory that will be used to pass object collisions and updates back from unmanaged code
- m_paramsHandle = GCHandle.Alloc(parms, GCHandleType.Pinned);
- m_collisionArrayPinnedHandle = GCHandle.Alloc(collisionArray, GCHandleType.Pinned);
- m_updateArrayPinnedHandle = GCHandle.Alloc(updateArray, GCHandleType.Pinned);
-
- // If Debug logging level, enable logging from the unmanaged code
- m_DebugLogCallbackHandle = null;
- if (BSScene.m_log.IsDebugEnabled && PhysicsScene.PhysicsLogging.Enabled)
- {
- BSScene.m_log.DebugFormat("{0}: Initialize: Setting debug callback for unmanaged code", BSScene.LogHeader);
- if (PhysicsScene.PhysicsLogging.Enabled)
- // The handle is saved in a variable to make sure it doesn't get freed after this call
- m_DebugLogCallbackHandle = new BSAPICPP.DebugLogCallback(BulletLoggerPhysLog);
- else
- m_DebugLogCallbackHandle = new BSAPICPP.DebugLogCallback(BulletLogger);
- }
-
- // Get the version of the DLL
- // TODO: this doesn't work yet. Something wrong with marshaling the returned string.
- // BulletEngineVersion = BulletSimAPI.GetVersion2();
- BulletEngineVersion = "";
-
- // Call the unmanaged code with the buffers and other information
- return new BulletWorldUnman(0, PhysicsScene, BSAPICPP.Initialize2(maxPosition, m_paramsHandle.AddrOfPinnedObject(),
- maxCollisions, m_collisionArrayPinnedHandle.AddrOfPinnedObject(),
- maxUpdates, m_updateArrayPinnedHandle.AddrOfPinnedObject(),
- m_DebugLogCallbackHandle));
-
-}
-
-// Called directly from unmanaged code so don't do much
-private void BulletLogger(string msg)
-{
- BSScene.m_log.Debug("[BULLETS UNMANAGED]:" + msg);
-}
-
-// Called directly from unmanaged code so don't do much
-private void BulletLoggerPhysLog(string msg)
-{
- PhysicsScene.DetailLog("[BULLETS UNMANAGED]:" + msg);
-}
-
-public override int PhysicsStep(BulletWorld world, float timeStep, int maxSubSteps, float fixedTimeStep,
- out int updatedEntityCount, out int collidersCount)
-{
- BulletWorldUnman worldu = world as BulletWorldUnman;
- return BSAPICPP.PhysicsStep2(worldu.ptr, timeStep, maxSubSteps, fixedTimeStep, out updatedEntityCount, out collidersCount);
-}
-
-public override void Shutdown(BulletWorld world)
-{
- BulletWorldUnman worldu = world as BulletWorldUnman;
- BSAPICPP.Shutdown2(worldu.ptr);
-
- if (m_paramsHandle.IsAllocated)
- {
- m_paramsHandle.Free();
- }
- if (m_collisionArrayPinnedHandle.IsAllocated)
- {
- m_collisionArrayPinnedHandle.Free();
- }
- if (m_updateArrayPinnedHandle.IsAllocated)
- {
- m_updateArrayPinnedHandle.Free();
- }
-}
-
-public override bool PushUpdate(BulletBody obj)
-{
- BulletBodyUnman bodyu = obj as BulletBodyUnman;
- return BSAPICPP.PushUpdate2(bodyu.ptr);
-}
-
-public override bool UpdateParameter(BulletWorld world, uint localID, String parm, float value)
-{
- BulletWorldUnman worldu = world as BulletWorldUnman;
- return BSAPICPP.UpdateParameter2(worldu.ptr, localID, parm, value);
-}
-
-// =====================================================================================
-// Mesh, hull, shape and body creation helper routines
-public override BulletShape CreateMeshShape(BulletWorld world,
- int indicesCount, int[] indices,
- int verticesCount, float[] vertices)
-{
- BulletWorldUnman worldu = world as BulletWorldUnman;
- return new BulletShapeUnman(
- BSAPICPP.CreateMeshShape2(worldu.ptr, indicesCount, indices, verticesCount, vertices),
- BSPhysicsShapeType.SHAPE_MESH);
-}
-
-public override BulletShape CreateGImpactShape(BulletWorld world,
- int indicesCount, int[] indices,
- int verticesCount, float[] vertices)
-{
- BulletWorldUnman worldu = world as BulletWorldUnman;
- return new BulletShapeUnman(
- BSAPICPP.CreateGImpactShape2(worldu.ptr, indicesCount, indices, verticesCount, vertices),
- BSPhysicsShapeType.SHAPE_GIMPACT);
-}
-
-public override BulletShape CreateHullShape(BulletWorld world, int hullCount, float[] hulls)
-{
- BulletWorldUnman worldu = world as BulletWorldUnman;
- return new BulletShapeUnman(
- BSAPICPP.CreateHullShape2(worldu.ptr, hullCount, hulls),
- BSPhysicsShapeType.SHAPE_HULL);
-}
-
-public override BulletShape BuildHullShapeFromMesh(BulletWorld world, BulletShape meshShape, HACDParams parms)
-{
- BulletWorldUnman worldu = world as BulletWorldUnman;
- BulletShapeUnman shapeu = meshShape as BulletShapeUnman;
- return new BulletShapeUnman(
- BSAPICPP.BuildHullShapeFromMesh2(worldu.ptr, shapeu.ptr, parms),
- BSPhysicsShapeType.SHAPE_HULL);
-}
-
-public override BulletShape BuildConvexHullShapeFromMesh(BulletWorld world, BulletShape meshShape)
-{
- BulletWorldUnman worldu = world as BulletWorldUnman;
- BulletShapeUnman shapeu = meshShape as BulletShapeUnman;
- return new BulletShapeUnman(
- BSAPICPP.BuildConvexHullShapeFromMesh2(worldu.ptr, shapeu.ptr),
- BSPhysicsShapeType.SHAPE_CONVEXHULL);
-}
-
-public override BulletShape CreateConvexHullShape(BulletWorld world,
- int indicesCount, int[] indices,
- int verticesCount, float[] vertices)
-{
- BulletWorldUnman worldu = world as BulletWorldUnman;
- return new BulletShapeUnman(
- BSAPICPP.CreateConvexHullShape2(worldu.ptr, indicesCount, indices, verticesCount, vertices),
- BSPhysicsShapeType.SHAPE_CONVEXHULL);
-}
-
-public override BulletShape BuildNativeShape(BulletWorld world, ShapeData shapeData)
-{
- BulletWorldUnman worldu = world as BulletWorldUnman;
- return new BulletShapeUnman(BSAPICPP.BuildNativeShape2(worldu.ptr, shapeData), shapeData.Type);
-}
-
-public override bool IsNativeShape(BulletShape shape)
-{
- BulletShapeUnman shapeu = shape as BulletShapeUnman;
- if (shapeu != null && shapeu.HasPhysicalShape)
- return BSAPICPP.IsNativeShape2(shapeu.ptr);
- return false;
-}
-
-public override void SetShapeCollisionMargin(BulletShape shape, float margin)
-{
- BulletShapeUnman shapeu = shape as BulletShapeUnman;
- if (shapeu != null && shapeu.HasPhysicalShape)
- BSAPICPP.SetShapeCollisionMargin(shapeu.ptr, margin);
-}
-
-public override BulletShape BuildCapsuleShape(BulletWorld world, float radius, float height, Vector3 scale)
-{
- BulletWorldUnman worldu = world as BulletWorldUnman;
- return new BulletShapeUnman(
- BSAPICPP.BuildCapsuleShape2(worldu.ptr, radius, height, scale),
- BSPhysicsShapeType.SHAPE_CAPSULE);
-}
-
-public override BulletShape CreateCompoundShape(BulletWorld world, bool enableDynamicAabbTree)
-{
- BulletWorldUnman worldu = world as BulletWorldUnman;
- return new BulletShapeUnman(
- BSAPICPP.CreateCompoundShape2(worldu.ptr, enableDynamicAabbTree),
- BSPhysicsShapeType.SHAPE_COMPOUND);
-
-}
-
-public override int GetNumberOfCompoundChildren(BulletShape shape)
-{
- BulletShapeUnman shapeu = shape as BulletShapeUnman;
- if (shapeu != null && shapeu.HasPhysicalShape)
- return BSAPICPP.GetNumberOfCompoundChildren2(shapeu.ptr);
- return 0;
-}
-
-public override void AddChildShapeToCompoundShape(BulletShape shape, BulletShape addShape, Vector3 pos, Quaternion rot)
-{
- BulletShapeUnman shapeu = shape as BulletShapeUnman;
- BulletShapeUnman addShapeu = addShape as BulletShapeUnman;
- BSAPICPP.AddChildShapeToCompoundShape2(shapeu.ptr, addShapeu.ptr, pos, rot);
-}
-
-public override BulletShape GetChildShapeFromCompoundShapeIndex(BulletShape shape, int indx)
-{
- BulletShapeUnman shapeu = shape as BulletShapeUnman;
- return new BulletShapeUnman(BSAPICPP.GetChildShapeFromCompoundShapeIndex2(shapeu.ptr, indx), BSPhysicsShapeType.SHAPE_UNKNOWN);
-}
-
-public override BulletShape RemoveChildShapeFromCompoundShapeIndex(BulletShape shape, int indx)
-{
- BulletShapeUnman shapeu = shape as BulletShapeUnman;
- return new BulletShapeUnman(BSAPICPP.RemoveChildShapeFromCompoundShapeIndex2(shapeu.ptr, indx), BSPhysicsShapeType.SHAPE_UNKNOWN);
-}
-
-public override void RemoveChildShapeFromCompoundShape(BulletShape shape, BulletShape removeShape)
-{
- BulletShapeUnman shapeu = shape as BulletShapeUnman;
- BulletShapeUnman removeShapeu = removeShape as BulletShapeUnman;
- BSAPICPP.RemoveChildShapeFromCompoundShape2(shapeu.ptr, removeShapeu.ptr);
-}
-
-public override void UpdateChildTransform(BulletShape pShape, int childIndex, Vector3 pos, Quaternion rot, bool shouldRecalculateLocalAabb)
-{
- BulletShapeUnman shapeu = pShape as BulletShapeUnman;
- BSAPICPP.UpdateChildTransform2(shapeu.ptr, childIndex, pos, rot, shouldRecalculateLocalAabb);
-}
-
-public override void RecalculateCompoundShapeLocalAabb(BulletShape shape)
-{
- BulletShapeUnman shapeu = shape as BulletShapeUnman;
- BSAPICPP.RecalculateCompoundShapeLocalAabb2(shapeu.ptr);
-}
-
-public override BulletShape DuplicateCollisionShape(BulletWorld world, BulletShape srcShape, uint id)
-{
- BulletWorldUnman worldu = world as BulletWorldUnman;
- BulletShapeUnman srcShapeu = srcShape as BulletShapeUnman;
- return new BulletShapeUnman(BSAPICPP.DuplicateCollisionShape2(worldu.ptr, srcShapeu.ptr, id), srcShape.shapeType);
-}
-
-public override bool DeleteCollisionShape(BulletWorld world, BulletShape shape)
-{
- BulletWorldUnman worldu = world as BulletWorldUnman;
- BulletShapeUnman shapeu = shape as BulletShapeUnman;
- return BSAPICPP.DeleteCollisionShape2(worldu.ptr, shapeu.ptr);
-}
-
-public override CollisionObjectTypes GetBodyType(BulletBody obj)
-{
- BulletBodyUnman bodyu = obj as BulletBodyUnman;
- return (CollisionObjectTypes)BSAPICPP.GetBodyType2(bodyu.ptr);
-}
-
-public override BulletBody CreateBodyFromShape(BulletWorld world, BulletShape shape, uint id, Vector3 pos, Quaternion rot)
-{
- BulletWorldUnman worldu = world as BulletWorldUnman;
- BulletShapeUnman shapeu = shape as BulletShapeUnman;
- return new BulletBodyUnman(id, BSAPICPP.CreateBodyFromShape2(worldu.ptr, shapeu.ptr, id, pos, rot));
-}
-
-public override BulletBody CreateBodyWithDefaultMotionState(BulletShape shape, uint id, Vector3 pos, Quaternion rot)
-{
- BulletShapeUnman shapeu = shape as BulletShapeUnman;
- return new BulletBodyUnman(id, BSAPICPP.CreateBodyWithDefaultMotionState2(shapeu.ptr, id, pos, rot));
-}
-
-public override BulletBody CreateGhostFromShape(BulletWorld world, BulletShape shape, uint id, Vector3 pos, Quaternion rot)
-{
- BulletWorldUnman worldu = world as BulletWorldUnman;
- BulletShapeUnman shapeu = shape as BulletShapeUnman;
- return new BulletBodyUnman(id, BSAPICPP.CreateGhostFromShape2(worldu.ptr, shapeu.ptr, id, pos, rot));
-}
-
-public override void DestroyObject(BulletWorld world, BulletBody obj)
-{
- BulletWorldUnman worldu = world as BulletWorldUnman;
- BulletBodyUnman bodyu = obj as BulletBodyUnman;
- BSAPICPP.DestroyObject2(worldu.ptr, bodyu.ptr);
-}
-
-// =====================================================================================
-// Terrain creation and helper routines
-public override BulletShape CreateGroundPlaneShape(uint id, float height, float collisionMargin)
-{
- return new BulletShapeUnman(BSAPICPP.CreateGroundPlaneShape2(id, height, collisionMargin), BSPhysicsShapeType.SHAPE_GROUNDPLANE);
-}
-
-public override BulletShape CreateTerrainShape(uint id, Vector3 size, float minHeight, float maxHeight, float[] heightMap,
- float scaleFactor, float collisionMargin)
-{
- return new BulletShapeUnman(BSAPICPP.CreateTerrainShape2(id, size, minHeight, maxHeight, heightMap, scaleFactor, collisionMargin),
- BSPhysicsShapeType.SHAPE_TERRAIN);
-}
-
-// =====================================================================================
-// Constraint creation and helper routines
-public override BulletConstraint Create6DofConstraint(BulletWorld world, BulletBody obj1, BulletBody obj2,
- Vector3 frame1loc, Quaternion frame1rot,
- Vector3 frame2loc, Quaternion frame2rot,
- bool useLinearReferenceFrameA, bool disableCollisionsBetweenLinkedBodies)
-{
- BulletWorldUnman worldu = world as BulletWorldUnman;
- BulletBodyUnman bodyu1 = obj1 as BulletBodyUnman;
- BulletBodyUnman bodyu2 = obj2 as BulletBodyUnman;
- return new BulletConstraintUnman(BSAPICPP.Create6DofConstraint2(worldu.ptr, bodyu1.ptr, bodyu2.ptr, frame1loc, frame1rot,
- frame2loc, frame2rot, useLinearReferenceFrameA, disableCollisionsBetweenLinkedBodies));
-}
-
-public override BulletConstraint Create6DofConstraintToPoint(BulletWorld world, BulletBody obj1, BulletBody obj2,
- Vector3 joinPoint,
- bool useLinearReferenceFrameA, bool disableCollisionsBetweenLinkedBodies)
-{
- BulletWorldUnman worldu = world as BulletWorldUnman;
- BulletBodyUnman bodyu1 = obj1 as BulletBodyUnman;
- BulletBodyUnman bodyu2 = obj2 as BulletBodyUnman;
- return new BulletConstraintUnman(BSAPICPP.Create6DofConstraintToPoint2(worldu.ptr, bodyu1.ptr, bodyu2.ptr,
- joinPoint, useLinearReferenceFrameA, disableCollisionsBetweenLinkedBodies));
-}
-
-public override BulletConstraint Create6DofConstraintFixed(BulletWorld world, BulletBody obj1,
- Vector3 frameInBloc, Quaternion frameInBrot,
- bool useLinearReferenceFrameB, bool disableCollisionsBetweenLinkedBodies)
-{
- BulletWorldUnman worldu = world as BulletWorldUnman;
- BulletBodyUnman bodyu1 = obj1 as BulletBodyUnman;
- return new BulletConstraintUnman(BSAPICPP.Create6DofConstraintFixed2(worldu.ptr, bodyu1.ptr,
- frameInBloc, frameInBrot, useLinearReferenceFrameB, disableCollisionsBetweenLinkedBodies));
-}
-
-public override BulletConstraint Create6DofSpringConstraint(BulletWorld world, BulletBody obj1, BulletBody obj2,
- Vector3 frame1loc, Quaternion frame1rot,
- Vector3 frame2loc, Quaternion frame2rot,
- bool useLinearReferenceFrameA, bool disableCollisionsBetweenLinkedBodies)
-{
- BulletWorldUnman worldu = world as BulletWorldUnman;
- BulletBodyUnman bodyu1 = obj1 as BulletBodyUnman;
- BulletBodyUnman bodyu2 = obj2 as BulletBodyUnman;
- return new BulletConstraintUnman(BSAPICPP.Create6DofSpringConstraint2(worldu.ptr, bodyu1.ptr, bodyu2.ptr, frame1loc, frame1rot,
- frame2loc, frame2rot, useLinearReferenceFrameA, disableCollisionsBetweenLinkedBodies));
-}
-
-public override BulletConstraint CreateHingeConstraint(BulletWorld world, BulletBody obj1, BulletBody obj2,
- Vector3 pivotinA, Vector3 pivotinB,
- Vector3 axisInA, Vector3 axisInB,
- bool useLinearReferenceFrameA, bool disableCollisionsBetweenLinkedBodies)
-{
- BulletWorldUnman worldu = world as BulletWorldUnman;
- BulletBodyUnman bodyu1 = obj1 as BulletBodyUnman;
- BulletBodyUnman bodyu2 = obj2 as BulletBodyUnman;
- return new BulletConstraintUnman(BSAPICPP.CreateHingeConstraint2(worldu.ptr, bodyu1.ptr, bodyu2.ptr,
- pivotinA, pivotinB, axisInA, axisInB, useLinearReferenceFrameA, disableCollisionsBetweenLinkedBodies));
-}
-
-public override BulletConstraint CreateSliderConstraint(BulletWorld world, BulletBody obj1, BulletBody obj2,
- Vector3 frame1loc, Quaternion frame1rot,
- Vector3 frame2loc, Quaternion frame2rot,
- bool useLinearReferenceFrameA, bool disableCollisionsBetweenLinkedBodies)
-{
- BulletWorldUnman worldu = world as BulletWorldUnman;
- BulletBodyUnman bodyu1 = obj1 as BulletBodyUnman;
- BulletBodyUnman bodyu2 = obj2 as BulletBodyUnman;
- return new BulletConstraintUnman(BSAPICPP.CreateSliderConstraint2(worldu.ptr, bodyu1.ptr, bodyu2.ptr, frame1loc, frame1rot,
- frame2loc, frame2rot, useLinearReferenceFrameA, disableCollisionsBetweenLinkedBodies));
-}
-
-public override BulletConstraint CreateConeTwistConstraint(BulletWorld world, BulletBody obj1, BulletBody obj2,
- Vector3 frame1loc, Quaternion frame1rot,
- Vector3 frame2loc, Quaternion frame2rot,
- bool disableCollisionsBetweenLinkedBodies)
-{
- BulletWorldUnman worldu = world as BulletWorldUnman;
- BulletBodyUnman bodyu1 = obj1 as BulletBodyUnman;
- BulletBodyUnman bodyu2 = obj2 as BulletBodyUnman;
- return new BulletConstraintUnman(BSAPICPP.CreateConeTwistConstraint2(worldu.ptr, bodyu1.ptr, bodyu2.ptr, frame1loc, frame1rot,
- frame2loc, frame2rot, disableCollisionsBetweenLinkedBodies));
-}
-
-public override BulletConstraint CreateGearConstraint(BulletWorld world, BulletBody obj1, BulletBody obj2,
- Vector3 axisInA, Vector3 axisInB,
- float ratio, bool disableCollisionsBetweenLinkedBodies)
-{
- BulletWorldUnman worldu = world as BulletWorldUnman;
- BulletBodyUnman bodyu1 = obj1 as BulletBodyUnman;
- BulletBodyUnman bodyu2 = obj2 as BulletBodyUnman;
- return new BulletConstraintUnman(BSAPICPP.CreateGearConstraint2(worldu.ptr, bodyu1.ptr, bodyu2.ptr, axisInA, axisInB,
- ratio, disableCollisionsBetweenLinkedBodies));
-}
-
-public override BulletConstraint CreatePoint2PointConstraint(BulletWorld world, BulletBody obj1, BulletBody obj2,
- Vector3 pivotInA, Vector3 pivotInB,
- bool disableCollisionsBetweenLinkedBodies)
-{
- BulletWorldUnman worldu = world as BulletWorldUnman;
- BulletBodyUnman bodyu1 = obj1 as BulletBodyUnman;
- BulletBodyUnman bodyu2 = obj2 as BulletBodyUnman;
- return new BulletConstraintUnman(BSAPICPP.CreatePoint2PointConstraint2(worldu.ptr, bodyu1.ptr, bodyu2.ptr, pivotInA, pivotInB,
- disableCollisionsBetweenLinkedBodies));
-}
-
-public override void SetConstraintEnable(BulletConstraint constrain, float numericTrueFalse)
-{
- BulletConstraintUnman constrainu = constrain as BulletConstraintUnman;
- BSAPICPP.SetConstraintEnable2(constrainu.ptr, numericTrueFalse);
-}
-
-public override void SetConstraintNumSolverIterations(BulletConstraint constrain, float iterations)
-{
- BulletConstraintUnman constrainu = constrain as BulletConstraintUnman;
- BSAPICPP.SetConstraintNumSolverIterations2(constrainu.ptr, iterations);
-}
-
-public override bool SetFrames(BulletConstraint constrain,
- Vector3 frameA, Quaternion frameArot, Vector3 frameB, Quaternion frameBrot)
-{
- BulletConstraintUnman constrainu = constrain as BulletConstraintUnman;
- return BSAPICPP.SetFrames2(constrainu.ptr, frameA, frameArot, frameB, frameBrot);
-}
-
-public override bool SetLinearLimits(BulletConstraint constrain, Vector3 low, Vector3 hi)
-{
- BulletConstraintUnman constrainu = constrain as BulletConstraintUnman;
- return BSAPICPP.SetLinearLimits2(constrainu.ptr, low, hi);
-}
-
-public override bool SetAngularLimits(BulletConstraint constrain, Vector3 low, Vector3 hi)
-{
- BulletConstraintUnman constrainu = constrain as BulletConstraintUnman;
- return BSAPICPP.SetAngularLimits2(constrainu.ptr, low, hi);
-}
-
-public override bool UseFrameOffset(BulletConstraint constrain, float enable)
-{
- BulletConstraintUnman constrainu = constrain as BulletConstraintUnman;
- return BSAPICPP.UseFrameOffset2(constrainu.ptr, enable);
-}
-
-public override bool TranslationalLimitMotor(BulletConstraint constrain, float enable, float targetVel, float maxMotorForce)
-{
- BulletConstraintUnman constrainu = constrain as BulletConstraintUnman;
- return BSAPICPP.TranslationalLimitMotor2(constrainu.ptr, enable, targetVel, maxMotorForce);
-}
-
-public override bool SetBreakingImpulseThreshold(BulletConstraint constrain, float threshold)
-{
- BulletConstraintUnman constrainu = constrain as BulletConstraintUnman;
- return BSAPICPP.SetBreakingImpulseThreshold2(constrainu.ptr, threshold);
-}
-
-public override bool HingeSetLimits(BulletConstraint constrain, float low, float high, float softness, float bias, float relaxation)
-{
- BulletConstraintUnman constrainu = constrain as BulletConstraintUnman;
- return BSAPICPP.HingeSetLimits2(constrainu.ptr, low, high, softness, bias, relaxation);
-}
-
-public override bool SpringEnable(BulletConstraint constrain, int index, float numericTrueFalse)
-{
- BulletConstraintUnman constrainu = constrain as BulletConstraintUnman;
- return BSAPICPP.ConstraintSpringEnable2(constrainu.ptr, index, numericTrueFalse);
-}
-
-public override bool SpringSetEquilibriumPoint(BulletConstraint constrain, int index, float equilibriumPoint)
-{
- BulletConstraintUnman constrainu = constrain as BulletConstraintUnman;
- return BSAPICPP.ConstraintSpringSetEquilibriumPoint2(constrainu.ptr, index, equilibriumPoint);
-}
-
-public override bool SpringSetStiffness(BulletConstraint constrain, int index, float stiffnesss)
-{
- BulletConstraintUnman constrainu = constrain as BulletConstraintUnman;
- return BSAPICPP.ConstraintSpringSetStiffness2(constrainu.ptr, index, stiffnesss);
-}
-
-public override bool SpringSetDamping(BulletConstraint constrain, int index, float damping)
-{
- BulletConstraintUnman constrainu = constrain as BulletConstraintUnman;
- return BSAPICPP.ConstraintSpringSetDamping2(constrainu.ptr, index, damping);
-}
-
-public override bool SliderSetLimits(BulletConstraint constrain, int lowerUpper, int linAng, float val)
-{
- BulletConstraintUnman constrainu = constrain as BulletConstraintUnman;
- return BSAPICPP.SliderSetLimits2(constrainu.ptr, lowerUpper, linAng, val);
-}
-
-public override bool SliderSet(BulletConstraint constrain, int softRestDamp, int dirLimOrtho, int linAng, float val)
-{
- BulletConstraintUnman constrainu = constrain as BulletConstraintUnman;
- return BSAPICPP.SliderSet2(constrainu.ptr, softRestDamp, dirLimOrtho, linAng, val);
-}
-
-public override bool SliderMotorEnable(BulletConstraint constrain, int linAng, float numericTrueFalse)
-{
- BulletConstraintUnman constrainu = constrain as BulletConstraintUnman;
- return BSAPICPP.SliderMotorEnable2(constrainu.ptr, linAng, numericTrueFalse);
-}
-
-public override bool SliderMotor(BulletConstraint constrain, int forceVel, int linAng, float val)
-{
- BulletConstraintUnman constrainu = constrain as BulletConstraintUnman;
- return BSAPICPP.SliderMotor2(constrainu.ptr, forceVel, linAng, val);
-}
-
-public override bool CalculateTransforms(BulletConstraint constrain)
-{
- BulletConstraintUnman constrainu = constrain as BulletConstraintUnman;
- return BSAPICPP.CalculateTransforms2(constrainu.ptr);
-}
-
-public override bool SetConstraintParam(BulletConstraint constrain, ConstraintParams paramIndex, float value, ConstraintParamAxis axis)
-{
- BulletConstraintUnman constrainu = constrain as BulletConstraintUnman;
- return BSAPICPP.SetConstraintParam2(constrainu.ptr, paramIndex, value, axis);
-}
-
-public override bool DestroyConstraint(BulletWorld world, BulletConstraint constrain)
-{
- BulletWorldUnman worldu = world as BulletWorldUnman;
- BulletConstraintUnman constrainu = constrain as BulletConstraintUnman;
- return BSAPICPP.DestroyConstraint2(worldu.ptr, constrainu.ptr);
-}
-
-// =====================================================================================
-// btCollisionWorld entries
-public override void UpdateSingleAabb(BulletWorld world, BulletBody obj)
-{
- BulletWorldUnman worldu = world as BulletWorldUnman;
- BulletBodyUnman bodyu = obj as BulletBodyUnman;
- BSAPICPP.UpdateSingleAabb2(worldu.ptr, bodyu.ptr);
-}
-
-public override void UpdateAabbs(BulletWorld world)
-{
- BulletWorldUnman worldu = world as BulletWorldUnman;
- BSAPICPP.UpdateAabbs2(worldu.ptr);
-}
-
-public override bool GetForceUpdateAllAabbs(BulletWorld world)
-{
- BulletWorldUnman worldu = world as BulletWorldUnman;
- return BSAPICPP.GetForceUpdateAllAabbs2(worldu.ptr);
-}
-
-public override void SetForceUpdateAllAabbs(BulletWorld world, bool force)
-{
- BulletWorldUnman worldu = world as BulletWorldUnman;
- BSAPICPP.SetForceUpdateAllAabbs2(worldu.ptr, force);
-}
-
-// =====================================================================================
-// btDynamicsWorld entries
-public override bool AddObjectToWorld(BulletWorld world, BulletBody obj)
-{
- BulletWorldUnman worldu = world as BulletWorldUnman;
- BulletBodyUnman bodyu = obj as BulletBodyUnman;
-
- // Bullet resets several variables when an object is added to the world.
- // Gravity is reset to world default depending on the static/dynamic
- // type. Of course, the collision flags in the broadphase proxy are initialized to default.
- Vector3 origGrav = BSAPICPP.GetGravity2(bodyu.ptr);
-
- bool ret = BSAPICPP.AddObjectToWorld2(worldu.ptr, bodyu.ptr);
-
- if (ret)
- {
- BSAPICPP.SetGravity2(bodyu.ptr, origGrav);
- obj.ApplyCollisionMask(world.physicsScene);
- }
- return ret;
-}
-
-public override bool RemoveObjectFromWorld(BulletWorld world, BulletBody obj)
-{
- BulletWorldUnman worldu = world as BulletWorldUnman;
- BulletBodyUnman bodyu = obj as BulletBodyUnman;
- return BSAPICPP.RemoveObjectFromWorld2(worldu.ptr, bodyu.ptr);
-}
-
-public override bool ClearCollisionProxyCache(BulletWorld world, BulletBody obj)
-{
- BulletWorldUnman worldu = world as BulletWorldUnman;
- BulletBodyUnman bodyu = obj as BulletBodyUnman;
- return BSAPICPP.ClearCollisionProxyCache2(worldu.ptr, bodyu.ptr);
-}
-
-public override bool AddConstraintToWorld(BulletWorld world, BulletConstraint constrain, bool disableCollisionsBetweenLinkedObjects)
-{
- BulletWorldUnman worldu = world as BulletWorldUnman;
- BulletConstraintUnman constrainu = constrain as BulletConstraintUnman;
- return BSAPICPP.AddConstraintToWorld2(worldu.ptr, constrainu.ptr, disableCollisionsBetweenLinkedObjects);
-}
-
-public override bool RemoveConstraintFromWorld(BulletWorld world, BulletConstraint constrain)
-{
- BulletWorldUnman worldu = world as BulletWorldUnman;
- BulletConstraintUnman constrainu = constrain as BulletConstraintUnman;
- return BSAPICPP.RemoveConstraintFromWorld2(worldu.ptr, constrainu.ptr);
-}
-// =====================================================================================
-// btCollisionObject entries
-public override Vector3 GetAnisotripicFriction(BulletConstraint constrain)
-{
- BulletConstraintUnman constrainu = constrain as BulletConstraintUnman;
- return BSAPICPP.GetAnisotripicFriction2(constrainu.ptr);
-}
-
-public override Vector3 SetAnisotripicFriction(BulletConstraint constrain, Vector3 frict)
-{
- BulletConstraintUnman constrainu = constrain as BulletConstraintUnman;
- return BSAPICPP.SetAnisotripicFriction2(constrainu.ptr, frict);
-}
-
-public override bool HasAnisotripicFriction(BulletConstraint constrain)
-{
- BulletConstraintUnman constrainu = constrain as BulletConstraintUnman;
- return BSAPICPP.HasAnisotripicFriction2(constrainu.ptr);
-}
-
-public override void SetContactProcessingThreshold(BulletBody obj, float val)
-{
- BulletBodyUnman bodyu = obj as BulletBodyUnman;
- BSAPICPP.SetContactProcessingThreshold2(bodyu.ptr, val);
-}
-
-public override float GetContactProcessingThreshold(BulletBody obj)
-{
- BulletBodyUnman bodyu = obj as BulletBodyUnman;
- return BSAPICPP.GetContactProcessingThreshold2(bodyu.ptr);
-}
-
-public override bool IsStaticObject(BulletBody obj)
-{
- BulletBodyUnman bodyu = obj as BulletBodyUnman;
- return BSAPICPP.IsStaticObject2(bodyu.ptr);
-}
-
-public override bool IsKinematicObject(BulletBody obj)
-{
- BulletBodyUnman bodyu = obj as BulletBodyUnman;
- return BSAPICPP.IsKinematicObject2(bodyu.ptr);
-}
-
-public override bool IsStaticOrKinematicObject(BulletBody obj)
-{
- BulletBodyUnman bodyu = obj as BulletBodyUnman;
- return BSAPICPP.IsStaticOrKinematicObject2(bodyu.ptr);
-}
-
-public override bool HasContactResponse(BulletBody obj)
-{
- BulletBodyUnman bodyu = obj as BulletBodyUnman;
- return BSAPICPP.HasContactResponse2(bodyu.ptr);
-}
-
-public override void SetCollisionShape(BulletWorld world, BulletBody obj, BulletShape shape)
-{
- BulletWorldUnman worldu = world as BulletWorldUnman;
- BulletBodyUnman bodyu = obj as BulletBodyUnman;
- BulletShapeUnman shapeu = shape as BulletShapeUnman;
- if (worldu != null && bodyu != null)
- {
- // Special case to allow the caller to zero out the reference to any physical shape
- if (shapeu != null)
- BSAPICPP.SetCollisionShape2(worldu.ptr, bodyu.ptr, shapeu.ptr);
- else
- BSAPICPP.SetCollisionShape2(worldu.ptr, bodyu.ptr, IntPtr.Zero);
- }
-}
-
-public override BulletShape GetCollisionShape(BulletBody obj)
-{
- BulletBodyUnman bodyu = obj as BulletBodyUnman;
- return new BulletShapeUnman(BSAPICPP.GetCollisionShape2(bodyu.ptr), BSPhysicsShapeType.SHAPE_UNKNOWN);
-}
-
-public override int GetActivationState(BulletBody obj)
-{
- BulletBodyUnman bodyu = obj as BulletBodyUnman;
- return BSAPICPP.GetActivationState2(bodyu.ptr);
-}
-
-public override void SetActivationState(BulletBody obj, int state)
-{
- BulletBodyUnman bodyu = obj as BulletBodyUnman;
- BSAPICPP.SetActivationState2(bodyu.ptr, state);
-}
-
-public override void SetDeactivationTime(BulletBody obj, float dtime)
-{
- BulletBodyUnman bodyu = obj as BulletBodyUnman;
- BSAPICPP.SetDeactivationTime2(bodyu.ptr, dtime);
-}
-
-public override float GetDeactivationTime(BulletBody obj)
-{
- BulletBodyUnman bodyu = obj as BulletBodyUnman;
- return BSAPICPP.GetDeactivationTime2(bodyu.ptr);
-}
-
-public override void ForceActivationState(BulletBody obj, ActivationState state)
-{
- BulletBodyUnman bodyu = obj as BulletBodyUnman;
- BSAPICPP.ForceActivationState2(bodyu.ptr, state);
-}
-
-public override void Activate(BulletBody obj, bool forceActivation)
-{
- BulletBodyUnman bodyu = obj as BulletBodyUnman;
- BSAPICPP.Activate2(bodyu.ptr, forceActivation);
-}
-
-public override bool IsActive(BulletBody obj)
-{
- BulletBodyUnman bodyu = obj as BulletBodyUnman;
- return BSAPICPP.IsActive2(bodyu.ptr);
-}
-
-public override void SetRestitution(BulletBody obj, float val)
-{
- BulletBodyUnman bodyu = obj as BulletBodyUnman;
- BSAPICPP.SetRestitution2(bodyu.ptr, val);
-}
-
-public override float GetRestitution(BulletBody obj)
-{
- BulletBodyUnman bodyu = obj as BulletBodyUnman;
- return BSAPICPP.GetRestitution2(bodyu.ptr);
-}
-
-public override void SetFriction(BulletBody obj, float val)
-{
- BulletBodyUnman bodyu = obj as BulletBodyUnman;
- BSAPICPP.SetFriction2(bodyu.ptr, val);
-}
-
-public override float GetFriction(BulletBody obj)
-{
- BulletBodyUnman bodyu = obj as BulletBodyUnman;
- return BSAPICPP.GetFriction2(bodyu.ptr);
-}
-
-public override Vector3 GetPosition(BulletBody obj)
-{
- BulletBodyUnman bodyu = obj as BulletBodyUnman;
- return BSAPICPP.GetPosition2(bodyu.ptr);
-}
-
-public override Quaternion GetOrientation(BulletBody obj)
-{
- BulletBodyUnman bodyu = obj as BulletBodyUnman;
- return BSAPICPP.GetOrientation2(bodyu.ptr);
-}
-
-public override void SetTranslation(BulletBody obj, Vector3 position, Quaternion rotation)
-{
- BulletBodyUnman bodyu = obj as BulletBodyUnman;
- BSAPICPP.SetTranslation2(bodyu.ptr, position, rotation);
-}
-
- /*
-public override IntPtr GetBroadphaseHandle(BulletBody obj)
-{
- BulletBodyUnman bodyu = obj as BulletBodyUnman;
- return BSAPICPP.GetBroadphaseHandle2(bodyu.ptr);
-}
-
-public override void SetBroadphaseHandle(BulletBody obj, IntPtr handle)
-{
- BulletBodyUnman bodyu = obj as BulletBodyUnman;
- BSAPICPP.SetUserPointer2(bodyu.ptr, handle);
-}
- */
-
-public override void SetInterpolationLinearVelocity(BulletBody obj, Vector3 vel)
-{
- BulletBodyUnman bodyu = obj as BulletBodyUnman;
- BSAPICPP.SetInterpolationLinearVelocity2(bodyu.ptr, vel);
-}
-
-public override void SetInterpolationAngularVelocity(BulletBody obj, Vector3 vel)
-{
- BulletBodyUnman bodyu = obj as BulletBodyUnman;
- BSAPICPP.SetInterpolationAngularVelocity2(bodyu.ptr, vel);
-}
-
-public override void SetInterpolationVelocity(BulletBody obj, Vector3 linearVel, Vector3 angularVel)
-{
- BulletBodyUnman bodyu = obj as BulletBodyUnman;
- BSAPICPP.SetInterpolationVelocity2(bodyu.ptr, linearVel, angularVel);
-}
-
-public override float GetHitFraction(BulletBody obj)
-{
- BulletBodyUnman bodyu = obj as BulletBodyUnman;
- return BSAPICPP.GetHitFraction2(bodyu.ptr);
-}
-
-public override void SetHitFraction(BulletBody obj, float val)
-{
- BulletBodyUnman bodyu = obj as BulletBodyUnman;
- BSAPICPP.SetHitFraction2(bodyu.ptr, val);
-}
-
-public override CollisionFlags GetCollisionFlags(BulletBody obj)
-{
- BulletBodyUnman bodyu = obj as BulletBodyUnman;
- return BSAPICPP.GetCollisionFlags2(bodyu.ptr);
-}
-
-public override CollisionFlags SetCollisionFlags(BulletBody obj, CollisionFlags flags)
-{
- BulletBodyUnman bodyu = obj as BulletBodyUnman;
- return BSAPICPP.SetCollisionFlags2(bodyu.ptr, flags);
-}
-
-public override CollisionFlags AddToCollisionFlags(BulletBody obj, CollisionFlags flags)
-{
- BulletBodyUnman bodyu = obj as BulletBodyUnman;
- return BSAPICPP.AddToCollisionFlags2(bodyu.ptr, flags);
-}
-
-public override CollisionFlags RemoveFromCollisionFlags(BulletBody obj, CollisionFlags flags)
-{
- BulletBodyUnman bodyu = obj as BulletBodyUnman;
- return BSAPICPP.RemoveFromCollisionFlags2(bodyu.ptr, flags);
-}
-
-public override float GetCcdMotionThreshold(BulletBody obj)
-{
- BulletBodyUnman bodyu = obj as BulletBodyUnman;
- return BSAPICPP.GetCcdMotionThreshold2(bodyu.ptr);
-}
-
-
-public override void SetCcdMotionThreshold(BulletBody obj, float val)
-{
- BulletBodyUnman bodyu = obj as BulletBodyUnman;
- BSAPICPP.SetCcdMotionThreshold2(bodyu.ptr, val);
-}
-
-public override float GetCcdSweptSphereRadius(BulletBody obj)
-{
- BulletBodyUnman bodyu = obj as BulletBodyUnman;
- return BSAPICPP.GetCcdSweptSphereRadius2(bodyu.ptr);
-}
-
-public override void SetCcdSweptSphereRadius(BulletBody obj, float val)
-{
- BulletBodyUnman bodyu = obj as BulletBodyUnman;
- BSAPICPP.SetCcdSweptSphereRadius2(bodyu.ptr, val);
-}
-
-public override IntPtr GetUserPointer(BulletBody obj)
-{
- BulletBodyUnman bodyu = obj as BulletBodyUnman;
- return BSAPICPP.GetUserPointer2(bodyu.ptr);
-}
-
-public override void SetUserPointer(BulletBody obj, IntPtr val)
-{
- BulletBodyUnman bodyu = obj as BulletBodyUnman;
- BSAPICPP.SetUserPointer2(bodyu.ptr, val);
-}
-
-// =====================================================================================
-// btRigidBody entries
-public override void ApplyGravity(BulletBody obj)
-{
- BulletBodyUnman bodyu = obj as BulletBodyUnman;
- BSAPICPP.ApplyGravity2(bodyu.ptr);
-}
-
-public override void SetGravity(BulletBody obj, Vector3 val)
-{
- BulletBodyUnman bodyu = obj as BulletBodyUnman;
- BSAPICPP.SetGravity2(bodyu.ptr, val);
-}
-
-public override Vector3 GetGravity(BulletBody obj)
-{
- BulletBodyUnman bodyu = obj as BulletBodyUnman;
- return BSAPICPP.GetGravity2(bodyu.ptr);
-}
-
-public override void SetDamping(BulletBody obj, float lin_damping, float ang_damping)
-{
- BulletBodyUnman bodyu = obj as BulletBodyUnman;
- BSAPICPP.SetDamping2(bodyu.ptr, lin_damping, ang_damping);
-}
-
-public override void SetLinearDamping(BulletBody obj, float lin_damping)
-{
- BulletBodyUnman bodyu = obj as BulletBodyUnman;
- BSAPICPP.SetLinearDamping2(bodyu.ptr, lin_damping);
-}
-
-public override void SetAngularDamping(BulletBody obj, float ang_damping)
-{
- BulletBodyUnman bodyu = obj as BulletBodyUnman;
- BSAPICPP.SetAngularDamping2(bodyu.ptr, ang_damping);
-}
-
-public override float GetLinearDamping(BulletBody obj)
-{
- BulletBodyUnman bodyu = obj as BulletBodyUnman;
- return BSAPICPP.GetLinearDamping2(bodyu.ptr);
-}
-
-public override float GetAngularDamping(BulletBody obj)
-{
- BulletBodyUnman bodyu = obj as BulletBodyUnman;
- return BSAPICPP.GetAngularDamping2(bodyu.ptr);
-}
-
-public override float GetLinearSleepingThreshold(BulletBody obj)
-{
- BulletBodyUnman bodyu = obj as BulletBodyUnman;
- return BSAPICPP.GetLinearSleepingThreshold2(bodyu.ptr);
-}
-
-public override void ApplyDamping(BulletBody obj, float timeStep)
-{
- BulletBodyUnman bodyu = obj as BulletBodyUnman;
- BSAPICPP.ApplyDamping2(bodyu.ptr, timeStep);
-}
-
-public override void SetMassProps(BulletBody obj, float mass, Vector3 inertia)
-{
- BulletBodyUnman bodyu = obj as BulletBodyUnman;
- BSAPICPP.SetMassProps2(bodyu.ptr, mass, inertia);
-}
-
-public override Vector3 GetLinearFactor(BulletBody obj)
-{
- BulletBodyUnman bodyu = obj as BulletBodyUnman;
- return BSAPICPP.GetLinearFactor2(bodyu.ptr);
-}
-
-public override void SetLinearFactor(BulletBody obj, Vector3 factor)
-{
- BulletBodyUnman bodyu = obj as BulletBodyUnman;
- BSAPICPP.SetLinearFactor2(bodyu.ptr, factor);
-}
-
-public override void SetCenterOfMassByPosRot(BulletBody obj, Vector3 pos, Quaternion rot)
-{
- BulletBodyUnman bodyu = obj as BulletBodyUnman;
- BSAPICPP.SetCenterOfMassByPosRot2(bodyu.ptr, pos, rot);
-}
-
-// Add a force to the object as if its mass is one.
-// Deep down in Bullet: m_totalForce += force*m_linearFactor;
-public override void ApplyCentralForce(BulletBody obj, Vector3 force)
-{
- BulletBodyUnman bodyu = obj as BulletBodyUnman;
- BSAPICPP.ApplyCentralForce2(bodyu.ptr, force);
-}
-
-// Set the force being applied to the object as if its mass is one.
-public override void SetObjectForce(BulletBody obj, Vector3 force)
-{
- BulletBodyUnman bodyu = obj as BulletBodyUnman;
- BSAPICPP.SetObjectForce2(bodyu.ptr, force);
-}
-
-public override Vector3 GetTotalForce(BulletBody obj)
-{
- BulletBodyUnman bodyu = obj as BulletBodyUnman;
- return BSAPICPP.GetTotalForce2(bodyu.ptr);
-}
-
-public override Vector3 GetTotalTorque(BulletBody obj)
-{
- BulletBodyUnman bodyu = obj as BulletBodyUnman;
- return BSAPICPP.GetTotalTorque2(bodyu.ptr);
-}
-
-public override Vector3 GetInvInertiaDiagLocal(BulletBody obj)
-{
- BulletBodyUnman bodyu = obj as BulletBodyUnman;
- return BSAPICPP.GetInvInertiaDiagLocal2(bodyu.ptr);
-}
-
-public override void SetInvInertiaDiagLocal(BulletBody obj, Vector3 inert)
-{
- BulletBodyUnman bodyu = obj as BulletBodyUnman;
- BSAPICPP.SetInvInertiaDiagLocal2(bodyu.ptr, inert);
-}
-
-public override void SetSleepingThresholds(BulletBody obj, float lin_threshold, float ang_threshold)
-{
- BulletBodyUnman bodyu = obj as BulletBodyUnman;
- BSAPICPP.SetSleepingThresholds2(bodyu.ptr, lin_threshold, ang_threshold);
-}
-
-// Deep down in Bullet: m_totalTorque += torque*m_angularFactor;
-public override void ApplyTorque(BulletBody obj, Vector3 torque)
-{
- BulletBodyUnman bodyu = obj as BulletBodyUnman;
- BSAPICPP.ApplyTorque2(bodyu.ptr, torque);
-}
-
-// Apply force at the given point. Will add torque to the object.
-// Deep down in Bullet: applyCentralForce(force);
-// applyTorque(rel_pos.cross(force*m_linearFactor));
-public override void ApplyForce(BulletBody obj, Vector3 force, Vector3 pos)
-{
- BulletBodyUnman bodyu = obj as BulletBodyUnman;
- BSAPICPP.ApplyForce2(bodyu.ptr, force, pos);
-}
-
-// Apply impulse to the object. Same as "ApplycentralForce" but force scaled by object's mass.
-// Deep down in Bullet: m_linearVelocity += impulse *m_linearFactor * m_inverseMass;
-public override void ApplyCentralImpulse(BulletBody obj, Vector3 imp)
-{
- BulletBodyUnman bodyu = obj as BulletBodyUnman;
- BSAPICPP.ApplyCentralImpulse2(bodyu.ptr, imp);
-}
-
-// Apply impulse to the object's torque. Force is scaled by object's mass.
-// Deep down in Bullet: m_angularVelocity += m_invInertiaTensorWorld * torque * m_angularFactor;
-public override void ApplyTorqueImpulse(BulletBody obj, Vector3 imp)
-{
- BulletBodyUnman bodyu = obj as BulletBodyUnman;
- BSAPICPP.ApplyTorqueImpulse2(bodyu.ptr, imp);
-}
-
-// Apply impulse at the point given. For is scaled by object's mass and effects both linear and angular forces.
-// Deep down in Bullet: applyCentralImpulse(impulse);
-// applyTorqueImpulse(rel_pos.cross(impulse*m_linearFactor));
-public override void ApplyImpulse(BulletBody obj, Vector3 imp, Vector3 pos)
-{
- BulletBodyUnman bodyu = obj as BulletBodyUnman;
- BSAPICPP.ApplyImpulse2(bodyu.ptr, imp, pos);
-}
-
-public override void ClearForces(BulletBody obj)
-{
- BulletBodyUnman bodyu = obj as BulletBodyUnman;
- BSAPICPP.ClearForces2(bodyu.ptr);
-}
-
-public override void ClearAllForces(BulletBody obj)
-{
- BulletBodyUnman bodyu = obj as BulletBodyUnman;
- BSAPICPP.ClearAllForces2(bodyu.ptr);
-}
-
-public override void UpdateInertiaTensor(BulletBody obj)
-{
- BulletBodyUnman bodyu = obj as BulletBodyUnman;
- BSAPICPP.UpdateInertiaTensor2(bodyu.ptr);
-}
-
-public override Vector3 GetLinearVelocity(BulletBody obj)
-{
- BulletBodyUnman bodyu = obj as BulletBodyUnman;
- return BSAPICPP.GetLinearVelocity2(bodyu.ptr);
-}
-
-public override Vector3 GetAngularVelocity(BulletBody obj)
-{
- BulletBodyUnman bodyu = obj as BulletBodyUnman;
- return BSAPICPP.GetAngularVelocity2(bodyu.ptr);
-}
-
-public override void SetLinearVelocity(BulletBody obj, Vector3 vel)
-{
- BulletBodyUnman bodyu = obj as BulletBodyUnman;
- BSAPICPP.SetLinearVelocity2(bodyu.ptr, vel);
-}
-
-public override void SetAngularVelocity(BulletBody obj, Vector3 angularVelocity)
-{
- BulletBodyUnman bodyu = obj as BulletBodyUnman;
- BSAPICPP.SetAngularVelocity2(bodyu.ptr, angularVelocity);
-}
-
-public override Vector3 GetVelocityInLocalPoint(BulletBody obj, Vector3 pos)
-{
- BulletBodyUnman bodyu = obj as BulletBodyUnman;
- return BSAPICPP.GetVelocityInLocalPoint2(bodyu.ptr, pos);
-}
-
-public override void Translate(BulletBody obj, Vector3 trans)
-{
- BulletBodyUnman bodyu = obj as BulletBodyUnman;
- BSAPICPP.Translate2(bodyu.ptr, trans);
-}
-
-public override void UpdateDeactivation(BulletBody obj, float timeStep)
-{
- BulletBodyUnman bodyu = obj as BulletBodyUnman;
- BSAPICPP.UpdateDeactivation2(bodyu.ptr, timeStep);
-}
-
-public override bool WantsSleeping(BulletBody obj)
-{
- BulletBodyUnman bodyu = obj as BulletBodyUnman;
- return BSAPICPP.WantsSleeping2(bodyu.ptr);
-}
-
-public override void SetAngularFactor(BulletBody obj, float factor)
-{
- BulletBodyUnman bodyu = obj as BulletBodyUnman;
- BSAPICPP.SetAngularFactor2(bodyu.ptr, factor);
-}
-
-public override void SetAngularFactorV(BulletBody obj, Vector3 factor)
-{
- BulletBodyUnman bodyu = obj as BulletBodyUnman;
- BSAPICPP.SetAngularFactorV2(bodyu.ptr, factor);
-}
-
-public override Vector3 GetAngularFactor(BulletBody obj)
-{
- BulletBodyUnman bodyu = obj as BulletBodyUnman;
- return BSAPICPP.GetAngularFactor2(bodyu.ptr);
-}
-
-public override bool IsInWorld(BulletWorld world, BulletBody obj)
-{
- BulletBodyUnman bodyu = obj as BulletBodyUnman;
- return BSAPICPP.IsInWorld2(bodyu.ptr);
-}
-
-public override void AddConstraintRef(BulletBody obj, BulletConstraint constrain)
-{
- BulletBodyUnman bodyu = obj as BulletBodyUnman;
- BulletConstraintUnman constrainu = constrain as BulletConstraintUnman;
- BSAPICPP.AddConstraintRef2(bodyu.ptr, constrainu.ptr);
-}
-
-public override void RemoveConstraintRef(BulletBody obj, BulletConstraint constrain)
-{
- BulletBodyUnman bodyu = obj as BulletBodyUnman;
- BulletConstraintUnman constrainu = constrain as BulletConstraintUnman;
- BSAPICPP.RemoveConstraintRef2(bodyu.ptr, constrainu.ptr);
-}
-
-public override BulletConstraint GetConstraintRef(BulletBody obj, int index)
-{
- BulletBodyUnman bodyu = obj as BulletBodyUnman;
- return new BulletConstraintUnman(BSAPICPP.GetConstraintRef2(bodyu.ptr, index));
-}
-
-public override int GetNumConstraintRefs(BulletBody obj)
-{
- BulletBodyUnman bodyu = obj as BulletBodyUnman;
- return BSAPICPP.GetNumConstraintRefs2(bodyu.ptr);
-}
-
-public override bool SetCollisionGroupMask(BulletBody body, uint filter, uint mask)
-{
- BulletBodyUnman bodyu = body as BulletBodyUnman;
- return BSAPICPP.SetCollisionGroupMask2(bodyu.ptr, filter, mask);
-}
-
-// =====================================================================================
-// btCollisionShape entries
-
-public override float GetAngularMotionDisc(BulletShape shape)
-{
- BulletShapeUnman shapeu = shape as BulletShapeUnman;
- return BSAPICPP.GetAngularMotionDisc2(shapeu.ptr);
-}
-
-public override float GetContactBreakingThreshold(BulletShape shape, float defaultFactor)
-{
- BulletShapeUnman shapeu = shape as BulletShapeUnman;
- return BSAPICPP.GetContactBreakingThreshold2(shapeu.ptr, defaultFactor);
-}
-
-public override bool IsPolyhedral(BulletShape shape)
-{
- BulletShapeUnman shapeu = shape as BulletShapeUnman;
- return BSAPICPP.IsPolyhedral2(shapeu.ptr);
-}
-
-public override bool IsConvex2d(BulletShape shape)
-{
- BulletShapeUnman shapeu = shape as BulletShapeUnman;
- return BSAPICPP.IsConvex2d2(shapeu.ptr);
-}
-
-public override bool IsConvex(BulletShape shape)
-{
- BulletShapeUnman shapeu = shape as BulletShapeUnman;
- return BSAPICPP.IsConvex2(shapeu.ptr);
-}
-
-public override bool IsNonMoving(BulletShape shape)
-{
- BulletShapeUnman shapeu = shape as BulletShapeUnman;
- return BSAPICPP.IsNonMoving2(shapeu.ptr);
-}
-
-public override bool IsConcave(BulletShape shape)
-{
- BulletShapeUnman shapeu = shape as BulletShapeUnman;
- return BSAPICPP.IsConcave2(shapeu.ptr);
-}
-
-public override bool IsCompound(BulletShape shape)
-{
- BulletShapeUnman shapeu = shape as BulletShapeUnman;
- return BSAPICPP.IsCompound2(shapeu.ptr);
-}
-
-public override bool IsSoftBody(BulletShape shape)
-{
- BulletShapeUnman shapeu = shape as BulletShapeUnman;
- return BSAPICPP.IsSoftBody2(shapeu.ptr);
-}
-
-public override bool IsInfinite(BulletShape shape)
-{
- BulletShapeUnman shapeu = shape as BulletShapeUnman;
- return BSAPICPP.IsInfinite2(shapeu.ptr);
-}
-
-public override void SetLocalScaling(BulletShape shape, Vector3 scale)
-{
- BulletShapeUnman shapeu = shape as BulletShapeUnman;
- BSAPICPP.SetLocalScaling2(shapeu.ptr, scale);
-}
-
-public override Vector3 GetLocalScaling(BulletShape shape)
-{
- BulletShapeUnman shapeu = shape as BulletShapeUnman;
- return BSAPICPP.GetLocalScaling2(shapeu.ptr);
-}
-
-public override Vector3 CalculateLocalInertia(BulletShape shape, float mass)
-{
- BulletShapeUnman shapeu = shape as BulletShapeUnman;
- return BSAPICPP.CalculateLocalInertia2(shapeu.ptr, mass);
-}
-
-public override int GetShapeType(BulletShape shape)
-{
- BulletShapeUnman shapeu = shape as BulletShapeUnman;
- return BSAPICPP.GetShapeType2(shapeu.ptr);
-}
-
-public override void SetMargin(BulletShape shape, float val)
-{
- BulletShapeUnman shapeu = shape as BulletShapeUnman;
- BSAPICPP.SetMargin2(shapeu.ptr, val);
-}
-
-public override float GetMargin(BulletShape shape)
-{
- BulletShapeUnman shapeu = shape as BulletShapeUnman;
- return BSAPICPP.GetMargin2(shapeu.ptr);
-}
-
-// =====================================================================================
-// Raycast
-public override SweepHit ConvexSweepTest2(BulletWorld world, BulletBody sweepObject, Vector3 from, Vector3 to, float margin) {
- BulletWorldUnman worldu = world as BulletWorldUnman;
- BulletBodyUnman bodyu = sweepObject as BulletBodyUnman;
- return BSAPICPP.ConvexSweepTest2(worldu.ptr, bodyu.ptr, from, to, margin);
-}
-
-public override RaycastHit RayTest2(BulletWorld world, Vector3 from, Vector3 to, uint filterGroup, uint filterMask) {
- BulletWorldUnman worldu = world as BulletWorldUnman;
- return BSAPICPP.RayTest2(worldu.ptr, from, to, filterGroup, filterMask);
-}
-
-// =====================================================================================
-// Debugging
-public override void DumpRigidBody(BulletWorld world, BulletBody collisionObject)
-{
- BulletWorldUnman worldu = world as BulletWorldUnman;
- BulletBodyUnman bodyu = collisionObject as BulletBodyUnman;
- BSAPICPP.DumpRigidBody2(worldu.ptr, bodyu.ptr);
-}
-
-public override void DumpCollisionShape(BulletWorld world, BulletShape collisionShape)
-{
- BulletWorldUnman worldu = world as BulletWorldUnman;
- BulletShapeUnman shapeu = collisionShape as BulletShapeUnman;
- BSAPICPP.DumpCollisionShape2(worldu.ptr, shapeu.ptr);
-}
-
-public override void DumpConstraint(BulletWorld world, BulletConstraint constrain)
-{
- BulletWorldUnman worldu = world as BulletWorldUnman;
- BulletConstraintUnman constrainu = constrain as BulletConstraintUnman;
- BSAPICPP.DumpConstraint2(worldu.ptr, constrainu.ptr);
-}
-
-public override void DumpActivationInfo(BulletWorld world)
-{
- BulletWorldUnman worldu = world as BulletWorldUnman;
- BSAPICPP.DumpActivationInfo2(worldu.ptr);
-}
-
-public override void DumpAllInfo(BulletWorld world)
-{
- BulletWorldUnman worldu = world as BulletWorldUnman;
- BSAPICPP.DumpAllInfo2(worldu.ptr);
-}
-
-public override void DumpPhysicsStatistics(BulletWorld world)
-{
- BulletWorldUnman worldu = world as BulletWorldUnman;
- BSAPICPP.DumpPhysicsStatistics2(worldu.ptr);
-}
-public override void ResetBroadphasePool(BulletWorld world)
-{
- BulletWorldUnman worldu = world as BulletWorldUnman;
- BSAPICPP.ResetBroadphasePool(worldu.ptr);
-}
-public override void ResetConstraintSolver(BulletWorld world)
-{
- BulletWorldUnman worldu = world as BulletWorldUnman;
- BSAPICPP.ResetConstraintSolver(worldu.ptr);
-}
-
-// =====================================================================================
-// =====================================================================================
-// =====================================================================================
-// =====================================================================================
-// =====================================================================================
-// The actual interface to the unmanaged code
-static class BSAPICPP
-{
-// ===============================================================================
-// Link back to the managed code for outputting log messages
-[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
-public delegate void DebugLogCallback([MarshalAs(UnmanagedType.LPStr)]string msg);
-
-// ===============================================================================
-// Initialization and simulation
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern IntPtr Initialize2(Vector3 maxPosition, IntPtr parms,
- int maxCollisions, IntPtr collisionArray,
- int maxUpdates, IntPtr updateArray,
- DebugLogCallback logRoutine);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern int PhysicsStep2(IntPtr world, float timeStep, int maxSubSteps, float fixedTimeStep,
- out int updatedEntityCount, out int collidersCount);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern void Shutdown2(IntPtr sim);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern bool PushUpdate2(IntPtr obj);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern bool UpdateParameter2(IntPtr world, uint localID, String parm, float value);
-
-// =====================================================================================
-// Mesh, hull, shape and body creation helper routines
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern IntPtr CreateMeshShape2(IntPtr world,
- int indicesCount, [MarshalAs(UnmanagedType.LPArray)] int[] indices,
- int verticesCount, [MarshalAs(UnmanagedType.LPArray)] float[] vertices );
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern IntPtr CreateGImpactShape2(IntPtr world,
- int indicesCount, [MarshalAs(UnmanagedType.LPArray)] int[] indices,
- int verticesCount, [MarshalAs(UnmanagedType.LPArray)] float[] vertices );
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern IntPtr CreateHullShape2(IntPtr world,
- int hullCount, [MarshalAs(UnmanagedType.LPArray)] float[] hulls);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern IntPtr BuildHullShapeFromMesh2(IntPtr world, IntPtr meshShape, HACDParams parms);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern IntPtr BuildConvexHullShapeFromMesh2(IntPtr world, IntPtr meshShape);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern IntPtr CreateConvexHullShape2(IntPtr world,
- int indicesCount, [MarshalAs(UnmanagedType.LPArray)] int[] indices,
- int verticesCount, [MarshalAs(UnmanagedType.LPArray)] float[] vertices );
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern IntPtr BuildNativeShape2(IntPtr world, ShapeData shapeData);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern bool IsNativeShape2(IntPtr shape);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern void SetShapeCollisionMargin(IntPtr shape, float margin);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern IntPtr BuildCapsuleShape2(IntPtr world, float radius, float height, Vector3 scale);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern IntPtr CreateCompoundShape2(IntPtr sim, bool enableDynamicAabbTree);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern int GetNumberOfCompoundChildren2(IntPtr cShape);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern void AddChildShapeToCompoundShape2(IntPtr cShape, IntPtr addShape, Vector3 pos, Quaternion rot);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern IntPtr GetChildShapeFromCompoundShapeIndex2(IntPtr cShape, int indx);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern IntPtr RemoveChildShapeFromCompoundShapeIndex2(IntPtr cShape, int indx);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern void RemoveChildShapeFromCompoundShape2(IntPtr cShape, IntPtr removeShape);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern void UpdateChildTransform2(IntPtr pShape, int childIndex, Vector3 pos, Quaternion rot, bool shouldRecalculateLocalAabb);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern void RecalculateCompoundShapeLocalAabb2(IntPtr cShape);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern IntPtr DuplicateCollisionShape2(IntPtr sim, IntPtr srcShape, uint id);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern bool DeleteCollisionShape2(IntPtr world, IntPtr shape);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern int GetBodyType2(IntPtr obj);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern IntPtr CreateBodyFromShape2(IntPtr sim, IntPtr shape, uint id, Vector3 pos, Quaternion rot);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern IntPtr CreateBodyWithDefaultMotionState2(IntPtr shape, uint id, Vector3 pos, Quaternion rot);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern IntPtr CreateGhostFromShape2(IntPtr sim, IntPtr shape, uint id, Vector3 pos, Quaternion rot);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern void DestroyObject2(IntPtr sim, IntPtr obj);
-
-// =====================================================================================
-// Terrain creation and helper routines
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern IntPtr CreateGroundPlaneShape2(uint id, float height, float collisionMargin);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern IntPtr CreateTerrainShape2(uint id, Vector3 size, float minHeight, float maxHeight,
- [MarshalAs(UnmanagedType.LPArray)] float[] heightMap,
- float scaleFactor, float collisionMargin);
-
-// =====================================================================================
-// Constraint creation and helper routines
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern IntPtr Create6DofConstraint2(IntPtr world, IntPtr obj1, IntPtr obj2,
- Vector3 frame1loc, Quaternion frame1rot,
- Vector3 frame2loc, Quaternion frame2rot,
- bool useLinearReferenceFrameA, bool disableCollisionsBetweenLinkedBodies);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern IntPtr Create6DofConstraintToPoint2(IntPtr world, IntPtr obj1, IntPtr obj2,
- Vector3 joinPoint,
- bool useLinearReferenceFrameA, bool disableCollisionsBetweenLinkedBodies);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern IntPtr Create6DofConstraintFixed2(IntPtr world, IntPtr obj1,
- Vector3 frameInBloc, Quaternion frameInBrot,
- bool useLinearReferenceFrameB, bool disableCollisionsBetweenLinkedBodies);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern IntPtr Create6DofSpringConstraint2(IntPtr world, IntPtr obj1, IntPtr obj2,
- Vector3 frame1loc, Quaternion frame1rot,
- Vector3 frame2loc, Quaternion frame2rot,
- bool useLinearReferenceFrameA, bool disableCollisionsBetweenLinkedBodies);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern IntPtr CreateHingeConstraint2(IntPtr world, IntPtr obj1, IntPtr obj2,
- Vector3 pivotinA, Vector3 pivotinB,
- Vector3 axisInA, Vector3 axisInB,
- bool useLinearReferenceFrameA, bool disableCollisionsBetweenLinkedBodies);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern IntPtr CreateSliderConstraint2(IntPtr world, IntPtr obj1, IntPtr obj2,
- Vector3 frameInAloc, Quaternion frameInArot,
- Vector3 frameInBloc, Quaternion frameInBrot,
- bool useLinearReferenceFrameA, bool disableCollisionsBetweenLinkedBodies);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern IntPtr CreateConeTwistConstraint2(IntPtr world, IntPtr obj1, IntPtr obj2,
- Vector3 frameInAloc, Quaternion frameInArot,
- Vector3 frameInBloc, Quaternion frameInBrot,
- bool disableCollisionsBetweenLinkedBodies);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern IntPtr CreateGearConstraint2(IntPtr world, IntPtr obj1, IntPtr obj2,
- Vector3 axisInA, Vector3 axisInB,
- float ratio, bool disableCollisionsBetweenLinkedBodies);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern IntPtr CreatePoint2PointConstraint2(IntPtr world, IntPtr obj1, IntPtr obj2,
- Vector3 pivotInA, Vector3 pivotInB,
- bool disableCollisionsBetweenLinkedBodies);
-
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern void SetConstraintEnable2(IntPtr constrain, float numericTrueFalse);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern void SetConstraintNumSolverIterations2(IntPtr constrain, float iterations);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern bool SetFrames2(IntPtr constrain,
- Vector3 frameA, Quaternion frameArot, Vector3 frameB, Quaternion frameBrot);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern bool SetLinearLimits2(IntPtr constrain, Vector3 low, Vector3 hi);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern bool SetAngularLimits2(IntPtr constrain, Vector3 low, Vector3 hi);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern bool UseFrameOffset2(IntPtr constrain, float enable);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern bool TranslationalLimitMotor2(IntPtr constrain, float enable, float targetVel, float maxMotorForce);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern bool SetBreakingImpulseThreshold2(IntPtr constrain, float threshold);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern bool HingeSetLimits2(IntPtr constrain, float low, float high, float softness, float bias, float relaxation);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern bool ConstraintSpringEnable2(IntPtr constrain, int index, float numericTrueFalse);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern bool ConstraintSpringSetEquilibriumPoint2(IntPtr constrain, int index, float equilibriumPoint);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern bool ConstraintSpringSetStiffness2(IntPtr constrain, int index, float stiffness);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern bool ConstraintSpringSetDamping2(IntPtr constrain, int index, float damping);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern bool SliderSetLimits2(IntPtr constrain, int lowerUpper, int linAng, float val);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern bool SliderSet2(IntPtr constrain, int softRestDamp, int dirLimOrtho, int linAng, float val);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern bool SliderMotorEnable2(IntPtr constrain, int linAng, float numericTrueFalse);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern bool SliderMotor2(IntPtr constrain, int forceVel, int linAng, float val);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern bool CalculateTransforms2(IntPtr constrain);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern bool SetConstraintParam2(IntPtr constrain, ConstraintParams paramIndex, float value, ConstraintParamAxis axis);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern bool DestroyConstraint2(IntPtr world, IntPtr constrain);
-
-// =====================================================================================
-// btCollisionWorld entries
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern void UpdateSingleAabb2(IntPtr world, IntPtr obj);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern void UpdateAabbs2(IntPtr world);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern bool GetForceUpdateAllAabbs2(IntPtr world);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern void SetForceUpdateAllAabbs2(IntPtr world, bool force);
-
-// =====================================================================================
-// btDynamicsWorld entries
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern bool AddObjectToWorld2(IntPtr world, IntPtr obj);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern bool RemoveObjectFromWorld2(IntPtr world, IntPtr obj);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern bool ClearCollisionProxyCache2(IntPtr world, IntPtr obj);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern bool AddConstraintToWorld2(IntPtr world, IntPtr constrain, bool disableCollisionsBetweenLinkedObjects);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern bool RemoveConstraintFromWorld2(IntPtr world, IntPtr constrain);
-// =====================================================================================
-// btCollisionObject entries
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern Vector3 GetAnisotripicFriction2(IntPtr constrain);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern Vector3 SetAnisotripicFriction2(IntPtr constrain, Vector3 frict);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern bool HasAnisotripicFriction2(IntPtr constrain);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern void SetContactProcessingThreshold2(IntPtr obj, float val);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern float GetContactProcessingThreshold2(IntPtr obj);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern bool IsStaticObject2(IntPtr obj);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern bool IsKinematicObject2(IntPtr obj);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern bool IsStaticOrKinematicObject2(IntPtr obj);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern bool HasContactResponse2(IntPtr obj);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern void SetCollisionShape2(IntPtr sim, IntPtr obj, IntPtr shape);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern IntPtr GetCollisionShape2(IntPtr obj);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern int GetActivationState2(IntPtr obj);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern void SetActivationState2(IntPtr obj, int state);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern void SetDeactivationTime2(IntPtr obj, float dtime);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern float GetDeactivationTime2(IntPtr obj);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern void ForceActivationState2(IntPtr obj, ActivationState state);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern void Activate2(IntPtr obj, bool forceActivation);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern bool IsActive2(IntPtr obj);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern void SetRestitution2(IntPtr obj, float val);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern float GetRestitution2(IntPtr obj);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern void SetFriction2(IntPtr obj, float val);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern float GetFriction2(IntPtr obj);
-
- /* Haven't defined the type 'Transform'
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern Transform GetWorldTransform2(IntPtr obj);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern void setWorldTransform2(IntPtr obj, Transform trans);
- */
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern Vector3 GetPosition2(IntPtr obj);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern Quaternion GetOrientation2(IntPtr obj);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern void SetTranslation2(IntPtr obj, Vector3 position, Quaternion rotation);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern IntPtr GetBroadphaseHandle2(IntPtr obj);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern void SetBroadphaseHandle2(IntPtr obj, IntPtr handle);
-
- /*
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern Transform GetInterpolationWorldTransform2(IntPtr obj);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern void SetInterpolationWorldTransform2(IntPtr obj, Transform trans);
- */
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern void SetInterpolationLinearVelocity2(IntPtr obj, Vector3 vel);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern void SetInterpolationAngularVelocity2(IntPtr obj, Vector3 vel);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern void SetInterpolationVelocity2(IntPtr obj, Vector3 linearVel, Vector3 angularVel);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern float GetHitFraction2(IntPtr obj);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern void SetHitFraction2(IntPtr obj, float val);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern CollisionFlags GetCollisionFlags2(IntPtr obj);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern CollisionFlags SetCollisionFlags2(IntPtr obj, CollisionFlags flags);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern CollisionFlags AddToCollisionFlags2(IntPtr obj, CollisionFlags flags);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern CollisionFlags RemoveFromCollisionFlags2(IntPtr obj, CollisionFlags flags);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern float GetCcdMotionThreshold2(IntPtr obj);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern void SetCcdMotionThreshold2(IntPtr obj, float val);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern float GetCcdSweptSphereRadius2(IntPtr obj);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern void SetCcdSweptSphereRadius2(IntPtr obj, float val);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern IntPtr GetUserPointer2(IntPtr obj);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern void SetUserPointer2(IntPtr obj, IntPtr val);
-
-// =====================================================================================
-// btRigidBody entries
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern void ApplyGravity2(IntPtr obj);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern void SetGravity2(IntPtr obj, Vector3 val);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern Vector3 GetGravity2(IntPtr obj);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern void SetDamping2(IntPtr obj, float lin_damping, float ang_damping);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern void SetLinearDamping2(IntPtr obj, float lin_damping);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern void SetAngularDamping2(IntPtr obj, float ang_damping);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern float GetLinearDamping2(IntPtr obj);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern float GetAngularDamping2(IntPtr obj);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern float GetLinearSleepingThreshold2(IntPtr obj);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern float GetAngularSleepingThreshold2(IntPtr obj);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern void ApplyDamping2(IntPtr obj, float timeStep);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern void SetMassProps2(IntPtr obj, float mass, Vector3 inertia);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern Vector3 GetLinearFactor2(IntPtr obj);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern void SetLinearFactor2(IntPtr obj, Vector3 factor);
-
- /*
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern void SetCenterOfMassTransform2(IntPtr obj, Transform trans);
- */
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern void SetCenterOfMassByPosRot2(IntPtr obj, Vector3 pos, Quaternion rot);
-
-// Add a force to the object as if its mass is one.
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern void ApplyCentralForce2(IntPtr obj, Vector3 force);
-
-// Set the force being applied to the object as if its mass is one.
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern void SetObjectForce2(IntPtr obj, Vector3 force);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern Vector3 GetTotalForce2(IntPtr obj);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern Vector3 GetTotalTorque2(IntPtr obj);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern Vector3 GetInvInertiaDiagLocal2(IntPtr obj);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern void SetInvInertiaDiagLocal2(IntPtr obj, Vector3 inert);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern void SetSleepingThresholds2(IntPtr obj, float lin_threshold, float ang_threshold);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern void ApplyTorque2(IntPtr obj, Vector3 torque);
-
-// Apply force at the given point. Will add torque to the object.
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern void ApplyForce2(IntPtr obj, Vector3 force, Vector3 pos);
-
-// Apply impulse to the object. Same as "ApplycentralForce" but force scaled by object's mass.
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern void ApplyCentralImpulse2(IntPtr obj, Vector3 imp);
-
-// Apply impulse to the object's torque. Force is scaled by object's mass.
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern void ApplyTorqueImpulse2(IntPtr obj, Vector3 imp);
-
-// Apply impulse at the point given. For is scaled by object's mass and effects both linear and angular forces.
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern void ApplyImpulse2(IntPtr obj, Vector3 imp, Vector3 pos);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern void ClearForces2(IntPtr obj);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern void ClearAllForces2(IntPtr obj);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern void UpdateInertiaTensor2(IntPtr obj);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern Vector3 GetCenterOfMassPosition2(IntPtr obj);
-
- /*
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern Transform GetCenterOfMassTransform2(IntPtr obj);
- */
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern Vector3 GetLinearVelocity2(IntPtr obj);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern Vector3 GetAngularVelocity2(IntPtr obj);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern void SetLinearVelocity2(IntPtr obj, Vector3 val);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern void SetAngularVelocity2(IntPtr obj, Vector3 angularVelocity);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern Vector3 GetVelocityInLocalPoint2(IntPtr obj, Vector3 pos);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern void Translate2(IntPtr obj, Vector3 trans);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern void UpdateDeactivation2(IntPtr obj, float timeStep);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern bool WantsSleeping2(IntPtr obj);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern void SetAngularFactor2(IntPtr obj, float factor);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern void SetAngularFactorV2(IntPtr obj, Vector3 factor);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern Vector3 GetAngularFactor2(IntPtr obj);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern bool IsInWorld2(IntPtr obj);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern void AddConstraintRef2(IntPtr obj, IntPtr constrain);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern void RemoveConstraintRef2(IntPtr obj, IntPtr constrain);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern IntPtr GetConstraintRef2(IntPtr obj, int index);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern int GetNumConstraintRefs2(IntPtr obj);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern bool SetCollisionGroupMask2(IntPtr body, uint filter, uint mask);
-
-// =====================================================================================
-// btCollisionShape entries
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern float GetAngularMotionDisc2(IntPtr shape);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern float GetContactBreakingThreshold2(IntPtr shape, float defaultFactor);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern bool IsPolyhedral2(IntPtr shape);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern bool IsConvex2d2(IntPtr shape);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern bool IsConvex2(IntPtr shape);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern bool IsNonMoving2(IntPtr shape);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern bool IsConcave2(IntPtr shape);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern bool IsCompound2(IntPtr shape);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern bool IsSoftBody2(IntPtr shape);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern bool IsInfinite2(IntPtr shape);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern void SetLocalScaling2(IntPtr shape, Vector3 scale);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern Vector3 GetLocalScaling2(IntPtr shape);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern Vector3 CalculateLocalInertia2(IntPtr shape, float mass);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern int GetShapeType2(IntPtr shape);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern void SetMargin2(IntPtr shape, float val);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern float GetMargin2(IntPtr shape);
-
-
-// =====================================================================================
-// Raycast
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern SweepHit ConvexSweepTest2(IntPtr sim, IntPtr obj, Vector3 from, Vector3 to, float margin);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern RaycastHit RayTest2(IntPtr sim, Vector3 from, Vector3 to, uint filterGroup, uint filterMask);
-
-// =====================================================================================
-// Debugging
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern void DumpRigidBody2(IntPtr sim, IntPtr collisionObject);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern void DumpCollisionShape2(IntPtr sim, IntPtr collisionShape);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern void DumpMapInfo2(IntPtr sim, IntPtr manInfo);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern void DumpConstraint2(IntPtr sim, IntPtr constrain);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern void DumpActivationInfo2(IntPtr sim);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern void DumpAllInfo2(IntPtr sim);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern void DumpPhysicsStatistics2(IntPtr sim);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern void ResetBroadphasePool(IntPtr sim);
-
-[DllImport("BulletSim", CallingConvention = CallingConvention.Cdecl), SuppressUnmanagedCodeSecurity]
-public static extern void ResetConstraintSolver(IntPtr sim);
-
-}
-
-}
-
-}
diff --git a/OpenSim/Region/PhysicsModules/BulletS/BSAPIXNA.cs b/OpenSim/Region/PhysicsModules/BulletS/BSAPIXNA.cs
index a439cc0dcc..4e4ac2f433 100755
--- a/OpenSim/Region/PhysicsModules/BulletS/BSAPIXNA.cs
+++ b/OpenSim/Region/PhysicsModules/BulletS/BSAPIXNA.cs
@@ -42,2435 +42,2439 @@ using BulletXNA.BulletCollision.CollisionDispatch;
namespace OpenSim.Region.PhysicsModule.BulletS
{
-public sealed class BSAPIXNA : BSAPITemplate
-{
-private sealed class BulletWorldXNA : BulletWorld
-{
- public DiscreteDynamicsWorld world;
- public BulletWorldXNA(uint id, BSScene physScene, DiscreteDynamicsWorld xx)
- : base(id, physScene)
+ public sealed class BSAPIXNA : BSAPITemplate
{
- world = xx;
- }
-}
-
-private sealed class BulletBodyXNA : BulletBody
-{
- public CollisionObject body;
- public RigidBody rigidBody { get { return RigidBody.Upcast(body); } }
-
- public BulletBodyXNA(uint id, CollisionObject xx)
- : base(id)
- {
- body = xx;
- }
- public override bool HasPhysicalBody
- {
- get { return body != null; }
- }
- public override void Clear()
- {
- body = null;
- }
- public override string AddrString
- {
- get { return "XNARigidBody"; }
- }
-}
-
-private sealed class BulletShapeXNA : BulletShape
-{
- public CollisionShape shape;
- public BulletShapeXNA(CollisionShape xx, BSPhysicsShapeType typ)
- : base()
- {
- shape = xx;
- shapeType = typ;
- }
- public override bool HasPhysicalShape
- {
- get { return shape != null; }
- }
- public override void Clear()
- {
- shape = null;
- }
- public override BulletShape Clone()
- {
- return new BulletShapeXNA(shape, shapeType);
- }
- public override bool ReferenceSame(BulletShape other)
- {
- BulletShapeXNA otheru = other as BulletShapeXNA;
- return (otheru != null) && (this.shape == otheru.shape);
-
- }
- public override string AddrString
- {
- get { return "XNACollisionShape"; }
- }
-}
-private sealed class BulletConstraintXNA : BulletConstraint
-{
- public TypedConstraint constrain;
- public BulletConstraintXNA(TypedConstraint xx) : base()
- {
- constrain = xx;
- }
-
- public override void Clear()
- {
- constrain = null;
- }
- public override bool HasPhysicalConstraint { get { return constrain != null; } }
-
- // Used for log messages for a unique display of the memory/object allocated to this instance
- public override string AddrString
- {
- get { return "XNAConstraint"; }
- }
-}
- internal int m_maxCollisions;
- internal CollisionDesc[] UpdatedCollisions;
- internal int LastCollisionDesc = 0;
- internal int m_maxUpdatesPerFrame;
- internal int LastEntityProperty = 0;
-
- internal EntityProperties[] UpdatedObjects;
- internal Dictionary specialCollisionObjects;
-
- private static int m_collisionsThisFrame;
- private BSScene PhysicsScene { get; set; }
-
- public override string BulletEngineName { get { return "BulletXNA"; } }
- public override string BulletEngineVersion { get; protected set; }
-
- public BSAPIXNA(string paramName, BSScene physScene)
- {
- PhysicsScene = physScene;
- }
-
- ///
- ///
- ///
- ///
- ///
- public override bool RemoveObjectFromWorld(BulletWorld pWorld, BulletBody pBody)
- {
- DiscreteDynamicsWorld world = (pWorld as BulletWorldXNA).world;
- RigidBody body = ((BulletBodyXNA)pBody).rigidBody;
- CollisionObject collisionObject = ((BulletBodyXNA)pBody).body;
- if (body != null)
- world.RemoveRigidBody(body);
- else if (collisionObject != null)
- world.RemoveCollisionObject(collisionObject);
- else
- return false;
- return true;
- }
-
- public override bool ClearCollisionProxyCache(BulletWorld pWorld, BulletBody pBody)
- {
- DiscreteDynamicsWorld world = (pWorld as BulletWorldXNA).world;
- RigidBody body = ((BulletBodyXNA)pBody).rigidBody;
- CollisionObject collisionObject = ((BulletBodyXNA)pBody).body;
- if (body != null && collisionObject != null && collisionObject.GetBroadphaseHandle() != null)
+ private sealed class BulletWorldXNA : BulletWorld
{
- world.RemoveCollisionObject(collisionObject);
- world.AddCollisionObject(collisionObject);
- }
- return true;
- }
-
- public override bool AddConstraintToWorld(BulletWorld pWorld, BulletConstraint pConstraint, bool pDisableCollisionsBetweenLinkedObjects)
- {
- DiscreteDynamicsWorld world = (pWorld as BulletWorldXNA).world;
- TypedConstraint constraint = (pConstraint as BulletConstraintXNA).constrain;
- world.AddConstraint(constraint, pDisableCollisionsBetweenLinkedObjects);
-
- return true;
-
- }
-
- public override bool RemoveConstraintFromWorld(BulletWorld pWorld, BulletConstraint pConstraint)
- {
- DiscreteDynamicsWorld world = (pWorld as BulletWorldXNA).world;
- TypedConstraint constraint = (pConstraint as BulletConstraintXNA).constrain;
- world.RemoveConstraint(constraint);
- return true;
- }
-
- public override void SetRestitution(BulletBody pCollisionObject, float pRestitution)
- {
- CollisionObject collisionObject = (pCollisionObject as BulletBodyXNA).body;
- collisionObject.SetRestitution(pRestitution);
- }
-
- public override int GetShapeType(BulletShape pShape)
- {
- CollisionShape shape = (pShape as BulletShapeXNA).shape;
- return (int)shape.GetShapeType();
- }
- public override void SetMargin(BulletShape pShape, float pMargin)
- {
- CollisionShape shape = (pShape as BulletShapeXNA).shape;
- shape.SetMargin(pMargin);
- }
-
- public override float GetMargin(BulletShape pShape)
- {
- CollisionShape shape = (pShape as BulletShapeXNA).shape;
- return shape.GetMargin();
- }
-
- public override void SetLocalScaling(BulletShape pShape, Vector3 pScale)
- {
- CollisionShape shape = (pShape as BulletShapeXNA).shape;
- IndexedVector3 vec = new IndexedVector3(pScale.X, pScale.Y, pScale.Z);
- shape.SetLocalScaling(ref vec);
-
- }
-
- public override void SetContactProcessingThreshold(BulletBody pCollisionObject, float contactprocessingthreshold)
- {
- CollisionObject collisionObject = (pCollisionObject as BulletBodyXNA).rigidBody;
- collisionObject.SetContactProcessingThreshold(contactprocessingthreshold);
- }
-
- public override void SetCcdMotionThreshold(BulletBody pCollisionObject, float pccdMotionThreashold)
- {
- CollisionObject collisionObject = (pCollisionObject as BulletBodyXNA).body;
- collisionObject.SetCcdMotionThreshold(pccdMotionThreashold);
- }
-
- public override void SetCcdSweptSphereRadius(BulletBody pCollisionObject, float pCcdSweptSphereRadius)
- {
- CollisionObject collisionObject = (pCollisionObject as BulletBodyXNA).body;
- collisionObject.SetCcdSweptSphereRadius(pCcdSweptSphereRadius);
- }
-
- public override void SetAngularFactorV(BulletBody pBody, Vector3 pAngularFactor)
- {
- RigidBody body = (pBody as BulletBodyXNA).rigidBody;
- body.SetAngularFactor(new IndexedVector3(pAngularFactor.X, pAngularFactor.Y, pAngularFactor.Z));
- }
-
- public override CollisionFlags AddToCollisionFlags(BulletBody pCollisionObject, CollisionFlags pcollisionFlags)
- {
- CollisionObject collisionObject = (pCollisionObject as BulletBodyXNA).body;
- CollisionFlags existingcollisionFlags = (CollisionFlags)(uint)collisionObject.GetCollisionFlags();
- existingcollisionFlags |= pcollisionFlags;
- collisionObject.SetCollisionFlags((BulletXNA.BulletCollision.CollisionFlags)(uint)existingcollisionFlags);
- return (CollisionFlags) (uint) existingcollisionFlags;
- }
-
- public override bool AddObjectToWorld(BulletWorld pWorld, BulletBody pBody)
- {
- DiscreteDynamicsWorld world = (pWorld as BulletWorldXNA).world;
- CollisionObject cbody = (pBody as BulletBodyXNA).body;
- RigidBody rbody = cbody as RigidBody;
-
- // Bullet resets several variables when an object is added to the world. In particular,
- // BulletXNA resets position and rotation. Gravity is also reset depending on the static/dynamic
- // type. Of course, the collision flags in the broadphase proxy are initialized to default.
- IndexedMatrix origPos = cbody.GetWorldTransform();
- if (rbody != null)
- {
- IndexedVector3 origGrav = rbody.GetGravity();
- world.AddRigidBody(rbody);
- rbody.SetGravity(origGrav);
- }
- else
- {
- world.AddCollisionObject(cbody);
- }
- cbody.SetWorldTransform(origPos);
-
- pBody.ApplyCollisionMask(pWorld.physicsScene);
-
- //if (body.GetBroadphaseHandle() != null)
- // world.UpdateSingleAabb(body);
- return true;
- }
-
- public override void ForceActivationState(BulletBody pCollisionObject, ActivationState pActivationState)
- {
- CollisionObject collisionObject = (pCollisionObject as BulletBodyXNA).body;
- collisionObject.ForceActivationState((BulletXNA.BulletCollision.ActivationState)(uint)pActivationState);
- }
-
- public override void UpdateSingleAabb(BulletWorld pWorld, BulletBody pCollisionObject)
- {
- DiscreteDynamicsWorld world = (pWorld as BulletWorldXNA).world;
- CollisionObject collisionObject = (pCollisionObject as BulletBodyXNA).body;
- world.UpdateSingleAabb(collisionObject);
- }
-
- public override void UpdateAabbs(BulletWorld pWorld) {
- DiscreteDynamicsWorld world = (pWorld as BulletWorldXNA).world;
- world.UpdateAabbs();
- }
- public override bool GetForceUpdateAllAabbs(BulletWorld pWorld) {
- DiscreteDynamicsWorld world = (pWorld as BulletWorldXNA).world;
- return world.GetForceUpdateAllAabbs();
-
- }
- public override void SetForceUpdateAllAabbs(BulletWorld pWorld, bool pForce)
- {
- DiscreteDynamicsWorld world = (pWorld as BulletWorldXNA).world;
- world.SetForceUpdateAllAabbs(pForce);
- }
-
- public override bool SetCollisionGroupMask(BulletBody pCollisionObject, uint pGroup, uint pMask)
- {
- CollisionObject collisionObject = (pCollisionObject as BulletBodyXNA).body;
- collisionObject.GetBroadphaseHandle().m_collisionFilterGroup = (BulletXNA.BulletCollision.CollisionFilterGroups) pGroup;
- collisionObject.GetBroadphaseHandle().m_collisionFilterGroup = (BulletXNA.BulletCollision.CollisionFilterGroups) pGroup;
- if ((uint) collisionObject.GetBroadphaseHandle().m_collisionFilterGroup == 0)
- return false;
- return true;
- }
-
- public override void ClearAllForces(BulletBody pCollisionObject)
- {
- CollisionObject collisionObject = (pCollisionObject as BulletBodyXNA).body;
- IndexedVector3 zeroVector = new IndexedVector3(0, 0, 0);
- collisionObject.SetInterpolationLinearVelocity(ref zeroVector);
- collisionObject.SetInterpolationAngularVelocity(ref zeroVector);
- IndexedMatrix bodytransform = collisionObject.GetWorldTransform();
-
- collisionObject.SetInterpolationWorldTransform(ref bodytransform);
-
- if (collisionObject is RigidBody)
- {
- RigidBody rigidbody = collisionObject as RigidBody;
- rigidbody.SetLinearVelocity(zeroVector);
- rigidbody.SetAngularVelocity(zeroVector);
- rigidbody.ClearForces();
- }
- }
-
- public override void SetInterpolationAngularVelocity(BulletBody pCollisionObject, Vector3 pVector3)
- {
- CollisionObject collisionObject = (pCollisionObject as BulletBodyXNA).rigidBody;
- IndexedVector3 vec = new IndexedVector3(pVector3.X, pVector3.Y, pVector3.Z);
- collisionObject.SetInterpolationAngularVelocity(ref vec);
- }
-
- public override void SetAngularVelocity(BulletBody pBody, Vector3 pVector3)
- {
- RigidBody body = (pBody as BulletBodyXNA).rigidBody;
- IndexedVector3 vec = new IndexedVector3(pVector3.X, pVector3.Y, pVector3.Z);
- body.SetAngularVelocity(ref vec);
- }
- public override Vector3 GetTotalForce(BulletBody pBody)
- {
- RigidBody body = (pBody as BulletBodyXNA).rigidBody;
- IndexedVector3 iv3 = body.GetTotalForce();
- return new Vector3(iv3.X, iv3.Y, iv3.Z);
- }
- public override Vector3 GetTotalTorque(BulletBody pBody)
- {
- RigidBody body = (pBody as BulletBodyXNA).rigidBody;
- IndexedVector3 iv3 = body.GetTotalTorque();
- return new Vector3(iv3.X, iv3.Y, iv3.Z);
- }
- public override Vector3 GetInvInertiaDiagLocal(BulletBody pBody)
- {
- RigidBody body = (pBody as BulletBodyXNA).rigidBody;
- IndexedVector3 iv3 = body.GetInvInertiaDiagLocal();
- return new Vector3(iv3.X, iv3.Y, iv3.Z);
- }
- public override void SetInvInertiaDiagLocal(BulletBody pBody, Vector3 inert)
- {
- RigidBody body = (pBody as BulletBodyXNA).rigidBody;
- IndexedVector3 iv3 = new IndexedVector3(inert.X, inert.Y, inert.Z);
- body.SetInvInertiaDiagLocal(ref iv3);
- }
- public override void ApplyForce(BulletBody pBody, Vector3 force, Vector3 pos)
- {
- RigidBody body = (pBody as BulletBodyXNA).rigidBody;
- IndexedVector3 forceiv3 = new IndexedVector3(force.X, force.Y, force.Z);
- IndexedVector3 posiv3 = new IndexedVector3(pos.X, pos.Y, pos.Z);
- body.ApplyForce(ref forceiv3, ref posiv3);
- }
- public override void ApplyImpulse(BulletBody pBody, Vector3 imp, Vector3 pos)
- {
- RigidBody body = (pBody as BulletBodyXNA).rigidBody;
- IndexedVector3 impiv3 = new IndexedVector3(imp.X, imp.Y, imp.Z);
- IndexedVector3 posiv3 = new IndexedVector3(pos.X, pos.Y, pos.Z);
- body.ApplyImpulse(ref impiv3, ref posiv3);
- }
-
- public override void ClearForces(BulletBody pBody)
- {
- RigidBody body = (pBody as BulletBodyXNA).rigidBody;
- body.ClearForces();
- }
-
- public override void SetTranslation(BulletBody pCollisionObject, Vector3 _position, Quaternion _orientation)
- {
- CollisionObject collisionObject = (pCollisionObject as BulletBodyXNA).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;
- collisionObject.SetWorldTransform(mat);
-
- }
-
- public override Vector3 GetPosition(BulletBody pCollisionObject)
- {
- CollisionObject collisionObject = (pCollisionObject as BulletBodyXNA).rigidBody;
- IndexedVector3 pos = collisionObject.GetInterpolationWorldTransform()._origin;
- return new Vector3(pos.X, pos.Y, pos.Z);
- }
-
- public override Vector3 CalculateLocalInertia(BulletShape pShape, float pphysMass)
- {
- CollisionShape shape = (pShape as BulletShapeXNA).shape;
- IndexedVector3 inertia = IndexedVector3.Zero;
- shape.CalculateLocalInertia(pphysMass, out inertia);
- return new Vector3(inertia.X, inertia.Y, inertia.Z);
- }
-
- public override void SetMassProps(BulletBody pBody, float pphysMass, Vector3 plocalInertia)
- {
- RigidBody body = (pBody as BulletBodyXNA).rigidBody;
- if (body != null) // Can't set mass props on collision object.
- {
- IndexedVector3 inertia = new IndexedVector3(plocalInertia.X, plocalInertia.Y, plocalInertia.Z);
- body.SetMassProps(pphysMass, inertia);
- }
- }
-
-
- public override void SetObjectForce(BulletBody pBody, Vector3 _force)
- {
- RigidBody body = (pBody as BulletBodyXNA).rigidBody;
- IndexedVector3 force = new IndexedVector3(_force.X, _force.Y, _force.Z);
- body.SetTotalForce(ref force);
- }
-
- public override void SetFriction(BulletBody pCollisionObject, float _currentFriction)
- {
- CollisionObject collisionObject = (pCollisionObject as BulletBodyXNA).body;
- collisionObject.SetFriction(_currentFriction);
- }
-
- public override void SetLinearVelocity(BulletBody pBody, Vector3 _velocity)
- {
- RigidBody body = (pBody as BulletBodyXNA).rigidBody;
- IndexedVector3 velocity = new IndexedVector3(_velocity.X, _velocity.Y, _velocity.Z);
- body.SetLinearVelocity(velocity);
- }
-
- public override void Activate(BulletBody pCollisionObject, bool pforceactivation)
- {
- CollisionObject collisionObject = (pCollisionObject as BulletBodyXNA).rigidBody;
- collisionObject.Activate(pforceactivation);
-
- }
-
- public override Quaternion GetOrientation(BulletBody pCollisionObject)
- {
- CollisionObject collisionObject = (pCollisionObject as BulletBodyXNA).rigidBody;
- IndexedQuaternion mat = collisionObject.GetInterpolationWorldTransform().GetRotation();
- return new Quaternion(mat.X, mat.Y, mat.Z, mat.W);
- }
-
- public override CollisionFlags RemoveFromCollisionFlags(BulletBody pCollisionObject, CollisionFlags pcollisionFlags)
- {
- CollisionObject collisionObject = (pCollisionObject as BulletBodyXNA).body;
- CollisionFlags existingcollisionFlags = (CollisionFlags)(uint)collisionObject.GetCollisionFlags();
- existingcollisionFlags &= ~pcollisionFlags;
- collisionObject.SetCollisionFlags((BulletXNA.BulletCollision.CollisionFlags)(uint)existingcollisionFlags);
- return (CollisionFlags)(uint)existingcollisionFlags;
- }
-
- public override float GetCcdMotionThreshold(BulletBody pCollisionObject)
- {
- CollisionObject collisionObject = (pCollisionObject as BulletBodyXNA).rigidBody;
- return collisionObject.GetCcdSquareMotionThreshold();
- }
-
- public override float GetCcdSweptSphereRadius(BulletBody pCollisionObject)
- {
- CollisionObject collisionObject = (pCollisionObject as BulletBodyXNA).rigidBody;
- return collisionObject.GetCcdSweptSphereRadius();
-
- }
-
- public override IntPtr GetUserPointer(BulletBody pCollisionObject)
- {
- CollisionObject shape = (pCollisionObject as BulletBodyXNA).body;
- return (IntPtr)shape.GetUserPointer();
- }
-
- public override void SetUserPointer(BulletBody pCollisionObject, IntPtr val)
- {
- CollisionObject shape = (pCollisionObject as BulletBodyXNA).body;
- shape.SetUserPointer(val);
- }
-
- public override void SetGravity(BulletBody pBody, Vector3 pGravity)
- {
- RigidBody body = (pBody as BulletBodyXNA).rigidBody;
- if (body != null) // Can't set collisionobject.set gravity
- {
- IndexedVector3 gravity = new IndexedVector3(pGravity.X, pGravity.Y, pGravity.Z);
- body.SetGravity(gravity);
- }
- }
-
- public override bool DestroyConstraint(BulletWorld pWorld, BulletConstraint pConstraint)
- {
- DiscreteDynamicsWorld world = (pWorld as BulletWorldXNA).world;
- TypedConstraint constraint = (pConstraint as BulletConstraintXNA).constrain;
- world.RemoveConstraint(constraint);
- return true;
- }
-
- public override bool SetLinearLimits(BulletConstraint pConstraint, Vector3 low, Vector3 high)
- {
- Generic6DofConstraint constraint = (pConstraint as BulletConstraintXNA).constrain 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;
- }
-
- public override bool SetAngularLimits(BulletConstraint pConstraint, Vector3 low, Vector3 high)
- {
- Generic6DofConstraint constraint = (pConstraint as BulletConstraintXNA).constrain 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;
- }
-
- public override void SetConstraintNumSolverIterations(BulletConstraint pConstraint, float cnt)
- {
- Generic6DofConstraint constraint = (pConstraint as BulletConstraintXNA).constrain as Generic6DofConstraint;
- constraint.SetOverrideNumSolverIterations((int)cnt);
- }
-
- public override bool CalculateTransforms(BulletConstraint pConstraint)
- {
- Generic6DofConstraint constraint = (pConstraint as BulletConstraintXNA).constrain as Generic6DofConstraint;
- constraint.CalculateTransforms();
- return true;
- }
-
- public override void SetConstraintEnable(BulletConstraint pConstraint, float p_2)
- {
- Generic6DofConstraint constraint = (pConstraint as BulletConstraintXNA).constrain as Generic6DofConstraint;
- constraint.SetEnabled((p_2 == 0) ? false : true);
- }
-
-
- public override BulletConstraint Create6DofConstraint(BulletWorld pWorld, BulletBody pBody1, BulletBody pBody2,
- Vector3 pframe1, Quaternion pframe1rot, Vector3 pframe2, Quaternion pframe2rot,
- bool puseLinearReferenceFrameA, bool pdisableCollisionsBetweenLinkedBodies)
-
- {
- DiscreteDynamicsWorld world = (pWorld as BulletWorldXNA).world;
- RigidBody body1 = (pBody1 as BulletBodyXNA).rigidBody;
- RigidBody body2 = (pBody2 as BulletBodyXNA).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 = frame2v;
-
- Generic6DofConstraint consttr = new Generic6DofConstraint(body1, body2, ref frame1, ref frame2,
- puseLinearReferenceFrameA);
- consttr.CalculateTransforms();
- world.AddConstraint(consttr,pdisableCollisionsBetweenLinkedBodies);
-
- return new BulletConstraintXNA(consttr);
- }
-
- public override BulletConstraint Create6DofConstraintFixed(BulletWorld pWorld, BulletBody pBody1,
- Vector3 pframe1, Quaternion pframe1rot,
- bool pUseLinearReferenceFrameB, bool pdisableCollisionsBetweenLinkedBodies)
- {
- DiscreteDynamicsWorld world = (pWorld as BulletWorldXNA).world;
- RigidBody body1 = (pBody1 as BulletBodyXNA).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;
-
- Generic6DofConstraint consttr = new Generic6DofConstraint(body1, ref frame1, pUseLinearReferenceFrameB);
- consttr.CalculateTransforms();
- world.AddConstraint(consttr,pdisableCollisionsBetweenLinkedBodies);
-
- return new BulletConstraintXNA(consttr);
- }
-
- ///
- ///
- ///
- ///
- ///
- ///
- ///
- ///
- ///
- ///
- public override BulletConstraint Create6DofConstraintToPoint(BulletWorld pWorld, BulletBody pBody1, BulletBody pBody2, Vector3 pjoinPoint, bool puseLinearReferenceFrameA, bool pdisableCollisionsBetweenLinkedBodies)
- {
- DiscreteDynamicsWorld world = (pWorld as BulletWorldXNA).world;
- RigidBody body1 = (pBody1 as BulletBodyXNA).rigidBody;
- RigidBody body2 = (pBody2 as BulletBodyXNA).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 new BulletConstraintXNA(consttr);
- }
- //SetFrames(m_constraint.ptr, frameA, frameArot, frameB, frameBrot);
- public override bool SetFrames(BulletConstraint pConstraint, Vector3 pframe1, Quaternion pframe1rot, Vector3 pframe2, Quaternion pframe2rot)
- {
- Generic6DofConstraint constraint = (pConstraint as BulletConstraintXNA).constrain 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 = frame2v;
- constraint.SetFrames(ref frame1, ref frame2);
- return true;
- }
-
- public override Vector3 GetLinearVelocity(BulletBody pBody)
- {
- RigidBody body = (pBody as BulletBodyXNA).rigidBody;
- IndexedVector3 iv3 = body.GetLinearVelocity();
- return new Vector3(iv3.X, iv3.Y, iv3.Z);
- }
- public override Vector3 GetAngularVelocity(BulletBody pBody)
- {
- RigidBody body = (pBody as BulletBodyXNA).rigidBody;
- IndexedVector3 iv3 = body.GetAngularVelocity();
- return new Vector3(iv3.X, iv3.Y, iv3.Z);
- }
- public override Vector3 GetVelocityInLocalPoint(BulletBody pBody, Vector3 pos)
- {
- RigidBody body = (pBody as BulletBodyXNA).rigidBody;
- IndexedVector3 posiv3 = new IndexedVector3(pos.X, pos.Y, pos.Z);
- IndexedVector3 iv3 = body.GetVelocityInLocalPoint(ref posiv3);
- return new Vector3(iv3.X, iv3.Y, iv3.Z);
- }
- public override void Translate(BulletBody pCollisionObject, Vector3 trans)
- {
- CollisionObject collisionObject = (pCollisionObject as BulletBodyXNA).rigidBody;
- collisionObject.Translate(new IndexedVector3(trans.X,trans.Y,trans.Z));
- }
- public override void UpdateDeactivation(BulletBody pBody, float timeStep)
- {
- RigidBody body = (pBody as BulletBodyXNA).rigidBody;
- body.UpdateDeactivation(timeStep);
- }
-
- public override bool WantsSleeping(BulletBody pBody)
- {
- RigidBody body = (pBody as BulletBodyXNA).rigidBody;
- return body.WantsSleeping();
- }
-
- public override void SetAngularFactor(BulletBody pBody, float factor)
- {
- RigidBody body = (pBody as BulletBodyXNA).rigidBody;
- body.SetAngularFactor(factor);
- }
-
- public override Vector3 GetAngularFactor(BulletBody pBody)
- {
- RigidBody body = (pBody as BulletBodyXNA).rigidBody;
- IndexedVector3 iv3 = body.GetAngularFactor();
- return new Vector3(iv3.X, iv3.Y, iv3.Z);
- }
-
- public override bool IsInWorld(BulletWorld pWorld, BulletBody pCollisionObject)
- {
- DiscreteDynamicsWorld world = (pWorld as BulletWorldXNA).world;
- CollisionObject collisionObject = (pCollisionObject as BulletBodyXNA).body;
- return world.IsInWorld(collisionObject);
- }
-
- public override void AddConstraintRef(BulletBody pBody, BulletConstraint pConstraint)
- {
- RigidBody body = (pBody as BulletBodyXNA).rigidBody;
- TypedConstraint constrain = (pConstraint as BulletConstraintXNA).constrain;
- body.AddConstraintRef(constrain);
- }
-
- public override void RemoveConstraintRef(BulletBody pBody, BulletConstraint pConstraint)
- {
- RigidBody body = (pBody as BulletBodyXNA).rigidBody;
- TypedConstraint constrain = (pConstraint as BulletConstraintXNA).constrain;
- body.RemoveConstraintRef(constrain);
- }
-
- public override BulletConstraint GetConstraintRef(BulletBody pBody, int index)
- {
- RigidBody body = (pBody as BulletBodyXNA).rigidBody;
- return new BulletConstraintXNA(body.GetConstraintRef(index));
- }
-
- public override int GetNumConstraintRefs(BulletBody pBody)
- {
- RigidBody body = (pBody as BulletBodyXNA).rigidBody;
- return body.GetNumConstraintRefs();
- }
-
- public override void SetInterpolationLinearVelocity(BulletBody pCollisionObject, Vector3 VehicleVelocity)
- {
- CollisionObject collisionObject = (pCollisionObject as BulletBodyXNA).rigidBody;
- IndexedVector3 velocity = new IndexedVector3(VehicleVelocity.X, VehicleVelocity.Y, VehicleVelocity.Z);
- collisionObject.SetInterpolationLinearVelocity(ref velocity);
- }
-
- public override bool UseFrameOffset(BulletConstraint pConstraint, float onOff)
- {
- Generic6DofConstraint constraint = (pConstraint as BulletConstraintXNA).constrain as Generic6DofConstraint;
- constraint.SetUseFrameOffset((onOff == 0) ? false : true);
- return true;
- }
- //SetBreakingImpulseThreshold(m_constraint.ptr, threshold);
- public override bool SetBreakingImpulseThreshold(BulletConstraint pConstraint, float threshold)
- {
- Generic6DofConstraint constraint = (pConstraint as BulletConstraintXNA).constrain as Generic6DofConstraint;
- constraint.SetBreakingImpulseThreshold(threshold);
- return true;
- }
- public override bool HingeSetLimits(BulletConstraint pConstraint, float low, float high, float softness, float bias, float relaxation)
- {
- HingeConstraint constraint = (pConstraint as BulletConstraintXNA).constrain as HingeConstraint;
- if (softness == HINGE_NOT_SPECIFIED)
- constraint.SetLimit(low, high);
- else
- constraint.SetLimit(low, high, softness, bias, relaxation);
- return true;
- }
- public override bool SpringEnable(BulletConstraint pConstraint, int index, float numericTrueFalse)
- {
- Generic6DofSpringConstraint constraint = (pConstraint as BulletConstraintXNA).constrain as Generic6DofSpringConstraint;
- constraint.EnableSpring(index, (numericTrueFalse == 0f ? false : true));
- return true;
- }
-
- public override bool SpringSetEquilibriumPoint(BulletConstraint pConstraint, int index, float equilibriumPoint)
- {
- Generic6DofSpringConstraint constraint = (pConstraint as BulletConstraintXNA).constrain as Generic6DofSpringConstraint;
- if (index == SPRING_NOT_SPECIFIED)
- {
- constraint.SetEquilibriumPoint();
- }
- else
- {
- if (equilibriumPoint == SPRING_NOT_SPECIFIED)
- constraint.SetEquilibriumPoint(index);
- else
- constraint.SetEquilibriumPoint(index, equilibriumPoint);
- }
- return true;
- }
-
- public override bool SpringSetStiffness(BulletConstraint pConstraint, int index, float stiffness)
- {
- Generic6DofSpringConstraint constraint = (pConstraint as BulletConstraintXNA).constrain as Generic6DofSpringConstraint;
- constraint.SetStiffness(index, stiffness);
- return true;
- }
-
- public override bool SpringSetDamping(BulletConstraint pConstraint, int index, float damping)
- {
- Generic6DofSpringConstraint constraint = (pConstraint as BulletConstraintXNA).constrain as Generic6DofSpringConstraint;
- constraint.SetDamping(index, damping);
- return true;
- }
-
- public override bool SliderSetLimits(BulletConstraint pConstraint, int lowerUpper, int linAng, float val)
- {
- SliderConstraint constraint = (pConstraint as BulletConstraintXNA).constrain as SliderConstraint;
- switch (lowerUpper)
- {
- case SLIDER_LOWER_LIMIT:
- switch (linAng)
- {
- case SLIDER_LINEAR:
- constraint.SetLowerLinLimit(val);
- break;
- case SLIDER_ANGULAR:
- constraint.SetLowerAngLimit(val);
- break;
- }
- break;
- case SLIDER_UPPER_LIMIT:
- switch (linAng)
- {
- case SLIDER_LINEAR:
- constraint.SetUpperLinLimit(val);
- break;
- case SLIDER_ANGULAR:
- constraint.SetUpperAngLimit(val);
- break;
- }
- break;
- }
- return true;
- }
- public override bool SliderSet(BulletConstraint pConstraint, int softRestDamp, int dirLimOrtho, int linAng, float val)
- {
- SliderConstraint constraint = (pConstraint as BulletConstraintXNA).constrain as SliderConstraint;
- switch (softRestDamp)
- {
- case SLIDER_SET_SOFTNESS:
- switch (dirLimOrtho)
- {
- case SLIDER_SET_DIRECTION:
- switch (linAng)
- {
- case SLIDER_LINEAR: constraint.SetSoftnessDirLin(val); break;
- case SLIDER_ANGULAR: constraint.SetSoftnessDirAng(val); break;
- }
- break;
- case SLIDER_SET_LIMIT:
- switch (linAng)
- {
- case SLIDER_LINEAR: constraint.SetSoftnessLimLin(val); break;
- case SLIDER_ANGULAR: constraint.SetSoftnessLimAng(val); break;
- }
- break;
- case SLIDER_SET_ORTHO:
- switch (linAng)
- {
- case SLIDER_LINEAR: constraint.SetSoftnessOrthoLin(val); break;
- case SLIDER_ANGULAR: constraint.SetSoftnessOrthoAng(val); break;
- }
- break;
- }
- break;
- case SLIDER_SET_RESTITUTION:
- switch (dirLimOrtho)
- {
- case SLIDER_SET_DIRECTION:
- switch (linAng)
- {
- case SLIDER_LINEAR: constraint.SetRestitutionDirLin(val); break;
- case SLIDER_ANGULAR: constraint.SetRestitutionDirAng(val); break;
- }
- break;
- case SLIDER_SET_LIMIT:
- switch (linAng)
- {
- case SLIDER_LINEAR: constraint.SetRestitutionLimLin(val); break;
- case SLIDER_ANGULAR: constraint.SetRestitutionLimAng(val); break;
- }
- break;
- case SLIDER_SET_ORTHO:
- switch (linAng)
- {
- case SLIDER_LINEAR: constraint.SetRestitutionOrthoLin(val); break;
- case SLIDER_ANGULAR: constraint.SetRestitutionOrthoAng(val); break;
- }
- break;
- }
- break;
- case SLIDER_SET_DAMPING:
- switch (dirLimOrtho)
- {
- case SLIDER_SET_DIRECTION:
- switch (linAng)
- {
- case SLIDER_LINEAR: constraint.SetDampingDirLin(val); break;
- case SLIDER_ANGULAR: constraint.SetDampingDirAng(val); break;
- }
- break;
- case SLIDER_SET_LIMIT:
- switch (linAng)
- {
- case SLIDER_LINEAR: constraint.SetDampingLimLin(val); break;
- case SLIDER_ANGULAR: constraint.SetDampingLimAng(val); break;
- }
- break;
- case SLIDER_SET_ORTHO:
- switch (linAng)
- {
- case SLIDER_LINEAR: constraint.SetDampingOrthoLin(val); break;
- case SLIDER_ANGULAR: constraint.SetDampingOrthoAng(val); break;
- }
- break;
- }
- break;
- }
- return true;
- }
- public override bool SliderMotorEnable(BulletConstraint pConstraint, int linAng, float numericTrueFalse)
- {
- SliderConstraint constraint = (pConstraint as BulletConstraintXNA).constrain as SliderConstraint;
- switch (linAng)
- {
- case SLIDER_LINEAR:
- constraint.SetPoweredLinMotor(numericTrueFalse == 0.0 ? false : true);
- break;
- case SLIDER_ANGULAR:
- constraint.SetPoweredAngMotor(numericTrueFalse == 0.0 ? false : true);
- break;
- }
- return true;
- }
- public override bool SliderMotor(BulletConstraint pConstraint, int forceVel, int linAng, float val)
- {
- SliderConstraint constraint = (pConstraint as BulletConstraintXNA).constrain as SliderConstraint;
- switch (forceVel)
- {
- case SLIDER_MOTOR_VELOCITY:
- switch (linAng)
- {
- case SLIDER_LINEAR:
- constraint.SetTargetLinMotorVelocity(val);
- break;
- case SLIDER_ANGULAR:
- constraint.SetTargetAngMotorVelocity(val);
- break;
- }
- break;
- case SLIDER_MAX_MOTOR_FORCE:
- switch (linAng)
- {
- case SLIDER_LINEAR:
- constraint.SetMaxLinMotorForce(val);
- break;
- case SLIDER_ANGULAR:
- constraint.SetMaxAngMotorForce(val);
- break;
- }
- break;
- }
- return true;
- }
-
- //BulletSimAPI.SetAngularDamping(Prim.PhysBody.ptr, angularDamping);
- public override void SetAngularDamping(BulletBody pBody, float angularDamping)
- {
- RigidBody body = (pBody as BulletBodyXNA).rigidBody;
- float lineardamping = body.GetLinearDamping();
- body.SetDamping(lineardamping, angularDamping);
-
- }
-
- public override void UpdateInertiaTensor(BulletBody pBody)
- {
- RigidBody body = (pBody as BulletBodyXNA).rigidBody;
- if (body != null) // can't update inertia tensor on CollisionObject
- body.UpdateInertiaTensor();
- }
-
- public override void RecalculateCompoundShapeLocalAabb(BulletShape pCompoundShape)
- {
- CompoundShape shape = (pCompoundShape as BulletShapeXNA).shape as CompoundShape;
- shape.RecalculateLocalAabb();
- }
-
- //BulletSimAPI.GetCollisionFlags(PhysBody.ptr)
- public override CollisionFlags GetCollisionFlags(BulletBody pCollisionObject)
- {
- CollisionObject collisionObject = (pCollisionObject as BulletBodyXNA).rigidBody;
- uint flags = (uint)collisionObject.GetCollisionFlags();
- return (CollisionFlags) flags;
- }
-
- public override void SetDamping(BulletBody pBody, float pLinear, float pAngular)
- {
- RigidBody body = (pBody as BulletBodyXNA).rigidBody;
- body.SetDamping(pLinear, pAngular);
- }
- //PhysBody.ptr, PhysicsScene.Params.deactivationTime);
- public override void SetDeactivationTime(BulletBody pCollisionObject, float pDeactivationTime)
- {
- CollisionObject collisionObject = (pCollisionObject as BulletBodyXNA).rigidBody;
- collisionObject.SetDeactivationTime(pDeactivationTime);
- }
- //SetSleepingThresholds(PhysBody.ptr, PhysicsScene.Params.linearSleepingThreshold, PhysicsScene.Params.angularSleepingThreshold);
- public override void SetSleepingThresholds(BulletBody pBody, float plinearSleepingThreshold, float pangularSleepingThreshold)
- {
- RigidBody body = (pBody as BulletBodyXNA).rigidBody;
- body.SetSleepingThresholds(plinearSleepingThreshold, pangularSleepingThreshold);
- }
-
- public override CollisionObjectTypes GetBodyType(BulletBody pCollisionObject)
- {
- CollisionObject collisionObject = (pCollisionObject as BulletBodyXNA).body;
- return (CollisionObjectTypes)(int) collisionObject.GetInternalType();
- }
-
- public override void ApplyGravity(BulletBody pBody)
- {
-
- RigidBody body = (pBody as BulletBodyXNA).rigidBody;
- body.ApplyGravity();
- }
-
- public override Vector3 GetGravity(BulletBody pBody)
- {
- RigidBody body = (pBody as BulletBodyXNA).rigidBody;
- IndexedVector3 gravity = body.GetGravity();
- return new Vector3(gravity.X, gravity.Y, gravity.Z);
- }
-
- public override void SetLinearDamping(BulletBody pBody, float lin_damping)
- {
- RigidBody body = (pBody as BulletBodyXNA).rigidBody;
- float angularDamping = body.GetAngularDamping();
- body.SetDamping(lin_damping, angularDamping);
- }
-
- public override float GetLinearDamping(BulletBody pBody)
- {
- RigidBody body = (pBody as BulletBodyXNA).rigidBody;
- return body.GetLinearDamping();
- }
-
- public override float GetAngularDamping(BulletBody pBody)
- {
- RigidBody body = (pBody as BulletBodyXNA).rigidBody;
- return body.GetAngularDamping();
- }
-
- public override float GetLinearSleepingThreshold(BulletBody pBody)
- {
- RigidBody body = (pBody as BulletBodyXNA).rigidBody;
- return body.GetLinearSleepingThreshold();
- }
-
- public override void ApplyDamping(BulletBody pBody, float timeStep)
- {
- RigidBody body = (pBody as BulletBodyXNA).rigidBody;
- body.ApplyDamping(timeStep);
- }
-
- public override Vector3 GetLinearFactor(BulletBody pBody)
- {
- RigidBody body = (pBody as BulletBodyXNA).rigidBody;
- IndexedVector3 linearFactor = body.GetLinearFactor();
- return new Vector3(linearFactor.X, linearFactor.Y, linearFactor.Z);
- }
-
- public override void SetLinearFactor(BulletBody pBody, Vector3 factor)
- {
- RigidBody body = (pBody as BulletBodyXNA).rigidBody;
- body.SetLinearFactor(new IndexedVector3(factor.X, factor.Y, factor.Z));
- }
-
- public override void SetCenterOfMassByPosRot(BulletBody pBody, Vector3 pos, Quaternion rot)
- {
- RigidBody body = (pBody as BulletBodyXNA).rigidBody;
- IndexedQuaternion quat = new IndexedQuaternion(rot.X, rot.Y, rot.Z,rot.W);
- IndexedMatrix mat = IndexedMatrix.CreateFromQuaternion(quat);
- mat._origin = new IndexedVector3(pos.X, pos.Y, pos.Z);
- body.SetCenterOfMassTransform( ref mat);
- /* TODO: double check this */
- }
-
- //BulletSimAPI.ApplyCentralForce(PhysBody.ptr, fSum);
- public override void ApplyCentralForce(BulletBody pBody, Vector3 pfSum)
- {
- RigidBody body = (pBody as BulletBodyXNA).rigidBody;
- IndexedVector3 fSum = new IndexedVector3(pfSum.X, pfSum.Y, pfSum.Z);
- body.ApplyCentralForce(ref fSum);
- }
- public override void ApplyCentralImpulse(BulletBody pBody, Vector3 pfSum)
- {
- RigidBody body = (pBody as BulletBodyXNA).rigidBody;
- IndexedVector3 fSum = new IndexedVector3(pfSum.X, pfSum.Y, pfSum.Z);
- body.ApplyCentralImpulse(ref fSum);
- }
- public override void ApplyTorque(BulletBody pBody, Vector3 pfSum)
- {
- RigidBody body = (pBody as BulletBodyXNA).rigidBody;
- IndexedVector3 fSum = new IndexedVector3(pfSum.X, pfSum.Y, pfSum.Z);
- body.ApplyTorque(ref fSum);
- }
- public override void ApplyTorqueImpulse(BulletBody pBody, Vector3 pfSum)
- {
- RigidBody body = (pBody as BulletBodyXNA).rigidBody;
- IndexedVector3 fSum = new IndexedVector3(pfSum.X, pfSum.Y, pfSum.Z);
- body.ApplyTorqueImpulse(ref fSum);
- }
-
- public override void DestroyObject(BulletWorld pWorld, BulletBody pBody)
- {
- DiscreteDynamicsWorld world = (pWorld as BulletWorldXNA).world;
- CollisionObject co = (pBody as BulletBodyXNA).rigidBody;
- RigidBody bo = co as RigidBody;
- if (bo == null)
- {
-
- if (world.IsInWorld(co))
+ public DiscreteDynamicsWorld world;
+ public BulletWorldXNA(uint id, BSScene physScene, DiscreteDynamicsWorld xx)
+ : base(id, physScene)
{
- world.RemoveCollisionObject(co);
- }
- }
- else
- {
-
- if (world.IsInWorld(bo))
- {
- world.RemoveRigidBody(bo);
- }
- }
- if (co != null)
- {
- if (co.GetUserPointer() != null)
- {
- uint localId = (uint) co.GetUserPointer();
- if (specialCollisionObjects.ContainsKey(localId))
- {
- specialCollisionObjects.Remove(localId);
- }
+ world = xx;
}
}
- }
-
- public override void Shutdown(BulletWorld pWorld)
- {
- DiscreteDynamicsWorld world = (pWorld as BulletWorldXNA).world;
- world.Cleanup();
- }
-
- public override BulletShape DuplicateCollisionShape(BulletWorld pWorld, BulletShape pShape, uint id)
- {
- CollisionShape shape1 = (pShape as BulletShapeXNA).shape;
-
- // TODO: Turn this from a reference copy to a Value Copy.
- BulletShapeXNA shape2 = new BulletShapeXNA(shape1, BSShapeTypeFromBroadPhaseNativeType(shape1.GetShapeType()));
-
- return shape2;
- }
-
- public override bool DeleteCollisionShape(BulletWorld pWorld, BulletShape pShape)
- {
- //TODO:
- return false;
- }
- //(sim.ptr, shape.ptr, prim.LocalID, prim.RawPosition, prim.RawOrientation);
-
- public override BulletBody CreateBodyFromShape(BulletWorld pWorld, BulletShape pShape, uint pLocalID, Vector3 pRawPosition, Quaternion pRawOrientation)
- {
- CollisionWorld world = (pWorld as BulletWorldXNA).world;
- 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 BulletShapeXNA).shape;
- //UpdateSingleAabb(world, shape);
- // TODO: Feed Update array into null
- SimMotionState motionState = new SimMotionState(this, pLocalID, mat, null);
- RigidBody body = new RigidBody(0,motionState,shape,IndexedVector3.Zero);
- RigidBodyConstructionInfo constructionInfo = new RigidBodyConstructionInfo(0, motionState, shape, IndexedVector3.Zero)
- {
- m_mass = 0
- };
- /*
- m_mass = mass;
- m_motionState =motionState;
- m_collisionShape = collisionShape;
- m_localInertia = localInertia;
- m_linearDamping = 0f;
- m_angularDamping = 0f;
- m_friction = 0.5f;
- m_restitution = 0f;
- m_linearSleepingThreshold = 0.8f;
- m_angularSleepingThreshold = 1f;
- m_additionalDamping = false;
- m_additionalDampingFactor = 0.005f;
- m_additionalLinearDampingThresholdSqr = 0.01f;
- m_additionalAngularDampingThresholdSqr = 0.01f;
- m_additionalAngularDampingFactor = 0.01f;
- m_startWorldTransform = IndexedMatrix.Identity;
- */
- body.SetUserPointer(pLocalID);
-
- return new BulletBodyXNA(pLocalID, body);
- }
-
-
- public override BulletBody CreateBodyWithDefaultMotionState( BulletShape 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 BulletShapeXNA).shape;
-
- // 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 new BulletBodyXNA(pLocalID, body);
- }
- //(m_mapInfo.terrainBody.ptr, CollisionFlags.CF_STATIC_OBJECT);
- public override CollisionFlags SetCollisionFlags(BulletBody pCollisionObject, CollisionFlags collisionFlags)
- {
- CollisionObject collisionObject = (pCollisionObject as BulletBodyXNA).rigidBody;
- collisionObject.SetCollisionFlags((BulletXNA.BulletCollision.CollisionFlags) (uint) collisionFlags);
- return (CollisionFlags)collisionObject.GetCollisionFlags();
- }
-
- public override Vector3 GetAnisotripicFriction(BulletConstraint pconstrain)
- {
-
- /* TODO */
- return Vector3.Zero;
- }
- public override Vector3 SetAnisotripicFriction(BulletConstraint pconstrain, Vector3 frict) { /* TODO */ return Vector3.Zero; }
- public override bool HasAnisotripicFriction(BulletConstraint pconstrain) { /* TODO */ return false; }
- public override float GetContactProcessingThreshold(BulletBody pBody) { /* TODO */ return 0f; }
- public override bool IsStaticObject(BulletBody pCollisionObject)
- {
- CollisionObject collisionObject = (pCollisionObject as BulletBodyXNA).rigidBody;
- return collisionObject.IsStaticObject();
-
- }
- public override bool IsKinematicObject(BulletBody pCollisionObject)
- {
- CollisionObject collisionObject = (pCollisionObject as BulletBodyXNA).rigidBody;
- return collisionObject.IsKinematicObject();
- }
- public override bool IsStaticOrKinematicObject(BulletBody pCollisionObject)
- {
- CollisionObject collisionObject = (pCollisionObject as BulletBodyXNA).rigidBody;
- return collisionObject.IsStaticOrKinematicObject();
- }
- public override bool HasContactResponse(BulletBody pCollisionObject)
- {
- CollisionObject collisionObject = (pCollisionObject as BulletBodyXNA).rigidBody;
- return collisionObject.HasContactResponse();
- }
- public override int GetActivationState(BulletBody pBody) { /* TODO */ return 0; }
- public override void SetActivationState(BulletBody pBody, int state) { /* TODO */ }
- public override float GetDeactivationTime(BulletBody pBody) { /* TODO */ return 0f; }
- public override bool IsActive(BulletBody pBody) { /* TODO */ return false; }
- public override float GetRestitution(BulletBody pBody) { /* TODO */ return 0f; }
- public override float GetFriction(BulletBody pBody) { /* TODO */ return 0f; }
- public override void SetInterpolationVelocity(BulletBody pBody, Vector3 linearVel, Vector3 angularVel) { /* TODO */ }
- public override float GetHitFraction(BulletBody pBody) { /* TODO */ return 0f; }
-
- //(m_mapInfo.terrainBody.ptr, PhysicsScene.Params.terrainHitFraction);
- public override void SetHitFraction(BulletBody pCollisionObject, float pHitFraction)
- {
- CollisionObject collisionObject = (pCollisionObject as BulletBodyXNA).rigidBody;
- collisionObject.SetHitFraction(pHitFraction);
- }
- //BuildCapsuleShape(physicsScene.World.ptr, 1f, 1f, prim.Scale);
- public override BulletShape BuildCapsuleShape(BulletWorld pWorld, float pRadius, float pHeight, Vector3 pScale)
- {
- DiscreteDynamicsWorld world = (pWorld as BulletWorldXNA).world;
- 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 new BulletShapeXNA(capsuleShapeZ, BSPhysicsShapeType.SHAPE_CAPSULE); ;
- }
-
- public override BulletWorld Initialize(Vector3 maxPosition, ConfigurationParameters parms,
- int maxCollisions, ref CollisionDesc[] collisionArray,
- int maxUpdates, ref EntityProperties[] updateArray
- )
- {
-
- UpdatedObjects = updateArray;
- UpdatedCollisions = collisionArray;
- /* TODO */
- ConfigurationParameters[] configparms = new ConfigurationParameters[1];
- configparms[0] = parms;
- Vector3 worldExtent = maxPosition;
- m_maxCollisions = maxCollisions;
- m_maxUpdatesPerFrame = maxUpdates;
- specialCollisionObjects = new Dictionary();
-
- return new BulletWorldXNA(1, PhysicsScene, BSAPIXNA.Initialize2(worldExtent, configparms, maxCollisions, ref collisionArray, maxUpdates, ref updateArray, null));
- }
-
- private static DiscreteDynamicsWorld Initialize2(Vector3 worldExtent,
- ConfigurationParameters[] o,
- int mMaxCollisionsPerFrame, ref CollisionDesc[] collisionArray,
- int mMaxUpdatesPerFrame, ref EntityProperties[] updateArray,
- object mDebugLogCallbackHandle)
- {
- CollisionWorld.WorldData.ParamData p = new CollisionWorld.WorldData.ParamData();
-
- p.angularDamping = BSParam.AngularDamping;
- 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 = BSParam.LinearDamping;
- p.angularDamping = BSParam.AngularDamping;
- p.deactivationTime = BSParam.DeactivationTime;
- p.linearSleepingThreshold = BSParam.LinearSleepingThreshold;
- p.angularSleepingThreshold = BSParam.AngularSleepingThreshold;
- p.ccdMotionThreshold = BSParam.CcdMotionThreshold;
- p.ccdSweptSphereRadius = BSParam.CcdSweptSphereRadius;
- p.contactProcessingThreshold = BSParam.ContactProcessingThreshold;
-
- p.terrainImplementation = BSParam.TerrainImplementation;
- p.terrainFriction = BSParam.TerrainFriction;
-
- p.terrainHitFraction = BSParam.TerrainHitFraction;
- p.terrainRestitution = BSParam.TerrainRestitution;
- p.terrainCollisionMargin = BSParam.TerrainCollisionMargin;
-
- p.avatarFriction = BSParam.AvatarFriction;
- p.avatarStandingFriction = BSParam.AvatarStandingFriction;
- p.avatarDensity = BSParam.AvatarDensity;
- p.avatarRestitution = BSParam.AvatarRestitution;
- p.avatarCapsuleWidth = BSParam.AvatarCapsuleWidth;
- p.avatarCapsuleDepth = BSParam.AvatarCapsuleDepth;
- p.avatarCapsuleHeight = BSParam.AvatarCapsuleHeight;
- p.avatarContactProcessingThreshold = BSParam.AvatarContactProcessingThreshold;
-
- p.vehicleAngularDamping = BSParam.VehicleAngularDamping;
-
- 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 = BSParam.LinksetImplementation;
- p.linkConstraintUseFrameOffset = BSParam.NumericBool(BSParam.LinkConstraintUseFrameOffset);
- p.linkConstraintEnableTransMotor = BSParam.NumericBool(BSParam.LinkConstraintEnableTransMotor);
- p.linkConstraintTransMotorMaxVel = BSParam.LinkConstraintTransMotorMaxVel;
- p.linkConstraintTransMotorMaxForce = BSParam.LinkConstraintTransMotorMaxForce;
- p.linkConstraintERP = BSParam.LinkConstraintERP;
- p.linkConstraintCFM = BSParam.LinkConstraintCFM;
- p.linkConstraintSolverIterations = BSParam.LinkConstraintSolverIterations;
- 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.LastCollisionDesc = 0;
- world.LastEntityProperty = 0;
-
- 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);
-
- //BSParam.TerrainImplementation = 0;
- world.SetGravity(new IndexedVector3(0,0,p.gravity));
-
- // Turn off Pooling since globals and pooling are bad for threading.
- BulletGlobals.VoronoiSimplexSolverPool.SetPoolingEnabled(false);
- BulletGlobals.SubSimplexConvexCastPool.SetPoolingEnabled(false);
- BulletGlobals.ManifoldPointPool.SetPoolingEnabled(false);
- BulletGlobals.CastResultPool.SetPoolingEnabled(false);
- BulletGlobals.SphereShapePool.SetPoolingEnabled(false);
- BulletGlobals.DbvtNodePool.SetPoolingEnabled(false);
- BulletGlobals.SingleRayCallbackPool.SetPoolingEnabled(false);
- BulletGlobals.SubSimplexClosestResultPool.SetPoolingEnabled(false);
- BulletGlobals.GjkPairDetectorPool.SetPoolingEnabled(false);
- BulletGlobals.DbvtTreeColliderPool.SetPoolingEnabled(false);
- BulletGlobals.SingleSweepCallbackPool.SetPoolingEnabled(false);
- BulletGlobals.BroadphaseRayTesterPool.SetPoolingEnabled(false);
- BulletGlobals.ClosestNotMeConvexResultCallbackPool.SetPoolingEnabled(false);
- BulletGlobals.GjkEpaPenetrationDepthSolverPool.SetPoolingEnabled(false);
- BulletGlobals.ContinuousConvexCollisionPool.SetPoolingEnabled(false);
- BulletGlobals.DbvtStackDataBlockPool.SetPoolingEnabled(false);
-
- BulletGlobals.BoxBoxCollisionAlgorithmPool.SetPoolingEnabled(false);
- BulletGlobals.CompoundCollisionAlgorithmPool.SetPoolingEnabled(false);
- BulletGlobals.ConvexConcaveCollisionAlgorithmPool.SetPoolingEnabled(false);
- BulletGlobals.ConvexConvexAlgorithmPool.SetPoolingEnabled(false);
- BulletGlobals.ConvexPlaneAlgorithmPool.SetPoolingEnabled(false);
- BulletGlobals.SphereBoxCollisionAlgorithmPool.SetPoolingEnabled(false);
- BulletGlobals.SphereSphereCollisionAlgorithmPool.SetPoolingEnabled(false);
- BulletGlobals.SphereTriangleCollisionAlgorithmPool.SetPoolingEnabled(false);
- BulletGlobals.GImpactCollisionAlgorithmPool.SetPoolingEnabled(false);
- BulletGlobals.GjkEpaSolver2MinkowskiDiffPool.SetPoolingEnabled(false);
- BulletGlobals.PersistentManifoldPool.SetPoolingEnabled(false);
- BulletGlobals.ManifoldResultPool.SetPoolingEnabled(false);
- BulletGlobals.GJKPool.SetPoolingEnabled(false);
- BulletGlobals.GIM_ShapeRetrieverPool.SetPoolingEnabled(false);
- BulletGlobals.TriangleShapePool.SetPoolingEnabled(false);
- BulletGlobals.SphereTriangleDetectorPool.SetPoolingEnabled(false);
- BulletGlobals.CompoundLeafCallbackPool.SetPoolingEnabled(false);
- BulletGlobals.GjkConvexCastPool.SetPoolingEnabled(false);
- BulletGlobals.LocalTriangleSphereCastCallbackPool.SetPoolingEnabled(false);
- BulletGlobals.BridgeTriangleRaycastCallbackPool.SetPoolingEnabled(false);
- BulletGlobals.BridgeTriangleConcaveRaycastCallbackPool.SetPoolingEnabled(false);
- BulletGlobals.BridgeTriangleConvexcastCallbackPool.SetPoolingEnabled(false);
- BulletGlobals.MyNodeOverlapCallbackPool.SetPoolingEnabled(false);
- BulletGlobals.ClosestRayResultCallbackPool.SetPoolingEnabled(false);
- BulletGlobals.DebugDrawcallbackPool.SetPoolingEnabled(false);
-
- return world;
- }
- //m_constraint.ptr, ConstraintParams.BT_CONSTRAINT_STOP_CFM, cfm, ConstraintParamAxis.AXIS_ALL
- public override bool SetConstraintParam(BulletConstraint pConstraint, ConstraintParams paramIndex, float paramvalue, ConstraintParamAxis axis)
- {
- Generic6DofConstraint constrain = (pConstraint as BulletConstraintXNA).constrain as Generic6DofConstraint;
- if (axis == ConstraintParamAxis.AXIS_LINEAR_ALL || axis == ConstraintParamAxis.AXIS_ALL)
+ private sealed class BulletBodyXNA : BulletBody
{
- 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;
- }
+ public CollisionObject body;
+ public RigidBody rigidBody { get { return RigidBody.Upcast(body); } }
- public override bool PushUpdate(BulletBody pCollisionObject)
- {
- bool ret = false;
- CollisionObject collisionObject = (pCollisionObject as BulletBodyXNA).rigidBody;
- RigidBody rb = collisionObject as RigidBody;
- if (rb != null)
- {
- SimMotionState sms = rb.GetMotionState() as SimMotionState;
- if (sms != null)
+ public BulletBodyXNA(uint id, CollisionObject xx)
+ : base(id)
{
- IndexedMatrix wt = IndexedMatrix.Identity;
- sms.GetWorldTransform(out wt);
- sms.SetWorldTransform(ref wt, true);
- ret = true;
+ body = xx;
+ }
+ public override bool HasPhysicalBody
+ {
+ get { return body != null; }
+ }
+ public override void Clear()
+ {
+ body = null;
+ }
+ public override string AddrString
+ {
+ get { return "XNARigidBody"; }
}
}
- return ret;
- }
-
- public override float GetAngularMotionDisc(BulletShape pShape)
- {
- CollisionShape shape = (pShape as BulletShapeXNA).shape;
- return shape.GetAngularMotionDisc();
- }
- public override float GetContactBreakingThreshold(BulletShape pShape, float defaultFactor)
- {
- CollisionShape shape = (pShape as BulletShapeXNA).shape;
- return shape.GetContactBreakingThreshold(defaultFactor);
- }
- public override bool IsCompound(BulletShape pShape)
- {
- CollisionShape shape = (pShape as BulletShapeXNA).shape;
- return shape.IsCompound();
- }
- public override bool IsSoftBody(BulletShape pShape)
- {
- CollisionShape shape = (pShape as BulletShapeXNA).shape;
- return shape.IsSoftBody();
- }
- public override bool IsPolyhedral(BulletShape pShape)
- {
- CollisionShape shape = (pShape as BulletShapeXNA).shape;
- return shape.IsPolyhedral();
- }
- public override bool IsConvex2d(BulletShape pShape)
- {
- CollisionShape shape = (pShape as BulletShapeXNA).shape;
- return shape.IsConvex2d();
- }
- public override bool IsConvex(BulletShape pShape)
- {
- CollisionShape shape = (pShape as BulletShapeXNA).shape;
- return shape.IsConvex();
- }
- public override bool IsNonMoving(BulletShape pShape)
- {
- CollisionShape shape = (pShape as BulletShapeXNA).shape;
- return shape.IsNonMoving();
- }
- public override bool IsConcave(BulletShape pShape)
- {
- CollisionShape shape = (pShape as BulletShapeXNA).shape;
- return shape.IsConcave();
- }
- public override bool IsInfinite(BulletShape pShape)
- {
- CollisionShape shape = (pShape as BulletShapeXNA).shape;
- return shape.IsInfinite();
- }
- public override bool IsNativeShape(BulletShape pShape)
- {
- CollisionShape shape = (pShape as BulletShapeXNA).shape;
- bool ret;
- switch (shape.GetShapeType())
+ private sealed class BulletShapeXNA : BulletShape
{
- 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;
- }
-
- public override void SetShapeCollisionMargin(BulletShape pShape, float pMargin)
- {
- CollisionShape shape = (pShape as BulletShapeXNA).shape;
- shape.SetMargin(pMargin);
- }
-
- //sim.ptr, shape.ptr,prim.LocalID, prim.RawPosition, prim.RawOrientation
- public override BulletBody CreateGhostFromShape(BulletWorld pWorld, BulletShape pShape, uint pLocalID, Vector3 pRawPosition, Quaternion pRawOrientation)
- {
- DiscreteDynamicsWorld world = (pWorld as BulletWorldXNA).world;
- 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 BulletShapeXNA).shape;
- gObj.SetCollisionShape(shape);
- gObj.SetUserPointer(pLocalID);
-
- if (specialCollisionObjects.ContainsKey(pLocalID))
- specialCollisionObjects[pLocalID] = gObj;
- else
- specialCollisionObjects.Add(pLocalID, gObj);
-
- // TODO: Add to Special CollisionObjects!
- return new BulletBodyXNA(pLocalID, gObj);
- }
-
- public override void SetCollisionShape(BulletWorld pWorld, BulletBody pCollisionObject, BulletShape pShape)
- {
- DiscreteDynamicsWorld world = (pWorld as BulletWorldXNA).world;
- CollisionObject collisionObject = (pCollisionObject as BulletBodyXNA).body;
- if (pShape == null)
- {
- collisionObject.SetCollisionShape(new EmptyShape());
- }
- else
- {
- CollisionShape shape = (pShape as BulletShapeXNA).shape;
- collisionObject.SetCollisionShape(shape);
- }
- }
- public override BulletShape GetCollisionShape(BulletBody pCollisionObject)
- {
- CollisionObject collisionObject = (pCollisionObject as BulletBodyXNA).rigidBody;
- CollisionShape shape = collisionObject.GetCollisionShape();
- return new BulletShapeXNA(shape, BSShapeTypeFromBroadPhaseNativeType(shape.GetShapeType()));
- }
-
- //(PhysicsScene.World.ptr, nativeShapeData)
- public override BulletShape BuildNativeShape(BulletWorld pWorld, ShapeData pShapeData)
- {
- DiscreteDynamicsWorld world = (pWorld as BulletWorldXNA).world;
- 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 new BulletShapeXNA(shape, pShapeData.Type);
- }
- //PhysicsScene.World.ptr, false
- public override BulletShape CreateCompoundShape(BulletWorld pWorld, bool enableDynamicAabbTree)
- {
- return new BulletShapeXNA(new CompoundShape(enableDynamicAabbTree), BSPhysicsShapeType.SHAPE_COMPOUND);
- }
-
- public override int GetNumberOfCompoundChildren(BulletShape pCompoundShape)
- {
- CompoundShape compoundshape = (pCompoundShape as BulletShapeXNA).shape as CompoundShape;
- return compoundshape.GetNumChildShapes();
- }
- //LinksetRoot.PhysShape.ptr, newShape.ptr, displacementPos, displacementRot
- public override void AddChildShapeToCompoundShape(BulletShape pCShape, BulletShape paddShape, Vector3 displacementPos, Quaternion displacementRot)
- {
- IndexedMatrix relativeTransform = new IndexedMatrix();
- CompoundShape compoundshape = (pCShape as BulletShapeXNA).shape as CompoundShape;
- CollisionShape addshape = (paddShape as BulletShapeXNA).shape;
-
- 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);
-
- }
-
- public override BulletShape RemoveChildShapeFromCompoundShapeIndex(BulletShape pCShape, int pii)
- {
- CompoundShape compoundshape = (pCShape as BulletShapeXNA).shape as CompoundShape;
- CollisionShape ret = null;
- ret = compoundshape.GetChildShape(pii);
- compoundshape.RemoveChildShapeByIndex(pii);
- return new BulletShapeXNA(ret, BSShapeTypeFromBroadPhaseNativeType(ret.GetShapeType()));
- }
-
- public override BulletShape GetChildShapeFromCompoundShapeIndex(BulletShape cShape, int indx) {
-
- if (cShape == null)
- return null;
- CompoundShape compoundShape = (cShape as BulletShapeXNA).shape as CompoundShape;
- CollisionShape shape = compoundShape.GetChildShape(indx);
- BulletShape retShape = new BulletShapeXNA(shape, BSShapeTypeFromBroadPhaseNativeType(shape.GetShapeType()));
-
-
- return retShape;
- }
-
- public BSPhysicsShapeType BSShapeTypeFromBroadPhaseNativeType(BroadphaseNativeTypes pin)
- {
- BSPhysicsShapeType ret = BSPhysicsShapeType.SHAPE_UNKNOWN;
- switch (pin)
- {
- case BroadphaseNativeTypes.BOX_SHAPE_PROXYTYPE:
- ret = BSPhysicsShapeType.SHAPE_BOX;
- break;
- case BroadphaseNativeTypes.TRIANGLE_SHAPE_PROXYTYPE:
- ret = BSPhysicsShapeType.SHAPE_UNKNOWN;
- break;
-
- case BroadphaseNativeTypes.TETRAHEDRAL_SHAPE_PROXYTYPE:
- ret = BSPhysicsShapeType.SHAPE_UNKNOWN;
- break;
- case BroadphaseNativeTypes.CONVEX_TRIANGLEMESH_SHAPE_PROXYTYPE:
- ret = BSPhysicsShapeType.SHAPE_CONVEXHULL;
- break;
- case BroadphaseNativeTypes.CONVEX_HULL_SHAPE_PROXYTYPE:
- ret = BSPhysicsShapeType.SHAPE_HULL;
- break;
- case BroadphaseNativeTypes.CONVEX_POINT_CLOUD_SHAPE_PROXYTYPE:
- ret = BSPhysicsShapeType.SHAPE_UNKNOWN;
- break;
- case BroadphaseNativeTypes.CUSTOM_POLYHEDRAL_SHAPE_TYPE:
- ret = BSPhysicsShapeType.SHAPE_UNKNOWN;
- break;
- //implicit convex shapes
- case BroadphaseNativeTypes.IMPLICIT_CONVEX_SHAPES_START_HERE:
- ret = BSPhysicsShapeType.SHAPE_UNKNOWN;
- break;
- case BroadphaseNativeTypes.SPHERE_SHAPE_PROXYTYPE:
- ret = BSPhysicsShapeType.SHAPE_SPHERE;
- break;
- case BroadphaseNativeTypes.MULTI_SPHERE_SHAPE_PROXYTYPE:
- ret = BSPhysicsShapeType.SHAPE_UNKNOWN;
- break;
- case BroadphaseNativeTypes.CAPSULE_SHAPE_PROXYTYPE:
- ret = BSPhysicsShapeType.SHAPE_CAPSULE;
- break;
- case BroadphaseNativeTypes.CONE_SHAPE_PROXYTYPE:
- ret = BSPhysicsShapeType.SHAPE_CONE;
- break;
- case BroadphaseNativeTypes.CONVEX_SHAPE_PROXYTYPE:
- ret = BSPhysicsShapeType.SHAPE_CONVEXHULL;
- break;
- case BroadphaseNativeTypes.CYLINDER_SHAPE_PROXYTYPE:
- ret = BSPhysicsShapeType.SHAPE_CYLINDER;
- break;
- case BroadphaseNativeTypes.UNIFORM_SCALING_SHAPE_PROXYTYPE:
- ret = BSPhysicsShapeType.SHAPE_UNKNOWN;
- break;
- case BroadphaseNativeTypes.MINKOWSKI_SUM_SHAPE_PROXYTYPE:
- ret = BSPhysicsShapeType.SHAPE_UNKNOWN;
- break;
- case BroadphaseNativeTypes.MINKOWSKI_DIFFERENCE_SHAPE_PROXYTYPE:
- ret = BSPhysicsShapeType.SHAPE_UNKNOWN;
- break;
- case BroadphaseNativeTypes.BOX_2D_SHAPE_PROXYTYPE:
- ret = BSPhysicsShapeType.SHAPE_UNKNOWN;
- break;
- case BroadphaseNativeTypes.CONVEX_2D_SHAPE_PROXYTYPE:
- ret = BSPhysicsShapeType.SHAPE_UNKNOWN;
- break;
- case BroadphaseNativeTypes.CUSTOM_CONVEX_SHAPE_TYPE:
- ret = BSPhysicsShapeType.SHAPE_UNKNOWN;
- break;
- //concave shape
- case BroadphaseNativeTypes.CONCAVE_SHAPES_START_HERE:
- ret = BSPhysicsShapeType.SHAPE_UNKNOWN;
- break;
- //keep all the convex shapetype below here, for the check IsConvexShape in broadphase proxy!
- case BroadphaseNativeTypes.TRIANGLE_MESH_SHAPE_PROXYTYPE:
- ret = BSPhysicsShapeType.SHAPE_MESH;
- break;
- case BroadphaseNativeTypes.SCALED_TRIANGLE_MESH_SHAPE_PROXYTYPE:
- ret = BSPhysicsShapeType.SHAPE_MESH;
- break;
- ///used for demo integration FAST/Swift collision library and Bullet
- case BroadphaseNativeTypes.FAST_CONCAVE_MESH_PROXYTYPE:
- ret = BSPhysicsShapeType.SHAPE_MESH;
- break;
- //terrain
- case BroadphaseNativeTypes.TERRAIN_SHAPE_PROXYTYPE:
- ret = BSPhysicsShapeType.SHAPE_HEIGHTMAP;
- break;
- ///Used for GIMPACT Trimesh integration
- case BroadphaseNativeTypes.GIMPACT_SHAPE_PROXYTYPE:
- ret = BSPhysicsShapeType.SHAPE_GIMPACT;
- break;
- ///Multimaterial mesh
- case BroadphaseNativeTypes.MULTIMATERIAL_TRIANGLE_MESH_PROXYTYPE:
- ret = BSPhysicsShapeType.SHAPE_MESH;
- break;
-
- case BroadphaseNativeTypes.EMPTY_SHAPE_PROXYTYPE:
- ret = BSPhysicsShapeType.SHAPE_UNKNOWN;
- break;
- case BroadphaseNativeTypes.STATIC_PLANE_PROXYTYPE:
- ret = BSPhysicsShapeType.SHAPE_GROUNDPLANE;
- break;
- case BroadphaseNativeTypes.CUSTOM_CONCAVE_SHAPE_TYPE:
- ret = BSPhysicsShapeType.SHAPE_UNKNOWN;
- break;
- case BroadphaseNativeTypes.CONCAVE_SHAPES_END_HERE:
- ret = BSPhysicsShapeType.SHAPE_UNKNOWN;
- break;
-
- case BroadphaseNativeTypes.COMPOUND_SHAPE_PROXYTYPE:
- ret = BSPhysicsShapeType.SHAPE_COMPOUND;
- break;
-
- case BroadphaseNativeTypes.SOFTBODY_SHAPE_PROXYTYPE:
- ret = BSPhysicsShapeType.SHAPE_MESH;
- break;
- case BroadphaseNativeTypes.HFFLUID_SHAPE_PROXYTYPE:
- ret = BSPhysicsShapeType.SHAPE_UNKNOWN;
- break;
- case BroadphaseNativeTypes.HFFLUID_BUOYANT_CONVEX_SHAPE_PROXYTYPE:
- ret = BSPhysicsShapeType.SHAPE_UNKNOWN;
- break;
- case BroadphaseNativeTypes.INVALID_SHAPE_PROXYTYPE:
- ret = BSPhysicsShapeType.SHAPE_UNKNOWN;
- break;
- }
- return ret;
- }
-
- public override void RemoveChildShapeFromCompoundShape(BulletShape cShape, BulletShape removeShape) { /* TODO */ }
- public override void UpdateChildTransform(BulletShape pShape, int childIndex, Vector3 pos, Quaternion rot, bool shouldRecalculateLocalAabb) { /* TODO */ }
-
- public override BulletShape CreateGroundPlaneShape(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 new BulletShapeXNA(m_planeshape, BSPhysicsShapeType.SHAPE_GROUNDPLANE);
- }
-
- public override BulletConstraint Create6DofSpringConstraint(BulletWorld pWorld, BulletBody pBody1, BulletBody pBody2,
- Vector3 pframe1, Quaternion pframe1rot, Vector3 pframe2, Quaternion pframe2rot,
- bool puseLinearReferenceFrameA, bool pdisableCollisionsBetweenLinkedBodies)
-
- {
- Generic6DofSpringConstraint constrain = null;
- DiscreteDynamicsWorld world = (pWorld as BulletWorldXNA).world;
- RigidBody body1 = (pBody1 as BulletBodyXNA).rigidBody;
- RigidBody body2 = (pBody2 as BulletBodyXNA).rigidBody;
- if (body1 != null && body2 != null)
- {
- 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 = frame2v;
-
- constrain = new Generic6DofSpringConstraint(body1, body2, ref frame1, ref frame2, puseLinearReferenceFrameA);
- world.AddConstraint(constrain, pdisableCollisionsBetweenLinkedBodies);
-
- constrain.CalculateTransforms();
- }
-
- return new BulletConstraintXNA(constrain);
- }
-
- public override BulletConstraint CreateHingeConstraint(BulletWorld pWorld, BulletBody pBody1, BulletBody pBody2,
- Vector3 ppivotInA, Vector3 ppivotInB, Vector3 paxisInA, Vector3 paxisInB,
- bool puseLinearReferenceFrameA, bool pdisableCollisionsBetweenLinkedBodies)
- {
- HingeConstraint constrain = null;
- DiscreteDynamicsWorld world = (pWorld as BulletWorldXNA).world;
- RigidBody rb1 = (pBody1 as BulletBodyXNA).rigidBody;
- RigidBody rb2 = (pBody2 as BulletBodyXNA).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);
- constrain = new HingeConstraint(rb1, rb2, ref pivotInA, ref pivotInB, ref axisInA, ref axisInB, puseLinearReferenceFrameA);
- world.AddConstraint(constrain, pdisableCollisionsBetweenLinkedBodies);
- }
- return new BulletConstraintXNA(constrain);
- }
-
- public override BulletConstraint CreateSliderConstraint(BulletWorld pWorld, BulletBody pBody1, BulletBody pBody2,
- Vector3 pframe1, Quaternion pframe1rot,
- Vector3 pframe2, Quaternion pframe2rot,
- bool puseLinearReferenceFrameA, bool pdisableCollisionsBetweenLinkedBodies)
- {
- SliderConstraint constrain = null;
- DiscreteDynamicsWorld world = (pWorld as BulletWorldXNA).world;
- RigidBody rb1 = (pBody1 as BulletBodyXNA).rigidBody;
- RigidBody rb2 = (pBody2 as BulletBodyXNA).rigidBody;
- if (rb1 != null && rb2 != null)
- {
- 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 = frame2v;
-
- constrain = new SliderConstraint(rb1, rb2, ref frame1, ref frame2, puseLinearReferenceFrameA);
- world.AddConstraint(constrain, pdisableCollisionsBetweenLinkedBodies);
- }
- return new BulletConstraintXNA(constrain);
- }
-
- public override BulletConstraint CreateConeTwistConstraint(BulletWorld pWorld, BulletBody pBody1, BulletBody pBody2,
- Vector3 pframe1, Quaternion pframe1rot,
- Vector3 pframe2, Quaternion pframe2rot,
- bool pdisableCollisionsBetweenLinkedBodies)
- {
- ConeTwistConstraint constrain = null;
- DiscreteDynamicsWorld world = (pWorld as BulletWorldXNA).world;
- RigidBody rb1 = (pBody1 as BulletBodyXNA).rigidBody;
- RigidBody rb2 = (pBody2 as BulletBodyXNA).rigidBody;
- if (rb1 != null && rb2 != null)
- {
- 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 = frame2v;
-
- constrain = new ConeTwistConstraint(rb1, rb2, ref frame1, ref frame2);
- world.AddConstraint(constrain, pdisableCollisionsBetweenLinkedBodies);
- }
- return new BulletConstraintXNA(constrain);
- }
-
- public override BulletConstraint CreateGearConstraint(BulletWorld pWorld, BulletBody pBody1, BulletBody pBody2,
- Vector3 paxisInA, Vector3 paxisInB,
- float pratio, bool pdisableCollisionsBetweenLinkedBodies)
- {
- Generic6DofConstraint constrain = null;
- /* BulletXNA does not have a gear constraint
- GearConstraint constrain = null;
- DiscreteDynamicsWorld world = (pWorld as BulletWorldXNA).world;
- RigidBody rb1 = (pBody1 as BulletBodyXNA).rigidBody;
- RigidBody rb2 = (pBody2 as BulletBodyXNA).rigidBody;
- if (rb1 != null && rb2 != null)
- {
- IndexedVector3 axis1 = new IndexedVector3(paxisInA.X, paxisInA.Y, paxisInA.Z);
- IndexedVector3 axis2 = new IndexedVector3(paxisInB.X, paxisInB.Y, paxisInB.Z);
- constrain = new GearConstraint(rb1, rb2, ref axis1, ref axis2, pratio);
- world.AddConstraint(constrain, pdisableCollisionsBetweenLinkedBodies);
- }
- */
- return new BulletConstraintXNA(constrain);
- }
-
- public override BulletConstraint CreatePoint2PointConstraint(BulletWorld pWorld, BulletBody pBody1, BulletBody pBody2,
- Vector3 ppivotInA, Vector3 ppivotInB,
- bool pdisableCollisionsBetweenLinkedBodies)
- {
- Point2PointConstraint constrain = null;
- DiscreteDynamicsWorld world = (pWorld as BulletWorldXNA).world;
- RigidBody rb1 = (pBody1 as BulletBodyXNA).rigidBody;
- RigidBody rb2 = (pBody2 as BulletBodyXNA).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);
- constrain = new Point2PointConstraint(rb1, rb2, ref pivotInA, ref pivotInB);
- world.AddConstraint(constrain, pdisableCollisionsBetweenLinkedBodies);
- }
- return new BulletConstraintXNA(constrain);
- }
-
- public override BulletShape CreateHullShape(BulletWorld pWorld, int pHullCount, float[] pConvHulls)
- {
- DiscreteDynamicsWorld world = (pWorld as BulletWorldXNA).world;
- CompoundShape compoundshape = new CompoundShape(false);
-
- 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)
+ public CollisionShape shape;
+ public BulletShapeXNA(CollisionShape xx, BSPhysicsShapeType typ)
+ : base()
{
-
- virts.Add(new IndexedVector3(pConvHulls[iii], pConvHulls[iii + 1], pConvHulls[iii +2]));
+ shape = xx;
+ shapeType = typ;
+ }
+ public override bool HasPhysicalShape
+ {
+ get { return shape != null; }
+ }
+ public override void Clear()
+ {
+ shape = null;
+ }
+ public override BulletShape Clone()
+ {
+ return new BulletShapeXNA(shape, shapeType);
+ }
+ public override bool ReferenceSame(BulletShape other)
+ {
+ BulletShapeXNA otheru = other as BulletShapeXNA;
+ return (otheru != null) && (this.shape == otheru.shape);
+
+ }
+ public override string AddrString
+ {
+ get { return "XNACollisionShape"; }
}
- ConvexHullShape convexShape = new ConvexHullShape(virts, vertexCount);
- convexShape.SetMargin(world.WorldSettings.Params.collisionMargin);
- compoundshape.AddChildShape(ref childTrans, convexShape);
- ii += (vertexCount*3 + 4);
}
- return new BulletShapeXNA(compoundshape, BSPhysicsShapeType.SHAPE_HULL);
- }
-
- public override BulletShape BuildHullShapeFromMesh(BulletWorld world, BulletShape meshShape, HACDParams parms)
- {
- /* TODO */ return null;
- }
-
- public override BulletShape BuildConvexHullShapeFromMesh(BulletWorld world, BulletShape meshShape)
- {
- /* TODO */ return null;
- }
-
- public override BulletShape CreateConvexHullShape(BulletWorld pWorld, int pIndicesCount, int[] indices, int pVerticesCount, float[] verticesAsFloats)
- {
- /* TODO */ return null;
- }
-
- public override BulletShape CreateMeshShape(BulletWorld pWorld, int pIndicesCount, int[] indices, int pVerticesCount, float[] verticesAsFloats)
- {
- //DumpRaw(indices,verticesAsFloats,pIndicesCount,pVerticesCount);
-
- for (int iter = 0; iter < pVerticesCount; iter++)
+ private sealed class BulletConstraintXNA : BulletConstraint
{
- if (verticesAsFloats[iter] > 0 && verticesAsFloats[iter] < 0.0001) verticesAsFloats[iter] = 0;
- if (verticesAsFloats[iter] < 0 && verticesAsFloats[iter] > -0.0001) verticesAsFloats[iter] = 0;
+ public TypedConstraint constrain;
+ public BulletConstraintXNA(TypedConstraint xx) : base()
+ {
+ constrain = xx;
+ }
+
+ public override void Clear()
+ {
+ constrain = null;
+ }
+ public override bool HasPhysicalConstraint { get { return constrain != null; } }
+
+ // Used for log messages for a unique display of the memory/object allocated to this instance
+ public override string AddrString
+ {
+ get { return "XNAConstraint"; }
+ }
}
- ObjectArray indicesarr = new ObjectArray(indices);
- ObjectArray vertices = new ObjectArray(verticesAsFloats);
- DumpRaw(indicesarr,vertices,pIndicesCount,pVerticesCount);
- DiscreteDynamicsWorld world = (pWorld as BulletWorldXNA).world;
- 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;
+ internal int m_maxCollisions;
+ internal CollisionDesc[] UpdatedCollisions;
+ internal int LastCollisionDesc = 0;
+ internal int m_maxUpdatesPerFrame;
+ internal int LastEntityProperty = 0;
- 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 new BulletShapeXNA(meshShape, BSPhysicsShapeType.SHAPE_MESH);
+ internal EntityProperties[] UpdatedObjects;
+ internal Dictionary specialCollisionObjects;
- }
- public override BulletShape CreateGImpactShape(BulletWorld pWorld, int pIndicesCount, int[] indices, int pVerticesCount, float[] verticesAsFloats)
- {
- // TODO:
- return null;
- }
- public static void DumpRaw(ObjectArrayindices, ObjectArray vertices, int pIndicesCount,int pVerticesCount )
- {
+ private static int m_collisionsThisFrame;
+ private BSScene PhysicsScene { get; set; }
- String fileName = "objTest3.raw";
- String completePath = System.IO.Path.Combine(Util.configDir(), fileName);
- StreamWriter sw = new StreamWriter(completePath);
- IndexedMesh mesh = new IndexedMesh();
+ public override string BulletEngineName { get { return "BulletXNA"; } }
+ public override string BulletEngineVersion { get; protected set; }
- 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++)
+ public BSAPIXNA(string paramName, BSScene physScene)
{
-
- 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");
+ PhysicsScene = physScene;
}
- 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();
- }
-
- public override BulletShape CreateTerrainShape(uint id, Vector3 size, float minHeight, float maxHeight, float[] heightMap,
- float scaleFactor, float collisionMargin)
- {
- const int upAxis = 2;
- HeightfieldTerrainShape terrainShape = new HeightfieldTerrainShape((int)size.X, (int)size.Y,
- heightMap, scaleFactor,
- minHeight, maxHeight, upAxis,
- false);
- terrainShape.SetMargin(collisionMargin);
- terrainShape.SetUseDiamondSubdivision(true);
- terrainShape.SetUserPointer(id);
- return new BulletShapeXNA(terrainShape, BSPhysicsShapeType.SHAPE_TERRAIN);
- }
-
- public override bool TranslationalLimitMotor(BulletConstraint pConstraint, float ponOff, float targetVelocity, float maxMotorForce)
- {
- TypedConstraint tconstrain = (pConstraint as BulletConstraintXNA).constrain;
- bool onOff = ponOff != 0;
- bool ret = false;
-
- switch (tconstrain.GetConstraintType())
- {
- case TypedConstraintType.D6_CONSTRAINT_TYPE:
- Generic6DofConstraint constrain = tconstrain 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;
-
- }
-
- public override int PhysicsStep(BulletWorld world, float timeStep, int maxSubSteps, float fixedTimeStep,
- out int updatedEntityCount, out int collidersCount)
- {
- /* TODO */
- updatedEntityCount = 0;
- collidersCount = 0;
-
-
- int ret = PhysicsStep2(world,timeStep,maxSubSteps,fixedTimeStep,out updatedEntityCount,out world.physicsScene.m_updateArray, out collidersCount, out world.physicsScene.m_collisionArray);
-
- return ret;
- }
-
- private int PhysicsStep2(BulletWorld pWorld, float timeStep, int m_maxSubSteps, float m_fixedTimeStep,
- out int updatedEntityCount, out EntityProperties[] updatedEntities,
- out int collidersCount, out CollisionDesc[] colliders)
- {
- int epic = PhysicsStepint(pWorld, timeStep, m_maxSubSteps, m_fixedTimeStep, out updatedEntityCount, out updatedEntities,
- out collidersCount, out colliders, m_maxCollisions, m_maxUpdatesPerFrame);
- return epic;
- }
-
- private int PhysicsStepint(BulletWorld pWorld,float timeStep, int m_maxSubSteps, float m_fixedTimeStep, out int updatedEntityCount,
- out EntityProperties[] updatedEntities, out int collidersCount, out CollisionDesc[] colliders, int maxCollisions, int maxUpdates)
- {
- int numSimSteps = 0;
- Array.Clear(UpdatedObjects, 0, UpdatedObjects.Length);
- Array.Clear(UpdatedCollisions, 0, UpdatedCollisions.Length);
- LastEntityProperty=0;
-
-
-
-
-
-
- LastCollisionDesc=0;
-
- updatedEntityCount = 0;
- collidersCount = 0;
-
-
- if (pWorld is BulletWorldXNA)
+ ///
+ ///
+ ///
+ ///
+ ///
+ public override bool RemoveObjectFromWorld(BulletWorld pWorld, BulletBody pBody)
{
DiscreteDynamicsWorld world = (pWorld as BulletWorldXNA).world;
+ RigidBody body = ((BulletBodyXNA)pBody).rigidBody;
+ CollisionObject collisionObject = ((BulletBodyXNA)pBody).body;
+ if (body != null)
+ world.RemoveRigidBody(body);
+ else if (collisionObject != null)
+ world.RemoveCollisionObject(collisionObject);
+ else
+ return false;
+ return true;
+ }
+ public override bool ClearCollisionProxyCache(BulletWorld pWorld, BulletBody pBody)
+ {
+ DiscreteDynamicsWorld world = (pWorld as BulletWorldXNA).world;
+ RigidBody body = ((BulletBodyXNA)pBody).rigidBody;
+ CollisionObject collisionObject = ((BulletBodyXNA)pBody).body;
+ if (body != null && collisionObject != null && collisionObject.GetBroadphaseHandle() != null)
+ {
+ world.RemoveCollisionObject(collisionObject);
+ world.AddCollisionObject(collisionObject);
+ }
+ return true;
+ }
+
+ public override bool AddConstraintToWorld(BulletWorld pWorld, BulletConstraint pConstraint, bool pDisableCollisionsBetweenLinkedObjects)
+ {
+ DiscreteDynamicsWorld world = (pWorld as BulletWorldXNA).world;
+ TypedConstraint constraint = (pConstraint as BulletConstraintXNA).constrain;
+ world.AddConstraint(constraint, pDisableCollisionsBetweenLinkedObjects);
+
+ return true;
+
+ }
+
+ public override bool RemoveConstraintFromWorld(BulletWorld pWorld, BulletConstraint pConstraint)
+ {
+ DiscreteDynamicsWorld world = (pWorld as BulletWorldXNA).world;
+ TypedConstraint constraint = (pConstraint as BulletConstraintXNA).constrain;
+ world.RemoveConstraint(constraint);
+ return true;
+ }
+
+ public override void SetRestitution(BulletBody pCollisionObject, float pRestitution)
+ {
+ CollisionObject collisionObject = (pCollisionObject as BulletBodyXNA).body;
+ collisionObject.SetRestitution(pRestitution);
+ }
+
+ public override int GetShapeType(BulletShape pShape)
+ {
+ CollisionShape shape = (pShape as BulletShapeXNA).shape;
+ return (int)shape.GetShapeType();
+ }
+
+ public override void SetMargin(BulletShape pShape, float pMargin)
+ {
+ CollisionShape shape = (pShape as BulletShapeXNA).shape;
+ shape.SetMargin(pMargin);
+ }
+
+ public override float GetMargin(BulletShape pShape)
+ {
+ CollisionShape shape = (pShape as BulletShapeXNA).shape;
+ return shape.GetMargin();
+ }
+
+ public override void SetLocalScaling(BulletShape pShape, Vector3 pScale)
+ {
+ CollisionShape shape = (pShape as BulletShapeXNA).shape;
+ IndexedVector3 vec = new IndexedVector3(pScale.X, pScale.Y, pScale.Z);
+ shape.SetLocalScaling(ref vec);
+ }
+
+ public override void SetContactProcessingThreshold(BulletBody pCollisionObject, float contactprocessingthreshold)
+ {
+ CollisionObject collisionObject = (pCollisionObject as BulletBodyXNA).rigidBody;
+ collisionObject.SetContactProcessingThreshold(contactprocessingthreshold);
+ }
+
+ public override void SetCcdMotionThreshold(BulletBody pCollisionObject, float pccdMotionThreashold)
+ {
+ CollisionObject collisionObject = (pCollisionObject as BulletBodyXNA).body;
+ collisionObject.SetCcdMotionThreshold(pccdMotionThreashold);
+ }
+
+ public override void SetCcdSweptSphereRadius(BulletBody pCollisionObject, float pCcdSweptSphereRadius)
+ {
+ CollisionObject collisionObject = (pCollisionObject as BulletBodyXNA).body;
+ collisionObject.SetCcdSweptSphereRadius(pCcdSweptSphereRadius);
+ }
+
+ public override void SetAngularFactorV(BulletBody pBody, Vector3 pAngularFactor)
+ {
+ RigidBody body = (pBody as BulletBodyXNA).rigidBody;
+ body.SetAngularFactor(new IndexedVector3(pAngularFactor.X, pAngularFactor.Y, pAngularFactor.Z));
+ }
+
+ public override CollisionFlags AddToCollisionFlags(BulletBody pCollisionObject, CollisionFlags pcollisionFlags)
+ {
+ CollisionObject collisionObject = (pCollisionObject as BulletBodyXNA).body;
+ CollisionFlags existingcollisionFlags = (CollisionFlags)(uint)collisionObject.GetCollisionFlags();
+ existingcollisionFlags |= pcollisionFlags;
+ collisionObject.SetCollisionFlags((BulletXNA.BulletCollision.CollisionFlags)(uint)existingcollisionFlags);
+ return (CollisionFlags) (uint) existingcollisionFlags;
+ }
+
+ public override bool AddObjectToWorld(BulletWorld pWorld, BulletBody pBody)
+ {
+ DiscreteDynamicsWorld world = (pWorld as BulletWorldXNA).world;
+ CollisionObject cbody = (pBody as BulletBodyXNA).body;
+ RigidBody rbody = cbody as RigidBody;
+
+ // Bullet resets several variables when an object is added to the world. In particular,
+ // BulletXNA resets position and rotation. Gravity is also reset depending on the static/dynamic
+ // type. Of course, the collision flags in the broadphase proxy are initialized to default.
+ IndexedMatrix origPos = cbody.GetWorldTransform();
+ if (rbody != null)
+ {
+ IndexedVector3 origGrav = rbody.GetGravity();
+ world.AddRigidBody(rbody);
+ rbody.SetGravity(origGrav);
+ }
+ else
+ {
+ world.AddCollisionObject(cbody);
+ }
+ cbody.SetWorldTransform(origPos);
+
+ pBody.ApplyCollisionMask(pWorld.physicsScene);
+
+ //if (body.GetBroadphaseHandle() != null)
+ // world.UpdateSingleAabb(body);
+ return true;
+ }
+
+ public override void ForceActivationState(BulletBody pCollisionObject, ActivationState pActivationState)
+ {
+ CollisionObject collisionObject = (pCollisionObject as BulletBodyXNA).body;
+ collisionObject.ForceActivationState((BulletXNA.BulletCollision.ActivationState)(uint)pActivationState);
+ }
+
+ public override void UpdateSingleAabb(BulletWorld pWorld, BulletBody pCollisionObject)
+ {
+ DiscreteDynamicsWorld world = (pWorld as BulletWorldXNA).world;
+ CollisionObject collisionObject = (pCollisionObject as BulletBodyXNA).body;
+ world.UpdateSingleAabb(collisionObject);
+ }
+
+ public override void UpdateAabbs(BulletWorld pWorld)
+ {
+ DiscreteDynamicsWorld world = (pWorld as BulletWorldXNA).world;
+ world.UpdateAabbs();
+ }
+
+ public override bool GetForceUpdateAllAabbs(BulletWorld pWorld)
+ {
+ DiscreteDynamicsWorld world = (pWorld as BulletWorldXNA).world;
+ return world.GetForceUpdateAllAabbs();
+
+ }
+
+ public override void SetForceUpdateAllAabbs(BulletWorld pWorld, bool pForce)
+ {
+ DiscreteDynamicsWorld world = (pWorld as BulletWorldXNA).world;
+ world.SetForceUpdateAllAabbs(pForce);
+ }
+
+ public override bool SetCollisionGroupMask(BulletBody pCollisionObject, uint pGroup, uint pMask)
+ {
+ CollisionObject collisionObject = (pCollisionObject as BulletBodyXNA).body;
+ collisionObject.GetBroadphaseHandle().m_collisionFilterGroup = (BulletXNA.BulletCollision.CollisionFilterGroups) pGroup;
+ collisionObject.GetBroadphaseHandle().m_collisionFilterGroup = (BulletXNA.BulletCollision.CollisionFilterGroups) pGroup;
+ if ((uint) collisionObject.GetBroadphaseHandle().m_collisionFilterGroup == 0)
+ return false;
+ return true;
+ }
+
+ public override void ClearAllForces(BulletBody pCollisionObject)
+ {
+ CollisionObject collisionObject = (pCollisionObject as BulletBodyXNA).body;
+ IndexedVector3 zeroVector = new IndexedVector3(0, 0, 0);
+ collisionObject.SetInterpolationLinearVelocity(ref zeroVector);
+ collisionObject.SetInterpolationAngularVelocity(ref zeroVector);
+ IndexedMatrix bodytransform = collisionObject.GetWorldTransform();
+
+ collisionObject.SetInterpolationWorldTransform(ref bodytransform);
+
+ if (collisionObject is RigidBody)
+ {
+ RigidBody rigidbody = collisionObject as RigidBody;
+ rigidbody.SetLinearVelocity(zeroVector);
+ rigidbody.SetAngularVelocity(zeroVector);
+ rigidbody.ClearForces();
+ }
+ }
+
+ public override void SetInterpolationAngularVelocity(BulletBody pCollisionObject, Vector3 pVector3)
+ {
+ CollisionObject collisionObject = (pCollisionObject as BulletBodyXNA).rigidBody;
+ IndexedVector3 vec = new IndexedVector3(pVector3.X, pVector3.Y, pVector3.Z);
+ collisionObject.SetInterpolationAngularVelocity(ref vec);
+ }
+
+ public override void SetAngularVelocity(BulletBody pBody, Vector3 pVector3)
+ {
+ RigidBody body = (pBody as BulletBodyXNA).rigidBody;
+ IndexedVector3 vec = new IndexedVector3(pVector3.X, pVector3.Y, pVector3.Z);
+ body.SetAngularVelocity(ref vec);
+ }
+ public override Vector3 GetTotalForce(BulletBody pBody)
+ {
+ RigidBody body = (pBody as BulletBodyXNA).rigidBody;
+ IndexedVector3 iv3 = body.GetTotalForce();
+ return new Vector3(iv3.X, iv3.Y, iv3.Z);
+ }
+ public override Vector3 GetTotalTorque(BulletBody pBody)
+ {
+ RigidBody body = (pBody as BulletBodyXNA).rigidBody;
+ IndexedVector3 iv3 = body.GetTotalTorque();
+ return new Vector3(iv3.X, iv3.Y, iv3.Z);
+ }
+ public override Vector3 GetInvInertiaDiagLocal(BulletBody pBody)
+ {
+ RigidBody body = (pBody as BulletBodyXNA).rigidBody;
+ IndexedVector3 iv3 = body.GetInvInertiaDiagLocal();
+ return new Vector3(iv3.X, iv3.Y, iv3.Z);
+ }
+ public override void SetInvInertiaDiagLocal(BulletBody pBody, Vector3 inert)
+ {
+ RigidBody body = (pBody as BulletBodyXNA).rigidBody;
+ IndexedVector3 iv3 = new IndexedVector3(inert.X, inert.Y, inert.Z);
+ body.SetInvInertiaDiagLocal(ref iv3);
+ }
+ public override void ApplyForce(BulletBody pBody, Vector3 force, Vector3 pos)
+ {
+ RigidBody body = (pBody as BulletBodyXNA).rigidBody;
+ IndexedVector3 forceiv3 = new IndexedVector3(force.X, force.Y, force.Z);
+ IndexedVector3 posiv3 = new IndexedVector3(pos.X, pos.Y, pos.Z);
+ body.ApplyForce(ref forceiv3, ref posiv3);
+ }
+ public override void ApplyImpulse(BulletBody pBody, Vector3 imp, Vector3 pos)
+ {
+ RigidBody body = (pBody as BulletBodyXNA).rigidBody;
+ IndexedVector3 impiv3 = new IndexedVector3(imp.X, imp.Y, imp.Z);
+ IndexedVector3 posiv3 = new IndexedVector3(pos.X, pos.Y, pos.Z);
+ body.ApplyImpulse(ref impiv3, ref posiv3);
+ }
+
+ public override void ClearForces(BulletBody pBody)
+ {
+ RigidBody body = (pBody as BulletBodyXNA).rigidBody;
+ body.ClearForces();
+ }
+
+ public override void SetTranslation(BulletBody pCollisionObject, Vector3 _position, Quaternion _orientation)
+ {
+ CollisionObject collisionObject = (pCollisionObject as BulletBodyXNA).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;
+ collisionObject.SetWorldTransform(mat);
+
+ }
+
+ public override Vector3 GetPosition(BulletBody pCollisionObject)
+ {
+ CollisionObject collisionObject = (pCollisionObject as BulletBodyXNA).rigidBody;
+ IndexedVector3 pos = collisionObject.GetInterpolationWorldTransform()._origin;
+ return new Vector3(pos.X, pos.Y, pos.Z);
+ }
+
+ public override Vector3 CalculateLocalInertia(BulletShape pShape, float pphysMass)
+ {
+ CollisionShape shape = (pShape as BulletShapeXNA).shape;
+ IndexedVector3 inertia = IndexedVector3.Zero;
+ shape.CalculateLocalInertia(pphysMass, out inertia);
+ return new Vector3(inertia.X, inertia.Y, inertia.Z);
+ }
+
+ public override void SetMassProps(BulletBody pBody, float pphysMass, Vector3 plocalInertia)
+ {
+ RigidBody body = (pBody as BulletBodyXNA).rigidBody;
+ if (body != null) // Can't set mass props on collision object.
+ {
+ IndexedVector3 inertia = new IndexedVector3(plocalInertia.X, plocalInertia.Y, plocalInertia.Z);
+ body.SetMassProps(pphysMass, inertia);
+ }
+ }
+
+
+ public override void SetObjectForce(BulletBody pBody, Vector3 _force)
+ {
+ RigidBody body = (pBody as BulletBodyXNA).rigidBody;
+ IndexedVector3 force = new IndexedVector3(_force.X, _force.Y, _force.Z);
+ body.SetTotalForce(ref force);
+ }
+
+ public override void SetFriction(BulletBody pCollisionObject, float _currentFriction)
+ {
+ CollisionObject collisionObject = (pCollisionObject as BulletBodyXNA).body;
+ collisionObject.SetFriction(_currentFriction);
+ }
+
+ public override void SetLinearVelocity(BulletBody pBody, Vector3 _velocity)
+ {
+ RigidBody body = (pBody as BulletBodyXNA).rigidBody;
+ IndexedVector3 velocity = new IndexedVector3(_velocity.X, _velocity.Y, _velocity.Z);
+ body.SetLinearVelocity(velocity);
+ }
+
+ public override void Activate(BulletBody pCollisionObject, bool pforceactivation)
+ {
+ CollisionObject collisionObject = (pCollisionObject as BulletBodyXNA).rigidBody;
+ collisionObject.Activate(pforceactivation);
+
+ }
+
+ public override Quaternion GetOrientation(BulletBody pCollisionObject)
+ {
+ CollisionObject collisionObject = (pCollisionObject as BulletBodyXNA).rigidBody;
+ IndexedQuaternion mat = collisionObject.GetInterpolationWorldTransform().GetRotation();
+ return new Quaternion(mat.X, mat.Y, mat.Z, mat.W);
+ }
+
+ public override CollisionFlags RemoveFromCollisionFlags(BulletBody pCollisionObject, CollisionFlags pcollisionFlags)
+ {
+ CollisionObject collisionObject = (pCollisionObject as BulletBodyXNA).body;
+ CollisionFlags existingcollisionFlags = (CollisionFlags)(uint)collisionObject.GetCollisionFlags();
+ existingcollisionFlags &= ~pcollisionFlags;
+ collisionObject.SetCollisionFlags((BulletXNA.BulletCollision.CollisionFlags)(uint)existingcollisionFlags);
+ return (CollisionFlags)(uint)existingcollisionFlags;
+ }
+
+ public override float GetCcdMotionThreshold(BulletBody pCollisionObject)
+ {
+ CollisionObject collisionObject = (pCollisionObject as BulletBodyXNA).rigidBody;
+ return collisionObject.GetCcdSquareMotionThreshold();
+ }
+
+ public override float GetCcdSweptSphereRadius(BulletBody pCollisionObject)
+ {
+ CollisionObject collisionObject = (pCollisionObject as BulletBodyXNA).rigidBody;
+ return collisionObject.GetCcdSweptSphereRadius();
+
+ }
+
+ public override IntPtr GetUserPointer(BulletBody pCollisionObject)
+ {
+ CollisionObject shape = (pCollisionObject as BulletBodyXNA).body;
+ return (IntPtr)shape.GetUserPointer();
+ }
+
+ public override void SetUserPointer(BulletBody pCollisionObject, IntPtr val)
+ {
+ CollisionObject shape = (pCollisionObject as BulletBodyXNA).body;
+ shape.SetUserPointer(val);
+ }
+
+ public override void SetGravity(BulletBody pBody, Vector3 pGravity)
+ {
+ RigidBody body = (pBody as BulletBodyXNA).rigidBody;
+ if (body != null) // Can't set collisionobject.set gravity
+ {
+ IndexedVector3 gravity = new IndexedVector3(pGravity.X, pGravity.Y, pGravity.Z);
+ body.SetGravity(gravity);
+ }
+ }
+
+ public override bool DestroyConstraint(BulletWorld pWorld, BulletConstraint pConstraint)
+ {
+ DiscreteDynamicsWorld world = (pWorld as BulletWorldXNA).world;
+ TypedConstraint constraint = (pConstraint as BulletConstraintXNA).constrain;
+ world.RemoveConstraint(constraint);
+ return true;
+ }
+
+ public override bool SetLinearLimits(BulletConstraint pConstraint, Vector3 low, Vector3 high)
+ {
+ Generic6DofConstraint constraint = (pConstraint as BulletConstraintXNA).constrain 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;
+ }
+
+ public override bool SetAngularLimits(BulletConstraint pConstraint, Vector3 low, Vector3 high)
+ {
+ Generic6DofConstraint constraint = (pConstraint as BulletConstraintXNA).constrain 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;
+ }
+
+ public override void SetConstraintNumSolverIterations(BulletConstraint pConstraint, float cnt)
+ {
+ Generic6DofConstraint constraint = (pConstraint as BulletConstraintXNA).constrain as Generic6DofConstraint;
+ constraint.SetOverrideNumSolverIterations((int)cnt);
+ }
+
+ public override bool CalculateTransforms(BulletConstraint pConstraint)
+ {
+ Generic6DofConstraint constraint = (pConstraint as BulletConstraintXNA).constrain as Generic6DofConstraint;
+ constraint.CalculateTransforms();
+ return true;
+ }
+
+ public override void SetConstraintEnable(BulletConstraint pConstraint, float p_2)
+ {
+ Generic6DofConstraint constraint = (pConstraint as BulletConstraintXNA).constrain as Generic6DofConstraint;
+ constraint.SetEnabled((p_2 == 0) ? false : true);
+ }
+
+
+ public override BulletConstraint Create6DofConstraint(BulletWorld pWorld, BulletBody pBody1, BulletBody pBody2,
+ Vector3 pframe1, Quaternion pframe1rot, Vector3 pframe2, Quaternion pframe2rot,
+ bool puseLinearReferenceFrameA, bool pdisableCollisionsBetweenLinkedBodies)
+
+ {
+ DiscreteDynamicsWorld world = (pWorld as BulletWorldXNA).world;
+ RigidBody body1 = (pBody1 as BulletBodyXNA).rigidBody;
+ RigidBody body2 = (pBody2 as BulletBodyXNA).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 = frame2v;
+
+ Generic6DofConstraint consttr = new Generic6DofConstraint(body1, body2, ref frame1, ref frame2,
+ puseLinearReferenceFrameA);
+ consttr.CalculateTransforms();
+ world.AddConstraint(consttr,pdisableCollisionsBetweenLinkedBodies);
+
+ return new BulletConstraintXNA(consttr);
+ }
+
+ public override BulletConstraint Create6DofConstraintFixed(BulletWorld pWorld, BulletBody pBody1,
+ Vector3 pframe1, Quaternion pframe1rot,
+ bool pUseLinearReferenceFrameB, bool pdisableCollisionsBetweenLinkedBodies)
+ {
+ DiscreteDynamicsWorld world = (pWorld as BulletWorldXNA).world;
+ RigidBody body1 = (pBody1 as BulletBodyXNA).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;
+
+ Generic6DofConstraint consttr = new Generic6DofConstraint(body1, ref frame1, pUseLinearReferenceFrameB);
+ consttr.CalculateTransforms();
+ world.AddConstraint(consttr,pdisableCollisionsBetweenLinkedBodies);
+
+ return new BulletConstraintXNA(consttr);
+ }
+
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ public override BulletConstraint Create6DofConstraintToPoint(BulletWorld pWorld, BulletBody pBody1, BulletBody pBody2, Vector3 pjoinPoint, bool puseLinearReferenceFrameA, bool pdisableCollisionsBetweenLinkedBodies)
+ {
+ DiscreteDynamicsWorld world = (pWorld as BulletWorldXNA).world;
+ RigidBody body1 = (pBody1 as BulletBodyXNA).rigidBody;
+ RigidBody body2 = (pBody2 as BulletBodyXNA).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 new BulletConstraintXNA(consttr);
+ }
+ //SetFrames(m_constraint.ptr, frameA, frameArot, frameB, frameBrot);
+ public override bool SetFrames(BulletConstraint pConstraint, Vector3 pframe1, Quaternion pframe1rot, Vector3 pframe2, Quaternion pframe2rot)
+ {
+ Generic6DofConstraint constraint = (pConstraint as BulletConstraintXNA).constrain 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 = frame2v;
+ constraint.SetFrames(ref frame1, ref frame2);
+ return true;
+ }
+
+ public override Vector3 GetLinearVelocity(BulletBody pBody)
+ {
+ RigidBody body = (pBody as BulletBodyXNA).rigidBody;
+ IndexedVector3 iv3 = body.GetLinearVelocity();
+ return new Vector3(iv3.X, iv3.Y, iv3.Z);
+ }
+ public override Vector3 GetAngularVelocity(BulletBody pBody)
+ {
+ RigidBody body = (pBody as BulletBodyXNA).rigidBody;
+ IndexedVector3 iv3 = body.GetAngularVelocity();
+ return new Vector3(iv3.X, iv3.Y, iv3.Z);
+ }
+ public override Vector3 GetVelocityInLocalPoint(BulletBody pBody, Vector3 pos)
+ {
+ RigidBody body = (pBody as BulletBodyXNA).rigidBody;
+ IndexedVector3 posiv3 = new IndexedVector3(pos.X, pos.Y, pos.Z);
+ IndexedVector3 iv3 = body.GetVelocityInLocalPoint(ref posiv3);
+ return new Vector3(iv3.X, iv3.Y, iv3.Z);
+ }
+ public override void Translate(BulletBody pCollisionObject, Vector3 trans)
+ {
+ CollisionObject collisionObject = (pCollisionObject as BulletBodyXNA).rigidBody;
+ collisionObject.Translate(new IndexedVector3(trans.X,trans.Y,trans.Z));
+ }
+ public override void UpdateDeactivation(BulletBody pBody, float timeStep)
+ {
+ RigidBody body = (pBody as BulletBodyXNA).rigidBody;
+ body.UpdateDeactivation(timeStep);
+ }
+
+ public override bool WantsSleeping(BulletBody pBody)
+ {
+ RigidBody body = (pBody as BulletBodyXNA).rigidBody;
+ return body.WantsSleeping();
+ }
+
+ public override void SetAngularFactor(BulletBody pBody, float factor)
+ {
+ RigidBody body = (pBody as BulletBodyXNA).rigidBody;
+ body.SetAngularFactor(factor);
+ }
+
+ public override Vector3 GetAngularFactor(BulletBody pBody)
+ {
+ RigidBody body = (pBody as BulletBodyXNA).rigidBody;
+ IndexedVector3 iv3 = body.GetAngularFactor();
+ return new Vector3(iv3.X, iv3.Y, iv3.Z);
+ }
+
+ public override bool IsInWorld(BulletWorld pWorld, BulletBody pCollisionObject)
+ {
+ DiscreteDynamicsWorld world = (pWorld as BulletWorldXNA).world;
+ CollisionObject collisionObject = (pCollisionObject as BulletBodyXNA).body;
+ return world.IsInWorld(collisionObject);
+ }
+
+ public override void AddConstraintRef(BulletBody pBody, BulletConstraint pConstraint)
+ {
+ RigidBody body = (pBody as BulletBodyXNA).rigidBody;
+ TypedConstraint constrain = (pConstraint as BulletConstraintXNA).constrain;
+ body.AddConstraintRef(constrain);
+ }
+
+ public override void RemoveConstraintRef(BulletBody pBody, BulletConstraint pConstraint)
+ {
+ RigidBody body = (pBody as BulletBodyXNA).rigidBody;
+ TypedConstraint constrain = (pConstraint as BulletConstraintXNA).constrain;
+ body.RemoveConstraintRef(constrain);
+ }
+
+ public override BulletConstraint GetConstraintRef(BulletBody pBody, int index)
+ {
+ RigidBody body = (pBody as BulletBodyXNA).rigidBody;
+ return new BulletConstraintXNA(body.GetConstraintRef(index));
+ }
+
+ public override int GetNumConstraintRefs(BulletBody pBody)
+ {
+ RigidBody body = (pBody as BulletBodyXNA).rigidBody;
+ return body.GetNumConstraintRefs();
+ }
+
+ public override void SetInterpolationLinearVelocity(BulletBody pCollisionObject, Vector3 VehicleVelocity)
+ {
+ CollisionObject collisionObject = (pCollisionObject as BulletBodyXNA).rigidBody;
+ IndexedVector3 velocity = new IndexedVector3(VehicleVelocity.X, VehicleVelocity.Y, VehicleVelocity.Z);
+ collisionObject.SetInterpolationLinearVelocity(ref velocity);
+ }
+
+ public override bool UseFrameOffset(BulletConstraint pConstraint, float onOff)
+ {
+ Generic6DofConstraint constraint = (pConstraint as BulletConstraintXNA).constrain as Generic6DofConstraint;
+ constraint.SetUseFrameOffset((onOff == 0) ? false : true);
+ return true;
+ }
+ //SetBreakingImpulseThreshold(m_constraint.ptr, threshold);
+ public override bool SetBreakingImpulseThreshold(BulletConstraint pConstraint, float threshold)
+ {
+ Generic6DofConstraint constraint = (pConstraint as BulletConstraintXNA).constrain as Generic6DofConstraint;
+ constraint.SetBreakingImpulseThreshold(threshold);
+ return true;
+ }
+ public override bool HingeSetLimits(BulletConstraint pConstraint, float low, float high, float softness, float bias, float relaxation)
+ {
+ HingeConstraint constraint = (pConstraint as BulletConstraintXNA).constrain as HingeConstraint;
+ if (softness == HINGE_NOT_SPECIFIED)
+ constraint.SetLimit(low, high);
+ else
+ constraint.SetLimit(low, high, softness, bias, relaxation);
+ return true;
+ }
+ public override bool SpringEnable(BulletConstraint pConstraint, int index, float numericTrueFalse)
+ {
+ Generic6DofSpringConstraint constraint = (pConstraint as BulletConstraintXNA).constrain as Generic6DofSpringConstraint;
+ constraint.EnableSpring(index, (numericTrueFalse == 0f ? false : true));
+ return true;
+ }
+
+ public override bool SpringSetEquilibriumPoint(BulletConstraint pConstraint, int index, float equilibriumPoint)
+ {
+ Generic6DofSpringConstraint constraint = (pConstraint as BulletConstraintXNA).constrain as Generic6DofSpringConstraint;
+ if (index == SPRING_NOT_SPECIFIED)
+ {
+ constraint.SetEquilibriumPoint();
+ }
+ else
+ {
+ if (equilibriumPoint == SPRING_NOT_SPECIFIED)
+ constraint.SetEquilibriumPoint(index);
+ else
+ constraint.SetEquilibriumPoint(index, equilibriumPoint);
+ }
+ return true;
+ }
+
+ public override bool SpringSetStiffness(BulletConstraint pConstraint, int index, float stiffness)
+ {
+ Generic6DofSpringConstraint constraint = (pConstraint as BulletConstraintXNA).constrain as Generic6DofSpringConstraint;
+ constraint.SetStiffness(index, stiffness);
+ return true;
+ }
+
+ public override bool SpringSetDamping(BulletConstraint pConstraint, int index, float damping)
+ {
+ Generic6DofSpringConstraint constraint = (pConstraint as BulletConstraintXNA).constrain as Generic6DofSpringConstraint;
+ constraint.SetDamping(index, damping);
+ return true;
+ }
+
+ public override bool SliderSetLimits(BulletConstraint pConstraint, int lowerUpper, int linAng, float val)
+ {
+ SliderConstraint constraint = (pConstraint as BulletConstraintXNA).constrain as SliderConstraint;
+ switch (lowerUpper)
+ {
+ case SLIDER_LOWER_LIMIT:
+ switch (linAng)
+ {
+ case SLIDER_LINEAR:
+ constraint.SetLowerLinLimit(val);
+ break;
+ case SLIDER_ANGULAR:
+ constraint.SetLowerAngLimit(val);
+ break;
+ }
+ break;
+ case SLIDER_UPPER_LIMIT:
+ switch (linAng)
+ {
+ case SLIDER_LINEAR:
+ constraint.SetUpperLinLimit(val);
+ break;
+ case SLIDER_ANGULAR:
+ constraint.SetUpperAngLimit(val);
+ break;
+ }
+ break;
+ }
+ return true;
+ }
+ public override bool SliderSet(BulletConstraint pConstraint, int softRestDamp, int dirLimOrtho, int linAng, float val)
+ {
+ SliderConstraint constraint = (pConstraint as BulletConstraintXNA).constrain as SliderConstraint;
+ switch (softRestDamp)
+ {
+ case SLIDER_SET_SOFTNESS:
+ switch (dirLimOrtho)
+ {
+ case SLIDER_SET_DIRECTION:
+ switch (linAng)
+ {
+ case SLIDER_LINEAR: constraint.SetSoftnessDirLin(val); break;
+ case SLIDER_ANGULAR: constraint.SetSoftnessDirAng(val); break;
+ }
+ break;
+ case SLIDER_SET_LIMIT:
+ switch (linAng)
+ {
+ case SLIDER_LINEAR: constraint.SetSoftnessLimLin(val); break;
+ case SLIDER_ANGULAR: constraint.SetSoftnessLimAng(val); break;
+ }
+ break;
+ case SLIDER_SET_ORTHO:
+ switch (linAng)
+ {
+ case SLIDER_LINEAR: constraint.SetSoftnessOrthoLin(val); break;
+ case SLIDER_ANGULAR: constraint.SetSoftnessOrthoAng(val); break;
+ }
+ break;
+ }
+ break;
+ case SLIDER_SET_RESTITUTION:
+ switch (dirLimOrtho)
+ {
+ case SLIDER_SET_DIRECTION:
+ switch (linAng)
+ {
+ case SLIDER_LINEAR: constraint.SetRestitutionDirLin(val); break;
+ case SLIDER_ANGULAR: constraint.SetRestitutionDirAng(val); break;
+ }
+ break;
+ case SLIDER_SET_LIMIT:
+ switch (linAng)
+ {
+ case SLIDER_LINEAR: constraint.SetRestitutionLimLin(val); break;
+ case SLIDER_ANGULAR: constraint.SetRestitutionLimAng(val); break;
+ }
+ break;
+ case SLIDER_SET_ORTHO:
+ switch (linAng)
+ {
+ case SLIDER_LINEAR: constraint.SetRestitutionOrthoLin(val); break;
+ case SLIDER_ANGULAR: constraint.SetRestitutionOrthoAng(val); break;
+ }
+ break;
+ }
+ break;
+ case SLIDER_SET_DAMPING:
+ switch (dirLimOrtho)
+ {
+ case SLIDER_SET_DIRECTION:
+ switch (linAng)
+ {
+ case SLIDER_LINEAR: constraint.SetDampingDirLin(val); break;
+ case SLIDER_ANGULAR: constraint.SetDampingDirAng(val); break;
+ }
+ break;
+ case SLIDER_SET_LIMIT:
+ switch (linAng)
+ {
+ case SLIDER_LINEAR: constraint.SetDampingLimLin(val); break;
+ case SLIDER_ANGULAR: constraint.SetDampingLimAng(val); break;
+ }
+ break;
+ case SLIDER_SET_ORTHO:
+ switch (linAng)
+ {
+ case SLIDER_LINEAR: constraint.SetDampingOrthoLin(val); break;
+ case SLIDER_ANGULAR: constraint.SetDampingOrthoAng(val); break;
+ }
+ break;
+ }
+ break;
+ }
+ return true;
+ }
+ public override bool SliderMotorEnable(BulletConstraint pConstraint, int linAng, float numericTrueFalse)
+ {
+ SliderConstraint constraint = (pConstraint as BulletConstraintXNA).constrain as SliderConstraint;
+ switch (linAng)
+ {
+ case SLIDER_LINEAR:
+ constraint.SetPoweredLinMotor(numericTrueFalse == 0.0 ? false : true);
+ break;
+ case SLIDER_ANGULAR:
+ constraint.SetPoweredAngMotor(numericTrueFalse == 0.0 ? false : true);
+ break;
+ }
+ return true;
+ }
+ public override bool SliderMotor(BulletConstraint pConstraint, int forceVel, int linAng, float val)
+ {
+ SliderConstraint constraint = (pConstraint as BulletConstraintXNA).constrain as SliderConstraint;
+ switch (forceVel)
+ {
+ case SLIDER_MOTOR_VELOCITY:
+ switch (linAng)
+ {
+ case SLIDER_LINEAR:
+ constraint.SetTargetLinMotorVelocity(val);
+ break;
+ case SLIDER_ANGULAR:
+ constraint.SetTargetAngMotorVelocity(val);
+ break;
+ }
+ break;
+ case SLIDER_MAX_MOTOR_FORCE:
+ switch (linAng)
+ {
+ case SLIDER_LINEAR:
+ constraint.SetMaxLinMotorForce(val);
+ break;
+ case SLIDER_ANGULAR:
+ constraint.SetMaxAngMotorForce(val);
+ break;
+ }
+ break;
+ }
+ return true;
+ }
+
+ //BulletSimAPI.SetAngularDamping(Prim.PhysBody.ptr, angularDamping);
+ public override void SetAngularDamping(BulletBody pBody, float angularDamping)
+ {
+ RigidBody body = (pBody as BulletBodyXNA).rigidBody;
+ float lineardamping = body.GetLinearDamping();
+ body.SetDamping(lineardamping, angularDamping);
+
+ }
+
+ public override void UpdateInertiaTensor(BulletBody pBody)
+ {
+ RigidBody body = (pBody as BulletBodyXNA).rigidBody;
+ if (body != null) // can't update inertia tensor on CollisionObject
+ body.UpdateInertiaTensor();
+ }
+
+ public override void RecalculateCompoundShapeLocalAabb(BulletShape pCompoundShape)
+ {
+ CompoundShape shape = (pCompoundShape as BulletShapeXNA).shape as CompoundShape;
+ shape.RecalculateLocalAabb();
+ }
+
+ //BulletSimAPI.GetCollisionFlags(PhysBody.ptr)
+ public override CollisionFlags GetCollisionFlags(BulletBody pCollisionObject)
+ {
+ CollisionObject collisionObject = (pCollisionObject as BulletBodyXNA).rigidBody;
+ uint flags = (uint)collisionObject.GetCollisionFlags();
+ return (CollisionFlags) flags;
+ }
+
+ public override void SetDamping(BulletBody pBody, float pLinear, float pAngular)
+ {
+ RigidBody body = (pBody as BulletBodyXNA).rigidBody;
+ body.SetDamping(pLinear, pAngular);
+ }
+ //PhysBody.ptr, PhysicsScene.Params.deactivationTime);
+ public override void SetDeactivationTime(BulletBody pCollisionObject, float pDeactivationTime)
+ {
+ CollisionObject collisionObject = (pCollisionObject as BulletBodyXNA).rigidBody;
+ collisionObject.SetDeactivationTime(pDeactivationTime);
+ }
+ //SetSleepingThresholds(PhysBody.ptr, PhysicsScene.Params.linearSleepingThreshold, PhysicsScene.Params.angularSleepingThreshold);
+ public override void SetSleepingThresholds(BulletBody pBody, float plinearSleepingThreshold, float pangularSleepingThreshold)
+ {
+ RigidBody body = (pBody as BulletBodyXNA).rigidBody;
+ body.SetSleepingThresholds(plinearSleepingThreshold, pangularSleepingThreshold);
+ }
+
+ public override CollisionObjectTypes GetBodyType(BulletBody pCollisionObject)
+ {
+ CollisionObject collisionObject = (pCollisionObject as BulletBodyXNA).body;
+ return (CollisionObjectTypes)(int) collisionObject.GetInternalType();
+ }
+
+ public override void ApplyGravity(BulletBody pBody)
+ {
+
+ RigidBody body = (pBody as BulletBodyXNA).rigidBody;
+ body.ApplyGravity();
+ }
+
+ public override Vector3 GetGravity(BulletBody pBody)
+ {
+ RigidBody body = (pBody as BulletBodyXNA).rigidBody;
+ IndexedVector3 gravity = body.GetGravity();
+ return new Vector3(gravity.X, gravity.Y, gravity.Z);
+ }
+
+ public override void SetLinearDamping(BulletBody pBody, float lin_damping)
+ {
+ RigidBody body = (pBody as BulletBodyXNA).rigidBody;
+ float angularDamping = body.GetAngularDamping();
+ body.SetDamping(lin_damping, angularDamping);
+ }
+
+ public override float GetLinearDamping(BulletBody pBody)
+ {
+ RigidBody body = (pBody as BulletBodyXNA).rigidBody;
+ return body.GetLinearDamping();
+ }
+
+ public override float GetAngularDamping(BulletBody pBody)
+ {
+ RigidBody body = (pBody as BulletBodyXNA).rigidBody;
+ return body.GetAngularDamping();
+ }
+
+ public override float GetLinearSleepingThreshold(BulletBody pBody)
+ {
+ RigidBody body = (pBody as BulletBodyXNA).rigidBody;
+ return body.GetLinearSleepingThreshold();
+ }
+
+ public override void ApplyDamping(BulletBody pBody, float timeStep)
+ {
+ RigidBody body = (pBody as BulletBodyXNA).rigidBody;
+ body.ApplyDamping(timeStep);
+ }
+
+ public override Vector3 GetLinearFactor(BulletBody pBody)
+ {
+ RigidBody body = (pBody as BulletBodyXNA).rigidBody;
+ IndexedVector3 linearFactor = body.GetLinearFactor();
+ return new Vector3(linearFactor.X, linearFactor.Y, linearFactor.Z);
+ }
+
+ public override void SetLinearFactor(BulletBody pBody, Vector3 factor)
+ {
+ RigidBody body = (pBody as BulletBodyXNA).rigidBody;
+ body.SetLinearFactor(new IndexedVector3(factor.X, factor.Y, factor.Z));
+ }
+
+ public override void SetCenterOfMassByPosRot(BulletBody pBody, Vector3 pos, Quaternion rot)
+ {
+ RigidBody body = (pBody as BulletBodyXNA).rigidBody;
+ IndexedQuaternion quat = new IndexedQuaternion(rot.X, rot.Y, rot.Z,rot.W);
+ IndexedMatrix mat = IndexedMatrix.CreateFromQuaternion(quat);
+ mat._origin = new IndexedVector3(pos.X, pos.Y, pos.Z);
+ body.SetCenterOfMassTransform( ref mat);
+ /* TODO: double check this */
+ }
+
+ //BulletSimAPI.ApplyCentralForce(PhysBody.ptr, fSum);
+ public override void ApplyCentralForce(BulletBody pBody, Vector3 pfSum)
+ {
+ RigidBody body = (pBody as BulletBodyXNA).rigidBody;
+ IndexedVector3 fSum = new IndexedVector3(pfSum.X, pfSum.Y, pfSum.Z);
+ body.ApplyCentralForce(ref fSum);
+ }
+ public override void ApplyCentralImpulse(BulletBody pBody, Vector3 pfSum)
+ {
+ RigidBody body = (pBody as BulletBodyXNA).rigidBody;
+ IndexedVector3 fSum = new IndexedVector3(pfSum.X, pfSum.Y, pfSum.Z);
+ body.ApplyCentralImpulse(ref fSum);
+ }
+ public override void ApplyTorque(BulletBody pBody, Vector3 pfSum)
+ {
+ RigidBody body = (pBody as BulletBodyXNA).rigidBody;
+ IndexedVector3 fSum = new IndexedVector3(pfSum.X, pfSum.Y, pfSum.Z);
+ body.ApplyTorque(ref fSum);
+ }
+ public override void ApplyTorqueImpulse(BulletBody pBody, Vector3 pfSum)
+ {
+ RigidBody body = (pBody as BulletBodyXNA).rigidBody;
+ IndexedVector3 fSum = new IndexedVector3(pfSum.X, pfSum.Y, pfSum.Z);
+ body.ApplyTorqueImpulse(ref fSum);
+ }
+
+ public override void DestroyObject(BulletWorld pWorld, BulletBody pBody)
+ {
+ DiscreteDynamicsWorld world = (pWorld as BulletWorldXNA).world;
+ CollisionObject co = (pBody as BulletBodyXNA).rigidBody;
+ RigidBody bo = co as RigidBody;
+ if (bo == null)
+ {
+
+ if (world.IsInWorld(co))
+ {
+ world.RemoveCollisionObject(co);
+ }
+ }
+ else
+ {
+
+ if (world.IsInWorld(bo))
+ {
+ world.RemoveRigidBody(bo);
+ }
+ }
+ if (co != null)
+ {
+ if (co.GetUserPointer() != null)
+ {
+ uint localId = (uint) co.GetUserPointer();
+ if (specialCollisionObjects.ContainsKey(localId))
+ {
+ specialCollisionObjects.Remove(localId);
+ }
+ }
+ }
+
+ }
+
+ public override void Shutdown(BulletWorld pWorld)
+ {
+ DiscreteDynamicsWorld world = (pWorld as BulletWorldXNA).world;
+ world.Cleanup();
+ }
+
+ public override BulletShape DuplicateCollisionShape(BulletWorld pWorld, BulletShape pShape, uint id)
+ {
+ CollisionShape shape1 = (pShape as BulletShapeXNA).shape;
+
+ // TODO: Turn this from a reference copy to a Value Copy.
+ BulletShapeXNA shape2 = new BulletShapeXNA(shape1, BSShapeTypeFromBroadPhaseNativeType(shape1.GetShapeType()));
+
+ return shape2;
+ }
+
+ public override bool DeleteCollisionShape(BulletWorld pWorld, BulletShape pShape)
+ {
+ //TODO:
+ return false;
+ }
+ //(sim.ptr, shape.ptr, prim.LocalID, prim.RawPosition, prim.RawOrientation);
+
+ public override BulletBody CreateBodyFromShape(BulletWorld pWorld, BulletShape pShape, uint pLocalID, Vector3 pRawPosition, Quaternion pRawOrientation)
+ {
+ CollisionWorld world = (pWorld as BulletWorldXNA).world;
+ 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 BulletShapeXNA).shape;
+ //UpdateSingleAabb(world, shape);
+ // TODO: Feed Update array into null
+ SimMotionState motionState = new SimMotionState(this, pLocalID, mat, null);
+ RigidBody body = new RigidBody(0,motionState,shape,IndexedVector3.Zero);
+ RigidBodyConstructionInfo constructionInfo = new RigidBodyConstructionInfo(0, motionState, shape, IndexedVector3.Zero)
+ {
+ m_mass = 0
+ };
+ /*
+ m_mass = mass;
+ m_motionState =motionState;
+ m_collisionShape = collisionShape;
+ m_localInertia = localInertia;
+ m_linearDamping = 0f;
+ m_angularDamping = 0f;
+ m_friction = 0.5f;
+ m_restitution = 0f;
+ m_linearSleepingThreshold = 0.8f;
+ m_angularSleepingThreshold = 1f;
+ m_additionalDamping = false;
+ m_additionalDampingFactor = 0.005f;
+ m_additionalLinearDampingThresholdSqr = 0.01f;
+ m_additionalAngularDampingThresholdSqr = 0.01f;
+ m_additionalAngularDampingFactor = 0.01f;
+ m_startWorldTransform = IndexedMatrix.Identity;
+ */
+ body.SetUserPointer(pLocalID);
+
+ return new BulletBodyXNA(pLocalID, body);
+ }
+
+
+ public override BulletBody CreateBodyWithDefaultMotionState( BulletShape 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 BulletShapeXNA).shape;
+
+ // 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 new BulletBodyXNA(pLocalID, body);
+ }
+ //(m_mapInfo.terrainBody.ptr, CollisionFlags.CF_STATIC_OBJECT);
+ public override CollisionFlags SetCollisionFlags(BulletBody pCollisionObject, CollisionFlags collisionFlags)
+ {
+ CollisionObject collisionObject = (pCollisionObject as BulletBodyXNA).rigidBody;
+ collisionObject.SetCollisionFlags((BulletXNA.BulletCollision.CollisionFlags) (uint) collisionFlags);
+ return (CollisionFlags)collisionObject.GetCollisionFlags();
+ }
+
+ public override Vector3 GetAnisotripicFriction(BulletConstraint pconstrain)
+ {
+
+ /* TODO */
+ return Vector3.Zero;
+ }
+ public override Vector3 SetAnisotripicFriction(BulletConstraint pconstrain, Vector3 frict) { /* TODO */ return Vector3.Zero; }
+ public override bool HasAnisotripicFriction(BulletConstraint pconstrain) { /* TODO */ return false; }
+ public override float GetContactProcessingThreshold(BulletBody pBody) { /* TODO */ return 0f; }
+ public override bool IsStaticObject(BulletBody pCollisionObject)
+ {
+ CollisionObject collisionObject = (pCollisionObject as BulletBodyXNA).rigidBody;
+ return collisionObject.IsStaticObject();
+
+ }
+ public override bool IsKinematicObject(BulletBody pCollisionObject)
+ {
+ CollisionObject collisionObject = (pCollisionObject as BulletBodyXNA).rigidBody;
+ return collisionObject.IsKinematicObject();
+ }
+ public override bool IsStaticOrKinematicObject(BulletBody pCollisionObject)
+ {
+ CollisionObject collisionObject = (pCollisionObject as BulletBodyXNA).rigidBody;
+ return collisionObject.IsStaticOrKinematicObject();
+ }
+ public override bool HasContactResponse(BulletBody pCollisionObject)
+ {
+ CollisionObject collisionObject = (pCollisionObject as BulletBodyXNA).rigidBody;
+ return collisionObject.HasContactResponse();
+ }
+ public override int GetActivationState(BulletBody pBody) { /* TODO */ return 0; }
+ public override void SetActivationState(BulletBody pBody, int state) { /* TODO */ }
+ public override float GetDeactivationTime(BulletBody pBody) { /* TODO */ return 0f; }
+ public override bool IsActive(BulletBody pBody) { /* TODO */ return false; }
+ public override float GetRestitution(BulletBody pBody) { /* TODO */ return 0f; }
+ public override float GetFriction(BulletBody pBody) { /* TODO */ return 0f; }
+ public override void SetInterpolationVelocity(BulletBody pBody, Vector3 linearVel, Vector3 angularVel) { /* TODO */ }
+ public override float GetHitFraction(BulletBody pBody) { /* TODO */ return 0f; }
+
+ //(m_mapInfo.terrainBody.ptr, PhysicsScene.Params.terrainHitFraction);
+ public override void SetHitFraction(BulletBody pCollisionObject, float pHitFraction)
+ {
+ CollisionObject collisionObject = (pCollisionObject as BulletBodyXNA).rigidBody;
+ collisionObject.SetHitFraction(pHitFraction);
+ }
+ //BuildCapsuleShape(physicsScene.World.ptr, 1f, 1f, prim.Scale);
+ public override BulletShape BuildCapsuleShape(BulletWorld pWorld, float pRadius, float pHeight, Vector3 pScale)
+ {
+ DiscreteDynamicsWorld world = (pWorld as BulletWorldXNA).world;
+ 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 new BulletShapeXNA(capsuleShapeZ, BSPhysicsShapeType.SHAPE_CAPSULE); ;
+ }
+
+ public override BulletWorld Initialize(Vector3 maxPosition, ConfigurationParameters parms,
+ int maxCollisions, ref CollisionDesc[] collisionArray,
+ int maxUpdates, ref EntityProperties[] updateArray
+ )
+ {
+
+ UpdatedObjects = updateArray;
+ UpdatedCollisions = collisionArray;
+ /* TODO */
+ ConfigurationParameters[] configparms = new ConfigurationParameters[1];
+ configparms[0] = parms;
+ Vector3 worldExtent = maxPosition;
+ m_maxCollisions = maxCollisions;
+ m_maxUpdatesPerFrame = maxUpdates;
+ specialCollisionObjects = new Dictionary();
+
+ return new BulletWorldXNA(1, PhysicsScene, BSAPIXNA.Initialize2(worldExtent, configparms, maxCollisions, ref collisionArray, maxUpdates, ref updateArray, null));
+ }
+
+ private static DiscreteDynamicsWorld Initialize2(Vector3 worldExtent,
+ ConfigurationParameters[] o,
+ int mMaxCollisionsPerFrame, ref CollisionDesc[] collisionArray,
+ int mMaxUpdatesPerFrame, ref EntityProperties[] updateArray,
+ object mDebugLogCallbackHandle)
+ {
+ CollisionWorld.WorldData.ParamData p = new CollisionWorld.WorldData.ParamData();
+
+ p.angularDamping = BSParam.AngularDamping;
+ 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 = BSParam.LinearDamping;
+ p.angularDamping = BSParam.AngularDamping;
+ p.deactivationTime = BSParam.DeactivationTime;
+ p.linearSleepingThreshold = BSParam.LinearSleepingThreshold;
+ p.angularSleepingThreshold = BSParam.AngularSleepingThreshold;
+ p.ccdMotionThreshold = BSParam.CcdMotionThreshold;
+ p.ccdSweptSphereRadius = BSParam.CcdSweptSphereRadius;
+ p.contactProcessingThreshold = BSParam.ContactProcessingThreshold;
+
+ p.terrainImplementation = BSParam.TerrainImplementation;
+ p.terrainFriction = BSParam.TerrainFriction;
+
+ p.terrainHitFraction = BSParam.TerrainHitFraction;
+ p.terrainRestitution = BSParam.TerrainRestitution;
+ p.terrainCollisionMargin = BSParam.TerrainCollisionMargin;
+
+ p.avatarFriction = BSParam.AvatarFriction;
+ p.avatarStandingFriction = BSParam.AvatarStandingFriction;
+ p.avatarDensity = BSParam.AvatarDensity;
+ p.avatarRestitution = BSParam.AvatarRestitution;
+ p.avatarCapsuleWidth = BSParam.AvatarCapsuleWidth;
+ p.avatarCapsuleDepth = BSParam.AvatarCapsuleDepth;
+ p.avatarCapsuleHeight = BSParam.AvatarCapsuleHeight;
+ p.avatarContactProcessingThreshold = BSParam.AvatarContactProcessingThreshold;
+
+ p.vehicleAngularDamping = BSParam.VehicleAngularDamping;
+
+ 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 = BSParam.LinksetImplementation;
+ p.linkConstraintUseFrameOffset = BSParam.NumericBool(BSParam.LinkConstraintUseFrameOffset);
+ p.linkConstraintEnableTransMotor = BSParam.NumericBool(BSParam.LinkConstraintEnableTransMotor);
+ p.linkConstraintTransMotorMaxVel = BSParam.LinkConstraintTransMotorMaxVel;
+ p.linkConstraintTransMotorMaxForce = BSParam.LinkConstraintTransMotorMaxForce;
+ p.linkConstraintERP = BSParam.LinkConstraintERP;
+ p.linkConstraintCFM = BSParam.LinkConstraintCFM;
+ p.linkConstraintSolverIterations = BSParam.LinkConstraintSolverIterations;
+ 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.LastCollisionDesc = 0;
world.LastEntityProperty = 0;
- numSimSteps = world.StepSimulation(timeStep, m_maxSubSteps, m_fixedTimeStep);
-
+
+ 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);
+
+ //BSParam.TerrainImplementation = 0;
+ world.SetGravity(new IndexedVector3(0,0,p.gravity));
+
+ // Turn off Pooling since globals and pooling are bad for threading.
+ BulletGlobals.VoronoiSimplexSolverPool.SetPoolingEnabled(false);
+ BulletGlobals.SubSimplexConvexCastPool.SetPoolingEnabled(false);
+ BulletGlobals.ManifoldPointPool.SetPoolingEnabled(false);
+ BulletGlobals.CastResultPool.SetPoolingEnabled(false);
+ BulletGlobals.SphereShapePool.SetPoolingEnabled(false);
+ BulletGlobals.DbvtNodePool.SetPoolingEnabled(false);
+ BulletGlobals.SingleRayCallbackPool.SetPoolingEnabled(false);
+ BulletGlobals.SubSimplexClosestResultPool.SetPoolingEnabled(false);
+ BulletGlobals.GjkPairDetectorPool.SetPoolingEnabled(false);
+ BulletGlobals.DbvtTreeColliderPool.SetPoolingEnabled(false);
+ BulletGlobals.SingleSweepCallbackPool.SetPoolingEnabled(false);
+ BulletGlobals.BroadphaseRayTesterPool.SetPoolingEnabled(false);
+ BulletGlobals.ClosestNotMeConvexResultCallbackPool.SetPoolingEnabled(false);
+ BulletGlobals.GjkEpaPenetrationDepthSolverPool.SetPoolingEnabled(false);
+ BulletGlobals.ContinuousConvexCollisionPool.SetPoolingEnabled(false);
+ BulletGlobals.DbvtStackDataBlockPool.SetPoolingEnabled(false);
+
+ BulletGlobals.BoxBoxCollisionAlgorithmPool.SetPoolingEnabled(false);
+ BulletGlobals.CompoundCollisionAlgorithmPool.SetPoolingEnabled(false);
+ BulletGlobals.ConvexConcaveCollisionAlgorithmPool.SetPoolingEnabled(false);
+ BulletGlobals.ConvexConvexAlgorithmPool.SetPoolingEnabled(false);
+ BulletGlobals.ConvexPlaneAlgorithmPool.SetPoolingEnabled(false);
+ BulletGlobals.SphereBoxCollisionAlgorithmPool.SetPoolingEnabled(false);
+ BulletGlobals.SphereSphereCollisionAlgorithmPool.SetPoolingEnabled(false);
+ BulletGlobals.SphereTriangleCollisionAlgorithmPool.SetPoolingEnabled(false);
+ BulletGlobals.GImpactCollisionAlgorithmPool.SetPoolingEnabled(false);
+ BulletGlobals.GjkEpaSolver2MinkowskiDiffPool.SetPoolingEnabled(false);
+ BulletGlobals.PersistentManifoldPool.SetPoolingEnabled(false);
+ BulletGlobals.ManifoldResultPool.SetPoolingEnabled(false);
+ BulletGlobals.GJKPool.SetPoolingEnabled(false);
+ BulletGlobals.GIM_ShapeRetrieverPool.SetPoolingEnabled(false);
+ BulletGlobals.TriangleShapePool.SetPoolingEnabled(false);
+ BulletGlobals.SphereTriangleDetectorPool.SetPoolingEnabled(false);
+ BulletGlobals.CompoundLeafCallbackPool.SetPoolingEnabled(false);
+ BulletGlobals.GjkConvexCastPool.SetPoolingEnabled(false);
+ BulletGlobals.LocalTriangleSphereCastCallbackPool.SetPoolingEnabled(false);
+ BulletGlobals.BridgeTriangleRaycastCallbackPool.SetPoolingEnabled(false);
+ BulletGlobals.BridgeTriangleConcaveRaycastCallbackPool.SetPoolingEnabled(false);
+ BulletGlobals.BridgeTriangleConvexcastCallbackPool.SetPoolingEnabled(false);
+ BulletGlobals.MyNodeOverlapCallbackPool.SetPoolingEnabled(false);
+ BulletGlobals.ClosestRayResultCallbackPool.SetPoolingEnabled(false);
+ BulletGlobals.DebugDrawcallbackPool.SetPoolingEnabled(false);
+
+ return world;
+ }
+ //m_constraint.ptr, ConstraintParams.BT_CONSTRAINT_STOP_CFM, cfm, ConstraintParamAxis.AXIS_ALL
+ public override bool SetConstraintParam(BulletConstraint pConstraint, ConstraintParams paramIndex, float paramvalue, ConstraintParamAxis axis)
+ {
+ Generic6DofConstraint constrain = (pConstraint as BulletConstraintXNA).constrain 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;
+ }
+
+ public override bool PushUpdate(BulletBody pCollisionObject)
+ {
+ bool ret = false;
+ CollisionObject collisionObject = (pCollisionObject as BulletBodyXNA).rigidBody;
+ RigidBody rb = collisionObject 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;
+
+ }
+
+ public override float GetAngularMotionDisc(BulletShape pShape)
+ {
+ CollisionShape shape = (pShape as BulletShapeXNA).shape;
+ return shape.GetAngularMotionDisc();
+ }
+ public override float GetContactBreakingThreshold(BulletShape pShape, float defaultFactor)
+ {
+ CollisionShape shape = (pShape as BulletShapeXNA).shape;
+ return shape.GetContactBreakingThreshold(defaultFactor);
+ }
+ public override bool IsCompound(BulletShape pShape)
+ {
+ CollisionShape shape = (pShape as BulletShapeXNA).shape;
+ return shape.IsCompound();
+ }
+ public override bool IsSoftBody(BulletShape pShape)
+ {
+ CollisionShape shape = (pShape as BulletShapeXNA).shape;
+ return shape.IsSoftBody();
+ }
+ public override bool IsPolyhedral(BulletShape pShape)
+ {
+ CollisionShape shape = (pShape as BulletShapeXNA).shape;
+ return shape.IsPolyhedral();
+ }
+ public override bool IsConvex2d(BulletShape pShape)
+ {
+ CollisionShape shape = (pShape as BulletShapeXNA).shape;
+ return shape.IsConvex2d();
+ }
+ public override bool IsConvex(BulletShape pShape)
+ {
+ CollisionShape shape = (pShape as BulletShapeXNA).shape;
+ return shape.IsConvex();
+ }
+ public override bool IsNonMoving(BulletShape pShape)
+ {
+ CollisionShape shape = (pShape as BulletShapeXNA).shape;
+ return shape.IsNonMoving();
+ }
+ public override bool IsConcave(BulletShape pShape)
+ {
+ CollisionShape shape = (pShape as BulletShapeXNA).shape;
+ return shape.IsConcave();
+ }
+ public override bool IsInfinite(BulletShape pShape)
+ {
+ CollisionShape shape = (pShape as BulletShapeXNA).shape;
+ return shape.IsInfinite();
+ }
+ public override bool IsNativeShape(BulletShape pShape)
+ {
+ CollisionShape shape = (pShape as BulletShapeXNA).shape;
+ 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;
+ }
+
+ public override void SetShapeCollisionMargin(BulletShape pShape, float pMargin)
+ {
+ CollisionShape shape = (pShape as BulletShapeXNA).shape;
+ shape.SetMargin(pMargin);
+ }
+
+ //sim.ptr, shape.ptr,prim.LocalID, prim.RawPosition, prim.RawOrientation
+ public override BulletBody CreateGhostFromShape(BulletWorld pWorld, BulletShape pShape, uint pLocalID, Vector3 pRawPosition, Quaternion pRawOrientation)
+ {
+ DiscreteDynamicsWorld world = (pWorld as BulletWorldXNA).world;
+ 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 BulletShapeXNA).shape;
+ gObj.SetCollisionShape(shape);
+ gObj.SetUserPointer(pLocalID);
+
+ if (specialCollisionObjects.ContainsKey(pLocalID))
+ specialCollisionObjects[pLocalID] = gObj;
+ else
+ specialCollisionObjects.Add(pLocalID, gObj);
+
+ // TODO: Add to Special CollisionObjects!
+ return new BulletBodyXNA(pLocalID, gObj);
+ }
+
+ public override void SetCollisionShape(BulletWorld pWorld, BulletBody pCollisionObject, BulletShape pShape)
+ {
+ DiscreteDynamicsWorld world = (pWorld as BulletWorldXNA).world;
+ CollisionObject collisionObject = (pCollisionObject as BulletBodyXNA).body;
+ if (pShape == null)
+ {
+ collisionObject.SetCollisionShape(new EmptyShape());
+ }
+ else
+ {
+ CollisionShape shape = (pShape as BulletShapeXNA).shape;
+ collisionObject.SetCollisionShape(shape);
+ }
+ }
+ public override BulletShape GetCollisionShape(BulletBody pCollisionObject)
+ {
+ CollisionObject collisionObject = (pCollisionObject as BulletBodyXNA).rigidBody;
+ CollisionShape shape = collisionObject.GetCollisionShape();
+ return new BulletShapeXNA(shape, BSShapeTypeFromBroadPhaseNativeType(shape.GetShapeType()));
+ }
+
+ //(PhysicsScene.World.ptr, nativeShapeData)
+ public override BulletShape BuildNativeShape(BulletWorld pWorld, ShapeData pShapeData)
+ {
+ DiscreteDynamicsWorld world = (pWorld as BulletWorldXNA).world;
+ 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 new BulletShapeXNA(shape, pShapeData.Type);
+ }
+ //PhysicsScene.World.ptr, false
+ public override BulletShape CreateCompoundShape(BulletWorld pWorld, bool enableDynamicAabbTree)
+ {
+ return new BulletShapeXNA(new CompoundShape(enableDynamicAabbTree), BSPhysicsShapeType.SHAPE_COMPOUND);
+ }
+
+ public override int GetNumberOfCompoundChildren(BulletShape pCompoundShape)
+ {
+ CompoundShape compoundshape = (pCompoundShape as BulletShapeXNA).shape as CompoundShape;
+ return compoundshape.GetNumChildShapes();
+ }
+ //LinksetRoot.PhysShape.ptr, newShape.ptr, displacementPos, displacementRot
+ public override void AddChildShapeToCompoundShape(BulletShape pCShape, BulletShape paddShape, Vector3 displacementPos, Quaternion displacementRot)
+ {
+ IndexedMatrix relativeTransform = new IndexedMatrix();
+ CompoundShape compoundshape = (pCShape as BulletShapeXNA).shape as CompoundShape;
+ CollisionShape addshape = (paddShape as BulletShapeXNA).shape;
+
+ 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);
+
+ }
+
+ public override BulletShape RemoveChildShapeFromCompoundShapeIndex(BulletShape pCShape, int pii)
+ {
+ CompoundShape compoundshape = (pCShape as BulletShapeXNA).shape as CompoundShape;
+ CollisionShape ret = null;
+ ret = compoundshape.GetChildShape(pii);
+ compoundshape.RemoveChildShapeByIndex(pii);
+ return new BulletShapeXNA(ret, BSShapeTypeFromBroadPhaseNativeType(ret.GetShapeType()));
+ }
+
+ public override BulletShape GetChildShapeFromCompoundShapeIndex(BulletShape cShape, int indx) {
+
+ if (cShape == null)
+ return null;
+ CompoundShape compoundShape = (cShape as BulletShapeXNA).shape as CompoundShape;
+ CollisionShape shape = compoundShape.GetChildShape(indx);
+ BulletShape retShape = new BulletShapeXNA(shape, BSShapeTypeFromBroadPhaseNativeType(shape.GetShapeType()));
+
+
+ return retShape;
+ }
+
+ public BSPhysicsShapeType BSShapeTypeFromBroadPhaseNativeType(BroadphaseNativeTypes pin)
+ {
+ BSPhysicsShapeType ret = BSPhysicsShapeType.SHAPE_UNKNOWN;
+ switch (pin)
+ {
+ case BroadphaseNativeTypes.BOX_SHAPE_PROXYTYPE:
+ ret = BSPhysicsShapeType.SHAPE_BOX;
+ break;
+ case BroadphaseNativeTypes.TRIANGLE_SHAPE_PROXYTYPE:
+ ret = BSPhysicsShapeType.SHAPE_UNKNOWN;
+ break;
+
+ case BroadphaseNativeTypes.TETRAHEDRAL_SHAPE_PROXYTYPE:
+ ret = BSPhysicsShapeType.SHAPE_UNKNOWN;
+ break;
+ case BroadphaseNativeTypes.CONVEX_TRIANGLEMESH_SHAPE_PROXYTYPE:
+ ret = BSPhysicsShapeType.SHAPE_CONVEXHULL;
+ break;
+ case BroadphaseNativeTypes.CONVEX_HULL_SHAPE_PROXYTYPE:
+ ret = BSPhysicsShapeType.SHAPE_HULL;
+ break;
+ case BroadphaseNativeTypes.CONVEX_POINT_CLOUD_SHAPE_PROXYTYPE:
+ ret = BSPhysicsShapeType.SHAPE_UNKNOWN;
+ break;
+ case BroadphaseNativeTypes.CUSTOM_POLYHEDRAL_SHAPE_TYPE:
+ ret = BSPhysicsShapeType.SHAPE_UNKNOWN;
+ break;
+ //implicit convex shapes
+ case BroadphaseNativeTypes.IMPLICIT_CONVEX_SHAPES_START_HERE:
+ ret = BSPhysicsShapeType.SHAPE_UNKNOWN;
+ break;
+ case BroadphaseNativeTypes.SPHERE_SHAPE_PROXYTYPE:
+ ret = BSPhysicsShapeType.SHAPE_SPHERE;
+ break;
+ case BroadphaseNativeTypes.MULTI_SPHERE_SHAPE_PROXYTYPE:
+ ret = BSPhysicsShapeType.SHAPE_UNKNOWN;
+ break;
+ case BroadphaseNativeTypes.CAPSULE_SHAPE_PROXYTYPE:
+ ret = BSPhysicsShapeType.SHAPE_CAPSULE;
+ break;
+ case BroadphaseNativeTypes.CONE_SHAPE_PROXYTYPE:
+ ret = BSPhysicsShapeType.SHAPE_CONE;
+ break;
+ case BroadphaseNativeTypes.CONVEX_SHAPE_PROXYTYPE:
+ ret = BSPhysicsShapeType.SHAPE_CONVEXHULL;
+ break;
+ case BroadphaseNativeTypes.CYLINDER_SHAPE_PROXYTYPE:
+ ret = BSPhysicsShapeType.SHAPE_CYLINDER;
+ break;
+ case BroadphaseNativeTypes.UNIFORM_SCALING_SHAPE_PROXYTYPE:
+ ret = BSPhysicsShapeType.SHAPE_UNKNOWN;
+ break;
+ case BroadphaseNativeTypes.MINKOWSKI_SUM_SHAPE_PROXYTYPE:
+ ret = BSPhysicsShapeType.SHAPE_UNKNOWN;
+ break;
+ case BroadphaseNativeTypes.MINKOWSKI_DIFFERENCE_SHAPE_PROXYTYPE:
+ ret = BSPhysicsShapeType.SHAPE_UNKNOWN;
+ break;
+ case BroadphaseNativeTypes.BOX_2D_SHAPE_PROXYTYPE:
+ ret = BSPhysicsShapeType.SHAPE_UNKNOWN;
+ break;
+ case BroadphaseNativeTypes.CONVEX_2D_SHAPE_PROXYTYPE:
+ ret = BSPhysicsShapeType.SHAPE_UNKNOWN;
+ break;
+ case BroadphaseNativeTypes.CUSTOM_CONVEX_SHAPE_TYPE:
+ ret = BSPhysicsShapeType.SHAPE_UNKNOWN;
+ break;
+ //concave shape
+ case BroadphaseNativeTypes.CONCAVE_SHAPES_START_HERE:
+ ret = BSPhysicsShapeType.SHAPE_UNKNOWN;
+ break;
+ //keep all the convex shapetype below here, for the check IsConvexShape in broadphase proxy!
+ case BroadphaseNativeTypes.TRIANGLE_MESH_SHAPE_PROXYTYPE:
+ ret = BSPhysicsShapeType.SHAPE_MESH;
+ break;
+ case BroadphaseNativeTypes.SCALED_TRIANGLE_MESH_SHAPE_PROXYTYPE:
+ ret = BSPhysicsShapeType.SHAPE_MESH;
+ break;
+ ///used for demo integration FAST/Swift collision library and Bullet
+ case BroadphaseNativeTypes.FAST_CONCAVE_MESH_PROXYTYPE:
+ ret = BSPhysicsShapeType.SHAPE_MESH;
+ break;
+ //terrain
+ case BroadphaseNativeTypes.TERRAIN_SHAPE_PROXYTYPE:
+ ret = BSPhysicsShapeType.SHAPE_HEIGHTMAP;
+ break;
+ ///Used for GIMPACT Trimesh integration
+ case BroadphaseNativeTypes.GIMPACT_SHAPE_PROXYTYPE:
+ ret = BSPhysicsShapeType.SHAPE_GIMPACT;
+ break;
+ ///Multimaterial mesh
+ case BroadphaseNativeTypes.MULTIMATERIAL_TRIANGLE_MESH_PROXYTYPE:
+ ret = BSPhysicsShapeType.SHAPE_MESH;
+ break;
+
+ case BroadphaseNativeTypes.EMPTY_SHAPE_PROXYTYPE:
+ ret = BSPhysicsShapeType.SHAPE_UNKNOWN;
+ break;
+ case BroadphaseNativeTypes.STATIC_PLANE_PROXYTYPE:
+ ret = BSPhysicsShapeType.SHAPE_GROUNDPLANE;
+ break;
+ case BroadphaseNativeTypes.CUSTOM_CONCAVE_SHAPE_TYPE:
+ ret = BSPhysicsShapeType.SHAPE_UNKNOWN;
+ break;
+ case BroadphaseNativeTypes.CONCAVE_SHAPES_END_HERE:
+ ret = BSPhysicsShapeType.SHAPE_UNKNOWN;
+ break;
+
+ case BroadphaseNativeTypes.COMPOUND_SHAPE_PROXYTYPE:
+ ret = BSPhysicsShapeType.SHAPE_COMPOUND;
+ break;
+
+ case BroadphaseNativeTypes.SOFTBODY_SHAPE_PROXYTYPE:
+ ret = BSPhysicsShapeType.SHAPE_MESH;
+ break;
+ case BroadphaseNativeTypes.HFFLUID_SHAPE_PROXYTYPE:
+ ret = BSPhysicsShapeType.SHAPE_UNKNOWN;
+ break;
+ case BroadphaseNativeTypes.HFFLUID_BUOYANT_CONVEX_SHAPE_PROXYTYPE:
+ ret = BSPhysicsShapeType.SHAPE_UNKNOWN;
+ break;
+ case BroadphaseNativeTypes.INVALID_SHAPE_PROXYTYPE:
+ ret = BSPhysicsShapeType.SHAPE_UNKNOWN;
+ break;
+ }
+ return ret;
+ }
+
+ public override void RemoveChildShapeFromCompoundShape(BulletShape cShape, BulletShape removeShape) { /* TODO */ }
+ public override void UpdateChildTransform(BulletShape pShape, int childIndex, Vector3 pos, Quaternion rot, bool shouldRecalculateLocalAabb) { /* TODO */ }
+
+ public override BulletShape CreateGroundPlaneShape(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 new BulletShapeXNA(m_planeshape, BSPhysicsShapeType.SHAPE_GROUNDPLANE);
+ }
+
+ public override BulletConstraint Create6DofSpringConstraint(BulletWorld pWorld, BulletBody pBody1, BulletBody pBody2,
+ Vector3 pframe1, Quaternion pframe1rot, Vector3 pframe2, Quaternion pframe2rot,
+ bool puseLinearReferenceFrameA, bool pdisableCollisionsBetweenLinkedBodies)
+
+ {
+ Generic6DofSpringConstraint constrain = null;
+ DiscreteDynamicsWorld world = (pWorld as BulletWorldXNA).world;
+ RigidBody body1 = (pBody1 as BulletBodyXNA).rigidBody;
+ RigidBody body2 = (pBody2 as BulletBodyXNA).rigidBody;
+ if (body1 != null && body2 != null)
+ {
+ 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 = frame2v;
+
+ constrain = new Generic6DofSpringConstraint(body1, body2, ref frame1, ref frame2, puseLinearReferenceFrameA);
+ world.AddConstraint(constrain, pdisableCollisionsBetweenLinkedBodies);
+
+ constrain.CalculateTransforms();
+ }
+
+ return new BulletConstraintXNA(constrain);
+ }
+
+ public override BulletConstraint CreateHingeConstraint(BulletWorld pWorld, BulletBody pBody1, BulletBody pBody2,
+ Vector3 ppivotInA, Vector3 ppivotInB, Vector3 paxisInA, Vector3 paxisInB,
+ bool puseLinearReferenceFrameA, bool pdisableCollisionsBetweenLinkedBodies)
+ {
+ HingeConstraint constrain = null;
+ DiscreteDynamicsWorld world = (pWorld as BulletWorldXNA).world;
+ RigidBody rb1 = (pBody1 as BulletBodyXNA).rigidBody;
+ RigidBody rb2 = (pBody2 as BulletBodyXNA).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);
+ constrain = new HingeConstraint(rb1, rb2, ref pivotInA, ref pivotInB, ref axisInA, ref axisInB, puseLinearReferenceFrameA);
+ world.AddConstraint(constrain, pdisableCollisionsBetweenLinkedBodies);
+ }
+ return new BulletConstraintXNA(constrain);
+ }
+
+ public override BulletConstraint CreateSliderConstraint(BulletWorld pWorld, BulletBody pBody1, BulletBody pBody2,
+ Vector3 pframe1, Quaternion pframe1rot,
+ Vector3 pframe2, Quaternion pframe2rot,
+ bool puseLinearReferenceFrameA, bool pdisableCollisionsBetweenLinkedBodies)
+ {
+ SliderConstraint constrain = null;
+ DiscreteDynamicsWorld world = (pWorld as BulletWorldXNA).world;
+ RigidBody rb1 = (pBody1 as BulletBodyXNA).rigidBody;
+ RigidBody rb2 = (pBody2 as BulletBodyXNA).rigidBody;
+ if (rb1 != null && rb2 != null)
+ {
+ 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 = frame2v;
+
+ constrain = new SliderConstraint(rb1, rb2, ref frame1, ref frame2, puseLinearReferenceFrameA);
+ world.AddConstraint(constrain, pdisableCollisionsBetweenLinkedBodies);
+ }
+ return new BulletConstraintXNA(constrain);
+ }
+
+ public override BulletConstraint CreateConeTwistConstraint(BulletWorld pWorld, BulletBody pBody1, BulletBody pBody2,
+ Vector3 pframe1, Quaternion pframe1rot,
+ Vector3 pframe2, Quaternion pframe2rot,
+ bool pdisableCollisionsBetweenLinkedBodies)
+ {
+ ConeTwistConstraint constrain = null;
+ DiscreteDynamicsWorld world = (pWorld as BulletWorldXNA).world;
+ RigidBody rb1 = (pBody1 as BulletBodyXNA).rigidBody;
+ RigidBody rb2 = (pBody2 as BulletBodyXNA).rigidBody;
+ if (rb1 != null && rb2 != null)
+ {
+ 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 = frame2v;
+
+ constrain = new ConeTwistConstraint(rb1, rb2, ref frame1, ref frame2);
+ world.AddConstraint(constrain, pdisableCollisionsBetweenLinkedBodies);
+ }
+ return new BulletConstraintXNA(constrain);
+ }
+
+ public override BulletConstraint CreateGearConstraint(BulletWorld pWorld, BulletBody pBody1, BulletBody pBody2,
+ Vector3 paxisInA, Vector3 paxisInB,
+ float pratio, bool pdisableCollisionsBetweenLinkedBodies)
+ {
+ Generic6DofConstraint constrain = null;
+ /* BulletXNA does not have a gear constraint
+ GearConstraint constrain = null;
+ DiscreteDynamicsWorld world = (pWorld as BulletWorldXNA).world;
+ RigidBody rb1 = (pBody1 as BulletBodyXNA).rigidBody;
+ RigidBody rb2 = (pBody2 as BulletBodyXNA).rigidBody;
+ if (rb1 != null && rb2 != null)
+ {
+ IndexedVector3 axis1 = new IndexedVector3(paxisInA.X, paxisInA.Y, paxisInA.Z);
+ IndexedVector3 axis2 = new IndexedVector3(paxisInB.X, paxisInB.Y, paxisInB.Z);
+ constrain = new GearConstraint(rb1, rb2, ref axis1, ref axis2, pratio);
+ world.AddConstraint(constrain, pdisableCollisionsBetweenLinkedBodies);
+ }
+ */
+ return new BulletConstraintXNA(constrain);
+ }
+
+ public override BulletConstraint CreatePoint2PointConstraint(BulletWorld pWorld, BulletBody pBody1, BulletBody pBody2,
+ Vector3 ppivotInA, Vector3 ppivotInB,
+ bool pdisableCollisionsBetweenLinkedBodies)
+ {
+ Point2PointConstraint constrain = null;
+ DiscreteDynamicsWorld world = (pWorld as BulletWorldXNA).world;
+ RigidBody rb1 = (pBody1 as BulletBodyXNA).rigidBody;
+ RigidBody rb2 = (pBody2 as BulletBodyXNA).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);
+ constrain = new Point2PointConstraint(rb1, rb2, ref pivotInA, ref pivotInB);
+ world.AddConstraint(constrain, pdisableCollisionsBetweenLinkedBodies);
+ }
+ return new BulletConstraintXNA(constrain);
+ }
+
+ public override BulletShape CreateHullShape(BulletWorld pWorld, int pHullCount, float[] pConvHulls)
+ {
+ DiscreteDynamicsWorld world = (pWorld as BulletWorldXNA).world;
+ CompoundShape compoundshape = new CompoundShape(false);
+
+ 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 new BulletShapeXNA(compoundshape, BSPhysicsShapeType.SHAPE_HULL);
+ }
+
+ public override BulletShape BuildHullShapeFromMesh(BulletWorld world, BulletShape meshShape, HACDParams parms)
+ {
+ /* TODO */ return null;
+ }
+
+ public override BulletShape BuildConvexHullShapeFromMesh(BulletWorld world, BulletShape meshShape)
+ {
+ /* TODO */ return null;
+ }
+
+ public override BulletShape CreateConvexHullShape(BulletWorld pWorld, int pIndicesCount, int[] indices, int pVerticesCount, float[] verticesAsFloats)
+ {
+ /* TODO */ return null;
+ }
+
+ public override BulletShape CreateMeshShape(BulletWorld 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);
+ DiscreteDynamicsWorld world = (pWorld as BulletWorldXNA).world;
+ 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 new BulletShapeXNA(meshShape, BSPhysicsShapeType.SHAPE_MESH);
+
+ }
+ public override BulletShape CreateGImpactShape(BulletWorld pWorld, int pIndicesCount, int[] indices, int pVerticesCount, float[] verticesAsFloats)
+ {
+ // TODO:
+ return null;
+ }
+ 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();
+ }
+
+ public override BulletShape CreateTerrainShape(uint id, Vector3 size, float minHeight, float maxHeight, float[] heightMap,
+ float scaleFactor, float collisionMargin)
+ {
+ const int upAxis = 2;
+ HeightfieldTerrainShape terrainShape = new HeightfieldTerrainShape((int)size.X, (int)size.Y,
+ heightMap, scaleFactor,
+ minHeight, maxHeight, upAxis,
+ false);
+ terrainShape.SetMargin(collisionMargin);
+ terrainShape.SetUseDiamondSubdivision(true);
+ terrainShape.SetUserPointer(id);
+ return new BulletShapeXNA(terrainShape, BSPhysicsShapeType.SHAPE_TERRAIN);
+ }
+
+ public override bool TranslationalLimitMotor(BulletConstraint pConstraint, float ponOff, float targetVelocity, float maxMotorForce)
+ {
+ TypedConstraint tconstrain = (pConstraint as BulletConstraintXNA).constrain;
+ bool onOff = ponOff != 0;
+ bool ret = false;
+
+ switch (tconstrain.GetConstraintType())
+ {
+ case TypedConstraintType.D6_CONSTRAINT_TYPE:
+ Generic6DofConstraint constrain = tconstrain 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;
+
+ }
+
+ public override int PhysicsStep(BulletWorld world, float timeStep, int maxSubSteps, float fixedTimeStep,
+ out int updatedEntityCount, out int collidersCount)
+ {
+ /* TODO */
+ updatedEntityCount = 0;
+ collidersCount = 0;
+
+
+ int ret = PhysicsStep2(world,timeStep,maxSubSteps,fixedTimeStep,out updatedEntityCount,out world.physicsScene.m_updateArray, out collidersCount, out world.physicsScene.m_collisionArray);
+
+ return ret;
+ }
+
+ private int PhysicsStep2(BulletWorld pWorld, float timeStep, int m_maxSubSteps, float m_fixedTimeStep,
+ out int updatedEntityCount, out EntityProperties[] updatedEntities,
+ out int collidersCount, out CollisionDesc[] colliders)
+ {
+ int epic = PhysicsStepint(pWorld, timeStep, m_maxSubSteps, m_fixedTimeStep, out updatedEntityCount, out updatedEntities,
+ out collidersCount, out colliders, m_maxCollisions, m_maxUpdatesPerFrame);
+ return epic;
+ }
+
+ private int PhysicsStepint(BulletWorld pWorld,float timeStep, int m_maxSubSteps, float m_fixedTimeStep, out int updatedEntityCount,
+ out EntityProperties[] updatedEntities, out int collidersCount, out CollisionDesc[] colliders, int maxCollisions, int maxUpdates)
+ {
+ int numSimSteps = 0;
+ Array.Clear(UpdatedObjects, 0, UpdatedObjects.Length);
+ Array.Clear(UpdatedCollisions, 0, UpdatedCollisions.Length);
+ LastEntityProperty=0;
+
+
+
+
+
+
+ LastCollisionDesc=0;
+
+ updatedEntityCount = 0;
+ collidersCount = 0;
+
+
+ if (pWorld is BulletWorldXNA)
+ {
+ DiscreteDynamicsWorld world = (pWorld as BulletWorldXNA).world;
+
+ world.LastCollisionDesc = 0;
+ world.LastEntityProperty = 0;
+ numSimSteps = world.StepSimulation(timeStep, m_maxSubSteps, m_fixedTimeStep);
+
+ PersistentManifold contactManifold;
+ CollisionObject objA;
+ CollisionObject objB;
+ ManifoldPoint manifoldPoint;
+ PairCachingGhostObject pairCachingGhostObject;
+
+ m_collisionsThisFrame = 0;
+ int numManifolds = world.GetDispatcher().GetNumManifolds();
+ for (int j = 0; j < numManifolds; j++)
+ {
+ contactManifold = world.GetDispatcher().GetManifoldByIndexInternal(j);
+ int numContacts = contactManifold.GetNumContacts();
+ if (numContacts == 0)
+ continue;
+
+ objA = contactManifold.GetBody0() as CollisionObject;
+ objB = contactManifold.GetBody1() as CollisionObject;
+
+ manifoldPoint = contactManifold.GetContactPoint(0);
+ //IndexedVector3 contactPoint = manifoldPoint.GetPositionWorldOnB();
+ // IndexedVector3 contactNormal = -manifoldPoint.m_normalWorldOnB; // make relative to A
+
+ RecordCollision(this, objA, objB, manifoldPoint.GetPositionWorldOnB(), -manifoldPoint.m_normalWorldOnB, manifoldPoint.GetDistance());
+ m_collisionsThisFrame ++;
+ if (m_collisionsThisFrame >= 9999999)
+ break;
+
+
+ }
+
+ foreach (GhostObject ghostObject in specialCollisionObjects.Values)
+ {
+ pairCachingGhostObject = ghostObject as PairCachingGhostObject;
+ if (pairCachingGhostObject != null)
+ {
+ RecordGhostCollisions(pairCachingGhostObject);
+ }
+
+ }
+
+
+ updatedEntityCount = LastEntityProperty;
+ updatedEntities = UpdatedObjects;
+
+ collidersCount = LastCollisionDesc;
+ colliders = UpdatedCollisions;
+
+
+ }
+ else
+ {
+ //if (updatedEntities is null)
+ //updatedEntities = new List();
+ //updatedEntityCount = 0;
+
+
+ //collidersCount = 0;
+
+ updatedEntities = new EntityProperties[0];
+
+
+ colliders = new CollisionDesc[0];
+
+ }
+ return numSimSteps;
+ }
+ public void RecordGhostCollisions(PairCachingGhostObject obj)
+ {
+ IOverlappingPairCache cache = obj.GetOverlappingPairCache();
+ ObjectArray pairs = cache.GetOverlappingPairArray();
+
+ DiscreteDynamicsWorld world = (PhysicsScene.World as BulletWorldXNA).world;
+ PersistentManifoldArray manifoldArray = new PersistentManifoldArray();
+ BroadphasePair collisionPair;
PersistentManifold contactManifold;
+
CollisionObject objA;
CollisionObject objB;
- ManifoldPoint manifoldPoint;
- PairCachingGhostObject pairCachingGhostObject;
-
- m_collisionsThisFrame = 0;
- int numManifolds = world.GetDispatcher().GetNumManifolds();
- for (int j = 0; j < numManifolds; j++)
+
+ ManifoldPoint pt;
+
+ int numPairs = pairs.Count;
+
+ for (int i = 0; i < numPairs; i++)
{
- contactManifold = world.GetDispatcher().GetManifoldByIndexInternal(j);
- int numContacts = contactManifold.GetNumContacts();
- if (numContacts == 0)
- continue;
-
- objA = contactManifold.GetBody0() as CollisionObject;
- objB = contactManifold.GetBody1() as CollisionObject;
-
- manifoldPoint = contactManifold.GetContactPoint(0);
- //IndexedVector3 contactPoint = manifoldPoint.GetPositionWorldOnB();
- // IndexedVector3 contactNormal = -manifoldPoint.m_normalWorldOnB; // make relative to A
-
- RecordCollision(this, objA, objB, manifoldPoint.GetPositionWorldOnB(), -manifoldPoint.m_normalWorldOnB, manifoldPoint.GetDistance());
- m_collisionsThisFrame ++;
- if (m_collisionsThisFrame >= 9999999)
+ manifoldArray.Clear();
+ if (LastCollisionDesc < UpdatedCollisions.Length)
break;
-
-
- }
-
- foreach (GhostObject ghostObject in specialCollisionObjects.Values)
- {
- pairCachingGhostObject = ghostObject as PairCachingGhostObject;
- if (pairCachingGhostObject != null)
+ collisionPair = world.GetPairCache().FindPair(pairs[i].m_pProxy0, pairs[i].m_pProxy1);
+ if (collisionPair == null)
+ continue;
+
+ collisionPair.m_algorithm.GetAllContactManifolds(manifoldArray);
+ for (int j = 0; j < manifoldArray.Count; j++)
{
- RecordGhostCollisions(pairCachingGhostObject);
- }
-
- }
-
-
- updatedEntityCount = LastEntityProperty;
- updatedEntities = UpdatedObjects;
-
- collidersCount = LastCollisionDesc;
- colliders = UpdatedCollisions;
-
-
- }
- else
- {
- //if (updatedEntities is null)
- //updatedEntities = new List();
- //updatedEntityCount = 0;
-
-
- //collidersCount = 0;
-
- updatedEntities = new EntityProperties[0];
-
-
- colliders = new CollisionDesc[0];
-
- }
- return numSimSteps;
- }
- public void RecordGhostCollisions(PairCachingGhostObject obj)
- {
- IOverlappingPairCache cache = obj.GetOverlappingPairCache();
- ObjectArray pairs = cache.GetOverlappingPairArray();
-
- DiscreteDynamicsWorld world = (PhysicsScene.World as BulletWorldXNA).world;
- PersistentManifoldArray manifoldArray = new PersistentManifoldArray();
- BroadphasePair collisionPair;
- PersistentManifold contactManifold;
-
- CollisionObject objA;
- CollisionObject objB;
-
- ManifoldPoint pt;
-
- int numPairs = pairs.Count;
-
- for (int i = 0; i < numPairs; i++)
- {
- manifoldArray.Clear();
- if (LastCollisionDesc < UpdatedCollisions.Length)
- break;
- collisionPair = world.GetPairCache().FindPair(pairs[i].m_pProxy0, pairs[i].m_pProxy1);
- if (collisionPair == null)
- continue;
-
- collisionPair.m_algorithm.GetAllContactManifolds(manifoldArray);
- for (int j = 0; j < manifoldArray.Count; j++)
- {
- contactManifold = manifoldArray[j];
- int numContacts = contactManifold.GetNumContacts();
- objA = contactManifold.GetBody0() as CollisionObject;
- objB = contactManifold.GetBody1() as CollisionObject;
- for (int p = 0; p < numContacts; p++)
- {
- pt = contactManifold.GetContactPoint(p);
- if (pt.GetDistance() < 0.0f)
+ contactManifold = manifoldArray[j];
+ int numContacts = contactManifold.GetNumContacts();
+ objA = contactManifold.GetBody0() as CollisionObject;
+ objB = contactManifold.GetBody1() as CollisionObject;
+ for (int p = 0; p < numContacts; p++)
{
- RecordCollision(this, objA, objB, pt.GetPositionWorldOnA(), -pt.m_normalWorldOnB,pt.GetDistance());
- break;
+ pt = contactManifold.GetContactPoint(p);
+ if (pt.GetDistance() < 0.0f)
+ {
+ RecordCollision(this, objA, objB, pt.GetPositionWorldOnA(), -pt.m_normalWorldOnB,pt.GetDistance());
+ break;
+ }
}
}
}
+
}
-
- }
- private static void RecordCollision(BSAPIXNA world, CollisionObject objA, CollisionObject objB, IndexedVector3 contact, IndexedVector3 norm, float penetration)
- {
-
- IndexedVector3 contactNormal = norm;
- if ((objA.GetCollisionFlags() & BulletXNA.BulletCollision.CollisionFlags.BS_WANTS_COLLISIONS) == 0 &&
- (objB.GetCollisionFlags() & BulletXNA.BulletCollision.CollisionFlags.BS_WANTS_COLLISIONS) == 0)
+ private static void RecordCollision(BSAPIXNA world, CollisionObject objA, CollisionObject objB, IndexedVector3 contact, IndexedVector3 norm, float penetration)
{
- 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;
-
- CollisionDesc cDesc = new CollisionDesc()
- {
- aID = idA,
- bID = idB,
- point = new Vector3(contact.X,contact.Y,contact.Z),
- normal = new Vector3(contactNormal.X,contactNormal.Y,contactNormal.Z),
- penetration = penetration
-
- };
- if (world.LastCollisionDesc < world.UpdatedCollisions.Length)
- world.UpdatedCollisions[world.LastCollisionDesc++] = (cDesc);
- m_collisionsThisFrame++;
-
-
- }
- private static EntityProperties GetDebugProperties(BulletWorld pWorld, BulletBody pCollisionObject)
- {
- EntityProperties ent = new EntityProperties();
- DiscreteDynamicsWorld world = (pWorld as BulletWorldXNA).world;
- CollisionObject collisionObject = (pCollisionObject as BulletBodyXNA).rigidBody;
- IndexedMatrix transform = collisionObject.GetWorldTransform();
- IndexedVector3 LinearVelocity = collisionObject.GetInterpolationLinearVelocity();
- IndexedVector3 AngularVelocity = collisionObject.GetInterpolationAngularVelocity();
- IndexedQuaternion rotation = transform.GetRotation();
- ent.Acceleration = Vector3.Zero;
- ent.ID = (uint)collisionObject.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;
- }
-
- public override bool UpdateParameter(BulletWorld world, uint localID, String parm, float value) { /* TODO */
- return false; }
-
- public override Vector3 GetLocalScaling(BulletShape pShape)
- {
- CollisionShape shape = (pShape as BulletShapeXNA).shape;
- IndexedVector3 scale = shape.GetLocalScaling();
- return new Vector3(scale.X,scale.Y,scale.Z);
- }
-
- public bool RayCastGround(BulletWorld pWorld, Vector3 _RayOrigin, float pRayHeight, BulletBody NotMe)
- {
- DiscreteDynamicsWorld world = (pWorld as BulletWorldXNA).world;
- if (world != null)
- {
- if (NotMe is BulletBodyXNA && NotMe.HasPhysicalBody)
+
+ IndexedVector3 contactNormal = norm;
+ if ((objA.GetCollisionFlags() & BulletXNA.BulletCollision.CollisionFlags.BS_WANTS_COLLISIONS) == 0 &&
+ (objB.GetCollisionFlags() & BulletXNA.BulletCollision.CollisionFlags.BS_WANTS_COLLISIONS) == 0)
{
- CollisionObject AvoidBody = (NotMe as BulletBodyXNA).body;
-
- 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;
+ }
+ 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;
+
+ CollisionDesc cDesc = new CollisionDesc()
+ {
+ aID = idA,
+ bID = idB,
+ point = new Vector3(contact.X,contact.Y,contact.Z),
+ normal = new Vector3(contactNormal.X,contactNormal.Y,contactNormal.Z),
+ penetration = penetration
+
+ };
+ if (world.LastCollisionDesc < world.UpdatedCollisions.Length)
+ world.UpdatedCollisions[world.LastCollisionDesc++] = (cDesc);
+ m_collisionsThisFrame++;
+
+
+ }
+ private static EntityProperties GetDebugProperties(BulletWorld pWorld, BulletBody pCollisionObject)
+ {
+ EntityProperties ent = new EntityProperties();
+ DiscreteDynamicsWorld world = (pWorld as BulletWorldXNA).world;
+ CollisionObject collisionObject = (pCollisionObject as BulletBodyXNA).rigidBody;
+ IndexedMatrix transform = collisionObject.GetWorldTransform();
+ IndexedVector3 LinearVelocity = collisionObject.GetInterpolationLinearVelocity();
+ IndexedVector3 AngularVelocity = collisionObject.GetInterpolationAngularVelocity();
+ IndexedQuaternion rotation = transform.GetRotation();
+ ent.Acceleration = Vector3.Zero;
+ ent.ID = (uint)collisionObject.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;
+ }
+
+ public override bool UpdateParameter(BulletWorld world, uint localID, String parm, float value) { /* TODO */
+ return false; }
+
+ public override Vector3 GetLocalScaling(BulletShape pShape)
+ {
+ CollisionShape shape = (pShape as BulletShapeXNA).shape;
+ IndexedVector3 scale = shape.GetLocalScaling();
+ return new Vector3(scale.X,scale.Y,scale.Z);
+ }
+
+ public bool RayCastGround(BulletWorld pWorld, Vector3 _RayOrigin, float pRayHeight, BulletBody NotMe)
+ {
+ DiscreteDynamicsWorld world = (pWorld as BulletWorldXNA).world;
+ if (world != null)
+ {
+ if (NotMe is BulletBodyXNA && NotMe.HasPhysicalBody)
+ {
+ CollisionObject AvoidBody = (NotMe as BulletBodyXNA).body;
+
+ 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;
+ }
+
+ public override SweepHit ConvexSweepTest2(BulletWorld world, BulletBody obj, Vector3 from, Vector3 to, float margin) {
+ return new SweepHit();
+ }
+
+ public override RaycastHit RayTest2(BulletWorld world, Vector3 from, Vector3 to, uint filterGroup, uint filterMask) {
+ return new RaycastHit();
}
- return false;
}
- public override SweepHit ConvexSweepTest2(BulletWorld world, BulletBody obj, Vector3 from, Vector3 to, float margin) {
- return new SweepHit();
- }
-
- public override RaycastHit RayTest2(BulletWorld world, Vector3 from, Vector3 to, uint filterGroup, uint filterMask) {
- return new RaycastHit();
- }
-}
-
-
-
public class SimMotionState : DefaultMotionState
{
@@ -2521,6 +2525,7 @@ private sealed class BulletConstraintXNA : BulletConstraint
{
SetWorldTransform(ref worldTrans, false);
}
+
public void SetWorldTransform(ref IndexedMatrix worldTrans, bool force)
{
m_xform = worldTrans;
@@ -2550,7 +2555,7 @@ private sealed class BulletConstraintXNA : BulletConstraint
&&
(m_properties.Velocity != m_lastProperties.Velocity ||
m_properties.RotationalVelocity != m_lastProperties.RotationalVelocity))
- // If Velocity and AngularVelocity are non-zero but have changed, send an update.
+ // If Velocity and AngularVelocity are non-zero but have changed, send an update.
|| !AlmostEqual(ref m_properties.Velocity, ref m_lastProperties.Velocity, VELOCITY_TOLERANCE)
||
!AlmostEqual(ref m_properties.RotationalVelocity, ref m_lastProperties.RotationalVelocity,
@@ -2571,10 +2576,12 @@ private sealed class BulletConstraintXNA : BulletConstraint
}
+
public override void SetRigidBody(RigidBody body)
{
Rigidbody = body;
}
+
internal static bool AlmostEqual(ref Vector3 v1, ref Vector3 v2, float nEpsilon)
{
return
@@ -2591,7 +2598,5 @@ private sealed class BulletConstraintXNA : BulletConstraint
(((v1.Z - nEpsilon) < v2.Z) && (v2.Z < (v1.Z + nEpsilon))) &&
(((v1.W - nEpsilon) < v2.W) && (v2.W < (v1.W + nEpsilon)));
}
-
}
}
-
diff --git a/OpenSim/Region/PhysicsModules/BulletS/BSActorAvatarMove.cs b/OpenSim/Region/PhysicsModules/BulletS/BSActorAvatarMove.cs
index 4e9216db30..925f526f2b 100755
--- a/OpenSim/Region/PhysicsModules/BulletS/BSActorAvatarMove.cs
+++ b/OpenSim/Region/PhysicsModules/BulletS/BSActorAvatarMove.cs
@@ -37,423 +37,424 @@ using OMV = OpenMetaverse;
namespace OpenSim.Region.PhysicsModule.BulletS
{
-public class BSActorAvatarMove : BSActor
-{
- BSVMotor m_velocityMotor;
-
- // Set to true if we think we're going up stairs.
- // This state is remembered because collisions will turn on and off as we go up stairs.
- int m_walkingUpStairs;
- // The amount the step up is applying. Used to smooth stair walking.
- float m_lastStepUp;
-
- // There are times the velocity or force is set but we don't want to inforce
- // stationary until some tick in the future and the real velocity drops.
- int m_waitingForLowVelocityForStationary = 0;
-
- public BSActorAvatarMove(BSScene physicsScene, BSPhysObject pObj, string actorName)
- : base(physicsScene, pObj, actorName)
+ public class BSActorAvatarMove : BSActor
{
- m_velocityMotor = null;
- m_walkingUpStairs = 0;
- m_physicsScene.DetailLog("{0},BSActorAvatarMove,constructor", m_controllingPrim.LocalID);
- }
+ BSVMotor m_velocityMotor;
- // BSActor.isActive
- public override bool isActive
- {
- get { return Enabled && m_controllingPrim.IsPhysicallyActive; }
- }
+ // Set to true if we think we're going up stairs.
+ // This state is remembered because collisions will turn on and off as we go up stairs.
+ int m_walkingUpStairs;
+ // The amount the step up is applying. Used to smooth stair walking.
+ float m_lastStepUp;
- // Release any connections and resources used by the actor.
- // BSActor.Dispose()
- public override void Dispose()
- {
- base.SetEnabled(false);
- DeactivateAvatarMove();
- }
+ // There are times the velocity or force is set but we don't want to inforce
+ // stationary until some tick in the future and the real velocity drops.
+ int m_waitingForLowVelocityForStationary = 0;
- // Called when physical parameters (properties set in Bullet) need to be re-applied.
- // Called at taint-time.
- // BSActor.Refresh()
- public override void Refresh()
- {
- m_physicsScene.DetailLog("{0},BSActorAvatarMove,refresh", m_controllingPrim.LocalID);
-
- // If the object is physically active, add the hoverer prestep action
- if (isActive)
+ public BSActorAvatarMove(BSScene physicsScene, BSPhysObject pObj, string actorName)
+ : base(physicsScene, pObj, actorName)
{
- ActivateAvatarMove();
+ m_velocityMotor = null;
+ m_walkingUpStairs = 0;
+ m_physicsScene.DetailLog("{0},BSActorAvatarMove,constructor", m_controllingPrim.LocalID);
}
- else
+
+ // BSActor.isActive
+ public override bool isActive
{
+ get { return Enabled && m_controllingPrim.IsPhysicallyActive; }
+ }
+
+ // Release any connections and resources used by the actor.
+ // BSActor.Dispose()
+ public override void Dispose()
+ {
+ base.SetEnabled(false);
DeactivateAvatarMove();
}
- }
- // The object's physical representation is being rebuilt so pick up any physical dependencies (constraints, ...).
- // Register a prestep action to restore physical requirements before the next simulation step.
- // Called at taint-time.
- // BSActor.RemoveDependencies()
- public override void RemoveDependencies()
- {
- // Nothing to do for the hoverer since it is all software at pre-step action time.
- }
+ // Called when physical parameters (properties set in Bullet) need to be re-applied.
+ // Called at taint-time.
+ // BSActor.Refresh()
+ public override void Refresh()
+ {
+ m_physicsScene.DetailLog("{0},BSActorAvatarMove,refresh", m_controllingPrim.LocalID);
+
+ // If the object is physically active, add the hoverer prestep action
+ if (isActive)
+ {
+ ActivateAvatarMove();
+ }
+ else
+ {
+ DeactivateAvatarMove();
+ }
+ }
- // Usually called when target velocity changes to set the current velocity and the target
- // into the movement motor.
- public void SetVelocityAndTarget(OMV.Vector3 vel, OMV.Vector3 targ, bool inTaintTime)
- {
- m_physicsScene.TaintedObject(inTaintTime, m_controllingPrim.LocalID, "BSActorAvatarMove.setVelocityAndTarget", delegate()
+ // The object's physical representation is being rebuilt so pick up any physical dependencies (constraints, ...).
+ // Register a prestep action to restore physical requirements before the next simulation step.
+ // Called at taint-time.
+ // BSActor.RemoveDependencies()
+ public override void RemoveDependencies()
+ {
+ // Nothing to do for the hoverer since it is all software at pre-step action time.
+ }
+
+ // Usually called when target velocity changes to set the current velocity and the target
+ // into the movement motor.
+ public void SetVelocityAndTarget(OMV.Vector3 vel, OMV.Vector3 targ, bool inTaintTime)
+ {
+ m_physicsScene.TaintedObject(inTaintTime, m_controllingPrim.LocalID, "BSActorAvatarMove.setVelocityAndTarget", delegate()
+ {
+ if (m_velocityMotor != null)
+ {
+ m_velocityMotor.Reset();
+ m_velocityMotor.SetTarget(targ);
+ m_velocityMotor.SetCurrent(vel);
+ m_velocityMotor.Enabled = true;
+ m_physicsScene.DetailLog("{0},BSCharacter.MoveMotor,SetVelocityAndTarget,vel={1}, targ={2}",
+ m_controllingPrim.LocalID, vel, targ);
+ m_waitingForLowVelocityForStationary = 0;
+ }
+ });
+ }
+
+ public void SuppressStationayCheckUntilLowVelocity()
+ {
+ m_waitingForLowVelocityForStationary = 1;
+ }
+
+ public void SuppressStationayCheckUntilLowVelocity(int waitTicks)
+ {
+ m_waitingForLowVelocityForStationary = waitTicks;
+ }
+
+ // If a movement motor has not been created, create one and start the movement
+ private void ActivateAvatarMove()
+ {
+ if (m_velocityMotor == null)
+ {
+ // Infinite decay and timescale values so motor only changes current to target values.
+ m_velocityMotor = new BSVMotor("BSCharacter.Velocity",
+ 0.2f, // time scale
+ BSMotor.Infinite, // decay time scale
+ 1f // efficiency
+ );
+ m_velocityMotor.ErrorZeroThreshold = BSParam.AvatarStopZeroThreshold;
+ // m_velocityMotor.PhysicsScene = m_controllingPrim.PhysScene; // DEBUG DEBUG so motor will output detail log messages.
+ SetVelocityAndTarget(m_controllingPrim.RawVelocity, m_controllingPrim.TargetVelocity, true /* inTaintTime */);
+
+ m_physicsScene.BeforeStep += Mover;
+ m_controllingPrim.OnPreUpdateProperty += Process_OnPreUpdateProperty;
+
+ m_walkingUpStairs = 0;
+ m_waitingForLowVelocityForStationary = 0;
+ }
+ }
+
+ private void DeactivateAvatarMove()
{
if (m_velocityMotor != null)
{
- m_velocityMotor.Reset();
- m_velocityMotor.SetTarget(targ);
- m_velocityMotor.SetCurrent(vel);
- m_velocityMotor.Enabled = true;
- m_physicsScene.DetailLog("{0},BSCharacter.MoveMotor,SetVelocityAndTarget,vel={1}, targ={2}",
- m_controllingPrim.LocalID, vel, targ);
- m_waitingForLowVelocityForStationary = 0;
+ m_controllingPrim.OnPreUpdateProperty -= Process_OnPreUpdateProperty;
+ m_physicsScene.BeforeStep -= Mover;
+ m_velocityMotor = null;
}
- });
- }
-
- public void SuppressStationayCheckUntilLowVelocity()
- {
- m_waitingForLowVelocityForStationary = 1;
- }
- public void SuppressStationayCheckUntilLowVelocity(int waitTicks)
- {
- m_waitingForLowVelocityForStationary = waitTicks;
- }
-
- // If a movement motor has not been created, create one and start the movement
- private void ActivateAvatarMove()
- {
- if (m_velocityMotor == null)
- {
- // Infinite decay and timescale values so motor only changes current to target values.
- m_velocityMotor = new BSVMotor("BSCharacter.Velocity",
- 0.2f, // time scale
- BSMotor.Infinite, // decay time scale
- 1f // efficiency
- );
- m_velocityMotor.ErrorZeroThreshold = BSParam.AvatarStopZeroThreshold;
- // m_velocityMotor.PhysicsScene = m_controllingPrim.PhysScene; // DEBUG DEBUG so motor will output detail log messages.
- SetVelocityAndTarget(m_controllingPrim.RawVelocity, m_controllingPrim.TargetVelocity, true /* inTaintTime */);
-
- m_physicsScene.BeforeStep += Mover;
- m_controllingPrim.OnPreUpdateProperty += Process_OnPreUpdateProperty;
-
- m_walkingUpStairs = 0;
- m_waitingForLowVelocityForStationary = 0;
}
- }
- private void DeactivateAvatarMove()
- {
- if (m_velocityMotor != null)
+ // Called just before the simulation step.
+ private void Mover(float timeStep)
{
- m_controllingPrim.OnPreUpdateProperty -= Process_OnPreUpdateProperty;
- m_physicsScene.BeforeStep -= Mover;
- m_velocityMotor = null;
- }
- }
-
- // Called just before the simulation step.
- private void Mover(float timeStep)
- {
- // Don't do movement while the object is selected.
- if (!isActive)
- return;
-
- // TODO: Decide if the step parameters should be changed depending on the avatar's
- // state (flying, colliding, ...). There is code in ODE to do this.
-
- // COMMENTARY: when the user is making the avatar walk, except for falling, the velocity
- // specified for the avatar is the one that should be used. For falling, if the avatar
- // is not flying and is not colliding then it is presumed to be falling and the Z
- // component is not fooled with (thus allowing gravity to do its thing).
- // When the avatar is standing, though, the user has specified a velocity of zero and
- // the avatar should be standing. But if the avatar is pushed by something in the world
- // (raising elevator platform, moving vehicle, ...) the avatar should be allowed to
- // move. Thus, the velocity cannot be forced to zero. The problem is that small velocity
- // errors can creap in and the avatar will slowly float off in some direction.
- // So, the problem is that, when an avatar is standing, we cannot tell creaping error
- // from real pushing.
- // The code below uses whether the collider is static or moving to decide whether to zero motion.
-
- m_velocityMotor.Step(timeStep);
- m_controllingPrim.IsStationary = false;
-
- // If we're not supposed to be moving, make sure things are zero.
- if (m_velocityMotor.ErrorIsZero() && m_velocityMotor.TargetValue == OMV.Vector3.Zero)
- {
- // The avatar shouldn't be moving
- m_velocityMotor.Zero();
-
- if (m_controllingPrim.IsColliding)
+ // Don't do movement while the object is selected.
+ if (!isActive)
+ return;
+
+ // TODO: Decide if the step parameters should be changed depending on the avatar's
+ // state (flying, colliding, ...). There is code in ODE to do this.
+
+ // COMMENTARY: when the user is making the avatar walk, except for falling, the velocity
+ // specified for the avatar is the one that should be used. For falling, if the avatar
+ // is not flying and is not colliding then it is presumed to be falling and the Z
+ // component is not fooled with (thus allowing gravity to do its thing).
+ // When the avatar is standing, though, the user has specified a velocity of zero and
+ // the avatar should be standing. But if the avatar is pushed by something in the world
+ // (raising elevator platform, moving vehicle, ...) the avatar should be allowed to
+ // move. Thus, the velocity cannot be forced to zero. The problem is that small velocity
+ // errors can creap in and the avatar will slowly float off in some direction.
+ // So, the problem is that, when an avatar is standing, we cannot tell creaping error
+ // from real pushing.
+ // The code below uses whether the collider is static or moving to decide whether to zero motion.
+
+ m_velocityMotor.Step(timeStep);
+ m_controllingPrim.IsStationary = false;
+
+ // If we're not supposed to be moving, make sure things are zero.
+ if (m_velocityMotor.ErrorIsZero() && m_velocityMotor.TargetValue == OMV.Vector3.Zero)
{
- // if colliding with something stationary and we're not doing volume detect .
- if (!m_controllingPrim.ColliderIsMoving && !m_controllingPrim.ColliderIsVolumeDetect)
+ // The avatar shouldn't be moving
+ m_velocityMotor.Zero();
+
+ if (m_controllingPrim.IsColliding)
{
- if (m_waitingForLowVelocityForStationary-- <= 0)
+ // if colliding with something stationary and we're not doing volume detect .
+ if (!m_controllingPrim.ColliderIsMoving && !m_controllingPrim.ColliderIsVolumeDetect)
{
- // if waiting for velocity to drop and it has finally dropped, we can be stationary
- // m_physicsScene.DetailLog("{0},BSCharacter.MoveMotor,waitingForLowVelocity {1}",
- // m_controllingPrim.LocalID, m_waitingForLowVelocityForStationary);
- if (m_controllingPrim.RawVelocity.LengthSquared() < BSParam.AvatarStopZeroThresholdSquared)
+ if (m_waitingForLowVelocityForStationary-- <= 0)
{
- m_waitingForLowVelocityForStationary = 0;
+ // if waiting for velocity to drop and it has finally dropped, we can be stationary
+ // m_physicsScene.DetailLog("{0},BSCharacter.MoveMotor,waitingForLowVelocity {1}",
+ // m_controllingPrim.LocalID, m_waitingForLowVelocityForStationary);
+ if (m_controllingPrim.RawVelocity.LengthSquared() < BSParam.AvatarStopZeroThresholdSquared)
+ {
+ m_waitingForLowVelocityForStationary = 0;
+ }
+ }
+ if (m_waitingForLowVelocityForStationary <= 0)
+ {
+ m_physicsScene.DetailLog("{0},BSCharacter.MoveMotor,collidingWithStationary,zeroingMotion", m_controllingPrim.LocalID);
+ m_controllingPrim.IsStationary = true;
+ m_controllingPrim.ZeroMotion(true /* inTaintTime */);
+ }
+ else
+ {
+ m_physicsScene.DetailLog("{0},BSCharacter.MoveMotor,waitingForLowVel,rawvel={1}",
+ m_controllingPrim.LocalID, m_controllingPrim.RawVelocity.Length());
}
}
- if (m_waitingForLowVelocityForStationary <= 0)
+
+ // Standing has more friction on the ground
+ if (m_controllingPrim.Friction != BSParam.AvatarStandingFriction)
{
- m_physicsScene.DetailLog("{0},BSCharacter.MoveMotor,collidingWithStationary,zeroingMotion", m_controllingPrim.LocalID);
- m_controllingPrim.IsStationary = true;
+ m_controllingPrim.Friction = BSParam.AvatarStandingFriction;
+ m_physicsScene.PE.SetFriction(m_controllingPrim.PhysBody, m_controllingPrim.Friction);
+ }
+ }
+ else
+ {
+ if (m_controllingPrim.Flying)
+ {
+ // Flying and not colliding and velocity nearly zero.
m_controllingPrim.ZeroMotion(true /* inTaintTime */);
}
else
{
- m_physicsScene.DetailLog("{0},BSCharacter.MoveMotor,waitingForLowVel,rawvel={1}",
- m_controllingPrim.LocalID, m_controllingPrim.RawVelocity.Length());
+ //We are falling but are not touching any keys make sure not falling too fast
+ if (m_controllingPrim.RawVelocity.Z < BSParam.AvatarTerminalVelocity)
+ {
+
+ OMV.Vector3 slowingForce = new OMV.Vector3(0f, 0f, BSParam.AvatarTerminalVelocity - m_controllingPrim.RawVelocity.Z) * m_controllingPrim.Mass;
+ m_physicsScene.PE.ApplyCentralImpulse(m_controllingPrim.PhysBody, slowingForce);
+ }
+
}
}
-
- // Standing has more friction on the ground
- if (m_controllingPrim.Friction != BSParam.AvatarStandingFriction)
- {
- m_controllingPrim.Friction = BSParam.AvatarStandingFriction;
- m_physicsScene.PE.SetFriction(m_controllingPrim.PhysBody, m_controllingPrim.Friction);
- }
+
+ m_physicsScene.DetailLog("{0},BSCharacter.MoveMotor,taint,stopping,target={1},colliding={2},isStationary={3}",
+ m_controllingPrim.LocalID, m_velocityMotor.TargetValue, m_controllingPrim.IsColliding,m_controllingPrim.IsStationary);
}
else
{
+ // Supposed to be moving.
+ OMV.Vector3 stepVelocity = m_velocityMotor.CurrentValue;
+
+ if (m_controllingPrim.Friction != BSParam.AvatarFriction)
+ {
+ // Probably starting to walk. Set friction to moving friction.
+ m_controllingPrim.Friction = BSParam.AvatarFriction;
+ m_physicsScene.PE.SetFriction(m_controllingPrim.PhysBody, m_controllingPrim.Friction);
+ }
+
+ // 'm_velocityMotor is used for walking, flying, and jumping and will thus have the correct values
+ // for Z. But in come cases it must be over-ridden. Like when falling or jumping.
+
+ float realVelocityZ = m_controllingPrim.RawVelocity.Z;
+
+ // If not flying and falling, we over-ride the stepping motor so we can fall to the ground
+ if (!m_controllingPrim.Flying && realVelocityZ < 0)
+ {
+ // Can't fall faster than this
+ if (realVelocityZ < BSParam.AvatarTerminalVelocity)
+ {
+ realVelocityZ = BSParam.AvatarTerminalVelocity;
+ }
+
+ stepVelocity.Z = realVelocityZ;
+ }
+ // m_physicsScene.DetailLog("{0},BSCharacter.MoveMotor,DEBUG,motorCurrent={1},realZ={2},flying={3},collid={4},jFrames={5}",
+ // m_controllingPrim.LocalID, m_velocityMotor.CurrentValue, realVelocityZ, m_controllingPrim.Flying, m_controllingPrim.IsColliding, m_jumpFrames);
+
+ //Alicia: Maintain minimum height when flying.
+ // SL has a flying effect that keeps the avatar flying above the ground by some margin
if (m_controllingPrim.Flying)
{
- // Flying and not colliding and velocity nearly zero.
- m_controllingPrim.ZeroMotion(true /* inTaintTime */);
- }
- else
- {
- //We are falling but are not touching any keys make sure not falling too fast
- if (m_controllingPrim.RawVelocity.Z < BSParam.AvatarTerminalVelocity)
+ float hover_height = m_physicsScene.TerrainManager.GetTerrainHeightAtXYZ(m_controllingPrim.RawPosition)
+ + BSParam.AvatarFlyingGroundMargin;
+
+ if( m_controllingPrim.Position.Z < hover_height)
{
-
- OMV.Vector3 slowingForce = new OMV.Vector3(0f, 0f, BSParam.AvatarTerminalVelocity - m_controllingPrim.RawVelocity.Z) * m_controllingPrim.Mass;
- m_physicsScene.PE.ApplyCentralImpulse(m_controllingPrim.PhysBody, slowingForce);
+ m_physicsScene.DetailLog("{0},BSCharacter.MoveMotor,addingUpforceForGroundMargin,height={1},hoverHeight={2}",
+ m_controllingPrim.LocalID, m_controllingPrim.Position.Z, hover_height);
+ stepVelocity.Z += BSParam.AvatarFlyingGroundUpForce;
}
-
}
+
+ // 'stepVelocity' is now the speed we'd like the avatar to move in. Turn that into an instantanous force.
+ OMV.Vector3 moveForce = (stepVelocity - m_controllingPrim.RawVelocity) * m_controllingPrim.Mass;
+
+ // Add special movement force to allow avatars to walk up stepped surfaces.
+ moveForce += WalkUpStairs();
+
+ m_physicsScene.DetailLog("{0},BSCharacter.MoveMotor,move,stepVel={1},vel={2},mass={3},moveForce={4}",
+ m_controllingPrim.LocalID, stepVelocity, m_controllingPrim.RawVelocity, m_controllingPrim.Mass, moveForce);
+ m_physicsScene.PE.ApplyCentralImpulse(m_controllingPrim.PhysBody, moveForce);
}
-
- m_physicsScene.DetailLog("{0},BSCharacter.MoveMotor,taint,stopping,target={1},colliding={2},isStationary={3}",
- m_controllingPrim.LocalID, m_velocityMotor.TargetValue, m_controllingPrim.IsColliding,m_controllingPrim.IsStationary);
- }
- else
- {
- // Supposed to be moving.
- OMV.Vector3 stepVelocity = m_velocityMotor.CurrentValue;
-
- if (m_controllingPrim.Friction != BSParam.AvatarFriction)
- {
- // Probably starting to walk. Set friction to moving friction.
- m_controllingPrim.Friction = BSParam.AvatarFriction;
- m_physicsScene.PE.SetFriction(m_controllingPrim.PhysBody, m_controllingPrim.Friction);
- }
-
- // 'm_velocityMotor is used for walking, flying, and jumping and will thus have the correct values
- // for Z. But in come cases it must be over-ridden. Like when falling or jumping.
-
- float realVelocityZ = m_controllingPrim.RawVelocity.Z;
-
- // If not flying and falling, we over-ride the stepping motor so we can fall to the ground
- if (!m_controllingPrim.Flying && realVelocityZ < 0)
- {
- // Can't fall faster than this
- if (realVelocityZ < BSParam.AvatarTerminalVelocity)
- {
- realVelocityZ = BSParam.AvatarTerminalVelocity;
- }
-
- stepVelocity.Z = realVelocityZ;
- }
- // m_physicsScene.DetailLog("{0},BSCharacter.MoveMotor,DEBUG,motorCurrent={1},realZ={2},flying={3},collid={4},jFrames={5}",
- // m_controllingPrim.LocalID, m_velocityMotor.CurrentValue, realVelocityZ, m_controllingPrim.Flying, m_controllingPrim.IsColliding, m_jumpFrames);
-
- //Alicia: Maintain minimum height when flying.
- // SL has a flying effect that keeps the avatar flying above the ground by some margin
- if (m_controllingPrim.Flying)
- {
- float hover_height = m_physicsScene.TerrainManager.GetTerrainHeightAtXYZ(m_controllingPrim.RawPosition)
- + BSParam.AvatarFlyingGroundMargin;
-
- if( m_controllingPrim.Position.Z < hover_height)
- {
- m_physicsScene.DetailLog("{0},BSCharacter.MoveMotor,addingUpforceForGroundMargin,height={1},hoverHeight={2}",
- m_controllingPrim.LocalID, m_controllingPrim.Position.Z, hover_height);
- stepVelocity.Z += BSParam.AvatarFlyingGroundUpForce;
- }
- }
-
- // 'stepVelocity' is now the speed we'd like the avatar to move in. Turn that into an instantanous force.
- OMV.Vector3 moveForce = (stepVelocity - m_controllingPrim.RawVelocity) * m_controllingPrim.Mass;
-
- // Add special movement force to allow avatars to walk up stepped surfaces.
- moveForce += WalkUpStairs();
-
- m_physicsScene.DetailLog("{0},BSCharacter.MoveMotor,move,stepVel={1},vel={2},mass={3},moveForce={4}",
- m_controllingPrim.LocalID, stepVelocity, m_controllingPrim.RawVelocity, m_controllingPrim.Mass, moveForce);
- m_physicsScene.PE.ApplyCentralImpulse(m_controllingPrim.PhysBody, moveForce);
- }
- }
-
- // Called just as the property update is received from the physics engine.
- // Do any mode necessary for avatar movement.
- private void Process_OnPreUpdateProperty(ref EntityProperties entprop)
- {
- // Don't change position if standing on a stationary object.
- if (m_controllingPrim.IsStationary)
- {
- entprop.Position = m_controllingPrim.RawPosition;
- entprop.Velocity = OMV.Vector3.Zero;
- m_physicsScene.PE.SetTranslation(m_controllingPrim.PhysBody, entprop.Position, entprop.Rotation);
}
- }
-
- // Decide if the character is colliding with a low object and compute a force to pop the
- // avatar up so it can walk up and over the low objects.
- private OMV.Vector3 WalkUpStairs()
- {
- OMV.Vector3 ret = OMV.Vector3.Zero;
-
- m_physicsScene.DetailLog("{0},BSCharacter.WalkUpStairs,IsColliding={1},flying={2},targSpeed={3},collisions={4},avHeight={5}",
- m_controllingPrim.LocalID, m_controllingPrim.IsColliding, m_controllingPrim.Flying,
- m_controllingPrim.TargetVelocitySpeed, m_controllingPrim.CollisionsLastTick.Count, m_controllingPrim.Size.Z);
-
- // Check for stairs climbing if colliding, not flying and moving forward
- if ( m_controllingPrim.IsColliding
- && !m_controllingPrim.Flying
- && m_controllingPrim.TargetVelocitySpeed > 0.1f )
+ // Called just as the property update is received from the physics engine.
+ // Do any mode necessary for avatar movement.
+ private void Process_OnPreUpdateProperty(ref EntityProperties entprop)
{
- // The range near the character's feet where we will consider stairs
- // float nearFeetHeightMin = m_controllingPrim.RawPosition.Z - (m_controllingPrim.Size.Z / 2f) + 0.05f;
- // Note: there is a problem with the computation of the capsule height. Thus RawPosition is off
- // from the height. Revisit size and this computation when height is scaled properly.
- float nearFeetHeightMin = m_controllingPrim.RawPosition.Z - (m_controllingPrim.Size.Z / 2f) - BSParam.AvatarStepGroundFudge;
- float nearFeetHeightMax = nearFeetHeightMin + BSParam.AvatarStepHeight;
-
- // Look for a collision point that is near the character's feet and is oriented the same as the charactor is.
- // Find the highest 'good' collision.
- OMV.Vector3 highestTouchPosition = OMV.Vector3.Zero;
- foreach (KeyValuePair kvp in m_controllingPrim.CollisionsLastTick.m_objCollisionList)
+ // Don't change position if standing on a stationary object.
+ if (m_controllingPrim.IsStationary)
{
- // Don't care about collisions with the terrain
- if (kvp.Key > m_physicsScene.TerrainManager.HighestTerrainID)
+ entprop.Position = m_controllingPrim.RawPosition;
+ entprop.Velocity = OMV.Vector3.Zero;
+ m_physicsScene.PE.SetTranslation(m_controllingPrim.PhysBody, entprop.Position, entprop.Rotation);
+ }
+
+ }
+
+ // Decide if the character is colliding with a low object and compute a force to pop the
+ // avatar up so it can walk up and over the low objects.
+ private OMV.Vector3 WalkUpStairs()
+ {
+ OMV.Vector3 ret = OMV.Vector3.Zero;
+
+ m_physicsScene.DetailLog("{0},BSCharacter.WalkUpStairs,IsColliding={1},flying={2},targSpeed={3},collisions={4},avHeight={5}",
+ m_controllingPrim.LocalID, m_controllingPrim.IsColliding, m_controllingPrim.Flying,
+ m_controllingPrim.TargetVelocitySpeed, m_controllingPrim.CollisionsLastTick.Count, m_controllingPrim.Size.Z);
+
+ // Check for stairs climbing if colliding, not flying and moving forward
+ if ( m_controllingPrim.IsColliding
+ && !m_controllingPrim.Flying
+ && m_controllingPrim.TargetVelocitySpeed > 0.1f )
+ {
+ // The range near the character's feet where we will consider stairs
+ // float nearFeetHeightMin = m_controllingPrim.RawPosition.Z - (m_controllingPrim.Size.Z / 2f) + 0.05f;
+ // Note: there is a problem with the computation of the capsule height. Thus RawPosition is off
+ // from the height. Revisit size and this computation when height is scaled properly.
+ float nearFeetHeightMin = m_controllingPrim.RawPosition.Z - (m_controllingPrim.Size.Z / 2f) - BSParam.AvatarStepGroundFudge;
+ float nearFeetHeightMax = nearFeetHeightMin + BSParam.AvatarStepHeight;
+
+ // Look for a collision point that is near the character's feet and is oriented the same as the charactor is.
+ // Find the highest 'good' collision.
+ OMV.Vector3 highestTouchPosition = OMV.Vector3.Zero;
+ foreach (KeyValuePair kvp in m_controllingPrim.CollisionsLastTick.m_objCollisionList)
{
- BSPhysObject collisionObject;
- if (m_physicsScene.PhysObjects.TryGetValue(kvp.Key, out collisionObject))
+ // Don't care about collisions with the terrain
+ if (kvp.Key > m_physicsScene.TerrainManager.HighestTerrainID)
{
- if (!collisionObject.IsVolumeDetect)
+ BSPhysObject collisionObject;
+ if (m_physicsScene.PhysObjects.TryGetValue(kvp.Key, out collisionObject))
{
- OMV.Vector3 touchPosition = kvp.Value.Position;
- m_physicsScene.DetailLog("{0},BSCharacter.WalkUpStairs,min={1},max={2},touch={3}",
- m_controllingPrim.LocalID, nearFeetHeightMin, nearFeetHeightMax, touchPosition);
- if (touchPosition.Z >= nearFeetHeightMin && touchPosition.Z <= nearFeetHeightMax)
+ if (!collisionObject.IsVolumeDetect)
{
- // This contact is within the 'near the feet' range.
- // The step is presumed to be more or less vertical. Thus the Z component should
- // be nearly horizontal.
- OMV.Vector3 directionFacing = OMV.Vector3.UnitX * m_controllingPrim.RawOrientation;
- OMV.Vector3 touchNormal = OMV.Vector3.Normalize(kvp.Value.SurfaceNormal);
- const float PIOver2 = 1.571f; // Used to make unit vector axis into approx radian angles
- // m_physicsScene.DetailLog("{0},BSCharacter.WalkUpStairs,avNormal={1},colNormal={2},diff={3}",
- // m_controllingPrim.LocalID, directionFacing, touchNormal,
- // Math.Abs(OMV.Vector3.Distance(directionFacing, touchNormal)) );
- if ((Math.Abs(directionFacing.Z) * PIOver2) < BSParam.AvatarStepAngle
- && (Math.Abs(touchNormal.Z) * PIOver2) < BSParam.AvatarStepAngle)
+ OMV.Vector3 touchPosition = kvp.Value.Position;
+ m_physicsScene.DetailLog("{0},BSCharacter.WalkUpStairs,min={1},max={2},touch={3}",
+ m_controllingPrim.LocalID, nearFeetHeightMin, nearFeetHeightMax, touchPosition);
+ if (touchPosition.Z >= nearFeetHeightMin && touchPosition.Z <= nearFeetHeightMax)
{
- // The normal should be our contact point to the object so it is pointing away
- // thus the difference between our facing orientation and the normal should be small.
- float diff = Math.Abs(OMV.Vector3.Distance(directionFacing, touchNormal));
- if (diff < BSParam.AvatarStepApproachFactor)
+ // This contact is within the 'near the feet' range.
+ // The step is presumed to be more or less vertical. Thus the Z component should
+ // be nearly horizontal.
+ OMV.Vector3 directionFacing = OMV.Vector3.UnitX * m_controllingPrim.RawOrientation;
+ OMV.Vector3 touchNormal = OMV.Vector3.Normalize(kvp.Value.SurfaceNormal);
+ const float PIOver2 = 1.571f; // Used to make unit vector axis into approx radian angles
+ // m_physicsScene.DetailLog("{0},BSCharacter.WalkUpStairs,avNormal={1},colNormal={2},diff={3}",
+ // m_controllingPrim.LocalID, directionFacing, touchNormal,
+ // Math.Abs(OMV.Vector3.Distance(directionFacing, touchNormal)) );
+ if ((Math.Abs(directionFacing.Z) * PIOver2) < BSParam.AvatarStepAngle
+ && (Math.Abs(touchNormal.Z) * PIOver2) < BSParam.AvatarStepAngle)
{
- if (highestTouchPosition.Z < touchPosition.Z)
- highestTouchPosition = touchPosition;
+ // The normal should be our contact point to the object so it is pointing away
+ // thus the difference between our facing orientation and the normal should be small.
+ float diff = Math.Abs(OMV.Vector3.Distance(directionFacing, touchNormal));
+ if (diff < BSParam.AvatarStepApproachFactor)
+ {
+ if (highestTouchPosition.Z < touchPosition.Z)
+ highestTouchPosition = touchPosition;
+ }
}
}
}
}
}
}
- }
- m_walkingUpStairs = 0;
- // If there is a good step sensing, move the avatar over the step.
- if (highestTouchPosition != OMV.Vector3.Zero)
- {
- // Remember that we are going up stairs. This is needed because collisions
- // will stop when we move up so this smoothes out that effect.
- m_walkingUpStairs = BSParam.AvatarStepSmoothingSteps;
-
- m_lastStepUp = highestTouchPosition.Z - nearFeetHeightMin;
- ret = ComputeStairCorrection(m_lastStepUp);
- m_physicsScene.DetailLog("{0},BSCharacter.WalkUpStairs,touchPos={1},nearFeetMin={2},ret={3}",
- m_controllingPrim.LocalID, highestTouchPosition, nearFeetHeightMin, ret);
- }
- }
- else
- {
- // If we used to be going up stairs but are not now, smooth the case where collision goes away while
- // we are bouncing up the stairs.
- if (m_walkingUpStairs > 0)
- {
- m_walkingUpStairs--;
- ret = ComputeStairCorrection(m_lastStepUp);
- }
- }
-
- return ret;
- }
-
- private OMV.Vector3 ComputeStairCorrection(float stepUp)
- {
- OMV.Vector3 ret = OMV.Vector3.Zero;
- OMV.Vector3 displacement = OMV.Vector3.Zero;
-
- if (stepUp > 0f)
- {
- // Found the stairs contact point. Push up a little to raise the character.
- if (BSParam.AvatarStepForceFactor > 0f)
- {
- float upForce = stepUp * m_controllingPrim.Mass * BSParam.AvatarStepForceFactor;
- ret = new OMV.Vector3(0f, 0f, upForce);
- }
-
- // Also move the avatar up for the new height
- if (BSParam.AvatarStepUpCorrectionFactor > 0f)
- {
- // Move the avatar up related to the height of the collision
- displacement = new OMV.Vector3(0f, 0f, stepUp * BSParam.AvatarStepUpCorrectionFactor);
- m_controllingPrim.ForcePosition = m_controllingPrim.RawPosition + displacement;
+ m_walkingUpStairs = 0;
+ // If there is a good step sensing, move the avatar over the step.
+ if (highestTouchPosition != OMV.Vector3.Zero)
+ {
+ // Remember that we are going up stairs. This is needed because collisions
+ // will stop when we move up so this smoothes out that effect.
+ m_walkingUpStairs = BSParam.AvatarStepSmoothingSteps;
+
+ m_lastStepUp = highestTouchPosition.Z - nearFeetHeightMin;
+ ret = ComputeStairCorrection(m_lastStepUp);
+ m_physicsScene.DetailLog("{0},BSCharacter.WalkUpStairs,touchPos={1},nearFeetMin={2},ret={3}",
+ m_controllingPrim.LocalID, highestTouchPosition, nearFeetHeightMin, ret);
+ }
}
else
{
- if (BSParam.AvatarStepUpCorrectionFactor < 0f)
+ // If we used to be going up stairs but are not now, smooth the case where collision goes away while
+ // we are bouncing up the stairs.
+ if (m_walkingUpStairs > 0)
{
- // Move the avatar up about the specified step height
- displacement = new OMV.Vector3(0f, 0f, BSParam.AvatarStepHeight);
- m_controllingPrim.ForcePosition = m_controllingPrim.RawPosition + displacement;
+ m_walkingUpStairs--;
+ ret = ComputeStairCorrection(m_lastStepUp);
}
}
- m_physicsScene.DetailLog("{0},BSCharacter.WalkUpStairs.ComputeStairCorrection,stepUp={1},isp={2},force={3}",
- m_controllingPrim.LocalID, stepUp, displacement, ret);
-
+
+ return ret;
+ }
+
+ private OMV.Vector3 ComputeStairCorrection(float stepUp)
+ {
+ OMV.Vector3 ret = OMV.Vector3.Zero;
+ OMV.Vector3 displacement = OMV.Vector3.Zero;
+
+ if (stepUp > 0f)
+ {
+ // Found the stairs contact point. Push up a little to raise the character.
+ if (BSParam.AvatarStepForceFactor > 0f)
+ {
+ float upForce = stepUp * m_controllingPrim.Mass * BSParam.AvatarStepForceFactor;
+ ret = new OMV.Vector3(0f, 0f, upForce);
+ }
+
+ // Also move the avatar up for the new height
+ if (BSParam.AvatarStepUpCorrectionFactor > 0f)
+ {
+ // Move the avatar up related to the height of the collision
+ displacement = new OMV.Vector3(0f, 0f, stepUp * BSParam.AvatarStepUpCorrectionFactor);
+ m_controllingPrim.ForcePosition = m_controllingPrim.RawPosition + displacement;
+ }
+ else
+ {
+ if (BSParam.AvatarStepUpCorrectionFactor < 0f)
+ {
+ // Move the avatar up about the specified step height
+ displacement = new OMV.Vector3(0f, 0f, BSParam.AvatarStepHeight);
+ m_controllingPrim.ForcePosition = m_controllingPrim.RawPosition + displacement;
+ }
+ }
+ m_physicsScene.DetailLog("{0},BSCharacter.WalkUpStairs.ComputeStairCorrection,stepUp={1},isp={2},force={3}",
+ m_controllingPrim.LocalID, stepUp, displacement, ret);
+
+ }
+ return ret;
}
- return ret;
}
}
-}
diff --git a/OpenSim/Region/PhysicsModules/BulletS/BSActorHover.cs b/OpenSim/Region/PhysicsModules/BulletS/BSActorHover.cs
index 7ff171ed08..c1c002797f 100755
--- a/OpenSim/Region/PhysicsModules/BulletS/BSActorHover.cs
+++ b/OpenSim/Region/PhysicsModules/BulletS/BSActorHover.cs
@@ -36,139 +36,139 @@ using OMV = OpenMetaverse;
namespace OpenSim.Region.PhysicsModule.BulletS
{
-public class BSActorHover : BSActor
-{
- private BSFMotor m_hoverMotor;
-
- public BSActorHover(BSScene physicsScene, BSPhysObject pObj, string actorName)
- : base(physicsScene, pObj, actorName)
+ public class BSActorHover : BSActor
{
- m_hoverMotor = null;
- m_physicsScene.DetailLog("{0},BSActorHover,constructor", m_controllingPrim.LocalID);
- }
+ private BSFMotor m_hoverMotor;
- // BSActor.isActive
- public override bool isActive
- {
- get { return Enabled; }
- }
-
- // Release any connections and resources used by the actor.
- // BSActor.Dispose()
- public override void Dispose()
- {
- Enabled = false;
- DeactivateHover();
- }
-
- // Called when physical parameters (properties set in Bullet) need to be re-applied.
- // Called at taint-time.
- // BSActor.Refresh()
- public override void Refresh()
- {
- m_physicsScene.DetailLog("{0},BSActorHover,refresh", m_controllingPrim.LocalID);
-
- // If not active any more, turn me off
- if (!m_controllingPrim.HoverActive)
+ public BSActorHover(BSScene physicsScene, BSPhysObject pObj, string actorName)
+ : base(physicsScene, pObj, actorName)
{
- SetEnabled(false);
+ m_hoverMotor = null;
+ m_physicsScene.DetailLog("{0},BSActorHover,constructor", m_controllingPrim.LocalID);
}
- // If the object is physically active, add the hoverer prestep action
- if (isActive)
+ // BSActor.isActive
+ public override bool isActive
{
- ActivateHover();
+ get { return Enabled; }
}
- else
+
+ // Release any connections and resources used by the actor.
+ // BSActor.Dispose()
+ public override void Dispose()
{
+ Enabled = false;
DeactivateHover();
}
- }
- // The object's physical representation is being rebuilt so pick up any physical dependencies (constraints, ...).
- // Register a prestep action to restore physical requirements before the next simulation step.
- // Called at taint-time.
- // BSActor.RemoveDependencies()
- public override void RemoveDependencies()
- {
- // Nothing to do for the hoverer since it is all software at pre-step action time.
- }
-
- // If a hover motor has not been created, create one and start the hovering.
- private void ActivateHover()
- {
- if (m_hoverMotor == null)
+ // Called when physical parameters (properties set in Bullet) need to be re-applied.
+ // Called at taint-time.
+ // BSActor.Refresh()
+ public override void Refresh()
{
- // Turning the target on
- m_hoverMotor = new BSFMotor("BSActorHover",
- m_controllingPrim.HoverTau, // timeScale
- BSMotor.Infinite, // decay time scale
- 1f // efficiency
- );
- m_hoverMotor.SetTarget(ComputeCurrentHoverHeight());
+ m_physicsScene.DetailLog("{0},BSActorHover,refresh", m_controllingPrim.LocalID);
+
+ // If not active any more, turn me off
+ if (!m_controllingPrim.HoverActive)
+ {
+ SetEnabled(false);
+ }
+
+ // If the object is physically active, add the hoverer prestep action
+ if (isActive)
+ {
+ ActivateHover();
+ }
+ else
+ {
+ DeactivateHover();
+ }
+ }
+
+ // The object's physical representation is being rebuilt so pick up any physical dependencies (constraints, ...).
+ // Register a prestep action to restore physical requirements before the next simulation step.
+ // Called at taint-time.
+ // BSActor.RemoveDependencies()
+ public override void RemoveDependencies()
+ {
+ // Nothing to do for the hoverer since it is all software at pre-step action time.
+ }
+
+ // If a hover motor has not been created, create one and start the hovering.
+ private void ActivateHover()
+ {
+ if (m_hoverMotor == null)
+ {
+ // Turning the target on
+ m_hoverMotor = new BSFMotor("BSActorHover",
+ m_controllingPrim.HoverTau, // timeScale
+ BSMotor.Infinite, // decay time scale
+ 1f // efficiency
+ );
+ m_hoverMotor.SetTarget(ComputeCurrentHoverHeight());
+ m_hoverMotor.SetCurrent(m_controllingPrim.RawPosition.Z);
+ m_hoverMotor.PhysicsScene = m_physicsScene; // DEBUG DEBUG so motor will output detail log messages.
+
+ m_physicsScene.BeforeStep += Hoverer;
+ }
+ }
+
+ private void DeactivateHover()
+ {
+ if (m_hoverMotor != null)
+ {
+ m_physicsScene.BeforeStep -= Hoverer;
+ m_hoverMotor = null;
+ }
+ }
+
+ // Called just before the simulation step. Update the vertical position for hoverness.
+ private void Hoverer(float timeStep)
+ {
+ // Don't do hovering while the object is selected.
+ if (!isActive)
+ return;
+
m_hoverMotor.SetCurrent(m_controllingPrim.RawPosition.Z);
- m_hoverMotor.PhysicsScene = m_physicsScene; // DEBUG DEBUG so motor will output detail log messages.
-
- m_physicsScene.BeforeStep += Hoverer;
+ m_hoverMotor.SetTarget(ComputeCurrentHoverHeight());
+ float targetHeight = m_hoverMotor.Step(timeStep);
+
+ // 'targetHeight' is where we'd like the Z of the prim to be at this moment.
+ // Compute the amount of force to push us there.
+ float moveForce = (targetHeight - m_controllingPrim.RawPosition.Z) * m_controllingPrim.RawMass;
+ // Undo anything the object thinks it's doing at the moment
+ moveForce = -m_controllingPrim.RawVelocity.Z * m_controllingPrim.Mass;
+
+ m_physicsScene.PE.ApplyCentralImpulse(m_controllingPrim.PhysBody, new OMV.Vector3(0f, 0f, moveForce));
+ m_physicsScene.DetailLog("{0},BSPrim.Hover,move,targHt={1},moveForce={2},mass={3}",
+ m_controllingPrim.LocalID, targetHeight, moveForce, m_controllingPrim.RawMass);
}
- }
- private void DeactivateHover()
- {
- if (m_hoverMotor != null)
+ // Based on current position, determine what we should be hovering at now.
+ // Must recompute often. What if we walked offa cliff>
+ private float ComputeCurrentHoverHeight()
{
- m_physicsScene.BeforeStep -= Hoverer;
- m_hoverMotor = null;
- }
- }
-
- // Called just before the simulation step. Update the vertical position for hoverness.
- private void Hoverer(float timeStep)
- {
- // Don't do hovering while the object is selected.
- if (!isActive)
- return;
-
- m_hoverMotor.SetCurrent(m_controllingPrim.RawPosition.Z);
- m_hoverMotor.SetTarget(ComputeCurrentHoverHeight());
- float targetHeight = m_hoverMotor.Step(timeStep);
-
- // 'targetHeight' is where we'd like the Z of the prim to be at this moment.
- // Compute the amount of force to push us there.
- float moveForce = (targetHeight - m_controllingPrim.RawPosition.Z) * m_controllingPrim.RawMass;
- // Undo anything the object thinks it's doing at the moment
- moveForce = -m_controllingPrim.RawVelocity.Z * m_controllingPrim.Mass;
-
- m_physicsScene.PE.ApplyCentralImpulse(m_controllingPrim.PhysBody, new OMV.Vector3(0f, 0f, moveForce));
- m_physicsScene.DetailLog("{0},BSPrim.Hover,move,targHt={1},moveForce={2},mass={3}",
- m_controllingPrim.LocalID, targetHeight, moveForce, m_controllingPrim.RawMass);
- }
-
- // Based on current position, determine what we should be hovering at now.
- // Must recompute often. What if we walked offa cliff>
- private float ComputeCurrentHoverHeight()
- {
- float ret = m_controllingPrim.HoverHeight;
- float groundHeight = m_physicsScene.TerrainManager.GetTerrainHeightAtXYZ(m_controllingPrim.RawPosition);
-
- switch (m_controllingPrim.HoverType)
- {
- case PIDHoverType.Ground:
- ret = groundHeight + m_controllingPrim.HoverHeight;
- break;
- case PIDHoverType.GroundAndWater:
- float waterHeight = m_physicsScene.TerrainManager.GetWaterLevelAtXYZ(m_controllingPrim.RawPosition);
- if (groundHeight > waterHeight)
- {
+ float ret = m_controllingPrim.HoverHeight;
+ float groundHeight = m_physicsScene.TerrainManager.GetTerrainHeightAtXYZ(m_controllingPrim.RawPosition);
+
+ switch (m_controllingPrim.HoverType)
+ {
+ case PIDHoverType.Ground:
ret = groundHeight + m_controllingPrim.HoverHeight;
- }
- else
- {
- ret = waterHeight + m_controllingPrim.HoverHeight;
- }
- break;
+ break;
+ case PIDHoverType.GroundAndWater:
+ float waterHeight = m_physicsScene.TerrainManager.GetWaterLevelAtXYZ(m_controllingPrim.RawPosition);
+ if (groundHeight > waterHeight)
+ {
+ ret = groundHeight + m_controllingPrim.HoverHeight;
+ }
+ else
+ {
+ ret = waterHeight + m_controllingPrim.HoverHeight;
+ }
+ break;
+ }
+ return ret;
}
- return ret;
}
}
-}
diff --git a/OpenSim/Region/PhysicsModules/BulletS/BSActorLockAxis.cs b/OpenSim/Region/PhysicsModules/BulletS/BSActorLockAxis.cs
index 78c1b6aacb..3a00d42f76 100755
--- a/OpenSim/Region/PhysicsModules/BulletS/BSActorLockAxis.cs
+++ b/OpenSim/Region/PhysicsModules/BulletS/BSActorLockAxis.cs
@@ -34,186 +34,186 @@ using OMV = OpenMetaverse;
namespace OpenSim.Region.PhysicsModule.BulletS
{
-public class BSActorLockAxis : BSActor
-{
- private BSConstraint LockAxisConstraint = null;
- private bool HaveRegisteredForBeforeStepCallback = false;
-
- // The lock access flags (which axises were locked) when the contraint was built.
- // Used to see if locking has changed since when the constraint was built.
- OMV.Vector3 LockAxisLinearFlags;
- OMV.Vector3 LockAxisAngularFlags;
-
- public BSActorLockAxis(BSScene physicsScene, BSPhysObject pObj, string actorName)
- : base(physicsScene, pObj, actorName)
+ public class BSActorLockAxis : BSActor
{
- m_physicsScene.DetailLog("{0},BSActorLockAxis,constructor", m_controllingPrim.LocalID);
- LockAxisConstraint = null;
- HaveRegisteredForBeforeStepCallback = false;
- }
+ private BSConstraint LockAxisConstraint = null;
+ private bool HaveRegisteredForBeforeStepCallback = false;
- // BSActor.isActive
- public override bool isActive
- {
- get { return Enabled && m_controllingPrim.IsPhysicallyActive; }
- }
+ // The lock access flags (which axises were locked) when the contraint was built.
+ // Used to see if locking has changed since when the constraint was built.
+ OMV.Vector3 LockAxisLinearFlags;
+ OMV.Vector3 LockAxisAngularFlags;
- // Release any connections and resources used by the actor.
- // BSActor.Dispose()
- public override void Dispose()
- {
- Enabled = false;
- UnRegisterForBeforeStepCallback();
- RemoveAxisLockConstraint();
- }
-
- // Called when physical parameters (properties set in Bullet) need to be re-applied.
- // Called at taint-time.
- // BSActor.Refresh()
- public override void Refresh()
- {
- // Since the axis logging is done with a constraint, Refresh() time is good for
- // changing parameters but this needs to wait until the prim/linkset is physically
- // constructed. Therefore, the constraint itself is placed at pre-step time.
-
- // If all the axis are free, we don't need to exist
- // Refresh() only turns off. Enabling is done by InitializeAxisActor()
- // whenever parameters are changed.
- // This leaves 'enable' free to turn off an actor when it is not wanted to run.
- if (m_controllingPrim.LockedAngularAxis == m_controllingPrim.LockedAxisFree
- && m_controllingPrim.LockedLinearAxis == m_controllingPrim.LockedAxisFree)
+ public BSActorLockAxis(BSScene physicsScene, BSPhysObject pObj, string actorName)
+ : base(physicsScene, pObj, actorName)
{
- Enabled = false;
- }
-
- if (isActive)
- {
- RegisterForBeforeStepCallback();
- }
- else
- {
- RemoveDependencies();
- UnRegisterForBeforeStepCallback();
- }
- }
-
- // The object's physical representation is being rebuilt so pick up any physical dependencies (constraints, ...).
- // Register a prestep action to restore physical requirements before the next simulation step.
- // Called at taint-time.
- // BSActor.RemoveDependencies()
- public override void RemoveDependencies()
- {
- RemoveAxisLockConstraint();
- }
-
- private void RegisterForBeforeStepCallback()
- {
- if (!HaveRegisteredForBeforeStepCallback)
- {
- m_physicsScene.BeforeStep += PhysicsScene_BeforeStep;
- HaveRegisteredForBeforeStepCallback = true;
- }
- }
-
- private void UnRegisterForBeforeStepCallback()
- {
- if (HaveRegisteredForBeforeStepCallback)
- {
- m_physicsScene.BeforeStep -= PhysicsScene_BeforeStep;
+ m_physicsScene.DetailLog("{0},BSActorLockAxis,constructor", m_controllingPrim.LocalID);
+ LockAxisConstraint = null;
HaveRegisteredForBeforeStepCallback = false;
}
- }
- private void PhysicsScene_BeforeStep(float timestep)
- {
- // If all the axis are free, we don't need to exist
- if (m_controllingPrim.LockedAngularAxis == m_controllingPrim.LockedAxisFree
- && m_controllingPrim.LockedLinearAxis == m_controllingPrim.LockedAxisFree)
+ // BSActor.isActive
+ public override bool isActive
+ {
+ get { return Enabled && m_controllingPrim.IsPhysicallyActive; }
+ }
+
+ // Release any connections and resources used by the actor.
+ // BSActor.Dispose()
+ public override void Dispose()
{
Enabled = false;
+ UnRegisterForBeforeStepCallback();
+ RemoveAxisLockConstraint();
}
- // If the object is physically active, add the axis locking constraint
- if (isActive)
+ // Called when physical parameters (properties set in Bullet) need to be re-applied.
+ // Called at taint-time.
+ // BSActor.Refresh()
+ public override void Refresh()
{
- // Check to see if the locking parameters have changed
- if (m_controllingPrim.LockedLinearAxis != this.LockAxisLinearFlags
- || m_controllingPrim.LockedAngularAxis != this.LockAxisAngularFlags)
+ // Since the axis logging is done with a constraint, Refresh() time is good for
+ // changing parameters but this needs to wait until the prim/linkset is physically
+ // constructed. Therefore, the constraint itself is placed at pre-step time.
+
+ // If all the axis are free, we don't need to exist
+ // Refresh() only turns off. Enabling is done by InitializeAxisActor()
+ // whenever parameters are changed.
+ // This leaves 'enable' free to turn off an actor when it is not wanted to run.
+ if (m_controllingPrim.LockedAngularAxis == m_controllingPrim.LockedAxisFree
+ && m_controllingPrim.LockedLinearAxis == m_controllingPrim.LockedAxisFree)
+ {
+ Enabled = false;
+ }
+
+ if (isActive)
+ {
+ RegisterForBeforeStepCallback();
+ }
+ else
+ {
+ RemoveDependencies();
+ UnRegisterForBeforeStepCallback();
+ }
+ }
+
+ // The object's physical representation is being rebuilt so pick up any physical dependencies (constraints, ...).
+ // Register a prestep action to restore physical requirements before the next simulation step.
+ // Called at taint-time.
+ // BSActor.RemoveDependencies()
+ public override void RemoveDependencies()
+ {
+ RemoveAxisLockConstraint();
+ }
+
+ private void RegisterForBeforeStepCallback()
+ {
+ if (!HaveRegisteredForBeforeStepCallback)
+ {
+ m_physicsScene.BeforeStep += PhysicsScene_BeforeStep;
+ HaveRegisteredForBeforeStepCallback = true;
+ }
+ }
+
+ private void UnRegisterForBeforeStepCallback()
+ {
+ if (HaveRegisteredForBeforeStepCallback)
+ {
+ m_physicsScene.BeforeStep -= PhysicsScene_BeforeStep;
+ HaveRegisteredForBeforeStepCallback = false;
+ }
+ }
+
+ private void PhysicsScene_BeforeStep(float timestep)
+ {
+ // If all the axis are free, we don't need to exist
+ if (m_controllingPrim.LockedAngularAxis == m_controllingPrim.LockedAxisFree
+ && m_controllingPrim.LockedLinearAxis == m_controllingPrim.LockedAxisFree)
+ {
+ Enabled = false;
+ }
+
+ // If the object is physically active, add the axis locking constraint
+ if (isActive)
+ {
+ // Check to see if the locking parameters have changed
+ if (m_controllingPrim.LockedLinearAxis != this.LockAxisLinearFlags
+ || m_controllingPrim.LockedAngularAxis != this.LockAxisAngularFlags)
+ {
+ // The locking has changed. Remove the old constraint and build a new one
+ RemoveAxisLockConstraint();
+ }
+
+ AddAxisLockConstraint();
+ }
+ else
{
- // The locking has changed. Remove the old constraint and build a new one
RemoveAxisLockConstraint();
}
-
- AddAxisLockConstraint();
}
- else
+
+ // Note that this relies on being called at TaintTime
+ private void AddAxisLockConstraint()
{
- RemoveAxisLockConstraint();
- }
- }
-
- // Note that this relies on being called at TaintTime
- private void AddAxisLockConstraint()
- {
- if (LockAxisConstraint == null)
- {
- // Lock that axis by creating a 6DOF constraint that has one end in the world and
- // the other in the object.
- // http://www.bulletphysics.org/Bullet/phpBB3/viewtopic.php?p=20817
- // http://www.bulletphysics.org/Bullet/phpBB3/viewtopic.php?p=26380
-
- // Remove any existing axis constraint (just to be sure)
- RemoveAxisLockConstraint();
-
- BSConstraint6Dof axisConstrainer = new BSConstraint6Dof(m_physicsScene.World, m_controllingPrim.PhysBody,
- OMV.Vector3.Zero, OMV.Quaternion.Identity,
- false /* useLinearReferenceFrameB */, true /* disableCollisionsBetweenLinkedBodies */);
- LockAxisConstraint = axisConstrainer;
- m_physicsScene.Constraints.AddConstraint(LockAxisConstraint);
-
- // Remember the clocking being inforced so we can notice if they have changed
- LockAxisLinearFlags = m_controllingPrim.LockedLinearAxis;
- LockAxisAngularFlags = m_controllingPrim.LockedAngularAxis;
-
- // The constraint is tied to the world and oriented to the prim.
-
- if (!axisConstrainer.SetLinearLimits(m_controllingPrim.LockedLinearAxisLow, m_controllingPrim.LockedLinearAxisHigh))
+ if (LockAxisConstraint == null)
{
- m_physicsScene.DetailLog("{0},BSActorLockAxis.AddAxisLockConstraint,failedSetLinearLimits",
- m_controllingPrim.LocalID);
+ // Lock that axis by creating a 6DOF constraint that has one end in the world and
+ // the other in the object.
+ // http://www.bulletphysics.org/Bullet/phpBB3/viewtopic.php?p=20817
+ // http://www.bulletphysics.org/Bullet/phpBB3/viewtopic.php?p=26380
+
+ // Remove any existing axis constraint (just to be sure)
+ RemoveAxisLockConstraint();
+
+ BSConstraint6Dof axisConstrainer = new BSConstraint6Dof(m_physicsScene.World, m_controllingPrim.PhysBody,
+ OMV.Vector3.Zero, OMV.Quaternion.Identity,
+ false /* useLinearReferenceFrameB */, true /* disableCollisionsBetweenLinkedBodies */);
+ LockAxisConstraint = axisConstrainer;
+ m_physicsScene.Constraints.AddConstraint(LockAxisConstraint);
+
+ // Remember the clocking being inforced so we can notice if they have changed
+ LockAxisLinearFlags = m_controllingPrim.LockedLinearAxis;
+ LockAxisAngularFlags = m_controllingPrim.LockedAngularAxis;
+
+ // The constraint is tied to the world and oriented to the prim.
+
+ if (!axisConstrainer.SetLinearLimits(m_controllingPrim.LockedLinearAxisLow, m_controllingPrim.LockedLinearAxisHigh))
+ {
+ m_physicsScene.DetailLog("{0},BSActorLockAxis.AddAxisLockConstraint,failedSetLinearLimits",
+ m_controllingPrim.LocalID);
+ }
+
+ if (!axisConstrainer.SetAngularLimits(m_controllingPrim.LockedAngularAxisLow, m_controllingPrim.LockedAngularAxisHigh))
+ {
+ m_physicsScene.DetailLog("{0},BSActorLockAxis.AddAxisLockConstraint,failedSetAngularLimits",
+ m_controllingPrim.LocalID);
+ }
+
+ m_physicsScene.DetailLog("{0},BSActorLockAxis.AddAxisLockConstraint,create,linLow={1},linHi={2},angLow={3},angHi={4}",
+ m_controllingPrim.LocalID,
+ m_controllingPrim.LockedLinearAxisLow,
+ m_controllingPrim.LockedLinearAxisHigh,
+ m_controllingPrim.LockedAngularAxisLow,
+ m_controllingPrim.LockedAngularAxisHigh);
+
+ // Constants from one of the posts mentioned above and used in Bullet's ConstraintDemo.
+ axisConstrainer.TranslationalLimitMotor(true /* enable */, 5.0f, 0.1f);
+
+ axisConstrainer.RecomputeConstraintVariables(m_controllingPrim.RawMass);
+
+ RegisterForBeforeStepCallback();
}
-
- if (!axisConstrainer.SetAngularLimits(m_controllingPrim.LockedAngularAxisLow, m_controllingPrim.LockedAngularAxisHigh))
- {
- m_physicsScene.DetailLog("{0},BSActorLockAxis.AddAxisLockConstraint,failedSetAngularLimits",
- m_controllingPrim.LocalID);
- }
-
- m_physicsScene.DetailLog("{0},BSActorLockAxis.AddAxisLockConstraint,create,linLow={1},linHi={2},angLow={3},angHi={4}",
- m_controllingPrim.LocalID,
- m_controllingPrim.LockedLinearAxisLow,
- m_controllingPrim.LockedLinearAxisHigh,
- m_controllingPrim.LockedAngularAxisLow,
- m_controllingPrim.LockedAngularAxisHigh);
-
- // Constants from one of the posts mentioned above and used in Bullet's ConstraintDemo.
- axisConstrainer.TranslationalLimitMotor(true /* enable */, 5.0f, 0.1f);
-
- axisConstrainer.RecomputeConstraintVariables(m_controllingPrim.RawMass);
-
- RegisterForBeforeStepCallback();
}
- }
- private void RemoveAxisLockConstraint()
- {
- UnRegisterForBeforeStepCallback();
- if (LockAxisConstraint != null)
+ private void RemoveAxisLockConstraint()
{
- m_physicsScene.Constraints.RemoveAndDestroyConstraint(LockAxisConstraint);
- LockAxisConstraint = null;
- m_physicsScene.DetailLog("{0},BSActorLockAxis.RemoveAxisLockConstraint,destroyingConstraint", m_controllingPrim.LocalID);
+ UnRegisterForBeforeStepCallback();
+ if (LockAxisConstraint != null)
+ {
+ m_physicsScene.Constraints.RemoveAndDestroyConstraint(LockAxisConstraint);
+ LockAxisConstraint = null;
+ m_physicsScene.DetailLog("{0},BSActorLockAxis.RemoveAxisLockConstraint,destroyingConstraint", m_controllingPrim.LocalID);
+ }
}
}
}
-}
diff --git a/OpenSim/Region/PhysicsModules/BulletS/BSActorMoveToTarget.cs b/OpenSim/Region/PhysicsModules/BulletS/BSActorMoveToTarget.cs
index f2019aeafe..eaf9571b2c 100755
--- a/OpenSim/Region/PhysicsModules/BulletS/BSActorMoveToTarget.cs
+++ b/OpenSim/Region/PhysicsModules/BulletS/BSActorMoveToTarget.cs
@@ -36,185 +36,185 @@ using OMV = OpenMetaverse;
namespace OpenSim.Region.PhysicsModule.BulletS
{
-public class BSActorMoveToTarget : BSActor
-{
- private BSVMotor m_targetMotor;
-
- public BSActorMoveToTarget(BSScene physicsScene, BSPhysObject pObj, string actorName)
- : base(physicsScene, pObj, actorName)
+ public class BSActorMoveToTarget : BSActor
{
- m_targetMotor = null;
- m_physicsScene.DetailLog("{0},BSActorMoveToTarget,constructor", m_controllingPrim.LocalID);
- }
+ private BSVMotor m_targetMotor;
- // BSActor.isActive
- public override bool isActive
- {
- // MoveToTarget only works on physical prims
- get { return Enabled && m_controllingPrim.IsPhysicallyActive; }
- }
+ public BSActorMoveToTarget(BSScene physicsScene, BSPhysObject pObj, string actorName)
+ : base(physicsScene, pObj, actorName)
+ {
+ m_targetMotor = null;
+ m_physicsScene.DetailLog("{0},BSActorMoveToTarget,constructor", m_controllingPrim.LocalID);
+ }
- // Release any connections and resources used by the actor.
- // BSActor.Dispose()
- public override void Dispose()
- {
- Enabled = false;
- DeactivateMoveToTarget();
- }
+ // BSActor.isActive
+ public override bool isActive
+ {
+ // MoveToTarget only works on physical prims
+ get { return Enabled && m_controllingPrim.IsPhysicallyActive; }
+ }
- // Called when physical parameters (properties set in Bullet) need to be re-applied.
- // Called at taint-time.
- // BSActor.Refresh()
- public override void Refresh()
- {
- m_physicsScene.DetailLog("{0},BSActorMoveToTarget,refresh,enabled={1},active={2},target={3},tau={4}",
- m_controllingPrim.LocalID, Enabled, m_controllingPrim.MoveToTargetActive,
- m_controllingPrim.MoveToTargetTarget, m_controllingPrim.MoveToTargetTau );
-
- // If not active any more...
- if (!m_controllingPrim.MoveToTargetActive)
+ // Release any connections and resources used by the actor.
+ // BSActor.Dispose()
+ public override void Dispose()
{
Enabled = false;
- }
-
- if (isActive)
- {
- ActivateMoveToTarget();
- }
- else
- {
DeactivateMoveToTarget();
}
- }
- // The object's physical representation is being rebuilt so pick up any physical dependencies (constraints, ...).
- // Register a prestep action to restore physical requirements before the next simulation step.
- // Called at taint-time.
- // BSActor.RemoveDependencies()
- public override void RemoveDependencies()
- {
- // Nothing to do for the moveToTarget since it is all software at pre-step action time.
- }
-
- // If a hover motor has not been created, create one and start the hovering.
- private void ActivateMoveToTarget()
- {
- if (m_targetMotor == null)
+ // Called when physical parameters (properties set in Bullet) need to be re-applied.
+ // Called at taint-time.
+ // BSActor.Refresh()
+ public override void Refresh()
{
- // We're taking over after this.
- m_controllingPrim.ZeroMotion(true);
+ m_physicsScene.DetailLog("{0},BSActorMoveToTarget,refresh,enabled={1},active={2},target={3},tau={4}",
+ m_controllingPrim.LocalID, Enabled, m_controllingPrim.MoveToTargetActive,
+ m_controllingPrim.MoveToTargetTarget, m_controllingPrim.MoveToTargetTau );
- /* Someday use the PID controller
- m_targetMotor = new BSPIDVMotor("BSActorMoveToTarget-" + m_controllingPrim.LocalID.ToString());
- m_targetMotor.TimeScale = m_controllingPrim.MoveToTargetTau;
- m_targetMotor.Efficiency = 1f;
- */
- m_targetMotor = new BSVMotor("BSActorMoveToTarget-" + m_controllingPrim.LocalID.ToString(),
- m_controllingPrim.MoveToTargetTau, // timeScale
- BSMotor.Infinite, // decay time scale
- 1f // efficiency
- );
- m_targetMotor.PhysicsScene = m_physicsScene; // DEBUG DEBUG so motor will output detail log messages.
- m_targetMotor.SetTarget(m_controllingPrim.MoveToTargetTarget);
- m_targetMotor.SetCurrent(m_controllingPrim.RawPosition);
+ // If not active any more...
+ if (!m_controllingPrim.MoveToTargetActive)
+ {
+ Enabled = false;
+ }
- // m_physicsScene.BeforeStep += Mover;
- m_physicsScene.BeforeStep += Mover2;
+ if (isActive)
+ {
+ ActivateMoveToTarget();
+ }
+ else
+ {
+ DeactivateMoveToTarget();
+ }
}
- else
+
+ // The object's physical representation is being rebuilt so pick up any physical dependencies (constraints, ...).
+ // Register a prestep action to restore physical requirements before the next simulation step.
+ // Called at taint-time.
+ // BSActor.RemoveDependencies()
+ public override void RemoveDependencies()
{
- // If already allocated, make sure the target and other paramters are current
- m_targetMotor.SetTarget(m_controllingPrim.MoveToTargetTarget);
- m_targetMotor.SetCurrent(m_controllingPrim.RawPosition);
+ // Nothing to do for the moveToTarget since it is all software at pre-step action time.
}
- }
- private void DeactivateMoveToTarget()
- {
- if (m_targetMotor != null)
+ // If a hover motor has not been created, create one and start the hovering.
+ private void ActivateMoveToTarget()
{
- // m_physicsScene.BeforeStep -= Mover;
- m_physicsScene.BeforeStep -= Mover2;
- m_targetMotor = null;
+ if (m_targetMotor == null)
+ {
+ // We're taking over after this.
+ m_controllingPrim.ZeroMotion(true);
+
+ /* Someday use the PID controller
+ m_targetMotor = new BSPIDVMotor("BSActorMoveToTarget-" + m_controllingPrim.LocalID.ToString());
+ m_targetMotor.TimeScale = m_controllingPrim.MoveToTargetTau;
+ m_targetMotor.Efficiency = 1f;
+ */
+ m_targetMotor = new BSVMotor("BSActorMoveToTarget-" + m_controllingPrim.LocalID.ToString(),
+ m_controllingPrim.MoveToTargetTau, // timeScale
+ BSMotor.Infinite, // decay time scale
+ 1f // efficiency
+ );
+ m_targetMotor.PhysicsScene = m_physicsScene; // DEBUG DEBUG so motor will output detail log messages.
+ m_targetMotor.SetTarget(m_controllingPrim.MoveToTargetTarget);
+ m_targetMotor.SetCurrent(m_controllingPrim.RawPosition);
+
+ // m_physicsScene.BeforeStep += Mover;
+ m_physicsScene.BeforeStep += Mover2;
+ }
+ else
+ {
+ // If already allocated, make sure the target and other paramters are current
+ m_targetMotor.SetTarget(m_controllingPrim.MoveToTargetTarget);
+ m_targetMotor.SetCurrent(m_controllingPrim.RawPosition);
+ }
}
- }
- // Origional mover that set the objects position to move to the target.
- // The problem was that gravity would keep trying to push the object down so
- // the overall downward velocity would increase to infinity.
- // Called just before the simulation step.
- private void Mover(float timeStep)
- {
- // Don't do hovering while the object is selected.
- if (!isActive)
- return;
-
- OMV.Vector3 origPosition = m_controllingPrim.RawPosition; // DEBUG DEBUG (for printout below)
-
- // 'movePosition' is where we'd like the prim to be at this moment.
- OMV.Vector3 movePosition = m_controllingPrim.RawPosition + m_targetMotor.Step(timeStep);
-
- // If we are very close to our target, turn off the movement motor.
- if (m_targetMotor.ErrorIsZero())
+ private void DeactivateMoveToTarget()
{
- m_physicsScene.DetailLog("{0},BSActorMoveToTarget.Mover,zeroMovement,movePos={1},pos={2},mass={3}",
- m_controllingPrim.LocalID, movePosition, m_controllingPrim.RawPosition, m_controllingPrim.Mass);
- m_controllingPrim.ForcePosition = m_targetMotor.TargetValue;
- m_controllingPrim.ForceVelocity = OMV.Vector3.Zero;
- // Setting the position does not cause the physics engine to generate a property update. Force it.
- m_physicsScene.PE.PushUpdate(m_controllingPrim.PhysBody);
+ if (m_targetMotor != null)
+ {
+ // m_physicsScene.BeforeStep -= Mover;
+ m_physicsScene.BeforeStep -= Mover2;
+ m_targetMotor = null;
+ }
}
- else
+
+ // Origional mover that set the objects position to move to the target.
+ // The problem was that gravity would keep trying to push the object down so
+ // the overall downward velocity would increase to infinity.
+ // Called just before the simulation step.
+ private void Mover(float timeStep)
{
- m_controllingPrim.ForcePosition = movePosition;
- // Setting the position does not cause the physics engine to generate a property update. Force it.
- m_physicsScene.PE.PushUpdate(m_controllingPrim.PhysBody);
+ // Don't do hovering while the object is selected.
+ if (!isActive)
+ return;
+
+ OMV.Vector3 origPosition = m_controllingPrim.RawPosition; // DEBUG DEBUG (for printout below)
+
+ // 'movePosition' is where we'd like the prim to be at this moment.
+ OMV.Vector3 movePosition = m_controllingPrim.RawPosition + m_targetMotor.Step(timeStep);
+
+ // If we are very close to our target, turn off the movement motor.
+ if (m_targetMotor.ErrorIsZero())
+ {
+ m_physicsScene.DetailLog("{0},BSActorMoveToTarget.Mover,zeroMovement,movePos={1},pos={2},mass={3}",
+ m_controllingPrim.LocalID, movePosition, m_controllingPrim.RawPosition, m_controllingPrim.Mass);
+ m_controllingPrim.ForcePosition = m_targetMotor.TargetValue;
+ m_controllingPrim.ForceVelocity = OMV.Vector3.Zero;
+ // Setting the position does not cause the physics engine to generate a property update. Force it.
+ m_physicsScene.PE.PushUpdate(m_controllingPrim.PhysBody);
+ }
+ else
+ {
+ m_controllingPrim.ForcePosition = movePosition;
+ // Setting the position does not cause the physics engine to generate a property update. Force it.
+ m_physicsScene.PE.PushUpdate(m_controllingPrim.PhysBody);
+ }
+ m_physicsScene.DetailLog("{0},BSActorMoveToTarget.Mover,move,fromPos={1},movePos={2}",
+ m_controllingPrim.LocalID, origPosition, movePosition);
}
- m_physicsScene.DetailLog("{0},BSActorMoveToTarget.Mover,move,fromPos={1},movePos={2}",
- m_controllingPrim.LocalID, origPosition, movePosition);
- }
- // Version of mover that applies forces to move the physical object to the target.
- // Also overcomes gravity so the object doesn't just drop to the ground.
- // Called just before the simulation step.
- private void Mover2(float timeStep)
- {
- // Don't do hovering while the object is selected.
- if (!isActive)
- return;
-
- OMV.Vector3 origPosition = m_controllingPrim.RawPosition; // DEBUG DEBUG (for printout below)
- OMV.Vector3 addedForce = OMV.Vector3.Zero;
-
- // CorrectionVector is the movement vector required this step
- OMV.Vector3 correctionVector = m_targetMotor.Step(timeStep, m_controllingPrim.RawPosition);
-
- // If we are very close to our target, turn off the movement motor.
- if (m_targetMotor.ErrorIsZero())
+ // Version of mover that applies forces to move the physical object to the target.
+ // Also overcomes gravity so the object doesn't just drop to the ground.
+ // Called just before the simulation step.
+ private void Mover2(float timeStep)
{
- m_physicsScene.DetailLog("{0},BSActorMoveToTarget.Mover3,zeroMovement,pos={1},mass={2}",
- m_controllingPrim.LocalID, m_controllingPrim.RawPosition, m_controllingPrim.Mass);
- m_controllingPrim.ForcePosition = m_targetMotor.TargetValue;
- m_controllingPrim.ForceVelocity = OMV.Vector3.Zero;
- // Setting the position does not cause the physics engine to generate a property update. Force it.
- m_physicsScene.PE.PushUpdate(m_controllingPrim.PhysBody);
- }
- else
- {
- // First force to move us there -- the motor return a timestep scaled value.
- addedForce = correctionVector / timeStep;
- // Remove the existing velocity (only the moveToTarget force counts)
- addedForce -= m_controllingPrim.RawVelocity;
- // Overcome gravity.
- addedForce -= m_controllingPrim.Gravity;
+ // Don't do hovering while the object is selected.
+ if (!isActive)
+ return;
- // Add enough force to overcome the mass of the object
- addedForce *= m_controllingPrim.Mass;
+ OMV.Vector3 origPosition = m_controllingPrim.RawPosition; // DEBUG DEBUG (for printout below)
+ OMV.Vector3 addedForce = OMV.Vector3.Zero;
- m_controllingPrim.AddForce(true /* inTaintTime */, addedForce);
+ // CorrectionVector is the movement vector required this step
+ OMV.Vector3 correctionVector = m_targetMotor.Step(timeStep, m_controllingPrim.RawPosition);
+
+ // If we are very close to our target, turn off the movement motor.
+ if (m_targetMotor.ErrorIsZero())
+ {
+ m_physicsScene.DetailLog("{0},BSActorMoveToTarget.Mover3,zeroMovement,pos={1},mass={2}",
+ m_controllingPrim.LocalID, m_controllingPrim.RawPosition, m_controllingPrim.Mass);
+ m_controllingPrim.ForcePosition = m_targetMotor.TargetValue;
+ m_controllingPrim.ForceVelocity = OMV.Vector3.Zero;
+ // Setting the position does not cause the physics engine to generate a property update. Force it.
+ m_physicsScene.PE.PushUpdate(m_controllingPrim.PhysBody);
+ }
+ else
+ {
+ // First force to move us there -- the motor return a timestep scaled value.
+ addedForce = correctionVector / timeStep;
+ // Remove the existing velocity (only the moveToTarget force counts)
+ addedForce -= m_controllingPrim.RawVelocity;
+ // Overcome gravity.
+ addedForce -= m_controllingPrim.Gravity;
+
+ // Add enough force to overcome the mass of the object
+ addedForce *= m_controllingPrim.Mass;
+
+ m_controllingPrim.AddForce(true /* inTaintTime */, addedForce);
+ }
+ m_physicsScene.DetailLog("{0},BSActorMoveToTarget.Mover3,move,fromPos={1},addedForce={2}",
+ m_controllingPrim.LocalID, origPosition, addedForce);
}
- m_physicsScene.DetailLog("{0},BSActorMoveToTarget.Mover3,move,fromPos={1},addedForce={2}",
- m_controllingPrim.LocalID, origPosition, addedForce);
}
}
-}
diff --git a/OpenSim/Region/PhysicsModules/BulletS/BSActorSetForce.cs b/OpenSim/Region/PhysicsModules/BulletS/BSActorSetForce.cs
index ecb4b7ff55..563b3862bc 100755
--- a/OpenSim/Region/PhysicsModules/BulletS/BSActorSetForce.cs
+++ b/OpenSim/Region/PhysicsModules/BulletS/BSActorSetForce.cs
@@ -36,103 +36,103 @@ using OMV = OpenMetaverse;
namespace OpenSim.Region.PhysicsModule.BulletS
{
-public class BSActorSetForce : BSActor
-{
- BSFMotor m_forceMotor;
-
- public BSActorSetForce(BSScene physicsScene, BSPhysObject pObj, string actorName)
- : base(physicsScene, pObj, actorName)
+ public class BSActorSetForce : BSActor
{
- m_forceMotor = null;
- m_physicsScene.DetailLog("{0},BSActorSetForce,constructor", m_controllingPrim.LocalID);
- }
+ BSFMotor m_forceMotor;
- // BSActor.isActive
- public override bool isActive
- {
- get { return Enabled && m_controllingPrim.IsPhysicallyActive; }
- }
-
- // Release any connections and resources used by the actor.
- // BSActor.Dispose()
- public override void Dispose()
- {
- Enabled = false;
- DeactivateSetForce();
- }
-
- // Called when physical parameters (properties set in Bullet) need to be re-applied.
- // Called at taint-time.
- // BSActor.Refresh()
- public override void Refresh()
- {
- m_physicsScene.DetailLog("{0},BSActorSetForce,refresh", m_controllingPrim.LocalID);
-
- // If not active any more, get rid of me (shouldn't ever happen, but just to be safe)
- if (m_controllingPrim.RawForce == OMV.Vector3.Zero)
+ public BSActorSetForce(BSScene physicsScene, BSPhysObject pObj, string actorName)
+ : base(physicsScene, pObj, actorName)
+ {
+ m_forceMotor = null;
+ m_physicsScene.DetailLog("{0},BSActorSetForce,constructor", m_controllingPrim.LocalID);
+ }
+
+ // BSActor.isActive
+ public override bool isActive
+ {
+ get { return Enabled && m_controllingPrim.IsPhysicallyActive; }
+ }
+
+ // Release any connections and resources used by the actor.
+ // BSActor.Dispose()
+ public override void Dispose()
{
- m_physicsScene.DetailLog("{0},BSActorSetForce,refresh,notSetForce,removing={1}", m_controllingPrim.LocalID, ActorName);
Enabled = false;
- return;
- }
-
- // If the object is physically active, add the hoverer prestep action
- if (isActive)
- {
- ActivateSetForce();
- }
- else
- {
DeactivateSetForce();
}
- }
- // The object's physical representation is being rebuilt so pick up any physical dependencies (constraints, ...).
- // Register a prestep action to restore physical requirements before the next simulation step.
- // Called at taint-time.
- // BSActor.RemoveDependencies()
- public override void RemoveDependencies()
- {
- // Nothing to do for the hoverer since it is all software at pre-step action time.
- }
-
- // If a hover motor has not been created, create one and start the hovering.
- private void ActivateSetForce()
- {
- if (m_forceMotor == null)
+ // Called when physical parameters (properties set in Bullet) need to be re-applied.
+ // Called at taint-time.
+ // BSActor.Refresh()
+ public override void Refresh()
{
- // A fake motor that might be used someday
- m_forceMotor = new BSFMotor("setForce", 1f, 1f, 1f);
+ m_physicsScene.DetailLog("{0},BSActorSetForce,refresh", m_controllingPrim.LocalID);
- m_physicsScene.BeforeStep += Mover;
- }
- }
+ // If not active any more, get rid of me (shouldn't ever happen, but just to be safe)
+ if (m_controllingPrim.RawForce == OMV.Vector3.Zero)
+ {
+ m_physicsScene.DetailLog("{0},BSActorSetForce,refresh,notSetForce,removing={1}", m_controllingPrim.LocalID, ActorName);
+ Enabled = false;
+ return;
+ }
- private void DeactivateSetForce()
- {
- if (m_forceMotor != null)
- {
- m_physicsScene.BeforeStep -= Mover;
- m_forceMotor = null;
- }
- }
-
- // Called just before the simulation step. Update the vertical position for hoverness.
- private void Mover(float timeStep)
- {
- // Don't do force while the object is selected.
- if (!isActive)
- return;
-
- m_physicsScene.DetailLog("{0},BSActorSetForce,preStep,force={1}", m_controllingPrim.LocalID, m_controllingPrim.RawForce);
- if (m_controllingPrim.PhysBody.HasPhysicalBody)
- {
- m_physicsScene.PE.ApplyCentralForce(m_controllingPrim.PhysBody, m_controllingPrim.RawForce);
- m_controllingPrim.ActivateIfPhysical(false);
+ // If the object is physically active, add the hoverer prestep action
+ if (isActive)
+ {
+ ActivateSetForce();
+ }
+ else
+ {
+ DeactivateSetForce();
+ }
}
- // TODO:
+ // The object's physical representation is being rebuilt so pick up any physical dependencies (constraints, ...).
+ // Register a prestep action to restore physical requirements before the next simulation step.
+ // Called at taint-time.
+ // BSActor.RemoveDependencies()
+ public override void RemoveDependencies()
+ {
+ // Nothing to do for the hoverer since it is all software at pre-step action time.
+ }
+
+ // If a hover motor has not been created, create one and start the hovering.
+ private void ActivateSetForce()
+ {
+ if (m_forceMotor == null)
+ {
+ // A fake motor that might be used someday
+ m_forceMotor = new BSFMotor("setForce", 1f, 1f, 1f);
+
+ m_physicsScene.BeforeStep += Mover;
+ }
+ }
+
+ private void DeactivateSetForce()
+ {
+ if (m_forceMotor != null)
+ {
+ m_physicsScene.BeforeStep -= Mover;
+ m_forceMotor = null;
+ }
+ }
+
+ // Called just before the simulation step. Update the vertical position for hoverness.
+ private void Mover(float timeStep)
+ {
+ // Don't do force while the object is selected.
+ if (!isActive)
+ return;
+
+ m_physicsScene.DetailLog("{0},BSActorSetForce,preStep,force={1}", m_controllingPrim.LocalID, m_controllingPrim.RawForce);
+ if (m_controllingPrim.PhysBody.HasPhysicalBody)
+ {
+ m_physicsScene.PE.ApplyCentralForce(m_controllingPrim.PhysBody, m_controllingPrim.RawForce);
+ m_controllingPrim.ActivateIfPhysical(false);
+ }
+
+ // TODO:
+ }
}
}
-}
diff --git a/OpenSim/Region/PhysicsModules/BulletS/BSActorSetTorque.cs b/OpenSim/Region/PhysicsModules/BulletS/BSActorSetTorque.cs
index 0261bcb937..c18cabf4a4 100755
--- a/OpenSim/Region/PhysicsModules/BulletS/BSActorSetTorque.cs
+++ b/OpenSim/Region/PhysicsModules/BulletS/BSActorSetTorque.cs
@@ -36,104 +36,102 @@ using OMV = OpenMetaverse;
namespace OpenSim.Region.PhysicsModule.BulletS
{
-public class BSActorSetTorque : BSActor
-{
- BSFMotor m_torqueMotor;
-
- public BSActorSetTorque(BSScene physicsScene, BSPhysObject pObj, string actorName)
- : base(physicsScene, pObj, actorName)
+ public class BSActorSetTorque : BSActor
{
- m_torqueMotor = null;
- m_physicsScene.DetailLog("{0},BSActorSetTorque,constructor", m_controllingPrim.LocalID);
- }
+ BSFMotor m_torqueMotor;
- // BSActor.isActive
- public override bool isActive
- {
- get { return Enabled && m_controllingPrim.IsPhysicallyActive; }
- }
-
- // Release any connections and resources used by the actor.
- // BSActor.Dispose()
- public override void Dispose()
- {
- Enabled = false;
- DeactivateSetTorque();
- }
-
- // Called when physical parameters (properties set in Bullet) need to be re-applied.
- // Called at taint-time.
- // BSActor.Refresh()
- public override void Refresh()
- {
- m_physicsScene.DetailLog("{0},BSActorSetTorque,refresh,torque={1}", m_controllingPrim.LocalID, m_controllingPrim.RawTorque);
-
- // If not active any more, get rid of me (shouldn't ever happen, but just to be safe)
- if (m_controllingPrim.RawTorque == OMV.Vector3.Zero)
+ public BSActorSetTorque(BSScene physicsScene, BSPhysObject pObj, string actorName)
+ : base(physicsScene, pObj, actorName)
+ {
+ m_torqueMotor = null;
+ m_physicsScene.DetailLog("{0},BSActorSetTorque,constructor", m_controllingPrim.LocalID);
+ }
+
+ // BSActor.isActive
+ public override bool isActive
+ {
+ get { return Enabled && m_controllingPrim.IsPhysicallyActive; }
+ }
+
+ // Release any connections and resources used by the actor.
+ // BSActor.Dispose()
+ public override void Dispose()
{
- m_physicsScene.DetailLog("{0},BSActorSetTorque,refresh,notSetTorque,disabling={1}", m_controllingPrim.LocalID, ActorName);
Enabled = false;
- return;
- }
-
- // If the object is physically active, add the hoverer prestep action
- if (isActive)
- {
- ActivateSetTorque();
- }
- else
- {
DeactivateSetTorque();
}
- }
- // The object's physical representation is being rebuilt so pick up any physical dependencies (constraints, ...).
- // Register a prestep action to restore physical requirements before the next simulation step.
- // Called at taint-time.
- // BSActor.RemoveDependencies()
- public override void RemoveDependencies()
- {
- // Nothing to do for the hoverer since it is all software at pre-step action time.
- }
-
- // If a hover motor has not been created, create one and start the hovering.
- private void ActivateSetTorque()
- {
- if (m_torqueMotor == null)
+ // Called when physical parameters (properties set in Bullet) need to be re-applied.
+ // Called at taint-time.
+ // BSActor.Refresh()
+ public override void Refresh()
{
- // A fake motor that might be used someday
- m_torqueMotor = new BSFMotor("setTorque", 1f, 1f, 1f);
+ m_physicsScene.DetailLog("{0},BSActorSetTorque,refresh,torque={1}", m_controllingPrim.LocalID, m_controllingPrim.RawTorque);
- m_physicsScene.BeforeStep += Mover;
- }
- }
+ // If not active any more, get rid of me (shouldn't ever happen, but just to be safe)
+ if (m_controllingPrim.RawTorque == OMV.Vector3.Zero)
+ {
+ m_physicsScene.DetailLog("{0},BSActorSetTorque,refresh,notSetTorque,disabling={1}", m_controllingPrim.LocalID, ActorName);
+ Enabled = false;
+ return;
+ }
- private void DeactivateSetTorque()
- {
- if (m_torqueMotor != null)
- {
- m_physicsScene.BeforeStep -= Mover;
- m_torqueMotor = null;
- }
- }
-
- // Called just before the simulation step. Update the vertical position for hoverness.
- private void Mover(float timeStep)
- {
- // Don't do force while the object is selected.
- if (!isActive)
- return;
-
- m_physicsScene.DetailLog("{0},BSActorSetTorque,preStep,force={1}", m_controllingPrim.LocalID, m_controllingPrim.RawTorque);
- if (m_controllingPrim.PhysBody.HasPhysicalBody)
- {
- m_controllingPrim.AddAngularForce(true /* inTaintTime */, m_controllingPrim.RawTorque);
- m_controllingPrim.ActivateIfPhysical(false);
+ // If the object is physically active, add the hoverer prestep action
+ if (isActive)
+ {
+ ActivateSetTorque();
+ }
+ else
+ {
+ DeactivateSetTorque();
+ }
}
- // TODO:
+ // The object's physical representation is being rebuilt so pick up any physical dependencies (constraints, ...).
+ // Register a prestep action to restore physical requirements before the next simulation step.
+ // Called at taint-time.
+ // BSActor.RemoveDependencies()
+ public override void RemoveDependencies()
+ {
+ // Nothing to do for the hoverer since it is all software at pre-step action time.
+ }
+
+ // If a hover motor has not been created, create one and start the hovering.
+ private void ActivateSetTorque()
+ {
+ if (m_torqueMotor == null)
+ {
+ // A fake motor that might be used someday
+ m_torqueMotor = new BSFMotor("setTorque", 1f, 1f, 1f);
+
+ m_physicsScene.BeforeStep += Mover;
+ }
+ }
+
+ private void DeactivateSetTorque()
+ {
+ if (m_torqueMotor != null)
+ {
+ m_physicsScene.BeforeStep -= Mover;
+ m_torqueMotor = null;
+ }
+ }
+
+ // Called just before the simulation step. Update the vertical position for hoverness.
+ private void Mover(float timeStep)
+ {
+ // Don't do force while the object is selected.
+ if (!isActive)
+ return;
+
+ m_physicsScene.DetailLog("{0},BSActorSetTorque,preStep,force={1}", m_controllingPrim.LocalID, m_controllingPrim.RawTorque);
+ if (m_controllingPrim.PhysBody.HasPhysicalBody)
+ {
+ m_controllingPrim.AddAngularForce(true /* inTaintTime */, m_controllingPrim.RawTorque);
+ m_controllingPrim.ActivateIfPhysical(false);
+ }
+
+ // TODO:
+ }
}
}
-}
-
-
diff --git a/OpenSim/Region/PhysicsModules/BulletS/BSActors.cs b/OpenSim/Region/PhysicsModules/BulletS/BSActors.cs
index 851347b493..ba5ea0974c 100755
--- a/OpenSim/Region/PhysicsModules/BulletS/BSActors.cs
+++ b/OpenSim/Region/PhysicsModules/BulletS/BSActors.cs
@@ -30,125 +30,125 @@ using System.Text;
namespace OpenSim.Region.PhysicsModule.BulletS
{
-public class BSActorCollection
-{
- private Dictionary m_actors;
+ public class BSActorCollection
+ {
+ private Dictionary m_actors;
- public BSActorCollection()
- {
- m_actors = new Dictionary();
- }
- public void Add(string name, BSActor actor)
- {
- lock (m_actors)
+ public BSActorCollection()
{
- if (!m_actors.ContainsKey(name))
+ m_actors = new Dictionary();
+ }
+ public void Add(string name, BSActor actor)
+ {
+ lock (m_actors)
{
- m_actors[name] = actor;
+ if (!m_actors.ContainsKey(name))
+ {
+ m_actors[name] = actor;
+ }
}
}
- }
- public bool RemoveAndRelease(string name)
- {
- bool ret = false;
- lock (m_actors)
+ public bool RemoveAndRelease(string name)
{
- if (m_actors.ContainsKey(name))
+ bool ret = false;
+ lock (m_actors)
{
- BSActor beingRemoved = m_actors[name];
- m_actors.Remove(name);
- beingRemoved.Dispose();
- ret = true;
+ if (m_actors.ContainsKey(name))
+ {
+ BSActor beingRemoved = m_actors[name];
+ m_actors.Remove(name);
+ beingRemoved.Dispose();
+ ret = true;
+ }
+ }
+ return ret;
+ }
+ public void Clear()
+ {
+ lock (m_actors)
+ {
+ ForEachActor(a => a.Dispose());
+ m_actors.Clear();
}
}
- return ret;
- }
- public void Clear()
- {
- lock (m_actors)
+ public void Dispose()
{
- ForEachActor(a => a.Dispose());
- m_actors.Clear();
+ Clear();
}
- }
- public void Dispose()
- {
- Clear();
- }
- public bool HasActor(string name)
- {
- return m_actors.ContainsKey(name);
- }
- public bool TryGetActor(string actorName, out BSActor theActor)
- {
- return m_actors.TryGetValue(actorName, out theActor);
- }
- public void ForEachActor(Action act)
- {
- lock (m_actors)
+ public bool HasActor(string name)
{
- foreach (KeyValuePair kvp in m_actors)
- act(kvp.Value);
+ return m_actors.ContainsKey(name);
+ }
+ public bool TryGetActor(string actorName, out BSActor theActor)
+ {
+ return m_actors.TryGetValue(actorName, out theActor);
+ }
+ public void ForEachActor(Action act)
+ {
+ lock (m_actors)
+ {
+ foreach (KeyValuePair kvp in m_actors)
+ act(kvp.Value);
+ }
+ }
+
+ public void Enable(bool enabl)
+ {
+ ForEachActor(a => a.SetEnabled(enabl));
+ }
+ public void Refresh()
+ {
+ ForEachActor(a => a.Refresh());
+ }
+ public void RemoveDependencies()
+ {
+ ForEachActor(a => a.RemoveDependencies());
}
}
- public void Enable(bool enabl)
+ // =============================================================================
+ ///
+ /// Each physical object can have 'actors' who are pushing the object around.
+ /// This can be used for hover, locking axis, making vehicles, etc.
+ /// Each physical object can have multiple actors acting on it.
+ ///
+ /// An actor usually registers itself with physics scene events (pre-step action)
+ /// and modifies the parameters on the host physical object.
+ ///
+ public abstract class BSActor
{
- ForEachActor(a => a.SetEnabled(enabl));
- }
- public void Refresh()
- {
- ForEachActor(a => a.Refresh());
- }
- public void RemoveDependencies()
- {
- ForEachActor(a => a.RemoveDependencies());
+ protected BSScene m_physicsScene { get; private set; }
+ protected BSPhysObject m_controllingPrim { get; private set; }
+ public virtual bool Enabled { get; set; }
+ public string ActorName { get; private set; }
+
+ public BSActor(BSScene physicsScene, BSPhysObject pObj, string actorName)
+ {
+ m_physicsScene = physicsScene;
+ m_controllingPrim = pObj;
+ ActorName = actorName;
+ Enabled = true;
+ }
+
+ // Return 'true' if activily updating the prim
+ public virtual bool isActive
+ {
+ get { return Enabled; }
+ }
+
+ // Turn the actor on an off. Only used by ActorCollection to set all enabled/disabled.
+ // Anyone else should assign true/false to 'Enabled'.
+ public void SetEnabled(bool setEnabled)
+ {
+ Enabled = setEnabled;
+ }
+ // Release any connections and resources used by the actor.
+ public abstract void Dispose();
+ // Called when physical parameters (properties set in Bullet) need to be re-applied.
+ public abstract void Refresh();
+ // The object's physical representation is being rebuilt so pick up any physical dependencies (constraints, ...).
+ // Register a prestep action to restore physical requirements before the next simulation step.
+ public abstract void RemoveDependencies();
+
}
}
-
-// =============================================================================
-///
-/// Each physical object can have 'actors' who are pushing the object around.
-/// This can be used for hover, locking axis, making vehicles, etc.
-/// Each physical object can have multiple actors acting on it.
-///
-/// An actor usually registers itself with physics scene events (pre-step action)
-/// and modifies the parameters on the host physical object.
-///
-public abstract class BSActor
-{
- protected BSScene m_physicsScene { get; private set; }
- protected BSPhysObject m_controllingPrim { get; private set; }
- public virtual bool Enabled { get; set; }
- public string ActorName { get; private set; }
-
- public BSActor(BSScene physicsScene, BSPhysObject pObj, string actorName)
- {
- m_physicsScene = physicsScene;
- m_controllingPrim = pObj;
- ActorName = actorName;
- Enabled = true;
- }
-
- // Return 'true' if activily updating the prim
- public virtual bool isActive
- {
- get { return Enabled; }
- }
-
- // Turn the actor on an off. Only used by ActorCollection to set all enabled/disabled.
- // Anyone else should assign true/false to 'Enabled'.
- public void SetEnabled(bool setEnabled)
- {
- Enabled = setEnabled;
- }
- // Release any connections and resources used by the actor.
- public abstract void Dispose();
- // Called when physical parameters (properties set in Bullet) need to be re-applied.
- public abstract void Refresh();
- // The object's physical representation is being rebuilt so pick up any physical dependencies (constraints, ...).
- // Register a prestep action to restore physical requirements before the next simulation step.
- public abstract void RemoveDependencies();
-
-}
-}
diff --git a/OpenSim/Region/PhysicsModules/BulletS/BSApiTemplate.cs b/OpenSim/Region/PhysicsModules/BulletS/BSApiTemplate.cs
index a2880487c2..6b84e0e6d7 100644
--- a/OpenSim/Region/PhysicsModules/BulletS/BSApiTemplate.cs
+++ b/OpenSim/Region/PhysicsModules/BulletS/BSApiTemplate.cs
@@ -31,754 +31,753 @@ using System.Security;
using System.Text;
using OpenMetaverse;
-namespace OpenSim.Region.PhysicsModule.BulletS {
-
+namespace OpenSim.Region.PhysicsModule.BulletS
+{
// 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,
- GEAR_CONSTRAINT_TYPE, // added in Bullet 2.82
- FIXED_CONSTRAINT_TYPE, // added in Bullet 2.82
- MAX_CONSTRAINT_TYPE, // last type defined by Bullet
- //
- BS_FIXED_CONSTRAINT_TYPE = 1234 // BulletSim constraint that is fixed and unmoving
-}
-
-// ===============================================================================
-[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,
- SHAPE_AVATAR = 24,
- SHAPE_CONVEXHULL= 25,
- SHAPE_GIMPACT = 26,
-};
-
-// 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,
- KEY_AVATAR = 6,
-}
-
-[StructLayout(LayoutKind.Sequential)]
-public struct ShapeData
-{
- public UInt32 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 UInt32 ID;
- public float Fraction;
- public Vector3 Normal;
- public Vector3 Point;
-
- public bool hasHit()
+ public enum ConstraintType : int
{
- float sum = Fraction
- + Normal.X + Normal.Y + Normal.Z
- + Point.X + Point.Y + Point.Z;
- return (sum != 0) || (ID != 0);
+ POINT2POINT_CONSTRAINT_TYPE = 3,
+ HINGE_CONSTRAINT_TYPE,
+ CONETWIST_CONSTRAINT_TYPE,
+ D6_CONSTRAINT_TYPE,
+ SLIDER_CONSTRAINT_TYPE,
+ CONTACT_CONSTRAINT_TYPE,
+ D6_SPRING_CONSTRAINT_TYPE,
+ GEAR_CONSTRAINT_TYPE, // added in Bullet 2.82
+ FIXED_CONSTRAINT_TYPE, // added in Bullet 2.82
+ MAX_CONSTRAINT_TYPE, // last type defined by Bullet
+ //
+ BS_FIXED_CONSTRAINT_TYPE = 1234 // BulletSim constraint that is fixed and unmoving
}
-}
-[StructLayout(LayoutKind.Sequential)]
-public struct RaycastHit
-{
- public UInt32 ID;
- public float Fraction;
- public Vector3 Normal;
- public Vector3 Point;
- public bool hasHit()
+ // ===============================================================================
+ [StructLayout(LayoutKind.Sequential)]
+ public struct ConvexHull
{
- float sum = Normal.X + Normal.Y + Normal.Z + Point.X + Point.Y + Point.Z;
- return (sum != 0);
+ Vector3 Offset;
+ int VertexCount;
+ Vector3[] Vertices;
}
-}
-[StructLayout(LayoutKind.Sequential)]
-public struct CollisionDesc
-{
- public UInt32 aID;
- public UInt32 bID;
- public Vector3 point;
- public Vector3 normal;
- public float penetration;
-}
-[StructLayout(LayoutKind.Sequential)]
-public struct EntityProperties
-{
- public UInt32 ID;
- public Vector3 Position;
- public Quaternion Rotation;
- public Vector3 Velocity;
- public Vector3 Acceleration;
- public Vector3 RotationalVelocity;
-
- public override string ToString()
+ public enum BSPhysicsShapeType
{
- StringBuilder buff = new StringBuilder();
- buff.Append("");
- return buff.ToString();
+ 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,
+ SHAPE_AVATAR = 24,
+ SHAPE_CONVEXHULL= 25,
+ SHAPE_GIMPACT = 26,
+ };
+
+ // 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,
+ KEY_AVATAR = 6,
}
-}
-
-// 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 maxPersistantManifoldPoolSize;
- public float maxCollisionAlgorithmPoolSize;
- public float shouldDisableContactPoolDynamicAllocation;
- public float shouldForceUpdateAllAabbs;
- public float shouldRandomizeSolverOrder;
- public float shouldSplitSimulationIslands;
- public float shouldEnableFrictionCaching;
- public float numberOfSolverIterations;
- public float useSingleSidedMeshes;
- public float globalContactBreakingThreshold;
-
- public float physicsLoggingFrames;
-
- public const float numericTrue = 1f;
- public const float numericFalse = 0f;
-}
-
-// Parameters passed for the conversion of a mesh to a hull using Bullet's HACD library.
-[StructLayout(LayoutKind.Sequential)]
-public struct HACDParams
-{
- // usual default values
- public float maxVerticesPerHull; // 100
- public float minClusters; // 2
- public float compacityWeight; // 0.1
- public float volumeWeight; // 0.0
- public float concavity; // 100
- public float addExtraDistPoints; // false
- public float addNeighboursDistPoints; // false
- public float addFacesPoints; // false
- public float shouldAdjustCollisionMargin; // false
- // VHACD
- public float whichHACD; // zero if Bullet HACD, non-zero says VHACD
- // http://kmamou.blogspot.ca/2014/12/v-hacd-20-parameters-description.html
- public float vHACDresolution; // 100,000 max number of voxels generated during voxelization stage
- public float vHACDdepth; // 20 max number of clipping stages
- public float vHACDconcavity; // 0.0025 maximum concavity
- public float vHACDplaneDownsampling; // 4 granularity of search for best clipping plane
- public float vHACDconvexHullDownsampling; // 4 precision of hull gen process
- public float vHACDalpha; // 0.05 bias toward clipping along symmetry planes
- public float vHACDbeta; // 0.05 bias toward clipping along revolution axis
- public float vHACDgamma; // 0.00125 max concavity when merging
- public float vHACDpca; // 0 on/off normalizing mesh before decomp
- public float vHACDmode; // 0 0:voxel based, 1: tetrahedron based
- public float vHACDmaxNumVerticesPerCH; // 64 max triangles per convex hull
- public float vHACDminVolumePerCH; // 0.0001 sampling of generated convex hulls
-}
-
-// The states a bullet collision object can have
-public enum ActivationState : uint
-{
- ACTIVE_TAG = 1,
- ISLAND_SLEEPING,
- WANTS_DEACTIVATION,
- DISABLE_DEACTIVATION,
- DISABLE_SIMULATION,
-}
-
-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, ...).
-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, // return collision events from unmanaged to managed
- BS_FLOATS_ON_WATER = 1 << 11, // the object should float at water level
- BS_VEHICLE_COLLISIONS = 1 << 12, // return collisions for vehicle ground checking
- BS_RETURN_ROOT_COMPOUND_SHAPE = 1 << 13, // return the pos/rot of the root shape in a compound shape
- BS_NONE = 0,
- BS_ALL = 0x7FFF // collision flags are a signed short
-};
-
-// Values f 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 found and debugged.
- BNoneGroup = 0,
- BDefaultGroup = 1 << 0, // 0001
- BStaticGroup = 1 << 1, // 0002
- BKinematicGroup = 1 << 2, // 0004
- BDebrisGroup = 1 << 3, // 0008
- BSensorTrigger = 1 << 4, // 0010
- BCharacterGroup = 1 << 5, // 0020
- BAllGroup = 0x0007FFF, // collision flags are a signed short
- // Filter groups defined by BulletSim
- BGroundPlaneGroup = 1 << 8, // 0400
- BTerrainGroup = 1 << 9, // 0800
- BRaycastGroup = 1 << 10, // 1000
- BSolidGroup = 1 << 11, // 2000
- // BLinksetGroup = xx // a linkset proper is either static or dynamic
- BLinksetChildGroup = 1 << 12, // 4000
-};
-
-// 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, // added by BulletSim so we don't have to do zillions of calls
- AXIS_ANGULAR_ALL,
- AXIS_ALL
-};
-
-public abstract class BSAPITemplate
-{
-// Returns the name of the underlying Bullet engine
-public abstract string BulletEngineName { get; }
-public abstract string BulletEngineVersion { get; protected set;}
-
-// Initialization and simulation
-public abstract BulletWorld Initialize(Vector3 maxPosition, ConfigurationParameters parms,
- int maxCollisions, ref CollisionDesc[] collisionArray,
- int maxUpdates, ref EntityProperties[] updateArray
- );
-
-public abstract int PhysicsStep(BulletWorld world, float timeStep, int maxSubSteps, float fixedTimeStep,
- out int updatedEntityCount, out int collidersCount);
-
-public abstract bool UpdateParameter(BulletWorld world, UInt32 localID, String parm, float value);
-
-public abstract void Shutdown(BulletWorld sim);
-
-public abstract bool PushUpdate(BulletBody obj);
-
-// =====================================================================================
-// Mesh, hull, shape and body creation helper routines
-public abstract BulletShape CreateMeshShape(BulletWorld world,
- int indicesCount, int[] indices,
- int verticesCount, float[] vertices );
-
-public abstract BulletShape CreateGImpactShape(BulletWorld world,
- int indicesCount, int[] indices,
- int verticesCount, float[] vertices );
-
-public abstract BulletShape CreateHullShape(BulletWorld world,
- int hullCount, float[] hulls);
-
-public abstract BulletShape BuildHullShapeFromMesh(BulletWorld world, BulletShape meshShape, HACDParams parms);
-
-public abstract BulletShape BuildConvexHullShapeFromMesh(BulletWorld world, BulletShape meshShape);
-
-public abstract BulletShape CreateConvexHullShape(BulletWorld world,
- int indicesCount, int[] indices,
- int verticesCount, float[] vertices );
-
-public abstract BulletShape BuildNativeShape(BulletWorld world, ShapeData shapeData);
-
-public abstract bool IsNativeShape(BulletShape shape);
-
-public abstract void SetShapeCollisionMargin(BulletShape shape, float margin);
-
-public abstract BulletShape BuildCapsuleShape(BulletWorld world, float radius, float height, Vector3 scale);
-
-public abstract BulletShape CreateCompoundShape(BulletWorld sim, bool enableDynamicAabbTree);
-
-public abstract int GetNumberOfCompoundChildren(BulletShape cShape);
-
-public abstract void AddChildShapeToCompoundShape(BulletShape cShape, BulletShape addShape, Vector3 pos, Quaternion rot);
-
-public abstract BulletShape GetChildShapeFromCompoundShapeIndex(BulletShape cShape, int indx);
-
-public abstract BulletShape RemoveChildShapeFromCompoundShapeIndex(BulletShape cShape, int indx);
-
-public abstract void RemoveChildShapeFromCompoundShape(BulletShape cShape, BulletShape removeShape);
-
-public abstract void UpdateChildTransform(BulletShape pShape, int childIndex, Vector3 pos, Quaternion rot, bool shouldRecalculateLocalAabb);
-
-public abstract void RecalculateCompoundShapeLocalAabb(BulletShape cShape);
-
-public abstract BulletShape DuplicateCollisionShape(BulletWorld sim, BulletShape srcShape, UInt32 id);
-
-public abstract bool DeleteCollisionShape(BulletWorld world, BulletShape shape);
-
-public abstract CollisionObjectTypes GetBodyType(BulletBody obj);
-
-public abstract BulletBody CreateBodyFromShape(BulletWorld sim, BulletShape shape, UInt32 id, Vector3 pos, Quaternion rot);
-
-public abstract BulletBody CreateBodyWithDefaultMotionState(BulletShape shape, UInt32 id, Vector3 pos, Quaternion rot);
-
-public abstract BulletBody CreateGhostFromShape(BulletWorld sim, BulletShape shape, UInt32 id, Vector3 pos, Quaternion rot);
-
-public abstract void DestroyObject(BulletWorld sim, BulletBody obj);
-
-// =====================================================================================
-public abstract BulletShape CreateGroundPlaneShape(UInt32 id, float height, float collisionMargin);
-
-public abstract BulletShape CreateTerrainShape(UInt32 id, Vector3 size, float minHeight, float maxHeight, float[] heightMap,
- float scaleFactor, float collisionMargin);
-
-// =====================================================================================
-// Constraint creation and helper routines
-public abstract BulletConstraint Create6DofConstraint(BulletWorld world, BulletBody obj1, BulletBody obj2,
- Vector3 frame1loc, Quaternion frame1rot,
- Vector3 frame2loc, Quaternion frame2rot,
- bool useLinearReferenceFrameA, bool disableCollisionsBetweenLinkedBodies);
-
-public abstract BulletConstraint Create6DofConstraintToPoint(BulletWorld world, BulletBody obj1, BulletBody obj2,
- Vector3 joinPoint,
- bool useLinearReferenceFrameA, bool disableCollisionsBetweenLinkedBodies);
-
-public abstract BulletConstraint Create6DofConstraintFixed(BulletWorld world, BulletBody obj1,
- Vector3 frameInBloc, Quaternion frameInBrot,
- bool useLinearReferenceFrameB, bool disableCollisionsBetweenLinkedBodies);
-
-public abstract BulletConstraint Create6DofSpringConstraint(BulletWorld world, BulletBody obj1, BulletBody obj2,
- Vector3 frame1loc, Quaternion frame1rot,
- Vector3 frame2loc, Quaternion frame2rot,
- bool useLinearReferenceFrameA, bool disableCollisionsBetweenLinkedBodies);
-
-public abstract BulletConstraint CreateHingeConstraint(BulletWorld world, BulletBody obj1, BulletBody obj2,
- Vector3 pivotinA, Vector3 pivotinB,
- Vector3 axisInA, Vector3 axisInB,
- bool useLinearReferenceFrameA, bool disableCollisionsBetweenLinkedBodies);
-
-public abstract BulletConstraint CreateSliderConstraint(BulletWorld world, BulletBody obj1, BulletBody obj2,
- Vector3 frameInAloc, Quaternion frameInArot,
- Vector3 frameInBloc, Quaternion frameInBrot,
- bool useLinearReferenceFrameA, bool disableCollisionsBetweenLinkedBodies);
-
-public abstract BulletConstraint CreateConeTwistConstraint(BulletWorld world, BulletBody obj1, BulletBody obj2,
- Vector3 frameInAloc, Quaternion frameInArot,
- Vector3 frameInBloc, Quaternion frameInBrot,
- bool disableCollisionsBetweenLinkedBodies);
-
-public abstract BulletConstraint CreateGearConstraint(BulletWorld world, BulletBody obj1, BulletBody obj2,
- Vector3 axisInA, Vector3 axisInB,
- float ratio, bool disableCollisionsBetweenLinkedBodies);
-
-public abstract BulletConstraint CreatePoint2PointConstraint(BulletWorld world, BulletBody obj1, BulletBody obj2,
- Vector3 pivotInA, Vector3 pivotInB,
- bool disableCollisionsBetweenLinkedBodies);
-
-public abstract void SetConstraintEnable(BulletConstraint constrain, float numericTrueFalse);
-
-public abstract void SetConstraintNumSolverIterations(BulletConstraint constrain, float iterations);
-
-public abstract bool SetFrames(BulletConstraint constrain,
- Vector3 frameA, Quaternion frameArot, Vector3 frameB, Quaternion frameBrot);
-
-public abstract bool SetLinearLimits(BulletConstraint constrain, Vector3 low, Vector3 hi);
-
-public abstract bool SetAngularLimits(BulletConstraint constrain, Vector3 low, Vector3 hi);
-
-public abstract bool UseFrameOffset(BulletConstraint constrain, float enable);
-
-public abstract bool TranslationalLimitMotor(BulletConstraint constrain, float enable, float targetVel, float maxMotorForce);
-
-public abstract bool SetBreakingImpulseThreshold(BulletConstraint constrain, float threshold);
-
-public const int HINGE_NOT_SPECIFIED = -1;
-public abstract bool HingeSetLimits(BulletConstraint constrain, float low, float high, float softness, float bias, float relaxation);
-
-public abstract bool SpringEnable(BulletConstraint constrain, int index, float numericTrueFalse);
-
-public const int SPRING_NOT_SPECIFIED = -1;
-public abstract bool SpringSetEquilibriumPoint(BulletConstraint constrain, int index, float equilibriumPoint);
-
-public abstract bool SpringSetStiffness(BulletConstraint constrain, int index, float stiffnesss);
-
-public abstract bool SpringSetDamping(BulletConstraint constrain, int index, float damping);
-
-public const int SLIDER_LOWER_LIMIT = 0;
-public const int SLIDER_UPPER_LIMIT = 1;
-public const int SLIDER_LINEAR = 2;
-public const int SLIDER_ANGULAR = 3;
-public abstract bool SliderSetLimits(BulletConstraint constrain, int lowerUpper, int linAng, float val);
-
-public const int SLIDER_SET_SOFTNESS = 4;
-public const int SLIDER_SET_RESTITUTION = 5;
-public const int SLIDER_SET_DAMPING = 6;
-public const int SLIDER_SET_DIRECTION = 7;
-public const int SLIDER_SET_LIMIT = 8;
-public const int SLIDER_SET_ORTHO = 9;
-public abstract bool SliderSet(BulletConstraint constrain, int softRestDamp, int dirLimOrtho, int linAng, float val);
-
-public abstract bool SliderMotorEnable(BulletConstraint constrain, int linAng, float numericTrueFalse);
-
-public const int SLIDER_MOTOR_VELOCITY = 10;
-public const int SLIDER_MAX_MOTOR_FORCE = 11;
-public abstract bool SliderMotor(BulletConstraint constrain, int forceVel, int linAng, float val);
-
-public abstract bool CalculateTransforms(BulletConstraint constrain);
-
-public abstract bool SetConstraintParam(BulletConstraint constrain, ConstraintParams paramIndex, float value, ConstraintParamAxis axis);
-
-public abstract bool DestroyConstraint(BulletWorld world, BulletConstraint constrain);
-
-// =====================================================================================
-// btCollisionWorld entries
-public abstract void UpdateSingleAabb(BulletWorld world, BulletBody obj);
-
-public abstract void UpdateAabbs(BulletWorld world);
-
-public abstract bool GetForceUpdateAllAabbs(BulletWorld world);
-
-public abstract void SetForceUpdateAllAabbs(BulletWorld world, bool force);
-
-// =====================================================================================
-// btDynamicsWorld entries
-// public abstract bool AddObjectToWorld(BulletWorld world, BulletBody obj, Vector3 pos, Quaternion rot);
-public abstract bool AddObjectToWorld(BulletWorld world, BulletBody obj);
-
-public abstract bool RemoveObjectFromWorld(BulletWorld world, BulletBody obj);
-
-public abstract bool ClearCollisionProxyCache(BulletWorld world, BulletBody obj);
-
-public abstract bool AddConstraintToWorld(BulletWorld world, BulletConstraint constrain, bool disableCollisionsBetweenLinkedObjects);
-
-public abstract bool RemoveConstraintFromWorld(BulletWorld world, BulletConstraint constrain);
-// =====================================================================================
-// btCollisionObject entries
-public abstract Vector3 GetAnisotripicFriction(BulletConstraint constrain);
-
-public abstract Vector3 SetAnisotripicFriction(BulletConstraint constrain, Vector3 frict);
-
-public abstract bool HasAnisotripicFriction(BulletConstraint constrain);
-
-public abstract void SetContactProcessingThreshold(BulletBody obj, float val);
-
-public abstract float GetContactProcessingThreshold(BulletBody obj);
-
-public abstract bool IsStaticObject(BulletBody obj);
-
-public abstract bool IsKinematicObject(BulletBody obj);
-
-public abstract bool IsStaticOrKinematicObject(BulletBody obj);
-
-public abstract bool HasContactResponse(BulletBody obj);
-
-public abstract void SetCollisionShape(BulletWorld sim, BulletBody obj, BulletShape shape);
-
-public abstract BulletShape GetCollisionShape(BulletBody obj);
-
-public abstract int GetActivationState(BulletBody obj);
-
-public abstract void SetActivationState(BulletBody obj, int state);
-
-public abstract void SetDeactivationTime(BulletBody obj, float dtime);
-
-public abstract float GetDeactivationTime(BulletBody obj);
-
-public abstract void ForceActivationState(BulletBody obj, ActivationState state);
-
-public abstract void Activate(BulletBody obj, bool forceActivation);
-
-public abstract bool IsActive(BulletBody obj);
-
-public abstract void SetRestitution(BulletBody obj, float val);
-
-public abstract float GetRestitution(BulletBody obj);
-
-public abstract void SetFriction(BulletBody obj, float val);
-
-public abstract float GetFriction(BulletBody obj);
-
-public abstract Vector3 GetPosition(BulletBody obj);
-
-public abstract Quaternion GetOrientation(BulletBody obj);
-
-public abstract void SetTranslation(BulletBody obj, Vector3 position, Quaternion rotation);
-
-// public abstract IntPtr GetBroadphaseHandle(BulletBody obj);
-
-// public abstract void SetBroadphaseHandle(BulletBody obj, IntPtr handle);
-
-public abstract void SetInterpolationLinearVelocity(BulletBody obj, Vector3 vel);
-
-public abstract void SetInterpolationAngularVelocity(BulletBody obj, Vector3 vel);
-
-public abstract void SetInterpolationVelocity(BulletBody obj, Vector3 linearVel, Vector3 angularVel);
-
-public abstract float GetHitFraction(BulletBody obj);
-
-public abstract void SetHitFraction(BulletBody obj, float val);
-
-public abstract CollisionFlags GetCollisionFlags(BulletBody obj);
-
-public abstract CollisionFlags SetCollisionFlags(BulletBody obj, CollisionFlags flags);
-
-public abstract CollisionFlags AddToCollisionFlags(BulletBody obj, CollisionFlags flags);
-
-public abstract CollisionFlags RemoveFromCollisionFlags(BulletBody obj, CollisionFlags flags);
-
-public abstract float GetCcdMotionThreshold(BulletBody obj);
-
-public abstract void SetCcdMotionThreshold(BulletBody obj, float val);
-
-public abstract float GetCcdSweptSphereRadius(BulletBody obj);
-
-public abstract void SetCcdSweptSphereRadius(BulletBody obj, float val);
-
-public abstract IntPtr GetUserPointer(BulletBody obj);
-
-public abstract void SetUserPointer(BulletBody obj, IntPtr val);
-
-// =====================================================================================
-// btRigidBody entries
-public abstract void ApplyGravity(BulletBody obj);
-
-public abstract void SetGravity(BulletBody obj, Vector3 val);
-
-public abstract Vector3 GetGravity(BulletBody obj);
-
-public abstract void SetDamping(BulletBody obj, float lin_damping, float ang_damping);
-
-public abstract void SetLinearDamping(BulletBody obj, float lin_damping);
-
-public abstract void SetAngularDamping(BulletBody obj, float ang_damping);
-
-public abstract float GetLinearDamping(BulletBody obj);
-
-public abstract float GetAngularDamping(BulletBody obj);
-
-public abstract float GetLinearSleepingThreshold(BulletBody obj);
-
-public abstract void ApplyDamping(BulletBody obj, float timeStep);
-
-public abstract void SetMassProps(BulletBody obj, float mass, Vector3 inertia);
-
-public abstract Vector3 GetLinearFactor(BulletBody obj);
-
-public abstract void SetLinearFactor(BulletBody obj, Vector3 factor);
-
-public abstract void SetCenterOfMassByPosRot(BulletBody obj, Vector3 pos, Quaternion rot);
-
-// Add a force to the object as if its mass is one.
-public abstract void ApplyCentralForce(BulletBody obj, Vector3 force);
-
-// Set the force being applied to the object as if its mass is one.
-public abstract void SetObjectForce(BulletBody obj, Vector3 force);
-
-public abstract Vector3 GetTotalForce(BulletBody obj);
-
-public abstract Vector3 GetTotalTorque(BulletBody obj);
-
-public abstract Vector3 GetInvInertiaDiagLocal(BulletBody obj);
-
-public abstract void SetInvInertiaDiagLocal(BulletBody obj, Vector3 inert);
-
-public abstract void SetSleepingThresholds(BulletBody obj, float lin_threshold, float ang_threshold);
-
-public abstract void ApplyTorque(BulletBody obj, Vector3 torque);
-
-// Apply force at the given point. Will add torque to the object.
-public abstract void ApplyForce(BulletBody obj, Vector3 force, Vector3 pos);
-
-// Apply impulse to the object. Same as "ApplycentralForce" but force scaled by object's mass.
-public abstract void ApplyCentralImpulse(BulletBody obj, Vector3 imp);
-
-// Apply impulse to the object's torque. Force is scaled by object's mass.
-public abstract void ApplyTorqueImpulse(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 ApplyImpulse(BulletBody obj, Vector3 imp, Vector3 pos);
-
-public abstract void ClearForces(BulletBody obj);
-
-public abstract void ClearAllForces(BulletBody obj);
-
-public abstract void UpdateInertiaTensor(BulletBody obj);
-
-public abstract Vector3 GetLinearVelocity(BulletBody obj);
-
-public abstract Vector3 GetAngularVelocity(BulletBody obj);
-
-public abstract void SetLinearVelocity(BulletBody obj, Vector3 val);
-
-public abstract void SetAngularVelocity(BulletBody obj, Vector3 angularVelocity);
-
-public abstract Vector3 GetVelocityInLocalPoint(BulletBody obj, Vector3 pos);
-
-public abstract void Translate(BulletBody obj, Vector3 trans);
-
-public abstract void UpdateDeactivation(BulletBody obj, float timeStep);
-
-public abstract bool WantsSleeping(BulletBody obj);
-
-public abstract void SetAngularFactor(BulletBody obj, float factor);
-
-public abstract void SetAngularFactorV(BulletBody obj, Vector3 factor);
-
-public abstract Vector3 GetAngularFactor(BulletBody obj);
-
-public abstract bool IsInWorld(BulletWorld world, BulletBody obj);
-
-public abstract void AddConstraintRef(BulletBody obj, BulletConstraint constrain);
-
-public abstract void RemoveConstraintRef(BulletBody obj, BulletConstraint constrain);
-
-public abstract BulletConstraint GetConstraintRef(BulletBody obj, int index);
-
-public abstract int GetNumConstraintRefs(BulletBody obj);
-
-public abstract bool SetCollisionGroupMask(BulletBody body, UInt32 filter, UInt32 mask);
-
-// =====================================================================================
-// btCollisionShape entries
-
-public abstract float GetAngularMotionDisc(BulletShape shape);
-
-public abstract float GetContactBreakingThreshold(BulletShape shape, float defaultFactor);
-
-public abstract bool IsPolyhedral(BulletShape shape);
-
-public abstract bool IsConvex2d(BulletShape shape);
-
-public abstract bool IsConvex(BulletShape shape);
-
-public abstract bool IsNonMoving(BulletShape shape);
-
-public abstract bool IsConcave(BulletShape shape);
-
-public abstract bool IsCompound(BulletShape shape);
-
-public abstract bool IsSoftBody(BulletShape shape);
-
-public abstract bool IsInfinite(BulletShape shape);
-
-public abstract void SetLocalScaling(BulletShape shape, Vector3 scale);
-
-public abstract Vector3 GetLocalScaling(BulletShape shape);
-
-public abstract Vector3 CalculateLocalInertia(BulletShape shape, float mass);
-
-public abstract int GetShapeType(BulletShape shape);
-
-public abstract void SetMargin(BulletShape shape, float val);
-
-public abstract float GetMargin(BulletShape shape);
-
-// =====================================================================================
-// Raycast
-public abstract SweepHit ConvexSweepTest2(BulletWorld world, BulletBody obj, Vector3 from, Vector3 to, float margin);
-
-public abstract RaycastHit RayTest2(BulletWorld world, Vector3 from, Vector3 to, uint filterGroup, uint filterMask);
-
-// =====================================================================================
-// Debugging
-public virtual void DumpRigidBody(BulletWorld sim, BulletBody collisionObject) { }
-
-public virtual void DumpCollisionShape(BulletWorld sim, BulletShape collisionShape) { }
-
-public virtual void DumpConstraint(BulletWorld sim, BulletConstraint constrain) { }
-
-public virtual void DumpActivationInfo(BulletWorld sim) { }
-
-public virtual void DumpAllInfo(BulletWorld sim) { }
-
-public virtual void DumpPhysicsStatistics(BulletWorld sim) { }
-
-public virtual void ResetBroadphasePool(BulletWorld sim) { }
-
-public virtual void ResetConstraintSolver(BulletWorld sim) { }
-
-};
+
+ [StructLayout(LayoutKind.Sequential)]
+ public struct ShapeData
+ {
+ public UInt32 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 UInt32 ID;
+ public float Fraction;
+ public Vector3 Normal;
+ public Vector3 Point;
+
+ public bool hasHit()
+ {
+ float sum = Fraction
+ + Normal.X + Normal.Y + Normal.Z
+ + Point.X + Point.Y + Point.Z;
+ return (sum != 0) || (ID != 0);
+ }
+ }
+ [StructLayout(LayoutKind.Sequential)]
+ public struct RaycastHit
+ {
+ public UInt32 ID;
+ public float Fraction;
+ public Vector3 Normal;
+ public Vector3 Point;
+
+ public bool hasHit()
+ {
+ float sum = Normal.X + Normal.Y + Normal.Z + Point.X + Point.Y + Point.Z;
+ return (sum != 0);
+ }
+ }
+ [StructLayout(LayoutKind.Sequential)]
+ public struct CollisionDesc
+ {
+ public UInt32 aID;
+ public UInt32 bID;
+ public Vector3 point;
+ public Vector3 normal;
+ public float penetration;
+ }
+ [StructLayout(LayoutKind.Sequential)]
+ public struct EntityProperties
+ {
+ public UInt32 ID;
+ public Vector3 Position;
+ public Quaternion Rotation;
+ public Vector3 Velocity;
+ public Vector3 Acceleration;
+ public Vector3 RotationalVelocity;
+
+ public override string ToString()
+ {
+ StringBuilder buff = new StringBuilder();
+ buff.Append("");
+ return buff.ToString();
+ }
+ }
+
+ // 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 maxPersistantManifoldPoolSize;
+ public float maxCollisionAlgorithmPoolSize;
+ public float shouldDisableContactPoolDynamicAllocation;
+ public float shouldForceUpdateAllAabbs;
+ public float shouldRandomizeSolverOrder;
+ public float shouldSplitSimulationIslands;
+ public float shouldEnableFrictionCaching;
+ public float numberOfSolverIterations;
+ public float useSingleSidedMeshes;
+ public float globalContactBreakingThreshold;
+
+ public float physicsLoggingFrames;
+
+ public const float numericTrue = 1f;
+ public const float numericFalse = 0f;
+ }
+
+ // Parameters passed for the conversion of a mesh to a hull using Bullet's HACD library.
+ [StructLayout(LayoutKind.Sequential)]
+ public struct HACDParams
+ {
+ // usual default values
+ public float maxVerticesPerHull; // 100
+ public float minClusters; // 2
+ public float compacityWeight; // 0.1
+ public float volumeWeight; // 0.0
+ public float concavity; // 100
+ public float addExtraDistPoints; // false
+ public float addNeighboursDistPoints; // false
+ public float addFacesPoints; // false
+ public float shouldAdjustCollisionMargin; // false
+ // VHACD
+ public float whichHACD; // zero if Bullet HACD, non-zero says VHACD
+ // http://kmamou.blogspot.ca/2014/12/v-hacd-20-parameters-description.html
+ public float vHACDresolution; // 100,000 max number of voxels generated during voxelization stage
+ public float vHACDdepth; // 20 max number of clipping stages
+ public float vHACDconcavity; // 0.0025 maximum concavity
+ public float vHACDplaneDownsampling; // 4 granularity of search for best clipping plane
+ public float vHACDconvexHullDownsampling; // 4 precision of hull gen process
+ public float vHACDalpha; // 0.05 bias toward clipping along symmetry planes
+ public float vHACDbeta; // 0.05 bias toward clipping along revolution axis
+ public float vHACDgamma; // 0.00125 max concavity when merging
+ public float vHACDpca; // 0 on/off normalizing mesh before decomp
+ public float vHACDmode; // 0 0:voxel based, 1: tetrahedron based
+ public float vHACDmaxNumVerticesPerCH; // 64 max triangles per convex hull
+ public float vHACDminVolumePerCH; // 0.0001 sampling of generated convex hulls
+ }
+
+ // The states a bullet collision object can have
+ public enum ActivationState : uint
+ {
+ ACTIVE_TAG = 1,
+ ISLAND_SLEEPING,
+ WANTS_DEACTIVATION,
+ DISABLE_DEACTIVATION,
+ DISABLE_SIMULATION,
+ }
+
+ 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, ...).
+ 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, // return collision events from unmanaged to managed
+ BS_FLOATS_ON_WATER = 1 << 11, // the object should float at water level
+ BS_VEHICLE_COLLISIONS = 1 << 12, // return collisions for vehicle ground checking
+ BS_RETURN_ROOT_COMPOUND_SHAPE = 1 << 13, // return the pos/rot of the root shape in a compound shape
+ BS_NONE = 0,
+ BS_ALL = 0x7FFF // collision flags are a signed short
+ };
+
+ // Values f 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 found and debugged.
+ BNoneGroup = 0,
+ BDefaultGroup = 1 << 0, // 0001
+ BStaticGroup = 1 << 1, // 0002
+ BKinematicGroup = 1 << 2, // 0004
+ BDebrisGroup = 1 << 3, // 0008
+ BSensorTrigger = 1 << 4, // 0010
+ BCharacterGroup = 1 << 5, // 0020
+ BAllGroup = 0x0007FFF, // collision flags are a signed short
+ // Filter groups defined by BulletSim
+ BGroundPlaneGroup = 1 << 8, // 0400
+ BTerrainGroup = 1 << 9, // 0800
+ BRaycastGroup = 1 << 10, // 1000
+ BSolidGroup = 1 << 11, // 2000
+ // BLinksetGroup = xx // a linkset proper is either static or dynamic
+ BLinksetChildGroup = 1 << 12, // 4000
+ };
+
+ // 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, // added by BulletSim so we don't have to do zillions of calls
+ AXIS_ANGULAR_ALL,
+ AXIS_ALL
+ };
+
+ public abstract class BSAPITemplate
+ {
+ // Returns the name of the underlying Bullet engine
+ public abstract string BulletEngineName { get; }
+ public abstract string BulletEngineVersion { get; protected set;}
+
+ // Initialization and simulation
+ public abstract BulletWorld Initialize(Vector3 maxPosition, ConfigurationParameters parms,
+ int maxCollisions, ref CollisionDesc[] collisionArray,
+ int maxUpdates, ref EntityProperties[] updateArray
+ );
+
+ public abstract int PhysicsStep(BulletWorld world, float timeStep, int maxSubSteps, float fixedTimeStep,
+ out int updatedEntityCount, out int collidersCount);
+
+ public abstract bool UpdateParameter(BulletWorld world, UInt32 localID, String parm, float value);
+
+ public abstract void Shutdown(BulletWorld sim);
+
+ public abstract bool PushUpdate(BulletBody obj);
+
+ // =====================================================================================
+ // Mesh, hull, shape and body creation helper routines
+ public abstract BulletShape CreateMeshShape(BulletWorld world,
+ int indicesCount, int[] indices,
+ int verticesCount, float[] vertices );
+
+ public abstract BulletShape CreateGImpactShape(BulletWorld world,
+ int indicesCount, int[] indices,
+ int verticesCount, float[] vertices );
+
+ public abstract BulletShape CreateHullShape(BulletWorld world,
+ int hullCount, float[] hulls);
+
+ public abstract BulletShape BuildHullShapeFromMesh(BulletWorld world, BulletShape meshShape, HACDParams parms);
+
+ public abstract BulletShape BuildConvexHullShapeFromMesh(BulletWorld world, BulletShape meshShape);
+
+ public abstract BulletShape CreateConvexHullShape(BulletWorld world,
+ int indicesCount, int[] indices,
+ int verticesCount, float[] vertices );
+
+ public abstract BulletShape BuildNativeShape(BulletWorld world, ShapeData shapeData);
+
+ public abstract bool IsNativeShape(BulletShape shape);
+
+ public abstract void SetShapeCollisionMargin(BulletShape shape, float margin);
+
+ public abstract BulletShape BuildCapsuleShape(BulletWorld world, float radius, float height, Vector3 scale);
+
+ public abstract BulletShape CreateCompoundShape(BulletWorld sim, bool enableDynamicAabbTree);
+
+ public abstract int GetNumberOfCompoundChildren(BulletShape cShape);
+
+ public abstract void AddChildShapeToCompoundShape(BulletShape cShape, BulletShape addShape, Vector3 pos, Quaternion rot);
+
+ public abstract BulletShape GetChildShapeFromCompoundShapeIndex(BulletShape cShape, int indx);
+
+ public abstract BulletShape RemoveChildShapeFromCompoundShapeIndex(BulletShape cShape, int indx);
+
+ public abstract void RemoveChildShapeFromCompoundShape(BulletShape cShape, BulletShape removeShape);
+
+ public abstract void UpdateChildTransform(BulletShape pShape, int childIndex, Vector3 pos, Quaternion rot, bool shouldRecalculateLocalAabb);
+
+ public abstract void RecalculateCompoundShapeLocalAabb(BulletShape cShape);
+
+ public abstract BulletShape DuplicateCollisionShape(BulletWorld sim, BulletShape srcShape, UInt32 id);
+
+ public abstract bool DeleteCollisionShape(BulletWorld world, BulletShape shape);
+
+ public abstract CollisionObjectTypes GetBodyType(BulletBody obj);
+
+ public abstract BulletBody CreateBodyFromShape(BulletWorld sim, BulletShape shape, UInt32 id, Vector3 pos, Quaternion rot);
+
+ public abstract BulletBody CreateBodyWithDefaultMotionState(BulletShape shape, UInt32 id, Vector3 pos, Quaternion rot);
+
+ public abstract BulletBody CreateGhostFromShape(BulletWorld sim, BulletShape shape, UInt32 id, Vector3 pos, Quaternion rot);
+
+ public abstract void DestroyObject(BulletWorld sim, BulletBody obj);
+
+ // =====================================================================================
+ public abstract BulletShape CreateGroundPlaneShape(UInt32 id, float height, float collisionMargin);
+
+ public abstract BulletShape CreateTerrainShape(UInt32 id, Vector3 size, float minHeight, float maxHeight, float[] heightMap,
+ float scaleFactor, float collisionMargin);
+
+ // =====================================================================================
+ // Constraint creation and helper routines
+ public abstract BulletConstraint Create6DofConstraint(BulletWorld world, BulletBody obj1, BulletBody obj2,
+ Vector3 frame1loc, Quaternion frame1rot,
+ Vector3 frame2loc, Quaternion frame2rot,
+ bool useLinearReferenceFrameA, bool disableCollisionsBetweenLinkedBodies);
+
+ public abstract BulletConstraint Create6DofConstraintToPoint(BulletWorld world, BulletBody obj1, BulletBody obj2,
+ Vector3 joinPoint,
+ bool useLinearReferenceFrameA, bool disableCollisionsBetweenLinkedBodies);
+
+ public abstract BulletConstraint Create6DofConstraintFixed(BulletWorld world, BulletBody obj1,
+ Vector3 frameInBloc, Quaternion frameInBrot,
+ bool useLinearReferenceFrameB, bool disableCollisionsBetweenLinkedBodies);
+
+ public abstract BulletConstraint Create6DofSpringConstraint(BulletWorld world, BulletBody obj1, BulletBody obj2,
+ Vector3 frame1loc, Quaternion frame1rot,
+ Vector3 frame2loc, Quaternion frame2rot,
+ bool useLinearReferenceFrameA, bool disableCollisionsBetweenLinkedBodies);
+
+ public abstract BulletConstraint CreateHingeConstraint(BulletWorld world, BulletBody obj1, BulletBody obj2,
+ Vector3 pivotinA, Vector3 pivotinB,
+ Vector3 axisInA, Vector3 axisInB,
+ bool useLinearReferenceFrameA, bool disableCollisionsBetweenLinkedBodies);
+
+ public abstract BulletConstraint CreateSliderConstraint(BulletWorld world, BulletBody obj1, BulletBody obj2,
+ Vector3 frameInAloc, Quaternion frameInArot,
+ Vector3 frameInBloc, Quaternion frameInBrot,
+ bool useLinearReferenceFrameA, bool disableCollisionsBetweenLinkedBodies);
+
+ public abstract BulletConstraint CreateConeTwistConstraint(BulletWorld world, BulletBody obj1, BulletBody obj2,
+ Vector3 frameInAloc, Quaternion frameInArot,
+ Vector3 frameInBloc, Quaternion frameInBrot,
+ bool disableCollisionsBetweenLinkedBodies);
+
+ public abstract BulletConstraint CreateGearConstraint(BulletWorld world, BulletBody obj1, BulletBody obj2,
+ Vector3 axisInA, Vector3 axisInB,
+ float ratio, bool disableCollisionsBetweenLinkedBodies);
+
+ public abstract BulletConstraint CreatePoint2PointConstraint(BulletWorld world, BulletBody obj1, BulletBody obj2,
+ Vector3 pivotInA, Vector3 pivotInB,
+ bool disableCollisionsBetweenLinkedBodies);
+
+ public abstract void SetConstraintEnable(BulletConstraint constrain, float numericTrueFalse);
+
+ public abstract void SetConstraintNumSolverIterations(BulletConstraint constrain, float iterations);
+
+ public abstract bool SetFrames(BulletConstraint constrain,
+ Vector3 frameA, Quaternion frameArot, Vector3 frameB, Quaternion frameBrot);
+
+ public abstract bool SetLinearLimits(BulletConstraint constrain, Vector3 low, Vector3 hi);
+
+ public abstract bool SetAngularLimits(BulletConstraint constrain, Vector3 low, Vector3 hi);
+
+ public abstract bool UseFrameOffset(BulletConstraint constrain, float enable);
+
+ public abstract bool TranslationalLimitMotor(BulletConstraint constrain, float enable, float targetVel, float maxMotorForce);
+
+ public abstract bool SetBreakingImpulseThreshold(BulletConstraint constrain, float threshold);
+
+ public const int HINGE_NOT_SPECIFIED = -1;
+ public abstract bool HingeSetLimits(BulletConstraint constrain, float low, float high, float softness, float bias, float relaxation);
+
+ public abstract bool SpringEnable(BulletConstraint constrain, int index, float numericTrueFalse);
+
+ public const int SPRING_NOT_SPECIFIED = -1;
+ public abstract bool SpringSetEquilibriumPoint(BulletConstraint constrain, int index, float equilibriumPoint);
+
+ public abstract bool SpringSetStiffness(BulletConstraint constrain, int index, float stiffnesss);
+
+ public abstract bool SpringSetDamping(BulletConstraint constrain, int index, float damping);
+
+ public const int SLIDER_LOWER_LIMIT = 0;
+ public const int SLIDER_UPPER_LIMIT = 1;
+ public const int SLIDER_LINEAR = 2;
+ public const int SLIDER_ANGULAR = 3;
+ public abstract bool SliderSetLimits(BulletConstraint constrain, int lowerUpper, int linAng, float val);
+
+ public const int SLIDER_SET_SOFTNESS = 4;
+ public const int SLIDER_SET_RESTITUTION = 5;
+ public const int SLIDER_SET_DAMPING = 6;
+ public const int SLIDER_SET_DIRECTION = 7;
+ public const int SLIDER_SET_LIMIT = 8;
+ public const int SLIDER_SET_ORTHO = 9;
+ public abstract bool SliderSet(BulletConstraint constrain, int softRestDamp, int dirLimOrtho, int linAng, float val);
+
+ public abstract bool SliderMotorEnable(BulletConstraint constrain, int linAng, float numericTrueFalse);
+
+ public const int SLIDER_MOTOR_VELOCITY = 10;
+ public const int SLIDER_MAX_MOTOR_FORCE = 11;
+ public abstract bool SliderMotor(BulletConstraint constrain, int forceVel, int linAng, float val);
+
+ public abstract bool CalculateTransforms(BulletConstraint constrain);
+
+ public abstract bool SetConstraintParam(BulletConstraint constrain, ConstraintParams paramIndex, float value, ConstraintParamAxis axis);
+
+ public abstract bool DestroyConstraint(BulletWorld world, BulletConstraint constrain);
+
+ // =====================================================================================
+ // btCollisionWorld entries
+ public abstract void UpdateSingleAabb(BulletWorld world, BulletBody obj);
+
+ public abstract void UpdateAabbs(BulletWorld world);
+
+ public abstract bool GetForceUpdateAllAabbs(BulletWorld world);
+
+ public abstract void SetForceUpdateAllAabbs(BulletWorld world, bool force);
+
+ // =====================================================================================
+ // btDynamicsWorld entries
+ // public abstract bool AddObjectToWorld(BulletWorld world, BulletBody obj, Vector3 pos, Quaternion rot);
+ public abstract bool AddObjectToWorld(BulletWorld world, BulletBody obj);
+
+ public abstract bool RemoveObjectFromWorld(BulletWorld world, BulletBody obj);
+
+ public abstract bool ClearCollisionProxyCache(BulletWorld world, BulletBody obj);
+
+ public abstract bool AddConstraintToWorld(BulletWorld world, BulletConstraint constrain, bool disableCollisionsBetweenLinkedObjects);
+
+ public abstract bool RemoveConstraintFromWorld(BulletWorld world, BulletConstraint constrain);
+ // =====================================================================================
+ // btCollisionObject entries
+ public abstract Vector3 GetAnisotripicFriction(BulletConstraint constrain);
+
+ public abstract Vector3 SetAnisotripicFriction(BulletConstraint constrain, Vector3 frict);
+
+ public abstract bool HasAnisotripicFriction(BulletConstraint constrain);
+
+ public abstract void SetContactProcessingThreshold(BulletBody obj, float val);
+
+ public abstract float GetContactProcessingThreshold(BulletBody obj);
+
+ public abstract bool IsStaticObject(BulletBody obj);
+
+ public abstract bool IsKinematicObject(BulletBody obj);
+
+ public abstract bool IsStaticOrKinematicObject(BulletBody obj);
+
+ public abstract bool HasContactResponse(BulletBody obj);
+
+ public abstract void SetCollisionShape(BulletWorld sim, BulletBody obj, BulletShape shape);
+
+ public abstract BulletShape GetCollisionShape(BulletBody obj);
+
+ public abstract int GetActivationState(BulletBody obj);
+
+ public abstract void SetActivationState(BulletBody obj, int state);
+
+ public abstract void SetDeactivationTime(BulletBody obj, float dtime);
+
+ public abstract float GetDeactivationTime(BulletBody obj);
+
+ public abstract void ForceActivationState(BulletBody obj, ActivationState state);
+
+ public abstract void Activate(BulletBody obj, bool forceActivation);
+
+ public abstract bool IsActive(BulletBody obj);
+
+ public abstract void SetRestitution(BulletBody obj, float val);
+
+ public abstract float GetRestitution(BulletBody obj);
+
+ public abstract void SetFriction(BulletBody obj, float val);
+
+ public abstract float GetFriction(BulletBody obj);
+
+ public abstract Vector3 GetPosition(BulletBody obj);
+
+ public abstract Quaternion GetOrientation(BulletBody obj);
+
+ public abstract void SetTranslation(BulletBody obj, Vector3 position, Quaternion rotation);
+
+ // public abstract IntPtr GetBroadphaseHandle(BulletBody obj);
+
+ // public abstract void SetBroadphaseHandle(BulletBody obj, IntPtr handle);
+
+ public abstract void SetInterpolationLinearVelocity(BulletBody obj, Vector3 vel);
+
+ public abstract void SetInterpolationAngularVelocity(BulletBody obj, Vector3 vel);
+
+ public abstract void SetInterpolationVelocity(BulletBody obj, Vector3 linearVel, Vector3 angularVel);
+
+ public abstract float GetHitFraction(BulletBody obj);
+
+ public abstract void SetHitFraction(BulletBody obj, float val);
+
+ public abstract CollisionFlags GetCollisionFlags(BulletBody obj);
+
+ public abstract CollisionFlags SetCollisionFlags(BulletBody obj, CollisionFlags flags);
+
+ public abstract CollisionFlags AddToCollisionFlags(BulletBody obj, CollisionFlags flags);
+
+ public abstract CollisionFlags RemoveFromCollisionFlags(BulletBody obj, CollisionFlags flags);
+
+ public abstract float GetCcdMotionThreshold(BulletBody obj);
+
+ public abstract void SetCcdMotionThreshold(BulletBody obj, float val);
+
+ public abstract float GetCcdSweptSphereRadius(BulletBody obj);
+
+ public abstract void SetCcdSweptSphereRadius(BulletBody obj, float val);
+
+ public abstract IntPtr GetUserPointer(BulletBody obj);
+
+ public abstract void SetUserPointer(BulletBody obj, IntPtr val);
+
+ // =====================================================================================
+ // btRigidBody entries
+ public abstract void ApplyGravity(BulletBody obj);
+
+ public abstract void SetGravity(BulletBody obj, Vector3 val);
+
+ public abstract Vector3 GetGravity(BulletBody obj);
+
+ public abstract void SetDamping(BulletBody obj, float lin_damping, float ang_damping);
+
+ public abstract void SetLinearDamping(BulletBody obj, float lin_damping);
+
+ public abstract void SetAngularDamping(BulletBody obj, float ang_damping);
+
+ public abstract float GetLinearDamping(BulletBody obj);
+
+ public abstract float GetAngularDamping(BulletBody obj);
+
+ public abstract float GetLinearSleepingThreshold(BulletBody obj);
+
+ public abstract void ApplyDamping(BulletBody obj, float timeStep);
+
+ public abstract void SetMassProps(BulletBody obj, float mass, Vector3 inertia);
+
+ public abstract Vector3 GetLinearFactor(BulletBody obj);
+
+ public abstract void SetLinearFactor(BulletBody obj, Vector3 factor);
+
+ public abstract void SetCenterOfMassByPosRot(BulletBody obj, Vector3 pos, Quaternion rot);
+
+ // Add a force to the object as if its mass is one.
+ public abstract void ApplyCentralForce(BulletBody obj, Vector3 force);
+
+ // Set the force being applied to the object as if its mass is one.
+ public abstract void SetObjectForce(BulletBody obj, Vector3 force);
+
+ public abstract Vector3 GetTotalForce(BulletBody obj);
+
+ public abstract Vector3 GetTotalTorque(BulletBody obj);
+
+ public abstract Vector3 GetInvInertiaDiagLocal(BulletBody obj);
+
+ public abstract void SetInvInertiaDiagLocal(BulletBody obj, Vector3 inert);
+
+ public abstract void SetSleepingThresholds(BulletBody obj, float lin_threshold, float ang_threshold);
+
+ public abstract void ApplyTorque(BulletBody obj, Vector3 torque);
+
+ // Apply force at the given point. Will add torque to the object.
+ public abstract void ApplyForce(BulletBody obj, Vector3 force, Vector3 pos);
+
+ // Apply impulse to the object. Same as "ApplycentralForce" but force scaled by object's mass.
+ public abstract void ApplyCentralImpulse(BulletBody obj, Vector3 imp);
+
+ // Apply impulse to the object's torque. Force is scaled by object's mass.
+ public abstract void ApplyTorqueImpulse(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 ApplyImpulse(BulletBody obj, Vector3 imp, Vector3 pos);
+
+ public abstract void ClearForces(BulletBody obj);
+
+ public abstract void ClearAllForces(BulletBody obj);
+
+ public abstract void UpdateInertiaTensor(BulletBody obj);
+
+ public abstract Vector3 GetLinearVelocity(BulletBody obj);
+
+ public abstract Vector3 GetAngularVelocity(BulletBody obj);
+
+ public abstract void SetLinearVelocity(BulletBody obj, Vector3 val);
+
+ public abstract void SetAngularVelocity(BulletBody obj, Vector3 angularVelocity);
+
+ public abstract Vector3 GetVelocityInLocalPoint(BulletBody obj, Vector3 pos);
+
+ public abstract void Translate(BulletBody obj, Vector3 trans);
+
+ public abstract void UpdateDeactivation(BulletBody obj, float timeStep);
+
+ public abstract bool WantsSleeping(BulletBody obj);
+
+ public abstract void SetAngularFactor(BulletBody obj, float factor);
+
+ public abstract void SetAngularFactorV(BulletBody obj, Vector3 factor);
+
+ public abstract Vector3 GetAngularFactor(BulletBody obj);
+
+ public abstract bool IsInWorld(BulletWorld world, BulletBody obj);
+
+ public abstract void AddConstraintRef(BulletBody obj, BulletConstraint constrain);
+
+ public abstract void RemoveConstraintRef(BulletBody obj, BulletConstraint constrain);
+
+ public abstract BulletConstraint GetConstraintRef(BulletBody obj, int index);
+
+ public abstract int GetNumConstraintRefs(BulletBody obj);
+
+ public abstract bool SetCollisionGroupMask(BulletBody body, UInt32 filter, UInt32 mask);
+
+ // =====================================================================================
+ // btCollisionShape entries
+
+ public abstract float GetAngularMotionDisc(BulletShape shape);
+
+ public abstract float GetContactBreakingThreshold(BulletShape shape, float defaultFactor);
+
+ public abstract bool IsPolyhedral(BulletShape shape);
+
+ public abstract bool IsConvex2d(BulletShape shape);
+
+ public abstract bool IsConvex(BulletShape shape);
+
+ public abstract bool IsNonMoving(BulletShape shape);
+
+ public abstract bool IsConcave(BulletShape shape);
+
+ public abstract bool IsCompound(BulletShape shape);
+
+ public abstract bool IsSoftBody(BulletShape shape);
+
+ public abstract bool IsInfinite(BulletShape shape);
+
+ public abstract void SetLocalScaling(BulletShape shape, Vector3 scale);
+
+ public abstract Vector3 GetLocalScaling(BulletShape shape);
+
+ public abstract Vector3 CalculateLocalInertia(BulletShape shape, float mass);
+
+ public abstract int GetShapeType(BulletShape shape);
+
+ public abstract void SetMargin(BulletShape shape, float val);
+
+ public abstract float GetMargin(BulletShape shape);
+
+ // =====================================================================================
+ // Raycast
+ public abstract SweepHit ConvexSweepTest2(BulletWorld world, BulletBody obj, Vector3 from, Vector3 to, float margin);
+
+ public abstract RaycastHit RayTest2(BulletWorld world, Vector3 from, Vector3 to, uint filterGroup, uint filterMask);
+
+ // =====================================================================================
+ // Debugging
+ public virtual void DumpRigidBody(BulletWorld sim, BulletBody collisionObject) { }
+
+ public virtual void DumpCollisionShape(BulletWorld sim, BulletShape collisionShape) { }
+
+ public virtual void DumpConstraint(BulletWorld sim, BulletConstraint constrain) { }
+
+ public virtual void DumpActivationInfo(BulletWorld sim) { }
+
+ public virtual void DumpAllInfo(BulletWorld sim) { }
+
+ public virtual void DumpPhysicsStatistics(BulletWorld sim) { }
+
+ public virtual void ResetBroadphasePool(BulletWorld sim) { }
+
+ public virtual void ResetConstraintSolver(BulletWorld sim) { }
+ };
}
diff --git a/OpenSim/Region/PhysicsModules/BulletS/BSCharacter.cs b/OpenSim/Region/PhysicsModules/BulletS/BSCharacter.cs
index f971e59166..2fc95e34fc 100755
--- a/OpenSim/Region/PhysicsModules/BulletS/BSCharacter.cs
+++ b/OpenSim/Region/PhysicsModules/BulletS/BSCharacter.cs
@@ -34,830 +34,852 @@ using OpenSim.Region.PhysicsModules.SharedBase;
namespace OpenSim.Region.PhysicsModule.BulletS
{
-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 bool _grabbed;
- private bool _selected;
- private float _mass;
- private float _avatarVolume;
- private float _collisionScore;
- private OMV.Vector3 _acceleration;
- private int _physicsActorType;
- private bool _isPhysical;
- private bool _flying;
- private bool _setAlwaysRun;
- private bool _throttleUpdates;
- private bool _floatOnWater;
- private bool _kinematic;
- private float _buoyancy;
-
- private OMV.Vector3 _size;
- private float _footOffset;
-
- private BSActorAvatarMove m_moveActor;
- private const string AvatarMoveActorName = "BSCharacter.AvatarMove";
-
- private OMV.Vector3 _PIDTarget;
- private float _PIDTau;
-
-// public override OMV.Vector3 RawVelocity
-// { get { return base.RawVelocity; }
-// set {
-// if (value != base.RawVelocity)
-// Util.PrintCallStack();
-// Console.WriteLine("Set rawvel to {0}", value);
-// base.RawVelocity = value; }
-// }
-
- // Avatars are always complete (in the physics engine sense)
- public override bool IsIncomplete { get { return false; } }
-
- public BSCharacter(
- uint localID, String avName, BSScene parent_scene, OMV.Vector3 pos, OMV.Vector3 vel, OMV.Vector3 size, float footOffset, bool isFlying)
-
- : base(parent_scene, localID, avName, "BSCharacter")
+ public sealed class BSCharacter : BSPhysObject
{
- _physicsActorType = (int)ActorTypes.Agent;
- RawPosition = pos;
+ private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
+ private static readonly string LogHeader = "[BULLETS CHAR]";
- _flying = isFlying;
- RawOrientation = OMV.Quaternion.Identity;
- RawVelocity = vel;
- _buoyancy = ComputeBuoyancyFromFlying(isFlying);
- Friction = BSParam.AvatarStandingFriction;
- Density = BSParam.AvatarDensity;
- _isPhysical = true;
+ // private bool _stopped;
+ private bool _grabbed;
+ private bool _selected;
+ private float _mass;
+ private float _avatarVolume;
+ private float _collisionScore;
+ private OMV.Vector3 _acceleration;
+ private int _physicsActorType;
+ private bool _isPhysical;
+ private bool _flying;
+ private bool _setAlwaysRun;
+ private bool _throttleUpdates;
+ private bool _floatOnWater;
+ private bool _kinematic;
+ private float _buoyancy;
- _footOffset = footOffset;
- // Adjustments for zero X and Y made in Size()
- // This also computes avatar scale, volume, and mass
- SetAvatarSize(size, footOffset, true /* initializing */);
+ private OMV.Vector3 _size;
+ private float _footOffset;
- DetailLog(
- "{0},BSCharacter.create,call,size={1},scale={2},density={3},volume={4},mass={5},pos={6},vel={7}",
- LocalID, Size, Scale, Density, _avatarVolume, RawMass, pos, vel);
+ private BSActorAvatarMove m_moveActor;
+ private const string AvatarMoveActorName = "BSCharacter.AvatarMove";
- // do actual creation in taint time
- PhysScene.TaintedObject(LocalID, "BSCharacter.create", delegate()
+ private OMV.Vector3 _PIDTarget;
+ private float _PIDTau;
+
+ // public override OMV.Vector3 RawVelocity
+ // { get { return base.RawVelocity; }
+ // set {
+ // if (value != base.RawVelocity)
+ // Util.PrintCallStack();
+ // Console.WriteLine("Set rawvel to {0}", value);
+ // base.RawVelocity = value; }
+ // }
+
+ // Avatars are always complete (in the physics engine sense)
+ public override bool IsIncomplete { get { return false; } }
+
+ public BSCharacter(
+ uint localID, String avName, BSScene parent_scene, OMV.Vector3 pos, OMV.Vector3 vel, OMV.Vector3 size, float footOffset, bool isFlying)
+
+ : base(parent_scene, localID, avName, "BSCharacter")
{
- DetailLog("{0},BSCharacter.create,taint", LocalID);
-
- // New body and shape into PhysBody and PhysShape
- PhysScene.Shapes.GetBodyAndShape(true, PhysScene.World, this);
-
- // The avatar's movement is controlled by this motor that speeds up and slows down
- // the avatar seeking to reach the motor's target speed.
- // This motor runs as a prestep action for the avatar so it will keep the avatar
- // standing as well as moving. Destruction of the avatar will destroy the pre-step action.
- m_moveActor = new BSActorAvatarMove(PhysScene, this, AvatarMoveActorName);
- PhysicalActors.Add(AvatarMoveActorName, m_moveActor);
-
- SetPhysicalProperties();
-
- IsInitialized = true;
- });
- return;
- }
-
- // called when this character is being destroyed and the resources should be released
- public override void Destroy()
- {
- IsInitialized = false;
-
- base.Destroy();
-
- DetailLog("{0},BSCharacter.Destroy", LocalID);
- PhysScene.TaintedObject(LocalID, "BSCharacter.destroy", delegate()
- {
- PhysScene.Shapes.DereferenceBody(PhysBody, null /* bodyCallback */);
- PhysBody.Clear();
- PhysShape.Dereference(PhysScene);
- PhysShape = new BSShapeNull();
- });
- }
-
- private void SetPhysicalProperties()
- {
- PhysScene.PE.RemoveObjectFromWorld(PhysScene.World, PhysBody);
-
- ForcePosition = RawPosition;
-
- // Set the velocity
- if (m_moveActor != null)
- m_moveActor.SetVelocityAndTarget(RawVelocity, RawVelocity, false);
-
- ForceVelocity = RawVelocity;
- TargetVelocity = RawVelocity;
-
- // 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;
-
- PhysScene.PE.SetRestitution(PhysBody, BSParam.AvatarRestitution);
- PhysScene.PE.SetMargin(PhysShape.physShapeInfo, PhysScene.Params.collisionMargin);
- PhysScene.PE.SetLocalScaling(PhysShape.physShapeInfo, Scale);
- PhysScene.PE.SetContactProcessingThreshold(PhysBody, BSParam.ContactProcessingThreshold);
- if (BSParam.CcdMotionThreshold > 0f)
- {
- PhysScene.PE.SetCcdMotionThreshold(PhysBody, BSParam.CcdMotionThreshold);
- PhysScene.PE.SetCcdSweptSphereRadius(PhysBody, BSParam.CcdSweptSphereRadius);
- }
-
- UpdatePhysicalMassProperties(RawMass, false);
-
- // Make so capsule does not fall over
- PhysScene.PE.SetAngularFactorV(PhysBody, OMV.Vector3.Zero);
-
- // The avatar mover sets some parameters.
- PhysicalActors.Refresh();
-
- PhysScene.PE.AddToCollisionFlags(PhysBody, CollisionFlags.CF_CHARACTER_OBJECT);
-
- PhysScene.PE.AddObjectToWorld(PhysScene.World, PhysBody);
-
- // PhysicsScene.PE.ForceActivationState(PhysBody, ActivationState.ACTIVE_TAG);
- PhysScene.PE.ForceActivationState(PhysBody, ActivationState.DISABLE_DEACTIVATION);
- PhysScene.PE.UpdateSingleAabb(PhysScene.World, PhysBody);
-
- // Do this after the object has been added to the world
- if (BSParam.AvatarToAvatarCollisionsByDefault)
- PhysBody.collisionType = CollisionType.Avatar;
- else
- PhysBody.collisionType = CollisionType.PhantomToOthersAvatar;
-
- PhysBody.ApplyCollisionMask(PhysScene);
- }
-
- 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
- {
- return _size;
- }
-
- set {
- setAvatarSize(value, _footOffset);
- }
- }
-
- // OpenSim 0.9 introduces a common avatar size computation
- public override void setAvatarSize(OMV.Vector3 size, float feetOffset)
- {
- SetAvatarSize(size, feetOffset, false /* initializing */);
- }
-
- // Internal version that, if initializing, doesn't do all the updating of the physics engine
- public void SetAvatarSize(OMV.Vector3 size, float feetOffset, bool initializing)
- {
- OMV.Vector3 newSize = size;
- if (newSize.IsFinite())
- {
- // Old versions of ScenePresence passed only the height. If width and/or depth are zero,
- // replace with the default values.
- if (newSize.X == 0f) newSize.X = BSParam.AvatarCapsuleDepth;
- if (newSize.Y == 0f) newSize.Y = BSParam.AvatarCapsuleWidth;
-
- if (newSize.X < 0.01f) newSize.X = 0.01f;
- if (newSize.Y < 0.01f) newSize.Y = 0.01f;
- if (newSize.Z < 0.01f) newSize.Z = BSParam.AvatarCapsuleHeight;
- }
- else
- {
- newSize = new OMV.Vector3(BSParam.AvatarCapsuleDepth, BSParam.AvatarCapsuleWidth, BSParam.AvatarCapsuleHeight);
- }
-
- // This is how much the avatar size is changing. Positive means getting bigger.
- // The avatar altitude must be adjusted for this change.
- float heightChange = newSize.Z - Size.Z;
-
- _size = newSize;
-
- Scale = ComputeAvatarScale(Size);
- ComputeAvatarVolumeAndMass();
- DetailLog("{0},BSCharacter.setSize,call,size={1},scale={2},density={3},volume={4},mass={5}",
- LocalID, _size, Scale, Density, _avatarVolume, RawMass);
-
- PhysScene.TaintedObject(LocalID, "BSCharacter.setSize", delegate()
- {
- if (PhysBody.HasPhysicalBody && PhysShape.physShapeInfo.HasPhysicalShape)
+ _physicsActorType = (int)ActorTypes.Agent;
+ RawPosition = pos;
+
+ _flying = isFlying;
+ RawOrientation = OMV.Quaternion.Identity;
+ RawVelocity = vel;
+ _buoyancy = ComputeBuoyancyFromFlying(isFlying);
+ Friction = BSParam.AvatarStandingFriction;
+ Density = BSParam.AvatarDensity;
+ _isPhysical = true;
+
+ _footOffset = footOffset;
+ // Adjustments for zero X and Y made in Size()
+ // This also computes avatar scale, volume, and mass
+ SetAvatarSize(size, footOffset, true /* initializing */);
+
+ DetailLog(
+ "{0},BSCharacter.create,call,size={1},scale={2},density={3},volume={4},mass={5},pos={6},vel={7}",
+ LocalID, Size, Scale, Density, _avatarVolume, RawMass, pos, vel);
+
+ // do actual creation in taint time
+ PhysScene.TaintedObject(LocalID, "BSCharacter.create", delegate()
{
- PhysScene.PE.SetLocalScaling(PhysShape.physShapeInfo, Scale);
- UpdatePhysicalMassProperties(RawMass, true);
+ DetailLog("{0},BSCharacter.create,taint", LocalID);
+
+ // New body and shape into PhysBody and PhysShape
+ PhysScene.Shapes.GetBodyAndShape(true, PhysScene.World, this);
+
+ // The avatar's movement is controlled by this motor that speeds up and slows down
+ // the avatar seeking to reach the motor's target speed.
+ // This motor runs as a prestep action for the avatar so it will keep the avatar
+ // standing as well as moving. Destruction of the avatar will destroy the pre-step action.
+ m_moveActor = new BSActorAvatarMove(PhysScene, this, AvatarMoveActorName);
+ PhysicalActors.Add(AvatarMoveActorName, m_moveActor);
+
+ SetPhysicalProperties();
+
+ IsInitialized = true;
+ });
+ return;
+ }
- // Adjust the avatar's position to account for the increase/decrease in size
- ForcePosition = new OMV.Vector3(RawPosition.X, RawPosition.Y, RawPosition.Z + heightChange / 2f);
+ // called when this character is being destroyed and the resources should be released
+ public override void Destroy()
+ {
+ IsInitialized = false;
+
+ base.Destroy();
+
+ DetailLog("{0},BSCharacter.Destroy", LocalID);
+ PhysScene.TaintedObject(LocalID, "BSCharacter.destroy", delegate()
+ {
+ PhysScene.Shapes.DereferenceBody(PhysBody, null /* bodyCallback */);
+ PhysBody.Clear();
+ PhysShape.Dereference(PhysScene);
+ PhysShape = new BSShapeNull();
+ });
+ }
- // Make sure this change appears as a property update event
- PhysScene.PE.PushUpdate(PhysBody);
+ private void SetPhysicalProperties()
+ {
+ PhysScene.PE.RemoveObjectFromWorld(PhysScene.World, PhysBody);
+
+ ForcePosition = RawPosition;
+
+ // Set the velocity
+ if (m_moveActor != null)
+ m_moveActor.SetVelocityAndTarget(RawVelocity, RawVelocity, false);
+
+ ForceVelocity = RawVelocity;
+ TargetVelocity = RawVelocity;
+
+ // 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;
+
+ PhysScene.PE.SetRestitution(PhysBody, BSParam.AvatarRestitution);
+ PhysScene.PE.SetMargin(PhysShape.physShapeInfo, PhysScene.Params.collisionMargin);
+ PhysScene.PE.SetLocalScaling(PhysShape.physShapeInfo, Scale);
+ PhysScene.PE.SetContactProcessingThreshold(PhysBody, BSParam.ContactProcessingThreshold);
+ if (BSParam.CcdMotionThreshold > 0f)
+ {
+ PhysScene.PE.SetCcdMotionThreshold(PhysBody, BSParam.CcdMotionThreshold);
+ PhysScene.PE.SetCcdSweptSphereRadius(PhysBody, BSParam.CcdSweptSphereRadius);
}
- });
- }
+
+ UpdatePhysicalMassProperties(RawMass, false);
+
+ // Make so capsule does not fall over
+ PhysScene.PE.SetAngularFactorV(PhysBody, OMV.Vector3.Zero);
+
+ // The avatar mover sets some parameters.
+ PhysicalActors.Refresh();
+
+ PhysScene.PE.AddToCollisionFlags(PhysBody, CollisionFlags.CF_CHARACTER_OBJECT);
+
+ PhysScene.PE.AddObjectToWorld(PhysScene.World, PhysBody);
+
+ // PhysicsScene.PE.ForceActivationState(PhysBody, ActivationState.ACTIVE_TAG);
+ PhysScene.PE.ForceActivationState(PhysBody, ActivationState.DISABLE_DEACTIVATION);
+ PhysScene.PE.UpdateSingleAabb(PhysScene.World, PhysBody);
+
+ // Do this after the object has been added to the world
+ if (BSParam.AvatarToAvatarCollisionsByDefault)
+ PhysBody.collisionType = CollisionType.Avatar;
+ else
+ PhysBody.collisionType = CollisionType.PhantomToOthersAvatar;
+
+ PhysBody.ApplyCollisionMask(PhysScene);
+ }
+
+ 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
+ {
+ return _size;
+ }
+
+ set {
+ setAvatarSize(value, _footOffset);
+ }
+ }
+
+ // OpenSim 0.9 introduces a common avatar size computation
+ public override void setAvatarSize(OMV.Vector3 size, float feetOffset)
+ {
+ SetAvatarSize(size, feetOffset, false /* initializing */);
+ }
+
+ // Internal version that, if initializing, doesn't do all the updating of the physics engine
+ public void SetAvatarSize(OMV.Vector3 size, float feetOffset, bool initializing)
+ {
+ OMV.Vector3 newSize = size;
+ if (newSize.IsFinite())
+ {
+ // Old versions of ScenePresence passed only the height. If width and/or depth are zero,
+ // replace with the default values.
+ if (newSize.X == 0f) newSize.X = BSParam.AvatarCapsuleDepth;
+ if (newSize.Y == 0f) newSize.Y = BSParam.AvatarCapsuleWidth;
+
+ if (newSize.X < 0.01f) newSize.X = 0.01f;
+ if (newSize.Y < 0.01f) newSize.Y = 0.01f;
+ if (newSize.Z < 0.01f) newSize.Z = BSParam.AvatarCapsuleHeight;
+ }
+ else
+ {
+ newSize = new OMV.Vector3(BSParam.AvatarCapsuleDepth, BSParam.AvatarCapsuleWidth, BSParam.AvatarCapsuleHeight);
+ }
+
+ // This is how much the avatar size is changing. Positive means getting bigger.
+ // The avatar altitude must be adjusted for this change.
+ float heightChange = newSize.Z - Size.Z;
+
+ _size = newSize;
+
+ Scale = ComputeAvatarScale(Size);
+ ComputeAvatarVolumeAndMass();
+ DetailLog("{0},BSCharacter.setSize,call,size={1},scale={2},density={3},volume={4},mass={5}",
+ LocalID, _size, Scale, Density, _avatarVolume, RawMass);
+
+ PhysScene.TaintedObject(LocalID, "BSCharacter.setSize", delegate()
+ {
+ if (PhysBody.HasPhysicalBody && PhysShape.physShapeInfo.HasPhysicalShape)
+ {
+ PhysScene.PE.SetLocalScaling(PhysShape.physShapeInfo, Scale);
+ UpdatePhysicalMassProperties(RawMass, true);
+
+ // Adjust the avatar's position to account for the increase/decrease in size
+ ForcePosition = new OMV.Vector3(RawPosition.X, RawPosition.Y, RawPosition.Z + heightChange / 2f);
+
+ // Make sure this change appears as a property update event
+ PhysScene.PE.PushUpdate(PhysBody);
+ }
+ });
+ }
public override PrimitiveBaseShape Shape
- {
- set { BaseShape = value; }
- }
-
- public override bool Grabbed {
- set { _grabbed = value; }
- }
- public override bool Selected {
- set { _selected = value; }
- }
- public override bool IsSelected
- {
- get { return _selected; }
- }
- 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)
- {
- RawVelocity = OMV.Vector3.Zero;
- _acceleration = OMV.Vector3.Zero;
- RawRotationalVelocity = OMV.Vector3.Zero;
-
- // Zero some other properties directly into the physics engine
- PhysScene.TaintedObject(inTaintTime, LocalID, "BSCharacter.ZeroMotion", delegate()
{
- if (PhysBody.HasPhysicalBody)
- PhysScene.PE.ClearAllForces(PhysBody);
- });
- }
-
- public override void ZeroAngularMotion(bool inTaintTime)
- {
- RawRotationalVelocity = OMV.Vector3.Zero;
-
- PhysScene.TaintedObject(inTaintTime, LocalID, "BSCharacter.ZeroMotion", delegate()
- {
- if (PhysBody.HasPhysicalBody)
- {
- PhysScene.PE.SetInterpolationAngularVelocity(PhysBody, OMV.Vector3.Zero);
- PhysScene.PE.SetAngularVelocity(PhysBody, OMV.Vector3.Zero);
- // The next also get rid of applied linear force but the linear velocity is untouched.
- PhysScene.PE.ClearForces(PhysBody);
- }
- });
- }
-
-
- public override void LockAngularMotion(byte axislocks) { return; }
-
- public override OMV.Vector3 Position {
- get {
- // Don't refetch the position because this function is called a zillion times
- // RawPosition = PhysicsScene.PE.GetObjectPosition(Scene.World, LocalID);
- return RawPosition;
+ set { BaseShape = value; }
}
- set {
- RawPosition = value;
- PhysScene.TaintedObject(LocalID, "BSCharacter.setPosition", delegate()
+ public override bool Grabbed {
+ set { _grabbed = value; }
+ }
+
+ public override bool Selected {
+ set { _selected = value; }
+ }
+
+ public override bool IsSelected
+ {
+ get { return _selected; }
+ }
+
+ 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)
+ {
+ RawVelocity = OMV.Vector3.Zero;
+ _acceleration = OMV.Vector3.Zero;
+ RawRotationalVelocity = OMV.Vector3.Zero;
+
+ // Zero some other properties directly into the physics engine
+ PhysScene.TaintedObject(inTaintTime, LocalID, "BSCharacter.ZeroMotion", delegate()
{
- DetailLog("{0},BSCharacter.SetPosition,taint,pos={1},orient={2}", LocalID, RawPosition, RawOrientation);
- PositionSanityCheck();
- ForcePosition = RawPosition;
+ if (PhysBody.HasPhysicalBody)
+ PhysScene.PE.ClearAllForces(PhysBody);
});
}
- }
- public override OMV.Vector3 ForcePosition {
- get {
- RawPosition = PhysScene.PE.GetPosition(PhysBody);
- return RawPosition;
- }
- set {
- RawPosition = value;
- if (PhysBody.HasPhysicalBody)
+
+ public override void ZeroAngularMotion(bool inTaintTime)
+ {
+ RawRotationalVelocity = OMV.Vector3.Zero;
+
+ PhysScene.TaintedObject(inTaintTime, LocalID, "BSCharacter.ZeroMotion", delegate()
{
- PhysScene.PE.SetTranslation(PhysBody, RawPosition, RawOrientation);
+ if (PhysBody.HasPhysicalBody)
+ {
+ PhysScene.PE.SetInterpolationAngularVelocity(PhysBody, OMV.Vector3.Zero);
+ PhysScene.PE.SetAngularVelocity(PhysBody, OMV.Vector3.Zero);
+ // The next also get rid of applied linear force but the linear velocity is untouched.
+ PhysScene.PE.ClearForces(PhysBody);
+ }
+ });
+ }
+
+ public override void LockAngularMotion(byte axislocks) { return; }
+
+ public override OMV.Vector3 Position {
+ get {
+ // Don't refetch the position because this function is called a zillion times
+ // RawPosition = PhysicsScene.PE.GetObjectPosition(Scene.World, LocalID);
+ return RawPosition;
+ }
+ set {
+ RawPosition = value;
+
+ PhysScene.TaintedObject(LocalID, "BSCharacter.setPosition", delegate()
+ {
+ DetailLog("{0},BSCharacter.SetPosition,taint,pos={1},orient={2}", LocalID, RawPosition, RawOrientation);
+ PositionSanityCheck();
+ ForcePosition = RawPosition;
+ });
}
}
- }
- // 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 (!PhysScene.TerrainManager.IsWithinKnownTerrain(RawPosition))
- {
- // The character is out of the known/simulated area.
- // Force the avatar position to be within known. ScenePresence will use the position
- // plus the velocity to decide if the avatar is moving out of the region.
- RawPosition = PhysScene.TerrainManager.ClampPositionIntoKnownTerrain(RawPosition);
- DetailLog("{0},BSCharacter.PositionSanityCheck,notWithinKnownTerrain,clampedPos={1}", LocalID, RawPosition);
- return true;
+ public override OMV.Vector3 ForcePosition {
+ get {
+ RawPosition = PhysScene.PE.GetPosition(PhysBody);
+ return RawPosition;
+ }
+ set {
+ RawPosition = value;
+ if (PhysBody.HasPhysicalBody)
+ {
+ PhysScene.PE.SetTranslation(PhysBody, RawPosition, RawOrientation);
+ }
+ }
}
- // If below the ground, move the avatar up
- float terrainHeight = PhysScene.TerrainManager.GetTerrainHeightAtXYZ(RawPosition);
- if (Position.Z < terrainHeight)
+ // 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()
{
- DetailLog("{0},BSCharacter.PositionSanityCheck,adjustForUnderGround,pos={1},terrain={2}", LocalID, RawPosition, terrainHeight);
- RawPosition = new OMV.Vector3(RawPosition.X, RawPosition.Y, terrainHeight + BSParam.AvatarBelowGroundUpCorrectionMeters);
- ret = true;
- }
- if ((CurrentCollisionFlags & CollisionFlags.BS_FLOATS_ON_WATER) != 0)
- {
- float waterHeight = PhysScene.TerrainManager.GetWaterLevelAtXYZ(RawPosition);
- if (Position.Z < waterHeight)
+ bool ret = false;
+
+ // TODO: check for out of bounds
+ if (!PhysScene.TerrainManager.IsWithinKnownTerrain(RawPosition))
{
- RawPosition = new OMV.Vector3(RawPosition.X, RawPosition.Y, waterHeight);
+ // The character is out of the known/simulated area.
+ // Force the avatar position to be within known. ScenePresence will use the position
+ // plus the velocity to decide if the avatar is moving out of the region.
+ RawPosition = PhysScene.TerrainManager.ClampPositionIntoKnownTerrain(RawPosition);
+ DetailLog("{0},BSCharacter.PositionSanityCheck,notWithinKnownTerrain,clampedPos={1}", LocalID, RawPosition);
+ return true;
+ }
+
+ // If below the ground, move the avatar up
+ float terrainHeight = PhysScene.TerrainManager.GetTerrainHeightAtXYZ(RawPosition);
+ if (Position.Z < terrainHeight)
+ {
+ DetailLog("{0},BSCharacter.PositionSanityCheck,adjustForUnderGround,pos={1},terrain={2}", LocalID, RawPosition, terrainHeight);
+ RawPosition = new OMV.Vector3(RawPosition.X, RawPosition.Y, terrainHeight + BSParam.AvatarBelowGroundUpCorrectionMeters);
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.
- PhysScene.TaintedObject(inTaintTime, LocalID, "BSCharacter.PositionSanityCheck", delegate()
+ if ((CurrentCollisionFlags & CollisionFlags.BS_FLOATS_ON_WATER) != 0)
{
- DetailLog("{0},BSCharacter.PositionSanityCheck,taint,pos={1},orient={2}", LocalID, RawPosition, RawOrientation);
- ForcePosition = RawPosition;
- });
- 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, bool inWorld)
- {
- OMV.Vector3 localInertia = PhysScene.PE.CalculateLocalInertia(PhysShape.physShapeInfo, physMass);
- PhysScene.PE.SetMassProps(PhysBody, physMass, localInertia);
- }
-
- public override OMV.Vector3 Force {
- get { return RawForce; }
- set {
- RawForce = value;
- // m_log.DebugFormat("{0}: Force = {1}", LogHeader, _force);
- PhysScene.TaintedObject(LocalID, "BSCharacter.SetForce", delegate()
- {
- DetailLog("{0},BSCharacter.setForce,taint,force={1}", LocalID, RawForce);
- if (PhysBody.HasPhysicalBody)
- PhysScene.PE.SetObjectForce(PhysBody, RawForce);
- });
- }
- }
-
- // 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 bool IsVolumeDetect { get { return false; } }
-
- public override OMV.Vector3 GeometricCenter { get { return OMV.Vector3.Zero; } }
- public override OMV.Vector3 CenterOfMass { get { return OMV.Vector3.Zero; } }
-
- // PhysicsActor.TargetVelocity
- // Sets the target in the motor. This starts the changing of the avatar's velocity.
- public override OMV.Vector3 TargetVelocity
- {
- get
- {
- return base.m_targetVelocity;
- }
- set
- {
- DetailLog("{0},BSCharacter.setTargetVelocity,call,vel={1}", LocalID, value);
- OMV.Vector3 targetVel = value;
- if (!_flying)
- {
- if (_setAlwaysRun)
- targetVel *= new OMV.Vector3(BSParam.AvatarAlwaysRunFactor, BSParam.AvatarAlwaysRunFactor, 1f);
- else
- if (BSParam.AvatarWalkVelocityFactor != 1f)
- targetVel *= new OMV.Vector3(BSParam.AvatarWalkVelocityFactor, BSParam.AvatarWalkVelocityFactor, 1f);
+ float waterHeight = PhysScene.TerrainManager.GetWaterLevelAtXYZ(RawPosition);
+ if (Position.Z < waterHeight)
+ {
+ RawPosition = new OMV.Vector3(RawPosition.X, RawPosition.Y, waterHeight);
+ ret = true;
+ }
}
- base.m_targetVelocity = targetVel;
-
- if (m_moveActor != null)
- m_moveActor.SetVelocityAndTarget(RawVelocity, base.m_targetVelocity, false /* inTaintTime */);
+
+ return ret;
}
- }
- // Directly setting velocity means this is what the user really wants now.
- public override OMV.Vector3 Velocity {
- get { return RawVelocity; }
- set {
+
+ // 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.
+ PhysScene.TaintedObject(inTaintTime, LocalID, "BSCharacter.PositionSanityCheck", delegate()
+ {
+ DetailLog("{0},BSCharacter.PositionSanityCheck,taint,pos={1},orient={2}", LocalID, RawPosition, RawOrientation);
+ ForcePosition = RawPosition;
+ });
+ 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, bool inWorld)
+ {
+ OMV.Vector3 localInertia = PhysScene.PE.CalculateLocalInertia(PhysShape.physShapeInfo, physMass);
+ PhysScene.PE.SetMassProps(PhysBody, physMass, localInertia);
+ }
+
+ public override OMV.Vector3 Force {
+ get { return RawForce; }
+ set {
+ RawForce = value;
+ // m_log.DebugFormat("{0}: Force = {1}", LogHeader, _force);
+ PhysScene.TaintedObject(LocalID, "BSCharacter.SetForce", delegate()
+ {
+ DetailLog("{0},BSCharacter.setForce,taint,force={1}", LocalID, RawForce);
+ if (PhysBody.HasPhysicalBody)
+ PhysScene.PE.SetObjectForce(PhysBody, RawForce);
+ });
+ }
+ }
+
+ // 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 bool IsVolumeDetect { get { return false; } }
+
+ public override OMV.Vector3 GeometricCenter { get { return OMV.Vector3.Zero; } }
+ public override OMV.Vector3 CenterOfMass { get { return OMV.Vector3.Zero; } }
+
+ // PhysicsActor.TargetVelocity
+ // Sets the target in the motor. This starts the changing of the avatar's velocity.
+ public override OMV.Vector3 TargetVelocity
+ {
+ get
+ {
+ return base.m_targetVelocity;
+ }
+ set
+ {
+ DetailLog("{0},BSCharacter.setTargetVelocity,call,vel={1}", LocalID, value);
+ OMV.Vector3 targetVel = value;
+ if (!_flying)
+ {
+ if (_setAlwaysRun)
+ targetVel *= new OMV.Vector3(BSParam.AvatarAlwaysRunFactor, BSParam.AvatarAlwaysRunFactor, 1f);
+ else
+ if (BSParam.AvatarWalkVelocityFactor != 1f)
+ targetVel *= new OMV.Vector3(BSParam.AvatarWalkVelocityFactor, BSParam.AvatarWalkVelocityFactor, 1f);
+ }
+ base.m_targetVelocity = targetVel;
+
+ if (m_moveActor != null)
+ m_moveActor.SetVelocityAndTarget(RawVelocity, base.m_targetVelocity, false /* inTaintTime */);
+ }
+ }
+
+ // Directly setting velocity means this is what the user really wants now.
+ public override OMV.Vector3 Velocity {
+ get { return RawVelocity; }
+ set {
+ if (m_moveActor != null)
+ {
+ // m_moveActor.SetVelocityAndTarget(OMV.Vector3.Zero, OMV.Vector3.Zero, false /* inTaintTime */);
+ m_moveActor.SetVelocityAndTarget(RawVelocity, RawVelocity, false /* inTaintTime */);
+ }
+ base.Velocity = value;
+ }
+ }
+
+ // SetMomentum just sets the velocity without a target. We need to stop the movement actor if a character.
+ public override void SetMomentum(OMV.Vector3 momentum)
+ {
if (m_moveActor != null)
{
// m_moveActor.SetVelocityAndTarget(OMV.Vector3.Zero, OMV.Vector3.Zero, false /* inTaintTime */);
m_moveActor.SetVelocityAndTarget(RawVelocity, RawVelocity, false /* inTaintTime */);
}
- base.Velocity = value;
+ base.SetMomentum(momentum);
}
- }
- // SetMomentum just sets the velocity without a target. We need to stop the movement actor if a character.
- public override void SetMomentum(OMV.Vector3 momentum)
- {
- if (m_moveActor != null)
+ public override OMV.Vector3 ForceVelocity {
+ get { return RawVelocity; }
+ set {
+ DetailLog("{0},BSCharacter.ForceVelocity.set={1}", LocalID, value);
+
+ RawVelocity = Util.ClampV(value, BSParam.MaxLinearVelocity);
+ PhysScene.PE.SetLinearVelocity(PhysBody, RawVelocity);
+ PhysScene.PE.Activate(PhysBody, true);
+ }
+ }
+
+ public override OMV.Vector3 Torque {
+ get { return RawTorque; }
+ set { RawTorque = 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 Orientation {
+ get { return RawOrientation; }
+ set {
+ // Orientation is set zillions of times when an avatar is walking. It's like
+ // the viewer doesn't trust us.
+ if (RawOrientation != value)
+ {
+ RawOrientation = value;
+ PhysScene.TaintedObject(LocalID, "BSCharacter.setOrientation", delegate()
+ {
+ // Bullet assumes we know what we are doing when forcing orientation
+ // so it lets us go against all the rules and just compensates for them later.
+ // This forces rotation to be only around the Z axis and doesn't change any of the other axis.
+ // This keeps us from flipping the capsule over which the veiwer does not understand.
+ float oRoll, oPitch, oYaw;
+ RawOrientation.GetEulerAngles(out oRoll, out oPitch, out oYaw);
+ OMV.Quaternion trimmedOrientation = OMV.Quaternion.CreateFromEulers(0f, 0f, oYaw);
+ // DetailLog("{0},BSCharacter.setOrientation,taint,val={1},valDir={2},conv={3},convDir={4}",
+ // LocalID, RawOrientation, OMV.Vector3.UnitX * RawOrientation,
+ // trimmedOrientation, OMV.Vector3.UnitX * trimmedOrientation);
+ ForceOrientation = trimmedOrientation;
+ });
+ }
+ }
+ }
+
+ // Go directly to Bullet to get/set the value.
+ public override OMV.Quaternion ForceOrientation
{
- // m_moveActor.SetVelocityAndTarget(OMV.Vector3.Zero, OMV.Vector3.Zero, false /* inTaintTime */);
- m_moveActor.SetVelocityAndTarget(RawVelocity, RawVelocity, false /* inTaintTime */);
- }
- base.SetMomentum(momentum);
- }
-
- public override OMV.Vector3 ForceVelocity {
- get { return RawVelocity; }
- set {
- DetailLog("{0},BSCharacter.ForceVelocity.set={1}", LocalID, value);
-
- RawVelocity = Util.ClampV(value, BSParam.MaxLinearVelocity);
- PhysScene.PE.SetLinearVelocity(PhysBody, RawVelocity);
- PhysScene.PE.Activate(PhysBody, true);
- }
- }
-
- public override OMV.Vector3 Torque {
- get { return RawTorque; }
- set { RawTorque = 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 Orientation {
- get { return RawOrientation; }
- set {
- // Orientation is set zillions of times when an avatar is walking. It's like
- // the viewer doesn't trust us.
- if (RawOrientation != value)
+ get
+ {
+ RawOrientation = PhysScene.PE.GetOrientation(PhysBody);
+ return RawOrientation;
+ }
+ set
{
RawOrientation = value;
- PhysScene.TaintedObject(LocalID, "BSCharacter.setOrientation", delegate()
+ if (PhysBody.HasPhysicalBody)
{
- // Bullet assumes we know what we are doing when forcing orientation
- // so it lets us go against all the rules and just compensates for them later.
- // This forces rotation to be only around the Z axis and doesn't change any of the other axis.
- // This keeps us from flipping the capsule over which the veiwer does not understand.
- float oRoll, oPitch, oYaw;
- RawOrientation.GetEulerAngles(out oRoll, out oPitch, out oYaw);
- OMV.Quaternion trimmedOrientation = OMV.Quaternion.CreateFromEulers(0f, 0f, oYaw);
- // DetailLog("{0},BSCharacter.setOrientation,taint,val={1},valDir={2},conv={3},convDir={4}",
- // LocalID, RawOrientation, OMV.Vector3.UnitX * RawOrientation,
- // trimmedOrientation, OMV.Vector3.UnitX * trimmedOrientation);
- ForceOrientation = trimmedOrientation;
+ // RawPosition = PhysicsScene.PE.GetPosition(BSBody);
+ PhysScene.PE.SetTranslation(PhysBody, RawPosition, RawOrientation);
+ }
+ }
+ }
+
+ 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 IsPhysicallyActive {
+ get { return true; }
+ }
+
+ 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 FloatOnWater {
+ set {
+ _floatOnWater = value;
+ PhysScene.TaintedObject(LocalID, "BSCharacter.setFloatOnWater", delegate()
+ {
+ if (PhysBody.HasPhysicalBody)
+ {
+ if (_floatOnWater)
+ CurrentCollisionFlags = PhysScene.PE.AddToCollisionFlags(PhysBody, CollisionFlags.BS_FLOATS_ON_WATER);
+ else
+ CurrentCollisionFlags = PhysScene.PE.RemoveFromCollisionFlags(PhysBody, CollisionFlags.BS_FLOATS_ON_WATER);
+ }
});
}
}
- }
- // Go directly to Bullet to get/set the value.
- public override OMV.Quaternion ForceOrientation
- {
- get
- {
- RawOrientation = PhysScene.PE.GetOrientation(PhysBody);
- return RawOrientation;
+
+ public override bool Kinematic {
+ get { return _kinematic; }
+ set { _kinematic = value; }
}
- set
- {
- RawOrientation = value;
- if (PhysBody.HasPhysicalBody)
- {
- // RawPosition = PhysicsScene.PE.GetPosition(BSBody);
- PhysScene.PE.SetTranslation(PhysBody, RawPosition, RawOrientation);
+
+ // neg=fall quickly, 0=1g, 1=0g, pos=float up
+ public override float Buoyancy {
+ get { return _buoyancy; }
+ set { _buoyancy = value;
+ PhysScene.TaintedObject(LocalID, "BSCharacter.setBuoyancy", delegate()
+ {
+ DetailLog("{0},BSCharacter.setBuoyancy,taint,buoy={1}", LocalID, _buoyancy);
+ ForceBuoyancy = _buoyancy;
+ });
}
}
- }
- 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 IsPhysicallyActive {
- get { return true; }
- }
- 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 FloatOnWater {
- set {
- _floatOnWater = value;
- PhysScene.TaintedObject(LocalID, "BSCharacter.setFloatOnWater", delegate()
- {
+ public override float ForceBuoyancy {
+ get { return _buoyancy; }
+ set {
+ _buoyancy = value;
+ DetailLog("{0},BSCharacter.setForceBuoyancy,taint,buoy={1}", LocalID, _buoyancy);
+ // Buoyancy is faked by changing the gravity applied to the object
+ float grav = BSParam.Gravity * (1f - _buoyancy);
+ Gravity = new OMV.Vector3(0f, 0f, grav);
if (PhysBody.HasPhysicalBody)
- {
- if (_floatOnWater)
- CurrentCollisionFlags = PhysScene.PE.AddToCollisionFlags(PhysBody, CollisionFlags.BS_FLOATS_ON_WATER);
- else
- CurrentCollisionFlags = PhysScene.PE.RemoveFromCollisionFlags(PhysBody, CollisionFlags.BS_FLOATS_ON_WATER);
- }
- });
- }
- }
- 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;
- PhysScene.TaintedObject(LocalID, "BSCharacter.setBuoyancy", delegate()
- {
- DetailLog("{0},BSCharacter.setBuoyancy,taint,buoy={1}", LocalID, _buoyancy);
- ForceBuoyancy = _buoyancy;
- });
- }
- }
- public override float ForceBuoyancy {
- get { return _buoyancy; }
- set {
- _buoyancy = value;
- DetailLog("{0},BSCharacter.setForceBuoyancy,taint,buoy={1}", LocalID, _buoyancy);
- // Buoyancy is faked by changing the gravity applied to the object
- float grav = BSParam.Gravity * (1f - _buoyancy);
- Gravity = new OMV.Vector3(0f, 0f, grav);
- if (PhysBody.HasPhysicalBody)
- PhysScene.PE.SetGravity(PhysBody, Gravity);
- }
- }
-
- // Used for MoveTo
- public override OMV.Vector3 PIDTarget {
- set { _PIDTarget = value; }
- }
-
- public override bool PIDActive { get; set; }
-
- public override float PIDTau {
- set { _PIDTau = value; }
- }
-
- public override void AddForce(OMV.Vector3 force, bool pushforce)
- {
- // Since this force is being applied in only one step, make this a force per second.
- OMV.Vector3 addForce = force;
-
- // The interaction of this force with the simulator rate and collision occurance is tricky.
- // ODE multiplies the force by 100
- // ubODE multiplies the force by 5.3
- // BulletSim, after much in-world testing, thinks it gets a similar effect by multiplying mass*0.315f
- // This number could be a feature of friction or timing, but it seems to move avatars the same as ubODE
- addForce *= Mass * BSParam.AvatarAddForcePushFactor;
-
- DetailLog("{0},BSCharacter.addForce,call,force={1},addForce={2},push={3},mass={4}", LocalID, force, addForce, pushforce, Mass);
- AddForce(false, addForce);
- }
-
- public override void AddForce(bool inTaintTime, OMV.Vector3 force) {
- if (force.IsFinite())
- {
- OMV.Vector3 addForce = Util.ClampV(force, BSParam.MaxAddForceMagnitude);
- // DetailLog("{0},BSCharacter.addForce,call,force={1},push={2},inTaint={3}", LocalID, addForce, pushforce, inTaintTime);
-
- PhysScene.TaintedObject(inTaintTime, LocalID, "BSCharacter.AddForce", delegate()
- {
- // Bullet adds this central force to the total force for this tick
- // DetailLog("{0},BSCharacter.addForce,taint,force={1}", LocalID, addForce);
- if (PhysBody.HasPhysicalBody)
- {
- // Bullet adds this central force to the total force for this tick.
- // Deep down in Bullet:
- // linearVelocity += totalForce / mass * timeStep;
- PhysScene.PE.ApplyCentralForce(PhysBody, addForce);
- PhysScene.PE.Activate(PhysBody, true);
- }
- if (m_moveActor != null)
- {
- m_moveActor.SuppressStationayCheckUntilLowVelocity(BSParam.AvatarAddForceFrames);
- }
- });
- }
- else
- {
- m_log.WarnFormat("{0}: Got a NaN force applied to a character. LocalID={1}", LogHeader, LocalID);
- return;
- }
- }
-
- public override void AddAngularForce(bool inTaintTime, OMV.Vector3 force) {
- }
-
- // The avatar's physical shape (whether capsule or cube) is unit sized. BulletSim sets
- // the scale of that unit shape to create the avatars full size.
- private OMV.Vector3 ComputeAvatarScale(OMV.Vector3 size)
- {
- OMV.Vector3 newScale = size;
-
- if (BSParam.AvatarUseBefore09SizeComputation)
- {
-
- // Bullet's capsule total height is the "passed height + radius * 2";
- // The base capsule is 1 unit in diameter and 2 units in height (passed radius=0.5, passed height = 1)
- // The number we pass in for 'scaling' is the multiplier to get that base
- // shape to be the size desired.
- // So, when creating the scale for the avatar height, we take the passed height
- // (size.Z) and remove the caps.
- // An oddity of the Bullet capsule implementation is that it presumes the Y
- // dimension is the radius of the capsule. Even though some of the code allows
- // for a asymmetrical capsule, other parts of the code presume it is cylindrical.
-
- // Scale is multiplier of radius with one of "0.5"
-
- float heightAdjust = BSParam.AvatarHeightMidFudge;
- if (BSParam.AvatarHeightLowFudge != 0f || BSParam.AvatarHeightHighFudge != 0f)
- {
- const float AVATAR_LOW = 1.1f;
- const float AVATAR_MID = 1.775f; // 1.87f
- const float AVATAR_HI = 2.45f;
- // An avatar is between 1.1 and 2.45 meters. Midpoint is 1.775m.
- float midHeightOffset = size.Z - AVATAR_MID;
- if (midHeightOffset < 0f)
- {
- // Small avatar. Add the adjustment based on the distance from midheight
- heightAdjust += ((-1f * midHeightOffset) / (AVATAR_MID - AVATAR_LOW)) * BSParam.AvatarHeightLowFudge;
- }
- else
- {
- // Large avatar. Add the adjustment based on the distance from midheight
- heightAdjust += ((midHeightOffset) / (AVATAR_HI - AVATAR_MID)) * BSParam.AvatarHeightHighFudge;
- }
+ PhysScene.PE.SetGravity(PhysBody, Gravity);
}
- if (BSParam.AvatarShape == BSShapeCollection.AvatarShapeCapsule)
+ }
+
+ // Used for MoveTo
+ public override OMV.Vector3 PIDTarget {
+ set { _PIDTarget = value; }
+ }
+
+ public override bool PIDActive { get; set; }
+
+ public override float PIDTau {
+ set { _PIDTau = value; }
+ }
+
+ public override void AddForce(OMV.Vector3 force, bool pushforce)
+ {
+ // Since this force is being applied in only one step, make this a force per second.
+ OMV.Vector3 addForce = force;
+
+ // The interaction of this force with the simulator rate and collision occurance is tricky.
+ // ODE multiplies the force by 100
+ // ubODE multiplies the force by 5.3
+ // BulletSim, after much in-world testing, thinks it gets a similar effect by multiplying mass*0.315f
+ // This number could be a feature of friction or timing, but it seems to move avatars the same as ubODE
+ addForce *= Mass * BSParam.AvatarAddForcePushFactor;
+
+ DetailLog("{0},BSCharacter.addForce,call,force={1},addForce={2},push={3},mass={4}", LocalID, force, addForce, pushforce, Mass);
+ AddForce(false, addForce);
+ }
+
+ public override void AddForce(bool inTaintTime, OMV.Vector3 force)
+ {
+ if (force.IsFinite())
{
- newScale.X = size.X / 2f;
- newScale.Y = size.Y / 2f;
- // 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) * 2) + heightAdjust) / 2f;
+ OMV.Vector3 addForce = Util.ClampV(force, BSParam.MaxAddForceMagnitude);
+ // DetailLog("{0},BSCharacter.addForce,call,force={1},push={2},inTaint={3}", LocalID, addForce, pushforce, inTaintTime);
+
+ PhysScene.TaintedObject(inTaintTime, LocalID, "BSCharacter.AddForce", delegate()
+ {
+ // Bullet adds this central force to the total force for this tick
+ // DetailLog("{0},BSCharacter.addForce,taint,force={1}", LocalID, addForce);
+ if (PhysBody.HasPhysicalBody)
+ {
+ // Bullet adds this central force to the total force for this tick.
+ // Deep down in Bullet:
+ // linearVelocity += totalForce / mass * timeStep;
+ PhysScene.PE.ApplyCentralForce(PhysBody, addForce);
+ PhysScene.PE.Activate(PhysBody, true);
+ }
+ if (m_moveActor != null)
+ {
+ m_moveActor.SuppressStationayCheckUntilLowVelocity(BSParam.AvatarAddForceFrames);
+ }
+ });
}
else
{
- newScale.Z = size.Z + heightAdjust;
+ m_log.WarnFormat("{0}: Got a NaN force applied to a character. LocalID={1}", LogHeader, LocalID);
+ return;
}
- // m_log.DebugFormat("{0} ComputeAvatarScale: size={1},adj={2},scale={3}", LogHeader, size, heightAdjust, newScale);
-
- // If smaller than the endcaps, just fake like we're almost that small
- if (newScale.Z < 0)
- newScale.Z = 0.1f;
-
- DetailLog("{0},BSCharacter.ComputeAvatarScale,size={1},lowF={2},midF={3},hiF={4},adj={5},newScale={6}",
- LocalID, size, BSParam.AvatarHeightLowFudge, BSParam.AvatarHeightMidFudge, BSParam.AvatarHeightHighFudge, heightAdjust, newScale);
}
- else
+
+ public override void AddAngularForce(bool inTaintTime, OMV.Vector3 force) {
+ }
+
+ // The avatar's physical shape (whether capsule or cube) is unit sized. BulletSim sets
+ // the scale of that unit shape to create the avatars full size.
+ private OMV.Vector3 ComputeAvatarScale(OMV.Vector3 size)
{
- newScale.Z = size.Z + _footOffset;
- DetailLog("{0},BSCharacter.ComputeAvatarScale,using newScale={1}, footOffset={2}", LocalID, newScale, _footOffset);
+ OMV.Vector3 newScale = size;
+
+ if (BSParam.AvatarUseBefore09SizeComputation)
+ {
+
+ // Bullet's capsule total height is the "passed height + radius * 2";
+ // The base capsule is 1 unit in diameter and 2 units in height (passed radius=0.5, passed height = 1)
+ // The number we pass in for 'scaling' is the multiplier to get that base
+ // shape to be the size desired.
+ // So, when creating the scale for the avatar height, we take the passed height
+ // (size.Z) and remove the caps.
+ // An oddity of the Bullet capsule implementation is that it presumes the Y
+ // dimension is the radius of the capsule. Even though some of the code allows
+ // for a asymmetrical capsule, other parts of the code presume it is cylindrical.
+
+ // Scale is multiplier of radius with one of "0.5"
+
+ float heightAdjust = BSParam.AvatarHeightMidFudge;
+ if (BSParam.AvatarHeightLowFudge != 0f || BSParam.AvatarHeightHighFudge != 0f)
+ {
+ const float AVATAR_LOW = 1.1f;
+ const float AVATAR_MID = 1.775f; // 1.87f
+ const float AVATAR_HI = 2.45f;
+ // An avatar is between 1.1 and 2.45 meters. Midpoint is 1.775m.
+ float midHeightOffset = size.Z - AVATAR_MID;
+ if (midHeightOffset < 0f)
+ {
+ // Small avatar. Add the adjustment based on the distance from midheight
+ heightAdjust += ((-1f * midHeightOffset) / (AVATAR_MID - AVATAR_LOW)) * BSParam.AvatarHeightLowFudge;
+ }
+ else
+ {
+ // Large avatar. Add the adjustment based on the distance from midheight
+ heightAdjust += ((midHeightOffset) / (AVATAR_HI - AVATAR_MID)) * BSParam.AvatarHeightHighFudge;
+ }
+ }
+ if (BSParam.AvatarShape == BSShapeCollection.AvatarShapeCapsule)
+ {
+ newScale.X = size.X / 2f;
+ newScale.Y = size.Y / 2f;
+ // 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) * 2) + heightAdjust) / 2f;
+ }
+ else
+ {
+ newScale.Z = size.Z + heightAdjust;
+ }
+ // m_log.DebugFormat("{0} ComputeAvatarScale: size={1},adj={2},scale={3}", LogHeader, size, heightAdjust, newScale);
+
+ // If smaller than the endcaps, just fake like we're almost that small
+ if (newScale.Z < 0)
+ newScale.Z = 0.1f;
+
+ DetailLog("{0},BSCharacter.ComputeAvatarScale,size={1},lowF={2},midF={3},hiF={4},adj={5},newScale={6}",
+ LocalID, size, BSParam.AvatarHeightLowFudge, BSParam.AvatarHeightMidFudge, BSParam.AvatarHeightHighFudge, heightAdjust, newScale);
+ }
+ else
+ {
+ newScale.Z = size.Z + _footOffset;
+ DetailLog("{0},BSCharacter.ComputeAvatarScale,using newScale={1}, footOffset={2}", LocalID, newScale, _footOffset);
+ }
+
+ return newScale;
}
- return newScale;
- }
-
- // set _avatarVolume and _mass based on capsule size, _density and Scale
- private void ComputeAvatarVolumeAndMass()
- {
- if (BSParam.AvatarShape == BSShapeCollection.AvatarShapeCapsule)
+ // set _avatarVolume and _mass based on capsule size, _density and Scale
+ private void ComputeAvatarVolumeAndMass()
{
- _avatarVolume = (float)(
- Math.PI
- * Size.X / 2f
- * Size.Y / 2f // the area of capsule cylinder
- * Size.Z // times height of capsule cylinder
- + 1.33333333f
- * Math.PI
- * Size.X / 2f
- * Math.Min(Size.X, Size.Y) / 2
- * Size.Y / 2f // plus the volume of the capsule end caps
- );
+ if (BSParam.AvatarShape == BSShapeCollection.AvatarShapeCapsule)
+ {
+ _avatarVolume = (float)(
+ Math.PI
+ * Size.X / 2f
+ * Size.Y / 2f // the area of capsule cylinder
+ * Size.Z // times height of capsule cylinder
+ + 1.33333333f
+ * Math.PI
+ * Size.X / 2f
+ * Math.Min(Size.X, Size.Y) / 2
+ * Size.Y / 2f // plus the volume of the capsule end caps
+ );
+ }
+ else
+ {
+ _avatarVolume = Size.X * Size.Y * Size.Z;
+ }
+ _mass = Density * BSParam.DensityScaleFactor * _avatarVolume;
}
- else
+
+ // The physics engine says that properties have updated. Update same and inform
+ // the world that things have changed.
+ public override void UpdateProperties(EntityProperties entprop)
{
- _avatarVolume = Size.X * Size.Y * Size.Z;
+ // Let anyone (like the actors) modify the updated properties before they are pushed into the object and the simulator.
+ TriggerPreUpdatePropertyAction(ref entprop);
+
+ RawPosition = entprop.Position;
+ RawOrientation = entprop.Rotation;
+
+ // Smooth velocity. OpenSimulator is VERY sensitive to changes in velocity of the avatar
+ // and will send agent updates to the clients if velocity changes by more than
+ // 0.001m/s. Bullet introduces a lot of jitter in the velocity which causes many
+ // extra updates.
+ //
+ // XXX: Contrary to the above comment, setting an update threshold here above 0.4 actually introduces jitter to
+ // avatar movement rather than removes it. The larger the threshold, the bigger the jitter.
+ // This is most noticeable in level flight and can be seen with
+ // the "show updates" option in a viewer. With an update threshold, the RawVelocity cycles between a lower
+ // bound and an upper bound, where the difference between the two is enough to trigger a large delta v update
+ // and subsequently trigger an update in ScenePresence.SendTerseUpdateToAllClients(). The cause of this cycle (feedback?)
+ // has not yet been identified.
+ //
+ // If there is a threshold below 0.4 or no threshold check at all (as in ODE), then RawVelocity stays constant and extra
+ // updates are not triggered in ScenePresence.SendTerseUpdateToAllClients().
+ // if (!entprop.Velocity.ApproxEquals(RawVelocity, 0.1f))
+ RawVelocity = entprop.Velocity;
+
+ _acceleration = entprop.Acceleration;
+ RawRotationalVelocity = entprop.RotationalVelocity;
+
+ // Do some sanity checking for the avatar. Make sure it's above ground and inbounds.
+ if (PositionSanityCheck(true))
+ {
+ DetailLog("{0},BSCharacter.UpdateProperties,updatePosForSanity,pos={1}", LocalID, RawPosition);
+ entprop.Position = RawPosition;
+ }
+
+ // remember the current and last set values
+ LastEntityProperties = CurrentEntityProperties;
+ CurrentEntityProperties = entprop;
+
+ // Tell the linkset about value changes
+ // Linkset.UpdateProperties(UpdatedProperties.EntPropUpdates, this);
+
+ // Avatars don't report their changes the usual way. Changes are checked for in the heartbeat loop.
+ // PhysScene.PostUpdate(this);
+
+ DetailLog("{0},BSCharacter.UpdateProperties,call,pos={1},orient={2},vel={3},accel={4},rotVel={5}",
+ LocalID, RawPosition, RawOrientation, RawVelocity, _acceleration, RawRotationalVelocity);
}
- _mass = Density * BSParam.DensityScaleFactor * _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)
- {
- // Let anyone (like the actors) modify the updated properties before they are pushed into the object and the simulator.
- TriggerPreUpdatePropertyAction(ref entprop);
-
- RawPosition = entprop.Position;
- RawOrientation = entprop.Rotation;
-
- // Smooth velocity. OpenSimulator is VERY sensitive to changes in velocity of the avatar
- // and will send agent updates to the clients if velocity changes by more than
- // 0.001m/s. Bullet introduces a lot of jitter in the velocity which causes many
- // extra updates.
- //
- // XXX: Contrary to the above comment, setting an update threshold here above 0.4 actually introduces jitter to
- // avatar movement rather than removes it. The larger the threshold, the bigger the jitter.
- // This is most noticeable in level flight and can be seen with
- // the "show updates" option in a viewer. With an update threshold, the RawVelocity cycles between a lower
- // bound and an upper bound, where the difference between the two is enough to trigger a large delta v update
- // and subsequently trigger an update in ScenePresence.SendTerseUpdateToAllClients(). The cause of this cycle (feedback?)
- // has not yet been identified.
- //
- // If there is a threshold below 0.4 or no threshold check at all (as in ODE), then RawVelocity stays constant and extra
- // updates are not triggered in ScenePresence.SendTerseUpdateToAllClients().
-// if (!entprop.Velocity.ApproxEquals(RawVelocity, 0.1f))
- RawVelocity = entprop.Velocity;
-
- _acceleration = entprop.Acceleration;
- RawRotationalVelocity = entprop.RotationalVelocity;
-
- // Do some sanity checking for the avatar. Make sure it's above ground and inbounds.
- if (PositionSanityCheck(true))
- {
- DetailLog("{0},BSCharacter.UpdateProperties,updatePosForSanity,pos={1}", LocalID, RawPosition);
- entprop.Position = RawPosition;
- }
-
- // remember the current and last set values
- LastEntityProperties = CurrentEntityProperties;
- CurrentEntityProperties = entprop;
-
- // Tell the linkset about value changes
- // Linkset.UpdateProperties(UpdatedProperties.EntPropUpdates, this);
-
- // Avatars don't report their changes the usual way. Changes are checked for in the heartbeat loop.
- // PhysScene.PostUpdate(this);
-
- DetailLog("{0},BSCharacter.UpdateProperties,call,pos={1},orient={2},vel={3},accel={4},rotVel={5}",
- LocalID, RawPosition, RawOrientation, RawVelocity, _acceleration, RawRotationalVelocity);
}
}
-}
diff --git a/OpenSim/Region/PhysicsModules/BulletS/BSConstraint.cs b/OpenSim/Region/PhysicsModules/BulletS/BSConstraint.cs
index e42e868853..9feb1fbb3d 100755
--- a/OpenSim/Region/PhysicsModules/BulletS/BSConstraint.cs
+++ b/OpenSim/Region/PhysicsModules/BulletS/BSConstraint.cs
@@ -31,114 +31,113 @@ using OpenMetaverse;
namespace OpenSim.Region.PhysicsModule.BulletS
{
-
-public abstract class BSConstraint : IDisposable
-{
- private static string LogHeader = "[BULLETSIM CONSTRAINT]";
-
- protected BulletWorld m_world;
- protected BSScene PhysicsScene;
- 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(BulletWorld world)
+ public abstract class BSConstraint : IDisposable
{
- m_world = world;
- PhysicsScene = m_world.physicsScene;
- }
+ private static string LogHeader = "[BULLETSIM CONSTRAINT]";
- public virtual void Dispose()
- {
- if (m_enabled)
+ protected BulletWorld m_world;
+ protected BSScene PhysicsScene;
+ 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(BulletWorld world)
{
- m_enabled = false;
- if (m_constraint.HasPhysicalConstraint)
+ m_world = world;
+ PhysicsScene = m_world.physicsScene;
+ }
+
+ public virtual void Dispose()
+ {
+ if (m_enabled)
{
- bool success = PhysicsScene.PE.DestroyConstraint(m_world, m_constraint);
- m_world.physicsScene.DetailLog("{0},BSConstraint.Dispose,taint,id1={1},body1={2},id2={3},body2={4},success={5}",
- m_body1.ID,
- m_body1.ID, m_body1.AddrString,
- m_body2.ID, m_body2.AddrString,
- success);
- m_constraint.Clear();
+ m_enabled = false;
+ if (m_constraint.HasPhysicalConstraint)
+ {
+ bool success = PhysicsScene.PE.DestroyConstraint(m_world, m_constraint);
+ m_world.physicsScene.DetailLog("{0},BSConstraint.Dispose,taint,id1={1},body1={2},id2={3},body2={4},success={5}",
+ m_body1.ID,
+ m_body1.ID, m_body1.AddrString,
+ m_body2.ID, m_body2.AddrString,
+ success);
+ m_constraint.Clear();
+ }
}
}
- }
- public virtual bool SetLinearLimits(Vector3 low, Vector3 high)
- {
- bool ret = false;
- if (m_enabled)
+ public virtual bool SetLinearLimits(Vector3 low, Vector3 high)
{
- m_world.physicsScene.DetailLog("{0},BSConstraint.SetLinearLimits,taint,low={1},high={2}", m_body1.ID, low, high);
- ret = PhysicsScene.PE.SetLinearLimits(m_constraint, low, high);
- }
- return ret;
- }
-
- public virtual bool SetAngularLimits(Vector3 low, Vector3 high)
- {
- bool ret = false;
- if (m_enabled)
- {
- m_world.physicsScene.DetailLog("{0},BSConstraint.SetAngularLimits,taint,low={1},high={2}", m_body1.ID, low, high);
- ret = PhysicsScene.PE.SetAngularLimits(m_constraint, low, high);
- }
- return ret;
- }
-
- public virtual bool SetSolverIterations(float cnt)
- {
- bool ret = false;
- if (m_enabled)
- {
- PhysicsScene.PE.SetConstraintNumSolverIterations(m_constraint, cnt);
- ret = true;
- }
- return ret;
- }
-
- public virtual bool CalculateTransforms()
- {
- bool ret = false;
- if (m_enabled)
- {
- // Recompute the internal transforms
- PhysicsScene.PE.CalculateTransforms(m_constraint);
- 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)
+ bool ret = false;
+ if (m_enabled)
{
- // 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.
- PhysicsScene.PE.SetConstraintEnable(m_constraint, BSParam.NumericBool(true));
- }
- else
- {
- m_world.physicsScene.Logger.ErrorFormat("{0} CalculateTransforms failed. A={1}, B={2}", LogHeader, Body1.ID, Body2.ID);
+ m_world.physicsScene.DetailLog("{0},BSConstraint.SetLinearLimits,taint,low={1},high={2}", m_body1.ID, low, high);
+ ret = PhysicsScene.PE.SetLinearLimits(m_constraint, low, high);
}
+ return ret;
+ }
+
+ public virtual bool SetAngularLimits(Vector3 low, Vector3 high)
+ {
+ bool ret = false;
+ if (m_enabled)
+ {
+ m_world.physicsScene.DetailLog("{0},BSConstraint.SetAngularLimits,taint,low={1},high={2}", m_body1.ID, low, high);
+ ret = PhysicsScene.PE.SetAngularLimits(m_constraint, low, high);
+ }
+ return ret;
+ }
+
+ public virtual bool SetSolverIterations(float cnt)
+ {
+ bool ret = false;
+ if (m_enabled)
+ {
+ PhysicsScene.PE.SetConstraintNumSolverIterations(m_constraint, cnt);
+ ret = true;
+ }
+ return ret;
+ }
+
+ public virtual bool CalculateTransforms()
+ {
+ bool ret = false;
+ if (m_enabled)
+ {
+ // Recompute the internal transforms
+ PhysicsScene.PE.CalculateTransforms(m_constraint);
+ 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.
+ PhysicsScene.PE.SetConstraintEnable(m_constraint, BSParam.NumericBool(true));
+ }
+ else
+ {
+ m_world.physicsScene.Logger.ErrorFormat("{0} CalculateTransforms failed. A={1}, B={2}", LogHeader, Body1.ID, Body2.ID);
+ }
+ }
+ return ret;
}
- return ret;
}
}
-}
diff --git a/OpenSim/Region/PhysicsModules/BulletS/BSConstraint6Dof.cs b/OpenSim/Region/PhysicsModules/BulletS/BSConstraint6Dof.cs
index 4bcde2bb27..c1603b0a42 100755
--- a/OpenSim/Region/PhysicsModules/BulletS/BSConstraint6Dof.cs
+++ b/OpenSim/Region/PhysicsModules/BulletS/BSConstraint6Dof.cs
@@ -31,150 +31,149 @@ using OpenMetaverse;
namespace OpenSim.Region.PhysicsModule.BulletS
{
-
-public class BSConstraint6Dof : BSConstraint
-{
- private static string LogHeader = "[BULLETSIM 6DOF CONSTRAINT]";
-
- public override ConstraintType Type { get { return ConstraintType.D6_CONSTRAINT_TYPE; } }
-
- public BSConstraint6Dof(BulletWorld world, BulletBody obj1, BulletBody obj2) :base(world)
+ public class BSConstraint6Dof : BSConstraint
{
- m_body1 = obj1;
- m_body2 = obj2;
- m_enabled = false;
- }
+ private static string LogHeader = "[BULLETSIM 6DOF CONSTRAINT]";
- // Create a btGeneric6DofConstraint
- public BSConstraint6Dof(BulletWorld world, BulletBody obj1, BulletBody obj2,
- Vector3 frame1, Quaternion frame1rot,
- Vector3 frame2, Quaternion frame2rot,
- bool useLinearReferenceFrameA, bool disableCollisionsBetweenLinkedBodies)
- : base(world)
- {
- m_body1 = obj1;
- m_body2 = obj2;
- m_constraint = PhysicsScene.PE.Create6DofConstraint(m_world, m_body1, m_body2,
- frame1, frame1rot,
- frame2, frame2rot,
- useLinearReferenceFrameA, disableCollisionsBetweenLinkedBodies);
- m_enabled = true;
- PhysicsScene.DetailLog("{0},BS6DofConstraint,create,wID={1}, rID={2}, rBody={3}, cID={4}, cBody={5}",
- m_body1.ID, world.worldID,
- obj1.ID, obj1.AddrString, obj2.ID, obj2.AddrString);
- PhysicsScene.DetailLog("{0},BS6DofConstraint,create, f1Loc={1},f1Rot={2},f2Loc={3},f2Rot={4},usefA={5},disCol={6}",
- m_body1.ID, frame1, frame1rot, frame2, frame2rot, useLinearReferenceFrameA, disableCollisionsBetweenLinkedBodies);
- }
+ public override ConstraintType Type { get { return ConstraintType.D6_CONSTRAINT_TYPE; } }
- // 6 Dof constraint based on a midpoint between the two constrained bodies
- public BSConstraint6Dof(BulletWorld world, BulletBody obj1, BulletBody obj2,
- Vector3 joinPoint,
- bool useLinearReferenceFrameA, bool disableCollisionsBetweenLinkedBodies)
- : base(world)
- {
- m_body1 = obj1;
- m_body2 = obj2;
- if (!obj1.HasPhysicalBody || !obj2.HasPhysicalBody)
+ public BSConstraint6Dof(BulletWorld world, BulletBody obj1, BulletBody obj2) :base(world)
{
- world.physicsScene.DetailLog("{0},BS6DOFConstraint,badBodyPtr,wID={1}, rID={2}, rBody={3}, cID={4}, cBody={5}",
- BSScene.DetailLogZero, world.worldID,
- obj1.ID, obj1.AddrString, obj2.ID, obj2.AddrString);
- 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.AddrString, obj2.ID, obj2.AddrString);
+ m_body1 = obj1;
+ m_body2 = obj2;
m_enabled = false;
}
- else
+
+ // Create a btGeneric6DofConstraint
+ public BSConstraint6Dof(BulletWorld world, BulletBody obj1, BulletBody obj2,
+ Vector3 frame1, Quaternion frame1rot,
+ Vector3 frame2, Quaternion frame2rot,
+ bool useLinearReferenceFrameA, bool disableCollisionsBetweenLinkedBodies)
+ : base(world)
{
- m_constraint = PhysicsScene.PE.Create6DofConstraintToPoint(m_world, m_body1, m_body2,
- joinPoint,
+ m_body1 = obj1;
+ m_body2 = obj2;
+ m_constraint = PhysicsScene.PE.Create6DofConstraint(m_world, m_body1, m_body2,
+ frame1, frame1rot,
+ frame2, frame2rot,
useLinearReferenceFrameA, disableCollisionsBetweenLinkedBodies);
-
- PhysicsScene.DetailLog("{0},BS6DofConstraint,createMidPoint,wID={1}, csrt={2}, rID={3}, rBody={4}, cID={5}, cBody={6}",
- m_body1.ID, world.worldID, m_constraint.AddrString,
+ m_enabled = true;
+ PhysicsScene.DetailLog("{0},BS6DofConstraint,create,wID={1}, rID={2}, rBody={3}, cID={4}, cBody={5}",
+ m_body1.ID, world.worldID,
obj1.ID, obj1.AddrString, obj2.ID, obj2.AddrString);
+ PhysicsScene.DetailLog("{0},BS6DofConstraint,create, f1Loc={1},f1Rot={2},f2Loc={3},f2Rot={4},usefA={5},disCol={6}",
+ m_body1.ID, frame1, frame1rot, frame2, frame2rot, useLinearReferenceFrameA, disableCollisionsBetweenLinkedBodies);
+ }
- if (!m_constraint.HasPhysicalConstraint)
+ // 6 Dof constraint based on a midpoint between the two constrained bodies
+ public BSConstraint6Dof(BulletWorld world, BulletBody obj1, BulletBody obj2,
+ Vector3 joinPoint,
+ bool useLinearReferenceFrameA, bool disableCollisionsBetweenLinkedBodies)
+ : base(world)
+ {
+ m_body1 = obj1;
+ m_body2 = obj2;
+ if (!obj1.HasPhysicalBody || !obj2.HasPhysicalBody)
{
- world.physicsScene.Logger.ErrorFormat("{0} Failed creation of 6Dof constraint. rootID={1}, childID={2}",
- LogHeader, obj1.ID, obj2.ID);
+ world.physicsScene.DetailLog("{0},BS6DOFConstraint,badBodyPtr,wID={1}, rID={2}, rBody={3}, cID={4}, cBody={5}",
+ BSScene.DetailLogZero, world.worldID,
+ obj1.ID, obj1.AddrString, obj2.ID, obj2.AddrString);
+ 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.AddrString, obj2.ID, obj2.AddrString);
m_enabled = false;
}
else
{
- m_enabled = true;
+ m_constraint = PhysicsScene.PE.Create6DofConstraintToPoint(m_world, m_body1, m_body2,
+ joinPoint,
+ useLinearReferenceFrameA, disableCollisionsBetweenLinkedBodies);
+
+ PhysicsScene.DetailLog("{0},BS6DofConstraint,createMidPoint,wID={1}, csrt={2}, rID={3}, rBody={4}, cID={5}, cBody={6}",
+ m_body1.ID, world.worldID, m_constraint.AddrString,
+ obj1.ID, obj1.AddrString, obj2.ID, obj2.AddrString);
+
+ 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;
+ }
}
}
- }
- // A 6 Dof constraint that is fixed in the world and constrained to a on-the-fly created static object
- public BSConstraint6Dof(BulletWorld world, BulletBody obj1, Vector3 frameInBloc, Quaternion frameInBrot,
- bool useLinearReferenceFrameB, bool disableCollisionsBetweenLinkedBodies)
- : base(world)
- {
- m_body1 = obj1;
- m_body2 = obj1; // Look out for confusion down the road
- m_constraint = PhysicsScene.PE.Create6DofConstraintFixed(m_world, m_body1,
- frameInBloc, frameInBrot,
- useLinearReferenceFrameB, disableCollisionsBetweenLinkedBodies);
- m_enabled = true;
- PhysicsScene.DetailLog("{0},BS6DofConstraint,createFixed,wID={1},rID={2},rBody={3}",
- m_body1.ID, world.worldID, obj1.ID, obj1.AddrString);
- PhysicsScene.DetailLog("{0},BS6DofConstraint,createFixed, fBLoc={1},fBRot={2},usefA={3},disCol={4}",
- m_body1.ID, frameInBloc, frameInBrot, useLinearReferenceFrameB, disableCollisionsBetweenLinkedBodies);
- }
-
- public bool SetFrames(Vector3 frameA, Quaternion frameArot, Vector3 frameB, Quaternion frameBrot)
- {
- bool ret = false;
- if (m_enabled)
+ // A 6 Dof constraint that is fixed in the world and constrained to a on-the-fly created static object
+ public BSConstraint6Dof(BulletWorld world, BulletBody obj1, Vector3 frameInBloc, Quaternion frameInBrot,
+ bool useLinearReferenceFrameB, bool disableCollisionsBetweenLinkedBodies)
+ : base(world)
{
- PhysicsScene.PE.SetFrames(m_constraint, frameA, frameArot, frameB, frameBrot);
- ret = true;
+ m_body1 = obj1;
+ m_body2 = obj1; // Look out for confusion down the road
+ m_constraint = PhysicsScene.PE.Create6DofConstraintFixed(m_world, m_body1,
+ frameInBloc, frameInBrot,
+ useLinearReferenceFrameB, disableCollisionsBetweenLinkedBodies);
+ m_enabled = true;
+ PhysicsScene.DetailLog("{0},BS6DofConstraint,createFixed,wID={1},rID={2},rBody={3}",
+ m_body1.ID, world.worldID, obj1.ID, obj1.AddrString);
+ PhysicsScene.DetailLog("{0},BS6DofConstraint,createFixed, fBLoc={1},fBRot={2},usefA={3},disCol={4}",
+ m_body1.ID, frameInBloc, frameInBrot, useLinearReferenceFrameB, disableCollisionsBetweenLinkedBodies);
}
- return ret;
- }
- public bool SetCFMAndERP(float cfm, float erp)
- {
- bool ret = false;
- if (m_enabled)
+ public bool SetFrames(Vector3 frameA, Quaternion frameArot, Vector3 frameB, Quaternion frameBrot)
{
- PhysicsScene.PE.SetConstraintParam(m_constraint, ConstraintParams.BT_CONSTRAINT_STOP_CFM, cfm, ConstraintParamAxis.AXIS_ALL);
- PhysicsScene.PE.SetConstraintParam(m_constraint, ConstraintParams.BT_CONSTRAINT_STOP_ERP, erp, ConstraintParamAxis.AXIS_ALL);
- PhysicsScene.PE.SetConstraintParam(m_constraint, ConstraintParams.BT_CONSTRAINT_CFM, cfm, ConstraintParamAxis.AXIS_ALL);
- ret = true;
+ bool ret = false;
+ if (m_enabled)
+ {
+ PhysicsScene.PE.SetFrames(m_constraint, frameA, frameArot, frameB, frameBrot);
+ ret = true;
+ }
+ return ret;
}
- return ret;
- }
- public bool UseFrameOffset(bool useOffset)
- {
- bool ret = false;
- float onOff = useOffset ? ConfigurationParameters.numericTrue : ConfigurationParameters.numericFalse;
- if (m_enabled)
- ret = PhysicsScene.PE.UseFrameOffset(m_constraint, 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)
+ public bool SetCFMAndERP(float cfm, float erp)
{
- ret = PhysicsScene.PE.TranslationalLimitMotor(m_constraint, onOff, targetVelocity, maxMotorForce);
- m_world.physicsScene.DetailLog("{0},BS6DOFConstraint,TransLimitMotor,enable={1},vel={2},maxForce={3}",
- BSScene.DetailLogZero, enable, targetVelocity, maxMotorForce);
+ bool ret = false;
+ if (m_enabled)
+ {
+ PhysicsScene.PE.SetConstraintParam(m_constraint, ConstraintParams.BT_CONSTRAINT_STOP_CFM, cfm, ConstraintParamAxis.AXIS_ALL);
+ PhysicsScene.PE.SetConstraintParam(m_constraint, ConstraintParams.BT_CONSTRAINT_STOP_ERP, erp, ConstraintParamAxis.AXIS_ALL);
+ PhysicsScene.PE.SetConstraintParam(m_constraint, ConstraintParams.BT_CONSTRAINT_CFM, cfm, ConstraintParamAxis.AXIS_ALL);
+ ret = true;
+ }
+ return ret;
}
- return ret;
- }
- public bool SetBreakingImpulseThreshold(float threshold)
- {
- bool ret = false;
- if (m_enabled)
- ret = PhysicsScene.PE.SetBreakingImpulseThreshold(m_constraint, threshold);
- return ret;
+ public bool UseFrameOffset(bool useOffset)
+ {
+ bool ret = false;
+ float onOff = useOffset ? ConfigurationParameters.numericTrue : ConfigurationParameters.numericFalse;
+ if (m_enabled)
+ ret = PhysicsScene.PE.UseFrameOffset(m_constraint, 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 = PhysicsScene.PE.TranslationalLimitMotor(m_constraint, 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 = PhysicsScene.PE.SetBreakingImpulseThreshold(m_constraint, threshold);
+ return ret;
+ }
}
}
-}
diff --git a/OpenSim/Region/PhysicsModules/BulletS/BSConstraintCollection.cs b/OpenSim/Region/PhysicsModules/BulletS/BSConstraintCollection.cs
index 5746ac1746..479cc0ff72 100755
--- a/OpenSim/Region/PhysicsModules/BulletS/BSConstraintCollection.cs
+++ b/OpenSim/Region/PhysicsModules/BulletS/BSConstraintCollection.cs
@@ -32,150 +32,149 @@ using OpenMetaverse;
namespace OpenSim.Region.PhysicsModule.BulletS
{
-
-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 BulletWorld m_world;
-
- public BSConstraintCollection(BulletWorld world)
+ public sealed class BSConstraintCollection : IDisposable
{
- m_world = world;
- m_constraints = new List();
- }
+ // private static readonly ILog m_log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
+ // private static readonly string LogHeader = "[CONSTRAINT COLLECTION]";
- public void Dispose()
- {
- this.Clear();
- }
+ delegate bool ConstraintAction(BSConstraint constrain);
- public void Clear()
- {
- lock (m_constraints)
+ private List m_constraints;
+ private BulletWorld m_world;
+
+ public BSConstraintCollection(BulletWorld world)
{
- 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);
+ m_world = world;
+ m_constraints = new List();
}
- 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)
+ public void Dispose()
{
- foreach (BSConstraint constrain in m_constraints)
+ this.Clear();
+ }
+
+ public void Clear()
+ {
+ lock (m_constraints)
{
- if ((constrain.Body1.ID == lookingID1 && constrain.Body2.ID == lookingID2)
- || (constrain.Body1.ID == lookingID2 && constrain.Body2.ID == lookingID1))
+ foreach (BSConstraint cons in m_constraints)
{
- foundConstraint = constrain;
- found = true;
- break;
+ 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;
}
- 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)
+ // 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)
{
- BSConstraint constrain;
- if (this.TryGetConstraint(body1, body2, out constrain))
+ bool ret = false;
+ lock (m_constraints)
+ {
+ BSConstraint constrain;
+ if (this.TryGetConstraint(body1, body2, out constrain))
+ {
+ // remove the constraint from our collection
+ ret = RemoveAndDestroyConstraint(constrain);
+ }
+ }
+
+ return ret;
+ }
+
+ // The constraint MUST exist in the collection
+ // Could be called if the constraint was previously removed.
+ // Return 'true' if the constraint was actually removed and disposed.
+ public bool RemoveAndDestroyConstraint(BSConstraint constrain)
+ {
+ bool removed = false;
+ lock (m_constraints)
{
// remove the constraint from our collection
- ret = RemoveAndDestroyConstraint(constrain);
+ removed = m_constraints.Remove(constrain);
}
+ // Dispose() is safe to call multiple times
+ constrain.Dispose();
+ return removed;
}
- return ret;
- }
-
- // The constraint MUST exist in the collection
- // Could be called if the constraint was previously removed.
- // Return 'true' if the constraint was actually removed and disposed.
- public bool RemoveAndDestroyConstraint(BSConstraint constrain)
- {
- bool removed = false;
- lock (m_constraints)
+ // Remove all constraints that reference the passed body.
+ // Return 'true' if any constraints were destroyed.
+ public bool RemoveAndDestroyConstraint(BulletBody body1)
{
- // remove the constraint from our collection
- removed = m_constraints.Remove(constrain);
- }
- // Dispose() is safe to call multiple times
- constrain.Dispose();
- return removed;
- }
-
- // 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)
+ List toRemove = new List();
+ uint lookingID = body1.ID;
+ lock (m_constraints)
{
- if (constrain.Body1.ID == lookingID || constrain.Body2.ID == lookingID)
+ foreach (BSConstraint constrain in m_constraints)
{
- toRemove.Add(constrain);
+ if (constrain.Body1.ID == lookingID || constrain.Body2.ID == lookingID)
+ {
+ toRemove.Add(constrain);
+ }
+ }
+ foreach (BSConstraint constrain in toRemove)
+ {
+ m_constraints.Remove(constrain);
+ constrain.Dispose();
}
}
- foreach (BSConstraint constrain in toRemove)
- {
- m_constraints.Remove(constrain);
- constrain.Dispose();
- }
+ return (toRemove.Count > 0);
}
- return (toRemove.Count > 0);
- }
- public bool RecalculateAllConstraints()
- {
- bool ret = false;
- lock (m_constraints)
+ public bool RecalculateAllConstraints()
{
- foreach (BSConstraint constrain in m_constraints)
+ bool ret = false;
+ lock (m_constraints)
{
- constrain.CalculateTransforms();
- ret = true;
+ foreach (BSConstraint constrain in m_constraints)
+ {
+ constrain.CalculateTransforms();
+ ret = true;
+ }
}
+ return ret;
}
- return ret;
}
}
-}
diff --git a/OpenSim/Region/PhysicsModules/BulletS/BSConstraintConeTwist.cs b/OpenSim/Region/PhysicsModules/BulletS/BSConstraintConeTwist.cs
index e7566a83dd..dbfb572a74 100755
--- a/OpenSim/Region/PhysicsModules/BulletS/BSConstraintConeTwist.cs
+++ b/OpenSim/Region/PhysicsModules/BulletS/BSConstraintConeTwist.cs
@@ -31,24 +31,22 @@ using OpenMetaverse;
namespace OpenSim.Region.PhysicsModule.BulletS
{
-
-public sealed class BSConstraintConeTwist : BSConstraint
-{
- public override ConstraintType Type { get { return ConstraintType.CONETWIST_CONSTRAINT_TYPE; } }
-
- public BSConstraintConeTwist(BulletWorld world, BulletBody obj1, BulletBody obj2,
- Vector3 frameInAloc, Quaternion frameInArot,
- Vector3 frameInBloc, Quaternion frameInBrot,
- bool disableCollisionsBetweenLinkedBodies)
- : base(world)
+ public sealed class BSConstraintConeTwist : BSConstraint
{
- m_body1 = obj1;
- m_body2 = obj2;
- m_constraint = PhysicsScene.PE.CreateConeTwistConstraint(world, obj1, obj2,
- frameInAloc, frameInArot, frameInBloc, frameInBrot,
- disableCollisionsBetweenLinkedBodies);
- m_enabled = true;
+ public override ConstraintType Type { get { return ConstraintType.CONETWIST_CONSTRAINT_TYPE; } }
+
+ public BSConstraintConeTwist(BulletWorld world, BulletBody obj1, BulletBody obj2,
+ Vector3 frameInAloc, Quaternion frameInArot,
+ Vector3 frameInBloc, Quaternion frameInBrot,
+ bool disableCollisionsBetweenLinkedBodies)
+ : base(world)
+ {
+ m_body1 = obj1;
+ m_body2 = obj2;
+ m_constraint = PhysicsScene.PE.CreateConeTwistConstraint(world, obj1, obj2,
+ frameInAloc, frameInArot, frameInBloc, frameInBrot,
+ disableCollisionsBetweenLinkedBodies);
+ m_enabled = true;
+ }
}
}
-
-}
diff --git a/OpenSim/Region/PhysicsModules/BulletS/BSConstraintSlider.cs b/OpenSim/Region/PhysicsModules/BulletS/BSConstraintSlider.cs
index 83d42af912..40f67b9863 100755
--- a/OpenSim/Region/PhysicsModules/BulletS/BSConstraintSlider.cs
+++ b/OpenSim/Region/PhysicsModules/BulletS/BSConstraintSlider.cs
@@ -31,25 +31,22 @@ using OpenMetaverse;
namespace OpenSim.Region.PhysicsModule.BulletS
{
-
-public sealed class BSConstraintSlider : BSConstraint
-{
- public override ConstraintType Type { get { return ConstraintType.SLIDER_CONSTRAINT_TYPE; } }
-
- public BSConstraintSlider(BulletWorld world, BulletBody obj1, BulletBody obj2,
- Vector3 frameInAloc, Quaternion frameInArot,
- Vector3 frameInBloc, Quaternion frameInBrot,
- bool useLinearReferenceFrameA, bool disableCollisionsBetweenLinkedBodies)
- : base(world)
+ public sealed class BSConstraintSlider : BSConstraint
{
- m_body1 = obj1;
- m_body2 = obj2;
- m_constraint = PhysicsScene.PE.CreateSliderConstraint(world, obj1, obj2,
- frameInAloc, frameInArot, frameInBloc, frameInBrot,
- useLinearReferenceFrameA, disableCollisionsBetweenLinkedBodies);
- m_enabled = true;
+ public override ConstraintType Type { get { return ConstraintType.SLIDER_CONSTRAINT_TYPE; } }
+
+ public BSConstraintSlider(BulletWorld world, BulletBody obj1, BulletBody obj2,
+ Vector3 frameInAloc, Quaternion frameInArot,
+ Vector3 frameInBloc, Quaternion frameInBrot,
+ bool useLinearReferenceFrameA, bool disableCollisionsBetweenLinkedBodies)
+ : base(world)
+ {
+ m_body1 = obj1;
+ m_body2 = obj2;
+ m_constraint = PhysicsScene.PE.CreateSliderConstraint(world, obj1, obj2,
+ frameInAloc, frameInArot, frameInBloc, frameInBrot,
+ useLinearReferenceFrameA, disableCollisionsBetweenLinkedBodies);
+ m_enabled = true;
+ }
}
-
-}
-
}
diff --git a/OpenSim/Region/PhysicsModules/BulletS/BSConstraintSpring.cs b/OpenSim/Region/PhysicsModules/BulletS/BSConstraintSpring.cs
index 563a1b1ef5..ed6c146728 100755
--- a/OpenSim/Region/PhysicsModules/BulletS/BSConstraintSpring.cs
+++ b/OpenSim/Region/PhysicsModules/BulletS/BSConstraintSpring.cs
@@ -31,73 +31,70 @@ using OpenMetaverse;
namespace OpenSim.Region.PhysicsModule.BulletS
{
-
-public sealed class BSConstraintSpring : BSConstraint6Dof
-{
- public override ConstraintType Type { get { return ConstraintType.D6_SPRING_CONSTRAINT_TYPE; } }
-
- public BSConstraintSpring(BulletWorld world, BulletBody obj1, BulletBody obj2,
- Vector3 frame1Loc, Quaternion frame1Rot,
- Vector3 frame2Loc, Quaternion frame2Rot,
- bool useLinearReferenceFrameA, bool disableCollisionsBetweenLinkedBodies)
- :base(world, obj1, obj2)
+ public sealed class BSConstraintSpring : BSConstraint6Dof
{
- m_constraint = PhysicsScene.PE.Create6DofSpringConstraint(world, obj1, obj2,
- frame1Loc, frame1Rot, frame2Loc, frame2Rot,
- useLinearReferenceFrameA, disableCollisionsBetweenLinkedBodies);
- m_enabled = true;
+ public override ConstraintType Type { get { return ConstraintType.D6_SPRING_CONSTRAINT_TYPE; } }
- PhysicsScene.DetailLog("{0},BSConstraintSpring,create,wID={1}, rID={2}, rBody={3}, cID={4}, cBody={5}",
- obj1.ID, world.worldID, obj1.ID, obj1.AddrString, obj2.ID, obj2.AddrString);
- PhysicsScene.DetailLog("{0},BSConstraintSpring,create, f1Loc={1},f1Rot={2},f2Loc={3},f2Rot={4},usefA={5},disCol={6}",
- m_body1.ID, frame1Loc, frame1Rot, frame2Loc, frame2Rot, useLinearReferenceFrameA, disableCollisionsBetweenLinkedBodies);
+ public BSConstraintSpring(BulletWorld world, BulletBody obj1, BulletBody obj2,
+ Vector3 frame1Loc, Quaternion frame1Rot,
+ Vector3 frame2Loc, Quaternion frame2Rot,
+ bool useLinearReferenceFrameA, bool disableCollisionsBetweenLinkedBodies)
+ :base(world, obj1, obj2)
+ {
+ m_constraint = PhysicsScene.PE.Create6DofSpringConstraint(world, obj1, obj2,
+ frame1Loc, frame1Rot, frame2Loc, frame2Rot,
+ useLinearReferenceFrameA, disableCollisionsBetweenLinkedBodies);
+ m_enabled = true;
+
+ PhysicsScene.DetailLog("{0},BSConstraintSpring,create,wID={1}, rID={2}, rBody={3}, cID={4}, cBody={5}",
+ obj1.ID, world.worldID, obj1.ID, obj1.AddrString, obj2.ID, obj2.AddrString);
+ PhysicsScene.DetailLog("{0},BSConstraintSpring,create, f1Loc={1},f1Rot={2},f2Loc={3},f2Rot={4},usefA={5},disCol={6}",
+ m_body1.ID, frame1Loc, frame1Rot, frame2Loc, frame2Rot, useLinearReferenceFrameA, disableCollisionsBetweenLinkedBodies);
+ }
+
+ public bool SetAxisEnable(int pIndex, bool pAxisEnable)
+ {
+ PhysicsScene.DetailLog("{0},BSConstraintSpring.SetEnable,obj1ID={1},obj2ID={2},indx={3},enable={4}",
+ m_body1.ID, m_body1.ID, m_body2.ID, pIndex, pAxisEnable);
+ PhysicsScene.PE.SpringEnable(m_constraint, pIndex, BSParam.NumericBool(pAxisEnable));
+ return true;
+ }
+
+ public bool SetStiffness(int pIndex, float pStiffness)
+ {
+ PhysicsScene.DetailLog("{0},BSConstraintSpring.SetStiffness,obj1ID={1},obj2ID={2},indx={3},stiff={4}",
+ m_body1.ID, m_body1.ID, m_body2.ID, pIndex, pStiffness);
+ PhysicsScene.PE.SpringSetStiffness(m_constraint, pIndex, pStiffness);
+ return true;
+ }
+
+ public bool SetDamping(int pIndex, float pDamping)
+ {
+ PhysicsScene.DetailLog("{0},BSConstraintSpring.SetDamping,obj1ID={1},obj2ID={2},indx={3},damp={4}",
+ m_body1.ID, m_body1.ID, m_body2.ID, pIndex, pDamping);
+ PhysicsScene.PE.SpringSetDamping(m_constraint, pIndex, pDamping);
+ return true;
+ }
+
+ public bool SetEquilibriumPoint(int pIndex, float pEqPoint)
+ {
+ PhysicsScene.DetailLog("{0},BSConstraintSpring.SetEquilibriumPoint,obj1ID={1},obj2ID={2},indx={3},eqPoint={4}",
+ m_body1.ID, m_body1.ID, m_body2.ID, pIndex, pEqPoint);
+ PhysicsScene.PE.SpringSetEquilibriumPoint(m_constraint, pIndex, pEqPoint);
+ return true;
+ }
+
+ public bool SetEquilibriumPoint(Vector3 linearEq, Vector3 angularEq)
+ {
+ PhysicsScene.DetailLog("{0},BSConstraintSpring.SetEquilibriumPoint,obj1ID={1},obj2ID={2},linearEq={3},angularEq={4}",
+ m_body1.ID, m_body1.ID, m_body2.ID, linearEq, angularEq);
+ PhysicsScene.PE.SpringSetEquilibriumPoint(m_constraint, 0, linearEq.X);
+ PhysicsScene.PE.SpringSetEquilibriumPoint(m_constraint, 1, linearEq.Y);
+ PhysicsScene.PE.SpringSetEquilibriumPoint(m_constraint, 2, linearEq.Z);
+ PhysicsScene.PE.SpringSetEquilibriumPoint(m_constraint, 3, angularEq.X);
+ PhysicsScene.PE.SpringSetEquilibriumPoint(m_constraint, 4, angularEq.Y);
+ PhysicsScene.PE.SpringSetEquilibriumPoint(m_constraint, 5, angularEq.Z);
+ return true;
+ }
}
-
- public bool SetAxisEnable(int pIndex, bool pAxisEnable)
- {
- PhysicsScene.DetailLog("{0},BSConstraintSpring.SetEnable,obj1ID={1},obj2ID={2},indx={3},enable={4}",
- m_body1.ID, m_body1.ID, m_body2.ID, pIndex, pAxisEnable);
- PhysicsScene.PE.SpringEnable(m_constraint, pIndex, BSParam.NumericBool(pAxisEnable));
- return true;
- }
-
- public bool SetStiffness(int pIndex, float pStiffness)
- {
- PhysicsScene.DetailLog("{0},BSConstraintSpring.SetStiffness,obj1ID={1},obj2ID={2},indx={3},stiff={4}",
- m_body1.ID, m_body1.ID, m_body2.ID, pIndex, pStiffness);
- PhysicsScene.PE.SpringSetStiffness(m_constraint, pIndex, pStiffness);
- return true;
- }
-
- public bool SetDamping(int pIndex, float pDamping)
- {
- PhysicsScene.DetailLog("{0},BSConstraintSpring.SetDamping,obj1ID={1},obj2ID={2},indx={3},damp={4}",
- m_body1.ID, m_body1.ID, m_body2.ID, pIndex, pDamping);
- PhysicsScene.PE.SpringSetDamping(m_constraint, pIndex, pDamping);
- return true;
- }
-
- public bool SetEquilibriumPoint(int pIndex, float pEqPoint)
- {
- PhysicsScene.DetailLog("{0},BSConstraintSpring.SetEquilibriumPoint,obj1ID={1},obj2ID={2},indx={3},eqPoint={4}",
- m_body1.ID, m_body1.ID, m_body2.ID, pIndex, pEqPoint);
- PhysicsScene.PE.SpringSetEquilibriumPoint(m_constraint, pIndex, pEqPoint);
- return true;
- }
-
- public bool SetEquilibriumPoint(Vector3 linearEq, Vector3 angularEq)
- {
- PhysicsScene.DetailLog("{0},BSConstraintSpring.SetEquilibriumPoint,obj1ID={1},obj2ID={2},linearEq={3},angularEq={4}",
- m_body1.ID, m_body1.ID, m_body2.ID, linearEq, angularEq);
- PhysicsScene.PE.SpringSetEquilibriumPoint(m_constraint, 0, linearEq.X);
- PhysicsScene.PE.SpringSetEquilibriumPoint(m_constraint, 1, linearEq.Y);
- PhysicsScene.PE.SpringSetEquilibriumPoint(m_constraint, 2, linearEq.Z);
- PhysicsScene.PE.SpringSetEquilibriumPoint(m_constraint, 3, angularEq.X);
- PhysicsScene.PE.SpringSetEquilibriumPoint(m_constraint, 4, angularEq.Y);
- PhysicsScene.PE.SpringSetEquilibriumPoint(m_constraint, 5, angularEq.Z);
- return true;
- }
-
-}
-
}
\ No newline at end of file
diff --git a/OpenSim/Region/PhysicsModules/BulletS/BSLinkset.cs b/OpenSim/Region/PhysicsModules/BulletS/BSLinkset.cs
index 13c1361f73..ea87f7dc48 100755
--- a/OpenSim/Region/PhysicsModules/BulletS/BSLinkset.cs
+++ b/OpenSim/Region/PhysicsModules/BulletS/BSLinkset.cs
@@ -32,472 +32,471 @@ using OMV = OpenMetaverse;
namespace OpenSim.Region.PhysicsModule.BulletS
{
-
-public abstract class BSLinkset
-{
- // private static string LogHeader = "[BULLETSIM LINKSET]";
-
- public enum LinksetImplementation
+ public abstract class BSLinkset
{
- 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, BSPrimLinkable parent)
- {
- BSLinkset ret = null;
+ // private static string LogHeader = "[BULLETSIM LINKSET]";
- switch (parent.LinksetType)
+ public enum LinksetImplementation
{
- case LinksetImplementation.Constraint:
- ret = new BSLinksetConstraints(physScene, parent);
- break;
- case LinksetImplementation.Compound:
- ret = new BSLinksetCompound(physScene, parent);
- break;
- case LinksetImplementation.Manual:
- // ret = new BSLinksetManual(physScene, parent);
- break;
- default:
- ret = new BSLinksetCompound(physScene, parent);
- break;
+ 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)
}
- if (ret == null)
+ // Create the correct type of linkset for this child
+ public static BSLinkset Factory(BSScene physScene, BSPrimLinkable parent)
{
- physScene.Logger.ErrorFormat("[BULLETSIM LINKSET] Factory could not create linkset. Parent name={1}, ID={2}", parent.Name, parent.LocalID);
- }
- return ret;
- }
+ BSLinkset ret = null;
- public class BSLinkInfo
- {
- public BSPrimLinkable member;
- public BSLinkInfo(BSPrimLinkable pMember)
- {
- member = pMember;
- }
- public virtual void ResetLink() { }
- public virtual void SetLinkParameters(BSConstraint constrain) { }
- // Returns 'true' if physical property updates from the child should be reported to the simulator
- public virtual bool ShouldUpdateChildProperties() { return false; }
- }
-
- public LinksetImplementation LinksetImpl { get; protected set; }
-
- public BSPrimLinkable LinksetRoot { get; protected set; }
-
- protected BSScene m_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;
- protected Dictionary 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();
-
- // We keep the prim's mass in the linkset structure since it could be dependent on other prims
- public float LinksetMass { get; protected set; }
-
- 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, BSPrimLinkable parent)
- {
- // A simple linkset of one (no children)
- LinksetID = m_nextLinksetID++;
- // We create LOTS of linksets.
- if (m_nextLinksetID <= 0)
- m_nextLinksetID = 1;
- m_physicsScene = scene;
- LinksetRoot = parent;
- m_children = new Dictionary();
- LinksetMass = parent.RawMass;
- Rebuilding = false;
- RebuildScheduled = false;
-
- parent.ClearDisplacement();
- }
-
- // 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(BSPrimLinkable child)
- {
- lock (m_linksetActivityLock)
- {
- // Don't add the root to its own linkset
- if (!IsRoot(child))
- AddChildToLinkset(child);
- LinksetMass = 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(BSPrimLinkable child, bool inTaintTime)
- {
- lock (m_linksetActivityLock)
- {
- if (IsRoot(child))
+ switch (parent.LinksetType)
{
- // Cannot remove the root from a linkset.
- return this;
- }
- RemoveChildFromLinkset(child, inTaintTime);
- LinksetMass = ComputeLinksetMass();
- }
-
- // The child is down to a linkset of just itself
- return BSLinkset.Factory(m_physicsScene, child);
- }
-
- // Return 'true' if the passed object is the root object of this linkset
- public bool IsRoot(BSPrimLinkable 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(BSPrimLinkable child)
- {
- bool ret = false;
- lock (m_linksetActivityLock)
- {
- ret = m_children.ContainsKey(child);
- }
- 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(BSPrimLinkable obj);
- public virtual bool ForEachMember(ForEachMemberAction action)
- {
- bool ret = false;
- lock (m_linksetActivityLock)
- {
- action(LinksetRoot);
- foreach (BSPrimLinkable po in m_children.Keys)
- {
- if (action(po))
+ case LinksetImplementation.Constraint:
+ ret = new BSLinksetConstraints(physScene, parent);
+ break;
+ case LinksetImplementation.Compound:
+ ret = new BSLinksetCompound(physScene, parent);
+ break;
+ case LinksetImplementation.Manual:
+ // ret = new BSLinksetManual(physScene, parent);
+ break;
+ default:
+ ret = new BSLinksetCompound(physScene, parent);
break;
}
- }
- return ret;
- }
-
- public bool TryGetLinkInfo(BSPrimLinkable child, out BSLinkInfo foundInfo)
- {
- bool ret = false;
- BSLinkInfo found = null;
- lock (m_linksetActivityLock)
- {
- ret = m_children.TryGetValue(child, out found);
- }
- foundInfo = found;
- 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 ForEachLinkInfoAction(BSLinkInfo obj);
- public virtual bool ForEachLinkInfo(ForEachLinkInfoAction action)
- {
- bool ret = false;
- lock (m_linksetActivityLock)
- {
- foreach (BSLinkInfo po in m_children.Values)
+ if (ret == null)
{
- if (action(po))
- break;
+ physScene.Logger.ErrorFormat("[BULLETSIM LINKSET] Factory could not create linkset. Parent name={1}, ID={2}", parent.Name, parent.LocalID);
}
- }
- return ret;
- }
-
- // Check the type of the link and return 'true' if the link is flexible and the
- // updates from the child should be sent to the simulator so things change.
- public virtual bool ShouldReportPropertyUpdates(BSPrimLinkable child)
- {
- bool ret = false;
-
- BSLinkInfo linkInfo;
- if (m_children.TryGetValue(child, out linkInfo))
- {
- ret = linkInfo.ShouldUpdateChildProperties();
- }
-
- return ret;
- }
-
- // Called after a simulation step to post a collision with this object.
- // Return 'true' if linkset processed the collision. 'false' says the linkset didn't have
- // anything to add for the collision and it should be passed through normal processing.
- // Default processing for a linkset.
- public virtual bool HandleCollide(BSPhysObject collider, BSPhysObject collidee,
- OMV.Vector3 contactPoint, OMV.Vector3 contactNormal, float pentrationDepth)
- {
- bool ret = false;
-
- // prims in the same linkset cannot collide with each other
- BSPrimLinkable convCollidee = collidee as BSPrimLinkable;
- if (convCollidee != null && (LinksetID == convCollidee.Linkset.LinksetID))
- {
- // By returning 'true', we tell the caller the collision has been 'handled' so it won't
- // do anything about this collision and thus, effectivily, ignoring the collision.
- ret = true;
- }
- else
- {
- // Not a collision between members of the linkset. Must be a real collision.
- // So the linkset root can know if there is a collision anywhere in the linkset.
- LinksetRoot.SomeCollisionSimulationStep = m_physicsScene.SimulationStep;
- }
-
- 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(BSPrimLinkable 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(BSPrimLinkable child, bool inTaintTime);
-
- // When physical properties are changed the linkset needs to recalculate
- // its internal properties.
- // May be called at runtime or taint-time.
- public virtual void Refresh(BSPrimLinkable 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.
- // Because of potential update calls that could want to schedule another rebuild.
- protected bool Rebuilding { get; set; }
-
- // Flag saying a linkset rebuild has been scheduled.
- // This is turned on when the rebuild is requested and turned off when
- // the rebuild is complete. Used to limit modifications to the
- // linkset parameters while the linkset is in an intermediate state.
- // Protected by a "lock(m_linsetActivityLock)" on the BSLinkset object
- public bool RebuildScheduled { get; protected 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(BSPrimLinkable child);
-
- public virtual bool AllPartsComplete
- {
- get {
- bool ret = true;
- this.ForEachMember((member) =>
- {
- if ((!member.IsInitialized) || member.IsIncomplete || member.PrimAssetState == BSPhysObject.PrimAssetCondition.Waiting)
- {
- ret = false;
- return true; // exit loop
- }
- return false; // continue loop
- });
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.
- // Called at taint-time!
- public abstract bool MakeStatic(BSPrimLinkable child);
+ public class BSLinkInfo
+ {
+ public BSPrimLinkable member;
+ public BSLinkInfo(BSPrimLinkable pMember)
+ {
+ member = pMember;
+ }
+ public virtual void ResetLink() { }
+ public virtual void SetLinkParameters(BSConstraint constrain) { }
+ // Returns 'true' if physical property updates from the child should be reported to the simulator
+ public virtual bool ShouldUpdateChildProperties() { return false; }
+ }
- // 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(UpdatedProperties whichUpdated, BSPrimLinkable physObject);
+ public LinksetImplementation LinksetImpl { get; protected set; }
- // 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 RemoveDependencies(BSPrimLinkable child);
+ public BSPrimLinkable LinksetRoot { get; protected set; }
- // ================================================================
- // Some physical setting happen to all members of the linkset
- public virtual void SetPhysicalFriction(float friction)
- {
- ForEachMember((member) =>
- {
- if (member.PhysBody.HasPhysicalBody)
- m_physicsScene.PE.SetFriction(member.PhysBody, friction);
- return false; // 'false' says to continue looping
- }
- );
- }
- public virtual void SetPhysicalRestitution(float restitution)
- {
- ForEachMember((member) =>
- {
- if (member.PhysBody.HasPhysicalBody)
- m_physicsScene.PE.SetRestitution(member.PhysBody, restitution);
- return false; // 'false' says to continue looping
- }
- );
- }
- public virtual void SetPhysicalGravity(OMV.Vector3 gravity)
- {
- ForEachMember((member) =>
- {
- if (member.PhysBody.HasPhysicalBody)
- m_physicsScene.PE.SetGravity(member.PhysBody, gravity);
- return false; // 'false' says to continue looping
- }
- );
- }
- public virtual void ComputeAndSetLocalInertia(OMV.Vector3 inertiaFactor, float linksetMass)
- {
- ForEachMember((member) =>
- {
- if (member.PhysBody.HasPhysicalBody)
- {
- OMV.Vector3 inertia = m_physicsScene.PE.CalculateLocalInertia(member.PhysShape.physShapeInfo, linksetMass);
- member.Inertia = inertia * inertiaFactor;
- m_physicsScene.PE.SetMassProps(member.PhysBody, linksetMass, member.Inertia);
- m_physicsScene.PE.UpdateInertiaTensor(member.PhysBody);
- DetailLog("{0},BSLinkset.ComputeAndSetLocalInertia,m.mass={1}, inertia={2}", member.LocalID, linksetMass, member.Inertia);
+ protected BSScene m_physicsScene { get; private set; }
- }
- return false; // 'false' says to continue looping
- }
- );
- }
- public virtual void SetPhysicalCollisionFlags(CollisionFlags collFlags)
- {
- ForEachMember((member) =>
- {
- if (member.PhysBody.HasPhysicalBody)
- m_physicsScene.PE.SetCollisionFlags(member.PhysBody, collFlags);
- return false; // 'false' says to continue looping
- }
- );
- }
- public virtual void AddToPhysicalCollisionFlags(CollisionFlags collFlags)
- {
- ForEachMember((member) =>
- {
- if (member.PhysBody.HasPhysicalBody)
- m_physicsScene.PE.AddToCollisionFlags(member.PhysBody, collFlags);
- return false; // 'false' says to continue looping
- }
- );
- }
- public virtual void RemoveFromPhysicalCollisionFlags(CollisionFlags collFlags)
- {
- ForEachMember((member) =>
- {
- if (member.PhysBody.HasPhysicalBody)
- m_physicsScene.PE.RemoveFromCollisionFlags(member.PhysBody, collFlags);
- return false; // 'false' says to continue looping
- }
- );
- }
- // ================================================================
- protected virtual float ComputeLinksetMass()
- {
- float mass = LinksetRoot.RawMass;
- if (HasAnyChildren)
+ static int m_nextLinksetID = 1;
+ public int LinksetID { get; private set; }
+
+ // The children under the root in this linkset.
+ // protected HashSet m_children;
+ protected Dictionary 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();
+
+ // We keep the prim's mass in the linkset structure since it could be dependent on other prims
+ public float LinksetMass { get; protected set; }
+
+ 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, BSPrimLinkable parent)
+ {
+ // A simple linkset of one (no children)
+ LinksetID = m_nextLinksetID++;
+ // We create LOTS of linksets.
+ if (m_nextLinksetID <= 0)
+ m_nextLinksetID = 1;
+ m_physicsScene = scene;
+ LinksetRoot = parent;
+ m_children = new Dictionary();
+ LinksetMass = parent.RawMass;
+ Rebuilding = false;
+ RebuildScheduled = false;
+
+ parent.ClearDisplacement();
+ }
+
+ // 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(BSPrimLinkable child)
{
lock (m_linksetActivityLock)
{
- foreach (BSPrimLinkable bp in m_children.Keys)
+ // Don't add the root to its own linkset
+ if (!IsRoot(child))
+ AddChildToLinkset(child);
+ LinksetMass = 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(BSPrimLinkable child, bool inTaintTime)
+ {
+ lock (m_linksetActivityLock)
+ {
+ if (IsRoot(child))
{
- mass += bp.RawMass;
+ // Cannot remove the root from a linkset.
+ return this;
+ }
+ RemoveChildFromLinkset(child, inTaintTime);
+ LinksetMass = ComputeLinksetMass();
+ }
+
+ // The child is down to a linkset of just itself
+ return BSLinkset.Factory(m_physicsScene, child);
+ }
+
+ // Return 'true' if the passed object is the root object of this linkset
+ public bool IsRoot(BSPrimLinkable 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(BSPrimLinkable child)
+ {
+ bool ret = false;
+ lock (m_linksetActivityLock)
+ {
+ ret = m_children.ContainsKey(child);
+ }
+ 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(BSPrimLinkable obj);
+ public virtual bool ForEachMember(ForEachMemberAction action)
+ {
+ bool ret = false;
+ lock (m_linksetActivityLock)
+ {
+ action(LinksetRoot);
+ foreach (BSPrimLinkable po in m_children.Keys)
+ {
+ if (action(po))
+ break;
}
}
+ return ret;
}
- return mass;
- }
- // Computes linkset's center of mass in world coordinates.
- protected virtual OMV.Vector3 ComputeLinksetCenterOfMass()
- {
- OMV.Vector3 com;
- lock (m_linksetActivityLock)
+ public bool TryGetLinkInfo(BSPrimLinkable child, out BSLinkInfo foundInfo)
{
- com = LinksetRoot.Position * LinksetRoot.RawMass;
- float totalMass = LinksetRoot.RawMass;
-
- foreach (BSPrimLinkable bp in m_children.Keys)
+ bool ret = false;
+ BSLinkInfo found = null;
+ lock (m_linksetActivityLock)
{
- com += bp.Position * bp.RawMass;
- totalMass += bp.RawMass;
+ ret = m_children.TryGetValue(child, out found);
}
- if (totalMass != 0f)
- com /= totalMass;
+ foundInfo = found;
+ return ret;
}
-
- return com;
- }
-
- protected virtual OMV.Vector3 ComputeLinksetGeometricCenter()
- {
- OMV.Vector3 com;
- lock (m_linksetActivityLock)
+ // 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 ForEachLinkInfoAction(BSLinkInfo obj);
+ public virtual bool ForEachLinkInfo(ForEachLinkInfoAction action)
{
- com = LinksetRoot.Position;
-
- foreach (BSPrimLinkable bp in m_children.Keys)
+ bool ret = false;
+ lock (m_linksetActivityLock)
{
- com += bp.Position;
+ foreach (BSLinkInfo po in m_children.Values)
+ {
+ if (action(po))
+ break;
+ }
}
- com /= (m_children.Count + 1);
+ return ret;
}
- return com;
- }
+ // Check the type of the link and return 'true' if the link is flexible and the
+ // updates from the child should be sent to the simulator so things change.
+ public virtual bool ShouldReportPropertyUpdates(BSPrimLinkable child)
+ {
+ bool ret = false;
- #region Extension
- public virtual object Extension(string pFunct, params object[] pParams)
- {
- return null;
- }
- #endregion // Extension
+ BSLinkInfo linkInfo;
+ if (m_children.TryGetValue(child, out linkInfo))
+ {
+ ret = linkInfo.ShouldUpdateChildProperties();
+ }
- // Invoke the detailed logger and output something if it's enabled.
- protected void DetailLog(string msg, params Object[] args)
- {
- if (m_physicsScene.PhysicsLogging.Enabled)
- m_physicsScene.DetailLog(msg, args);
+ return ret;
+ }
+
+ // Called after a simulation step to post a collision with this object.
+ // Return 'true' if linkset processed the collision. 'false' says the linkset didn't have
+ // anything to add for the collision and it should be passed through normal processing.
+ // Default processing for a linkset.
+ public virtual bool HandleCollide(BSPhysObject collider, BSPhysObject collidee,
+ OMV.Vector3 contactPoint, OMV.Vector3 contactNormal, float pentrationDepth)
+ {
+ bool ret = false;
+
+ // prims in the same linkset cannot collide with each other
+ BSPrimLinkable convCollidee = collidee as BSPrimLinkable;
+ if (convCollidee != null && (LinksetID == convCollidee.Linkset.LinksetID))
+ {
+ // By returning 'true', we tell the caller the collision has been 'handled' so it won't
+ // do anything about this collision and thus, effectivily, ignoring the collision.
+ ret = true;
+ }
+ else
+ {
+ // Not a collision between members of the linkset. Must be a real collision.
+ // So the linkset root can know if there is a collision anywhere in the linkset.
+ LinksetRoot.SomeCollisionSimulationStep = m_physicsScene.SimulationStep;
+ }
+
+ 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(BSPrimLinkable 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(BSPrimLinkable child, bool inTaintTime);
+
+ // When physical properties are changed the linkset needs to recalculate
+ // its internal properties.
+ // May be called at runtime or taint-time.
+ public virtual void Refresh(BSPrimLinkable 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.
+ // Because of potential update calls that could want to schedule another rebuild.
+ protected bool Rebuilding { get; set; }
+
+ // Flag saying a linkset rebuild has been scheduled.
+ // This is turned on when the rebuild is requested and turned off when
+ // the rebuild is complete. Used to limit modifications to the
+ // linkset parameters while the linkset is in an intermediate state.
+ // Protected by a "lock(m_linsetActivityLock)" on the BSLinkset object
+ public bool RebuildScheduled { get; protected 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(BSPrimLinkable child);
+
+ public virtual bool AllPartsComplete
+ {
+ get {
+ bool ret = true;
+ this.ForEachMember((member) =>
+ {
+ if ((!member.IsInitialized) || member.IsIncomplete || member.PrimAssetState == BSPhysObject.PrimAssetCondition.Waiting)
+ {
+ ret = false;
+ return true; // exit loop
+ }
+ return false; // continue loop
+ });
+ 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.
+ // Called at taint-time!
+ public abstract bool MakeStatic(BSPrimLinkable 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(UpdatedProperties whichUpdated, BSPrimLinkable physObject);
+
+ // 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 RemoveDependencies(BSPrimLinkable child);
+
+ // ================================================================
+ // Some physical setting happen to all members of the linkset
+ public virtual void SetPhysicalFriction(float friction)
+ {
+ ForEachMember((member) =>
+ {
+ if (member.PhysBody.HasPhysicalBody)
+ m_physicsScene.PE.SetFriction(member.PhysBody, friction);
+ return false; // 'false' says to continue looping
+ }
+ );
+ }
+ public virtual void SetPhysicalRestitution(float restitution)
+ {
+ ForEachMember((member) =>
+ {
+ if (member.PhysBody.HasPhysicalBody)
+ m_physicsScene.PE.SetRestitution(member.PhysBody, restitution);
+ return false; // 'false' says to continue looping
+ }
+ );
+ }
+ public virtual void SetPhysicalGravity(OMV.Vector3 gravity)
+ {
+ ForEachMember((member) =>
+ {
+ if (member.PhysBody.HasPhysicalBody)
+ m_physicsScene.PE.SetGravity(member.PhysBody, gravity);
+ return false; // 'false' says to continue looping
+ }
+ );
+ }
+ public virtual void ComputeAndSetLocalInertia(OMV.Vector3 inertiaFactor, float linksetMass)
+ {
+ ForEachMember((member) =>
+ {
+ if (member.PhysBody.HasPhysicalBody)
+ {
+ OMV.Vector3 inertia = m_physicsScene.PE.CalculateLocalInertia(member.PhysShape.physShapeInfo, linksetMass);
+ member.Inertia = inertia * inertiaFactor;
+ m_physicsScene.PE.SetMassProps(member.PhysBody, linksetMass, member.Inertia);
+ m_physicsScene.PE.UpdateInertiaTensor(member.PhysBody);
+ DetailLog("{0},BSLinkset.ComputeAndSetLocalInertia,m.mass={1}, inertia={2}", member.LocalID, linksetMass, member.Inertia);
+
+ }
+ return false; // 'false' says to continue looping
+ }
+ );
+ }
+ public virtual void SetPhysicalCollisionFlags(CollisionFlags collFlags)
+ {
+ ForEachMember((member) =>
+ {
+ if (member.PhysBody.HasPhysicalBody)
+ m_physicsScene.PE.SetCollisionFlags(member.PhysBody, collFlags);
+ return false; // 'false' says to continue looping
+ }
+ );
+ }
+ public virtual void AddToPhysicalCollisionFlags(CollisionFlags collFlags)
+ {
+ ForEachMember((member) =>
+ {
+ if (member.PhysBody.HasPhysicalBody)
+ m_physicsScene.PE.AddToCollisionFlags(member.PhysBody, collFlags);
+ return false; // 'false' says to continue looping
+ }
+ );
+ }
+ public virtual void RemoveFromPhysicalCollisionFlags(CollisionFlags collFlags)
+ {
+ ForEachMember((member) =>
+ {
+ if (member.PhysBody.HasPhysicalBody)
+ m_physicsScene.PE.RemoveFromCollisionFlags(member.PhysBody, collFlags);
+ return false; // 'false' says to continue looping
+ }
+ );
+ }
+ // ================================================================
+ protected virtual float ComputeLinksetMass()
+ {
+ float mass = LinksetRoot.RawMass;
+ if (HasAnyChildren)
+ {
+ lock (m_linksetActivityLock)
+ {
+ foreach (BSPrimLinkable bp in m_children.Keys)
+ {
+ mass += bp.RawMass;
+ }
+ }
+ }
+ return mass;
+ }
+
+ // Computes linkset's center of mass in world coordinates.
+ protected virtual OMV.Vector3 ComputeLinksetCenterOfMass()
+ {
+ OMV.Vector3 com;
+ lock (m_linksetActivityLock)
+ {
+ com = LinksetRoot.Position * LinksetRoot.RawMass;
+ float totalMass = LinksetRoot.RawMass;
+
+ foreach (BSPrimLinkable bp in m_children.Keys)
+ {
+ 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 (BSPrimLinkable bp in m_children.Keys)
+ {
+ com += bp.Position;
+ }
+ com /= (m_children.Count + 1);
+ }
+
+ return com;
+ }
+
+ #region Extension
+ public virtual object Extension(string pFunct, params object[] pParams)
+ {
+ return null;
+ }
+ #endregion // Extension
+
+ // Invoke the detailed logger and output something if it's enabled.
+ protected void DetailLog(string msg, params Object[] args)
+ {
+ if (m_physicsScene.PhysicsLogging.Enabled)
+ m_physicsScene.DetailLog(msg, args);
+ }
}
}
-}
diff --git a/OpenSim/Region/PhysicsModules/BulletS/BSLinksetCompound.cs b/OpenSim/Region/PhysicsModules/BulletS/BSLinksetCompound.cs
index dc390b2e8d..924d1c8750 100755
--- a/OpenSim/Region/PhysicsModules/BulletS/BSLinksetCompound.cs
+++ b/OpenSim/Region/PhysicsModules/BulletS/BSLinksetCompound.cs
@@ -34,445 +34,444 @@ using OMV = OpenMetaverse;
namespace OpenSim.Region.PhysicsModule.BulletS
{
-
-public sealed class BSLinksetCompound : BSLinkset
-{
+ public sealed class BSLinksetCompound : BSLinkset
+ {
#pragma warning disable 414
- private static string LogHeader = "[BULLETSIM LINKSET COMPOUND]";
+ private static string LogHeader = "[BULLETSIM LINKSET COMPOUND]";
#pragma warning restore 414
- public BSLinksetCompound(BSScene scene, BSPrimLinkable parent)
- : base(scene, parent)
- {
- LinksetImpl = LinksetImplementation.Compound;
- }
-
- // ================================================================
- // Changing the physical property of the linkset only needs to change the root
- public override void SetPhysicalFriction(float friction)
- {
- if (LinksetRoot.PhysBody.HasPhysicalBody)
- m_physicsScene.PE.SetFriction(LinksetRoot.PhysBody, friction);
- }
- public override void SetPhysicalRestitution(float restitution)
- {
- if (LinksetRoot.PhysBody.HasPhysicalBody)
- m_physicsScene.PE.SetRestitution(LinksetRoot.PhysBody, restitution);
- }
- public override void SetPhysicalGravity(OMV.Vector3 gravity)
- {
- if (LinksetRoot.PhysBody.HasPhysicalBody)
- m_physicsScene.PE.SetGravity(LinksetRoot.PhysBody, gravity);
- }
- public override void ComputeAndSetLocalInertia(OMV.Vector3 inertiaFactor, float linksetMass)
- {
- OMV.Vector3 inertia = m_physicsScene.PE.CalculateLocalInertia(LinksetRoot.PhysShape.physShapeInfo, linksetMass);
- LinksetRoot.Inertia = inertia * inertiaFactor;
- m_physicsScene.PE.SetMassProps(LinksetRoot.PhysBody, linksetMass, LinksetRoot.Inertia);
- m_physicsScene.PE.UpdateInertiaTensor(LinksetRoot.PhysBody);
- }
- public override void SetPhysicalCollisionFlags(CollisionFlags collFlags)
- {
- if (LinksetRoot.PhysBody.HasPhysicalBody)
- m_physicsScene.PE.SetCollisionFlags(LinksetRoot.PhysBody, collFlags);
- }
- public override void AddToPhysicalCollisionFlags(CollisionFlags collFlags)
- {
- if (LinksetRoot.PhysBody.HasPhysicalBody)
- m_physicsScene.PE.AddToCollisionFlags(LinksetRoot.PhysBody, collFlags);
- }
- public override void RemoveFromPhysicalCollisionFlags(CollisionFlags collFlags)
- {
- if (LinksetRoot.PhysBody.HasPhysicalBody)
- m_physicsScene.PE.RemoveFromCollisionFlags(LinksetRoot.PhysBody, collFlags);
- }
- // ================================================================
-
- // When physical properties are changed the linkset needs to recalculate
- // its internal properties.
- public override void Refresh(BSPrimLinkable requestor)
- {
- // Something changed so do the rebuilding thing
- ScheduleRebuild(requestor);
- base.Refresh(requestor);
- }
-
- // Schedule a refresh to happen after all the other taint processing.
- private void ScheduleRebuild(BSPrimLinkable requestor)
- {
- // When rebuilding, it is possible to set properties that would normally require a rebuild.
- // If already rebuilding, don't request another rebuild.
- // If a linkset with just a root prim (simple non-linked prim) don't bother rebuilding.
- lock (m_linksetActivityLock)
+ public BSLinksetCompound(BSScene scene, BSPrimLinkable parent)
+ : base(scene, parent)
{
- if (!RebuildScheduled && !Rebuilding && HasAnyChildren)
- {
- InternalScheduleRebuild(requestor);
- }
+ LinksetImpl = LinksetImplementation.Compound;
}
- }
-
- // Must be called with m_linksetActivityLock or race conditions will haunt you.
- private void InternalScheduleRebuild(BSPrimLinkable requestor)
- {
- DetailLog("{0},BSLinksetCompound.InternalScheduleRebuild,,rebuilding={1},hasChildren={2}",
- requestor.LocalID, Rebuilding, HasAnyChildren);
- RebuildScheduled = true;
- m_physicsScene.PostTaintObject("BSLinksetCompound.ScheduleRebuild", LinksetRoot.LocalID, delegate()
+
+ // ================================================================
+ // Changing the physical property of the linkset only needs to change the root
+ public override void SetPhysicalFriction(float friction)
{
- if (HasAnyChildren)
+ if (LinksetRoot.PhysBody.HasPhysicalBody)
+ m_physicsScene.PE.SetFriction(LinksetRoot.PhysBody, friction);
+ }
+ public override void SetPhysicalRestitution(float restitution)
+ {
+ if (LinksetRoot.PhysBody.HasPhysicalBody)
+ m_physicsScene.PE.SetRestitution(LinksetRoot.PhysBody, restitution);
+ }
+ public override void SetPhysicalGravity(OMV.Vector3 gravity)
+ {
+ if (LinksetRoot.PhysBody.HasPhysicalBody)
+ m_physicsScene.PE.SetGravity(LinksetRoot.PhysBody, gravity);
+ }
+ public override void ComputeAndSetLocalInertia(OMV.Vector3 inertiaFactor, float linksetMass)
+ {
+ OMV.Vector3 inertia = m_physicsScene.PE.CalculateLocalInertia(LinksetRoot.PhysShape.physShapeInfo, linksetMass);
+ LinksetRoot.Inertia = inertia * inertiaFactor;
+ m_physicsScene.PE.SetMassProps(LinksetRoot.PhysBody, linksetMass, LinksetRoot.Inertia);
+ m_physicsScene.PE.UpdateInertiaTensor(LinksetRoot.PhysBody);
+ }
+ public override void SetPhysicalCollisionFlags(CollisionFlags collFlags)
+ {
+ if (LinksetRoot.PhysBody.HasPhysicalBody)
+ m_physicsScene.PE.SetCollisionFlags(LinksetRoot.PhysBody, collFlags);
+ }
+ public override void AddToPhysicalCollisionFlags(CollisionFlags collFlags)
+ {
+ if (LinksetRoot.PhysBody.HasPhysicalBody)
+ m_physicsScene.PE.AddToCollisionFlags(LinksetRoot.PhysBody, collFlags);
+ }
+ public override void RemoveFromPhysicalCollisionFlags(CollisionFlags collFlags)
+ {
+ if (LinksetRoot.PhysBody.HasPhysicalBody)
+ m_physicsScene.PE.RemoveFromCollisionFlags(LinksetRoot.PhysBody, collFlags);
+ }
+ // ================================================================
+
+ // When physical properties are changed the linkset needs to recalculate
+ // its internal properties.
+ public override void Refresh(BSPrimLinkable requestor)
+ {
+ // Something changed so do the rebuilding thing
+ ScheduleRebuild(requestor);
+ base.Refresh(requestor);
+ }
+
+ // Schedule a refresh to happen after all the other taint processing.
+ private void ScheduleRebuild(BSPrimLinkable requestor)
+ {
+ // When rebuilding, it is possible to set properties that would normally require a rebuild.
+ // If already rebuilding, don't request another rebuild.
+ // If a linkset with just a root prim (simple non-linked prim) don't bother rebuilding.
+ lock (m_linksetActivityLock)
{
- if (this.AllPartsComplete)
+ if (!RebuildScheduled && !Rebuilding && HasAnyChildren)
{
- RecomputeLinksetCompound();
- }
- else
- {
- DetailLog("{0},BSLinksetCompound.InternalScheduleRebuild,,rescheduling because not all children complete",
- requestor.LocalID);
InternalScheduleRebuild(requestor);
}
}
- RebuildScheduled = false;
- });
- }
-
- // 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(BSPrimLinkable child)
- {
- bool ret = false;
- DetailLog("{0},BSLinksetCompound.MakeDynamic,call,IsRoot={1}", child.LocalID, IsRoot(child));
- if (IsRoot(child))
- {
- // The root is going dynamic. Rebuild the linkset so parts and mass get computed properly.
- Refresh(LinksetRoot);
}
- return ret;
- }
-
- // The object is going static (non-physical). We do not do anything for static linksets.
- // Return 'true' if any properties updated on the passed object.
- // Called at taint-time!
- public override bool MakeStatic(BSPrimLinkable child)
- {
- bool ret = false;
-
- DetailLog("{0},BSLinksetCompound.MakeStatic,call,IsRoot={1}", child.LocalID, IsRoot(child));
- child.ClearDisplacement();
- if (IsRoot(child))
+
+ // Must be called with m_linksetActivityLock or race conditions will haunt you.
+ private void InternalScheduleRebuild(BSPrimLinkable requestor)
{
- // Schedule a rebuild to verify that the root shape is set to the real shape.
- Refresh(LinksetRoot);
- }
- return ret;
- }
-
- // 'physicalUpdate' is true if these changes came directly from the physics engine. Don't need to rebuild then.
- // Called at taint-time.
- public override void UpdateProperties(UpdatedProperties whichUpdated, BSPrimLinkable updated)
- {
- if (!LinksetRoot.IsPhysicallyActive)
- {
- // No reason to do this physical stuff for static linksets.
- DetailLog("{0},BSLinksetCompound.UpdateProperties,notPhysical", LinksetRoot.LocalID);
- return;
- }
-
- // 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
- // stores 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) && m_physicsScene.TerrainManager.IsWithinKnownTerrain(LinksetRoot.RawPosition))
- {
- // If a child of the linkset is updating only the position or rotation, that can be done
- // without rebuilding the linkset.
- // If a handle for the child can be fetch, we update the child here. If a rebuild was
- // scheduled by someone else, the rebuild will just replace this setting.
-
- bool updatedChild = false;
- // Anything other than updating position or orientation usually means a physical update
- // and that is caused by us updating the object.
- if ((whichUpdated & ~(UpdatedProperties.Position | UpdatedProperties.Orientation)) == 0)
+ DetailLog("{0},BSLinksetCompound.InternalScheduleRebuild,,rebuilding={1},hasChildren={2}",
+ requestor.LocalID, Rebuilding, HasAnyChildren);
+ RebuildScheduled = true;
+ m_physicsScene.PostTaintObject("BSLinksetCompound.ScheduleRebuild", LinksetRoot.LocalID, delegate()
{
- // Find the physical instance of the child
- if (!RebuildScheduled // if rebuilding, let the rebuild do it
- && !LinksetRoot.IsIncomplete // if waiting for assets or whatever, don't change
- && LinksetRoot.PhysShape.HasPhysicalShape // there must be a physical shape assigned
- && m_physicsScene.PE.IsCompound(LinksetRoot.PhysShape.physShapeInfo))
+ if (HasAnyChildren)
{
- // It is possible that the linkset is still under construction and the child is not yet
- // inserted into the compound shape. A rebuild of the linkset in a pre-step action will
- // build the whole thing with the new position or rotation.
- // The index must be checked because Bullet references the child array but does no validity
- // checking of the child index passed.
- int numLinksetChildren = m_physicsScene.PE.GetNumberOfCompoundChildren(LinksetRoot.PhysShape.physShapeInfo);
- if (updated.LinksetChildIndex < numLinksetChildren)
+ if (this.AllPartsComplete)
{
- BulletShape linksetChildShape = m_physicsScene.PE.GetChildShapeFromCompoundShapeIndex(LinksetRoot.PhysShape.physShapeInfo, updated.LinksetChildIndex);
- if (linksetChildShape.HasPhysicalShape)
+ RecomputeLinksetCompound();
+ }
+ else
+ {
+ DetailLog("{0},BSLinksetCompound.InternalScheduleRebuild,,rescheduling because not all children complete",
+ requestor.LocalID);
+ InternalScheduleRebuild(requestor);
+ }
+ }
+ RebuildScheduled = false;
+ });
+ }
+
+ // 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(BSPrimLinkable child)
+ {
+ bool ret = false;
+ DetailLog("{0},BSLinksetCompound.MakeDynamic,call,IsRoot={1}", child.LocalID, IsRoot(child));
+ if (IsRoot(child))
+ {
+ // The root is going dynamic. Rebuild the linkset so parts and mass get computed properly.
+ Refresh(LinksetRoot);
+ }
+ return ret;
+ }
+
+ // The object is going static (non-physical). We do not do anything for static linksets.
+ // Return 'true' if any properties updated on the passed object.
+ // Called at taint-time!
+ public override bool MakeStatic(BSPrimLinkable child)
+ {
+ bool ret = false;
+
+ DetailLog("{0},BSLinksetCompound.MakeStatic,call,IsRoot={1}", child.LocalID, IsRoot(child));
+ child.ClearDisplacement();
+ if (IsRoot(child))
+ {
+ // Schedule a rebuild to verify that the root shape is set to the real shape.
+ Refresh(LinksetRoot);
+ }
+ return ret;
+ }
+
+ // 'physicalUpdate' is true if these changes came directly from the physics engine. Don't need to rebuild then.
+ // Called at taint-time.
+ public override void UpdateProperties(UpdatedProperties whichUpdated, BSPrimLinkable updated)
+ {
+ if (!LinksetRoot.IsPhysicallyActive)
+ {
+ // No reason to do this physical stuff for static linksets.
+ DetailLog("{0},BSLinksetCompound.UpdateProperties,notPhysical", LinksetRoot.LocalID);
+ return;
+ }
+
+ // 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
+ // stores 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) && m_physicsScene.TerrainManager.IsWithinKnownTerrain(LinksetRoot.RawPosition))
+ {
+ // If a child of the linkset is updating only the position or rotation, that can be done
+ // without rebuilding the linkset.
+ // If a handle for the child can be fetch, we update the child here. If a rebuild was
+ // scheduled by someone else, the rebuild will just replace this setting.
+
+ bool updatedChild = false;
+ // Anything other than updating position or orientation usually means a physical update
+ // and that is caused by us updating the object.
+ if ((whichUpdated & ~(UpdatedProperties.Position | UpdatedProperties.Orientation)) == 0)
+ {
+ // Find the physical instance of the child
+ if (!RebuildScheduled // if rebuilding, let the rebuild do it
+ && !LinksetRoot.IsIncomplete // if waiting for assets or whatever, don't change
+ && LinksetRoot.PhysShape.HasPhysicalShape // there must be a physical shape assigned
+ && m_physicsScene.PE.IsCompound(LinksetRoot.PhysShape.physShapeInfo))
+ {
+ // It is possible that the linkset is still under construction and the child is not yet
+ // inserted into the compound shape. A rebuild of the linkset in a pre-step action will
+ // build the whole thing with the new position or rotation.
+ // The index must be checked because Bullet references the child array but does no validity
+ // checking of the child index passed.
+ int numLinksetChildren = m_physicsScene.PE.GetNumberOfCompoundChildren(LinksetRoot.PhysShape.physShapeInfo);
+ if (updated.LinksetChildIndex < numLinksetChildren)
{
- // Found the child shape within the compound shape
- m_physicsScene.PE.UpdateChildTransform(LinksetRoot.PhysShape.physShapeInfo, updated.LinksetChildIndex,
- updated.RawPosition - LinksetRoot.RawPosition,
- updated.RawOrientation * OMV.Quaternion.Inverse(LinksetRoot.RawOrientation),
- true /* shouldRecalculateLocalAabb */);
- updatedChild = true;
- DetailLog("{0},BSLinksetCompound.UpdateProperties,changeChildPosRot,whichUpdated={1},pos={2},rot={3}",
- updated.LocalID, whichUpdated, updated.RawPosition, updated.RawOrientation);
+ BulletShape linksetChildShape = m_physicsScene.PE.GetChildShapeFromCompoundShapeIndex(LinksetRoot.PhysShape.physShapeInfo, updated.LinksetChildIndex);
+ if (linksetChildShape.HasPhysicalShape)
+ {
+ // Found the child shape within the compound shape
+ m_physicsScene.PE.UpdateChildTransform(LinksetRoot.PhysShape.physShapeInfo, updated.LinksetChildIndex,
+ updated.RawPosition - LinksetRoot.RawPosition,
+ updated.RawOrientation * OMV.Quaternion.Inverse(LinksetRoot.RawOrientation),
+ true /* shouldRecalculateLocalAabb */);
+ updatedChild = true;
+ DetailLog("{0},BSLinksetCompound.UpdateProperties,changeChildPosRot,whichUpdated={1},pos={2},rot={3}",
+ updated.LocalID, whichUpdated, updated.RawPosition, updated.RawOrientation);
+ }
+ else // DEBUG DEBUG
+ { // DEBUG DEBUG
+ DetailLog("{0},BSLinksetCompound.UpdateProperties,couldNotUpdateChild,noChildShape,shape={1}",
+ updated.LocalID, linksetChildShape);
+ } // DEBUG DEBUG
}
else // DEBUG DEBUG
{ // DEBUG DEBUG
- DetailLog("{0},BSLinksetCompound.UpdateProperties,couldNotUpdateChild,noChildShape,shape={1}",
- updated.LocalID, linksetChildShape);
+ // the child is not yet in the compound shape. This is non-fatal.
+ DetailLog("{0},BSLinksetCompound.UpdateProperties,couldNotUpdateChild,childNotInCompoundShape,numChildren={1},index={2}",
+ updated.LocalID, numLinksetChildren, updated.LinksetChildIndex);
} // DEBUG DEBUG
}
else // DEBUG DEBUG
{ // DEBUG DEBUG
- // the child is not yet in the compound shape. This is non-fatal.
- DetailLog("{0},BSLinksetCompound.UpdateProperties,couldNotUpdateChild,childNotInCompoundShape,numChildren={1},index={2}",
- updated.LocalID, numLinksetChildren, updated.LinksetChildIndex);
+ DetailLog("{0},BSLinksetCompound.UpdateProperties,couldNotUpdateChild,noBodyOrNotCompound", updated.LocalID);
} // DEBUG DEBUG
- }
- else // DEBUG DEBUG
- { // DEBUG DEBUG
- DetailLog("{0},BSLinksetCompound.UpdateProperties,couldNotUpdateChild,noBodyOrNotCompound", updated.LocalID);
- } // DEBUG DEBUG
-
- if (!updatedChild)
- {
- // If couldn't do the individual child, the linkset needs a rebuild to incorporate the new child info.
- // Note: there are several ways through this code that will not update the child if
- // the linkset is being rebuilt. In this case, scheduling a rebuild is a NOOP since
- // there will already be a rebuild scheduled.
- DetailLog("{0},BSLinksetCompound.UpdateProperties,couldNotUpdateChild.schedulingRebuild,whichUpdated={1}",
- updated.LocalID, whichUpdated);
- Refresh(updated);
- }
- }
- }
- }
-
- // Routine called when rebuilding the body of some member of the linkset.
- // If one of the bodies is being changed, the linkset needs rebuilding.
- // For instance, a linkset is built and then a mesh asset is read in and the mesh is recreated.
- // Returns 'true' of something was actually removed and would need restoring
- // Called at taint-time!!
- public override bool RemoveDependencies(BSPrimLinkable child)
- {
- bool ret = false;
-
- DetailLog("{0},BSLinksetCompound.RemoveDependencies,refreshIfChild,rID={1},rBody={2},isRoot={3}",
- child.LocalID, LinksetRoot.LocalID, LinksetRoot.PhysBody, IsRoot(child));
-
- Refresh(child);
-
- return ret;
- }
-
- // ================================================================
-
- // Add a new child to the linkset.
- // Called while LinkActivity is locked.
- protected override void AddChildToLinkset(BSPrimLinkable child)
- {
- if (!HasChild(child))
- {
- m_children.Add(child, new BSLinkInfo(child));
-
- DetailLog("{0},BSLinksetCompound.AddChildToLinkset,call,child={1}", LinksetRoot.LocalID, child.LocalID);
-
- // Rebuild the compound shape with the new child shape included
- Refresh(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(BSPrimLinkable child, bool inTaintTime)
- {
- child.ClearDisplacement();
-
- if (m_children.Remove(child))
- {
- DetailLog("{0},BSLinksetCompound.RemoveChildFromLinkset,call,rID={1},rBody={2},cID={3},cBody={4}",
- child.LocalID,
- LinksetRoot.LocalID, LinksetRoot.PhysBody.AddrString,
- child.LocalID, child.PhysBody.AddrString);
-
- // Cause the child's body to be rebuilt and thus restored to normal operation
- child.ForceBodyShapeRebuild(inTaintTime);
-
- if (!HasAnyChildren)
- {
- // The linkset is now empty. The root needs rebuilding.
- LinksetRoot.ForceBodyShapeRebuild(inTaintTime);
- }
- else
- {
- // Rebuild the compound shape with the child removed
- Refresh(LinksetRoot);
- }
- }
- 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 bool UseBulletSimRootOffsetHack = false; // Attempt to have Bullet track the coords of root compound shape
- private void RecomputeLinksetCompound()
- {
- try
- {
- Rebuilding = true;
-
- // No matter what is being done, force the root prim's PhysBody and PhysShape to get set
- // to what they should be as if the root was not in a linkset.
- // Not that bad since we only get into this routine if there are children in the linkset and
- // something has been updated/changed.
- // Have to do the rebuild before checking for physical because this might be a linkset
- // being destructed and going non-physical.
- LinksetRoot.ForceBodyShapeRebuild(true);
-
- // There is no reason to build all this physical stuff for a non-physical or empty linkset.
- if (!LinksetRoot.IsPhysicallyActive || !HasAnyChildren)
- {
- DetailLog("{0},BSLinksetCompound.RecomputeLinksetCompound,notPhysicalOrNoChildren", LinksetRoot.LocalID);
- return; // Note the 'finally' clause at the botton which will get executed.
- }
-
- // Get a new compound shape to build the linkset shape in.
- BSShape linksetShape = BSShapeCompound.GetReference(m_physicsScene);
-
- // Compute a displacement for each component so it is relative to the center-of-mass.
- // Bullet presumes an object's origin (relative <0,0,0>) is its center-of-mass
- OMV.Vector3 centerOfMassW = ComputeLinksetCenterOfMass();
-
- OMV.Quaternion invRootOrientation = OMV.Quaternion.Normalize(OMV.Quaternion.Inverse(LinksetRoot.RawOrientation));
- OMV.Vector3 origRootPosition = LinksetRoot.RawPosition;
-
- // 'centerDisplacementV' is the vehicle relative distance from the simulator root position to the center-of-mass
- OMV.Vector3 centerDisplacementV = (centerOfMassW - LinksetRoot.RawPosition) * invRootOrientation;
- if (UseBulletSimRootOffsetHack || !BSParam.LinksetOffsetCenterOfMass)
- {
- // Zero everything if center-of-mass displacement is not being done.
- centerDisplacementV = OMV.Vector3.Zero;
- LinksetRoot.ClearDisplacement();
- }
- else
- {
- // The actual center-of-mass could have been set by the user.
- centerDisplacementV = LinksetRoot.SetEffectiveCenterOfMassDisplacement(centerDisplacementV);
- }
-
- DetailLog("{0},BSLinksetCompound.RecomputeLinksetCompound,COM,rootPos={1},com={2},comDisp={3}",
- LinksetRoot.LocalID, origRootPosition, centerOfMassW, centerDisplacementV);
-
- // Add the shapes of all the components of the linkset
- int memberIndex = 1;
- ForEachMember((cPrim) =>
- {
- if (IsRoot(cPrim))
- {
- // Root shape is always index zero.
- cPrim.LinksetChildIndex = 0;
- }
- else
- {
- cPrim.LinksetChildIndex = memberIndex;
- memberIndex++;
- }
-
- // Get a reference to the shape of the child for adding of that shape to the linkset compound shape
- BSShape childShape = cPrim.PhysShape.GetReference(m_physicsScene, cPrim);
-
- // Offset the child shape from the center-of-mass and rotate it to root relative.
- OMV.Vector3 offsetPos = (cPrim.RawPosition - origRootPosition) * invRootOrientation - centerDisplacementV;
- OMV.Quaternion offsetRot = OMV.Quaternion.Normalize(cPrim.RawOrientation) * invRootOrientation;
-
- // Add the child shape to the compound shape being built
- if (childShape.physShapeInfo.HasPhysicalShape)
- {
- m_physicsScene.PE.AddChildShapeToCompoundShape(linksetShape.physShapeInfo, childShape.physShapeInfo, offsetPos, offsetRot);
- DetailLog("{0},BSLinksetCompound.RecomputeLinksetCompound,addChild,indx={1},cShape={2},offPos={3},offRot={4}",
- LinksetRoot.LocalID, cPrim.LinksetChildIndex, childShape, offsetPos, offsetRot);
-
- // Since we are borrowing the shape of the child, disable the origional child body
- if (!IsRoot(cPrim))
+
+ if (!updatedChild)
{
- m_physicsScene.PE.AddToCollisionFlags(cPrim.PhysBody, CollisionFlags.CF_NO_CONTACT_RESPONSE);
- m_physicsScene.PE.ForceActivationState(cPrim.PhysBody, ActivationState.DISABLE_SIMULATION);
- // We don't want collisions from the old linkset children.
- m_physicsScene.PE.RemoveFromCollisionFlags(cPrim.PhysBody, CollisionFlags.BS_SUBSCRIBE_COLLISION_EVENTS);
- cPrim.PhysBody.collisionType = CollisionType.LinksetChild;
+ // If couldn't do the individual child, the linkset needs a rebuild to incorporate the new child info.
+ // Note: there are several ways through this code that will not update the child if
+ // the linkset is being rebuilt. In this case, scheduling a rebuild is a NOOP since
+ // there will already be a rebuild scheduled.
+ DetailLog("{0},BSLinksetCompound.UpdateProperties,couldNotUpdateChild.schedulingRebuild,whichUpdated={1}",
+ updated.LocalID, whichUpdated);
+ Refresh(updated);
}
}
- else
- {
- // The linkset must be in an intermediate state where all the children have not yet
- // been constructed. This sometimes happens on startup when everything is getting
- // built and some shapes have to wait for assets to be read in.
- // Just skip this linkset for the moment and cause the shape to be rebuilt next tick.
- // One problem might be that the shape is broken somehow and it never becomes completely
- // available. This might cause the rebuild to happen over and over.
- InternalScheduleRebuild(LinksetRoot);
- DetailLog("{0},BSLinksetCompound.RecomputeLinksetCompound,addChildWithNoShape,indx={1},cShape={2},offPos={3},offRot={4}",
- LinksetRoot.LocalID, cPrim.LinksetChildIndex, childShape, offsetPos, offsetRot);
- // Output an annoying warning. It should only happen once but if it keeps coming out,
- // the user knows there is something wrong and will report it.
- m_physicsScene.Logger.WarnFormat("{0} Linkset rebuild warning. If this happens more than one or two times, please report in Mantis 7191", LogHeader);
- m_physicsScene.Logger.WarnFormat("{0} pName={1}, childIdx={2}, shape={3}",
- LogHeader, LinksetRoot.Name, cPrim.LinksetChildIndex, childShape);
-
- // This causes the loop to bail on building the rest of this linkset.
- // The rebuild operation will fix it up next tick or declare the object unbuildable.
- return true;
- }
-
- return false; // 'false' says to move onto the next child in the list
- });
-
- // Replace the root shape with the built compound shape.
- // Object removed and added to world to get collision cache rebuilt for new shape.
- LinksetRoot.PhysShape.Dereference(m_physicsScene);
- LinksetRoot.PhysShape = linksetShape;
- m_physicsScene.PE.RemoveObjectFromWorld(m_physicsScene.World, LinksetRoot.PhysBody);
- m_physicsScene.PE.SetCollisionShape(m_physicsScene.World, LinksetRoot.PhysBody, linksetShape.physShapeInfo);
- m_physicsScene.PE.AddObjectToWorld(m_physicsScene.World, LinksetRoot.PhysBody);
- DetailLog("{0},BSLinksetCompound.RecomputeLinksetCompound,addBody,body={1},shape={2}",
- LinksetRoot.LocalID, LinksetRoot.PhysBody, linksetShape);
- m_physicsScene.PE.ResetBroadphasePool(m_physicsScene.World); // DEBUG DEBUG
-
- // With all of the linkset packed into the root prim, it has the mass of everyone.
- LinksetMass = ComputeLinksetMass();
- LinksetRoot.UpdatePhysicalMassProperties(LinksetMass, true);
-
- if (UseBulletSimRootOffsetHack)
- {
- // Enable the physical position updator to return the position and rotation of the root shape.
- // This enables a feature in the C++ code to return the world coordinates of the first shape in the
- // compound shape. This aleviates the need to offset the returned physical position by the
- // center-of-mass offset.
- // TODO: either debug this feature or remove it.
- m_physicsScene.PE.AddToCollisionFlags(LinksetRoot.PhysBody, CollisionFlags.BS_RETURN_ROOT_COMPOUND_SHAPE);
}
}
- finally
+
+ // Routine called when rebuilding the body of some member of the linkset.
+ // If one of the bodies is being changed, the linkset needs rebuilding.
+ // For instance, a linkset is built and then a mesh asset is read in and the mesh is recreated.
+ // Returns 'true' of something was actually removed and would need restoring
+ // Called at taint-time!!
+ public override bool RemoveDependencies(BSPrimLinkable child)
{
- Rebuilding = false;
+ bool ret = false;
+
+ DetailLog("{0},BSLinksetCompound.RemoveDependencies,refreshIfChild,rID={1},rBody={2},isRoot={3}",
+ child.LocalID, LinksetRoot.LocalID, LinksetRoot.PhysBody, IsRoot(child));
+
+ Refresh(child);
+
+ return ret;
+ }
+
+ // ================================================================
+
+ // Add a new child to the linkset.
+ // Called while LinkActivity is locked.
+ protected override void AddChildToLinkset(BSPrimLinkable child)
+ {
+ if (!HasChild(child))
+ {
+ m_children.Add(child, new BSLinkInfo(child));
+
+ DetailLog("{0},BSLinksetCompound.AddChildToLinkset,call,child={1}", LinksetRoot.LocalID, child.LocalID);
+
+ // Rebuild the compound shape with the new child shape included
+ Refresh(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(BSPrimLinkable child, bool inTaintTime)
+ {
+ child.ClearDisplacement();
+
+ if (m_children.Remove(child))
+ {
+ DetailLog("{0},BSLinksetCompound.RemoveChildFromLinkset,call,rID={1},rBody={2},cID={3},cBody={4}",
+ child.LocalID,
+ LinksetRoot.LocalID, LinksetRoot.PhysBody.AddrString,
+ child.LocalID, child.PhysBody.AddrString);
+
+ // Cause the child's body to be rebuilt and thus restored to normal operation
+ child.ForceBodyShapeRebuild(inTaintTime);
+
+ if (!HasAnyChildren)
+ {
+ // The linkset is now empty. The root needs rebuilding.
+ LinksetRoot.ForceBodyShapeRebuild(inTaintTime);
+ }
+ else
+ {
+ // Rebuild the compound shape with the child removed
+ Refresh(LinksetRoot);
+ }
+ }
+ 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 bool UseBulletSimRootOffsetHack = false; // Attempt to have Bullet track the coords of root compound shape
+ private void RecomputeLinksetCompound()
+ {
+ try
+ {
+ Rebuilding = true;
+
+ // No matter what is being done, force the root prim's PhysBody and PhysShape to get set
+ // to what they should be as if the root was not in a linkset.
+ // Not that bad since we only get into this routine if there are children in the linkset and
+ // something has been updated/changed.
+ // Have to do the rebuild before checking for physical because this might be a linkset
+ // being destructed and going non-physical.
+ LinksetRoot.ForceBodyShapeRebuild(true);
+
+ // There is no reason to build all this physical stuff for a non-physical or empty linkset.
+ if (!LinksetRoot.IsPhysicallyActive || !HasAnyChildren)
+ {
+ DetailLog("{0},BSLinksetCompound.RecomputeLinksetCompound,notPhysicalOrNoChildren", LinksetRoot.LocalID);
+ return; // Note the 'finally' clause at the botton which will get executed.
+ }
+
+ // Get a new compound shape to build the linkset shape in.
+ BSShape linksetShape = BSShapeCompound.GetReference(m_physicsScene);
+
+ // Compute a displacement for each component so it is relative to the center-of-mass.
+ // Bullet presumes an object's origin (relative <0,0,0>) is its center-of-mass
+ OMV.Vector3 centerOfMassW = ComputeLinksetCenterOfMass();
+
+ OMV.Quaternion invRootOrientation = OMV.Quaternion.Normalize(OMV.Quaternion.Inverse(LinksetRoot.RawOrientation));
+ OMV.Vector3 origRootPosition = LinksetRoot.RawPosition;
+
+ // 'centerDisplacementV' is the vehicle relative distance from the simulator root position to the center-of-mass
+ OMV.Vector3 centerDisplacementV = (centerOfMassW - LinksetRoot.RawPosition) * invRootOrientation;
+ if (UseBulletSimRootOffsetHack || !BSParam.LinksetOffsetCenterOfMass)
+ {
+ // Zero everything if center-of-mass displacement is not being done.
+ centerDisplacementV = OMV.Vector3.Zero;
+ LinksetRoot.ClearDisplacement();
+ }
+ else
+ {
+ // The actual center-of-mass could have been set by the user.
+ centerDisplacementV = LinksetRoot.SetEffectiveCenterOfMassDisplacement(centerDisplacementV);
+ }
+
+ DetailLog("{0},BSLinksetCompound.RecomputeLinksetCompound,COM,rootPos={1},com={2},comDisp={3}",
+ LinksetRoot.LocalID, origRootPosition, centerOfMassW, centerDisplacementV);
+
+ // Add the shapes of all the components of the linkset
+ int memberIndex = 1;
+ ForEachMember((cPrim) =>
+ {
+ if (IsRoot(cPrim))
+ {
+ // Root shape is always index zero.
+ cPrim.LinksetChildIndex = 0;
+ }
+ else
+ {
+ cPrim.LinksetChildIndex = memberIndex;
+ memberIndex++;
+ }
+
+ // Get a reference to the shape of the child for adding of that shape to the linkset compound shape
+ BSShape childShape = cPrim.PhysShape.GetReference(m_physicsScene, cPrim);
+
+ // Offset the child shape from the center-of-mass and rotate it to root relative.
+ OMV.Vector3 offsetPos = (cPrim.RawPosition - origRootPosition) * invRootOrientation - centerDisplacementV;
+ OMV.Quaternion offsetRot = OMV.Quaternion.Normalize(cPrim.RawOrientation) * invRootOrientation;
+
+ // Add the child shape to the compound shape being built
+ if (childShape.physShapeInfo.HasPhysicalShape)
+ {
+ m_physicsScene.PE.AddChildShapeToCompoundShape(linksetShape.physShapeInfo, childShape.physShapeInfo, offsetPos, offsetRot);
+ DetailLog("{0},BSLinksetCompound.RecomputeLinksetCompound,addChild,indx={1},cShape={2},offPos={3},offRot={4}",
+ LinksetRoot.LocalID, cPrim.LinksetChildIndex, childShape, offsetPos, offsetRot);
+
+ // Since we are borrowing the shape of the child, disable the origional child body
+ if (!IsRoot(cPrim))
+ {
+ m_physicsScene.PE.AddToCollisionFlags(cPrim.PhysBody, CollisionFlags.CF_NO_CONTACT_RESPONSE);
+ m_physicsScene.PE.ForceActivationState(cPrim.PhysBody, ActivationState.DISABLE_SIMULATION);
+ // We don't want collisions from the old linkset children.
+ m_physicsScene.PE.RemoveFromCollisionFlags(cPrim.PhysBody, CollisionFlags.BS_SUBSCRIBE_COLLISION_EVENTS);
+ cPrim.PhysBody.collisionType = CollisionType.LinksetChild;
+ }
+ }
+ else
+ {
+ // The linkset must be in an intermediate state where all the children have not yet
+ // been constructed. This sometimes happens on startup when everything is getting
+ // built and some shapes have to wait for assets to be read in.
+ // Just skip this linkset for the moment and cause the shape to be rebuilt next tick.
+ // One problem might be that the shape is broken somehow and it never becomes completely
+ // available. This might cause the rebuild to happen over and over.
+ InternalScheduleRebuild(LinksetRoot);
+ DetailLog("{0},BSLinksetCompound.RecomputeLinksetCompound,addChildWithNoShape,indx={1},cShape={2},offPos={3},offRot={4}",
+ LinksetRoot.LocalID, cPrim.LinksetChildIndex, childShape, offsetPos, offsetRot);
+ // Output an annoying warning. It should only happen once but if it keeps coming out,
+ // the user knows there is something wrong and will report it.
+ m_physicsScene.Logger.WarnFormat("{0} Linkset rebuild warning. If this happens more than one or two times, please report in Mantis 7191", LogHeader);
+ m_physicsScene.Logger.WarnFormat("{0} pName={1}, childIdx={2}, shape={3}",
+ LogHeader, LinksetRoot.Name, cPrim.LinksetChildIndex, childShape);
+
+ // This causes the loop to bail on building the rest of this linkset.
+ // The rebuild operation will fix it up next tick or declare the object unbuildable.
+ return true;
+ }
+
+ return false; // 'false' says to move onto the next child in the list
+ });
+
+ // Replace the root shape with the built compound shape.
+ // Object removed and added to world to get collision cache rebuilt for new shape.
+ LinksetRoot.PhysShape.Dereference(m_physicsScene);
+ LinksetRoot.PhysShape = linksetShape;
+ m_physicsScene.PE.RemoveObjectFromWorld(m_physicsScene.World, LinksetRoot.PhysBody);
+ m_physicsScene.PE.SetCollisionShape(m_physicsScene.World, LinksetRoot.PhysBody, linksetShape.physShapeInfo);
+ m_physicsScene.PE.AddObjectToWorld(m_physicsScene.World, LinksetRoot.PhysBody);
+ DetailLog("{0},BSLinksetCompound.RecomputeLinksetCompound,addBody,body={1},shape={2}",
+ LinksetRoot.LocalID, LinksetRoot.PhysBody, linksetShape);
+ m_physicsScene.PE.ResetBroadphasePool(m_physicsScene.World); // DEBUG DEBUG
+
+ // With all of the linkset packed into the root prim, it has the mass of everyone.
+ LinksetMass = ComputeLinksetMass();
+ LinksetRoot.UpdatePhysicalMassProperties(LinksetMass, true);
+
+ if (UseBulletSimRootOffsetHack)
+ {
+ // Enable the physical position updator to return the position and rotation of the root shape.
+ // This enables a feature in the C++ code to return the world coordinates of the first shape in the
+ // compound shape. This aleviates the need to offset the returned physical position by the
+ // center-of-mass offset.
+ // TODO: either debug this feature or remove it.
+ m_physicsScene.PE.AddToCollisionFlags(LinksetRoot.PhysBody, CollisionFlags.BS_RETURN_ROOT_COMPOUND_SHAPE);
+ }
+ }
+ finally
+ {
+ Rebuilding = false;
+ }
+
+ // See that the Aabb surrounds the new shape
+ m_physicsScene.PE.RecalculateCompoundShapeLocalAabb(LinksetRoot.PhysShape.physShapeInfo);
}
-
- // See that the Aabb surrounds the new shape
- m_physicsScene.PE.RecalculateCompoundShapeLocalAabb(LinksetRoot.PhysShape.physShapeInfo);
}
-}
}
\ No newline at end of file
diff --git a/OpenSim/Region/PhysicsModules/BulletS/BSLinksetConstraints.cs b/OpenSim/Region/PhysicsModules/BulletS/BSLinksetConstraints.cs
index c4b4c86ec8..fe1ba079fc 100755
--- a/OpenSim/Region/PhysicsModules/BulletS/BSLinksetConstraints.cs
+++ b/OpenSim/Region/PhysicsModules/BulletS/BSLinksetConstraints.cs
@@ -32,821 +32,820 @@ using OMV = OpenMetaverse;
namespace OpenSim.Region.PhysicsModule.BulletS
{
-public sealed class BSLinksetConstraints : BSLinkset
-{
- // private static string LogHeader = "[BULLETSIM LINKSET CONSTRAINTS]";
-
- public class BSLinkInfoConstraint : BSLinkInfo
+ public sealed class BSLinksetConstraints : BSLinkset
{
- public ConstraintType constraintType;
- public BSConstraint constraint;
- public OMV.Vector3 linearLimitLow;
- public OMV.Vector3 linearLimitHigh;
- public OMV.Vector3 angularLimitLow;
- public OMV.Vector3 angularLimitHigh;
- public bool useFrameOffset;
- public bool enableTransMotor;
- public float transMotorMaxVel;
- public float transMotorMaxForce;
- public float cfm;
- public float erp;
- public float solverIterations;
- //
- public OMV.Vector3 frameInAloc;
- public OMV.Quaternion frameInArot;
- public OMV.Vector3 frameInBloc;
- public OMV.Quaternion frameInBrot;
- public bool useLinearReferenceFrameA;
- // Spring
- public bool[] springAxisEnable;
- public float[] springDamping;
- public float[] springStiffness;
- public OMV.Vector3 springLinearEquilibriumPoint;
- public OMV.Vector3 springAngularEquilibriumPoint;
+ // private static string LogHeader = "[BULLETSIM LINKSET CONSTRAINTS]";
- public BSLinkInfoConstraint(BSPrimLinkable pMember)
- : base(pMember)
+ public class BSLinkInfoConstraint : BSLinkInfo
{
- constraint = null;
- ResetLink();
- member.PhysScene.DetailLog("{0},BSLinkInfoConstraint.creation", member.LocalID);
- }
+ public ConstraintType constraintType;
+ public BSConstraint constraint;
+ public OMV.Vector3 linearLimitLow;
+ public OMV.Vector3 linearLimitHigh;
+ public OMV.Vector3 angularLimitLow;
+ public OMV.Vector3 angularLimitHigh;
+ public bool useFrameOffset;
+ public bool enableTransMotor;
+ public float transMotorMaxVel;
+ public float transMotorMaxForce;
+ public float cfm;
+ public float erp;
+ public float solverIterations;
+ //
+ public OMV.Vector3 frameInAloc;
+ public OMV.Quaternion frameInArot;
+ public OMV.Vector3 frameInBloc;
+ public OMV.Quaternion frameInBrot;
+ public bool useLinearReferenceFrameA;
+ // Spring
+ public bool[] springAxisEnable;
+ public float[] springDamping;
+ public float[] springStiffness;
+ public OMV.Vector3 springLinearEquilibriumPoint;
+ public OMV.Vector3 springAngularEquilibriumPoint;
- // Set all the parameters for this constraint to a fixed, non-movable constraint.
- public override void ResetLink()
- {
- // constraintType = ConstraintType.D6_CONSTRAINT_TYPE;
- constraintType = ConstraintType.BS_FIXED_CONSTRAINT_TYPE;
- linearLimitLow = OMV.Vector3.Zero;
- linearLimitHigh = OMV.Vector3.Zero;
- angularLimitLow = OMV.Vector3.Zero;
- angularLimitHigh = OMV.Vector3.Zero;
- useFrameOffset = BSParam.LinkConstraintUseFrameOffset;
- enableTransMotor = BSParam.LinkConstraintEnableTransMotor;
- transMotorMaxVel = BSParam.LinkConstraintTransMotorMaxVel;
- transMotorMaxForce = BSParam.LinkConstraintTransMotorMaxForce;
- cfm = BSParam.LinkConstraintCFM;
- erp = BSParam.LinkConstraintERP;
- solverIterations = BSParam.LinkConstraintSolverIterations;
- frameInAloc = OMV.Vector3.Zero;
- frameInArot = OMV.Quaternion.Identity;
- frameInBloc = OMV.Vector3.Zero;
- frameInBrot = OMV.Quaternion.Identity;
- useLinearReferenceFrameA = true;
- springAxisEnable = new bool[6];
- springDamping = new float[6];
- springStiffness = new float[6];
- for (int ii = 0; ii < springAxisEnable.Length; ii++)
+ public BSLinkInfoConstraint(BSPrimLinkable pMember)
+ : base(pMember)
{
- springAxisEnable[ii] = false;
- springDamping[ii] = BSAPITemplate.SPRING_NOT_SPECIFIED;
- springStiffness[ii] = BSAPITemplate.SPRING_NOT_SPECIFIED;
+ constraint = null;
+ ResetLink();
+ member.PhysScene.DetailLog("{0},BSLinkInfoConstraint.creation", member.LocalID);
+ }
+
+ // Set all the parameters for this constraint to a fixed, non-movable constraint.
+ public override void ResetLink()
+ {
+ // constraintType = ConstraintType.D6_CONSTRAINT_TYPE;
+ constraintType = ConstraintType.BS_FIXED_CONSTRAINT_TYPE;
+ linearLimitLow = OMV.Vector3.Zero;
+ linearLimitHigh = OMV.Vector3.Zero;
+ angularLimitLow = OMV.Vector3.Zero;
+ angularLimitHigh = OMV.Vector3.Zero;
+ useFrameOffset = BSParam.LinkConstraintUseFrameOffset;
+ enableTransMotor = BSParam.LinkConstraintEnableTransMotor;
+ transMotorMaxVel = BSParam.LinkConstraintTransMotorMaxVel;
+ transMotorMaxForce = BSParam.LinkConstraintTransMotorMaxForce;
+ cfm = BSParam.LinkConstraintCFM;
+ erp = BSParam.LinkConstraintERP;
+ solverIterations = BSParam.LinkConstraintSolverIterations;
+ frameInAloc = OMV.Vector3.Zero;
+ frameInArot = OMV.Quaternion.Identity;
+ frameInBloc = OMV.Vector3.Zero;
+ frameInBrot = OMV.Quaternion.Identity;
+ useLinearReferenceFrameA = true;
+ springAxisEnable = new bool[6];
+ springDamping = new float[6];
+ springStiffness = new float[6];
+ for (int ii = 0; ii < springAxisEnable.Length; ii++)
+ {
+ springAxisEnable[ii] = false;
+ springDamping[ii] = BSAPITemplate.SPRING_NOT_SPECIFIED;
+ springStiffness[ii] = BSAPITemplate.SPRING_NOT_SPECIFIED;
+ }
+ springLinearEquilibriumPoint = OMV.Vector3.Zero;
+ springAngularEquilibriumPoint = OMV.Vector3.Zero;
+ member.PhysScene.DetailLog("{0},BSLinkInfoConstraint.ResetLink", member.LocalID);
+ }
+
+ // Given a constraint, apply the current constraint parameters to same.
+ public override void SetLinkParameters(BSConstraint constrain)
+ {
+ member.PhysScene.DetailLog("{0},BSLinkInfoConstraint.SetLinkParameters,type={1}", member.LocalID, constraintType);
+ switch (constraintType)
+ {
+ case ConstraintType.BS_FIXED_CONSTRAINT_TYPE:
+ case ConstraintType.D6_CONSTRAINT_TYPE:
+ BSConstraint6Dof constrain6dof = constrain as BSConstraint6Dof;
+ if (constrain6dof != null)
+ {
+ // NOTE: D6_SPRING_CONSTRAINT_TYPE should be updated if you change any of this code.
+ // zero linear and angular limits makes the objects unable to move in relation to each other
+ constrain6dof.SetLinearLimits(linearLimitLow, linearLimitHigh);
+ constrain6dof.SetAngularLimits(angularLimitLow, angularLimitHigh);
+
+ // tweek the constraint to increase stability
+ constrain6dof.UseFrameOffset(useFrameOffset);
+ constrain6dof.TranslationalLimitMotor(enableTransMotor, transMotorMaxVel, transMotorMaxForce);
+ constrain6dof.SetCFMAndERP(cfm, erp);
+ if (solverIterations != 0f)
+ {
+ constrain6dof.SetSolverIterations(solverIterations);
+ }
+ }
+ break;
+ case ConstraintType.D6_SPRING_CONSTRAINT_TYPE:
+ BSConstraintSpring constrainSpring = constrain as BSConstraintSpring;
+ if (constrainSpring != null)
+ {
+ // zero linear and angular limits makes the objects unable to move in relation to each other
+ constrainSpring.SetLinearLimits(linearLimitLow, linearLimitHigh);
+ constrainSpring.SetAngularLimits(angularLimitLow, angularLimitHigh);
+
+ // tweek the constraint to increase stability
+ constrainSpring.UseFrameOffset(useFrameOffset);
+ constrainSpring.TranslationalLimitMotor(enableTransMotor, transMotorMaxVel, transMotorMaxForce);
+ constrainSpring.SetCFMAndERP(cfm, erp);
+ if (solverIterations != 0f)
+ {
+ constrainSpring.SetSolverIterations(solverIterations);
+ }
+ for (int ii = 0; ii < springAxisEnable.Length; ii++)
+ {
+ constrainSpring.SetAxisEnable(ii, springAxisEnable[ii]);
+ if (springDamping[ii] != BSAPITemplate.SPRING_NOT_SPECIFIED)
+ constrainSpring.SetDamping(ii, springDamping[ii]);
+ if (springStiffness[ii] != BSAPITemplate.SPRING_NOT_SPECIFIED)
+ constrainSpring.SetStiffness(ii, springStiffness[ii]);
+ }
+ constrainSpring.CalculateTransforms();
+
+ if (springLinearEquilibriumPoint != OMV.Vector3.Zero)
+ constrainSpring.SetEquilibriumPoint(springLinearEquilibriumPoint, springAngularEquilibriumPoint);
+ else
+ constrainSpring.SetEquilibriumPoint(BSAPITemplate.SPRING_NOT_SPECIFIED, BSAPITemplate.SPRING_NOT_SPECIFIED);
+ }
+ break;
+ default:
+ break;
+ }
+ }
+
+ // Return 'true' if the property updates from the physics engine should be reported
+ // to the simulator.
+ // If the constraint is fixed, we don't need to report as the simulator and viewer will
+ // report the right things.
+ public override bool ShouldUpdateChildProperties()
+ {
+ bool ret = true;
+ if (constraintType == ConstraintType.BS_FIXED_CONSTRAINT_TYPE)
+ ret = false;
+
+ return ret;
}
- springLinearEquilibriumPoint = OMV.Vector3.Zero;
- springAngularEquilibriumPoint = OMV.Vector3.Zero;
- member.PhysScene.DetailLog("{0},BSLinkInfoConstraint.ResetLink", member.LocalID);
}
- // Given a constraint, apply the current constraint parameters to same.
- public override void SetLinkParameters(BSConstraint constrain)
+ public BSLinksetConstraints(BSScene scene, BSPrimLinkable parent) : base(scene, parent)
{
- member.PhysScene.DetailLog("{0},BSLinkInfoConstraint.SetLinkParameters,type={1}", member.LocalID, constraintType);
- switch (constraintType)
+ LinksetImpl = LinksetImplementation.Constraint;
+ }
+
+ private static string LogHeader = "[BULLETSIM LINKSET CONSTRAINT]";
+
+ // 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(BSPrimLinkable requestor)
+ {
+ ScheduleRebuild(requestor);
+ base.Refresh(requestor);
+
+ }
+
+ private void ScheduleRebuild(BSPrimLinkable requestor)
+ {
+ DetailLog("{0},BSLinksetConstraint.ScheduleRebuild,,rebuilding={1},hasChildren={2},actuallyScheduling={3}",
+ requestor.LocalID, Rebuilding, HasAnyChildren, (!Rebuilding && HasAnyChildren));
+
+ // When rebuilding, it is possible to set properties that would normally require a rebuild.
+ // If already rebuilding, don't request another rebuild.
+ // If a linkset with just a root prim (simple non-linked prim) don't bother rebuilding.
+ lock (this)
+ {
+ if (!RebuildScheduled)
+ {
+ if (!Rebuilding && HasAnyChildren)
+ {
+ RebuildScheduled = true;
+ // Queue to happen after all the other taint processing
+ m_physicsScene.PostTaintObject("BSLinksetContraints.Refresh", requestor.LocalID, delegate()
+ {
+ if (HasAnyChildren)
+ {
+ // Constraints that have not been changed are not rebuild but make sure
+ // the constraint of the requestor is rebuilt.
+ PhysicallyUnlinkAChildFromRoot(LinksetRoot, requestor);
+ // Rebuild the linkset and all its constraints.
+ RecomputeLinksetConstraints();
+ }
+ RebuildScheduled = false;
+ });
+ }
+ }
+ }
+ }
+
+ // 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(BSPrimLinkable child)
+ {
+ bool ret = false;
+ DetailLog("{0},BSLinksetConstraints.MakeDynamic,call,IsRoot={1}", child.LocalID, IsRoot(child));
+ if (IsRoot(child))
+ {
+ // The root is going dynamic. Rebuild the linkset so parts and mass get computed properly.
+ Refresh(LinksetRoot);
+ }
+ 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(BSPrimLinkable child)
+ {
+ bool ret = false;
+
+ DetailLog("{0},BSLinksetConstraint.MakeStatic,call,IsRoot={1}", child.LocalID, IsRoot(child));
+ child.ClearDisplacement();
+ if (IsRoot(child))
+ {
+ // Schedule a rebuild to verify that the root shape is set to the real shape.
+ Refresh(LinksetRoot);
+ }
+ return ret;
+ }
+
+ // Called at taint-time!!
+ public override void UpdateProperties(UpdatedProperties whichUpdated, BSPrimLinkable pObj)
+ {
+ // 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 RemoveDependencies(BSPrimLinkable child)
+ {
+ bool ret = false;
+
+ DetailLog("{0},BSLinksetConstraint.RemoveDependencies,removeChildrenForRoot,rID={1},rBody={2}",
+ child.LocalID, LinksetRoot.LocalID, LinksetRoot.PhysBody.AddrString);
+
+ 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;
+ }
+
+ // ================================================================
+
+ // Add a new child to the linkset.
+ // Called while LinkActivity is locked.
+ protected override void AddChildToLinkset(BSPrimLinkable child)
+ {
+ if (!HasChild(child))
+ {
+ m_children.Add(child, new BSLinkInfoConstraint(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(BSPrimLinkable child, bool inTaintTime)
+ {
+ if (m_children.Remove(child))
+ {
+ BSPrimLinkable rootx = LinksetRoot; // capture the root and body as of now
+ BSPrimLinkable childx = child;
+
+ DetailLog("{0},BSLinksetConstraints.RemoveChildFromLinkset,call,rID={1},rBody={2},cID={3},cBody={4}",
+ childx.LocalID,
+ rootx.LocalID, rootx.PhysBody.AddrString,
+ childx.LocalID, childx.PhysBody.AddrString);
+
+ m_physicsScene.TaintedObject(inTaintTime, childx.LocalID, "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(BSPrimLinkable rootPrim, BSPrimLinkable childPrim)
+ {
+ // Don't build the constraint when asked. Put it off until just before the simulation step.
+ Refresh(rootPrim);
+ }
+
+ // Create a static constraint between the two passed objects
+ private BSConstraint BuildConstraint(BSPrimLinkable rootPrim, BSLinkInfo li)
+ {
+ BSLinkInfoConstraint linkInfo = li as BSLinkInfoConstraint;
+ if (linkInfo == null)
+ return null;
+
+ // Zero motion for children so they don't interpolate
+ li.member.ZeroMotion(true);
+
+ BSConstraint constrain = null;
+
+ switch (linkInfo.constraintType)
{
case ConstraintType.BS_FIXED_CONSTRAINT_TYPE:
case ConstraintType.D6_CONSTRAINT_TYPE:
- BSConstraint6Dof constrain6dof = constrain as BSConstraint6Dof;
- if (constrain6dof != null)
- {
- // NOTE: D6_SPRING_CONSTRAINT_TYPE should be updated if you change any of this code.
- // zero linear and angular limits makes the objects unable to move in relation to each other
- constrain6dof.SetLinearLimits(linearLimitLow, linearLimitHigh);
- constrain6dof.SetAngularLimits(angularLimitLow, angularLimitHigh);
+ // Relative position normalized to the root prim
+ // Essentually a vector pointing from center of rootPrim to center of li.member
+ OMV.Vector3 childRelativePosition = linkInfo.member.Position - rootPrim.Position;
+
+ // real world coordinate of midpoint between the two objects
+ OMV.Vector3 midPoint = rootPrim.Position + (childRelativePosition / 2);
+
+ DetailLog("{0},BSLinksetConstraint.BuildConstraint,6Dof,rBody={1},cBody={2},rLoc={3},cLoc={4},midLoc={5}",
+ rootPrim.LocalID, rootPrim.PhysBody, linkInfo.member.PhysBody,
+ rootPrim.Position, linkInfo.member.Position, midPoint);
+
+ // create a constraint that allows no freedom of movement between the two objects
+ // http://bulletphysics.org/Bullet/phpBB3/viewtopic.php?t=4818
+
+ constrain = new BSConstraint6Dof(
+ m_physicsScene.World, rootPrim.PhysBody, linkInfo.member.PhysBody, 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 = (liConstraint.member.Position - rootPrim.Position) * invThisOrientation;
+
+ // relative rotation of the child to the parent
+ OMV.Quaternion childRelativeRotation = invThisOrientation * liConstraint.member.Orientation;
+ OMV.Quaternion inverseChildRelativeRotation = OMV.Quaternion.Inverse(childRelativeRotation);
+
+ DetailLog("{0},BSLinksetConstraint.PhysicallyLinkAChildToRoot,taint,root={1},child={2}", rootPrim.LocalID, rootPrim.LocalID, liConstraint.member.LocalID);
+ constrain = new BS6DofConstraint(
+ PhysicsScene.World, rootPrim.Body, liConstraint.member.Body,
+ OMV.Vector3.Zero,
+ OMV.Quaternion.Inverse(rootPrim.Orientation),
+ OMV.Vector3.Zero,
+ OMV.Quaternion.Inverse(liConstraint.member.Orientation),
+ true,
+ true
+ );
+ // ==================================================================================
+ */
- // tweek the constraint to increase stability
- constrain6dof.UseFrameOffset(useFrameOffset);
- constrain6dof.TranslationalLimitMotor(enableTransMotor, transMotorMaxVel, transMotorMaxForce);
- constrain6dof.SetCFMAndERP(cfm, erp);
- if (solverIterations != 0f)
- {
- constrain6dof.SetSolverIterations(solverIterations);
- }
- }
break;
case ConstraintType.D6_SPRING_CONSTRAINT_TYPE:
- BSConstraintSpring constrainSpring = constrain as BSConstraintSpring;
- if (constrainSpring != null)
- {
- // zero linear and angular limits makes the objects unable to move in relation to each other
- constrainSpring.SetLinearLimits(linearLimitLow, linearLimitHigh);
- constrainSpring.SetAngularLimits(angularLimitLow, angularLimitHigh);
+ constrain = new BSConstraintSpring(m_physicsScene.World, rootPrim.PhysBody, linkInfo.member.PhysBody,
+ linkInfo.frameInAloc, linkInfo.frameInArot, linkInfo.frameInBloc, linkInfo.frameInBrot,
+ linkInfo.useLinearReferenceFrameA,
+ true /*disableCollisionsBetweenLinkedBodies*/);
+ DetailLog("{0},BSLinksetConstraint.BuildConstraint,spring,root={1},rBody={2},child={3},cBody={4},rLoc={5},cLoc={6}",
+ rootPrim.LocalID,
+ rootPrim.LocalID, rootPrim.PhysBody.AddrString,
+ linkInfo.member.LocalID, linkInfo.member.PhysBody.AddrString,
+ rootPrim.Position, linkInfo.member.Position);
- // tweek the constraint to increase stability
- constrainSpring.UseFrameOffset(useFrameOffset);
- constrainSpring.TranslationalLimitMotor(enableTransMotor, transMotorMaxVel, transMotorMaxForce);
- constrainSpring.SetCFMAndERP(cfm, erp);
- if (solverIterations != 0f)
- {
- constrainSpring.SetSolverIterations(solverIterations);
- }
- for (int ii = 0; ii < springAxisEnable.Length; ii++)
- {
- constrainSpring.SetAxisEnable(ii, springAxisEnable[ii]);
- if (springDamping[ii] != BSAPITemplate.SPRING_NOT_SPECIFIED)
- constrainSpring.SetDamping(ii, springDamping[ii]);
- if (springStiffness[ii] != BSAPITemplate.SPRING_NOT_SPECIFIED)
- constrainSpring.SetStiffness(ii, springStiffness[ii]);
- }
- constrainSpring.CalculateTransforms();
-
- if (springLinearEquilibriumPoint != OMV.Vector3.Zero)
- constrainSpring.SetEquilibriumPoint(springLinearEquilibriumPoint, springAngularEquilibriumPoint);
- else
- constrainSpring.SetEquilibriumPoint(BSAPITemplate.SPRING_NOT_SPECIFIED, BSAPITemplate.SPRING_NOT_SPECIFIED);
- }
break;
default:
break;
}
+
+ linkInfo.SetLinkParameters(constrain);
+
+ m_physicsScene.Constraints.AddConstraint(constrain);
+
+ return constrain;
}
- // Return 'true' if the property updates from the physics engine should be reported
- // to the simulator.
- // If the constraint is fixed, we don't need to report as the simulator and viewer will
- // report the right things.
- public override bool ShouldUpdateChildProperties()
+ // 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(BSPrimLinkable rootPrim, BSPrimLinkable childPrim)
{
- bool ret = true;
- if (constraintType == ConstraintType.BS_FIXED_CONSTRAINT_TYPE)
- ret = false;
+ bool ret = false;
+ DetailLog("{0},BSLinksetConstraint.PhysicallyUnlinkAChildFromRoot,taint,root={1},rBody={2},child={3},cBody={4}",
+ rootPrim.LocalID,
+ rootPrim.LocalID, rootPrim.PhysBody.AddrString,
+ childPrim.LocalID, childPrim.PhysBody.AddrString);
+
+ // If asked to unlink root from root, just remove all the constraints
+ if (rootPrim == childPrim || childPrim == LinksetRoot)
+ {
+ PhysicallyUnlinkAllChildrenFromRoot(LinksetRoot);
+ ret = true;
+ }
+ else
+ {
+ // Find the constraint for this link and get rid of it from the overall collection and from my list
+ if (m_physicsScene.Constraints.RemoveAndDestroyConstraint(rootPrim.PhysBody, childPrim.PhysBody))
+ {
+ // Make the child refresh its location
+ m_physicsScene.PE.PushUpdate(childPrim.PhysBody);
+ ret = true;
+ }
+ }
return ret;
}
- }
- public BSLinksetConstraints(BSScene scene, BSPrimLinkable parent) : base(scene, parent)
- {
- LinksetImpl = LinksetImplementation.Constraint;
- }
-
- private static string LogHeader = "[BULLETSIM LINKSET CONSTRAINT]";
-
- // 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(BSPrimLinkable requestor)
- {
- ScheduleRebuild(requestor);
- base.Refresh(requestor);
-
- }
-
- private void ScheduleRebuild(BSPrimLinkable requestor)
- {
- DetailLog("{0},BSLinksetConstraint.ScheduleRebuild,,rebuilding={1},hasChildren={2},actuallyScheduling={3}",
- requestor.LocalID, Rebuilding, HasAnyChildren, (!Rebuilding && HasAnyChildren));
-
- // When rebuilding, it is possible to set properties that would normally require a rebuild.
- // If already rebuilding, don't request another rebuild.
- // If a linkset with just a root prim (simple non-linked prim) don't bother rebuilding.
- lock (this)
+ // 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(BSPrimLinkable rootPrim)
{
- if (!RebuildScheduled)
+ DetailLog("{0},BSLinksetConstraint.PhysicallyUnlinkAllChildren,taint", rootPrim.LocalID);
+
+ return m_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, true);
+
+ DetailLog("{0},BSLinksetConstraint.RecomputeLinksetConstraints,set,rBody={1},linksetMass={2}",
+ LinksetRoot.LocalID, LinksetRoot.PhysBody.AddrString, linksetMass);
+
+ try
{
- if (!Rebuilding && HasAnyChildren)
+ Rebuilding = true;
+
+ // There is no reason to build all this physical stuff for a non-physical linkset.
+ if (!LinksetRoot.IsPhysicallyActive || !HasAnyChildren)
{
- RebuildScheduled = true;
- // Queue to happen after all the other taint processing
- m_physicsScene.PostTaintObject("BSLinksetContraints.Refresh", requestor.LocalID, delegate()
+ DetailLog("{0},BSLinksetConstraint.RecomputeLinksetCompound,notPhysicalOrNoChildren", LinksetRoot.LocalID);
+ return; // Note the 'finally' clause at the botton which will get executed.
+ }
+
+ ForEachLinkInfo((li) =>
+ {
+ // 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.)
+ li.member.UpdatePhysicalMassProperties(linksetMass, true);
+
+ BSConstraint constrain;
+ if (!m_physicsScene.Constraints.TryGetConstraint(LinksetRoot.PhysBody, li.member.PhysBody, out constrain))
{
- if (HasAnyChildren)
+ // If constraint doesn't exist yet, create it.
+ constrain = BuildConstraint(LinksetRoot, li);
+ }
+ li.SetLinkParameters(constrain);
+ constrain.RecomputeConstraintVariables(linksetMass);
+
+ // PhysicsScene.PE.DumpConstraint(PhysicsScene.World, constrain.Constraint); // DEBUG DEBUG
+ return false; // 'false' says to keep processing other members
+ });
+ }
+ finally
+ {
+ Rebuilding = false;
+ }
+ }
+
+ #region Extension
+ public override object Extension(string pFunct, params object[] pParams)
+ {
+ object ret = null;
+ switch (pFunct)
+ {
+ // pParams = [ BSPhysObject root, BSPhysObject child, integer linkType ]
+ case ExtendedPhysics.PhysFunctChangeLinkType:
+ if (pParams.Length > 2)
+ {
+ int requestedType = (int)pParams[2];
+ DetailLog("{0},BSLinksetConstraint.ChangeLinkType,requestedType={1}", LinksetRoot.LocalID, requestedType);
+ if (requestedType == (int)ConstraintType.BS_FIXED_CONSTRAINT_TYPE
+ || requestedType == (int)ConstraintType.D6_CONSTRAINT_TYPE
+ || requestedType == (int)ConstraintType.D6_SPRING_CONSTRAINT_TYPE
+ || requestedType == (int)ConstraintType.HINGE_CONSTRAINT_TYPE
+ || requestedType == (int)ConstraintType.CONETWIST_CONSTRAINT_TYPE
+ || requestedType == (int)ConstraintType.SLIDER_CONSTRAINT_TYPE)
{
- // Constraints that have not been changed are not rebuild but make sure
- // the constraint of the requestor is rebuilt.
- PhysicallyUnlinkAChildFromRoot(LinksetRoot, requestor);
- // Rebuild the linkset and all its constraints.
- RecomputeLinksetConstraints();
+ BSPrimLinkable child = pParams[1] as BSPrimLinkable;
+ if (child != null)
+ {
+ DetailLog("{0},BSLinksetConstraint.ChangeLinkType,rootID={1},childID={2},type={3}",
+ LinksetRoot.LocalID, LinksetRoot.LocalID, child.LocalID, requestedType);
+ m_physicsScene.TaintedObject(child.LocalID, "BSLinksetConstraint.PhysFunctChangeLinkType", delegate()
+ {
+ // Pick up all the constraints currently created.
+ RemoveDependencies(child);
+
+ BSLinkInfo linkInfo = null;
+ if (TryGetLinkInfo(child, out linkInfo))
+ {
+ BSLinkInfoConstraint linkInfoC = linkInfo as BSLinkInfoConstraint;
+ if (linkInfoC != null)
+ {
+ linkInfoC.constraintType = (ConstraintType)requestedType;
+ ret = (object)true;
+ DetailLog("{0},BSLinksetConstraint.ChangeLinkType,link={1},type={2}",
+ linkInfo.member.LocalID, linkInfo.member.LocalID, linkInfoC.constraintType);
+ }
+ else
+ {
+ DetailLog("{0},BSLinksetConstraint.ChangeLinkType,linkInfoNotConstraint,childID={1}", LinksetRoot.LocalID, child.LocalID);
+ }
+ }
+ else
+ {
+ DetailLog("{0},BSLinksetConstraint.ChangeLinkType,noLinkInfoForChild,childID={1}", LinksetRoot.LocalID, child.LocalID);
+ }
+ // Cause the whole linkset to be rebuilt in post-taint time.
+ Refresh(child);
+ });
+ }
+ else
+ {
+ DetailLog("{0},BSLinksetConstraint.SetLinkType,childNotBSPrimLinkable", LinksetRoot.LocalID);
+ }
}
- RebuildScheduled = false;
- });
- }
- }
- }
- }
-
- // 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(BSPrimLinkable child)
- {
- bool ret = false;
- DetailLog("{0},BSLinksetConstraints.MakeDynamic,call,IsRoot={1}", child.LocalID, IsRoot(child));
- if (IsRoot(child))
- {
- // The root is going dynamic. Rebuild the linkset so parts and mass get computed properly.
- Refresh(LinksetRoot);
- }
- 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(BSPrimLinkable child)
- {
- bool ret = false;
-
- DetailLog("{0},BSLinksetConstraint.MakeStatic,call,IsRoot={1}", child.LocalID, IsRoot(child));
- child.ClearDisplacement();
- if (IsRoot(child))
- {
- // Schedule a rebuild to verify that the root shape is set to the real shape.
- Refresh(LinksetRoot);
- }
- return ret;
- }
-
- // Called at taint-time!!
- public override void UpdateProperties(UpdatedProperties whichUpdated, BSPrimLinkable pObj)
- {
- // 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 RemoveDependencies(BSPrimLinkable child)
- {
- bool ret = false;
-
- DetailLog("{0},BSLinksetConstraint.RemoveDependencies,removeChildrenForRoot,rID={1},rBody={2}",
- child.LocalID, LinksetRoot.LocalID, LinksetRoot.PhysBody.AddrString);
-
- 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;
- }
-
- // ================================================================
-
- // Add a new child to the linkset.
- // Called while LinkActivity is locked.
- protected override void AddChildToLinkset(BSPrimLinkable child)
- {
- if (!HasChild(child))
- {
- m_children.Add(child, new BSLinkInfoConstraint(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(BSPrimLinkable child, bool inTaintTime)
- {
- if (m_children.Remove(child))
- {
- BSPrimLinkable rootx = LinksetRoot; // capture the root and body as of now
- BSPrimLinkable childx = child;
-
- DetailLog("{0},BSLinksetConstraints.RemoveChildFromLinkset,call,rID={1},rBody={2},cID={3},cBody={4}",
- childx.LocalID,
- rootx.LocalID, rootx.PhysBody.AddrString,
- childx.LocalID, childx.PhysBody.AddrString);
-
- m_physicsScene.TaintedObject(inTaintTime, childx.LocalID, "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(BSPrimLinkable rootPrim, BSPrimLinkable childPrim)
- {
- // Don't build the constraint when asked. Put it off until just before the simulation step.
- Refresh(rootPrim);
- }
-
- // Create a static constraint between the two passed objects
- private BSConstraint BuildConstraint(BSPrimLinkable rootPrim, BSLinkInfo li)
- {
- BSLinkInfoConstraint linkInfo = li as BSLinkInfoConstraint;
- if (linkInfo == null)
- return null;
-
- // Zero motion for children so they don't interpolate
- li.member.ZeroMotion(true);
-
- BSConstraint constrain = null;
-
- switch (linkInfo.constraintType)
- {
- case ConstraintType.BS_FIXED_CONSTRAINT_TYPE:
- case ConstraintType.D6_CONSTRAINT_TYPE:
- // Relative position normalized to the root prim
- // Essentually a vector pointing from center of rootPrim to center of li.member
- OMV.Vector3 childRelativePosition = linkInfo.member.Position - rootPrim.Position;
-
- // real world coordinate of midpoint between the two objects
- OMV.Vector3 midPoint = rootPrim.Position + (childRelativePosition / 2);
-
- DetailLog("{0},BSLinksetConstraint.BuildConstraint,6Dof,rBody={1},cBody={2},rLoc={3},cLoc={4},midLoc={5}",
- rootPrim.LocalID, rootPrim.PhysBody, linkInfo.member.PhysBody,
- rootPrim.Position, linkInfo.member.Position, midPoint);
-
- // create a constraint that allows no freedom of movement between the two objects
- // http://bulletphysics.org/Bullet/phpBB3/viewtopic.php?t=4818
-
- constrain = new BSConstraint6Dof(
- m_physicsScene.World, rootPrim.PhysBody, linkInfo.member.PhysBody, 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 = (liConstraint.member.Position - rootPrim.Position) * invThisOrientation;
-
- // relative rotation of the child to the parent
- OMV.Quaternion childRelativeRotation = invThisOrientation * liConstraint.member.Orientation;
- OMV.Quaternion inverseChildRelativeRotation = OMV.Quaternion.Inverse(childRelativeRotation);
-
- DetailLog("{0},BSLinksetConstraint.PhysicallyLinkAChildToRoot,taint,root={1},child={2}", rootPrim.LocalID, rootPrim.LocalID, liConstraint.member.LocalID);
- constrain = new BS6DofConstraint(
- PhysicsScene.World, rootPrim.Body, liConstraint.member.Body,
- OMV.Vector3.Zero,
- OMV.Quaternion.Inverse(rootPrim.Orientation),
- OMV.Vector3.Zero,
- OMV.Quaternion.Inverse(liConstraint.member.Orientation),
- true,
- true
- );
- // ==================================================================================
- */
-
- break;
- case ConstraintType.D6_SPRING_CONSTRAINT_TYPE:
- constrain = new BSConstraintSpring(m_physicsScene.World, rootPrim.PhysBody, linkInfo.member.PhysBody,
- linkInfo.frameInAloc, linkInfo.frameInArot, linkInfo.frameInBloc, linkInfo.frameInBrot,
- linkInfo.useLinearReferenceFrameA,
- true /*disableCollisionsBetweenLinkedBodies*/);
- DetailLog("{0},BSLinksetConstraint.BuildConstraint,spring,root={1},rBody={2},child={3},cBody={4},rLoc={5},cLoc={6}",
- rootPrim.LocalID,
- rootPrim.LocalID, rootPrim.PhysBody.AddrString,
- linkInfo.member.LocalID, linkInfo.member.PhysBody.AddrString,
- rootPrim.Position, linkInfo.member.Position);
-
- break;
- default:
- break;
- }
-
- linkInfo.SetLinkParameters(constrain);
-
- m_physicsScene.Constraints.AddConstraint(constrain);
-
- 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(BSPrimLinkable rootPrim, BSPrimLinkable childPrim)
- {
- bool ret = false;
- DetailLog("{0},BSLinksetConstraint.PhysicallyUnlinkAChildFromRoot,taint,root={1},rBody={2},child={3},cBody={4}",
- rootPrim.LocalID,
- rootPrim.LocalID, rootPrim.PhysBody.AddrString,
- childPrim.LocalID, childPrim.PhysBody.AddrString);
-
- // If asked to unlink root from root, just remove all the constraints
- if (rootPrim == childPrim || childPrim == LinksetRoot)
- {
- PhysicallyUnlinkAllChildrenFromRoot(LinksetRoot);
- ret = true;
- }
- else
- {
- // Find the constraint for this link and get rid of it from the overall collection and from my list
- if (m_physicsScene.Constraints.RemoveAndDestroyConstraint(rootPrim.PhysBody, childPrim.PhysBody))
- {
- // Make the child refresh its location
- m_physicsScene.PE.PushUpdate(childPrim.PhysBody);
- 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(BSPrimLinkable rootPrim)
- {
- DetailLog("{0},BSLinksetConstraint.PhysicallyUnlinkAllChildren,taint", rootPrim.LocalID);
-
- return m_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, true);
-
- DetailLog("{0},BSLinksetConstraint.RecomputeLinksetConstraints,set,rBody={1},linksetMass={2}",
- LinksetRoot.LocalID, LinksetRoot.PhysBody.AddrString, linksetMass);
-
- try
- {
- Rebuilding = true;
-
- // There is no reason to build all this physical stuff for a non-physical linkset.
- if (!LinksetRoot.IsPhysicallyActive || !HasAnyChildren)
- {
- DetailLog("{0},BSLinksetConstraint.RecomputeLinksetCompound,notPhysicalOrNoChildren", LinksetRoot.LocalID);
- return; // Note the 'finally' clause at the botton which will get executed.
- }
-
- ForEachLinkInfo((li) =>
- {
- // 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.)
- li.member.UpdatePhysicalMassProperties(linksetMass, true);
-
- BSConstraint constrain;
- if (!m_physicsScene.Constraints.TryGetConstraint(LinksetRoot.PhysBody, li.member.PhysBody, out constrain))
- {
- // If constraint doesn't exist yet, create it.
- constrain = BuildConstraint(LinksetRoot, li);
- }
- li.SetLinkParameters(constrain);
- constrain.RecomputeConstraintVariables(linksetMass);
-
- // PhysicsScene.PE.DumpConstraint(PhysicsScene.World, constrain.Constraint); // DEBUG DEBUG
- return false; // 'false' says to keep processing other members
- });
- }
- finally
- {
- Rebuilding = false;
- }
- }
-
- #region Extension
- public override object Extension(string pFunct, params object[] pParams)
- {
- object ret = null;
- switch (pFunct)
- {
- // pParams = [ BSPhysObject root, BSPhysObject child, integer linkType ]
- case ExtendedPhysics.PhysFunctChangeLinkType:
- if (pParams.Length > 2)
- {
- int requestedType = (int)pParams[2];
- DetailLog("{0},BSLinksetConstraint.ChangeLinkType,requestedType={1}", LinksetRoot.LocalID, requestedType);
- if (requestedType == (int)ConstraintType.BS_FIXED_CONSTRAINT_TYPE
- || requestedType == (int)ConstraintType.D6_CONSTRAINT_TYPE
- || requestedType == (int)ConstraintType.D6_SPRING_CONSTRAINT_TYPE
- || requestedType == (int)ConstraintType.HINGE_CONSTRAINT_TYPE
- || requestedType == (int)ConstraintType.CONETWIST_CONSTRAINT_TYPE
- || requestedType == (int)ConstraintType.SLIDER_CONSTRAINT_TYPE)
+ else
+ {
+ DetailLog("{0},BSLinksetConstraint.SetLinkType,illegalRequestedType,reqested={1},spring={2}",
+ LinksetRoot.LocalID, requestedType, ((int)ConstraintType.D6_SPRING_CONSTRAINT_TYPE));
+ }
+ }
+ break;
+ // pParams = [ BSPhysObject root, BSPhysObject child ]
+ case ExtendedPhysics.PhysFunctGetLinkType:
+ if (pParams.Length > 0)
{
BSPrimLinkable child = pParams[1] as BSPrimLinkable;
if (child != null)
{
- DetailLog("{0},BSLinksetConstraint.ChangeLinkType,rootID={1},childID={2},type={3}",
- LinksetRoot.LocalID, LinksetRoot.LocalID, child.LocalID, requestedType);
- m_physicsScene.TaintedObject(child.LocalID, "BSLinksetConstraint.PhysFunctChangeLinkType", delegate()
+ BSLinkInfo linkInfo = null;
+ if (TryGetLinkInfo(child, out linkInfo))
{
- // Pick up all the constraints currently created.
- RemoveDependencies(child);
-
- BSLinkInfo linkInfo = null;
- if (TryGetLinkInfo(child, out linkInfo))
+ BSLinkInfoConstraint linkInfoC = linkInfo as BSLinkInfoConstraint;
+ if (linkInfoC != null)
{
- BSLinkInfoConstraint linkInfoC = linkInfo as BSLinkInfoConstraint;
- if (linkInfoC != null)
- {
- linkInfoC.constraintType = (ConstraintType)requestedType;
- ret = (object)true;
- DetailLog("{0},BSLinksetConstraint.ChangeLinkType,link={1},type={2}",
- linkInfo.member.LocalID, linkInfo.member.LocalID, linkInfoC.constraintType);
- }
- else
- {
- DetailLog("{0},BSLinksetConstraint.ChangeLinkType,linkInfoNotConstraint,childID={1}", LinksetRoot.LocalID, child.LocalID);
- }
- }
- else
- {
- DetailLog("{0},BSLinksetConstraint.ChangeLinkType,noLinkInfoForChild,childID={1}", LinksetRoot.LocalID, child.LocalID);
- }
- // Cause the whole linkset to be rebuilt in post-taint time.
- Refresh(child);
- });
- }
- else
- {
- DetailLog("{0},BSLinksetConstraint.SetLinkType,childNotBSPrimLinkable", LinksetRoot.LocalID);
- }
- }
- else
- {
- DetailLog("{0},BSLinksetConstraint.SetLinkType,illegalRequestedType,reqested={1},spring={2}",
- LinksetRoot.LocalID, requestedType, ((int)ConstraintType.D6_SPRING_CONSTRAINT_TYPE));
- }
- }
- break;
- // pParams = [ BSPhysObject root, BSPhysObject child ]
- case ExtendedPhysics.PhysFunctGetLinkType:
- if (pParams.Length > 0)
- {
- BSPrimLinkable child = pParams[1] as BSPrimLinkable;
- if (child != null)
- {
- BSLinkInfo linkInfo = null;
- if (TryGetLinkInfo(child, out linkInfo))
- {
- BSLinkInfoConstraint linkInfoC = linkInfo as BSLinkInfoConstraint;
- if (linkInfoC != null)
- {
- ret = (object)(int)linkInfoC.constraintType;
- DetailLog("{0},BSLinksetConstraint.GetLinkType,link={1},type={2}",
- linkInfo.member.LocalID, linkInfo.member.LocalID, linkInfoC.constraintType);
+ ret = (object)(int)linkInfoC.constraintType;
+ DetailLog("{0},BSLinksetConstraint.GetLinkType,link={1},type={2}",
+ linkInfo.member.LocalID, linkInfo.member.LocalID, linkInfoC.constraintType);
+ }
}
}
}
- }
- break;
- // pParams = [ BSPhysObject root, BSPhysObject child, int op, object opParams, int op, object opParams, ... ]
- case ExtendedPhysics.PhysFunctChangeLinkParams:
- // There should be two parameters: the childActor and a list of parameters to set
- if (pParams.Length > 2)
- {
- BSPrimLinkable child = pParams[1] as BSPrimLinkable;
- BSLinkInfo baseLinkInfo = null;
- if (TryGetLinkInfo(child, out baseLinkInfo))
+ break;
+ // pParams = [ BSPhysObject root, BSPhysObject child, int op, object opParams, int op, object opParams, ... ]
+ case ExtendedPhysics.PhysFunctChangeLinkParams:
+ // There should be two parameters: the childActor and a list of parameters to set
+ if (pParams.Length > 2)
{
- BSLinkInfoConstraint linkInfo = baseLinkInfo as BSLinkInfoConstraint;
- if (linkInfo != null)
+ BSPrimLinkable child = pParams[1] as BSPrimLinkable;
+ BSLinkInfo baseLinkInfo = null;
+ if (TryGetLinkInfo(child, out baseLinkInfo))
{
- int valueInt;
- float valueFloat;
- bool valueBool;
- OMV.Vector3 valueVector;
- OMV.Vector3 valueVector2;
- OMV.Quaternion valueQuaternion;
- int axisLow, axisHigh;
-
- int opIndex = 2;
- while (opIndex < pParams.Length)
+ BSLinkInfoConstraint linkInfo = baseLinkInfo as BSLinkInfoConstraint;
+ if (linkInfo != null)
{
- int thisOp = 0;
- string errMsg = "";
- try
+ int valueInt;
+ float valueFloat;
+ bool valueBool;
+ OMV.Vector3 valueVector;
+ OMV.Vector3 valueVector2;
+ OMV.Quaternion valueQuaternion;
+ int axisLow, axisHigh;
+
+ int opIndex = 2;
+ while (opIndex < pParams.Length)
{
- thisOp = (int)pParams[opIndex];
- DetailLog("{0},BSLinksetConstraint.ChangeLinkParams2,op={1},val={2}",
- linkInfo.member.LocalID, thisOp, pParams[opIndex + 1]);
- switch (thisOp)
+ int thisOp = 0;
+ string errMsg = "";
+ try
{
- case ExtendedPhysics.PHYS_PARAM_LINK_TYPE:
- valueInt = (int)pParams[opIndex + 1];
- ConstraintType valueType = (ConstraintType)valueInt;
- if (valueType == ConstraintType.BS_FIXED_CONSTRAINT_TYPE
- || valueType == ConstraintType.D6_CONSTRAINT_TYPE
- || valueType == ConstraintType.D6_SPRING_CONSTRAINT_TYPE
- || valueType == ConstraintType.HINGE_CONSTRAINT_TYPE
- || valueType == ConstraintType.CONETWIST_CONSTRAINT_TYPE
- || valueType == ConstraintType.SLIDER_CONSTRAINT_TYPE)
- {
- linkInfo.constraintType = valueType;
- }
- opIndex += 2;
- break;
- case ExtendedPhysics.PHYS_PARAM_FRAMEINA_LOC:
- errMsg = "PHYS_PARAM_FRAMEINA_LOC takes one parameter of type vector";
- valueVector = (OMV.Vector3)pParams[opIndex + 1];
- linkInfo.frameInAloc = valueVector;
- opIndex += 2;
- break;
- case ExtendedPhysics.PHYS_PARAM_FRAMEINA_ROT:
- errMsg = "PHYS_PARAM_FRAMEINA_ROT takes one parameter of type rotation";
- valueQuaternion = (OMV.Quaternion)pParams[opIndex + 1];
- linkInfo.frameInArot = valueQuaternion;
- opIndex += 2;
- break;
- case ExtendedPhysics.PHYS_PARAM_FRAMEINB_LOC:
- errMsg = "PHYS_PARAM_FRAMEINB_LOC takes one parameter of type vector";
- valueVector = (OMV.Vector3)pParams[opIndex + 1];
- linkInfo.frameInBloc = valueVector;
- opIndex += 2;
- break;
- case ExtendedPhysics.PHYS_PARAM_FRAMEINB_ROT:
- errMsg = "PHYS_PARAM_FRAMEINB_ROT takes one parameter of type rotation";
- valueQuaternion = (OMV.Quaternion)pParams[opIndex + 1];
- linkInfo.frameInBrot = valueQuaternion;
- opIndex += 2;
- break;
- case ExtendedPhysics.PHYS_PARAM_LINEAR_LIMIT_LOW:
- errMsg = "PHYS_PARAM_LINEAR_LIMIT_LOW takes one parameter of type vector";
- valueVector = (OMV.Vector3)pParams[opIndex + 1];
- linkInfo.linearLimitLow = valueVector;
- opIndex += 2;
- break;
- case ExtendedPhysics.PHYS_PARAM_LINEAR_LIMIT_HIGH:
- errMsg = "PHYS_PARAM_LINEAR_LIMIT_HIGH takes one parameter of type vector";
- valueVector = (OMV.Vector3)pParams[opIndex + 1];
- linkInfo.linearLimitHigh = valueVector;
- opIndex += 2;
- break;
- case ExtendedPhysics.PHYS_PARAM_ANGULAR_LIMIT_LOW:
- errMsg = "PHYS_PARAM_ANGULAR_LIMIT_LOW takes one parameter of type vector";
- valueVector = (OMV.Vector3)pParams[opIndex + 1];
- linkInfo.angularLimitLow = valueVector;
- opIndex += 2;
- break;
- case ExtendedPhysics.PHYS_PARAM_ANGULAR_LIMIT_HIGH:
- errMsg = "PHYS_PARAM_ANGULAR_LIMIT_HIGH takes one parameter of type vector";
- valueVector = (OMV.Vector3)pParams[opIndex + 1];
- linkInfo.angularLimitHigh = valueVector;
- opIndex += 2;
- break;
- case ExtendedPhysics.PHYS_PARAM_USE_FRAME_OFFSET:
- errMsg = "PHYS_PARAM_USE_FRAME_OFFSET takes one parameter of type integer (bool)";
- valueBool = ((int)pParams[opIndex + 1]) != 0;
- linkInfo.useFrameOffset = valueBool;
- opIndex += 2;
- break;
- case ExtendedPhysics.PHYS_PARAM_ENABLE_TRANSMOTOR:
- errMsg = "PHYS_PARAM_ENABLE_TRANSMOTOR takes one parameter of type integer (bool)";
- valueBool = ((int)pParams[opIndex + 1]) != 0;
- linkInfo.enableTransMotor = valueBool;
- opIndex += 2;
- break;
- case ExtendedPhysics.PHYS_PARAM_TRANSMOTOR_MAXVEL:
- errMsg = "PHYS_PARAM_TRANSMOTOR_MAXVEL takes one parameter of type float";
- valueFloat = (float)pParams[opIndex + 1];
- linkInfo.transMotorMaxVel = valueFloat;
- opIndex += 2;
- break;
- case ExtendedPhysics.PHYS_PARAM_TRANSMOTOR_MAXFORCE:
- errMsg = "PHYS_PARAM_TRANSMOTOR_MAXFORCE takes one parameter of type float";
- valueFloat = (float)pParams[opIndex + 1];
- linkInfo.transMotorMaxForce = valueFloat;
- opIndex += 2;
- break;
- case ExtendedPhysics.PHYS_PARAM_CFM:
- errMsg = "PHYS_PARAM_CFM takes one parameter of type float";
- valueFloat = (float)pParams[opIndex + 1];
- linkInfo.cfm = valueFloat;
- opIndex += 2;
- break;
- case ExtendedPhysics.PHYS_PARAM_ERP:
- errMsg = "PHYS_PARAM_ERP takes one parameter of type float";
- valueFloat = (float)pParams[opIndex + 1];
- linkInfo.erp = valueFloat;
- opIndex += 2;
- break;
- case ExtendedPhysics.PHYS_PARAM_SOLVER_ITERATIONS:
- errMsg = "PHYS_PARAM_SOLVER_ITERATIONS takes one parameter of type float";
- valueFloat = (float)pParams[opIndex + 1];
- linkInfo.solverIterations = valueFloat;
- opIndex += 2;
- break;
- case ExtendedPhysics.PHYS_PARAM_SPRING_AXIS_ENABLE:
- errMsg = "PHYS_PARAM_SPRING_AXIS_ENABLE takes two parameters of types integer and integer (bool)";
- valueInt = (int)pParams[opIndex + 1];
- valueBool = ((int)pParams[opIndex + 2]) != 0;
- GetAxisRange(valueInt, out axisLow, out axisHigh);
- for (int ii = axisLow; ii <= axisHigh; ii++)
- linkInfo.springAxisEnable[ii] = valueBool;
- opIndex += 3;
- break;
- case ExtendedPhysics.PHYS_PARAM_SPRING_DAMPING:
- errMsg = "PHYS_PARAM_SPRING_DAMPING takes two parameters of types integer and float";
- valueInt = (int)pParams[opIndex + 1];
- valueFloat = (float)pParams[opIndex + 2];
- GetAxisRange(valueInt, out axisLow, out axisHigh);
- for (int ii = axisLow; ii <= axisHigh; ii++)
- linkInfo.springDamping[ii] = valueFloat;
- opIndex += 3;
- break;
- case ExtendedPhysics.PHYS_PARAM_SPRING_STIFFNESS:
- errMsg = "PHYS_PARAM_SPRING_STIFFNESS takes two parameters of types integer and float";
- valueInt = (int)pParams[opIndex + 1];
- valueFloat = (float)pParams[opIndex + 2];
- GetAxisRange(valueInt, out axisLow, out axisHigh);
- for (int ii = axisLow; ii <= axisHigh; ii++)
- linkInfo.springStiffness[ii] = valueFloat;
- opIndex += 3;
- break;
- case ExtendedPhysics.PHYS_PARAM_SPRING_EQUILIBRIUM_POINT:
- errMsg = "PHYS_PARAM_SPRING_EQUILIBRIUM_POINT takes two parameters of type vector";
- valueVector = (OMV.Vector3)pParams[opIndex + 1];
- valueVector2 = (OMV.Vector3)pParams[opIndex + 2];
- linkInfo.springLinearEquilibriumPoint = valueVector;
- linkInfo.springAngularEquilibriumPoint = valueVector2;
- opIndex += 3;
- break;
- case ExtendedPhysics.PHYS_PARAM_USE_LINEAR_FRAMEA:
- errMsg = "PHYS_PARAM_USE_LINEAR_FRAMEA takes one parameter of type integer (bool)";
- valueBool = ((int)pParams[opIndex + 1]) != 0;
- linkInfo.useLinearReferenceFrameA = valueBool;
- opIndex += 2;
- break;
- default:
- break;
+ thisOp = (int)pParams[opIndex];
+ DetailLog("{0},BSLinksetConstraint.ChangeLinkParams2,op={1},val={2}",
+ linkInfo.member.LocalID, thisOp, pParams[opIndex + 1]);
+ switch (thisOp)
+ {
+ case ExtendedPhysics.PHYS_PARAM_LINK_TYPE:
+ valueInt = (int)pParams[opIndex + 1];
+ ConstraintType valueType = (ConstraintType)valueInt;
+ if (valueType == ConstraintType.BS_FIXED_CONSTRAINT_TYPE
+ || valueType == ConstraintType.D6_CONSTRAINT_TYPE
+ || valueType == ConstraintType.D6_SPRING_CONSTRAINT_TYPE
+ || valueType == ConstraintType.HINGE_CONSTRAINT_TYPE
+ || valueType == ConstraintType.CONETWIST_CONSTRAINT_TYPE
+ || valueType == ConstraintType.SLIDER_CONSTRAINT_TYPE)
+ {
+ linkInfo.constraintType = valueType;
+ }
+ opIndex += 2;
+ break;
+ case ExtendedPhysics.PHYS_PARAM_FRAMEINA_LOC:
+ errMsg = "PHYS_PARAM_FRAMEINA_LOC takes one parameter of type vector";
+ valueVector = (OMV.Vector3)pParams[opIndex + 1];
+ linkInfo.frameInAloc = valueVector;
+ opIndex += 2;
+ break;
+ case ExtendedPhysics.PHYS_PARAM_FRAMEINA_ROT:
+ errMsg = "PHYS_PARAM_FRAMEINA_ROT takes one parameter of type rotation";
+ valueQuaternion = (OMV.Quaternion)pParams[opIndex + 1];
+ linkInfo.frameInArot = valueQuaternion;
+ opIndex += 2;
+ break;
+ case ExtendedPhysics.PHYS_PARAM_FRAMEINB_LOC:
+ errMsg = "PHYS_PARAM_FRAMEINB_LOC takes one parameter of type vector";
+ valueVector = (OMV.Vector3)pParams[opIndex + 1];
+ linkInfo.frameInBloc = valueVector;
+ opIndex += 2;
+ break;
+ case ExtendedPhysics.PHYS_PARAM_FRAMEINB_ROT:
+ errMsg = "PHYS_PARAM_FRAMEINB_ROT takes one parameter of type rotation";
+ valueQuaternion = (OMV.Quaternion)pParams[opIndex + 1];
+ linkInfo.frameInBrot = valueQuaternion;
+ opIndex += 2;
+ break;
+ case ExtendedPhysics.PHYS_PARAM_LINEAR_LIMIT_LOW:
+ errMsg = "PHYS_PARAM_LINEAR_LIMIT_LOW takes one parameter of type vector";
+ valueVector = (OMV.Vector3)pParams[opIndex + 1];
+ linkInfo.linearLimitLow = valueVector;
+ opIndex += 2;
+ break;
+ case ExtendedPhysics.PHYS_PARAM_LINEAR_LIMIT_HIGH:
+ errMsg = "PHYS_PARAM_LINEAR_LIMIT_HIGH takes one parameter of type vector";
+ valueVector = (OMV.Vector3)pParams[opIndex + 1];
+ linkInfo.linearLimitHigh = valueVector;
+ opIndex += 2;
+ break;
+ case ExtendedPhysics.PHYS_PARAM_ANGULAR_LIMIT_LOW:
+ errMsg = "PHYS_PARAM_ANGULAR_LIMIT_LOW takes one parameter of type vector";
+ valueVector = (OMV.Vector3)pParams[opIndex + 1];
+ linkInfo.angularLimitLow = valueVector;
+ opIndex += 2;
+ break;
+ case ExtendedPhysics.PHYS_PARAM_ANGULAR_LIMIT_HIGH:
+ errMsg = "PHYS_PARAM_ANGULAR_LIMIT_HIGH takes one parameter of type vector";
+ valueVector = (OMV.Vector3)pParams[opIndex + 1];
+ linkInfo.angularLimitHigh = valueVector;
+ opIndex += 2;
+ break;
+ case ExtendedPhysics.PHYS_PARAM_USE_FRAME_OFFSET:
+ errMsg = "PHYS_PARAM_USE_FRAME_OFFSET takes one parameter of type integer (bool)";
+ valueBool = ((int)pParams[opIndex + 1]) != 0;
+ linkInfo.useFrameOffset = valueBool;
+ opIndex += 2;
+ break;
+ case ExtendedPhysics.PHYS_PARAM_ENABLE_TRANSMOTOR:
+ errMsg = "PHYS_PARAM_ENABLE_TRANSMOTOR takes one parameter of type integer (bool)";
+ valueBool = ((int)pParams[opIndex + 1]) != 0;
+ linkInfo.enableTransMotor = valueBool;
+ opIndex += 2;
+ break;
+ case ExtendedPhysics.PHYS_PARAM_TRANSMOTOR_MAXVEL:
+ errMsg = "PHYS_PARAM_TRANSMOTOR_MAXVEL takes one parameter of type float";
+ valueFloat = (float)pParams[opIndex + 1];
+ linkInfo.transMotorMaxVel = valueFloat;
+ opIndex += 2;
+ break;
+ case ExtendedPhysics.PHYS_PARAM_TRANSMOTOR_MAXFORCE:
+ errMsg = "PHYS_PARAM_TRANSMOTOR_MAXFORCE takes one parameter of type float";
+ valueFloat = (float)pParams[opIndex + 1];
+ linkInfo.transMotorMaxForce = valueFloat;
+ opIndex += 2;
+ break;
+ case ExtendedPhysics.PHYS_PARAM_CFM:
+ errMsg = "PHYS_PARAM_CFM takes one parameter of type float";
+ valueFloat = (float)pParams[opIndex + 1];
+ linkInfo.cfm = valueFloat;
+ opIndex += 2;
+ break;
+ case ExtendedPhysics.PHYS_PARAM_ERP:
+ errMsg = "PHYS_PARAM_ERP takes one parameter of type float";
+ valueFloat = (float)pParams[opIndex + 1];
+ linkInfo.erp = valueFloat;
+ opIndex += 2;
+ break;
+ case ExtendedPhysics.PHYS_PARAM_SOLVER_ITERATIONS:
+ errMsg = "PHYS_PARAM_SOLVER_ITERATIONS takes one parameter of type float";
+ valueFloat = (float)pParams[opIndex + 1];
+ linkInfo.solverIterations = valueFloat;
+ opIndex += 2;
+ break;
+ case ExtendedPhysics.PHYS_PARAM_SPRING_AXIS_ENABLE:
+ errMsg = "PHYS_PARAM_SPRING_AXIS_ENABLE takes two parameters of types integer and integer (bool)";
+ valueInt = (int)pParams[opIndex + 1];
+ valueBool = ((int)pParams[opIndex + 2]) != 0;
+ GetAxisRange(valueInt, out axisLow, out axisHigh);
+ for (int ii = axisLow; ii <= axisHigh; ii++)
+ linkInfo.springAxisEnable[ii] = valueBool;
+ opIndex += 3;
+ break;
+ case ExtendedPhysics.PHYS_PARAM_SPRING_DAMPING:
+ errMsg = "PHYS_PARAM_SPRING_DAMPING takes two parameters of types integer and float";
+ valueInt = (int)pParams[opIndex + 1];
+ valueFloat = (float)pParams[opIndex + 2];
+ GetAxisRange(valueInt, out axisLow, out axisHigh);
+ for (int ii = axisLow; ii <= axisHigh; ii++)
+ linkInfo.springDamping[ii] = valueFloat;
+ opIndex += 3;
+ break;
+ case ExtendedPhysics.PHYS_PARAM_SPRING_STIFFNESS:
+ errMsg = "PHYS_PARAM_SPRING_STIFFNESS takes two parameters of types integer and float";
+ valueInt = (int)pParams[opIndex + 1];
+ valueFloat = (float)pParams[opIndex + 2];
+ GetAxisRange(valueInt, out axisLow, out axisHigh);
+ for (int ii = axisLow; ii <= axisHigh; ii++)
+ linkInfo.springStiffness[ii] = valueFloat;
+ opIndex += 3;
+ break;
+ case ExtendedPhysics.PHYS_PARAM_SPRING_EQUILIBRIUM_POINT:
+ errMsg = "PHYS_PARAM_SPRING_EQUILIBRIUM_POINT takes two parameters of type vector";
+ valueVector = (OMV.Vector3)pParams[opIndex + 1];
+ valueVector2 = (OMV.Vector3)pParams[opIndex + 2];
+ linkInfo.springLinearEquilibriumPoint = valueVector;
+ linkInfo.springAngularEquilibriumPoint = valueVector2;
+ opIndex += 3;
+ break;
+ case ExtendedPhysics.PHYS_PARAM_USE_LINEAR_FRAMEA:
+ errMsg = "PHYS_PARAM_USE_LINEAR_FRAMEA takes one parameter of type integer (bool)";
+ valueBool = ((int)pParams[opIndex + 1]) != 0;
+ linkInfo.useLinearReferenceFrameA = valueBool;
+ opIndex += 2;
+ break;
+ default:
+ break;
+ }
+ }
+ catch (InvalidCastException e)
+ {
+ m_physicsScene.Logger.WarnFormat("{0} value of wrong type in physSetLinksetParams: {1}, err={2}",
+ LogHeader, errMsg, e);
+ }
+ catch (Exception e)
+ {
+ m_physicsScene.Logger.WarnFormat("{0} bad parameters in physSetLinksetParams: {1}", LogHeader, e);
}
}
- catch (InvalidCastException e)
- {
- m_physicsScene.Logger.WarnFormat("{0} value of wrong type in physSetLinksetParams: {1}, err={2}",
- LogHeader, errMsg, e);
- }
- catch (Exception e)
- {
- m_physicsScene.Logger.WarnFormat("{0} bad parameters in physSetLinksetParams: {1}", LogHeader, e);
- }
}
+ // Something changed so a rebuild is in order
+ Refresh(child);
}
- // Something changed so a rebuild is in order
- Refresh(child);
}
- }
- break;
- default:
- ret = base.Extension(pFunct, pParams);
break;
+ default:
+ ret = base.Extension(pFunct, pParams);
+ break;
+ }
+ return ret;
}
- return ret;
- }
- // Bullet constraints keep some limit parameters for each linear and angular axis.
- // Setting same is easier if there is an easy way to see all or types.
- // This routine returns the array limits for the set of axis.
- private void GetAxisRange(int rangeSpec, out int low, out int high)
- {
- switch (rangeSpec)
+ // Bullet constraints keep some limit parameters for each linear and angular axis.
+ // Setting same is easier if there is an easy way to see all or types.
+ // This routine returns the array limits for the set of axis.
+ private void GetAxisRange(int rangeSpec, out int low, out int high)
{
- case ExtendedPhysics.PHYS_AXIS_LINEAR_ALL:
- low = 0;
- high = 2;
- break;
- case ExtendedPhysics.PHYS_AXIS_ANGULAR_ALL:
- low = 3;
- high = 5;
- break;
- case ExtendedPhysics.PHYS_AXIS_ALL:
- low = 0;
- high = 5;
- break;
- default:
- low = high = rangeSpec;
- break;
+ switch (rangeSpec)
+ {
+ case ExtendedPhysics.PHYS_AXIS_LINEAR_ALL:
+ low = 0;
+ high = 2;
+ break;
+ case ExtendedPhysics.PHYS_AXIS_ANGULAR_ALL:
+ low = 3;
+ high = 5;
+ break;
+ case ExtendedPhysics.PHYS_AXIS_ALL:
+ low = 0;
+ high = 5;
+ break;
+ default:
+ low = high = rangeSpec;
+ break;
+ }
+ return;
}
- return;
+ #endregion // Extension
}
- #endregion // Extension
-
-}
}
diff --git a/OpenSim/Region/PhysicsModules/BulletS/BSMaterials.cs b/OpenSim/Region/PhysicsModules/BulletS/BSMaterials.cs
index 0e44d03770..ac27d91623 100755
--- a/OpenSim/Region/PhysicsModules/BulletS/BSMaterials.cs
+++ b/OpenSim/Region/PhysicsModules/BulletS/BSMaterials.cs
@@ -32,172 +32,171 @@ using Nini.Config;
namespace OpenSim.Region.PhysicsModule.BulletS
{
-
-public struct MaterialAttributes
-{
- // Material type values that correspond with definitions for LSL
- public enum Material : int
+ public struct MaterialAttributes
{
- 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",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.3f, 0.4f);
- Attributes[(int)MaterialAttributes.Material.Glass + (int)MaterialAttributes.Material.NumberOfTypes] =
- new MaterialAttributes("glassPhysical",dDensity, 0.2f, 0.7f);
- Attributes[(int)MaterialAttributes.Material.Wood + (int)MaterialAttributes.Material.NumberOfTypes] =
- new MaterialAttributes("woodPhysical",dDensity, 0.6f, 0.5f);
- Attributes[(int)MaterialAttributes.Material.Flesh + (int)MaterialAttributes.Material.NumberOfTypes] =
- new MaterialAttributes("fleshPhysical",dDensity, 0.9f, 0.3f);
- Attributes[(int)MaterialAttributes.Material.Plastic + (int)MaterialAttributes.Material.NumberOfTypes] =
- new MaterialAttributes("plasticPhysical",dDensity, 0.4f, 0.7f);
- Attributes[(int)MaterialAttributes.Material.Rubber + (int)MaterialAttributes.Material.NumberOfTypes] =
- 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",3.5f, 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)
+ // Material type values that correspond with definitions for LSL
+ public enum Material : int
{
- string matName = kvp.Key;
- foreach (string attribName in MaterialAttributes.MaterialAttribs)
+ 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",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.3f, 0.4f);
+ Attributes[(int)MaterialAttributes.Material.Glass + (int)MaterialAttributes.Material.NumberOfTypes] =
+ new MaterialAttributes("glassPhysical",dDensity, 0.2f, 0.7f);
+ Attributes[(int)MaterialAttributes.Material.Wood + (int)MaterialAttributes.Material.NumberOfTypes] =
+ new MaterialAttributes("woodPhysical",dDensity, 0.6f, 0.5f);
+ Attributes[(int)MaterialAttributes.Material.Flesh + (int)MaterialAttributes.Material.NumberOfTypes] =
+ new MaterialAttributes("fleshPhysical",dDensity, 0.9f, 0.3f);
+ Attributes[(int)MaterialAttributes.Material.Plastic + (int)MaterialAttributes.Material.NumberOfTypes] =
+ new MaterialAttributes("plasticPhysical",dDensity, 0.4f, 0.7f);
+ Attributes[(int)MaterialAttributes.Material.Rubber + (int)MaterialAttributes.Material.NumberOfTypes] =
+ 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",3.5f, 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 paramName = matName + attribName;
- if (pConfig.Contains(paramName))
+ string matName = kvp.Key;
+ foreach (string attribName in MaterialAttributes.MaterialAttribs)
{
- 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);
+ 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)
- {
- // Get the current attribute values for this material
- MaterialAttributes thisAttrib = Attributes[matType];
- // Find the field for the passed attribute name (eg, find field named 'friction')
- FieldInfo fieldInfo = thisAttrib.GetType().GetField(attribName.ToLower());
- if (fieldInfo != null)
+ // Use reflection to set the value in the attribute structure.
+ private static void SetAttributeValue(int matType, string attribName, float val)
{
- fieldInfo.SetValue(thisAttrib, val);
- // Copy new attributes back to array -- since MaterialAttributes is 'struct', passed by value, not reference.
- Attributes[matType] = thisAttrib;
+ // Get the current attribute values for this material
+ MaterialAttributes thisAttrib = Attributes[matType];
+ // Find the field for the passed attribute name (eg, find field named 'friction')
+ FieldInfo fieldInfo = thisAttrib.GetType().GetField(attribName.ToLower());
+ if (fieldInfo != null)
+ {
+ fieldInfo.SetValue(thisAttrib, val);
+ // Copy new attributes back to array -- since MaterialAttributes is 'struct', passed by value, not reference.
+ 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];
}
}
-
- // 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/PhysicsModules/BulletS/BSMotors.cs b/OpenSim/Region/PhysicsModules/BulletS/BSMotors.cs
index 2faf2d4c0c..a0a0b828bd 100755
--- a/OpenSim/Region/PhysicsModules/BulletS/BSMotors.cs
+++ b/OpenSim/Region/PhysicsModules/BulletS/BSMotors.cs
@@ -33,419 +33,419 @@ using OpenSim.Framework;
namespace OpenSim.Region.PhysicsModule.BulletS
{
-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)
+ public abstract class BSMotor
{
- 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) { }
+ // 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);
- // 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)
+ public BSMotor(string useName)
{
- PhysicsScene.DetailLog(msg, parms);
+ 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) { }
-// Motor which moves CurrentValue to TargetValue over TimeScale seconds.
-// The TargetValue decays in TargetValueDecayTimeScale.
-// 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 to small and eventually zero values.
-// TimeScale and TargetDelayTimeScale may be 'infinite' which means no decay.
+ // A name passed at motor creation for easily identifyable debugging messages.
+ public string UseName { get; private set; }
-// 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 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()
- {
- return ErrorIsZero(LastError);
- }
- public virtual bool ErrorIsZero(Vector3 err)
- {
- return (err == Vector3.Zero || err.ApproxEquals(Vector3.Zero, ErrorZeroThreshold));
- }
-
- public BSVMotor(string useName)
- : base(useName)
- {
- TimeScale = TargetValueDecayTimeScale = BSMotor.Infinite;
- Efficiency = 1f;
- CurrentValue = TargetValue = Vector3.Zero;
- ErrorZeroThreshold = 0.001f;
- }
- public BSVMotor(string useName, float timeScale, float decayTimeScale, float efficiency)
- : this(useName)
- {
- TimeScale = timeScale;
- TargetValueDecayTimeScale = decayTimeScale;
- 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.
- // Returns the correction needed to move 'current' to 'target'.
- 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 (!ErrorIsZero(error))
+ // 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)
{
- correction = StepError(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)
+ if (PhysicsScene != null)
{
- decayFactor = (1.0f / TargetValueDecayTimeScale) * timeStep;
- TargetValue *= (1f - decayFactor);
+ PhysicsScene.DetailLog(msg, parms);
}
-
- 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},tgt={4},curr={5}",
- BSScene.DetailLogZero, UseName, TargetValueDecayTimeScale, decayFactor, TargetValue, CurrentValue);
}
- else
+ }
+
+ // Motor which moves CurrentValue to TargetValue over TimeScale seconds.
+ // The TargetValue decays in TargetValueDecayTimeScale.
+ // 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 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 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()
{
- // Difference between what we have and target is small. Motor is done.
- if (TargetValue.ApproxEquals(Vector3.Zero, ErrorZeroThreshold))
+ return ErrorIsZero(LastError);
+ }
+ public virtual bool ErrorIsZero(Vector3 err)
+ {
+ return (err == Vector3.Zero || err.ApproxEquals(Vector3.Zero, ErrorZeroThreshold));
+ }
+
+ public BSVMotor(string useName)
+ : base(useName)
+ {
+ TimeScale = TargetValueDecayTimeScale = BSMotor.Infinite;
+ Efficiency = 1f;
+ CurrentValue = TargetValue = Vector3.Zero;
+ ErrorZeroThreshold = 0.001f;
+ }
+ public BSVMotor(string useName, float timeScale, float decayTimeScale, float efficiency)
+ : this(useName)
+ {
+ TimeScale = timeScale;
+ TargetValueDecayTimeScale = decayTimeScale;
+ 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.
+ // Returns the correction needed to move 'current' to 'target'.
+ 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 (!ErrorIsZero(error))
{
- // The target can step down to nearly zero but not get there. If close to zero
- // it is really zero.
- TargetValue = Vector3.Zero;
+ correction = StepError(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);
+ }
+
+ 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},tgt={4},curr={5}",
+ BSScene.DetailLogZero, UseName, TargetValueDecayTimeScale, decayFactor, TargetValue, CurrentValue);
}
- CurrentValue = TargetValue;
- MDetailLog("{0}, BSVMotor.Step,zero,{1},origTgt={2},origCurr={3},currTgt={4},currCurr={5}",
- BSScene.DetailLogZero, UseName, origCurrVal, origTarget, TargetValue, CurrentValue);
- }
- LastError = error;
-
- return correction;
- }
- // version of step that sets the current value before doing the step
- public virtual Vector3 Step(float timeStep, Vector3 current)
- {
- CurrentValue = current;
- return Step(timeStep);
- }
- // Given and error, computer a correction for this step.
- // Simple scaling of the error by the timestep.
- public virtual Vector3 StepError(float timeStep, Vector3 error)
- {
- if (!Enabled) return Vector3.Zero;
-
- Vector3 returnCorrection = Vector3.Zero;
- if (!ErrorIsZero(error))
- {
- // 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},eff={4},curr={5},tgt={6}",
- BSScene.DetailLogZero, UseName,
- TimeScale, TargetValueDecayTimeScale, Efficiency,
- CurrentValue, TargetValue);
-
- LastError = BSMotor.InfiniteVector;
- while (maxOutput-- > 0 && !ErrorIsZero())
- {
- 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},lastErr={3},decayTS={4}>",
- UseName, CurrentValue, TargetValue, LastError, TargetValueDecayTimeScale);
- }
-}
-
-// ============================================================================
-// ============================================================================
-public class BSFMotor : BSMotor
-{
- public virtual float TimeScale { get; set; }
- public virtual float TargetValueDecayTimeScale { get; set; }
- public virtual float Efficiency { get; set; }
-
- public virtual float ErrorZeroThreshold { get; set; }
-
- public virtual float TargetValue { get; protected set; }
- public virtual float CurrentValue { get; protected set; }
- public virtual float LastError { get; protected set; }
-
- public virtual bool ErrorIsZero()
- {
- return ErrorIsZero(LastError);
- }
- public virtual bool ErrorIsZero(float err)
- {
- return (err >= -ErrorZeroThreshold && err <= ErrorZeroThreshold);
- }
-
- public BSFMotor(string useName, float timeScale, float decayTimescale, float efficiency)
- : base(useName)
- {
- TimeScale = TargetValueDecayTimeScale = BSMotor.Infinite;
- Efficiency = 1f;
- CurrentValue = TargetValue = 0f;
- ErrorZeroThreshold = 0.01f;
- }
- public void SetCurrent(float current)
- {
- CurrentValue = current;
- }
- public void SetTarget(float target)
- {
- TargetValue = target;
- }
- public override void Zero()
- {
- base.Zero();
- CurrentValue = TargetValue = 0f;
- }
-
- public virtual float Step(float timeStep)
- {
- if (!Enabled) return TargetValue;
-
- float origTarget = TargetValue; // DEBUG
- float origCurrVal = CurrentValue; // DEBUG
-
- float correction = 0f;
- float error = TargetValue - CurrentValue;
- if (!ErrorIsZero(error))
- {
- correction = StepError(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);
+ // Difference between what we have and target is small. Motor is done.
+ if (TargetValue.ApproxEquals(Vector3.Zero, ErrorZeroThreshold))
+ {
+ // The target can step down to nearly zero but not get there. If close to zero
+ // it is really zero.
+ TargetValue = Vector3.Zero;
+ }
+ CurrentValue = TargetValue;
+ MDetailLog("{0}, BSVMotor.Step,zero,{1},origTgt={2},origCurr={3},currTgt={4},currCurr={5}",
+ BSScene.DetailLogZero, UseName, origCurrVal, origTarget, TargetValue, CurrentValue);
}
+ LastError = error;
- MDetailLog("{0}, BSFMotor.Step,nonZero,{1},origCurr={2},origTarget={3},timeStep={4},err={5},corr={6}",
- BSScene.DetailLogZero, UseName, origCurrVal, origTarget,
- timeStep, error, correction);
- MDetailLog("{0}, BSFMotor.Step,nonZero,{1},tgtDecayTS={2},decayFact={3},tgt={4},curr={5}",
- BSScene.DetailLogZero, UseName, TargetValueDecayTimeScale, decayFactor, TargetValue, CurrentValue);
+ return correction;
}
- else
+ // version of step that sets the current value before doing the step
+ public virtual Vector3 Step(float timeStep, Vector3 current)
{
- // Difference between what we have and target is small. Motor is done.
- if (Util.InRange(TargetValue, -ErrorZeroThreshold, ErrorZeroThreshold))
- {
- // The target can step down to nearly zero but not get there. If close to zero
- // it is really zero.
- TargetValue = 0f;
- }
- CurrentValue = TargetValue;
- MDetailLog("{0}, BSFMotor.Step,zero,{1},origTgt={2},origCurr={3},ret={4}",
- BSScene.DetailLogZero, UseName, origCurrVal, origTarget, CurrentValue);
+ CurrentValue = current;
+ return Step(timeStep);
}
- LastError = error;
+ // Given and error, computer a correction for this step.
+ // Simple scaling of the error by the timestep.
+ public virtual Vector3 StepError(float timeStep, Vector3 error)
+ {
+ if (!Enabled) return Vector3.Zero;
- return CurrentValue;
+ Vector3 returnCorrection = Vector3.Zero;
+ if (!ErrorIsZero(error))
+ {
+ // 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},eff={4},curr={5},tgt={6}",
+ BSScene.DetailLogZero, UseName,
+ TimeScale, TargetValueDecayTimeScale, Efficiency,
+ CurrentValue, TargetValue);
+
+ LastError = BSMotor.InfiniteVector;
+ while (maxOutput-- > 0 && !ErrorIsZero())
+ {
+ 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},lastErr={3},decayTS={4}>",
+ UseName, CurrentValue, TargetValue, LastError, TargetValueDecayTimeScale);
+ }
}
- public virtual float StepError(float timeStep, float error)
+ // ============================================================================
+ // ============================================================================
+ public class BSFMotor : BSMotor
{
- if (!Enabled) return 0f;
+ public virtual float TimeScale { get; set; }
+ public virtual float TargetValueDecayTimeScale { get; set; }
+ public virtual float Efficiency { get; set; }
- float returnCorrection = 0f;
- if (!ErrorIsZero(error))
+ public virtual float ErrorZeroThreshold { get; set; }
+
+ public virtual float TargetValue { get; protected set; }
+ public virtual float CurrentValue { get; protected set; }
+ public virtual float LastError { get; protected set; }
+
+ public virtual bool ErrorIsZero()
{
- // correction = error / secondsItShouldTakeToCorrect
- float correctionAmount;
- if (TimeScale == 0f || TimeScale == BSMotor.Infinite)
- correctionAmount = error * timeStep;
+ return ErrorIsZero(LastError);
+ }
+ public virtual bool ErrorIsZero(float err)
+ {
+ return (err >= -ErrorZeroThreshold && err <= ErrorZeroThreshold);
+ }
+
+ public BSFMotor(string useName, float timeScale, float decayTimescale, float efficiency)
+ : base(useName)
+ {
+ TimeScale = TargetValueDecayTimeScale = BSMotor.Infinite;
+ Efficiency = 1f;
+ CurrentValue = TargetValue = 0f;
+ ErrorZeroThreshold = 0.01f;
+ }
+ public void SetCurrent(float current)
+ {
+ CurrentValue = current;
+ }
+ public void SetTarget(float target)
+ {
+ TargetValue = target;
+ }
+ public override void Zero()
+ {
+ base.Zero();
+ CurrentValue = TargetValue = 0f;
+ }
+
+ public virtual float Step(float timeStep)
+ {
+ if (!Enabled) return TargetValue;
+
+ float origTarget = TargetValue; // DEBUG
+ float origCurrVal = CurrentValue; // DEBUG
+
+ float correction = 0f;
+ float error = TargetValue - CurrentValue;
+ if (!ErrorIsZero(error))
+ {
+ correction = StepError(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);
+ }
+
+ MDetailLog("{0}, BSFMotor.Step,nonZero,{1},origCurr={2},origTarget={3},timeStep={4},err={5},corr={6}",
+ BSScene.DetailLogZero, UseName, origCurrVal, origTarget,
+ timeStep, error, correction);
+ MDetailLog("{0}, BSFMotor.Step,nonZero,{1},tgtDecayTS={2},decayFact={3},tgt={4},curr={5}",
+ BSScene.DetailLogZero, UseName, TargetValueDecayTimeScale, decayFactor, TargetValue, CurrentValue);
+ }
else
- correctionAmount = error / TimeScale * timeStep;
+ {
+ // Difference between what we have and target is small. Motor is done.
+ if (Util.InRange(TargetValue, -ErrorZeroThreshold, ErrorZeroThreshold))
+ {
+ // The target can step down to nearly zero but not get there. If close to zero
+ // it is really zero.
+ TargetValue = 0f;
+ }
+ CurrentValue = TargetValue;
+ MDetailLog("{0}, BSFMotor.Step,zero,{1},origTgt={2},origCurr={3},ret={4}",
+ BSScene.DetailLogZero, UseName, origCurrVal, origTarget, CurrentValue);
+ }
+ LastError = error;
- returnCorrection = correctionAmount;
- MDetailLog("{0}, BSFMotor.Step,nonZero,{1},timeStep={2},timeScale={3},err={4},corr={5}",
- BSScene.DetailLogZero, UseName, timeStep, TimeScale, error, correctionAmount);
+ return CurrentValue;
}
- return returnCorrection;
- }
- public override string ToString()
- {
- return String.Format("<{0},curr={1},targ={2},lastErr={3},decayTS={4}>",
- UseName, CurrentValue, TargetValue, LastError, TargetValueDecayTimeScale);
- }
-
-}
-
-// ============================================================================
-// ============================================================================
-// Proportional, Integral, Derivitive ("PID") 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; }
-
- // The factors are vectors for the three dimensions. This is the proportional of each
- // that is applied. This could be multiplied through the actual factors but it
- // is sometimes easier to manipulate the factors and their mix separately.
- public Vector3 FactorMix;
-
- // 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);
- FactorMix = new Vector3(0.5f, 0.25f, 0.25f);
- RunningIntegration = Vector3.Zero;
- LastError = Vector3.Zero;
- }
-
- public override void Zero()
- {
- base.Zero();
- }
-
- public override float Efficiency
- {
- get { return base.Efficiency; }
- set
+ public virtual float StepError(float timeStep, float error)
{
- base.Efficiency = Util.Clamp(value, 0f, 1f);
+ if (!Enabled) return 0f;
- // 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;
+ float returnCorrection = 0f;
+ if (!ErrorIsZero(error))
+ {
+ // correction = error / secondsItShouldTakeToCorrect
+ float correctionAmount;
+ if (TimeScale == 0f || TimeScale == BSMotor.Infinite)
+ correctionAmount = error * timeStep;
+ else
+ correctionAmount = error / TimeScale * timeStep;
- proportionFactor = new Vector3(factor, factor, factor);
- integralFactor = new Vector3(factor, factor, factor);
- derivFactor = new Vector3(factor, factor, factor);
+ returnCorrection = correctionAmount;
+ MDetailLog("{0}, BSFMotor.Step,nonZero,{1},timeStep={2},timeScale={3},err={4},corr={5}",
+ BSScene.DetailLogZero, UseName, timeStep, TimeScale, error, correctionAmount);
+ }
+ return returnCorrection;
+ }
- MDetailLog("{0}, BSPIDVMotor.setEfficiency,eff={1},factor={2}", BSScene.DetailLogZero, Efficiency, factor);
+ public override string ToString()
+ {
+ return String.Format("<{0},curr={1},targ={2},lastErr={3},decayTS={4}>",
+ UseName, CurrentValue, TargetValue, LastError, TargetValueDecayTimeScale);
+ }
+
+ }
+
+ // ============================================================================
+ // ============================================================================
+ // Proportional, Integral, Derivitive ("PID") 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; }
+
+ // The factors are vectors for the three dimensions. This is the proportional of each
+ // that is applied. This could be multiplied through the actual factors but it
+ // is sometimes easier to manipulate the factors and their mix separately.
+ public Vector3 FactorMix;
+
+ // 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);
+ FactorMix = new Vector3(0.5f, 0.25f, 0.25f);
+ 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);
+
+ MDetailLog("{0}, BSPIDVMotor.setEfficiency,eff={1},factor={2}", BSScene.DetailLogZero, Efficiency, factor);
+ }
+ }
+
+ // Advance the PID computation on this error.
+ public override Vector3 StepError(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 derivitive = (error - LastError) * timeStep;
+
+ // Correction = (proportionOfPresentError + accumulationOfPastError + rateOfChangeOfError)
+ Vector3 ret = error / TimeScale * timeStep * proportionFactor * FactorMix.X
+ + RunningIntegration / TimeScale * integralFactor * FactorMix.Y
+ + derivitive / TimeScale * derivFactor * FactorMix.Z
+ ;
+
+ MDetailLog("{0}, BSPIDVMotor.step,ts={1},err={2},lerr={3},runnInt={4},deriv={5},ret={6}",
+ BSScene.DetailLogZero, timeStep, error, LastError, RunningIntegration, derivitive, ret);
+
+ return ret;
}
}
-
- // Advance the PID computation on this error.
- public override Vector3 StepError(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 derivitive = (error - LastError) * timeStep;
-
- // Correction = (proportionOfPresentError + accumulationOfPastError + rateOfChangeOfError)
- Vector3 ret = error / TimeScale * timeStep * proportionFactor * FactorMix.X
- + RunningIntegration / TimeScale * integralFactor * FactorMix.Y
- + derivitive / TimeScale * derivFactor * FactorMix.Z
- ;
-
- MDetailLog("{0}, BSPIDVMotor.step,ts={1},err={2},lerr={3},runnInt={4},deriv={5},ret={6}",
- BSScene.DetailLogZero, timeStep, error, LastError, RunningIntegration, derivitive, ret);
-
- return ret;
- }
-}
}
diff --git a/OpenSim/Region/PhysicsModules/BulletS/BSParam.cs b/OpenSim/Region/PhysicsModules/BulletS/BSParam.cs
index d80b050de6..13192b0353 100755
--- a/OpenSim/Region/PhysicsModules/BulletS/BSParam.cs
+++ b/OpenSim/Region/PhysicsModules/BulletS/BSParam.cs
@@ -36,917 +36,917 @@ using Nini.Config;
namespace OpenSim.Region.PhysicsModule.BulletS
{
-public static class BSParam
-{
- private static string LogHeader = "[BULLETSIM PARAMETERS]";
-
- // Tuning notes:
- // From: http://bulletphysics.org/Bullet/phpBB3/viewtopic.php?t=6575
- // Contact points can be added even if the distance is positive. The constraint solver can deal with
- // contacts with positive distances as well as negative (penetration). Contact points are discarded
- // if the distance exceeds a certain threshold.
- // Bullet has a contact processing threshold and a contact breaking threshold.
- // If the distance is larger than the contact breaking threshold, it will be removed after one frame.
- // If the distance is larger than the contact processing threshold, the constraint solver will ignore it.
-
- // This is separate/independent from the collision margin. The collision margin increases the object a bit
- // to improve collision detection performance and accuracy.
- // ===================
- // From:
-
- ///
- /// Set whether physics is active or not.
- ///
- ///
- /// Can be enabled and disabled to start and stop physics.
- ///
- public static bool Active { get; private set; }
-
- public static bool UseSeparatePhysicsThread { get; private set; }
- public static float PhysicsTimeStep { get; private set; }
-
- // Level of Detail values kept as float because that's what the Meshmerizer wants
- public static float MeshLOD { get; private set; }
- public static float MeshCircularLOD { 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 int CrossingFailuresBeforeOutOfBounds { get; private set; }
- public static float UpdateVelocityChangeThreshold { get; private set; }
-
- public static float MinimumObjectMass { get; private set; }
- public static float MaximumObjectMass { get; private set; }
- public static float MaxLinearVelocity { get; private set; }
- public static float MaxLinearVelocitySquared { get; private set; }
- public static float MaxAngularVelocity { get; private set; }
- public static float MaxAngularVelocitySquared { get; private set; }
- public static float MaxAddForceMagnitude { get; private set; }
- public static float MaxAddForceMagnitudeSquared { get; private set; }
- public static float DensityScaleFactor { 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 bool ShouldRemoveZeroWidthTriangles { get; private set; }
- public static bool ShouldUseBulletHACD { get; set; }
- public static bool ShouldUseSingleConvexHullForPrims { get; set; }
- public static bool ShouldUseGImpactShapeForPrims { get; set; }
- public static bool ShouldUseAssetHulls { get; set; }
-
- public static float TerrainImplementation { get; set; }
- public static int TerrainMeshMagnification { get; private set; }
- public static float TerrainGroundPlane { 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 TerrainContactProcessingThreshold { get; private set; }
- public static float TerrainCollisionMargin { get; private set; }
-
- public static float DefaultFriction { get; private set; }
- public static float DefaultDensity { get; private set; }
- public static float DefaultRestitution { get; private set; }
- public static float CollisionMargin { get; private set; }
- public static float Gravity { get; private set; }
-
- // Physics Engine operation
- public static float MaxPersistantManifoldPoolSize { get; private set; }
- public static float MaxCollisionAlgorithmPoolSize { get; private set; }
- public static bool ShouldDisableContactPoolDynamicAllocation { get; private set; }
- public static bool ShouldForceUpdateAllAabbs { get; private set; }
- public static bool ShouldRandomizeSolverOrder { get; private set; }
- public static bool ShouldSplitSimulationIslands { get; private set; }
- public static bool ShouldEnableFrictionCaching { get; private set; }
- public static float NumberOfSolverIterations { get; private set; }
- public static bool UseSingleSidedMeshes { get; private set; }
- public static float GlobalContactBreakingThreshold { get; private set; }
- public static float PhysicsUnmanLoggingFrames { get; private set; }
-
- // Avatar parameters
- public static bool AvatarToAvatarCollisionsByDefault { get; private set; }
- public static float AvatarFriction { get; private set; }
- public static float AvatarStandingFriction { get; private set; }
- public static float AvatarWalkVelocityFactor { get; private set; }
- public static float AvatarAlwaysRunFactor { get; private set; }
- public static float AvatarDensity { get; private set; }
- public static float AvatarRestitution { get; private set; }
- public static int AvatarShape { 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 bool AvatarUseBefore09SizeComputation { get; private set; }
- public static float AvatarHeightLowFudge { get; private set; }
- public static float AvatarHeightMidFudge { get; private set; }
- public static float AvatarHeightHighFudge { get; private set; }
- public static float AvatarFlyingGroundMargin { get; private set; }
- public static float AvatarFlyingGroundUpForce { get; private set; }
- public static int AvatarAddForceFrames { get; private set; }
- public static float AvatarTerminalVelocity { get; private set; }
- public static float AvatarContactProcessingThreshold { get; private set; }
- public static float AvatarAddForcePushFactor { get; private set; }
- public static float AvatarStopZeroThreshold { get; private set; }
- public static float AvatarStopZeroThresholdSquared { get; private set; }
- public static int AvatarJumpFrames { get; private set; }
- public static float AvatarBelowGroundUpCorrectionMeters { get; private set; }
- public static float AvatarStepHeight { get; private set; }
- public static float AvatarStepAngle { get; private set; }
- public static float AvatarStepGroundFudge { get; private set; }
- public static float AvatarStepApproachFactor { get; private set; }
- public static float AvatarStepForceFactor { get; private set; }
- public static float AvatarStepUpCorrectionFactor { get; private set; }
- public static int AvatarStepSmoothingSteps { get; private set; }
-
- // Vehicle parameters
- public static float VehicleMaxLinearVelocity { get; private set; }
- public static float VehicleMaxLinearVelocitySquared { get; private set; }
- public static float VehicleMinLinearVelocity { get; private set; }
- public static float VehicleMinLinearVelocitySquared { get; private set; }
- public static float VehicleMaxAngularVelocity { get; private set; }
- public static float VehicleMaxAngularVelocitySq { get; private set; }
- public static float VehicleAngularDamping { get; private set; }
- public static float VehicleFriction { get; private set; }
- public static float VehicleRestitution { get; private set; }
- public static Vector3 VehicleLinearFactor { get; private set; }
- public static Vector3 VehicleAngularFactor { get; private set; }
- public static Vector3 VehicleInertiaFactor { get; private set; }
- public static float VehicleGroundGravityFudge { get; private set; }
- public static float VehicleAngularBankingTimescaleFudge { get; private set; }
- public static bool VehicleEnableLinearDeflection { get; private set; }
- public static bool VehicleLinearDeflectionNotCollidingNoZ { get; private set; }
- public static bool VehicleEnableAngularVerticalAttraction { get; private set; }
- public static int VehicleAngularVerticalAttractionAlgorithm { get; private set; }
- public static bool VehicleEnableAngularDeflection { get; private set; }
- public static bool VehicleEnableAngularBanking { get; private set; }
-
- // Convex Hulls
- // Parameters for convex hull routine that ships with Bullet
- public static int CSHullMaxDepthSplit { get; private set; }
- public static int CSHullMaxDepthSplitForSimpleShapes { get; private set; }
- public static float CSHullConcavityThresholdPercent { get; private set; }
- public static float CSHullVolumeConservationThresholdPercent { get; private set; }
- public static int CSHullMaxVertices { get; private set; }
- public static float CSHullMaxSkinWidth { get; private set; }
- public static float BHullMaxVerticesPerHull { get; private set; } // 100
- public static float BHullMinClusters { get; private set; } // 2
- public static float BHullCompacityWeight { get; private set; } // 0.1
- public static float BHullVolumeWeight { get; private set; } // 0.0
- public static float BHullConcavity { get; private set; } // 100
- public static bool BHullAddExtraDistPoints { get; private set; } // false
- public static bool BHullAddNeighboursDistPoints { get; private set; } // false
- public static bool BHullAddFacesPoints { get; private set; } // false
- public static bool BHullShouldAdjustCollisionMargin { get; private set; } // false
- public static float WhichHACD { get; private set; } // zero if Bullet HACD, non-zero says VHACD
- // Parameters for VHACD 2.0: http://code.google.com/p/v-hacd
- // To enable, set both ShouldUseBulletHACD=true and WhichHACD=1
- // http://kmamou.blogspot.ca/2014/12/v-hacd-20-parameters-description.html
- public static float VHACDresolution { get; private set; } // 100,000 max number of voxels generated during voxelization stage
- public static float VHACDdepth { get; private set; } // 20 max number of clipping stages
- public static float VHACDconcavity { get; private set; } // 0.0025 maximum concavity
- public static float VHACDplaneDownsampling { get; private set; } // 4 granularity of search for best clipping plane
- public static float VHACDconvexHullDownsampling { get; private set; } // 4 precision of hull gen process
- public static float VHACDalpha { get; private set; } // 0.05 bias toward clipping along symmetry planes
- public static float VHACDbeta { get; private set; } // 0.05 bias toward clipping along revolution axis
- public static float VHACDgamma { get; private set; } // 0.00125 max concavity when merging
- public static float VHACDpca { get; private set; } // 0 on/off normalizing mesh before decomp
- public static float VHACDmode { get; private set; } // 0 0:voxel based, 1: tetrahedron based
- public static float VHACDmaxNumVerticesPerCH { get; private set; } // 64 max triangles per convex hull
- public static float VHACDminVolumePerCH { get; private set; } // 0.0001 sampling of generated convex hulls
-
- // Linkset implementation parameters
- public static float LinksetImplementation { get; private set; }
- public static bool LinksetOffsetCenterOfMass { get; private set; }
- public static bool LinkConstraintUseFrameOffset { get; private set; }
- public static bool 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 bool UseBulletRaycast { get; private set; }
-
- public static float PID_D { get; private set; } // derivative
- public static float PID_P { get; private set; } // proportional
-
- public static float DebugNumber { get; private set; } // A console setable number used for debugging
-
- // Various constants that come from that other virtual world that shall not be named.
- public const float MinGravityZ = -1f;
- public const float MaxGravityZ = 28f;
- public const float MinFriction = 0f;
- public const float MaxFriction = 255f;
- public const float MinDensity = 0.01f;
- public const float MaxDensity = 22587f;
- public const float MinRestitution = 0f;
- public const float MaxRestitution = 1f;
-
- // =====================================================================================
- // =====================================================================================
-
- // Base parameter definition that gets and sets parameter values via a string
- public abstract class ParameterDefnBase
+ public static class BSParam
{
- public string name; // string name of the parameter
- public string desc; // a short description of what the parameter means
- public ParameterDefnBase(string pName, string pDesc)
- {
- name = pName;
- desc = pDesc;
- }
- // Set the parameter value to the default
- public abstract void AssignDefault(BSScene s);
- // Get the value as a string
- public abstract string GetValue(BSScene s);
- // Set the value to this string value
- public abstract void SetValue(BSScene s, string valAsString);
- // set the value on a particular object (usually sets in physics engine)
- public abstract void SetOnObject(BSScene s, BSPhysObject obj);
- public abstract bool HasSetOnObject { get; }
- }
+ private static string LogHeader = "[BULLETSIM PARAMETERS]";
- // Specific parameter definition for a parameter of a specific type.
- public delegate T PGetValue(BSScene s);
- public delegate void PSetValue(BSScene s, T val);
- public delegate void PSetOnObject(BSScene scene, BSPhysObject obj);
- public sealed class ParameterDefn : ParameterDefnBase
- {
- private T defaultValue;
- private PSetValue setter;
- private PGetValue getter;
- private PSetOnObject objectSet;
- public ParameterDefn(string pName, string pDesc, T pDefault, PGetValue pGetter, PSetValue pSetter)
- : base(pName, pDesc)
+ // Tuning notes:
+ // From: http://bulletphysics.org/Bullet/phpBB3/viewtopic.php?t=6575
+ // Contact points can be added even if the distance is positive. The constraint solver can deal with
+ // contacts with positive distances as well as negative (penetration). Contact points are discarded
+ // if the distance exceeds a certain threshold.
+ // Bullet has a contact processing threshold and a contact breaking threshold.
+ // If the distance is larger than the contact breaking threshold, it will be removed after one frame.
+ // If the distance is larger than the contact processing threshold, the constraint solver will ignore it.
+
+ // This is separate/independent from the collision margin. The collision margin increases the object a bit
+ // to improve collision detection performance and accuracy.
+ // ===================
+ // From:
+
+ ///
+ /// Set whether physics is active or not.
+ ///
+ ///
+ /// Can be enabled and disabled to start and stop physics.
+ ///
+ public static bool Active { get; private set; }
+
+ public static bool UseSeparatePhysicsThread { get; private set; }
+ public static float PhysicsTimeStep { get; private set; }
+
+ // Level of Detail values kept as float because that's what the Meshmerizer wants
+ public static float MeshLOD { get; private set; }
+ public static float MeshCircularLOD { 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 int CrossingFailuresBeforeOutOfBounds { get; private set; }
+ public static float UpdateVelocityChangeThreshold { get; private set; }
+
+ public static float MinimumObjectMass { get; private set; }
+ public static float MaximumObjectMass { get; private set; }
+ public static float MaxLinearVelocity { get; private set; }
+ public static float MaxLinearVelocitySquared { get; private set; }
+ public static float MaxAngularVelocity { get; private set; }
+ public static float MaxAngularVelocitySquared { get; private set; }
+ public static float MaxAddForceMagnitude { get; private set; }
+ public static float MaxAddForceMagnitudeSquared { get; private set; }
+ public static float DensityScaleFactor { 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 bool ShouldRemoveZeroWidthTriangles { get; private set; }
+ public static bool ShouldUseBulletHACD { get; set; }
+ public static bool ShouldUseSingleConvexHullForPrims { get; set; }
+ public static bool ShouldUseGImpactShapeForPrims { get; set; }
+ public static bool ShouldUseAssetHulls { get; set; }
+
+ public static float TerrainImplementation { get; set; }
+ public static int TerrainMeshMagnification { get; private set; }
+ public static float TerrainGroundPlane { 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 TerrainContactProcessingThreshold { get; private set; }
+ public static float TerrainCollisionMargin { get; private set; }
+
+ public static float DefaultFriction { get; private set; }
+ public static float DefaultDensity { get; private set; }
+ public static float DefaultRestitution { get; private set; }
+ public static float CollisionMargin { get; private set; }
+ public static float Gravity { get; private set; }
+
+ // Physics Engine operation
+ public static float MaxPersistantManifoldPoolSize { get; private set; }
+ public static float MaxCollisionAlgorithmPoolSize { get; private set; }
+ public static bool ShouldDisableContactPoolDynamicAllocation { get; private set; }
+ public static bool ShouldForceUpdateAllAabbs { get; private set; }
+ public static bool ShouldRandomizeSolverOrder { get; private set; }
+ public static bool ShouldSplitSimulationIslands { get; private set; }
+ public static bool ShouldEnableFrictionCaching { get; private set; }
+ public static float NumberOfSolverIterations { get; private set; }
+ public static bool UseSingleSidedMeshes { get; private set; }
+ public static float GlobalContactBreakingThreshold { get; private set; }
+ public static float PhysicsUnmanLoggingFrames { get; private set; }
+
+ // Avatar parameters
+ public static bool AvatarToAvatarCollisionsByDefault { get; private set; }
+ public static float AvatarFriction { get; private set; }
+ public static float AvatarStandingFriction { get; private set; }
+ public static float AvatarWalkVelocityFactor { get; private set; }
+ public static float AvatarAlwaysRunFactor { get; private set; }
+ public static float AvatarDensity { get; private set; }
+ public static float AvatarRestitution { get; private set; }
+ public static int AvatarShape { 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 bool AvatarUseBefore09SizeComputation { get; private set; }
+ public static float AvatarHeightLowFudge { get; private set; }
+ public static float AvatarHeightMidFudge { get; private set; }
+ public static float AvatarHeightHighFudge { get; private set; }
+ public static float AvatarFlyingGroundMargin { get; private set; }
+ public static float AvatarFlyingGroundUpForce { get; private set; }
+ public static int AvatarAddForceFrames { get; private set; }
+ public static float AvatarTerminalVelocity { get; private set; }
+ public static float AvatarContactProcessingThreshold { get; private set; }
+ public static float AvatarAddForcePushFactor { get; private set; }
+ public static float AvatarStopZeroThreshold { get; private set; }
+ public static float AvatarStopZeroThresholdSquared { get; private set; }
+ public static int AvatarJumpFrames { get; private set; }
+ public static float AvatarBelowGroundUpCorrectionMeters { get; private set; }
+ public static float AvatarStepHeight { get; private set; }
+ public static float AvatarStepAngle { get; private set; }
+ public static float AvatarStepGroundFudge { get; private set; }
+ public static float AvatarStepApproachFactor { get; private set; }
+ public static float AvatarStepForceFactor { get; private set; }
+ public static float AvatarStepUpCorrectionFactor { get; private set; }
+ public static int AvatarStepSmoothingSteps { get; private set; }
+
+ // Vehicle parameters
+ public static float VehicleMaxLinearVelocity { get; private set; }
+ public static float VehicleMaxLinearVelocitySquared { get; private set; }
+ public static float VehicleMinLinearVelocity { get; private set; }
+ public static float VehicleMinLinearVelocitySquared { get; private set; }
+ public static float VehicleMaxAngularVelocity { get; private set; }
+ public static float VehicleMaxAngularVelocitySq { get; private set; }
+ public static float VehicleAngularDamping { get; private set; }
+ public static float VehicleFriction { get; private set; }
+ public static float VehicleRestitution { get; private set; }
+ public static Vector3 VehicleLinearFactor { get; private set; }
+ public static Vector3 VehicleAngularFactor { get; private set; }
+ public static Vector3 VehicleInertiaFactor { get; private set; }
+ public static float VehicleGroundGravityFudge { get; private set; }
+ public static float VehicleAngularBankingTimescaleFudge { get; private set; }
+ public static bool VehicleEnableLinearDeflection { get; private set; }
+ public static bool VehicleLinearDeflectionNotCollidingNoZ { get; private set; }
+ public static bool VehicleEnableAngularVerticalAttraction { get; private set; }
+ public static int VehicleAngularVerticalAttractionAlgorithm { get; private set; }
+ public static bool VehicleEnableAngularDeflection { get; private set; }
+ public static bool VehicleEnableAngularBanking { get; private set; }
+
+ // Convex Hulls
+ // Parameters for convex hull routine that ships with Bullet
+ public static int CSHullMaxDepthSplit { get; private set; }
+ public static int CSHullMaxDepthSplitForSimpleShapes { get; private set; }
+ public static float CSHullConcavityThresholdPercent { get; private set; }
+ public static float CSHullVolumeConservationThresholdPercent { get; private set; }
+ public static int CSHullMaxVertices { get; private set; }
+ public static float CSHullMaxSkinWidth { get; private set; }
+ public static float BHullMaxVerticesPerHull { get; private set; } // 100
+ public static float BHullMinClusters { get; private set; } // 2
+ public static float BHullCompacityWeight { get; private set; } // 0.1
+ public static float BHullVolumeWeight { get; private set; } // 0.0
+ public static float BHullConcavity { get; private set; } // 100
+ public static bool BHullAddExtraDistPoints { get; private set; } // false
+ public static bool BHullAddNeighboursDistPoints { get; private set; } // false
+ public static bool BHullAddFacesPoints { get; private set; } // false
+ public static bool BHullShouldAdjustCollisionMargin { get; private set; } // false
+ public static float WhichHACD { get; private set; } // zero if Bullet HACD, non-zero says VHACD
+ // Parameters for VHACD 2.0: http://code.google.com/p/v-hacd
+ // To enable, set both ShouldUseBulletHACD=true and WhichHACD=1
+ // http://kmamou.blogspot.ca/2014/12/v-hacd-20-parameters-description.html
+ public static float VHACDresolution { get; private set; } // 100,000 max number of voxels generated during voxelization stage
+ public static float VHACDdepth { get; private set; } // 20 max number of clipping stages
+ public static float VHACDconcavity { get; private set; } // 0.0025 maximum concavity
+ public static float VHACDplaneDownsampling { get; private set; } // 4 granularity of search for best clipping plane
+ public static float VHACDconvexHullDownsampling { get; private set; } // 4 precision of hull gen process
+ public static float VHACDalpha { get; private set; } // 0.05 bias toward clipping along symmetry planes
+ public static float VHACDbeta { get; private set; } // 0.05 bias toward clipping along revolution axis
+ public static float VHACDgamma { get; private set; } // 0.00125 max concavity when merging
+ public static float VHACDpca { get; private set; } // 0 on/off normalizing mesh before decomp
+ public static float VHACDmode { get; private set; } // 0 0:voxel based, 1: tetrahedron based
+ public static float VHACDmaxNumVerticesPerCH { get; private set; } // 64 max triangles per convex hull
+ public static float VHACDminVolumePerCH { get; private set; } // 0.0001 sampling of generated convex hulls
+
+ // Linkset implementation parameters
+ public static float LinksetImplementation { get; private set; }
+ public static bool LinksetOffsetCenterOfMass { get; private set; }
+ public static bool LinkConstraintUseFrameOffset { get; private set; }
+ public static bool 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 bool UseBulletRaycast { get; private set; }
+
+ public static float PID_D { get; private set; } // derivative
+ public static float PID_P { get; private set; } // proportional
+
+ public static float DebugNumber { get; private set; } // A console setable number used for debugging
+
+ // Various constants that come from that other virtual world that shall not be named.
+ public const float MinGravityZ = -1f;
+ public const float MaxGravityZ = 28f;
+ public const float MinFriction = 0f;
+ public const float MaxFriction = 255f;
+ public const float MinDensity = 0.01f;
+ public const float MaxDensity = 22587f;
+ public const float MinRestitution = 0f;
+ public const float MaxRestitution = 1f;
+
+ // =====================================================================================
+ // =====================================================================================
+
+ // Base parameter definition that gets and sets parameter values via a string
+ public abstract class ParameterDefnBase
{
- defaultValue = pDefault;
- setter = pSetter;
- getter = pGetter;
- objectSet = null;
- }
- public ParameterDefn(string pName, string pDesc, T pDefault, PGetValue pGetter, PSetValue pSetter, PSetOnObject pObjSetter)
- : base(pName, pDesc)
- {
- defaultValue = pDefault;
- setter = pSetter;
- getter = pGetter;
- objectSet = pObjSetter;
- }
- // Simple parameter variable where property name is the same as the INI file name
- // and the value is only a simple get and set.
- public ParameterDefn(string pName, string pDesc, T pDefault)
- : base(pName, pDesc)
- {
- defaultValue = pDefault;
- setter = (s, v) => { SetValueByName(s, name, v); };
- getter = (s) => { return GetValueByName(s, name); };
- objectSet = null;
- }
- // Use reflection to find the property named 'pName' in BSParam and assign 'val' to same.
- private void SetValueByName(BSScene s, string pName, T val)
- {
- PropertyInfo prop = typeof(BSParam).GetProperty(pName, BindingFlags.Public | BindingFlags.Static | BindingFlags.FlattenHierarchy);
- if (prop == null)
+ public string name; // string name of the parameter
+ public string desc; // a short description of what the parameter means
+ public ParameterDefnBase(string pName, string pDesc)
{
- // This should only be output when someone adds a new INI parameter and misspells the name.
- s.Logger.ErrorFormat("{0} SetValueByName: did not find '{1}'. Verify specified property name is the same as the given INI parameters name.", LogHeader, pName);
- }
- else
- {
- prop.SetValue(null, val, null);
+ name = pName;
+ desc = pDesc;
}
+ // Set the parameter value to the default
+ public abstract void AssignDefault(BSScene s);
+ // Get the value as a string
+ public abstract string GetValue(BSScene s);
+ // Set the value to this string value
+ public abstract void SetValue(BSScene s, string valAsString);
+ // set the value on a particular object (usually sets in physics engine)
+ public abstract void SetOnObject(BSScene s, BSPhysObject obj);
+ public abstract bool HasSetOnObject { get; }
}
- // Use reflection to find the property named 'pName' in BSParam and return the value in same.
- private T GetValueByName(BSScene s, string pName)
+
+ // Specific parameter definition for a parameter of a specific type.
+ public delegate T PGetValue(BSScene s);
+ public delegate void PSetValue(BSScene s, T val);
+ public delegate void PSetOnObject(BSScene scene, BSPhysObject obj);
+ public sealed class ParameterDefn : ParameterDefnBase
{
- PropertyInfo prop = typeof(BSParam).GetProperty(pName, BindingFlags.Public | BindingFlags.Static | BindingFlags.FlattenHierarchy);
- if (prop == null)
+ private T defaultValue;
+ private PSetValue setter;
+ private PGetValue getter;
+ private PSetOnObject objectSet;
+ public ParameterDefn(string pName, string pDesc, T pDefault, PGetValue pGetter, PSetValue pSetter)
+ : base(pName, pDesc)
{
- // This should only be output when someone adds a new INI parameter and misspells the name.
- s.Logger.ErrorFormat("{0} GetValueByName: did not find '{1}'. Verify specified property name is the same as the given INI parameter name.", LogHeader, pName);
+ defaultValue = pDefault;
+ setter = pSetter;
+ getter = pGetter;
+ objectSet = null;
}
- return (T)prop.GetValue(null, null);
- }
- public override void AssignDefault(BSScene s)
- {
- setter(s, defaultValue);
- }
- public override string GetValue(BSScene s)
- {
- return getter(s).ToString();
- }
- public override void SetValue(BSScene s, string valAsString)
- {
- // Get the generic type of the setter
- Type genericType = setter.GetType().GetGenericArguments()[0];
- // Find the 'Parse' method on that type
- System.Reflection.MethodInfo parser = null;
- try
+ public ParameterDefn(string pName, string pDesc, T pDefault, PGetValue pGetter, PSetValue pSetter, PSetOnObject pObjSetter)
+ : base(pName, pDesc)
{
- parser = genericType.GetMethod("Parse", new Type[] { typeof(String) } );
+ defaultValue = pDefault;
+ setter = pSetter;
+ getter = pGetter;
+ objectSet = pObjSetter;
}
- catch (Exception e)
+ // Simple parameter variable where property name is the same as the INI file name
+ // and the value is only a simple get and set.
+ public ParameterDefn(string pName, string pDesc, T pDefault)
+ : base(pName, pDesc)
{
- s.Logger.ErrorFormat("{0} Exception getting parser for type '{1}': {2}", LogHeader, genericType, e);
- parser = null;
+ defaultValue = pDefault;
+ setter = (s, v) => { SetValueByName(s, name, v); };
+ getter = (s) => { return GetValueByName(s, name); };
+ objectSet = null;
}
- if (parser != null)
+ // Use reflection to find the property named 'pName' in BSParam and assign 'val' to same.
+ private void SetValueByName(BSScene s, string pName, T val)
{
- // Parse the input string
+ PropertyInfo prop = typeof(BSParam).GetProperty(pName, BindingFlags.Public | BindingFlags.Static | BindingFlags.FlattenHierarchy);
+ if (prop == null)
+ {
+ // This should only be output when someone adds a new INI parameter and misspells the name.
+ s.Logger.ErrorFormat("{0} SetValueByName: did not find '{1}'. Verify specified property name is the same as the given INI parameters name.", LogHeader, pName);
+ }
+ else
+ {
+ prop.SetValue(null, val, null);
+ }
+ }
+ // Use reflection to find the property named 'pName' in BSParam and return the value in same.
+ private T GetValueByName(BSScene s, string pName)
+ {
+ PropertyInfo prop = typeof(BSParam).GetProperty(pName, BindingFlags.Public | BindingFlags.Static | BindingFlags.FlattenHierarchy);
+ if (prop == null)
+ {
+ // This should only be output when someone adds a new INI parameter and misspells the name.
+ s.Logger.ErrorFormat("{0} GetValueByName: did not find '{1}'. Verify specified property name is the same as the given INI parameter name.", LogHeader, pName);
+ }
+ return (T)prop.GetValue(null, null);
+ }
+ public override void AssignDefault(BSScene s)
+ {
+ setter(s, defaultValue);
+ }
+ public override string GetValue(BSScene s)
+ {
+ return getter(s).ToString();
+ }
+ public override void SetValue(BSScene s, string valAsString)
+ {
+ // Get the generic type of the setter
+ Type genericType = setter.GetType().GetGenericArguments()[0];
+ // Find the 'Parse' method on that type
+ System.Reflection.MethodInfo parser = null;
try
{
- T setValue = (T)parser.Invoke(genericType, new Object[] { valAsString });
- // Store the parsed value
- setter(s, setValue);
- // s.Logger.DebugFormat("{0} Parameter {1} = {2}", LogHeader, name, setValue);
+ parser = genericType.GetMethod("Parse", new Type[] { typeof(String) } );
}
- catch
+ catch (Exception e)
{
- s.Logger.ErrorFormat("{0} Failed parsing parameter value '{1}' as type '{2}'", LogHeader, valAsString, genericType);
+ s.Logger.ErrorFormat("{0} Exception getting parser for type '{1}': {2}", LogHeader, genericType, e);
+ parser = null;
+ }
+ if (parser != null)
+ {
+ // Parse the input string
+ try
+ {
+ T setValue = (T)parser.Invoke(genericType, new Object[] { valAsString });
+ // Store the parsed value
+ setter(s, setValue);
+ // s.Logger.DebugFormat("{0} Parameter {1} = {2}", LogHeader, name, setValue);
+ }
+ catch
+ {
+ s.Logger.ErrorFormat("{0} Failed parsing parameter value '{1}' as type '{2}'", LogHeader, valAsString, genericType);
+ }
+ }
+ else
+ {
+ s.Logger.ErrorFormat("{0} Could not find parameter parser for type '{1}'", LogHeader, genericType);
}
}
- else
+ public override bool HasSetOnObject
{
- s.Logger.ErrorFormat("{0} Could not find parameter parser for type '{1}'", LogHeader, genericType);
+ get { return objectSet != null; }
+ }
+ public override void SetOnObject(BSScene s, BSPhysObject obj)
+ {
+ if (objectSet != null)
+ objectSet(s, obj);
}
}
- public override bool HasSetOnObject
+
+ // 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.
+ //
+ // 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
+ // -- a delegate for getting the value
+ // -- a delegate for setting the value
+ // -- 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
+ // v = value (appropriate type)
+ private static ParameterDefnBase[] ParameterDefinitions =
{
- get { return objectSet != null; }
+ new ParameterDefn("Active", "If 'true', false then physics is not active",
+ false ),
+ new ParameterDefn("UseSeparatePhysicsThread", "If 'true', the physics engine runs independent from the simulator heartbeat",
+ false ),
+ new ParameterDefn("PhysicsTimeStep", "If separate thread, seconds to simulate each interval",
+ 0.089f ),
+
+ new ParameterDefn("MeshSculptedPrim", "Whether to create meshes for sculpties",
+ true,
+ (s) => { return ShouldMeshSculptedPrim; },
+ (s,v) => { ShouldMeshSculptedPrim = v; } ),
+ new ParameterDefn("ForceSimplePrimMeshing", "If true, only use primitive meshes for objects",
+ false,
+ (s) => { return ShouldForceSimplePrimMeshing; },
+ (s,v) => { ShouldForceSimplePrimMeshing = v; } ),
+ new ParameterDefn("UseHullsForPhysicalObjects", "If true, create hulls for physical objects",
+ true,
+ (s) => { return ShouldUseHullsForPhysicalObjects; },
+ (s,v) => { ShouldUseHullsForPhysicalObjects = v; } ),
+ new ParameterDefn("ShouldRemoveZeroWidthTriangles", "If true, remove degenerate triangles from meshes",
+ true ),
+ new ParameterDefn("ShouldUseBulletHACD", "If true, use the Bullet version of HACD",
+ false ),
+ new ParameterDefn("ShouldUseSingleConvexHullForPrims", "If true, use a single convex hull shape for physical prims",
+ true ),
+ new ParameterDefn("ShouldUseGImpactShapeForPrims", "If true, use a GImpact shape for prims with cuts and twists",
+ false ),
+ new ParameterDefn("ShouldUseAssetHulls", "If true, use hull if specified in the mesh asset info",
+ true ),
+
+ new ParameterDefn("CrossingFailuresBeforeOutOfBounds", "How forgiving we are about getting into adjactent regions",
+ 5 ),
+ new ParameterDefn("UpdateVelocityChangeThreshold", "Change in updated velocity required before reporting change to simulator",
+ 0.1f ),
+
+ new ParameterDefn("MeshLevelOfDetail", "Level of detail to render meshes (32, 16, 8 or 4. 32=most detailed)",
+ 32f,
+ (s) => { return MeshLOD; },
+ (s,v) => { MeshLOD = v; } ),
+ new ParameterDefn("MeshLevelOfDetailCircular", "Level of detail for prims with circular cuts or shapes",
+ 32f,
+ (s) => { return MeshCircularLOD; },
+ (s,v) => { MeshCircularLOD = v; } ),
+ new ParameterDefn("MeshLevelOfDetailMegaPrimThreshold", "Size (in meters) of a mesh before using MeshMegaPrimLOD",
+ 10f,
+ (s) => { return MeshMegaPrimThreshold; },
+ (s,v) => { MeshMegaPrimThreshold = v; } ),
+ new ParameterDefn("MeshLevelOfDetailMegaPrim", "Level of detail to render meshes larger than threshold meters",
+ 32f,
+ (s) => { return MeshMegaPrimLOD; },
+ (s,v) => { MeshMegaPrimLOD = v; } ),
+ new ParameterDefn("SculptLevelOfDetail", "Level of detail to render sculpties (32, 16, 8 or 4. 32=most detailed)",
+ 32f,
+ (s) => { return SculptLOD; },
+ (s,v) => { SculptLOD = v; } ),
+
+ new ParameterDefn("MaxSubStep", "In simulation step, maximum number of substeps",
+ 10,
+ (s) => { return s.m_maxSubSteps; },
+ (s,v) => { s.m_maxSubSteps = (int)v; } ),
+ new ParameterDefn("FixedTimeStep", "In simulation step, seconds of one substep (1/60)",
+ 1f / 60f,
+ (s) => { return s.m_fixedTimeStep; },
+ (s,v) => { s.m_fixedTimeStep = v; } ),
+ new ParameterDefn("NominalFrameRate", "The base frame rate we claim",
+ 55f,
+ (s) => { return s.NominalFrameRate; },
+ (s,v) => { s.NominalFrameRate = (int)v; } ),
+ new ParameterDefn("MaxCollisionsPerFrame", "Max collisions returned at end of each frame",
+ 2048,
+ (s) => { return s.m_maxCollisionsPerFrame; },
+ (s,v) => { s.m_maxCollisionsPerFrame = (int)v; } ),
+ new ParameterDefn("MaxUpdatesPerFrame", "Max updates returned at end of each frame",
+ 8000,
+ (s) => { return s.m_maxUpdatesPerFrame; },
+ (s,v) => { s.m_maxUpdatesPerFrame = (int)v; } ),
+
+ new ParameterDefn("MinObjectMass", "Minimum object mass (0.0001)",
+ 0.0001f,
+ (s) => { return MinimumObjectMass; },
+ (s,v) => { MinimumObjectMass = v; } ),
+ new ParameterDefn("MaxObjectMass", "Maximum object mass (10000.01)",
+ 10000.01f,
+ (s) => { return MaximumObjectMass; },
+ (s,v) => { MaximumObjectMass = v; } ),
+ new ParameterDefn("MaxLinearVelocity", "Maximum velocity magnitude that can be assigned to an object",
+ 1000.0f,
+ (s) => { return MaxLinearVelocity; },
+ (s,v) => { MaxLinearVelocity = v; MaxLinearVelocitySquared = v * v; } ),
+ new ParameterDefn("MaxAngularVelocity", "Maximum rotational velocity magnitude that can be assigned to an object",
+ 1000.0f,
+ (s) => { return MaxAngularVelocity; },
+ (s,v) => { MaxAngularVelocity = v; MaxAngularVelocitySquared = v * v; } ),
+ // LL documentation says thie number should be 20f for llApplyImpulse and 200f for llRezObject
+ new ParameterDefn("MaxAddForceMagnitude", "Maximum force that can be applied by llApplyImpulse (SL says 20f)",
+ 20000.0f,
+ (s) => { return MaxAddForceMagnitude; },
+ (s,v) => { MaxAddForceMagnitude = v; MaxAddForceMagnitudeSquared = v * v; } ),
+ // Density is passed around as 100kg/m3. This scales that to 1kg/m3.
+ // Reduce by power of 100 because Bullet doesn't seem to handle objects with large mass very well
+ new ParameterDefn("DensityScaleFactor", "Conversion for simulator/viewer density (100kg/m3) to physical density (1kg/m3)",
+ 0.01f ),
+
+ new ParameterDefn("PID_D", "Derivitive factor for motion smoothing",
+ 2200f ),
+ new ParameterDefn("PID_P", "Parameteric factor for motion smoothing",
+ 900f ),
+
+ new ParameterDefn("DefaultFriction", "Friction factor used on new objects",
+ 0.2f,
+ (s) => { return DefaultFriction; },
+ (s,v) => { DefaultFriction = v; s.UnmanagedParams[0].defaultFriction = v; } ),
+ // For historical reasons, the viewer and simulator multiply the density by 100
+ new ParameterDefn("DefaultDensity", "Density for new objects" ,
+ 1000.0006836f, // Aluminum g/cm3 * 100
+ (s) => { return DefaultDensity; },
+ (s,v) => { DefaultDensity = v; s.UnmanagedParams[0].defaultDensity = v; } ),
+ new ParameterDefn("DefaultRestitution", "Bouncyness of an object" ,
+ 0f,
+ (s) => { return DefaultRestitution; },
+ (s,v) => { DefaultRestitution = v; s.UnmanagedParams[0].defaultRestitution = v; } ),
+ new ParameterDefn("CollisionMargin", "Margin around objects before collisions are calculated (must be zero!)",
+ 0.04f,
+ (s) => { return CollisionMargin; },
+ (s,v) => { CollisionMargin = v; s.UnmanagedParams[0].collisionMargin = v; } ),
+ new ParameterDefn("Gravity", "Vertical force of gravity (negative means down)",
+ -9.80665f,
+ (s) => { return Gravity; },
+ (s,v) => { Gravity = v; s.UnmanagedParams[0].gravity = v; },
+ (s,o) => { s.PE.SetGravity(o.PhysBody, new Vector3(0f,0f,Gravity)); } ),
+
+
+ new ParameterDefn("LinearDamping", "Factor to damp linear movement per second (0.0 - 1.0)",
+ 0f,
+ (s) => { return LinearDamping; },
+ (s,v) => { LinearDamping = v; },
+ (s,o) => { s.PE.SetDamping(o.PhysBody, LinearDamping, AngularDamping); } ),
+ new ParameterDefn("AngularDamping", "Factor to damp angular movement per second (0.0 - 1.0)",
+ 0f,
+ (s) => { return AngularDamping; },
+ (s,v) => { AngularDamping = v; },
+ (s,o) => { s.PE.SetDamping(o.PhysBody, LinearDamping, AngularDamping); } ),
+ new ParameterDefn("DeactivationTime", "Seconds before considering an object potentially static",
+ 0.2f,
+ (s) => { return DeactivationTime; },
+ (s,v) => { DeactivationTime = v; },
+ (s,o) => { s.PE.SetDeactivationTime(o.PhysBody, DeactivationTime); } ),
+ new ParameterDefn("LinearSleepingThreshold", "Seconds to measure linear movement before considering static",
+ 0.8f,
+ (s) => { return LinearSleepingThreshold; },
+ (s,v) => { LinearSleepingThreshold = v;},
+ (s,o) => { s.PE.SetSleepingThresholds(o.PhysBody, LinearSleepingThreshold, AngularSleepingThreshold); } ),
+ new ParameterDefn("AngularSleepingThreshold", "Seconds to measure angular movement before considering static",
+ 1.0f,
+ (s) => { return AngularSleepingThreshold; },
+ (s,v) => { AngularSleepingThreshold = v;},
+ (s,o) => { s.PE.SetSleepingThresholds(o.PhysBody, LinearSleepingThreshold, AngularSleepingThreshold); } ),
+ new ParameterDefn("CcdMotionThreshold", "Continuious collision detection threshold (0 means no CCD)" ,
+ 0.0f, // set to zero to disable
+ (s) => { return CcdMotionThreshold; },
+ (s,v) => { CcdMotionThreshold = v;},
+ (s,o) => { s.PE.SetCcdMotionThreshold(o.PhysBody, CcdMotionThreshold); } ),
+ new ParameterDefn("CcdSweptSphereRadius", "Continuious collision detection test radius" ,
+ 0.2f,
+ (s) => { return CcdSweptSphereRadius; },
+ (s,v) => { CcdSweptSphereRadius = v;},
+ (s,o) => { s.PE.SetCcdSweptSphereRadius(o.PhysBody, CcdSweptSphereRadius); } ),
+ new ParameterDefn("ContactProcessingThreshold", "Distance above which contacts can be discarded (0 means no discard)" ,
+ 0.0f,
+ (s) => { return ContactProcessingThreshold; },
+ (s,v) => { ContactProcessingThreshold = v;},
+ (s,o) => { s.PE.SetContactProcessingThreshold(o.PhysBody, ContactProcessingThreshold); } ),
+
+ new ParameterDefn("TerrainImplementation", "Type of shape to use for terrain (0=heightmap, 1=mesh)",
+ (float)BSTerrainPhys.TerrainImplementation.Heightmap ),
+ new ParameterDefn("TerrainMeshMagnification", "Number of times the 256x256 heightmap is multiplied to create the terrain mesh" ,
+ 2 ),
+ new ParameterDefn("TerrainGroundPlane", "Altitude of ground plane used to keep things from falling to infinity" ,
+ -500.0f ),
+ new ParameterDefn("TerrainFriction", "Factor to reduce movement against terrain surface" ,
+ 0.3f ),
+ new ParameterDefn("TerrainHitFraction", "Distance to measure hit collisions" ,
+ 0.8f ),
+ new ParameterDefn("TerrainRestitution", "Bouncyness" ,
+ 0f ),
+ new ParameterDefn("TerrainContactProcessingThreshold", "Distance from terrain to stop processing collisions" ,
+ 0.0f ),
+ new ParameterDefn("TerrainCollisionMargin", "Margin where collision checking starts" ,
+ 0.04f ),
+
+ new ParameterDefn("AvatarToAvatarCollisionsByDefault", "Should avatars collide with other avatars by default?",
+ true),
+ new ParameterDefn("AvatarFriction", "Factor to reduce movement against an avatar. Changed on avatar recreation.",
+ 0.2f ),
+ new ParameterDefn("AvatarStandingFriction", "Avatar friction when standing. Changed on avatar recreation.",
+ 0.95f ),
+ new ParameterDefn("AvatarWalkVelocityFactor", "Speed multiplier if avatar is walking",
+ 1.0f ),
+ new ParameterDefn("AvatarAlwaysRunFactor", "Speed multiplier if avatar is set to always run",
+ 1.3f ),
+ // For historical reasons, density is reported * 100
+ new ParameterDefn("AvatarDensity", "Density of an avatar. Changed on avatar recreation. Scaled times 100.",
+ 350f) , // 3.5 * 100
+ new ParameterDefn("AvatarRestitution", "Bouncyness. Changed on avatar recreation.",
+ 0f ),
+ new ParameterDefn("AvatarShape", "Code for avatar physical shape: 0:capsule, 1:cube, 2:ovoid, 2:mesh",
+ BSShapeCollection.AvatarShapeCube ) ,
+ new ParameterDefn("AvatarCapsuleWidth", "The distance between the sides of the avatar capsule",
+ 0.6f ) ,
+ new ParameterDefn("AvatarCapsuleDepth", "The distance between the front and back of the avatar capsule",
+ 0.45f ),
+ new ParameterDefn("AvatarCapsuleHeight", "Default height of space around avatar",
+ 1.5f ),
+ new ParameterDefn("AvatarUseBefore09SizeComputation", "Use the old fudge method of computing avatar capsule size",
+ true ),
+ new ParameterDefn("AvatarHeightLowFudge", "A fudge factor to make small avatars stand on the ground",
+ 0f ),
+ new ParameterDefn("AvatarHeightMidFudge", "A fudge distance to adjust average sized avatars to be standing on ground",
+ 0f ),
+ new ParameterDefn("AvatarHeightHighFudge", "A fudge factor to make tall avatars stand on the ground",
+ 0f ),
+ new ParameterDefn("AvatarFlyingGroundMargin", "Meters avatar is kept above the ground when flying",
+ 5f ),
+ new ParameterDefn("AvatarFlyingGroundUpForce", "Upward force applied to the avatar to keep it at flying ground margin",
+ 2.0f ),
+ new ParameterDefn("AvatarAddForceFrames", "Frames to allow AddForce to apply before checking for stationary",
+ 10 ),
+ new ParameterDefn("AvatarTerminalVelocity", "Terminal Velocity of falling avatar",
+ -54.0f ),
+ new ParameterDefn("AvatarContactProcessingThreshold", "Distance from capsule to check for collisions",
+ 0.1f ),
+ new ParameterDefn("AvatarAddForcePushFactor", "BSCharacter.AddForce is multiplied by this and mass to be like other physics engines",
+ 0.315f ),
+ new ParameterDefn("AvatarStopZeroThreshold", "Movement velocity below which avatar is assumed to be stopped",
+ 0.45f,
+ (s) => { return (float)AvatarStopZeroThreshold; },
+ (s,v) => { AvatarStopZeroThreshold = v; AvatarStopZeroThresholdSquared = v * v; } ),
+ new ParameterDefn("AvatarBelowGroundUpCorrectionMeters", "Meters to move avatar up if it seems to be below ground",
+ 1.0f ),
+ new ParameterDefn("AvatarJumpFrames", "Number of frames to allow jump forces. Changes jump height.",
+ 4 ),
+ new ParameterDefn("AvatarStepHeight", "Height of a step obstacle to consider step correction",
+ 0.999f ) ,
+ new ParameterDefn("AvatarStepAngle", "The angle (in radians) for a vertical surface to be considered a step",
+ 0.3f ) ,
+ new ParameterDefn("AvatarStepGroundFudge", "Fudge factor subtracted from avatar base when comparing collision height",
+ 0.1f ) ,
+ new ParameterDefn("AvatarStepApproachFactor", "Factor to control angle of approach to step (0=straight on)",
+ 2f ),
+ new ParameterDefn("AvatarStepForceFactor", "Controls the amount of force up applied to step up onto a step",
+ 0f ),
+ new ParameterDefn("AvatarStepUpCorrectionFactor", "Multiplied by height of step collision to create up movement at step",
+ 0.8f ),
+ new ParameterDefn("AvatarStepSmoothingSteps", "Number of frames after a step collision that we continue walking up stairs",
+ 1 ),
+
+ new ParameterDefn("VehicleMaxLinearVelocity", "Maximum velocity magnitude that can be assigned to a vehicle",
+ 1000.0f,
+ (s) => { return (float)VehicleMaxLinearVelocity; },
+ (s,v) => { VehicleMaxLinearVelocity = v; VehicleMaxLinearVelocitySquared = v * v; } ),
+ new ParameterDefn("VehicleMinLinearVelocity", "Maximum velocity magnitude that can be assigned to a vehicle",
+ 0.001f,
+ (s) => { return (float)VehicleMinLinearVelocity; },
+ (s,v) => { VehicleMinLinearVelocity = v; VehicleMinLinearVelocitySquared = v * v; } ),
+ new ParameterDefn("VehicleMaxAngularVelocity", "Maximum rotational velocity magnitude that can be assigned to a vehicle",
+ 12.0f,
+ (s) => { return (float)VehicleMaxAngularVelocity; },
+ (s,v) => { VehicleMaxAngularVelocity = v; VehicleMaxAngularVelocitySq = v * v; } ),
+ new ParameterDefn("VehicleAngularDamping", "Factor to damp vehicle angular movement per second (0.0 - 1.0)",
+ 0.0f ),
+ new ParameterDefn("VehicleLinearFactor", "Fraction of physical linear changes applied to vehicle (<0,0,0> to <1,1,1>)",
+ new Vector3(1f, 1f, 1f) ),
+ new ParameterDefn("VehicleAngularFactor", "Fraction of physical angular changes applied to vehicle (<0,0,0> to <1,1,1>)",
+ new Vector3(1f, 1f, 1f) ),
+ new ParameterDefn("VehicleInertiaFactor", "Fraction of physical inertia applied (<0,0,0> to <1,1,1>)",
+ new Vector3(1f, 1f, 1f) ),
+ new ParameterDefn("VehicleFriction", "Friction of vehicle on the ground (0.0 - 1.0)",
+ 0.0f ),
+ new ParameterDefn("VehicleRestitution", "Bouncyness factor for vehicles (0.0 - 1.0)",
+ 0.0f ),
+ new ParameterDefn("VehicleGroundGravityFudge", "Factor to multiply gravity if a ground vehicle is probably on the ground (0.0 - 1.0)",
+ 0.2f ),
+ new ParameterDefn("VehicleAngularBankingTimescaleFudge", "Factor to multiple angular banking timescale. Tune to increase realism.",
+ 60.0f ),
+ new ParameterDefn("VehicleEnableLinearDeflection", "Turn on/off vehicle linear deflection effect",
+ true ),
+ new ParameterDefn("VehicleLinearDeflectionNotCollidingNoZ", "Turn on/off linear deflection Z effect on non-colliding vehicles",
+ true ),
+ new ParameterDefn("VehicleEnableAngularVerticalAttraction", "Turn on/off vehicle angular vertical attraction effect",
+ true ),
+ new ParameterDefn("VehicleAngularVerticalAttractionAlgorithm", "Select vertical attraction algo. You need to look at the source.",
+ 0 ),
+ new ParameterDefn("VehicleEnableAngularDeflection", "Turn on/off vehicle angular deflection effect",
+ true ),
+ new ParameterDefn("VehicleEnableAngularBanking", "Turn on/off vehicle angular banking effect",
+ true ),
+
+ new ParameterDefn("MaxPersistantManifoldPoolSize", "Number of manifolds pooled (0 means default of 4096)",
+ 0f,
+ (s) => { return MaxPersistantManifoldPoolSize; },
+ (s,v) => { MaxPersistantManifoldPoolSize = v; s.UnmanagedParams[0].maxPersistantManifoldPoolSize = v; } ),
+ new ParameterDefn("MaxCollisionAlgorithmPoolSize", "Number of collisions pooled (0 means default of 4096)",
+ 0f,
+ (s) => { return MaxCollisionAlgorithmPoolSize; },
+ (s,v) => { MaxCollisionAlgorithmPoolSize = v; s.UnmanagedParams[0].maxCollisionAlgorithmPoolSize = v; } ),
+ new ParameterDefn("ShouldDisableContactPoolDynamicAllocation", "Enable to allow large changes in object count",
+ false,
+ (s) => { return ShouldDisableContactPoolDynamicAllocation; },
+ (s,v) => { ShouldDisableContactPoolDynamicAllocation = v;
+ s.UnmanagedParams[0].shouldDisableContactPoolDynamicAllocation = NumericBool(v); } ),
+ new ParameterDefn("ShouldForceUpdateAllAabbs", "Enable to recomputer AABBs every simulator step",
+ false,
+ (s) => { return ShouldForceUpdateAllAabbs; },
+ (s,v) => { ShouldForceUpdateAllAabbs = v; s.UnmanagedParams[0].shouldForceUpdateAllAabbs = NumericBool(v); } ),
+ new ParameterDefn("ShouldRandomizeSolverOrder", "Enable for slightly better stacking interaction",
+ true,
+ (s) => { return ShouldRandomizeSolverOrder; },
+ (s,v) => { ShouldRandomizeSolverOrder = v; s.UnmanagedParams[0].shouldRandomizeSolverOrder = NumericBool(v); } ),
+ new ParameterDefn("ShouldSplitSimulationIslands", "Enable splitting active object scanning islands",
+ true,
+ (s) => { return ShouldSplitSimulationIslands; },
+ (s,v) => { ShouldSplitSimulationIslands = v; s.UnmanagedParams[0].shouldSplitSimulationIslands = NumericBool(v); } ),
+ new ParameterDefn("ShouldEnableFrictionCaching", "Enable friction computation caching",
+ true,
+ (s) => { return ShouldEnableFrictionCaching; },
+ (s,v) => { ShouldEnableFrictionCaching = v; s.UnmanagedParams[0].shouldEnableFrictionCaching = NumericBool(v); } ),
+ new ParameterDefn("NumberOfSolverIterations", "Number of internal iterations (0 means default)",
+ 0f, // zero says use Bullet default
+ (s) => { return NumberOfSolverIterations; },
+ (s,v) => { NumberOfSolverIterations = v; s.UnmanagedParams[0].numberOfSolverIterations = v; } ),
+ new ParameterDefn("UseSingleSidedMeshes", "Whether to compute collisions based on single sided meshes.",
+ true,
+ (s) => { return UseSingleSidedMeshes; },
+ (s,v) => { UseSingleSidedMeshes = v; s.UnmanagedParams[0].useSingleSidedMeshes = NumericBool(v); } ),
+ new ParameterDefn("GlobalContactBreakingThreshold", "Amount of shape radius before breaking a collision contact (0 says Bullet default (0.2))",
+ 0f,
+ (s) => { return GlobalContactBreakingThreshold; },
+ (s,v) => { GlobalContactBreakingThreshold = v; s.UnmanagedParams[0].globalContactBreakingThreshold = v; } ),
+ new ParameterDefn("PhysicsUnmanLoggingFrames", "If non-zero, frames between output of detailed unmanaged physics statistics",
+ 0f,
+ (s) => { return PhysicsUnmanLoggingFrames; },
+ (s,v) => { PhysicsUnmanLoggingFrames = v; s.UnmanagedParams[0].physicsLoggingFrames = v; } ),
+
+ new ParameterDefn("CSHullMaxDepthSplit", "CS impl: max depth to split for hull. 1-10 but > 7 is iffy",
+ 7 ),
+ new ParameterDefn("CSHullMaxDepthSplitForSimpleShapes", "CS impl: max depth setting for simple prim shapes",
+ 2 ),
+ new ParameterDefn("CSHullConcavityThresholdPercent", "CS impl: concavity threshold percent (0-20)",
+ 5f ),
+ new ParameterDefn("CSHullVolumeConservationThresholdPercent", "percent volume conservation to collapse hulls (0-30)",
+ 5f ),
+ new ParameterDefn("CSHullMaxVertices", "CS impl: maximum number of vertices in output hulls. Keep < 50.",
+ 32 ),
+ new ParameterDefn("CSHullMaxSkinWidth", "CS impl: skin width to apply to output hulls.",
+ 0f ),
+
+ new ParameterDefn("BHullMaxVerticesPerHull", "Bullet impl: max number of vertices per created hull",
+ 200f ),
+ new ParameterDefn("BHullMinClusters", "Bullet impl: minimum number of hulls to create per mesh",
+ 10f ),
+ new ParameterDefn("BHullCompacityWeight", "Bullet impl: weight factor for how compact to make hulls",
+ 20f ),
+ new ParameterDefn("BHullVolumeWeight", "Bullet impl: weight factor for volume in created hull",
+ 0.1f ),
+ new ParameterDefn("BHullConcavity", "Bullet impl: weight factor for how convex a created hull can be",
+ 10f ),
+ new ParameterDefn("BHullAddExtraDistPoints", "Bullet impl: whether to add extra vertices for long distance vectors",
+ true ),
+ new ParameterDefn("BHullAddNeighboursDistPoints", "Bullet impl: whether to add extra vertices between neighbor hulls",
+ true ),
+ new ParameterDefn("BHullAddFacesPoints", "Bullet impl: whether to add extra vertices to break up hull faces",
+ true ),
+ new ParameterDefn("BHullShouldAdjustCollisionMargin", "Bullet impl: whether to shrink resulting hulls to account for collision margin",
+ false ),
+
+ new ParameterDefn("WhichHACD", "zero if Bullet HACD, non-zero says VHACD",
+ 0f ),
+ new ParameterDefn("VHACDresolution", "max number of voxels generated during voxelization stage",
+ 100000f ),
+ new ParameterDefn("VHACDdepth", "max number of clipping stages",
+ 20f ),
+ new ParameterDefn("VHACDconcavity", "maximum concavity",
+ 0.0025f ),
+ new ParameterDefn("VHACDplaneDownsampling", "granularity of search for best clipping plane",
+ 4f ),
+ new ParameterDefn("VHACDconvexHullDownsampling", "precision of hull gen process",
+ 4f ),
+ new ParameterDefn("VHACDalpha", "bias toward clipping along symmetry planes",
+ 0.05f ),
+ new ParameterDefn("VHACDbeta", "bias toward clipping along revolution axis",
+ 0.05f ),
+ new ParameterDefn("VHACDgamma", "max concavity when merging",
+ 0.00125f ),
+ new ParameterDefn("VHACDpca", "on/off normalizing mesh before decomp",
+ 0f ),
+ new ParameterDefn("VHACDmode", "0:voxel based, 1: tetrahedron based",
+ 0f ),
+ new ParameterDefn("VHACDmaxNumVerticesPerCH", "max triangles per convex hull",
+ 64f ),
+ new ParameterDefn("VHACDminVolumePerCH", "sampling of generated convex hulls",
+ 0.0001f ),
+
+ new ParameterDefn("LinksetImplementation", "Type of linkset implementation (0=Constraint, 1=Compound, 2=Manual)",
+ (float)BSLinkset.LinksetImplementation.Compound ),
+ new ParameterDefn("LinksetOffsetCenterOfMass", "If 'true', compute linkset center-of-mass and offset linkset position to account for same",
+ true ),
+ new ParameterDefn("LinkConstraintUseFrameOffset", "For linksets built with constraints, enable frame offsetFor linksets built with constraints, enable frame offset.",
+ false ),
+ new ParameterDefn("LinkConstraintEnableTransMotor", "Whether to enable translational motor on linkset constraints",
+ true ),
+ new ParameterDefn("LinkConstraintTransMotorMaxVel", "Maximum velocity to be applied by translational motor in linkset constraints",
+ 5.0f ),
+ new ParameterDefn("LinkConstraintTransMotorMaxForce", "Maximum force to be applied by translational motor in linkset constraints",
+ 0.1f ),
+ new ParameterDefn("LinkConstraintCFM", "Amount constraint can be violated. 0=no violation, 1=infinite. Default=0.1",
+ 0.1f ),
+ new ParameterDefn("LinkConstraintERP", "Amount constraint is corrected each tick. 0=none, 1=all. Default = 0.2",
+ 0.1f ),
+ new ParameterDefn("LinkConstraintSolverIterations", "Number of solver iterations when computing constraint. (0 = Bullet default)",
+ 40 ),
+
+ new ParameterDefn("UseBulletRaycast", "If 'true', use the raycast function of the Bullet physics engine",
+ true ),
+
+ new ParameterDefn("DebugNumber", "A console setable number sometimes used for debugging",
+ 1.0f ),
+
+ new ParameterDefn("PhysicsMetricFrames", "Frames between outputting detailed phys metrics. (0 is off)",
+ 0,
+ (s) => { return s.PhysicsMetricDumpFrames; },
+ (s,v) => { s.PhysicsMetricDumpFrames = v; } ),
+ new ParameterDefn("ResetBroadphasePool", "Setting this is any value resets the broadphase collision pool",
+ 0f,
+ (s) => { return 0f; },
+ (s,v) => { BSParam.ResetBroadphasePoolTainted(s, v); } ),
+ new ParameterDefn("ResetConstraintSolver", "Setting this is any value resets the constraint solver",
+ 0f,
+ (s) => { return 0f; },
+ (s,v) => { BSParam.ResetConstraintSolverTainted(s, v); } ),
+ };
+
+ // Convert a boolean to our numeric true and false values
+ public static float NumericBool(bool b)
+ {
+ return (b ? ConfigurationParameters.numericTrue : ConfigurationParameters.numericFalse);
}
- public override void SetOnObject(BSScene s, BSPhysObject obj)
+
+ // Convert numeric true and false values to a boolean
+ public static bool BoolNumeric(float b)
{
- if (objectSet != null)
- objectSet(s, obj);
+ return (b == ConfigurationParameters.numericTrue ? true : false);
}
- }
- // 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.
- //
- // 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
- // -- a delegate for getting the value
- // -- a delegate for setting the value
- // -- 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
- // v = value (appropriate type)
- private static ParameterDefnBase[] ParameterDefinitions =
- {
- new ParameterDefn("Active", "If 'true', false then physics is not active",
- false ),
- new ParameterDefn("UseSeparatePhysicsThread", "If 'true', the physics engine runs independent from the simulator heartbeat",
- false ),
- new ParameterDefn("PhysicsTimeStep", "If separate thread, seconds to simulate each interval",
- 0.089f ),
-
- new ParameterDefn("MeshSculptedPrim", "Whether to create meshes for sculpties",
- true,
- (s) => { return ShouldMeshSculptedPrim; },
- (s,v) => { ShouldMeshSculptedPrim = v; } ),
- new ParameterDefn("ForceSimplePrimMeshing", "If true, only use primitive meshes for objects",
- false,
- (s) => { return ShouldForceSimplePrimMeshing; },
- (s,v) => { ShouldForceSimplePrimMeshing = v; } ),
- new ParameterDefn