diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index c048b7f6ef..efaac552c8 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs @@ -13884,7 +13884,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api if ((m_item.PermsMask & ScriptBaseClass.PERMISSION_TRACK_CAMERA) == 0) { - Error("llGetCameraAspect", "No permissions to track the camera"); + Error("llGetCameraFOV", "No permissions to track the camera"); return LSL_Float.Zero; } @@ -19561,6 +19561,54 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api return asset.ToString(); } + + public LSL_Integer llIsLinkGLTFMaterial(LSL_Integer linknum, LSL_Integer lface) + { + SceneObjectPart part; + if (linknum == ScriptBaseClass.LINK_ROOT) + part = m_host.ParentGroup.RootPart; + else if (linknum == ScriptBaseClass.LINK_THIS) + part = m_host; + else + part = m_host.ParentGroup.GetLinkNumPart(linknum); + if(part is null) + return 0; + + if (part.Shape.RenderMaterials is null || + part.Shape.RenderMaterials.entries is null || + part.Shape.RenderMaterials.entries.Length == 0) + return 0; + + int face = lface.value; + if (face == ScriptBaseClass.ALL_SIDES) + { + int nsides = GetNumberOfSides(part); + bool[] pbr = new bool[nsides]; + foreach(Primitive.RenderMaterials.RenderMaterialEntry re in part.Shape.RenderMaterials.entries) + { + if(re.te_index > 0 && re.te_index < pbr.Length && re.id.IsNotZero()) + pbr[re.te_index] = true; + } + foreach(bool b in pbr) + { + if (!b) + return 0; + } + return 1; + } + + if (face < 0) + return 0; + else if (face >= GetNumberOfSides(part)) + return 0; + foreach(Primitive.RenderMaterials.RenderMaterialEntry re in part.Shape.RenderMaterials.entries) + { + if(re.te_index == face) + return re.id.IsZero() ? 0 : 1; + } + return 0; + } + static string HMAC_SHA224(string key, string message) { const int blockSize = 64; diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/ILSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/ILSL_Api.cs index 54195ca971..21248069a2 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/ILSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/ILSL_Api.cs @@ -535,5 +535,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces LSL_String llHMAC(LSL_String private_key, LSL_String message, LSL_String algo); LSL_String llComputeHash(LSL_String message, LSL_String algo); LSL_String llGetRenderMaterial(LSL_Integer face); + LSL_Integer llIsLinkGLTFMaterial(LSL_Integer linknum, LSL_Integer face); } } diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Stub.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Stub.cs index 2d7fc63060..2cc373565b 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Stub.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Stub.cs @@ -2887,5 +2887,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase { return m_LSL_Functions.llGetRenderMaterial(face); } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public LSL_Integer llIsLinkGLTFMaterial(LSL_Integer linknum, LSL_Integer face) + { + return m_LSL_Functions.llIsLinkGLTFMaterial(linknum, face); + } + } }