Implements llSetForce() and llGetForce(). These are experimental and the units may not match the Linden implementation.

0.6.0-stable
Dahlia Trimble 2008-07-24 07:45:58 +00:00
parent d58346e798
commit f74a9bcdc7
11 changed files with 92 additions and 10 deletions

View File

@ -1374,6 +1374,14 @@ namespace OpenSim.Region.Environment.Scenes
} }
} }
public PhysicsVector GetForce()
{
if (PhysActor != null)
return PhysActor.Force;
else
return new PhysicsVector();
}
[SecurityPermission(SecurityAction.LinkDemand, [SecurityPermission(SecurityAction.LinkDemand,
Flags = SecurityPermissionFlag.SerializationFormatter)] Flags = SecurityPermissionFlag.SerializationFormatter)]
public virtual void GetObjectData( public virtual void GetObjectData(
@ -2296,6 +2304,14 @@ namespace OpenSim.Region.Environment.Scenes
} }
} }
public void SetForce(PhysicsVector force)
{
if (PhysActor != null)
{
PhysActor.Force = force;
}
}
public void SetGroup(LLUUID groupID, IClientAPI client) public void SetGroup(LLUUID groupID, IClientAPI client)
{ {
_groupID = groupID; _groupID = groupID;

View File

@ -332,6 +332,7 @@ namespace OpenSim.Region.Physics.BasicPhysicsPlugin
public override PhysicsVector Force public override PhysicsVector Force
{ {
get { return PhysicsVector.Zero; } get { return PhysicsVector.Zero; }
set { return; }
} }
public override PhysicsVector CenterOfMass public override PhysicsVector CenterOfMass

View File

@ -943,6 +943,7 @@ namespace OpenSim.Region.Physics.BulletXPlugin
public override PhysicsVector Force public override PhysicsVector Force
{ {
get { return PhysicsVector.Zero; } get { return PhysicsVector.Zero; }
set { return; }
} }
public override PhysicsVector CenterOfMass public override PhysicsVector CenterOfMass

View File

@ -173,7 +173,7 @@ namespace OpenSim.Region.Physics.Manager
public abstract PhysicsVector Position { get; set; } public abstract PhysicsVector Position { get; set; }
public abstract float Mass { get; } public abstract float Mass { get; }
public abstract PhysicsVector Force { get; } public abstract PhysicsVector Force { get; set; }
public abstract PhysicsVector GeometricCenter { get; } public abstract PhysicsVector GeometricCenter { get; }
public abstract PhysicsVector CenterOfMass { get; } public abstract PhysicsVector CenterOfMass { get; }
public abstract PhysicsVector Velocity { get; set; } public abstract PhysicsVector Velocity { get; set; }
@ -277,6 +277,7 @@ namespace OpenSim.Region.Physics.Manager
public override PhysicsVector Force public override PhysicsVector Force
{ {
get { return PhysicsVector.Zero; } get { return PhysicsVector.Zero; }
set { return; }
} }
public override PhysicsVector CenterOfMass public override PhysicsVector CenterOfMass

View File

@ -534,6 +534,7 @@ namespace OpenSim.Region.Physics.OdePlugin
public override PhysicsVector Force public override PhysicsVector Force
{ {
get { return new PhysicsVector(_target_velocity.X, _target_velocity.Y, _target_velocity.Z); } get { return new PhysicsVector(_target_velocity.X, _target_velocity.Y, _target_velocity.Z); }
set { return; }
} }
public override PhysicsVector CenterOfMass public override PhysicsVector CenterOfMass

View File

@ -103,6 +103,7 @@ namespace OpenSim.Region.Physics.OdePlugin
private CollisionLocker ode; private CollisionLocker ode;
private bool m_taintforce = false; private bool m_taintforce = false;
private PhysicsVector m_force = new PhysicsVector(0.0f, 0.0f, 0.0f);
private List<PhysicsVector> m_forcelist = new List<PhysicsVector>(); private List<PhysicsVector> m_forcelist = new List<PhysicsVector>();
private IMesh _mesh; private IMesh _mesh;
@ -749,7 +750,7 @@ namespace OpenSim.Region.Physics.OdePlugin
changeshape(timestep); changeshape(timestep);
// //
if (m_taintforce) if (m_taintforce || m_force != new PhysicsVector(0.0f, 0.0f, 0.0f))
changeAddForce(timestep); changeAddForce(timestep);
if (m_taintdisable) if (m_taintdisable)
@ -1751,7 +1752,8 @@ namespace OpenSim.Region.Physics.OdePlugin
//m_log.Info("[PHYSICS]: dequeing forcelist"); //m_log.Info("[PHYSICS]: dequeing forcelist");
if (IsPhysical) if (IsPhysical)
{ {
PhysicsVector iforce = new PhysicsVector(); //PhysicsVector iforce = new PhysicsVector();
PhysicsVector iforce = m_force * 100.0f;
for (int i = 0; i < m_forcelist.Count; i++) for (int i = 0; i < m_forcelist.Count; i++)
{ {
iforce = iforce + (m_forcelist[i] * 100); iforce = iforce + (m_forcelist[i] * 100);
@ -1856,7 +1858,9 @@ namespace OpenSim.Region.Physics.OdePlugin
public override PhysicsVector Force public override PhysicsVector Force
{ {
get { return PhysicsVector.Zero; } //get { return PhysicsVector.Zero; }
get { return m_force; }
set { m_force = value; }
} }
public override PhysicsVector CenterOfMass public override PhysicsVector CenterOfMass

View File

@ -156,6 +156,7 @@ namespace OpenSim.Region.Physics.POSPlugin
public override PhysicsVector Force public override PhysicsVector Force
{ {
get { return PhysicsVector.Zero; } get { return PhysicsVector.Zero; }
set { return; }
} }
public override PhysicsVector CenterOfMass public override PhysicsVector CenterOfMass

View File

@ -118,6 +118,7 @@ namespace OpenSim.Region.Physics.POSPlugin
public override PhysicsVector Force public override PhysicsVector Force
{ {
get { return PhysicsVector.Zero; } get { return PhysicsVector.Zero; }
set { return; }
} }
public override PhysicsVector CenterOfMass public override PhysicsVector CenterOfMass

View File

@ -340,6 +340,7 @@ namespace OpenSim.Region.Physics.PhysXPlugin
public override PhysicsVector Force public override PhysicsVector Force
{ {
get { return PhysicsVector.Zero; } get { return PhysicsVector.Zero; }
set { return; }
} }
public override PhysicsVector CenterOfMass public override PhysicsVector CenterOfMass
@ -669,6 +670,7 @@ namespace OpenSim.Region.Physics.PhysXPlugin
public override PhysicsVector Force public override PhysicsVector Force
{ {
get { return PhysicsVector.Zero; } get { return PhysicsVector.Zero; }
set { return; }
} }
public override PhysicsVector CenterOfMass public override PhysicsVector CenterOfMass

View File

@ -42,6 +42,7 @@ using OpenSim.Region.Environment.Interfaces;
using OpenSim.Region.Environment.Modules.Avatar.Currency.SampleMoney; using OpenSim.Region.Environment.Modules.Avatar.Currency.SampleMoney;
using OpenSim.Region.Environment.Modules.World.Land; using OpenSim.Region.Environment.Modules.World.Land;
using OpenSim.Region.Environment.Scenes; using OpenSim.Region.Environment.Scenes;
using OpenSim.Region.Physics.Manager;
using OpenSim.Region.ScriptEngine.Common.ScriptEngineBase; using OpenSim.Region.ScriptEngine.Common.ScriptEngineBase;
//using OpenSim.Region.ScriptEngine.DotNetEngine.Compiler.LSL; //using OpenSim.Region.ScriptEngine.DotNetEngine.Compiler.LSL;
@ -1578,14 +1579,40 @@ namespace OpenSim.Region.ScriptEngine.Common
public void llSetForce(LSL_Types.Vector3 force, int local) public void llSetForce(LSL_Types.Vector3 force, int local)
{ {
m_host.AddScriptLPS(1); m_host.AddScriptLPS(1);
NotImplemented("llSetForce"); //NotImplemented("llSetForce");
if (m_host.ParentGroup != null)
{
if (m_host.ParentGroup.RootPart != null)
{
if (local != 0)
force *= llGetRot();
m_host.ParentGroup.RootPart.SetForce(new PhysicsVector((float)force.x, (float)force.y, (float)force.z));
}
}
} }
public LSL_Types.Vector3 llGetForce() public LSL_Types.Vector3 llGetForce()
{ {
LSL_Types.Vector3 force = new LSL_Types.Vector3(0.0, 0.0, 0.0);
m_host.AddScriptLPS(1); m_host.AddScriptLPS(1);
NotImplemented("llGetForce"); //NotImplemented("llGetForce");
return new LSL_Types.Vector3(); //return new LSL_Types.Vector3();
if (m_host.ParentGroup != null)
{
if (m_host.ParentGroup.RootPart != null)
{
PhysicsVector tmpForce = m_host.ParentGroup.RootPart.GetForce();
force.x = tmpForce.X;
force.y = tmpForce.Y;
force.z = tmpForce.Z;
}
}
return force;
} }
public LSL_Types.LSLInteger llTarget(LSL_Types.Vector3 position, double range) public LSL_Types.LSLInteger llTarget(LSL_Types.Vector3 position, double range)

View File

@ -43,6 +43,7 @@ using OpenSim.Region.Environment.Interfaces;
using OpenSim.Region.Environment.Modules.Avatar.Currency.SampleMoney; using OpenSim.Region.Environment.Modules.Avatar.Currency.SampleMoney;
using OpenSim.Region.Environment.Modules.World.Land; using OpenSim.Region.Environment.Modules.World.Land;
using OpenSim.Region.Environment.Scenes; using OpenSim.Region.Environment.Scenes;
using OpenSim.Region.Physics.Manager;
using OpenSim.Region.ScriptEngine.Shared; using OpenSim.Region.ScriptEngine.Shared;
using OpenSim.Region.ScriptEngine.Shared.Api.Plugins; using OpenSim.Region.ScriptEngine.Shared.Api.Plugins;
using OpenSim.Region.ScriptEngine.Shared.ScriptBase; using OpenSim.Region.ScriptEngine.Shared.ScriptBase;
@ -1430,14 +1431,40 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
public void llSetForce(LSL_Types.Vector3 force, int local) public void llSetForce(LSL_Types.Vector3 force, int local)
{ {
m_host.AddScriptLPS(1); m_host.AddScriptLPS(1);
NotImplemented("llSetForce"); //NotImplemented("llSetForce");
if (m_host.ParentGroup != null)
{
if (m_host.ParentGroup.RootPart != null)
{
if (local != 0)
force *= llGetRot();
m_host.ParentGroup.RootPart.SetForce(new PhysicsVector((float)force.x, (float)force.y, (float)force.z));
}
}
} }
public LSL_Types.Vector3 llGetForce() public LSL_Types.Vector3 llGetForce()
{ {
LSL_Types.Vector3 force = new LSL_Types.Vector3(0.0, 0.0, 0.0);
m_host.AddScriptLPS(1); m_host.AddScriptLPS(1);
NotImplemented("llGetForce"); //NotImplemented("llGetForce");
return new LSL_Types.Vector3(); //return new LSL_Types.Vector3();
if (m_host.ParentGroup != null)
{
if (m_host.ParentGroup.RootPart != null)
{
PhysicsVector tmpForce = m_host.ParentGroup.RootPart.GetForce();
force.x = tmpForce.X;
force.y = tmpForce.Y;
force.z = tmpForce.Z;
}
}
return force;
} }
public LSL_Types.LSLInteger llTarget(LSL_Types.Vector3 position, double range) public LSL_Types.LSLInteger llTarget(LSL_Types.Vector3 position, double range)