From 1d9d39328d9b1cdbde81fa78b6581d4d09ae4176 Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Tue, 4 Jun 2024 09:05:03 +0100 Subject: [PATCH] add osTemperatureToLinearColor() --- .../Shared/Api/Implementation/OSSL_Api.cs | 34 +++++++++++++++++++ .../Shared/Api/Interface/IOSSL_Api.cs | 1 + .../Shared/Api/Runtime/OSSL_Stub.cs | 6 ++++ 3 files changed, 41 insertions(+) diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs index 6604c15d14..5b83c0f83f 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs @@ -6589,5 +6589,39 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api return LSL_Vector.Zero; } + + public LSL_Vector osTemperatureToLinearColor(LSL_Float dtemp) + { + float temp = (float)dtemp.value; + if (temp <= 1000f) + return new LSL_Vector(1.0, 0.0401, 0); + else if (temp >= 40000f) + return new LSL_Vector(0.3277, 0.5022, 1.0); + + float green; + if (temp < 6600f) + { + green = temp - 1000f; + green = ((((-7.87308e-13f * green) - 7.10085e-9f) * green) + 0.00022693f) * green + 0.0374249f; + green = Math.Clamp(green, 0, 1.0f); + + if (temp <= 19.0f) + return new LSL_Vector(1.0, green, 0); + + float blue = temp - 1900f; + blue = ((((-5.97E-12f * blue) + 5.49E-08f) * blue) + 8.85465E-05f) * blue - 0.0058959f; + blue = Math.Clamp(blue, 0f, 1.0f); + + return new LSL_Vector(1.0, green, blue); + } + + temp = 0.01f * (temp - 6000f); + float red = 1.897315f * MathF.Pow(temp, -0.346837f) + 0.0622044f; + red = Math.Clamp(red, 0, 1.0f); + + green = 1.261989f * MathF.Pow(temp, -0.251708f) + 0.200836f; + green = Math.Clamp(green, 0, 1.0f); + return new LSL_Vector(red, green, 1.0f); + } } } \ No newline at end of file diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs index ea38af8a65..259717059a 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs @@ -627,5 +627,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces LSL_String osAESDecrypt(string secret, string encryptedText); LSL_String osAESDecryptFrom(string secret, string encryptedText, string ivString); vector osGetLinkColor(LSL_Integer linknum, LSL_Integer face); + vector osTemperatureToLinearColor(LSL_Float dtemp); } } diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs index a76385c48d..36eb3a7275 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs @@ -1807,5 +1807,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase { return m_OSSL_Functions.osGetLinkColor(link, face); } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public vector osTemperatureToLinearColor(LSL_Float dtemp) + { + return m_OSSL_Functions.osTemperatureToLinearColor(dtemp); + } } }