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.cs217
1 files changed, 131 insertions, 86 deletions
diff --git a/OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs b/OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs
index e9e1845..0410150 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,19 @@ 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 = "CROUCH";
61
62 private int m_animTickFall; 62 private int m_animTickFall;
63 private int m_animTickJump; 63 public int m_animTickJump; // ScenePresence has to see this to control +Z force
64 64 public bool m_jumping = false;
65 public float m_jumpVelocity = 0f;
66 private int m_landing = 0;
67 public bool Falling
68 {
69 get { return m_falling; }
70 }
71 private bool m_falling = false;
72 private float m_fallHeight;
73
65 /// <value> 74 /// <value>
66 /// The scene presence that this animator applies to 75 /// The scene presence that this animator applies to
67 /// </value> 76 /// </value>
@@ -122,7 +131,9 @@ namespace OpenSim.Region.Framework.Scenes.Animation
122 131
123 public void ResetAnimations() 132 public void ResetAnimations()
124 { 133 {
134Console.WriteLine("ResetA.............");
125 m_animations.Clear(); 135 m_animations.Clear();
136TrySetMovementAnimation("STAND");
126 } 137 }
127 138
128 /// <summary> 139 /// <summary>
@@ -152,15 +163,13 @@ namespace OpenSim.Region.Framework.Scenes.Animation
152 /// </summary> 163 /// </summary>
153 public string GetMovementAnimation() 164 public string GetMovementAnimation()
154 { 165 {
155 const float FALL_DELAY = 0.33f; 166 const float FALL_DELAY = 800f;
156 const float PREJUMP_DELAY = 0.25f; 167 const float PREJUMP_DELAY = 200f;
157 168 const float JUMP_PERIOD = 800f;
158 #region Inputs 169 #region Inputs
159 if (m_scenePresence.SitGround) 170
160 {
161 return "SIT_GROUND_CONSTRAINED";
162 }
163 AgentManager.ControlFlags controlFlags = (AgentManager.ControlFlags)m_scenePresence.AgentControlFlags; 171 AgentManager.ControlFlags controlFlags = (AgentManager.ControlFlags)m_scenePresence.AgentControlFlags;
172// m_log.DebugFormat("[ANIM]: Control flags: {0}", controlFlags);
164 PhysicsActor actor = m_scenePresence.PhysicsActor; 173 PhysicsActor actor = m_scenePresence.PhysicsActor;
165 174
166 // Create forward and left vectors from the current avatar rotation 175 // Create forward and left vectors from the current avatar rotation
@@ -169,13 +178,12 @@ namespace OpenSim.Region.Framework.Scenes.Animation
169 Vector3 left = Vector3.Transform(Vector3.UnitY, rotMatrix); 178 Vector3 left = Vector3.Transform(Vector3.UnitY, rotMatrix);
170 179
171 // Check control flags 180 // Check control flags
172 bool heldForward = 181 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)); 182 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; 183 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; 184 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; 185 //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; 186 //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; 187 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; 188 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; 189 //bool flying = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_FLY) == AgentManager.ControlFlags.AGENT_CONTROL_FLY;
@@ -183,17 +191,15 @@ namespace OpenSim.Region.Framework.Scenes.Animation
183 191
184 // Direction in which the avatar is trying to move 192 // Direction in which the avatar is trying to move
185 Vector3 move = Vector3.Zero; 193 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; } 194 if (heldBack) { move.X -= fwd.X; move.Y -= fwd.Y; }
188 if (heldLeft) { move.X += left.X; move.Y += left.Y; } 195 if (heldLeft) { move.X += left.X; move.Y += left.Y; }
189 if (heldRight) { move.X -= left.X; move.Y -= left.Y; } 196 if (heldRight) { move.X -= left.X; move.Y -= left.Y; }
190 if (heldUp) { move.Z += 1; } 197 if (heldUp) { move.Z += 1; }
191 if (heldDown) { move.Z -= 1; } 198 if (heldDown) { move.Z -= 1; }
199 if (heldForward) { move.X += fwd.X; move.Y += fwd.Y; }
192 200
193 // Is the avatar trying to move? 201 // Is the avatar trying to move?
194// bool moving = (move != Vector3.Zero); 202// bool moving = (move != Vector3.Zero);
195 bool jumping = m_animTickJump != 0;
196
197 #endregion Inputs 203 #endregion Inputs
198 204
199 #region Flying 205 #region Flying
@@ -202,6 +208,11 @@ namespace OpenSim.Region.Framework.Scenes.Animation
202 { 208 {
203 m_animTickFall = 0; 209 m_animTickFall = 0;
204 m_animTickJump = 0; 210 m_animTickJump = 0;
211 m_jumping = false;
212 m_falling = true;
213 m_jumpVelocity = 0f;
214 actor.Selected = false;
215 m_fallHeight = actor.Position.Z; // save latest flying height
205 216
206 if (move.X != 0f || move.Y != 0f) 217 if (move.X != 0f || move.Y != 0f)
207 { 218 {
@@ -213,8 +224,10 @@ namespace OpenSim.Region.Framework.Scenes.Animation
213 } 224 }
214 else if (move.Z < 0f) 225 else if (move.Z < 0f)
215 { 226 {
216 if (actor != null && actor.IsColliding) 227 if (actor != null && actor.IsColliding)
228 {
217 return "LAND"; 229 return "LAND";
230 }
218 else 231 else
219 return "HOVER_DOWN"; 232 return "HOVER_DOWN";
220 } 233 }
@@ -228,107 +241,141 @@ namespace OpenSim.Region.Framework.Scenes.Animation
228 241
229 #region Falling/Floating/Landing 242 #region Falling/Floating/Landing
230 243
231 if (actor == null || !actor.IsColliding) 244 if ((actor == null || !actor.IsColliding) && !m_jumping)
232 { 245 {
233 float fallElapsed = (float)(Environment.TickCount - m_animTickFall) / 1000f; 246 float fallElapsed = (float)(Environment.TickCount - m_animTickFall);
234 float fallVelocity = (actor != null) ? actor.Velocity.Z : 0.0f; 247 float fallVelocity = (actor != null) ? actor.Velocity.Z : 0.0f;
235 248
236 if (m_animTickFall == 0 || (fallElapsed > FALL_DELAY && fallVelocity >= 0.0f)) 249 if (!m_jumping && (fallVelocity < -3.0f) ) m_falling = true;
250
251 if (m_animTickFall == 0 || (fallVelocity >= 0.0f))
237 { 252 {
238 // Just started falling 253 // not falling yet, or going up
254 // reset start of fall time
239 m_animTickFall = Environment.TickCount; 255 m_animTickFall = Environment.TickCount;
240 } 256 }
241 else if (!jumping && fallElapsed > FALL_DELAY) 257 else if (!m_jumping && (fallElapsed > FALL_DELAY) && (fallVelocity < -3.0f) && (m_scenePresence.WasFlying))
242 { 258 {
243 // Falling long enough to trigger the animation 259 // Falling long enough to trigger the animation
244 return "FALLDOWN"; 260 return "FALLDOWN";
245 } 261 }
246 else if (m_animTickJump == -1)
247 {
248 m_animTickJump = 0;
249 return "STAND";
250 }
251 262
252 return m_movementAnimation; 263 return m_movementAnimation;
253 } 264 }
254 265
255 #endregion Falling/Floating/Landing 266 #endregion Falling/Floating/Landing
256 267
257 #region Ground Movement
258 268
259 if (m_movementAnimation == "FALLDOWN") 269 #region Jumping // section added for jumping...
260 {
261 m_animTickFall = Environment.TickCount;
262 270
263 // TODO: SOFT_LAND support 271 int jumptime;
264 return "LAND"; 272 jumptime = Environment.TickCount - m_animTickJump;
265 } 273
266 else if (m_movementAnimation == "LAND") 274
275 if ((move.Z > 0f) && (!m_jumping))
267 { 276 {
268 float landElapsed = (float)(Environment.TickCount - m_animTickFall) / 1000f; 277 // Start jumping, prejump
269 if ((m_animTickFall != 0) && (landElapsed <= FALL_DELAY)) 278 m_animTickFall = 0;
270 return "LAND"; 279 m_jumping = true;
280 m_falling = false;
281 actor.Selected = true; // borrowed for jumping flag
282 m_animTickJump = Environment.TickCount;
283 m_jumpVelocity = 0.35f;
284 return "PREJUMP";
271 } 285 }
272 286
273 m_animTickFall = 0; 287 if(m_jumping)
274
275 if (move.Z > 0.2f)
276 { 288 {
277 // Jumping 289 if ( (jumptime > (JUMP_PERIOD * 1.5f)) && actor.IsColliding)
278 if (!jumping)
279 { 290 {
280 // Begin prejump 291 // end jumping
281 m_animTickJump = Environment.TickCount; 292 m_jumping = false;
282 return "PREJUMP"; 293 m_falling = false;
294 actor.Selected = false; // borrowed for jumping flag
295 m_jumpVelocity = 0f;
296 m_animTickFall = Environment.TickCount;
297 return "LAND";
283 } 298 }
284 else if (Environment.TickCount - m_animTickJump > PREJUMP_DELAY * 1000.0f) 299 else if (jumptime > JUMP_PERIOD)
285 { 300 {
286 // Start actual jump 301 // jump down
287 if (m_animTickJump == -1) 302 m_jumpVelocity = 0f;
288 {
289 // Already jumping! End the current jump
290 m_animTickJump = 0;
291 return "JUMP";
292 }
293
294 m_animTickJump = -1;
295 return "JUMP"; 303 return "JUMP";
296 } 304 }
297 else 305 else if (jumptime > PREJUMP_DELAY)
306 {
307 // jump up
308 m_jumping = true;
309 m_jumpVelocity = 10f;
298 return "JUMP"; 310 return "JUMP";
311 }
299 } 312 }
300 else 313
314 #endregion Jumping
315
316 #region Ground Movement
317
318 if (m_movementAnimation == "FALLDOWN")
301 { 319 {
302 // Not jumping 320 m_falling = false;
303 m_animTickJump = 0; 321 m_animTickFall = Environment.TickCount;
322 // TODO: SOFT_LAND support
323 float fallHeight = m_fallHeight - actor.Position.Z;
324 if (fallHeight > 15.0f)
325 return "STANDUP";
326 else if (fallHeight > 8.0f)
327 return "SOFT_LAND";
328 else
329 return "LAND";
330 }
331 else if ((m_movementAnimation == "LAND") || (m_movementAnimation == "SOFT_LAND") || (m_movementAnimation == "STANDUP"))
332 {
333 int landElapsed = Environment.TickCount - m_animTickFall;
334 int limit = 1000;
335 if(m_movementAnimation == "LAND") limit = 350;
336 // NB if the above is set too long a weird anim reset from some place prevents STAND from being sent to client
304 337
305 if (move.X != 0f || move.Y != 0f) 338 if ((m_animTickFall != 0) && (landElapsed <= limit))
306 { 339 {
307 // Walking / crouchwalking / running 340 return m_movementAnimation;
308 if (move.Z < 0)
309 return "CROUCHWALK";
310 else if (m_scenePresence.SetAlwaysRun)
311 return "RUN";
312 else
313 return "WALK";
314 } 341 }
315 else 342 else
316 { 343 {
317 // Not walking 344 m_fallHeight = actor.Position.Z; // save latest flying height
318 if (move.Z < 0) 345 return "STAND";
319 return "CROUCH";
320 else if (heldTurnLeft)
321 return "TURNLEFT";
322 else if (heldTurnRight)
323 return "TURNRIGHT";
324 else
325 return "STAND";
326 } 346 }
327 } 347 }
328 348
349 // next section moved outside paren. and realigned for jumping
350 if (move.X != 0f || move.Y != 0f)
351 {
352 m_fallHeight = actor.Position.Z; // save latest flying height
353 m_falling = false;
354 // Walking / crouchwalking / running
355 if (move.Z < 0f)
356 return "CROUCHWALK";
357 else if (m_scenePresence.SetAlwaysRun)
358 return "RUN";
359 else
360 return "WALK";
361 }
362 else if (!m_jumping)
363 {
364 m_falling = false;
365 // Not walking
366 if (move.Z < 0)
367 return "CROUCH";
368// else if (heldTurnLeft)
369// return "TURNLEFT";
370// else if (heldTurnRight)
371// return "TURNRIGHT";
372 else
373 return "STAND";
374 }
329 #endregion Ground Movement 375 #endregion Ground Movement
330 376
331 //return m_movementAnimation; 377 m_falling = false;
378 return m_movementAnimation;
332 } 379 }
333 380
334 /// <summary> 381 /// <summary>
@@ -337,8 +384,6 @@ namespace OpenSim.Region.Framework.Scenes.Animation
337 public void UpdateMovementAnimations() 384 public void UpdateMovementAnimations()
338 { 385 {
339 m_movementAnimation = GetMovementAnimation(); 386 m_movementAnimation = GetMovementAnimation();
340// m_log.DebugFormat(
341// "[SCENE PRESENCE ANIMATOR]: Got animation {0} for {1}", m_movementAnimation, m_scenePresence.Name);
342 TrySetMovementAnimation(m_movementAnimation); 387 TrySetMovementAnimation(m_movementAnimation);
343 } 388 }
344 389