private void ChangeBehavior(Behavior newBehavior)
{
Behavior prevBehavior = behavior;
if (prevBehavior == newBehavior)
return;
behavior = newBehavior;
switch (newBehavior)
{
case Behavior.FirstPerson:
switch (prevBehavior)
{
case Behavior.Free:
case Behavior.Flight:
case Behavior.Spectator:
eye.Y = firstPersonYOffset;
UpdateViewMatrix();
break;
case Behavior.Orbit:
eye.X = savedEye.X;
eye.Z = savedEye.Z;
eye.Y = firstPersonYOffset;
orientation = savedOrientation;
accumPitchDegrees = savedAccumPitchDegrees;
UpdateViewMatrix();
break;
default:
break;
}
UndoRoll();
break;
case Behavior.Spectator:
switch (prevBehavior)
{
case Behavior.Free:
UpdateViewMatrix();
break;
case Behavior.Flight:
UpdateViewMatrix();
break;
case Behavior.Orbit:
eye = savedEye;
orientation = savedOrientation;
accumPitchDegrees = savedAccumPitchDegrees;
UpdateViewMatrix();
break;
default:
break;
}
UndoRoll();
break;
case Behavior.Flight:
if (prevBehavior == Behavior.Orbit)
{
eye = savedEye;
orientation = savedOrientation;
accumPitchDegrees = savedAccumPitchDegrees;
UpdateViewMatrix();
}
else
{
savedEye = eye;
UpdateViewMatrix();
}
break;
case Behavior.Orbit:
if (prevBehavior == Behavior.FirstPerson)
firstPersonYOffset = eye.Y;
savedEye = eye;
savedOrientation = orientation;
savedAccumPitchDegrees = accumPitchDegrees;
targetYAxis = yAxis;
Vector3 newEye = eye + zAxis * orbitOffsetLength;
LookAt(R3DVECTOR.FromVector3(newEye), R3DVECTOR.FromVector3(eye), R3DVECTOR.FromVector3(targetYAxis));
break;
case Behavior.Free:
if (prevBehavior == Behavior.Orbit)
{
eye = savedEye;
orientation = savedOrientation;
accumPitchDegrees = savedAccumPitchDegrees;
UpdateViewMatrix();
}
else
{
savedEye = eye;
UpdateViewMatrix();
}
break;
default:
break;
}
}