aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/Framework
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region/Framework')
-rw-r--r--OpenSim/Region/Framework/Scenes/ScenePresence.cs111
1 files changed, 85 insertions, 26 deletions
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index c553ca0..c67463a 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -670,8 +670,7 @@ namespace OpenSim.Region.Framework.Scenes
670 670
671 671
672 AdjustKnownSeeds(); 672 AdjustKnownSeeds();
673 673 Animator.TrySetMovementAnimation("STAND");
674 Animator.TrySetMovementAnimation("STAND");
675 // we created a new ScenePresence (a new child agent) in a fresh region. 674 // we created a new ScenePresence (a new child agent) in a fresh region.
676 // Request info about all the (root) agents in this region 675 // Request info about all the (root) agents in this region
677 // Note: This won't send data *to* other clients in that region (children don't send) 676 // Note: This won't send data *to* other clients in that region (children don't send)
@@ -1660,16 +1659,27 @@ namespace OpenSim.Region.Framework.Scenes
1660 } 1659 }
1661 // part.GetWorldRotation() is the rotation of the object being sat on 1660 // part.GetWorldRotation() is the rotation of the object being sat on
1662 // Rotation is the sittiing Av's rotation 1661 // Rotation is the sittiing Av's rotation
1663 1662
1664 Quaternion wr = Quaternion.Inverse(Quaternion.Inverse(Rotation) * Quaternion.Inverse(part.GetWorldRotation())); // world or. of the av 1663 Quaternion partRot;
1665 Vector3 so = new Vector3(1.0f, 0f, 0f) * wr; // 1M infront of av 1664 if (part.LinkNum == 1)
1666 Vector3 wso = so + part.GetWorldPosition() + ( m_pos * part.GetWorldRotation()); // + av sit offset! 1665 { // Root prim of linkset
1666 partRot = part.ParentGroup.RootPart.RotationOffset;
1667 }
1668 else
1669 { // single or child prim
1670 partRot = part.GetWorldRotation();
1671 }
1672 Quaternion partIRot = Quaternion.Inverse(partRot);
1673
1674 Quaternion avatarRot = Quaternion.Inverse(Quaternion.Inverse(Rotation) * partIRot); // world or. of the av
1675 Vector3 avStandUp = new Vector3(1.0f, 0f, 0f) * avatarRot; // 1M infront of av
1676 Vector3 avWorldStandUp = avStandUp + part.GetWorldPosition() + ( m_pos * partRot); // + av sit offset!
1667 1677
1668 if (m_physicsActor == null) 1678 if (m_physicsActor == null)
1669 { 1679 {
1670 AddToPhysicalScene(false); 1680 AddToPhysicalScene(false);
1671 } 1681 }
1672 AbsolutePosition = wso; //KF: Fix stand up. 1682 AbsolutePosition = avWorldStandUp; //KF: Fix stand up.
1673 m_parentPosition = Vector3.Zero; 1683 m_parentPosition = Vector3.Zero;
1674 m_parentID = 0; 1684 m_parentID = 0;
1675 part.IsOccupied = false; 1685 part.IsOccupied = false;
@@ -1680,7 +1690,6 @@ namespace OpenSim.Region.Framework.Scenes
1680 SetHeight(m_avHeight); 1690 SetHeight(m_avHeight);
1681 } 1691 }
1682 } 1692 }
1683
1684 Animator.TrySetMovementAnimation("STAND"); 1693 Animator.TrySetMovementAnimation("STAND");
1685 } 1694 }
1686 1695
@@ -1752,8 +1761,17 @@ namespace OpenSim.Region.Framework.Scenes
1752 Quaternion avSitOrientation = part.SitTargetOrientation; 1761 Quaternion avSitOrientation = part.SitTargetOrientation;
1753 1762
1754 bool SitTargetisSet = (Vector3.Zero != avSitOffSet); //NB Latest SL Spec shows Sit Rotation setting is ignored. 1763 bool SitTargetisSet = (Vector3.Zero != avSitOffSet); //NB Latest SL Spec shows Sit Rotation setting is ignored.
1755 Quaternion partIRot = Quaternion.Inverse(part.GetWorldRotation()); 1764 // Quaternion partIRot = Quaternion.Inverse(part.GetWorldRotation());
1756 1765 Quaternion partRot;
1766 if (part.LinkNum == 1)
1767 { // Root prim of linkset
1768 partRot = part.ParentGroup.RootPart.RotationOffset;
1769 }
1770 else
1771 { // single or child prim
1772 partRot = part.GetWorldRotation();
1773 }
1774 Quaternion partIRot = Quaternion.Inverse(partRot);
1757//Console.WriteLine("SendSitResponse offset=" + offset + " Occup=" + part.IsOccupied + " TargSet=" + SitTargetisSet); 1775//Console.WriteLine("SendSitResponse offset=" + offset + " Occup=" + part.IsOccupied + " TargSet=" + SitTargetisSet);
1758 // Sit analysis rewritten by KF 091125 1776 // Sit analysis rewritten by KF 091125
1759 if (SitTargetisSet) // scipted sit 1777 if (SitTargetisSet) // scipted sit
@@ -1800,6 +1818,8 @@ namespace OpenSim.Region.Framework.Scenes
1800 cameraAtOffset = part.GetCameraAtOffset(); 1818 cameraAtOffset = part.GetCameraAtOffset();
1801 cameraEyeOffset = part.GetCameraEyeOffset(); 1819 cameraEyeOffset = part.GetCameraEyeOffset();
1802 forceMouselook = part.GetForceMouselook(); 1820 forceMouselook = part.GetForceMouselook();
1821 if(cameraAtOffset == Vector3.Zero) cameraAtOffset = new Vector3(0f, 0f, 0.1f); //
1822 if(cameraEyeOffset == Vector3.Zero) cameraEyeOffset = new Vector3(0f, 0f, 0.1f); //
1803 1823
1804 if (m_physicsActor != null) 1824 if (m_physicsActor != null)
1805 { 1825 {
@@ -1823,7 +1843,29 @@ namespace OpenSim.Region.Framework.Scenes
1823 } 1843 }
1824 else return; // physactor is null! 1844 else return; // physactor is null!
1825 1845
1826 Vector3 offsetr = offset * partIRot; 1846 Vector3 offsetr; // = offset * partIRot;
1847 // KF: In a linkset, offsetr needs to be relative to the group root! 091208
1848 // offsetr = (part.OffsetPosition * Quaternion.Inverse(part.ParentGroup.RootPart.RotationOffset)) + (offset * partIRot);
1849 if (part.LinkNum < 2)
1850 { // Single, or Root prim of linkset, target is ClickOffset * RootRot
1851 offsetr = offset * partIRot;
1852 }
1853 else
1854 { // Child prim, offset is (ChildOffset * RootRot) + (ClickOffset * ChildRot)
1855 offsetr = //(part.OffsetPosition * Quaternion.Inverse(part.ParentGroup.RootPart.RotationOffset)) +
1856 (offset * partRot);
1857 }
1858
1859//Console.WriteLine(" ");
1860//Console.WriteLine("link number ={0}", part.LinkNum);
1861//Console.WriteLine("Prim offset ={0}", part.OffsetPosition );
1862//Console.WriteLine("Root Rotate ={0}", part.ParentGroup.RootPart.RotationOffset);
1863//Console.WriteLine("Click offst ={0}", offset);
1864//Console.WriteLine("Prim Rotate ={0}", part.GetWorldRotation());
1865//Console.WriteLine("offsetr ={0}", offsetr);
1866//Console.WriteLine("Camera At ={0}", cameraAtOffset);
1867//Console.WriteLine("Camera Eye ={0}", cameraEyeOffset);
1868
1827 ControllingClient.SendSitResponse(part.UUID, offsetr, sitOrientation, autopilot, cameraAtOffset, cameraEyeOffset, forceMouselook); 1869 ControllingClient.SendSitResponse(part.UUID, offsetr, sitOrientation, autopilot, cameraAtOffset, cameraEyeOffset, forceMouselook);
1828 m_requestedSitTargetUUID = part.UUID; //KF: Correct autopilot target 1870 m_requestedSitTargetUUID = part.UUID; //KF: Correct autopilot target
1829 // This calls HandleAgentSit twice, once from here, and the client calls 1871 // This calls HandleAgentSit twice, once from here, and the client calls
@@ -2142,13 +2184,20 @@ namespace OpenSim.Region.Framework.Scenes
2142 } 2184 }
2143 else 2185 else
2144 { 2186 {
2145//Console.WriteLine("NON Scripted Sit");
2146 // if m_avUnscriptedSitPos is zero then Av sits above center 2187 // if m_avUnscriptedSitPos is zero then Av sits above center
2147 // Else Av sits at m_avUnscriptedSitPos 2188 // Else Av sits at m_avUnscriptedSitPos
2148 2189
2149 // Non-scripted sit by Kitto Flora 21Nov09 2190 // Non-scripted sit by Kitto Flora 21Nov09
2150 // Calculate angle of line from prim to Av 2191 // Calculate angle of line from prim to Av
2151 Quaternion partIRot = Quaternion.Inverse(part.GetWorldRotation()); 2192 Quaternion partIRot;
2193 if (part.LinkNum == 1)
2194 { // Root prim of linkset
2195 partIRot = Quaternion.Inverse(part.ParentGroup.RootPart.RotationOffset);
2196 }
2197 else
2198 { // single or child prim
2199 partIRot = Quaternion.Inverse(part.GetWorldRotation());
2200 }
2152 Vector3 sitTargetPos= part.AbsolutePosition + m_avUnscriptedSitPos; 2201 Vector3 sitTargetPos= part.AbsolutePosition + m_avUnscriptedSitPos;
2153 float y_diff = (m_avInitialPos.Y - sitTargetPos.Y); 2202 float y_diff = (m_avInitialPos.Y - sitTargetPos.Y);
2154 float x_diff = ( m_avInitialPos.X - sitTargetPos.X); 2203 float x_diff = ( m_avInitialPos.X - sitTargetPos.X);
@@ -2167,7 +2216,7 @@ namespace OpenSim.Region.Framework.Scenes
2167 m_avUnscriptedSitPos; // adds click offset, if any 2216 m_avUnscriptedSitPos; // adds click offset, if any
2168 //Set up raytrace to find top surface of prim 2217 //Set up raytrace to find top surface of prim
2169 Vector3 size = part.Scale; 2218 Vector3 size = part.Scale;
2170 float mag = 0.1f + (float)Math.Sqrt((size.X * size.X) + (size.Y * size.Y) + (size.Z * size.Z)); 2219 float mag = 2.0f; // 0.1f + (float)Math.Sqrt((size.X * size.X) + (size.Y * size.Y) + (size.Z * size.Z));
2171 Vector3 start = part.AbsolutePosition + new Vector3(0f, 0f, mag); 2220 Vector3 start = part.AbsolutePosition + new Vector3(0f, 0f, mag);
2172 Vector3 down = new Vector3(0f, 0f, -1f); 2221 Vector3 down = new Vector3(0f, 0f, -1f);
2173//Console.WriteLine("st={0} do={1} ma={2}", start, down, mag); 2222//Console.WriteLine("st={0} do={1} ma={2}", start, down, mag);
@@ -2203,11 +2252,21 @@ namespace OpenSim.Region.Framework.Scenes
2203 // collisionPoint = spot on prim where we want to sit 2252 // collisionPoint = spot on prim where we want to sit
2204 // collisionPoint.Z = global sit surface height 2253 // collisionPoint.Z = global sit surface height
2205 SceneObjectPart part = m_scene.GetSceneObjectPart(localid); 2254 SceneObjectPart part = m_scene.GetSceneObjectPart(localid);
2206 Quaternion partIRot = Quaternion.Inverse(part.GetWorldRotation()); 2255 Quaternion partIRot;
2256 if (part.LinkNum == 1)
2257 { // Root prim of linkset
2258 partIRot = Quaternion.Inverse(part.ParentGroup.RootPart.RotationOffset);
2259 }
2260 else
2261 { // single or child prim
2262 partIRot = Quaternion.Inverse(part.GetWorldRotation());
2263 }
2207 float offZ = collisionPoint.Z - m_initialSitTarget.Z; 2264 float offZ = collisionPoint.Z - m_initialSitTarget.Z;
2208 Vector3 offset = new Vector3(0.0f, 0.0f, offZ) * partIRot; // Altitude correction 2265 Vector3 offset = new Vector3(0.0f, 0.0f, offZ) * partIRot; // Altitude correction
2209//Console.WriteLine("sitPoint={0}, offset={1}", sitPoint, offset); 2266//Console.WriteLine("sitPoint={0}, offset={1}", sitPoint, offset);
2210 m_pos += offset; 2267 m_pos += offset;
2268// ControllingClient.SendClearFollowCamProperties(part.UUID);
2269
2211 } 2270 }
2212 } // End SitAltitudeCallback KF. 2271 } // End SitAltitudeCallback KF.
2213 2272
@@ -3236,7 +3295,7 @@ namespace OpenSim.Region.Framework.Scenes
3236 m_updateflag = true; 3295 m_updateflag = true;
3237 Velocity = force; 3296 Velocity = force;
3238 m_isNudging = false; 3297 m_isNudging = false;
3239 m_updateCount = UPDATE_COUNT; //KF: Update anims to pickup "STAND" 3298 m_updateCount = UPDATE_COUNT; //KF: Update anims to pickup "STAND"
3240 } 3299 }
3241 } 3300 }
3242 } 3301 }
@@ -3288,19 +3347,19 @@ namespace OpenSim.Region.Framework.Scenes
3288 // Event called by the physics plugin to tell the avatar about a collision. 3347 // Event called by the physics plugin to tell the avatar about a collision.
3289 private void PhysicsCollisionUpdate(EventArgs e) 3348 private void PhysicsCollisionUpdate(EventArgs e)
3290 { 3349 {
3291 if (m_updateCount > 0) //KF: Update Anims for a short period. Many Anim
3292 { // changes are very asynchronous.
3293 Animator.UpdateMovementAnimations();
3294 m_updateCount--;
3295 }
3296
3297 if (e == null) 3350 if (e == null)
3298 return; 3351 return;
3299 3352
3300 // The Physics Scene will send updates every 500 ms grep: m_physicsActor.SubscribeEvents( 3353 // The Physics Scene will send (spam!) updates every 500 ms grep: m_physicsActor.SubscribeEvents(
3301 // as of this comment the interval is set in AddToPhysicalScene 3354 // as of this comment the interval is set in AddToPhysicalScene
3302 if (Animator!=null) 3355 if (Animator!=null)
3303 Animator.UpdateMovementAnimations(); 3356 {
3357 if (m_updateCount > 0) //KF: DO NOT call UpdateMovementAnimations outside of the m_updateCount wrapper,
3358 { // else its will lock out other animation changes, like ground sit.
3359 Animator.UpdateMovementAnimations();
3360 m_updateCount--;
3361 }
3362 }
3304 3363
3305 CollisionEventUpdate collisionData = (CollisionEventUpdate)e; 3364 CollisionEventUpdate collisionData = (CollisionEventUpdate)e;
3306 Dictionary<uint, ContactPoint> coldata = collisionData.m_objCollisionList; 3365 Dictionary<uint, ContactPoint> coldata = collisionData.m_objCollisionList;
@@ -3309,7 +3368,7 @@ namespace OpenSim.Region.Framework.Scenes
3309 3368
3310 if (m_lastColCount != coldata.Count) 3369 if (m_lastColCount != coldata.Count)
3311 { 3370 {
3312 m_updateCount = 10; 3371 m_updateCount = UPDATE_COUNT;
3313 m_lastColCount = coldata.Count; 3372 m_lastColCount = coldata.Count;
3314 } 3373 }
3315 3374