Merge branch 'master' into divVerent/farplanedist-sky-fix
[xonotic/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