X-Git-Url: https://de.git.xonotic.org/?p=xonotic%2Fnetradiant.git;a=blobdiff_plain;f=radiant%2Fcamwindow.cpp;h=a533eec2c7c0c91bef931855f7753f10eaf49e07;hp=de2e03e0e1b438b6a514d9754e0aa05ae8ed17c7;hb=f03b9b7f0932b55c8a6d587681152ba601b23c77;hpb=dac8329952745dbb494bad1c301e44bab05ec0db diff --git a/radiant/camwindow.cpp b/radiant/camwindow.cpp index de2e03e0..a533eec2 100644 --- a/radiant/camwindow.cpp +++ b/radiant/camwindow.cpp @@ -27,6 +27,9 @@ #include "camwindow.h" +#include +#include + #include "debugging/debugging.h" #include "iscenegraph.h" @@ -157,18 +160,21 @@ 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 ), @@ -319,17 +325,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 ) { @@ -519,25 +516,25 @@ 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 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 ); @@ -601,9 +598,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 ); @@ -669,8 +666,8 @@ static Shader* m_state_select2; FreezePointer m_freezePointer; public: -GtkWidget* m_gl_widget; -GtkWindow* m_parent; +ui::GLArea m_gl_widget; +ui::Window m_parent{ui::null}; SelectionSystemWindowObserver* m_window_observer; XORRectangle m_XORRectangle; @@ -729,7 +726,7 @@ private: void Cam_Draw(); }; -typedef MemberCaller CamWndQueueDraw; +typedef MemberCaller CamWndQueueDraw; Shader* CamWnd::m_state_select1 = 0; Shader* CamWnd::m_state_select2 = 0; @@ -756,19 +753,19 @@ void GlobalCamera_setCamWnd( CamWnd& camwnd ){ } -GtkWidget* CamWnd_getWidget( CamWnd& camwnd ){ +ui::GLArea CamWnd_getWidget( CamWnd& camwnd ){ return camwnd.m_gl_widget; } -GtkWindow* CamWnd_getParent( CamWnd& camwnd ){ +ui::Window CamWnd_getParent( CamWnd& camwnd ){ return camwnd.m_parent; } ToggleShown g_camera_shown( true ); -void CamWnd_setParent( CamWnd& camwnd, GtkWindow* parent ){ +void CamWnd_setParent( CamWnd& camwnd, ui::Window parent ){ camwnd.m_parent = parent; - g_camera_shown.connect( GTK_WIDGET( camwnd.m_parent ) ); + g_camera_shown.connect( camwnd.m_parent ); } void CamWnd_Update( CamWnd& camwnd ){ @@ -799,7 +796,7 @@ void Camera_setAngles( CamWnd& camwnd, const Vector3& angles ){ // ============================================================================= // CamWnd class -gboolean enable_freelook_button_press( GtkWidget* widget, GdkEventButton* event, CamWnd* camwnd ){ +gboolean enable_freelook_button_press( ui::Widget widget, GdkEventButton* event, CamWnd* camwnd ){ if ( event->type == GDK_BUTTON_PRESS && event->button == 3 ) { camwnd->EnableFreeMove(); return TRUE; @@ -807,7 +804,7 @@ gboolean enable_freelook_button_press( GtkWidget* widget, GdkEventButton* event, return FALSE; } -gboolean disable_freelook_button_press( GtkWidget* widget, GdkEventButton* event, CamWnd* camwnd ){ +gboolean disable_freelook_button_press( ui::Widget widget, GdkEventButton* event, CamWnd* camwnd ){ if ( event->type == GDK_BUTTON_PRESS && event->button == 3 ) { camwnd->DisableFreeMove(); return TRUE; @@ -816,7 +813,7 @@ gboolean disable_freelook_button_press( GtkWidget* widget, GdkEventButton* event } #if 0 -gboolean mousecontrol_button_press( GtkWidget* widget, GdkEventButton* event, CamWnd* camwnd ){ +gboolean mousecontrol_button_press( ui::Widget widget, GdkEventButton* event, CamWnd* camwnd ){ if ( event->type == GDK_BUTTON_PRESS && event->button == 3 ) { Cam_MouseControl( camwnd->getCamera(), event->x, widget->allocation.height - 1 - event->y ); } @@ -825,20 +822,20 @@ gboolean mousecontrol_button_press( GtkWidget* widget, GdkEventButton* event, Ca #endif void camwnd_update_xor_rectangle( CamWnd& self, rect_t area ){ - if ( GTK_WIDGET_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 ) ); } } -gboolean selection_button_press( GtkWidget* widget, GdkEventButton* event, WindowObserver* observer ){ +gboolean selection_button_press( ui::Widget widget, GdkEventButton* event, WindowObserver* observer ){ if ( event->type == GDK_BUTTON_PRESS ) { observer->onMouseDown( WindowVector_forDouble( event->x, event->y ), button_for_button( event->button ), modifiers_for_state( event->state ) ); } return FALSE; } -gboolean selection_button_release( GtkWidget* widget, GdkEventButton* event, WindowObserver* observer ){ +gboolean selection_button_release( ui::Widget widget, GdkEventButton* event, WindowObserver* observer ){ if ( event->type == GDK_BUTTON_RELEASE ) { observer->onMouseUp( WindowVector_forDouble( event->x, event->y ), button_for_button( event->button ), modifiers_for_state( event->state ) ); } @@ -850,30 +847,31 @@ void selection_motion( gdouble x, gdouble y, guint state, void* data ){ reinterpret_cast( data )->onMouseMotion( WindowVector_forDouble( x, y ), modifiers_for_state( state ) ); } -inline WindowVector windowvector_for_widget_centre( GtkWidget* widget ){ - return WindowVector( static_cast( widget->allocation.width / 2 ), static_cast( widget->allocation.height / 2 ) ); +inline WindowVector windowvector_for_widget_centre( ui::Widget widget ){ + auto allocation = widget.dimensions(); + return WindowVector( static_cast( allocation.width / 2 ), static_cast(allocation.height / 2 ) ); } -gboolean selection_button_press_freemove( GtkWidget* widget, GdkEventButton* event, WindowObserver* observer ){ +gboolean selection_button_press_freemove( ui::Widget widget, GdkEventButton* event, WindowObserver* observer ){ if ( event->type == GDK_BUTTON_PRESS ) { observer->onMouseDown( windowvector_for_widget_centre( widget ), button_for_button( event->button ), modifiers_for_state( event->state ) ); } return FALSE; } -gboolean selection_button_release_freemove( GtkWidget* widget, GdkEventButton* event, WindowObserver* observer ){ +gboolean selection_button_release_freemove( ui::Widget widget, GdkEventButton* event, WindowObserver* observer ){ if ( event->type == GDK_BUTTON_RELEASE ) { observer->onMouseUp( windowvector_for_widget_centre( widget ), button_for_button( event->button ), modifiers_for_state( event->state ) ); } return FALSE; } -gboolean selection_motion_freemove( GtkWidget *widget, GdkEventMotion *event, WindowObserver* observer ){ +gboolean selection_motion_freemove( ui::Widget widget, GdkEventMotion *event, WindowObserver* observer ){ observer->onMouseMotion( windowvector_for_widget_centre( widget ), modifiers_for_state( event->state ) ); return FALSE; } -gboolean wheelmove_scroll( GtkWidget* widget, GdkEventScroll* event, CamWnd* camwnd ){ +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 ) ) ) ); @@ -886,7 +884,7 @@ gboolean wheelmove_scroll( GtkWidget* widget, GdkEventScroll* event, CamWnd* cam return FALSE; } -gboolean camera_size_allocate( GtkWidget* widget, GtkAllocation* allocation, CamWnd* camwnd ){ +gboolean camera_size_allocate( ui::Widget widget, GtkAllocation* allocation, CamWnd* camwnd ){ camwnd->getCamera().width = allocation->width; camwnd->getCamera().height = allocation->height; Camera_updateProjection( camwnd->getCamera() ); @@ -895,7 +893,7 @@ gboolean camera_size_allocate( GtkWidget* widget, GtkAllocation* allocation, Cam return FALSE; } -gboolean camera_expose( GtkWidget* widget, GdkEventExpose* event, gpointer data ){ +gboolean camera_expose( ui::Widget widget, GdkEventExpose* event, gpointer data ){ reinterpret_cast( data )->draw(); return FALSE; } @@ -913,60 +911,60 @@ void KeyEvent_disconnect( const char* name ){ } void CamWnd_registerCommands( CamWnd& camwnd ){ - GlobalKeyEvents_insert( "CameraForward", Accelerator( GDK_Up ), - ReferenceCaller( camwnd.getCamera() ), - ReferenceCaller( camwnd.getCamera() ) + GlobalKeyEvents_insert( "CameraForward", Accelerator( GDK_KEY_Up ), + ReferenceCaller( camwnd.getCamera() ), + ReferenceCaller( camwnd.getCamera() ) ); - GlobalKeyEvents_insert( "CameraBack", Accelerator( GDK_Down ), - ReferenceCaller( camwnd.getCamera() ), - ReferenceCaller( camwnd.getCamera() ) + GlobalKeyEvents_insert( "CameraBack", Accelerator( GDK_KEY_Down ), + ReferenceCaller( camwnd.getCamera() ), + ReferenceCaller( camwnd.getCamera() ) ); - GlobalKeyEvents_insert( "CameraLeft", Accelerator( GDK_Left ), - ReferenceCaller( camwnd.getCamera() ), - ReferenceCaller( camwnd.getCamera() ) + GlobalKeyEvents_insert( "CameraLeft", Accelerator( GDK_KEY_Left ), + ReferenceCaller( camwnd.getCamera() ), + ReferenceCaller( camwnd.getCamera() ) ); - GlobalKeyEvents_insert( "CameraRight", Accelerator( GDK_Right ), - ReferenceCaller( camwnd.getCamera() ), - ReferenceCaller( camwnd.getCamera() ) + GlobalKeyEvents_insert( "CameraRight", Accelerator( GDK_KEY_Right ), + ReferenceCaller( camwnd.getCamera() ), + ReferenceCaller( camwnd.getCamera() ) ); - GlobalKeyEvents_insert( "CameraStrafeRight", Accelerator( GDK_period ), - ReferenceCaller( camwnd.getCamera() ), - ReferenceCaller( camwnd.getCamera() ) + GlobalKeyEvents_insert( "CameraStrafeRight", Accelerator( GDK_KEY_period ), + ReferenceCaller( camwnd.getCamera() ), + ReferenceCaller( camwnd.getCamera() ) ); - GlobalKeyEvents_insert( "CameraStrafeLeft", Accelerator( GDK_comma ), - ReferenceCaller( camwnd.getCamera() ), - ReferenceCaller( camwnd.getCamera() ) + GlobalKeyEvents_insert( "CameraStrafeLeft", Accelerator( GDK_KEY_comma ), + 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() ) ); @@ -979,17 +977,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 ){ @@ -1044,44 +1042,43 @@ void CamWnd_Move_Discrete_Disable( CamWnd& camwnd ){ command_disconnect_accelerator( "CameraAngleDown" ); } -void CamWnd_Move_Discrete_Import( CamWnd& camwnd, bool value ){ - if ( g_camwindow_globals_private.m_bCamDiscrete ) { - CamWnd_Move_Discrete_Disable( camwnd ); +struct CamWnd_Move_Discrete { + static void Export(const Callback &returnz) { + returnz(g_camwindow_globals_private.m_bCamDiscrete); } - else - { - CamWnd_Move_Disable( camwnd ); - } - - g_camwindow_globals_private.m_bCamDiscrete = value; - if ( g_camwindow_globals_private.m_bCamDiscrete ) { - CamWnd_Move_Discrete_Enable( camwnd ); - } - else - { - CamWnd_Move_Enable( camwnd ); + static void Import(bool value) { + if (g_camwnd) { + Import_(*g_camwnd, value); + } else { + g_camwindow_globals_private.m_bCamDiscrete = value; + } } -} -void CamWnd_Move_Discrete_Import( bool value ){ - if ( g_camwnd != 0 ) { - CamWnd_Move_Discrete_Import( *g_camwnd, value ); - } - else - { + static void Import_(CamWnd &camwnd, bool value) { + if (g_camwindow_globals_private.m_bCamDiscrete) { + CamWnd_Move_Discrete_Disable(camwnd); + } else { + CamWnd_Move_Disable(camwnd); + } + g_camwindow_globals_private.m_bCamDiscrete = value; - } -} + if (g_camwindow_globals_private.m_bCamDiscrete) { + CamWnd_Move_Discrete_Enable(camwnd); + } else { + CamWnd_Move_Enable(camwnd); + } + } +}; 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 ); @@ -1109,11 +1106,11 @@ 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" ); @@ -1141,11 +1138,11 @@ 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_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 ) ), + m_deferredDraw( WidgetQueueDrawCaller( m_gl_widget ) ), m_deferred_motion( selection_motion, m_window_observer ), m_selection_button_press_handler( 0 ), m_selection_button_release_handler( 0 ), @@ -1157,16 +1154,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 ); - gtk_widget_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_FLAGS( m_gl_widget, GTK_CAN_FOCUS ); + 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 ) ); @@ -1174,9 +1171,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 ); } @@ -1191,7 +1188,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 ); - gtk_widget_unref( m_gl_widget ); + m_gl_widget.unref(); m_window_observer->release(); } @@ -1260,7 +1257,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 ) ); @@ -1270,7 +1267,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 @@ -1278,7 +1275,7 @@ void CamWnd::Cam_PositionDrag(){ // NOTE TTimo if there's an OS-level focus out of the application // then we can release the camera cursor grab -static gboolean camwindow_freemove_focusout( GtkWidget* widget, GdkEventFocus* event, gpointer data ){ +static gboolean camwindow_freemove_focusout( ui::Widget widget, GdkEventFocus* event, gpointer data ){ reinterpret_cast( data )->DisableFreeMove(); return FALSE; } @@ -1294,8 +1291,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 ); } @@ -1310,7 +1307,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 ); @@ -1353,7 +1350,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(){ @@ -1364,9 +1361,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; @@ -1396,15 +1395,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(){ @@ -1591,7 +1588,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(); @@ -1599,7 +1596,7 @@ void CamWnd::BenchMark(){ } -void fill_view_camera_menu( GtkMenu* menu ){ +void fill_view_camera_menu( ui::Menu menu ){ create_check_menu_item_with_mnemonic( menu, "Camera View", "ToggleCamera" ); } @@ -1607,7 +1604,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 ); } @@ -1635,8 +1632,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 ); @@ -1647,7 +1644,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 ){ @@ -1658,13 +1655,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( GtkToolbar* toolbar ){ - toolbar_append_toggle_button( toolbar, "Cubic clip the camera view (\\)", "view_cubicclipping.bmp", "ToggleCubicClip" ); +void CamWnd_constructToolbar( ui::Toolbar toolbar ){ + toolbar_append_toggle_button( toolbar, "Cubic clip the camera view (\\)", "view_cubicclipping.png", "ToggleCubicClip" ); } void CamWnd_registerShortcuts(){ @@ -1716,7 +1723,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() ); @@ -1739,7 +1746,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 ) ); } } } @@ -1752,46 +1759,43 @@ void GlobalCamera_LookThroughCamera(){ CamWnd_LookThroughCamera( *g_camwnd ); } - -void RenderModeImport( 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 ); +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; + } } -} -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; + 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); + } } -} -typedef FreeCaller1 RenderModeExportCaller; +}; void Camera_constructPreferences( PreferencesPage& page ){ page.appendSlider( "Movement Speed", g_camwindow_globals_private.m_nMoveSpeed, TRUE, 0, 0, 100, MIN_CAM_SPEED, MAX_CAM_SPEED, 1, 10 ); @@ -1800,13 +1804,11 @@ void Camera_constructPreferences( PreferencesPage& page ){ 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" ) { @@ -1815,8 +1817,7 @@ void Camera_constructPreferences( PreferencesPage& page ){ page.appendCombo( "Render Mode", STRING_ARRAY_RANGE( render_mode ), - IntImportCallback( RenderModeImportCaller() ), - IntExportCallback( RenderModeExportCaller() ) + make_property() ); } else @@ -1826,8 +1827,7 @@ void Camera_constructPreferences( PreferencesPage& page ){ page.appendCombo( "Render Mode", STRING_ARRAY_RANGE( render_mode ), - IntImportCallback( RenderModeImportCaller() ), - IntExportCallback( RenderModeExportCaller() ) + make_property() ); } @@ -1844,15 +1844,13 @@ 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 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; @@ -1873,57 +1871,57 @@ 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( "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( "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( "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 ) ); + + GlobalToggles_insert( "ShowStats", makeCallbackF(ShowStatsToggle), ToggleItem::AddCallbackCaller( g_show_stats ) ); + + GlobalPreferenceSystem().registerPreference( "ShowStats", make_property_string( g_camwindow_globals_private.m_showStats ) ); + 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();