diff options
author | UbitUmarov | 2012-06-17 08:54:39 +0100 |
---|---|---|
committer | UbitUmarov | 2012-06-17 08:54:39 +0100 |
commit | e2b9a5d7aa08c9f99a77d9bbf05a08566fd9cd21 (patch) | |
tree | 6e210c6ec844259edeca73f88bc34efcb714bf7d | |
parent | Reapply the one change that was in the revert that was actually function, not (diff) | |
download | opensim-SC-e2b9a5d7aa08c9f99a77d9bbf05a08566fd9cd21.zip opensim-SC-e2b9a5d7aa08c9f99a77d9bbf05a08566fd9cd21.tar.gz opensim-SC-e2b9a5d7aa08c9f99a77d9bbf05a08566fd9cd21.tar.bz2 opensim-SC-e2b9a5d7aa08c9f99a77d9bbf05a08566fd9cd21.tar.xz |
Don't let scripts rotate root part of physical linksets like SL, Update client rotation of avatars 'linked' to child parts. (put back some 'cosmetics' from previus commit). Still let lsl api use physics engine ideia of part Physical state on this where it should be SOP ideia, so is that is clear that sync with engine is SOP responsability.
-rw-r--r-- | OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs | 101 |
1 files changed, 66 insertions, 35 deletions
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index fe85118..389a82b 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs | |||
@@ -660,18 +660,24 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
660 | m_host.AddScriptLPS(1); | 660 | m_host.AddScriptLPS(1); |
661 | 661 | ||
662 | double x,y,z,s; | 662 | double x,y,z,s; |
663 | 663 | v.x *= 0.5; | |
664 | double c1 = Math.Cos(v.x * 0.5); | 664 | v.y *= 0.5; |
665 | double c2 = Math.Cos(v.y * 0.5); | 665 | v.z *= 0.5; |
666 | double c3 = Math.Cos(v.z * 0.5); | 666 | double c1 = Math.Cos(v.x); |
667 | double s1 = Math.Sin(v.x * 0.5); | 667 | double c2 = Math.Cos(v.y); |
668 | double s2 = Math.Sin(v.y * 0.5); | 668 | double c1c2 = c1 * c2; |
669 | double s3 = Math.Sin(v.z * 0.5); | 669 | double s1 = Math.Sin(v.x); |
670 | 670 | double s2 = Math.Sin(v.y); | |
671 | x = s1 * c2 * c3 + c1 * s2 * s3; | 671 | double s1s2 = s1 * s2; |
672 | y = c1 * s2 * c3 - s1 * c2 * s3; | 672 | double c1s2 = c1 * s2; |
673 | z = s1 * s2 * c3 + c1 * c2 * s3; | 673 | double s1c2 = s1 * c2; |
674 | s = c1 * c2 * c3 - s1 * s2 * s3; | 674 | double c3 = Math.Cos(v.z); |
675 | double s3 = Math.Sin(v.z); | ||
676 | |||
677 | x = s1c2 * c3 + c1s2 * s3; | ||
678 | y = c1s2 * c3 - s1c2 * s3; | ||
679 | z = s1s2 * c3 + c1c2 * s3; | ||
680 | s = c1c2 * c3 - s1s2 * s3; | ||
675 | 681 | ||
676 | return new LSL_Rotation(x, y, z, s); | 682 | return new LSL_Rotation(x, y, z, s); |
677 | } | 683 | } |
@@ -1911,11 +1917,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
1911 | Primitive.TextureEntry tex = part.Shape.Textures; | 1917 | Primitive.TextureEntry tex = part.Shape.Textures; |
1912 | Color4 texcolor; | 1918 | Color4 texcolor; |
1913 | LSL_Vector rgb = new LSL_Vector(); | 1919 | LSL_Vector rgb = new LSL_Vector(); |
1920 | int nsides = GetNumberOfSides(part); | ||
1921 | |||
1914 | if (face == ScriptBaseClass.ALL_SIDES) | 1922 | if (face == ScriptBaseClass.ALL_SIDES) |
1915 | { | 1923 | { |
1916 | int i; | 1924 | int i; |
1917 | 1925 | for (i = 0; i < nsides; i++) | |
1918 | for (i = 0 ; i < GetNumberOfSides(part); i++) | ||
1919 | { | 1926 | { |
1920 | texcolor = tex.GetFace((uint)i).RGBA; | 1927 | texcolor = tex.GetFace((uint)i).RGBA; |
1921 | rgb.x += texcolor.R; | 1928 | rgb.x += texcolor.R; |
@@ -1923,13 +1930,15 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
1923 | rgb.z += texcolor.B; | 1930 | rgb.z += texcolor.B; |
1924 | } | 1931 | } |
1925 | 1932 | ||
1926 | rgb.x /= (float)GetNumberOfSides(part); | 1933 | float invnsides = 1.0f / (float)nsides; |
1927 | rgb.y /= (float)GetNumberOfSides(part); | 1934 | |
1928 | rgb.z /= (float)GetNumberOfSides(part); | 1935 | rgb.x *= invnsides; |
1936 | rgb.y *= invnsides; | ||
1937 | rgb.z *= invnsides; | ||
1929 | 1938 | ||
1930 | return rgb; | 1939 | return rgb; |
1931 | } | 1940 | } |
1932 | if (face >= 0 && face < GetNumberOfSides(part)) | 1941 | if (face >= 0 && face < nsides) |
1933 | { | 1942 | { |
1934 | texcolor = tex.GetFace((uint)face).RGBA; | 1943 | texcolor = tex.GetFace((uint)face).RGBA; |
1935 | rgb.x = texcolor.R; | 1944 | rgb.x = texcolor.R; |
@@ -2328,13 +2337,14 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
2328 | // (root prim). ParentID may be nonzero in attachments and | 2337 | // (root prim). ParentID may be nonzero in attachments and |
2329 | // using it would cause attachments and HUDs to rotate | 2338 | // using it would cause attachments and HUDs to rotate |
2330 | // to the wrong positions. | 2339 | // to the wrong positions. |
2340 | |||
2331 | SetRot(m_host, Rot2Quaternion(rot)); | 2341 | SetRot(m_host, Rot2Quaternion(rot)); |
2332 | } | 2342 | } |
2333 | else | 2343 | else |
2334 | { | 2344 | { |
2335 | // we are a child. The rotation values will be set to the one of root modified by rot, as in SL. Don't ask. | 2345 | // we are a child. The rotation values will be set to the one of root modified by rot, as in SL. Don't ask. |
2336 | SceneObjectPart rootPart = m_host.ParentGroup.RootPart; | 2346 | SceneObjectPart rootPart;// = m_host.ParentGroup.RootPart; |
2337 | if (rootPart != null) // better safe than sorry | 2347 | if (m_host.ParentGroup != null && ((rootPart = m_host.ParentGroup.RootPart) != null)) // better safe than sorry |
2338 | { | 2348 | { |
2339 | SetRot(m_host, rootPart.RotationOffset * Rot2Quaternion(rot)); | 2349 | SetRot(m_host, rootPart.RotationOffset * Rot2Quaternion(rot)); |
2340 | } | 2350 | } |
@@ -2346,6 +2356,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
2346 | public void llSetLocalRot(LSL_Rotation rot) | 2356 | public void llSetLocalRot(LSL_Rotation rot) |
2347 | { | 2357 | { |
2348 | m_host.AddScriptLPS(1); | 2358 | m_host.AddScriptLPS(1); |
2359 | |||
2349 | SetRot(m_host, Rot2Quaternion(rot)); | 2360 | SetRot(m_host, Rot2Quaternion(rot)); |
2350 | ScriptSleep(200); | 2361 | ScriptSleep(200); |
2351 | } | 2362 | } |
@@ -2355,25 +2366,43 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
2355 | if (part == null || part.ParentGroup == null || part.ParentGroup.IsDeleted) | 2366 | if (part == null || part.ParentGroup == null || part.ParentGroup.IsDeleted) |
2356 | return; | 2367 | return; |
2357 | 2368 | ||
2358 | part.UpdateRotation(rot); | 2369 | bool isroot = (part == part.ParentGroup.RootPart); |
2359 | // Update rotation does not move the object in the physics scene if it's a linkset. | 2370 | bool isphys; |
2360 | 2371 | ||
2361 | //KF: Do NOT use this next line if using ODE physics engine. This need a switch based on .ini Phys Engine type | ||
2362 | // part.ParentGroup.AbsolutePosition = part.ParentGroup.AbsolutePosition; | ||
2363 | |||
2364 | // So, after thinking about this for a bit, the issue with the part.ParentGroup.AbsolutePosition = part.ParentGroup.AbsolutePosition line | ||
2365 | // is it isn't compatible with vehicles because it causes the vehicle body to have to be broken down and rebuilt | ||
2366 | // It's perfectly okay when the object is not an active physical body though. | ||
2367 | // So, part.ParentGroup.ResetChildPrimPhysicsPositions(); does the thing that Kitto is warning against | ||
2368 | // but only if the object is not physial and active. This is important for rotating doors. | ||
2369 | // without the absoluteposition = absoluteposition happening, the doors do not move in the physics | ||
2370 | // scene | ||
2371 | PhysicsActor pa = part.PhysActor; | 2372 | PhysicsActor pa = part.PhysActor; |
2372 | 2373 | ||
2373 | if (pa != null && !pa.IsPhysical && part == part.ParentGroup.RootPart) | 2374 | // keep using physactor ideia of isphysical |
2375 | // it should be SOP ideia of that | ||
2376 | // not much of a issue with ubitODE | ||
2377 | if (pa != null && pa.IsPhysical) | ||
2378 | isphys = true; | ||
2379 | else | ||
2380 | isphys = false; | ||
2381 | |||
2382 | // SL doesn't let scripts rotate root of physical linksets | ||
2383 | if (isroot && isphys) | ||
2384 | return; | ||
2385 | |||
2386 | part.UpdateRotation(rot); | ||
2387 | |||
2388 | // Update rotation does not move the object in the physics engine if it's a non physical linkset | ||
2389 | // so do a nasty update of parts positions if is a root part rotation | ||
2390 | if (isroot && pa != null) // with if above implies non physical root part | ||
2374 | { | 2391 | { |
2375 | part.ParentGroup.ResetChildPrimPhysicsPositions(); | 2392 | part.ParentGroup.ResetChildPrimPhysicsPositions(); |
2376 | } | 2393 | } |
2394 | else // fix sitting avatars. This is only needed bc of how we link avas to child parts, not root part | ||
2395 | { | ||
2396 | List<ScenePresence> sittingavas = part.ParentGroup.GetLinkedAvatars(); | ||
2397 | if (sittingavas.Count > 0) | ||
2398 | { | ||
2399 | foreach (ScenePresence av in sittingavas) | ||
2400 | { | ||
2401 | if (isroot || part.LocalId == av.ParentID) | ||
2402 | av.SendTerseUpdateToAllClients(); | ||
2403 | } | ||
2404 | } | ||
2405 | } | ||
2377 | } | 2406 | } |
2378 | 2407 | ||
2379 | /// <summary> | 2408 | /// <summary> |
@@ -2422,7 +2451,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
2422 | public LSL_Rotation llGetLocalRot() | 2451 | public LSL_Rotation llGetLocalRot() |
2423 | { | 2452 | { |
2424 | m_host.AddScriptLPS(1); | 2453 | m_host.AddScriptLPS(1); |
2425 | return new LSL_Rotation(m_host.RotationOffset.X, m_host.RotationOffset.Y, m_host.RotationOffset.Z, m_host.RotationOffset.W); | 2454 | Quaternion rot = m_host.RotationOffset; |
2455 | return new LSL_Rotation(rot.X, rot.Y, rot.Z, rot.W); | ||
2426 | } | 2456 | } |
2427 | 2457 | ||
2428 | public void llSetForce(LSL_Vector force, int local) | 2458 | public void llSetForce(LSL_Vector force, int local) |
@@ -8534,6 +8564,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
8534 | case (int)ScriptBaseClass.PRIM_ROT_LOCAL: | 8564 | case (int)ScriptBaseClass.PRIM_ROT_LOCAL: |
8535 | if (remain < 1) | 8565 | if (remain < 1) |
8536 | return; | 8566 | return; |
8567 | |||
8537 | LSL_Rotation lr = rules.GetQuaternionItem(idx++); | 8568 | LSL_Rotation lr = rules.GetQuaternionItem(idx++); |
8538 | SetRot(part, Rot2Quaternion(lr)); | 8569 | SetRot(part, Rot2Quaternion(lr)); |
8539 | break; | 8570 | break; |