]> git.xonotic.org Git - xonotic/netradiant.git/blob - contrib/meshtex/SetScaleDialog.h
Merge branch 'master' into master-merge
[xonotic/netradiant.git] / contrib / meshtex / SetScaleDialog.h
1 /**
2  * @file SetScaleDialog.h
3  * Declares the SetScaleDialog class.
4  * @ingroup meshtex-ui
5  */
6
7 /*
8  * Copyright 2012 Joel Baxter
9  *
10  * This file is part of MeshTex.
11  *
12  * MeshTex is free software: you can redistribute it and/or modify
13  * it under the terms of the GNU General Public License as published by
14  * the Free Software Foundation, either version 2 of the License, or
15  * (at your option) any later version.
16  *
17  * MeshTex is distributed in the hope that it will be useful,
18  * but WITHOUT ANY WARRANTY; without even the implied warranty of
19  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
20  * GNU General Public License for more details.
21  *
22  * You should have received a copy of the GNU General Public License
23  * along with MeshTex.  If not, see <http://www.gnu.org/licenses/>.
24  */
25
26 #if !defined(INCLUDED_SETSCALEDIALOG_H)
27 #define INCLUDED_SETSCALEDIALOG_H
28
29 #include "GenericDialog.h"
30 #include "MeshVisitor.h"
31
32 /**
33  * Subclass of GenericDialog that implements the window summoned by selecting
34  * the Set S/T Scale menu entry. This window is used to control the scaling
35  * of the S and/or T texture axes.
36  * 
37  * @image html setscale.png
38  *
39  * @ingroup meshtex-ui
40  */
41 class SetScaleDialog : public GenericDialog
42 {
43 private: // private types
44
45    /**
46     * Visitor for applying the chosen scaling to a mesh.
47     */
48    class SetScaleVisitor : public MeshVisitor
49    {
50    public:
51       /**
52        * Encapsulation of all the arguments that can affect either the S or T
53        * texture axis. See MeshEntity::SetScale for details of how these arguments
54        * are interpreted.
55        */
56       typedef struct {
57          /**
58           * Pointer to alignment slice description; if NULL, slice 0 is assumed.
59           */
60          const MeshEntity::SliceDesignation *alignSlice;
61          /**
62           * Pointer to reference slice description, including how to use the reference;
63           * NULL if no reference.
64           */
65          const MeshEntity::RefSliceDescriptor *refSlice;
66          /**
67           * true if naturalScaleOrTiles is a factor of the Radiant natural scale;
68           * false if naturalScaleOrTiles is a number of tiles.
69           */
70          bool naturalScale;
71          /**
72           * Scaling determinant, interpreted according to the naturalScale parameter.
73           */
74          float scaleOrTiles;
75       } SliceArgs;
76    public:
77       SetScaleVisitor(const SliceArgs *rowArgs,
78                       const SliceArgs *colArgs);
79    private:
80       bool Execute(MeshEntity& meshEntity) const;
81    private:
82       const SliceArgs *_rowArgs;
83       const SliceArgs *_colArgs;
84    };
85
86 public: // public methods
87
88    SetScaleDialog(const std::string& key);
89    ~SetScaleDialog();
90    bool Apply();
91    void PopulateSWidgets(float scale,
92                          float tiles);
93    void PopulateTWidgets(float scale,
94                          float tiles);
95
96 private: // private methods
97
98    void PopulateEntry(const char *widgetName,
99                       float value);
100
101 private: // private member vars
102
103    /**
104     * Action-less mesh visitor used purely to count the number of selected mesh
105     * entities.
106     */
107    SmartPointer<MeshVisitor> _nullVisitor;
108 };
109
110 #endif // #if !defined(INCLUDED_SETSCALEDIALOG_H)