* Added llApplyImpulse in the global frame. The object must be physical before this'll do anything. Be careful with this function as it's easy to loose prim.
parent
344b4d92f5
commit
18c959df12
OpenSim/Region
Environment/Scenes
Physics/OdePlugin
ScriptEngine/Common
|
@ -578,6 +578,16 @@ namespace OpenSim.Region.Environment.Scenes
|
||||||
SetPartAsRoot(newPart);
|
SetPartAsRoot(newPart);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void applyImpulse(PhysicsVector impulse)
|
||||||
|
{
|
||||||
|
SceneObjectPart rootpart = m_rootPart;
|
||||||
|
if (m_rootPart.PhysActor != null)
|
||||||
|
{
|
||||||
|
m_rootPart.PhysActor.AddForce(impulse);
|
||||||
|
m_scene.PhysicsScene.AddPhysicsActorTaint(m_rootPart.PhysActor);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public void SetRootPartOwner(SceneObjectPart part, LLUUID cAgentID, LLUUID cGroupID)
|
public void SetRootPartOwner(SceneObjectPart part, LLUUID cAgentID, LLUUID cGroupID)
|
||||||
{
|
{
|
||||||
part.LastOwnerID = part.OwnerID;
|
part.LastOwnerID = part.OwnerID;
|
||||||
|
|
|
@ -520,6 +520,21 @@ namespace OpenSim.Region.Environment.Scenes
|
||||||
|
|
||||||
protected PrimitiveBaseShape m_shape;
|
protected PrimitiveBaseShape m_shape;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// hook to the physics scene to apply impulse
|
||||||
|
/// This is sent up to the group, which then finds the root prim
|
||||||
|
/// and applies the force on the root prim of the group
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="impulse">Vector force</param>
|
||||||
|
public void ApplyImpulse(LLVector3 impulsei)
|
||||||
|
{
|
||||||
|
PhysicsVector impulse = new PhysicsVector(impulsei.X, impulsei.Y, impulsei.Z);
|
||||||
|
if (m_parentGroup != null)
|
||||||
|
{
|
||||||
|
m_parentGroup.applyImpulse(impulse);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public void TriggerScriptChangedEvent(Changed val)
|
public void TriggerScriptChangedEvent(Changed val)
|
||||||
{
|
{
|
||||||
if (m_parentGroup != null)
|
if (m_parentGroup != null)
|
||||||
|
|
|
@ -27,6 +27,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
using System;
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
using Axiom.Math;
|
using Axiom.Math;
|
||||||
using Ode.NET;
|
using Ode.NET;
|
||||||
using OpenSim.Framework;
|
using OpenSim.Framework;
|
||||||
|
@ -51,6 +52,9 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
private bool m_taintPhysics = false;
|
private bool m_taintPhysics = false;
|
||||||
public bool m_taintremove = false;
|
public bool m_taintremove = false;
|
||||||
|
|
||||||
|
private bool m_taintforce = false;
|
||||||
|
private List<PhysicsVector> m_forcelist = new List<PhysicsVector>();
|
||||||
|
|
||||||
private IMesh _mesh;
|
private IMesh _mesh;
|
||||||
private PrimitiveBaseShape _pbs;
|
private PrimitiveBaseShape _pbs;
|
||||||
private OdeScene _parent_scene;
|
private OdeScene _parent_scene;
|
||||||
|
@ -355,6 +359,9 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
if (m_taintshape)
|
if (m_taintshape)
|
||||||
changeshape(timestep);
|
changeshape(timestep);
|
||||||
//
|
//
|
||||||
|
|
||||||
|
if (m_taintforce)
|
||||||
|
changeAddForce(timestep);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Move(float timestep)
|
public void Move(float timestep)
|
||||||
|
@ -541,6 +548,27 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
m_taintshape = false;
|
m_taintshape = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void changeAddForce(float timestamp)
|
||||||
|
{
|
||||||
|
lock (m_forcelist)
|
||||||
|
{
|
||||||
|
//OpenSim.Framework.Console.MainLog.Instance.Verbose("PHYSICS", "dequeing forcelist");
|
||||||
|
if (IsPhysical)
|
||||||
|
{
|
||||||
|
PhysicsVector iforce = new PhysicsVector();
|
||||||
|
for (int i = 0; i < m_forcelist.Count; i++)
|
||||||
|
{
|
||||||
|
iforce = iforce + (m_forcelist[i]*100);
|
||||||
|
}
|
||||||
|
d.BodyEnable(Body);
|
||||||
|
d.BodyAddForce(Body, iforce.X, iforce.Y, iforce.Z);
|
||||||
|
}
|
||||||
|
m_forcelist.Clear();
|
||||||
|
}
|
||||||
|
m_taintforce = false;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
public override bool IsPhysical
|
public override bool IsPhysical
|
||||||
{
|
{
|
||||||
get { return m_isphysical; }
|
get { return m_isphysical; }
|
||||||
|
@ -663,6 +691,9 @@ namespace OpenSim.Region.Physics.OdePlugin
|
||||||
|
|
||||||
public override void AddForce(PhysicsVector force)
|
public override void AddForce(PhysicsVector force)
|
||||||
{
|
{
|
||||||
|
m_forcelist.Add(force);
|
||||||
|
m_taintforce = true;
|
||||||
|
//OpenSim.Framework.Console.MainLog.Instance.Verbose("PHYSICS", "Added Force:" + force.ToString() + " to prim at " + Position.ToString());
|
||||||
}
|
}
|
||||||
|
|
||||||
public override PhysicsVector RotationalVelocity
|
public override PhysicsVector RotationalVelocity
|
||||||
|
|
|
@ -792,7 +792,22 @@ namespace OpenSim.Region.ScriptEngine.Common
|
||||||
|
|
||||||
public void llApplyImpulse(LSL_Types.Vector3 force, int local)
|
public void llApplyImpulse(LSL_Types.Vector3 force, int local)
|
||||||
{
|
{
|
||||||
NotImplemented("llApplyImpulse");
|
//No energy force yet
|
||||||
|
if (local == 1)
|
||||||
|
{
|
||||||
|
NotImplemented("llApplyImpulse Local Force");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (force.x > 20000)
|
||||||
|
force.x = 20000;
|
||||||
|
if (force.y > 20000)
|
||||||
|
force.y = 20000;
|
||||||
|
if (force.z > 20000)
|
||||||
|
force.z = 20000;
|
||||||
|
|
||||||
|
m_host.ApplyImpulse(new LLVector3((float)force.x,(float)force.y,(float)force.z));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void llApplyRotationalImpulse(LSL_Types.Vector3 force, int local)
|
public void llApplyRotationalImpulse(LSL_Types.Vector3 force, int local)
|
||||||
|
|
Loading…
Reference in New Issue