diff --git a/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs index 785ebf767c..10395b6051 100644 --- a/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs +++ b/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs @@ -207,7 +207,14 @@ namespace OpenSim.Region.Environment.Scenes public bool IsSelected { get { return m_isSelected; } - set { m_isSelected = value; } + set { + m_isSelected = value; + // Tell physics engine that group is selected + if (m_rootPart.PhysActor != null) + { + m_rootPart.PhysActor.Selected = value; + } + } } // The UUID for the Region this Object is in. @@ -1039,20 +1046,45 @@ namespace OpenSim.Region.Environment.Scenes } /// - /// + /// If object is physical, apply force to move it around + /// If object is not physical, just put it at the resulting location /// - /// - /// + /// Always seems to be 0,0,0, so ignoring + /// New position. We do the math here to turn it into a force /// public void GrabMovement(LLVector3 offset, LLVector3 pos, IClientAPI remoteClient) { + if (m_scene.EventManager.TriggerGroupMove(UUID, pos)) { - AbsolutePosition = pos; - m_rootPart.SendTerseUpdateToAllClients(); + + if (m_rootPart.PhysActor != null) + { + if (m_rootPart.PhysActor.IsPhysical) + { + LLVector3 llmoveforce = pos - AbsolutePosition; + PhysicsVector grabforce = new PhysicsVector(llmoveforce.X, llmoveforce.Y, llmoveforce.Z); + grabforce = (grabforce / 10) * m_rootPart.PhysActor.Mass; + m_rootPart.PhysActor.AddForce(grabforce); + m_scene.PhysicsScene.AddPhysicsActorTaint(m_rootPart.PhysActor); + } + else + { + NonPhysicalGrabMovement(pos); + } + } + else + { + NonPhysicalGrabMovement(pos); + } } } + public void NonPhysicalGrabMovement(LLVector3 pos) + { + AbsolutePosition = pos; + m_rootPart.SendTerseUpdateToAllClients(); + } /// /// /// diff --git a/OpenSim/Region/Physics/BasicPhysicsPlugin/BasicPhysicsPlugin.cs b/OpenSim/Region/Physics/BasicPhysicsPlugin/BasicPhysicsPlugin.cs index 636cf1a98d..ff157d7a05 100644 --- a/OpenSim/Region/Physics/BasicPhysicsPlugin/BasicPhysicsPlugin.cs +++ b/OpenSim/Region/Physics/BasicPhysicsPlugin/BasicPhysicsPlugin.cs @@ -224,6 +224,16 @@ namespace OpenSim.Region.Physics.BasicPhysicsPlugin set { return; } } + public override bool Grabbed + { + set { return; } + } + + public override bool Selected + { + set { return; } + } + public override bool IsPhysical { get { return false; } diff --git a/OpenSim/Region/Physics/BulletXPlugin/BulletXPlugin.cs b/OpenSim/Region/Physics/BulletXPlugin/BulletXPlugin.cs index deba5f6066..f42fdf6151 100644 --- a/OpenSim/Region/Physics/BulletXPlugin/BulletXPlugin.cs +++ b/OpenSim/Region/Physics/BulletXPlugin/BulletXPlugin.cs @@ -883,6 +883,16 @@ namespace OpenSim.Region.Physics.BulletXPlugin set { return; } } + public override bool Grabbed + { + set { return; } + } + + public override bool Selected + { + set { return; } + } + public virtual void SetAcceleration(PhysicsVector accel) { lock (BulletXScene.BulletXLock) diff --git a/OpenSim/Region/Physics/Manager/PhysicsActor.cs b/OpenSim/Region/Physics/Manager/PhysicsActor.cs index d393b624a5..f97b279bc4 100644 --- a/OpenSim/Region/Physics/Manager/PhysicsActor.cs +++ b/OpenSim/Region/Physics/Manager/PhysicsActor.cs @@ -122,6 +122,10 @@ namespace OpenSim.Region.Physics.Manager public abstract PrimitiveBaseShape Shape { set; } + public abstract bool Grabbed { set; } + + public abstract bool Selected { set; } + public virtual void RequestPhysicsterseUpdate() { // Make a temporary copy of the event to avoid possibility of @@ -190,6 +194,8 @@ namespace OpenSim.Region.Physics.Manager public abstract void AddForce(PhysicsVector force); public abstract void SetMomentum(PhysicsVector momentum); + + } public class NullPhysicsActor : PhysicsActor @@ -206,6 +212,17 @@ namespace OpenSim.Region.Physics.Manager set { return; } } + public override bool Grabbed + { + set { return; } + } + + public override bool Selected + { + set { return; } + } + + public override bool CollidingGround { get { return false; } diff --git a/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs b/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs index f9010e62ed..3f634774ca 100644 --- a/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs +++ b/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs @@ -152,6 +152,17 @@ namespace OpenSim.Region.Physics.OdePlugin set { m_alwaysRun = value; } } + public override bool Grabbed + { + set { return; } + } + + public override bool Selected + { + set { return; } + } + + public override bool IsPhysical { get { return false; } diff --git a/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs b/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs index dcff558092..d70819ec8a 100644 --- a/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs +++ b/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs @@ -202,6 +202,17 @@ namespace OpenSim.Region.Physics.OdePlugin set { return; } } + public override bool Grabbed + { + set { return; } + } + + public override bool Selected + { + set { return; } + } + + public void enableBody() { // Sets the geom to a body diff --git a/OpenSim/Region/Physics/POSPlugin/POSPlugin.cs b/OpenSim/Region/Physics/POSPlugin/POSPlugin.cs index 74b319a8d4..2b07553741 100644 --- a/OpenSim/Region/Physics/POSPlugin/POSPlugin.cs +++ b/OpenSim/Region/Physics/POSPlugin/POSPlugin.cs @@ -354,6 +354,16 @@ namespace OpenSim.Region.Physics.POSPlugin set { return; } } + public override bool Grabbed + { + set { return; } + } + + public override bool Selected + { + set { return; } + } + public override bool IsPhysical { get { return false; } @@ -607,5 +617,16 @@ namespace OpenSim.Region.Physics.POSPlugin get { return false; } set { return; } } + + public override bool Grabbed + { + set { return; } + } + + public override bool Selected + { + set { return; } + } + } } \ No newline at end of file diff --git a/OpenSim/Region/Physics/PhysXPlugin/PhysXPlugin.cs b/OpenSim/Region/Physics/PhysXPlugin/PhysXPlugin.cs index 20bf358825..71bd94ea11 100644 --- a/OpenSim/Region/Physics/PhysXPlugin/PhysXPlugin.cs +++ b/OpenSim/Region/Physics/PhysXPlugin/PhysXPlugin.cs @@ -224,6 +224,16 @@ namespace OpenSim.Region.Physics.PhysXPlugin set { return; } } + public override bool Grabbed + { + set { return; } + } + + public override bool Selected + { + set { return; } + } + public override bool IsPhysical { get { return false; } @@ -410,6 +420,16 @@ namespace OpenSim.Region.Physics.PhysXPlugin set { return; } } + public override bool Grabbed + { + set { return; } + } + + public override bool Selected + { + set { return; } + } + public override bool ThrottleUpdates { get { return false; }