X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;f=radiant%2Fcamwindow.cpp;h=9d89bbfb0be952eddd95670299d5f06f76a705df;hb=d603dd8964a4c799931f616f6c2394fd7bc75202;hp=804d6461a71c16a759e8fe004e420cfad688982b;hpb=5e3961896b9e30ebbc736b542f177054188c05bf;p=xonotic%2Fnetradiant.git diff --git a/radiant/camwindow.cpp b/radiant/camwindow.cpp index 804d6461..9d89bbfb 100644 --- a/radiant/camwindow.cpp +++ b/radiant/camwindow.cpp @@ -76,6 +76,7 @@ void CameraMovedNotify(){ struct camwindow_globals_private_t { + int m_nFOV; int m_nMoveSpeed; bool m_bCamLinkSpeed; int m_nAngleSpeed; @@ -86,6 +87,7 @@ struct camwindow_globals_private_t int m_nStrafeMode; camwindow_globals_private_t() : + m_nFOV( 110 ), m_nMoveSpeed( 100 ), m_bCamLinkSpeed( true ), m_nAngleSpeed( 3 ), @@ -93,7 +95,7 @@ struct camwindow_globals_private_t m_bCamDiscrete( true ), m_bCubicClipping( false ), m_showStats( true ), - m_nStrafeMode( 0 ){ + m_nStrafeMode( 3 ){ } }; @@ -145,14 +147,13 @@ 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; guint m_keymove_handler; - float fieldOfView; - DeferredMotionDelta m_mouseMove; static void motionDelta( int x, int y, void* data ){ @@ -171,9 +172,11 @@ struct camera_t origin( 0, 0, 0 ), angles( 0, 0, 0 ), color( 0, 0, 0 ), + projection( g_matrix4_identity ), + modelview( g_matrix4_identity ), movementflags( 0 ), + m_keycontrol_timer(), m_keymove_handler( 0 ), - fieldOfView( 110.0f ), m_mouseMove( motionDelta, this ), m_view( view ), m_update( update ){ @@ -202,7 +205,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 ); } @@ -283,7 +286,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; @@ -527,6 +530,9 @@ typedef ReferenceCaller FreeMoveCame typedef ReferenceCaller 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; @@ -623,16 +629,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; @@ -642,9 +644,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; @@ -706,7 +723,7 @@ static void releaseStates(){ camera_t& getCamera(){ return m_Camera; -}; +} void BenchMark(); void Cam_ChangeFloor( bool up ); @@ -871,7 +888,32 @@ gboolean selection_motion_freemove( ui::Widget widget, GdkEventMotion *event, Wi gboolean wheelmove_scroll( ui::Widget widget, GdkEventScroll* event, CamWnd* camwnd ){ if ( event->direction == GDK_SCROLL_UP ) { Camera_Freemove_updateAxes( camwnd->getCamera() ); - Camera_setOrigin( *camwnd, vector3_added( Camera_getOrigin( *camwnd ), vector3_scaled( camwnd->getCamera().forward, static_cast( g_camwindow_globals_private.m_nMoveSpeed ) ) ) ); + if( camwnd->m_bFreeMove || !g_camwindow_globals.m_bZoomInToPointer ){ + Camera_setOrigin( *camwnd, vector3_added( Camera_getOrigin( *camwnd ), vector3_scaled( camwnd->getCamera().forward, static_cast( g_camwindow_globals_private.m_nMoveSpeed ) ) ) ); + } + else{ + //Matrix4 maa = matrix4_multiplied_by_matrix4( camwnd->getCamera().projection, camwnd->getCamera().modelview ); + Matrix4 maa = camwnd->getCamera().m_view->GetViewMatrix(); + matrix4_affine_invert( maa ); + + float x = static_cast( event->x ); + float y = static_cast( event->y ); + Vector3 normalized; + + normalized[0] = 2.0f * ( x ) / static_cast( camwnd->getCamera().width ) - 1.0f; + normalized[1] = 2.0f * ( y )/ static_cast( camwnd->getCamera().height ) - 1.0f; + normalized[1] *= -1.f; + normalized[2] = 0.f; + + normalized *= 16.0f; + //globalOutputStream() << normalized << " normalized "; + matrix4_transform_point( maa, normalized ); + //globalOutputStream() << normalized << "\n"; + Vector3 norm = vector3_normalised( normalized - Camera_getOrigin( *camwnd ) ); + //globalOutputStream() << normalized - Camera_getOrigin( *camwnd ) << " normalized - Camera_getOrigin( *camwnd )\n"; + //globalOutputStream() << norm << " norm\n"; + Camera_setOrigin( *camwnd, vector3_added( Camera_getOrigin( *camwnd ), vector3_scaled( norm, static_cast( g_camwindow_globals_private.m_nMoveSpeed ) ) ) ); + } } else if ( event->direction == GDK_SCROLL_DOWN ) { Camera_Freemove_updateAxes( camwnd->getCamera() ); @@ -908,101 +950,102 @@ void KeyEvent_disconnect( const char* name ){ } void CamWnd_registerCommands( CamWnd& camwnd ){ - GlobalKeyEvents_insert( "CameraForward", Accelerator( GDK_KEY_Up ), + GlobalKeyEvents_insert( "CameraForward", accelerator_null(), ReferenceCaller( camwnd.getCamera() ), ReferenceCaller( camwnd.getCamera() ) ); - GlobalKeyEvents_insert( "CameraBack", Accelerator( GDK_KEY_Down ), + GlobalKeyEvents_insert( "CameraBack", accelerator_null(), ReferenceCaller( camwnd.getCamera() ), ReferenceCaller( camwnd.getCamera() ) ); - GlobalKeyEvents_insert( "CameraLeft", Accelerator( GDK_KEY_Left ), + GlobalKeyEvents_insert( "CameraLeft", accelerator_null(), ReferenceCaller( camwnd.getCamera() ), ReferenceCaller( camwnd.getCamera() ) ); - GlobalKeyEvents_insert( "CameraRight", Accelerator( GDK_KEY_Right ), + GlobalKeyEvents_insert( "CameraRight", accelerator_null(), ReferenceCaller( camwnd.getCamera() ), ReferenceCaller( camwnd.getCamera() ) ); - GlobalKeyEvents_insert( "CameraStrafeRight", Accelerator( GDK_KEY_period ), + GlobalKeyEvents_insert( "CameraStrafeRight", accelerator_null(), ReferenceCaller( camwnd.getCamera() ), ReferenceCaller( camwnd.getCamera() ) ); - GlobalKeyEvents_insert( "CameraStrafeLeft", Accelerator( GDK_KEY_comma ), + GlobalKeyEvents_insert( "CameraStrafeLeft", accelerator_null(), ReferenceCaller( camwnd.getCamera() ), ReferenceCaller( camwnd.getCamera() ) ); - GlobalKeyEvents_insert( "CameraUp", Accelerator( 'D' ), + GlobalKeyEvents_insert( "CameraUp", accelerator_null(), ReferenceCaller( camwnd.getCamera() ), ReferenceCaller( camwnd.getCamera() ) ); - GlobalKeyEvents_insert( "CameraDown", Accelerator( 'C' ), + GlobalKeyEvents_insert( "CameraDown", accelerator_null(), ReferenceCaller( camwnd.getCamera() ), ReferenceCaller( camwnd.getCamera() ) ); - GlobalKeyEvents_insert( "CameraAngleDown", Accelerator( 'A' ), - ReferenceCaller( camwnd.getCamera() ), - ReferenceCaller( camwnd.getCamera() ) - ); - GlobalKeyEvents_insert( "CameraAngleUp", Accelerator( 'Z' ), + GlobalKeyEvents_insert( "CameraAngleUp", accelerator_null(), ReferenceCaller( camwnd.getCamera() ), ReferenceCaller( camwnd.getCamera() ) ); + GlobalKeyEvents_insert( "CameraAngleDown", accelerator_null(), + ReferenceCaller( camwnd.getCamera() ), + ReferenceCaller( camwnd.getCamera() ) + ); + - GlobalKeyEvents_insert( "CameraFreeMoveForward", Accelerator( GDK_KEY_Up ), + GlobalKeyEvents_insert( "CameraFreeMoveForward", accelerator_null(), FreeMoveCameraMoveForwardKeyDownCaller( camwnd.getCamera() ), FreeMoveCameraMoveForwardKeyUpCaller( camwnd.getCamera() ) ); - GlobalKeyEvents_insert( "CameraFreeMoveBack", Accelerator( GDK_KEY_Down ), + GlobalKeyEvents_insert( "CameraFreeMoveBack", accelerator_null(), FreeMoveCameraMoveBackKeyDownCaller( camwnd.getCamera() ), FreeMoveCameraMoveBackKeyUpCaller( camwnd.getCamera() ) ); - GlobalKeyEvents_insert( "CameraFreeMoveLeft", Accelerator( GDK_KEY_Left ), + GlobalKeyEvents_insert( "CameraFreeMoveLeft", accelerator_null(), FreeMoveCameraMoveLeftKeyDownCaller( camwnd.getCamera() ), FreeMoveCameraMoveLeftKeyUpCaller( camwnd.getCamera() ) ); - GlobalKeyEvents_insert( "CameraFreeMoveRight", Accelerator( GDK_KEY_Right ), + 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( 'D' ), + GlobalKeyEvents_insert( "CameraFreeMoveUp", accelerator_null(), FreeMoveCameraMoveUpKeyDownCaller( camwnd.getCamera() ), FreeMoveCameraMoveUpKeyUpCaller( camwnd.getCamera() ) ); - GlobalKeyEvents_insert( "CameraFreeMoveDown", Accelerator( 'C' ), + GlobalKeyEvents_insert( "CameraFreeMoveDown", accelerator_null(), FreeMoveCameraMoveDownKeyDownCaller( camwnd.getCamera() ), FreeMoveCameraMoveDownKeyUpCaller( camwnd.getCamera() ) ); - GlobalCommands_insert( "CameraForward", ReferenceCaller( camwnd.getCamera() ), Accelerator( GDK_KEY_Up ) ); - GlobalCommands_insert( "CameraBack", ReferenceCaller( camwnd.getCamera() ), Accelerator( GDK_KEY_Down ) ); - GlobalCommands_insert( "CameraLeft", ReferenceCaller( camwnd.getCamera() ), Accelerator( GDK_KEY_Left ) ); - GlobalCommands_insert( "CameraRight", ReferenceCaller( camwnd.getCamera() ), Accelerator( GDK_KEY_Right ) ); - GlobalCommands_insert( "CameraStrafeRight", ReferenceCaller( camwnd.getCamera() ), Accelerator( GDK_KEY_period ) ); - GlobalCommands_insert( "CameraStrafeLeft", ReferenceCaller( camwnd.getCamera() ), Accelerator( GDK_KEY_comma ) ); + GlobalCommands_insert( "CameraForward", ReferenceCaller( camwnd.getCamera() ) ); + GlobalCommands_insert( "CameraBack", ReferenceCaller( camwnd.getCamera() ) ); + GlobalCommands_insert( "CameraLeft", ReferenceCaller( camwnd.getCamera() ) ); + GlobalCommands_insert( "CameraRight", ReferenceCaller( camwnd.getCamera() ) ); + GlobalCommands_insert( "CameraStrafeRight", ReferenceCaller( camwnd.getCamera() ) ); + GlobalCommands_insert( "CameraStrafeLeft", ReferenceCaller( camwnd.getCamera() ) ); - GlobalCommands_insert( "CameraUp", ReferenceCaller( camwnd.getCamera() ), Accelerator( 'D' ) ); - GlobalCommands_insert( "CameraDown", ReferenceCaller( camwnd.getCamera() ), Accelerator( 'C' ) ); - GlobalCommands_insert( "CameraAngleUp", ReferenceCaller( camwnd.getCamera() ), Accelerator( 'A' ) ); - GlobalCommands_insert( "CameraAngleDown", ReferenceCaller( camwnd.getCamera() ), Accelerator( 'Z' ) ); + GlobalCommands_insert( "CameraUp", ReferenceCaller( camwnd.getCamera() ) ); + GlobalCommands_insert( "CameraDown", ReferenceCaller( camwnd.getCamera() ) ); + GlobalCommands_insert( "CameraAngleUp", ReferenceCaller( camwnd.getCamera() ) ); + GlobalCommands_insert( "CameraAngleDown", ReferenceCaller( camwnd.getCamera() ) ); } void CamWnd_Move_Enable( CamWnd& camwnd ){ @@ -1297,7 +1340,7 @@ void CamWnd::Cam_PositionDrag(){ CamWnd_Update( camwnd ); CameraMovedNotify(); - Sys_SetCursorPos( m_parent, m_PositionDragCursorX, m_PositionDragCursorY ); + Sys_SetCursorPos( m_gl_widget, m_PositionDragCursorX, m_PositionDragCursorY ); } } #endif @@ -1322,7 +1365,9 @@ 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 ); - m_freezePointer.freeze_pointer( m_parent, m_gl_widget, Camera_motionDelta, &m_Camera ); + /* 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 ); } @@ -1337,7 +1382,8 @@ void CamWnd::DisableFreeMove(){ CamWnd_Remove_Handlers_FreeMove( *this ); CamWnd_Add_Handlers_Move( *this ); - m_freezePointer.unfreeze_pointer( m_parent ); + 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,9 +1437,11 @@ void PopState(){ m_state_stack.pop_back(); } void Highlight( EHighlightMode mode, bool bEnable = true ){ - ( bEnable ) - ? m_state_stack.back().m_highlight |= mode - : m_state_stack.back().m_highlight &= ~mode; + if ( bEnable ) { + m_state_stack.back().m_highlight |= mode; + } else { + m_state_stack.back().m_highlight &= ~mode; + } } void setLights( const LightList& lights ){ m_state_stack.back().m_lights = &lights; @@ -1419,7 +1467,7 @@ void render( const Matrix4& modelview, const Matrix4& projection ){ Cam_Draw ============== */ - +/* void ShowStatsToggle(){ g_camwindow_globals_private.m_showStats ^= 1; } @@ -1431,6 +1479,22 @@ void ShowStatsExport( const Callback &importer ){ FreeCaller&), ShowStatsExport> g_show_stats_caller; Callback &)> 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 ShowStatsToggleCaller; +void ShowStatsExport( const Callback & importer ){ + importer( g_camwindow_globals_private.m_showStats ); +} +typedef FreeCaller &), ShowStatsExport> ShowStatsExportCaller; + +ShowStatsExportCaller g_show_stats_caller; +Callback &)> 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 ); @@ -1521,9 +1585,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() ); @@ -1616,7 +1680,7 @@ void CamWnd::BenchMark(){ Vector3 angles; angles[CAMERA_ROLL] = 0; angles[CAMERA_PITCH] = 0; - angles[CAMERA_YAW] = static_cast( i * ( 360.0 / 100.0 ) ); + angles[CAMERA_YAW] = i * 360.0f / 100.0f; Camera_setAngles( *this, angles ); } double dEnd = Sys_DoubleTime(); @@ -1624,18 +1688,58 @@ void CamWnd::BenchMark(){ } -void fill_view_camera_menu( ui::Menu menu ){ - create_check_menu_item_with_mnemonic( menu, "Camera View", "ToggleCamera" ); -} - void GlobalCamera_ResetAngles(){ CamWnd& camwnd = *g_camwnd; Vector3 angles; angles[CAMERA_ROLL] = angles[CAMERA_PITCH] = 0; - angles[CAMERA_YAW] = static_cast( 22.5 * floor( ( Camera_getAngles( camwnd )[CAMERA_YAW] + 11 ) / 22.5 ) ); + angles[CAMERA_YAW] = 22.5f * floorf( ( Camera_getAngles( camwnd )[CAMERA_YAW] + 11 ) / 22.5f ); 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 ); @@ -1660,8 +1764,8 @@ void Camera_CubeIn(){ void Camera_CubeOut(){ CamWnd& camwnd = *g_camwnd; g_camwindow_globals.m_nCubicScale++; - if ( g_camwindow_globals.m_nCubicScale > 23 ) { - g_camwindow_globals.m_nCubicScale = 23; + if ( g_camwindow_globals.m_nCubicScale > 46 ) { + g_camwindow_globals.m_nCubicScale = 46; } Camera_updateProjection( camwnd.getCamera() ); CamWnd_Update( camwnd ); @@ -1709,6 +1813,8 @@ void CamWnd_registerShortcuts(){ command_connect_accelerator( "TogglePreview" ); } + command_connect_accelerator( "FOVInc" ); + command_connect_accelerator( "FOVDec" ); command_connect_accelerator( "CameraSpeedInc" ); command_connect_accelerator( "CameraSpeedDec" ); } @@ -1826,10 +1932,12 @@ struct RenderMode { }; 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 ); page.appendCheckBox( "", "Invert mouse vertical axis", g_camwindow_globals_private.m_bCamInverseMouse ); + page.appendCheckBox( "", "Zoom In to Mouse pointer", g_camwindow_globals.m_bZoomInToPointer ); page.appendCheckBox( "", "Discrete movement", make_property() @@ -1859,7 +1967,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", @@ -1879,6 +1987,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; @@ -1900,6 +2033,7 @@ void CameraSpeed_decrease(){ /// \brief Initialisation for things that have the same lifespan as this module. void CamWnd_Construct(){ GlobalCommands_insert( "CenterView", makeCallbackF(GlobalCamera_ResetAngles), Accelerator( GDK_KEY_End ) ); + GlobalCommands_insert( "CameraFocusOnSelected", makeCallbackF( GlobalCamera_FocusOnSelected ), Accelerator( GDK_Tab ) ); GlobalToggles_insert( "ToggleCubicClip", makeCallbackF(Camera_ToggleFarClip), ToggleItem::AddCallbackCaller( g_getfarclip_item ), Accelerator( '\\', (GdkModifierType)GDK_CONTROL_MASK ) ); GlobalCommands_insert( "CubicClipZoomIn", makeCallbackF(Camera_CubeIn), Accelerator( '[', (GdkModifierType)GDK_CONTROL_MASK ) ); @@ -1909,13 +2043,16 @@ void CamWnd_Construct(){ GlobalCommands_insert( "DownFloor", makeCallbackF(Camera_ChangeFloorDown), Accelerator( GDK_KEY_Next ) ); GlobalToggles_insert( "ToggleCamera", ToggleShown::ToggleCaller( g_camera_shown ), ToggleItem::AddCallbackCaller( g_camera_shown.m_item ), Accelerator( 'C', (GdkModifierType)( GDK_SHIFT_MASK | GDK_CONTROL_MASK ) ) ); - GlobalCommands_insert( "LookThroughSelected", makeCallbackF(GlobalCamera_LookThroughSelected) ); - GlobalCommands_insert( "LookThroughCamera", makeCallbackF(GlobalCamera_LookThroughCamera) ); +// GlobalCommands_insert( "LookThroughSelected", makeCallbackF(GlobalCamera_LookThroughSelected) ); +// GlobalCommands_insert( "LookThroughCamera", makeCallbackF(GlobalCamera_LookThroughCamera) ); if ( g_pGameDescription->mGameType == "doom3" ) { 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 ) ); @@ -1923,27 +2060,31 @@ void CamWnd_Construct(){ GlobalShortcuts_insert( "CameraBack", Accelerator( GDK_KEY_Down ) ); GlobalShortcuts_insert( "CameraLeft", Accelerator( GDK_KEY_Left ) ); GlobalShortcuts_insert( "CameraRight", Accelerator( GDK_KEY_Right ) ); - GlobalShortcuts_insert( "CameraStrafeRight", Accelerator( GDK_KEY_period ) ); - GlobalShortcuts_insert( "CameraStrafeLeft", Accelerator( GDK_KEY_comma ) ); + GlobalShortcuts_insert( "CameraStrafeRight", Accelerator( 'D' ) ); + GlobalShortcuts_insert( "CameraStrafeLeft", Accelerator( 'A' ) ); 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( 'W' ) ); + GlobalShortcuts_insert( "CameraFreeMoveBack", Accelerator( 'S' ) ); + GlobalShortcuts_insert( "CameraFreeMoveLeft", Accelerator( 'A' ) ); + GlobalShortcuts_insert( "CameraFreeMoveRight", Accelerator( 'D' ) ); + + GlobalShortcuts_insert( "CameraFreeMoveForward2", Accelerator( GDK_KEY_Up ) ); + GlobalShortcuts_insert( "CameraFreeMoveBack2", Accelerator( GDK_KEY_Down ) ); + GlobalShortcuts_insert( "CameraFreeMoveLeft2", Accelerator( GDK_KEY_Left ) ); + GlobalShortcuts_insert( "CameraFreeMoveRight2", 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 ) ); + GlobalShortcuts_insert( "CameraFreeMoveUp", accelerator_null() ); + GlobalShortcuts_insert( "CameraFreeMoveDown", accelerator_null() ); 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 ) ); @@ -1955,6 +2096,7 @@ void CamWnd_Construct(){ GlobalPreferenceSystem().registerPreference( "SI_Colors12", make_property_string( g_camwindow_globals.color_selbrushes3d ) ); GlobalPreferenceSystem().registerPreference( "CameraRenderMode", make_property_string() ); GlobalPreferenceSystem().registerPreference( "StrafeMode", make_property_string( g_camwindow_globals_private.m_nStrafeMode ) ); + GlobalPreferenceSystem().registerPreference( "3DZoomInToPointer", make_property_string( g_camwindow_globals.m_bZoomInToPointer ) ); CamWnd_constructStatic();