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; }