Throttle llCastRay V3.
Signed-off-by: Michael Cerquoni <nebadon2025@gmail.com>fsassets
parent
edcba95ab5
commit
7d26815d0e
|
@ -28,6 +28,7 @@
|
||||||
using System;
|
using System;
|
||||||
using System.Collections;
|
using System.Collections;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.Diagnostics;
|
||||||
using System.Drawing;
|
using System.Drawing;
|
||||||
using System.Drawing.Imaging;
|
using System.Drawing.Imaging;
|
||||||
using System.Runtime.Remoting.Lifetime;
|
using System.Runtime.Remoting.Lifetime;
|
||||||
|
@ -234,6 +235,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
||||||
protected bool m_detectExitsInCastRay = false;
|
protected bool m_detectExitsInCastRay = false;
|
||||||
protected bool m_filterPartsInCastRay = false;
|
protected bool m_filterPartsInCastRay = false;
|
||||||
protected bool m_doAttachmentsInCastRay = 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
|
//An array of HTTP/1.1 headers that are not allowed to be used
|
||||||
//as custom headers by llHTTPRequest.
|
//as custom headers by llHTTPRequest.
|
||||||
|
@ -353,6 +360,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
||||||
m_detectExitsInCastRay = lslConfig.GetBoolean("DetectExitHitsInLlCastRay", m_detectExitsInCastRay);
|
m_detectExitsInCastRay = lslConfig.GetBoolean("DetectExitHitsInLlCastRay", m_detectExitsInCastRay);
|
||||||
m_filterPartsInCastRay = lslConfig.GetBoolean("FilterPartsInLlCastRay", m_filterPartsInCastRay);
|
m_filterPartsInCastRay = lslConfig.GetBoolean("FilterPartsInLlCastRay", m_filterPartsInCastRay);
|
||||||
m_doAttachmentsInCastRay = lslConfig.GetBoolean("DoAttachmentsInLlCastRay", m_doAttachmentsInCastRay);
|
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"];
|
IConfig smtpConfig = seConfigSource.Configs["SMTP"];
|
||||||
|
@ -14058,10 +14070,61 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public LSL_List llCastRayV3(LSL_Vector start, LSL_Vector end, LSL_List options)
|
public LSL_List llCastRayV3(LSL_Vector start, LSL_Vector end, LSL_List options)
|
||||||
{
|
{
|
||||||
// Initialize
|
|
||||||
m_host.AddScriptLPS(1);
|
m_host.AddScriptLPS(1);
|
||||||
List<RayHit> rayHits = new List<RayHit>();
|
|
||||||
LSL_List result = new LSL_List();
|
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;
|
float tol = m_floatToleranceInCastRay;
|
||||||
Vector3 pos1Ray = start;
|
Vector3 pos1Ray = start;
|
||||||
Vector3 pos2Ray = end;
|
Vector3 pos2Ray = end;
|
||||||
|
@ -14378,6 +14441,20 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
||||||
result.Add(new LSL_Vector(rayHit.Normal));
|
result.Add(new LSL_Vector(rayHit.Normal));
|
||||||
}
|
}
|
||||||
result.Add(new LSL_Integer(hitCount));
|
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;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -14411,6 +14488,17 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
||||||
public float Distance;
|
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>
|
/// <summary>
|
||||||
/// Helper to check if a ray intersects a shape bounding box.
|
/// Helper to check if a ray intersects a shape bounding box.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|
|
@ -1535,6 +1535,22 @@
|
||||||
; Detect attachments in llCastRay V3 if true
|
; Detect attachments in llCastRay V3 if true
|
||||||
DoAttachmentsInLlCastRay = false
|
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]
|
[DataSnapshot]
|
||||||
; The following set of configs pertains to search.
|
; The following set of configs pertains to search.
|
||||||
|
|
Loading…
Reference in New Issue