diff options
Diffstat (limited to 'OpenSim/Region/Framework/Scenes/Animation')
-rw-r--r-- | OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs | 226 |
1 files changed, 164 insertions, 62 deletions
diff --git a/OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs b/OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs index 4865481..9c103cb 100644 --- a/OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs +++ b/OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs | |||
@@ -53,11 +53,17 @@ namespace OpenSim.Region.Framework.Scenes.Animation | |||
53 | { | 53 | { |
54 | get { return m_movementAnimation; } | 54 | get { return m_movementAnimation; } |
55 | } | 55 | } |
56 | protected string m_movementAnimation = "DEFAULT"; | 56 | // protected string m_movementAnimation = "DEFAULT"; //KF: 'DEFAULT' does not exist! |
57 | 57 | protected string m_movementAnimation = "CROUCH"; //KF: CROUCH ensures reliable Av Anim. init. | |
58 | private int m_animTickFall; | 58 | private int m_animTickFall; |
59 | private int m_animTickJump; | 59 | // private int m_animTickJump; |
60 | 60 | public int m_animTickJump; // ScenePresence has to see this to control +Z force | |
61 | public bool m_jumping = false; // Add for jumping | ||
62 | public float m_jumpVelocity = 0f; // Add for jumping | ||
63 | private int m_landing = 0; // Add for jumping | ||
64 | public bool m_falling = false; // Add for falling | ||
65 | private float m_fallHeight; // Add for falling | ||
66 | |||
61 | /// <value> | 67 | /// <value> |
62 | /// The scene presence that this animator applies to | 68 | /// The scene presence that this animator applies to |
63 | /// </value> | 69 | /// </value> |
@@ -114,7 +120,9 @@ namespace OpenSim.Region.Framework.Scenes.Animation | |||
114 | 120 | ||
115 | public void ResetAnimations() | 121 | public void ResetAnimations() |
116 | { | 122 | { |
123 | Console.WriteLine("ResetA............."); | ||
117 | m_animations.Clear(); | 124 | m_animations.Clear(); |
125 | TrySetMovementAnimation("STAND"); | ||
118 | } | 126 | } |
119 | 127 | ||
120 | /// <summary> | 128 | /// <summary> |
@@ -123,8 +131,6 @@ namespace OpenSim.Region.Framework.Scenes.Animation | |||
123 | /// </summary> | 131 | /// </summary> |
124 | public void TrySetMovementAnimation(string anim) | 132 | public void TrySetMovementAnimation(string anim) |
125 | { | 133 | { |
126 | //m_log.DebugFormat("Updating movement animation to {0}", anim); | ||
127 | |||
128 | if (!m_scenePresence.IsChildAgent) | 134 | if (!m_scenePresence.IsChildAgent) |
129 | { | 135 | { |
130 | if (m_animations.TrySetDefaultAnimation( | 136 | if (m_animations.TrySetDefaultAnimation( |
@@ -142,14 +148,14 @@ namespace OpenSim.Region.Framework.Scenes.Animation | |||
142 | /// </summary> | 148 | /// </summary> |
143 | public string GetMovementAnimation() | 149 | public string GetMovementAnimation() |
144 | { | 150 | { |
145 | const float FALL_DELAY = 0.33f; | 151 | //Console.WriteLine("GMA-------"); //## |
146 | const float PREJUMP_DELAY = 0.25f; | 152 | //#@ const float FALL_DELAY = 0.33f; |
147 | 153 | const float FALL_DELAY = 800f; //## mS | |
154 | //rm for jumping const float PREJUMP_DELAY = 0.25f; | ||
155 | const float PREJUMP_DELAY = 200f; // mS add for jumping | ||
156 | const float JUMP_PERIOD = 800f; // mS add for jumping | ||
148 | #region Inputs | 157 | #region Inputs |
149 | if (m_scenePresence.SitGround) | 158 | |
150 | { | ||
151 | return "SIT_GROUND_CONSTRAINED"; | ||
152 | } | ||
153 | AgentManager.ControlFlags controlFlags = (AgentManager.ControlFlags)m_scenePresence.AgentControlFlags; | 159 | AgentManager.ControlFlags controlFlags = (AgentManager.ControlFlags)m_scenePresence.AgentControlFlags; |
154 | PhysicsActor actor = m_scenePresence.PhysicsActor; | 160 | PhysicsActor actor = m_scenePresence.PhysicsActor; |
155 | 161 | ||
@@ -159,11 +165,10 @@ namespace OpenSim.Region.Framework.Scenes.Animation | |||
159 | Vector3 left = Vector3.Transform(Vector3.UnitY, rotMatrix); | 165 | Vector3 left = Vector3.Transform(Vector3.UnitY, rotMatrix); |
160 | 166 | ||
161 | // Check control flags | 167 | // Check control flags |
162 | bool heldForward = | 168 | bool heldForward = ((controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_AT_POS) == AgentManager.ControlFlags.AGENT_CONTROL_AT_POS || (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_AT_POS) == AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_AT_POS); |
163 | (((controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_AT_POS) == AgentManager.ControlFlags.AGENT_CONTROL_AT_POS) || ((controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_AT_POS) == AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_AT_POS)); | 169 | bool heldBack = ((controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_AT_NEG) == AgentManager.ControlFlags.AGENT_CONTROL_AT_NEG || (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_AT_NEG) == AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_AT_NEG); |
164 | bool heldBack = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_AT_NEG) == AgentManager.ControlFlags.AGENT_CONTROL_AT_NEG; | 170 | bool heldLeft = ((controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_LEFT_POS) == AgentManager.ControlFlags.AGENT_CONTROL_LEFT_POS || (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_LEFT_POS) == AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_LEFT_POS); |
165 | bool heldLeft = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_LEFT_POS) == AgentManager.ControlFlags.AGENT_CONTROL_LEFT_POS; | 171 | bool heldRight = ((controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_LEFT_NEG) == AgentManager.ControlFlags.AGENT_CONTROL_LEFT_NEG || (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_LEFT_NEG) == AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_LEFT_NEG); |
166 | bool heldRight = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_LEFT_NEG) == AgentManager.ControlFlags.AGENT_CONTROL_LEFT_NEG; | ||
167 | //bool heldTurnLeft = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_TURN_LEFT) == AgentManager.ControlFlags.AGENT_CONTROL_TURN_LEFT; | 172 | //bool heldTurnLeft = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_TURN_LEFT) == AgentManager.ControlFlags.AGENT_CONTROL_TURN_LEFT; |
168 | //bool heldTurnRight = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_TURN_RIGHT) == AgentManager.ControlFlags.AGENT_CONTROL_TURN_RIGHT; | 173 | //bool heldTurnRight = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_TURN_RIGHT) == AgentManager.ControlFlags.AGENT_CONTROL_TURN_RIGHT; |
169 | bool heldUp = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_UP_POS) == AgentManager.ControlFlags.AGENT_CONTROL_UP_POS; | 174 | bool heldUp = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_UP_POS) == AgentManager.ControlFlags.AGENT_CONTROL_UP_POS; |
@@ -182,8 +187,7 @@ namespace OpenSim.Region.Framework.Scenes.Animation | |||
182 | 187 | ||
183 | // Is the avatar trying to move? | 188 | // Is the avatar trying to move? |
184 | // bool moving = (move != Vector3.Zero); | 189 | // bool moving = (move != Vector3.Zero); |
185 | bool jumping = m_animTickJump != 0; | 190 | // rm for jumping bool jumping = m_animTickJump != 0; |
186 | |||
187 | #endregion Inputs | 191 | #endregion Inputs |
188 | 192 | ||
189 | #region Flying | 193 | #region Flying |
@@ -192,6 +196,11 @@ namespace OpenSim.Region.Framework.Scenes.Animation | |||
192 | { | 196 | { |
193 | m_animTickFall = 0; | 197 | m_animTickFall = 0; |
194 | m_animTickJump = 0; | 198 | m_animTickJump = 0; |
199 | m_jumping = false; //add for jumping | ||
200 | m_falling = true; //add for falling | ||
201 | m_jumpVelocity = 0f; //add for jumping | ||
202 | actor.Selected = false; //add for jumping flag | ||
203 | m_fallHeight = actor.Position.Z; // save latest flying height | ||
195 | 204 | ||
196 | if (move.X != 0f || move.Y != 0f) | 205 | if (move.X != 0f || move.Y != 0f) |
197 | { | 206 | { |
@@ -203,8 +212,11 @@ namespace OpenSim.Region.Framework.Scenes.Animation | |||
203 | } | 212 | } |
204 | else if (move.Z < 0f) | 213 | else if (move.Z < 0f) |
205 | { | 214 | { |
206 | if (actor != null && actor.IsColliding) | 215 | if (actor != null && actor.IsColliding) |
216 | { //## | ||
217 | //Console.WriteLine("LAND FLYING"); // ## | ||
207 | return "LAND"; | 218 | return "LAND"; |
219 | } //# | ||
208 | else | 220 | else |
209 | return "HOVER_DOWN"; | 221 | return "HOVER_DOWN"; |
210 | } | 222 | } |
@@ -218,48 +230,127 @@ namespace OpenSim.Region.Framework.Scenes.Animation | |||
218 | 230 | ||
219 | #region Falling/Floating/Landing | 231 | #region Falling/Floating/Landing |
220 | 232 | ||
221 | if (actor == null || !actor.IsColliding) | 233 | // rm for jumping if (actor == null || !actor.IsColliding) |
234 | if ((actor == null || !actor.IsColliding) && !m_jumping) // add for jumping | ||
222 | { | 235 | { |
223 | float fallElapsed = (float)(Environment.TickCount - m_animTickFall) / 1000f; | 236 | // rm float fallElapsed = (float)(Environment.TickCount - m_animTickFall) / 1000f; |
237 | float fallElapsed = (float)(Environment.TickCount - m_animTickFall); // add, in mS | ||
224 | float fallVelocity = (actor != null) ? actor.Velocity.Z : 0.0f; | 238 | float fallVelocity = (actor != null) ? actor.Velocity.Z : 0.0f; |
239 | //Console.WriteLine("falling t={0} v={1}", fallElapsed, fallVelocity); //## | ||
240 | |||
241 | // rm for fall if (m_animTickFall == 0 || (fallElapsed > FALL_DELAY && fallVelocity >= 0.0f)) | ||
242 | if (!m_jumping && (fallVelocity < -3.0f) ) m_falling = true; // add for falling and jumping | ||
225 | 243 | ||
226 | if (m_animTickFall == 0 || (fallElapsed > FALL_DELAY && fallVelocity >= 0.0f)) | 244 | if (m_animTickFall == 0 || (fallVelocity >= 0.0f)) // add for jumping |
245 | // not falling yet or going up | ||
227 | { | 246 | { |
228 | // Just started falling | 247 | // reset start of fall time |
229 | m_animTickFall = Environment.TickCount; | 248 | m_animTickFall = Environment.TickCount; |
230 | } | 249 | } |
231 | else if (!jumping && fallElapsed > FALL_DELAY) | 250 | // else if (!jumping && fallElapsed > FALL_DELAY) |
251 | else if (!m_jumping && (fallElapsed > FALL_DELAY) && (fallVelocity < -3.0f) && (m_scenePresence.m_wasFlying)) // add for falling and jumping | ||
232 | { | 252 | { |
233 | // Falling long enough to trigger the animation | 253 | // Falling long enough to trigger the animation |
254 | //Console.WriteLine("FALLDOWN"); //## | ||
234 | return "FALLDOWN"; | 255 | return "FALLDOWN"; |
235 | } | 256 | } |
236 | else if (m_animTickJump == -1) | ||
237 | { | ||
238 | m_animTickJump = 0; | ||
239 | return "STAND"; | ||
240 | } | ||
241 | 257 | ||
242 | return m_movementAnimation; | 258 | return m_movementAnimation; |
243 | } | 259 | } |
244 | 260 | ||
245 | #endregion Falling/Floating/Landing | 261 | #endregion Falling/Floating/Landing |
246 | 262 | ||
263 | |||
264 | #region Jumping // section added for jumping... | ||
265 | |||
266 | int jumptime; | ||
267 | jumptime = Environment.TickCount - m_animTickJump; | ||
268 | |||
269 | |||
270 | if ((move.Z > 0f) && (!m_jumping)) | ||
271 | { | ||
272 | //Console.WriteLine("PJ {0}", jumptime); //## | ||
273 | // Start jumping, prejump | ||
274 | m_animTickFall = 0; | ||
275 | m_jumping = true; | ||
276 | m_falling = false; | ||
277 | actor.Selected = true; // borrowed for jmping flag | ||
278 | m_animTickJump = Environment.TickCount; | ||
279 | m_jumpVelocity = 0.35f; | ||
280 | return "PREJUMP"; | ||
281 | } | ||
282 | |||
283 | if(m_jumping) | ||
284 | { | ||
285 | if ( (jumptime > (JUMP_PERIOD * 1.5f)) && actor.IsColliding) | ||
286 | { | ||
287 | //Console.WriteLine("LA {0}", jumptime); //## | ||
288 | // end jumping | ||
289 | m_jumping = false; | ||
290 | m_falling = false; | ||
291 | actor.Selected = false; // borrowed for jumping flag | ||
292 | m_jumpVelocity = 0f; | ||
293 | m_animTickFall = Environment.TickCount; | ||
294 | return "LAND"; | ||
295 | } | ||
296 | else if (jumptime > JUMP_PERIOD) | ||
297 | { | ||
298 | //Console.WriteLine("JD {0}", jumptime); //## | ||
299 | // jump down | ||
300 | m_jumpVelocity = 0f; | ||
301 | return "JUMP"; | ||
302 | } | ||
303 | else if (jumptime > PREJUMP_DELAY) | ||
304 | { | ||
305 | //Console.WriteLine("JU {0}", jumptime); //## | ||
306 | // jump up | ||
307 | m_jumping = true; | ||
308 | m_jumpVelocity = 10f; | ||
309 | return "JUMP"; | ||
310 | } | ||
311 | } | ||
312 | |||
313 | #endregion Jumping // end added section | ||
314 | |||
247 | #region Ground Movement | 315 | #region Ground Movement |
248 | 316 | ||
249 | if (m_movementAnimation == "FALLDOWN") | 317 | if (m_movementAnimation == "FALLDOWN") |
250 | { | 318 | { |
319 | m_falling = false; | ||
251 | m_animTickFall = Environment.TickCount; | 320 | m_animTickFall = Environment.TickCount; |
252 | |||
253 | // TODO: SOFT_LAND support | 321 | // TODO: SOFT_LAND support |
254 | return "LAND"; | 322 | float fallHeight = m_fallHeight - actor.Position.Z; |
323 | //Console.WriteLine("Hit from {0}", fallHeight); //## | ||
324 | if (fallHeight > 15.0f) // add for falling | ||
325 | return "STANDUP"; | ||
326 | else if (fallHeight > 8.0f) // add for falling | ||
327 | return "SOFT_LAND"; // add for falling | ||
328 | else // add for falling | ||
329 | return "LAND"; // add for falling | ||
255 | } | 330 | } |
256 | else if (m_movementAnimation == "LAND") | 331 | // rm jumping float landElapsed = (float)(Environment.TickCount - m_animTickFall) / 1000f; |
332 | // rm jumping if ((m_animTickFall != 0) && (landElapsed <= FALL_DELAY)) | ||
333 | // rm for landing return "LAND"; | ||
334 | else if ((m_movementAnimation == "LAND") || (m_movementAnimation == "SOFT_LAND") || (m_movementAnimation == "STANDUP")) | ||
257 | { | 335 | { |
258 | float landElapsed = (float)(Environment.TickCount - m_animTickFall) / 1000f; | 336 | int landElapsed = Environment.TickCount - m_animTickFall; // add for jumping |
259 | if ((m_animTickFall != 0) && (landElapsed <= FALL_DELAY)) | 337 | int limit = 1000; // add for jumping |
260 | return "LAND"; | 338 | if(m_movementAnimation == "LAND") limit = 350; // add for jumping |
261 | } | 339 | // NB if the above is set too long a weird anim reset from some place prevents STAND from being sent to client |
262 | 340 | ||
341 | if ((m_animTickFall != 0) && (landElapsed <= limit)) // add for jumping | ||
342 | { | ||
343 | //Console.WriteLine("Lelapse {0}", m_movementAnimation); //## | ||
344 | return m_movementAnimation; | ||
345 | } | ||
346 | else | ||
347 | { | ||
348 | //Console.WriteLine("end/STAND"); //## | ||
349 | m_fallHeight = actor.Position.Z; // save latest flying height | ||
350 | return "STAND"; | ||
351 | } | ||
352 | } | ||
353 | /* This section removed, replaced by jumping section | ||
263 | m_animTickFall = 0; | 354 | m_animTickFall = 0; |
264 | 355 | ||
265 | if (move.Z > 0f) | 356 | if (move.Z > 0f) |
@@ -271,7 +362,7 @@ namespace OpenSim.Region.Framework.Scenes.Animation | |||
271 | m_animTickJump = Environment.TickCount; | 362 | m_animTickJump = Environment.TickCount; |
272 | return "PREJUMP"; | 363 | return "PREJUMP"; |
273 | } | 364 | } |
274 | else if (Environment.TickCount - m_animTickJump > PREJUMP_DELAY * 1000.0f) | 365 | else if (Environment.TickCount - m_animTickJump > PREJUMP_DELAY * 800.0f) |
275 | { | 366 | { |
276 | // Start actual jump | 367 | // Start actual jump |
277 | if (m_animTickJump == -1) | 368 | if (m_animTickJump == -1) |
@@ -284,37 +375,40 @@ namespace OpenSim.Region.Framework.Scenes.Animation | |||
284 | m_animTickJump = -1; | 375 | m_animTickJump = -1; |
285 | return "JUMP"; | 376 | return "JUMP"; |
286 | } | 377 | } |
287 | else | ||
288 | return "JUMP"; | ||
289 | } | 378 | } |
290 | else | 379 | else |
291 | { | 380 | { |
292 | // Not jumping | 381 | // Not jumping |
293 | m_animTickJump = 0; | 382 | m_animTickJump = 0; |
294 | 383 | */ | |
295 | if (move.X != 0f || move.Y != 0f) | 384 | // next section moved outside paren. and realigned for jumping |
296 | { | 385 | if (move.X != 0f || move.Y != 0f) |
297 | // Walking / crouchwalking / running | 386 | { |
298 | if (move.Z < 0f) | 387 | m_fallHeight = actor.Position.Z; // save latest flying height |
299 | return "CROUCHWALK"; | 388 | m_falling = false; // Add for falling |
300 | else if (m_scenePresence.SetAlwaysRun) | 389 | // Walking / crouchwalking / running |
301 | return "RUN"; | 390 | if (move.Z < 0f) |
302 | else | 391 | return "CROUCHWALK"; |
303 | return "WALK"; | 392 | else if (m_scenePresence.SetAlwaysRun) |
304 | } | 393 | return "RUN"; |
305 | else | 394 | else |
306 | { | 395 | return "WALK"; |
307 | // Not walking | ||
308 | if (move.Z < 0f) | ||
309 | return "CROUCH"; | ||
310 | else | ||
311 | return "STAND"; | ||
312 | } | ||
313 | } | 396 | } |
314 | 397 | // rm for jumping else | |
398 | else if (!m_jumping) // add for jumping | ||
399 | { | ||
400 | m_falling = false; // Add for falling | ||
401 | // Not walking | ||
402 | if (move.Z < 0f) | ||
403 | return "CROUCH"; | ||
404 | else | ||
405 | return "STAND"; | ||
406 | } | ||
407 | // end section realign for jumping | ||
315 | #endregion Ground Movement | 408 | #endregion Ground Movement |
316 | 409 | ||
317 | //return m_movementAnimation; | 410 | m_falling = false; // Add for falling |
411 | return m_movementAnimation; | ||
318 | } | 412 | } |
319 | 413 | ||
320 | /// <summary> | 414 | /// <summary> |
@@ -323,7 +417,15 @@ namespace OpenSim.Region.Framework.Scenes.Animation | |||
323 | public void UpdateMovementAnimations() | 417 | public void UpdateMovementAnimations() |
324 | { | 418 | { |
325 | m_movementAnimation = GetMovementAnimation(); | 419 | m_movementAnimation = GetMovementAnimation(); |
326 | TrySetMovementAnimation(m_movementAnimation); | 420 | /* if (m_movementAnimation == "PREJUMP" && !m_scenePresence.Scene.m_usePreJump) |
421 | { | ||
422 | // This was the previous behavior before PREJUMP | ||
423 | TrySetMovementAnimation("JUMP"); | ||
424 | } | ||
425 | else | ||
426 | { removed for jumping */ | ||
427 | TrySetMovementAnimation(m_movementAnimation); | ||
428 | // rm for jumping } | ||
327 | } | 429 | } |
328 | 430 | ||
329 | public UUID[] GetAnimationArray() | 431 | public UUID[] GetAnimationArray() |