From c9695a0a59cba91a184683efaa7802338d68e4bd Mon Sep 17 00:00:00 2001
From: Justin Clark-Casey (justincc)
Date: Fri, 2 Aug 2013 00:00:00 +0100
Subject: Move experimental attachments throttling further down the chain so
that multiple attachments changes (e.g. change outfit) are also throttled
---
.../Avatar/Attachments/AttachmentsModule.cs | 31 +++++++++++-----------
1 file changed, 15 insertions(+), 16 deletions(-)
(limited to 'OpenSim/Region')
diff --git a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs
index 97477d4..675fccc 100644
--- a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs
+++ b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs
@@ -53,8 +53,8 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
public int DebugLevel { get; set; }
///
- /// Period to sleep per 100 prims in order to avoid CPU spikes when an avatar with many attachments logs in
- /// or many avatars with a medium levels of attachments login simultaneously.
+ /// Period to sleep per 100 prims in order to avoid CPU spikes when an avatar with many attachments logs in/changes
+ /// outfit or many avatars with a medium levels of attachments login/change outfit simultaneously.
///
///
/// A value of 0 will apply no pause. The pause is specified in milliseconds.
@@ -319,19 +319,6 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
SceneObjectGroup objatt
= RezSingleAttachmentFromInventoryInternal(
sp, sp.PresenceType == PresenceType.Npc ? UUID.Zero : attach.ItemID, attach.AssetID, attachmentPt, true);
-
-
- if (ThrottlePer100PrimsRezzed > 0)
- {
- int throttleMs = (int)Math.Round((float)objatt.PrimCount / 100 * ThrottlePer100PrimsRezzed);
-
- if (DebugLevel > 0)
- m_log.DebugFormat(
- "[ATTACHMENTS MODULE]: Throttling by {0}ms after rez of {1} with {2} prims for attachment to {3} on point {4} in {5}",
- throttleMs, objatt.Name, objatt.PrimCount, sp.Name, attachmentPt, m_scene.Name);
-
- Thread.Sleep(throttleMs);
- }
}
catch (Exception e)
{
@@ -1023,7 +1010,19 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
}
if (tainted)
- objatt.HasGroupChanged = true;
+ objatt.HasGroupChanged = true;
+
+ if (ThrottlePer100PrimsRezzed > 0)
+ {
+ int throttleMs = (int)Math.Round((float)objatt.PrimCount / 100 * ThrottlePer100PrimsRezzed);
+
+ if (DebugLevel > 0)
+ m_log.DebugFormat(
+ "[ATTACHMENTS MODULE]: Throttling by {0}ms after rez of {1} with {2} prims for attachment to {3} on point {4} in {5}",
+ throttleMs, objatt.Name, objatt.PrimCount, sp.Name, attachmentPt, m_scene.Name);
+
+ Thread.Sleep(throttleMs);
+ }
return objatt;
}
--
cgit v1.1
From d4c506e453b1115142eac237d3a1c4f65fa36e26 Mon Sep 17 00:00:00 2001
From: Justin Clark-Casey (justincc)
Date: Fri, 2 Aug 2013 00:08:14 +0100
Subject: minor: replace veclist.Add(new Vector3(0,0,0)) with Vector3.Zero in
InventoryAccessModules.RezObject() - structs are passed by value
---
.../CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
(limited to 'OpenSim/Region')
diff --git a/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs b/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs
index 1203192..68e4e26 100644
--- a/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs
+++ b/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs
@@ -771,7 +771,7 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
SceneObjectGroup g = SceneObjectSerializer.FromOriginalXmlFormat(xmlData);
objlist.Add(g);
- veclist.Add(new Vector3(0, 0, 0));
+ veclist.Add(Vector3.Zero);
float offsetHeight = 0;
pos = m_Scene.GetNewRezLocation(
--
cgit v1.1
From 07e4958b19b0b9dc9e1955b79e735230ccc6ea6f Mon Sep 17 00:00:00 2001
From: Diva Canto
Date: Thu, 1 Aug 2013 20:40:13 -0700
Subject: Turn off edit beams when object is derezed while being edited.
(mantis #6722)
---
OpenSim/Region/Framework/Scenes/ScenePresence.cs | 6 ++++++
1 file changed, 6 insertions(+)
(limited to 'OpenSim/Region')
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index 17da0d9..456c8cc 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -1568,8 +1568,14 @@ namespace OpenSim.Region.Framework.Scenes
// Here's where you get them.
m_AgentControlFlags = flags;
m_headrotation = agentData.HeadRotation;
+ byte oldState = State;
State = agentData.State;
+ // We need to send this back to the client in order to stop the edit beams
+ if ((oldState & (uint)AgentState.Editing) != 0 && State == (uint)AgentState.None)
+ ControllingClient.SendAgentTerseUpdate(this);
+
+
PhysicsActor actor = PhysicsActor;
if (actor == null)
{
--
cgit v1.1
From 87ee0c395ed82f27c2a52b5023d8036eb7e355c9 Mon Sep 17 00:00:00 2001
From: Robert Adams
Date: Fri, 2 Aug 2013 09:44:01 -0700
Subject: Fix problem with modInvoke defined integer constants being build into
scripts as boxed integers rather than proper reference to a new LSLInteger.
This fixes an exception when using a registered integer constant in a script.
---
OpenSim/Region/ScriptEngine/Shared/Api/Implementation/MOD_Api.cs | 4 ++--
OpenSim/Region/ScriptEngine/Shared/CodeTools/CSCodeGenerator.cs | 2 +-
2 files changed, 3 insertions(+), 3 deletions(-)
(limited to 'OpenSim/Region')
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/MOD_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/MOD_Api.cs
index 21bae27..92dd813 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/MOD_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/MOD_Api.cs
@@ -319,7 +319,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
object[] convertedParms = new object[parms.Length];
for (int i = 0; i < parms.Length; i++)
- convertedParms[i] = ConvertFromLSL(parms[i],signature[i], fname);
+ convertedParms[i] = ConvertFromLSL(parms[i], signature[i], fname);
// now call the function, the contract with the function is that it will always return
// non-null but don't trust it completely
@@ -444,7 +444,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
}
}
- MODError(String.Format("{1}: parameter type mismatch; expecting {0}",type.Name, fname));
+ MODError(String.Format("{0}: parameter type mismatch; expecting {1}, type(parm)={2}", fname, type.Name, lslparm.GetType()));
return null;
}
diff --git a/OpenSim/Region/ScriptEngine/Shared/CodeTools/CSCodeGenerator.cs b/OpenSim/Region/ScriptEngine/Shared/CodeTools/CSCodeGenerator.cs
index 9e32f40..6aa717d 100644
--- a/OpenSim/Region/ScriptEngine/Shared/CodeTools/CSCodeGenerator.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/CodeTools/CSCodeGenerator.cs
@@ -937,7 +937,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
{
string retval = null;
if (value is int)
- retval = ((int)value).ToString();
+ retval = String.Format("new LSL_Types.LSLInteger({0})",((int)value).ToString());
else if (value is float)
retval = String.Format("new LSL_Types.LSLFloat({0})",((float)value).ToString());
else if (value is string)
--
cgit v1.1
From 5bcccfc305ae4f5a74b9b816781a2a643daa23b3 Mon Sep 17 00:00:00 2001
From: Robert Adams
Date: Thu, 1 Aug 2013 12:35:22 -0700
Subject: BulletSim: add BSLinkInfo structure to remember link specific
information for each link in a linkset. Extend BSLinksetConstraint to create
and use BSLinkInfo with the default static constraint.
---
OpenSim/Region/Physics/BulletSPlugin/BSLinkset.cs | 51 +++--
.../Physics/BulletSPlugin/BSLinksetCompound.cs | 4 +-
.../Physics/BulletSPlugin/BSLinksetConstraints.cs | 205 ++++++++++++++-------
3 files changed, 174 insertions(+), 86 deletions(-)
(limited to 'OpenSim/Region')
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSLinkset.cs b/OpenSim/Region/Physics/BulletSPlugin/BSLinkset.cs
index 7f94666..9613fe0 100755
--- a/OpenSim/Region/Physics/BulletSPlugin/BSLinkset.cs
+++ b/OpenSim/Region/Physics/BulletSPlugin/BSLinkset.cs
@@ -70,6 +70,15 @@ public abstract class BSLinkset
return ret;
}
+ public class BSLinkInfo
+ {
+ public BSPrimLinkable member;
+ public BSLinkInfo(BSPrimLinkable pMember)
+ {
+ member = pMember;
+ }
+ }
+
public BSPrimLinkable LinksetRoot { get; protected set; }
protected BSScene m_physicsScene { get; private set; }
@@ -78,7 +87,8 @@ public abstract class BSLinkset
public int LinksetID { get; private set; }
// The children under the root in this linkset.
- protected HashSet m_children;
+ // protected HashSet m_children;
+ protected Dictionary m_children;
// We lock the diddling of linkset classes to prevent any badness.
// This locks the modification of the instances of this class. Changes
@@ -109,7 +119,7 @@ public abstract class BSLinkset
m_nextLinksetID = 1;
m_physicsScene = scene;
LinksetRoot = parent;
- m_children = new HashSet();
+ m_children = new Dictionary();
LinksetMass = parent.RawMass;
Rebuilding = false;
@@ -170,17 +180,7 @@ public abstract class BSLinkset
bool ret = false;
lock (m_linksetActivityLock)
{
- ret = m_children.Contains(child);
- /* Safer version but the above should work
- foreach (BSPrimLinkable bp in m_children)
- {
- if (child.LocalID == bp.LocalID)
- {
- ret = true;
- break;
- }
- }
- */
+ ret = m_children.ContainsKey(child);
}
return ret;
}
@@ -194,7 +194,24 @@ public abstract class BSLinkset
lock (m_linksetActivityLock)
{
action(LinksetRoot);
- foreach (BSPrimLinkable po in m_children)
+ foreach (BSPrimLinkable po in m_children.Keys)
+ {
+ if (action(po))
+ break;
+ }
+ }
+ return ret;
+ }
+
+ // Perform an action on each member of the linkset including root prim.
+ // Depends on the action on whether this should be done at taint time.
+ public delegate bool ForEachLinkInfoAction(BSLinkInfo obj);
+ public virtual bool ForEachLinkInfo(ForEachLinkInfoAction action)
+ {
+ bool ret = false;
+ lock (m_linksetActivityLock)
+ {
+ foreach (BSLinkInfo po in m_children.Values)
{
if (action(po))
break;
@@ -364,7 +381,7 @@ public abstract class BSLinkset
{
lock (m_linksetActivityLock)
{
- foreach (BSPrimLinkable bp in m_children)
+ foreach (BSPrimLinkable bp in m_children.Keys)
{
mass += bp.RawMass;
}
@@ -382,7 +399,7 @@ public abstract class BSLinkset
com = LinksetRoot.Position * LinksetRoot.RawMass;
float totalMass = LinksetRoot.RawMass;
- foreach (BSPrimLinkable bp in m_children)
+ foreach (BSPrimLinkable bp in m_children.Keys)
{
com += bp.Position * bp.RawMass;
totalMass += bp.RawMass;
@@ -401,7 +418,7 @@ public abstract class BSLinkset
{
com = LinksetRoot.Position;
- foreach (BSPrimLinkable bp in m_children)
+ foreach (BSPrimLinkable bp in m_children.Keys)
{
com += bp.Position;
}
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSLinksetCompound.cs b/OpenSim/Region/Physics/BulletSPlugin/BSLinksetCompound.cs
index 6359046..53c3584 100755
--- a/OpenSim/Region/Physics/BulletSPlugin/BSLinksetCompound.cs
+++ b/OpenSim/Region/Physics/BulletSPlugin/BSLinksetCompound.cs
@@ -257,7 +257,7 @@ public sealed class BSLinksetCompound : BSLinkset
{
if (!HasChild(child))
{
- m_children.Add(child);
+ m_children.Add(child, new BSLinkInfo(child));
DetailLog("{0},BSLinksetCompound.AddChildToLinkset,call,child={1}", LinksetRoot.LocalID, child.LocalID);
@@ -353,7 +353,7 @@ public sealed class BSLinksetCompound : BSLinkset
// Add the shapes of all the components of the linkset
int memberIndex = 1;
- ForEachMember(delegate(BSPrimLinkable cPrim)
+ ForEachMember((cPrim) =>
{
if (IsRoot(cPrim))
{
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSLinksetConstraints.cs b/OpenSim/Region/Physics/BulletSPlugin/BSLinksetConstraints.cs
index f17d698..d98bf77 100755
--- a/OpenSim/Region/Physics/BulletSPlugin/BSLinksetConstraints.cs
+++ b/OpenSim/Region/Physics/BulletSPlugin/BSLinksetConstraints.cs
@@ -36,6 +36,75 @@ public sealed class BSLinksetConstraints : BSLinkset
{
// private static string LogHeader = "[BULLETSIM LINKSET CONSTRAINTS]";
+ public class BSLinkInfoConstraint : BSLinkInfo
+ {
+ public ConstraintType constraintType;
+ public BSConstraint constraint;
+ public OMV.Vector3 linearLimitLow;
+ public OMV.Vector3 linearLimitHigh;
+ public OMV.Vector3 angularLimitLow;
+ public OMV.Vector3 angularLimitHigh;
+ public bool useFrameOffset;
+ public bool enableTransMotor;
+ public float transMotorMaxVel;
+ public float transMotorMaxForce;
+ public float cfm;
+ public float erp;
+ public float solverIterations;
+
+ public BSLinkInfoConstraint(BSPrimLinkable pMember)
+ : base(pMember)
+ {
+ constraint = null;
+ ResetToFixedConstraint();
+ }
+
+ // Set all the parameters for this constraint to a fixed, non-movable constraint.
+ public void ResetToFixedConstraint()
+ {
+ constraintType = ConstraintType.D6_CONSTRAINT_TYPE;
+ linearLimitLow = OMV.Vector3.Zero;
+ linearLimitHigh = OMV.Vector3.Zero;
+ angularLimitLow = OMV.Vector3.Zero;
+ angularLimitHigh = OMV.Vector3.Zero;
+ useFrameOffset = BSParam.LinkConstraintUseFrameOffset;
+ enableTransMotor = BSParam.LinkConstraintEnableTransMotor;
+ transMotorMaxVel = BSParam.LinkConstraintTransMotorMaxVel;
+ transMotorMaxForce = BSParam.LinkConstraintTransMotorMaxForce;
+ cfm = BSParam.LinkConstraintCFM;
+ erp = BSParam.LinkConstraintERP;
+ solverIterations = BSParam.LinkConstraintSolverIterations;
+ }
+
+ // Given a constraint, apply the current constraint parameters to same.
+ public void SetConstraintParameters(BSConstraint constrain)
+ {
+ switch (constraintType)
+ {
+ case ConstraintType.D6_CONSTRAINT_TYPE:
+ BSConstraint6Dof constrain6dof = constrain as BSConstraint6Dof;
+ if (constrain6dof != null)
+ {
+ // zero linear and angular limits makes the objects unable to move in relation to each other
+ constrain6dof.SetLinearLimits(linearLimitLow, linearLimitHigh);
+ constrain6dof.SetAngularLimits(angularLimitLow, angularLimitHigh);
+
+ // tweek the constraint to increase stability
+ constrain6dof.UseFrameOffset(useFrameOffset);
+ constrain6dof.TranslationalLimitMotor(enableTransMotor, transMotorMaxVel, transMotorMaxForce);
+ constrain6dof.SetCFMAndERP(cfm, erp);
+ if (solverIterations != 0f)
+ {
+ constrain6dof.SetSolverIterations(solverIterations);
+ }
+ }
+ break;
+ default:
+ break;
+ }
+ }
+ }
+
public BSLinksetConstraints(BSScene scene, BSPrimLinkable parent) : base(scene, parent)
{
}
@@ -142,7 +211,7 @@ public sealed class BSLinksetConstraints : BSLinkset
{
if (!HasChild(child))
{
- m_children.Add(child);
+ m_children.Add(child, new BSLinkInfoConstraint(child));
DetailLog("{0},BSLinksetConstraints.AddChildToLinkset,call,child={1}", LinksetRoot.LocalID, child.LocalID);
@@ -190,73 +259,74 @@ public sealed class BSLinksetConstraints : BSLinkset
}
// Create a static constraint between the two passed objects
- private BSConstraint BuildConstraint(BSPrimLinkable rootPrim, BSPrimLinkable childPrim)
+ private BSConstraint BuildConstraint(BSPrimLinkable rootPrim, BSLinkInfo li)
{
+ BSLinkInfoConstraint liConstraint = li as BSLinkInfoConstraint;
+ if (liConstraint == null)
+ return null;
+
// Zero motion for children so they don't interpolate
- childPrim.ZeroMotion(true);
-
- // Relative position normalized to the root prim
- // Essentually a vector pointing from center of rootPrim to center of childPrim
- OMV.Vector3 childRelativePosition = childPrim.Position - rootPrim.Position;
-
- // real world coordinate of midpoint between the two objects
- OMV.Vector3 midPoint = rootPrim.Position + (childRelativePosition / 2);
-
- DetailLog("{0},BSLinksetConstraint.BuildConstraint,taint,root={1},rBody={2},child={3},cBody={4},rLoc={5},cLoc={6},midLoc={7}",
- rootPrim.LocalID,
- rootPrim.LocalID, rootPrim.PhysBody.AddrString,
- childPrim.LocalID, childPrim.PhysBody.AddrString,
- rootPrim.Position, childPrim.Position, midPoint);
-
- // create a constraint that allows no freedom of movement between the two objects
- // http://bulletphysics.org/Bullet/phpBB3/viewtopic.php?t=4818
-
- BSConstraint6Dof constrain = new BSConstraint6Dof(
- m_physicsScene.World, rootPrim.PhysBody, childPrim.PhysBody, midPoint, true, true );
- // PhysicsScene.World, childPrim.BSBody, rootPrim.BSBody, midPoint, true, true );
-
- /* NOTE: below is an attempt to build constraint with full frame computation, etc.
- * Using the midpoint is easier since it lets the Bullet code manipulate the transforms
- * of the objects.
- * Code left for future programmers.
- // ==================================================================================
- // relative position normalized to the root prim
- OMV.Quaternion invThisOrientation = OMV.Quaternion.Inverse(rootPrim.Orientation);
- OMV.Vector3 childRelativePosition = (childPrim.Position - rootPrim.Position) * invThisOrientation;
-
- // relative rotation of the child to the parent
- OMV.Quaternion childRelativeRotation = invThisOrientation * childPrim.Orientation;
- OMV.Quaternion inverseChildRelativeRotation = OMV.Quaternion.Inverse(childRelativeRotation);
-
- DetailLog("{0},BSLinksetConstraint.PhysicallyLinkAChildToRoot,taint,root={1},child={2}", rootPrim.LocalID, rootPrim.LocalID, childPrim.LocalID);
- BS6DofConstraint constrain = new BS6DofConstraint(
- PhysicsScene.World, rootPrim.Body, childPrim.Body,
- OMV.Vector3.Zero,
- OMV.Quaternion.Inverse(rootPrim.Orientation),
- OMV.Vector3.Zero,
- OMV.Quaternion.Inverse(childPrim.Orientation),
- true,
- true
- );
- // ==================================================================================
- */
+ li.member.ZeroMotion(true);
- m_physicsScene.Constraints.AddConstraint(constrain);
+ BSConstraint constrain = null;
- // zero linear and angular limits makes the objects unable to move in relation to each other
- constrain.SetLinearLimits(OMV.Vector3.Zero, OMV.Vector3.Zero);
- constrain.SetAngularLimits(OMV.Vector3.Zero, OMV.Vector3.Zero);
-
- // tweek the constraint to increase stability
- constrain.UseFrameOffset(BSParam.LinkConstraintUseFrameOffset);
- constrain.TranslationalLimitMotor(BSParam.LinkConstraintEnableTransMotor,
- BSParam.LinkConstraintTransMotorMaxVel,
- BSParam.LinkConstraintTransMotorMaxForce);
- constrain.SetCFMAndERP(BSParam.LinkConstraintCFM, BSParam.LinkConstraintERP);
- if (BSParam.LinkConstraintSolverIterations != 0f)
+ switch (liConstraint.constraintType)
{
- constrain.SetSolverIterations(BSParam.LinkConstraintSolverIterations);
+ case ConstraintType.D6_CONSTRAINT_TYPE:
+ // Relative position normalized to the root prim
+ // Essentually a vector pointing from center of rootPrim to center of li.member
+ OMV.Vector3 childRelativePosition = liConstraint.member.Position - rootPrim.Position;
+
+ // real world coordinate of midpoint between the two objects
+ OMV.Vector3 midPoint = rootPrim.Position + (childRelativePosition / 2);
+
+ DetailLog("{0},BSLinksetConstraint.BuildConstraint,taint,root={1},rBody={2},child={3},cBody={4},rLoc={5},cLoc={6},midLoc={7}",
+ rootPrim.LocalID,
+ rootPrim.LocalID, rootPrim.PhysBody.AddrString,
+ liConstraint.member.LocalID, liConstraint.member.PhysBody.AddrString,
+ rootPrim.Position, liConstraint.member.Position, midPoint);
+
+ // create a constraint that allows no freedom of movement between the two objects
+ // http://bulletphysics.org/Bullet/phpBB3/viewtopic.php?t=4818
+
+ constrain = new BSConstraint6Dof(
+ m_physicsScene.World, rootPrim.PhysBody, liConstraint.member.PhysBody, midPoint, true, true );
+
+ /* NOTE: below is an attempt to build constraint with full frame computation, etc.
+ * Using the midpoint is easier since it lets the Bullet code manipulate the transforms
+ * of the objects.
+ * Code left for future programmers.
+ // ==================================================================================
+ // relative position normalized to the root prim
+ OMV.Quaternion invThisOrientation = OMV.Quaternion.Inverse(rootPrim.Orientation);
+ OMV.Vector3 childRelativePosition = (liConstraint.member.Position - rootPrim.Position) * invThisOrientation;
+
+ // relative rotation of the child to the parent
+ OMV.Quaternion childRelativeRotation = invThisOrientation * liConstraint.member.Orientation;
+ OMV.Quaternion inverseChildRelativeRotation = OMV.Quaternion.Inverse(childRelativeRotation);
+
+ DetailLog("{0},BSLinksetConstraint.PhysicallyLinkAChildToRoot,taint,root={1},child={2}", rootPrim.LocalID, rootPrim.LocalID, liConstraint.member.LocalID);
+ constrain = new BS6DofConstraint(
+ PhysicsScene.World, rootPrim.Body, liConstraint.member.Body,
+ OMV.Vector3.Zero,
+ OMV.Quaternion.Inverse(rootPrim.Orientation),
+ OMV.Vector3.Zero,
+ OMV.Quaternion.Inverse(liConstraint.member.Orientation),
+ true,
+ true
+ );
+ // ==================================================================================
+ */
+
+ break;
+ default:
+ break;
}
+
+ liConstraint.SetConstraintParameters(constrain);
+
+ m_physicsScene.Constraints.AddConstraint(constrain);
+
return constrain;
}
@@ -317,23 +387,24 @@ public sealed class BSLinksetConstraints : BSLinkset
return; // Note the 'finally' clause at the botton which will get executed.
}
- foreach (BSPrimLinkable child in m_children)
+ ForEachLinkInfo((li) =>
{
// A child in the linkset physically shows the mass of the whole linkset.
// This allows Bullet to apply enough force on the child to move the whole linkset.
// (Also do the mass stuff before recomputing the constraint so mass is not zero.)
- child.UpdatePhysicalMassProperties(linksetMass, true);
+ li.member.UpdatePhysicalMassProperties(linksetMass, true);
BSConstraint constrain;
- if (!m_physicsScene.Constraints.TryGetConstraint(LinksetRoot.PhysBody, child.PhysBody, out constrain))
+ if (!m_physicsScene.Constraints.TryGetConstraint(LinksetRoot.PhysBody, li.member.PhysBody, out constrain))
{
// If constraint doesn't exist yet, create it.
- constrain = BuildConstraint(LinksetRoot, child);
+ constrain = BuildConstraint(LinksetRoot, li);
}
constrain.RecomputeConstraintVariables(linksetMass);
// PhysicsScene.PE.DumpConstraint(PhysicsScene.World, constrain.Constraint); // DEBUG DEBUG
- }
+ return false; // 'false' says to keep processing other members
+ });
}
finally
{
--
cgit v1.1
From 24df15dab7befd50f7a45eb54f001e6e481f0ec4 Mon Sep 17 00:00:00 2001
From: Robert Adams
Date: Thu, 1 Aug 2013 17:43:06 -0700
Subject: BulletSim: add implementation of 'physSetLinksetType' and
'physGetLinksetType' and processing routines in BulletSim. Add linkset
rebuild/conversion routine in BSLinkset.
---
.../Scripting/ExtendedPhysics/ExtendedPhysics.cs | 65 ++++++++++++++++++++--
OpenSim/Region/Physics/BulletSPlugin/BSLinkset.cs | 2 +
.../Physics/BulletSPlugin/BSLinksetCompound.cs | 1 +
.../Physics/BulletSPlugin/BSLinksetConstraints.cs | 1 +
OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs | 44 +++++++++++++++
.../Region/Physics/BulletSPlugin/BSPrimLinkable.cs | 30 ++++++++++
OpenSim/Region/Physics/BulletSPlugin/BSScene.cs | 17 ++++++
OpenSim/Region/Physics/Manager/PhysicsActor.cs | 3 +-
OpenSim/Region/Physics/Manager/PhysicsScene.cs | 3 +-
9 files changed, 159 insertions(+), 7 deletions(-)
(limited to 'OpenSim/Region')
diff --git a/OpenSim/Region/OptionalModules/Scripting/ExtendedPhysics/ExtendedPhysics.cs b/OpenSim/Region/OptionalModules/Scripting/ExtendedPhysics/ExtendedPhysics.cs
index 0cbc5f9..d1d318c 100755
--- a/OpenSim/Region/OptionalModules/Scripting/ExtendedPhysics/ExtendedPhysics.cs
+++ b/OpenSim/Region/OptionalModules/Scripting/ExtendedPhysics/ExtendedPhysics.cs
@@ -49,10 +49,20 @@ 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.
+ // This table must correspond to an identical table in BSScene.
+
+ // Per scene functions. See BSScene.
+
+ // Per avatar functions. See BSCharacter.
+
+ // Per prim functions. See BSPrim.
+ public const string PhysFunctGetLinksetType = "BulletSim.GetLinksetType";
public const string PhysFunctSetLinksetType = "BulletSim.SetLinksetType";
+ // =============================================================
+
private IConfig Configuration { get; set; }
private bool Enabled { get; set; }
private Scene BaseScene { get; set; }
@@ -123,6 +133,7 @@ public class ExtendedPhysics : INonSharedRegionModule
// Register as LSL functions all the [ScriptInvocation] marked methods.
Comms.RegisterScriptInvocations(this);
+ Comms.RegisterConstants(this);
// When an object is modified, we might need to update its extended physics parameters
BaseScene.EventManager.OnObjectAddedToScene += EventManager_OnObjectAddedToScene;
@@ -136,7 +147,6 @@ public class ExtendedPhysics : INonSharedRegionModule
private void EventManager_OnObjectAddedToScene(SceneObjectGroup obj)
{
- throw new NotImplementedException();
}
// Event generated when some property of a prim changes.
@@ -168,9 +178,11 @@ public class ExtendedPhysics : INonSharedRegionModule
public static int PHYS_LINKSET_TYPE_MANUAL = 2;
[ScriptInvocation]
- public void physSetLinksetType(UUID hostID, UUID scriptID, int linksetType)
+ public int physSetLinksetType(UUID hostID, UUID scriptID, int linksetType)
{
- if (!Enabled) return;
+ int ret = -1;
+
+ if (!Enabled) return ret;
// The part that is requesting the change.
SceneObjectPart requestingPart = BaseScene.GetSceneObjectPart(hostID);
@@ -186,7 +198,7 @@ public class ExtendedPhysics : INonSharedRegionModule
Physics.Manager.PhysicsActor rootPhysActor = rootPart.PhysActor;
if (rootPhysActor != null)
{
- rootPhysActor.Extension(PhysFunctSetLinksetType, linksetType);
+ ret = (int)rootPhysActor.Extension(PhysFunctSetLinksetType, linksetType);
}
else
{
@@ -204,6 +216,49 @@ public class ExtendedPhysics : INonSharedRegionModule
{
m_log.WarnFormat("{0} physSetLinsetType: cannot find script object in scene. hostID={1}", LogHeader, hostID);
}
+ return ret;
+ }
+
+ [ScriptInvocation]
+ public int physGetLinksetType(UUID hostID, UUID scriptID)
+ {
+ int ret = -1;
+
+ if (!Enabled) return ret;
+
+ // The part that is requesting the change.
+ SceneObjectPart requestingPart = BaseScene.GetSceneObjectPart(hostID);
+
+ if (requestingPart != null)
+ {
+ // The type is is always on 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)
+ {
+ ret = (int)rootPhysActor.Extension(PhysFunctGetLinksetType);
+ }
+ else
+ {
+ m_log.WarnFormat("{0} physGetLinksetType: root part does not have a physics actor. rootName={1}, hostID={2}",
+ LogHeader, rootPart.Name, hostID);
+ }
+ }
+ else
+ {
+ m_log.WarnFormat("{0} physGetLinksetType: root part does not exist. RequestingPartName={1}, hostID={2}",
+ LogHeader, requestingPart.Name, hostID);
+ }
+ }
+ else
+ {
+ m_log.WarnFormat("{0} physGetLinsetType: cannot find script object in scene. hostID={1}", LogHeader, hostID);
+ }
+ return ret;
}
}
}
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSLinkset.cs b/OpenSim/Region/Physics/BulletSPlugin/BSLinkset.cs
index 9613fe0..3afd52e 100755
--- a/OpenSim/Region/Physics/BulletSPlugin/BSLinkset.cs
+++ b/OpenSim/Region/Physics/BulletSPlugin/BSLinkset.cs
@@ -79,6 +79,8 @@ public abstract class BSLinkset
}
}
+ public LinksetImplementation LinksetImpl { get; protected set; }
+
public BSPrimLinkable LinksetRoot { get; protected set; }
protected BSScene m_physicsScene { get; private set; }
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSLinksetCompound.cs b/OpenSim/Region/Physics/BulletSPlugin/BSLinksetCompound.cs
index 53c3584..085d195 100755
--- a/OpenSim/Region/Physics/BulletSPlugin/BSLinksetCompound.cs
+++ b/OpenSim/Region/Physics/BulletSPlugin/BSLinksetCompound.cs
@@ -42,6 +42,7 @@ public sealed class BSLinksetCompound : BSLinkset
public BSLinksetCompound(BSScene scene, BSPrimLinkable parent)
: base(scene, parent)
{
+ LinksetImpl = LinksetImplementation.Compound;
}
// ================================================================
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSLinksetConstraints.cs b/OpenSim/Region/Physics/BulletSPlugin/BSLinksetConstraints.cs
index d98bf77..4bac222 100755
--- a/OpenSim/Region/Physics/BulletSPlugin/BSLinksetConstraints.cs
+++ b/OpenSim/Region/Physics/BulletSPlugin/BSLinksetConstraints.cs
@@ -107,6 +107,7 @@ public sealed class BSLinksetConstraints : BSLinkset
public BSLinksetConstraints(BSScene scene, BSPrimLinkable parent) : base(scene, parent)
{
+ LinksetImpl = LinksetImplementation.Constraint;
}
// When physical properties are changed the linkset needs to recalculate
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs b/OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs
index e92a1d2..a0b6abc 100644
--- a/OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs
+++ b/OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs
@@ -1541,6 +1541,50 @@ public class BSPrim : BSPhysObject
PhysicalActors.RemoveDependencies();
}
+ #region Extension
+ public override object Extension(string pFunct, params object[] pParams)
+ {
+ object ret = null;
+ switch (pFunct)
+ {
+ case BSScene.PhysFunctGetLinksetType:
+ {
+ BSPrimLinkable myHandle = this as BSPrimLinkable;
+ if (myHandle != null)
+ {
+ ret = (object)myHandle.LinksetType;
+ }
+ m_log.DebugFormat("{0} Extension.physGetLinksetType, type={1}", LogHeader, ret);
+ break;
+ }
+ case BSScene.PhysFunctSetLinksetType:
+ {
+ if (pParams.Length > 0)
+ {
+ BSLinkset.LinksetImplementation linksetType = (BSLinkset.LinksetImplementation)pParams[0];
+ BSPrimLinkable myHandle = this as BSPrimLinkable;
+ if (myHandle != null && myHandle.Linkset.IsRoot(myHandle))
+ {
+ PhysScene.TaintedObject("BSPrim.PhysFunctSetLinksetType", delegate()
+ {
+ // Cause the linkset type to change
+ m_log.DebugFormat("{0} Extension.physSetLinksetType, oldType={1}, newType={2}",
+ LogHeader, myHandle.Linkset.LinksetImpl, linksetType);
+ myHandle.ConvertLinkset(linksetType);
+ });
+ }
+ ret = (object)(int)linksetType;
+ }
+ break;
+ }
+ default:
+ ret = base.Extension(pFunct, pParams);
+ break;
+ }
+ return ret;
+ }
+ #endregion // Extension
+
// The physics engine says that properties have updated. Update same and inform
// the world that things have changed.
// NOTE: BSPrim.UpdateProperties is overloaded by BSPrimLinkable which modifies updates from root and children prims.
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSPrimLinkable.cs b/OpenSim/Region/Physics/BulletSPlugin/BSPrimLinkable.cs
index 2f392da..c565998 100755
--- a/OpenSim/Region/Physics/BulletSPlugin/BSPrimLinkable.cs
+++ b/OpenSim/Region/Physics/BulletSPlugin/BSPrimLinkable.cs
@@ -233,5 +233,35 @@ public class BSPrimLinkable : BSPrimDisplaced
base.HasSomeCollision = value;
}
}
+
+ // Convert the existing linkset of this prim into a new type.
+ public bool ConvertLinkset(BSLinkset.LinksetImplementation newType)
+ {
+ bool ret = false;
+ if (LinksetType != newType)
+ {
+ BSLinkset oldLinkset = Linkset;
+ BSLinkset newLinkset = BSLinkset.Factory(PhysScene, this);
+
+ // Pick up any physical dependencies this linkset might have in the physics engine.
+ oldLinkset.RemoveDependencies(this);
+
+ // Copy the linkset children from the old linkset to the new (will be a new instance from the factory)
+ oldLinkset.ForEachLinkInfo((li) =>
+ {
+ oldLinkset.RemoveMeFromLinkset(li.member);
+ newLinkset.AddMeToLinkset(li.member);
+ li.member.Linkset = newLinkset;
+ return false;
+ });
+
+ this.Linkset = newLinkset;
+
+ // Force the shape and linkset to get reconstructed
+ newLinkset.Refresh(this);
+ this.ForceBodyShapeRebuild(true);
+ }
+ return ret;
+ }
}
}
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSScene.cs b/OpenSim/Region/Physics/BulletSPlugin/BSScene.cs
index 41aca3b..79ac5a5 100644
--- a/OpenSim/Region/Physics/BulletSPlugin/BSScene.cs
+++ b/OpenSim/Region/Physics/BulletSPlugin/BSScene.cs
@@ -862,6 +862,23 @@ public sealed class BSScene : PhysicsScene, IPhysicsParameters
public override bool IsThreaded { get { return false; } }
+ #region Extensions
+ // =============================================================
+ // Per scene functions. See below.
+
+ // Per avatar functions. See BSCharacter.
+
+ // Per prim functions. See BSPrim.
+ public const string PhysFunctGetLinksetType = "BulletSim.GetLinksetType";
+ public const string PhysFunctSetLinksetType = "BulletSim.SetLinksetType";
+ // =============================================================
+
+ public override object Extension(string pFunct, params object[] pParams)
+ {
+ return base.Extension(pFunct, pParams);
+ }
+ #endregion // Extensions
+
#region Taints
// The simulation execution order is:
// Simulate()
diff --git a/OpenSim/Region/Physics/Manager/PhysicsActor.cs b/OpenSim/Region/Physics/Manager/PhysicsActor.cs
index 2500f27..1750853 100644
--- a/OpenSim/Region/Physics/Manager/PhysicsActor.cs
+++ b/OpenSim/Region/Physics/Manager/PhysicsActor.cs
@@ -317,7 +317,8 @@ namespace OpenSim.Region.Physics.Manager
// Extendable interface for new, physics engine specific operations
public virtual object Extension(string pFunct, params object[] pParams)
{
- throw new NotImplementedException();
+ // A NOP of the physics engine does not implement this feature
+ return null;
}
}
diff --git a/OpenSim/Region/Physics/Manager/PhysicsScene.cs b/OpenSim/Region/Physics/Manager/PhysicsScene.cs
index 07a1d36..c93206d 100644
--- a/OpenSim/Region/Physics/Manager/PhysicsScene.cs
+++ b/OpenSim/Region/Physics/Manager/PhysicsScene.cs
@@ -338,7 +338,8 @@ namespace OpenSim.Region.Physics.Manager
// Extendable interface for new, physics engine specific operations
public virtual object Extension(string pFunct, params object[] pParams)
{
- throw new NotImplementedException();
+ // A NOP if the extension thing is not implemented by the physics engine
+ return null;
}
}
}
--
cgit v1.1
From 5bdfd55ace4b673d8aaa3f25fd4bb675b1b28263 Mon Sep 17 00:00:00 2001
From: Robert Adams
Date: Fri, 2 Aug 2013 10:32:43 -0700
Subject: BulletSim: When converting linkset types, don't try to change the
list of linkset children while iterating through the list.
---
.../Region/Physics/BulletSPlugin/BSPrimLinkable.cs | 29 +++++++++++++++-------
1 file changed, 20 insertions(+), 9 deletions(-)
(limited to 'OpenSim/Region')
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSPrimLinkable.cs b/OpenSim/Region/Physics/BulletSPlugin/BSPrimLinkable.cs
index c565998..7179a6d 100755
--- a/OpenSim/Region/Physics/BulletSPlugin/BSPrimLinkable.cs
+++ b/OpenSim/Region/Physics/BulletSPlugin/BSPrimLinkable.cs
@@ -240,26 +240,37 @@ public class BSPrimLinkable : BSPrimDisplaced
bool ret = false;
if (LinksetType != newType)
{
- BSLinkset oldLinkset = Linkset;
+ // Set the implementation type first so the call to BSLinkset.Factory gets the new type.
+ this.LinksetType = newType;
+
+ BSLinkset oldLinkset = this.Linkset;
BSLinkset newLinkset = BSLinkset.Factory(PhysScene, this);
+ this.Linkset = newLinkset;
+
// Pick up any physical dependencies this linkset might have in the physics engine.
oldLinkset.RemoveDependencies(this);
- // Copy the linkset children from the old linkset to the new (will be a new instance from the factory)
- oldLinkset.ForEachLinkInfo((li) =>
+ // Create a list of the children (mainly because can't interate through a list that's changing)
+ List children = new List();
+ oldLinkset.ForEachMember((child) =>
{
- oldLinkset.RemoveMeFromLinkset(li.member);
- newLinkset.AddMeToLinkset(li.member);
- li.member.Linkset = newLinkset;
- return false;
+ if (!oldLinkset.IsRoot(child))
+ children.Add(child);
+ return false; // 'false' says to continue to next member
});
- this.Linkset = newLinkset;
+ // Remove the children from the old linkset and add to the new (will be a new instance from the factory)
+ foreach (BSPrimLinkable child in children)
+ {
+ oldLinkset.RemoveMeFromLinkset(child);
+ newLinkset.AddMeToLinkset(child);
+ child.Linkset = newLinkset;
+ }
// Force the shape and linkset to get reconstructed
newLinkset.Refresh(this);
- this.ForceBodyShapeRebuild(true);
+ this.ForceBodyShapeRebuild(true /* inTaintTime */);
}
return ret;
}
--
cgit v1.1
From 54b1071556edf264835f990bb3595064d2b2e2f0 Mon Sep 17 00:00:00 2001
From: Justin Clark-Casey (justincc)
Date: Fri, 2 Aug 2013 23:12:54 +0100
Subject: Allow older teleport ConnectorProtocolVersion of "SIMULATION/0.1" to
be manually forced in a new [SimulationService] config setting.
This is for testing and debugging purposes to help determine whether a particular issue may be teleport related or not
"SIMULATION/0.2" (the newer teleport protocol) remains the default. If the source simulator only implements "SIMULATION/0.1" this will correctly allow fallback to the older protocol.
Specifying "SIMULATION/0.1" will force the older, less efficient protocol to always be used.
---
.../Simulation/LocalSimulationConnector.cs | 33 +++++++++++++---------
.../Simulation/RemoteSimulationConnector.cs | 21 ++++++--------
2 files changed, 27 insertions(+), 27 deletions(-)
(limited to 'OpenSim/Region')
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/LocalSimulationConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/LocalSimulationConnector.cs
index 697ce68..7aadb87 100644
--- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/LocalSimulationConnector.cs
+++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/LocalSimulationConnector.cs
@@ -63,35 +63,40 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation
///
private bool m_ModuleEnabled = false;
- public LocalSimulationConnectorModule()
- {
- ServiceVersion = "SIMULATION/0.2";
- }
-
#region Region Module interface
- public void Initialise(IConfigSource config)
+ public void Initialise(IConfigSource configSource)
{
- IConfig moduleConfig = config.Configs["Modules"];
+ IConfig moduleConfig = configSource.Configs["Modules"];
if (moduleConfig != null)
{
string name = moduleConfig.GetString("SimulationServices", "");
if (name == Name)
{
- //IConfig userConfig = config.Configs["SimulationService"];
- //if (userConfig == null)
- //{
- // m_log.Error("[AVATAR CONNECTOR]: SimulationService missing from OpenSim.ini");
- // return;
- //}
+ InitialiseService(configSource);
m_ModuleEnabled = true;
- m_log.Info("[SIMULATION CONNECTOR]: Local simulation enabled");
+ m_log.Info("[LOCAL SIMULATION CONNECTOR]: Local simulation enabled.");
}
}
}
+ public void InitialiseService(IConfigSource configSource)
+ {
+ IConfig config = configSource.Configs["SimulationService"];
+ if (config != null)
+ {
+ ServiceVersion = config.GetString("ConnectorProtocolVersion", "SIMULATION/0.2");
+
+ if (ServiceVersion != "SIMULATION/0.1" && ServiceVersion != "SIMULATION/0.2")
+ throw new Exception(string.Format("Invalid ConnectorProtocolVersion {0}", ServiceVersion));
+
+ m_log.InfoFormat(
+ "[LOCAL SIMULATION CONNECTOR]: Initialzied with connector protocol version {0}", ServiceVersion);
+ }
+ }
+
public void PostInitialise()
{
}
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/RemoteSimulationConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/RemoteSimulationConnector.cs
index 8722b80..f45f560 100644
--- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/RemoteSimulationConnector.cs
+++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/RemoteSimulationConnector.cs
@@ -50,9 +50,9 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation
[Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule", Id = "RemoteSimulationConnectorModule")]
public class RemoteSimulationConnectorModule : ISharedRegionModule, ISimulationService
{
- private bool initialized = false;
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
+ private bool initialized = false;
protected bool m_enabled = false;
protected Scene m_aScene;
// RemoteSimulationConnector does not care about local regions; it delegates that to the Local module
@@ -64,27 +64,23 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation
#region Region Module interface
- public virtual void Initialise(IConfigSource config)
+ public virtual void Initialise(IConfigSource configSource)
{
-
- IConfig moduleConfig = config.Configs["Modules"];
+ IConfig moduleConfig = configSource.Configs["Modules"];
if (moduleConfig != null)
{
string name = moduleConfig.GetString("SimulationServices", "");
if (name == Name)
{
- //IConfig userConfig = config.Configs["SimulationService"];
- //if (userConfig == null)
- //{
- // m_log.Error("[AVATAR CONNECTOR]: SimulationService missing from OpenSim.ini");
- // return;
- //}
+ m_localBackend = new LocalSimulationConnectorModule();
+
+ m_localBackend.InitialiseService(configSource);
m_remoteConnector = new SimulationServiceConnector();
m_enabled = true;
- m_log.Info("[SIMULATION CONNECTOR]: Remote simulation enabled");
+ m_log.Info("[REMOTE SIMULATION CONNECTOR]: Remote simulation enabled.");
}
}
}
@@ -142,8 +138,7 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation
}
protected virtual void InitOnce(Scene scene)
- {
- m_localBackend = new LocalSimulationConnectorModule();
+ {
m_aScene = scene;
//m_regionClient = new RegionToRegionClient(m_aScene, m_hyperlinkService);
m_thisIP = Util.GetHostFromDNS(scene.RegionInfo.ExternalHostName);
--
cgit v1.1
From 847c01f406359289097a6ad8d681002a4beff086 Mon Sep 17 00:00:00 2001
From: Diva Canto
Date: Fri, 2 Aug 2013 17:38:08 -0700
Subject: Amend Justin's last commit regarding the new config var
ServiceVersion. The section may not exist at all.
---
.../ServiceConnectorsOut/Simulation/LocalSimulationConnector.cs | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
(limited to 'OpenSim/Region')
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/LocalSimulationConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/LocalSimulationConnector.cs
index 7aadb87..e86d186 100644
--- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/LocalSimulationConnector.cs
+++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Simulation/LocalSimulationConnector.cs
@@ -84,10 +84,11 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Simulation
public void InitialiseService(IConfigSource configSource)
{
+ ServiceVersion = "SIMULATION/0.2";
IConfig config = configSource.Configs["SimulationService"];
if (config != null)
{
- ServiceVersion = config.GetString("ConnectorProtocolVersion", "SIMULATION/0.2");
+ ServiceVersion = config.GetString("ConnectorProtocolVersion", ServiceVersion);
if (ServiceVersion != "SIMULATION/0.1" && ServiceVersion != "SIMULATION/0.2")
throw new Exception(string.Format("Invalid ConnectorProtocolVersion {0}", ServiceVersion));
--
cgit v1.1
From b857353fc932bdf775abce2a3d34140cafe916ce Mon Sep 17 00:00:00 2001
From: Diva Canto
Date: Sat, 3 Aug 2013 15:42:25 -0700
Subject: Making the J2KDecoderModule decoder function async. Could this be the
cause of sim freeze? -- HandleRequestImage in LLClientView is now sync, which
means that it cannot take too long to complete. However, its execution path
may end up in J2KDecoderModule.Decode, which is heavy and could stop the
packet processing thread while it's at it.
---
OpenSim/Region/CoreModules/Agent/TextureSender/J2KDecoderModule.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
(limited to 'OpenSim/Region')
diff --git a/OpenSim/Region/CoreModules/Agent/TextureSender/J2KDecoderModule.cs b/OpenSim/Region/CoreModules/Agent/TextureSender/J2KDecoderModule.cs
index 3764685..d9b0eff 100644
--- a/OpenSim/Region/CoreModules/Agent/TextureSender/J2KDecoderModule.cs
+++ b/OpenSim/Region/CoreModules/Agent/TextureSender/J2KDecoderModule.cs
@@ -166,7 +166,7 @@ namespace OpenSim.Region.CoreModules.Agent.TextureSender
// Do Decode!
if (decode)
- Decode(assetID, j2kData);
+ Util.FireAndForget(delegate { Decode(assetID, j2kData); });
}
}
--
cgit v1.1
From dcfeb95e98ca7b002170a5916f556f54f300678c Mon Sep 17 00:00:00 2001
From: Diva Canto
Date: Sat, 3 Aug 2013 20:13:44 -0700
Subject: HG: If OutboundPermission is set to false, let's enforce stricter
permissions by not allowing objects to be taken to inventory.
---
.../InventoryAccess/HGInventoryAccessModule.cs | 31 ++++++++++++++++++++++
OpenSim/Region/Framework/Scenes/Scene.Inventory.cs | 3 +++
2 files changed, 34 insertions(+)
(limited to 'OpenSim/Region')
diff --git a/OpenSim/Region/CoreModules/Framework/InventoryAccess/HGInventoryAccessModule.cs b/OpenSim/Region/CoreModules/Framework/InventoryAccess/HGInventoryAccessModule.cs
index 8f9800f..978c288 100644
--- a/OpenSim/Region/CoreModules/Framework/InventoryAccess/HGInventoryAccessModule.cs
+++ b/OpenSim/Region/CoreModules/Framework/InventoryAccess/HGInventoryAccessModule.cs
@@ -62,6 +62,8 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
private string m_ThisGatekeeper;
private bool m_RestrictInventoryAccessAbroad;
+ private bool m_bypassPermissions = true;
+
// private bool m_Initialized = false;
#region INonSharedRegionModule
@@ -100,6 +102,10 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
}
else
m_log.Warn("[HG INVENTORY ACCESS MODULE]: HGInventoryAccessModule configs not found. ProfileServerURI not set!");
+
+ m_bypassPermissions = !Util.GetConfigVarFromSections(source, "serverside_object_permissions",
+ new string[] { "Startup", "Permissions" }, true);
+
}
}
}
@@ -114,6 +120,11 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
scene.EventManager.OnNewInventoryItemUploadComplete += UploadInventoryItem;
scene.EventManager.OnTeleportStart += TeleportStart;
scene.EventManager.OnTeleportFail += TeleportFail;
+
+ // We're fgoing to enforce some stricter permissions if Outbound is false
+ scene.Permissions.OnTakeObject += CanTakeObject;
+ scene.Permissions.OnTakeCopyObject += CanTakeObject;
+
}
#endregion
@@ -417,5 +428,25 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
}
#endregion
+
+ #region Permissions
+
+ private bool CanTakeObject(UUID objectID, UUID stealer, Scene scene)
+ {
+ if (m_bypassPermissions) return true;
+
+ if (!m_OutboundPermission && !UserManagementModule.IsLocalGridUser(stealer))
+ {
+ SceneObjectGroup sog = null;
+ if (m_Scene.TryGetSceneObjectGroup(objectID, out sog) && sog.OwnerID == stealer)
+ return true;
+
+ return false;
+ }
+
+ return true;
+ }
+
+ #endregion
}
}
\ No newline at end of file
diff --git a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
index 58fa18c..2d1a3ef 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
@@ -2068,7 +2068,10 @@ namespace OpenSim.Region.Framework.Scenes
{
// If we don't have permission, stop right here
if (!permissionToTakeCopy)
+ {
+ remoteClient.SendAlertMessage("You don't have permission to take the object");
return;
+ }
permissionToTake = true;
// Don't delete
--
cgit v1.1
From 09cb2a37dd73296290c306f38412c1743b9eb820 Mon Sep 17 00:00:00 2001
From: Diva Canto
Date: Sat, 3 Aug 2013 20:36:30 -0700
Subject: More on HG inventory and OutboundPermission: disallowing giving
inventory to foreigners if OutboundPermission is false
---
.../Framework/InventoryAccess/HGInventoryAccessModule.cs | 13 ++++++++++++-
OpenSim/Region/Framework/Scenes/Scene.Inventory.cs | 3 +++
2 files changed, 15 insertions(+), 1 deletion(-)
(limited to 'OpenSim/Region')
diff --git a/OpenSim/Region/CoreModules/Framework/InventoryAccess/HGInventoryAccessModule.cs b/OpenSim/Region/CoreModules/Framework/InventoryAccess/HGInventoryAccessModule.cs
index 978c288..ce7ed26 100644
--- a/OpenSim/Region/CoreModules/Framework/InventoryAccess/HGInventoryAccessModule.cs
+++ b/OpenSim/Region/CoreModules/Framework/InventoryAccess/HGInventoryAccessModule.cs
@@ -124,7 +124,7 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
// We're fgoing to enforce some stricter permissions if Outbound is false
scene.Permissions.OnTakeObject += CanTakeObject;
scene.Permissions.OnTakeCopyObject += CanTakeObject;
-
+ scene.Permissions.OnTransferUserInventory += OnTransferUserInventory;
}
#endregion
@@ -447,6 +447,17 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
return true;
}
+ private bool OnTransferUserInventory(UUID itemID, UUID userID, UUID recipientID)
+ {
+ if (m_bypassPermissions) return true;
+
+ if (!m_OutboundPermission && !UserManagementModule.IsLocalGridUser(recipientID))
+ return false;
+
+ return true;
+ }
+
+
#endregion
}
}
\ No newline at end of file
diff --git a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
index 2d1a3ef..8e4e307 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
@@ -556,6 +556,9 @@ namespace OpenSim.Region.Framework.Scenes
{
//Console.WriteLine("Scene.Inventory.cs: GiveInventoryItem");
+ if (!Permissions.CanTransferUserInventory(itemId, senderId, recipient))
+ return null;
+
InventoryItemBase item = new InventoryItemBase(itemId, senderId);
item = InventoryService.GetItem(item);
--
cgit v1.1
From 5b4b349776613d9054e85727f8f6a1f079a5225a Mon Sep 17 00:00:00 2001
From: Diva Canto
Date: Sat, 3 Aug 2013 21:27:32 -0700
Subject: Fix the failing TestSendImage. J2K decoding is async.
---
.../Region/ClientStack/Linden/UDP/Tests/LLImageManagerTests.cs | 10 +++++++++-
1 file changed, 9 insertions(+), 1 deletion(-)
(limited to 'OpenSim/Region')
diff --git a/OpenSim/Region/ClientStack/Linden/UDP/Tests/LLImageManagerTests.cs b/OpenSim/Region/ClientStack/Linden/UDP/Tests/LLImageManagerTests.cs
index 83144e3..6aa8bcc 100644
--- a/OpenSim/Region/ClientStack/Linden/UDP/Tests/LLImageManagerTests.cs
+++ b/OpenSim/Region/ClientStack/Linden/UDP/Tests/LLImageManagerTests.cs
@@ -29,6 +29,7 @@ using System;
using System.IO;
using System.Net;
using System.Reflection;
+using System.Threading;
using log4net.Config;
using Nini.Config;
using NUnit.Framework;
@@ -105,7 +106,14 @@ namespace OpenSim.Region.ClientStack.LindenUDP.Tests
args.requestSequence = 1;
llim.EnqueueReq(args);
- llim.ProcessImageQueue(20);
+
+ // We now have to wait and hit the processing wheel, because the decoding is async
+ int i = 10;
+ while (i-- > 0)
+ {
+ llim.ProcessImageQueue(20);
+ Thread.Sleep(100);
+ }
Assert.That(tc.SentImageDataPackets.Count, Is.EqualTo(1));
}
--
cgit v1.1
From b8612e005a2f85da2bde2d555f910934cccb218a Mon Sep 17 00:00:00 2001
From: Justin Clark-Casey (justincc)
Date: Mon, 5 Aug 2013 20:47:47 +0100
Subject: At OpenSimulator startup, print out default min built-in threadpool
threads as well as max.
Make it clear that we only try to adjust max, and log at warn level if this fails.
Other minor logging cleanup.
---
OpenSim/Region/Application/Application.cs | 41 ++++++++++++++++++++-----------
1 file changed, 27 insertions(+), 14 deletions(-)
(limited to 'OpenSim/Region')
diff --git a/OpenSim/Region/Application/Application.cs b/OpenSim/Region/Application/Application.cs
index e451aa8..2e155ec 100644
--- a/OpenSim/Region/Application/Application.cs
+++ b/OpenSim/Region/Application/Application.cs
@@ -103,26 +103,38 @@ namespace OpenSim
"[OPENSIM MAIN]: Environment variable MONO_THREADS_PER_CPU is {0}", monoThreadsPerCpu ?? "unset");
// Verify the Threadpool allocates or uses enough worker and IO completion threads
- // .NET 2.0 workerthreads default to 50 * numcores
- // .NET 3.0 workerthreads defaults to 250 * numcores
- // .NET 4.0 workerthreads are dynamic based on bitness and OS resources
- // Max IO Completion threads are 1000 on all 3 CLRs.
+ // .NET 2.0, workerthreads default to 50 * numcores
+ // .NET 3.0, workerthreads defaults to 250 * numcores
+ // .NET 4.0, workerthreads are dynamic based on bitness and OS resources
+ // Max IO Completion threads are 1000 on all 3 CLRs
+ //
+ // Mono 2.10.9 to at least Mono 3.1, workerthreads default to 100 * numcores, iocp threads to 4 * numcores
int workerThreadsMin = 500;
int workerThreadsMax = 1000; // may need further adjustment to match other CLR
int iocpThreadsMin = 1000;
int iocpThreadsMax = 2000; // may need further adjustment to match other CLR
+
+ {
+ int currentMinWorkerThreads, currentMinIocpThreads;
+ System.Threading.ThreadPool.GetMinThreads(out currentMinWorkerThreads, out currentMinIocpThreads);
+ m_log.InfoFormat(
+ "[OPENSIM MAIN]: Runtime gave us {0} min worker threads and {1} min IOCP threads",
+ currentMinWorkerThreads, currentMinIocpThreads);
+ }
+
int workerThreads, iocpThreads;
System.Threading.ThreadPool.GetMaxThreads(out workerThreads, out iocpThreads);
- m_log.InfoFormat("[OPENSIM MAIN]: Runtime gave us {0} worker threads and {1} IOCP threads", workerThreads, iocpThreads);
+ m_log.InfoFormat("[OPENSIM MAIN]: Runtime gave us {0} max worker threads and {1} max IOCP threads", workerThreads, iocpThreads);
+
if (workerThreads < workerThreadsMin)
{
workerThreads = workerThreadsMin;
- m_log.InfoFormat("[OPENSIM MAIN]: Bumping up to worker threads to {0}",workerThreads);
+ m_log.InfoFormat("[OPENSIM MAIN]: Bumping up to max worker threads to {0}",workerThreads);
}
if (workerThreads > workerThreadsMax)
{
workerThreads = workerThreadsMax;
- m_log.InfoFormat("[OPENSIM MAIN]: Limiting worker threads to {0}",workerThreads);
+ m_log.InfoFormat("[OPENSIM MAIN]: Limiting max worker threads to {0}",workerThreads);
}
// Increase the number of IOCP threads available.
@@ -130,22 +142,24 @@ namespace OpenSim
if (iocpThreads < iocpThreadsMin)
{
iocpThreads = iocpThreadsMin;
- m_log.InfoFormat("[OPENSIM MAIN]: Bumping up IO completion threads to {0}",iocpThreads);
+ m_log.InfoFormat("[OPENSIM MAIN]: Bumping up max IO completion threads to {0}",iocpThreads);
}
// Make sure we don't overallocate IOCP threads and thrash system resources
if ( iocpThreads > iocpThreadsMax )
{
iocpThreads = iocpThreadsMax;
- m_log.InfoFormat("[OPENSIM MAIN]: Limiting IO completion threads to {0}",iocpThreads);
+ m_log.InfoFormat("[OPENSIM MAIN]: Limiting max IO completion threads to {0}",iocpThreads);
}
// set the resulting worker and IO completion thread counts back to ThreadPool
if ( System.Threading.ThreadPool.SetMaxThreads(workerThreads, iocpThreads) )
{
- m_log.InfoFormat("[OPENSIM MAIN]: Threadpool set to {0} worker threads and {1} IO completion threads", workerThreads, iocpThreads);
+ m_log.InfoFormat(
+ "[OPENSIM MAIN]: Threadpool set to {0} max worker threads and {1} max IO completion threads",
+ workerThreads, iocpThreads);
}
else
{
- m_log.Info("[OPENSIM MAIN]: Threadpool reconfiguration failed, runtime defaults still in effect.");
+ m_log.Warn("[OPENSIM MAIN]: Threadpool reconfiguration failed, runtime defaults still in effect.");
}
// Check if the system is compatible with OpenSimulator.
@@ -153,17 +167,16 @@ namespace OpenSim
string supported = String.Empty;
if (Util.IsEnvironmentSupported(ref supported))
{
- m_log.Info("Environment is compatible.\n");
+ m_log.Info("[OPENSIM MAIN]: Environment is supported by OpenSimulator.");
}
else
{
- m_log.Warn("Environment is unsupported (" + supported + ")\n");
+ m_log.Warn("[OPENSIM MAIN]: Environment is not supported by OpenSimulator (" + supported + ")\n");
}
// Configure nIni aliases and localles
Culture.SetCurrentCulture();
-
// Validate that the user has the most basic configuration done
// If not, offer to do the most basic configuration for them warning them along the way of the importance of
// reading these files.
--
cgit v1.1
From 24dcf3cf6a95596ce0ac188a63bb5c2c4c47dcee Mon Sep 17 00:00:00 2001
From: Justin Clark-Casey (justincc)
Date: Mon, 5 Aug 2013 20:51:40 +0100
Subject: Comment out debug log lines about script modules comms for now.
If this is an issue, could change log4net config instead to allow re-enablement
---
.../Scripting/ScriptModuleComms/ScriptModuleCommsModule.cs | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
(limited to 'OpenSim/Region')
diff --git a/OpenSim/Region/CoreModules/Scripting/ScriptModuleComms/ScriptModuleCommsModule.cs b/OpenSim/Region/CoreModules/Scripting/ScriptModuleComms/ScriptModuleCommsModule.cs
index 6bf50d2..a515346 100644
--- a/OpenSim/Region/CoreModules/Scripting/ScriptModuleComms/ScriptModuleCommsModule.cs
+++ b/OpenSim/Region/CoreModules/Scripting/ScriptModuleComms/ScriptModuleCommsModule.cs
@@ -163,7 +163,7 @@ namespace OpenSim.Region.CoreModules.Scripting.ScriptModuleComms
public void RegisterScriptInvocation(object target, MethodInfo mi)
{
- m_log.DebugFormat("[MODULE COMMANDS] Register method {0} from type {1}", mi.Name, (target is Type) ? ((Type)target).Name : target.GetType().Name);
+// m_log.DebugFormat("[MODULE COMMANDS] Register method {0} from type {1}", mi.Name, (target is Type) ? ((Type)target).Name : target.GetType().Name);
Type delegateType;
List typeArgs = mi.GetParameters()
@@ -323,7 +323,7 @@ namespace OpenSim.Region.CoreModules.Scripting.ScriptModuleComms
///
public void RegisterConstant(string cname, object value)
{
- m_log.DebugFormat("[MODULE COMMANDS] register constant <{0}> with value {1}",cname,value.ToString());
+// m_log.DebugFormat("[MODULE COMMANDS] register constant <{0}> with value {1}",cname,value.ToString());
lock (m_constants)
{
m_constants.Add(cname,value);
--
cgit v1.1
From 946b37096698c818104405cb511579e810a62973 Mon Sep 17 00:00:00 2001
From: Diva Canto
Date: Mon, 5 Aug 2013 14:21:17 -0700
Subject: Child agent updates: remove the dependency on the root agent's camera
position. That was a complete overkill that is unnecessary at this point.
---
OpenSim/Region/Framework/Scenes/ScenePresence.cs | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
(limited to 'OpenSim/Region')
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index 456c8cc..0ba2dab 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -2989,8 +2989,7 @@ namespace OpenSim.Region.Framework.Scenes
}
// Minimum Draw distance is 64 meters, the Radius of the draw distance sphere is 32m
- if (Util.GetDistanceTo(AbsolutePosition, m_lastChildAgentUpdatePosition) >= Scene.ChildReprioritizationDistance ||
- Util.GetDistanceTo(CameraPosition, m_lastChildAgentUpdateCamPosition) >= Scene.ChildReprioritizationDistance)
+ if (Util.GetDistanceTo(AbsolutePosition, m_lastChildAgentUpdatePosition) >= Scene.ChildReprioritizationDistance)
{
m_lastChildAgentUpdatePosition = AbsolutePosition;
m_lastChildAgentUpdateCamPosition = CameraPosition;
--
cgit v1.1
From f9dc5815c4788aefed7eab01fa79709d3921e22a Mon Sep 17 00:00:00 2001
From: Justin Clark-Casey (justincc)
Date: Mon, 5 Aug 2013 23:15:30 +0100
Subject: For LLImageManagerTests, make tests execute under synchronous fire
and forget conditions.
I generally prefer this approach for regression tests because of the complexity of accounting for different threading conditions.
---
.../Linden/UDP/Tests/LLImageManagerTests.cs | 20 ++++++++++++--------
1 file changed, 12 insertions(+), 8 deletions(-)
(limited to 'OpenSim/Region')
diff --git a/OpenSim/Region/ClientStack/Linden/UDP/Tests/LLImageManagerTests.cs b/OpenSim/Region/ClientStack/Linden/UDP/Tests/LLImageManagerTests.cs
index 6aa8bcc..575e54c 100644
--- a/OpenSim/Region/ClientStack/Linden/UDP/Tests/LLImageManagerTests.cs
+++ b/OpenSim/Region/ClientStack/Linden/UDP/Tests/LLImageManagerTests.cs
@@ -54,6 +54,9 @@ namespace OpenSim.Region.ClientStack.LindenUDP.Tests
[TestFixtureSetUp]
public void FixtureInit()
{
+ // Don't allow tests to be bamboozled by asynchronous events. Execute everything on the same thread.
+ Util.FireAndForgetMethod = FireAndForgetMethod.None;
+
using (
Stream resource
= GetType().Assembly.GetManifestResourceStream(
@@ -73,6 +76,14 @@ namespace OpenSim.Region.ClientStack.LindenUDP.Tests
}
}
+ [TestFixtureTearDown]
+ public void TearDown()
+ {
+ // We must set this back afterwards, otherwise later tests will fail since they're expecting multiple
+ // threads. Possibly, later tests should be rewritten not to worry about such things.
+ Util.FireAndForgetMethod = Util.DefaultFireAndForgetMethod;
+ }
+
[SetUp]
public override void SetUp()
{
@@ -106,14 +117,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP.Tests
args.requestSequence = 1;
llim.EnqueueReq(args);
-
- // We now have to wait and hit the processing wheel, because the decoding is async
- int i = 10;
- while (i-- > 0)
- {
- llim.ProcessImageQueue(20);
- Thread.Sleep(100);
- }
+ llim.ProcessImageQueue(20);
Assert.That(tc.SentImageDataPackets.Count, Is.EqualTo(1));
}
--
cgit v1.1
From 3194ffdab8d54723ad1546846c1d45472d6a8464 Mon Sep 17 00:00:00 2001
From: Diva Canto
Date: Wed, 7 Aug 2013 08:01:59 -0700
Subject: Fixed incomplete commit r/23317 -- see_into_region. Put the guard
around estate bans also, and delete the obsolete config var.
---
OpenSim/Region/Application/ConfigurationLoader.cs | 1 -
OpenSim/Region/Framework/Scenes/Scene.cs | 32 +++++++++++------------
2 files changed, 16 insertions(+), 17 deletions(-)
(limited to 'OpenSim/Region')
diff --git a/OpenSim/Region/Application/ConfigurationLoader.cs b/OpenSim/Region/Application/ConfigurationLoader.cs
index fc3999f..3e93638 100644
--- a/OpenSim/Region/Application/ConfigurationLoader.cs
+++ b/OpenSim/Region/Application/ConfigurationLoader.cs
@@ -337,7 +337,6 @@ namespace OpenSim
config.Set("physics", "OpenDynamicsEngine");
config.Set("meshing", "Meshmerizer");
config.Set("physical_prim", true);
- config.Set("see_into_this_sim_from_neighbor", true);
config.Set("serverside_object_permissions", true);
config.Set("storage_plugin", "OpenSim.Data.SQLite.dll");
config.Set("storage_connection_string", "URI=file:OpenSim.db,version=3");
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs
index dec493b..503b81a 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.cs
@@ -4013,28 +4013,28 @@ namespace OpenSim.Region.Framework.Scenes
}
}
- if (RegionInfo.EstateSettings != null)
- {
- if (RegionInfo.EstateSettings.IsBanned(agent.AgentID))
- {
- m_log.WarnFormat("[CONNECTION BEGIN]: Denied access to: {0} ({1} {2}) at {3} because the user is on the banlist",
- agent.AgentID, agent.firstname, agent.lastname, RegionInfo.RegionName);
- reason = String.Format("Denied access to region {0}: You have been banned from that region.",
- RegionInfo.RegionName);
- return false;
- }
- }
- else
- {
- m_log.ErrorFormat("[CONNECTION BEGIN]: Estate Settings is null!");
- }
-
// We only test the things below when we want to cut off
// child agents from being present in the scene for which their root
// agent isn't allowed. Otherwise, we allow child agents. The test for
// the root is done elsewhere (QueryAccess)
if (!bypassAccessControl)
{
+ if (RegionInfo.EstateSettings != null)
+ {
+ if (RegionInfo.EstateSettings.IsBanned(agent.AgentID))
+ {
+ m_log.WarnFormat("[CONNECTION BEGIN]: Denied access to: {0} ({1} {2}) at {3} because the user is on the banlist",
+ agent.AgentID, agent.firstname, agent.lastname, RegionInfo.RegionName);
+ reason = String.Format("Denied access to region {0}: You have been banned from that region.",
+ RegionInfo.RegionName);
+ return false;
+ }
+ }
+ else
+ {
+ m_log.ErrorFormat("[CONNECTION BEGIN]: Estate Settings is null!");
+ }
+
List agentGroups = new List();
if (m_groupsModule != null)
--
cgit v1.1
From a33a1ac958b3158c9ce009e5d2915c165fb11c23 Mon Sep 17 00:00:00 2001
From: Justin Clark-Casey (justincc)
Date: Wed, 7 Aug 2013 18:52:30 +0100
Subject: Add post-CreateAgent teleport cancellation/abortion functionality
from v1 transfer protocol into v2.
This stops OpenSimulator still trying to teleport the user if they hit cancel on the teleport screen or closed the viewer whilst the protocol was trying to create an agent on the remote region.
Ideally, the code may also attempt to tell the destination simulator that the agent should be removed (accounting for issues where the destination was not responding in the first place, etc.)
---
.../EntityTransfer/EntityTransferModule.cs | 21 +++++++++++++++++++++
1 file changed, 21 insertions(+)
(limited to 'OpenSim/Region')
diff --git a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs
index 96cd6b9..80c125a 100644
--- a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs
+++ b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs
@@ -956,6 +956,27 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
return;
}
+ if (m_entityTransferStateMachine.GetAgentTransferState(sp.UUID) == AgentTransferState.Cancelling)
+ {
+ m_interRegionTeleportCancels.Value++;
+
+ m_log.DebugFormat(
+ "[ENTITY TRANSFER MODULE]: Cancelled teleport of {0} to {1} from {2} after CreateAgent on client request",
+ sp.Name, finalDestination.RegionName, sp.Scene.Name);
+
+ return;
+ }
+ else if (m_entityTransferStateMachine.GetAgentTransferState(sp.UUID) == AgentTransferState.Aborting)
+ {
+ m_interRegionTeleportAborts.Value++;
+
+ m_log.DebugFormat(
+ "[ENTITY TRANSFER MODULE]: Aborted teleport of {0} to {1} from {2} after CreateAgent due to previous client close.",
+ sp.Name, finalDestination.RegionName, sp.Scene.Name);
+
+ return;
+ }
+
// Past this point we have to attempt clean up if the teleport fails, so update transfer state.
m_entityTransferStateMachine.UpdateInTransit(sp.UUID, AgentTransferState.Transferring);
--
cgit v1.1
From b10710d4a5f7fb33ee9b90aefac16ac3d4647db6 Mon Sep 17 00:00:00 2001
From: Justin Clark-Casey (justincc)
Date: Wed, 7 Aug 2013 23:17:31 +0100
Subject: minor: add some method doc to ScenePresence fields used for entity
transfer, add minor details to some log messages, rename a misleading local
variable name.
No functional changes.
---
.../EntityTransfer/EntityTransferModule.cs | 14 +++++++----
OpenSim/Region/Framework/Scenes/Scene.cs | 26 +++++++++++++--------
OpenSim/Region/Framework/Scenes/ScenePresence.cs | 27 ++++++++++++++--------
3 files changed, 42 insertions(+), 25 deletions(-)
(limited to 'OpenSim/Region')
diff --git a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs
index 80c125a..01ef710 100644
--- a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs
+++ b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs
@@ -688,8 +688,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
if (version.Equals("SIMULATION/0.2"))
TransferAgent_V2(sp, agentCircuit, reg, finalDestination, endPoint, teleportFlags, oldRegionX, newRegionX, oldRegionY, newRegionY, version, out reason);
else
- TransferAgent_V1(sp, agentCircuit, reg, finalDestination, endPoint, teleportFlags, oldRegionX, newRegionX, oldRegionY, newRegionY, version, out reason);
-
+ TransferAgent_V1(sp, agentCircuit, reg, finalDestination, endPoint, teleportFlags, oldRegionX, newRegionX, oldRegionY, newRegionY, version, out reason);
}
private void TransferAgent_V1(ScenePresence sp, AgentCircuitData agentCircuit, GridRegion reg, GridRegion finalDestination,
@@ -698,7 +697,10 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
ulong destinationHandle = finalDestination.RegionHandle;
AgentCircuitData currentAgentCircuit = sp.Scene.AuthenticateHandler.GetAgentCircuitData(sp.ControllingClient.CircuitCode);
- m_log.DebugFormat("[ENTITY TRANSFER MODULE]: Using TP V1");
+ m_log.DebugFormat(
+ "[ENTITY TRANSFER MODULE]: Using TP V1 for {0} going from {1} to {2}",
+ sp.Name, Scene.Name, finalDestination.RegionName);
+
// Let's create an agent there if one doesn't exist yet.
// NOTE: logout will always be false for a non-HG teleport.
bool logout = false;
@@ -1079,20 +1081,22 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
if (!sp.DoNotCloseAfterTeleport)
{
// OK, it got this agent. Let's close everything
- m_log.DebugFormat("[ENTITY TRANSFER MODULE]: Closing in agent {0} in region {1}", sp.Name, Scene.RegionInfo.RegionName);
+ m_log.DebugFormat("[ENTITY TRANSFER MODULE]: Closing in agent {0} in region {1}", sp.Name, Scene.Name);
sp.CloseChildAgents(newRegionX, newRegionY);
sp.Scene.IncomingCloseAgent(sp.UUID, false);
}
else
{
- m_log.DebugFormat("[ENTITY TRANSFER MODULE]: Not closing agent {0}, user is back in {0}", sp.Name, Scene.RegionInfo.RegionName);
+ m_log.DebugFormat("[ENTITY TRANSFER MODULE]: Not closing agent {0}, user is back in {0}", sp.Name, Scene.Name);
sp.DoNotCloseAfterTeleport = false;
}
}
else
+ {
// now we have a child agent in this region.
sp.Reset();
+ }
}
///
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs
index 503b81a..56cd57e 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.cs
@@ -4222,36 +4222,42 @@ namespace OpenSim.Region.Framework.Scenes
}
// We have to wait until the viewer contacts this region
- // after receiving the EnableSimulator HTTP Event Queue message. This triggers the viewer to send
+ // after receiving the EnableSimulator HTTP Event Queue message (for the v1 teleport protocol)
+ // or TeleportFinish (for the v2 teleport protocol). This triggers the viewer to send
// a UseCircuitCode packet which in turn calls AddNewClient which finally creates the ScenePresence.
- ScenePresence childAgentUpdate = WaitGetScenePresence(cAgentData.AgentID);
+ ScenePresence sp = WaitGetScenePresence(cAgentData.AgentID);
- if (childAgentUpdate != null)
+ if (sp != null)
{
- if (cAgentData.SessionID != childAgentUpdate.ControllingClient.SessionId)
+ if (cAgentData.SessionID != sp.ControllingClient.SessionId)
{
- m_log.WarnFormat("[SCENE]: Attempt to update agent {0} with invalid session id {1} (possibly from simulator in older version; tell them to update).", childAgentUpdate.UUID, cAgentData.SessionID);
+ m_log.WarnFormat(
+ "[SCENE]: Attempt to update agent {0} with invalid session id {1} (possibly from simulator in older version; tell them to update).",
+ sp.UUID, cAgentData.SessionID);
+
Console.WriteLine(String.Format("[SCENE]: Attempt to update agent {0} ({1}) with invalid session id {2}",
- childAgentUpdate.UUID, childAgentUpdate.ControllingClient.SessionId, cAgentData.SessionID));
+ sp.UUID, sp.ControllingClient.SessionId, cAgentData.SessionID));
}
- childAgentUpdate.ChildAgentDataUpdate(cAgentData);
+ sp.ChildAgentDataUpdate(cAgentData);
int ntimes = 20;
if (cAgentData.SenderWantsToWaitForRoot)
{
- while (childAgentUpdate.IsChildAgent && ntimes-- > 0)
+ while (sp.IsChildAgent && ntimes-- > 0)
Thread.Sleep(1000);
m_log.DebugFormat(
"[SCENE]: Found presence {0} {1} {2} in {3} after {4} waits",
- childAgentUpdate.Name, childAgentUpdate.UUID, childAgentUpdate.IsChildAgent ? "child" : "root", RegionInfo.RegionName, 20 - ntimes);
+ sp.Name, sp.UUID, sp.IsChildAgent ? "child" : "root", Name, 20 - ntimes);
- if (childAgentUpdate.IsChildAgent)
+ if (sp.IsChildAgent)
return false;
}
+
return true;
}
+
return false;
}
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index 0ba2dab..7fd1302 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -285,10 +285,24 @@ namespace OpenSim.Region.Framework.Scenes
///
private Vector3 posLastSignificantMove;
- // For teleports and crossings callbacks
+ #region For teleports and crossings callbacks
+
+ ///
+ /// In the V1 teleport protocol, the destination simulator sends ReleaseAgent to this address.
+ ///
string m_callbackURI;
+
UUID m_originRegionID;
+ ///
+ /// Used by the entity transfer module to signal when the presence should not be closed because a subsequent
+ /// teleport is reusing the connection.
+ ///
+ /// May be refactored or move somewhere else soon.
+ public bool DoNotCloseAfterTeleport { get; set; }
+
+ #endregion
+
///
/// Script engines present in the scene
///
@@ -717,13 +731,6 @@ namespace OpenSim.Region.Framework.Scenes
}
}
- ///
- /// Used by the entity transfer module to signal when the presence should not be closed because a subsequent
- /// teleport is reusing the connection.
- ///
- /// May be refactored or move somewhere else soon.
- public bool DoNotCloseAfterTeleport { get; set; }
-
private float m_speedModifier = 1.0f;
public float SpeedModifier
@@ -1325,14 +1332,14 @@ namespace OpenSim.Region.Framework.Scenes
int count = 20;
while (m_originRegionID.Equals(UUID.Zero) && count-- > 0)
{
- m_log.DebugFormat("[SCENE PRESENCE]: Agent {0} waiting for update in {1}", client.Name, Scene.RegionInfo.RegionName);
+ m_log.DebugFormat("[SCENE PRESENCE]: Agent {0} waiting for update in {1}", client.Name, Scene.Name);
Thread.Sleep(200);
}
if (m_originRegionID.Equals(UUID.Zero))
{
// Movement into region will fail
- m_log.WarnFormat("[SCENE PRESENCE]: Update agent {0} never arrived", client.Name);
+ m_log.WarnFormat("[SCENE PRESENCE]: Update agent {0} never arrived in {1}", client.Name, Scene.Name);
return false;
}
--
cgit v1.1