From 8efe4bfc2ed7086e9fdf4812297e6525f955f6ac Mon Sep 17 00:00:00 2001
From: Justin Clark-Casey (justincc)
Date: Mon, 29 Jul 2013 23:18:29 +0100
Subject: Make "abnormal thread terminations" into
"ClientLogoutsDueToNoReceives" and add this to the StatsManager
This reflects the actual use of this stat - it hasn't recorded general exceptions for some time.
Make the sim extra stats collector draw the data from the stats manager rather than maintaing this data itself.
---
.../Region/ClientStack/Linden/UDP/LLUDPServer.cs | 26 +++++++++++++++++-----
1 file changed, 21 insertions(+), 5 deletions(-)
(limited to 'OpenSim/Region')
diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs
index 25e10be..9e6a401 100644
--- a/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs
+++ b/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs
@@ -69,9 +69,22 @@ namespace OpenSim.Region.ClientStack.LindenUDP
StatsManager.RegisterStat(
new Stat(
+ "ClientLogoutsDueToNoReceives",
+ "Number of times a client has been logged out because no packets were received before the timeout.",
+ "",
+ "",
+ "clientstack",
+ scene.Name,
+ StatType.Pull,
+ MeasuresOfInterest.None,
+ stat => stat.Value = m_udpServer.ClientLogoutsDueToNoReceives,
+ StatVerbosity.Debug));
+
+ StatsManager.RegisterStat(
+ new Stat(
"IncomingUDPReceivesCount",
"Number of UDP receives performed",
- "Number of UDP receives performed",
+ "",
"",
"clientstack",
scene.Name,
@@ -84,7 +97,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
new Stat(
"IncomingPacketsProcessedCount",
"Number of inbound LL protocol packets processed",
- "Number of inbound LL protocol packets processed",
+ "",
"",
"clientstack",
scene.Name,
@@ -97,7 +110,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
new Stat(
"OutgoingUDPSendsCount",
"Number of UDP sends performed",
- "Number of UDP sends performed",
+ "",
"",
"clientstack",
scene.Name,
@@ -149,6 +162,9 @@ namespace OpenSim.Region.ClientStack.LindenUDP
/// Maximum transmission unit, or UDP packet size, for the LLUDP protocol
public const int MTU = 1400;
+ /// Number of forced client logouts due to no receipt of packets before timeout.
+ public int ClientLogoutsDueToNoReceives { get; private set; }
+
///
/// Default packet debug level given to new clients
///
@@ -1037,7 +1053,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
timeoutTicks = m_pausedAckTimeout;
if (client.IsActive &&
- (Environment.TickCount & Int32.MaxValue) - udpClient.TickLastPacketReceived > timeoutTicks)
+ (Environment.TickCount & Int32.MaxValue) - udpClient.TickLastPacketReceived > -1)
{
// We must set IsActive synchronously so that we can stop the packet loop reinvoking this method, even
// though it's set later on by LLClientView.Close()
@@ -1778,7 +1794,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
"[LLUDPSERVER]: Ack timeout, disconnecting {0} agent for {1} in {2}",
client.SceneAgent.IsChildAgent ? "child" : "root", client.Name, m_scene.RegionInfo.RegionName);
- StatsManager.SimExtraStats.AddAbnormalClientThreadTermination();
+ ClientLogoutsDueToNoReceives++;
if (!client.SceneAgent.IsChildAgent)
client.Kick("Simulator logged you out due to connection timeout");
--
cgit v1.1
From 8004e6f31cb03abc9b6170622099879ccaf5570b Mon Sep 17 00:00:00 2001
From: Justin Clark-Casey (justincc)
Date: Mon, 29 Jul 2013 23:38:54 +0100
Subject: Fix issue just introduced in 8efe4bfc2ed7086e9fdf4812297e6525f955f6ac
where I accidentally left in a test line to force very quick client unack
---
OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
(limited to 'OpenSim/Region')
diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs
index 9e6a401..bf50868 100644
--- a/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs
+++ b/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs
@@ -1053,7 +1053,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
timeoutTicks = m_pausedAckTimeout;
if (client.IsActive &&
- (Environment.TickCount & Int32.MaxValue) - udpClient.TickLastPacketReceived > -1)
+ (Environment.TickCount & Int32.MaxValue) - udpClient.TickLastPacketReceived > timeoutTicks)
{
// We must set IsActive synchronously so that we can stop the packet loop reinvoking this method, even
// though it's set later on by LLClientView.Close()
--
cgit v1.1
From 1416c909326d89566cbe785b6dacac228e31a5a0 Mon Sep 17 00:00:00 2001
From: Justin Clark-Casey (justincc)
Date: Mon, 29 Jul 2013 23:53:59 +0100
Subject: minor: Add timeout secs to connection timeout message. Change
message to reflect it is a timeout due to no data received rather than an ack
issue.
---
OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs | 17 +++++++++--------
1 file changed, 9 insertions(+), 8 deletions(-)
(limited to 'OpenSim/Region')
diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs
index bf50868..85fe1a4 100644
--- a/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs
+++ b/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs
@@ -1062,7 +1062,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
// Fire this out on a different thread so that we don't hold up outgoing packet processing for
// everybody else if this is being called due to an ack timeout.
// This is the same as processing as the async process of a logout request.
- Util.FireAndForget(o => DeactivateClientDueToTimeout(client));
+ Util.FireAndForget(o => DeactivateClientDueToTimeout(client, timeoutTicks));
return;
}
@@ -1786,18 +1786,19 @@ namespace OpenSim.Region.ClientStack.LindenUDP
/// regular client pings.
///
///
- private void DeactivateClientDueToTimeout(LLClientView client)
+ ///
+ private void DeactivateClientDueToTimeout(LLClientView client, int timeoutTicks)
{
lock (client.CloseSyncLock)
- {
- m_log.WarnFormat(
- "[LLUDPSERVER]: Ack timeout, disconnecting {0} agent for {1} in {2}",
- client.SceneAgent.IsChildAgent ? "child" : "root", client.Name, m_scene.RegionInfo.RegionName);
-
+ {
ClientLogoutsDueToNoReceives++;
+
+ m_log.WarnFormat(
+ "[LLUDPSERVER]: No packets received from {0} agent of {1} for {2}ms in {3}. Disconnecting.",
+ client.SceneAgent.IsChildAgent ? "child" : "root", client.Name, timeoutTicks, m_scene.Name);
if (!client.SceneAgent.IsChildAgent)
- client.Kick("Simulator logged you out due to connection timeout");
+ client.Kick("Simulator logged you out due to connection timeout.");
client.CloseWithoutChecks();
}
--
cgit v1.1
From 5a7784a0e6c3f549d0e7b59380ad05729cb93a4f Mon Sep 17 00:00:00 2001
From: Robert Adams
Date: Wed, 24 Jul 2013 10:52:54 -0700
Subject: BulletSim: make density display and return value consistant with how
the simulator expects it (scaled to 100kg/m^3).
---
OpenSim/Region/Physics/BulletSPlugin/BSCharacter.cs | 2 +-
OpenSim/Region/Physics/BulletSPlugin/BSParam.cs | 13 +++++++------
OpenSim/Region/Physics/BulletSPlugin/BSPhysObject.cs | 15 ++++++++++++++-
3 files changed, 22 insertions(+), 8 deletions(-)
(limited to 'OpenSim/Region')
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSCharacter.cs b/OpenSim/Region/Physics/BulletSPlugin/BSCharacter.cs
index 59e7f5f..58a417e 100644
--- a/OpenSim/Region/Physics/BulletSPlugin/BSCharacter.cs
+++ b/OpenSim/Region/Physics/BulletSPlugin/BSCharacter.cs
@@ -75,7 +75,7 @@ public sealed class BSCharacter : BSPhysObject
RawVelocity = OMV.Vector3.Zero;
_buoyancy = ComputeBuoyancyFromFlying(isFlying);
Friction = BSParam.AvatarStandingFriction;
- Density = BSParam.AvatarDensity / BSParam.DensityScaleFactor;
+ Density = BSParam.AvatarDensity;
// Old versions of ScenePresence passed only the height. If width and/or depth are zero,
// replace with the default values.
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSParam.cs b/OpenSim/Region/Physics/BulletSPlugin/BSParam.cs
index 0bdb5f1..4520171 100755
--- a/OpenSim/Region/Physics/BulletSPlugin/BSParam.cs
+++ b/OpenSim/Region/Physics/BulletSPlugin/BSParam.cs
@@ -463,7 +463,7 @@ public static class BSParam
// Density is passed around as 100kg/m3. This scales that to 1kg/m3.
// Reduce by power of 100 because Bullet doesn't seem to handle objects with large mass very well
new ParameterDefn("DensityScaleFactor", "Conversion for simulator/viewer density (100kg/m3) to physical density (1kg/m3)",
- 0.0001f ),
+ 0.01f ),
new ParameterDefn("PID_D", "Derivitive factor for motion smoothing",
2200f ),
@@ -474,8 +474,9 @@ public static class BSParam
0.2f,
(s) => { return DefaultFriction; },
(s,v) => { DefaultFriction = v; s.UnmanagedParams[0].defaultFriction = v; } ),
+ // For historical reasons, the viewer and simulator multiply the density by 100
new ParameterDefn("DefaultDensity", "Density for new objects" ,
- 10.000006836f, // Aluminum g/cm3
+ 1000.0006836f, // Aluminum g/cm3 * 100
(s) => { return DefaultDensity; },
(s,v) => { DefaultDensity = v; s.UnmanagedParams[0].defaultDensity = v; } ),
new ParameterDefn("DefaultRestitution", "Bouncyness of an object" ,
@@ -555,8 +556,9 @@ public static class BSParam
0.95f ),
new ParameterDefn("AvatarAlwaysRunFactor", "Speed multiplier if avatar is set to always run",
1.3f ),
- new ParameterDefn("AvatarDensity", "Density of an avatar. Changed on avatar recreation.",
- 3.5f) ,
+ // For historical reasons, density is reported * 100
+ new ParameterDefn("AvatarDensity", "Density of an avatar. Changed on avatar recreation. Scaled times 100.",
+ 3500f) , // 3.5 * 100
new ParameterDefn("AvatarRestitution", "Bouncyness. Changed on avatar recreation.",
0f ),
new ParameterDefn("AvatarCapsuleWidth", "The distance between the sides of the avatar capsule",
@@ -608,9 +610,8 @@ public static class BSParam
0.0f ),
new ParameterDefn("VehicleRestitution", "Bouncyness factor for vehicles (0.0 - 1.0)",
0.0f ),
- // Turn off fudge with DensityScaleFactor = 0.0001. Value used to be 0.2f;
new ParameterDefn("VehicleGroundGravityFudge", "Factor to multiply gravity if a ground vehicle is probably on the ground (0.0 - 1.0)",
- 1.0f ),
+ 0.2f ),
new ParameterDefn("VehicleAngularBankingTimescaleFudge", "Factor to multiple angular banking timescale. Tune to increase realism.",
60.0f ),
new ParameterDefn("VehicleEnableLinearDeflection", "Turn on/off vehicle linear deflection effect",
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSPhysObject.cs b/OpenSim/Region/Physics/BulletSPlugin/BSPhysObject.cs
index d34b797..0704591 100755
--- a/OpenSim/Region/Physics/BulletSPlugin/BSPhysObject.cs
+++ b/OpenSim/Region/Physics/BulletSPlugin/BSPhysObject.cs
@@ -187,10 +187,23 @@ public abstract class BSPhysObject : PhysicsActor
MaterialAttributes matAttrib = BSMaterials.GetAttributes(Material, false);
Friction = matAttrib.friction;
Restitution = matAttrib.restitution;
- Density = matAttrib.density / BSParam.DensityScaleFactor;
+ Density = matAttrib.density;
// DetailLog("{0},{1}.SetMaterial,Mat={2},frict={3},rest={4},den={5}", LocalID, TypeName, Material, Friction, Restitution, Density);
}
+ public override float Density
+ {
+ get
+ {
+ return base.Density;
+ }
+ set
+ {
+ DetailLog("{0},BSPhysObject.Density,set,den={1}", LocalID, value);
+ base.Density = value;
+ }
+ }
+
// Stop all physical motion.
public abstract void ZeroMotion(bool inTaintTime);
public abstract void ZeroAngularMotion(bool inTaintTime);
--
cgit v1.1
From 6ad577d32bcb7520a33e4c0c7510d81a7cad674c Mon Sep 17 00:00:00 2001
From: Robert Adams
Date: Tue, 30 Jul 2013 15:22:32 -0700
Subject: BulletSim: test method for debugging of extended physics script
operations.
---
.../Scripting/ExtendedPhysics/ExtendedPhysics.cs | 54 ++++++++++++++++++----
1 file changed, 46 insertions(+), 8 deletions(-)
(limited to 'OpenSim/Region')
diff --git a/OpenSim/Region/OptionalModules/Scripting/ExtendedPhysics/ExtendedPhysics.cs b/OpenSim/Region/OptionalModules/Scripting/ExtendedPhysics/ExtendedPhysics.cs
index 6009dc5..0cbc5f9 100755
--- a/OpenSim/Region/OptionalModules/Scripting/ExtendedPhysics/ExtendedPhysics.cs
+++ b/OpenSim/Region/OptionalModules/Scripting/ExtendedPhysics/ExtendedPhysics.cs
@@ -31,10 +31,10 @@ using System.Reflection;
using System.Text;
using OpenSim.Framework;
+using OpenSim.Region.CoreModules;
using OpenSim.Region.Framework;
using OpenSim.Region.Framework.Interfaces;
using OpenSim.Region.Framework.Scenes;
-using OpenSim.Region.CoreModules;
using Mono.Addins;
using Nini.Config;
@@ -49,6 +49,10 @@ public class ExtendedPhysics : INonSharedRegionModule
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
private static string LogHeader = "[EXTENDED PHYSICS]";
+ // Since BulletSim is a plugin, this these values aren't defined easily in one place.
+ // This table must coorespond to an identical table in BSScene.
+ public const string PhysFunctSetLinksetType = "BulletSim.SetLinksetType";
+
private IConfig Configuration { get; set; }
private bool Enabled { get; set; }
private Scene BaseScene { get; set; }
@@ -143,13 +147,6 @@ public class ExtendedPhysics : INonSharedRegionModule
[ScriptConstant]
public static int PHYS_CENTER_OF_MASS = 1 << 0;
- [ScriptConstant]
- public static int PHYS_LINKSET_TYPE_CONSTRAINT = 1;
- [ScriptConstant]
- public static int PHYS_LINKSET_TYPE_COMPOUND = 2;
- [ScriptConstant]
- public static int PHYS_LINKSET_TYPE_MANUAL = 3;
-
[ScriptInvocation]
public string physGetEngineType(UUID hostID, UUID scriptID)
{
@@ -163,9 +160,50 @@ public class ExtendedPhysics : INonSharedRegionModule
return ret;
}
+ [ScriptConstant]
+ public static int PHYS_LINKSET_TYPE_CONSTRAINT = 0;
+ [ScriptConstant]
+ public static int PHYS_LINKSET_TYPE_COMPOUND = 1;
+ [ScriptConstant]
+ public static int PHYS_LINKSET_TYPE_MANUAL = 2;
+
[ScriptInvocation]
public void physSetLinksetType(UUID hostID, UUID scriptID, int linksetType)
{
+ if (!Enabled) return;
+
+ // The part that is requesting the change.
+ SceneObjectPart requestingPart = BaseScene.GetSceneObjectPart(hostID);
+
+ if (requestingPart != null)
+ {
+ // The change is always made to the root of a linkset.
+ SceneObjectGroup containingGroup = requestingPart.ParentGroup;
+ SceneObjectPart rootPart = containingGroup.RootPart;
+
+ if (rootPart != null)
+ {
+ Physics.Manager.PhysicsActor rootPhysActor = rootPart.PhysActor;
+ if (rootPhysActor != null)
+ {
+ rootPhysActor.Extension(PhysFunctSetLinksetType, linksetType);
+ }
+ else
+ {
+ m_log.WarnFormat("{0} physSetLinksetType: root part does not have a physics actor. rootName={1}, hostID={2}",
+ LogHeader, rootPart.Name, hostID);
+ }
+ }
+ else
+ {
+ m_log.WarnFormat("{0} physSetLinksetType: root part does not exist. RequestingPartName={1}, hostID={2}",
+ LogHeader, requestingPart.Name, hostID);
+ }
+ }
+ else
+ {
+ m_log.WarnFormat("{0} physSetLinsetType: cannot find script object in scene. hostID={1}", LogHeader, hostID);
+ }
}
}
}
--
cgit v1.1
From 0d189165a83bb97f243a1f29cfa6896936ca6db0 Mon Sep 17 00:00:00 2001
From: Robert Adams
Date: Tue, 30 Jul 2013 15:23:33 -0700
Subject: BulletSim: distribute vehicle physical settings to all members of a
linkset. Enables constraint based linksets. Rename some internal variables to
clarify whether values world or vehicle relative.
---
OpenSim/Region/Physics/BulletSPlugin/BSDynamics.cs | 75 +++++++++++-----------
OpenSim/Region/Physics/BulletSPlugin/BSLinkset.cs | 18 +++++-
.../Physics/BulletSPlugin/BSLinksetCompound.cs | 11 +++-
3 files changed, 61 insertions(+), 43 deletions(-)
(limited to 'OpenSim/Region')
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSDynamics.cs b/OpenSim/Region/Physics/BulletSPlugin/BSDynamics.cs
index 82d7c44..f0d17d3 100644
--- a/OpenSim/Region/Physics/BulletSPlugin/BSDynamics.cs
+++ b/OpenSim/Region/Physics/BulletSPlugin/BSDynamics.cs
@@ -589,10 +589,10 @@ namespace OpenSim.Region.Physics.BulletSPlugin
m_vehicleMass = ControllingPrim.TotalMass;
// Friction affects are handled by this vehicle code
- m_physicsScene.PE.SetFriction(ControllingPrim.PhysBody, BSParam.VehicleFriction);
- m_physicsScene.PE.SetRestitution(ControllingPrim.PhysBody, BSParam.VehicleRestitution);
- // ControllingPrim.Linkset.SetPhysicalFriction(BSParam.VehicleFriction);
- // ControllingPrim.Linkset.SetPhysicalRestitution(BSParam.VehicleRestitution);
+ // m_physicsScene.PE.SetFriction(ControllingPrim.PhysBody, BSParam.VehicleFriction);
+ // m_physicsScene.PE.SetRestitution(ControllingPrim.PhysBody, BSParam.VehicleRestitution);
+ ControllingPrim.Linkset.SetPhysicalFriction(BSParam.VehicleFriction);
+ ControllingPrim.Linkset.SetPhysicalRestitution(BSParam.VehicleRestitution);
// Moderate angular movement introduced by Bullet.
// TODO: possibly set AngularFactor and LinearFactor for the type of vehicle.
@@ -602,21 +602,21 @@ namespace OpenSim.Region.Physics.BulletSPlugin
m_physicsScene.PE.SetAngularFactorV(ControllingPrim.PhysBody, BSParam.VehicleAngularFactor);
// Vehicles report collision events so we know when it's on the ground
- m_physicsScene.PE.AddToCollisionFlags(ControllingPrim.PhysBody, CollisionFlags.BS_VEHICLE_COLLISIONS);
- // ControllingPrim.Linkset.SetPhysicalCollisionFlags(CollisionFlags.BS_VEHICLE_COLLISIONS);
+ // m_physicsScene.PE.AddToCollisionFlags(ControllingPrim.PhysBody, CollisionFlags.BS_VEHICLE_COLLISIONS);
+ ControllingPrim.Linkset.AddToPhysicalCollisionFlags(CollisionFlags.BS_VEHICLE_COLLISIONS);
- Vector3 inertia = m_physicsScene.PE.CalculateLocalInertia(ControllingPrim.PhysShape.physShapeInfo, m_vehicleMass);
- ControllingPrim.Inertia = inertia * BSParam.VehicleInertiaFactor;
- m_physicsScene.PE.SetMassProps(ControllingPrim.PhysBody, m_vehicleMass, ControllingPrim.Inertia);
- m_physicsScene.PE.UpdateInertiaTensor(ControllingPrim.PhysBody);
- // ControllingPrim.Linkset.ComputeLocalInertia(BSParam.VehicleInertiaFactor);
+ // Vector3 inertia = m_physicsScene.PE.CalculateLocalInertia(ControllingPrim.PhysShape.physShapeInfo, m_vehicleMass);
+ // ControllingPrim.Inertia = inertia * BSParam.VehicleInertiaFactor;
+ // m_physicsScene.PE.SetMassProps(ControllingPrim.PhysBody, m_vehicleMass, ControllingPrim.Inertia);
+ // m_physicsScene.PE.UpdateInertiaTensor(ControllingPrim.PhysBody);
+ ControllingPrim.Linkset.ComputeAndSetLocalInertia(BSParam.VehicleInertiaFactor, m_vehicleMass);
// Set the gravity for the vehicle depending on the buoyancy
// TODO: what should be done if prim and vehicle buoyancy differ?
m_VehicleGravity = ControllingPrim.ComputeGravity(m_VehicleBuoyancy);
// The actual vehicle gravity is set to zero in Bullet so we can do all the application of same.
- m_physicsScene.PE.SetGravity(ControllingPrim.PhysBody, Vector3.Zero);
- // ControllingPrim.Linkset.SetPhysicalGravity(Vector3.Zero);
+ // m_physicsScene.PE.SetGravity(ControllingPrim.PhysBody, Vector3.Zero);
+ ControllingPrim.Linkset.SetPhysicalGravity(Vector3.Zero);
VDetailLog("{0},BSDynamics.SetPhysicalParameters,mass={1},inert={2},vehGrav={3},aDamp={4},frict={5},rest={6},lFact={7},aFact={8}",
ControllingPrim.LocalID, m_vehicleMass, ControllingPrim.Inertia, m_VehicleGravity,
@@ -1121,7 +1121,6 @@ namespace OpenSim.Region.Physics.BulletSPlugin
{
m_VhoverTargetHeight = m_VhoverHeight;
}
-
if ((m_flags & VehicleFlag.HOVER_UP_ONLY) != 0)
{
// If body is already heigher, use its height as target height
@@ -1170,7 +1169,6 @@ namespace OpenSim.Region.Physics.BulletSPlugin
m_VhoverTimescale, m_VhoverHeight, m_VhoverTargetHeight,
verticalError, verticalCorrection);
}
-
}
}
@@ -1357,6 +1355,7 @@ namespace OpenSim.Region.Physics.BulletSPlugin
private void ComputeAngularTurning(float pTimestep)
{
// The user wants this many radians per second angular change?
+ Vector3 origVehicleRotationalVelocity = VehicleRotationalVelocity; // DEBUG DEBUG
Vector3 currentAngularV = VehicleRotationalVelocity * Quaternion.Inverse(VehicleOrientation);
Vector3 angularMotorContributionV = m_angularMotor.Step(pTimestep, currentAngularV);
@@ -1369,20 +1368,20 @@ namespace OpenSim.Region.Physics.BulletSPlugin
// TODO: This is here because this is where ODE put it but documentation says it
// is a linear effect. Where should this check go?
//if ((m_flags & (VehicleFlag.NO_DEFLECTION_UP)) != 0)
- // {
+ // {
// angularMotorContributionV.X = 0f;
// angularMotorContributionV.Y = 0f;
- // }
+ // }
// Reduce any velocity by friction.
Vector3 frictionFactorW = ComputeFrictionFactor(m_angularFrictionTimescale, pTimestep);
angularMotorContributionV -= (currentAngularV * frictionFactorW);
- VehicleRotationalVelocity += angularMotorContributionV * VehicleOrientation;
-
-
+ Vector3 angularMotorContributionW = angularMotorContributionV * VehicleOrientation;
+ VehicleRotationalVelocity += angularMotorContributionW;
- VDetailLog("{0}, MoveAngular,angularTurning,angContribV={1}", ControllingPrim.LocalID, angularMotorContributionV);
+ VDetailLog("{0}, MoveAngular,angularTurning,curAngVelV={1},origVehRotVel={2},vehRotVel={3},frictFact={4}, angContribV={5},angContribW={6}",
+ ControllingPrim.LocalID, currentAngularV, origVehicleRotationalVelocity, VehicleRotationalVelocity, frictionFactorW, angularMotorContributionV, angularMotorContributionW);
}
// From http://wiki.secondlife.com/wiki/Linden_Vehicle_Tutorial:
@@ -1409,7 +1408,7 @@ namespace OpenSim.Region.Physics.BulletSPlugin
// Flipping what was originally a timescale into a speed variable and then multiplying it by 2
// since only computing half the distance between the angles.
- float VerticalAttractionSpeed = (1 / m_verticalAttractionTimescale) * 2.0f;
+ float verticalAttractionSpeed = (1 / m_verticalAttractionTimescale) * 2.0f;
// Make a prediction of where the up axis will be when this is applied rather then where it is now as
// this makes for a smoother adjustment and less fighting between the various forces.
@@ -1419,12 +1418,13 @@ namespace OpenSim.Region.Physics.BulletSPlugin
Vector3 torqueVector = Vector3.Cross(predictedUp, Vector3.UnitZ);
// Scale vector by our timescale since it is an acceleration it is r/s^2 or radians a timescale squared
- Vector3 vertContributionV = torqueVector * VerticalAttractionSpeed * VerticalAttractionSpeed;
+ Vector3 vertContributionV = torqueVector * verticalAttractionSpeed * verticalAttractionSpeed;
VehicleRotationalVelocity += vertContributionV;
- VDetailLog("{0}, MoveAngular,verticalAttraction,upAxis={1},PredictedUp={2},torqueVector={3},contrib={4}",
+ VDetailLog("{0}, MoveAngular,verticalAttraction,vertAttrSpeed={1},upAxis={2},PredictedUp={3},torqueVector={4},contrib={5}",
ControllingPrim.LocalID,
+ verticalAttractionSpeed,
vehicleUpAxis,
predictedUp,
torqueVector,
@@ -1437,37 +1437,38 @@ namespace OpenSim.Region.Physics.BulletSPlugin
// http://stackoverflow.com/questions/14939657/computing-vector-from-quaternion-works-computing-quaternion-from-vector-does-no
// Create a rotation that is only the vehicle's rotation around Z
- Vector3 currentEuler = Vector3.Zero;
- VehicleOrientation.GetEulerAngles(out currentEuler.X, out currentEuler.Y, out currentEuler.Z);
- Quaternion justZOrientation = Quaternion.CreateFromAxisAngle(Vector3.UnitZ, currentEuler.Z);
+ Vector3 currentEulerW = Vector3.Zero;
+ VehicleOrientation.GetEulerAngles(out currentEulerW.X, out currentEulerW.Y, out currentEulerW.Z);
+ Quaternion justZOrientation = Quaternion.CreateFromAxisAngle(Vector3.UnitZ, currentEulerW.Z);
// Create the axis that is perpendicular to the up vector and the rotated up vector.
- Vector3 differenceAxis = Vector3.Cross(Vector3.UnitZ * justZOrientation, Vector3.UnitZ * VehicleOrientation);
+ Vector3 differenceAxisW = Vector3.Cross(Vector3.UnitZ * justZOrientation, Vector3.UnitZ * VehicleOrientation);
// Compute the angle between those to vectors.
double differenceAngle = Math.Acos((double)Vector3.Dot(Vector3.UnitZ, Vector3.Normalize(Vector3.UnitZ * VehicleOrientation)));
// 'differenceAngle' is the angle to rotate and 'differenceAxis' is the plane to rotate in to get the vehicle vertical
// Reduce the change by the time period it is to change in. Timestep is handled when velocity is applied.
// TODO: add 'efficiency'.
- differenceAngle /= m_verticalAttractionTimescale;
+ // differenceAngle /= m_verticalAttractionTimescale;
// Create the quaterian representing the correction angle
- Quaternion correctionRotation = Quaternion.CreateFromAxisAngle(differenceAxis, (float)differenceAngle);
+ Quaternion correctionRotationW = Quaternion.CreateFromAxisAngle(differenceAxisW, (float)differenceAngle);
// Turn that quaternion into Euler values to make it into velocities to apply.
- Vector3 vertContributionV = Vector3.Zero;
- correctionRotation.GetEulerAngles(out vertContributionV.X, out vertContributionV.Y, out vertContributionV.Z);
- vertContributionV *= -1f;
+ Vector3 vertContributionW = Vector3.Zero;
+ correctionRotationW.GetEulerAngles(out vertContributionW.X, out vertContributionW.Y, out vertContributionW.Z);
+ vertContributionW *= -1f;
+ vertContributionW /= m_verticalAttractionTimescale;
- VehicleRotationalVelocity += vertContributionV;
+ VehicleRotationalVelocity += vertContributionW;
VDetailLog("{0}, MoveAngular,verticalAttraction,upAxis={1},diffAxis={2},diffAng={3},corrRot={4},contrib={5}",
ControllingPrim.LocalID,
vehicleUpAxis,
- differenceAxis,
+ differenceAxisW,
differenceAngle,
- correctionRotation,
- vertContributionV);
+ correctionRotationW,
+ vertContributionW);
break;
}
case 2:
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSLinkset.cs b/OpenSim/Region/Physics/BulletSPlugin/BSLinkset.cs
index 960c0b4..7f94666 100755
--- a/OpenSim/Region/Physics/BulletSPlugin/BSLinkset.cs
+++ b/OpenSim/Region/Physics/BulletSPlugin/BSLinkset.cs
@@ -309,16 +309,18 @@ public abstract class BSLinkset
}
);
}
- public virtual void ComputeLocalInertia(OMV.Vector3 inertiaFactor)
+ public virtual void ComputeAndSetLocalInertia(OMV.Vector3 inertiaFactor, float linksetMass)
{
ForEachMember((member) =>
{
if (member.PhysBody.HasPhysicalBody)
{
- OMV.Vector3 inertia = m_physicsScene.PE.CalculateLocalInertia(member.PhysShape.physShapeInfo, member.Mass);
+ OMV.Vector3 inertia = m_physicsScene.PE.CalculateLocalInertia(member.PhysShape.physShapeInfo, linksetMass);
member.Inertia = inertia * inertiaFactor;
- m_physicsScene.PE.SetMassProps(member.PhysBody, member.Mass, member.Inertia);
+ m_physicsScene.PE.SetMassProps(member.PhysBody, linksetMass, member.Inertia);
m_physicsScene.PE.UpdateInertiaTensor(member.PhysBody);
+ DetailLog("{0},BSLinkset.ComputeAndSetLocalInertia,m.mass={1}, inertia={2}", member.LocalID, linksetMass, member.Inertia);
+
}
return false; // 'false' says to continue looping
}
@@ -334,6 +336,16 @@ public abstract class BSLinkset
}
);
}
+ public virtual void AddToPhysicalCollisionFlags(CollisionFlags collFlags)
+ {
+ ForEachMember((member) =>
+ {
+ if (member.PhysBody.HasPhysicalBody)
+ m_physicsScene.PE.AddToCollisionFlags(member.PhysBody, collFlags);
+ return false; // 'false' says to continue looping
+ }
+ );
+ }
public virtual void RemoveFromPhysicalCollisionFlags(CollisionFlags collFlags)
{
ForEachMember((member) =>
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSLinksetCompound.cs b/OpenSim/Region/Physics/BulletSPlugin/BSLinksetCompound.cs
index 33ae5a5..6359046 100755
--- a/OpenSim/Region/Physics/BulletSPlugin/BSLinksetCompound.cs
+++ b/OpenSim/Region/Physics/BulletSPlugin/BSLinksetCompound.cs
@@ -61,11 +61,11 @@ public sealed class BSLinksetCompound : BSLinkset
if (LinksetRoot.PhysBody.HasPhysicalBody)
m_physicsScene.PE.SetGravity(LinksetRoot.PhysBody, gravity);
}
- public override void ComputeLocalInertia(OMV.Vector3 inertiaFactor)
+ public override void ComputeAndSetLocalInertia(OMV.Vector3 inertiaFactor, float linksetMass)
{
- OMV.Vector3 inertia = m_physicsScene.PE.CalculateLocalInertia(LinksetRoot.PhysShape.physShapeInfo, LinksetRoot.Mass);
+ OMV.Vector3 inertia = m_physicsScene.PE.CalculateLocalInertia(LinksetRoot.PhysShape.physShapeInfo, linksetMass);
LinksetRoot.Inertia = inertia * inertiaFactor;
- m_physicsScene.PE.SetMassProps(LinksetRoot.PhysBody, LinksetRoot.Mass, LinksetRoot.Inertia);
+ m_physicsScene.PE.SetMassProps(LinksetRoot.PhysBody, linksetMass, LinksetRoot.Inertia);
m_physicsScene.PE.UpdateInertiaTensor(LinksetRoot.PhysBody);
}
public override void SetPhysicalCollisionFlags(CollisionFlags collFlags)
@@ -73,6 +73,11 @@ public sealed class BSLinksetCompound : BSLinkset
if (LinksetRoot.PhysBody.HasPhysicalBody)
m_physicsScene.PE.SetCollisionFlags(LinksetRoot.PhysBody, collFlags);
}
+ public override void AddToPhysicalCollisionFlags(CollisionFlags collFlags)
+ {
+ if (LinksetRoot.PhysBody.HasPhysicalBody)
+ m_physicsScene.PE.AddToCollisionFlags(LinksetRoot.PhysBody, collFlags);
+ }
public override void RemoveFromPhysicalCollisionFlags(CollisionFlags collFlags)
{
if (LinksetRoot.PhysBody.HasPhysicalBody)
--
cgit v1.1
From 2b5419927143667048bddf0a501e42c093a71147 Mon Sep 17 00:00:00 2001
From: Diva Canto
Date: Tue, 30 Jul 2013 17:26:56 -0700
Subject: After talking to lkalif on the IRC: SimulatorFeatures response:
renamed the OSDMap GridServices to OpenSimExtras, normalized the url keys
under it, and moved ExportEnabled to under it too. Melanie: change your
viewer code accordingly. Documentation at
http://opensimulator.org/wiki/SimulatorFeatures_Extras
---
.../ClientStack/Linden/Caps/SimulatorFeaturesModule.cs | 13 +++++++------
1 file changed, 7 insertions(+), 6 deletions(-)
(limited to 'OpenSim/Region')
diff --git a/OpenSim/Region/ClientStack/Linden/Caps/SimulatorFeaturesModule.cs b/OpenSim/Region/ClientStack/Linden/Caps/SimulatorFeaturesModule.cs
index 7d9f935..4bd17b1 100644
--- a/OpenSim/Region/ClientStack/Linden/Caps/SimulatorFeaturesModule.cs
+++ b/OpenSim/Region/ClientStack/Linden/Caps/SimulatorFeaturesModule.cs
@@ -149,15 +149,16 @@ namespace OpenSim.Region.ClientStack.Linden
m_features["PhysicsShapeTypes"] = typesMap;
// Extra information for viewers that want to use it
- OSDMap gridServicesMap = new OSDMap();
+ OSDMap extrasMap = new OSDMap();
if (m_MapImageServerURL != string.Empty)
- gridServicesMap["map-server-url"] = m_MapImageServerURL;
+ extrasMap["map-server-url"] = m_MapImageServerURL;
if (m_SearchURL != string.Empty)
- gridServicesMap["search"] = m_SearchURL;
- m_features["GridServices"] = gridServicesMap;
-
+ extrasMap["search-server-url"] = m_SearchURL;
if (m_ExportSupported)
- m_features["ExportSupported"] = true;
+ extrasMap["ExportSupported"] = true;
+ if (extrasMap.Count > 0)
+ m_features["OpenSimExtras"] = extrasMap;
+
}
}
--
cgit v1.1
From fd050fca7caef83d72d00241d0c0db5c1ec5d1ff Mon Sep 17 00:00:00 2001
From: Diva Canto
Date: Tue, 30 Jul 2013 21:10:00 -0700
Subject: Doing the HG Map / SimulatorFeatures "the right way": moved it to
HGMapModule, hooking on to SimulatorFeatures.OnSimulatorFeaturesRequest event
(similar to what the DynamicMenuModule does). Only HG Visitors get this var,
to avoid spamming local users. The config var is now called MapTileURL, to
be consistent with the login one, and its being picked up from either
[LoginService], [HGWorldMap] or [SimulatorFeatures], just because I have a
bad memory.
---
.../Linden/Caps/SimulatorFeaturesModule.cs | 15 ++-----
.../CoreModules/Hypergrid/HGWorldMapModule.cs | 47 +++++++++++++++++++++-
2 files changed, 48 insertions(+), 14 deletions(-)
(limited to 'OpenSim/Region')
diff --git a/OpenSim/Region/ClientStack/Linden/Caps/SimulatorFeaturesModule.cs b/OpenSim/Region/ClientStack/Linden/Caps/SimulatorFeaturesModule.cs
index 4bd17b1..e4d8a20 100644
--- a/OpenSim/Region/ClientStack/Linden/Caps/SimulatorFeaturesModule.cs
+++ b/OpenSim/Region/ClientStack/Linden/Caps/SimulatorFeaturesModule.cs
@@ -68,7 +68,6 @@ namespace OpenSim.Region.ClientStack.Linden
///
private OSDMap m_features = new OSDMap();
- private string m_MapImageServerURL = string.Empty;
private string m_SearchURL = string.Empty;
private bool m_ExportSupported = false;
@@ -78,15 +77,7 @@ namespace OpenSim.Region.ClientStack.Linden
{
IConfig config = source.Configs["SimulatorFeatures"];
if (config != null)
- {
- m_MapImageServerURL = config.GetString("MapImageServerURI", string.Empty);
- if (m_MapImageServerURL != string.Empty)
- {
- m_MapImageServerURL = m_MapImageServerURL.Trim();
- if (!m_MapImageServerURL.EndsWith("/"))
- m_MapImageServerURL = m_MapImageServerURL + "/";
- }
-
+ {
m_SearchURL = config.GetString("SearchServerURI", string.Empty);
m_ExportSupported = config.GetBoolean("ExportSupported", m_ExportSupported);
@@ -149,13 +140,13 @@ namespace OpenSim.Region.ClientStack.Linden
m_features["PhysicsShapeTypes"] = typesMap;
// Extra information for viewers that want to use it
+ // TODO: Take these out of here into their respective modules, like map-server-url
OSDMap extrasMap = new OSDMap();
- if (m_MapImageServerURL != string.Empty)
- extrasMap["map-server-url"] = m_MapImageServerURL;
if (m_SearchURL != string.Empty)
extrasMap["search-server-url"] = m_SearchURL;
if (m_ExportSupported)
extrasMap["ExportSupported"] = true;
+
if (extrasMap.Count > 0)
m_features["OpenSimExtras"] = extrasMap;
diff --git a/OpenSim/Region/CoreModules/Hypergrid/HGWorldMapModule.cs b/OpenSim/Region/CoreModules/Hypergrid/HGWorldMapModule.cs
index c4255b9..4a5a352 100644
--- a/OpenSim/Region/CoreModules/Hypergrid/HGWorldMapModule.cs
+++ b/OpenSim/Region/CoreModules/Hypergrid/HGWorldMapModule.cs
@@ -31,6 +31,7 @@ using System.Reflection;
using log4net;
using Nini.Config;
using OpenMetaverse;
+using OpenMetaverse.StructuredData;
using Mono.Addins;
using OpenSim.Framework;
using OpenSim.Region.CoreModules.World.WorldMap;
@@ -48,13 +49,30 @@ namespace OpenSim.Region.CoreModules.Hypergrid
// Remember the map area that each client has been exposed to in this region
private Dictionary> m_SeenMapBlocks = new Dictionary>();
+ private string m_MapImageServerURL = string.Empty;
+
+ private IUserManagement m_UserManagement;
+
#region INonSharedRegionModule Members
- public override void Initialise(IConfigSource config)
+ public override void Initialise(IConfigSource source)
{
if (Util.GetConfigVarFromSections(
- config, "WorldMapModule", new string[] { "Map", "Startup" }, "WorldMap") == "HGWorldMap")
+ source, "WorldMapModule", new string[] { "Map", "Startup" }, "WorldMap") == "HGWorldMap")
+ {
m_Enabled = true;
+
+ m_MapImageServerURL = Util.GetConfigVarFromSections(source, "MapTileURL", new string[] {"LoginService", "HGWorldMap", "SimulatorFeatures"});
+
+ if (m_MapImageServerURL != string.Empty)
+ {
+ m_MapImageServerURL = m_MapImageServerURL.Trim();
+ if (!m_MapImageServerURL.EndsWith("/"))
+ m_MapImageServerURL = m_MapImageServerURL + "/";
+ }
+
+
+ }
}
public override void AddRegion(Scene scene)
@@ -64,6 +82,17 @@ namespace OpenSim.Region.CoreModules.Hypergrid
scene.EventManager.OnClientClosed += new EventManager.ClientClosed(EventManager_OnClientClosed);
}
+ public override void RegionLoaded(Scene scene)
+ {
+ base.RegionLoaded(scene);
+ ISimulatorFeaturesModule featuresModule = m_scene.RequestModuleInterface();
+
+ if (featuresModule != null)
+ featuresModule.OnSimulatorFeaturesRequest += OnSimulatorFeaturesRequest;
+
+ m_UserManagement = m_scene.RequestModuleInterface();
+
+ }
public override string Name
{
get { return "HGWorldMap"; }
@@ -115,6 +144,20 @@ namespace OpenSim.Region.CoreModules.Hypergrid
return mapBlocks;
}
+ private void OnSimulatorFeaturesRequest(UUID agentID, ref OSDMap features)
+ {
+ if (m_UserManagement != null && !m_UserManagement.IsLocalGridUser(agentID) && m_MapImageServerURL != string.Empty)
+ {
+ OSD extras = new OSDMap();
+ if (features.ContainsKey("OpenSimExtras"))
+ extras = features["OpenSimExtras"];
+ else
+ features["OpenSimExtras"] = extras;
+
+ ((OSDMap)extras)["map-server-url"] = m_MapImageServerURL;
+
+ }
+ }
}
class MapArea
--
cgit v1.1
From e4ecbc2b104959eced649e1620108afca22346dc Mon Sep 17 00:00:00 2001
From: Diva Canto
Date: Tue, 30 Jul 2013 21:38:41 -0700
Subject: Fix null ref.
---
OpenSim/Region/CoreModules/Hypergrid/HGWorldMapModule.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
(limited to 'OpenSim/Region')
diff --git a/OpenSim/Region/CoreModules/Hypergrid/HGWorldMapModule.cs b/OpenSim/Region/CoreModules/Hypergrid/HGWorldMapModule.cs
index 4a5a352..a7dd44e 100644
--- a/OpenSim/Region/CoreModules/Hypergrid/HGWorldMapModule.cs
+++ b/OpenSim/Region/CoreModules/Hypergrid/HGWorldMapModule.cs
@@ -64,7 +64,7 @@ namespace OpenSim.Region.CoreModules.Hypergrid
m_MapImageServerURL = Util.GetConfigVarFromSections(source, "MapTileURL", new string[] {"LoginService", "HGWorldMap", "SimulatorFeatures"});
- if (m_MapImageServerURL != string.Empty)
+ if (!string.IsNullOrEmpty(m_MapImageServerURL))
{
m_MapImageServerURL = m_MapImageServerURL.Trim();
if (!m_MapImageServerURL.EndsWith("/"))
--
cgit v1.1
From 3c540f0d33894060d53616aa0aa67bc9d8ab82ec Mon Sep 17 00:00:00 2001
From: Diva Canto
Date: Tue, 30 Jul 2013 22:07:33 -0700
Subject: Avoid another null ref opportunity.
---
OpenSim/Region/CoreModules/Hypergrid/HGWorldMapModule.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
(limited to 'OpenSim/Region')
diff --git a/OpenSim/Region/CoreModules/Hypergrid/HGWorldMapModule.cs b/OpenSim/Region/CoreModules/Hypergrid/HGWorldMapModule.cs
index a7dd44e..a2aee08 100644
--- a/OpenSim/Region/CoreModules/Hypergrid/HGWorldMapModule.cs
+++ b/OpenSim/Region/CoreModules/Hypergrid/HGWorldMapModule.cs
@@ -146,7 +146,7 @@ namespace OpenSim.Region.CoreModules.Hypergrid
private void OnSimulatorFeaturesRequest(UUID agentID, ref OSDMap features)
{
- if (m_UserManagement != null && !m_UserManagement.IsLocalGridUser(agentID) && m_MapImageServerURL != string.Empty)
+ if (m_UserManagement != null && !string.IsNullOrEmpty(m_MapImageServerURL) && !m_UserManagement.IsLocalGridUser(agentID))
{
OSD extras = new OSDMap();
if (features.ContainsKey("OpenSimExtras"))
--
cgit v1.1
From 87fcff9fc39f180ceb7d5511ca8bc23965fab17f Mon Sep 17 00:00:00 2001
From: Diva Canto
Date: Wed, 31 Jul 2013 11:13:55 -0700
Subject: HGWorldMapModule: check whether it's enabled or not.
---
OpenSim/Region/CoreModules/Hypergrid/HGWorldMapModule.cs | 6 ++++++
1 file changed, 6 insertions(+)
(limited to 'OpenSim/Region')
diff --git a/OpenSim/Region/CoreModules/Hypergrid/HGWorldMapModule.cs b/OpenSim/Region/CoreModules/Hypergrid/HGWorldMapModule.cs
index a2aee08..cb22f0b 100644
--- a/OpenSim/Region/CoreModules/Hypergrid/HGWorldMapModule.cs
+++ b/OpenSim/Region/CoreModules/Hypergrid/HGWorldMapModule.cs
@@ -77,6 +77,9 @@ namespace OpenSim.Region.CoreModules.Hypergrid
public override void AddRegion(Scene scene)
{
+ if (!m_Enabled)
+ return;
+
base.AddRegion(scene);
scene.EventManager.OnClientClosed += new EventManager.ClientClosed(EventManager_OnClientClosed);
@@ -84,6 +87,9 @@ namespace OpenSim.Region.CoreModules.Hypergrid
public override void RegionLoaded(Scene scene)
{
+ if (!m_Enabled)
+ return;
+
base.RegionLoaded(scene);
ISimulatorFeaturesModule featuresModule = m_scene.RequestModuleInterface();
--
cgit v1.1
From ac2ad9690d9e8b8988dc68cf4e2933c7b18a71bc Mon Sep 17 00:00:00 2001
From: Diva Canto
Date: Wed, 31 Jul 2013 11:20:27 -0700
Subject: HGWorldMapModule: unregister event on RemoveRegion
---
OpenSim/Region/CoreModules/Hypergrid/HGWorldMapModule.cs | 11 ++++++++++-
1 file changed, 10 insertions(+), 1 deletion(-)
(limited to 'OpenSim/Region')
diff --git a/OpenSim/Region/CoreModules/Hypergrid/HGWorldMapModule.cs b/OpenSim/Region/CoreModules/Hypergrid/HGWorldMapModule.cs
index cb22f0b..97227b3 100644
--- a/OpenSim/Region/CoreModules/Hypergrid/HGWorldMapModule.cs
+++ b/OpenSim/Region/CoreModules/Hypergrid/HGWorldMapModule.cs
@@ -82,7 +82,7 @@ namespace OpenSim.Region.CoreModules.Hypergrid
base.AddRegion(scene);
- scene.EventManager.OnClientClosed += new EventManager.ClientClosed(EventManager_OnClientClosed);
+ scene.EventManager.OnClientClosed += EventManager_OnClientClosed;
}
public override void RegionLoaded(Scene scene)
@@ -99,6 +99,15 @@ namespace OpenSim.Region.CoreModules.Hypergrid
m_UserManagement = m_scene.RequestModuleInterface();
}
+
+ public override void RemoveRegion(Scene scene)
+ {
+ if (!m_Enabled)
+ return;
+
+ scene.EventManager.OnClientClosed -= EventManager_OnClientClosed;
+ }
+
public override string Name
{
get { return "HGWorldMap"; }
--
cgit v1.1
From 12995924052a1804f01dceb80803447fccc1d9fe Mon Sep 17 00:00:00 2001
From: Mic Bowman
Date: Wed, 31 Jul 2013 15:37:15 -0700
Subject: Experimental comment to eneralize the handling of Linden caps when
the cap is something other than "localhost". A new interface for handling
external caps is supported with an example implemented for Simian. The only
linden cap supporting this interface right now is the GetTexture cap.
---
.../ClientStack/Linden/Caps/GetTextureModule.cs | 6 ++-
.../Framework/Interfaces/IExternalCapsModule.cs | 48 ++++++++++++++++++++++
2 files changed, 53 insertions(+), 1 deletion(-)
create mode 100644 OpenSim/Region/Framework/Interfaces/IExternalCapsModule.cs
(limited to 'OpenSim/Region')
diff --git a/OpenSim/Region/ClientStack/Linden/Caps/GetTextureModule.cs b/OpenSim/Region/ClientStack/Linden/Caps/GetTextureModule.cs
index 13415f8..54cf285 100644
--- a/OpenSim/Region/ClientStack/Linden/Caps/GetTextureModule.cs
+++ b/OpenSim/Region/ClientStack/Linden/Caps/GetTextureModule.cs
@@ -137,7 +137,11 @@ namespace OpenSim.Region.ClientStack.Linden
else
{
// m_log.DebugFormat("[GETTEXTURE]: {0} in region {1}", m_URL, m_scene.RegionInfo.RegionName);
- caps.RegisterHandler("GetTexture", m_URL);
+ IExternalCapsModule handler = m_scene.RequestModuleInterface();
+ if (handler != null)
+ handler.RegisterExternalUserCapsHandler(agentID,caps,"GetTexture",m_URL);
+ else
+ caps.RegisterHandler("GetTexture", m_URL);
}
}
diff --git a/OpenSim/Region/Framework/Interfaces/IExternalCapsModule.cs b/OpenSim/Region/Framework/Interfaces/IExternalCapsModule.cs
new file mode 100644
index 0000000..a730cfd
--- /dev/null
+++ b/OpenSim/Region/Framework/Interfaces/IExternalCapsModule.cs
@@ -0,0 +1,48 @@
+/*
+ * Copyright (c) Contributors, http://opensimulator.org/
+ * See CONTRIBUTORS.TXT for a full list of copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of the OpenSimulator Project nor the
+ * names of its contributors may be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+using System;
+using OpenMetaverse;
+using OpenSim.Framework;
+using Caps=OpenSim.Framework.Capabilities.Caps;
+
+namespace OpenSim.Region.Framework.Interfaces
+{
+ public interface IExternalCapsModule
+ {
+ ///
+ /// This function extends the simple URL configuration in the caps handlers
+ /// to facilitate more interesting computation when an external handler is
+ /// sent to the viewer.
+ ///
+ /// New user UUID
+ /// Internal caps registry, where the external handler will be registered
+ /// Name of the specific cap we are registering
+ /// The skeleton URL provided in the caps configuration
+ bool RegisterExternalUserCapsHandler(UUID agentID, Caps caps, String capName, String urlSkel);
+ }
+}
--
cgit v1.1