X-Git-Url: http://de.git.xonotic.org/?p=xonotic%2Fnetradiant.git;a=blobdiff_plain;f=radiant%2Fcamwindow.cpp;h=0c2acb5b483d6c2939d098377a0c61fa2ee2954d;hp=ed8ec13a1e4898fe78c6951921221f6a006e267f;hb=8a61657fc4486b5bb14c9b60a2b5a4ef926f9c2c;hpb=a8a120ed834fb1dead4d51a5e8011bacccdad945 diff --git a/radiant/camwindow.cpp b/radiant/camwindow.cpp index ed8ec13a..0c2acb5b 100644 --- a/radiant/camwindow.cpp +++ b/radiant/camwindow.cpp @@ -37,7 +37,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA #include "renderable.h" #include "preferencesystem.h" -#include "generic/callback.h" +#include "signal/signal.h" #include "container/array.h" #include "scenelib.h" #include "render.h" @@ -60,16 +60,16 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA #include "timer.h" -std::vector g_cameraMoved_callbacks; +Signal0 g_cameraMoved_callbacks; -void AddCameraMovedCallback(const Callback& callback) +void AddCameraMovedCallback(const SignalHandler& handler) { - g_cameraMoved_callbacks.push_back(callback); + g_cameraMoved_callbacks.connectLast(handler); } void CameraMovedNotify() { - std::for_each(g_cameraMoved_callbacks.begin(), g_cameraMoved_callbacks.end(), CallbackInvoke()); + g_cameraMoved_callbacks(); } @@ -137,6 +137,9 @@ struct camera_t Matrix4 projection; Matrix4 modelview; + 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 + unsigned int movementflags; // movement flags Timer m_keycontrol_timer; guint m_keymove_handler; @@ -278,23 +281,38 @@ void Camera_setAngles(camera_t& camera, const Vector3& angles) void Camera_FreeMove(camera_t& camera, int dx, int dy) { - float dtime = 0.1f; - if (g_camwindow_globals_private.m_bCamInverseMouse) - camera.angles[CAMERA_PITCH] -= dy * dtime * g_camwindow_globals_private.m_nAngleSpeed; - else - camera.angles[CAMERA_PITCH] += dy * dtime * g_camwindow_globals_private.m_nAngleSpeed; + // free strafe mode, toggled by the ctrl key with optional shift for forward movement + if(camera.m_strafe) + { + const float strafespeed = 0.65f; - camera.angles[CAMERA_YAW] += dx * dtime * g_camwindow_globals_private.m_nAngleSpeed; + camera.origin -= camera.vright * strafespeed * dx; + if(camera.m_strafe_forward) + camera.origin += camera.vpn * strafespeed * dy; + else + camera.origin += camera.vup * strafespeed * dy; + } + else// free rotation + { + const float dtime = 0.1f; - if (camera.angles[CAMERA_PITCH] > 90) - camera.angles[CAMERA_PITCH] = 90; - else if (camera.angles[CAMERA_PITCH] < -90) - camera.angles[CAMERA_PITCH] = -90; + if (g_camwindow_globals_private.m_bCamInverseMouse) + camera.angles[CAMERA_PITCH] -= dy * dtime * g_camwindow_globals_private.m_nAngleSpeed; + else + camera.angles[CAMERA_PITCH] += dy * dtime * g_camwindow_globals_private.m_nAngleSpeed; - if (camera.angles[CAMERA_YAW] >= 360) - camera.angles[CAMERA_YAW] -=360; - else if (camera.angles[CAMERA_YAW] <= 0) - camera.angles[CAMERA_YAW] +=360; + camera.angles[CAMERA_YAW] += dx * dtime * g_camwindow_globals_private.m_nAngleSpeed; + + if (camera.angles[CAMERA_PITCH] > 90) + camera.angles[CAMERA_PITCH] = 90; + else if (camera.angles[CAMERA_PITCH] < -90) + camera.angles[CAMERA_PITCH] = -90; + + if (camera.angles[CAMERA_YAW] >= 360) + camera.angles[CAMERA_YAW] -=360; + else if (camera.angles[CAMERA_YAW] <= 0) + camera.angles[CAMERA_YAW] +=360; + } Camera_updateModelview(camera); Camera_Freemove_updateAxes(camera); @@ -638,7 +656,15 @@ public: void Camera_motionDelta(int x, int y, unsigned int state, void* data) { - reinterpret_cast(data)->m_mouseMove.motion_delta(x, y, state); + camera_t* cam = reinterpret_cast(data); + + cam->m_mouseMove.motion_delta(x, y, state); + cam->m_strafe = (state & GDK_CONTROL_MASK) != 0; + + if(cam->m_strafe) + cam->m_strafe_forward = (state & GDK_SHIFT_MASK) != 0; + else + cam->m_strafe_forward = false; } class CamWnd @@ -1120,6 +1146,7 @@ void CamWnd_Move_Discrete_Import(bool value) } + void CamWnd_Add_Handlers_Move(CamWnd& camwnd) { camwnd.m_selection_button_press_handler = g_signal_connect(G_OBJECT(camwnd.m_gl_widget), "button_press_event", G_CALLBACK(selection_button_press), camwnd.m_window_observer); @@ -1350,9 +1377,8 @@ static gboolean camwindow_freemove_focusout(GtkWidget* widget, GdkEventFocus* ev void CamWnd::EnableFreeMove() { -#if 0 - globalOutputStream() << "EnableFreeMove\n"; -#endif + //globalOutputStream() << "EnableFreeMove\n"; + ASSERT_MESSAGE(!m_bFreeMove, "EnableFreeMove: free-move was already enabled"); m_bFreeMove = true; Camera_clearMovementFlags(getCamera(), MOVE_ALL); @@ -1369,9 +1395,8 @@ void CamWnd::EnableFreeMove() void CamWnd::DisableFreeMove() { -#if 0 - globalOutputStream() << "DisableFreeMove\n"; -#endif + //globalOutputStream() << "DisableFreeMove\n"; + ASSERT_MESSAGE(m_bFreeMove, "DisableFreeMove: free-move was not enabled"); m_bFreeMove = false; Camera_clearMovementFlags(getCamera(), MOVE_ALL); @@ -1532,7 +1557,7 @@ void CamWnd::Cam_Draw() } - unsigned int globalstate = RENDER_DEPTHTEST|RENDER_COLOURWRITE|RENDER_DEPTHWRITE|RENDER_ALPHATEST|RENDER_BLEND|RENDER_CULLFACE|RENDER_COLOUR|RENDER_OFFSETLINE; + unsigned int globalstate = RENDER_DEPTHTEST|RENDER_COLOURWRITE|RENDER_DEPTHWRITE|RENDER_ALPHATEST|RENDER_BLEND|RENDER_CULLFACE|RENDER_COLOURARRAY|RENDER_OFFSETLINE|RENDER_POLYGONSMOOTH|RENDER_LINESMOOTH|RENDER_FOG|RENDER_COLOURCHANGE; switch (m_Camera.draw_mode) { case cd_wire: