BulletSim: fix line endings in BSActor*

user_profiles
Robert Adams 2013-03-31 17:38:13 -07:00
parent 747ece59d2
commit 75b8cf428e
2 changed files with 302 additions and 291 deletions

View File

@ -1,168 +1,171 @@
/* /*
* Copyright (c) Contributors, http://opensimulator.org/ * Copyright (c) Contributors, http://opensimulator.org/
* See CONTRIBUTORS.TXT for a full list of copyright holders. * See CONTRIBUTORS.TXT for a full list of copyright holders.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met: * modification, are permitted provided that the following conditions are met:
* * Redistributions of source code must retain the above copyright * * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer. * notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyrightD * * Redistributions in binary form must reproduce the above copyrightD
* notice, this list of conditions and the following disclaimer in the * notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution. * documentation and/or other materials provided with the distribution.
* * Neither the name of the OpenSimulator Project nor the * * Neither the name of the OpenSimulator Project nor the
* names of its contributors may be used to endorse or promote products * names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission. * derived from this software without specific prior written permission.
* *
* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/ */
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using OMV = OpenMetaverse; using OMV = OpenMetaverse;
namespace OpenSim.Region.Physics.BulletSPlugin namespace OpenSim.Region.Physics.BulletSPlugin
{ {
public class BSActorLockAxis : BSActor public class BSActorLockAxis : BSActor
{ {
bool TryExperimentalLockAxisCode = false; bool TryExperimentalLockAxisCode = false;
BSConstraint LockAxisConstraint = null; BSConstraint LockAxisConstraint = null;
public BSActorLockAxis(BSScene physicsScene, BSPhysObject pObj, string actorName) public BSActorLockAxis(BSScene physicsScene, BSPhysObject pObj, string actorName)
: base(physicsScene, pObj,actorName) : base(physicsScene, pObj,actorName)
{ {
LockAxisConstraint = null; PhysicsScene.DetailLog("{0},BSActorLockAxis,constructor", Prim.LocalID);
} LockAxisConstraint = null;
}
// BSActor.isActive
public override bool isActive // BSActor.isActive
{ public override bool isActive
get { return Enabled && Prim.IsPhysicallyActive; } {
} get { return Enabled && Prim.IsPhysicallyActive; }
}
// Release any connections and resources used by the actor.
// BSActor.Release() // Release any connections and resources used by the actor.
public override void Release() // BSActor.Dispose()
{ public override void Dispose()
RemoveAxisLockConstraint(); {
} RemoveAxisLockConstraint();
}
// Called when physical parameters (properties set in Bullet) need to be re-applied.
// Called at taint-time. // Called when physical parameters (properties set in Bullet) need to be re-applied.
// BSActor.Refresh() // Called at taint-time.
public override void Refresh() // BSActor.Refresh()
{ public override void Refresh()
// If all the axis are free, we don't need to exist {
if (Prim.LockedAxis == Prim.LockedAxisFree) PhysicsScene.DetailLog("{0},BSActorLockAxis,refresh,lockedAxis={1},enabled={2},pActive={3}",
{ Prim.LocalID, Prim.LockedAxis, Enabled, Prim.IsPhysicallyActive);
Prim.PhysicalActors.RemoveAndRelease(ActorName); // If all the axis are free, we don't need to exist
return; if (Prim.LockedAxis == Prim.LockedAxisFree)
} {
// If the object is physically active, add the axis locking constraint Prim.PhysicalActors.RemoveAndRelease(ActorName);
if (Enabled return;
&& Prim.IsPhysicallyActive }
&& TryExperimentalLockAxisCode // If the object is physically active, add the axis locking constraint
&& Prim.LockedAxis != Prim.LockedAxisFree) if (Enabled
{ && Prim.IsPhysicallyActive
if (LockAxisConstraint != null) && TryExperimentalLockAxisCode
AddAxisLockConstraint(); && Prim.LockedAxis != Prim.LockedAxisFree)
} {
else if (LockAxisConstraint != null)
{ AddAxisLockConstraint();
RemoveAxisLockConstraint(); }
} else
} {
RemoveAxisLockConstraint();
// 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.RemoveBodyDependencies() // The object's physical representation is being rebuilt so pick up any physical dependencies (constraints, ...).
public override void RemoveBodyDependencies() // Register a prestep action to restore physical requirements before the next simulation step.
{ // Called at taint-time.
if (LockAxisConstraint != null) // BSActor.RemoveBodyDependencies()
{ public override void RemoveBodyDependencies()
// If a constraint is set up, remove it from the physical scene {
RemoveAxisLockConstraint(); if (LockAxisConstraint != null)
// Schedule a call before the next simulation step to restore the constraint. {
PhysicsScene.PostTaintObject(Prim.LockedAxisActorName, Prim.LocalID, delegate() // If a constraint is set up, remove it from the physical scene
{ RemoveAxisLockConstraint();
Refresh(); // Schedule a call before the next simulation step to restore the constraint.
}); PhysicsScene.PostTaintObject(Prim.LockedAxisActorName, Prim.LocalID, delegate()
} {
} Refresh();
});
private void AddAxisLockConstraint() }
{ }
// Lock that axis by creating a 6DOF constraint that has one end in the world and
// the other in the object. private void AddAxisLockConstraint()
// http://www.bulletphysics.org/Bullet/phpBB3/viewtopic.php?p=20817 {
// http://www.bulletphysics.org/Bullet/phpBB3/viewtopic.php?p=26380 // Lock that axis by creating a 6DOF constraint that has one end in the world and
// the other in the object.
// Remove any existing axis constraint (just to be sure) // http://www.bulletphysics.org/Bullet/phpBB3/viewtopic.php?p=20817
RemoveAxisLockConstraint(); // http://www.bulletphysics.org/Bullet/phpBB3/viewtopic.php?p=26380
BSConstraint6Dof axisConstrainer = new BSConstraint6Dof(PhysicsScene.World, Prim.PhysBody, // Remove any existing axis constraint (just to be sure)
OMV.Vector3.Zero, OMV.Quaternion.Inverse(Prim.RawOrientation), RemoveAxisLockConstraint();
true /* useLinearReferenceFrameB */, true /* disableCollisionsBetweenLinkedBodies */);
LockAxisConstraint = axisConstrainer; BSConstraint6Dof axisConstrainer = new BSConstraint6Dof(PhysicsScene.World, Prim.PhysBody,
PhysicsScene.Constraints.AddConstraint(LockAxisConstraint); OMV.Vector3.Zero, OMV.Quaternion.Inverse(Prim.RawOrientation),
true /* useLinearReferenceFrameB */, true /* disableCollisionsBetweenLinkedBodies */);
// The constraint is tied to the world and oriented to the prim. LockAxisConstraint = axisConstrainer;
PhysicsScene.Constraints.AddConstraint(LockAxisConstraint);
// Free to move linearly
OMV.Vector3 linearLow = OMV.Vector3.Zero; // The constraint is tied to the world and oriented to the prim.
OMV.Vector3 linearHigh = PhysicsScene.TerrainManager.DefaultRegionSize;
axisConstrainer.SetLinearLimits(linearLow, linearHigh); // Free to move linearly
OMV.Vector3 linearLow = OMV.Vector3.Zero;
// Angular with some axis locked OMV.Vector3 linearHigh = PhysicsScene.TerrainManager.DefaultRegionSize;
float f2PI = (float)Math.PI * 2f; axisConstrainer.SetLinearLimits(linearLow, linearHigh);
OMV.Vector3 angularLow = new OMV.Vector3(-f2PI, -f2PI, -f2PI);
OMV.Vector3 angularHigh = new OMV.Vector3(f2PI, f2PI, f2PI); // Angular with some axis locked
if (Prim.LockedAxis.X != 1f) float f2PI = (float)Math.PI * 2f;
{ OMV.Vector3 angularLow = new OMV.Vector3(-f2PI, -f2PI, -f2PI);
angularLow.X = 0f; OMV.Vector3 angularHigh = new OMV.Vector3(f2PI, f2PI, f2PI);
angularHigh.X = 0f; if (Prim.LockedAxis.X != 1f)
} {
if (Prim.LockedAxis.Y != 1f) angularLow.X = 0f;
{ angularHigh.X = 0f;
angularLow.Y = 0f; }
angularHigh.Y = 0f; if (Prim.LockedAxis.Y != 1f)
} {
if (Prim.LockedAxis.Z != 1f) angularLow.Y = 0f;
{ angularHigh.Y = 0f;
angularLow.Z = 0f; }
angularHigh.Z = 0f; if (Prim.LockedAxis.Z != 1f)
} {
axisConstrainer.SetAngularLimits(angularLow, angularHigh); angularLow.Z = 0f;
angularHigh.Z = 0f;
PhysicsScene.DetailLog("{0},BSPrim.LockAngularMotion,create,linLow={1},linHi={2},angLow={3},angHi={4}", }
Prim.LocalID, linearLow, linearHigh, angularLow, angularHigh); axisConstrainer.SetAngularLimits(angularLow, angularHigh);
// Constants from one of the posts mentioned above and used in Bullet's ConstraintDemo. PhysicsScene.DetailLog("{0},BSPrim.LockAngularMotion,create,linLow={1},linHi={2},angLow={3},angHi={4}",
axisConstrainer.TranslationalLimitMotor(true /* enable */, 5.0f, 0.1f); Prim.LocalID, linearLow, linearHigh, angularLow, angularHigh);
axisConstrainer.RecomputeConstraintVariables(Prim.RawMass); // Constants from one of the posts mentioned above and used in Bullet's ConstraintDemo.
} axisConstrainer.TranslationalLimitMotor(true /* enable */, 5.0f, 0.1f);
private void RemoveAxisLockConstraint() axisConstrainer.RecomputeConstraintVariables(Prim.RawMass);
{ }
if (LockAxisConstraint != null)
{ private void RemoveAxisLockConstraint()
PhysicsScene.Constraints.RemoveAndDestroyConstraint(LockAxisConstraint); {
LockAxisConstraint = null; if (LockAxisConstraint != null)
PhysicsScene.DetailLog("{0},BSPrim.CleanUpLockAxisPhysicals,destroyingConstraint", Prim.LocalID); {
} PhysicsScene.Constraints.RemoveAndDestroyConstraint(LockAxisConstraint);
} LockAxisConstraint = null;
} PhysicsScene.DetailLog("{0},BSPrim.CleanUpLockAxisPhysicals,destroyingConstraint", Prim.LocalID);
} }
}
}
}

View File

@ -1,123 +1,131 @@
/* /*
* Copyright (c) Contributors, http://opensimulator.org/ * Copyright (c) Contributors, http://opensimulator.org/
* See CONTRIBUTORS.TXT for a full list of copyright holders. * See CONTRIBUTORS.TXT for a full list of copyright holders.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met: * modification, are permitted provided that the following conditions are met:
* * Redistributions of source code must retain the above copyright * * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer. * notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyrightD * * Redistributions in binary form must reproduce the above copyrightD
* notice, this list of conditions and the following disclaimer in the * notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution. * documentation and/or other materials provided with the distribution.
* * Neither the name of the OpenSimulator Project nor the * * Neither the name of the OpenSimulator Project nor the
* names of its contributors may be used to endorse or promote products * names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission. * derived from this software without specific prior written permission.
* *
* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/ */
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Text; using System.Text;
namespace OpenSim.Region.Physics.BulletSPlugin namespace OpenSim.Region.Physics.BulletSPlugin
{ {
public class BSActorCollection public class BSActorCollection
{ {
private BSScene PhysicsScene { get; set; } private BSScene PhysicsScene { get; set; }
private Dictionary<string, BSActor> m_actors; private Dictionary<string, BSActor> m_actors;
public BSActorCollection(BSScene physicsScene) public BSActorCollection(BSScene physicsScene)
{ {
PhysicsScene = physicsScene; PhysicsScene = physicsScene;
m_actors = new Dictionary<string, BSActor>(); m_actors = new Dictionary<string, BSActor>();
} }
public void Add(string name, BSActor actor) public void Add(string name, BSActor actor)
{ {
m_actors[name] = actor; m_actors[name] = actor;
} }
public bool RemoveAndRelease(string name) public bool RemoveAndRelease(string name)
{ {
bool ret = false; bool ret = false;
if (m_actors.ContainsKey(name)) if (m_actors.ContainsKey(name))
{ {
BSActor beingRemoved = m_actors[name]; BSActor beingRemoved = m_actors[name];
beingRemoved.Release(); beingRemoved.Dispose();
m_actors.Remove(name); m_actors.Remove(name);
ret = true; ret = true;
} }
return ret; return ret;
} }
public void Clear() public void Clear()
{ {
Release(); Release();
m_actors.Clear(); m_actors.Clear();
} }
public bool HasActor(string name) public bool HasActor(string name)
{ {
return m_actors.ContainsKey(name); return m_actors.ContainsKey(name);
} }
public void ForEachActor(Action<BSActor> act) public void ForEachActor(Action<BSActor> act)
{ {
foreach (KeyValuePair<string, BSActor> kvp in m_actors) foreach (KeyValuePair<string, BSActor> kvp in m_actors)
act(kvp.Value); act(kvp.Value);
} }
public void Release() public void Release()
{ {
ForEachActor(a => a.Release()); ForEachActor(a => a.Dispose());
} }
public void Refresh() public void Refresh()
{ {
ForEachActor(a => a.Refresh()); ForEachActor(a => a.Refresh());
} }
public void RemoveBodyDependencies() public void RemoveBodyDependencies()
{ {
ForEachActor(a => a.RemoveBodyDependencies()); ForEachActor(a => a.RemoveBodyDependencies());
} }
} }
// ============================================================================= // =============================================================================
public abstract class BSActor /// <summary>
{ /// Each physical object can have 'actors' who are pushing the object around.
protected BSScene PhysicsScene { get; private set; } /// This can be used for hover, locking axis, making vehicles, etc.
protected BSPhysObject Prim { get; private set; } /// Each physical object can have multiple actors acting on it.
protected bool Enabled { get; set; } ///
public string ActorName { get; private set; } /// An actor usually registers itself with physics scene events (pre-step action)
/// and modifies the parameters on the host physical object.
public BSActor(BSScene physicsScene, BSPhysObject pObj, string actorName) /// </summary>
{ public abstract class BSActor
PhysicsScene = physicsScene; {
Prim = pObj; protected BSScene PhysicsScene { get; private set; }
ActorName = actorName; protected BSPhysObject Prim { get; private set; }
Enabled = true; protected bool Enabled { get; set; }
} public string ActorName { get; private set; }
// Return 'true' if activily updating the prim public BSActor(BSScene physicsScene, BSPhysObject pObj, string actorName)
public virtual bool isActive {
{ PhysicsScene = physicsScene;
get { return Enabled; } Prim = pObj;
} ActorName = actorName;
// Turn the actor on an off. Enabled = true;
public virtual void Enable(bool setEnabled) }
{
Enabled = setEnabled; // Return 'true' if activily updating the prim
} public virtual bool isActive
// Release any connections and resources used by the actor. {
public abstract void Release(); get { return Enabled; }
// Called when physical parameters (properties set in Bullet) need to be re-applied. }
public abstract void Refresh(); // Turn the actor on an off.
// The object's physical representation is being rebuilt so pick up any physical dependencies (constraints, ...). public virtual void Enable(bool setEnabled)
// Register a prestep action to restore physical requirements before the next simulation step. {
public abstract void RemoveBodyDependencies(); 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 RemoveBodyDependencies();
}
}