Skip to content

Commit

Permalink
#5338: Move free move timer handling to CamWnd
Browse files Browse the repository at this point in the history
  • Loading branch information
codereader committed Sep 26, 2020
1 parent 1b96369 commit 037efe3
Show file tree
Hide file tree
Showing 4 changed files with 130 additions and 7 deletions.
111 changes: 105 additions & 6 deletions radiant/camera/CamWnd.cpp
Expand Up @@ -149,9 +149,12 @@ CamWnd::CamWnd(wxWindow* parent) :
_drawing(false),
_wxGLWidget(new wxutil::GLWidget(_mainWxWidget, std::bind(&CamWnd::onRender, this), "CamWnd")),
_timer(this),
_timerLock(false)
_timerLock(false),
_freeMoveFlags(0),
_freeMoveTimer(this)
{
Bind(wxEVT_TIMER, &CamWnd::onFrame, this);
Bind(wxEVT_TIMER, &CamWnd::onFrame, this, _timer.GetId());
Bind(wxEVT_TIMER, &CamWnd::onFreeMoveTimer, this, _freeMoveTimer.GetId());

constructGUIComponents();

Expand Down Expand Up @@ -501,11 +504,107 @@ void CamWnd::changeFloor(const bool up) {
GlobalCamera().movedNotify();
}

void CamWnd::setFreeMoveFlags(unsigned int mask)
{
if ((~_freeMoveFlags & mask) != 0 && _freeMoveFlags == 0)
{
_freeMoveTimer.Start(10);
}

_freeMoveFlags |= mask;
}

void CamWnd::clearFreeMoveFlags(unsigned int mask)
{
if ((_freeMoveFlags & ~mask) == 0 && _freeMoveFlags != 0)
{
_freeMoveTimer.Stop();
}

_freeMoveFlags &= ~mask;
}

void CamWnd::handleFreeMovement(float timePassed)
{
int angleSpeed = getCameraSettings()->angleSpeed();
int movementSpeed = getCameraSettings()->movementSpeed();

auto angles = _camera.getCameraAngles();

// Update angles
if (_freeMoveFlags & MOVE_ROTLEFT)
angles[camera::CAMERA_YAW] += 15 * timePassed * angleSpeed;

if (_freeMoveFlags & MOVE_ROTRIGHT)
angles[camera::CAMERA_YAW] -= 15 * timePassed * angleSpeed;

if (_freeMoveFlags & MOVE_PITCHUP)
{
angles[camera::CAMERA_PITCH] += 15 * timePassed * angleSpeed;

if (angles[camera::CAMERA_PITCH] > 90)
angles[camera::CAMERA_PITCH] = 90;
}

if (_freeMoveFlags & MOVE_PITCHDOWN)
{
angles[camera::CAMERA_PITCH] -= 15 * timePassed * angleSpeed;

if (angles[camera::CAMERA_PITCH] < -90)
angles[camera::CAMERA_PITCH] = -90;
}

_camera.setCameraAngles(angles);

_camera.updateModelview();
_camera.freemoveUpdateAxes();

// Update position
auto origin = _camera.getCameraOrigin();

if (_freeMoveFlags & MOVE_FORWARD)
origin += -_camera.getForwardVector() * (timePassed * movementSpeed);
if (_freeMoveFlags & MOVE_BACK)
origin += -_camera.getForwardVector() * (-timePassed * movementSpeed);
if (_freeMoveFlags & MOVE_STRAFELEFT)
origin += _camera.getRightVector() * (-timePassed * movementSpeed);
if (_freeMoveFlags & MOVE_STRAFERIGHT)
origin += _camera.getRightVector() * (timePassed * movementSpeed);
if (_freeMoveFlags & MOVE_UP)
origin += g_vector3_axis_z * (timePassed * movementSpeed);
if (_freeMoveFlags & MOVE_DOWN)
origin += g_vector3_axis_z * (-timePassed * movementSpeed);

_camera.setCameraOrigin(origin);

_camera.updateModelview();
}

void CamWnd::onFreeMoveTimer(wxTimerEvent& ev)
{
_camera.m_mouseMove.flush();

//rMessage() << "keymove... ";
float time_seconds = _camera._keyControlTimer.Time() / static_cast<float>(1000);

_camera._keyControlTimer.Start();

if (time_seconds > 0.05f)
{
time_seconds = 0.05f; // 20fps
}

handleFreeMovement(time_seconds * 5.0f);

queueDraw();
GlobalCamera().movedNotify();
}

void CamWnd::enableFreeMove()
{
ASSERT_MESSAGE(!_camera.freeMoveEnabled, "EnableFreeMove: free-move was already enabled");
_camera.freeMoveEnabled = true;
_camera.clearMovementFlags(MOVE_ALL);
clearFreeMoveFlags(MOVE_ALL);

removeHandlersMove();

Expand All @@ -516,7 +615,7 @@ void CamWnd::disableFreeMove()
{
ASSERT_MESSAGE(_camera.freeMoveEnabled, "DisableFreeMove: free-move was not enabled");
_camera.freeMoveEnabled = false;
_camera.clearMovementFlags(MOVE_ALL);
clearFreeMoveFlags(MOVE_ALL);

addHandlersMove();

Expand Down Expand Up @@ -1121,11 +1220,11 @@ void CamWnd::handleFreeMoveKeyEvent(KeyEventType eventType, unsigned int movemen
{
if (eventType == KeyEventType::KeyPressed)
{
_camera.setMovementFlags(movementFlags);
setFreeMoveFlags(movementFlags);
}
else
{
_camera.clearMovementFlags(movementFlags);
clearFreeMoveFlags(movementFlags);
}
}

Expand Down
9 changes: 9 additions & 0 deletions radiant/camera/CamWnd.h
Expand Up @@ -76,6 +76,10 @@ class CamWnd :

wxutil::KeyEventFilterPtr _escapeListener;

// Remembering the free movement type while holding down a key
unsigned int _freeMoveFlags;
wxTimer _freeMoveTimer;

public:
// Constructor and destructor
CamWnd(wxWindow* parent);
Expand Down Expand Up @@ -192,6 +196,11 @@ class CamWnd :
void onGLExtensionsInitialised();

void onFrame(wxTimerEvent& ev);
void onFreeMoveTimer(wxTimerEvent& ev);

void handleFreeMovement(float timePassed);
void setFreeMoveFlags(unsigned int mask);
void clearFreeMoveFlags(unsigned int mask);
};

/**
Expand Down
15 changes: 14 additions & 1 deletion radiant/camera/Camera.cpp
Expand Up @@ -64,10 +64,14 @@ Camera::Camera(render::View& view, const Callback& queueDraw, const Callback& fo
m_mouseMove(std::bind(&Camera::onMotionDelta, this, std::placeholders::_1, std::placeholders::_2)),
_view(view)
{
#if 0
_moveTimer.Connect(wxEVT_TIMER, wxTimerEventHandler(Camera::camera_keymove), NULL, this);
#endif
}

void Camera::keyControl(float dtime) {
void Camera::keyControl(float dtime)
{
#if 0
int angleSpeed = getCameraSettings()->angleSpeed();
int movementSpeed = getCameraSettings()->movementSpeed();

Expand Down Expand Up @@ -105,13 +109,17 @@ void Camera::keyControl(float dtime) {
_origin += g_vector3_axis_z * (-dtime * movementSpeed);

updateModelview();
#endif
}

void Camera::camera_keymove(wxTimerEvent& ev)
{
#if 0
keyMove();
#endif
}

#if 0
void Camera::setMovementFlags(unsigned int mask)
{
if ((~movementflags & mask) != 0 && movementflags == 0)
Expand All @@ -121,7 +129,9 @@ void Camera::setMovementFlags(unsigned int mask)

movementflags |= mask;
}
#endif

#if 0
void Camera::clearMovementFlags(unsigned int mask)
{
if ((movementflags & ~mask) == 0 && movementflags != 0)
Expand All @@ -131,9 +141,11 @@ void Camera::clearMovementFlags(unsigned int mask)

movementflags &= ~mask;
}
#endif

void Camera::keyMove()
{
#if 0
m_mouseMove.flush();

//rMessage() << "keymove... ";
Expand All @@ -150,6 +162,7 @@ void Camera::keyMove()

queueDraw();
GlobalCamera().movedNotify();
#endif
}

void Camera::updateModelview()
Expand Down
2 changes: 2 additions & 0 deletions radiant/camera/Camera.h
Expand Up @@ -82,8 +82,10 @@ class Camera :
Camera& operator=(const Camera& other) = delete;

void keyControl(float dtime);
#if 0
void setMovementFlags(unsigned int mask);
void clearMovementFlags(unsigned int mask);
#endif
void keyMove();

void updateVectors();
Expand Down

0 comments on commit 037efe3

Please sign in to comment.