diff options
Diffstat (limited to 'OpenSim/Region/Framework/Scenes/ScenePresence.cs')
-rw-r--r-- | OpenSim/Region/Framework/Scenes/ScenePresence.cs | 128 |
1 files changed, 70 insertions, 58 deletions
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index b9cd3fc..1d6898b 100644 --- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs | |||
@@ -225,8 +225,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
225 | /// </summary> | 225 | /// </summary> |
226 | public bool LandAtTarget { get; private set; } | 226 | public bool LandAtTarget { get; private set; } |
227 | 227 | ||
228 | private bool m_followCamAuto; | ||
229 | |||
230 | private int m_movementUpdateCount; | 228 | private int m_movementUpdateCount; |
231 | private const int NumMovementsBetweenRayCast = 5; | 229 | private const int NumMovementsBetweenRayCast = 5; |
232 | 230 | ||
@@ -355,6 +353,9 @@ namespace OpenSim.Region.Framework.Scenes | |||
355 | /// </summary> | 353 | /// </summary> |
356 | protected Vector3 m_lastCameraPosition; | 354 | protected Vector3 m_lastCameraPosition; |
357 | 355 | ||
356 | private Vector4 m_lastCameraCollisionPlane = new Vector4(0f, 0f, 0f, 1); | ||
357 | private bool m_doingCamRayCast = false; | ||
358 | |||
358 | public Vector3 CameraPosition { get; set; } | 359 | public Vector3 CameraPosition { get; set; } |
359 | 360 | ||
360 | public Quaternion CameraRotation | 361 | public Quaternion CameraRotation |
@@ -604,6 +605,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
604 | } | 605 | } |
605 | 606 | ||
606 | public bool IsChildAgent { get; set; } | 607 | public bool IsChildAgent { get; set; } |
608 | public bool IsLoggingIn { get; set; } | ||
607 | 609 | ||
608 | /// <summary> | 610 | /// <summary> |
609 | /// If the avatar is sitting, the local ID of the prim that it's sitting on. If not sitting then zero. | 611 | /// If the avatar is sitting, the local ID of the prim that it's sitting on. If not sitting then zero. |
@@ -740,6 +742,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
740 | AttachmentsSyncLock = new Object(); | 742 | AttachmentsSyncLock = new Object(); |
741 | AllowMovement = true; | 743 | AllowMovement = true; |
742 | IsChildAgent = true; | 744 | IsChildAgent = true; |
745 | IsLoggingIn = false; | ||
743 | m_sendCoarseLocationsMethod = SendCoarseLocationsDefault; | 746 | m_sendCoarseLocationsMethod = SendCoarseLocationsDefault; |
744 | Animator = new ScenePresenceAnimator(this); | 747 | Animator = new ScenePresenceAnimator(this); |
745 | PresenceType = type; | 748 | PresenceType = type; |
@@ -912,6 +915,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
912 | else | 915 | else |
913 | { | 916 | { |
914 | IsChildAgent = false; | 917 | IsChildAgent = false; |
918 | IsLoggingIn = false; | ||
915 | } | 919 | } |
916 | 920 | ||
917 | 921 | ||
@@ -1405,35 +1409,43 @@ namespace OpenSim.Region.Framework.Scenes | |||
1405 | /// <param name="collisionPoint"></param> | 1409 | /// <param name="collisionPoint"></param> |
1406 | /// <param name="localid"></param> | 1410 | /// <param name="localid"></param> |
1407 | /// <param name="distance"></param> | 1411 | /// <param name="distance"></param> |
1412 | /// | ||
1413 | |||
1414 | private void UpdateCameraCollisionPlane(Vector4 plane) | ||
1415 | { | ||
1416 | if (m_lastCameraCollisionPlane != plane) | ||
1417 | { | ||
1418 | m_lastCameraCollisionPlane = plane; | ||
1419 | ControllingClient.SendCameraConstraint(plane); | ||
1420 | } | ||
1421 | } | ||
1422 | |||
1408 | public void RayCastCameraCallback(bool hitYN, Vector3 collisionPoint, uint localid, float distance, Vector3 pNormal) | 1423 | public void RayCastCameraCallback(bool hitYN, Vector3 collisionPoint, uint localid, float distance, Vector3 pNormal) |
1409 | { | 1424 | { |
1410 | const float POSITION_TOLERANCE = 0.02f; | 1425 | const float POSITION_TOLERANCE = 0.02f; |
1411 | const float VELOCITY_TOLERANCE = 0.02f; | ||
1412 | const float ROTATION_TOLERANCE = 0.02f; | 1426 | const float ROTATION_TOLERANCE = 0.02f; |
1413 | 1427 | ||
1414 | if (m_followCamAuto) | 1428 | m_doingCamRayCast = false; |
1429 | if (hitYN && localid != LocalId) | ||
1415 | { | 1430 | { |
1416 | if (hitYN) | 1431 | CameraConstraintActive = true; |
1417 | { | 1432 | pNormal.X = (float)Math.Round(pNormal.X, 2); |
1418 | CameraConstraintActive = true; | 1433 | pNormal.Y = (float)Math.Round(pNormal.Y, 2); |
1419 | //m_log.DebugFormat("[RAYCASTRESULT]: {0}, {1}, {2}, {3}", hitYN, collisionPoint, localid, distance); | 1434 | pNormal.Z = (float)Math.Round(pNormal.Z, 2); |
1420 | 1435 | pNormal.Normalize(); | |
1421 | Vector3 normal = Vector3.Normalize(new Vector3(0f, 0f, collisionPoint.Z) - collisionPoint); | 1436 | collisionPoint.X = (float)Math.Round(collisionPoint.X, 1); |
1422 | ControllingClient.SendCameraConstraint(new Vector4(normal.X, normal.Y, normal.Z, -1 * Vector3.Distance(new Vector3(0,0,collisionPoint.Z),collisionPoint))); | 1437 | collisionPoint.Y = (float)Math.Round(collisionPoint.Y, 1); |
1423 | } | 1438 | collisionPoint.Z = (float)Math.Round(collisionPoint.Z, 1); |
1424 | else | 1439 | |
1425 | { | 1440 | Vector4 plane = new Vector4(pNormal.X, pNormal.Y, pNormal.Z, Vector3.Dot(collisionPoint, pNormal)); |
1426 | if (!m_pos.ApproxEquals(m_lastPosition, POSITION_TOLERANCE) || | 1441 | UpdateCameraCollisionPlane(plane); |
1427 | !Velocity.ApproxEquals(m_lastVelocity, VELOCITY_TOLERANCE) || | 1442 | } |
1428 | !Rotation.ApproxEquals(m_lastRotation, ROTATION_TOLERANCE)) | 1443 | else if (!m_pos.ApproxEquals(m_lastPosition, POSITION_TOLERANCE) || |
1429 | { | 1444 | !Rotation.ApproxEquals(m_lastRotation, ROTATION_TOLERANCE)) |
1430 | if (CameraConstraintActive) | 1445 | { |
1431 | { | 1446 | Vector4 plane = new Vector4(0.9f, 0.0f, 0.361f, -9000f); // not right... |
1432 | ControllingClient.SendCameraConstraint(new Vector4(0f, 0.5f, 0.9f, -3000f)); | 1447 | UpdateCameraCollisionPlane(plane); |
1433 | CameraConstraintActive = false; | 1448 | CameraConstraintActive = false; |
1434 | } | ||
1435 | } | ||
1436 | } | ||
1437 | } | 1449 | } |
1438 | } | 1450 | } |
1439 | 1451 | ||
@@ -1508,12 +1520,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
1508 | // DrawDistance = agentData.Far; | 1520 | // DrawDistance = agentData.Far; |
1509 | DrawDistance = Scene.DefaultDrawDistance; | 1521 | DrawDistance = Scene.DefaultDrawDistance; |
1510 | 1522 | ||
1511 | // Check if Client has camera in 'follow cam' or 'build' mode. | ||
1512 | Vector3 camdif = (Vector3.One * Rotation - Vector3.One * CameraRotation); | ||
1513 | |||
1514 | m_followCamAuto = ((CameraUpAxis.Z > 0.959f && CameraUpAxis.Z < 0.98f) | ||
1515 | && (Math.Abs(camdif.X) < 0.4f && Math.Abs(camdif.Y) < 0.4f)) ? true : false; | ||
1516 | |||
1517 | m_mouseLook = (flags & AgentManager.ControlFlags.AGENT_CONTROL_MOUSELOOK) != 0; | 1523 | m_mouseLook = (flags & AgentManager.ControlFlags.AGENT_CONTROL_MOUSELOOK) != 0; |
1518 | m_leftButtonDown = (flags & AgentManager.ControlFlags.AGENT_CONTROL_LBUTTON_DOWN) != 0; | 1524 | m_leftButtonDown = (flags & AgentManager.ControlFlags.AGENT_CONTROL_LBUTTON_DOWN) != 0; |
1519 | 1525 | ||
@@ -1533,24 +1539,38 @@ namespace OpenSim.Region.Framework.Scenes | |||
1533 | StandUp(); | 1539 | StandUp(); |
1534 | } | 1540 | } |
1535 | 1541 | ||
1536 | //m_log.DebugFormat("[FollowCam]: {0}", m_followCamAuto); | ||
1537 | // Raycast from the avatar's head to the camera to see if there's anything blocking the view | 1542 | // Raycast from the avatar's head to the camera to see if there's anything blocking the view |
1538 | if ((m_movementUpdateCount % NumMovementsBetweenRayCast) == 0 && m_scene.PhysicsScene.SupportsRayCast()) | 1543 | // this exclude checks may not be complete |
1544 | |||
1545 | if (m_movementUpdateCount % NumMovementsBetweenRayCast == 0 && m_scene.PhysicsScene.SupportsRayCast()) | ||
1539 | { | 1546 | { |
1540 | if (m_followCamAuto) | 1547 | if (!m_doingCamRayCast && !m_mouseLook && ParentID == 0) |
1541 | { | 1548 | { |
1542 | // Vector3 posAdjusted = m_pos + HEAD_ADJUSTMENT; | 1549 | Vector3 posAdjusted = AbsolutePosition; |
1543 | // m_scene.PhysicsScene.RaycastWorld(m_pos, Vector3.Normalize(CameraPosition - posAdjusted), Vector3.Distance(CameraPosition, posAdjusted) + 0.3f, RayCastCameraCallback); | 1550 | // posAdjusted.Z += 0.5f * Appearance.AvatarSize.Z - 0.5f; |
1544 | 1551 | posAdjusted.Z += 1.0f; // viewer current camera focus point | |
1545 | Vector3 posAdjusted = AbsolutePosition + HEAD_ADJUSTMENT; | 1552 | Vector3 tocam = CameraPosition - posAdjusted; |
1546 | Vector3 distTocam = CameraPosition - posAdjusted; | 1553 | tocam.X = (float)Math.Round(tocam.X, 1); |
1547 | float distTocamlen = distTocam.Length(); | 1554 | tocam.Y = (float)Math.Round(tocam.Y, 1); |
1548 | if (distTocamlen > 0) | 1555 | tocam.Z = (float)Math.Round(tocam.Z, 1); |
1556 | |||
1557 | float distTocamlen = tocam.Length(); | ||
1558 | if (distTocamlen > 0.3f) | ||
1549 | { | 1559 | { |
1550 | distTocam *= 1.0f / distTocamlen; | 1560 | tocam *= (1.0f / distTocamlen); |
1551 | m_scene.PhysicsScene.RaycastWorld(posAdjusted, distTocam, distTocamlen + 0.3f, RayCastCameraCallback); | 1561 | posAdjusted.X = (float)Math.Round(posAdjusted.X, 1); |
1562 | posAdjusted.Y = (float)Math.Round(posAdjusted.Y, 1); | ||
1563 | posAdjusted.Z = (float)Math.Round(posAdjusted.Z, 1); | ||
1564 | |||
1565 | m_doingCamRayCast = true; | ||
1566 | m_scene.PhysicsScene.RaycastWorld(posAdjusted, tocam, distTocamlen + 1.0f, RayCastCameraCallback); | ||
1552 | } | 1567 | } |
1553 | 1568 | } | |
1569 | else if (CameraConstraintActive && (m_mouseLook || ParentID != 0)) | ||
1570 | { | ||
1571 | Vector4 plane = new Vector4(0.9f, 0.0f, 0.361f, -10000f); // not right... | ||
1572 | UpdateCameraCollisionPlane(plane); | ||
1573 | CameraConstraintActive = false; | ||
1554 | } | 1574 | } |
1555 | } | 1575 | } |
1556 | 1576 | ||
@@ -2265,7 +2285,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
2265 | ControllingClient.SendAlertMessage(" Sit position on restricted land, try another spot"); | 2285 | ControllingClient.SendAlertMessage(" Sit position on restricted land, try another spot"); |
2266 | return; | 2286 | return; |
2267 | } | 2287 | } |
2268 | // m_log.InfoFormat("physsit {0} {1}", offset.ToString(),Orientation.ToString()); | ||
2269 | 2288 | ||
2270 | RemoveFromPhysicalScene(); | 2289 | RemoveFromPhysicalScene(); |
2271 | 2290 | ||
@@ -2276,7 +2295,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
2276 | 2295 | ||
2277 | part.AddSittingAvatar(UUID); | 2296 | part.AddSittingAvatar(UUID); |
2278 | 2297 | ||
2279 | |||
2280 | Vector3 cameraAtOffset = part.GetCameraAtOffset(); | 2298 | Vector3 cameraAtOffset = part.GetCameraAtOffset(); |
2281 | Vector3 cameraEyeOffset = part.GetCameraEyeOffset(); | 2299 | Vector3 cameraEyeOffset = part.GetCameraEyeOffset(); |
2282 | bool forceMouselook = part.GetForceMouselook(); | 2300 | bool forceMouselook = part.GetForceMouselook(); |
@@ -2502,20 +2520,12 @@ namespace OpenSim.Region.Framework.Scenes | |||
2502 | // NOTE: Velocity is not the same as m_velocity. Velocity will attempt to | 2520 | // NOTE: Velocity is not the same as m_velocity. Velocity will attempt to |
2503 | // grab the latest PhysicsActor velocity, whereas m_velocity is often | 2521 | // grab the latest PhysicsActor velocity, whereas m_velocity is often |
2504 | // storing a requested force instead of an actual traveling velocity | 2522 | // storing a requested force instead of an actual traveling velocity |
2505 | if (Appearance.AvatarSize != m_lastSize) | 2523 | if (Appearance.AvatarSize != m_lastSize && !IsLoggingIn) |
2506 | { | ||
2507 | m_lastSize = Appearance.AvatarSize; | ||
2508 | SendAvatarDataToAllAgents(); | 2524 | SendAvatarDataToAllAgents(); |
2509 | } | ||
2510 | // Throw away duplicate or insignificant updates | ||
2511 | else if ( | ||
2512 | // If the velocity has become zero, send it no matter what. | ||
2513 | (Velocity != m_lastVelocity && Velocity == Vector3.Zero) | ||
2514 | // otherwise, if things have changed reasonably, send the update | ||
2515 | || (!Rotation.ApproxEquals(m_lastRotation, ROTATION_TOLERANCE) | ||
2516 | || !Velocity.ApproxEquals(m_lastVelocity, VELOCITY_TOLERANCE) | ||
2517 | || !m_pos.ApproxEquals(m_lastPosition, POSITION_TOLERANCE))) | ||
2518 | 2525 | ||
2526 | if (!Rotation.ApproxEquals(m_lastRotation, ROTATION_TOLERANCE) || | ||
2527 | !Velocity.ApproxEquals(m_lastVelocity, VELOCITY_TOLERANCE) || | ||
2528 | !m_pos.ApproxEquals(m_lastPosition, POSITION_TOLERANCE)) | ||
2519 | { | 2529 | { |
2520 | SendTerseUpdateToAllClients(); | 2530 | SendTerseUpdateToAllClients(); |
2521 | 2531 | ||
@@ -2704,6 +2714,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
2704 | return; | 2714 | return; |
2705 | } | 2715 | } |
2706 | 2716 | ||
2717 | m_lastSize = Appearance.AvatarSize; | ||
2718 | |||
2707 | int count = 0; | 2719 | int count = 0; |
2708 | m_scene.ForEachScenePresence(delegate(ScenePresence scenePresence) | 2720 | m_scene.ForEachScenePresence(delegate(ScenePresence scenePresence) |
2709 | { | 2721 | { |