From 0d5ebb17b29d4263ec4f1634af24a27620ab47a4 Mon Sep 17 00:00:00 2001 From: Garux Date: Wed, 2 Aug 2017 09:04:48 +0300 Subject: [PATCH] Q3map2: fix compilation on linux * packer: pack actual loaded bsp instead of one, found in vfs Radiant: binds... * Q - toggle QE/Scale tools (MouseDragOrScale command) * new MouseRotateOrScale command * shift + m3: set custom transform/pivot origin in pivoted mode switch manipulator mode = disable is snapped to (if SnapToGrid is on): grid selection bbox edges selection bbox origin misc... * Scale tool: now scales bbox by gridsize increment * m1 selector fix: shift/ctrl + m1 drag, release shift/ctrl, release m1 = replace brush selection * m1 selector fix: do not select when dragged off pivot in pivoted mode * don't restore cursor pos after quit mlook (do center) * toggle and paint selectors do select matching stuff (depth threshold ~= 0.1 u) --- include/iselection.h | 1 + libs/gtkutil/cursor.h | 17 ++- libs/stringio.h | 2 +- radiant/camwindow.cpp | 2 +- radiant/mainframe.cpp | 35 +++++- radiant/selection.cpp | 225 ++++++++++++++++++++++++++++++++++--- radiant/texwindow.cpp | 5 +- radiant/xywindow.cpp | 27 ++++- radiant/xywindow.h | 2 + tools/quake3/common/vfs.c | 42 ++++++- tools/quake3/common/vfs.h | 1 + tools/quake3/q3map2/main.c | 163 ++++++++++++++------------- 12 files changed, 406 insertions(+), 116 deletions(-) diff --git a/include/iselection.h b/include/iselection.h index f5c76310..36b27deb 100644 --- a/include/iselection.h +++ b/include/iselection.h @@ -124,6 +124,7 @@ virtual void rotateSelected( const Quaternion& rotation ) = 0; virtual void scaleSelected( const Vector3& scaling ) = 0; virtual void pivotChanged() const = 0; +virtual void setCustomPivotOrigin( Vector3& point ) const = 0; }; #include "modulesystem.h" diff --git a/libs/gtkutil/cursor.h b/libs/gtkutil/cursor.h index 0a6a495d..b08c7428 100644 --- a/libs/gtkutil/cursor.h +++ b/libs/gtkutil/cursor.h @@ -118,7 +118,7 @@ class FreezePointer { unsigned int handle_motion; int recorded_x, recorded_y, last_x, last_y, center_x, center_y; -GtkWidget* weedjet; +GtkWidget* m_weedjet; typedef void ( *MotionDeltaFunction )( int x, int y, unsigned int state, void* data ); MotionDeltaFunction m_function; void* m_data; @@ -168,7 +168,7 @@ void freeze_pointer( GtkWindow* window, GtkWidget* widget, MotionDeltaFunction f //gdk_window_set_cursor ( GTK_WIDGET( window )->window, cursor ); /* is needed to fix activating neighbour widgets, that happens, if using upper one */ gtk_grab_add( widget ); - weedjet = widget; + m_weedjet = widget; gdk_cursor_unref( cursor ); @@ -190,17 +190,22 @@ void freeze_pointer( GtkWindow* window, GtkWidget* widget, MotionDeltaFunction f handle_motion = g_signal_connect( G_OBJECT( window ), "motion_notify_event", G_CALLBACK( motion_delta ), this ); } -void unfreeze_pointer( GtkWindow* window ){ +void unfreeze_pointer( GtkWindow* window, bool centerize ){ g_signal_handler_disconnect( G_OBJECT( window ), handle_motion ); m_function = 0; m_data = 0; - Sys_SetCursorPos( window, recorded_x, recorded_y ); - + if( centerize ){ + Sys_SetCursorPos( window, center_x, center_y ); + } + else{ + Sys_SetCursorPos( window, recorded_x, recorded_y ); + } // gdk_window_set_cursor( GTK_WIDGET( window )->window, 0 ); gdk_pointer_ungrab( GDK_CURRENT_TIME ); - gtk_grab_remove( weedjet ); + if( m_weedjet ) + gtk_grab_remove( m_weedjet ); } }; diff --git a/libs/stringio.h b/libs/stringio.h index 82d0e258..658e0ace 100644 --- a/libs/stringio.h +++ b/libs/stringio.h @@ -234,7 +234,7 @@ inline bool Tokeniser_getFloat( Tokeniser& tokeniser, float& f ){ //fallback for 1.#IND 1.#INF 1.#QNAN cases, happening sometimes after rotating & often scaling with tex lock in BP mode else if ( token != 0 && strstr( token, ".#" ) ) { globalErrorStream() << "Warning: " << Unsigned( tokeniser.getLine() ) << ":" << Unsigned( tokeniser.getColumn() ) << ": expected parse problem at '" << token << "': wanted '#number'\nProcessing anyway\n"; - *strstr( token, ".#" ) = '\0'; +// *strstr( token, ".#" ) = '\0'; return true; } Tokeniser_unexpectedError( tokeniser, token, "#number" ); diff --git a/radiant/camwindow.cpp b/radiant/camwindow.cpp index 37bcaba3..48c3375a 100644 --- a/radiant/camwindow.cpp +++ b/radiant/camwindow.cpp @@ -1343,7 +1343,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_parent, true ); g_signal_handler_disconnect( G_OBJECT( m_gl_widget ), m_freemove_handle_focusout ); CamWnd_Update( *this ); diff --git a/radiant/mainframe.cpp b/radiant/mainframe.cpp index 3d33df07..9054117a 100644 --- a/radiant/mainframe.cpp +++ b/radiant/mainframe.cpp @@ -1469,6 +1469,27 @@ void ClipperMode(){ } +void ToggleRotateScaleModes(){ + if ( g_currentToolMode == RotateMode ) { + ScaleMode(); + } + else + { + RotateMode(); + } +} + +void ToggleDragScaleModes(){ + if ( g_currentToolMode == DragMode ) { + ScaleMode(); + } + else + { + DragMode(); + } +} + + void Texdef_Rotate( float angle ){ StringOutputStream command; command << "brushRotateTexture -angle " << angle; @@ -2280,14 +2301,19 @@ void SurfaceInspector_registerShortcuts(){ command_connect_accelerator( "FitTexture" ); } - void TexBro_registerShortcuts(){ command_connect_accelerator( "FindReplaceTextures" ); command_connect_accelerator( "RefreshShaders" ); +} + +void Misc_registerShortcuts(){ //refresh models command_connect_accelerator( "RefreshReferences" ); + command_connect_accelerator( "MouseRotateOrScale" ); + command_connect_accelerator( "MouseDragOrScale" ); } + void register_shortcuts(){ // PatchInspector_registerShortcuts(); //Patch_registerShortcuts(); @@ -2301,6 +2327,7 @@ void register_shortcuts(){ // SnapToGrid_registerShortcuts(); // SelectByType_registerShortcuts(); TexBro_registerShortcuts(); + Misc_registerShortcuts(); } void File_constructToolbar( GtkToolbar* toolbar ){ @@ -2352,7 +2379,7 @@ void XYWnd_constructToolbar( GtkToolbar* toolbar ){ void Manipulators_constructToolbar( GtkToolbar* toolbar ){ toolbar_append_toggle_button( toolbar, "Translate (W)", "select_mousetranslate.png", "MouseTranslate" ); toolbar_append_toggle_button( toolbar, "Rotate (R)", "select_mouserotate.png", "MouseRotate" ); - toolbar_append_toggle_button( toolbar, "Scale", "select_mousescale.png", "MouseScale" ); + toolbar_append_toggle_button( toolbar, "Scale (Q)", "select_mousescale.png", "MouseScale" ); toolbar_append_toggle_button( toolbar, "Resize (Q)", "select_mouseresize.png", "MouseDrag" ); Clipper_constructToolbar( toolbar ); @@ -3318,7 +3345,9 @@ void MainFrame_Construct(){ GlobalToggles_insert( "MouseTranslate", FreeCaller(), ToggleItem::AddCallbackCaller( g_translatemode_button ), Accelerator( 'W' ) ); GlobalToggles_insert( "MouseRotate", FreeCaller(), ToggleItem::AddCallbackCaller( g_rotatemode_button ), Accelerator( 'R' ) ); GlobalToggles_insert( "MouseScale", FreeCaller(), ToggleItem::AddCallbackCaller( g_scalemode_button ) ); - GlobalToggles_insert( "MouseDrag", FreeCaller(), ToggleItem::AddCallbackCaller( g_dragmode_button ), Accelerator( 'Q' ) ); + GlobalToggles_insert( "MouseDrag", FreeCaller(), ToggleItem::AddCallbackCaller( g_dragmode_button ) ); + GlobalCommands_insert( "MouseRotateOrScale", FreeCaller() ); + GlobalCommands_insert( "MouseDragOrScale", FreeCaller(), Accelerator( 'Q' ) ); GlobalCommands_insert( "gtkThemeDlg", FreeCaller() ); GlobalCommands_insert( "ColorSchemeOriginal", FreeCaller() ); diff --git a/radiant/selection.cpp b/radiant/selection.cpp index ff4c6ee3..52435f15 100644 --- a/radiant/selection.cpp +++ b/radiant/selection.cpp @@ -325,6 +325,8 @@ void Transform( const Matrix4& manip2object, const Matrix4& device2manip, const } }; +void GetSelectionAABB( AABB& bounds ); +const Matrix4& ssGetPivot2World(); class Scalable { @@ -339,14 +341,28 @@ private: Vector3 m_start; Vector3 m_axis; Scalable& m_scalable; + +AABB m_aabb; +Vector3 m_transform_origin; +Vector3 m_choosen_extent; + public: ScaleAxis( Scalable& scalable ) : m_scalable( scalable ){ } void Construct( const Matrix4& device2manip, const float x, const float y ){ point_on_axis( m_start, m_axis, device2manip, x, y ); + + GetSelectionAABB( m_aabb ); + m_transform_origin = vector4_to_vector3( ssGetPivot2World().t() ); + m_choosen_extent = Vector3( std::max( m_aabb.origin[0] + m_aabb.extents[0] - m_transform_origin[0], - m_aabb.origin[0] + m_aabb.extents[0] + m_transform_origin[0] ), + std::max( m_aabb.origin[1] + m_aabb.extents[1] - m_transform_origin[1], - m_aabb.origin[1] + m_aabb.extents[1] + m_transform_origin[1] ), + std::max( m_aabb.origin[2] + m_aabb.extents[2] - m_transform_origin[2], - m_aabb.origin[2] + m_aabb.extents[2] + m_transform_origin[2] ) + ); + } void Transform( const Matrix4& manip2object, const Matrix4& device2manip, const float x, const float y ){ + //globalOutputStream() << "manip2object: " << manip2object << " device2manip: " << device2manip << " x: " << x << " y:" << y <<"\n"; Vector3 current; point_on_axis( current, m_axis, device2manip, x, y ); Vector3 delta = vector3_subtracted( current, m_start ); @@ -355,11 +371,19 @@ void Transform( const Matrix4& manip2object, const Matrix4& device2manip, const vector3_snap( delta, GetSnapGridSize() ); Vector3 start( vector3_snapped( m_start, GetSnapGridSize() ) ); + //globalOutputStream() << "start: " << start << " delta: " << delta <<"\n"; Vector3 scale( start[0] == 0 ? 1 : 1 + delta[0] / start[0], start[1] == 0 ? 1 : 1 + delta[1] / start[1], start[2] == 0 ? 1 : 1 + delta[2] / start[2] ); + + for( std::size_t i = 0; i < 3; i++ ){ + if( m_choosen_extent[i] > 0.0625 ){ //epsilon to prevent too high scale for set of models, having really small extent, formed by origins + scale[i] = ( m_choosen_extent[i] + delta[i] ) / m_choosen_extent[i]; + } + } + m_scalable.scale( scale ); } @@ -373,12 +397,24 @@ class ScaleFree : public Manipulatable private: Vector3 m_start; Scalable& m_scalable; + +AABB m_aabb; +Vector3 m_transform_origin; +Vector3 m_choosen_extent; + public: ScaleFree( Scalable& scalable ) : m_scalable( scalable ){ } void Construct( const Matrix4& device2manip, const float x, const float y ){ point_on_plane( m_start, device2manip, x, y ); + + GetSelectionAABB( m_aabb ); + m_transform_origin = vector4_to_vector3( ssGetPivot2World().t() ); + m_choosen_extent = Vector3( std::max( m_aabb.origin[0] + m_aabb.extents[0] - m_transform_origin[0], - m_aabb.origin[0] + m_aabb.extents[0] + m_transform_origin[0] ), + std::max( m_aabb.origin[1] + m_aabb.extents[1] - m_transform_origin[1], - m_aabb.origin[1] + m_aabb.extents[1] + m_transform_origin[1] ), + std::max( m_aabb.origin[2] + m_aabb.extents[2] - m_transform_origin[2], - m_aabb.origin[2] + m_aabb.extents[2] + m_transform_origin[2] ) + ); } void Transform( const Matrix4& manip2object, const Matrix4& device2manip, const float x, const float y ){ Vector3 current; @@ -394,6 +430,13 @@ void Transform( const Matrix4& manip2object, const Matrix4& device2manip, const start[1] == 0 ? 1 : 1 + delta[1] / start[1], start[2] == 0 ? 1 : 1 + delta[2] / start[2] ); + + for( std::size_t i = 0; i < 3; i++ ){ + if( m_choosen_extent[i] > 0.0625 ){ + scale[i] = ( m_choosen_extent[i] + delta[i] ) / m_choosen_extent[i]; + } + } + m_scalable.scale( scale ); } }; @@ -2537,9 +2580,7 @@ EManipulatorMode m_manipulator_mode; Manipulator* m_manipulator; // state -public: bool m_undo_begun; -private: EMode m_mode; EComponentMode m_componentmode; @@ -2559,8 +2600,13 @@ selection_t m_component_selection; Signal1 m_selectionChanged_callbacks; void ConstructPivot() const; +void setCustomPivotOrigin( Vector3& point ) const; +public: +void getSelectionAABB( AABB& bounds ) const; +private: mutable bool m_pivotChanged; bool m_pivot_moving; +mutable bool m_pivotIsCustom; void Scene_TestSelect( Selector& selector, SelectionTest& test, const View& view, SelectionSystem::EMode mode, SelectionSystem::EComponentMode componentMode ); @@ -2591,7 +2637,8 @@ RadiantSelectionSystem() : m_rotate_manipulator( *this, 8, 64 ), m_scale_manipulator( *this, 0, 64 ), m_pivotChanged( false ), - m_pivot_moving( false ){ + m_pivot_moving( false ), + m_pivotIsCustom( false ){ SetManipulatorMode( eTranslate ); pivotChanged(); addSelectionChangeCallback( PivotChangedSelectionCaller( *this ) ); @@ -2623,6 +2670,7 @@ EComponentMode ComponentMode() const { return m_componentmode; } void SetManipulatorMode( EManipulatorMode mode ){ + m_pivotIsCustom = false; m_manipulator_mode = mode; switch ( m_manipulator_mode ) { @@ -2864,15 +2912,45 @@ void SelectPoint( const View& view, const float device_point[2], const float dev break; case RadiantSelectionSystem::eSelect: { - if( !( *selector.begin() ).second->isSelected() ){ - ( *selector.begin() ).second->setSelected( true ); + SelectionPool::iterator best = selector.begin(); + if( !( *best ).second->isSelected() ){ + ( *best ).second->setSelected( true ); + } + SelectionPool::iterator i = best; + ++i; + while ( i != selector.end() ) + { + if( ( *i ).first.equalEpsilon( ( *best ).first, 0.25f, 0.000001f ) ){ + if( !( *i ).second->isSelected() ){ + ( *i ).second->setSelected( true ); + } + } + else{ + break; + } + ++i; } } break; case RadiantSelectionSystem::eDeselect: { - if( ( *selector.begin() ).second->isSelected() ){ - ( *selector.begin() ).second->setSelected( false ); + SelectionPool::iterator best = selector.begin(); + if( ( *best ).second->isSelected() ){ + ( *best ).second->setSelected( false ); + } + SelectionPool::iterator i = best; + ++i; + while ( i != selector.end() ) + { + if( ( *i ).first.equalEpsilon( ( *best ).first, 0.25f, 0.000001f ) ){ + if( ( *i ).second->isSelected() ){ + ( *i ).second->setSelected( false ); + } + } + else{ + break; + } + ++i; } } break; @@ -2908,14 +2986,21 @@ bool SelectPoint_InitPaint( const View& view, const float device_point[2], const if ( !selector.failed() ) { SelectableSortedSet::iterator best = selector.begin(); - if ( ( *best ).second->isSelected() ) { - ( *best ).second->setSelected( false ); - return false; - } - else{ - ( *best ).second->setSelected( true ); - return true; + const bool wasSelected = ( *best ).second->isSelected(); + ( *best ).second->setSelected( !wasSelected ); + SelectableSortedSet::iterator i = best; + ++i; + while ( i != selector.end() ) + { + if( ( *i ).first.equalEpsilon( ( *best ).first, 0.25f, 0.000001f ) ){ + ( *i ).second->setSelected( !wasSelected ); + } + else{ + break; + } + ++i; } + return !wasSelected; } else{ return true; @@ -3380,7 +3465,7 @@ inline void pivot_for_node( Matrix4& pivot, scene::Node& node, scene::Instance& #endif void RadiantSelectionSystem::ConstructPivot() const { - if ( !m_pivotChanged || m_pivot_moving ) { + if ( !m_pivotChanged || m_pivot_moving || m_pivotIsCustom ) { return; } m_pivotChanged = false; @@ -3401,6 +3486,7 @@ void RadiantSelectionSystem::ConstructPivot() const { } //vector3_snap( m_object_pivot, GetSnapGridSize() ); + //globalOutputStream() << m_object_pivot << "\n"; m_pivot2world = matrix4_translation_for_vec3( m_object_pivot ); switch ( m_manipulator_mode ) @@ -3431,6 +3517,106 @@ void RadiantSelectionSystem::ConstructPivot() const { } } +void RadiantSelectionSystem::setCustomPivotOrigin( Vector3& point ) const { + /*if ( !m_pivotChanged || m_pivot_moving ) { + return; + }*/ + //m_pivotChanged = false; + + if ( !nothingSelected() && ( m_manipulator_mode == eTranslate || m_manipulator_mode == eRotate || m_manipulator_mode == eScale ) ) { + AABB bounds; + if ( Mode() == eComponent ) { + Scene_BoundsSelectedComponent( GlobalSceneGraph(), bounds ); + } + else + { + Scene_BoundsSelected( GlobalSceneGraph(), bounds ); + } + //globalOutputStream() << point << "\n"; + const float gridsize = GetSnapGridSize(); + //const float bbox_epsilon = gridsize / 4.0; + + for( std::size_t i = 0; i < 3; i++ ){ + if( point[i] < 900000 ){ + float bestsnapDist = fabs( bounds.origin[i] - point[i] ); + float bestsnapTo = bounds.origin[i]; + float othersnapDist = fabs( bounds.origin[i] + bounds.extents[i] - point[i] ); + if( othersnapDist < bestsnapDist ){ + bestsnapDist = othersnapDist; + bestsnapTo = bounds.origin[i] + bounds.extents[i]; + } + othersnapDist = fabs( bounds.origin[i] - bounds.extents[i] - point[i] ); + if( othersnapDist < bestsnapDist ){ + bestsnapDist = othersnapDist; + bestsnapTo = bounds.origin[i] - bounds.extents[i]; + } + othersnapDist = fabs( float_snapped( point[i], gridsize ) - point[i] ); + if( othersnapDist < bestsnapDist ){ + bestsnapDist = othersnapDist; + bestsnapTo = float_snapped( point[i], gridsize ); + } + point[i] = bestsnapTo; + +/* if( float_equal_epsilon( point[i], bestsnapTo, bbox_epsilon ) ){ + point[i] = bestsnapTo; + } + else{ + point[i] = float_snapped( point[i], gridsize ); + } + */ + m_pivot2world[i + 12] = point[i]; //m_pivot2world.tx() .ty() .tz() + } + } + + switch ( m_manipulator_mode ) + { + case eTranslate: + break; + case eRotate: + if ( Mode() == eComponent ) { + matrix4_assign_rotation_for_pivot( m_pivot2world, m_component_selection.back() ); + } + else + { + matrix4_assign_rotation_for_pivot( m_pivot2world, m_selection.back() ); + } + break; + case eScale: + if ( Mode() == eComponent ) { + matrix4_assign_rotation_for_pivot( m_pivot2world, m_component_selection.back() ); + } + else + { + matrix4_assign_rotation_for_pivot( m_pivot2world, m_selection.back() ); + } + break; + default: + break; + } + } + m_pivotIsCustom = true; +} + +void RadiantSelectionSystem::getSelectionAABB( AABB& bounds ) const { + if ( !nothingSelected() ) { + if ( Mode() == eComponent ) { + Scene_BoundsSelectedComponent( GlobalSceneGraph(), bounds ); + } + else + { + Scene_BoundsSelected( GlobalSceneGraph(), bounds ); + } + } +} + +void GetSelectionAABB( AABB& bounds ){ + getSelectionSystem().getSelectionAABB( bounds ); +} + +const Matrix4& ssGetPivot2World(){ + return getSelectionSystem().GetPivot2World(); +} + void RadiantSelectionSystem::renderSolid( Renderer& renderer, const VolumeTest& volume ) const { //if(view->TestPoint(m_object_pivot)) if ( !nothingSelected() ) { @@ -3773,6 +3959,7 @@ void onMouseDown( const WindowVector& position, ButtonIdentifier button, Modifie void onMouseMotion( const WindowVector& position, ModifierFlags modifiers ){ m_selector.m_mouseMoved = true; if ( m_mouse_down && !g_mouseMovedCallback.empty() ) { + m_selector.m_mouseMovedWhilePressed = true; g_mouseMovedCallback.get() ( window_to_normalised_device( position, m_width, m_height ) ); } } @@ -3783,12 +3970,14 @@ void onMouseUp( const WindowVector& position, ButtonIdentifier button, ModifierF g_mouseUpCallback.get() ( window_to_normalised_device( position, m_width, m_height ) ); } //L button w/o scene changed = tunnel selection - if( !getSelectionSystem().m_undo_begun && modifiers == c_modifierNone && button == c_button_select && + if( // !getSelectionSystem().m_undo_begun && + modifiers == c_modifierNone && button == c_button_select && //( !m_selector.m_mouseMoved || !m_mouse_down ) && - ( GlobalSelectionSystem().Mode() != SelectionSystem::eComponent || GlobalSelectionSystem().ManipulatorMode() != SelectionSystem::eDrag ) ){ + !m_selector.m_mouseMovedWhilePressed && + ( getSelectionSystem().Mode() != SelectionSystem::eComponent || getSelectionSystem().ManipulatorMode() != SelectionSystem::eDrag ) ){ m_selector.testSelect_simpleM1( device_constrained( window_to_normalised_device( position, m_width, m_height ) ) ); } - getSelectionSystem().m_undo_begun = false; + //getSelectionSystem().m_undo_begun = false; m_selector.m_mouseMoved = false; m_selector.m_mouseMovedWhilePressed = false; } diff --git a/radiant/texwindow.cpp b/radiant/texwindow.cpp index 3ea764bb..ba6c59e4 100644 --- a/radiant/texwindow.cpp +++ b/radiant/texwindow.cpp @@ -1020,7 +1020,7 @@ void TextureBrowser_trackingDelta( int x, int y, unsigned int state, void* data void TextureBrowser_Tracking_MouseUp( TextureBrowser& textureBrowser ){ textureBrowser.m_move_started = false; - textureBrowser.m_freezePointer.unfreeze_pointer( textureBrowser.m_parent ); + textureBrowser.m_freezePointer.unfreeze_pointer( textureBrowser.m_parent, false ); } void TextureBrowser_Tracking_MouseDown( TextureBrowser& textureBrowser ){ @@ -1400,7 +1400,8 @@ gboolean TextureBrowser_button_press( GtkWidget* widget, GdkEventButton* event, } else if ( event->type == GDK_2BUTTON_PRESS && event->button == 1 ) { CopiedString texName = textureBrowser->shader; - const char* sh = texName.c_str(); + //const char* sh = texName.c_str(); + char* sh = const_cast( texName.c_str() ); char* dir = strrchr( sh, '/' ); if( dir != NULL ){ *(dir + 1) = '\0'; diff --git a/radiant/xywindow.cpp b/radiant/xywindow.cpp index 9ab1861e..af6467e3 100644 --- a/radiant/xywindow.cpp +++ b/radiant/xywindow.cpp @@ -989,6 +989,18 @@ void XYWnd::Clipper_Crosshair_OnMouseMoved( int x, int y ){ } } +void XYWnd::SetCustomPivotOrigin( int pointx, int pointy ){ + Vector3 point; + XY_ToPoint( pointx, pointy, point ); + VIEWTYPE viewtype = static_cast( GetViewType() ); + const int nDim = ( viewtype == YZ ) ? 0 : ( ( viewtype == XZ ) ? 1 : 2 ); + //vector3_snap( point, GetSnapGridSize() ); + point[nDim] = 999999; + + GlobalSelectionSystem().setCustomPivotOrigin( point ); + SceneChangeNotify(); +} + unsigned int MoveCamera_buttons(){ return RAD_CONTROL | ( g_glwindow_globals.m_nMouseType == ETwoButton ? RAD_RBUTTON : RAD_MBUTTON ); } @@ -1023,6 +1035,10 @@ void XYWnd_OrientCamera( XYWnd* xywnd, int x, int y, CamWnd& camwnd ){ } } +unsigned int SetCustomPivotOrigin_buttons(){ + return RAD_MBUTTON | RAD_SHIFT; +} + /* ============== NewBrushDrag @@ -1224,7 +1240,7 @@ void XYWnd::Move_Begin(){ void XYWnd::Move_End(){ m_move_started = false; - g_xywnd_freezePointer.unfreeze_pointer( m_parent != 0 ? m_parent : MainFrame_getWindow() ); + g_xywnd_freezePointer.unfreeze_pointer( m_parent != 0 ? m_parent : MainFrame_getWindow(), false ); g_signal_handler_disconnect( G_OBJECT( m_gl_widget ), m_move_focusOut ); } @@ -1269,7 +1285,7 @@ void XYWnd::Zoom_Begin(){ void XYWnd::Zoom_End(){ m_zoom_started = false; - g_xywnd_freezePointer.unfreeze_pointer( m_parent != 0 ? m_parent : MainFrame_getWindow() ); + g_xywnd_freezePointer.unfreeze_pointer( m_parent != 0 ? m_parent : MainFrame_getWindow(), false ); g_signal_handler_disconnect( G_OBJECT( m_gl_widget ), m_zoom_focusOut ); } @@ -1330,6 +1346,9 @@ void XYWnd::XY_MouseDown( int x, int y, unsigned int buttons ){ else if ( buttons == OrientCamera_buttons() ) { XYWnd_OrientCamera( this, x, y, *g_pParentWnd->GetCamWnd() ); } + else if ( buttons == SetCustomPivotOrigin_buttons() ) { + SetCustomPivotOrigin( x, y ); + } else { m_window_observer->onMouseDown( WindowVector_forInteger( x, y ), button_for_flags( buttons ), modifiers_for_flags( buttons ) ); @@ -1387,6 +1406,10 @@ void XYWnd::XY_MouseMoved( int x, int y, unsigned int buttons ){ XYWnd_OrientCamera( this, x, y, *g_pParentWnd->GetCamWnd() ); } + else if ( buttons == SetCustomPivotOrigin_buttons() ) { + SetCustomPivotOrigin( x, y ); + } + else { m_window_observer->onMouseMotion( WindowVector_forInteger( x, y ), modifiers_for_flags( buttons ) ); diff --git a/radiant/xywindow.h b/radiant/xywindow.h index a8b4aaa2..c5fa82a2 100644 --- a/radiant/xywindow.h +++ b/radiant/xywindow.h @@ -143,6 +143,8 @@ void Clipper_OnMouseMoved( int x, int y ); void Clipper_Crosshair_OnMouseMoved( int x, int y ); void DropClipPoint( int pointx, int pointy ); +void SetCustomPivotOrigin( int pointx, int pointy ); + void SetViewType( VIEWTYPE n ); bool m_bActive; diff --git a/tools/quake3/common/vfs.c b/tools/quake3/common/vfs.c index f1450470..2b1b61bc 100644 --- a/tools/quake3/common/vfs.c +++ b/tools/quake3/common/vfs.c @@ -275,7 +275,7 @@ void vfsListShaderFiles( char* list, int *num ){ } for ( k = 0; k < *num; k++ ){ - if ( !stricmp( list + k*65, dirlist ) ) goto shISdouplicate; + if ( !Q_stricmp( list + k*65, dirlist ) ) goto shISdouplicate; } strcpy( list + (*num)*65, dirlist ); (*num)++; @@ -302,7 +302,7 @@ shISdouplicate: ext++; for ( k = 0; k < *num; k++ ){ - if ( !stricmp( list + k*65, ext ) ) goto shISdouplicate2; + if ( !Q_stricmp( list + k*65, ext ) ) goto shISdouplicate2; } strcpy( list + (*num)*65, ext ); (*num)++; @@ -566,3 +566,41 @@ qboolean vfsPackFile( const char *filename, const char *packname, const int comp return qfalse; } + +qboolean vfsPackFile_Absolute_Path( const char *filepath, const char *filename, const char *packname, const int compLevel ){ + char tmp[NAME_MAX]; + strcpy( tmp, filepath ); + if ( access( tmp, R_OK ) == 0 ) { + if ( access( packname, R_OK ) == 0 ) { + mz_zip_archive zip; + memset( &zip, 0, sizeof(zip) ); + mz_zip_reader_init_file( &zip, packname, 0 ); + mz_zip_writer_init_from_reader( &zip, packname ); + + mz_bool success = MZ_TRUE; + success &= mz_zip_writer_add_file( &zip, filename, tmp, 0, 0, compLevel ); + if ( !success || !mz_zip_writer_finalize_archive( &zip ) ){ + Error( "Failed creating zip archive \"%s\"!\n", packname ); + } + mz_zip_reader_end( &zip); + mz_zip_writer_end( &zip ); + } + else{ + mz_zip_archive zip; + memset( &zip, 0, sizeof(zip) ); + if( !mz_zip_writer_init_file( &zip, packname, 0 ) ){ + Error( "Failed creating zip archive \"%s\"!\n", packname ); + } + mz_bool success = MZ_TRUE; + success &= mz_zip_writer_add_file( &zip, filename, tmp, 0, 0, compLevel ); + if ( !success || !mz_zip_writer_finalize_archive( &zip ) ){ + Error( "Failed creating zip archive \"%s\"!\n", packname ); + } + mz_zip_writer_end( &zip ); + } + + return qtrue; + } + + return qfalse; +} diff --git a/tools/quake3/common/vfs.h b/tools/quake3/common/vfs.h index 89da7b14..3527b3e1 100644 --- a/tools/quake3/common/vfs.h +++ b/tools/quake3/common/vfs.h @@ -57,6 +57,7 @@ int vfsGetFileCount( const char *filename ); int vfsLoadFile( const char *filename, void **buffer, int index ); void vfsListShaderFiles( char* list, int *num ); qboolean vfsPackFile( const char *filename, const char *packname, const int compLevel ); +qboolean vfsPackFile_Absolute_Path( const char *filepath, const char *filename, const char *packname, const int compLevel ); extern char g_strForbiddenDirs[VFS_MAXDIRS][PATH_MAX + 1]; extern int g_numForbiddenDirs; diff --git a/tools/quake3/q3map2/main.c b/tools/quake3/q3map2/main.c index 0240bb83..3120587f 100644 --- a/tools/quake3/q3map2/main.c +++ b/tools/quake3/q3map2/main.c @@ -1660,10 +1660,10 @@ void tex2list( char* texlist, int *texnum, char* EXtex, int *EXtexnum ){ StripExtension( token ); FixDOSName( token ); for ( i = 0; i < *texnum; i++ ){ - if ( !stricmp( texlist + i*65, token ) ) return; + if ( !Q_stricmp( texlist + i*65, token ) ) return; } for ( i = 0; i < *EXtexnum; i++ ){ - if ( !stricmp( EXtex + i*65, token ) ) return; + if ( !Q_stricmp( EXtex + i*65, token ) ) return; } strcpy ( texlist + (*texnum)*65, token ); (*texnum)++; @@ -1677,7 +1677,7 @@ void tex2list2( char* texlist, int *texnum, char* EXtex, int *EXtexnum, char* rE //StripExtension( token ); char* dot = strrchr( token, '.' ); if ( dot != NULL){ - if ( stricmp( dot, ".tga" ) && stricmp( dot, ".jpg" ) && stricmp( dot, ".png" ) ){ + if ( Q_stricmp( dot, ".tga" ) && Q_stricmp( dot, ".jpg" ) && Q_stricmp( dot, ".png" ) ){ Sys_Printf( "WARNING4: %s : weird or missing extension in shader\n", token ); } else{ @@ -1690,13 +1690,13 @@ void tex2list2( char* texlist, int *texnum, char* EXtex, int *EXtexnum, char* rE /* exclude */ for ( i = 0; i < *texnum; i++ ){ - if ( !stricmp( texlist + i*65, texlist + (*texnum)*65 ) ) return; + if ( !Q_stricmp( texlist + i*65, texlist + (*texnum)*65 ) ) return; } for ( i = 0; i < *EXtexnum; i++ ){ - if ( !stricmp( EXtex + i*65, texlist + (*texnum)*65 ) ) return; + if ( !Q_stricmp( EXtex + i*65, texlist + (*texnum)*65 ) ) return; } for ( i = 0; i < *rEXtexnum; i++ ){ - if ( !stricmp( rEXtex + i*65, texlist + (*texnum)*65 ) ) return; + if ( !Q_stricmp( rEXtex + i*65, texlist + (*texnum)*65 ) ) return; } (*texnum)++; return; @@ -1717,7 +1717,7 @@ void res2list( char* data, int *num ){ } if ( *( data + (*num)*65 ) == '\0') return; for ( i = 0; i < *num; i++ ){ - if ( !stricmp( data + i*65, data + (*num)*65 ) ) return; + if ( !Q_stricmp( data + i*65, data + (*num)*65 ) ) return; } (*num)++; return; @@ -1825,7 +1825,7 @@ int pk3BSPMain( int argc, char **argv ){ epair_t *ep; for ( ep = entities[0].epairs; ep != NULL; ep = ep->next ) { - if ( !strnicmp( ep->key, "vertexremapshader", 17 ) ) { + if ( !Q_strncasecmp( ep->key, "vertexremapshader", 17 ) ) { sscanf( ep->value, "%*[^;] %*[;] %s", pk3Shaders + pk3ShadersN*65 ); res2list( pk3Shaders, &pk3ShadersN ); } @@ -1846,13 +1846,13 @@ int pk3BSPMain( int argc, char **argv ){ res2list( pk3Sounds, &pk3SoundsN ); } - if ( !stricmp( ValueForKey( &entities[i], "classname" ), "func_plat" ) ){ + if ( !Q_stricmp( ValueForKey( &entities[i], "classname" ), "func_plat" ) ){ strcpy( pk3Sounds + pk3SoundsN*65, "sound/movers/plats/pt1_strt.wav"); res2list( pk3Sounds, &pk3SoundsN ); strcpy( pk3Sounds + pk3SoundsN*65, "sound/movers/plats/pt1_end.wav"); res2list( pk3Sounds, &pk3SoundsN ); } - if ( !stricmp( ValueForKey( &entities[i], "classname" ), "target_push" ) ){ + if ( !Q_stricmp( ValueForKey( &entities[i], "classname" ), "target_push" ) ){ if ( !(IntForKey( &entities[i], "spawnflags") & 1) ){ strcpy( pk3Sounds + pk3SoundsN*65, "sound/misc/windfly.wav"); res2list( pk3Sounds, &pk3SoundsN ); @@ -1940,19 +1940,19 @@ int pk3BSPMain( int argc, char **argv ){ } /* blocks */ - if ( !stricmp( token, "textures" ) ){ + if ( !Q_stricmp( token, "textures" ) ){ parseEXblock ( ExTextures, &ExTexturesN, exName ); } - else if ( !stricmp( token, "shaders" ) ){ + else if ( !Q_stricmp( token, "shaders" ) ){ parseEXblock ( ExShaders, &ExShadersN, exName ); } - else if ( !stricmp( token, "shaderfiles" ) ){ + else if ( !Q_stricmp( token, "shaderfiles" ) ){ parseEXblock ( ExShaderfiles, &ExShaderfilesN, exName ); } - else if ( !stricmp( token, "sounds" ) ){ + else if ( !Q_stricmp( token, "sounds" ) ){ parseEXblock ( ExSounds, &ExSoundsN, exName ); } - else if ( !stricmp( token, "videos" ) ){ + else if ( !Q_stricmp( token, "videos" ) ){ parseEXblock ( ExVideos, &ExVideosN, exName ); } else{ @@ -1965,7 +1965,7 @@ int pk3BSPMain( int argc, char **argv ){ for ( i = 0; i < ExTexturesN; i++ ){ for ( j = 0; j < ExShadersN; j++ ){ - if ( !stricmp( ExTextures + i*65, ExShaders + j*65 ) ){ + if ( !Q_stricmp( ExTextures + i*65, ExShaders + j*65 ) ){ break; } } @@ -1995,7 +1995,7 @@ skipEXfile: /* can exclude pure textures right now, shouldn't create shaders for them anyway */ for ( i = 0; i < pk3ShadersN ; i++ ){ for ( j = 0; j < ExPureTexturesN ; j++ ){ - if ( !stricmp( pk3Shaders + i*65, ExPureTextures + j*65 ) ){ + if ( !Q_stricmp( pk3Shaders + i*65, ExPureTextures + j*65 ) ){ *( pk3Shaders + i*65 ) = '\0'; break; } @@ -2019,7 +2019,7 @@ skipEXfile: /* do wanna le shader file? */ for ( j = 0; j < ExShaderfilesN; j++ ){ - if ( !stricmp( ExShaderfiles + j*65, pk3Shaderfiles + i*65 ) ){ + if ( !Q_stricmp( ExShaderfiles + j*65, pk3Shaderfiles + i*65 ) ){ ShaderFileExcluded = qtrue; reasonShaderFile = ExShaderfiles + j*65; break; @@ -2036,7 +2036,7 @@ skipEXfile: /* does it contain restricted shaders/textures? */ for ( j = 0; j < ExShadersN; j++ ){ - if ( !stricmp( ExShaders + j*65, token ) ){ + if ( !Q_stricmp( ExShaders + j*65, token ) ){ ShaderFileExcluded = qtrue; reasonShader = ExShaders + j*65; break; @@ -2045,7 +2045,7 @@ skipEXfile: if ( ShaderFileExcluded ) break; for ( j = 0; j < ExPureTexturesN; j++ ){ - if ( !stricmp( ExPureTextures + j*65, token ) ){ + if ( !Q_stricmp( ExPureTextures + j*65, token ) ){ ShaderFileExcluded = qtrue; reasonShader = ExPureTextures + j*65; break; @@ -2101,7 +2101,7 @@ skipEXfile: /* do wanna le shader? */ wantShader = qfalse; for ( j = 0; j < pk3ShadersN; j++ ){ - if ( !stricmp( pk3Shaders + j*65, token) ){ + if ( !Q_stricmp( pk3Shaders + j*65, token) ){ shader = j; wantShader = qtrue; break; @@ -2146,15 +2146,15 @@ skipEXfile: if ( !strcmp( token, "{" ) ) { Sys_Printf( "WARNING9: %s : line %d : opening brace inside shader stage\n", temp, scriptline ); } - if ( !stricmp( token, "mapComp" ) || !stricmp( token, "mapNoComp" ) || !stricmp( token, "animmapcomp" ) || !stricmp( token, "animmapnocomp" ) ){ + if ( !Q_stricmp( token, "mapComp" ) || !Q_stricmp( token, "mapNoComp" ) || !Q_stricmp( token, "animmapcomp" ) || !Q_stricmp( token, "animmapnocomp" ) ){ Sys_Printf( "WARNING7: %s : line %d : unsupported '%s' map directive\n", temp, scriptline, token ); } /* skip the shader */ if ( !wantShader ) continue; /* digest any images */ - if ( !stricmp( token, "map" ) || - !stricmp( token, "clampMap" ) ) { + if ( !Q_stricmp( token, "map" ) || + !Q_stricmp( token, "clampMap" ) ) { hasmap = qtrue; /* get an image */ GetToken( qfalse ); @@ -2162,8 +2162,8 @@ skipEXfile: tex2list( pk3Textures, &pk3TexturesN, ExTextures, &ExTexturesN ); } } - else if ( !stricmp( token, "animMap" ) || - !stricmp( token, "clampAnimMap" ) ) { + else if ( !Q_stricmp( token, "animMap" ) || + !Q_stricmp( token, "clampAnimMap" ) ) { hasmap = qtrue; GetToken( qfalse );// skip num while ( TokenAvailable() ){ @@ -2171,7 +2171,7 @@ skipEXfile: tex2list( pk3Textures, &pk3TexturesN, ExTextures, &ExTexturesN ); } } - else if ( !stricmp( token, "videoMap" ) ){ + else if ( !Q_stricmp( token, "videoMap" ) ){ hasmap = qtrue; GetToken( qfalse ); FixDOSName( token ); @@ -2181,12 +2181,12 @@ skipEXfile: } FixDOSName( token ); for ( j = 0; j < pk3VideosN; j++ ){ - if ( !stricmp( pk3Videos + j*65, token ) ){ + if ( !Q_stricmp( pk3Videos + j*65, token ) ){ goto away; } } for ( j = 0; j < ExVideosN; j++ ){ - if ( !stricmp( ExVideos + j*65, token ) ){ + if ( !Q_stricmp( ExVideos + j*65, token ) ){ goto away; } } @@ -2197,7 +2197,7 @@ skipEXfile: } } } - else if ( !strnicmp( token, "implicit", 8 ) ){ + else if ( !Q_strncasecmp( token, "implicit", 8 ) ){ Sys_Printf( "WARNING5: %s : line %d : unsupported %s shader\n", temp, scriptline, token ); } /* skip the shader */ @@ -2208,22 +2208,22 @@ skipEXfile: ----------------------------------------------------------------- */ /* match surfaceparm */ - else if ( !stricmp( token, "surfaceparm" ) ) { + else if ( !Q_stricmp( token, "surfaceparm" ) ) { GetToken( qfalse ); - if ( !stricmp( token, "nodraw" ) ) { + if ( !Q_stricmp( token, "nodraw" ) ) { wantShader = qfalse; *( pk3Shaders + shader*65 ) = '\0'; } } /* skyparms */ - else if ( !stricmp( token, "skyParms" ) ) { + else if ( !Q_stricmp( token, "skyParms" ) ) { hasmap = qtrue; /* get image base */ GetToken( qfalse ); /* ignore bogus paths */ - if ( stricmp( token, "-" ) && stricmp( token, "full" ) ) { + if ( Q_stricmp( token, "-" ) && Q_stricmp( token, "full" ) ) { strcpy ( temp, token ); sprintf( token, "%s_up", temp ); tex2list( pk3Textures, &pk3TexturesN, ExTextures, &ExTexturesN ); @@ -2242,7 +2242,7 @@ skipEXfile: GetToken( qfalse ); GetToken( qfalse ); } - else if ( !stricmp( token, "fogparms" ) ){ + else if ( !Q_stricmp( token, "fogparms" ) ){ hasmap = qtrue; } } @@ -2250,7 +2250,7 @@ skipEXfile: //exclude shader if ( wantShader ){ for ( j = 0; j < ExShadersN; j++ ){ - if ( !stricmp( ExShaders + j*65, pk3Shaders + shader*65 ) ){ + if ( !Q_stricmp( ExShaders + j*65, pk3Shaders + shader*65 ) ){ wantShader = qfalse; *( pk3Shaders + shader*65 ) = '\0'; break; @@ -2305,14 +2305,14 @@ skipEXfile: if ( *( pk3Shaders + i*65 ) != '\0' ){ FixDOSName( pk3Shaders + i*65 ); for ( j = 0; j < pk3TexturesN; j++ ){ - if ( !stricmp( pk3Shaders + i*65, pk3Textures + j*65 ) ){ + if ( !Q_stricmp( pk3Shaders + i*65, pk3Textures + j*65 ) ){ *( pk3Shaders + i*65 ) = '\0'; break; } } if ( *( pk3Shaders + i*65 ) == '\0' ) continue; for ( j = 0; j < ExTexturesN; j++ ){ - if ( !stricmp( pk3Shaders + i*65, ExTextures + j*65 ) ){ + if ( !Q_stricmp( pk3Shaders + i*65, ExTextures + j*65 ) ){ *( pk3Shaders + i*65 ) = '\0'; break; } @@ -2323,7 +2323,7 @@ skipEXfile: //snds for ( i = 0; i < pk3SoundsN; i++ ){ for ( j = 0; j < ExSoundsN; j++ ){ - if ( !stricmp( pk3Sounds + i*65, ExSounds + j*65 ) ){ + if ( !Q_stricmp( pk3Sounds + i*65, ExSounds + j*65 ) ){ *( pk3Sounds + i*65 ) = '\0'; break; } @@ -2429,7 +2429,8 @@ skipEXfile: Sys_Printf( "\n\t.bsp and stuff\n" ); sprintf( temp, "maps/%s.bsp", nameOFmap ); - if ( vfsPackFile( temp, packname, 10 ) ){ + //if ( vfsPackFile( temp, packname, 10 ) ){ + if ( vfsPackFile_Absolute_Path( source, temp, packname, 10 ) ){ Sys_Printf( "++%s\n", temp ); } else{ @@ -2550,19 +2551,19 @@ int repackBSPMain( int argc, char **argv ){ } /* blocks */ - if ( !stricmp( token, "textures" ) ){ + if ( !Q_stricmp( token, "textures" ) ){ parseEXblock ( ExTextures, &ExTexturesN, exName ); } - else if ( !stricmp( token, "shaders" ) ){ + else if ( !Q_stricmp( token, "shaders" ) ){ parseEXblock ( ExShaders, &ExShadersN, exName ); } - else if ( !stricmp( token, "shaderfiles" ) ){ + else if ( !Q_stricmp( token, "shaderfiles" ) ){ parseEXblock ( ExShaderfiles, &ExShaderfilesN, exName ); } - else if ( !stricmp( token, "sounds" ) ){ + else if ( !Q_stricmp( token, "sounds" ) ){ parseEXblock ( ExSounds, &ExSoundsN, exName ); } - else if ( !stricmp( token, "videos" ) ){ + else if ( !Q_stricmp( token, "videos" ) ){ parseEXblock ( ExVideos, &ExVideosN, exName ); } else{ @@ -2575,7 +2576,7 @@ int repackBSPMain( int argc, char **argv ){ for ( i = 0; i < ExTexturesN; i++ ){ for ( j = 0; j < ExShadersN; j++ ){ - if ( !stricmp( ExTextures + i*65, ExShaders + j*65 ) ){ + if ( !Q_stricmp( ExTextures + i*65, ExShaders + j*65 ) ){ break; } } @@ -2647,19 +2648,19 @@ skipEXfile: } /* blocks */ - if ( !stricmp( token, "textures" ) ){ + if ( !Q_stricmp( token, "textures" ) ){ parseEXblock ( rExTextures, &rExTexturesN, exName ); } - else if ( !stricmp( token, "shaders" ) ){ + else if ( !Q_stricmp( token, "shaders" ) ){ parseEXblock ( rExShaders, &rExShadersN, exName ); } - else if ( !stricmp( token, "shaderfiles" ) ){ + else if ( !Q_stricmp( token, "shaderfiles" ) ){ parseEXblock ( rExShaderfiles, &rExShaderfilesN, exName ); } - else if ( !stricmp( token, "sounds" ) ){ + else if ( !Q_stricmp( token, "sounds" ) ){ parseEXblock ( rExSounds, &rExSoundsN, exName ); } - else if ( !stricmp( token, "videos" ) ){ + else if ( !Q_stricmp( token, "videos" ) ){ parseEXblock ( rExVideos, &rExVideosN, exName ); } else{ @@ -2693,7 +2694,7 @@ skipEXrefile: /* do some path mangling */ strcpy( source, ExpandArg( argv[ argc - 1 ] ) ); - if ( !stricmp( strrchr( source, '.' ), ".bsp" ) ){ + if ( !Q_stricmp( strrchr( source, '.' ), ".bsp" ) ){ strcpy( bspList, source ); bspListN++; } @@ -2790,7 +2791,7 @@ skipEXrefile: epair_t *ep; for ( ep = entities[0].epairs; ep != NULL; ep = ep->next ) { - if ( !strnicmp( ep->key, "vertexremapshader", 17 ) ) { + if ( !Q_strncasecmp( ep->key, "vertexremapshader", 17 ) ) { sscanf( ep->value, "%*[^;] %*[;] %s", pk3Shaders + pk3ShadersN*65 ); res2list( pk3Shaders, &pk3ShadersN ); } @@ -2811,13 +2812,13 @@ skipEXrefile: res2list( pk3Sounds, &pk3SoundsN ); } - if ( !stricmp( ValueForKey( &entities[i], "classname" ), "func_plat" ) ){ + if ( !Q_stricmp( ValueForKey( &entities[i], "classname" ), "func_plat" ) ){ strcpy( pk3Sounds + pk3SoundsN*65, "sound/movers/plats/pt1_strt.wav"); res2list( pk3Sounds, &pk3SoundsN ); strcpy( pk3Sounds + pk3SoundsN*65, "sound/movers/plats/pt1_end.wav"); res2list( pk3Sounds, &pk3SoundsN ); } - if ( !stricmp( ValueForKey( &entities[i], "classname" ), "target_push" ) ){ + if ( !Q_stricmp( ValueForKey( &entities[i], "classname" ), "target_push" ) ){ if ( !(IntForKey( &entities[i], "spawnflags") & 1) ){ strcpy( pk3Sounds + pk3SoundsN*65, "sound/misc/windfly.wav"); res2list( pk3Sounds, &pk3SoundsN ); @@ -2988,7 +2989,7 @@ skipEXrefile: /* can exclude pure *base* textures right now, shouldn't create shaders for them anyway */ for ( i = 0; i < pk3ShadersN ; i++ ){ for ( j = 0; j < ExPureTexturesN ; j++ ){ - if ( !stricmp( pk3Shaders + i*65, ExPureTextures + j*65 ) ){ + if ( !Q_stricmp( pk3Shaders + i*65, ExPureTextures + j*65 ) ){ *( pk3Shaders + i*65 ) = '\0'; break; } @@ -2997,7 +2998,7 @@ skipEXrefile: /* can exclude repack.exclude shaders, assuming they got all their images */ for ( i = 0; i < pk3ShadersN ; i++ ){ for ( j = 0; j < rExShadersN ; j++ ){ - if ( !stricmp( pk3Shaders + i*65, rExShaders + j*65 ) ){ + if ( !Q_stricmp( pk3Shaders + i*65, rExShaders + j*65 ) ){ *( pk3Shaders + i*65 ) = '\0'; break; } @@ -3040,7 +3041,7 @@ skipEXrefile: /* do wanna le shader? */ wantShader = qfalse; for ( j = 0; j < pk3ShadersN; j++ ){ - if ( !stricmp( pk3Shaders + j*65, token) ){ + if ( !Q_stricmp( pk3Shaders + j*65, token) ){ shader = j; wantShader = qtrue; break; @@ -3048,7 +3049,7 @@ skipEXrefile: } if ( wantShader ){ for ( j = 0; j < rExTexturesN ; j++ ){ - if ( !stricmp( pk3Shaders + shader*65, rExTextures + j*65 ) ){ + if ( !Q_stricmp( pk3Shaders + shader*65, rExTextures + j*65 ) ){ Sys_Printf( "WARNING3: %s : about to include shader for excluded texture\n", pk3Shaders + shader*65 ); break; } @@ -3101,8 +3102,8 @@ skipEXrefile: if ( !wantShader ) continue; /* digest any images */ - if ( !stricmp( token, "map" ) || - !stricmp( token, "clampMap" ) ) { + if ( !Q_stricmp( token, "map" ) || + !Q_stricmp( token, "clampMap" ) ) { strcat( shaderText, "\n\t\t" ); strcat( shaderText, token ); hasmap = qtrue; @@ -3115,8 +3116,8 @@ skipEXrefile: strcat( shaderText, " " ); strcat( shaderText, token ); } - else if ( !stricmp( token, "animMap" ) || - !stricmp( token, "clampAnimMap" ) ) { + else if ( !Q_stricmp( token, "animMap" ) || + !Q_stricmp( token, "clampAnimMap" ) ) { strcat( shaderText, "\n\t\t" ); strcat( shaderText, token ); hasmap = qtrue; @@ -3132,7 +3133,7 @@ skipEXrefile: } tokenready = qtrue; } - else if ( !stricmp( token, "videoMap" ) ){ + else if ( !Q_stricmp( token, "videoMap" ) ){ strcat( shaderText, "\n\t\t" ); strcat( shaderText, token ); hasmap = qtrue; @@ -3146,17 +3147,17 @@ skipEXrefile: } FixDOSName( token ); for ( j = 0; j < pk3VideosN; j++ ){ - if ( !stricmp( pk3Videos + j*65, token ) ){ + if ( !Q_stricmp( pk3Videos + j*65, token ) ){ goto away; } } for ( j = 0; j < ExVideosN; j++ ){ - if ( !stricmp( ExVideos + j*65, token ) ){ + if ( !Q_stricmp( ExVideos + j*65, token ) ){ goto away; } } for ( j = 0; j < rExVideosN; j++ ){ - if ( !stricmp( rExVideos + j*65, token ) ){ + if ( !Q_stricmp( rExVideos + j*65, token ) ){ goto away; } } @@ -3165,7 +3166,7 @@ skipEXrefile: away: j = 0; } - else if ( !stricmp( token, "mapComp" ) || !stricmp( token, "mapNoComp" ) || !stricmp( token, "animmapcomp" ) || !stricmp( token, "animmapnocomp" ) ){ + else if ( !Q_stricmp( token, "mapComp" ) || !Q_stricmp( token, "mapNoComp" ) || !Q_stricmp( token, "animmapcomp" ) || !Q_stricmp( token, "animmapnocomp" ) ){ Sys_Printf( "WARNING7: %s : %s shader\n", pk3Shaders + shader*65, token ); hasmap = qtrue; if ( line == scriptline ){ @@ -3195,18 +3196,18 @@ skipEXrefile: ----------------------------------------------------------------- */ /* match surfaceparm */ - else if ( !stricmp( token, "surfaceparm" ) ) { + else if ( !Q_stricmp( token, "surfaceparm" ) ) { strcat( shaderText, "\n\tsurfaceparm " ); GetToken( qfalse ); strcat( shaderText, token ); - if ( !stricmp( token, "nodraw" ) ) { + if ( !Q_stricmp( token, "nodraw" ) ) { wantShader = qfalse; *( pk3Shaders + shader*65 ) = '\0'; } } /* skyparms */ - else if ( !stricmp( token, "skyParms" ) ) { + else if ( !Q_stricmp( token, "skyParms" ) ) { strcat( shaderText, "\n\tskyParms " ); hasmap = qtrue; /* get image base */ @@ -3214,7 +3215,7 @@ skipEXrefile: strcat( shaderText, token ); /* ignore bogus paths */ - if ( stricmp( token, "-" ) && stricmp( token, "full" ) ) { + if ( Q_stricmp( token, "-" ) && Q_stricmp( token, "full" ) ) { strcpy ( temp, token ); sprintf( token, "%s_up", temp ); tex2list2( pk3Textures, &pk3TexturesN, ExTextures, &ExTexturesN, rExTextures, &rExTexturesN ); @@ -3237,7 +3238,7 @@ skipEXrefile: strcat( shaderText, " " ); strcat( shaderText, token ); } - else if ( !strnicmp( token, "implicit", 8 ) ){ + else if ( !Q_strncasecmp( token, "implicit", 8 ) ){ Sys_Printf( "WARNING5: %s : %s shader\n", pk3Shaders + shader*65, token ); hasmap = qtrue; if ( line == scriptline ){ @@ -3249,7 +3250,7 @@ skipEXrefile: strcat( shaderText, token ); } } - else if ( !stricmp( token, "fogparms" ) ){ + else if ( !Q_stricmp( token, "fogparms" ) ){ hasmap = qtrue; if ( line == scriptline ){ strcat( shaderText, " " ); @@ -3273,7 +3274,7 @@ skipEXrefile: //exclude shader if ( wantShader ){ for ( j = 0; j < ExShadersN; j++ ){ - if ( !stricmp( ExShaders + j*65, pk3Shaders + shader*65 ) ){ + if ( !Q_stricmp( ExShaders + j*65, pk3Shaders + shader*65 ) ){ wantShader = qfalse; *( pk3Shaders + shader*65 ) = '\0'; break; @@ -3304,7 +3305,7 @@ skipEXrefile: FixDOSName( pk3Shaders + i*65 ); //what if theres properly slashed one in the list? for ( j = 0; j < pk3ShadersN; j++ ){ - if ( !stricmp( pk3Shaders + i*65, pk3Shaders + j*65 ) && (i != j) ){ + if ( !Q_stricmp( pk3Shaders + i*65, pk3Shaders + j*65 ) && (i != j) ){ *( pk3Shaders + i*65 ) = '\0'; break; } @@ -3312,21 +3313,21 @@ skipEXrefile: } if ( *( pk3Shaders + i*65 ) == '\0' ) continue; for ( j = 0; j < pk3TexturesN; j++ ){ - if ( !stricmp( pk3Shaders + i*65, pk3Textures + j*65 ) ){ + if ( !Q_stricmp( pk3Shaders + i*65, pk3Textures + j*65 ) ){ *( pk3Shaders + i*65 ) = '\0'; break; } } if ( *( pk3Shaders + i*65 ) == '\0' ) continue; for ( j = 0; j < ExTexturesN; j++ ){ - if ( !stricmp( pk3Shaders + i*65, ExTextures + j*65 ) ){ + if ( !Q_stricmp( pk3Shaders + i*65, ExTextures + j*65 ) ){ *( pk3Shaders + i*65 ) = '\0'; break; } } if ( *( pk3Shaders + i*65 ) == '\0' ) continue; for ( j = 0; j < rExTexturesN; j++ ){ - if ( !stricmp( pk3Shaders + i*65, rExTextures + j*65 ) ){ + if ( !Q_stricmp( pk3Shaders + i*65, rExTextures + j*65 ) ){ *( pk3Shaders + i*65 ) = '\0'; break; } @@ -3337,14 +3338,14 @@ skipEXrefile: //snds for ( i = 0; i < pk3SoundsN; i++ ){ for ( j = 0; j < ExSoundsN; j++ ){ - if ( !stricmp( pk3Sounds + i*65, ExSounds + j*65 ) ){ + if ( !Q_stricmp( pk3Sounds + i*65, ExSounds + j*65 ) ){ *( pk3Sounds + i*65 ) = '\0'; break; } } if ( *( pk3Sounds + i*65 ) == '\0' ) continue; for ( j = 0; j < rExSoundsN; j++ ){ - if ( !stricmp( pk3Sounds + i*65, rExSounds + j*65 ) ){ + if ( !Q_stricmp( pk3Sounds + i*65, rExSounds + j*65 ) ){ *( pk3Sounds + i*65 ) = '\0'; break; } -- 2.39.2