aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs52
1 files changed, 38 insertions, 14 deletions
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
index 4507583..0720f36 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
@@ -317,6 +317,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
317 } 317 }
318 } 318 }
319 319
320 // convert a LSL_Rotation to a Quaternion
321 private Quaternion Rot2Quaternion(LSL_Rotation r)
322 {
323 return new Quaternion((float)r.x, (float)r.y, (float)r.z, (float)r.s);
324 }
325
320 //These are the implementations of the various ll-functions used by the LSL scripts. 326 //These are the implementations of the various ll-functions used by the LSL scripts.
321 public LSL_Float llSin(double f) 327 public LSL_Float llSin(double f)
322 { 328 {
@@ -1791,14 +1797,39 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1791 { 1797 {
1792 m_host.AddScriptLPS(1); 1798 m_host.AddScriptLPS(1);
1793 1799
1794 SetRot(m_host, rot); 1800 // try to let this work as in SL...
1801 if (m_host.ParentID == 0)
1802 {
1803 // special case: If we are root, rotate complete SOG to new rotation
1804 SetRot(m_host, Rot2Quaternion(rot));
1805 }
1806 else
1807 {
1808 // we are a child. The rotation values will be set to the one of root modified by rot, as in SL. Don't ask.
1809 SceneObjectGroup group = m_host.ParentGroup;
1810 if (group != null) // a bit paranoid, maybe
1811 {
1812 SceneObjectPart rootPart = group.RootPart;
1813 if(rootPart != null) // again, better safe than sorry
1814 {
1815 SetRot(m_host, rootPart.RotationOffset * Rot2Quaternion(rot));
1816 }
1817 }
1818 }
1819
1820 ScriptSleep(200);
1821 }
1795 1822
1823 public void llSetLocalRot(LSL_Rotation rot)
1824 {
1825 m_host.AddScriptLPS(1);
1826 SetRot(m_host, Rot2Quaternion(rot));
1796 ScriptSleep(200); 1827 ScriptSleep(200);
1797 } 1828 }
1798 1829
1799 private void SetRot(SceneObjectPart part, LSL_Rotation rot) 1830 private void SetRot(SceneObjectPart part, Quaternion rot)
1800 { 1831 {
1801 part.UpdateRotation(new Quaternion((float)rot.x, (float)rot.y, (float)rot.z, (float)rot.s)); 1832 part.UpdateRotation(rot);
1802 // Update rotation does not move the object in the physics scene if it's a linkset. 1833 // Update rotation does not move the object in the physics scene if it's a linkset.
1803 part.ParentGroup.AbsolutePosition = part.ParentGroup.AbsolutePosition; 1834 part.ParentGroup.AbsolutePosition = part.ParentGroup.AbsolutePosition;
1804 } 1835 }
@@ -2414,7 +2445,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2414 // need the magnitude later 2445 // need the magnitude later
2415 float velmag = (float)Util.GetMagnitude(llvel); 2446 float velmag = (float)Util.GetMagnitude(llvel);
2416 2447
2417 SceneObjectGroup new_group = World.RezObject(m_host, inv.Value, llpos, new Quaternion((float)rot.x, (float)rot.y, (float)rot.z, (float)rot.s), llvel, param); 2448 SceneObjectGroup new_group = World.RezObject(m_host, inv.Value, llpos, Rot2Quaternion(rot), llvel, param);
2418 2449
2419 // If either of these are null, then there was an unknown error. 2450 // If either of these are null, then there was an unknown error.
2420 if (new_group == null) 2451 if (new_group == null)
@@ -5484,7 +5515,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
5484 if (m_host.ParentGroup.RootPart != null) 5515 if (m_host.ParentGroup.RootPart != null)
5485 { 5516 {
5486 m_host.ParentGroup.RootPart.SetVehicleRotationParam(param, 5517 m_host.ParentGroup.RootPart.SetVehicleRotationParam(param,
5487 new Quaternion((float)rot.x, (float)rot.y, (float)rot.z, (float)rot.s)); 5518 Rot2Quaternion(rot));
5488 } 5519 }
5489 } 5520 }
5490 } 5521 }
@@ -5509,7 +5540,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
5509 rot.z = 1; // ZERO_ROTATION = 0,0,0,1 5540 rot.z = 1; // ZERO_ROTATION = 0,0,0,1
5510 5541
5511 m_host.SitTargetPosition = new Vector3((float)offset.x, (float)offset.y, (float)offset.z); 5542 m_host.SitTargetPosition = new Vector3((float)offset.x, (float)offset.y, (float)offset.z);
5512 m_host.SitTargetOrientation = new Quaternion((float)rot.x, (float)rot.y, (float)rot.z, (float)rot.s); 5543 m_host.SitTargetOrientation = Rot2Quaternion(rot);
5513 } 5544 }
5514 5545
5515 public LSL_String llAvatarOnSitTarget() 5546 public LSL_String llAvatarOnSitTarget()
@@ -6104,7 +6135,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
6104 return; 6135 return;
6105 6136
6106 LSL_Rotation q = rules.GetQuaternionItem(idx++); 6137 LSL_Rotation q = rules.GetQuaternionItem(idx++);
6107 SetRot(part, q); 6138 SetRot(part, Rot2Quaternion(q));
6108 6139
6109 break; 6140 break;
6110 6141
@@ -7160,13 +7191,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
7160 return System.Environment.MachineName; 7191 return System.Environment.MachineName;
7161 } 7192 }
7162 7193
7163 public void llSetLocalRot(LSL_Rotation rot)
7164 {
7165 m_host.AddScriptLPS(1);
7166 m_host.RotationOffset = new Quaternion((float)rot.x, (float)rot.y, (float)rot.z, (float)rot.s);
7167 // ScriptSleep(200);
7168 }
7169
7170 // <summary> 7194 // <summary>
7171 // Scan the string supplied in 'src' and 7195 // Scan the string supplied in 'src' and
7172 // tokenize it based upon two sets of 7196 // tokenize it based upon two sets of