Added two new camera movement system (change the #define to select between them)
This was SVN commit r468.
This commit is contained in:
parent
a06bff04b6
commit
663f25f6b6
@ -36,6 +36,11 @@ float g_CameraZoom = 10;
|
||||
|
||||
const int NUM_ALPHA_MAPS = 13;
|
||||
const float ViewScrollSpeed = 60;
|
||||
const float ViewRotateSensitivity = 0.002f;
|
||||
const float ViewDragSensitivity = 0.5f;
|
||||
const float ViewZoomSensitivityWheel = 16.0f;
|
||||
const float ViewZoomSensitivityKey = 256.0f;
|
||||
const float ViewZoomSmoothness = 0.02f; // 0.0 = instantaneous zooming, 1.0 = so slow it never moves
|
||||
float ViewFOV;
|
||||
|
||||
int mouse_x=50, mouse_y=50;
|
||||
@ -57,10 +62,178 @@ void terr_init()
|
||||
|
||||
void terr_update(const float DeltaTime)
|
||||
{
|
||||
|
||||
#define CAMERASTYLE 2 // 0 = old style, 1 = relatively new style, 2 = newer style
|
||||
|
||||
#if CAMERASTYLE == 2
|
||||
|
||||
|
||||
// Calculate mouse movement
|
||||
static int mouse_last_x = 0;
|
||||
static int mouse_last_y = 0;
|
||||
int mouse_dx = mouse_x - mouse_last_x;
|
||||
int mouse_dy = mouse_y - mouse_last_y;
|
||||
mouse_last_x = mouse_x;
|
||||
mouse_last_y = mouse_y;
|
||||
|
||||
// Miscellaneous vectors
|
||||
CVector3D forwards = g_Camera.m_Orientation.GetIn();
|
||||
CVector3D upwards (0.0f, 1.0f, 0.0f);
|
||||
CVector3D rightwards = upwards.Cross(forwards);
|
||||
rightwards.Normalize();
|
||||
|
||||
CVector3D forwards_horizontal = forwards;
|
||||
forwards_horizontal.Y = 0.0f;
|
||||
forwards_horizontal.Normalize();
|
||||
|
||||
if (mouseButtons[SDL_BUTTON_MIDDLE])
|
||||
{
|
||||
if (keys[SDLK_LCTRL] || keys[SDLK_RCTRL])
|
||||
{
|
||||
// Ctrl + middle-drag to rotate view
|
||||
|
||||
// Untranslate the camera, so it rotates around the correct point
|
||||
CVector3D position = g_Camera.m_Orientation.GetTranslation();
|
||||
g_Camera.m_Orientation.Translate(position*-1);
|
||||
|
||||
// Sideways rotation
|
||||
g_Camera.m_Orientation.RotateY(ViewRotateSensitivity * (float)(mouse_dx));
|
||||
|
||||
// Up/down rotation
|
||||
CQuaternion temp;
|
||||
temp.FromAxisAngle(rightwards, ViewRotateSensitivity * (float)(mouse_dy));
|
||||
g_Camera.m_Orientation.Rotate(temp);
|
||||
|
||||
// Retranslate back to the right position
|
||||
g_Camera.m_Orientation.Translate(position);
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
// Middle-drag to pan
|
||||
|
||||
g_Camera.m_Orientation.Translate(rightwards * (ViewDragSensitivity * mouse_dx));
|
||||
g_Camera.m_Orientation.Translate(forwards_horizontal * (-ViewDragSensitivity * mouse_dy));
|
||||
}
|
||||
}
|
||||
|
||||
// Mouse movement
|
||||
|
||||
if (mouse_x >= g_xres-2)
|
||||
g_Camera.m_Orientation.Translate(rightwards * (ViewScrollSpeed * DeltaTime));
|
||||
else if (mouse_x <= 3)
|
||||
g_Camera.m_Orientation.Translate(-rightwards * (ViewScrollSpeed * DeltaTime));
|
||||
|
||||
if (mouse_y >= g_yres-2)
|
||||
g_Camera.m_Orientation.Translate(-forwards_horizontal * (ViewScrollSpeed * DeltaTime));
|
||||
else if (mouse_y <= 3)
|
||||
g_Camera.m_Orientation.Translate(forwards_horizontal * (ViewScrollSpeed * DeltaTime));
|
||||
|
||||
|
||||
// Keyboard movement (added to mouse movement, so you can go faster if you want)
|
||||
|
||||
if (keys[SDLK_RIGHT])
|
||||
g_Camera.m_Orientation.Translate(rightwards * (ViewScrollSpeed * DeltaTime));
|
||||
if (keys[SDLK_LEFT])
|
||||
g_Camera.m_Orientation.Translate(-rightwards * (ViewScrollSpeed * DeltaTime));
|
||||
|
||||
if (keys[SDLK_DOWN])
|
||||
g_Camera.m_Orientation.Translate(-forwards_horizontal * (ViewScrollSpeed * DeltaTime));
|
||||
if (keys[SDLK_UP])
|
||||
g_Camera.m_Orientation.Translate(forwards_horizontal * (ViewScrollSpeed * DeltaTime));
|
||||
|
||||
|
||||
// Smoothed zooming (move a certain percentage towards the desired zoom distance every frame)
|
||||
|
||||
static float zoom_delta = 0.0f;
|
||||
|
||||
if (mouseButtons[SDL_BUTTON_WHEELUP])
|
||||
zoom_delta -= ViewZoomSensitivityWheel;
|
||||
else if (mouseButtons[SDL_BUTTON_WHEELDOWN])
|
||||
zoom_delta += ViewZoomSensitivityWheel;
|
||||
|
||||
if (keys[SDLK_MINUS])
|
||||
zoom_delta -= ViewZoomSensitivityKey*DeltaTime;
|
||||
else if (keys[SDLK_EQUALS])
|
||||
zoom_delta += ViewZoomSensitivityKey*DeltaTime;
|
||||
|
||||
if (zoom_delta)
|
||||
{
|
||||
float zoom_proportion = powf(ViewZoomSmoothness, DeltaTime);
|
||||
g_Camera.m_Orientation.Translate(forwards * (zoom_delta * (1.0f-zoom_proportion)));
|
||||
zoom_delta *= zoom_proportion;
|
||||
}
|
||||
|
||||
|
||||
#elif CAMERASTYLE == 1
|
||||
|
||||
// Remember previous mouse position, to calculate changes
|
||||
static mouse_last_x = 0;
|
||||
static mouse_last_y = 0;
|
||||
|
||||
// Miscellaneous vectors
|
||||
CVector3D forwards = g_Camera.m_Orientation.GetIn();
|
||||
CVector3D upwards (0.0f, 1.0f, 0.0f);
|
||||
CVector3D rightwards = upwards.Cross(forwards);
|
||||
|
||||
// Click and drag to look around
|
||||
if (mouseButtons[0])
|
||||
{
|
||||
// Untranslate the camera, so it rotates around the correct point
|
||||
CVector3D position = g_Camera.m_Orientation.GetTranslation();
|
||||
g_Camera.m_Orientation.Translate(position*-1);
|
||||
|
||||
// Sideways rotation
|
||||
g_Camera.m_Orientation.RotateY(ViewRotateSpeed*(float)(mouse_x-mouse_last_x));
|
||||
|
||||
// Up/down rotation
|
||||
CQuaternion temp;
|
||||
temp.FromAxisAngle(rightwards, ViewRotateSpeed*(float)(mouse_y-mouse_last_y));
|
||||
g_Camera.m_Orientation.Rotate(temp);
|
||||
|
||||
// Retranslate back to the right position
|
||||
g_Camera.m_Orientation.Translate(position);
|
||||
}
|
||||
mouse_last_x = mouse_x;
|
||||
mouse_last_y = mouse_y;
|
||||
|
||||
// Calculate the necessary vectors for movement
|
||||
|
||||
rightwards.Normalize();
|
||||
CVector3D forwards_horizontal = upwards.Cross(rightwards);
|
||||
forwards_horizontal.Normalize();
|
||||
|
||||
// Move when desirable
|
||||
|
||||
if (mouse_x >= g_xres-2)
|
||||
g_Camera.m_Orientation.Translate(rightwards);
|
||||
else if (mouse_x <= 3)
|
||||
g_Camera.m_Orientation.Translate(-rightwards);
|
||||
|
||||
if (mouse_y >= g_yres-2)
|
||||
g_Camera.m_Orientation.Translate(forwards_horizontal);
|
||||
else if (mouse_y <= 3)
|
||||
g_Camera.m_Orientation.Translate(-forwards_horizontal);
|
||||
|
||||
// Smoothed height-changing (move a certain percentage towards the desired height every frame)
|
||||
|
||||
static float height_delta = 0.0f;
|
||||
|
||||
if (mouseButtons[SDL_BUTTON_WHEELUP])
|
||||
height_delta -= 4.0f;
|
||||
else if (mouseButtons[SDL_BUTTON_WHEELDOWN])
|
||||
height_delta += 4.0f;
|
||||
|
||||
const float height_speed = 0.2f;
|
||||
g_Camera.m_Orientation.Translate(0.0f, height_delta*height_speed, 0.0f);
|
||||
height_delta *= (1.0f - height_speed);
|
||||
|
||||
#else // CAMERASTYLE == 0
|
||||
|
||||
const float dx = ViewScrollSpeed * DeltaTime;
|
||||
const CVector3D Right(dx,0, dx);
|
||||
const CVector3D Up (dx,0,-dx);
|
||||
|
||||
|
||||
if (mouse_x >= g_xres-2)
|
||||
g_Camera.m_Orientation.Translate(Right);
|
||||
if (mouse_x <= 3)
|
||||
@ -71,7 +244,6 @@ void terr_update(const float DeltaTime)
|
||||
if (mouse_y <= 3)
|
||||
g_Camera.m_Orientation.Translate(Up*-1);
|
||||
|
||||
|
||||
/*
|
||||
janwas: grr, plotted the zoom vector on paper twice, but it appears
|
||||
to be completely wrong. sticking with the FOV hack for now.
|
||||
@ -102,6 +274,7 @@ void terr_update(const float DeltaTime)
|
||||
g_Camera.m_Orientation.Translate(forward*(factor*g_CameraZoom));
|
||||
}
|
||||
}
|
||||
#endif // CAMERASTYLE
|
||||
|
||||
g_Camera.UpdateFrustum ();
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user