diff options
Diffstat (limited to 'OpenSim/Region/Framework/Scenes')
-rw-r--r-- | OpenSim/Region/Framework/Scenes/SceneObjectPart.cs | 28 | ||||
-rw-r--r-- | OpenSim/Region/Framework/Scenes/ScenePresence.cs | 254 |
2 files changed, 162 insertions, 120 deletions
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs index 19e3023..a23c11e 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs | |||
@@ -212,6 +212,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
212 | private Quaternion m_sitTargetOrientation = Quaternion.Identity; | 212 | private Quaternion m_sitTargetOrientation = Quaternion.Identity; |
213 | private Vector3 m_sitTargetPosition; | 213 | private Vector3 m_sitTargetPosition; |
214 | private string m_sitAnimation = "SIT"; | 214 | private string m_sitAnimation = "SIT"; |
215 | private bool m_occupied; // KF if any av is sitting on this prim | ||
215 | private string m_text = String.Empty; | 216 | private string m_text = String.Empty; |
216 | private string m_touchName = String.Empty; | 217 | private string m_touchName = String.Empty; |
217 | private readonly UndoStack<UndoState> m_undo = new UndoStack<UndoState>(5); | 218 | private readonly UndoStack<UndoState> m_undo = new UndoStack<UndoState>(5); |
@@ -512,9 +513,16 @@ namespace OpenSim.Region.Framework.Scenes | |||
512 | { | 513 | { |
513 | // If this is a linkset, we don't want the physics engine mucking up our group position here. | 514 | // If this is a linkset, we don't want the physics engine mucking up our group position here. |
514 | PhysicsActor actor = PhysActor; | 515 | PhysicsActor actor = PhysActor; |
515 | if (actor != null && _parentID == 0) | 516 | if (actor != null) |
516 | { | 517 | { |
517 | m_groupPosition = actor.Position; | 518 | if (_parentID == 0) |
519 | { | ||
520 | m_groupPosition = actor.Position; | ||
521 | } | ||
522 | else | ||
523 | { | ||
524 | m_groupPosition = ParentGroup.AbsolutePosition; // KF+Casper Update Child prims too! | ||
525 | } | ||
518 | } | 526 | } |
519 | 527 | ||
520 | if (IsAttachment) | 528 | if (IsAttachment) |
@@ -841,7 +849,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
841 | if (IsAttachment) | 849 | if (IsAttachment) |
842 | return GroupPosition; | 850 | return GroupPosition; |
843 | 851 | ||
844 | return m_offsetPosition + m_groupPosition; } | 852 | // return m_offsetPosition + m_groupPosition; } |
853 | return m_groupPosition + (m_offsetPosition * ParentGroup.RootPart.RotationOffset) ; } //KF: Rotation was ignored! | ||
845 | } | 854 | } |
846 | 855 | ||
847 | public SceneObjectGroup ParentGroup | 856 | public SceneObjectGroup ParentGroup |
@@ -993,6 +1002,13 @@ namespace OpenSim.Region.Framework.Scenes | |||
993 | get { return _flags; } | 1002 | get { return _flags; } |
994 | set { _flags = value; } | 1003 | set { _flags = value; } |
995 | } | 1004 | } |
1005 | |||
1006 | [XmlIgnore] | ||
1007 | public bool IsOccupied // KF If an av is sittingon this prim | ||
1008 | { | ||
1009 | get { return m_occupied; } | ||
1010 | set { m_occupied = value; } | ||
1011 | } | ||
996 | 1012 | ||
997 | [XmlIgnore] | 1013 | [XmlIgnore] |
998 | public UUID SitTargetAvatar | 1014 | public UUID SitTargetAvatar |
@@ -1735,9 +1751,13 @@ namespace OpenSim.Region.Framework.Scenes | |||
1735 | Quaternion parentRot = ParentGroup.RootPart.RotationOffset; | 1751 | Quaternion parentRot = ParentGroup.RootPart.RotationOffset; |
1736 | 1752 | ||
1737 | Vector3 axPos = OffsetPosition; | 1753 | Vector3 axPos = OffsetPosition; |
1738 | |||
1739 | axPos *= parentRot; | 1754 | axPos *= parentRot; |
1740 | Vector3 translationOffsetPosition = axPos; | 1755 | Vector3 translationOffsetPosition = axPos; |
1756 | |||
1757 | int tx = (int)GroupPosition.X; | ||
1758 | int ty = (int)GroupPosition.Y; | ||
1759 | int tz = (int)GroupPosition.Z; | ||
1760 | |||
1741 | return GroupPosition + translationOffsetPosition; | 1761 | return GroupPosition + translationOffsetPosition; |
1742 | } | 1762 | } |
1743 | 1763 | ||
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index f6bcb59..fbc4ed5 100644 --- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs | |||
@@ -197,6 +197,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
197 | private bool m_autopilotMoving; | 197 | private bool m_autopilotMoving; |
198 | private Vector3 m_autoPilotTarget; | 198 | private Vector3 m_autoPilotTarget; |
199 | private bool m_sitAtAutoTarget; | 199 | private bool m_sitAtAutoTarget; |
200 | private Vector3 m_initialSitTarget; //KF: First estimate of where to sit | ||
200 | 201 | ||
201 | private string m_nextSitAnimation = String.Empty; | 202 | private string m_nextSitAnimation = String.Empty; |
202 | 203 | ||
@@ -1525,7 +1526,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
1525 | m_sitAtAutoTarget = false; | 1526 | m_sitAtAutoTarget = false; |
1526 | PrimitiveBaseShape proxy = PrimitiveBaseShape.Default; | 1527 | PrimitiveBaseShape proxy = PrimitiveBaseShape.Default; |
1527 | //proxy.PCode = (byte)PCode.ParticleSystem; | 1528 | //proxy.PCode = (byte)PCode.ParticleSystem; |
1528 | |||
1529 | proxyObjectGroup = new SceneObjectGroup(UUID, Pos, Rotation, proxy); | 1529 | proxyObjectGroup = new SceneObjectGroup(UUID, Pos, Rotation, proxy); |
1530 | proxyObjectGroup.AttachToScene(m_scene); | 1530 | proxyObjectGroup.AttachToScene(m_scene); |
1531 | 1531 | ||
@@ -1567,7 +1567,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
1567 | } | 1567 | } |
1568 | m_moveToPositionInProgress = true; | 1568 | m_moveToPositionInProgress = true; |
1569 | m_moveToPositionTarget = new Vector3(locx, locy, locz); | 1569 | m_moveToPositionTarget = new Vector3(locx, locy, locz); |
1570 | } | 1570 | } |
1571 | catch (Exception ex) | 1571 | catch (Exception ex) |
1572 | { | 1572 | { |
1573 | //Why did I get this error? | 1573 | //Why did I get this error? |
@@ -1643,20 +1643,24 @@ namespace OpenSim.Region.Framework.Scenes | |||
1643 | // Reset sit target. | 1643 | // Reset sit target. |
1644 | if (part.GetAvatarOnSitTarget() == UUID) | 1644 | if (part.GetAvatarOnSitTarget() == UUID) |
1645 | part.SetAvatarOnSitTarget(UUID.Zero); | 1645 | part.SetAvatarOnSitTarget(UUID.Zero); |
1646 | |||
1647 | m_parentPosition = part.GetWorldPosition(); | 1646 | m_parentPosition = part.GetWorldPosition(); |
1648 | ControllingClient.SendClearFollowCamProperties(part.ParentUUID); | 1647 | ControllingClient.SendClearFollowCamProperties(part.ParentUUID); |
1649 | } | 1648 | } |
1649 | // part.GetWorldRotation() is the rotation of the object being sat on | ||
1650 | // Rotation is the sittiing Av's rotation | ||
1651 | |||
1652 | Quaternion wr = Quaternion.Inverse(Quaternion.Inverse(Rotation) * Quaternion.Inverse(part.GetWorldRotation())); // world or. of the av | ||
1653 | Vector3 so = new Vector3(1.0f, 0f, 0f) * wr; // 1M infront of av | ||
1654 | Vector3 wso = so + part.GetWorldPosition() + ( m_pos * part.GetWorldRotation()); // + av sit offset! | ||
1650 | 1655 | ||
1651 | if (m_physicsActor == null) | 1656 | if (m_physicsActor == null) |
1652 | { | 1657 | { |
1653 | AddToPhysicalScene(false); | 1658 | AddToPhysicalScene(false); |
1654 | } | 1659 | } |
1655 | m_pos += m_parentPosition + new Vector3(0.0f, 0.0f, 2.0f*m_sitAvatarHeight); | 1660 | AbsolutePosition = wso; //KF: Fix stand up. |
1656 | m_parentPosition = Vector3.Zero; | 1661 | m_parentPosition = Vector3.Zero; |
1657 | //Console.WriteLine("Stand Pos {0}", m_pos); | 1662 | m_parentID = 0; |
1658 | 1663 | part.IsOccupied = false; | |
1659 | m_parentID = 0; | ||
1660 | SendFullUpdateToAllClients(); | 1664 | SendFullUpdateToAllClients(); |
1661 | m_requestedSitTargetID = 0; | 1665 | m_requestedSitTargetID = 0; |
1662 | if ((m_physicsActor != null) && (m_avHeight > 0)) | 1666 | if ((m_physicsActor != null) && (m_avHeight > 0)) |
@@ -1695,13 +1699,9 @@ namespace OpenSim.Region.Framework.Scenes | |||
1695 | Vector3 avSitOffSet = part.SitTargetPosition; | 1699 | Vector3 avSitOffSet = part.SitTargetPosition; |
1696 | Quaternion avSitOrientation = part.SitTargetOrientation; | 1700 | Quaternion avSitOrientation = part.SitTargetOrientation; |
1697 | UUID avOnTargetAlready = part.GetAvatarOnSitTarget(); | 1701 | UUID avOnTargetAlready = part.GetAvatarOnSitTarget(); |
1698 | 1702 | bool SitTargetOccupied = (avOnTargetAlready != UUID.Zero); | |
1699 | bool SitTargetUnOccupied = (!(avOnTargetAlready != UUID.Zero)); | 1703 | bool SitTargetisSet = (Vector3.Zero != avSitOffSet); //NB Latest SL Spec shows Sit Rotation setting is ignored. |
1700 | bool SitTargetisSet = | 1704 | if (SitTargetisSet && !SitTargetOccupied) |
1701 | (!(avSitOffSet.X == 0f && avSitOffSet.Y == 0f && avSitOffSet.Z == 0f && avSitOrientation.W == 1f && | ||
1702 | avSitOrientation.X == 0f && avSitOrientation.Y == 0f && avSitOrientation.Z == 0f)); | ||
1703 | // this test is probably failing | ||
1704 | if (SitTargetisSet && SitTargetUnOccupied) | ||
1705 | { | 1705 | { |
1706 | //switch the target to this prim | 1706 | //switch the target to this prim |
1707 | return part; | 1707 | return part; |
@@ -1715,7 +1715,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
1715 | private void SendSitResponse(IClientAPI remoteClient, UUID targetID, Vector3 offset) | 1715 | private void SendSitResponse(IClientAPI remoteClient, UUID targetID, Vector3 offset) |
1716 | { | 1716 | { |
1717 | bool autopilot = true; | 1717 | bool autopilot = true; |
1718 | Vector3 pos = new Vector3(); | 1718 | Vector3 autopilotTarget = new Vector3(); |
1719 | Quaternion sitOrientation = Quaternion.Identity; | 1719 | Quaternion sitOrientation = Quaternion.Identity; |
1720 | Vector3 cameraEyeOffset = Vector3.Zero; | 1720 | Vector3 cameraEyeOffset = Vector3.Zero; |
1721 | Vector3 cameraAtOffset = Vector3.Zero; | 1721 | Vector3 cameraAtOffset = Vector3.Zero; |
@@ -1723,101 +1723,104 @@ namespace OpenSim.Region.Framework.Scenes | |||
1723 | 1723 | ||
1724 | //SceneObjectPart part = m_scene.GetSceneObjectPart(targetID); | 1724 | //SceneObjectPart part = m_scene.GetSceneObjectPart(targetID); |
1725 | SceneObjectPart part = FindNextAvailableSitTarget(targetID); | 1725 | SceneObjectPart part = FindNextAvailableSitTarget(targetID); |
1726 | if (part != null) | 1726 | if (part == null) return; |
1727 | { | 1727 | |
1728 | // TODO: determine position to sit at based on scene geometry; don't trust offset from client | 1728 | // TODO: determine position to sit at based on scene geometry; don't trust offset from client |
1729 | // see http://wiki.secondlife.com/wiki/User:Andrew_Linden/Office_Hours/2007_11_06 for details on how LL does it | 1729 | // see http://wiki.secondlife.com/wiki/User:Andrew_Linden/Office_Hours/2007_11_06 for details on how LL does it |
1730 | 1730 | ||
1731 | // part is the prim to sit on | 1731 | // part is the prim to sit on |
1732 | // offset is the vector distance from that prim center to the click-spot | 1732 | // offset is the world-ref vector distance from that prim center to the click-spot |
1733 | // UUID is the UUID of the Avatar doing the clicking | 1733 | // UUID is the UUID of the Avatar doing the clicking |
1734 | |||
1735 | m_avInitialPos = AbsolutePosition; // saved to calculate unscripted sit rotation | ||
1736 | 1734 | ||
1737 | // Is a sit target available? | 1735 | m_avInitialPos = AbsolutePosition; // saved to calculate unscripted sit rotation |
1738 | Vector3 avSitOffSet = part.SitTargetPosition; | 1736 | |
1739 | Quaternion avSitOrientation = part.SitTargetOrientation; | 1737 | // Is a sit target available? |
1740 | UUID avOnTargetAlready = part.GetAvatarOnSitTarget(); | 1738 | Vector3 avSitOffSet = part.SitTargetPosition; |
1741 | 1739 | Quaternion avSitOrientation = part.SitTargetOrientation; | |
1742 | bool SitTargetUnOccupied = (!(avOnTargetAlready != UUID.Zero)); | 1740 | |
1743 | bool SitTargetisSet = | 1741 | bool SitTargetisSet = (Vector3.Zero != avSitOffSet); //NB Latest SL Spec shows Sit Rotation setting is ignored. |
1744 | (!(avSitOffSet.X == 0f && avSitOffSet.Y == 0f && avSitOffSet.Z == 0f && | 1742 | Quaternion partIRot = Quaternion.Inverse(part.GetWorldRotation()); |
1745 | ( | 1743 | |
1746 | avSitOrientation.X == 0f && avSitOrientation.Y == 0f && avSitOrientation.Z == 0f && avSitOrientation.W == 1f // Valid Zero Rotation quaternion | 1744 | //Console.WriteLine("SendSitResponse offset=" + offset + " Occup=" + part.IsOccupied + " TargSet=" + SitTargetisSet); |
1747 | || avSitOrientation.X == 0f && avSitOrientation.Y == 0f && avSitOrientation.Z == 1f && avSitOrientation.W == 0f // W-Z Mapping was invalid at one point | 1745 | // Sit analysis rewritten by KF 091125 |
1748 | || avSitOrientation.X == 0f && avSitOrientation.Y == 0f && avSitOrientation.Z == 0f && avSitOrientation.W == 0f // Invalid Quaternion | 1746 | if (SitTargetisSet) // scipted sit |
1749 | ) | 1747 | { |
1750 | )); | 1748 | if (!part.IsOccupied) |
1751 | 1749 | { | |
1752 | //Console.WriteLine("SendSitResponse offset=" + offset + " UnOccup=" + SitTargetUnOccupied + | 1750 | //Console.WriteLine("Scripted, unoccupied"); |
1753 | // " TargSet=" + SitTargetisSet); | 1751 | part.SetAvatarOnSitTarget(UUID); // set that Av will be on it |
1754 | // Sit analysis rewritten by KF 091125 | 1752 | offset = new Vector3(avSitOffSet.X, avSitOffSet.Y, avSitOffSet.Z); // change ofset to the scripted one |
1755 | if (SitTargetisSet) // scipted sit | 1753 | sitOrientation = avSitOrientation; // Change rotatione to the scripted one |
1756 | { | 1754 | autopilot = false; // Jump direct to scripted llSitPos() |
1757 | if (SitTargetUnOccupied) | ||
1758 | { | ||
1759 | part.SetAvatarOnSitTarget(UUID); // set that Av will be on it | ||
1760 | offset = new Vector3(avSitOffSet.X, avSitOffSet.Y, avSitOffSet.Z); // change ofset to the scripted one | ||
1761 | sitOrientation = avSitOrientation; // Change rotatione to the scripted one | ||
1762 | autopilot = false; // Jump direct to scripted llSitPos() | ||
1763 | } | ||
1764 | else return; | ||
1765 | } | 1755 | } |
1766 | else // Not Scripted | 1756 | else |
1767 | { | 1757 | { |
1768 | if ( (Math.Abs(offset.X) > 0.5f) || (Math.Abs(offset.Y) > 0.5f) ) // large prim | 1758 | //Console.WriteLine("Scripted, occupied"); |
1769 | { | 1759 | return; |
1770 | Quaternion partIRot = Quaternion.Inverse(part.GetWorldRotation()); | 1760 | } |
1771 | m_avUnscriptedSitPos = offset * partIRot; // sit where clicked | 1761 | } |
1772 | pos = part.AbsolutePosition + (offset * partIRot); | 1762 | else // Not Scripted |
1773 | } | 1763 | { |
1774 | else // small prim | 1764 | if ( (Math.Abs(offset.X) > 0.5f) || (Math.Abs(offset.Y) > 0.5f) ) |
1775 | { | 1765 | { |
1776 | if (SitTargetUnOccupied) | 1766 | // large prim & offset, ignore if other Avs sitting |
1777 | { | 1767 | // offset.Z -= 0.05f; |
1778 | m_avUnscriptedSitPos = Vector3.Zero; // Sit on unoccupied small prim center | 1768 | m_avUnscriptedSitPos = offset * partIRot; // (non-zero) sit where clicked |
1779 | pos = part.AbsolutePosition; | 1769 | autopilotTarget = part.AbsolutePosition + offset; // World location of clicked point |
1780 | } | 1770 | |
1781 | else return; // occupied small | 1771 | //Console.WriteLine(" offset ={0}", offset); |
1782 | } // end large/small | 1772 | //Console.WriteLine(" UnscriptedSitPos={0}", m_avUnscriptedSitPos); |
1783 | } // end Scripted/not | 1773 | //Console.WriteLine(" autopilotTarget={0}", autopilotTarget); |
1784 | 1774 | ||
1785 | if (m_physicsActor != null) | 1775 | } |
1786 | { | 1776 | else // small offset |
1787 | // If we're not using the client autopilot, we're immediately warping the avatar to the location | 1777 | { |
1788 | // We can remove the physicsActor until they stand up. | 1778 | //Console.WriteLine("Small offset"); |
1789 | m_sitAvatarHeight = m_physicsActor.Size.Z; | 1779 | if (!part.IsOccupied) |
1790 | 1780 | { | |
1791 | if (autopilot) | 1781 | m_avUnscriptedSitPos = Vector3.Zero; // Zero = Sit on prim center |
1792 | { // its not a scripted sit | 1782 | autopilotTarget = part.AbsolutePosition; |
1793 | if (Util.GetDistanceTo(AbsolutePosition, pos) < 4.5) | 1783 | } |
1794 | { | 1784 | else return; // occupied small |
1795 | autopilot = false; // close enough | 1785 | } // end large/small |
1786 | } // end Scripted/not | ||
1787 | cameraAtOffset = part.GetCameraAtOffset(); | ||
1788 | cameraEyeOffset = part.GetCameraEyeOffset(); | ||
1789 | forceMouselook = part.GetForceMouselook(); | ||
1796 | 1790 | ||
1797 | RemoveFromPhysicalScene(); | 1791 | if (m_physicsActor != null) |
1798 | AbsolutePosition = pos + new Vector3(0.0f, 0.0f, (m_sitAvatarHeight / 2.0f)); // Warp av to Prim | 1792 | { |
1799 | } // else the autopilot will get us close | 1793 | // If we're not using the client autopilot, we're immediately warping the avatar to the location |
1800 | } | 1794 | // We can remove the physicsActor until they stand up. |
1801 | else | 1795 | m_sitAvatarHeight = m_physicsActor.Size.Z; |
1802 | { // its a scripted sit | 1796 | if (autopilot) |
1797 | { // its not a scripted sit | ||
1798 | // if (Util.GetDistanceTo(AbsolutePosition, autopilotTarget) < 4.5) | ||
1799 | if( (Math.Abs(AbsolutePosition.X - autopilotTarget.X) < 2.0f) && (Math.Abs(AbsolutePosition.Y - autopilotTarget.Y) < 2.0f) ) | ||
1800 | { | ||
1801 | autopilot = false; // close enough | ||
1803 | RemoveFromPhysicalScene(); | 1802 | RemoveFromPhysicalScene(); |
1804 | } | 1803 | AbsolutePosition = autopilotTarget + new Vector3(0.0f, 0.0f, (m_sitAvatarHeight / 2.0f)); // Warp av to over sit target |
1804 | } // else the autopilot will get us close | ||
1805 | } | ||
1806 | else | ||
1807 | { // its a scripted sit | ||
1808 | RemoveFromPhysicalScene(); | ||
1805 | } | 1809 | } |
1806 | |||
1807 | cameraAtOffset = part.GetCameraAtOffset(); | ||
1808 | cameraEyeOffset = part.GetCameraEyeOffset(); | ||
1809 | forceMouselook = part.GetForceMouselook(); | ||
1810 | } | 1810 | } |
1811 | else return; // physactor is null! | ||
1811 | 1812 | ||
1812 | ControllingClient.SendSitResponse(targetID, offset, sitOrientation, autopilot, cameraAtOffset, cameraEyeOffset, forceMouselook); | 1813 | Vector3 offsetr = offset * partIRot; |
1813 | m_requestedSitTargetUUID = targetID; | 1814 | ControllingClient.SendSitResponse(part.UUID, offsetr, sitOrientation, autopilot, cameraAtOffset, cameraEyeOffset, forceMouselook); |
1815 | m_requestedSitTargetUUID = part.UUID; //KF: Correct autopilot target | ||
1814 | // This calls HandleAgentSit twice, once from here, and the client calls | 1816 | // This calls HandleAgentSit twice, once from here, and the client calls |
1815 | // HandleAgentSit itself after it gets to the location | 1817 | // HandleAgentSit itself after it gets to the location |
1816 | // It doesn't get to the location until we've moved them there though | 1818 | // It doesn't get to the location until we've moved them there though |
1817 | // which happens in HandleAgentSit :P | 1819 | // which happens in HandleAgentSit :P |
1818 | m_autopilotMoving = autopilot; | 1820 | m_autopilotMoving = autopilot; |
1819 | m_autoPilotTarget = pos; | 1821 | m_autoPilotTarget = autopilotTarget; |
1820 | m_sitAtAutoTarget = autopilot; | 1822 | m_sitAtAutoTarget = autopilot; |
1823 | m_initialSitTarget = autopilotTarget; | ||
1821 | if (!autopilot) | 1824 | if (!autopilot) |
1822 | HandleAgentSit(remoteClient, UUID); | 1825 | HandleAgentSit(remoteClient, UUID); |
1823 | } | 1826 | } |
@@ -1913,6 +1916,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
1913 | { | 1916 | { |
1914 | if (part.GetAvatarOnSitTarget() == UUID) | 1917 | if (part.GetAvatarOnSitTarget() == UUID) |
1915 | { | 1918 | { |
1919 | //Console.WriteLine("Scripted Sit"); | ||
1916 | // Scripted sit | 1920 | // Scripted sit |
1917 | Vector3 sitTargetPos = part.SitTargetPosition; | 1921 | Vector3 sitTargetPos = part.SitTargetPosition; |
1918 | Quaternion sitTargetOrient = part.SitTargetOrientation; | 1922 | Quaternion sitTargetOrient = part.SitTargetOrientation; |
@@ -1920,42 +1924,44 @@ namespace OpenSim.Region.Framework.Scenes | |||
1920 | m_pos += SIT_TARGET_ADJUSTMENT; | 1924 | m_pos += SIT_TARGET_ADJUSTMENT; |
1921 | m_bodyRot = sitTargetOrient; | 1925 | m_bodyRot = sitTargetOrient; |
1922 | m_parentPosition = part.AbsolutePosition; | 1926 | m_parentPosition = part.AbsolutePosition; |
1927 | part.IsOccupied = true; | ||
1923 | } | 1928 | } |
1924 | else | 1929 | else |
1925 | { | 1930 | { |
1931 | //Console.WriteLine("NON Scripted Sit"); | ||
1932 | // if m_avUnscriptedSitPos is zero then Av sits above center | ||
1933 | // Else Av sits at m_avUnscriptedSitPos | ||
1934 | |||
1926 | // Non-scripted sit by Kitto Flora 21Nov09 | 1935 | // Non-scripted sit by Kitto Flora 21Nov09 |
1927 | // Calculate angle of line from prim to Av | 1936 | // Calculate angle of line from prim to Av |
1937 | Quaternion partIRot = Quaternion.Inverse(part.GetWorldRotation()); | ||
1928 | Vector3 sitTargetPos= part.AbsolutePosition + m_avUnscriptedSitPos; | 1938 | Vector3 sitTargetPos= part.AbsolutePosition + m_avUnscriptedSitPos; |
1929 | float y_diff = (m_avInitialPos.Y - sitTargetPos.Y); | 1939 | float y_diff = (m_avInitialPos.Y - sitTargetPos.Y); |
1930 | float x_diff = ( m_avInitialPos.X - sitTargetPos.X); | 1940 | float x_diff = ( m_avInitialPos.X - sitTargetPos.X); |
1931 | if(Math.Abs(x_diff) < 0.001f) x_diff = 0.001f; // avoid div by 0 | 1941 | if(Math.Abs(x_diff) < 0.001f) x_diff = 0.001f; // avoid div by 0 |
1932 | if(Math.Abs(y_diff) < 0.001f) y_diff = 0.001f; // avoid pol flip at 0 | 1942 | if(Math.Abs(y_diff) < 0.001f) y_diff = 0.001f; // avoid pol flip at 0 |
1933 | float sit_angle = (float)Math.Atan2( (double)y_diff, (double)x_diff); | 1943 | float sit_angle = (float)Math.Atan2( (double)y_diff, (double)x_diff); |
1934 | Quaternion partIRot = Quaternion.Inverse(part.GetWorldRotation()); | ||
1935 | // NOTE: when sitting m_ pos and m_bodyRot are *relative* to the prim location/rotation, not 'World'. | 1944 | // NOTE: when sitting m_ pos and m_bodyRot are *relative* to the prim location/rotation, not 'World'. |
1936 | // Av sits at world euler <0,0, z>, translated by part rotation | 1945 | // Av sits at world euler <0,0, z>, translated by part rotation |
1937 | m_bodyRot = partIRot * Quaternion.CreateFromEulers(0f, 0f, sit_angle); // sit at 0,0,inv-click | 1946 | m_bodyRot = partIRot * Quaternion.CreateFromEulers(0f, 0f, sit_angle); // sit at 0,0,inv-click |
1947 | |||
1938 | m_parentPosition = part.AbsolutePosition; | 1948 | m_parentPosition = part.AbsolutePosition; |
1939 | if(m_avUnscriptedSitPos != Vector3.Zero) | 1949 | part.IsOccupied = true; |
1940 | { // sit where clicked on big prim | 1950 | m_pos = new Vector3(0f, 0f, 0.05f) + // corrections to get Sit Animation |
1941 | m_pos = m_avUnscriptedSitPos + (new Vector3(0.0f, 0f, 0.625f) * partIRot); | 1951 | (new Vector3(0.0f, 0f, 0.61f) * partIRot) + // located on center |
1942 | } | 1952 | (new Vector3(0.34f, 0f, 0.0f) * m_bodyRot) + |
1943 | else | 1953 | m_avUnscriptedSitPos; // adds click offset, if any |
1944 | { // sit at center of small prim | 1954 | //Set up raytrace to find top surface of prim |
1945 | m_pos = new Vector3(0f, 0f, 0.05f) + | 1955 | Vector3 size = part.Scale; |
1946 | (new Vector3(0.0f, 0f, 0.625f) * partIRot) + | 1956 | float mag = 0.1f + (float)Math.Sqrt((size.X * size.X) + (size.Y * size.Y) + (size.Z * size.Z)); |
1947 | (new Vector3(0.25f, 0f, 0.0f) * m_bodyRot); | 1957 | Vector3 start = part.AbsolutePosition + new Vector3(0f, 0f, mag); |
1948 | //Set up raytrace to find top surface of prim | 1958 | Vector3 down = new Vector3(0f, 0f, -1f); |
1949 | Vector3 size = part.Scale; | 1959 | //Console.WriteLine("st={0} do={1} ma={2}", start, down, mag); |
1950 | float mag = 0.1f + (float)Math.Sqrt((size.X * size.X) + (size.Y * size.Y) + (size.Z * size.Z)); | 1960 | m_scene.PhysicsScene.RaycastWorld( |
1951 | Vector3 start = part.AbsolutePosition + new Vector3(0f, 0f, mag); | ||
1952 | Vector3 down = new Vector3(0f, 0f, -1f); | ||
1953 | m_scene.PhysicsScene.RaycastWorld( | ||
1954 | start, // Vector3 position, | 1961 | start, // Vector3 position, |
1955 | down, // Vector3 direction, | 1962 | down, // Vector3 direction, |
1956 | mag, // float length, | 1963 | mag, // float length, |
1957 | SitAltitudeCallback); // retMethod | 1964 | SitAltitudeCallback); // retMethod |
1958 | } // end small/big | ||
1959 | } // end scripted/not | 1965 | } // end scripted/not |
1960 | } | 1966 | } |
1961 | else // no Av | 1967 | else // no Av |
@@ -1974,17 +1980,22 @@ namespace OpenSim.Region.Framework.Scenes | |||
1974 | 1980 | ||
1975 | public void SitAltitudeCallback(bool hitYN, Vector3 collisionPoint, uint localid, float distance, Vector3 normal) | 1981 | public void SitAltitudeCallback(bool hitYN, Vector3 collisionPoint, uint localid, float distance, Vector3 normal) |
1976 | { | 1982 | { |
1983 | // KF: 091202 There appears to be a bug in Prim Edit Size - the process sometimes make a prim that RayTrace no longer | ||
1984 | // sees. Take/re-rez, or sim restart corrects the condition. Result of bug is incorrect sit height. | ||
1977 | if(hitYN) | 1985 | if(hitYN) |
1978 | { | 1986 | { |
1979 | // m_pos = Av offset from prim center to make look like on center | 1987 | // m_pos = Av offset from prim center to make look like on center |
1980 | // m_parentPosition = Actual center pos of prim | 1988 | // m_parentPosition = Actual center pos of prim |
1981 | // collisionPoint = spot on prim where we want to sit | 1989 | // collisionPoint = spot on prim where we want to sit |
1990 | // collisionPoint.Z = global sit surface height | ||
1982 | SceneObjectPart part = m_scene.GetSceneObjectPart(localid); | 1991 | SceneObjectPart part = m_scene.GetSceneObjectPart(localid); |
1983 | Vector3 offset = (collisionPoint - m_parentPosition) * Quaternion.Inverse(part.RotationOffset); | 1992 | Quaternion partIRot = Quaternion.Inverse(part.GetWorldRotation()); |
1993 | float offZ = collisionPoint.Z - m_initialSitTarget.Z; | ||
1994 | Vector3 offset = new Vector3(0.0f, 0.0f, offZ) * partIRot; // Altitude correction | ||
1995 | //Console.WriteLine("sitPoint={0}, offset={1}", sitPoint, offset); | ||
1984 | m_pos += offset; | 1996 | m_pos += offset; |
1985 | // Console.WriteLine("m_pos={0}, offset={1} newsit={2}", m_pos, offset, newsit); | ||
1986 | } | 1997 | } |
1987 | } | 1998 | } // End SitAltitudeCallback KF. |
1988 | 1999 | ||
1989 | /// <summary> | 2000 | /// <summary> |
1990 | /// Event handler for the 'Always run' setting on the client | 2001 | /// Event handler for the 'Always run' setting on the client |
@@ -3735,5 +3746,16 @@ namespace OpenSim.Region.Framework.Scenes | |||
3735 | m_reprioritization_called = false; | 3746 | m_reprioritization_called = false; |
3736 | } | 3747 | } |
3737 | } | 3748 | } |
3749 | |||
3750 | private Vector3 Quat2Euler(Quaternion rot){ | ||
3751 | float x = Utils.RAD_TO_DEG * (float)Math.Atan2((double)((2.0f * rot.X * rot.W) - (2.0f * rot.Y * rot.Z)) , | ||
3752 | (double)(1 - (2.0f * rot.X * rot.X) - (2.0f * rot.Z * rot.Z))); | ||
3753 | float y = Utils.RAD_TO_DEG * (float)Math.Asin ((double)((2.0f * rot.X * rot.Y) + (2.0f * rot.Z * rot.W))); | ||
3754 | float z = Utils.RAD_TO_DEG * (float)Math.Atan2(((double)(2.0f * rot.Y * rot.W) - (2.0f * rot.X * rot.Z)) , | ||
3755 | (double)(1 - (2.0f * rot.Y * rot.Y) - (2.0f * rot.Z * rot.Z))); | ||
3756 | return(new Vector3(x,y,z)); | ||
3757 | } | ||
3758 | |||
3759 | |||
3738 | } | 3760 | } |
3739 | } | 3761 | } |