Ported the Simian avatar animation system to OpenSim. Landing is currently not working

0.6.8-post-fixes
John Hurliman 2009-10-29 04:13:51 -07:00
parent fd2c99f184
commit 3f2d6fe470
1 changed files with 203 additions and 36 deletions

View File

@ -130,12 +130,14 @@ namespace OpenSim.Region.Framework.Scenes
private bool m_setAlwaysRun; private bool m_setAlwaysRun;
private string m_movementAnimation = "DEFAULT"; private string m_movementAnimation = "DEFAULT";
private long m_animPersistUntil = 0; private long m_animPersistUntil;
private bool m_allowFalling = false; private int m_animTickFall;
private bool m_useFlySlow = false; private int m_animTickJump;
private bool m_usePreJump = false; private bool m_allowFalling;
private bool m_forceFly = false; private bool m_useFlySlow;
private bool m_flyDisabled = false; private bool m_usePreJump;
private bool m_forceFly;
private bool m_flyDisabled;
private float m_speedModifier = 1.0f; private float m_speedModifier = 1.0f;
@ -143,7 +145,7 @@ namespace OpenSim.Region.Framework.Scenes
public bool IsRestrictedToRegion; public bool IsRestrictedToRegion;
public string JID = string.Empty; public string JID = String.Empty;
// Agent moves with a PID controller causing a force to be exerted. // Agent moves with a PID controller causing a force to be exerted.
private bool m_newCoarseLocations = true; private bool m_newCoarseLocations = true;
@ -158,43 +160,43 @@ namespace OpenSim.Region.Framework.Scenes
private readonly Vector3[] Dir_Vectors = new Vector3[6]; private readonly Vector3[] Dir_Vectors = new Vector3[6];
// Position of agent's camera in world (region cordinates) // Position of agent's camera in world (region cordinates)
protected Vector3 m_CameraCenter = Vector3.Zero; protected Vector3 m_CameraCenter;
protected Vector3 m_lastCameraCenter = Vector3.Zero; protected Vector3 m_lastCameraCenter;
protected Timer m_reprioritization_timer; protected Timer m_reprioritization_timer;
protected bool m_reprioritizing = false; protected bool m_reprioritizing;
protected bool m_reprioritization_called = false; protected bool m_reprioritization_called;
// Use these three vectors to figure out what the agent is looking at // Use these three vectors to figure out what the agent is looking at
// Convert it to a Matrix and/or Quaternion // Convert it to a Matrix and/or Quaternion
protected Vector3 m_CameraAtAxis = Vector3.Zero; protected Vector3 m_CameraAtAxis;
protected Vector3 m_CameraLeftAxis = Vector3.Zero; protected Vector3 m_CameraLeftAxis;
protected Vector3 m_CameraUpAxis = Vector3.Zero; protected Vector3 m_CameraUpAxis;
private uint m_AgentControlFlags; private uint m_AgentControlFlags;
private Quaternion m_headrotation = Quaternion.Identity; private Quaternion m_headrotation = Quaternion.Identity;
private byte m_state; private byte m_state;
//Reuse the Vector3 instead of creating a new one on the UpdateMovement method //Reuse the Vector3 instead of creating a new one on the UpdateMovement method
private Vector3 movementvector = Vector3.Zero; private Vector3 movementvector;
private bool m_autopilotMoving; private bool m_autopilotMoving;
private Vector3 m_autoPilotTarget = Vector3.Zero; private Vector3 m_autoPilotTarget;
private bool m_sitAtAutoTarget; private bool m_sitAtAutoTarget;
private string m_nextSitAnimation = String.Empty; private string m_nextSitAnimation = String.Empty;
//PauPaw:Proper PID Controler for autopilot************ //PauPaw:Proper PID Controler for autopilot************
private bool m_moveToPositionInProgress; private bool m_moveToPositionInProgress;
private Vector3 m_moveToPositionTarget = Vector3.Zero; private Vector3 m_moveToPositionTarget;
private bool m_followCamAuto = false; private bool m_followCamAuto;
private int m_movementUpdateCount = 0; private int m_movementUpdateCount;
private const int NumMovementsBetweenRayCast = 5; private const int NumMovementsBetweenRayCast = 5;
private bool CameraConstraintActive = false; private bool CameraConstraintActive;
//private int m_moveToPositionStateStatus = 0; //private int m_moveToPositionStateStatus;
//***************************************************** //*****************************************************
// Agent's Draw distance. // Agent's Draw distance.
@ -444,7 +446,7 @@ namespace OpenSim.Region.Framework.Scenes
} }
m_pos = value; m_pos = value;
m_parentPosition = new Vector3(0, 0, 0); m_parentPosition = Vector3.Zero;
} }
} }
@ -457,22 +459,21 @@ namespace OpenSim.Region.Framework.Scenes
{ {
PhysicsActor actor = m_physicsActor; PhysicsActor actor = m_physicsActor;
if (actor != null) if (actor != null)
m_velocity = m_physicsActor.Velocity; m_velocity = actor.Velocity;
return m_velocity; return m_velocity;
} }
set set
{ {
//m_log.DebugFormat("In {0} setting velocity of {1} to {2}", m_scene.RegionInfo.RegionName, Name, value); //m_log.DebugFormat("In {0} setting velocity of {1} to {2}", m_scene.RegionInfo.RegionName, Name, value);
if (m_physicsActor != null) PhysicsActor actor = m_physicsActor;
if (actor != null)
{ {
try try
{ {
lock (m_scene.SyncRoot) lock (m_scene.SyncRoot)
{ actor.Velocity = value;
m_physicsActor.Velocity = value;
}
} }
catch (Exception e) catch (Exception e)
{ {
@ -934,7 +935,7 @@ namespace OpenSim.Region.Framework.Scenes
isFlying = m_physicsActor.Flying; isFlying = m_physicsActor.Flying;
RemoveFromPhysicalScene(); RemoveFromPhysicalScene();
Velocity = new Vector3(0, 0, 0); Velocity = Vector3.Zero;
AbsolutePosition = pos; AbsolutePosition = pos;
AddToPhysicalScene(isFlying); AddToPhysicalScene(isFlying);
if (m_appearance != null) if (m_appearance != null)
@ -982,12 +983,13 @@ namespace OpenSim.Region.Framework.Scenes
if (m_avHeight != 127.0f) if (m_avHeight != 127.0f)
{ {
AbsolutePosition = AbsolutePosition + new Vector3(0, 0, (m_avHeight / 6f)); AbsolutePosition = AbsolutePosition + new Vector3(0f, 0f, (m_avHeight / 6f));
} }
else else
{ {
AbsolutePosition = AbsolutePosition + new Vector3(0, 0, (1.56f / 6f)); AbsolutePosition = AbsolutePosition + new Vector3(0f, 0f, (1.56f / 6f));
} }
TrySetMovementAnimation("LAND"); TrySetMovementAnimation("LAND");
SendFullUpdateToAllClients(); SendFullUpdateToAllClients();
} }
@ -1534,7 +1536,7 @@ namespace OpenSim.Region.Framework.Scenes
if (part != null) if (part != null)
{ {
AbsolutePosition = part.AbsolutePosition; AbsolutePosition = part.AbsolutePosition;
Velocity = new Vector3(0, 0, 0); Velocity = Vector3.Zero;
SendFullUpdateToAllClients(); SendFullUpdateToAllClients();
//HandleAgentSit(ControllingClient, m_requestedSitTargetUUID); //HandleAgentSit(ControllingClient, m_requestedSitTargetUUID);
@ -1851,7 +1853,7 @@ namespace OpenSim.Region.Framework.Scenes
} }
m_parentID = m_requestedSitTargetID; m_parentID = m_requestedSitTargetID;
Velocity = new Vector3(0, 0, 0); Velocity = Vector3.Zero;
RemoveFromPhysicalScene(); RemoveFromPhysicalScene();
TrySetMovementAnimation(sitAnimation); TrySetMovementAnimation(sitAnimation);
@ -2008,7 +2010,7 @@ namespace OpenSim.Region.Framework.Scenes
protected void TrySetMovementAnimation(string anim) protected void TrySetMovementAnimation(string anim)
{ {
//m_log.DebugFormat("Updating movement animation to {0}", anim); //m_log.DebugFormat("Updating movement animation to {0}", anim);
if (!m_isChildAgent) if (!m_isChildAgent)
{ {
if (m_animations.TrySetDefaultAnimation(anim, m_controllingClient.NextAnimationSequenceNumber, UUID.Zero)) if (m_animations.TrySetDefaultAnimation(anim, m_controllingClient.NextAnimationSequenceNumber, UUID.Zero))
@ -2239,12 +2241,176 @@ namespace OpenSim.Region.Framework.Scenes
} }
} }
public string GetMovementAnimation2()
{
const float FALL_DELAY = 0.33f;
const float PREJUMP_DELAY = 0.25f;
m_allowFalling = true;
AgentManager.ControlFlags controlFlags = (AgentManager.ControlFlags)m_AgentControlFlags;
PhysicsActor actor = m_physicsActor;
// Create forward and left vectors from the current avatar rotation
Matrix4 rotMatrix = Matrix4.CreateFromQuaternion(m_bodyRot);
Vector3 fwd = Vector3.Transform(Vector3.UnitX, rotMatrix);
Vector3 left = Vector3.Transform(Vector3.UnitY, rotMatrix);
// Check control flags
bool heldForward = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_AT_POS) == AgentManager.ControlFlags.AGENT_CONTROL_AT_POS;
bool heldBack = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_AT_NEG) == AgentManager.ControlFlags.AGENT_CONTROL_AT_NEG;
bool heldLeft = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_LEFT_POS) == AgentManager.ControlFlags.AGENT_CONTROL_LEFT_POS;
bool heldRight = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_LEFT_NEG) == AgentManager.ControlFlags.AGENT_CONTROL_LEFT_NEG;
//bool heldTurnLeft = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_TURN_LEFT) == AgentManager.ControlFlags.AGENT_CONTROL_TURN_LEFT;
//bool heldTurnRight = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_TURN_RIGHT) == AgentManager.ControlFlags.AGENT_CONTROL_TURN_RIGHT;
bool heldUp = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_UP_POS) == AgentManager.ControlFlags.AGENT_CONTROL_UP_POS;
bool heldDown = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG) == AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG;
//bool flying = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_FLY) == AgentManager.ControlFlags.AGENT_CONTROL_FLY;
//bool mouselook = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_MOUSELOOK) == AgentManager.ControlFlags.AGENT_CONTROL_MOUSELOOK;
// Direction in which the avatar is trying to move
Vector3 move = Vector3.Zero;
if (heldForward) { move.X += fwd.X; move.Y += fwd.Y; }
if (heldBack) { move.X -= fwd.X; move.Y -= fwd.Y; }
if (heldLeft) { move.X += left.X; move.Y += left.Y; }
if (heldRight) { move.X -= left.X; move.Y -= left.Y; }
if (heldUp) { move.Z += 1; }
if (heldDown) { move.Z -= 1; }
// Is the avatar trying to move?
bool moving = (move != Vector3.Zero);
bool jumping = m_animTickJump != 0;
#region Flying
if (actor != null && actor.Flying)
{
m_animTickFall = 0;
m_animTickJump = 0;
if (move.X != 0f || move.Y != 0f)
{
return (m_useFlySlow ? "FLYSLOW" : "FLY");
}
else if (move.Z > 0f)
{
return "HOVER_UP";
}
else if (move.Z < 0f)
{
if (actor != null && actor.IsColliding)
return "LAND";
else
return "HOVER_DOWN";
}
else
{
return "HOVER";
}
}
#endregion Flying
#region Falling/Floating/Landing
if (actor == null || !actor.IsColliding)
{
float fallElapsed = (float)(Environment.TickCount - m_animTickFall) / 1000f;
if (m_animTickFall == 0 || (fallElapsed > FALL_DELAY && actor.Velocity.Z >= 0.0f))
{
// Just started falling
m_animTickFall = Environment.TickCount;
}
else if (!jumping && fallElapsed > FALL_DELAY)
{
// Falling long enough to trigger the animation
return "FALLDOWN";
}
return m_movementAnimation;
}
#endregion Falling/Floating/Landing
#region Ground Movement
if (m_movementAnimation == "FALLDOWN")
{
m_animTickFall = Environment.TickCount;
// TODO: SOFT_LAND support
return "LAND";
}
else if (m_movementAnimation == "LAND")
{
float landElapsed = (float)(Environment.TickCount - m_animTickFall) / 1000f;
if (landElapsed <= FALL_DELAY)
return "LAND";
}
m_animTickFall = 0;
if (move.Z > 0f)
{
// Jumping
if (!jumping)
{
// Begin prejump
m_animTickJump = Environment.TickCount;
return "PREJUMP";
}
else if (Environment.TickCount - m_animTickJump > PREJUMP_DELAY * 1000.0f)
{
// Start actual jump
if (m_animTickJump == -1)
{
// Already jumping! End the current jump
m_animTickJump = 0;
return "JUMP";
}
m_animTickJump = -1;
return "JUMP";
}
}
else
{
// Not jumping
m_animTickJump = 0;
if (move.X != 0f || move.Y != 0f)
{
// Walking / crouchwalking / running
if (move.Z < 0f)
return "CROUCHWALK";
else if (m_setAlwaysRun)
return "RUN";
else
return "WALK";
}
else
{
// Not walking
if (move.Z < 0f)
return "CROUCH";
else
return "STAND";
}
}
#endregion Ground Movement
return m_movementAnimation;
}
/// <summary> /// <summary>
/// Update the movement animation of this avatar according to its current state /// Update the movement animation of this avatar according to its current state
/// </summary> /// </summary>
protected void UpdateMovementAnimations() protected void UpdateMovementAnimations()
{ {
string movementAnimation = GetMovementAnimation(); string movementAnimation = GetMovementAnimation2();
if (movementAnimation == "FALLDOWN" && m_allowFalling == false) if (movementAnimation == "FALLDOWN" && m_allowFalling == false)
{ {
@ -2367,7 +2533,8 @@ namespace OpenSim.Region.Framework.Scenes
if (m_isChildAgent == false) if (m_isChildAgent == false)
{ {
Vector3 velocity = (m_physicsActor != null) ? m_physicsActor.Velocity : Vector3.Zero; PhysicsActor actor = m_physicsActor;
Vector3 velocity = (actor != null) ? actor.Velocity : Vector3.Zero;
// Throw away duplicate or insignificant updates // Throw away duplicate or insignificant updates
if (!m_bodyRot.ApproxEquals(m_lastRotation, ROTATION_TOLERANCE) || if (!m_bodyRot.ApproxEquals(m_lastRotation, ROTATION_TOLERANCE) ||