* Adds Top Colliders when using ODE. Access it from the estate tools/debug tab.
parent
29092d3999
commit
042c9ed4d8
|
@ -610,6 +610,8 @@ namespace OpenSim.Framework
|
|||
|
||||
public delegate void ForceReleaseControls(IClientAPI remoteClient, LLUUID agentID);
|
||||
|
||||
public delegate void GodLandStatRequest(int parcelID, uint reportType, uint requestflags, string filter, IClientAPI remoteClient);
|
||||
|
||||
//Estate Requests
|
||||
public delegate void DetailedEstateDataRequest(IClientAPI remoteClient, LLUUID invoice);
|
||||
public delegate void SetEstateFlagsRequest(bool blockTerraform, bool noFly, bool allowDamage, bool blockLandResell, int maxAgents, float objectBonusFactor, int matureLevel, bool restrictPushObject, bool allowParcelChanges);
|
||||
|
@ -626,6 +628,7 @@ namespace OpenSim.Framework
|
|||
public delegate void EstateDebugRegionRequest(IClientAPI remoteClient, LLUUID invoice, LLUUID senderID, bool scripted, bool collisionEvents, bool physics);
|
||||
public delegate void EstateTeleportOneUserHomeRequest(IClientAPI remoteClient, LLUUID invoice, LLUUID senderID, LLUUID prey);
|
||||
|
||||
|
||||
public interface IClientAPI
|
||||
{
|
||||
LLVector3 StartPos { get; set; }
|
||||
|
@ -801,6 +804,7 @@ namespace OpenSim.Framework
|
|||
event AgentSit OnUndo;
|
||||
|
||||
event ForceReleaseControls OnForceReleaseControls;
|
||||
event GodLandStatRequest OnLandStatRequest;
|
||||
|
||||
event DetailedEstateDataRequest OnDetailedEstateDataRequest;
|
||||
event SetEstateFlagsRequest OnSetEstateFlagsRequest;
|
||||
|
@ -989,6 +993,8 @@ namespace OpenSim.Framework
|
|||
|
||||
void SendGroupNameReply(LLUUID groupLLUID, string GroupName);
|
||||
|
||||
void SendLandStatReply(uint reportType, uint requestFlags, uint resultCount, LandStatReportItem[] lsrpia);
|
||||
|
||||
byte[] GetThrottlesPacked(float multiplier);
|
||||
|
||||
|
||||
|
|
|
@ -0,0 +1,54 @@
|
|||
/*
|
||||
* 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 OpenSim 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 System.Collections.Generic;
|
||||
using System.Text;
|
||||
using libsecondlife;
|
||||
|
||||
|
||||
namespace OpenSim.Framework
|
||||
{
|
||||
public class LandStatReportItem
|
||||
{
|
||||
public float LocationX;
|
||||
public float LocationY;
|
||||
public float LocationZ;
|
||||
public string OwnerName;
|
||||
public float Score;
|
||||
public LLUUID TaskID;
|
||||
public uint TaskLocalID;
|
||||
public string TaskName;
|
||||
|
||||
public LandStatReportItem()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}
|
|
@ -250,6 +250,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
|||
|
||||
private ForceReleaseControls handlerForceReleaseControls = null;
|
||||
|
||||
private GodLandStatRequest handlerLandStatRequest = null;
|
||||
|
||||
private UUIDNameRequest handlerUUIDGroupNameRequest = null;
|
||||
|
||||
private RequestObjectPropertiesFamily handlerObjectGroupRequest = null;
|
||||
|
@ -842,6 +844,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
|||
|
||||
public event ForceReleaseControls OnForceReleaseControls;
|
||||
|
||||
public event GodLandStatRequest OnLandStatRequest;
|
||||
|
||||
public event RequestObjectPropertiesFamily OnObjectGroupRequest;
|
||||
|
||||
public event DetailedEstateDataRequest OnDetailedEstateDataRequest;
|
||||
|
@ -5641,11 +5645,35 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
|||
OnEstateTeleportOneUserHomeRequest(this,invoice,SenderID,Prey);
|
||||
}
|
||||
break;
|
||||
case "colliders":
|
||||
handlerLandStatRequest = OnLandStatRequest;
|
||||
if (handlerLandStatRequest != null)
|
||||
{
|
||||
handlerLandStatRequest(0, 1, 0, "", this);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
m_log.Error("EstateOwnerMessage: Unknown method requested\n" + messagePacket.ToString());
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case PacketType.LandStatRequest:
|
||||
LandStatRequestPacket lsrp = (LandStatRequestPacket)Pack;
|
||||
|
||||
handlerLandStatRequest = OnLandStatRequest;
|
||||
if (handlerLandStatRequest != null)
|
||||
{
|
||||
handlerLandStatRequest(lsrp.RequestData.ParcelLocalID,lsrp.RequestData.ReportType,lsrp.RequestData.RequestFlags,Helpers.FieldToUTF8String(lsrp.RequestData.Filter),this);
|
||||
}
|
||||
//int parcelID, uint reportType, uint requestflags, string filter
|
||||
|
||||
//lsrp.RequestData.ParcelLocalID;
|
||||
//lsrp.RequestData.ReportType; // 1 = colliders, 0 = scripts
|
||||
//lsrp.RequestData.RequestFlags;
|
||||
//lsrp.RequestData.Filter;
|
||||
|
||||
break;
|
||||
|
||||
case PacketType.RequestRegionInfo:
|
||||
RequestRegionInfoPacket.AgentDataBlock mPacket = ((RequestRegionInfoPacket)Pack).AgentData;
|
||||
|
||||
|
@ -5982,6 +6010,34 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
|||
pack.UUIDNameBlock = uidnameblock;
|
||||
OutPacket(pack, ThrottleOutPacketType.Task);
|
||||
}
|
||||
|
||||
public void SendLandStatReply(uint reportType, uint requestFlags, uint resultCount, LandStatReportItem[] lsrpia)
|
||||
{
|
||||
LandStatReplyPacket lsrp = new LandStatReplyPacket();
|
||||
LandStatReplyPacket.RequestDataBlock lsreqdpb = new LandStatReplyPacket.RequestDataBlock();
|
||||
LandStatReplyPacket.ReportDataBlock[] lsrepdba = new LandStatReplyPacket.ReportDataBlock[lsrpia.Length];
|
||||
//LandStatReplyPacket.ReportDataBlock lsrepdb = new LandStatReplyPacket.ReportDataBlock();
|
||||
// lsrepdb.
|
||||
lsrp.RequestData.ReportType = reportType;
|
||||
lsrp.RequestData.RequestFlags = requestFlags;
|
||||
lsrp.RequestData.TotalObjectCount = resultCount;
|
||||
for (int i = 0; i < lsrpia.Length; i++)
|
||||
{
|
||||
LandStatReplyPacket.ReportDataBlock lsrepdb = new LandStatReplyPacket.ReportDataBlock();
|
||||
lsrepdb.LocationX = lsrpia[i].LocationX;
|
||||
lsrepdb.LocationY = lsrpia[i].LocationY;
|
||||
lsrepdb.LocationZ = lsrpia[i].LocationZ;
|
||||
lsrepdb.Score = lsrpia[i].Score;
|
||||
lsrepdb.TaskID = lsrpia[i].TaskID;
|
||||
lsrepdb.TaskLocalID = lsrpia[i].TaskLocalID;
|
||||
lsrepdb.TaskName = Helpers.StringToField(lsrpia[i].TaskName);
|
||||
lsrepdb.OwnerName = Helpers.StringToField(lsrpia[i].OwnerName);
|
||||
lsrepdba[i] = lsrepdb;
|
||||
}
|
||||
lsrp.ReportData = lsrepdba;
|
||||
OutPacket(lsrp, ThrottleOutPacketType.Task);
|
||||
}
|
||||
|
||||
public ClientInfo GetClientInfo()
|
||||
{
|
||||
//MainLog.Instance.Verbose("CLIENT", "GetClientInfo BGN");
|
||||
|
|
|
@ -311,6 +311,44 @@ namespace OpenSim.Region.Environment.Modules.World.Estate
|
|||
{
|
||||
remote_client.sendEstateCovenantInformation();
|
||||
}
|
||||
private void HandleLandStatRequest(int parcelID, uint reportType, uint requestFlags, string filter, IClientAPI remoteClient)
|
||||
{
|
||||
Dictionary<uint, float> colliders = m_scene.PhysicsScene.GetTopColliders();
|
||||
|
||||
List<LandStatReportItem> collidera = new List<LandStatReportItem>();
|
||||
lock (colliders)
|
||||
{
|
||||
foreach (uint obj in colliders.Keys)
|
||||
{
|
||||
SceneObjectPart prt = m_scene.GetSceneObjectPart(obj);
|
||||
if (prt != null)
|
||||
{
|
||||
if (prt.ParentGroup != null)
|
||||
{
|
||||
SceneObjectGroup sog = prt.ParentGroup;
|
||||
if (sog != null)
|
||||
{
|
||||
LandStatReportItem lsri = new LandStatReportItem();
|
||||
lsri.LocationX = sog.AbsolutePosition.X;
|
||||
lsri.LocationY = sog.AbsolutePosition.Y;
|
||||
lsri.LocationZ = sog.AbsolutePosition.Z;
|
||||
lsri.Score = colliders[obj];
|
||||
lsri.TaskID = sog.UUID;
|
||||
lsri.TaskLocalID = sog.LocalId;
|
||||
lsri.TaskName = sog.GetPartName(obj);
|
||||
lsri.OwnerName = m_scene.CommsManager.UUIDNameRequestString(sog.OwnerID);
|
||||
|
||||
|
||||
collidera.Add(lsri);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
remoteClient.SendLandStatReply(reportType, requestFlags, (uint)collidera.Count,collidera.ToArray());
|
||||
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
|
@ -435,6 +473,7 @@ namespace OpenSim.Region.Environment.Modules.World.Estate
|
|||
|
||||
client.OnRegionInfoRequest += HandleRegionInfoRequest;
|
||||
client.OnEstateCovenantRequest += HandleEstateCovenantRequest;
|
||||
client.OnLandStatRequest += HandleLandStatRequest;
|
||||
sendRegionHandshake(client);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -271,7 +271,7 @@ namespace OpenSim.Region.Environment.Modules.World.NPC
|
|||
public event AgentSit OnUndo;
|
||||
|
||||
public event ForceReleaseControls OnForceReleaseControls;
|
||||
|
||||
public event GodLandStatRequest OnLandStatRequest;
|
||||
public event RequestObjectPropertiesFamily OnObjectGroupRequest;
|
||||
|
||||
public event DetailedEstateDataRequest OnDetailedEstateDataRequest;
|
||||
|
@ -764,6 +764,10 @@ namespace OpenSim.Region.Environment.Modules.World.NPC
|
|||
public void SendGroupNameReply(LLUUID groupLLUID, string GroupName)
|
||||
{
|
||||
}
|
||||
|
||||
public void SendLandStatReply(uint reportType, uint requestFlags, uint resultCount, LandStatReportItem[] lsrpia)
|
||||
{
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
|
|
|
@ -175,6 +175,8 @@ namespace OpenSim.Region.Examples.SimpleModule
|
|||
public event AgentSit OnUndo;
|
||||
|
||||
public event ForceReleaseControls OnForceReleaseControls;
|
||||
|
||||
public event GodLandStatRequest OnLandStatRequest;
|
||||
public event RequestObjectPropertiesFamily OnObjectGroupRequest;
|
||||
|
||||
public event DetailedEstateDataRequest OnDetailedEstateDataRequest;
|
||||
|
@ -761,5 +763,10 @@ namespace OpenSim.Region.Examples.SimpleModule
|
|||
public void SendGroupNameReply(LLUUID groupLLUID, string GroupName)
|
||||
{
|
||||
}
|
||||
|
||||
public void SendLandStatReply(uint reportType, uint requestFlags, uint resultCount, LandStatReportItem[] lsrpia)
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -198,6 +198,11 @@ namespace OpenSim.Region.Physics.BasicPhysicsPlugin
|
|||
public override void DeleteTerrain()
|
||||
{
|
||||
}
|
||||
public override Dictionary<uint, float> GetTopColliders()
|
||||
{
|
||||
Dictionary<uint, float> returncolliders = new Dictionary<uint, float>();
|
||||
return returncolliders;
|
||||
}
|
||||
}
|
||||
|
||||
public class BasicActor : PhysicsActor
|
||||
|
@ -348,6 +353,7 @@ namespace OpenSim.Region.Physics.BasicPhysicsPlugin
|
|||
public override float CollisionScore
|
||||
{
|
||||
get { return 0f; }
|
||||
set { }
|
||||
}
|
||||
|
||||
public override Quaternion Orientation
|
||||
|
|
|
@ -549,6 +549,12 @@ namespace OpenSim.Region.Physics.BulletXPlugin
|
|||
|
||||
}
|
||||
|
||||
public override Dictionary<uint, float> GetTopColliders()
|
||||
{
|
||||
Dictionary<uint, float> returncolliders = new Dictionary<uint, float>();
|
||||
return returncolliders;
|
||||
}
|
||||
|
||||
public override void SetWaterLevel(float baseheight)
|
||||
{
|
||||
|
||||
|
@ -917,6 +923,7 @@ namespace OpenSim.Region.Physics.BulletXPlugin
|
|||
public override float CollisionScore
|
||||
{
|
||||
get { return 0f; }
|
||||
set { }
|
||||
}
|
||||
public override PhysicsVector Size
|
||||
{
|
||||
|
|
|
@ -176,7 +176,7 @@ namespace OpenSim.Region.Physics.Manager
|
|||
public abstract PhysicsVector GeometricCenter { get; }
|
||||
public abstract PhysicsVector CenterOfMass { get; }
|
||||
public abstract PhysicsVector Velocity { get; set; }
|
||||
public abstract float CollisionScore { get;}
|
||||
public abstract float CollisionScore { get; set;}
|
||||
public abstract PhysicsVector Acceleration { get; }
|
||||
public abstract Quaternion Orientation { get; set; }
|
||||
public abstract int PhysicsActorType { get; set; }
|
||||
|
@ -208,8 +208,10 @@ namespace OpenSim.Region.Physics.Manager
|
|||
public override bool Stopped
|
||||
{
|
||||
get{ return false; }
|
||||
|
||||
}
|
||||
|
||||
|
||||
public override PhysicsVector Position
|
||||
{
|
||||
get { return PhysicsVector.Zero; }
|
||||
|
@ -300,6 +302,7 @@ namespace OpenSim.Region.Physics.Manager
|
|||
public override float CollisionScore
|
||||
{
|
||||
get { return 0f; }
|
||||
set { }
|
||||
}
|
||||
|
||||
public override void CrossingFailure()
|
||||
|
|
|
@ -25,6 +25,7 @@
|
|||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
using System.Collections.Generic;
|
||||
using System.Reflection;
|
||||
using Axiom.Math;
|
||||
using log4net;
|
||||
|
@ -86,6 +87,8 @@ namespace OpenSim.Region.Physics.Manager
|
|||
|
||||
public abstract void Dispose();
|
||||
|
||||
public abstract Dictionary<uint, float> GetTopColliders();
|
||||
|
||||
public abstract bool IsThreaded { get; }
|
||||
|
||||
private class NullPhysicsScene : PhysicsScene
|
||||
|
@ -170,6 +173,12 @@ namespace OpenSim.Region.Physics.Manager
|
|||
public override void Dispose()
|
||||
{
|
||||
}
|
||||
|
||||
public override Dictionary<uint,float> GetTopColliders()
|
||||
{
|
||||
Dictionary<uint, float> returncolliders = new Dictionary<uint, float>();
|
||||
return returncolliders;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -570,6 +570,7 @@ namespace OpenSim.Region.Physics.OdePlugin
|
|||
public override float CollisionScore
|
||||
{
|
||||
get { return 0f; }
|
||||
set { }
|
||||
}
|
||||
|
||||
public override bool Kinematic
|
||||
|
|
|
@ -124,7 +124,7 @@ namespace OpenSim.Region.Physics.OdePlugin
|
|||
private bool m_throttleUpdates = false;
|
||||
private int throttleCounter = 0;
|
||||
public int m_interpenetrationcount = 0;
|
||||
public int m_collisionscore = 0;
|
||||
public float m_collisionscore = 0;
|
||||
public int m_roundsUnderMotionThreshold = 0;
|
||||
private int m_crossingfailures = 0;
|
||||
|
||||
|
@ -243,7 +243,7 @@ namespace OpenSim.Region.Physics.OdePlugin
|
|||
// is physical or the object is modified somehow *IN THE FUTURE*
|
||||
// without this, if an avatar selects prim, they can walk right
|
||||
// through it while it's selected
|
||||
|
||||
m_collisionscore = 0;
|
||||
if ((m_isphysical && !_zeroFlag) || !value)
|
||||
{
|
||||
m_taintselected = value;
|
||||
|
@ -1783,6 +1783,7 @@ namespace OpenSim.Region.Physics.OdePlugin
|
|||
public override float CollisionScore
|
||||
{
|
||||
get { return m_collisionscore; }
|
||||
set { m_collisionscore = value; }
|
||||
}
|
||||
|
||||
public override bool Kinematic
|
||||
|
|
|
@ -555,6 +555,13 @@ namespace OpenSim.Region.Physics.OdePlugin
|
|||
}
|
||||
|
||||
float max_collision_depth = 0f;
|
||||
if (p1.CollisionScore + count >= float.MaxValue)
|
||||
p1.CollisionScore = 0;
|
||||
p1.CollisionScore += count;
|
||||
|
||||
if (p2.CollisionScore + count >= float.MaxValue)
|
||||
p2.CollisionScore = 0;
|
||||
p2.CollisionScore += count;
|
||||
|
||||
for (int i = 0; i < count; i++)
|
||||
{
|
||||
|
@ -586,6 +593,7 @@ namespace OpenSim.Region.Physics.OdePlugin
|
|||
break;
|
||||
}
|
||||
|
||||
|
||||
// we don't want prim or avatar to explode
|
||||
|
||||
#region InterPenetration Handling - Unintended physics explosions
|
||||
|
@ -2162,5 +2170,27 @@ namespace OpenSim.Region.Physics.OdePlugin
|
|||
//d.CloseODE();
|
||||
}
|
||||
}
|
||||
public override Dictionary<uint, float> GetTopColliders()
|
||||
{
|
||||
Dictionary<uint, float> returncolliders = new Dictionary<uint, float>();
|
||||
int cnt = 0;
|
||||
lock (_prims)
|
||||
{
|
||||
foreach (OdePrim prm in _prims)
|
||||
{
|
||||
if (prm.CollisionScore > 0)
|
||||
{
|
||||
returncolliders.Add(prm.m_localID, prm.CollisionScore);
|
||||
cnt++;
|
||||
prm.CollisionScore = 0f;
|
||||
if (cnt > 25)
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return returncolliders;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -326,6 +326,12 @@ namespace OpenSim.Region.Physics.POSPlugin
|
|||
public override void DeleteTerrain()
|
||||
{
|
||||
}
|
||||
|
||||
public override Dictionary<uint, float> GetTopColliders()
|
||||
{
|
||||
Dictionary<uint, float> returncolliders = new Dictionary<uint, float>();
|
||||
return returncolliders;
|
||||
}
|
||||
}
|
||||
|
||||
public class POSCharacter : PhysicsActor
|
||||
|
@ -476,6 +482,7 @@ namespace OpenSim.Region.Physics.POSPlugin
|
|||
public override float CollisionScore
|
||||
{
|
||||
get { return 0f; }
|
||||
set { }
|
||||
}
|
||||
|
||||
public override Quaternion Orientation
|
||||
|
@ -663,6 +670,7 @@ namespace OpenSim.Region.Physics.POSPlugin
|
|||
public override float CollisionScore
|
||||
{
|
||||
get { return 0f; }
|
||||
set { }
|
||||
}
|
||||
|
||||
public override Quaternion Orientation
|
||||
|
|
|
@ -200,6 +200,12 @@ namespace OpenSim.Region.Physics.PhysXPlugin
|
|||
{
|
||||
scene.DeleteTerrain();
|
||||
}
|
||||
|
||||
public override Dictionary<uint, float> GetTopColliders()
|
||||
{
|
||||
Dictionary<uint, float> returncolliders = new Dictionary<uint, float>();
|
||||
return returncolliders;
|
||||
}
|
||||
}
|
||||
|
||||
public class PhysXCharacter : PhysicsActor
|
||||
|
@ -355,6 +361,7 @@ namespace OpenSim.Region.Physics.PhysXPlugin
|
|||
public override float CollisionScore
|
||||
{
|
||||
get { return 0f; }
|
||||
set { }
|
||||
}
|
||||
|
||||
public override bool Kinematic
|
||||
|
@ -593,6 +600,7 @@ namespace OpenSim.Region.Physics.PhysXPlugin
|
|||
public override float CollisionScore
|
||||
{
|
||||
get { return 0f; }
|
||||
set { }
|
||||
}
|
||||
|
||||
public override bool Kinematic
|
||||
|
|
Loading…
Reference in New Issue