X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;f=radiant%2Fcamwindow.cpp;h=c17a984dc845b2af5b295cedb5f0a7eb7165e610;hb=2f3b74eff8ba0ca83d3f7d14fe11f93483d22c89;hp=d77b519b3575ba83fa299527d6a09db3eaa896b1;hpb=d7b2cf7cd88ca303ef95209ffdac6a97e22f30a8;p=xonotic%2Fnetradiant.git diff --git a/radiant/camwindow.cpp b/radiant/camwindow.cpp index d77b519b..c17a984d 100644 --- a/radiant/camwindow.cpp +++ b/radiant/camwindow.cpp @@ -25,9 +25,11 @@ // Leonardo Zide (leo@lokigames.com) // -#include #include "camwindow.h" +#include +#include + #include "debugging/debugging.h" #include "iscenegraph.h" @@ -74,6 +76,7 @@ void CameraMovedNotify(){ struct camwindow_globals_private_t { + int m_nFOV; int m_nMoveSpeed; bool m_bCamLinkSpeed; int m_nAngleSpeed; @@ -84,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 ){ } @@ -149,8 +153,6 @@ struct camera_t guint m_keymove_handler; - float fieldOfView; - DeferredMotionDelta m_mouseMove; static void motionDelta( int x, int y, void* data ){ @@ -158,20 +160,22 @@ struct camera_t } View* m_view; - Callback m_update; + Callback m_update; static camera_draw_mode draw_mode; - camera_t( View* view, const Callback& update ) + camera_t( View* view, const Callback& update ) : width( 0 ), height( 0 ), timing( false ), 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( 90.0f ), m_mouseMove( motionDelta, this ), m_view( view ), m_update( update ){ @@ -200,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 ); } @@ -320,17 +324,8 @@ 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; - 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; + float xf = (float)( x - camera.width / 2 ) / ( camera.width / 2 ); + float yf = (float)( y - camera.height / 2 ) / ( camera.height / 2 ); xf *= 1.0f - fabsf( yf ); if ( xf < 0 ) { @@ -520,25 +515,28 @@ void Camera_PitchDown_KeyUp( camera_t& camera ){ } -typedef ReferenceCaller FreeMoveCameraMoveForwardKeyDownCaller; -typedef ReferenceCaller FreeMoveCameraMoveForwardKeyUpCaller; -typedef ReferenceCaller FreeMoveCameraMoveBackKeyDownCaller; -typedef ReferenceCaller FreeMoveCameraMoveBackKeyUpCaller; -typedef ReferenceCaller FreeMoveCameraMoveLeftKeyDownCaller; -typedef ReferenceCaller FreeMoveCameraMoveLeftKeyUpCaller; -typedef ReferenceCaller FreeMoveCameraMoveRightKeyDownCaller; -typedef ReferenceCaller FreeMoveCameraMoveRightKeyUpCaller; -typedef ReferenceCaller FreeMoveCameraMoveUpKeyDownCaller; -typedef ReferenceCaller FreeMoveCameraMoveUpKeyUpCaller; -typedef ReferenceCaller FreeMoveCameraMoveDownKeyDownCaller; -typedef ReferenceCaller FreeMoveCameraMoveDownKeyUpCaller; +typedef ReferenceCaller FreeMoveCameraMoveForwardKeyDownCaller; +typedef ReferenceCaller FreeMoveCameraMoveForwardKeyUpCaller; +typedef ReferenceCaller FreeMoveCameraMoveBackKeyDownCaller; +typedef ReferenceCaller FreeMoveCameraMoveBackKeyUpCaller; +typedef ReferenceCaller FreeMoveCameraMoveLeftKeyDownCaller; +typedef ReferenceCaller FreeMoveCameraMoveLeftKeyUpCaller; +typedef ReferenceCaller FreeMoveCameraMoveRightKeyDownCaller; +typedef ReferenceCaller FreeMoveCameraMoveRightKeyUpCaller; +typedef ReferenceCaller FreeMoveCameraMoveUpKeyDownCaller; +typedef ReferenceCaller FreeMoveCameraMoveUpKeyUpCaller; +typedef ReferenceCaller FreeMoveCameraMoveDownKeyDownCaller; +typedef ReferenceCaller FreeMoveCameraMoveDownKeyUpCaller; -#define SPEED_MOVE 32 -#define SPEED_TURN 22.5 -#define MIN_CAM_SPEED 10 -#define MAX_CAM_SPEED 610 -#define CAM_SPEED_STEP 50 +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; +const float MAX_CAM_SPEED = 610; +const float CAM_SPEED_STEP = 50; void Camera_MoveForward_Discrete( camera_t& camera ){ Camera_Move_updateAxes( camera ); @@ -602,9 +600,9 @@ class RadiantCameraView : public CameraView { camera_t& m_camera; View* m_view; -Callback m_update; +Callback m_update; public: -RadiantCameraView( camera_t& camera, View* view, const Callback& update ) : m_camera( camera ), m_view( view ), m_update( update ){ +RadiantCameraView( camera_t& camera, View* view, const Callback& update ) : m_camera( camera ), m_view( view ), m_update( update ){ } void update(){ m_view->Construct( m_camera.projection, m_camera.modelview, m_camera.width, m_camera.height ); @@ -670,7 +668,7 @@ static Shader* m_state_select2; FreezePointer m_freezePointer; public: -ui::Widget m_gl_widget; +ui::GLArea m_gl_widget; ui::Window m_parent{ui::null}; SelectionSystemWindowObserver* m_window_observer; @@ -730,7 +728,7 @@ private: void Cam_Draw(); }; -typedef MemberCaller CamWndQueueDraw; +typedef MemberCaller CamWndQueueDraw; Shader* CamWnd::m_state_select1 = 0; Shader* CamWnd::m_state_select2 = 0; @@ -757,7 +755,7 @@ void GlobalCamera_setCamWnd( CamWnd& camwnd ){ } -ui::Widget CamWnd_getWidget( CamWnd& camwnd ){ +ui::GLArea CamWnd_getWidget( CamWnd& camwnd ){ return camwnd.m_gl_widget; } @@ -826,7 +824,7 @@ gboolean mousecontrol_button_press( ui::Widget widget, GdkEventButton* event, Ca #endif void camwnd_update_xor_rectangle( CamWnd& self, rect_t area ){ - if ( gtk_widget_get_visible( self.m_gl_widget ) ) { + if ( self.m_gl_widget.visible() ) { self.m_XORRectangle.set( rectangle_from_area( area.min, area.max, self.getCamera().width, self.getCamera().height ) ); } } @@ -852,8 +850,7 @@ void selection_motion( gdouble x, gdouble y, guint state, void* data ){ } inline WindowVector windowvector_for_widget_centre( ui::Widget widget ){ - GtkAllocation allocation; - gtk_widget_get_allocation(widget, &allocation); + auto allocation = widget.dimensions(); return WindowVector( static_cast( allocation.width / 2 ), static_cast(allocation.height / 2 ) ); } @@ -917,62 +914,80 @@ void KeyEvent_disconnect( const char* name ){ void CamWnd_registerCommands( CamWnd& camwnd ){ GlobalKeyEvents_insert( "CameraForward", Accelerator( GDK_KEY_Up ), - ReferenceCaller( camwnd.getCamera() ), - ReferenceCaller( camwnd.getCamera() ) + ReferenceCaller( camwnd.getCamera() ), + ReferenceCaller( camwnd.getCamera() ) ); GlobalKeyEvents_insert( "CameraBack", Accelerator( GDK_KEY_Down ), - ReferenceCaller( camwnd.getCamera() ), - ReferenceCaller( camwnd.getCamera() ) + ReferenceCaller( camwnd.getCamera() ), + ReferenceCaller( camwnd.getCamera() ) ); GlobalKeyEvents_insert( "CameraLeft", Accelerator( GDK_KEY_Left ), - ReferenceCaller( camwnd.getCamera() ), - ReferenceCaller( camwnd.getCamera() ) + ReferenceCaller( camwnd.getCamera() ), + ReferenceCaller( camwnd.getCamera() ) ); GlobalKeyEvents_insert( "CameraRight", Accelerator( GDK_KEY_Right ), - ReferenceCaller( camwnd.getCamera() ), - ReferenceCaller( camwnd.getCamera() ) + ReferenceCaller( camwnd.getCamera() ), + ReferenceCaller( camwnd.getCamera() ) ); GlobalKeyEvents_insert( "CameraStrafeRight", Accelerator( GDK_KEY_period ), - ReferenceCaller( camwnd.getCamera() ), - ReferenceCaller( camwnd.getCamera() ) + ReferenceCaller( camwnd.getCamera() ), + ReferenceCaller( camwnd.getCamera() ) ); GlobalKeyEvents_insert( "CameraStrafeLeft", Accelerator( GDK_KEY_comma ), - ReferenceCaller( camwnd.getCamera() ), - ReferenceCaller( camwnd.getCamera() ) + ReferenceCaller( camwnd.getCamera() ), + ReferenceCaller( camwnd.getCamera() ) ); GlobalKeyEvents_insert( "CameraUp", Accelerator( 'D' ), - ReferenceCaller( camwnd.getCamera() ), - ReferenceCaller( camwnd.getCamera() ) + ReferenceCaller( camwnd.getCamera() ), + ReferenceCaller( camwnd.getCamera() ) ); GlobalKeyEvents_insert( "CameraDown", Accelerator( 'C' ), - ReferenceCaller( camwnd.getCamera() ), - ReferenceCaller( camwnd.getCamera() ) + ReferenceCaller( camwnd.getCamera() ), + ReferenceCaller( camwnd.getCamera() ) ); GlobalKeyEvents_insert( "CameraAngleDown", Accelerator( 'A' ), - ReferenceCaller( camwnd.getCamera() ), - ReferenceCaller( camwnd.getCamera() ) + ReferenceCaller( camwnd.getCamera() ), + ReferenceCaller( camwnd.getCamera() ) ); GlobalKeyEvents_insert( "CameraAngleUp", Accelerator( 'Z' ), - ReferenceCaller( camwnd.getCamera() ), - ReferenceCaller( camwnd.getCamera() ) + ReferenceCaller( camwnd.getCamera() ), + ReferenceCaller( camwnd.getCamera() ) ); - GlobalKeyEvents_insert( "CameraFreeMoveForward", Accelerator( GDK_Up ), + GlobalKeyEvents_insert( "CameraFreeMoveForward", Accelerator( GDK_KEY_Up ), FreeMoveCameraMoveForwardKeyDownCaller( camwnd.getCamera() ), FreeMoveCameraMoveForwardKeyUpCaller( camwnd.getCamera() ) ); - GlobalKeyEvents_insert( "CameraFreeMoveBack", Accelerator( GDK_Down ), + GlobalKeyEvents_insert( "CameraFreeMoveBack", Accelerator( GDK_KEY_Down ), FreeMoveCameraMoveBackKeyDownCaller( camwnd.getCamera() ), FreeMoveCameraMoveBackKeyUpCaller( camwnd.getCamera() ) ); - GlobalKeyEvents_insert( "CameraFreeMoveLeft", Accelerator( GDK_Left ), + GlobalKeyEvents_insert( "CameraFreeMoveLeft", Accelerator( GDK_KEY_Left ), FreeMoveCameraMoveLeftKeyDownCaller( camwnd.getCamera() ), FreeMoveCameraMoveLeftKeyUpCaller( camwnd.getCamera() ) ); - GlobalKeyEvents_insert( "CameraFreeMoveRight", Accelerator( GDK_Right ), + GlobalKeyEvents_insert( "CameraFreeMoveRight", Accelerator( GDK_KEY_Right ), 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() ) @@ -982,17 +997,17 @@ void CamWnd_registerCommands( CamWnd& camwnd ){ FreeMoveCameraMoveDownKeyUpCaller( camwnd.getCamera() ) ); - GlobalCommands_insert( "CameraForward", ReferenceCaller( camwnd.getCamera() ), Accelerator( GDK_Up ) ); - GlobalCommands_insert( "CameraBack", ReferenceCaller( camwnd.getCamera() ), Accelerator( GDK_Down ) ); - GlobalCommands_insert( "CameraLeft", ReferenceCaller( camwnd.getCamera() ), Accelerator( GDK_Left ) ); - GlobalCommands_insert( "CameraRight", ReferenceCaller( camwnd.getCamera() ), Accelerator( GDK_Right ) ); - GlobalCommands_insert( "CameraStrafeRight", ReferenceCaller( camwnd.getCamera() ), Accelerator( GDK_period ) ); - GlobalCommands_insert( "CameraStrafeLeft", ReferenceCaller( camwnd.getCamera() ), Accelerator( GDK_comma ) ); + 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( "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() ), 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' ) ); } void CamWnd_Move_Enable( CamWnd& camwnd ){ @@ -1047,12 +1062,23 @@ void CamWnd_Move_Discrete_Disable( CamWnd& camwnd ){ command_disconnect_accelerator( "CameraAngleDown" ); } -void CamWnd_Move_Discrete_Import( CamWnd& camwnd, bool value ){ +struct CamWnd_Move_Discrete { + static void Export(const Callback &returnz) { + returnz(g_camwindow_globals_private.m_bCamDiscrete); + } + + static void Import(bool value) { + if (g_camwnd) { + Import_(*g_camwnd, value); + } else { + g_camwindow_globals_private.m_bCamDiscrete = value; + } + } + + static void Import_(CamWnd &camwnd, bool value) { if ( g_camwindow_globals_private.m_bCamDiscrete ) { CamWnd_Move_Discrete_Disable( camwnd ); - } - else - { + } else { CamWnd_Move_Disable( camwnd ); } @@ -1060,31 +1086,19 @@ void CamWnd_Move_Discrete_Import( CamWnd& camwnd, bool value ){ if ( g_camwindow_globals_private.m_bCamDiscrete ) { CamWnd_Move_Discrete_Enable( camwnd ); - } - else - { + } else { CamWnd_Move_Enable( camwnd ); } } - -void CamWnd_Move_Discrete_Import( bool value ){ - if ( g_camwnd != 0 ) { - CamWnd_Move_Discrete_Import( *g_camwnd, value ); - } - else - { - g_camwindow_globals_private.m_bCamDiscrete = 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 ); - camwnd.m_selection_button_release_handler = g_signal_connect( G_OBJECT( camwnd.m_gl_widget ), "button_release_event", G_CALLBACK( selection_button_release ), camwnd.m_window_observer ); - camwnd.m_selection_motion_handler = g_signal_connect( G_OBJECT( camwnd.m_gl_widget ), "motion_notify_event", G_CALLBACK( DeferredMotion::gtk_motion ), &camwnd.m_deferred_motion ); + camwnd.m_selection_button_press_handler = camwnd.m_gl_widget.connect( "button_press_event", G_CALLBACK( selection_button_press ), camwnd.m_window_observer ); + camwnd.m_selection_button_release_handler = camwnd.m_gl_widget.connect( "button_release_event", G_CALLBACK( selection_button_release ), camwnd.m_window_observer ); + camwnd.m_selection_motion_handler = camwnd.m_gl_widget.connect( "motion_notify_event", G_CALLBACK( DeferredMotion::gtk_motion ), &camwnd.m_deferred_motion ); - camwnd.m_freelook_button_press_handler = g_signal_connect( G_OBJECT( camwnd.m_gl_widget ), "button_press_event", G_CALLBACK( enable_freelook_button_press ), &camwnd ); + camwnd.m_freelook_button_press_handler = camwnd.m_gl_widget.connect( "button_press_event", G_CALLBACK( enable_freelook_button_press ), &camwnd ); if ( g_camwindow_globals_private.m_bCamDiscrete ) { CamWnd_Move_Discrete_Enable( camwnd ); @@ -1112,16 +1126,22 @@ void CamWnd_Remove_Handlers_Move( CamWnd& camwnd ){ } void CamWnd_Add_Handlers_FreeMove( 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_freemove ), camwnd.m_window_observer ); - camwnd.m_selection_button_release_handler = g_signal_connect( G_OBJECT( camwnd.m_gl_widget ), "button_release_event", G_CALLBACK( selection_button_release_freemove ), camwnd.m_window_observer ); - camwnd.m_selection_motion_handler = g_signal_connect( G_OBJECT( camwnd.m_gl_widget ), "motion_notify_event", G_CALLBACK( selection_motion_freemove ), camwnd.m_window_observer ); + camwnd.m_selection_button_press_handler = camwnd.m_gl_widget.connect( "button_press_event", G_CALLBACK( selection_button_press_freemove ), camwnd.m_window_observer ); + camwnd.m_selection_button_release_handler = camwnd.m_gl_widget.connect( "button_release_event", G_CALLBACK( selection_button_release_freemove ), camwnd.m_window_observer ); + camwnd.m_selection_motion_handler = camwnd.m_gl_widget.connect( "motion_notify_event", G_CALLBACK( selection_motion_freemove ), camwnd.m_window_observer ); - camwnd.m_freelook_button_press_handler = g_signal_connect( G_OBJECT( camwnd.m_gl_widget ), "button_press_event", G_CALLBACK( disable_freelook_button_press ), &camwnd ); + camwnd.m_freelook_button_press_handler = camwnd.m_gl_widget.connect( "button_press_event", G_CALLBACK( disable_freelook_button_press ), &camwnd ); KeyEvent_connect( "CameraFreeMoveForward" ); 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" ); } @@ -1131,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" ); @@ -1144,8 +1170,8 @@ void CamWnd_Remove_Handlers_FreeMove( CamWnd& camwnd ){ CamWnd::CamWnd() : m_view( true ), m_Camera( &m_view, CamWndQueueDraw( *this ) ), - m_cameraview( m_Camera, &m_view, ReferenceCaller( *this ) ), - m_gl_widget( ui::Widget(glwidget_new( TRUE )) ), + m_cameraview( m_Camera, &m_view, ReferenceCaller( *this ) ), + m_gl_widget( glwidget_new( TRUE ) ), m_window_observer( NewWindowObserver() ), m_XORRectangle( m_gl_widget ), m_deferredDraw( WidgetQueueDrawCaller( m_gl_widget ) ), @@ -1160,16 +1186,16 @@ CamWnd::CamWnd() : GlobalWindowObservers_add( m_window_observer ); GlobalWindowObservers_connectWidget( m_gl_widget ); - m_window_observer->setRectangleDrawCallback( ReferenceCaller1( *this ) ); + m_window_observer->setRectangleDrawCallback( ReferenceCaller( *this ) ); m_window_observer->setView( m_view ); - g_object_ref( m_gl_widget ); + g_object_ref( m_gl_widget._handle ); gtk_widget_set_events( m_gl_widget, GDK_DESTROY | GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_POINTER_MOTION_MASK | GDK_SCROLL_MASK ); gtk_widget_set_can_focus( m_gl_widget, true ); - m_sizeHandler = g_signal_connect( G_OBJECT( m_gl_widget ), "size_allocate", G_CALLBACK( camera_size_allocate ), this ); - m_exposeHandler = g_signal_connect( G_OBJECT( m_gl_widget ), "expose_event", G_CALLBACK( camera_expose ), this ); + m_sizeHandler = m_gl_widget.connect( "size_allocate", G_CALLBACK( camera_size_allocate ), this ); + m_exposeHandler = m_gl_widget.on_render( G_CALLBACK( camera_expose ), this ); Map_addValidCallback( g_map, DeferredDrawOnMapValidChangedCaller( m_deferredDraw ) ); @@ -1177,9 +1203,9 @@ CamWnd::CamWnd() : CamWnd_Add_Handlers_Move( *this ); - g_signal_connect( G_OBJECT( m_gl_widget ), "scroll_event", G_CALLBACK( wheelmove_scroll ), this ); + m_gl_widget.connect( "scroll_event", G_CALLBACK( wheelmove_scroll ), this ); - AddSceneChangeCallback( ReferenceCaller( *this ) ); + AddSceneChangeCallback( ReferenceCaller( *this ) ); PressedButtons_connect( g_pressedButtons, m_gl_widget ); } @@ -1194,7 +1220,7 @@ CamWnd::~CamWnd(){ g_signal_handler_disconnect( G_OBJECT( m_gl_widget ), m_sizeHandler ); g_signal_handler_disconnect( G_OBJECT( m_gl_widget ), m_exposeHandler ); - g_object_unref( m_gl_widget ); + m_gl_widget.unref(); m_window_observer->release(); } @@ -1263,7 +1289,7 @@ if ( ( m_bFreeMove && ( buttons == ( RAD_CONTROL | RAD_SHIFT ) ) ) void CamWnd::Cam_PositionDrag(){ int x, y; - Sys_GetCursorPos( GTK_WINDOW( m_gl_widget ), &x, &y ); + Sys_GetCursorPos( m_gl_widget, &x, &y ); if ( x != m_PositionDragCursorX || y != m_PositionDragCursorY ) { x -= m_PositionDragCursorX; vector3_add( m_Camera.origin, vector3_scaled( m_Camera.vright, x ) ); @@ -1273,7 +1299,7 @@ void CamWnd::Cam_PositionDrag(){ CamWnd_Update( camwnd ); CameraMovedNotify(); - Sys_SetCursorPos( GTK_WINDOW( m_parent ), m_PositionDragCursorX, m_PositionDragCursorY ); + Sys_SetCursorPos( m_gl_widget, m_PositionDragCursorX, m_PositionDragCursorY ); } } #endif @@ -1297,8 +1323,8 @@ void CamWnd::EnableFreeMove(){ CamWnd_Add_Handlers_FreeMove( *this ); gtk_window_set_focus( m_parent, m_gl_widget ); - m_freemove_handle_focusout = g_signal_connect( G_OBJECT( m_gl_widget ), "focus_out_event", G_CALLBACK( camwindow_freemove_focusout ), this ); - m_freezePointer.freeze_pointer( m_parent, Camera_motionDelta, &m_Camera ); + m_freemove_handle_focusout = m_gl_widget.connect( "focus_out_event", G_CALLBACK( camwindow_freemove_focusout ), this ); + m_freezePointer.freeze_pointer( m_gl_widget, Camera_motionDelta, &m_Camera ); CamWnd_Update( *this ); } @@ -1313,7 +1339,7 @@ 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 ); g_signal_handler_disconnect( G_OBJECT( m_gl_widget ), m_freemove_handle_focusout ); CamWnd_Update( *this ); @@ -1356,7 +1382,7 @@ void SetState( Shader* state, EStyle style ){ m_state_stack.back().m_state = state; } } -const EStyle getStyle() const { +EStyle getStyle() const { return eFullMaterials; } void PushState(){ @@ -1367,9 +1393,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; @@ -1399,15 +1427,13 @@ void render( const Matrix4& modelview, const Matrix4& projection ){ void ShowStatsToggle(){ g_camwindow_globals_private.m_showStats ^= 1; } -typedef FreeCaller ShowStatsToggleCaller; -void ShowStatsExport( const BoolImportCallback& importer ){ +void ShowStatsExport( const Callback &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 ); +FreeCaller&), ShowStatsExport> 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(){ @@ -1594,7 +1620,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(); @@ -1610,7 +1636,7 @@ 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 ); } @@ -1638,8 +1664,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 ); @@ -1650,7 +1676,7 @@ bool Camera_GetFarClip(){ return g_camwindow_globals_private.m_bCubicClipping; } -BoolExportCaller g_getfarclip_caller( g_camwindow_globals_private.m_bCubicClipping ); +ConstReferenceCaller &), PropertyImpl::Export> g_getfarclip_caller( g_camwindow_globals_private.m_bCubicClipping ); ToggleItem g_getfarclip_item( g_getfarclip_caller ); void Camera_SetFarClip( bool value ){ @@ -1661,13 +1687,23 @@ void Camera_SetFarClip( bool value ){ CamWnd_Update( camwnd ); } +struct Camera_FarClip { + static void Export(const Callback &returnz) { + returnz(g_camwindow_globals_private.m_bCubicClipping); + } + + static void Import(bool value) { + Camera_SetFarClip(value); + } +}; + void Camera_ToggleFarClip(){ Camera_SetFarClip( !Camera_GetFarClip() ); } 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(){ @@ -1677,6 +1713,8 @@ void CamWnd_registerShortcuts(){ command_connect_accelerator( "TogglePreview" ); } + command_connect_accelerator( "FOVInc" ); + command_connect_accelerator( "FOVDec" ); command_connect_accelerator( "CameraSpeedInc" ); command_connect_accelerator( "CameraSpeedDec" ); } @@ -1719,7 +1757,7 @@ CameraModel* g_camera_model = 0; void CamWnd_LookThroughCamera( CamWnd& camwnd ){ if ( g_camera_model != 0 ) { CamWnd_Add_Handlers_Move( camwnd ); - g_camera_model->setCameraView( 0, Callback() ); + g_camera_model->setCameraView( 0, Callback() ); g_camera_model = 0; Camera_updateModelview( camwnd.getCamera() ); Camera_updateProjection( camwnd.getCamera() ); @@ -1742,7 +1780,7 @@ void CamWnd_LookThroughSelected( CamWnd& camwnd ){ if ( cameraModel != 0 ) { CamWnd_Remove_Handlers_Move( camwnd ); g_camera_model = cameraModel; - g_camera_model->setCameraView( &camwnd.getCameraView(), ReferenceCaller( camwnd ) ); + g_camera_model->setCameraView( &camwnd.getCameraView(), ReferenceCaller( camwnd ) ); } } } @@ -1755,10 +1793,26 @@ void GlobalCamera_LookThroughCamera(){ CamWnd_LookThroughCamera( *g_camwnd ); } +struct RenderMode { + static void Export(const Callback &returnz) { + switch (CamWnd_GetMode()) { + case cd_wire: + returnz(0); + break; + case cd_solid: + returnz(1); + break; + case cd_texture: + returnz(2); + break; + case cd_lighting: + returnz(3); + break; + } + } -void RenderModeImport( int value ){ - switch ( value ) - { + static void Import(int value) { + switch (value) { case 0: CamWnd_SetMode( cd_wire ); break; @@ -1775,41 +1829,21 @@ void RenderModeImport( int value ){ CamWnd_SetMode( cd_texture ); } } -typedef FreeCaller1 RenderModeImportCaller; - -void RenderModeExport( const IntImportCallback& importer ){ - switch ( CamWnd_GetMode() ) - { - case cd_wire: - importer( 0 ); - break; - case cd_solid: - importer( 1 ); - break; - case cd_texture: - importer( 2 ); - break; - case cd_lighting: - importer( 3 ); - break; - } -} -typedef FreeCaller1 RenderModeExportCaller; +}; 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( "", "Discrete movement", - FreeCaller1(), - BoolExportCaller( g_camwindow_globals_private.m_bCamDiscrete ) + make_property() ); page.appendCheckBox( "", "Enable far-clip plane", - FreeCaller1(), - BoolExportCaller( g_camwindow_globals_private.m_bCubicClipping ) + make_property() ); if ( g_pGameDescription->mGameType == "doom3" ) { @@ -1818,8 +1852,7 @@ void Camera_constructPreferences( PreferencesPage& page ){ page.appendCombo( "Render Mode", STRING_ARRAY_RANGE( render_mode ), - IntImportCallback( RenderModeImportCaller() ), - IntExportCallback( RenderModeExportCaller() ) + make_property() ); } else @@ -1829,8 +1862,7 @@ void Camera_constructPreferences( PreferencesPage& page ){ page.appendCombo( "Render Mode", STRING_ARRAY_RANGE( render_mode ), - IntImportCallback( RenderModeImportCaller() ), - IntExportCallback( RenderModeExportCaller() ) + make_property() ); } @@ -1847,14 +1879,37 @@ void Camera_constructPage( PreferenceGroup& group ){ Camera_constructPreferences( page ); } void Camera_registerPreferencesPage(){ - PreferencesDialog_addSettingsPage( FreeCaller1() ); + PreferencesDialog_addSettingsPage( makeCallbackF(Camera_constructPage) ); } #include "preferencesystem.h" #include "stringio.h" #include "dialog.h" -typedef FreeCaller1 CamWndMoveDiscreteImportCaller; +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 ) ) { @@ -1876,57 +1931,66 @@ void CameraSpeed_decrease(){ /// \brief Initialisation for things that have the same lifespan as this module. void CamWnd_Construct(){ - GlobalCommands_insert( "CenterView", FreeCaller(), Accelerator( GDK_End ) ); + GlobalCommands_insert( "CenterView", makeCallbackF(GlobalCamera_ResetAngles), Accelerator( GDK_KEY_End ) ); - GlobalToggles_insert( "ToggleCubicClip", FreeCaller(), ToggleItem::AddCallbackCaller( g_getfarclip_item ), Accelerator( '\\', (GdkModifierType)GDK_CONTROL_MASK ) ); - GlobalCommands_insert( "CubicClipZoomIn", FreeCaller(), Accelerator( '[', (GdkModifierType)GDK_CONTROL_MASK ) ); - GlobalCommands_insert( "CubicClipZoomOut", FreeCaller(), Accelerator( ']', (GdkModifierType)GDK_CONTROL_MASK ) ); + 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 ) ); + GlobalCommands_insert( "CubicClipZoomOut", makeCallbackF(Camera_CubeOut), Accelerator( ']', (GdkModifierType)GDK_CONTROL_MASK ) ); - GlobalCommands_insert( "UpFloor", FreeCaller(), Accelerator( GDK_Prior ) ); - GlobalCommands_insert( "DownFloor", FreeCaller(), Accelerator( GDK_Next ) ); + GlobalCommands_insert( "UpFloor", makeCallbackF(Camera_ChangeFloorUp), Accelerator( GDK_KEY_Prior ) ); + 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", FreeCaller() ); - GlobalCommands_insert( "LookThroughCamera", FreeCaller() ); + GlobalCommands_insert( "LookThroughSelected", makeCallbackF(GlobalCamera_LookThroughSelected) ); + GlobalCommands_insert( "LookThroughCamera", makeCallbackF(GlobalCamera_LookThroughCamera) ); if ( g_pGameDescription->mGameType == "doom3" ) { - GlobalCommands_insert( "TogglePreview", FreeCaller(), Accelerator( GDK_F3 ) ); + GlobalCommands_insert( "TogglePreview", makeCallbackF(CamWnd_TogglePreview), Accelerator( GDK_KEY_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 ) ); + 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 ) ); - GlobalShortcuts_insert( "CameraForward", Accelerator( GDK_Up ) ); - GlobalShortcuts_insert( "CameraBack", Accelerator( GDK_Down ) ); - GlobalShortcuts_insert( "CameraLeft", Accelerator( GDK_Left ) ); - GlobalShortcuts_insert( "CameraRight", Accelerator( GDK_Right ) ); - GlobalShortcuts_insert( "CameraStrafeRight", Accelerator( GDK_period ) ); - GlobalShortcuts_insert( "CameraStrafeLeft", Accelerator( GDK_comma ) ); + GlobalShortcuts_insert( "CameraForward", Accelerator( GDK_KEY_Up ) ); + 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( "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 ) ); - 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 ) ); - GlobalPreferenceSystem().registerPreference( "CubicClipping", BoolImportStringCaller( g_camwindow_globals_private.m_bCubicClipping ), BoolExportStringCaller( g_camwindow_globals_private.m_bCubicClipping ) ); - GlobalPreferenceSystem().registerPreference( "CubicScale", IntImportStringCaller( g_camwindow_globals.m_nCubicScale ), IntExportStringCaller( g_camwindow_globals.m_nCubicScale ) ); - GlobalPreferenceSystem().registerPreference( "SI_Colors4", Vector3ImportStringCaller( g_camwindow_globals.color_cameraback ), Vector3ExportStringCaller( g_camwindow_globals.color_cameraback ) ); - GlobalPreferenceSystem().registerPreference( "SI_Colors12", Vector3ImportStringCaller( g_camwindow_globals.color_selbrushes3d ), Vector3ExportStringCaller( g_camwindow_globals.color_selbrushes3d ) ); - GlobalPreferenceSystem().registerPreference( "CameraRenderMode", makeIntStringImportCallback( RenderModeImportCaller() ), makeIntStringExportCallback( RenderModeExportCaller() ) ); - GlobalPreferenceSystem().registerPreference( "StrafeMode", IntImportStringCaller( g_camwindow_globals_private.m_nStrafeMode ), IntExportStringCaller( g_camwindow_globals_private.m_nStrafeMode ) ); + 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 ) ); + GlobalPreferenceSystem().registerPreference( "CamInverseMouse", make_property_string( g_camwindow_globals_private.m_bCamInverseMouse ) ); + GlobalPreferenceSystem().registerPreference( "CamDiscrete", make_property_string()); + GlobalPreferenceSystem().registerPreference( "CubicClipping", make_property_string( g_camwindow_globals_private.m_bCubicClipping ) ); + GlobalPreferenceSystem().registerPreference( "CubicScale", make_property_string( g_camwindow_globals.m_nCubicScale ) ); + GlobalPreferenceSystem().registerPreference( "SI_Colors4", make_property_string( g_camwindow_globals.color_cameraback ) ); + 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 ) ); CamWnd_constructStatic();