aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region')
-rw-r--r--OpenSim/Region/Framework/Scenes/ScenePresence.cs83
1 files changed, 72 insertions, 11 deletions
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index c553ca0..d0c20ff 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -1660,16 +1660,27 @@ namespace OpenSim.Region.Framework.Scenes
1660 } 1660 }
1661 // part.GetWorldRotation() is the rotation of the object being sat on 1661 // part.GetWorldRotation() is the rotation of the object being sat on
1662 // Rotation is the sittiing Av's rotation 1662 // Rotation is the sittiing Av's rotation
1663 1663
1664 Quaternion wr = Quaternion.Inverse(Quaternion.Inverse(Rotation) * Quaternion.Inverse(part.GetWorldRotation())); // world or. of the av 1664 Quaternion partRot;
1665 Vector3 so = new Vector3(1.0f, 0f, 0f) * wr; // 1M infront of av 1665 if (part.LinkNum == 1)
1666 Vector3 wso = so + part.GetWorldPosition() + ( m_pos * part.GetWorldRotation()); // + av sit offset! 1666 { // Root prim of linkset
1667 partRot = part.ParentGroup.RootPart.RotationOffset;
1668 }
1669 else
1670 { // single or child prim
1671 partRot = part.GetWorldRotation();
1672 }
1673 Quaternion partIRot = Quaternion.Inverse(partRot);
1674
1675 Quaternion avatarRot = Quaternion.Inverse(Quaternion.Inverse(Rotation) * partIRot); // world or. of the av
1676 Vector3 avStandUp = new Vector3(1.0f, 0f, 0f) * avatarRot; // 1M infront of av
1677 Vector3 avWorldStandUp = avStandUp + part.GetWorldPosition() + ( m_pos * partRot); // + av sit offset!
1667 1678
1668 if (m_physicsActor == null) 1679 if (m_physicsActor == null)
1669 { 1680 {
1670 AddToPhysicalScene(false); 1681 AddToPhysicalScene(false);
1671 } 1682 }
1672 AbsolutePosition = wso; //KF: Fix stand up. 1683 AbsolutePosition = avWorldStandUp; //KF: Fix stand up.
1673 m_parentPosition = Vector3.Zero; 1684 m_parentPosition = Vector3.Zero;
1674 m_parentID = 0; 1685 m_parentID = 0;
1675 part.IsOccupied = false; 1686 part.IsOccupied = false;
@@ -1752,8 +1763,17 @@ namespace OpenSim.Region.Framework.Scenes
1752 Quaternion avSitOrientation = part.SitTargetOrientation; 1763 Quaternion avSitOrientation = part.SitTargetOrientation;
1753 1764
1754 bool SitTargetisSet = (Vector3.Zero != avSitOffSet); //NB Latest SL Spec shows Sit Rotation setting is ignored. 1765 bool SitTargetisSet = (Vector3.Zero != avSitOffSet); //NB Latest SL Spec shows Sit Rotation setting is ignored.
1755 Quaternion partIRot = Quaternion.Inverse(part.GetWorldRotation()); 1766 // Quaternion partIRot = Quaternion.Inverse(part.GetWorldRotation());
1756 1767 Quaternion partRot;
1768 if (part.LinkNum == 1)
1769 { // Root prim of linkset
1770 partRot = part.ParentGroup.RootPart.RotationOffset;
1771 }
1772 else
1773 { // single or child prim
1774 partRot = part.GetWorldRotation();
1775 }
1776 Quaternion partIRot = Quaternion.Inverse(partRot);
1757//Console.WriteLine("SendSitResponse offset=" + offset + " Occup=" + part.IsOccupied + " TargSet=" + SitTargetisSet); 1777//Console.WriteLine("SendSitResponse offset=" + offset + " Occup=" + part.IsOccupied + " TargSet=" + SitTargetisSet);
1758 // Sit analysis rewritten by KF 091125 1778 // Sit analysis rewritten by KF 091125
1759 if (SitTargetisSet) // scipted sit 1779 if (SitTargetisSet) // scipted sit
@@ -1800,6 +1820,8 @@ namespace OpenSim.Region.Framework.Scenes
1800 cameraAtOffset = part.GetCameraAtOffset(); 1820 cameraAtOffset = part.GetCameraAtOffset();
1801 cameraEyeOffset = part.GetCameraEyeOffset(); 1821 cameraEyeOffset = part.GetCameraEyeOffset();
1802 forceMouselook = part.GetForceMouselook(); 1822 forceMouselook = part.GetForceMouselook();
1823 if(cameraAtOffset == Vector3.Zero) cameraAtOffset = new Vector3(0f, 0f, 0.1f); //
1824 if(cameraEyeOffset == Vector3.Zero) cameraEyeOffset = new Vector3(0f, 0f, 0.1f); //
1803 1825
1804 if (m_physicsActor != null) 1826 if (m_physicsActor != null)
1805 { 1827 {
@@ -1823,7 +1845,29 @@ namespace OpenSim.Region.Framework.Scenes
1823 } 1845 }
1824 else return; // physactor is null! 1846 else return; // physactor is null!
1825 1847
1826 Vector3 offsetr = offset * partIRot; 1848 Vector3 offsetr; // = offset * partIRot;
1849 // KF: In a linkset, offsetr needs to be relative to the group root! 091208
1850 // offsetr = (part.OffsetPosition * Quaternion.Inverse(part.ParentGroup.RootPart.RotationOffset)) + (offset * partIRot);
1851 if (part.LinkNum < 2)
1852 { // Single, or Root prim of linkset, target is ClickOffset * RootRot
1853 offsetr = offset * partIRot;
1854 }
1855 else
1856 { // Child prim, offset is (ChildOffset * RootRot) + (ClickOffset * ChildRot)
1857 offsetr = //(part.OffsetPosition * Quaternion.Inverse(part.ParentGroup.RootPart.RotationOffset)) +
1858 (offset * partRot);
1859 }
1860
1861Console.WriteLine(" ");
1862Console.WriteLine("link number ={0}", part.LinkNum);
1863Console.WriteLine("Prim offset ={0}", part.OffsetPosition );
1864Console.WriteLine("Root Rotate ={0}", part.ParentGroup.RootPart.RotationOffset);
1865Console.WriteLine("Click offst ={0}", offset);
1866Console.WriteLine("Prim Rotate ={0}", part.GetWorldRotation());
1867Console.WriteLine("offsetr ={0}", offsetr);
1868Console.WriteLine("Camera At ={0}", cameraAtOffset);
1869Console.WriteLine("Camera Eye ={0}", cameraEyeOffset);
1870
1827 ControllingClient.SendSitResponse(part.UUID, offsetr, sitOrientation, autopilot, cameraAtOffset, cameraEyeOffset, forceMouselook); 1871 ControllingClient.SendSitResponse(part.UUID, offsetr, sitOrientation, autopilot, cameraAtOffset, cameraEyeOffset, forceMouselook);
1828 m_requestedSitTargetUUID = part.UUID; //KF: Correct autopilot target 1872 m_requestedSitTargetUUID = part.UUID; //KF: Correct autopilot target
1829 // This calls HandleAgentSit twice, once from here, and the client calls 1873 // This calls HandleAgentSit twice, once from here, and the client calls
@@ -2142,13 +2186,20 @@ namespace OpenSim.Region.Framework.Scenes
2142 } 2186 }
2143 else 2187 else
2144 { 2188 {
2145//Console.WriteLine("NON Scripted Sit");
2146 // if m_avUnscriptedSitPos is zero then Av sits above center 2189 // if m_avUnscriptedSitPos is zero then Av sits above center
2147 // Else Av sits at m_avUnscriptedSitPos 2190 // Else Av sits at m_avUnscriptedSitPos
2148 2191
2149 // Non-scripted sit by Kitto Flora 21Nov09 2192 // Non-scripted sit by Kitto Flora 21Nov09
2150 // Calculate angle of line from prim to Av 2193 // Calculate angle of line from prim to Av
2151 Quaternion partIRot = Quaternion.Inverse(part.GetWorldRotation()); 2194 Quaternion partIRot;
2195 if (part.LinkNum == 1)
2196 { // Root prim of linkset
2197 partIRot = Quaternion.Inverse(part.ParentGroup.RootPart.RotationOffset);
2198 }
2199 else
2200 { // single or child prim
2201 partIRot = Quaternion.Inverse(part.GetWorldRotation());
2202 }
2152 Vector3 sitTargetPos= part.AbsolutePosition + m_avUnscriptedSitPos; 2203 Vector3 sitTargetPos= part.AbsolutePosition + m_avUnscriptedSitPos;
2153 float y_diff = (m_avInitialPos.Y - sitTargetPos.Y); 2204 float y_diff = (m_avInitialPos.Y - sitTargetPos.Y);
2154 float x_diff = ( m_avInitialPos.X - sitTargetPos.X); 2205 float x_diff = ( m_avInitialPos.X - sitTargetPos.X);
@@ -2203,11 +2254,21 @@ namespace OpenSim.Region.Framework.Scenes
2203 // collisionPoint = spot on prim where we want to sit 2254 // collisionPoint = spot on prim where we want to sit
2204 // collisionPoint.Z = global sit surface height 2255 // collisionPoint.Z = global sit surface height
2205 SceneObjectPart part = m_scene.GetSceneObjectPart(localid); 2256 SceneObjectPart part = m_scene.GetSceneObjectPart(localid);
2206 Quaternion partIRot = Quaternion.Inverse(part.GetWorldRotation()); 2257 Quaternion partIRot;
2258 if (part.LinkNum == 1)
2259 { // Root prim of linkset
2260 partIRot = Quaternion.Inverse(part.ParentGroup.RootPart.RotationOffset);
2261 }
2262 else
2263 { // single or child prim
2264 partIRot = Quaternion.Inverse(part.GetWorldRotation());
2265 }
2207 float offZ = collisionPoint.Z - m_initialSitTarget.Z; 2266 float offZ = collisionPoint.Z - m_initialSitTarget.Z;
2208 Vector3 offset = new Vector3(0.0f, 0.0f, offZ) * partIRot; // Altitude correction 2267 Vector3 offset = new Vector3(0.0f, 0.0f, offZ) * partIRot; // Altitude correction
2209//Console.WriteLine("sitPoint={0}, offset={1}", sitPoint, offset); 2268//Console.WriteLine("sitPoint={0}, offset={1}", sitPoint, offset);
2210 m_pos += offset; 2269 m_pos += offset;
2270 ControllingClient.SendClearFollowCamProperties(part.UUID);
2271
2211 } 2272 }
2212 } // End SitAltitudeCallback KF. 2273 } // End SitAltitudeCallback KF.
2213 2274