aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorTom2011-03-28 13:28:59 -0700
committerTom2011-03-28 13:28:59 -0700
commitc39b391b6ac52e13fddc1e3362cce681cd35b1ec (patch)
tree6bc6dad433b1965dcc08d7fd4f3984a75cf21a75
parentFlag root prim changes for persistence (diff)
downloadopensim-SC_OLD-c39b391b6ac52e13fddc1e3362cce681cd35b1ec.zip
opensim-SC_OLD-c39b391b6ac52e13fddc1e3362cce681cd35b1ec.tar.gz
opensim-SC_OLD-c39b391b6ac52e13fddc1e3362cce681cd35b1ec.tar.bz2
opensim-SC_OLD-c39b391b6ac52e13fddc1e3362cce681cd35b1ec.tar.xz
Many scripted items use long lists of llSetLinkPrimitiveParams rules to make prims "teleport" or jump large distances. When teleporting to 10,000 meters, this results in 1,000 SetPos calls, which severely rapes the physics and update system. This change modifies this behaviour to only provide one update after all the rules have been executed.
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs52
1 files changed, 43 insertions, 9 deletions
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
index 559523b..bba0c3b 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
@@ -2113,13 +2113,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2113 return end; 2113 return end;
2114 } 2114 }
2115 2115
2116 protected void SetPos(SceneObjectPart part, LSL_Vector targetPos) 2116 protected LSL_Vector GetSetPosTarget(SceneObjectPart part, LSL_Vector targetPos, LSL_Vector fromPos)
2117 { 2117 {
2118 if (part == null || part.ParentGroup == null || part.ParentGroup.IsDeleted) 2118 if (part == null || part.ParentGroup == null || part.ParentGroup.IsDeleted)
2119 return; 2119 return fromPos;
2120 2120
2121 // Capped movemment if distance > 10m (http://wiki.secondlife.com/wiki/LlSetPos) 2121 // Capped movemment if distance > 10m (http://wiki.secondlife.com/wiki/LlSetPos)
2122 LSL_Vector currentPos = GetPartLocalPos(part); 2122
2123 2123
2124 float ground = World.GetGroundHeight((float)targetPos.x, (float)targetPos.y); 2124 float ground = World.GetGroundHeight((float)targetPos.x, (float)targetPos.y);
2125 bool disable_underground_movement = m_ScriptEngine.Config.GetBoolean("DisableUndergroundMovement", true); 2125 bool disable_underground_movement = m_ScriptEngine.Config.GetBoolean("DisableUndergroundMovement", true);
@@ -2128,14 +2128,28 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2128 { 2128 {
2129 if ((targetPos.z < ground) && disable_underground_movement && m_host.AttachmentPoint == 0) 2129 if ((targetPos.z < ground) && disable_underground_movement && m_host.AttachmentPoint == 0)
2130 targetPos.z = ground; 2130 targetPos.z = ground;
2131 }
2132 LSL_Vector real_vec = SetPosAdjust(fromPos, targetPos);
2133
2134 return real_vec;
2135 }
2136
2137 protected void SetPos(SceneObjectPart part, LSL_Vector targetPos)
2138 {
2139 if (part == null || part.ParentGroup == null || part.ParentGroup.IsDeleted)
2140 return;
2141
2142 LSL_Vector currentPos = GetPartLocalPos(part);
2143 LSL_Vector toPos = GetSetPosTarget(part, targetPos, currentPos);
2144
2145 if (part.ParentGroup.RootPart == part)
2146 {
2131 SceneObjectGroup parent = part.ParentGroup; 2147 SceneObjectGroup parent = part.ParentGroup;
2132 LSL_Vector real_vec = SetPosAdjust(currentPos, targetPos); 2148 parent.UpdateGroupPosition(new Vector3((float)toPos.x, (float)toPos.y, (float)toPos.z));
2133 parent.UpdateGroupPosition(new Vector3((float)real_vec.x, (float)real_vec.y, (float)real_vec.z));
2134 } 2149 }
2135 else 2150 else
2136 { 2151 {
2137 LSL_Vector rel_vec = SetPosAdjust(new LSL_Vector(part.OffsetPosition.X, part.OffsetPosition.Y, part.OffsetPosition.Z), targetPos); 2152 part.OffsetPosition = new Vector3((float)toPos.x, (float)toPos.y, (float)toPos.z);
2138 part.OffsetPosition = new Vector3((float)rel_vec.x, (float)rel_vec.y, (float)rel_vec.z);
2139 SceneObjectGroup parent = part.ParentGroup; 2153 SceneObjectGroup parent = part.ParentGroup;
2140 parent.HasGroupChanged = true; 2154 parent.HasGroupChanged = true;
2141 parent.ScheduleGroupForTerseUpdate(); 2155 parent.ScheduleGroupForTerseUpdate();
@@ -7401,6 +7415,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
7401 7415
7402 int idx = 0; 7416 int idx = 0;
7403 7417
7418 bool positionChanged = false;
7419 LSL_Vector currentPosition = GetPartLocalPos(part);
7420
7404 while (idx < rules.Length) 7421 while (idx < rules.Length)
7405 { 7422 {
7406 int code = rules.GetLSLIntegerItem(idx++); 7423 int code = rules.GetLSLIntegerItem(idx++);
@@ -7409,7 +7426,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
7409 7426
7410 int face; 7427 int face;
7411 LSL_Vector v; 7428 LSL_Vector v;
7412 7429
7413 switch (code) 7430 switch (code)
7414 { 7431 {
7415 case (int)ScriptBaseClass.PRIM_POSITION: 7432 case (int)ScriptBaseClass.PRIM_POSITION:
@@ -7417,7 +7434,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
7417 return; 7434 return;
7418 7435
7419 v=rules.GetVector3Item(idx++); 7436 v=rules.GetVector3Item(idx++);
7420 SetPos(part, v); 7437 positionChanged = true;
7438 currentPosition = GetSetPosTarget(part, v, currentPosition);
7421 7439
7422 break; 7440 break;
7423 case (int)ScriptBaseClass.PRIM_SIZE: 7441 case (int)ScriptBaseClass.PRIM_SIZE:
@@ -7785,6 +7803,22 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
7785 break; 7803 break;
7786 } 7804 }
7787 } 7805 }
7806
7807 if (positionChanged)
7808 {
7809 if (part.ParentGroup.RootPart == part)
7810 {
7811 SceneObjectGroup parent = part.ParentGroup;
7812 parent.UpdateGroupPosition(new Vector3((float)currentPosition.x, (float)currentPosition.y, (float)currentPosition.z));
7813 }
7814 else
7815 {
7816 part.OffsetPosition = new Vector3((float)currentPosition.x, (float)currentPosition.y, (float)currentPosition.z);
7817 SceneObjectGroup parent = part.ParentGroup;
7818 parent.HasGroupChanged = true;
7819 parent.ScheduleGroupForTerseUpdate();
7820 }
7821 }
7788 } 7822 }
7789 7823
7790 public LSL_String llStringToBase64(string str) 7824 public LSL_String llStringToBase64(string str)