option -randomsamples: makes -samples use adaptive random subsampling (only subsample...
[divverent/netradiant.git] / plugins / textool / ControlPointsManager.h
1 /*
2 Copyright (C) 1999-2006 Id Software, Inc. and contributors.
3 For a list of contributors, see the accompanying CONTRIBUTORS file.
4
5 This file is part of GtkRadiant.
6
7 GtkRadiant is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
11
12 GtkRadiant is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with GtkRadiant; if not, write to the Free Software
19 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
20 */
21
22 //-----------------------------------------------------------------------------
23 //
24 // DESCRIPTION:
25 // a class to handle control points in a 2D view
26 // TODO: this one can be placed under an interface, and provided to the editor as service
27 //
28 // NOTE: the C2DView *m_p2DView is the orthogonal mapping between window and ST space
29 // in Drag mode (for rotation) we need an orthonormal XY space
30 // we do ST <-> XY transformations using the texture size
31 // ( for translation-only moves, orthogonal is enough )
32 // FIXME: is there a better way to deal between Window space <-> ST space <-> XY space ?
33 //
34 // NOTE: ControlPointsManagers are a bit different between brush faces and patches
35 // so there's a base virtual class, and we have two versions
36
37 #ifndef _CONTROLPOINTSMANAGER_H_
38 #define _CONTROLPOINTSMANAGER_H_
39
40 class CControlPointsManager
41 {
42 protected:
43   // used by Render
44   OpenGLBinding *m_pQglTable;
45   C2DView               *m_p2DView;
46 public:
47   CControlPointsManager() { m_pQglTable = NULL; m_p2DView = NULL; }
48   virtual ~CControlPointsManager() { }
49   void Init( C2DView *p2DView, OpenGLBinding *pQglTable ) { m_pQglTable = pQglTable; m_p2DView = p2DView; }
50
51   virtual bool OnLButtonDown (int x, int y) = 0;
52   virtual bool OnMouseMove (int x, int y) = 0;
53   virtual bool OnLButtonUp (int x, int y) = 0;
54
55   virtual void render() = 0;
56   virtual void Commit() = 0;
57 };
58
59 // brush face manager
60 class CControlPointsManagerBFace : public CControlPointsManager
61 {
62   enum          EManagerState { Idle, Drag } ManagerState;
63   int                   m_NumPoints;
64   // initial geometry
65   CtrlPts_t     m_RefPts;
66   // current geometry
67   CtrlPts_t     *m_pPts;
68   // transform matrix ( 2DView is Window <-> ST )
69   float         m_TM[2][3];
70   // texture size for ST <-> XY
71   int                   m_TexSize[2];
72   // used when translating
73   float         m_TransOffset[2];
74   // dragged point index
75   int                   m_iDragPoint;
76   // do we have an anchor ?
77   bool          m_bGotAnchor;
78   // anchor point index
79   int                   m_iAnchorPoint;
80   // coordinates of Anchor
81   float         m_Anchor[2];
82   // used for commit
83   _QERFaceData  *m_pFaceData;
84
85 public:
86   // construction / init -------------------------------------------------
87   CControlPointsManagerBFace() { ManagerState = Idle; }
88   virtual ~CControlPointsManagerBFace() { }
89   // NOTE: pQglTable is sent to CControlPointsManager::Init
90   void Init(int iPts, CtrlPts_t *Pts, C2DView *p2DView, int TexSize[2], _QERFaceData* pFaceData, OpenGLBinding *pQglTable);
91   // CControlPointsManager interface -------------------------------------
92
93   virtual bool OnLButtonDown (int x, int y);
94   virtual bool OnMouseMove (int x, int y);
95   virtual bool OnLButtonUp (int x, int y);
96
97   virtual void render();
98   virtual void Commit();
99
100 private:
101   // internal members
102   void UpdateCtrlPts();
103   void ComputeTransOffset(int i);
104   void XYSpaceForSTSpace( float xy[2], const float st[2] );
105 };
106
107 // patch manager
108 class CControlPointsManagerPatch : public CControlPointsManager
109 {
110   enum          EManagerState { Idle, Drag } ManagerState;
111   // reference data, used for commits
112   patchMesh_t* m_pPatch;
113   // work patch, holds current data
114   patchMesh_t* m_pWorkPatch;
115   int                   m_iDragPoint[2];
116
117 public:
118   // construction / init -------------------------------------------------
119   CControlPointsManagerPatch() { ManagerState = Idle; }
120   virtual ~CControlPointsManagerPatch() { }
121   // NOTE: pQglTable is sent to CControlPointsManager::Init
122   void Init( patchMesh_t* pWorkPatch, C2DView *p2DView, OpenGLBinding *pQglTable, patchMesh_t* pPatch );
123   // CControlPointsManager interface -------------------------------------
124
125   virtual bool OnLButtonDown (int x, int y);
126   virtual bool OnMouseMove (int x, int y);
127   virtual bool OnLButtonUp (int x, int y);
128
129   virtual void render();
130   virtual void Commit();
131 };
132
133 #endif