* m2 in Surface Inspector->fit width/height = fit width/height, keep height/width

This commit is contained in:
Garux 2018-02-19 17:28:05 +03:00
parent c1b9b17635
commit c878333c7b
8 changed files with 63 additions and 29 deletions

View File

@ -600,8 +600,8 @@ void Convert( TexdefTypeId in, TexdefTypeId out, const Plane3& plane ){
m_scaleApplied = true; m_scaleApplied = true;
} }
void fit( const Vector3& normal, const Winding& winding, float s_repeat, float t_repeat ){ void fit( const Vector3& normal, const Winding& winding, float s_repeat, float t_repeat, bool only_dimension ){
Texdef_FitTexture( m_projection, m_shader.width(), m_shader.height(), normal, winding, s_repeat, t_repeat ); Texdef_FitTexture( m_projection, m_shader.width(), m_shader.height(), normal, winding, s_repeat, t_repeat, only_dimension );
} }
void emitTextureCoordinates( Winding& winding, const Vector3& normal, const Matrix4& localToWorld ){ void emitTextureCoordinates( Winding& winding, const Vector3& normal, const Matrix4& localToWorld ){
@ -1292,9 +1292,9 @@ void Convert( TexdefTypeId in, TexdefTypeId out ){
texdefChanged(); texdefChanged();
} }
void FitTexture( float s_repeat, float t_repeat ){ void FitTexture( float s_repeat, float t_repeat, bool only_dimension ){
undoSave(); undoSave();
m_texdef.fit( m_plane.plane3().normal(), m_winding, s_repeat, t_repeat ); m_texdef.fit( m_plane.plane3().normal(), m_winding, s_repeat, t_repeat, only_dimension );
texdefChanged(); texdefChanged();
} }

View File

@ -1258,7 +1258,7 @@ void Texdef_Rotate( TextureProjection& projection, float angle ){
} }
} }
void Texdef_FitTexture( TextureProjection& projection, std::size_t width, std::size_t height, const Vector3& normal, const Winding& w, float s_repeat, float t_repeat ){ void Texdef_FitTexture( TextureProjection& projection, std::size_t width, std::size_t height, const Vector3& normal, const Winding& w, float s_repeat, float t_repeat, bool only_dimension ){
if ( w.numpoints < 3 ) { if ( w.numpoints < 3 ) {
return; return;
} }
@ -1293,14 +1293,24 @@ void Texdef_FitTexture( TextureProjection& projection, std::size_t width, std::s
perfect.extents = Vector3( s_repeat * 0.5, t_repeat * 0.5, 1 ); perfect.extents = Vector3( s_repeat * 0.5, t_repeat * 0.5, 1 );
} }
if( t_repeat == 0 ){ if( t_repeat == 0 ){
//fit width if( only_dimension ){ //fit width, keep height
perfect.origin = Vector3( s_repeat * 0.5, s_repeat * 0.5 * bounds.extents.y() / bounds.extents.x(), 0 ); perfect.origin = Vector3( s_repeat * 0.5, bounds.origin.y(), 0 );
perfect.extents = Vector3( s_repeat * 0.5, s_repeat * 0.5 * bounds.extents.y() / bounds.extents.x(), 1 ); perfect.extents = Vector3( s_repeat * 0.5, bounds.extents.y(), 1 );
}
else{ //fit width
perfect.origin = Vector3( s_repeat * 0.5, s_repeat * 0.5 * bounds.extents.y() / bounds.extents.x(), 0 );
perfect.extents = Vector3( s_repeat * 0.5, s_repeat * 0.5 * bounds.extents.y() / bounds.extents.x(), 1 );
}
} }
else if( s_repeat == 0 ){ else if( s_repeat == 0 ){
//fit height if( only_dimension ){ //fit height, keep width
perfect.origin = Vector3( t_repeat * 0.5 * bounds.extents.x() / bounds.extents.y(), t_repeat * 0.5, 0 ); perfect.origin = Vector3( bounds.origin.x(), t_repeat * 0.5, 0 );
perfect.extents = Vector3( t_repeat * 0.5 * bounds.extents.x() / bounds.extents.y(), t_repeat * 0.5, 1 ); perfect.extents = Vector3( bounds.extents.x(), t_repeat * 0.5, 1 );
}
else{ //fit height
perfect.origin = Vector3( t_repeat * 0.5 * bounds.extents.x() / bounds.extents.y(), t_repeat * 0.5, 0 );
perfect.extents = Vector3( t_repeat * 0.5 * bounds.extents.x() / bounds.extents.y(), t_repeat * 0.5, 1 );
}
} }
else{ else{
perfect.origin = Vector3( s_repeat * 0.5, t_repeat * 0.5, 0 ); perfect.origin = Vector3( s_repeat * 0.5, t_repeat * 0.5, 0 );

View File

@ -109,7 +109,7 @@ void Texdef_Scale( TextureProjection& projection, float s, float t );
void Texdef_Rotate( TextureProjection& projection, float angle ); void Texdef_Rotate( TextureProjection& projection, float angle );
void Texdef_ProjectTexture( TextureProjection& projection, std::size_t width, std::size_t height, const Plane3& plane, const texdef_t& texdef, const Vector3* direction ); void Texdef_ProjectTexture( TextureProjection& projection, std::size_t width, std::size_t height, const Plane3& plane, const texdef_t& texdef, const Vector3* direction );
void Texdef_ProjectTexture( TextureProjection& projection, std::size_t width, std::size_t height, const Plane3& plane, TextureProjection other_proj, const Vector3& other_normal ); void Texdef_ProjectTexture( TextureProjection& projection, std::size_t width, std::size_t height, const Plane3& plane, TextureProjection other_proj, const Vector3& other_normal );
void Texdef_FitTexture( TextureProjection& projection, std::size_t width, std::size_t height, const Vector3& normal, const Winding& w, float s_repeat, float t_repeat ); void Texdef_FitTexture( TextureProjection& projection, std::size_t width, std::size_t height, const Vector3& normal, const Winding& w, float s_repeat, float t_repeat, bool only_dimension );
void Texdef_Construct_local2tex( const TextureProjection& projection, std::size_t width, std::size_t height, const Vector3& normal, Matrix4& local2tex ); void Texdef_Construct_local2tex( const TextureProjection& projection, std::size_t width, std::size_t height, const Vector3& normal, Matrix4& local2tex );
void Texdef_Construct_local2tex4projection( const texdef_t& texdef, std::size_t width, std::size_t height, const Vector3& normal, const Vector3* direction, Matrix4& local2tex ); void Texdef_Construct_local2tex4projection( const texdef_t& texdef, std::size_t width, std::size_t height, const Vector3& normal, const Vector3* direction, Matrix4& local2tex );
void Texdef_EmitTextureCoordinates( const TextureProjection& projection, std::size_t width, std::size_t height, Winding& w, const Vector3& normal, const Matrix4& localToWorld ); void Texdef_EmitTextureCoordinates( const TextureProjection& projection, std::size_t width, std::size_t height, Winding& w, const Vector3& normal, const Matrix4& localToWorld );

View File

@ -784,22 +784,23 @@ void Scene_BrushProjectTexture_Component_Selected( scene::Graph& graph, const Te
class FaceFitTexture class FaceFitTexture
{ {
float m_s_repeat, m_t_repeat; const float m_s_repeat, m_t_repeat;
const bool m_only_dimension;
public: public:
FaceFitTexture( float s_repeat, float t_repeat ) : m_s_repeat( s_repeat ), m_t_repeat( t_repeat ){ FaceFitTexture( float s_repeat, float t_repeat, bool only_dimension ) : m_s_repeat( s_repeat ), m_t_repeat( t_repeat ), m_only_dimension( only_dimension ) {
} }
void operator()( Face& face ) const { void operator()( Face& face ) const {
face.FitTexture( m_s_repeat, m_t_repeat ); face.FitTexture( m_s_repeat, m_t_repeat, m_only_dimension );
} }
}; };
void Scene_BrushFitTexture_Selected( scene::Graph& graph, float s_repeat, float t_repeat ){ void Scene_BrushFitTexture_Selected( scene::Graph& graph, float s_repeat, float t_repeat, bool only_dimension ){
Scene_ForEachSelectedBrush_ForEachFace( graph, FaceFitTexture( s_repeat, t_repeat ) ); Scene_ForEachSelectedBrush_ForEachFace( graph, FaceFitTexture( s_repeat, t_repeat, only_dimension ) );
SceneChangeNotify(); SceneChangeNotify();
} }
void Scene_BrushFitTexture_Component_Selected( scene::Graph& graph, float s_repeat, float t_repeat ){ void Scene_BrushFitTexture_Component_Selected( scene::Graph& graph, float s_repeat, float t_repeat, bool only_dimension ){
Scene_ForEachSelectedBrushFace( graph, FaceFitTexture( s_repeat, t_repeat ) ); Scene_ForEachSelectedBrushFace( graph, FaceFitTexture( s_repeat, t_repeat, only_dimension ) );
SceneChangeNotify(); SceneChangeNotify();
} }

View File

@ -83,8 +83,8 @@ void Scene_BrushProjectTexture_Component_Selected( scene::Graph& graph, const te
void Scene_BrushProjectTexture_Selected( scene::Graph& graph, const TextureProjection& projection, const Vector3& normal ); void Scene_BrushProjectTexture_Selected( scene::Graph& graph, const TextureProjection& projection, const Vector3& normal );
void Scene_BrushProjectTexture_Component_Selected( scene::Graph& graph, const TextureProjection& projection, const Vector3& normal ); void Scene_BrushProjectTexture_Component_Selected( scene::Graph& graph, const TextureProjection& projection, const Vector3& normal );
void Scene_BrushFitTexture_Selected( scene::Graph& graph, float s_repeat, float t_repeat ); void Scene_BrushFitTexture_Selected( scene::Graph& graph, float s_repeat, float t_repeat, bool only_dimension );
void Scene_BrushFitTexture_Component_Selected( scene::Graph& graph, float s_repeat, float t_repeat ); void Scene_BrushFitTexture_Component_Selected( scene::Graph& graph, float s_repeat, float t_repeat, bool only_dimension );
typedef struct _GtkMenu GtkMenu; typedef struct _GtkMenu GtkMenu;
void Brush_constructMenu( GtkMenu* menu ); void Brush_constructMenu( GtkMenu* menu );

View File

@ -908,11 +908,11 @@ void Select_ProjectTexture( const TextureProjection& projection, const Vector3&
SceneChangeNotify(); SceneChangeNotify();
} }
void Select_FitTexture( float horizontal, float vertical ){ void Select_FitTexture( float horizontal, float vertical, bool only_dimension ){
if ( GlobalSelectionSystem().Mode() != SelectionSystem::eComponent ) { if ( GlobalSelectionSystem().Mode() != SelectionSystem::eComponent ) {
Scene_BrushFitTexture_Selected( GlobalSceneGraph(), horizontal, vertical ); Scene_BrushFitTexture_Selected( GlobalSceneGraph(), horizontal, vertical, only_dimension );
} }
Scene_BrushFitTexture_Component_Selected( GlobalSceneGraph(), horizontal, vertical ); Scene_BrushFitTexture_Component_Selected( GlobalSceneGraph(), horizontal, vertical, only_dimension );
SceneChangeNotify(); SceneChangeNotify();
} }

View File

@ -70,7 +70,7 @@ void Select_ShiftTexture( float x, float y );
class texdef_t; class texdef_t;
void Select_ProjectTexture( const texdef_t& texdef, const Vector3* direction ); void Select_ProjectTexture( const texdef_t& texdef, const Vector3* direction );
void Select_ProjectTexture( const TextureProjection& projection, const Vector3& normal ); void Select_ProjectTexture( const TextureProjection& projection, const Vector3& normal );
void Select_FitTexture( float horizontal = 1, float vertical = 1 ); void Select_FitTexture( float horizontal = 1, float vertical = 1, bool only_dimension = false );
void FindReplaceTextures( const char* pFind, const char* pReplace, bool bSelected ); void FindReplaceTextures( const char* pFind, const char* pReplace, bool bSelected );
void HideSelected(); void HideSelected();

View File

@ -545,18 +545,37 @@ static void OnBtnFaceFit( GtkWidget *widget, gpointer data ){
SurfaceInspector_FitTexture(); SurfaceInspector_FitTexture();
} }
static void OnBtnFaceFitW( GtkWidget *widget, gpointer data ){ static void OnBtnFaceFitWidth( GtkWidget *widget, gpointer data ){
UndoableCommand undo( "textureAutoFitWidth" ); UndoableCommand undo( "textureAutoFitWidth" );
getSurfaceInspector().exportData(); getSurfaceInspector().exportData();
Select_FitTexture( getSurfaceInspector().m_fitHorizontal, 0 ); Select_FitTexture( getSurfaceInspector().m_fitHorizontal, 0 );
} }
static void OnBtnFaceFitH( GtkWidget *widget, gpointer data ){ static void OnBtnFaceFitHeight( GtkWidget *widget, gpointer data ){
UndoableCommand undo( "textureAutoFitHeight" ); UndoableCommand undo( "textureAutoFitHeight" );
getSurfaceInspector().exportData(); getSurfaceInspector().exportData();
Select_FitTexture( 0, getSurfaceInspector().m_fitVertical ); Select_FitTexture( 0, getSurfaceInspector().m_fitVertical );
} }
static gboolean OnBtnFaceFitWidthOnly( GtkWidget *widget, GdkEventButton *event, gpointer data ){
if ( event->button == 3 && event->type == GDK_BUTTON_PRESS ) {
UndoableCommand undo( "textureAutoFitWidthOnly" );
getSurfaceInspector().exportData();
Select_FitTexture( getSurfaceInspector().m_fitHorizontal, 0, true );
return TRUE;
}
return FALSE;
}
static gboolean OnBtnFaceFitHeightOnly( GtkWidget *widget, GdkEventButton *event, gpointer data ){
if ( event->button == 3 && event->type == GDK_BUTTON_PRESS ) {
UndoableCommand undo( "textureAutoFitHeightOnly" );
getSurfaceInspector().exportData();
Select_FitTexture( 0, getSurfaceInspector().m_fitVertical, true );
return TRUE;
}
return FALSE;
}
typedef const char* FlagName; typedef const char* FlagName;
@ -918,22 +937,26 @@ GtkWindow* SurfaceInspector::BuildDialog(){
} }
{ {
GtkWidget* button = gtk_button_new_with_label( "Width" ); GtkWidget* button = gtk_button_new_with_label( "Width" );
gtk_widget_set_tooltip_text( button, "Fit texture width, scale height\nRightClick: fit width, keep height" );
gtk_widget_show( button ); gtk_widget_show( button );
gtk_table_attach( GTK_TABLE( table ), button, 2, 3, 0, 1, gtk_table_attach( GTK_TABLE( table ), button, 2, 3, 0, 1,
(GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ), (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ),
(GtkAttachOptions) ( 0 ), 0, 0 ); (GtkAttachOptions) ( 0 ), 0, 0 );
g_signal_connect( G_OBJECT( button ), "clicked", g_signal_connect( G_OBJECT( button ), "clicked",
G_CALLBACK( OnBtnFaceFitW ), 0 ); G_CALLBACK( OnBtnFaceFitWidth ), 0 );
g_signal_connect( G_OBJECT( button ), "button_press_event", G_CALLBACK( OnBtnFaceFitWidthOnly ), 0 );
gtk_widget_set_usize( button, 60, -2 ); gtk_widget_set_usize( button, 60, -2 );
} }
{ {
GtkWidget* button = gtk_button_new_with_label( "Height" ); GtkWidget* button = gtk_button_new_with_label( "Height" );
gtk_widget_set_tooltip_text( button, "Fit texture height, scale width\nRightClick: fit height, keep width" );
gtk_widget_show( button ); gtk_widget_show( button );
gtk_table_attach( GTK_TABLE( table ), button, 3, 4, 0, 1, gtk_table_attach( GTK_TABLE( table ), button, 3, 4, 0, 1,
(GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ), (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ),
(GtkAttachOptions) ( 0 ), 0, 0 ); (GtkAttachOptions) ( 0 ), 0, 0 );
g_signal_connect( G_OBJECT( button ), "clicked", g_signal_connect( G_OBJECT( button ), "clicked",
G_CALLBACK( OnBtnFaceFitH ), 0 ); G_CALLBACK( OnBtnFaceFitHeight ), 0 );
g_signal_connect( G_OBJECT( button ), "button_press_event", G_CALLBACK( OnBtnFaceFitHeightOnly ), 0 );
gtk_widget_set_usize( button, 60, -2 ); gtk_widget_set_usize( button, 60, -2 );
} }
{ {