diff options
author | Teravus Ovares | 2009-07-19 02:32:02 +0000 |
---|---|---|
committer | Teravus Ovares | 2009-07-19 02:32:02 +0000 |
commit | 08819bcbea9012d67cc4cb44e4d7ec7e5837bac6 (patch) | |
tree | 9158d1b42f1563db2294cfce5e85f41f1345d613 /OpenSim/Region/Framework/Scenes/ScenePresence.cs | |
parent | Thank you, otakup0pe, for a patch that enables basic auth with LSL (diff) | |
download | opensim-SC-08819bcbea9012d67cc4cb44e4d7ec7e5837bac6.zip opensim-SC-08819bcbea9012d67cc4cb44e4d7ec7e5837bac6.tar.gz opensim-SC-08819bcbea9012d67cc4cb44e4d7ec7e5837bac6.tar.bz2 opensim-SC-08819bcbea9012d67cc4cb44e4d7ec7e5837bac6.tar.xz |
* Created a way that the OpenSimulator scene can ask the physics scene to do a raycast test safely.
* Test for prim obstructions between the avatar and camera. If there are obstructions, inform the client to move the camera closer. This makes it so that walls and objects don't obstruct your view while you're moving around. Try walking inside a hollowed tori. You'll see how much easier it is now because your camera automatically moves closer so you can still see.
* Created a way to know if the user's camera is alt + cammed or just following the avatar.
* Changes IClientAPI interface by adding SendCameraConstraint(Vector4 CameraConstraint)
Diffstat (limited to 'OpenSim/Region/Framework/Scenes/ScenePresence.cs')
-rw-r--r-- | OpenSim/Region/Framework/Scenes/ScenePresence.cs | 73 |
1 files changed, 72 insertions, 1 deletions
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index 87207a0..2a8436b 100644 --- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs | |||
@@ -186,6 +186,14 @@ namespace OpenSim.Region.Framework.Scenes | |||
186 | //PauPaw:Proper PID Controler for autopilot************ | 186 | //PauPaw:Proper PID Controler for autopilot************ |
187 | private bool m_moveToPositionInProgress; | 187 | private bool m_moveToPositionInProgress; |
188 | private Vector3 m_moveToPositionTarget = Vector3.Zero; | 188 | private Vector3 m_moveToPositionTarget = Vector3.Zero; |
189 | |||
190 | private bool m_followCamAuto = false; | ||
191 | |||
192 | private int m_movementUpdateCount = 0; | ||
193 | |||
194 | private const int NumMovementsBetweenRayCast = 5; | ||
195 | |||
196 | private bool CameraConstraintActive = false; | ||
189 | //private int m_moveToPositionStateStatus = 0; | 197 | //private int m_moveToPositionStateStatus = 0; |
190 | //***************************************************** | 198 | //***************************************************** |
191 | 199 | ||
@@ -1073,6 +1081,44 @@ namespace OpenSim.Region.Framework.Scenes | |||
1073 | } | 1081 | } |
1074 | } | 1082 | } |
1075 | 1083 | ||
1084 | |||
1085 | /// <summary> | ||
1086 | /// Callback for the Camera view block check. Gets called with the results of the camera view block test | ||
1087 | /// hitYN is true when there's something in the way. | ||
1088 | /// </summary> | ||
1089 | /// <param name="hitYN"></param> | ||
1090 | /// <param name="collisionPoint"></param> | ||
1091 | /// <param name="localid"></param> | ||
1092 | /// <param name="distance"></param> | ||
1093 | public void RayCastCameraCallback(bool hitYN, Vector3 collisionPoint, uint localid, float distance) | ||
1094 | { | ||
1095 | if (m_followCamAuto) | ||
1096 | { | ||
1097 | |||
1098 | if (hitYN) | ||
1099 | { | ||
1100 | CameraConstraintActive = true; | ||
1101 | //m_log.DebugFormat("[RAYCASTRESULT]: {0}, {1}, {2}, {3}", hitYN, collisionPoint, localid, distance); | ||
1102 | |||
1103 | Vector3 normal = Vector3.Normalize(new Vector3(0,0,collisionPoint.Z) - collisionPoint); | ||
1104 | ControllingClient.SendCameraConstraint(new Vector4(normal.X, normal.Y, normal.Z, -1 * Vector3.Distance(new Vector3(0,0,collisionPoint.Z),collisionPoint))); | ||
1105 | } | ||
1106 | else | ||
1107 | { | ||
1108 | if (((Util.GetDistanceTo(lastPhysPos, AbsolutePosition) > 0.02) | ||
1109 | || (Util.GetDistanceTo(m_lastVelocity, m_velocity) > 0.02) | ||
1110 | || lastPhysRot != m_bodyRot)) | ||
1111 | { | ||
1112 | if (CameraConstraintActive) | ||
1113 | { | ||
1114 | ControllingClient.SendCameraConstraint(new Vector4(0, 0.5f, 0.9f, -3000f)); | ||
1115 | CameraConstraintActive = false; | ||
1116 | } | ||
1117 | } | ||
1118 | } | ||
1119 | } | ||
1120 | } | ||
1121 | |||
1076 | /// <summary> | 1122 | /// <summary> |
1077 | /// This is the event handler for client movement. If a client is moving, this event is triggering. | 1123 | /// This is the event handler for client movement. If a client is moving, this event is triggering. |
1078 | /// </summary> | 1124 | /// </summary> |
@@ -1098,11 +1144,18 @@ namespace OpenSim.Region.Framework.Scenes | |||
1098 | // return; | 1144 | // return; |
1099 | //} | 1145 | //} |
1100 | 1146 | ||
1147 | |||
1148 | m_movementUpdateCount++; | ||
1149 | if (m_movementUpdateCount >= int.MaxValue) | ||
1150 | m_movementUpdateCount = 1; | ||
1151 | |||
1152 | |||
1101 | // Must check for standing up even when PhysicsActor is null, | 1153 | // Must check for standing up even when PhysicsActor is null, |
1102 | // since sitting currently removes avatar from physical scene | 1154 | // since sitting currently removes avatar from physical scene |
1103 | //m_log.Debug("agentPos:" + AbsolutePosition.ToString()); | 1155 | //m_log.Debug("agentPos:" + AbsolutePosition.ToString()); |
1104 | 1156 | ||
1105 | // This is irritating. Really. | 1157 | // This is irritating. Really. |
1158 | |||
1106 | if (!AbsolutePosition.IsFinite()) | 1159 | if (!AbsolutePosition.IsFinite()) |
1107 | { | 1160 | { |
1108 | RemoveFromPhysicalScene(); | 1161 | RemoveFromPhysicalScene(); |
@@ -1157,8 +1210,26 @@ namespace OpenSim.Region.Framework.Scenes | |||
1157 | { | 1210 | { |
1158 | StandUp(); | 1211 | StandUp(); |
1159 | } | 1212 | } |
1160 | |||
1161 | 1213 | ||
1214 | |||
1215 | |||
1216 | // Check if Client has camera in 'follow cam' or 'build' mode. | ||
1217 | Vector3 camdif = (Vector3.One * m_bodyRot - Vector3.One * CameraRotation); | ||
1218 | |||
1219 | m_followCamAuto = ((m_CameraUpAxis.Z > 0.959f && m_CameraUpAxis.Z < 0.98f) | ||
1220 | && (Math.Abs(camdif.X) < 0.4f && Math.Abs(camdif.Y) < 0.4f)) ? true : false; | ||
1221 | |||
1222 | |||
1223 | // Raycast from the avatar's head to the camera to see if there's anything blocking the view | ||
1224 | if ((m_movementUpdateCount % NumMovementsBetweenRayCast) == 0 && m_scene.PhysicsScene.SupportsRayCast()) | ||
1225 | { | ||
1226 | |||
1227 | if (m_followCamAuto) | ||
1228 | { | ||
1229 | Vector3 headadjustment = new Vector3(0, 0, 0.3f); | ||
1230 | m_scene.PhysicsScene.RaycastWorld(m_pos, Vector3.Normalize(m_CameraCenter - (m_pos + headadjustment)), Vector3.Distance(m_CameraCenter, (m_pos + headadjustment)) + 0.3f, RayCastCameraCallback); | ||
1231 | } | ||
1232 | } | ||
1162 | 1233 | ||
1163 | m_mouseLook = (flags & (uint) AgentManager.ControlFlags.AGENT_CONTROL_MOUSELOOK) != 0; | 1234 | m_mouseLook = (flags & (uint) AgentManager.ControlFlags.AGENT_CONTROL_MOUSELOOK) != 0; |
1164 | 1235 | ||