aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--OpenSim/Region/Framework/Scenes/ScenePresence.cs106
-rw-r--r--OpenSim/Region/Physics/UbitOdePlugin/ODERayCastRequestManager.cs41
2 files changed, 90 insertions, 57 deletions
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index b6407d2..be3a39a 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
@@ -1405,36 +1406,43 @@ namespace OpenSim.Region.Framework.Scenes
1405 /// <param name="collisionPoint"></param> 1406 /// <param name="collisionPoint"></param>
1406 /// <param name="localid"></param> 1407 /// <param name="localid"></param>
1407 /// <param name="distance"></param> 1408 /// <param name="distance"></param>
1409 ///
1410
1411 private void UpdateCameraCollisionPlane(Vector4 plane)
1412 {
1413 if (m_lastCameraCollisionPlane != plane)
1414 {
1415 m_lastCameraCollisionPlane = plane;
1416 ControllingClient.SendCameraConstraint(plane);
1417 }
1418 }
1419
1408 public void RayCastCameraCallback(bool hitYN, Vector3 collisionPoint, uint localid, float distance, Vector3 pNormal) 1420 public void RayCastCameraCallback(bool hitYN, Vector3 collisionPoint, uint localid, float distance, Vector3 pNormal)
1409 { 1421 {
1410 const float POSITION_TOLERANCE = 0.02f; 1422 const float POSITION_TOLERANCE = 0.02f;
1411 const float VELOCITY_TOLERANCE = 0.02f;
1412 const float ROTATION_TOLERANCE = 0.02f; 1423 const float ROTATION_TOLERANCE = 0.02f;
1413 1424
1414 if (m_followCamAuto) 1425 m_doingCamRayCast = false;
1426 if (hitYN && localid != LocalId)
1415 { 1427 {
1416 if (hitYN && localid != LocalId) 1428 CameraConstraintActive = true;
1417 { 1429 pNormal.X = (float)Math.Round(pNormal.X, 2);
1418 1430 pNormal.Y = (float)Math.Round(pNormal.Y, 2);
1419 CameraConstraintActive = true; 1431 pNormal.Z = (float)Math.Round(pNormal.Z, 2);
1420 //m_log.DebugFormat("[RAYCASTRESULT]: {0}, {1}, {2}, {3}", hitYN, collisionPoint, localid, distance); 1432 pNormal.Normalize();
1421 1433 collisionPoint.X = (float)Math.Round(collisionPoint.X, 1);
1422 Vector3 normal = Vector3.Normalize(new Vector3(0f, 0f, collisionPoint.Z) - collisionPoint); 1434 collisionPoint.Y = (float)Math.Round(collisionPoint.Y, 1);
1423 ControllingClient.SendCameraConstraint(new Vector4(normal.X, normal.Y, normal.Z, -1 * Vector3.Distance(new Vector3(0,0,collisionPoint.Z),collisionPoint))); 1435 collisionPoint.Z = (float)Math.Round(collisionPoint.Z, 1);
1424 } 1436
1425 else 1437 Vector4 plane = new Vector4(pNormal.X, pNormal.Y, pNormal.Z, Vector3.Dot(collisionPoint, pNormal));
1426 { 1438 UpdateCameraCollisionPlane(plane);
1427 if (!m_pos.ApproxEquals(m_lastPosition, POSITION_TOLERANCE) || 1439 }
1428 !Velocity.ApproxEquals(m_lastVelocity, VELOCITY_TOLERANCE) || 1440 else if (!m_pos.ApproxEquals(m_lastPosition, POSITION_TOLERANCE) ||
1429 !Rotation.ApproxEquals(m_lastRotation, ROTATION_TOLERANCE)) 1441 !Rotation.ApproxEquals(m_lastRotation, ROTATION_TOLERANCE))
1430 { 1442 {
1431 if (CameraConstraintActive) 1443 Vector4 plane = new Vector4(0.9f, 0.0f, 0.361f, -9000f); // not right...
1432 { 1444 UpdateCameraCollisionPlane(plane);
1433 ControllingClient.SendCameraConstraint(new Vector4(0f, 0.5f, 0.9f, -3000f)); 1445 CameraConstraintActive = false;
1434 CameraConstraintActive = false;
1435 }
1436 }
1437 }
1438 } 1446 }
1439 } 1447 }
1440 1448
@@ -1509,12 +1517,6 @@ namespace OpenSim.Region.Framework.Scenes
1509 // DrawDistance = agentData.Far; 1517 // DrawDistance = agentData.Far;
1510 DrawDistance = Scene.DefaultDrawDistance; 1518 DrawDistance = Scene.DefaultDrawDistance;
1511 1519
1512 // Check if Client has camera in 'follow cam' or 'build' mode.
1513 Vector3 camdif = (Vector3.One * Rotation - Vector3.One * CameraRotation);
1514
1515 m_followCamAuto = ((CameraUpAxis.Z > 0.959f && CameraUpAxis.Z < 0.98f)
1516 && (Math.Abs(camdif.X) < 0.4f && Math.Abs(camdif.Y) < 0.4f)) ? true : false;
1517
1518 m_mouseLook = (flags & AgentManager.ControlFlags.AGENT_CONTROL_MOUSELOOK) != 0; 1520 m_mouseLook = (flags & AgentManager.ControlFlags.AGENT_CONTROL_MOUSELOOK) != 0;
1519 m_leftButtonDown = (flags & AgentManager.ControlFlags.AGENT_CONTROL_LBUTTON_DOWN) != 0; 1521 m_leftButtonDown = (flags & AgentManager.ControlFlags.AGENT_CONTROL_LBUTTON_DOWN) != 0;
1520 1522
@@ -1534,24 +1536,38 @@ namespace OpenSim.Region.Framework.Scenes
1534 StandUp(); 1536 StandUp();
1535 } 1537 }
1536 1538
1537 //m_log.DebugFormat("[FollowCam]: {0}", m_followCamAuto);
1538 // Raycast from the avatar's head to the camera to see if there's anything blocking the view 1539 // Raycast from the avatar's head to the camera to see if there's anything blocking the view
1539 if ((m_movementUpdateCount % NumMovementsBetweenRayCast) == 0 && m_scene.PhysicsScene.SupportsRayCast()) 1540 // this exclude checks may not be complete
1541
1542 if (m_movementUpdateCount % NumMovementsBetweenRayCast == 0 && m_scene.PhysicsScene.SupportsRayCast())
1540 { 1543 {
1541 if (m_followCamAuto) 1544 if (!m_doingCamRayCast && !m_mouseLook && ParentID == 0)
1542 { 1545 {
1543 // Vector3 posAdjusted = m_pos + HEAD_ADJUSTMENT; 1546 Vector3 posAdjusted = AbsolutePosition;
1544 // m_scene.PhysicsScene.RaycastWorld(m_pos, Vector3.Normalize(CameraPosition - posAdjusted), Vector3.Distance(CameraPosition, posAdjusted) + 0.3f, RayCastCameraCallback); 1547// posAdjusted.Z += 0.5f * Appearance.AvatarSize.Z - 0.5f;
1545 1548 posAdjusted.Z += 1.0f; // viewer current camera focus point
1546 Vector3 posAdjusted = AbsolutePosition + HEAD_ADJUSTMENT; 1549 Vector3 tocam = CameraPosition - posAdjusted;
1547 Vector3 distTocam = CameraPosition - posAdjusted; 1550 tocam.X = (float)Math.Round(tocam.X, 1);
1548 float distTocamlen = distTocam.Length(); 1551 tocam.Y = (float)Math.Round(tocam.Y, 1);
1549 if (distTocamlen > 0) 1552 tocam.Z = (float)Math.Round(tocam.Z, 1);
1553
1554 float distTocamlen = tocam.Length();
1555 if (distTocamlen > 0.3f)
1550 { 1556 {
1551 distTocam *= 1.0f / distTocamlen; 1557 tocam *= (1.0f / distTocamlen);
1552 m_scene.PhysicsScene.RaycastWorld(posAdjusted, distTocam, distTocamlen + 0.3f, RayCastCameraCallback); 1558 posAdjusted.X = (float)Math.Round(posAdjusted.X, 1);
1559 posAdjusted.Y = (float)Math.Round(posAdjusted.Y, 1);
1560 posAdjusted.Z = (float)Math.Round(posAdjusted.Z, 1);
1561
1562 m_doingCamRayCast = true;
1563 m_scene.PhysicsScene.RaycastWorld(posAdjusted, tocam, distTocamlen + 1.0f, RayCastCameraCallback);
1553 } 1564 }
1554 1565 }
1566 else if (CameraConstraintActive && (m_mouseLook || ParentID != 0))
1567 {
1568 Vector4 plane = new Vector4(0.9f, 0.0f, 0.361f, -10000f); // not right...
1569 UpdateCameraCollisionPlane(plane);
1570 CameraConstraintActive = false;
1555 } 1571 }
1556 } 1572 }
1557 1573
diff --git a/OpenSim/Region/Physics/UbitOdePlugin/ODERayCastRequestManager.cs b/OpenSim/Region/Physics/UbitOdePlugin/ODERayCastRequestManager.cs
index 6e9281b..7fe3109 100644
--- a/OpenSim/Region/Physics/UbitOdePlugin/ODERayCastRequestManager.cs
+++ b/OpenSim/Region/Physics/UbitOdePlugin/ODERayCastRequestManager.cs
@@ -173,8 +173,13 @@ namespace OpenSim.Region.Physics.OdePlugin
173 d.GeomRaySetClosestHit(ray, closestHit); 173 d.GeomRaySetClosestHit(ray, closestHit);
174 174
175 if (req.callbackMethod is RaycastCallback) 175 if (req.callbackMethod is RaycastCallback)
176 {
176 // if we only want one get only one per Collision pair saving memory 177 // if we only want one get only one per Collision pair saving memory
177 CurrentRayFilter |= RayFilterFlags.ClosestHit; 178 CurrentRayFilter |= RayFilterFlags.ClosestHit;
179 d.GeomRaySetClosestHit(ray, 1);
180 }
181 else
182 d.GeomRaySetClosestHit(ray, closestHit);
178 } 183 }
179 184
180 if ((CurrentRayFilter & RayFilterFlags.ContactsUnImportant) != 0) 185 if ((CurrentRayFilter & RayFilterFlags.ContactsUnImportant) != 0)
@@ -555,10 +560,13 @@ namespace OpenSim.Region.Physics.OdePlugin
555 560
556 ContactResult collisionresult = new ContactResult(); 561 ContactResult collisionresult = new ContactResult();
557 collisionresult.ConsumerID = ID; 562 collisionresult.ConsumerID = ID;
558 collisionresult.Pos = new Vector3(curcontact.pos.X, curcontact.pos.Y, curcontact.pos.Z); 563 collisionresult.Pos.X = curcontact.pos.X;
564 collisionresult.Pos.Y = curcontact.pos.Y;
565 collisionresult.Pos.Z = curcontact.pos.Z;
559 collisionresult.Depth = curcontact.depth; 566 collisionresult.Depth = curcontact.depth;
560 collisionresult.Normal = new Vector3(curcontact.normal.X, curcontact.normal.Y, 567 collisionresult.Normal.X = curcontact.normal.X;
561 curcontact.normal.Z); 568 collisionresult.Normal.Y = curcontact.normal.Y;
569 collisionresult.Normal.Z = curcontact.normal.Z;
562 lock (m_contactResults) 570 lock (m_contactResults)
563 { 571 {
564 m_contactResults.Add(collisionresult); 572 m_contactResults.Add(collisionresult);
@@ -581,10 +589,13 @@ namespace OpenSim.Region.Physics.OdePlugin
581 589
582 if (curcontact.depth < collisionresult.Depth) 590 if (curcontact.depth < collisionresult.Depth)
583 { 591 {
584 collisionresult.Pos = new Vector3(curcontact.pos.X, curcontact.pos.Y, curcontact.pos.Z); 592 collisionresult.Pos.X = curcontact.pos.X;
593 collisionresult.Pos.Y = curcontact.pos.Y;
594 collisionresult.Pos.Z = curcontact.pos.Z;
585 collisionresult.Depth = curcontact.depth; 595 collisionresult.Depth = curcontact.depth;
586 collisionresult.Normal = new Vector3(curcontact.normal.X, curcontact.normal.Y, 596 collisionresult.Normal.X = curcontact.normal.X;
587 curcontact.normal.Z); 597 collisionresult.Normal.Y = curcontact.normal.Y;
598 collisionresult.Normal.Z = curcontact.normal.Z;
588 } 599 }
589 } 600 }
590 601
@@ -699,10 +710,13 @@ namespace OpenSim.Region.Physics.OdePlugin
699 710
700 ContactResult collisionresult = new ContactResult(); 711 ContactResult collisionresult = new ContactResult();
701 collisionresult.ConsumerID = ID; 712 collisionresult.ConsumerID = ID;
702 collisionresult.Pos = new Vector3(curcontact.pos.X, curcontact.pos.Y, curcontact.pos.Z); 713 collisionresult.Pos.X = curcontact.pos.X;
714 collisionresult.Pos.Y = curcontact.pos.Y;
715 collisionresult.Pos.Z = curcontact.pos.Z;
703 collisionresult.Depth = curcontact.depth; 716 collisionresult.Depth = curcontact.depth;
704 collisionresult.Normal = new Vector3(curcontact.normal.X, curcontact.normal.Y, 717 collisionresult.Normal.X = curcontact.normal.X;
705 curcontact.normal.Z); 718 collisionresult.Normal.Y = curcontact.normal.Y;
719 collisionresult.Normal.Z = curcontact.normal.Z;
706 lock (m_contactResults) 720 lock (m_contactResults)
707 { 721 {
708 m_contactResults.Add(collisionresult); 722 m_contactResults.Add(collisionresult);
@@ -725,10 +739,13 @@ namespace OpenSim.Region.Physics.OdePlugin
725 739
726 if (curcontact.depth < collisionresult.Depth) 740 if (curcontact.depth < collisionresult.Depth)
727 { 741 {
728 collisionresult.Pos = new Vector3(curcontact.pos.X, curcontact.pos.Y, curcontact.pos.Z); 742 collisionresult.Pos.X = curcontact.pos.X;
743 collisionresult.Pos.Y = curcontact.pos.Y;
744 collisionresult.Pos.Z = curcontact.pos.Z;
729 collisionresult.Depth = curcontact.depth; 745 collisionresult.Depth = curcontact.depth;
730 collisionresult.Normal = new Vector3(curcontact.normal.X, curcontact.normal.Y, 746 collisionresult.Normal.X = curcontact.normal.X;
731 curcontact.normal.Z); 747 collisionresult.Normal.Y = curcontact.normal.Y;
748 collisionresult.Normal.Z = curcontact.normal.Z;
732 } 749 }
733 } 750 }
734 751