From 82ff22882d5ae45d5c8e82a6b74829b33b033d77 Mon Sep 17 00:00:00 2001 From: Garux Date: Mon, 20 Aug 2018 23:33:33 +0300 Subject: [PATCH] * render workzone in 3d camera --- radiant/camwindow.cpp | 78 ++++++++++++++++++++++++++++++++++++++++++- radiant/mainframe.cpp | 3 +- radiant/xywindow.cpp | 14 ++++---- 3 files changed, 86 insertions(+), 9 deletions(-) diff --git a/radiant/camwindow.cpp b/radiant/camwindow.cpp index e3688a07..fa574a29 100644 --- a/radiant/camwindow.cpp +++ b/radiant/camwindow.cpp @@ -85,6 +85,7 @@ struct camwindow_globals_private_t bool m_bFaceWire; bool m_bFaceFill; int m_MSAA; + bool m_bShowWorkzone; camwindow_globals_private_t() : m_nMoveSpeed( 500 ), @@ -98,7 +99,8 @@ struct camwindow_globals_private_t m_strafeMode( 3 ), m_bFaceWire( true ), m_bFaceFill( true ), - m_MSAA( 8 ){ + m_MSAA( 8 ), + m_bShowWorkzone( true ){ } }; @@ -1681,6 +1683,16 @@ void ShowStatsToggle(){ UpdateAllWindows(); } +BoolExportCaller g_show_workzone3d_caller( g_camwindow_globals_private.m_bShowWorkzone ); +ToggleItem g_show_workzone3d( g_show_workzone3d_caller ); +void ShowWorkzone3dToggle(){ + g_camwindow_globals_private.m_bShowWorkzone ^= 1; + g_show_workzone3d.update(); + if ( g_camwnd != 0 ) { + CamWnd_Update( *g_camwnd ); + } +} + #include "stream/stringstream.h" void CamWnd::Cam_Draw(){ @@ -1793,6 +1805,68 @@ void CamWnd::Cam_Draw(){ renderer.render( m_Camera.modelview, m_Camera.projection ); } + /* workzone */ + if( g_camwindow_globals_private.m_bShowWorkzone && GlobalSelectionSystem().countSelected() != 0 ){ + glEnable( GL_BLEND ); + glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA ); + glShadeModel( GL_SMOOTH ); + + glEnable( GL_DEPTH_TEST ); + glDepthFunc( GL_LESS ); + glDepthMask( GL_TRUE ); + + glDisableClientState( GL_TEXTURE_COORD_ARRAY ); + glDisableClientState( GL_NORMAL_ARRAY ); + glDisableClientState( GL_COLOR_ARRAY ); + + glDisable( GL_TEXTURE_2D ); + glDisable( GL_LIGHTING ); + glDisable( GL_COLOR_MATERIAL ); + + glDisable( GL_LINE_STIPPLE ); + glLineWidth( 1 ); +#if 0 + const Vector4 color0( g_camwindow_globals.color_selbrushes3d, 0 ); + const Vector4 color1( g_camwindow_globals.color_selbrushes3d, 1 ); +#else + const Vector4 color0( 1, 1, 1, 0 ); + const Vector4 color1( 1, 1, 1, 1 ); +#endif + const AABB bounds = GlobalSelectionSystem().getBoundsSelected(); + + glBegin( GL_LINES ); + for( std::size_t i = 0; i < 3; ++i ){ + const std::size_t i2 = ( i + 1 ) % 3; + const std::size_t i3 = ( i + 2 ) % 3; + const Vector3 normal = g_vector3_axes[i]; + const float size = 1024; + std::vector points; + points.reserve( 4 ); + points.push_back( bounds.origin + g_vector3_axes[i2] * bounds.extents + g_vector3_axes[i3] * bounds.extents ); + if( bounds.extents[i2] != 0 ){ + points.push_back( bounds.origin - g_vector3_axes[i2] * bounds.extents + g_vector3_axes[i3] * bounds.extents ); + } + if( bounds.extents[i3] != 0 ){ + points.push_back( bounds.origin + g_vector3_axes[i2] * bounds.extents - g_vector3_axes[i3] * bounds.extents ); + if( bounds.extents[i2] != 0 ){ + points.push_back( bounds.origin - g_vector3_axes[i2] * bounds.extents - g_vector3_axes[i3] * bounds.extents ); + } + } + for( std::vector::const_iterator j = points.begin(); j != points.end(); ++j ){ + glColor4fv( vector4_to_array( color0 ) ); + glVertex3fv( vector3_to_array( *j + normal * ( bounds.extents[i] + size ) ) ); + glColor4fv( vector4_to_array( color1 ) ); + glVertex3fv( vector3_to_array( *j + normal * ( bounds.extents[i] ) ) ); + glVertex3fv( vector3_to_array( *j + normal * ( bounds.extents[i] ) ) ); + glVertex3fv( vector3_to_array( *j - normal * ( bounds.extents[i] ) ) ); + glVertex3fv( vector3_to_array( *j - normal * ( bounds.extents[i] ) ) ); + glColor4fv( vector4_to_array( color0 ) ); + glVertex3fv( vector3_to_array( *j - normal * ( bounds.extents[i] + size ) ) ); + } + } + glEnd(); + } + // prepare for 2d stuff glColor4f( 1, 1, 1, 1 ); glDisable( GL_BLEND ); @@ -2324,8 +2398,10 @@ void CamWnd_Construct(){ GlobalShortcuts_insert( "CameraFreeFocus", Accelerator( GDK_Tab ) ); GlobalToggles_insert( "ShowStats", FreeCaller(), ToggleItem::AddCallbackCaller( g_show_stats ) ); + GlobalToggles_insert( "ShowWorkzone3d", FreeCaller(), ToggleItem::AddCallbackCaller( g_show_workzone3d ) ); GlobalPreferenceSystem().registerPreference( "ShowStats", BoolImportStringCaller( g_camwindow_globals.m_showStats ), BoolExportStringCaller( g_camwindow_globals.m_showStats ) ); + GlobalPreferenceSystem().registerPreference( "ShowWorkzone3d", BoolImportStringCaller( g_camwindow_globals_private.m_bShowWorkzone ), BoolExportStringCaller( g_camwindow_globals_private.m_bShowWorkzone ) ); GlobalPreferenceSystem().registerPreference( "CamMoveSpeed", IntImportStringCaller( g_camwindow_globals_private.m_nMoveSpeed ), IntExportStringCaller( g_camwindow_globals_private.m_nMoveSpeed ) ); GlobalPreferenceSystem().registerPreference( "CamMoveTimeToMaxSpeed", IntImportStringCaller( g_camwindow_globals_private.m_time_toMaxSpeed ), IntExportStringCaller( g_camwindow_globals_private.m_time_toMaxSpeed ) ); GlobalPreferenceSystem().registerPreference( "ScrollMoveSpeed", IntImportStringCaller( g_camwindow_globals_private.m_nScrollMoveSpeed ), IntExportStringCaller( g_camwindow_globals_private.m_nScrollMoveSpeed ) ); diff --git a/radiant/mainframe.cpp b/radiant/mainframe.cpp index b81ab9c2..b296838c 100644 --- a/radiant/mainframe.cpp +++ b/radiant/mainframe.cpp @@ -2096,7 +2096,8 @@ GtkMenuItem* create_view_menu( MainFrame::EViewStyle style ){ create_check_menu_item_with_mnemonic( menu_in_menu, "Show C_oordinates", "ShowCoordinates" ); create_check_menu_item_with_mnemonic( menu_in_menu, "Show Window Outline", "ShowWindowOutline" ); create_check_menu_item_with_mnemonic( menu_in_menu, "Show Axes", "ShowAxes" ); - create_check_menu_item_with_mnemonic( menu_in_menu, "Show Workzone", "ShowWorkzone" ); + create_check_menu_item_with_mnemonic( menu_in_menu, "Show 2D Workzone", "ShowWorkzone2d" ); + create_check_menu_item_with_mnemonic( menu_in_menu, "Show 3D Workzone", "ShowWorkzone3d" ); create_check_menu_item_with_mnemonic( menu_in_menu, "Show Renderer Stats", "ShowStats" ); } diff --git a/radiant/xywindow.cpp b/radiant/xywindow.cpp index fd1739ad..70354aa6 100644 --- a/radiant/xywindow.cpp +++ b/radiant/xywindow.cpp @@ -90,7 +90,7 @@ struct xywindow_globals_private_t bool show_outline; bool show_axis; - bool d_show_work; + bool show_workzone; bool show_blocks; int blockSize; @@ -109,7 +109,7 @@ struct xywindow_globals_private_t show_outline( true ), show_axis( true ), - d_show_work( false ), + show_workzone( false ), show_blocks( false ), @@ -1752,7 +1752,7 @@ void XYWnd::XY_DrawGrid( void ) { // show current work zone? // the work zone is used to place dropped points and brushes - if ( g_xywindow_globals_private.d_show_work ) { + if ( g_xywindow_globals_private.show_workzone ) { glColor4f( 1.0f, 0.0f, 0.0f, 1.0f ); glBegin( GL_LINES ); glVertex2f( xb, Select_getWorkZone().d_work_min[nDim2] ); @@ -2777,10 +2777,10 @@ void ShowAxesToggle(){ } -BoolExportCaller g_show_workzone_caller( g_xywindow_globals_private.d_show_work ); +BoolExportCaller g_show_workzone_caller( g_xywindow_globals_private.show_workzone ); ToggleItem g_show_workzone( g_show_workzone_caller ); void ShowWorkzoneToggle(){ - g_xywindow_globals_private.d_show_work ^= 1; + g_xywindow_globals_private.show_workzone ^= 1; g_show_workzone.update(); XY_UpdateAllWindows(); } @@ -2877,7 +2877,7 @@ void XYShow_registerCommands(){ GlobalToggles_insert( "ShowCoordinates", FreeCaller(), ToggleItem::AddCallbackCaller( g_show_coordinates ) ); GlobalToggles_insert( "ShowWindowOutline", FreeCaller(), ToggleItem::AddCallbackCaller( g_show_outline ) ); GlobalToggles_insert( "ShowAxes", FreeCaller(), ToggleItem::AddCallbackCaller( g_show_axes ) ); - GlobalToggles_insert( "ShowWorkzone", FreeCaller(), ToggleItem::AddCallbackCaller( g_show_workzone ) ); + GlobalToggles_insert( "ShowWorkzone2d", FreeCaller(), ToggleItem::AddCallbackCaller( g_show_workzone ) ); } void XYWnd_registerShortcuts(){ @@ -2940,7 +2940,7 @@ void XYWindow_Construct(){ GlobalPreferenceSystem().registerPreference( "SI_ShowCoords", BoolImportStringCaller( g_xywindow_globals_private.show_coordinates ), BoolExportStringCaller( g_xywindow_globals_private.show_coordinates ) ); GlobalPreferenceSystem().registerPreference( "SI_ShowOutlines", BoolImportStringCaller( g_xywindow_globals_private.show_outline ), BoolExportStringCaller( g_xywindow_globals_private.show_outline ) ); GlobalPreferenceSystem().registerPreference( "SI_ShowAxis", BoolImportStringCaller( g_xywindow_globals_private.show_axis ), BoolExportStringCaller( g_xywindow_globals_private.show_axis ) ); - GlobalPreferenceSystem().registerPreference( "ShowWorkzone", BoolImportStringCaller( g_xywindow_globals_private.d_show_work ), BoolExportStringCaller( g_xywindow_globals_private.d_show_work ) ); + GlobalPreferenceSystem().registerPreference( "ShowWorkzone2d", BoolImportStringCaller( g_xywindow_globals_private.show_workzone ), BoolExportStringCaller( g_xywindow_globals_private.show_workzone ) ); GlobalPreferenceSystem().registerPreference( "SI_AxisColors0", Vector3ImportStringCaller( g_xywindow_globals.AxisColorX ), Vector3ExportStringCaller( g_xywindow_globals.AxisColorX ) ); GlobalPreferenceSystem().registerPreference( "SI_AxisColors1", Vector3ImportStringCaller( g_xywindow_globals.AxisColorY ), Vector3ExportStringCaller( g_xywindow_globals.AxisColorY ) );