X-Git-Url: https://de.git.xonotic.org/?a=blobdiff_plain;f=radiant%2Fcamwindow.cpp;h=0c054b43be94f19a360a621492b93d58b3ff2667;hb=f82b1ff71972841b85b07579a216424c73f232f3;hp=73c416c6fd8623f694e544190ff33b4a175b2f46;hpb=665309b15e2438423bd4e060f7c38c5cce30515c;p=xonotic%2Fnetradiant.git diff --git a/radiant/camwindow.cpp b/radiant/camwindow.cpp index 73c416c6..0c054b43 100644 --- a/radiant/camwindow.cpp +++ b/radiant/camwindow.cpp @@ -76,17 +76,21 @@ void CameraMovedNotify() struct camwindow_globals_private_t { int m_nMoveSpeed; + bool m_bCamLinkSpeed; int m_nAngleSpeed; bool m_bCamInverseMouse; bool m_bCamDiscrete; bool m_bCubicClipping; + bool m_showStats; camwindow_globals_private_t() : m_nMoveSpeed(100), + m_bCamLinkSpeed(true), m_nAngleSpeed(3), m_bCamInverseMouse(false), m_bCamDiscrete(true), - m_bCubicClipping(true) + m_bCubicClipping(true), + m_showStats(true) { } @@ -137,6 +141,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 +285,43 @@ 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) + { + float strafespeed = 0.65f; + + if(g_camwindow_globals_private.m_bCamLinkSpeed) + { + strafespeed = (float)g_camwindow_globals_private.m_nMoveSpeed / 100; + } + + 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; - camera.angles[CAMERA_YAW] += dx * dtime * g_camwindow_globals_private.m_nAngleSpeed; + 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_PITCH] > 90) - camera.angles[CAMERA_PITCH] = 90; - else if (camera.angles[CAMERA_PITCH] < -90) - camera.angles[CAMERA_PITCH] = -90; + camera.angles[CAMERA_YAW] += dx * 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; + 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); @@ -538,6 +565,9 @@ typedef ReferenceCaller FreeMoveCameraMoveDown #define SPEED_MOVE 32 #define SPEED_TURN 22.5 +#define MIN_CAM_SPEED 10 +#define MAX_CAM_SPEED 610 +#define CAM_SPEED_STEP 50 void Camera_MoveForward_Discrete(camera_t& camera) { @@ -638,7 +668,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 @@ -1474,6 +1512,22 @@ Cam_Draw ============== */ +void ShowStatsToggle() +{ + g_camwindow_globals_private.m_showStats ^= 1; +} +typedef FreeCaller ShowStatsToggleCaller; + +void ShowStatsExport(const BoolImportCallback& importer) +{ + importer(g_camwindow_globals_private.m_showStats); +} +typedef FreeCaller1 ShowStatsExportCaller; + +ShowStatsExportCaller g_show_stats_caller; +BoolExportCallback g_show_stats_callback(g_show_stats_caller); +ToggleItem g_show_stats(g_show_stats_callback); + void CamWnd::Cam_Draw() { glViewport(0, 0, m_Camera.width, m_Camera.height); @@ -1620,13 +1674,16 @@ void CamWnd::Cam_Draw() glEnd(); } - glRasterPos3f(1.0f, static_cast(m_Camera.height) - 1.0f, 0.0f); - extern const char* Renderer_GetStats(); - GlobalOpenGL().drawString(Renderer_GetStats()); + if(g_camwindow_globals_private.m_showStats) + { + glRasterPos3f(1.0f, static_cast(m_Camera.height) - 1.0f, 0.0f); + extern const char* Renderer_GetStats(); + GlobalOpenGL().drawString(Renderer_GetStats()); - glRasterPos3f(1.0f, static_cast(m_Camera.height) - 11.0f, 0.0f); - extern const char* Cull_GetStats(); - GlobalOpenGL().drawString(Cull_GetStats()); + glRasterPos3f(1.0f, static_cast(m_Camera.height) - 11.0f, 0.0f); + extern const char* Cull_GetStats(); + GlobalOpenGL().drawString(Cull_GetStats()); + } // bind back to the default texture so that we don't have problems // elsewhere using/modifying texture maps between contexts @@ -1745,7 +1802,7 @@ void Camera_ToggleFarClip() void CamWnd_constructToolbar(GtkToolbar* toolbar) { - toolbar_append_toggle_button(toolbar, "Cubic clip the camera view", "view_cubicclipping.bmp", "ToggleCubicClip"); + toolbar_append_toggle_button(toolbar, "Cubic clip the camera view (\\)", "view_cubicclipping.bmp", "ToggleCubicClip"); } void CamWnd_registerShortcuts() @@ -1756,6 +1813,9 @@ void CamWnd_registerShortcuts() { command_connect_accelerator("TogglePreview"); } + + command_connect_accelerator("CameraSpeedInc"); + command_connect_accelerator("CameraSpeedDec"); } @@ -1892,7 +1952,8 @@ typedef FreeCaller1 RenderModeExport void Camera_constructPreferences(PreferencesPage& page) { - page.appendSlider("Movement Speed", g_camwindow_globals_private.m_nMoveSpeed, TRUE, 0, 0, 100, 50, 300, 1, 10, 10); + page.appendSlider("Movement Speed", g_camwindow_globals_private.m_nMoveSpeed, TRUE, 0, 0, 100, MIN_CAM_SPEED, MAX_CAM_SPEED, 1, 10, 10); + page.appendCheckBox("", "Link strafe speed to movement speed", g_camwindow_globals_private.m_bCamLinkSpeed); page.appendSlider("Rotation Speed", g_camwindow_globals_private.m_nAngleSpeed, TRUE, 0, 0, 3, 1, 180, 1, 10, 10); page.appendCheckBox("", "Invert mouse vertical axis", g_camwindow_globals_private.m_bCamInverseMouse); page.appendCheckBox( @@ -1945,6 +2006,26 @@ void Camera_registerPreferencesPage() typedef FreeCaller1 CamWndMoveDiscreteImportCaller; +void CameraSpeed_increase() +{ + if(g_camwindow_globals_private.m_nMoveSpeed <= (MAX_CAM_SPEED - CAM_SPEED_STEP - 10)) + { + g_camwindow_globals_private.m_nMoveSpeed += CAM_SPEED_STEP; + } else { + g_camwindow_globals_private.m_nMoveSpeed = MAX_CAM_SPEED - 10; + } +} + +void CameraSpeed_decrease() +{ + if(g_camwindow_globals_private.m_nMoveSpeed >= (MIN_CAM_SPEED + CAM_SPEED_STEP)) + { + g_camwindow_globals_private.m_nMoveSpeed -= CAM_SPEED_STEP; + } else { + g_camwindow_globals_private.m_nMoveSpeed = MIN_CAM_SPEED; + } +} + /// \brief Initialisation for things that have the same lifespan as this module. void CamWnd_Construct() { @@ -1966,6 +2047,9 @@ void CamWnd_Construct() GlobalCommands_insert("TogglePreview", FreeCaller(), Accelerator(GDK_F3)); } + GlobalCommands_insert("CameraSpeedInc", FreeCaller(), Accelerator(GDK_KP_Add, (GdkModifierType)GDK_SHIFT_MASK)); + GlobalCommands_insert("CameraSpeedDec", FreeCaller(), Accelerator(GDK_KP_Subtract, (GdkModifierType)GDK_SHIFT_MASK)); + GlobalShortcuts_insert("CameraForward", Accelerator(GDK_Up)); GlobalShortcuts_insert("CameraBack", Accelerator(GDK_Down)); GlobalShortcuts_insert("CameraLeft", Accelerator(GDK_Left)); @@ -1983,7 +2067,11 @@ void CamWnd_Construct() GlobalShortcuts_insert("CameraFreeMoveLeft", Accelerator(GDK_Left)); GlobalShortcuts_insert("CameraFreeMoveRight", Accelerator(GDK_Right)); + GlobalToggles_insert("ShowStats", ShowStatsToggleCaller(), ToggleItem::AddCallbackCaller(g_show_stats)); + + GlobalPreferenceSystem().registerPreference("ShowStats", BoolImportStringCaller(g_camwindow_globals_private.m_showStats), BoolExportStringCaller(g_camwindow_globals_private.m_showStats)); GlobalPreferenceSystem().registerPreference("MoveSpeed", IntImportStringCaller(g_camwindow_globals_private.m_nMoveSpeed), IntExportStringCaller(g_camwindow_globals_private.m_nMoveSpeed)); + GlobalPreferenceSystem().registerPreference("CamLinkSpeed", BoolImportStringCaller(g_camwindow_globals_private.m_bCamLinkSpeed), BoolExportStringCaller(g_camwindow_globals_private.m_bCamLinkSpeed)); GlobalPreferenceSystem().registerPreference("AngleSpeed", IntImportStringCaller(g_camwindow_globals_private.m_nAngleSpeed), IntExportStringCaller(g_camwindow_globals_private.m_nAngleSpeed)); GlobalPreferenceSystem().registerPreference("CamInverseMouse", BoolImportStringCaller(g_camwindow_globals_private.m_bCamInverseMouse), BoolExportStringCaller(g_camwindow_globals_private.m_bCamInverseMouse)); GlobalPreferenceSystem().registerPreference("CamDiscrete", makeBoolStringImportCallback(CamWndMoveDiscreteImportCaller()), BoolExportStringCaller(g_camwindow_globals_private.m_bCamDiscrete));