bool m_bChaseMouse;
bool m_bSizePaint;
+ bool g_bCrossHairs;
+
xywindow_globals_private_t() :
d_showgrid( true ),
m_bCamXYUpdate( true ),
m_bChaseMouse( true ),
- m_bSizePaint( true ){
+ m_bSizePaint( true ),
+
+ g_bCrossHairs( false ){
}
};
XYWnd_Update( *this );
}
-void XYWnd_ZoomIn( XYWnd* xy ){
+void XYWnd::ZoomIn(){
float max_scale = 64;
- float scale = xy->Scale() * 5.0f / 4.0f;
+ float scale = Scale() * 5.0f / 4.0f;
if ( scale > max_scale ) {
- if ( xy->Scale() != max_scale ) {
- xy->SetScale( max_scale );
+ if ( Scale() != max_scale ) {
+ SetScale( max_scale );
}
}
else
{
- xy->SetScale( scale );
+ SetScale( scale );
}
}
// NOTE: the zoom out factor is 4/5, we could think about customizing it
// we don't go below a zoom factor corresponding to 10% of the max world size
// (this has to be computed against the window size)
-void XYWnd_ZoomOut( XYWnd* xy ){
- float min_scale = MIN( xy->Width(),xy->Height() ) / ( 1.1f * ( g_MaxWorldCoord - g_MinWorldCoord ) );
- float scale = xy->Scale() * 4.0f / 5.0f;
+void XYWnd::ZoomOut(){
+ float min_scale = MIN( Width(), Height() ) / ( 1.1f * ( g_MaxWorldCoord - g_MinWorldCoord ) );
+ float scale = Scale() * 4.0f / 5.0f;
if ( scale < min_scale ) {
- if ( xy->Scale() != min_scale ) {
- xy->SetScale( min_scale );
+ if ( Scale() != min_scale ) {
+ SetScale( min_scale );
}
}
else
{
- xy->SetScale( scale );
+ SetScale( scale );
+ }
+}
+
+void XYWnd::ZoomInWithMouse( int pointx, int pointy ){
+ float old_scale = Scale();
+ ZoomIn();
+ if ( g_xywindow_globals.m_bImprovedWheelZoom ) {
+ float scale_diff = 1.0 / old_scale - 1.0 / Scale();
+ int nDim1 = ( m_viewType == YZ ) ? 1 : 0;
+ int nDim2 = ( m_viewType == XY ) ? 1 : 2;
+ Vector3 origin = GetOrigin();
+ origin[nDim1] += scale_diff * (pointx - 0.5 * Width());
+ origin[nDim2] -= scale_diff * (pointy - 0.5 * Height());
+ SetOrigin( origin );
}
}
// =============================================================================
// variables
-bool g_bCrossHairs = false;
-
ui::Menu XYWnd::m_mnuDrop(ui::null);
// this is disabled, and broken
void xy_update_xor_rectangle( XYWnd& self, rect_t area ){
if ( self.GetWidget().visible() ) {
- self.m_XORRectangle.set( rectangle_from_area( area.min, area.max, self.Width(), self.Height() ) );
+ rectangle_t rect = rectangle_from_area( area.min, area.max, self.Width(), self.Height() );
+ int nDim1 = ( self.GetViewType() == YZ ) ? 1 : 0;
+ int nDim2 = ( self.GetViewType() == XY ) ? 1 : 2;
+ rect.x /= self.Scale();
+ rect.y /= self.Scale();
+ rect.w /= self.Scale();
+ rect.h /= self.Scale();
+ rect.x += self.GetOrigin()[nDim1];
+ rect.y += self.GetOrigin()[nDim2];
+ self.m_XORRectangle.set( rect );
}
}
gboolean xywnd_wheel_scroll( ui::Widget widget, GdkEventScroll* event, XYWnd* xywnd ){
if ( event->direction == GDK_SCROLL_UP ) {
- XYWnd_ZoomIn( xywnd );
+ xywnd->ZoomInWithMouse( (int)event->x, (int)event->y );
}
else if ( event->direction == GDK_SCROLL_DOWN ) {
- XYWnd_ZoomOut( xywnd );
+ xywnd->ZoomOut();
}
return FALSE;
}
m_parent( ui::null ),
m_window_observer( NewWindowObserver() ),
m_XORRectangle( m_gl_widget ),
- m_chasemouse_handler( 0 ){
+ m_chasemouse_handler( 0 ) {
+
m_bActive = false;
m_buttonstate = 0;
Map_addValidCallback( g_map, DeferredDrawOnMapValidChangedCaller( m_deferredDraw ) );
- updateProjection();
- updateModelview();
+ // This reconstruct=false argument is used to avoid a circular dependency
+ // between modelview and projection initialization and a valgrind complaint
+ updateProjection( false );
+ updateModelview( false );
+ m_view.Construct( m_projection, m_modelview, m_nWidth, m_nHeight );
AddSceneChangeCallback( ReferenceCaller<XYWnd, void(), &XYWnd_Update>( *this ) );
AddCameraMovedCallback( ReferenceCaller<XYWnd, void(), &XYWnd_CameraMoved>( *this ) );
g_pParentWnd->ActiveXY()->OnEntityCreate( entity_name );
}
else {
- GlobalRadiant().m_pfnMessageBox( MainFrame_getWindow(), "There's already a worldspawn in your map!"
- "",
- "Info",
- eMB_OK,
- eMB_ICONDEFAULT );
+ GlobalRadiant().m_pfnMessageBox( MainFrame_getWindow(),
+ "There's already a worldspawn in your map!",
+ "Info",
+ eMB_OK,
+ eMB_ICONDEFAULT );
}
}
void XYWnd_zoomDelta( int x, int y, unsigned int state, void* data ){
if ( y != 0 ) {
g_dragZoom += y;
-
while ( abs( g_dragZoom ) > 8 )
{
if ( g_dragZoom > 0 ) {
- XYWnd_ZoomOut( reinterpret_cast<XYWnd*>( data ) );
+ reinterpret_cast<XYWnd*>( data )->ZoomOut();
g_dragZoom -= 8;
}
else
{
- XYWnd_ZoomIn( reinterpret_cast<XYWnd*>( data ) );
+ reinterpret_cast<XYWnd*>( data )->ZoomIn();
g_dragZoom += 8;
}
}
<< " z:: " << FloatFormat( m_mousePosition[2], 6, 1 );
g_pParentWnd->SetStatusText( g_pParentWnd->m_position_status, status.c_str() );
- if ( g_bCrossHairs ) {
+ if ( g_xywindow_globals_private.g_bCrossHairs ) {
XYWnd_Update( *this );
}
Shader* m_state_selected;
};
-void XYWnd::updateProjection(){
+void XYWnd::updateProjection( bool reconstruct ){
m_projection[0] = 1.0f / static_cast<float>( m_nWidth / 2 );
m_projection[5] = 1.0f / static_cast<float>( m_nHeight / 2 );
m_projection[10] = 1.0f / ( g_MaxWorldCoord * m_fScale );
m_projection[15] = 1.0f;
- m_view.Construct( m_projection, m_modelview, m_nWidth, m_nHeight );
+ if (reconstruct) {
+ m_view.Construct( m_projection, m_modelview, m_nWidth, m_nHeight );
+ }
}
// note: modelview matrix must have a uniform scale, otherwise strange things happen when rendering the rotation manipulator.
-void XYWnd::updateModelview(){
+void XYWnd::updateModelview( bool reconstruct ){
int nDim1 = ( m_viewType == YZ ) ? 1 : 0;
int nDim2 = ( m_viewType == XY ) ? 1 : 2;
m_modelview[3] = m_modelview[7] = m_modelview[11] = 0;
m_modelview[15] = 1;
- m_view.Construct( m_projection, m_modelview, m_nWidth, m_nHeight );
+ if (reconstruct) {
+ m_view.Construct( m_projection, m_modelview, m_nWidth, m_nHeight );
+ }
}
/*
PaintSizeInfo( nDim1, nDim2, min, max );
}
- if ( g_bCrossHairs ) {
+ if ( g_xywindow_globals_private.g_bCrossHairs ) {
glColor4f( 0.2f, 0.9f, 0.2f, 0.8f );
glBegin( GL_LINES );
if ( m_viewType == XY ) {
}
void XY_ZoomIn(){
- XYWnd_ZoomIn( g_pParentWnd->ActiveXY() );
+ g_pParentWnd->ActiveXY()->ZoomIn();
}
// NOTE: the zoom out factor is 4/5, we could think about customizing it
// we don't go below a zoom factor corresponding to 10% of the max world size
// (this has to be computed against the window size)
void XY_ZoomOut(){
- XYWnd_ZoomOut( g_pParentWnd->ActiveXY() );
+ g_pParentWnd->ActiveXY()->ZoomOut();
}
void ToggleShowCrosshair(){
- g_bCrossHairs ^= 1;
+ g_xywindow_globals_private.g_bCrossHairs ^= 1;
XY_UpdateAllWindows();
}
GlobalPreferenceSystem().registerPreference( "ClipCaulk", make_property_string( g_clip_useCaulk ) );
GlobalPreferenceSystem().registerPreference( "NewRightClick", make_property_string( g_xywindow_globals.m_bRightClick ) );
+ GlobalPreferenceSystem().registerPreference( "ImprovedWheelZoom", make_property_string( g_xywindow_globals.m_bImprovedWheelZoom ) );
GlobalPreferenceSystem().registerPreference( "ChaseMouse", make_property_string( g_xywindow_globals_private.m_bChaseMouse ) );
GlobalPreferenceSystem().registerPreference( "SizePainting", make_property_string( g_xywindow_globals_private.m_bSizePaint ) );
+ GlobalPreferenceSystem().registerPreference( "ShowCrosshair", make_property_string( g_xywindow_globals_private.g_bCrossHairs ) );
GlobalPreferenceSystem().registerPreference( "NoStipple", make_property_string( g_xywindow_globals.m_bNoStipple ) );
GlobalPreferenceSystem().registerPreference( "SI_ShowCoords", make_property_string( g_xywindow_globals_private.show_coordinates ) );
GlobalPreferenceSystem().registerPreference( "SI_ShowOutlines", make_property_string( g_xywindow_globals_private.show_outline ) );