From c4687116adfdeb5de056000ef3d2dd47b8695339 Mon Sep 17 00:00:00 2001 From: Teravus Ovares Date: Tue, 29 Jan 2008 15:10:18 +0000 Subject: [PATCH] * Implemented grab and throw in ODE. It's a little strong still so toss gently at first to test the waters or you'll lose prim to the pit at the edge of the sim. Make sure the object is physical before trying to toss it or it'll just move to the new location. --- .../Environment/Scenes/SceneObjectGroup.cs | 44 ++++++++++++++++--- .../BasicPhysicsPlugin/BasicPhysicsPlugin.cs | 10 +++++ .../Physics/BulletXPlugin/BulletXPlugin.cs | 10 +++++ .../Region/Physics/Manager/PhysicsActor.cs | 17 +++++++ .../Region/Physics/OdePlugin/ODECharacter.cs | 11 +++++ OpenSim/Region/Physics/OdePlugin/ODEPrim.cs | 11 +++++ OpenSim/Region/Physics/POSPlugin/POSPlugin.cs | 21 +++++++++ .../Region/Physics/PhysXPlugin/PhysXPlugin.cs | 20 +++++++++ 8 files changed, 138 insertions(+), 6 deletions(-) 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; }