transfer from internal tree r5311 branches/1.4-gpl
[xonotic/netradiant.git] / contrib / camera / listener.cpp
1 /*\r
2 Copyright (C) 1999-2007 id Software, Inc. and contributors.\r
3 For a list of contributors, see the accompanying CONTRIBUTORS file.\r
4 \r
5 This file is part of GtkRadiant.\r
6 \r
7 GtkRadiant is free software; you can redistribute it and/or modify\r
8 it under the terms of the GNU General Public License as published by\r
9 the Free Software Foundation; either version 2 of the License, or\r
10 (at your option) any later version.\r
11 \r
12 GtkRadiant is distributed in the hope that it will be useful,\r
13 but WITHOUT ANY WARRANTY; without even the implied warranty of\r
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
15 GNU General Public License for more details.\r
16 \r
17 You should have received a copy of the GNU General Public License\r
18 along with GtkRadiant; if not, write to the Free Software\r
19 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA\r
20 */\r
21 \r
22 /*\r
23 Camera plugin for GtkRadiant\r
24 Copyright (C) 2002 Splash Damage Ltd.\r
25 */\r
26 \r
27 #include "camera.h"\r
28 \r
29 CListener::CListener()\r
30 {\r
31         refCount = 1;\r
32 \r
33         m_bHooked = FALSE;\r
34 \r
35   m_bLeftMBPressed = m_bRightMBPressed = m_bMiddleMBPressed = false;\r
36 \r
37   oldValid = false;\r
38 \r
39   Register();\r
40 }\r
41 \r
42 CListener::~CListener()\r
43 {\r
44         UnRegister();\r
45 }\r
46 \r
47 void CListener::Register()\r
48 {\r
49         g_UITable.m_pfnHookWindow( this );\r
50   g_pXYWndWrapper = g_UITable.m_pfnGetXYWndWrapper();\r
51         m_bHooked = TRUE;\r
52 }\r
53 \r
54 void CListener::UnRegister()\r
55 {\r
56         if(m_bHooked)\r
57         {\r
58                 g_UITable.m_pfnUnHookWindow( this );\r
59     g_pXYWndWrapper= NULL;\r
60                 m_bHooked = FALSE;\r
61         }\r
62 }\r
63 \r
64 bool CListener::OnMouseMove( guint32 nFlags, gdouble x, gdouble y )\r
65 {\r
66   SetViewType( g_pXYWndWrapper->GetViewType() );\r
67 \r
68   if( m_bLeftMBPressed && oldValid && g_iEditMode == 0 ) {\r
69     vec3_t click, delta;\r
70 \r
71     g_pXYWndWrapper->SnapToGrid( (int)x, (int)y, click );\r
72 \r
73     switch( m_vt ) {\r
74     case XY:\r
75       VectorSet( delta, click[0] - old_x, click[1] - old_y, 0 );\r
76       old_x = click[0]; old_y = click[1];\r
77       break;\r
78     case XZ:\r
79       VectorSet( delta, click[0] - old_x, 0, click[2] - old_y );\r
80       old_x = click[0]; old_y = click[2];\r
81       break;\r
82     case YZ:\r
83       VectorSet( delta, 0, click[1] - old_x, click[2] - old_y );\r
84       old_x = click[1]; old_y = click[2];\r
85       break;\r
86     }\r
87 \r
88     if( g_iActiveTarget < 0 )\r
89       GetCurrentCam()->GetCam()->getPositionObj()->updateSelection( delta[0], delta[1], delta[2] );\r
90     else\r
91       GetCurrentCam()->GetCam()->getActiveTarget(g_iActiveTarget)->updateSelection( delta[0], delta[1], delta[2] );\r
92 \r
93                 GetCurrentCam()->HasBeenModified();\r
94 \r
95     g_FuncTable.m_pfnSysUpdateWindows( W_XY_OVERLAY | W_CAMERA );\r
96 \r
97     return true;\r
98   }\r
99 \r
100   return false;\r
101 }\r
102 \r
103 bool CListener::OnLButtonDown( guint32 nFlags, gdouble x, gdouble y )\r
104 {\r
105   SetViewType( g_pXYWndWrapper->GetViewType() );\r
106 \r
107   m_bLeftMBPressed = true;\r
108   oldValid = true;\r
109 \r
110   vec3_t org, delta;\r
111 \r
112   g_pXYWndWrapper->SnapToGrid( (int)x, (int)y, org );\r
113 \r
114   switch( m_vt ) {\r
115   case XY:\r
116     old_x = org[0]; old_y = org[1]; org[2] = 64*1024;\r
117     VectorSet( delta, 0, 0, -1 );\r
118     break;\r
119   case XZ:\r
120     old_x = org[0]; old_y = org[2]; org[1] = 64*1024;\r
121     VectorSet( delta, 0, -1, 0 );\r
122     break;\r
123   case YZ:\r
124     old_x = org[1]; old_y = org[2]; org[0] = 64*1024;\r
125     VectorSet( delta, -1, 0, 0 );\r
126     break;\r
127   }\r
128 \r
129         if( g_iEditMode == 0 ) {\r
130                 if( g_iActiveTarget < 0 )\r
131                         GetCurrentCam()->GetCam()->getPositionObj()->selectPointByRay( org[0], org[1], org[2], delta[0], delta[1], delta[2], true );\r
132                 else\r
133                         GetCurrentCam()->GetCam()->getActiveTarget(g_iActiveTarget)->selectPointByRay( org[0], org[1], org[2], delta[0], delta[1], delta[2], true );\r
134         } else if( g_iEditMode == 1 ) {\r
135                 idVec3 *lastcoord;\r
136                 idCameraPosition *camera;\r
137 \r
138     if( g_iActiveTarget < 0 ) {\r
139                         camera = GetCurrentCam()->GetCam()->getPositionObj();\r
140                 } else {\r
141                         camera = GetCurrentCam()->GetCam()->getActiveTarget(g_iActiveTarget);\r
142                 }\r
143 \r
144                 if( camera->numPoints() ) {\r
145                         lastcoord = camera->getPoint( camera->numPoints() -1 );\r
146                         switch( m_vt ) {\r
147                         case XY:\r
148                                 camera->addPoint( org[0], org[1], lastcoord->z );\r
149                                 break;\r
150                         case XZ:\r
151                                 camera->addPoint( org[0], lastcoord->y, org[2] );\r
152                                 break;\r
153                         case YZ:\r
154                                 camera->addPoint( lastcoord->x, org[1], org[2] );\r
155                                 break;\r
156                         }\r
157                 }       else {\r
158                         switch( m_vt ) {\r
159                         case XY:\r
160                                 camera->addPoint( org[0], org[1], 0 );\r
161                                 break;\r
162                         case XZ:\r
163                                 camera->addPoint( org[0], 0, org[2] );\r
164                                 break;\r
165                         case YZ:\r
166                                 camera->addPoint( 0, org[1], org[2] );\r
167                                 break;\r
168                         }\r
169                 }\r
170 \r
171                 GetCurrentCam()->HasBeenModified();\r
172         }\r
173 \r
174   g_FuncTable.m_pfnSysUpdateWindows( W_XY_OVERLAY | W_CAMERA );\r
175 \r
176   return true;\r
177 \r
178         //return false;\r
179 }\r
180 \r
181 bool CListener::OnLButtonUp( guint32 nFlags, gdouble x, gdouble y )\r
182 {\r
183   SetViewType( g_pXYWndWrapper->GetViewType() );\r
184 \r
185   m_bLeftMBPressed = false;\r
186   oldValid = false;\r
187 \r
188         if( g_iEditMode == 0 ) {\r
189                 if( g_iActiveTarget < 0 )\r
190                         GetCurrentCam()->GetCam()->getPositionObj()->deselectAll();\r
191                 else\r
192                         GetCurrentCam()->GetCam()->getActiveTarget(g_iActiveTarget)->deselectAll();\r
193 \r
194           g_FuncTable.m_pfnSysUpdateWindows( W_XY_OVERLAY | W_CAMERA );\r
195         }\r
196 \r
197         return false;\r
198 }\r
199 \r
200 bool CListener::OnRButtonDown( guint32 nFlags, gdouble x, gdouble y )\r
201 {\r
202   SetViewType( g_pXYWndWrapper->GetViewType() );\r
203 \r
204   m_bRightMBPressed = true;\r
205 \r
206         return false;\r
207 }\r
208 \r
209 bool CListener::OnRButtonUp( guint32 nFlags, gdouble x, gdouble y )\r
210 {\r
211   SetViewType( g_pXYWndWrapper->GetViewType() );\r
212 \r
213   m_bRightMBPressed = false;\r
214 \r
215         return false;\r
216 }\r
217 \r
218 bool CListener::OnMButtonDown( guint32 nFlags, gdouble x, gdouble y )\r
219 {\r
220   SetViewType( g_pXYWndWrapper->GetViewType() );\r
221 \r
222   m_bMiddleMBPressed = true;\r
223 \r
224         return false;\r
225 }\r
226 \r
227 bool CListener::OnMButtonUp( guint32 nFlags, gdouble x, gdouble y )\r
228 {\r
229   SetViewType( g_pXYWndWrapper->GetViewType() );\r
230 \r
231   m_bMiddleMBPressed = false;\r
232 \r
233         return false;\r
234 }\r