Skip to content

Commit

Permalink
#5180: Start fixing the camera movement key handling
Browse files Browse the repository at this point in the history
  • Loading branch information
codereader committed May 16, 2020
1 parent e6430e5 commit c64761c
Show file tree
Hide file tree
Showing 7 changed files with 92 additions and 33 deletions.
6 changes: 2 additions & 4 deletions install/input.xml
Expand Up @@ -88,8 +88,8 @@
<shortcut command="UpFloor" key="Prior" />
<shortcut command="DownFloor" key="Next" />
<shortcut command="TogglePreview" key="F3" />
<shortcut command="CameraForward" key="Up" />
<shortcut command="CameraBack" key="Down" />
<shortcut command="CameraMoveForward" key="Up" />
<shortcut command="CameraMoveBack" key="Down" />
<shortcut command="CameraLeft" key="Left" />
<shortcut command="CameraRight" key="Right" />
<shortcut command="CameraStrafeRight" key="period" />
Expand All @@ -98,8 +98,6 @@
<shortcut command="CameraDown" key="C" />
<shortcut command="CameraAngleUp" key="A" />
<shortcut command="CameraAngleDown" key="Z" />
<shortcut command="CameraFreeMoveForward" key="Up" />
<shortcut command="CameraFreeMoveBack" key="Down" />
<shortcut command="CameraFreeMoveLeft" key="Left" />
<shortcut command="CameraFreeMoveRight" key="Right" />
<shortcut command="Brush3Sided" key="3" modifiers="CONTROL" />
Expand Down
23 changes: 15 additions & 8 deletions radiant/camera/CamWnd.cpp
Expand Up @@ -147,7 +147,6 @@ CamWnd::CamWnd(wxWindow* parent) :
_camera(&_view, Callback(std::bind(&CamWnd::queueDraw, this))),
_cameraView(_camera, &_view, Callback(std::bind(&CamWnd::update, this))),
_drawing(false),
_freeMoveEnabled(false),
_wxGLWidget(new wxutil::GLWidget(_mainWxWidget, std::bind(&CamWnd::onRender, this), "CamWnd")),
_timer(this),
_timerLock(false)
Expand Down Expand Up @@ -327,7 +326,7 @@ CamWnd::~CamWnd()
// Unsubscribe from the global scene graph update
GlobalSceneGraph().removeSceneObserver(this);

if (_freeMoveEnabled) {
if (_camera.freeMoveEnabled) {
disableFreeMove();
}

Expand Down Expand Up @@ -523,8 +522,8 @@ void CamWnd::changeFloor(const bool up) {

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

removeHandlersMove();
Expand All @@ -536,8 +535,8 @@ void CamWnd::enableFreeMove()

void CamWnd::disableFreeMove()
{
ASSERT_MESSAGE(_freeMoveEnabled, "DisableFreeMove: free-move was not enabled");
_freeMoveEnabled = false;
ASSERT_MESSAGE(_camera.freeMoveEnabled, "DisableFreeMove: free-move was not enabled");
_camera.freeMoveEnabled = false;
_camera.clearMovementFlags(MOVE_ALL);

disableFreeMoveEvents();
Expand All @@ -549,7 +548,7 @@ void CamWnd::disableFreeMove()

bool CamWnd::freeMoveEnabled() const
{
return _freeMoveEnabled;
return _camera.freeMoveEnabled;
}

void CamWnd::Cam_Draw()
Expand Down Expand Up @@ -743,7 +742,7 @@ void CamWnd::Cam_Draw()

// draw the crosshair

if (_freeMoveEnabled) {
if (_camera.freeMoveEnabled) {
glBegin( GL_LINES );
glVertex2f( (float)_camera.width / 2.f, (float)_camera.height / 2.f + 6 );
glVertex2f( (float)_camera.width / 2.f, (float)_camera.height / 2.f + 2 );
Expand Down Expand Up @@ -832,30 +831,36 @@ void CamWnd::onSceneGraphChange()

void CamWnd::enableFreeMoveEvents()
{
#if 0
GlobalEventManager().enableEvent("CameraFreeMoveForward");
GlobalEventManager().enableEvent("CameraFreeMoveBack");
GlobalEventManager().enableEvent("CameraFreeMoveLeft");
GlobalEventManager().enableEvent("CameraFreeMoveRight");
GlobalEventManager().enableEvent("CameraFreeMoveUp");
GlobalEventManager().enableEvent("CameraFreeMoveDown");
#endif
}

void CamWnd::disableFreeMoveEvents()
{
#if 0
GlobalEventManager().disableEvent("CameraFreeMoveForward");
GlobalEventManager().disableEvent("CameraFreeMoveBack");
GlobalEventManager().disableEvent("CameraFreeMoveLeft");
GlobalEventManager().disableEvent("CameraFreeMoveRight");
GlobalEventManager().disableEvent("CameraFreeMoveUp");
GlobalEventManager().disableEvent("CameraFreeMoveDown");
#endif
}

void CamWnd::enableDiscreteMoveEvents()
{
#if 0
GlobalEventManager().enableEvent("CameraForward");
GlobalEventManager().enableEvent("CameraBack");
GlobalEventManager().enableEvent("CameraLeft");
GlobalEventManager().enableEvent("CameraRight");
#endif
GlobalEventManager().enableEvent("CameraStrafeRight");
GlobalEventManager().enableEvent("CameraStrafeLeft");
GlobalEventManager().enableEvent("CameraUp");
Expand All @@ -866,10 +871,12 @@ void CamWnd::enableDiscreteMoveEvents()

void CamWnd::disableDiscreteMoveEvents()
{
#if 0
GlobalEventManager().disableEvent("CameraForward");
GlobalEventManager().disableEvent("CameraBack");
GlobalEventManager().disableEvent("CameraLeft");
GlobalEventManager().disableEvent("CameraRight");
#endif
GlobalEventManager().disableEvent("CameraStrafeRight");
GlobalEventManager().disableEvent("CameraStrafeLeft");
GlobalEventManager().disableEvent("CameraUp");
Expand Down
2 changes: 0 additions & 2 deletions radiant/camera/CamWnd.h
Expand Up @@ -66,8 +66,6 @@ class CamWnd :
// Is true during an active drawing process
bool _drawing;

bool _freeMoveEnabled;

// The GL widget
wxutil::GLWidget* _wxGLWidget;

Expand Down
39 changes: 39 additions & 0 deletions radiant/camera/Camera.cpp
Expand Up @@ -21,6 +21,7 @@ Camera::Camera(render::View* view, const Callback& update) :
color(0, 0, 0),
projection(Matrix4::getIdentity()),
modelview(Matrix4::getIdentity()),
freeMoveEnabled(false),
movementflags(0),
fieldOfView(75.0f),
m_mouseMove(std::bind(&Camera::onMotionDelta, this, std::placeholders::_1, std::placeholders::_2)),
Expand Down Expand Up @@ -345,4 +346,42 @@ void Camera::rotateRightDiscrete() {
setAngles(angles);
}

void Camera::onForwardKey(ui::KeyEventType eventType)
{
if (eventType == ui::KeyEventType::KeyPressed)
{
if (!freeMoveEnabled)
{
moveForwardDiscrete();
}
else
{
setMovementFlags(MOVE_FORWARD);
}
}
else if (freeMoveEnabled)
{
clearMovementFlags(MOVE_FORWARD);
}
}

void Camera::onBackwardKey(ui::KeyEventType eventType)
{
if (eventType == ui::KeyEventType::KeyPressed)
{
if (!freeMoveEnabled)
{
moveBackDiscrete();
}
else
{
setMovementFlags(MOVE_BACK);
}
}
else if (freeMoveEnabled)
{
clearMovementFlags(MOVE_BACK);
}
}

} // namespace
5 changes: 5 additions & 0 deletions radiant/camera/Camera.h
Expand Up @@ -55,6 +55,8 @@ class Camera :
bool m_strafe; // true when in strafemode toggled by the ctrl-key
bool m_strafe_forward; // true when in strafemode by ctrl-key and shift is pressed for forward strafing

bool freeMoveEnabled;

unsigned int movementflags; // movement flags
wxStopWatch _keyControlTimer;

Expand Down Expand Up @@ -110,6 +112,9 @@ class Camera :
void moveBackDiscrete();
void moveForwardDiscrete();

void onForwardKey(ui::KeyEventType eventType);
void onBackwardKey(ui::KeyEventType eventType);

}; // class Camera

} // namespace ui
26 changes: 16 additions & 10 deletions radiant/camera/GlobalCamera.cpp
Expand Up @@ -56,10 +56,10 @@ void GlobalCameraManager::registerCommands()
GlobalCommandSystem().addCommand("TogglePreview", std::bind(&GlobalCameraManager::toggleLightingMode, this, std::placeholders::_1));

// Insert movement commands
GlobalCommandSystem().addCommand("CameraForward", std::bind(&GlobalCameraManager::moveForwardDiscrete, this, std::placeholders::_1));
GlobalCommandSystem().addCommand("CameraBack", std::bind(&GlobalCameraManager::moveBackDiscrete, this, std::placeholders::_1));
GlobalCommandSystem().addCommand("CameraLeft", std::bind(&GlobalCameraManager::rotateLeftDiscrete, this, std::placeholders::_1));
GlobalCommandSystem().addCommand("CameraRight", std::bind(&GlobalCameraManager::rotateRightDiscrete, this, std::placeholders::_1));
//GlobalCommandSystem().addCommand("CameraForward", std::bind(&GlobalCameraManager::moveForwardDiscrete, this, std::placeholders::_1));
//GlobalCommandSystem().addCommand("CameraBack", std::bind(&GlobalCameraManager::moveBackDiscrete, this, std::placeholders::_1));
//GlobalCommandSystem().addCommand("CameraLeft", std::bind(&GlobalCameraManager::rotateLeftDiscrete, this, std::placeholders::_1));
//GlobalCommandSystem().addCommand("CameraRight", std::bind(&GlobalCameraManager::rotateRightDiscrete, this, std::placeholders::_1));
GlobalCommandSystem().addCommand("CameraStrafeRight", std::bind(&GlobalCameraManager::moveRightDiscrete, this, std::placeholders::_1));
GlobalCommandSystem().addCommand("CameraStrafeLeft", std::bind(&GlobalCameraManager::moveLeftDiscrete, this, std::placeholders::_1));

Expand All @@ -79,8 +79,8 @@ void GlobalCameraManager::registerCommands()
GlobalEventManager().addWidgetToggle("ToggleCamera");
GlobalEventManager().setToggled("ToggleCamera", true);

GlobalEventManager().addKeyEvent("CameraFreeMoveForward", std::bind(&GlobalCameraManager::onFreelookMoveForwardKey, this, std::placeholders::_1));
GlobalEventManager().addKeyEvent("CameraFreeMoveBack", std::bind(&GlobalCameraManager::onFreelookMoveBackKey, this, std::placeholders::_1));
GlobalEventManager().addKeyEvent("CameraMoveForward", std::bind(&GlobalCameraManager::onFreelookMoveForwardKey, this, std::placeholders::_1));
GlobalEventManager().addKeyEvent("CameraMoveBack", std::bind(&GlobalCameraManager::onFreelookMoveBackKey, this, std::placeholders::_1));
GlobalEventManager().addKeyEvent("CameraFreeMoveLeft", std::bind(&GlobalCameraManager::onFreelookMoveLeftKey, this, std::placeholders::_1));
GlobalEventManager().addKeyEvent("CameraFreeMoveRight", std::bind(&GlobalCameraManager::onFreelookMoveRightKey, this, std::placeholders::_1));
GlobalEventManager().addKeyEvent("CameraFreeMoveUp", std::bind(&GlobalCameraManager::onFreelookMoveUpKey, this, std::placeholders::_1));
Expand Down Expand Up @@ -319,9 +319,11 @@ void GlobalCameraManager::focusCamera(const Vector3& point, const Vector3& angle

void GlobalCameraManager::onFreelookMoveForwardKey(ui::KeyEventType eventType)
{
CamWndPtr camWnd = getActiveCamWnd();
if (camWnd == NULL) return;
auto camWnd = getActiveCamWnd();
if (!camWnd) return;

camWnd->getCamera().onForwardKey(eventType);
#if 0
if (eventType == ui::KeyPressed)
{
camWnd->getCamera().setMovementFlags(MOVE_FORWARD);
Expand All @@ -330,13 +332,16 @@ void GlobalCameraManager::onFreelookMoveForwardKey(ui::KeyEventType eventType)
{
camWnd->getCamera().clearMovementFlags(MOVE_FORWARD);
}
#endif
}

void GlobalCameraManager::onFreelookMoveBackKey(ui::KeyEventType eventType)
{
CamWndPtr camWnd = getActiveCamWnd();
if (camWnd == NULL) return;
auto camWnd = getActiveCamWnd();
if (!camWnd) return;

camWnd->getCamera().onBackwardKey(eventType);
#if 0
if (eventType == ui::KeyPressed)
{
camWnd->getCamera().setMovementFlags(MOVE_BACK);
Expand All @@ -345,6 +350,7 @@ void GlobalCameraManager::onFreelookMoveBackKey(ui::KeyEventType eventType)
{
camWnd->getCamera().clearMovementFlags(MOVE_BACK);
}
#endif
}

void GlobalCameraManager::onFreelookMoveLeftKey(ui::KeyEventType eventType)
Expand Down
24 changes: 15 additions & 9 deletions radiant/eventmanager/EventManager.cpp
Expand Up @@ -391,22 +391,27 @@ void EventManager::onMenuItemClicked(wxCommandEvent& ev)

Accelerator& EventManager::connectAccelerator(int keyCode, unsigned int modifierFlags, const std::string& command)
{
auto result = _accelerators.emplace(command, std::make_shared<Accelerator>(keyCode, modifierFlags));
Accelerator& accel = *result.first->second;
auto accelerator = std::make_shared<Accelerator>(keyCode, modifierFlags);

// There might be an event to associate
auto event = findEvent(command);

if (!event->empty())
{
accel.setEvent(event);
accelerator->setEvent(event);
}
else if (GlobalCommandSystem().commandExists(command))
{
accelerator->setStatement(command);
}
else
{
accel.setStatement(command);
return _emptyAccelerator;
}

std::string acceleratorStr = accel.getString(true);
auto result = _accelerators.emplace(command, accelerator);

std::string acceleratorStr = accelerator->getString(true);
setMenuItemAccelerator(command, acceleratorStr);
setToolItemAccelerator(command, acceleratorStr);

Expand Down Expand Up @@ -549,10 +554,11 @@ void EventManager::loadAcceleratorFromList(const xml::NodeList& shortcutList)
int keyVal = Accelerator::getKeyCodeFromName(key);
unsigned int modifierFlags = wxutil::Modifier::GetStateFromModifierString(modifierStr);

connectAccelerator(keyVal, modifierFlags, cmd);

rWarning() << "EventManager: Cannot load shortcut definition (command invalid): "
<< cmd << std::endl;
if (connectAccelerator(keyVal, modifierFlags, cmd).isEmpty())
{
rWarning() << "EventManager: Cannot load shortcut definition (command invalid): "
<< cmd << std::endl;
}
}
}

Expand Down

0 comments on commit c64761c

Please sign in to comment.