diff --git a/radiant/camwindow.cpp b/radiant/camwindow.cpp index b5b6a35f..3d44a237 100644 --- a/radiant/camwindow.cpp +++ b/radiant/camwindow.cpp @@ -75,7 +75,7 @@ struct camwindow_globals_private_t { int m_nMoveSpeed; bool m_bCamLinkSpeed; - int m_nAngleSpeed; + float m_angleSpeed; bool m_bCamInverseMouse; bool m_bCamDiscrete; bool m_bCubicClipping; @@ -87,7 +87,7 @@ struct camwindow_globals_private_t camwindow_globals_private_t() : m_nMoveSpeed( 100 ), m_bCamLinkSpeed( true ), - m_nAngleSpeed( 3 ), + m_angleSpeed( 9.f ), m_bCamInverseMouse( false ), m_bCamDiscrete( true ), m_bCubicClipping( false ), @@ -297,16 +297,16 @@ void Camera_FreeMove( camera_t& camera, int dx, int dy ){ } else // free rotation { - const float dtime = 0.1f; + const float dtime = 0.0333333f; if ( g_camwindow_globals_private.m_bCamInverseMouse ) { - camera.angles[CAMERA_PITCH] -= dy * dtime * g_camwindow_globals_private.m_nAngleSpeed; + camera.angles[CAMERA_PITCH] -= dy * dtime * g_camwindow_globals_private.m_angleSpeed; } else{ - camera.angles[CAMERA_PITCH] += dy * dtime * g_camwindow_globals_private.m_nAngleSpeed; + camera.angles[CAMERA_PITCH] += dy * dtime * g_camwindow_globals_private.m_angleSpeed; } - camera.angles[CAMERA_YAW] += dx * dtime * g_camwindow_globals_private.m_nAngleSpeed; + camera.angles[CAMERA_YAW] += dx * dtime * g_camwindow_globals_private.m_angleSpeed; if ( camera.angles[CAMERA_PITCH] > 90 ) { camera.angles[CAMERA_PITCH] = 90; @@ -357,7 +357,7 @@ void Cam_MouseControl( camera_t& camera, int x, int y ){ } vector3_add( camera.origin, vector3_scaled( camera.forward, yf * 0.1f * g_camwindow_globals_private.m_nMoveSpeed ) ); - camera.angles[CAMERA_YAW] += xf * -0.1f * g_camwindow_globals_private.m_nAngleSpeed; + camera.angles[CAMERA_YAW] += xf * -0.1f * g_camwindow_globals_private.m_angleSpeed; Camera_updateModelview( camera ); } @@ -389,19 +389,19 @@ Vector3 Camera_getFocusPos( camera_t& camera ); void Cam_KeyControl( camera_t& camera, float dtime ){ // Update angles if ( camera.movementflags & MOVE_ROTLEFT ) { - camera.angles[CAMERA_YAW] += 15 * dtime * g_camwindow_globals_private.m_nAngleSpeed; + camera.angles[CAMERA_YAW] += 5.f * dtime * g_camwindow_globals_private.m_angleSpeed; } if ( camera.movementflags & MOVE_ROTRIGHT ) { - camera.angles[CAMERA_YAW] -= 15 * dtime * g_camwindow_globals_private.m_nAngleSpeed; + camera.angles[CAMERA_YAW] -= 5.f * dtime * g_camwindow_globals_private.m_angleSpeed; } if ( camera.movementflags & MOVE_PITCHUP ) { - camera.angles[CAMERA_PITCH] += 15 * dtime * g_camwindow_globals_private.m_nAngleSpeed; + camera.angles[CAMERA_PITCH] += 5.f * dtime * g_camwindow_globals_private.m_angleSpeed; if ( camera.angles[CAMERA_PITCH] > 90 ) { camera.angles[CAMERA_PITCH] = 90; } } if ( camera.movementflags & MOVE_PITCHDOWN ) { - camera.angles[CAMERA_PITCH] -= 15 * dtime * g_camwindow_globals_private.m_nAngleSpeed; + camera.angles[CAMERA_PITCH] -= 5.f * dtime * g_camwindow_globals_private.m_angleSpeed; if ( camera.angles[CAMERA_PITCH] < -90 ) { camera.angles[CAMERA_PITCH] = -90; } @@ -2151,7 +2151,7 @@ typedef FreeCaller1 fieldOfViewImportCaller; 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 ); 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.appendSlider( "Mouse Sensitivity", g_camwindow_globals_private.m_angleSpeed, TRUE, 0, 0, 9, 0.1, 180, 0.1, 1 ); 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( @@ -2308,7 +2308,7 @@ void CamWnd_Construct(){ GlobalPreferenceSystem().registerPreference( "ShowStats", BoolImportStringCaller( g_camwindow_globals.m_showStats ), BoolExportStringCaller( g_camwindow_globals.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( "Sensitivity", FloatImportStringCaller( g_camwindow_globals_private.m_angleSpeed ), FloatExportStringCaller( g_camwindow_globals_private.m_angleSpeed ) ); 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 ) ); diff --git a/radiant/dialog.cpp b/radiant/dialog.cpp index 438bc1ba..dd16b5b8 100644 --- a/radiant/dialog.cpp +++ b/radiant/dialog.cpp @@ -227,6 +227,14 @@ void IntAdjustmentExport( GtkAdjustment& widget, const IntImportCallback& import } typedef ImportExport IntAdjustmentImportExport; +void FloatAdjustmentImport( GtkAdjustment& widget, float value ){ + gtk_adjustment_set_value( &widget, value ); +} +void FloatAdjustmentExport( GtkAdjustment& widget, const FloatImportCallback& importCallback ){ + importCallback( (float)gtk_adjustment_get_value( &widget ) ); +} +typedef ImportExport FloatAdjustmentImportExport; + void IntComboImport( GtkComboBox& widget, int value ){ gtk_combo_box_set_active( &widget, value ); @@ -391,6 +399,10 @@ void Dialog::AddIntAdjustmentData( GtkAdjustment& widget, const IntImportCallbac AddCustomData( m_data ).apply( widget, importViewer, exportViewer ); } +void Dialog::AddFloatAdjustmentData( GtkAdjustment& widget, const FloatImportCallback& importViewer, const FloatExportCallback& exportViewer ){ + AddCustomData( m_data ).apply( widget, importViewer, exportViewer ); +} + void Dialog::AddIntComboData( GtkComboBox& widget, const IntImportCallback& importViewer, const IntExportCallback& exportViewer ){ AddCustomData( m_data ).apply( widget, importViewer, exportViewer ); } @@ -423,6 +435,9 @@ void Dialog::AddDialogData( GtkSpinButton& widget, int& data ){ void Dialog::AddDialogData( GtkAdjustment& widget, int& data ){ AddData( m_data ).apply( widget, data ); } +void Dialog::AddDialogData( GtkAdjustment& widget, float& data ){ + AddData( m_data ).apply( widget, data ); +} void Dialog::AddDialogData( GtkComboBox& widget, int& data ){ AddData( m_data ).apply( widget, data ); } @@ -503,7 +518,7 @@ void Dialog::addCombo( GtkWidget* vbox, const char* name, int& data, StringArray addCombo( vbox, name, values, IntImportCaller( data ), IntExportCaller( data ) ); } -void Dialog::addSlider( GtkWidget* vbox, const char* name, int& data, gboolean draw_value, const char* low, const char* high, double value, double lower, double upper, double step_increment, double page_increment ){ +void addSlider_( GtkAdjustment* adj, GtkWidget* vbox, const char* name, gboolean draw_value, const char* low, const char* high, int digits ){ #if 0 if ( draw_value == FALSE ) { GtkWidget* hbox2 = gtk_hbox_new( FALSE, 0 ); @@ -521,27 +536,38 @@ void Dialog::addSlider( GtkWidget* vbox, const char* name, int& data, gboolean d } } #endif - - // adjustment - GtkObject* adj = gtk_adjustment_new( value, lower, upper, step_increment, page_increment, 0 ); - AddIntAdjustmentData( *GTK_ADJUSTMENT( adj ), IntImportCaller( data ), IntExportCaller( data ) ); - // scale GtkWidget* alignment = gtk_alignment_new( 0.0, 0.5, 1.0, 0.0 ); gtk_widget_show( alignment ); - GtkWidget* scale = gtk_hscale_new( GTK_ADJUSTMENT( adj ) ); + GtkWidget* scale = gtk_hscale_new( adj ); gtk_scale_set_value_pos( GTK_SCALE( scale ), GTK_POS_LEFT ); gtk_widget_show( scale ); gtk_container_add( GTK_CONTAINER( alignment ), scale ); gtk_scale_set_draw_value( GTK_SCALE( scale ), draw_value ); - gtk_scale_set_digits( GTK_SCALE( scale ), 0 ); + gtk_scale_set_digits( GTK_SCALE( scale ), digits ); GtkTable* row = DialogRow_new( name, alignment ); DialogVBox_packRow( GTK_VBOX( vbox ), GTK_WIDGET( row ) ); } +void Dialog::addSlider( GtkWidget* vbox, const char* name, int& data, gboolean draw_value, const char* low, const char* high, double value, double lower, double upper, double step_increment, double page_increment ){ + // adjustment + GtkAdjustment* adj = GTK_ADJUSTMENT( gtk_adjustment_new( value, lower, upper, step_increment, page_increment, 0 ) ); + AddIntAdjustmentData( *adj, IntImportCaller( data ), IntExportCaller( data ) ); + + addSlider_( adj, vbox, name, draw_value, low, high, 0 ); +} + +void Dialog::addSlider( GtkWidget* vbox, const char* name, float& data, gboolean draw_value, const char* low, const char* high, double value, double lower, double upper, double step_increment, double page_increment ){ + // adjustment + GtkAdjustment* adj = GTK_ADJUSTMENT( gtk_adjustment_new( value, lower, upper, step_increment, page_increment, 0 ) ); + AddFloatAdjustmentData( *adj, FloatImportCaller( data ), FloatExportCaller( data ) ); + + addSlider_( adj, vbox, name, draw_value, low, high, 1 ); +} + void Dialog::addRadio( GtkWidget* vbox, const char* name, StringArrayRange names, const IntImportCallback& importViewer, const IntExportCallback& exportViewer ){ GtkWidget* alignment = gtk_alignment_new( 0.0, 0.5, 0.0, 0.0 ); gtk_widget_show( alignment ); diff --git a/radiant/dialog.h b/radiant/dialog.h index 2a0454eb..7a562c68 100644 --- a/radiant/dialog.h +++ b/radiant/dialog.h @@ -143,6 +143,7 @@ GtkWidget* addCheckBox( GtkWidget* vbox, const char* name, const char* flag, boo void addCombo( GtkWidget* vbox, const char* name, StringArrayRange values, const IntImportCallback& importCallback, const IntExportCallback& exportCallback ); void addCombo( GtkWidget* vbox, const char* name, int& data, StringArrayRange values ); void addSlider( GtkWidget* vbox, const char* name, int& data, gboolean draw_value, const char* low, const char* high, double value, double lower, double upper, double step_increment, double page_increment ); +void addSlider( GtkWidget* vbox, const char* name, float& data, gboolean draw_value, const char* low, const char* high, double value, double lower, double upper, double step_increment, double page_increment ); void addRadio( GtkWidget* vbox, const char* name, StringArrayRange names, const IntImportCallback& importCallback, const IntExportCallback& exportCallback ); void addRadio( GtkWidget* vbox, const char* name, int& data, StringArrayRange names ); void addRadioIcons( GtkWidget* vbox, const char* name, StringArrayRange icons, const IntImportCallback& importCallback, const IntExportCallback& exportCallback ); @@ -176,6 +177,7 @@ void AddFloatEntryData( GtkEntry& object, const FloatImportCallback& importCallb void AddFloatSpinnerData( GtkSpinButton& object, const FloatImportCallback& importCallback, const FloatExportCallback& exportCallback ); void AddIntSpinnerData( GtkSpinButton& object, const IntImportCallback& importCallback, const IntExportCallback& exportCallback ); void AddIntAdjustmentData( GtkAdjustment& object, const IntImportCallback& importCallback, const IntExportCallback& exportCallback ); +void AddFloatAdjustmentData( GtkAdjustment& object, const FloatImportCallback& importCallback, const FloatExportCallback& exportCallback ); void AddIntComboData( GtkComboBox& object, const IntImportCallback& importCallback, const IntExportCallback& exportCallback ); void AddDialogData( GtkToggleButton& object, bool& data ); @@ -187,6 +189,7 @@ void AddDialogData( GtkEntry& object, float& data ); void AddDialogData( GtkSpinButton& object, float& data ); void AddDialogData( GtkSpinButton& object, int& data ); void AddDialogData( GtkAdjustment& object, int& data ); +void AddDialogData( GtkAdjustment& object, float& data ); void AddDialogData( GtkComboBox& object, int& data ); }; diff --git a/radiant/preferences.h b/radiant/preferences.h index e6d36898..7f25a689 100644 --- a/radiant/preferences.h +++ b/radiant/preferences.h @@ -58,6 +58,9 @@ void appendCombo( const char* name, int& data, StringArrayRange values ){ void appendSlider( const char* name, int& data, gboolean draw_value, const char* low, const char* high, double value, double lower, double upper, double step_increment, double page_increment ){ m_dialog.addSlider( m_vbox, name, data, draw_value, low, high, value, lower, upper, step_increment, page_increment ); } +void appendSlider( const char* name, float& data, gboolean draw_value, const char* low, const char* high, double value, double lower, double upper, double step_increment, double page_increment ){ + m_dialog.addSlider( m_vbox, name, data, draw_value, low, high, value, lower, upper, step_increment, page_increment ); +} void appendRadio( const char* name, StringArrayRange names, const IntImportCallback& importCallback, const IntExportCallback& exportCallback ){ m_dialog.addRadio( m_vbox, name, names, importCallback, exportCallback ); }