aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/Framework/Scenes/Animation
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region/Framework/Scenes/Animation')
-rw-r--r--OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs244
1 files changed, 174 insertions, 70 deletions
diff --git a/OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs b/OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs
index e9e1845..175e8ed 100644
--- a/OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs
+++ b/OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs
@@ -26,6 +26,7 @@
26 */ 26 */
27 27
28using System; 28using System;
29using System.Threading;
29using System.Collections.Generic; 30using System.Collections.Generic;
30using System.Reflection; 31using System.Reflection;
31using log4net; 32using log4net;
@@ -42,7 +43,7 @@ namespace OpenSim.Region.Framework.Scenes.Animation
42 /// </summary> 43 /// </summary>
43 public class ScenePresenceAnimator 44 public class ScenePresenceAnimator
44 { 45 {
45// private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 46 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
46 47
47 public AnimationSet Animations 48 public AnimationSet Animations
48 { 49 {
@@ -57,11 +58,17 @@ namespace OpenSim.Region.Framework.Scenes.Animation
57 { 58 {
58 get { return m_movementAnimation; } 59 get { return m_movementAnimation; }
59 } 60 }
60 protected string m_movementAnimation = "DEFAULT"; 61 // protected string m_movementAnimation = "DEFAULT"; //KF: 'DEFAULT' does not exist!
61 62 protected string m_movementAnimation = "CROUCH"; //KF: CROUCH ensures reliable Av Anim. init.
62 private int m_animTickFall; 63 private int m_animTickFall;
63 private int m_animTickJump; 64// private int m_animTickJump;
64 65 public int m_animTickJump; // ScenePresence has to see this to control +Z force
66 public bool m_jumping = false; // Add for jumping
67 public float m_jumpVelocity = 0f; // Add for jumping
68 private int m_landing = 0; // Add for jumping
69 public bool m_falling = false; // Add for falling
70 private float m_fallHeight; // Add for falling
71
65 /// <value> 72 /// <value>
66 /// The scene presence that this animator applies to 73 /// The scene presence that this animator applies to
67 /// </value> 74 /// </value>
@@ -122,7 +129,9 @@ namespace OpenSim.Region.Framework.Scenes.Animation
122 129
123 public void ResetAnimations() 130 public void ResetAnimations()
124 { 131 {
132Console.WriteLine("ResetA.............");
125 m_animations.Clear(); 133 m_animations.Clear();
134TrySetMovementAnimation("STAND");
126 } 135 }
127 136
128 /// <summary> 137 /// <summary>
@@ -152,15 +161,16 @@ namespace OpenSim.Region.Framework.Scenes.Animation
152 /// </summary> 161 /// </summary>
153 public string GetMovementAnimation() 162 public string GetMovementAnimation()
154 { 163 {
155 const float FALL_DELAY = 0.33f; 164//Console.WriteLine("GMA-------"); //##
156 const float PREJUMP_DELAY = 0.25f; 165//#@ const float FALL_DELAY = 0.33f;
157 166 const float FALL_DELAY = 800f; //## mS
167//rm for jumping const float PREJUMP_DELAY = 0.25f;
168 const float PREJUMP_DELAY = 200f; // mS add for jumping
169 const float JUMP_PERIOD = 800f; // mS add for jumping
158 #region Inputs 170 #region Inputs
159 if (m_scenePresence.SitGround) 171
160 {
161 return "SIT_GROUND_CONSTRAINED";
162 }
163 AgentManager.ControlFlags controlFlags = (AgentManager.ControlFlags)m_scenePresence.AgentControlFlags; 172 AgentManager.ControlFlags controlFlags = (AgentManager.ControlFlags)m_scenePresence.AgentControlFlags;
173// m_log.DebugFormat("[ANIM]: Control flags: {0}", controlFlags);
164 PhysicsActor actor = m_scenePresence.PhysicsActor; 174 PhysicsActor actor = m_scenePresence.PhysicsActor;
165 175
166 // Create forward and left vectors from the current avatar rotation 176 // Create forward and left vectors from the current avatar rotation
@@ -169,13 +179,12 @@ namespace OpenSim.Region.Framework.Scenes.Animation
169 Vector3 left = Vector3.Transform(Vector3.UnitY, rotMatrix); 179 Vector3 left = Vector3.Transform(Vector3.UnitY, rotMatrix);
170 180
171 // Check control flags 181 // Check control flags
172 bool heldForward = 182 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);
173 (((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)); 183 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);
174 bool heldBack = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_AT_NEG) == AgentManager.ControlFlags.AGENT_CONTROL_AT_NEG; 184 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);
175 bool heldLeft = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_LEFT_POS) == AgentManager.ControlFlags.AGENT_CONTROL_LEFT_POS; 185 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);
176 bool heldRight = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_LEFT_NEG) == AgentManager.ControlFlags.AGENT_CONTROL_LEFT_NEG; 186 //bool heldTurnLeft = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_TURN_LEFT) == AgentManager.ControlFlags.AGENT_CONTROL_TURN_LEFT;
177 bool heldTurnLeft = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_TURN_LEFT) == AgentManager.ControlFlags.AGENT_CONTROL_TURN_LEFT; 187 //bool heldTurnRight = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_TURN_RIGHT) == AgentManager.ControlFlags.AGENT_CONTROL_TURN_RIGHT;
178 bool heldTurnRight = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_TURN_RIGHT) == AgentManager.ControlFlags.AGENT_CONTROL_TURN_RIGHT;
179 bool heldUp = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_UP_POS) == AgentManager.ControlFlags.AGENT_CONTROL_UP_POS; 188 bool heldUp = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_UP_POS) == AgentManager.ControlFlags.AGENT_CONTROL_UP_POS;
180 bool heldDown = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG) == AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG; 189 bool heldDown = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG) == AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG;
181 //bool flying = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_FLY) == AgentManager.ControlFlags.AGENT_CONTROL_FLY; 190 //bool flying = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_FLY) == AgentManager.ControlFlags.AGENT_CONTROL_FLY;
@@ -183,17 +192,16 @@ namespace OpenSim.Region.Framework.Scenes.Animation
183 192
184 // Direction in which the avatar is trying to move 193 // Direction in which the avatar is trying to move
185 Vector3 move = Vector3.Zero; 194 Vector3 move = Vector3.Zero;
186 if (heldForward) { move.X += fwd.X; move.Y += fwd.Y; }
187 if (heldBack) { move.X -= fwd.X; move.Y -= fwd.Y; } 195 if (heldBack) { move.X -= fwd.X; move.Y -= fwd.Y; }
188 if (heldLeft) { move.X += left.X; move.Y += left.Y; } 196 if (heldLeft) { move.X += left.X; move.Y += left.Y; }
189 if (heldRight) { move.X -= left.X; move.Y -= left.Y; } 197 if (heldRight) { move.X -= left.X; move.Y -= left.Y; }
190 if (heldUp) { move.Z += 1; } 198 if (heldUp) { move.Z += 1; }
191 if (heldDown) { move.Z -= 1; } 199 if (heldDown) { move.Z -= 1; }
200 if (heldForward) { move.X += fwd.X; move.Y += fwd.Y; }
192 201
193 // Is the avatar trying to move? 202 // Is the avatar trying to move?
194// bool moving = (move != Vector3.Zero); 203// bool moving = (move != Vector3.Zero);
195 bool jumping = m_animTickJump != 0; 204// rm for jumping bool jumping = m_animTickJump != 0;
196
197 #endregion Inputs 205 #endregion Inputs
198 206
199 #region Flying 207 #region Flying
@@ -202,6 +210,11 @@ namespace OpenSim.Region.Framework.Scenes.Animation
202 { 210 {
203 m_animTickFall = 0; 211 m_animTickFall = 0;
204 m_animTickJump = 0; 212 m_animTickJump = 0;
213 m_jumping = false; //add for jumping
214 m_falling = true; //add for falling
215 m_jumpVelocity = 0f; //add for jumping
216 actor.Selected = false; //add for jumping flag
217 m_fallHeight = actor.Position.Z; // save latest flying height
205 218
206 if (move.X != 0f || move.Y != 0f) 219 if (move.X != 0f || move.Y != 0f)
207 { 220 {
@@ -213,8 +226,11 @@ namespace OpenSim.Region.Framework.Scenes.Animation
213 } 226 }
214 else if (move.Z < 0f) 227 else if (move.Z < 0f)
215 { 228 {
216 if (actor != null && actor.IsColliding) 229 if (actor != null && actor.IsColliding)
230 { //##
231//Console.WriteLine("LAND FLYING"); // ##
217 return "LAND"; 232 return "LAND";
233 } //#
218 else 234 else
219 return "HOVER_DOWN"; 235 return "HOVER_DOWN";
220 } 236 }
@@ -228,48 +244,127 @@ namespace OpenSim.Region.Framework.Scenes.Animation
228 244
229 #region Falling/Floating/Landing 245 #region Falling/Floating/Landing
230 246
231 if (actor == null || !actor.IsColliding) 247// rm for jumping if (actor == null || !actor.IsColliding)
248 if ((actor == null || !actor.IsColliding) && !m_jumping) // add for jumping
232 { 249 {
233 float fallElapsed = (float)(Environment.TickCount - m_animTickFall) / 1000f; 250// rm float fallElapsed = (float)(Environment.TickCount - m_animTickFall) / 1000f;
251 float fallElapsed = (float)(Environment.TickCount - m_animTickFall); // add, in mS
234 float fallVelocity = (actor != null) ? actor.Velocity.Z : 0.0f; 252 float fallVelocity = (actor != null) ? actor.Velocity.Z : 0.0f;
253//Console.WriteLine("falling t={0} v={1}", fallElapsed, fallVelocity); //##
254
255// rm for fall if (m_animTickFall == 0 || (fallElapsed > FALL_DELAY && fallVelocity >= 0.0f))
256 if (!m_jumping && (fallVelocity < -3.0f) ) m_falling = true; // add for falling and jumping
235 257
236 if (m_animTickFall == 0 || (fallElapsed > FALL_DELAY && fallVelocity >= 0.0f)) 258 if (m_animTickFall == 0 || (fallVelocity >= 0.0f)) // add for jumping
259 // not falling yet or going up
237 { 260 {
238 // Just started falling 261 // reset start of fall time
239 m_animTickFall = Environment.TickCount; 262 m_animTickFall = Environment.TickCount;
240 } 263 }
241 else if (!jumping && fallElapsed > FALL_DELAY) 264// else if (!jumping && fallElapsed > FALL_DELAY)
265 else if (!m_jumping && (fallElapsed > FALL_DELAY) && (fallVelocity < -3.0f) && (m_scenePresence.m_wasFlying)) // add for falling and jumping
242 { 266 {
243 // Falling long enough to trigger the animation 267 // Falling long enough to trigger the animation
268//Console.WriteLine("FALLDOWN"); //##
244 return "FALLDOWN"; 269 return "FALLDOWN";
245 } 270 }
246 else if (m_animTickJump == -1)
247 {
248 m_animTickJump = 0;
249 return "STAND";
250 }
251 271
252 return m_movementAnimation; 272 return m_movementAnimation;
253 } 273 }
254 274
255 #endregion Falling/Floating/Landing 275 #endregion Falling/Floating/Landing
256 276
277
278 #region Jumping // section added for jumping...
279
280 int jumptime;
281 jumptime = Environment.TickCount - m_animTickJump;
282
283
284 if ((move.Z > 0f) && (!m_jumping))
285 {
286//Console.WriteLine("PJ {0}", jumptime); //##
287 // Start jumping, prejump
288 m_animTickFall = 0;
289 m_jumping = true;
290 m_falling = false;
291 actor.Selected = true; // borrowed for jmping flag
292 m_animTickJump = Environment.TickCount;
293 m_jumpVelocity = 0.35f;
294 return "PREJUMP";
295 }
296
297 if(m_jumping)
298 {
299 if ( (jumptime > (JUMP_PERIOD * 1.5f)) && actor.IsColliding)
300 {
301//Console.WriteLine("LA {0}", jumptime); //##
302 // end jumping
303 m_jumping = false;
304 m_falling = false;
305 actor.Selected = false; // borrowed for jumping flag
306 m_jumpVelocity = 0f;
307 m_animTickFall = Environment.TickCount;
308 return "LAND";
309 }
310 else if (jumptime > JUMP_PERIOD)
311 {
312//Console.WriteLine("JD {0}", jumptime); //##
313 // jump down
314 m_jumpVelocity = 0f;
315 return "JUMP";
316 }
317 else if (jumptime > PREJUMP_DELAY)
318 {
319//Console.WriteLine("JU {0}", jumptime); //##
320 // jump up
321 m_jumping = true;
322 m_jumpVelocity = 10f;
323 return "JUMP";
324 }
325 }
326
327 #endregion Jumping // end added section
328
257 #region Ground Movement 329 #region Ground Movement
258 330
259 if (m_movementAnimation == "FALLDOWN") 331 if (m_movementAnimation == "FALLDOWN")
260 { 332 {
333 m_falling = false;
261 m_animTickFall = Environment.TickCount; 334 m_animTickFall = Environment.TickCount;
262
263 // TODO: SOFT_LAND support 335 // TODO: SOFT_LAND support
264 return "LAND"; 336 float fallHeight = m_fallHeight - actor.Position.Z;
337//Console.WriteLine("Hit from {0}", fallHeight); //##
338 if (fallHeight > 15.0f) // add for falling
339 return "STANDUP";
340 else if (fallHeight > 8.0f) // add for falling
341 return "SOFT_LAND"; // add for falling
342 else // add for falling
343 return "LAND"; // add for falling
265 } 344 }
266 else if (m_movementAnimation == "LAND") 345// rm jumping float landElapsed = (float)(Environment.TickCount - m_animTickFall) / 1000f;
346// rm jumping if ((m_animTickFall != 0) && (landElapsed <= FALL_DELAY))
347// rm for landing return "LAND";
348 else if ((m_movementAnimation == "LAND") || (m_movementAnimation == "SOFT_LAND") || (m_movementAnimation == "STANDUP"))
267 { 349 {
268 float landElapsed = (float)(Environment.TickCount - m_animTickFall) / 1000f; 350 int landElapsed = Environment.TickCount - m_animTickFall; // add for jumping
269 if ((m_animTickFall != 0) && (landElapsed <= FALL_DELAY)) 351 int limit = 1000; // add for jumping
270 return "LAND"; 352 if(m_movementAnimation == "LAND") limit = 350; // add for jumping
271 } 353 // NB if the above is set too long a weird anim reset from some place prevents STAND from being sent to client
272 354
355 if ((m_animTickFall != 0) && (landElapsed <= limit)) // add for jumping
356 {
357//Console.WriteLine("Lelapse {0}", m_movementAnimation); //##
358 return m_movementAnimation;
359 }
360 else
361 {
362//Console.WriteLine("end/STAND"); //##
363 m_fallHeight = actor.Position.Z; // save latest flying height
364 return "STAND";
365 }
366 }
367/* This section removed, replaced by jumping section
273 m_animTickFall = 0; 368 m_animTickFall = 0;
274 369
275 if (move.Z > 0.2f) 370 if (move.Z > 0.2f)
@@ -281,7 +376,7 @@ namespace OpenSim.Region.Framework.Scenes.Animation
281 m_animTickJump = Environment.TickCount; 376 m_animTickJump = Environment.TickCount;
282 return "PREJUMP"; 377 return "PREJUMP";
283 } 378 }
284 else if (Environment.TickCount - m_animTickJump > PREJUMP_DELAY * 1000.0f) 379 else if (Environment.TickCount - m_animTickJump > PREJUMP_DELAY * 800.0f)
285 { 380 {
286 // Start actual jump 381 // Start actual jump
287 if (m_animTickJump == -1) 382 if (m_animTickJump == -1)
@@ -294,41 +389,44 @@ namespace OpenSim.Region.Framework.Scenes.Animation
294 m_animTickJump = -1; 389 m_animTickJump = -1;
295 return "JUMP"; 390 return "JUMP";
296 } 391 }
297 else
298 return "JUMP";
299 } 392 }
300 else 393 else
301 { 394 {
302 // Not jumping 395 // Not jumping
303 m_animTickJump = 0; 396 m_animTickJump = 0;
304 397 */
305 if (move.X != 0f || move.Y != 0f) 398 // next section moved outside paren. and realigned for jumping
306 { 399 if (move.X != 0f || move.Y != 0f)
307 // Walking / crouchwalking / running 400 {
308 if (move.Z < 0) 401 m_fallHeight = actor.Position.Z; // save latest flying height
309 return "CROUCHWALK"; 402 m_falling = false; // Add for falling
310 else if (m_scenePresence.SetAlwaysRun) 403 // Walking / crouchwalking / running
311 return "RUN"; 404 if (move.Z < 0f)
312 else 405 return "CROUCHWALK";
313 return "WALK"; 406 else if (m_scenePresence.SetAlwaysRun)
314 } 407 return "RUN";
315 else 408 else
316 { 409 return "WALK";
317 // Not walking
318 if (move.Z < 0)
319 return "CROUCH";
320 else if (heldTurnLeft)
321 return "TURNLEFT";
322 else if (heldTurnRight)
323 return "TURNRIGHT";
324 else
325 return "STAND";
326 }
327 } 410 }
328 411// rm for jumping else
412 else if (!m_jumping) // add for jumping
413 {
414 m_falling = false; // Add for falling
415 // Not walking
416 if (move.Z < 0)
417 return "CROUCH";
418// else if (heldTurnLeft)
419// return "TURNLEFT";
420// else if (heldTurnRight)
421// return "TURNRIGHT";
422 else
423 return "STAND";
424 }
425 // end section realign for jumping
329 #endregion Ground Movement 426 #endregion Ground Movement
330 427
331 //return m_movementAnimation; 428 m_falling = false; // Add for falling
429 return m_movementAnimation;
332 } 430 }
333 431
334 /// <summary> 432 /// <summary>
@@ -337,9 +435,15 @@ namespace OpenSim.Region.Framework.Scenes.Animation
337 public void UpdateMovementAnimations() 435 public void UpdateMovementAnimations()
338 { 436 {
339 m_movementAnimation = GetMovementAnimation(); 437 m_movementAnimation = GetMovementAnimation();
340// m_log.DebugFormat( 438/* if (m_movementAnimation == "PREJUMP" && !m_scenePresence.Scene.m_usePreJump)
341// "[SCENE PRESENCE ANIMATOR]: Got animation {0} for {1}", m_movementAnimation, m_scenePresence.Name); 439 {
342 TrySetMovementAnimation(m_movementAnimation); 440 // This was the previous behavior before PREJUMP
441 TrySetMovementAnimation("JUMP");
442 }
443 else
444 { removed for jumping */
445 TrySetMovementAnimation(m_movementAnimation);
446// rm for jumping }
343 } 447 }
344 448
345 public UUID[] GetAnimationArray() 449 public UUID[] GetAnimationArray()