Throttle llCastRay V3.
Signed-off-by: Michael Cerquoni <nebadon2025@gmail.com>fsassets
parent
edcba95ab5
commit
7d26815d0e
|
@ -28,6 +28,7 @@
|
|||
using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.Drawing;
|
||||
using System.Drawing.Imaging;
|
||||
using System.Runtime.Remoting.Lifetime;
|
||||
|
@ -234,6 +235,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
|||
protected bool m_detectExitsInCastRay = false;
|
||||
protected bool m_filterPartsInCastRay = false;
|
||||
protected bool m_doAttachmentsInCastRay = false;
|
||||
protected int m_msThrottleInCastRay = 200;
|
||||
protected int m_msPerRegionInCastRay = 40;
|
||||
protected int m_msPerAvatarInCastRay = 10;
|
||||
protected int m_msMinInCastRay = 2;
|
||||
protected int m_msMaxInCastRay = 40;
|
||||
protected static List<CastRayCall> m_castRayCalls = new List<CastRayCall>();
|
||||
|
||||
//An array of HTTP/1.1 headers that are not allowed to be used
|
||||
//as custom headers by llHTTPRequest.
|
||||
|
@ -353,6 +360,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
|||
m_detectExitsInCastRay = lslConfig.GetBoolean("DetectExitHitsInLlCastRay", m_detectExitsInCastRay);
|
||||
m_filterPartsInCastRay = lslConfig.GetBoolean("FilterPartsInLlCastRay", m_filterPartsInCastRay);
|
||||
m_doAttachmentsInCastRay = lslConfig.GetBoolean("DoAttachmentsInLlCastRay", m_doAttachmentsInCastRay);
|
||||
m_msThrottleInCastRay = lslConfig.GetInt("ThrottleTimeInMsInLlCastRay", m_msThrottleInCastRay);
|
||||
m_msPerRegionInCastRay = lslConfig.GetInt("AvailableTimeInMsPerRegionInLlCastRay", m_msPerRegionInCastRay);
|
||||
m_msPerAvatarInCastRay = lslConfig.GetInt("AvailableTimeInMsPerAvatarInLlCastRay", m_msPerAvatarInCastRay);
|
||||
m_msMinInCastRay = lslConfig.GetInt("RequiredAvailableTimeInMsInLlCastRay", m_msMinInCastRay);
|
||||
m_msMaxInCastRay = lslConfig.GetInt("MaximumAvailableTimeInMsInLlCastRay", m_msMaxInCastRay);
|
||||
}
|
||||
|
||||
IConfig smtpConfig = seConfigSource.Configs["SMTP"];
|
||||
|
@ -14058,10 +14070,61 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
|||
/// </summary>
|
||||
public LSL_List llCastRayV3(LSL_Vector start, LSL_Vector end, LSL_List options)
|
||||
{
|
||||
// Initialize
|
||||
m_host.AddScriptLPS(1);
|
||||
List<RayHit> rayHits = new List<RayHit>();
|
||||
LSL_List result = new LSL_List();
|
||||
|
||||
// Prepare throttle data
|
||||
int calledMs = Environment.TickCount;
|
||||
Stopwatch stopWatch = new Stopwatch();
|
||||
stopWatch.Start();
|
||||
UUID regionId = World.RegionInfo.RegionID;
|
||||
UUID userId = UUID.Zero;
|
||||
int msAvailable = 0;
|
||||
// Throttle per owner when attachment or "vehicle" (sat upon)
|
||||
if (m_host.ParentGroup.IsAttachment || m_host.ParentGroup.GetSittingAvatars().Count > 0)
|
||||
{
|
||||
userId = m_host.OwnerID;
|
||||
msAvailable = m_msPerAvatarInCastRay;
|
||||
}
|
||||
// Throttle per parcel when not attachment or vehicle
|
||||
else
|
||||
{
|
||||
LandData land = World.GetLandData(m_host.GetWorldPosition());
|
||||
if (land != null)
|
||||
msAvailable = m_msPerRegionInCastRay * land.Area / 65536;
|
||||
}
|
||||
// Clamp for "oversized" parcels on varregions
|
||||
if (msAvailable > m_msMaxInCastRay)
|
||||
msAvailable = m_msMaxInCastRay;
|
||||
|
||||
// Check throttle data
|
||||
int fromCalledMs = calledMs - m_msThrottleInCastRay;
|
||||
lock (m_castRayCalls)
|
||||
{
|
||||
for (int i = m_castRayCalls.Count - 1; i >= 0; i--)
|
||||
{
|
||||
// Delete old calls from throttle data
|
||||
if (m_castRayCalls[i].CalledMs < fromCalledMs)
|
||||
m_castRayCalls.RemoveAt(i);
|
||||
// Use current region (in multi-region sims)
|
||||
else if (m_castRayCalls[i].RegionId == regionId)
|
||||
{
|
||||
// Reduce available time with recent calls
|
||||
if (m_castRayCalls[i].UserId == userId)
|
||||
msAvailable -= m_castRayCalls[i].UsedMs;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Return failure if not enough available time
|
||||
if (msAvailable < m_msMinInCastRay)
|
||||
{
|
||||
result.Add(new LSL_Integer(ScriptBaseClass.RCERR_CAST_TIME_EXCEEDED));
|
||||
return result;
|
||||
}
|
||||
|
||||
// Initialize
|
||||
List<RayHit> rayHits = new List<RayHit>();
|
||||
float tol = m_floatToleranceInCastRay;
|
||||
Vector3 pos1Ray = start;
|
||||
Vector3 pos2Ray = end;
|
||||
|
@ -14378,6 +14441,20 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
|||
result.Add(new LSL_Vector(rayHit.Normal));
|
||||
}
|
||||
result.Add(new LSL_Integer(hitCount));
|
||||
|
||||
// Add to throttle data
|
||||
stopWatch.Stop();
|
||||
CastRayCall castRayCall = new CastRayCall();
|
||||
castRayCall.RegionId = regionId;
|
||||
castRayCall.UserId = userId;
|
||||
castRayCall.CalledMs = calledMs;
|
||||
castRayCall.UsedMs = (int)stopWatch.ElapsedMilliseconds;
|
||||
lock (m_castRayCalls)
|
||||
{
|
||||
m_castRayCalls.Add(castRayCall);
|
||||
}
|
||||
|
||||
// Return hits
|
||||
return result;
|
||||
}
|
||||
|
||||
|
@ -14411,6 +14488,17 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
|||
public float Distance;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Struct for llCastRay throttle data.
|
||||
/// </summary>
|
||||
public struct CastRayCall
|
||||
{
|
||||
public UUID RegionId;
|
||||
public UUID UserId;
|
||||
public int CalledMs;
|
||||
public int UsedMs;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Helper to check if a ray intersects a shape bounding box.
|
||||
/// </summary>
|
||||
|
|
|
@ -1535,6 +1535,22 @@
|
|||
; Detect attachments in llCastRay V3 if true
|
||||
DoAttachmentsInLlCastRay = false
|
||||
|
||||
; Throttle period length in ms before which all old llCastRay use is discarded in llCastRay V3
|
||||
; The sum of AvailableTimeInMsPerRegionInLlCastRay and all AvailableTimeInMsPerAvatarInLlCastRay should not exceed this
|
||||
ThrottleTimeInMsInLlCastRay = 200
|
||||
|
||||
; Available time in ms for llCastRay per throttle period and 65536 m2 land area in llCastRay V3
|
||||
AvailableTimeInMsPerRegionInLlCastRay = 40
|
||||
|
||||
; Available time in ms for llCastRay per throttle period and avatar when script in attachment or vehicle in llCastRay V3
|
||||
AvailableTimeInMsPerAvatarInLlCastRay = 10
|
||||
|
||||
; Required available time in ms left to perform a new llCastRay in llCastRay V3
|
||||
RequiredAvailableTimeInMsInLlCastRay = 2
|
||||
|
||||
; Maximum available time in ms possible in llCastRay V3, not to get too high values with varregions
|
||||
MaximumAvailableTimeInMsInLlCastRay = 40
|
||||
|
||||
|
||||
[DataSnapshot]
|
||||
; The following set of configs pertains to search.
|
||||
|
|
Loading…
Reference in New Issue