mirror of
https://github.com/opensim/opensim.git
synced 2026-08-05 17:05:55 +08:00
Merge branch 'master' into careminster
Conflicts: OpenSim/Data/MySQL/MySQLSimulationData.cs OpenSim/Data/MySQL/Resources/RegionStore.migrations OpenSim/Region/ClientStack/Linden/Caps/WebFetchInvDescModule.cs OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs OpenSim/Region/CoreModules/Avatar/Inventory/Transfer/InventoryTransferModule.cs OpenSim/Region/CoreModules/World/LightShare/LightShareModule.cs OpenSim/Region/Framework/Scenes/Scene.cs OpenSim/Region/Framework/Scenes/ScenePresence.cs OpenSim/Region/Framework/Scenes/Tests/ScenePresenceCapabilityTests.cs OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
This commit is contained in:
@@ -29,12 +29,14 @@ using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Reflection;
|
||||
using System.Text;
|
||||
using System.Threading;
|
||||
|
||||
using OpenSim.Framework;
|
||||
using OpenSim.Region.CoreModules;
|
||||
using OpenSim.Region.Framework;
|
||||
using OpenSim.Region.Framework.Interfaces;
|
||||
using OpenSim.Region.Framework.Scenes;
|
||||
using OpenSim.Region.Physics.Manager;
|
||||
|
||||
using Mono.Addins;
|
||||
using Nini.Config;
|
||||
@@ -60,6 +62,10 @@ public class ExtendedPhysics : INonSharedRegionModule
|
||||
// Per prim functions. See BSPrim.
|
||||
public const string PhysFunctGetLinksetType = "BulletSim.GetLinksetType";
|
||||
public const string PhysFunctSetLinksetType = "BulletSim.SetLinksetType";
|
||||
public const string PhysFunctChangeLinkFixed = "BulletSim.ChangeLinkFixed";
|
||||
public const string PhysFunctChangeLinkType = "BulletSim.ChangeLinkType";
|
||||
public const string PhysFunctGetLinkType = "BulletSim.GetLinkType";
|
||||
public const string PhysFunctChangeLinkParams = "BulletSim.ChangeLinkParams";
|
||||
|
||||
// =============================================================
|
||||
|
||||
@@ -155,7 +161,7 @@ public class ExtendedPhysics : INonSharedRegionModule
|
||||
}
|
||||
|
||||
[ScriptConstant]
|
||||
public static int PHYS_CENTER_OF_MASS = 1 << 0;
|
||||
public const int PHYS_CENTER_OF_MASS = 1 << 0;
|
||||
|
||||
[ScriptInvocation]
|
||||
public string physGetEngineType(UUID hostID, UUID scriptID)
|
||||
@@ -171,11 +177,11 @@ public class ExtendedPhysics : INonSharedRegionModule
|
||||
}
|
||||
|
||||
[ScriptConstant]
|
||||
public static int PHYS_LINKSET_TYPE_CONSTRAINT = 0;
|
||||
public const int PHYS_LINKSET_TYPE_CONSTRAINT = 0;
|
||||
[ScriptConstant]
|
||||
public static int PHYS_LINKSET_TYPE_COMPOUND = 1;
|
||||
public const int PHYS_LINKSET_TYPE_COMPOUND = 1;
|
||||
[ScriptConstant]
|
||||
public static int PHYS_LINKSET_TYPE_MANUAL = 2;
|
||||
public const int PHYS_LINKSET_TYPE_MANUAL = 2;
|
||||
|
||||
[ScriptInvocation]
|
||||
public int physSetLinksetType(UUID hostID, UUID scriptID, int linksetType)
|
||||
@@ -195,10 +201,38 @@ public class ExtendedPhysics : INonSharedRegionModule
|
||||
|
||||
if (rootPart != null)
|
||||
{
|
||||
Physics.Manager.PhysicsActor rootPhysActor = rootPart.PhysActor;
|
||||
PhysicsActor rootPhysActor = rootPart.PhysActor;
|
||||
if (rootPhysActor != null)
|
||||
{
|
||||
ret = (int)rootPhysActor.Extension(PhysFunctSetLinksetType, linksetType);
|
||||
if (rootPhysActor.IsPhysical)
|
||||
{
|
||||
// Change a physical linkset by making non-physical, waiting for one heartbeat so all
|
||||
// the prim and linkset state is updated, changing the type and making the
|
||||
// linkset physical again.
|
||||
containingGroup.ScriptSetPhysicsStatus(false);
|
||||
Thread.Sleep(150); // longer than one heartbeat tick
|
||||
|
||||
// A kludge for the moment.
|
||||
// Since compound linksets move the children but don't generate position updates to the
|
||||
// simulator, it is possible for compound linkset children to have out-of-sync simulator
|
||||
// and physical positions. The following causes the simulator to push the real child positions
|
||||
// down into the physics engine to get everything synced.
|
||||
containingGroup.UpdateGroupPosition(containingGroup.AbsolutePosition);
|
||||
containingGroup.UpdateGroupRotationR(containingGroup.GroupRotation);
|
||||
|
||||
object[] parms2 = { rootPhysActor, null, linksetType };
|
||||
ret = MakeIntError(rootPhysActor.Extension(PhysFunctSetLinksetType, parms2));
|
||||
Thread.Sleep(150); // longer than one heartbeat tick
|
||||
|
||||
containingGroup.ScriptSetPhysicsStatus(true);
|
||||
}
|
||||
else
|
||||
{
|
||||
// Non-physical linksets don't have a physical instantiation so there is no state to
|
||||
// worry about being updated.
|
||||
object[] parms2 = { rootPhysActor, null, linksetType };
|
||||
ret = MakeIntError(rootPhysActor.Extension(PhysFunctSetLinksetType, parms2));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -223,7 +257,6 @@ public class ExtendedPhysics : INonSharedRegionModule
|
||||
public int physGetLinksetType(UUID hostID, UUID scriptID)
|
||||
{
|
||||
int ret = -1;
|
||||
|
||||
if (!Enabled) return ret;
|
||||
|
||||
// The part that is requesting the change.
|
||||
@@ -237,10 +270,11 @@ public class ExtendedPhysics : INonSharedRegionModule
|
||||
|
||||
if (rootPart != null)
|
||||
{
|
||||
Physics.Manager.PhysicsActor rootPhysActor = rootPart.PhysActor;
|
||||
PhysicsActor rootPhysActor = rootPart.PhysActor;
|
||||
if (rootPhysActor != null)
|
||||
{
|
||||
ret = (int)rootPhysActor.Extension(PhysFunctGetLinksetType);
|
||||
object[] parms2 = { rootPhysActor, null };
|
||||
ret = MakeIntError(rootPhysActor.Extension(PhysFunctGetLinksetType, parms2));
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -260,5 +294,288 @@ public class ExtendedPhysics : INonSharedRegionModule
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
[ScriptConstant]
|
||||
public const int PHYS_LINK_TYPE_FIXED = 1234;
|
||||
[ScriptConstant]
|
||||
public const int PHYS_LINK_TYPE_HINGE = 4;
|
||||
[ScriptConstant]
|
||||
public const int PHYS_LINK_TYPE_SPRING = 9;
|
||||
[ScriptConstant]
|
||||
public const int PHYS_LINK_TYPE_6DOF = 6;
|
||||
[ScriptConstant]
|
||||
public const int PHYS_LINK_TYPE_SLIDER = 7;
|
||||
|
||||
// physChangeLinkType(integer linkNum, integer typeCode)
|
||||
[ScriptInvocation]
|
||||
public int physChangeLinkType(UUID hostID, UUID scriptID, int linkNum, int typeCode)
|
||||
{
|
||||
int ret = -1;
|
||||
if (!Enabled) return ret;
|
||||
|
||||
PhysicsActor rootPhysActor;
|
||||
PhysicsActor childPhysActor;
|
||||
|
||||
if (GetRootAndChildPhysActors(hostID, linkNum, out rootPhysActor, out childPhysActor))
|
||||
{
|
||||
object[] parms2 = { rootPhysActor, childPhysActor, typeCode };
|
||||
ret = MakeIntError(rootPhysActor.Extension(PhysFunctChangeLinkType, parms2));
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
// physGetLinkType(integer linkNum)
|
||||
[ScriptInvocation]
|
||||
public int physGetLinkType(UUID hostID, UUID scriptID, int linkNum)
|
||||
{
|
||||
int ret = -1;
|
||||
if (!Enabled) return ret;
|
||||
|
||||
PhysicsActor rootPhysActor;
|
||||
PhysicsActor childPhysActor;
|
||||
|
||||
if (GetRootAndChildPhysActors(hostID, linkNum, out rootPhysActor, out childPhysActor))
|
||||
{
|
||||
object[] parms2 = { rootPhysActor, childPhysActor };
|
||||
ret = MakeIntError(rootPhysActor.Extension(PhysFunctGetLinkType, parms2));
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
// physChangeLinkFixed(integer linkNum)
|
||||
// Change the link between the root and the linkNum into a fixed, static physical connection.
|
||||
[ScriptInvocation]
|
||||
public int physChangeLinkFixed(UUID hostID, UUID scriptID, int linkNum)
|
||||
{
|
||||
int ret = -1;
|
||||
if (!Enabled) return ret;
|
||||
|
||||
PhysicsActor rootPhysActor;
|
||||
PhysicsActor childPhysActor;
|
||||
|
||||
if (GetRootAndChildPhysActors(hostID, linkNum, out rootPhysActor, out childPhysActor))
|
||||
{
|
||||
object[] parms2 = { rootPhysActor, childPhysActor , PHYS_LINK_TYPE_FIXED };
|
||||
ret = MakeIntError(rootPhysActor.Extension(PhysFunctChangeLinkType, parms2));
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
// Code for specifying params.
|
||||
// The choice if 14400 is arbitrary and only serves to catch parameter code misuse.
|
||||
public const int PHYS_PARAM_MIN = 14401;
|
||||
|
||||
[ScriptConstant]
|
||||
public const int PHYS_PARAM_FRAMEINA_LOC = 14401;
|
||||
[ScriptConstant]
|
||||
public const int PHYS_PARAM_FRAMEINA_ROT = 14402;
|
||||
[ScriptConstant]
|
||||
public const int PHYS_PARAM_FRAMEINB_LOC = 14403;
|
||||
[ScriptConstant]
|
||||
public const int PHYS_PARAM_FRAMEINB_ROT = 14404;
|
||||
[ScriptConstant]
|
||||
public const int PHYS_PARAM_LINEAR_LIMIT_LOW = 14405;
|
||||
[ScriptConstant]
|
||||
public const int PHYS_PARAM_LINEAR_LIMIT_HIGH = 14406;
|
||||
[ScriptConstant]
|
||||
public const int PHYS_PARAM_ANGULAR_LIMIT_LOW = 14407;
|
||||
[ScriptConstant]
|
||||
public const int PHYS_PARAM_ANGULAR_LIMIT_HIGH = 14408;
|
||||
[ScriptConstant]
|
||||
public const int PHYS_PARAM_USE_FRAME_OFFSET = 14409;
|
||||
[ScriptConstant]
|
||||
public const int PHYS_PARAM_ENABLE_TRANSMOTOR = 14410;
|
||||
[ScriptConstant]
|
||||
public const int PHYS_PARAM_TRANSMOTOR_MAXVEL = 14411;
|
||||
[ScriptConstant]
|
||||
public const int PHYS_PARAM_TRANSMOTOR_MAXFORCE = 14412;
|
||||
[ScriptConstant]
|
||||
public const int PHYS_PARAM_CFM = 14413;
|
||||
[ScriptConstant]
|
||||
public const int PHYS_PARAM_ERP = 14414;
|
||||
[ScriptConstant]
|
||||
public const int PHYS_PARAM_SOLVER_ITERATIONS = 14415;
|
||||
[ScriptConstant]
|
||||
public const int PHYS_PARAM_SPRING_AXIS_ENABLE = 14416;
|
||||
[ScriptConstant]
|
||||
public const int PHYS_PARAM_SPRING_DAMPING = 14417;
|
||||
[ScriptConstant]
|
||||
public const int PHYS_PARAM_SPRING_STIFFNESS = 14418;
|
||||
[ScriptConstant]
|
||||
public const int PHYS_PARAM_LINK_TYPE = 14419;
|
||||
[ScriptConstant]
|
||||
public const int PHYS_PARAM_USE_LINEAR_FRAMEA = 14420;
|
||||
[ScriptConstant]
|
||||
public const int PHYS_PARAM_SPRING_EQUILIBRIUM_POINT = 14421;
|
||||
|
||||
public const int PHYS_PARAM_MAX = 14421;
|
||||
|
||||
// Used when specifying a parameter that has settings for the three linear and three angular axis
|
||||
[ScriptConstant]
|
||||
public const int PHYS_AXIS_ALL = -1;
|
||||
[ScriptConstant]
|
||||
public const int PHYS_AXIS_LINEAR_ALL = -2;
|
||||
[ScriptConstant]
|
||||
public const int PHYS_AXIS_ANGULAR_ALL = -3;
|
||||
[ScriptConstant]
|
||||
public const int PHYS_AXIS_LINEAR_X = 0;
|
||||
[ScriptConstant]
|
||||
public const int PHYS_AXIS_LINEAR_Y = 1;
|
||||
[ScriptConstant]
|
||||
public const int PHYS_AXIS_LINEAR_Z = 2;
|
||||
[ScriptConstant]
|
||||
public const int PHYS_AXIS_ANGULAR_X = 3;
|
||||
[ScriptConstant]
|
||||
public const int PHYS_AXIS_ANGULAR_Y = 4;
|
||||
[ScriptConstant]
|
||||
public const int PHYS_AXIS_ANGULAR_Z = 5;
|
||||
|
||||
// physChangeLinkParams(integer linkNum, [ PHYS_PARAM_*, value, PHYS_PARAM_*, value, ...])
|
||||
[ScriptInvocation]
|
||||
public int physChangeLinkParams(UUID hostID, UUID scriptID, int linkNum, object[] parms)
|
||||
{
|
||||
int ret = -1;
|
||||
if (!Enabled) return ret;
|
||||
|
||||
PhysicsActor rootPhysActor;
|
||||
PhysicsActor childPhysActor;
|
||||
|
||||
if (GetRootAndChildPhysActors(hostID, linkNum, out rootPhysActor, out childPhysActor))
|
||||
{
|
||||
object[] parms2 = AddToBeginningOfArray(rootPhysActor, childPhysActor, parms);
|
||||
ret = MakeIntError(rootPhysActor.Extension(PhysFunctChangeLinkParams, parms2));
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
private bool GetRootPhysActor(UUID hostID, out PhysicsActor rootPhysActor)
|
||||
{
|
||||
SceneObjectGroup containingGroup;
|
||||
SceneObjectPart rootPart;
|
||||
return GetRootPhysActor(hostID, out containingGroup, out rootPart, out rootPhysActor);
|
||||
}
|
||||
|
||||
private bool GetRootPhysActor(UUID hostID, out SceneObjectGroup containingGroup, out SceneObjectPart rootPart, out PhysicsActor rootPhysActor)
|
||||
{
|
||||
bool ret = false;
|
||||
rootPhysActor = null;
|
||||
containingGroup = null;
|
||||
rootPart = null;
|
||||
|
||||
SceneObjectPart requestingPart;
|
||||
|
||||
requestingPart = BaseScene.GetSceneObjectPart(hostID);
|
||||
if (requestingPart != null)
|
||||
{
|
||||
// The type is is always on the root of a linkset.
|
||||
containingGroup = requestingPart.ParentGroup;
|
||||
if (containingGroup != null && !containingGroup.IsDeleted)
|
||||
{
|
||||
rootPart = containingGroup.RootPart;
|
||||
if (rootPart != null)
|
||||
{
|
||||
rootPhysActor = rootPart.PhysActor;
|
||||
if (rootPhysActor != null)
|
||||
{
|
||||
ret = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
m_log.WarnFormat("{0} GetRootAndChildPhysActors: Root part does not have a physics actor. rootName={1}, hostID={2}",
|
||||
LogHeader, rootPart.Name, hostID);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
m_log.WarnFormat("{0} GetRootAndChildPhysActors: Root part does not exist. RequestingPartName={1}, hostID={2}",
|
||||
LogHeader, requestingPart.Name, hostID);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
m_log.WarnFormat("{0} GetRootAndChildPhysActors: Containing group missing or deleted. hostID={1}", LogHeader, hostID);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
m_log.WarnFormat("{0} GetRootAndChildPhysActors: cannot find script object in scene. hostID={1}", LogHeader, hostID);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
// Find the root and child PhysActors based on the linkNum.
|
||||
// Return 'true' if both are found and returned.
|
||||
private bool GetRootAndChildPhysActors(UUID hostID, int linkNum, out PhysicsActor rootPhysActor, out PhysicsActor childPhysActor)
|
||||
{
|
||||
bool ret = false;
|
||||
rootPhysActor = null;
|
||||
childPhysActor = null;
|
||||
|
||||
SceneObjectGroup containingGroup;
|
||||
SceneObjectPart rootPart;
|
||||
|
||||
if (GetRootPhysActor(hostID, out containingGroup, out rootPart, out rootPhysActor))
|
||||
{
|
||||
SceneObjectPart linkPart = containingGroup.GetLinkNumPart(linkNum);
|
||||
if (linkPart != null)
|
||||
{
|
||||
childPhysActor = linkPart.PhysActor;
|
||||
if (childPhysActor != null)
|
||||
{
|
||||
ret = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
m_log.WarnFormat("{0} GetRootAndChildPhysActors: Link part has no physical actor. rootName={1}, hostID={2}, linknum={3}",
|
||||
LogHeader, rootPart.Name, hostID, linkNum);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
m_log.WarnFormat("{0} GetRootAndChildPhysActors: Could not find linknum part. rootName={1}, hostID={2}, linknum={3}",
|
||||
LogHeader, rootPart.Name, hostID, linkNum);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
m_log.WarnFormat("{0} GetRootAndChildPhysActors: Root part does not have a physics actor. rootName={1}, hostID={2}",
|
||||
LogHeader, rootPart.Name, hostID);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
// Return an array of objects with the passed object as the first object of a new array
|
||||
private object[] AddToBeginningOfArray(object firstOne, object secondOne, object[] prevArray)
|
||||
{
|
||||
object[] newArray = new object[2 + prevArray.Length];
|
||||
newArray[0] = firstOne;
|
||||
newArray[1] = secondOne;
|
||||
prevArray.CopyTo(newArray, 2);
|
||||
return newArray;
|
||||
}
|
||||
|
||||
// Extension() returns an object. Convert that object into the integer error we expect to return.
|
||||
private int MakeIntError(object extensionRet)
|
||||
{
|
||||
int ret = -1;
|
||||
if (extensionRet != null)
|
||||
{
|
||||
try
|
||||
{
|
||||
ret = (int)extensionRet;
|
||||
}
|
||||
catch
|
||||
{
|
||||
ret = -1;
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user