* 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
|
@ -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