]> git.xonotic.org Git - xonotic/netradiant.git/blobdiff - radiant/camwindow.cpp
Merge commit 'f472e6f0e8066e62cf3e159287bb07de97d2e59d' into master-merge
[xonotic/netradiant.git] / radiant / camwindow.cpp
index a533eec2c7c0c91bef931855f7753f10eaf49e07..6bae24c738cc674ef4e6a3e30f2a51028814eb1a 100644 (file)
@@ -76,6 +76,7 @@ void CameraMovedNotify(){
 
 struct camwindow_globals_private_t
 {
+       int m_nFOV;
        int m_nMoveSpeed;
        bool m_bCamLinkSpeed;
        int m_nAngleSpeed;
@@ -86,12 +87,13 @@ struct camwindow_globals_private_t
        int m_nStrafeMode;
 
        camwindow_globals_private_t() :
+               m_nFOV( 110 ),
                m_nMoveSpeed( 100 ),
                m_bCamLinkSpeed( true ),
                m_nAngleSpeed( 3 ),
                m_bCamInverseMouse( false ),
                m_bCamDiscrete( true ),
-               m_bCubicClipping( true ),
+               m_bCubicClipping( false ),
                m_showStats( true ),
                m_nStrafeMode( 0 ){
        }
@@ -151,8 +153,6 @@ struct camera_t
        guint m_keymove_handler;
 
 
-       float fieldOfView;
-
        DeferredMotionDelta m_mouseMove;
 
        static void motionDelta( int x, int y, void* data ){
@@ -176,7 +176,6 @@ struct camera_t
                movementflags( 0 ),
                m_keycontrol_timer(),
                m_keymove_handler( 0 ),
-               fieldOfView( 90.0f ),
                m_mouseMove( motionDelta, this ),
                m_view( view ),
                m_update( update ){
@@ -205,7 +204,7 @@ float Camera_getFarClipPlane( camera_t& camera ){
 
 void Camera_updateProjection( camera_t& camera ){
        float farClip = Camera_getFarClipPlane( camera );
-       camera.projection = projection_for_camera( farClip / 4096.0f, farClip, camera.fieldOfView, camera.width, camera.height );
+       camera.projection = projection_for_camera( farClip / 4096.0f, farClip, (float)g_camwindow_globals_private.m_nFOV, camera.width, camera.height );
 
        camera.m_view->Construct( camera.projection, camera.modelview, camera.width, camera.height );
 }
@@ -286,7 +285,7 @@ void Camera_FreeMove( camera_t& camera, int dx, int dy ){
 
                camera.origin -= camera.vright * strafespeed * dx;
                if ( camera.m_strafe_forward ) {
-                       camera.origin += camera.vpn * strafespeed * dy;
+                       camera.origin -= camera.vpn * strafespeed * dy;
                }
                else{
                        camera.origin += camera.vup * strafespeed * dy;
@@ -530,6 +529,9 @@ typedef ReferenceCaller<camera_t, void(), &Camera_MoveDown_KeyDown> FreeMoveCame
 typedef ReferenceCaller<camera_t, void(), &Camera_MoveDown_KeyUp> FreeMoveCameraMoveDownKeyUpCaller;
 
 
+const float MIN_FOV = 60;
+const float MAX_FOV = 179;
+const float FOV_STEP = 10;
 const float SPEED_MOVE = 32;
 const float SPEED_TURN = 22.5;
 const float MIN_CAM_SPEED = 10;
@@ -797,7 +799,7 @@ void Camera_setAngles( CamWnd& camwnd, const Vector3& angles ){
 // CamWnd class
 
 gboolean enable_freelook_button_press( ui::Widget widget, GdkEventButton* event, CamWnd* camwnd ){
-       if ( event->type == GDK_BUTTON_PRESS && event->button == 3 ) {
+       if ( event->type == GDK_BUTTON_PRESS && event->button == 3 && modifiers_for_state( event->state ) == c_modifierNone ) {
                camwnd->EnableFreeMove();
                return TRUE;
        }
@@ -805,7 +807,7 @@ gboolean enable_freelook_button_press( ui::Widget widget, GdkEventButton* event,
 }
 
 gboolean disable_freelook_button_press( ui::Widget widget, GdkEventButton* event, CamWnd* camwnd ){
-       if ( event->type == GDK_BUTTON_PRESS && event->button == 3 ) {
+       if ( event->type == GDK_BUTTON_PRESS && event->button == 3 && modifiers_for_state( event->state ) == c_modifierNone ) {
                camwnd->DisableFreeMove();
                return TRUE;
        }
@@ -968,6 +970,24 @@ void CamWnd_registerCommands( CamWnd& camwnd ){
                                                        FreeMoveCameraMoveRightKeyDownCaller( camwnd.getCamera() ),
                                                        FreeMoveCameraMoveRightKeyUpCaller( camwnd.getCamera() )
                                                        );
+
+       GlobalKeyEvents_insert( "CameraFreeMoveForward2", Accelerator( GDK_Up ),
+                                                       FreeMoveCameraMoveForwardKeyDownCaller( camwnd.getCamera() ),
+                                                       FreeMoveCameraMoveForwardKeyUpCaller( camwnd.getCamera() )
+                                                       );
+       GlobalKeyEvents_insert( "CameraFreeMoveBack2", Accelerator( GDK_Down ),
+                                                       FreeMoveCameraMoveBackKeyDownCaller( camwnd.getCamera() ),
+                                                       FreeMoveCameraMoveBackKeyUpCaller( camwnd.getCamera() )
+                                                       );
+       GlobalKeyEvents_insert( "CameraFreeMoveLeft2", Accelerator( GDK_Left ),
+                                                       FreeMoveCameraMoveLeftKeyDownCaller( camwnd.getCamera() ),
+                                                       FreeMoveCameraMoveLeftKeyUpCaller( camwnd.getCamera() )
+                                                       );
+       GlobalKeyEvents_insert( "CameraFreeMoveRight2", Accelerator( GDK_Right ),
+                                                       FreeMoveCameraMoveRightKeyDownCaller( camwnd.getCamera() ),
+                                                       FreeMoveCameraMoveRightKeyUpCaller( camwnd.getCamera() )
+                                                       );
+
        GlobalKeyEvents_insert( "CameraFreeMoveUp", Accelerator( 'D' ),
                                                        FreeMoveCameraMoveUpKeyDownCaller( camwnd.getCamera() ),
                                                        FreeMoveCameraMoveUpKeyUpCaller( camwnd.getCamera() )
@@ -1056,20 +1076,20 @@ struct CamWnd_Move_Discrete {
        }
 
        static void Import_(CamWnd &camwnd, bool value) {
-               if (g_camwindow_globals_private.m_bCamDiscrete) {
-                       CamWnd_Move_Discrete_Disable(camwnd);
+       if ( g_camwindow_globals_private.m_bCamDiscrete ) {
+               CamWnd_Move_Discrete_Disable( camwnd );
                } else {
-                       CamWnd_Move_Disable(camwnd);
-               }
+               CamWnd_Move_Disable( camwnd );
+       }
 
-               g_camwindow_globals_private.m_bCamDiscrete = value;
+       g_camwindow_globals_private.m_bCamDiscrete = value;
 
-               if (g_camwindow_globals_private.m_bCamDiscrete) {
-                       CamWnd_Move_Discrete_Enable(camwnd);
+       if ( g_camwindow_globals_private.m_bCamDiscrete ) {
+               CamWnd_Move_Discrete_Enable( camwnd );
                } else {
-                       CamWnd_Move_Enable(camwnd);
-               }
+               CamWnd_Move_Enable( camwnd );
        }
+}
 };
 
 
@@ -1116,6 +1136,12 @@ void CamWnd_Add_Handlers_FreeMove( CamWnd& camwnd ){
        KeyEvent_connect( "CameraFreeMoveBack" );
        KeyEvent_connect( "CameraFreeMoveLeft" );
        KeyEvent_connect( "CameraFreeMoveRight" );
+
+       KeyEvent_connect( "CameraFreeMoveForward2" );
+       KeyEvent_connect( "CameraFreeMoveBack2" );
+       KeyEvent_connect( "CameraFreeMoveLeft2" );
+       KeyEvent_connect( "CameraFreeMoveRight2" );
+
        KeyEvent_connect( "CameraFreeMoveUp" );
        KeyEvent_connect( "CameraFreeMoveDown" );
 }
@@ -1125,6 +1151,12 @@ void CamWnd_Remove_Handlers_FreeMove( CamWnd& camwnd ){
        KeyEvent_disconnect( "CameraFreeMoveBack" );
        KeyEvent_disconnect( "CameraFreeMoveLeft" );
        KeyEvent_disconnect( "CameraFreeMoveRight" );
+
+       KeyEvent_disconnect( "CameraFreeMoveForward2" );
+       KeyEvent_disconnect( "CameraFreeMoveBack2" );
+       KeyEvent_disconnect( "CameraFreeMoveLeft2" );
+       KeyEvent_disconnect( "CameraFreeMoveRight2" );
+
        KeyEvent_disconnect( "CameraFreeMoveUp" );
        KeyEvent_disconnect( "CameraFreeMoveDown" );
 
@@ -1216,6 +1248,9 @@ bool pre( const scene::Path& path, scene::Instance& instance ) const {
                        m_bestDown = floorHeight;
                }
        }
+       else if( !path.top().get().visible() ){
+               return false;
+       }
        return true;
 }
 };
@@ -1292,6 +1327,8 @@ void CamWnd::EnableFreeMove(){
 
        gtk_window_set_focus( m_parent, m_gl_widget );
        m_freemove_handle_focusout = m_gl_widget.connect( "focus_out_event", G_CALLBACK( camwindow_freemove_focusout ), this );
+       /* We chose to replace m_parent by m_gl_widget but NetRadiantCustom does:
+       m_freezePointer.freeze_pointer( m_parent, m_gl_widget, Camera_motionDelta, &m_Camera ); */
        m_freezePointer.freeze_pointer( m_gl_widget, Camera_motionDelta, &m_Camera );
 
        CamWnd_Update( *this );
@@ -1307,7 +1344,8 @@ void CamWnd::DisableFreeMove(){
        CamWnd_Remove_Handlers_FreeMove( *this );
        CamWnd_Add_Handlers_Move( *this );
 
-       m_freezePointer.unfreeze_pointer( m_gl_widget );
+       m_freezePointer.unfreeze_pointer( m_gl_widget, true );
+
        g_signal_handler_disconnect( G_OBJECT( m_gl_widget ), m_freemove_handle_focusout );
 
        CamWnd_Update( *this );
@@ -1391,7 +1429,7 @@ void render( const Matrix4& modelview, const Matrix4& projection ){
    Cam_Draw
    ==============
  */
-
+/*
 void ShowStatsToggle(){
        g_camwindow_globals_private.m_showStats ^= 1;
 }
@@ -1403,6 +1441,22 @@ void ShowStatsExport( const Callback<void(bool)> &importer ){
 FreeCaller<void(const Callback<void(bool)>&), ShowStatsExport> g_show_stats_caller;
 Callback<void(const Callback<void(bool)> &)> g_show_stats_callback( g_show_stats_caller );
 ToggleItem g_show_stats( g_show_stats_callback );
+*/
+
+void ShowStatsToggle(){
+       g_camwindow_globals_private.m_showStats ^= 1;
+//     g_show_stats.update();
+       UpdateAllWindows();
+}
+typedef FreeCaller<void(), ShowStatsToggle> ShowStatsToggleCaller;
+void ShowStatsExport( const Callback<void(bool)> & importer ){
+       importer( g_camwindow_globals_private.m_showStats );
+}
+typedef FreeCaller<void(const Callback<void(bool)> &), ShowStatsExport> ShowStatsExportCaller;
+
+ShowStatsExportCaller g_show_stats_caller;
+Callback<void(const Callback<void(bool)> &)> 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 );
@@ -1493,9 +1547,9 @@ void CamWnd::Cam_Draw(){
                break;
        }
 
-       if ( !g_xywindow_globals.m_bNoStipple ) {
+//     if ( !g_xywindow_globals.m_bNoStipple ) {
                globalstate |= RENDER_LINESTIPPLE | RENDER_POLYGONSTIPPLE;
-       }
+//     }
 
        {
                CamRenderer renderer( globalstate, m_state_select2, m_state_select1, m_view.getViewer() );
@@ -1671,7 +1725,7 @@ void Camera_ToggleFarClip(){
 
 
 void CamWnd_constructToolbar( ui::Toolbar toolbar ){
-       toolbar_append_toggle_button( toolbar, "Cubic clip the camera view (\\)", "view_cubicclipping.png", "ToggleCubicClip" );
+       toolbar_append_toggle_button( toolbar, "Cubic clip the camera view (Ctrl + \\)", "view_cubicclipping.png", "ToggleCubicClip" );
 }
 
 void CamWnd_registerShortcuts(){
@@ -1681,6 +1735,8 @@ void CamWnd_registerShortcuts(){
                command_connect_accelerator( "TogglePreview" );
        }
 
+       command_connect_accelerator( "FOVInc" );
+       command_connect_accelerator( "FOVDec" );
        command_connect_accelerator( "CameraSpeedInc" );
        command_connect_accelerator( "CameraSpeedDec" );
 }
@@ -1779,25 +1835,26 @@ struct RenderMode {
 
        static void Import(int value) {
                switch (value) {
-                       case 0:
-                               CamWnd_SetMode(cd_wire);
-                               break;
-                       case 1:
-                               CamWnd_SetMode(cd_solid);
-                               break;
-                       case 2:
-                               CamWnd_SetMode(cd_texture);
-                               break;
-                       case 3:
-                               CamWnd_SetMode(cd_lighting);
-                               break;
-                       default:
-                               CamWnd_SetMode(cd_texture);
-               }
+       case 0:
+               CamWnd_SetMode( cd_wire );
+               break;
+       case 1:
+               CamWnd_SetMode( cd_solid );
+               break;
+       case 2:
+               CamWnd_SetMode( cd_texture );
+               break;
+       case 3:
+               CamWnd_SetMode( cd_lighting );
+               break;
+       default:
+               CamWnd_SetMode( cd_texture );
        }
+}
 };
 
 void Camera_constructPreferences( PreferencesPage& page ){
+       page.appendSlider( "FOV", g_camwindow_globals_private.m_nFOV, TRUE, 0, 0, 100, MIN_FOV, MAX_FOV, 1, 10 );
        page.appendSlider( "Movement Speed", g_camwindow_globals_private.m_nMoveSpeed, TRUE, 0, 0, 100, MIN_CAM_SPEED, MAX_CAM_SPEED, 1, 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 );
@@ -1851,6 +1908,31 @@ void Camera_registerPreferencesPage(){
 #include "stringio.h"
 #include "dialog.h"
 
+void FOV_increase(){
+       CamWnd& camwnd = *g_camwnd;
+       if ( g_camwindow_globals_private.m_nFOV <= ( MAX_FOV - FOV_STEP - 10 ) ) {
+               g_camwindow_globals_private.m_nFOV += FOV_STEP;
+       }
+       else {
+               g_camwindow_globals_private.m_nFOV = MAX_FOV - 10;
+       }
+       Camera_updateProjection( camwnd.getCamera() );
+       CamWnd_Update( camwnd );
+}
+
+void FOV_decrease(){
+       CamWnd& camwnd = *g_camwnd;
+       if ( g_camwindow_globals_private.m_nFOV >= ( MIN_FOV + FOV_STEP ) ) {
+               g_camwindow_globals_private.m_nFOV -= FOV_STEP;
+       }
+       else {
+               g_camwindow_globals_private.m_nFOV = MIN_FOV;
+       }
+       Camera_updateProjection( camwnd.getCamera() );
+       CamWnd_Update( camwnd );
+}
+
+
 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;
@@ -1888,6 +1970,9 @@ void CamWnd_Construct(){
                GlobalCommands_insert( "TogglePreview", makeCallbackF(CamWnd_TogglePreview), Accelerator( GDK_KEY_F3 ) );
        }
 
+       GlobalCommands_insert( "FOVInc", makeCallbackF(FOV_increase), Accelerator( GDK_KEY_KP_Multiply, (GdkModifierType)GDK_SHIFT_MASK ) );
+       GlobalCommands_insert( "FOVDec", makeCallbackF(FOV_decrease), Accelerator( GDK_KEY_KP_Divide, (GdkModifierType)GDK_SHIFT_MASK ) );
+
        GlobalCommands_insert( "CameraSpeedInc", makeCallbackF(CameraSpeed_increase), Accelerator( GDK_KEY_KP_Add, (GdkModifierType)GDK_SHIFT_MASK ) );
        GlobalCommands_insert( "CameraSpeedDec", makeCallbackF(CameraSpeed_decrease), Accelerator( GDK_KEY_KP_Subtract, (GdkModifierType)GDK_SHIFT_MASK ) );
 
@@ -1898,19 +1983,25 @@ void CamWnd_Construct(){
        GlobalShortcuts_insert( "CameraStrafeRight", Accelerator( GDK_KEY_period ) );
        GlobalShortcuts_insert( "CameraStrafeLeft", Accelerator( GDK_KEY_comma ) );
 
-       GlobalShortcuts_insert( "CameraUp", Accelerator( 'D' ) );
-       GlobalShortcuts_insert( "CameraDown", Accelerator( 'C' ) );
-       GlobalShortcuts_insert( "CameraAngleUp", Accelerator( 'A' ) );
-       GlobalShortcuts_insert( "CameraAngleDown", Accelerator( 'Z' ) );
+       GlobalShortcuts_insert( "CameraUp", accelerator_null() );
+       GlobalShortcuts_insert( "CameraDown", accelerator_null() );
+       GlobalShortcuts_insert( "CameraAngleUp", accelerator_null() );
+       GlobalShortcuts_insert( "CameraAngleDown", accelerator_null() );
+
+       GlobalShortcuts_insert( "CameraFreeMoveForward", Accelerator( GDK_Up ) );
+       GlobalShortcuts_insert( "CameraFreeMoveBack", Accelerator( GDK_Down ) );
+       GlobalShortcuts_insert( "CameraFreeMoveLeft", Accelerator( GDK_Left ) );
+       GlobalShortcuts_insert( "CameraFreeMoveRight", Accelerator( GDK_Right ) );
 
-       GlobalShortcuts_insert( "CameraFreeMoveForward", Accelerator( GDK_KEY_Up ) );
-       GlobalShortcuts_insert( "CameraFreeMoveBack", Accelerator( GDK_KEY_Down ) );
-       GlobalShortcuts_insert( "CameraFreeMoveLeft", Accelerator( GDK_KEY_Left ) );
-       GlobalShortcuts_insert( "CameraFreeMoveRight", Accelerator( GDK_KEY_Right ) );
+       GlobalShortcuts_insert( "CameraFreeMoveForward2", Accelerator( GDK_Up ) );
+       GlobalShortcuts_insert( "CameraFreeMoveBack2", Accelerator( GDK_Down ) );
+       GlobalShortcuts_insert( "CameraFreeMoveLeft2", Accelerator( GDK_Left ) );
+       GlobalShortcuts_insert( "CameraFreeMoveRight2", Accelerator( GDK_Right ) );
 
        GlobalToggles_insert( "ShowStats", makeCallbackF(ShowStatsToggle), ToggleItem::AddCallbackCaller( g_show_stats ) );
 
        GlobalPreferenceSystem().registerPreference( "ShowStats", make_property_string( g_camwindow_globals_private.m_showStats ) );
+       GlobalPreferenceSystem().registerPreference( "FOV", make_property_string( g_camwindow_globals_private.m_nFOV ) );
        GlobalPreferenceSystem().registerPreference( "MoveSpeed", make_property_string( g_camwindow_globals_private.m_nMoveSpeed ) );
        GlobalPreferenceSystem().registerPreference( "CamLinkSpeed", make_property_string( g_camwindow_globals_private.m_bCamLinkSpeed ) );
        GlobalPreferenceSystem().registerPreference( "AngleSpeed", make_property_string( g_camwindow_globals_private.m_nAngleSpeed ) );