]> git.xonotic.org Git - xonotic/netradiant.git/blobdiff - radiant/camwindow.cpp
Radiant:
[xonotic/netradiant.git] / radiant / camwindow.cpp
index 1b36589bf6432ce3d3d49ec56ee580fdbad87594..fdad03e1d15c7230f27b82491f26f30c02524db5 100644 (file)
@@ -90,7 +90,7 @@ struct camwindow_globals_private_t
                m_bCamDiscrete( true ),
                m_bCubicClipping( false ),
                m_showStats( true ),
-               m_nStrafeMode( 0 ){
+               m_nStrafeMode( 3 ){
        }
 
 };
@@ -142,6 +142,7 @@ struct camera_t
 
        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 m_strafe_forward_invert; //silly option to invert forward strafing to support old fegs
 
        unsigned int movementflags; // movement flags
        Timer m_keycontrol_timer;
@@ -280,7 +281,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.m_strafe_forward_invert ? ( camera.vpn * strafespeed * dy ) : ( -camera.vpn * strafespeed * dy );
                }
                else{
                        camera.origin += camera.vup * strafespeed * dy;
@@ -319,17 +320,17 @@ void Camera_FreeMove( camera_t& camera, int dx, int dy ){
 }
 
 void Cam_MouseControl( camera_t& camera, int x, int y ){
-       int xl, xh;
-       int yl, yh;
+//     int xl, xh;
+//     int yl, yh;
        float xf, yf;
 
        xf = (float)( x - camera.width / 2 ) / ( camera.width / 2 );
        yf = (float)( y - camera.height / 2 ) / ( camera.height / 2 );
 
-       xl = camera.width / 3;
-       xh = xl * 2;
-       yl = camera.height / 3;
-       yh = yl * 2;
+//     xl = camera.width / 3;
+//     xh = xl * 2;
+//     yl = camera.height / 3;
+//     yh = yl * 2;
 
        xf *= 1.0f - fabsf( yf );
        if ( xf < 0 ) {
@@ -629,16 +630,12 @@ void Camera_motionDelta( int x, int y, unsigned int state, void* data ){
 
        cam->m_mouseMove.motion_delta( x, y, state );
 
+       cam->m_strafe_forward_invert = false;
+
        switch ( g_camwindow_globals_private.m_nStrafeMode )
        {
        case 0:
-               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;
-               }
+               cam->m_strafe = false;
                break;
        case 1:
                cam->m_strafe = ( state & GDK_CONTROL_MASK ) != 0 && ( state & GDK_SHIFT_MASK ) == 0;
@@ -648,9 +645,24 @@ void Camera_motionDelta( int x, int y, unsigned int state, void* data ){
                cam->m_strafe = ( state & GDK_CONTROL_MASK ) != 0 && ( state & GDK_SHIFT_MASK ) == 0;
                cam->m_strafe_forward = cam->m_strafe;
                break;
+       case 4:
+               cam->m_strafe_forward_invert = true;
+       default:
+               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;
+               }
+               break;
        }
 }
 
+
+
+
+
 class CamWnd
 {
 View m_view;
@@ -712,7 +724,7 @@ static void releaseStates(){
 
 camera_t& getCamera(){
        return m_Camera;
-};
+}
 
 void BenchMark();
 void Cam_ChangeFloor( bool up );
@@ -913,101 +925,101 @@ void KeyEvent_disconnect( const char* name ){
 }
 
 void CamWnd_registerCommands( CamWnd& camwnd ){
-       GlobalKeyEvents_insert( "CameraForward", Accelerator( GDK_Up ),
+       GlobalKeyEvents_insert( "CameraForward", accelerator_null(),
                                                        ReferenceCaller<camera_t, Camera_MoveForward_KeyDown>( camwnd.getCamera() ),
                                                        ReferenceCaller<camera_t, Camera_MoveForward_KeyUp>( camwnd.getCamera() )
                                                        );
-       GlobalKeyEvents_insert( "CameraBack", Accelerator( GDK_Down ),
+       GlobalKeyEvents_insert( "CameraBack", accelerator_null(),
                                                        ReferenceCaller<camera_t, Camera_MoveBack_KeyDown>( camwnd.getCamera() ),
                                                        ReferenceCaller<camera_t, Camera_MoveBack_KeyUp>( camwnd.getCamera() )
                                                        );
-       GlobalKeyEvents_insert( "CameraLeft", Accelerator( GDK_Left ),
+       GlobalKeyEvents_insert( "CameraLeft", accelerator_null(),
                                                        ReferenceCaller<camera_t, Camera_RotateLeft_KeyDown>( camwnd.getCamera() ),
                                                        ReferenceCaller<camera_t, Camera_RotateLeft_KeyUp>( camwnd.getCamera() )
                                                        );
-       GlobalKeyEvents_insert( "CameraRight", Accelerator( GDK_Right ),
+       GlobalKeyEvents_insert( "CameraRight", accelerator_null(),
                                                        ReferenceCaller<camera_t, Camera_RotateRight_KeyDown>( camwnd.getCamera() ),
                                                        ReferenceCaller<camera_t, Camera_RotateRight_KeyUp>( camwnd.getCamera() )
                                                        );
-       GlobalKeyEvents_insert( "CameraStrafeRight", Accelerator( GDK_period ),
+       GlobalKeyEvents_insert( "CameraStrafeRight", accelerator_null(),
                                                        ReferenceCaller<camera_t, Camera_MoveRight_KeyDown>( camwnd.getCamera() ),
                                                        ReferenceCaller<camera_t, Camera_MoveRight_KeyUp>( camwnd.getCamera() )
                                                        );
-       GlobalKeyEvents_insert( "CameraStrafeLeft", Accelerator( GDK_comma ),
+       GlobalKeyEvents_insert( "CameraStrafeLeft", accelerator_null(),
                                                        ReferenceCaller<camera_t, Camera_MoveLeft_KeyDown>( camwnd.getCamera() ),
                                                        ReferenceCaller<camera_t, Camera_MoveLeft_KeyUp>( camwnd.getCamera() )
                                                        );
-       GlobalKeyEvents_insert( "CameraUp", Accelerator( 'D' ),
+       GlobalKeyEvents_insert( "CameraUp", accelerator_null(),
                                                        ReferenceCaller<camera_t, Camera_MoveUp_KeyDown>( camwnd.getCamera() ),
                                                        ReferenceCaller<camera_t, Camera_MoveUp_KeyUp>( camwnd.getCamera() )
                                                        );
-       GlobalKeyEvents_insert( "CameraDown", Accelerator( 'C' ),
+       GlobalKeyEvents_insert( "CameraDown", accelerator_null(),
                                                        ReferenceCaller<camera_t, Camera_MoveDown_KeyDown>( camwnd.getCamera() ),
                                                        ReferenceCaller<camera_t, Camera_MoveDown_KeyUp>( camwnd.getCamera() )
                                                        );
-       GlobalKeyEvents_insert( "CameraAngleDown", Accelerator( 'A' ),
-                                                       ReferenceCaller<camera_t, Camera_PitchDown_KeyDown>( camwnd.getCamera() ),
-                                                       ReferenceCaller<camera_t, Camera_PitchDown_KeyUp>( camwnd.getCamera() )
-                                                       );
-       GlobalKeyEvents_insert( "CameraAngleUp", Accelerator( 'Z' ),
+       GlobalKeyEvents_insert( "CameraAngleUp", accelerator_null(),
                                                        ReferenceCaller<camera_t, Camera_PitchUp_KeyDown>( camwnd.getCamera() ),
                                                        ReferenceCaller<camera_t, Camera_PitchUp_KeyUp>( camwnd.getCamera() )
                                                        );
+       GlobalKeyEvents_insert( "CameraAngleDown", accelerator_null(),
+                                                       ReferenceCaller<camera_t, Camera_PitchDown_KeyDown>( camwnd.getCamera() ),
+                                                       ReferenceCaller<camera_t, Camera_PitchDown_KeyUp>( camwnd.getCamera() )
+                                                       );
 
-       GlobalKeyEvents_insert( "CameraFreeMoveForward", Accelerator( 'W' ),
+       GlobalKeyEvents_insert( "CameraFreeMoveForward", accelerator_null(),
                                                        FreeMoveCameraMoveForwardKeyDownCaller( camwnd.getCamera() ),
                                                        FreeMoveCameraMoveForwardKeyUpCaller( camwnd.getCamera() )
                                                        );
-       GlobalKeyEvents_insert( "CameraFreeMoveBack", Accelerator( 'S' ),
+       GlobalKeyEvents_insert( "CameraFreeMoveBack", accelerator_null(),
                                                        FreeMoveCameraMoveBackKeyDownCaller( camwnd.getCamera() ),
                                                        FreeMoveCameraMoveBackKeyUpCaller( camwnd.getCamera() )
                                                        );
-       GlobalKeyEvents_insert( "CameraFreeMoveLeft", Accelerator( 'A' ),
+       GlobalKeyEvents_insert( "CameraFreeMoveLeft", accelerator_null(),
                                                        FreeMoveCameraMoveLeftKeyDownCaller( camwnd.getCamera() ),
                                                        FreeMoveCameraMoveLeftKeyUpCaller( camwnd.getCamera() )
                                                        );
-       GlobalKeyEvents_insert( "CameraFreeMoveRight", Accelerator( 'D' ),
+       GlobalKeyEvents_insert( "CameraFreeMoveRight", accelerator_null(),
                                                        FreeMoveCameraMoveRightKeyDownCaller( camwnd.getCamera() ),
                                                        FreeMoveCameraMoveRightKeyUpCaller( camwnd.getCamera() )
                                                        );
 
-       GlobalKeyEvents_insert( "CameraFreeMoveForward2", Accelerator( GDK_Up ),
+       GlobalKeyEvents_insert( "CameraFreeMoveForward2", accelerator_null(),
                                                        FreeMoveCameraMoveForwardKeyDownCaller( camwnd.getCamera() ),
                                                        FreeMoveCameraMoveForwardKeyUpCaller( camwnd.getCamera() )
                                                        );
-       GlobalKeyEvents_insert( "CameraFreeMoveBack2", Accelerator( GDK_Down ),
+       GlobalKeyEvents_insert( "CameraFreeMoveBack2", accelerator_null(),
                                                        FreeMoveCameraMoveBackKeyDownCaller( camwnd.getCamera() ),
                                                        FreeMoveCameraMoveBackKeyUpCaller( camwnd.getCamera() )
                                                        );
-       GlobalKeyEvents_insert( "CameraFreeMoveLeft2", Accelerator( GDK_Left ),
+       GlobalKeyEvents_insert( "CameraFreeMoveLeft2", accelerator_null(),
                                                        FreeMoveCameraMoveLeftKeyDownCaller( camwnd.getCamera() ),
                                                        FreeMoveCameraMoveLeftKeyUpCaller( camwnd.getCamera() )
                                                        );
-       GlobalKeyEvents_insert( "CameraFreeMoveRight2", Accelerator( GDK_Right ),
+       GlobalKeyEvents_insert( "CameraFreeMoveRight2", accelerator_null(),
                                                        FreeMoveCameraMoveRightKeyDownCaller( camwnd.getCamera() ),
                                                        FreeMoveCameraMoveRightKeyUpCaller( camwnd.getCamera() )
                                                        );
 
-       GlobalKeyEvents_insert( "CameraFreeMoveUp", Accelerator( GDK_period ),
+       GlobalKeyEvents_insert( "CameraFreeMoveUp", accelerator_null(),
                                                        FreeMoveCameraMoveUpKeyDownCaller( camwnd.getCamera() ),
                                                        FreeMoveCameraMoveUpKeyUpCaller( camwnd.getCamera() )
                                                        );
-       GlobalKeyEvents_insert( "CameraFreeMoveDown", Accelerator( GDK_comma ),
+       GlobalKeyEvents_insert( "CameraFreeMoveDown", accelerator_null(),
                                                        FreeMoveCameraMoveDownKeyDownCaller( camwnd.getCamera() ),
                                                        FreeMoveCameraMoveDownKeyUpCaller( camwnd.getCamera() )
                                                        );
 
-       GlobalCommands_insert( "CameraForward", ReferenceCaller<camera_t, Camera_MoveForward_Discrete>( camwnd.getCamera() ), Accelerator( GDK_Up ) );
-       GlobalCommands_insert( "CameraBack", ReferenceCaller<camera_t, Camera_MoveBack_Discrete>( camwnd.getCamera() ), Accelerator( GDK_Down ) );
-       GlobalCommands_insert( "CameraLeft", ReferenceCaller<camera_t, Camera_RotateLeft_Discrete>( camwnd.getCamera() ), Accelerator( GDK_Left ) );
-       GlobalCommands_insert( "CameraRight", ReferenceCaller<camera_t, Camera_RotateRight_Discrete>( camwnd.getCamera() ), Accelerator( GDK_Right ) );
-       GlobalCommands_insert( "CameraStrafeRight", ReferenceCaller<camera_t, Camera_MoveRight_Discrete>( camwnd.getCamera() ), Accelerator( GDK_period ) );
-       GlobalCommands_insert( "CameraStrafeLeft", ReferenceCaller<camera_t, Camera_MoveLeft_Discrete>( camwnd.getCamera() ), Accelerator( GDK_comma ) );
+       GlobalCommands_insert( "CameraForward", ReferenceCaller<camera_t, Camera_MoveForward_Discrete>( camwnd.getCamera() ) );
+       GlobalCommands_insert( "CameraBack", ReferenceCaller<camera_t, Camera_MoveBack_Discrete>( camwnd.getCamera() ) );
+       GlobalCommands_insert( "CameraLeft", ReferenceCaller<camera_t, Camera_RotateLeft_Discrete>( camwnd.getCamera() ) );
+       GlobalCommands_insert( "CameraRight", ReferenceCaller<camera_t, Camera_RotateRight_Discrete>( camwnd.getCamera() ) );
+       GlobalCommands_insert( "CameraStrafeRight", ReferenceCaller<camera_t, Camera_MoveRight_Discrete>( camwnd.getCamera() ) );
+       GlobalCommands_insert( "CameraStrafeLeft", ReferenceCaller<camera_t, Camera_MoveLeft_Discrete>( camwnd.getCamera() ) );
 
-       GlobalCommands_insert( "CameraUp", ReferenceCaller<camera_t, Camera_MoveUp_Discrete>( camwnd.getCamera() ), Accelerator( 'D' ) );
-       GlobalCommands_insert( "CameraDown", ReferenceCaller<camera_t, Camera_MoveDown_Discrete>( camwnd.getCamera() ), Accelerator( 'C' ) );
-       GlobalCommands_insert( "CameraAngleUp", ReferenceCaller<camera_t, Camera_PitchUp_Discrete>( camwnd.getCamera() ), Accelerator( 'A' ) );
-       GlobalCommands_insert( "CameraAngleDown", ReferenceCaller<camera_t, Camera_PitchDown_Discrete>( camwnd.getCamera() ), Accelerator( 'Z' ) );
+       GlobalCommands_insert( "CameraUp", ReferenceCaller<camera_t, Camera_MoveUp_Discrete>( camwnd.getCamera() ) );
+       GlobalCommands_insert( "CameraDown", ReferenceCaller<camera_t, Camera_MoveDown_Discrete>( camwnd.getCamera() ) );
+       GlobalCommands_insert( "CameraAngleUp", ReferenceCaller<camera_t, Camera_PitchUp_Discrete>( camwnd.getCamera() ) );
+       GlobalCommands_insert( "CameraAngleDown", ReferenceCaller<camera_t, Camera_PitchDown_Discrete>( camwnd.getCamera() ) );
 }
 
 void CamWnd_Move_Enable( CamWnd& camwnd ){
@@ -1648,6 +1660,50 @@ void GlobalCamera_ResetAngles(){
        Camera_setAngles( camwnd, angles );
 }
 
+#include "select.h"
+
+void GlobalCamera_FocusOnSelected(){
+       CamWnd& camwnd = *g_camwnd;
+
+       Vector3 angles( Camera_getAngles( camwnd ) );
+       Vector3 radangles( degrees_to_radians( angles[0] ), degrees_to_radians( angles[1] ), degrees_to_radians( angles[2] ) );
+       Vector3 viewvector;
+       viewvector[0] = cos( radangles[1] ) * cos( radangles[0] );
+       viewvector[1] = sin( radangles[1] ) * cos( radangles[0] );
+       viewvector[2] = sin( radangles[0] );
+
+       Vector3 camorigin( Camera_getOrigin( camwnd ) );
+
+       AABB aabb( aabb_for_minmax( Select_getWorkZone().d_work_min, Select_getWorkZone().d_work_max ) );
+
+       View& view = *( camwnd.getCamera().m_view );
+
+       Plane3 frustumPlanes[4];
+       frustumPlanes[0] = plane3_translated( view.getFrustum().left, camorigin - aabb.origin );
+       frustumPlanes[1] = plane3_translated( view.getFrustum().right, camorigin - aabb.origin );
+       frustumPlanes[2] = plane3_translated( view.getFrustum().top, camorigin - aabb.origin );
+       frustumPlanes[3] = plane3_translated( view.getFrustum().bottom, camorigin - aabb.origin );
+
+       float offset = 64.0f;
+
+       Vector3 corners[8];
+       aabb_corners( aabb, corners );
+
+       for ( size_t i = 0; i < 4; ++i ){
+               for ( size_t j = 0; j < 8; ++j ){
+                       Ray ray( aabb.origin, -viewvector );
+                       //Plane3 newplane( frustumPlanes[i].normal(), vector3_dot( frustumPlanes[i].normal(), corners[j] - frustumPlanes[i].normal() * 16.0f ) );
+                       Plane3 newplane( frustumPlanes[i].normal(), vector3_dot( frustumPlanes[i].normal(), corners[j] ) );
+                       float d = vector3_dot( ray.direction, newplane.normal() );
+                       if( d != 0 ){
+                               float s = vector3_dot( newplane.normal() * newplane.dist() - ray.origin, newplane.normal() ) / d;
+                               offset = std::max( offset, s );
+                       }
+               }
+       }
+       Camera_setOrigin( camwnd, aabb.origin - viewvector * offset );
+}
+
 void Camera_ChangeFloorUp(){
        CamWnd& camwnd = *g_camwnd;
        camwnd.Cam_ChangeFloor( true );
@@ -1868,7 +1924,7 @@ void Camera_constructPreferences( PreferencesPage& page ){
                        );
        }
 
-       const char* strafe_mode[] = { "Both", "Forward", "Up" };
+       const char* strafe_mode[] = { "None", "Up", "Forward", "Both", "Both Inverted" };
 
        page.appendCombo(
                "Strafe Mode",
@@ -1911,6 +1967,7 @@ void CameraSpeed_decrease(){
 /// \brief Initialisation for things that have the same lifespan as this module.
 void CamWnd_Construct(){
        GlobalCommands_insert( "CenterView", FreeCaller<GlobalCamera_ResetAngles>(), Accelerator( GDK_End ) );
+       GlobalCommands_insert( "CameraFocusOnSelected", FreeCaller<GlobalCamera_FocusOnSelected>(), Accelerator( GDK_Tab ) );
 
        GlobalToggles_insert( "ToggleCubicClip", FreeCaller<Camera_ToggleFarClip>(), ToggleItem::AddCallbackCaller( g_getfarclip_item ), Accelerator( '\\', (GdkModifierType)GDK_CONTROL_MASK ) );
        GlobalCommands_insert( "CubicClipZoomIn", FreeCaller<Camera_CubeIn>(), Accelerator( '[', (GdkModifierType)GDK_CONTROL_MASK ) );
@@ -1952,6 +2009,9 @@ void CamWnd_Construct(){
        GlobalShortcuts_insert( "CameraFreeMoveLeft2", Accelerator( GDK_Left ) );
        GlobalShortcuts_insert( "CameraFreeMoveRight2", Accelerator( GDK_Right ) );
 
+       GlobalShortcuts_insert( "CameraFreeMoveUp", accelerator_null() );
+       GlobalShortcuts_insert( "CameraFreeMoveDown", accelerator_null() );
+
        GlobalToggles_insert( "ShowStats", FreeCaller<ShowStatsToggle>(), ToggleItem::AddCallbackCaller( g_show_stats ) );
 
        GlobalPreferenceSystem().registerPreference( "ShowStats", BoolImportStringCaller( g_camwindow_globals_private.m_showStats ), BoolExportStringCaller( g_camwindow_globals_private.m_showStats ) );