diff options
author | Justin Clark-Casey (justincc) | 2012-04-13 22:34:36 +0100 |
---|---|---|
committer | Justin Clark-Casey (justincc) | 2012-04-13 22:34:36 +0100 |
commit | 1ad3fdb40ba86c6d0bcb9b06b5bb05004f670657 (patch) | |
tree | ccbd97c7ed18a0e6b9c5e6c771c6d7a2fca097e9 /OpenSim/Region/ScriptEngine | |
parent | Remove hardcoded god requirement from osSetRegionWaterHeight, osSetRegionSunS... (diff) | |
parent | Mantis 55025 Implement script time. (diff) | |
download | opensim-SC_OLD-1ad3fdb40ba86c6d0bcb9b06b5bb05004f670657.zip opensim-SC_OLD-1ad3fdb40ba86c6d0bcb9b06b5bb05004f670657.tar.gz opensim-SC_OLD-1ad3fdb40ba86c6d0bcb9b06b5bb05004f670657.tar.bz2 opensim-SC_OLD-1ad3fdb40ba86c6d0bcb9b06b5bb05004f670657.tar.xz |
Merge branch 'master' of ssh://opensimulator.org/var/git/opensim
Diffstat (limited to 'OpenSim/Region/ScriptEngine')
5 files changed, 119 insertions, 38 deletions
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index c38a52e..078a22a 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs | |||
@@ -10367,7 +10367,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
10367 | ret.Add(new LSL_Integer(av.RunningScriptCount() * 16384)); | 10367 | ret.Add(new LSL_Integer(av.RunningScriptCount() * 16384)); |
10368 | break; | 10368 | break; |
10369 | case ScriptBaseClass.OBJECT_SCRIPT_TIME: | 10369 | case ScriptBaseClass.OBJECT_SCRIPT_TIME: |
10370 | ret.Add(new LSL_Float(0)); | 10370 | ret.Add(new LSL_Float(av.ScriptExecutionTime() / 1000.0f)); |
10371 | break; | 10371 | break; |
10372 | case ScriptBaseClass.OBJECT_PRIM_EQUIVALENCE: | 10372 | case ScriptBaseClass.OBJECT_PRIM_EQUIVALENCE: |
10373 | ret.Add(new LSL_Integer(1)); | 10373 | ret.Add(new LSL_Integer(1)); |
@@ -10435,9 +10435,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
10435 | ret.Add(new LSL_Integer(obj.ParentGroup.RunningScriptCount() * 16384)); | 10435 | ret.Add(new LSL_Integer(obj.ParentGroup.RunningScriptCount() * 16384)); |
10436 | break; | 10436 | break; |
10437 | case ScriptBaseClass.OBJECT_SCRIPT_TIME: | 10437 | case ScriptBaseClass.OBJECT_SCRIPT_TIME: |
10438 | // Average cpu time per simulator frame expended on all scripts in the object | 10438 | // Average cpu time in seconds per simulator frame expended on all scripts in the object |
10439 | // Not currently available at Object level | 10439 | ret.Add(new LSL_Float(obj.ParentGroup.ScriptExecutionTime() / 1000.0f)); |
10440 | ret.Add(new LSL_Float(0)); | ||
10441 | break; | 10440 | break; |
10442 | case ScriptBaseClass.OBJECT_PRIM_EQUIVALENCE: | 10441 | case ScriptBaseClass.OBJECT_PRIM_EQUIVALENCE: |
10443 | // according to the SL wiki A prim or linkset will have prim | 10442 | // according to the SL wiki A prim or linkset will have prim |
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs index 2c0de93..72c1bf6 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs | |||
@@ -3038,5 +3038,60 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
3038 | 3038 | ||
3039 | return ScriptBaseClass.TRUE; | 3039 | return ScriptBaseClass.TRUE; |
3040 | } | 3040 | } |
3041 | |||
3042 | /// <summary> | ||
3043 | /// Sets terrain estate texture | ||
3044 | /// </summary> | ||
3045 | /// <param name="level"></param> | ||
3046 | /// <param name="texture"></param> | ||
3047 | /// <returns></returns> | ||
3048 | public void osSetTerrainTexture(int level, LSL_Key texture) | ||
3049 | { | ||
3050 | CheckThreatLevel(ThreatLevel.High, "osSetTerrainTexture"); | ||
3051 | |||
3052 | m_host.AddScriptLPS(1); | ||
3053 | //Check to make sure that the script's owner is the estate manager/master | ||
3054 | //World.Permissions.GenericEstatePermission( | ||
3055 | if (World.Permissions.IsGod(m_host.OwnerID)) | ||
3056 | { | ||
3057 | if (level < 0 || level > 3) | ||
3058 | return; | ||
3059 | |||
3060 | UUID textureID = new UUID(); | ||
3061 | if (!UUID.TryParse(texture, out textureID)) | ||
3062 | return; | ||
3063 | |||
3064 | // estate module is required | ||
3065 | IEstateModule estate = World.RequestModuleInterface<IEstateModule>(); | ||
3066 | if (estate != null) | ||
3067 | estate.setEstateTerrainBaseTexture(level, textureID); | ||
3068 | } | ||
3069 | } | ||
3070 | |||
3071 | /// <summary> | ||
3072 | /// Sets terrain heights of estate | ||
3073 | /// </summary> | ||
3074 | /// <param name="corner"></param> | ||
3075 | /// <param name="low"></param> | ||
3076 | /// <param name="high"></param> | ||
3077 | /// <returns></returns> | ||
3078 | public void osSetTerrainTextureHeight(int corner, double low, double high) | ||
3079 | { | ||
3080 | CheckThreatLevel(ThreatLevel.High, "osSetTerrainTextureHeight"); | ||
3081 | |||
3082 | m_host.AddScriptLPS(1); | ||
3083 | //Check to make sure that the script's owner is the estate manager/master | ||
3084 | //World.Permissions.GenericEstatePermission( | ||
3085 | if (World.Permissions.IsGod(m_host.OwnerID)) | ||
3086 | { | ||
3087 | if (corner < 0 || corner > 3) | ||
3088 | return; | ||
3089 | |||
3090 | // estate module is required | ||
3091 | IEstateModule estate = World.RequestModuleInterface<IEstateModule>(); | ||
3092 | if (estate != null) | ||
3093 | estate.setEstateTerrainTextureHeights(corner, (float)low, (float)high); | ||
3094 | } | ||
3095 | } | ||
3041 | } | 3096 | } |
3042 | } \ No newline at end of file | 3097 | } \ 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 30bd3ef..545bbee 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs | |||
@@ -234,5 +234,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces | |||
234 | 234 | ||
235 | LSL_Integer osInviteToGroup(LSL_Key agentId); | 235 | LSL_Integer osInviteToGroup(LSL_Key agentId); |
236 | LSL_Integer osEjectFromGroup(LSL_Key agentId); | 236 | LSL_Integer osEjectFromGroup(LSL_Key agentId); |
237 | |||
238 | void osSetTerrainTexture(int level, LSL_Key texture); | ||
239 | void osSetTerrainTextureHeight(int corner, double low, double high); | ||
237 | } | 240 | } |
238 | } | 241 | } |
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs index 680cefb4..b94b9bf 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs | |||
@@ -878,5 +878,15 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase | |||
878 | { | 878 | { |
879 | return m_OSSL_Functions.osEjectFromGroup(agentId); | 879 | return m_OSSL_Functions.osEjectFromGroup(agentId); |
880 | } | 880 | } |
881 | |||
882 | public void osSetTerrainTexture(int level, LSL_Key texture) | ||
883 | { | ||
884 | m_OSSL_Functions.osSetTerrainTexture(level, texture); | ||
885 | } | ||
886 | |||
887 | public void osSetTerrainTextureHeight(int corner, double low, double high) | ||
888 | { | ||
889 | m_OSSL_Functions.osSetTerrainTextureHeight(corner, low, high); | ||
890 | } | ||
881 | } | 891 | } |
882 | } | 892 | } |
diff --git a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs index 7712076..b7903d5 100644 --- a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs +++ b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs | |||
@@ -1907,45 +1907,59 @@ namespace OpenSim.Region.ScriptEngine.XEngine | |||
1907 | if (!topScripts.ContainsKey(si.LocalID)) | 1907 | if (!topScripts.ContainsKey(si.LocalID)) |
1908 | topScripts[si.RootLocalID] = 0; | 1908 | topScripts[si.RootLocalID] = 0; |
1909 | 1909 | ||
1910 | // long ticksElapsed = tickNow - si.MeasurementPeriodTickStart; | 1910 | topScripts[si.RootLocalID] += CalculateAdjustedExectionTime(si, tickNow); |
1911 | // float framesElapsed = ticksElapsed / (18.1818 * TimeSpan.TicksPerMillisecond); | 1911 | } |
1912 | 1912 | } | |
1913 | // Execution time of the script adjusted by it's measurement period to make scripts started at | ||
1914 | // different times comparable. | ||
1915 | // float adjustedExecutionTime | ||
1916 | // = (float)si.MeasurementPeriodExecutionTime | ||
1917 | // / ((float)(tickNow - si.MeasurementPeriodTickStart) / ScriptInstance.MaxMeasurementPeriod) | ||
1918 | // / TimeSpan.TicksPerMillisecond; | ||
1919 | |||
1920 | long ticksElapsed = tickNow - si.MeasurementPeriodTickStart; | ||
1921 | |||
1922 | // Avoid divide by zerp | ||
1923 | if (ticksElapsed == 0) | ||
1924 | ticksElapsed = 1; | ||
1925 | 1913 | ||
1926 | // Scale execution time to the ideal 55 fps frame time for these reasons. | 1914 | return topScripts; |
1927 | // | 1915 | } |
1928 | // 1) XEngine does not execute scripts per frame, unlike other script engines. Hence, there is no | ||
1929 | // 'script execution time per frame', which is the original purpose of this value. | ||
1930 | // | ||
1931 | // 2) Giving the raw execution times is misleading since scripts start at different times, making | ||
1932 | // it impossible to compare scripts. | ||
1933 | // | ||
1934 | // 3) Scaling the raw execution time to the time that the script has been running is better but | ||
1935 | // is still misleading since a script that has just been rezzed may appear to have been running | ||
1936 | // for much longer. | ||
1937 | // | ||
1938 | // 4) Hence, we scale execution time to an idealised frame time (55 fps). This is also not perfect | ||
1939 | // since the figure does not represent actual execution time and very hard running scripts will | ||
1940 | // never exceed 18ms (though this is a very high number for script execution so is a warning sign). | ||
1941 | float adjustedExecutionTime | ||
1942 | = ((float)si.MeasurementPeriodExecutionTime / ticksElapsed) * 18.1818f; | ||
1943 | 1916 | ||
1944 | topScripts[si.RootLocalID] += adjustedExecutionTime; | 1917 | public float GetScriptExecutionTime(List<UUID> itemIDs) |
1918 | { | ||
1919 | if (itemIDs == null|| itemIDs.Count == 0) | ||
1920 | { | ||
1921 | return 0.0f; | ||
1922 | } | ||
1923 | float time = 0.0f; | ||
1924 | long tickNow = Util.EnvironmentTickCount(); | ||
1925 | IScriptInstance si; | ||
1926 | // Calculate the time for all scripts that this engine is executing | ||
1927 | // Ignore any others | ||
1928 | foreach (UUID id in itemIDs) | ||
1929 | { | ||
1930 | si = GetInstance(id); | ||
1931 | if (si != null && si.Running) | ||
1932 | { | ||
1933 | time += CalculateAdjustedExectionTime(si, tickNow); | ||
1945 | } | 1934 | } |
1946 | } | 1935 | } |
1936 | return time; | ||
1937 | } | ||
1947 | 1938 | ||
1948 | return topScripts; | 1939 | private float CalculateAdjustedExectionTime(IScriptInstance si, long tickNow) |
1940 | { | ||
1941 | long ticksElapsed = tickNow - si.MeasurementPeriodTickStart; | ||
1942 | |||
1943 | // Avoid divide by zero | ||
1944 | if (ticksElapsed == 0) | ||
1945 | ticksElapsed = 1; | ||
1946 | |||
1947 | // Scale execution time to the ideal 55 fps frame time for these reasons. | ||
1948 | // | ||
1949 | // 1) XEngine does not execute scripts per frame, unlike other script engines. Hence, there is no | ||
1950 | // 'script execution time per frame', which is the original purpose of this value. | ||
1951 | // | ||
1952 | // 2) Giving the raw execution times is misleading since scripts start at different times, making | ||
1953 | // it impossible to compare scripts. | ||
1954 | // | ||
1955 | // 3) Scaling the raw execution time to the time that the script has been running is better but | ||
1956 | // is still misleading since a script that has just been rezzed may appear to have been running | ||
1957 | // for much longer. | ||
1958 | // | ||
1959 | // 4) Hence, we scale execution time to an idealised frame time (55 fps). This is also not perfect | ||
1960 | // since the figure does not represent actual execution time and very hard running scripts will | ||
1961 | // never exceed 18ms (though this is a very high number for script execution so is a warning sign). | ||
1962 | return ((float)si.MeasurementPeriodExecutionTime / ticksElapsed) * 18.1818f; | ||
1949 | } | 1963 | } |
1950 | 1964 | ||
1951 | public void SuspendScript(UUID itemID) | 1965 | public void SuspendScript(UUID itemID) |