binds...
	* m1 + shift drag: snapped modes of manipulators:
		scale free: scale two axes synchronously
	* m2 in entities creation menu: change classname; ctrl + m2: change classname, don't close menu
	* ctrl + m1 in entities creation menu: create entity, don't close menu (+offset every next entity by 8u or gridsize, if > 8)

misc...
	* fix: laggy selectors, manipulators in mlook mode
	* scale free->snapped mode: constrain to two axes, most perpendicular to view direction (i.e. works for two axes in 3d too)
	* scale free->snapped mode: use min move delta for scale (was max = hard to scale down); fix ZY projection case
	* fix: pointfile was considered as shown, when trying to load missing one
	* entity inspector->EntityProperties treeview: Tab keypress = focus Key field
	* 2x2 layout: allow gtk to handle separators positions; fixes: unmaximize wnd, maximize = horizontal separators > center
		fixes: unmaximize wnd = not updated views glwidget positions on some systems
	* fix: paint selector, selecting occluded faces
	* camera->field of view option
	* wider Texture Gamma preference range
	* wad games->texbro treeview: do not group names, using underscore; fixes crash on loading parent; fixes mess if path contains underscore
	* fix: do not quit freelook on autosaving
	* entity creation menu has ability to be 'tearoff'
	* wad games: fix TextureBrowser_ShowDirectory crash on loading common dir (can cfg to load .wad), on loading containing dir (do nothing)
	* wad games: fix crash on selecting a shader (not a plain texture) in tex bro
	* wad games: more reliable filterbar texturing defaults
	* shader for 'caulk new brushes' and 'clipper uses caulk' options is optional via 'shader_caulk' option in .game
This commit is contained in:
Garux 2017-08-02 09:24:32 +03:00
parent 471fca65b6
commit cba5583d23
15 changed files with 275 additions and 138 deletions

View File

@ -302,7 +302,7 @@ DPatch* DPatch::MergePatches( patch_merge_t merge_info, DPatch *p1, DPatch *p2 )
int newHeight = p1->height + p2->height - 1; int newHeight = p1->height + p2->height - 1;
if ( newHeight > MAX_PATCH_HEIGHT ) { if ( newHeight > MAX_PATCH_HEIGHT ) {
return false; return 0;
} }
DPatch* newPatch = new DPatch(); DPatch* newPatch = new DPatch();

View File

@ -26,7 +26,7 @@
#include "frame.h" #include "frame.h"
#if 0
class PanedState class PanedState
{ {
public: public:
@ -60,37 +60,44 @@ gboolean paned_position( GtkWidget* widget, gpointer dummy, PanedState* paned ){
PanedState g_hpaned = { 0.5f, -1, }; PanedState g_hpaned = { 0.5f, -1, };
PanedState g_vpaned1 = { 0.5f, -1, }; PanedState g_vpaned1 = { 0.5f, -1, };
PanedState g_vpaned2 = { 0.5f, -1, }; PanedState g_vpaned2 = { 0.5f, -1, };
#endif
GtkWidget* create_split_views( GtkWidget* topleft, GtkWidget* botleft, GtkWidget* topright, GtkWidget* botright, GtkWidget*& vsplit1, GtkWidget*& vsplit2 ){ GtkWidget* create_split_views( GtkWidget* topleft, GtkWidget* botleft, GtkWidget* topright, GtkWidget* botright, GtkWidget*& vsplit1, GtkWidget*& vsplit2 ){
GtkHPaned* hsplit = GTK_HPANED( gtk_hpaned_new() ); GtkHPaned* hsplit = GTK_HPANED( gtk_hpaned_new() );
gtk_widget_show( GTK_WIDGET( hsplit ) ); gtk_widget_show( GTK_WIDGET( hsplit ) );
g_signal_connect( G_OBJECT( hsplit ), "size_allocate", G_CALLBACK( hpaned_allocate ), &g_hpaned ); //g_signal_connect( G_OBJECT( hsplit ), "size_allocate", G_CALLBACK( hpaned_allocate ), &g_hpaned );
g_signal_connect( G_OBJECT( hsplit ), "notify::position", G_CALLBACK( paned_position ), &g_hpaned ); //g_signal_connect( G_OBJECT( hsplit ), "notify::position", G_CALLBACK( paned_position ), &g_hpaned );
{ {
GtkVPaned* vsplit = GTK_VPANED( gtk_vpaned_new() ); GtkVPaned* vsplit = GTK_VPANED( gtk_vpaned_new() );
vsplit1 = GTK_WIDGET( vsplit ); vsplit1 = GTK_WIDGET( vsplit );
gtk_paned_add1( GTK_PANED( hsplit ), GTK_WIDGET( vsplit ) ); //gtk_paned_add1( GTK_PANED( hsplit ), GTK_WIDGET( vsplit ) );
gtk_paned_pack1( GTK_PANED( hsplit ), GTK_WIDGET( vsplit ), TRUE, TRUE );
gtk_widget_show( GTK_WIDGET( vsplit ) ); gtk_widget_show( GTK_WIDGET( vsplit ) );
g_signal_connect( G_OBJECT( vsplit ), "size_allocate", G_CALLBACK( vpaned_allocate ), &g_vpaned1 ); //g_signal_connect( G_OBJECT( vsplit ), "size_allocate", G_CALLBACK( vpaned_allocate ), &g_vpaned1 );
g_signal_connect( G_OBJECT( vsplit ), "notify::position", G_CALLBACK( paned_position ), &g_vpaned1 ); //g_signal_connect( G_OBJECT( vsplit ), "notify::position", G_CALLBACK( paned_position ), &g_vpaned1 );
gtk_paned_add1( GTK_PANED( vsplit ), GTK_WIDGET( create_framed_widget( topleft ) ) ); //gtk_paned_add1( GTK_PANED( vsplit ), GTK_WIDGET( create_framed_widget( topleft ) ) );
gtk_paned_add2( GTK_PANED( vsplit ), GTK_WIDGET( create_framed_widget( botleft ) ) ); //gtk_paned_add2( GTK_PANED( vsplit ), GTK_WIDGET( create_framed_widget( botleft ) ) );
gtk_paned_pack1( GTK_PANED( vsplit ), GTK_WIDGET( create_framed_widget( topleft ) ), TRUE, TRUE );
gtk_paned_pack2( GTK_PANED( vsplit ), GTK_WIDGET( create_framed_widget( botleft ) ), TRUE, TRUE );
} }
{ {
GtkVPaned* vsplit = GTK_VPANED( gtk_vpaned_new() ); GtkVPaned* vsplit = GTK_VPANED( gtk_vpaned_new() );
vsplit2 = GTK_WIDGET( vsplit ); vsplit2 = GTK_WIDGET( vsplit );
gtk_paned_add2( GTK_PANED( hsplit ), GTK_WIDGET( vsplit ) ); //gtk_paned_add2( GTK_PANED( hsplit ), GTK_WIDGET( vsplit ) );
gtk_paned_pack2( GTK_PANED( hsplit ), GTK_WIDGET( vsplit ), TRUE, TRUE );
gtk_widget_show( GTK_WIDGET( vsplit ) ); gtk_widget_show( GTK_WIDGET( vsplit ) );
g_signal_connect( G_OBJECT( vsplit ), "size_allocate", G_CALLBACK( vpaned_allocate ), &g_vpaned2 ); //g_signal_connect( G_OBJECT( vsplit ), "size_allocate", G_CALLBACK( vpaned_allocate ), &g_vpaned2 );
g_signal_connect( G_OBJECT( vsplit ), "notify::position", G_CALLBACK( paned_position ), &g_vpaned2 ); //g_signal_connect( G_OBJECT( vsplit ), "notify::position", G_CALLBACK( paned_position ), &g_vpaned2 );
gtk_paned_add1( GTK_PANED( vsplit ), GTK_WIDGET( create_framed_widget( topright ) ) ); //gtk_paned_add1( GTK_PANED( vsplit ), GTK_WIDGET( create_framed_widget( topright ) ) );
gtk_paned_add2( GTK_PANED( vsplit ), GTK_WIDGET( create_framed_widget( botright ) ) ); //gtk_paned_add2( GTK_PANED( vsplit ), GTK_WIDGET( create_framed_widget( botright ) ) );
gtk_paned_pack1( GTK_PANED( vsplit ), GTK_WIDGET( create_framed_widget( topright ) ), TRUE, TRUE );
gtk_paned_pack2( GTK_PANED( vsplit ), GTK_WIDGET( create_framed_widget( botright ) ), TRUE, TRUE );
} }
return GTK_WIDGET( hsplit ); return GTK_WIDGET( hsplit );
} }

View File

@ -23,7 +23,6 @@
#define INCLUDED_GTKUTIL_PANED_H #define INCLUDED_GTKUTIL_PANED_H
typedef struct _GtkWidget GtkWidget; typedef struct _GtkWidget GtkWidget;
typedef struct _GtkHPaned GtkHPaned;
GtkWidget* create_split_views( GtkWidget* topleft, GtkWidget* botleft, GtkWidget* topright, GtkWidget* botright, GtkWidget*& vsplit1, GtkWidget*& vsplit2 ); GtkWidget* create_split_views( GtkWidget* topleft, GtkWidget* botleft, GtkWidget* topright, GtkWidget* botright, GtkWidget*& vsplit1, GtkWidget*& vsplit2 );
#endif #endif

View File

@ -149,7 +149,7 @@ struct camera_t
guint m_keymove_handler; guint m_keymove_handler;
float fieldOfView; static float fieldOfView;
DeferredMotionDelta m_mouseMove; DeferredMotionDelta m_mouseMove;
@ -171,13 +171,13 @@ struct camera_t
color( 0, 0, 0 ), color( 0, 0, 0 ),
movementflags( 0 ), movementflags( 0 ),
m_keymove_handler( 0 ), m_keymove_handler( 0 ),
fieldOfView( 110.0f ),
m_mouseMove( motionDelta, this ), m_mouseMove( motionDelta, this ),
m_view( view ), m_view( view ),
m_update( update ){ m_update( update ){
} }
}; };
float camera_t::fieldOfView = 110.0f;
camera_draw_mode camera_t::draw_mode = cd_texture; camera_draw_mode camera_t::draw_mode = cd_texture;
inline Matrix4 projection_for_camera( float near_z, float far_z, float fieldOfView, int width, int height ){ inline Matrix4 projection_for_camera( float near_z, float far_z, float fieldOfView, int width, int height ){
@ -200,7 +200,7 @@ float Camera_getFarClipPlane( camera_t& camera ){
void Camera_updateProjection( camera_t& camera ){ void Camera_updateProjection( camera_t& camera ){
float farClip = Camera_getFarClipPlane( 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, camera_t::fieldOfView, camera.width, camera.height );
camera.m_view->Construct( camera.projection, camera.modelview, camera.width, camera.height ); camera.m_view->Construct( camera.projection, camera.modelview, camera.width, camera.height );
} }
@ -703,6 +703,7 @@ XORRectangle m_XORRectangle;
DeferredDraw m_deferredDraw; DeferredDraw m_deferredDraw;
DeferredMotion m_deferred_motion; DeferredMotion m_deferred_motion;
DeferredMotion m_deferred_motion_freemove;
guint m_selection_button_press_handler; guint m_selection_button_press_handler;
guint m_selection_button_release_handler; guint m_selection_button_release_handler;
@ -937,11 +938,17 @@ gboolean selection_button_release_freemove( GtkWidget* widget, GdkEventButton* e
} }
return FALSE; return FALSE;
} }
#if 0
gboolean selection_motion_freemove( GtkWidget *widget, GdkEventMotion *event, WindowObserver* observer ){ gboolean selection_motion_freemove( GtkWidget *widget, GdkEventMotion *event, WindowObserver* observer ){
observer->onMouseMotion( windowvector_for_widget_centre( widget ), modifiers_for_state( event->state ) ); observer->onMouseMotion( windowvector_for_widget_centre( widget ), modifiers_for_state( event->state ) );
return FALSE; return FALSE;
} }
#endif
void selection_motion_freemove( gdouble x, gdouble y, guint state, void* data ){
//globalOutputStream() << "motion... ";
CamWnd* camwnd = reinterpret_cast<CamWnd*>( data );
camwnd->m_window_observer->onMouseMotion( windowvector_for_widget_centre( camwnd->m_gl_widget ), modifiers_for_state( state ) );
}
gboolean wheelmove_scroll( GtkWidget* widget, GdkEventScroll* event, CamWnd* camwnd ){ gboolean wheelmove_scroll( GtkWidget* widget, GdkEventScroll* event, CamWnd* camwnd ){
//gtk_window_set_focus( camwnd->m_parent, camwnd->m_gl_widget ); //gtk_window_set_focus( camwnd->m_parent, camwnd->m_gl_widget );
@ -1234,7 +1241,8 @@ void CamWnd_Remove_Handlers_Move( CamWnd& camwnd ){
void CamWnd_Add_Handlers_FreeMove( 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_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_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_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_motion_handler = g_signal_connect( G_OBJECT( camwnd.m_gl_widget ), "motion_notify_event", G_CALLBACK( DeferredMotion::gtk_motion ), &camwnd.m_deferred_motion_freemove );
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 = g_signal_connect( G_OBJECT( camwnd.m_gl_widget ), "button_press_event", G_CALLBACK( disable_freelook_button_press ), &camwnd );
@ -1286,6 +1294,7 @@ CamWnd::CamWnd() :
m_XORRectangle( m_gl_widget ), 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_deferred_motion( selection_motion, m_window_observer ),
m_deferred_motion_freemove( selection_motion_freemove, this ),
m_selection_button_press_handler( 0 ), m_selection_button_press_handler( 0 ),
m_selection_button_release_handler( 0 ), m_selection_button_release_handler( 0 ),
m_selection_motion_handler( 0 ), m_selection_motion_handler( 0 ),
@ -1989,6 +1998,14 @@ void RenderModeExport( const IntImportCallback& importer ){
} }
typedef FreeCaller1<const IntImportCallback&, RenderModeExport> RenderModeExportCaller; typedef FreeCaller1<const IntImportCallback&, RenderModeExport> RenderModeExportCaller;
void fieldOfViewImport( float value ){
camera_t::fieldOfView = value;
if( g_camwnd ){
Camera_updateProjection( g_camwnd->getCamera() );
}
}
typedef FreeCaller1<float, fieldOfViewImport> fieldOfViewImportCaller;
void Camera_constructPreferences( PreferencesPage& page ){ 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.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.appendCheckBox( "", "Link strafe speed to movement speed", g_camwindow_globals_private.m_bCamLinkSpeed );
@ -2035,6 +2052,11 @@ void Camera_constructPreferences( PreferencesPage& page ){
g_camwindow_globals_private.m_nStrafeMode, g_camwindow_globals_private.m_nStrafeMode,
STRING_ARRAY_RANGE( strafe_mode ) STRING_ARRAY_RANGE( strafe_mode )
); );
page.appendSpinner( "Field Of View", 110.0, 1.0, 175.0,
FloatImportCallback( fieldOfViewImportCaller() ),
FloatExportCallback( FloatExportCaller( camera_t::fieldOfView ) )
);
} }
void Camera_constructPage( PreferenceGroup& group ){ void Camera_constructPage( PreferenceGroup& group ){
PreferencesPage page( group.createPage( "Camera", "Camera View Preferences" ) ); PreferencesPage page( group.createPage( "Camera", "Camera View Preferences" ) );
@ -2133,6 +2155,7 @@ void CamWnd_Construct(){
GlobalPreferenceSystem().registerPreference( "CameraRenderMode", makeIntStringImportCallback( RenderModeImportCaller() ), makeIntStringExportCallback( RenderModeExportCaller() ) ); GlobalPreferenceSystem().registerPreference( "CameraRenderMode", makeIntStringImportCallback( RenderModeImportCaller() ), makeIntStringExportCallback( RenderModeExportCaller() ) );
GlobalPreferenceSystem().registerPreference( "StrafeMode", IntImportStringCaller( g_camwindow_globals_private.m_nStrafeMode ), IntExportStringCaller( g_camwindow_globals_private.m_nStrafeMode ) ); GlobalPreferenceSystem().registerPreference( "StrafeMode", IntImportStringCaller( g_camwindow_globals_private.m_nStrafeMode ), IntExportStringCaller( g_camwindow_globals_private.m_nStrafeMode ) );
GlobalPreferenceSystem().registerPreference( "3DZoomInToPointer", BoolImportStringCaller( g_camwindow_globals.m_bZoomInToPointer ), BoolExportStringCaller( g_camwindow_globals.m_bZoomInToPointer ) ); GlobalPreferenceSystem().registerPreference( "3DZoomInToPointer", BoolImportStringCaller( g_camwindow_globals.m_bZoomInToPointer ), BoolExportStringCaller( g_camwindow_globals.m_bZoomInToPointer ) );
GlobalPreferenceSystem().registerPreference( "fieldOfView", FloatImportStringCaller( camera_t::fieldOfView ), FloatExportStringCaller( camera_t::fieldOfView ) );
CamWnd_constructStatic(); CamWnd_constructStatic();

View File

@ -59,6 +59,7 @@ void Face_extrude( Face& face, const Brush& brush, brush_vector_t& out, float of
*/ */
#include "preferences.h" #include "preferences.h"
#include "texwindow.h" #include "texwindow.h"
#include "filterbar.h"
typedef std::vector<DoubleVector3> doublevector_vector_t; typedef std::vector<DoubleVector3> doublevector_vector_t;
@ -71,14 +72,6 @@ enum eHollowType
room = 4, room = 4,
}; };
const char* getCaulkShader(){
const char* gotShader = g_pGameDescription->getKeyValue( "shader_caulk" );
if ( gotShader && *gotShader ){
return gotShader;
}
return "textures/common/caulk";
}
class CaulkFace class CaulkFace
{ {
DoubleVector3 ExclusionAxis; DoubleVector3 ExclusionAxis;
@ -104,7 +97,7 @@ void operator()( Face& face ) const {
} }
} }
} }
face.SetShader( getCaulkShader() ); face.SetShader( GetCaulkShader() );
} }
} }
}; };
@ -177,12 +170,12 @@ void operator()( Face& face ) const {
face.undoSave(); face.undoSave();
out.push_back( new Brush( brush ) ); out.push_back( new Brush( brush ) );
if( !RemoveInner && caulk ) if( !RemoveInner && caulk )
face.SetShader( getCaulkShader() ); face.SetShader( GetCaulkShader() );
Face* newFace = out.back()->addFace( face ); Face* newFace = out.back()->addFace( face );
face.getPlane().offset( -offset ); face.getPlane().offset( -offset );
face.planeChanged(); face.planeChanged();
if( caulk ) if( caulk )
face.SetShader( getCaulkShader() ); face.SetShader( GetCaulkShader() );
if ( newFace != 0 ) { if ( newFace != 0 ) {
newFace->flipWinding(); newFace->flipWinding();
newFace->getPlane().offset( offset ); newFace->getPlane().offset( offset );
@ -203,7 +196,7 @@ void operator()( Face& face ) const {
} }
if( !RemoveInner && caulk ) if( !RemoveInner && caulk )
face.SetShader( getCaulkShader() ); face.SetShader( GetCaulkShader() );
newFace = out.back()->addFace( face ); newFace = out.back()->addFace( face );
if ( newFace != 0 ) { if ( newFace != 0 ) {
newFace->flipWinding(); newFace->flipWinding();
@ -233,7 +226,7 @@ void operator()( Face& face ) const {
if ( newFace != 0 ) { if ( newFace != 0 ) {
if( !RemoveInner && caulk ) if( !RemoveInner && caulk )
newFace->SetShader( getCaulkShader() ); newFace->SetShader( GetCaulkShader() );
newFace->flipWinding(); newFace->flipWinding();
newFace->getPlane().offset( offset ); newFace->getPlane().offset( offset );
newFace->planeChanged(); newFace->planeChanged();
@ -259,7 +252,7 @@ void operator()( Face& face ) const {
} }
} }
} }
out.back()->addPlane( winding[next].vertex, winding[index].vertex, BestPoint, caulk? getCaulkShader() : TextureBrowser_GetSelectedShader( GlobalTextureBrowser() ), projection ); out.back()->addPlane( winding[next].vertex, winding[index].vertex, BestPoint, caulk? GetCaulkShader() : TextureBrowser_GetSelectedShader( GlobalTextureBrowser() ), projection );
} }
} }
} }

View File

@ -288,6 +288,8 @@ AABB Doom3Light_getBounds( const AABB& workzone ){
return AABB( Vector3( 0, 0, 0 ), Vector3( 64, 64, 64 ) ); return AABB( Vector3( 0, 0, 0 ), Vector3( 64, 64, 64 ) );
} }
#include "filterbar.h"
int g_iLastLightIntensity; int g_iLastLightIntensity;
void Entity_createFromSelection( const char* name, const Vector3& origin ){ void Entity_createFromSelection( const char* name, const Vector3& origin ){
@ -307,16 +309,10 @@ void Entity_createFromSelection( const char* name, const Vector3& origin ){
bool brushesSelected = Scene_countSelectedBrushes( GlobalSceneGraph() ) != 0; bool brushesSelected = Scene_countSelectedBrushes( GlobalSceneGraph() ) != 0;
//is important to have retexturing here; if doing in the end, undo doesn't succeed; //is important to have retexturing here; if doing in the end, undo doesn't succeed;
if ( string_compare_nocase_n( name, "trigger_", 8 ) == 0 && brushesSelected ){ if ( string_compare_nocase_n( name, "trigger_", 8 ) == 0 && brushesSelected && !entityClass->fixedsize ){
const char* shader = g_pGameDescription->getKeyValue( "shader_trigger" ); //const char* shader = GetCommonShader( "trigger" ).c_str();
if ( shader && *shader ){ Scene_PatchSetShader_Selected( GlobalSceneGraph(), GetCommonShader( "trigger" ).c_str() );
Scene_PatchSetShader_Selected( GlobalSceneGraph(), shader ); Scene_BrushSetShader_Selected( GlobalSceneGraph(), GetCommonShader( "trigger" ).c_str() );
Scene_BrushSetShader_Selected( GlobalSceneGraph(), shader );
}
else{
Scene_PatchSetShader_Selected( GlobalSceneGraph(), "textures/common/trigger" );
Scene_BrushSetShader_Selected( GlobalSceneGraph(), "textures/common/trigger" );
}
} }
if ( !( entityClass->fixedsize || isModel ) && !brushesSelected ) { if ( !( entityClass->fixedsize || isModel ) && !brushesSelected ) {

View File

@ -920,10 +920,17 @@ void SetComment( EntityClass* eclass ){
gtk_text_buffer_apply_tag_by_name( buffer, "bold", &iter_start, &iter_end ); gtk_text_buffer_apply_tag_by_name( buffer, "bold", &iter_start, &iter_end );
} }
if( *c == ' ' ) if( *c == ' ' ){
++spaces; if( offset - pattern_start == 1 ){
else pattern_start = offset;
}
else{
++spaces;
}
}
else{
pattern_start = -1; pattern_start = -1;
}
} }
} }
} }
@ -1250,11 +1257,15 @@ void EntityInspector_clearKeyValue(){
} }
} }
static gint EntityInspector_clearKeyValueKB( GtkEntry* widget, GdkEventKey* event, gpointer data ){ static gint EntityProperties_keypress( GtkEntry* widget, GdkEventKey* event, gpointer data ){
if ( event->keyval == GDK_Delete ) { if ( event->keyval == GDK_Delete ) {
EntityInspector_clearKeyValue(); EntityInspector_clearKeyValue();
return TRUE; return TRUE;
} }
if ( event->keyval == GDK_Tab ) {
gtk_window_set_focus( GTK_WINDOW( gtk_widget_get_toplevel( GTK_WIDGET( widget ) ) ), GTK_WIDGET( g_entityKeyEntry ) );
return TRUE;
}
return FALSE; return FALSE;
} }
@ -1560,7 +1571,7 @@ GtkWidget* EntityInspector_constructWindow( GtkWindow* toplevel ){
GtkWidget* view = gtk_tree_view_new_with_model( GTK_TREE_MODEL( store ) ); GtkWidget* view = gtk_tree_view_new_with_model( GTK_TREE_MODEL( store ) );
gtk_tree_view_set_enable_search( GTK_TREE_VIEW( view ), FALSE ); gtk_tree_view_set_enable_search( GTK_TREE_VIEW( view ), FALSE );
gtk_tree_view_set_headers_visible( GTK_TREE_VIEW( view ), FALSE ); gtk_tree_view_set_headers_visible( GTK_TREE_VIEW( view ), FALSE );
g_signal_connect( G_OBJECT( view ), "key_press_event", G_CALLBACK( EntityInspector_clearKeyValueKB ), 0 ); g_signal_connect( G_OBJECT( view ), "key_press_event", G_CALLBACK( EntityProperties_keypress ), 0 );
{ {
GtkCellRenderer* renderer = gtk_cell_renderer_text_new(); GtkCellRenderer* renderer = gtk_cell_renderer_text_new();

View File

@ -23,17 +23,38 @@ gboolean ToggleActions0( GtkWidget *widget, GdkEvent *event, gpointer user_data
//globalOutputStream() << "ToggleActions\n"; //globalOutputStream() << "ToggleActions\n";
} }
void SetCommonShader( const char* key, const char* shader ){ CopiedString GetCommonShader( const char* name ){
const char* gotShader = g_pGameDescription->getKeyValue( key ); StringOutputStream sstream( 128 );
UndoableCommand undo( "textureNameSetSelected" ); sstream << "shader_" << name;
if ( gotShader && *gotShader ){ const char* gotShader = g_pGameDescription->getKeyValue( sstream.c_str() );
Select_SetShader( gotShader ); if( !string_empty( gotShader ) ){
return gotShader;
} }
else{ else{
Select_SetShader( shader ); sstream.clear();
if( string_empty( g_pGameDescription->getKeyValue( "show_wads" ) ) ){
sstream << "textures/common/" << name;
}
else{
sstream << "textures/" << name;
}
return sstream.c_str();
} }
} }
void SetCommonShader( const char* name ){
UndoableCommand undo( "textureNameSetSelected" );
Select_SetShader( GetCommonShader( name ).c_str() );
}
const char* g_caulk_shader = 0;
const char* GetCaulkShader(){
if( !g_caulk_shader ){
g_caulk_shader = strdup( GetCommonShader( "caulk" ).c_str() );
}
return g_caulk_shader;
}
gboolean Areaportals_button_press( GtkWidget *widget, GdkEventButton *event, gpointer data ){ gboolean Areaportals_button_press( GtkWidget *widget, GdkEventButton *event, gpointer data ){
if ( event->button == 3 && event->type == GDK_BUTTON_PRESS ) { if ( event->button == 3 && event->type == GDK_BUTTON_PRESS ) {
@ -45,13 +66,11 @@ gboolean Areaportals_button_press( GtkWidget *widget, GdkEventButton *event, gpo
ButtonNum = 1; ButtonNum = 1;
} }
if( ToggleActions == 0 ){ if( ToggleActions == 0 ){
SetCommonShader( "shader_nodraw", "textures/common/nodraw" ); SetCommonShader( "nodraw" );
} }
else if( ToggleActions == 1 ){ else if( ToggleActions == 1 ){
SetCommonShader( "shader_nodrawnonsolid", "textures/common/nodrawnonsolid" ); SetCommonShader( "nodrawnonsolid" );
} }
//SetCommonShader( "shader_caulk", "textures/common/caulk" );
//globalOutputStream() << "Found '" << "fullname" << "'\n";
ToggleActions++; ToggleActions++;
return TRUE; return TRUE;
} }
@ -61,7 +80,7 @@ gboolean Areaportals_button_press( GtkWidget *widget, GdkEventButton *event, gpo
gboolean Caulk_button_press( GtkWidget *widget, GdkEventButton *event, gpointer data ){ gboolean Caulk_button_press( GtkWidget *widget, GdkEventButton *event, gpointer data ){
if ( event->button == 3 && event->type == GDK_BUTTON_PRESS ) { if ( event->button == 3 && event->type == GDK_BUTTON_PRESS ) {
SetCommonShader( "shader_caulk", "textures/common/caulk" ); SetCommonShader( "caulk" );
ToggleActions = 0; ToggleActions = 0;
return TRUE; return TRUE;
} }
@ -78,10 +97,10 @@ gboolean Clip_button_press( GtkWidget *widget, GdkEventButton *event, gpointer d
ButtonNum = 3; ButtonNum = 3;
} }
if( ToggleActions == 0 ){ if( ToggleActions == 0 ){
SetCommonShader( "shader_clip", "textures/common/clip" ); SetCommonShader( "clip" );
} }
else if( ToggleActions == 1 ){ else if( ToggleActions == 1 ){
SetCommonShader( "shader_weapclip", "textures/common/weapclip" ); SetCommonShader( "weapclip" );
} }
ToggleActions++; ToggleActions++;
return TRUE; return TRUE;
@ -99,13 +118,13 @@ gboolean Liquids_button_press( GtkWidget *widget, GdkEventButton *event, gpointe
ButtonNum = 4; ButtonNum = 4;
} }
if( ToggleActions == 0 ){ if( ToggleActions == 0 ){
SetCommonShader( "shader_watercaulk", "textures/common/watercaulk" ); SetCommonShader( "watercaulk" );
} }
else if( ToggleActions == 1 ){ else if( ToggleActions == 1 ){
SetCommonShader( "shader_lavacaulk", "textures/common/lavacaulk" ); SetCommonShader( "lavacaulk" );
} }
else if( ToggleActions == 2 ){ else if( ToggleActions == 2 ){
SetCommonShader( "shader_slimecaulk", "textures/common/slimecaulk" ); SetCommonShader( "slimecaulk" );
} }
ToggleActions++; ToggleActions++;
return TRUE; return TRUE;
@ -124,13 +143,13 @@ gboolean Hint_button_press( GtkWidget *widget, GdkEventButton *event, gpointer d
ButtonNum = 5; ButtonNum = 5;
} }
if( ToggleActions == 0 ){ if( ToggleActions == 0 ){
SetCommonShader( "shader_hint", "textures/common/hint" ); SetCommonShader( "hint" );
} }
else if( ToggleActions == 1 ){ else if( ToggleActions == 1 ){
SetCommonShader( "shader_hintlocal", "textures/common/hintlocal" ); SetCommonShader( "hintlocal" );
} }
else if( ToggleActions == 2 ){ else if( ToggleActions == 2 ){
SetCommonShader( "shader_hintskip", "textures/common/hintskip" ); SetCommonShader( "hintskip" );
} }
ToggleActions++; ToggleActions++;
return TRUE; return TRUE;
@ -140,7 +159,7 @@ gboolean Hint_button_press( GtkWidget *widget, GdkEventButton *event, gpointer d
gboolean Trigger_button_press( GtkWidget *widget, GdkEventButton *event, gpointer data ){ gboolean Trigger_button_press( GtkWidget *widget, GdkEventButton *event, gpointer data ){
if ( event->button == 3 && event->type == GDK_BUTTON_PRESS ) { if ( event->button == 3 && event->type == GDK_BUTTON_PRESS ) {
SetCommonShader( "shader_trigger", "textures/common/trigger" ); SetCommonShader( "trigger" );
ToggleActions = 0; ToggleActions = 0;
return TRUE; return TRUE;
} }

View File

@ -1,16 +1,19 @@
#if !defined( INCLUDED_FILTERBAR_H ) #if !defined( INCLUDED_FILTERBAR_H )
#define INCLUDED_FILTERBAR_H #define INCLUDED_FILTERBAR_H
#include <gtk/gtktoolbar.h>
//#include "string/string.h"
#include "string/stringfwd.h"
typedef struct _GtkToolbar GtkToolbar;
GtkToolbar* create_filter_toolbar(); GtkToolbar* create_filter_toolbar();
CopiedString GetCommonShader( const char* name );
const char* GetCaulkShader();
#endif #endif

View File

@ -1692,6 +1692,10 @@ WaitDialog create_wait_dialog( const char* title, const char* text ){
gtk_container_set_border_width( GTK_CONTAINER( dialog.m_window ), 0 ); gtk_container_set_border_width( GTK_CONTAINER( dialog.m_window ), 0 );
gtk_window_set_position( dialog.m_window, GTK_WIN_POS_CENTER_ON_PARENT ); gtk_window_set_position( dialog.m_window, GTK_WIN_POS_CENTER_ON_PARENT );
gtk_window_set_accept_focus( dialog.m_window, FALSE );
gtk_window_set_focus_on_map( dialog.m_window, FALSE );
g_signal_connect( G_OBJECT( dialog.m_window ), "realize", G_CALLBACK( window_realize_remove_decoration ), 0 ); g_signal_connect( G_OBJECT( dialog.m_window ), "realize", G_CALLBACK( window_realize_remove_decoration ), 0 );
{ {
@ -1760,7 +1764,10 @@ void ScreenUpdates_Disable( const char* message, const char* title ){
bool isActiveApp = MainFrame_isActiveApp(); bool isActiveApp = MainFrame_isActiveApp();
g_wait = create_wait_dialog( title, message ); g_wait = create_wait_dialog( title, message );
gtk_grab_add( GTK_WIDGET( g_wait.m_window ) ); if( !XYWnd::m_mnuDrop || gtk_widget_get_visible( GTK_WIDGET( XYWnd::m_mnuDrop ) ) != TRUE ){
gtk_grab_add( GTK_WIDGET( g_wait.m_window ) );
//globalOutputStream() << "grab grab grab\n";
}
if ( isActiveApp ) { if ( isActiveApp ) {
gtk_widget_show( GTK_WIDGET( g_wait.m_window ) ); gtk_widget_show( GTK_WIDGET( g_wait.m_window ) );

View File

@ -96,8 +96,10 @@ bool shown() const {
void show( bool show ){ void show( bool show ){
if ( show && !shown() ) { if ( show && !shown() ) {
Pointfile_Parse( *this ); Pointfile_Parse( *this );
GenerateDisplayList(); if( s_num_points > 0 ){
SceneChangeNotify(); GenerateDisplayList();
SceneChangeNotify();
}
} }
else if ( !show && shown() ) { else if ( !show && shown() ) {
glDeleteLists( m_displaylist, 1 ); glDeleteLists( m_displaylist, 1 );

View File

@ -514,6 +514,17 @@ void Transform( const Matrix4& manip2object, const Matrix4& device2manip, const
start[i] = GetSnapGridSize(); start[i] = GetSnapGridSize();
} }
} }
std::size_t ignore_axis = 0;
if( snap ){
for ( std::size_t i = 1; i < 3 ; ++i ){
if( fabs( m_start[i] ) < fabs( m_start[ignore_axis] ) ){
ignore_axis = i;
}
}
start[ignore_axis] = 0.f;
}
Vector3 scale( Vector3 scale(
start[0] == 0 ? 1 : 1 + delta[0] / start[0], start[0] == 0 ? 1 : 1 + delta[0] / start[0],
start[1] == 0 ? 1 : 1 + delta[1] / start[1], start[1] == 0 ? 1 : 1 + delta[1] / start[1],
@ -522,9 +533,9 @@ void Transform( const Matrix4& manip2object, const Matrix4& device2manip, const
//globalOutputStream() << "m_start: " << m_start << " start: " << start << " delta: " << delta <<"\n"; //globalOutputStream() << "m_start: " << m_start << " start: " << start << " delta: " << delta <<"\n";
for( std::size_t i = 0; i < 3; i++ ){ for( std::size_t i = 0; i < 3; i++ ){
if( m_choosen_extent[i] > 0.0625f ){ if( m_choosen_extent[i] > 0.0625f && start[i] != 0.f ){
scale[i] = ( m_choosen_extent[i] + delta[i] ) / m_choosen_extent[i]; scale[i] = ( m_choosen_extent[i] + delta[i] ) / m_choosen_extent[i];
if( snapbbox && start[i] != 0.f ){ if( snapbbox ){
float snappdwidth = float_snapped( scale[i] * m_bounds.extents[i] * 2.f, GetSnapGridSize() ); float snappdwidth = float_snapped( scale[i] * m_bounds.extents[i] * 2.f, GetSnapGridSize() );
scale[i] = snappdwidth / ( m_bounds.extents[i] * 2.f ); scale[i] = snappdwidth / ( m_bounds.extents[i] * 2.f );
} }
@ -532,16 +543,15 @@ void Transform( const Matrix4& manip2object, const Matrix4& device2manip, const
} }
//globalOutputStream() << "pre snap scale: " << scale <<"\n"; //globalOutputStream() << "pre snap scale: " << scale <<"\n";
if( snap ){ if( snap ){
float bestscale = scale[0]; float bestscale = ignore_axis != 0 ? scale[0] : scale[1];
for( std::size_t i = 1; i < 3; i++ ){ for( std::size_t i = ignore_axis != 0 ? 1 : 2; i < 3; i++ ){
//if( fabs( 1.0f - fabs( scale[i] ) ) > fabs( 1.0f - fabs( bestscale ) ) ){ if( ignore_axis != i && fabs( scale[i] ) < fabs( bestscale ) ){
if( fabs( scale[i] ) > fabs( bestscale ) && scale[i] != 1.0f ){ //harder to scale down with this, but glitchier with upper one
bestscale = scale[i]; bestscale = scale[i];
} }
//globalOutputStream() << "bestscale: " << bestscale <<"\n"; //globalOutputStream() << "bestscale: " << bestscale <<"\n";
} }
for( std::size_t i = 0; i < 3; i++ ){ for( std::size_t i = 0; i < 3; i++ ){
if( start[i] != 0.0f ){ // !!!!check grid == 0 case if( ignore_axis != i ){
scale[i] = ( scale[i] < 0.0f ) ? -fabs( bestscale ) : fabs( bestscale ); scale[i] = ( scale[i] < 0.0f ) ? -fabs( bestscale ) : fabs( bestscale );
} }
} }
@ -2638,7 +2648,7 @@ std::list<Selectable*>& best(){
} }
}; };
bool g_bAltDragManipulatorResize = false; //+select primitives in component modes bool g_bAltResize_AltSelect = false; //AltDragManipulatorResize + select primitives in component modes
bool g_bTmpComponentMode = false; bool g_bTmpComponentMode = false;
class DragManipulator : public Manipulator class DragManipulator : public Manipulator
@ -2670,7 +2680,7 @@ void testSelect( const View& view, const Matrix4& pivot2world ){
Scene_TestSelect_Primitive( booleanSelector, test, view ); Scene_TestSelect_Primitive( booleanSelector, test, view );
if ( booleanSelector.isSelected() ) { if ( booleanSelector.isSelected() ) {
if( g_bAltDragManipulatorResize ){ if( g_bAltResize_AltSelect ){
DeepBestSelector deepSelector; DeepBestSelector deepSelector;
Scene_TestSelect_Component_Selected( deepSelector, test, view, SelectionSystem::eVertex ); Scene_TestSelect_Component_Selected( deepSelector, test, view, SelectionSystem::eVertex );
for ( std::list<Selectable*>::iterator i = deepSelector.best().begin(); i != deepSelector.best().end(); ++i ) for ( std::list<Selectable*>::iterator i = deepSelector.best().begin(); i != deepSelector.best().end(); ++i )
@ -2695,7 +2705,7 @@ void testSelect( const View& view, const Matrix4& pivot2world ){
} }
else else
{ {
if( g_bAltDragManipulatorResize ){ if( g_bAltResize_AltSelect ){
Scene_forEachBrushPlane_selectVertices( GlobalSceneGraph(), test ); Scene_forEachBrushPlane_selectVertices( GlobalSceneGraph(), test );
m_selected = true; m_selected = true;
} }
@ -3157,7 +3167,7 @@ void SelectPoint( const View& view, const float device_point[2], const float dev
Scene_TestSelect_Component( selector, volume, scissored, eFace ); Scene_TestSelect_Component( selector, volume, scissored, eFace );
} }
else{ else{
Scene_TestSelect( selector, volume, scissored, g_bAltDragManipulatorResize ? ePrimitive : Mode(), ComponentMode() ); Scene_TestSelect( selector, volume, scissored, g_bAltResize_AltSelect ? ePrimitive : Mode(), ComponentMode() );
} }
if ( !selector.failed() ) { if ( !selector.failed() ) {
@ -3220,7 +3230,7 @@ void SelectPoint( const View& view, const float device_point[2], const float dev
++i; ++i;
while ( i != selector.end() ) while ( i != selector.end() )
{ {
if( ( *i ).first.equalEpsilon( ( *best ).first, 0.25f, 0.000001f ) ){ if( ( *i ).first.equalEpsilon( ( *best ).first, Mode() == eComponent ? 0.25f : 0.000001f, 0.000001f ) ){
if( !( *i ).second->isSelected() ){ if( !( *i ).second->isSelected() ){
( *i ).second->setSelected( true ); ( *i ).second->setSelected( true );
} }
@ -3242,7 +3252,7 @@ void SelectPoint( const View& view, const float device_point[2], const float dev
++i; ++i;
while ( i != selector.end() ) while ( i != selector.end() )
{ {
if( ( *i ).first.equalEpsilon( ( *best ).first, 0.25f, 0.000001f ) ){ if( ( *i ).first.equalEpsilon( ( *best ).first, Mode() == eComponent ? 0.25f : 0.000001f, 0.000001f ) ){
if( ( *i ).second->isSelected() ){ if( ( *i ).second->isSelected() ){
( *i ).second->setSelected( false ); ( *i ).second->setSelected( false );
} }
@ -3306,7 +3316,7 @@ bool SelectPoint_InitPaint( const View& view, const float device_point[2], const
Scene_TestSelect_Component( selector, volume, scissored, eFace ); Scene_TestSelect_Component( selector, volume, scissored, eFace );
} }
else{ else{
Scene_TestSelect( selector, volume, scissored, g_bAltDragManipulatorResize ? ePrimitive : Mode(), ComponentMode() ); Scene_TestSelect( selector, volume, scissored, g_bAltResize_AltSelect ? ePrimitive : Mode(), ComponentMode() );
} }
if ( !selector.failed() ){ if ( !selector.failed() ){
SelectableSortedSet::iterator best = selector.begin(); SelectableSortedSet::iterator best = selector.begin();
@ -3316,7 +3326,7 @@ bool SelectPoint_InitPaint( const View& view, const float device_point[2], const
++i; ++i;
while ( i != selector.end() ) while ( i != selector.end() )
{ {
if( ( *i ).first.equalEpsilon( ( *best ).first, 0.25f, 0.000001f ) ){ if( ( *i ).first.equalEpsilon( ( *best ).first, Mode() == eComponent ? 0.25f : 0.000001f, 0.000001f ) ){
( *i ).second->setSelected( !wasSelected ); ( *i ).second->setSelected( !wasSelected );
} }
else{ else{
@ -3680,7 +3690,7 @@ void RadiantSelectionSystem::endMove(){
if ( Mode() == ePrimitive ) { if ( Mode() == ePrimitive ) {
if ( ManipulatorMode() == eDrag ) { if ( ManipulatorMode() == eDrag ) {
g_bTmpComponentMode = false; g_bTmpComponentMode = false;
if( g_bAltDragManipulatorResize ){ if( g_bAltResize_AltSelect ){
Scene_SelectAll_Component( false, SelectionSystem::eVertex ); Scene_SelectAll_Component( false, SelectionSystem::eVertex );
} }
else{ else{
@ -4286,7 +4296,7 @@ void onMouseDown( const WindowVector& position, ButtonIdentifier button, Modifie
//m_selector.m_mouseMoved = false; //m_selector.m_mouseMoved = false;
DeviceVector devicePosition( window_to_normalised_device( position, m_width, m_height ) ); DeviceVector devicePosition( window_to_normalised_device( position, m_width, m_height ) );
g_bAltDragManipulatorResize = ( modifiers == c_modifierAlt ) ? true : false; g_bAltResize_AltSelect = ( modifiers == c_modifierAlt ) ? true : false;
if ( ( modifiers == c_modifier_manipulator || ( modifiers == c_modifierAlt && getSelectionSystem().Mode() != SelectionSystem::eComponent ) ) && m_manipulator.mouseDown( devicePosition ) ) { if ( ( modifiers == c_modifier_manipulator || ( modifiers == c_modifierAlt && getSelectionSystem().Mode() != SelectionSystem::eComponent ) ) && m_manipulator.mouseDown( devicePosition ) ) {
g_mouseMovedCallback.insert( MouseEventCallback( Manipulator_::MouseMovedCaller( m_manipulator ) ) ); g_mouseMovedCallback.insert( MouseEventCallback( Manipulator_::MouseMovedCaller( m_manipulator ) ) );
g_mouseUpCallback.insert( MouseEventCallback( Manipulator_::MouseUpCaller( m_manipulator ) ) ); g_mouseUpCallback.insert( MouseEventCallback( Manipulator_::MouseUpCaller( m_manipulator ) ) );

View File

@ -728,7 +728,7 @@ void Textures_constructPreferences( PreferencesPage& page ){
"Texture Gamma", "Texture Gamma",
1.0, 1.0,
0.0, 0.0,
1.0, 5.0,
FloatImportCallback( TextureGammaImportCaller( g_texture_globals.fGamma ) ), FloatImportCallback( TextureGammaImportCaller( g_texture_globals.fGamma ) ),
FloatExportCallback( FloatExportCaller( g_texture_globals.fGamma ) ) FloatExportCallback( FloatExportCaller( g_texture_globals.fGamma ) )
); );

View File

@ -393,13 +393,14 @@ void TextureBrowser_SetSelectedShader( TextureBrowser& textureBrowser, const cha
} }
// disable the menu item "shader info" if no shader was selected // disable the menu item "shader info" if no shader was selected
if ( textureBrowser.m_shader_info_item == NULL ){
return;
}
IShader* ishader = QERApp_Shader_ForName( shader ); IShader* ishader = QERApp_Shader_ForName( shader );
CopiedString filename = ishader->getShaderFileName(); CopiedString filename = ishader->getShaderFileName();
if ( filename.empty() ) { if ( filename.empty() ) {
if ( textureBrowser.m_shader_info_item != NULL ) { gtk_widget_set_sensitive( textureBrowser.m_shader_info_item, FALSE );
gtk_widget_set_sensitive( textureBrowser.m_shader_info_item, FALSE );
}
} }
else { else {
gtk_widget_set_sensitive( textureBrowser.m_shader_info_item, TRUE ); gtk_widget_set_sensitive( textureBrowser.m_shader_info_item, TRUE );
@ -782,9 +783,15 @@ void TextureBrowser_ShowDirectory( TextureBrowser& textureBrowser, const char* d
textureBrowser.m_searchedTags = false; textureBrowser.m_searchedTags = false;
if ( TextureBrowser_showWads() ) { if ( TextureBrowser_showWads() ) {
Archive* archive = GlobalFileSystem().getArchive( directory ); Archive* archive = GlobalFileSystem().getArchive( directory );
ASSERT_NOTNULL( archive ); //ASSERT_NOTNULL( archive );
LoadShaderVisitor visitor; if( archive ){
archive->forEachFile( Archive::VisitorFunc( visitor, Archive::eFiles, 0 ), "textures/" ); globalOutputStream() << "Loading " << makeQuoted( directory ) << " wad file.\n";
LoadShaderVisitor visitor;
archive->forEachFile( Archive::VisitorFunc( visitor, Archive::eFiles, 0 ), "textures/" );
}
else{
globalErrorStream() << "Attempted to load " << makeQuoted( directory ) << " wad file.\n";
}
} }
else else
{ {
@ -1406,7 +1413,8 @@ gboolean TextureBrowser_button_press( GtkWidget* widget, GdkEventButton* event,
} }
} }
} }
else if ( event->type == GDK_2BUTTON_PRESS && event->button == 1 ) { /* loads directory, containing active shader + focuses on it */
else if ( event->type == GDK_2BUTTON_PRESS && event->button == 1 && !TextureBrowser_showWads() ) {
CopiedString texName = textureBrowser->shader; CopiedString texName = textureBrowser->shader;
char* sh = const_cast<char*>( texName.c_str() ); char* sh = const_cast<char*>( texName.c_str() );
char* dir = strrchr( sh, '/' ); char* dir = strrchr( sh, '/' );
@ -1569,6 +1577,22 @@ void TextureGroups_constructTreeModel( TextureGroups groups, GtkTreeStore* store
} }
} }
void TextureGroups_constructTreeModel_childless( TextureGroups groups, GtkTreeStore* store ){
// put the information from the old textures menu into a treeview
GtkTreeIter iter;
TextureGroups::const_iterator i = groups.begin();
while ( i != groups.end() )
{
const char* dirName = ( *i ).c_str();
{
gtk_tree_store_append( store, &iter, NULL );
gtk_tree_store_set( store, &iter, 0, dirName, -1 );
++i;
}
}
}
TextureGroups TextureGroups_constructTreeView(){ TextureGroups TextureGroups_constructTreeView(){
TextureGroups groups; TextureGroups groups;
@ -1591,7 +1615,12 @@ TextureGroups TextureGroups_constructTreeView(){
void TextureBrowser_constructTreeStore(){ void TextureBrowser_constructTreeStore(){
TextureGroups groups = TextureGroups_constructTreeView(); TextureGroups groups = TextureGroups_constructTreeView();
GtkTreeStore* store = gtk_tree_store_new( 1, G_TYPE_STRING ); GtkTreeStore* store = gtk_tree_store_new( 1, G_TYPE_STRING );
TextureGroups_constructTreeModel( groups, store ); if( !TextureBrowser_showWads() ){
TextureGroups_constructTreeModel( groups, store );
}
else{
TextureGroups_constructTreeModel_childless( groups, store );
}
//std::set<CopiedString>::iterator iter; //std::set<CopiedString>::iterator iter;
GtkTreeModel* model = GTK_TREE_MODEL( store ); GtkTreeModel* model = GTK_TREE_MODEL( store );
@ -1729,7 +1758,7 @@ GtkMenuItem* TextureBrowser_constructViewMenu( GtkMenu* menu ){
// we always want to show shaders but don't want a "Show Shaders" menu for doom3 and .wad file games // we always want to show shaders but don't want a "Show Shaders" menu for doom3 and .wad file games
if ( g_pGameDescription->mGameType == "doom3" || !string_empty( g_pGameDescription->getKeyValue( "show_wads" ) ) ) { if ( g_pGameDescription->mGameType == "doom3" || TextureBrowser_showWads() ) {
g_TextureBrowser.m_showShaders = true; g_TextureBrowser.m_showShaders = true;
} }
else else
@ -1742,10 +1771,10 @@ GtkMenuItem* TextureBrowser_constructViewMenu( GtkMenu* menu ){
if ( g_TextureBrowser.m_tags ) { if ( g_TextureBrowser.m_tags ) {
create_menu_item_with_mnemonic( menu, "Show Untagged", "ShowUntagged" ); create_menu_item_with_mnemonic( menu, "Show Untagged", "ShowUntagged" );
} }
if ( g_pGameDescription->mGameType != "doom3" && string_empty( g_pGameDescription->getKeyValue( "show_wads" ) ) ) { if ( g_pGameDescription->mGameType != "doom3" && !TextureBrowser_showWads() ) {
create_check_menu_item_with_mnemonic( menu, "ShaderList Only", "ToggleShowShaderlistOnly" ); create_check_menu_item_with_mnemonic( menu, "ShaderList Only", "ToggleShowShaderlistOnly" );
} }
if ( string_empty( g_pGameDescription->getKeyValue( "show_wads" ) ) ) { if ( !TextureBrowser_showWads() ) {
create_check_menu_item_with_mnemonic( menu, "Hide Image Missing", "FilterNotex" ); create_check_menu_item_with_mnemonic( menu, "Hide Image Missing", "FilterNotex" );
menu_separator( menu ); menu_separator( menu );
} }
@ -1753,7 +1782,7 @@ GtkMenuItem* TextureBrowser_constructViewMenu( GtkMenu* menu ){
create_check_menu_item_with_mnemonic( menu, "Fixed Size", "FixedSize" ); create_check_menu_item_with_mnemonic( menu, "Fixed Size", "FixedSize" );
create_check_menu_item_with_mnemonic( menu, "Transparency", "EnableAlpha" ); create_check_menu_item_with_mnemonic( menu, "Transparency", "EnableAlpha" );
if ( string_empty( g_pGameDescription->getKeyValue( "show_wads" ) ) ) { if ( !TextureBrowser_showWads() ) {
menu_separator( menu ); menu_separator( menu );
g_TextureBrowser.m_shader_info_item = GTK_WIDGET( create_menu_item_with_mnemonic( menu, "Shader Info", "ShaderInfo" ) ); g_TextureBrowser.m_shader_info_item = GTK_WIDGET( create_menu_item_with_mnemonic( menu, "Shader Info", "ShaderInfo" ) );
gtk_widget_set_sensitive( g_TextureBrowser.m_shader_info_item, FALSE ); gtk_widget_set_sensitive( g_TextureBrowser.m_shader_info_item, FALSE );
@ -2739,8 +2768,8 @@ void TextureBrowser_constructPreferences( PreferencesPage& page ){
IntExportCallback( TextureScaleExportCaller( GlobalTextureBrowser() ) ) IntExportCallback( TextureScaleExportCaller( GlobalTextureBrowser() ) )
); );
} }
page.appendSpinner( "Thumbnails Max Size", GlobalTextureBrowser().m_uniformTextureSize, GlobalTextureBrowser().m_uniformTextureSize, 16, 8192 ); page.appendSpinner( "Thumbnails Max Size", GlobalTextureBrowser().m_uniformTextureSize, 160.0, 16, 8192 );
page.appendSpinner( "Thumbnails Min Size", GlobalTextureBrowser().m_uniformTextureMinSize, GlobalTextureBrowser().m_uniformTextureMinSize, 16, 8192 ); page.appendSpinner( "Thumbnails Min Size", GlobalTextureBrowser().m_uniformTextureMinSize, 48.0, 16, 8192 );
page.appendEntry( "Mousewheel Increment", GlobalTextureBrowser().m_mouseWheelScrollIncrement ); page.appendEntry( "Mousewheel Increment", GlobalTextureBrowser().m_mouseWheelScrollIncrement );
{ {
const char* startup_shaders[] = { "None", TextureBrowser_getComonShadersName() }; const char* startup_shaders[] = { "None", TextureBrowser_getComonShadersName() };

View File

@ -248,8 +248,10 @@ void Clip_Update(){
ClipperChangeNotify(); ClipperChangeNotify();
} }
#include "filterbar.h"
const char* Clip_getShader(){ const char* Clip_getShader(){
return g_clip_useCaulk ? "textures/common/caulk" : TextureBrowser_GetSelectedShader( GlobalTextureBrowser() ); return g_clip_useCaulk ? GetCaulkShader() : TextureBrowser_GetSelectedShader( GlobalTextureBrowser() );
} }
void Clip(){ void Clip(){
@ -1184,35 +1186,12 @@ void XYWnd::NewBrushDrag( int x, int y ){
//Scene_BrushResize_Selected(GlobalSceneGraph(), aabb_for_minmax(mins, maxs), TextureBrowser_GetSelectedShader(GlobalTextureBrowser())); //Scene_BrushResize_Selected(GlobalSceneGraph(), aabb_for_minmax(mins, maxs), TextureBrowser_GetSelectedShader(GlobalTextureBrowser()));
Scene_BrushResize_Selected( GlobalSceneGraph(), aabb_for_minmax( mins, maxs ), Scene_BrushResize_Selected( GlobalSceneGraph(), aabb_for_minmax( mins, maxs ),
g_brush_always_caulk ? g_brush_always_caulk ?
"textures/common/caulk" : TextureBrowser_GetSelectedShader( GlobalTextureBrowser() ) ); GetCaulkShader() : TextureBrowser_GetSelectedShader( GlobalTextureBrowser() ) );
} }
gboolean entitycreate_rightClicked( GtkWidget* widget, GdkEvent* event, gpointer user_data ) { int g_entityCreationOffset = 0;
if ( event->button.button == 3 ) {
// globalOutputStream() << "yo+\n";
const char* entity_name = gtk_label_get_text( GTK_LABEL( GTK_BIN( widget )->child ) ); void entitycreate_activated( GtkMenuItem* item, gpointer user_data ){
StringOutputStream command;
command << "entitySetClass -class " << entity_name;
UndoableCommand undo( command.c_str() );
Scene_EntitySetClassname_Selected( entity_name );
gtk_menu_popdown( XYWnd::m_mnuDrop );
return TRUE;
}
return FALSE;
}
gboolean entitycreate_rightUnClicked( GtkWidget* widget, GdkEvent* event, gpointer user_data ) {
if ( event->button.button == 3 ) {
// globalOutputStream() << "yo-\n";
return TRUE;
}
return FALSE;
}
void entitycreate_activated( GtkWidget* item ){
scene::Node* world_node = Map_FindWorldspawn( g_map ); scene::Node* world_node = Map_FindWorldspawn( g_map );
const char* entity_name = gtk_label_get_text( GTK_LABEL( GTK_BIN( item )->child ) ); const char* entity_name = gtk_label_get_text( GTK_LABEL( GTK_BIN( item )->child ) );
@ -1229,13 +1208,15 @@ void entitycreate_activated( GtkWidget* item ){
viewvector[1] = sin( radangles[1] ) * cos( radangles[0] ); viewvector[1] = sin( radangles[1] ) * cos( radangles[0] );
viewvector[2] = sin( radangles[0] ); viewvector[2] = sin( radangles[0] );
Vector3 point = viewvector * 64.f + Camera_getOrigin( *g_pParentWnd->GetCamWnd() ); float offset_for_multiple = ( GetSnapGridSize() < 8.f ? 8.f : GetSnapGridSize() ) * g_entityCreationOffset;
Vector3 point = viewvector * ( 64.f + offset_for_multiple ) + Camera_getOrigin( *g_pParentWnd->GetCamWnd() );
vector3_snap( point, GetSnapGridSize() ); vector3_snap( point, GetSnapGridSize() );
Entity_createFromSelection( entity_name, point ); Entity_createFromSelection( entity_name, point );
} }
else{ else{
g_pParentWnd->ActiveXY()->OnEntityCreate( entity_name ); g_pParentWnd->ActiveXY()->OnEntityCreate( entity_name );
} }
++g_entityCreationOffset;
} }
else { else {
GlobalRadiant().m_pfnMessageBox( GTK_WIDGET( MainFrame_getWindow() ), "There's already a worldspawn in your map!" GlobalRadiant().m_pfnMessageBox( GTK_WIDGET( MainFrame_getWindow() ), "There's already a worldspawn in your map!"
@ -1246,11 +1227,48 @@ void entitycreate_activated( GtkWidget* item ){
} }
} }
gboolean entitycreate_rightClicked( GtkWidget* widget, GdkEvent* event, gpointer user_data ) {
/* convert entities */
if ( event->button.button == 3 ) {
// globalOutputStream() << "yo+\n";
const char* entity_name = gtk_label_get_text( GTK_LABEL( GTK_BIN( widget )->child ) );
StringOutputStream command;
command << "entitySetClass -class " << entity_name;
UndoableCommand undo( command.c_str() );
Scene_EntitySetClassname_Selected( entity_name );
if( ( event->button.state & GDK_CONTROL_MASK ) == 0 ){
gtk_menu_popdown( XYWnd::m_mnuDrop );
}
return TRUE;
}
/* create entities, don't close menu */
else if ( event->button.button == 1 && ( ( event->button.state & GDK_CONTROL_MASK ) != 0 || gtk_menu_get_tearoff_state( XYWnd::m_mnuDrop ) == TRUE ) ) {
entitycreate_activated( GTK_MENU_ITEM( widget ), 0 );
return TRUE;
}
return FALSE;
}
/* This handles unwanted rightclick release, that can occur with low res display, while activating menu from camera (=activate top menu entry) */
gboolean entitycreate_rightUnClicked( GtkWidget* widget, GdkEvent* event, gpointer user_data ) {
if ( event->button.button == 3 ) {
// globalOutputStream() << "yo-\n";
return TRUE;
}
else if ( event->button.button == 1 && ( ( event->button.state & GDK_CONTROL_MASK ) != 0 || gtk_menu_get_tearoff_state( XYWnd::m_mnuDrop ) == TRUE ) ) {
return TRUE;
}
return FALSE;
}
void EntityClassMenu_addItem( GtkMenu* menu, const char* name ){ void EntityClassMenu_addItem( GtkMenu* menu, const char* name ){
GtkMenuItem* item = GTK_MENU_ITEM( gtk_menu_item_new_with_label( name ) ); GtkMenuItem* item = GTK_MENU_ITEM( gtk_menu_item_new_with_label( name ) );
g_signal_connect( G_OBJECT( item ), "button-press-event", G_CALLBACK( entitycreate_rightClicked ), item ); g_signal_connect( G_OBJECT( item ), "button-press-event", G_CALLBACK( entitycreate_rightClicked ), 0 );
g_signal_connect( G_OBJECT( item ), "button-release-event", G_CALLBACK( entitycreate_rightUnClicked ), item ); g_signal_connect( G_OBJECT( item ), "button-release-event", G_CALLBACK( entitycreate_rightUnClicked ), 0 );
g_signal_connect( G_OBJECT( item ), "activate", G_CALLBACK( entitycreate_activated ), item ); g_signal_connect( G_OBJECT( item ), "activate", G_CALLBACK( entitycreate_activated ), 0 );
gtk_widget_show( GTK_WIDGET( item ) ); gtk_widget_show( GTK_WIDGET( item ) );
menu_add_item( menu, item ); menu_add_item( menu, item );
} }
@ -1327,11 +1345,16 @@ void XYWnd::OnContextMenu(){
if ( m_mnuDrop == 0 ) { // first time, load it up if ( m_mnuDrop == 0 ) { // first time, load it up
GtkMenu* menu = m_mnuDrop = GTK_MENU( gtk_menu_new() ); GtkMenu* menu = m_mnuDrop = GTK_MENU( gtk_menu_new() );
// menu_tearoff( menu );
g_signal_connect( G_OBJECT( menu_tearoff( menu ) ), "button-release-event", G_CALLBACK( entitycreate_rightUnClicked ), 0 );
gtk_menu_attach_to_widget( m_mnuDrop, GTK_WIDGET( m_parent != 0 ? m_parent : MainFrame_getWindow() ), NULL );
gtk_menu_set_title( m_mnuDrop, "" );
EntityClassMenuInserter inserter( menu ); EntityClassMenuInserter inserter( menu );
GlobalEntityClassManager().forEach( inserter ); GlobalEntityClassManager().forEach( inserter );
} }
g_entityCreationOffset = 0;
g_bCamEntityMenu = false; g_bCamEntityMenu = false;
gtk_menu_popup( m_mnuDrop, 0, 0, 0, 0, 1, GDK_CURRENT_TIME ); gtk_menu_popup( m_mnuDrop, 0, 0, 0, 0, 1, GDK_CURRENT_TIME );
} }
@ -1659,7 +1682,7 @@ void XYWnd::XY_LoadBackgroundImage( const char *name ){
m_ix = 0; m_ix = 0;
m_iy = 2; m_iy = 2;
break; break;
case YZ: default: //case YZ:
m_ix = 1; m_ix = 1;
m_iy = 2; m_iy = 2;
break; break;
@ -2760,6 +2783,21 @@ void XYWnd::OnEntityCreate( const char* item ){
UndoableCommand undo( command.c_str() ); UndoableCommand undo( command.c_str() );
Vector3 point; Vector3 point;
XYWnd_MouseToPoint( this, m_entityCreate_x, m_entityCreate_y, point ); XYWnd_MouseToPoint( this, m_entityCreate_x, m_entityCreate_y, point );
Vector3 offset( 0, 0, 0 );
float offset_for_multiple = ( GetSnapGridSize() < 8.f ? 8.f : GetSnapGridSize() ) * g_entityCreationOffset;
switch ( m_viewType )
{
case XY:
case XZ:
offset[0] = 1.f;
break;
default: //case YZ:
offset[1] = 1.f;
break;
}
point += offset * offset_for_multiple;
Entity_createFromSelection( item, point ); Entity_createFromSelection( item, point );
} }