doom3-gpl
Doom 3 GPL source release
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
DialogAFConstraintHinge.cpp
Go to the documentation of this file.
1 /*
2 ===========================================================================
3 
4 Doom 3 GPL Source Code
5 Copyright (C) 1999-2011 id Software LLC, a ZeniMax Media company.
6 
7 This file is part of the Doom 3 GPL Source Code (?Doom 3 Source Code?).
8 
9 Doom 3 Source Code is free software: you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version.
13 
14 Doom 3 Source Code is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
18 
19 You should have received a copy of the GNU General Public License
20 along with Doom 3 Source Code. If not, see <http://www.gnu.org/licenses/>.
21 
22 In addition, the Doom 3 Source Code is also subject to certain additional terms. You should have received a copy of these additional terms immediately following the terms and conditions of the GNU General Public License which accompanied the Doom 3 Source Code. If not, please request a copy in writing from id Software at the address below.
23 
24 If you have questions concerning this license or the applicable additional terms, you may contact in writing id Software LLC, c/o ZeniMax Media Inc., Suite 120, Rockville, Maryland 20850 USA.
25 
26 ===========================================================================
27 */
28 
29 #include "../../idlib/precompiled.h"
30 #pragma hdrstop
31 
32 #include "../../sys/win32/rc/AFEditor_resource.h"
33 
34 #include "DialogAF.h"
35 #include "DialogAFConstraint.h"
37 
38 
39 // DialogAFConstraintHinge dialog
40 
42  { IDC_RADIO_ANCHOR_JOINT, "use the position of a joint for the anchor" },
43  { IDC_COMBO_ANCHOR_JOINT, "anchor joint name" },
44  { IDC_RADIO_ANCHOR_COORDINATES, "use absolute coordinates for the anchor" },
45  { IDC_EDIT_ANCHOR_X, "anchor x-coordinate" },
46  { IDC_EDIT_ANCHOR_Y, "anchor y-coordinate" },
47  { IDC_EDIT_ANCHOR_Z, "anchor z-coordinate" },
48  { IDC_RADIO_HINGE_AXIS_BONE, "use a bone for the hinge axis" },
49  { IDC_RADIO_HINGE_AXIS_ANGLES, "use angles to set the orientation of the hinge axis" },
50  { IDC_COMBO_HINGE_AXIS_JOINT1, "bone start joint" },
51  { IDC_COMBO_HINGE_AXIS_JOINT2, "bone end joint" },
52  { IDC_EDIT_HINGE_AXIS_PITCH, "pitch angle" },
53  { IDC_EDIT_HINGE_AXIS_YAW, "yaw angle" },
54  { IDC_RADIO_HINGE_LIMIT_NONE, "no limit" },
55  { IDC_RADIO_HINGE_LIMIT_ANGLES, "angle limit" },
56  { IDC_EDIT_HINGE_LIMIT_ANGLE1, "limit orientation" },
57  { IDC_EDIT_HINGE_LIMIT_ANGLE2, "limit width" },
58  { IDC_EDIT_HINGE_LIMIT_ANGLE3, "limit angle" },
59  { 0, NULL }
60 };
61 
62 IMPLEMENT_DYNAMIC(DialogAFConstraintHinge, CDialog)
63 
64 /*
65 ================
66 DialogAFConstraintHinge::DialogAFConstraintHinge
67 ================
68 */
70  : CDialog(DialogAFConstraintHinge::IDD, pParent)
71  , m_anchor_x(0)
72  , m_anchor_y(0)
73  , m_anchor_z(0)
74  , m_axisPitch(0)
75  , m_axisYaw(0)
76  , m_limitAngle1(0)
77  , m_limitAngle2(30.0f)
78  , m_limitAngle3(0)
79  , constraint(NULL)
80  , file(NULL)
81 {
82  Create( IDD_DIALOG_AF_CONSTRAINT_HINGE, pParent );
83  EnableToolTips( TRUE );
84 }
85 
86 /*
87 ================
88 DialogAFConstraintHinge::~DialogAFConstraintHinge
89 ================
90 */
92 }
93 
94 /*
95 ================
96 DialogAFConstraintHinge::DoDataExchange
97 ================
98 */
99 void DialogAFConstraintHinge::DoDataExchange(CDataExchange* pDX) {
100  CDialog::DoDataExchange(pDX);
101  //{{AFX_DATA_MAP(DialogAFConstraintHinge)
102  DDX_Control(pDX, IDC_COMBO_ANCHOR_JOINT, m_comboAnchorJoint);
103  DDX_Text(pDX, IDC_EDIT_ANCHOR_X, m_anchor_x);
104  DDX_Text(pDX, IDC_EDIT_ANCHOR_Y, m_anchor_y);
105  DDX_Text(pDX, IDC_EDIT_ANCHOR_Z, m_anchor_z);
108  DDX_Text(pDX, IDC_EDIT_HINGE_AXIS_PITCH, m_axisPitch);
109  DDX_Text(pDX, IDC_EDIT_HINGE_AXIS_YAW, m_axisYaw);
113  //}}AFX_DATA_MAP
114 }
115 
116 /*
117 ================
118 DialogAFConstraintHinge::InitJointLists
119 ================
120 */
122  m_comboAnchorJoint.ResetContent();
123  m_comboAxisJoint1.ResetContent();
124  m_comboAxisJoint2.ResetContent();
125 
126  if ( !file ) {
127  return;
128  }
129 
131  if ( !model ) {
132  return;
133  }
134 
135  int numJoints = model->NumJoints();
136  for ( int i = 0; i < numJoints; i++ ) {
137  const char *jointName = model->GetJointName( (jointHandle_t) i );
138  m_comboAnchorJoint.AddString( jointName );
139  m_comboAxisJoint1.AddString( jointName );
140  m_comboAxisJoint2.AddString( jointName );
141  }
142 }
143 
144 /*
145 ================
146 DialogAFConstraintHinge::LoadFile
147 ================
148 */
150  file = af;
151  constraint = NULL;
152  InitJointLists();
153 }
154 
155 /*
156 ================
157 DialogAFConstraintHinge::SaveFile
158 ================
159 */
161  SaveConstraint();
162 }
163 
164 /*
165 ================
166 DialogAFConstraintHinge::LoadConstraint
167 ================
168 */
170  int i, s1, s2;
171  idAngles angles;
172 
173  constraint = c;
174 
175  // load anchor from the current idDeclAF_Constraint
182  }
183  else {
185  }
187 
188  // hinge axis
191  angles = constraint->axis.ToVec3().ToAngles();
192  m_axisPitch = angles.pitch;
193  m_axisYaw = angles.yaw;
196  }
197  else {
200  }
202 
203  // hinge limit
206  }
207  else {
209  }
214 
215  // update displayed values
216  UpdateData( FALSE );
217 }
218 
219 /*
220 ================
221 DialogAFConstraintHinge::SaveConstraint
222 ================
223 */
225  int s1, s2;
226  CString str;
227 
228  if ( !file || !constraint ) {
229  return;
230  }
231  UpdateData( TRUE );
232 
233  // save anchor to the current idDeclAF_Constraint
235  constraint->anchor.joint1 = str;
239 
240  // hinge axis
243  constraint->axis.joint1 = str;
245  constraint->axis.joint2 = str;
246  }
247  else {
249  }
250 
251  // hinge limit
255 
257 }
258 
259 /*
260 ================
261 DialogAFConstraintHinge::UpdateFile
262 ================
263 */
265  SaveConstraint();
266  if ( file ) {
268  }
269 }
270 
271 /*
272 ================
273 DialogAFConstraintHinge::OnToolHitTest
274 ================
275 */
276 int DialogAFConstraintHinge::OnToolHitTest( CPoint point, TOOLINFO* pTI ) const {
277  CDialog::OnToolHitTest( point, pTI );
278  return DefaultOnToolHitTest( toolTips, this, point, pTI );
279 }
280 
281 
282 BEGIN_MESSAGE_MAP(DialogAFConstraintHinge, CDialog)
283  ON_NOTIFY_EX_RANGE(TTN_NEEDTEXTW, 0, 0xFFFF, OnToolTipNotify)
284  ON_NOTIFY_EX_RANGE(TTN_NEEDTEXTA, 0, 0xFFFF, OnToolTipNotify)
285  ON_BN_CLICKED(IDC_RADIO_ANCHOR_JOINT, OnBnClickedRadioAnchorJoint)
286  ON_BN_CLICKED(IDC_RADIO_ANCHOR_COORDINATES, OnBnClickedRadioAnchorCoordinates)
287  ON_CBN_SELCHANGE(IDC_COMBO_ANCHOR_JOINT, OnCbnSelchangeComboAnchorJoint)
288  ON_EN_CHANGE(IDC_EDIT_ANCHOR_X, OnEnChangeEditAnchorX)
289  ON_EN_CHANGE(IDC_EDIT_ANCHOR_Y, OnEnChangeEditAnchorY)
290  ON_EN_CHANGE(IDC_EDIT_ANCHOR_Z, OnEnChangeEditAnchorZ)
291  ON_NOTIFY(UDN_DELTAPOS, IDC_SPIN_ANCHOR_X, OnDeltaposSpinAnchorX)
292  ON_NOTIFY(UDN_DELTAPOS, IDC_SPIN_ANCHOR_Y, OnDeltaposSpinAnchorY)
293  ON_NOTIFY(UDN_DELTAPOS, IDC_SPIN_ANCHOR_Z, OnDeltaposSpinAnchorZ)
294  ON_BN_CLICKED(IDC_RADIO_HINGE_AXIS_BONE, OnBnClickedRadioHingeAxisBone)
295  ON_BN_CLICKED(IDC_RADIO_HINGE_AXIS_ANGLES, OnBnClickedRadioHingeAxisAngles)
296  ON_CBN_SELCHANGE(IDC_COMBO_HINGE_AXIS_JOINT1, OnCbnSelchangeComboHingeAxisJoint1)
297  ON_CBN_SELCHANGE(IDC_COMBO_HINGE_AXIS_JOINT2, OnCbnSelchangeComboHingeAxisJoint2)
298  ON_EN_CHANGE(IDC_EDIT_HINGE_AXIS_PITCH, OnEnChangeEditHingeAxisPitch)
299  ON_NOTIFY(UDN_DELTAPOS, IDC_SPIN_HINGE_AXIS_PITCH, OnDeltaposSpinHingeAxisPitch)
300  ON_EN_CHANGE(IDC_EDIT_HINGE_AXIS_YAW, OnEnChangeEditHingeAxisYaw)
301  ON_NOTIFY(UDN_DELTAPOS, IDC_SPIN_HINGE_AXIS_YAW, OnDeltaposSpinHingeAxisYaw)
302  ON_BN_CLICKED(IDC_RADIO_HINGE_LIMIT_NONE, OnBnClickedRadioHingeLimitNone)
303  ON_BN_CLICKED(IDC_RADIO_HINGE_LIMIT_ANGLES, OnBnClickedRadioHingeLimitAngles)
304  ON_EN_CHANGE(IDC_EDIT_HINGE_LIMIT_ANGLE1, OnEnChangeEditHingeLimitAngle1)
305  ON_NOTIFY(UDN_DELTAPOS, IDC_SPIN_HINGE_LIMIT_ANGLE1, OnDeltaposSpinHingeLimitAngle1)
306  ON_EN_CHANGE(IDC_EDIT_HINGE_LIMIT_ANGLE2, OnEnChangeEditHingeLimitAngle2)
307  ON_NOTIFY(UDN_DELTAPOS, IDC_SPIN_HINGE_LIMIT_ANGLE2, OnDeltaposSpinHingeLimitAngle2)
308  ON_EN_CHANGE(IDC_EDIT_HINGE_LIMIT_ANGLE3, OnEnChangeEditHingeLimitAngle3)
309  ON_NOTIFY(UDN_DELTAPOS, IDC_SPIN_HINGE_LIMIT_ANGLE3, OnDeltaposSpinHingeLimitAngle3)
310 END_MESSAGE_MAP()
311 
312 
313 // DialogAFConstraintHinge message handlers
314 
315 BOOL DialogAFConstraintHinge::OnToolTipNotify( UINT id, NMHDR *pNMHDR, LRESULT *pResult ) {
316  return DefaultOnToolTipNotify( toolTips, id, pNMHDR, pResult );
317 }
318 
320  if ( IsDlgButtonChecked( IDC_RADIO_ANCHOR_JOINT ) ) {
321  if ( constraint ) {
323  UpdateFile();
324  }
325  }
326 }
327 
329  if ( IsDlgButtonChecked( IDC_RADIO_ANCHOR_COORDINATES ) ) {
330  if ( constraint ) {
332  UpdateFile();
333  }
334  }
335 }
336 
338  UpdateFile();
339 }
340 
342  if ( EditControlEnterHit( (CEdit *) GetDlgItem( IDC_EDIT_ANCHOR_X ) ) ) {
343  UpdateFile();
344  }
345  else {
346  m_anchor_x = EditVerifyFloat( (CEdit *) GetDlgItem( IDC_EDIT_ANCHOR_X ) );
347  }
348 }
349 
351  if ( EditControlEnterHit( (CEdit *) GetDlgItem( IDC_EDIT_ANCHOR_Y ) ) ) {
352  UpdateFile();
353  }
354  else {
355  m_anchor_y = EditVerifyFloat( (CEdit *) GetDlgItem( IDC_EDIT_ANCHOR_Y ) );
356  }
357 }
358 
360  if ( EditControlEnterHit( (CEdit *) GetDlgItem( IDC_EDIT_ANCHOR_Z ) ) ) {
361  UpdateFile();
362  }
363  else {
364  m_anchor_z = EditVerifyFloat( (CEdit *) GetDlgItem( IDC_EDIT_ANCHOR_Z ) );
365  }
366 }
367 
368 void DialogAFConstraintHinge::OnDeltaposSpinAnchorX(NMHDR *pNMHDR, LRESULT *pResult) {
369  LPNMUPDOWN pNMUpDown = reinterpret_cast<LPNMUPDOWN>(pNMHDR);
370  if ( pNMUpDown->iDelta < 0 ) {
371  m_anchor_x += 1.0f;
372  }
373  else {
374  m_anchor_x -= 1.0f;
375  }
376  UpdateData( FALSE );
377  UpdateFile();
378  *pResult = 0;
379 }
380 
381 void DialogAFConstraintHinge::OnDeltaposSpinAnchorY(NMHDR *pNMHDR, LRESULT *pResult) {
382  LPNMUPDOWN pNMUpDown = reinterpret_cast<LPNMUPDOWN>(pNMHDR);
383  if ( pNMUpDown->iDelta < 0 ) {
384  m_anchor_y += 1.0f;
385  }
386  else {
387  m_anchor_y -= 1.0f;
388  }
389  UpdateData( FALSE );
390  UpdateFile();
391  *pResult = 0;
392 }
393 
394 void DialogAFConstraintHinge::OnDeltaposSpinAnchorZ(NMHDR *pNMHDR, LRESULT *pResult) {
395  LPNMUPDOWN pNMUpDown = reinterpret_cast<LPNMUPDOWN>(pNMHDR);
396  if ( pNMUpDown->iDelta < 0 ) {
397  m_anchor_z += 1.0f;
398  }
399  else {
400  m_anchor_z -= 1.0f;
401  }
402  UpdateData( FALSE );
403  UpdateFile();
404  *pResult = 0;
405 }
406 
408  if ( IsDlgButtonChecked( IDC_RADIO_HINGE_AXIS_BONE ) ) {
409  if ( constraint ) {
411  UpdateFile();
412  }
413  }
414 }
415 
417  if ( IsDlgButtonChecked( IDC_RADIO_HINGE_AXIS_ANGLES ) ) {
418  if ( constraint ) {
420  UpdateFile();
421  }
422  }
423 }
424 
426  CString str;
429  UpdateFile();
430 }
431 
433  CString str;
436  UpdateFile();
437 }
438 
440  if ( EditControlEnterHit( (CEdit *) GetDlgItem( IDC_EDIT_HINGE_AXIS_PITCH ) ) ) {
441  UpdateFile();
442  }
443  else {
444  m_axisPitch = EditVerifyFloat( (CEdit *) GetDlgItem( IDC_EDIT_HINGE_AXIS_PITCH ) );
445  }
446 }
447 
448 void DialogAFConstraintHinge::OnDeltaposSpinHingeAxisPitch(NMHDR *pNMHDR, LRESULT *pResult) {
449  LPNMUPDOWN pNMUpDown = reinterpret_cast<LPNMUPDOWN>(pNMHDR);
450  if ( pNMUpDown->iDelta < 0 ) {
451  m_axisPitch += 1.0f;
452  }
453  else {
454  m_axisPitch -= 1.0f;
455  }
456  UpdateData( FALSE );
457  UpdateFile();
458  *pResult = 0;
459 }
460 
462  if ( EditControlEnterHit( (CEdit *) GetDlgItem( IDC_EDIT_HINGE_AXIS_YAW ) ) ) {
463  UpdateFile();
464  }
465  else {
466  m_axisYaw = EditVerifyFloat( (CEdit *) GetDlgItem( IDC_EDIT_HINGE_AXIS_YAW ) );
467  }
468 }
469 
470 void DialogAFConstraintHinge::OnDeltaposSpinHingeAxisYaw(NMHDR *pNMHDR, LRESULT *pResult) {
471  LPNMUPDOWN pNMUpDown = reinterpret_cast<LPNMUPDOWN>(pNMHDR);
472  if ( pNMUpDown->iDelta < 0 ) {
473  m_axisYaw += 1.0f;
474  }
475  else {
476  m_axisYaw -= 1.0f;
477  }
478  UpdateData( FALSE );
479  UpdateFile();
480  *pResult = 0;
481 }
482 
484  if ( IsDlgButtonChecked( IDC_RADIO_HINGE_LIMIT_NONE ) ) {
485  if ( constraint ) {
487  UpdateFile();
488  }
489  }
490 }
491 
493  if ( IsDlgButtonChecked( IDC_RADIO_HINGE_LIMIT_ANGLES ) ) {
494  if ( constraint ) {
496  UpdateFile();
497  }
498  }
499 }
500 
502  if ( EditControlEnterHit( (CEdit *) GetDlgItem( IDC_EDIT_HINGE_LIMIT_ANGLE1 ) ) ) {
503  UpdateFile();
504  }
505  else {
506  m_limitAngle1 = EditVerifyFloat( (CEdit *) GetDlgItem( IDC_EDIT_HINGE_LIMIT_ANGLE1 ) );
507  }
508 }
509 
510 void DialogAFConstraintHinge::OnDeltaposSpinHingeLimitAngle1(NMHDR *pNMHDR, LRESULT *pResult) {
511  LPNMUPDOWN pNMUpDown = reinterpret_cast<LPNMUPDOWN>(pNMHDR);
512  if ( pNMUpDown->iDelta < 0 ) {
513  m_limitAngle1 += 1.0f;
514  }
515  else {
516  m_limitAngle1 -= 1.0f;
517  }
518  UpdateData( FALSE );
519  UpdateFile();
520  *pResult = 0;
521 }
522 
524  if ( EditControlEnterHit( (CEdit *) GetDlgItem( IDC_EDIT_HINGE_LIMIT_ANGLE2 ) ) ) {
525  UpdateFile();
526  }
527  else {
528  m_limitAngle2 = EditVerifyFloat( (CEdit *) GetDlgItem( IDC_EDIT_HINGE_LIMIT_ANGLE2 ), false );
529  }
530 }
531 
532 void DialogAFConstraintHinge::OnDeltaposSpinHingeLimitAngle2(NMHDR *pNMHDR, LRESULT *pResult) {
533  LPNMUPDOWN pNMUpDown = reinterpret_cast<LPNMUPDOWN>(pNMHDR);
534  if ( pNMUpDown->iDelta < 0 ) {
535  m_limitAngle2 += 1.0f;
536  }
537  else if ( m_limitAngle2 > 0.0f ) {
538  m_limitAngle2 -= 1.0f;
539  }
540  UpdateData( FALSE );
541  UpdateFile();
542  *pResult = 0;
543 }
544 
546  if ( EditControlEnterHit( (CEdit *) GetDlgItem( IDC_EDIT_HINGE_LIMIT_ANGLE3 ) ) ) {
547  UpdateFile();
548  }
549  else {
550  m_limitAngle3 = EditVerifyFloat( (CEdit *) GetDlgItem( IDC_EDIT_HINGE_LIMIT_ANGLE3 ) );
551  }
552 }
553 
554 void DialogAFConstraintHinge::OnDeltaposSpinHingeLimitAngle3(NMHDR *pNMHDR, LRESULT *pResult) {
555  LPNMUPDOWN pNMUpDown = reinterpret_cast<LPNMUPDOWN>(pNMHDR);
556  if ( pNMUpDown->iDelta < 0 ) {
557  m_limitAngle3 += 1.0f;
558  }
559  else {
560  m_limitAngle3 -= 1.0f;
561  }
562  UpdateData( FALSE );
563  UpdateFile();
564  *pResult = 0;
565 }
jointHandle_t
Definition: Model.h:156
BOOL DefaultOnToolTipNotify(const toolTip_t *toolTips, UINT id, NMHDR *pNMHDR, LRESULT *pResult)
Definition: StdAfx.cpp:104
virtual void AF_UpdateEntities(const char *fileName)
Definition: AFEntity.cpp:2856
idAFVector anchor
Definition: DeclAF.h:125
int SetSafeComboBoxSelection(CComboBox *combo, const char *string, int skip)
Definition: StdAfx.cpp:319
CONST PIXELFORMATDESCRIPTOR UINT
Definition: win_qgl.cpp:47
#define IDC_COMBO_HINGE_AXIS_JOINT1
#define IDC_EDIT_ANCHOR_X
afx_msg void OnBnClickedRadioHingeAxisAngles()
#define IDC_COMBO_HINGE_AXIS_JOINT2
float z
Definition: Vector.h:320
#define IDC_RADIO_HINGE_AXIS_BONE
#define IDC_SPIN_HINGE_LIMIT_ANGLE1
const char * GetName(void) const
Definition: DeclManager.h:140
afx_msg void OnDeltaposSpinAnchorX(NMHDR *pNMHDR, LRESULT *pResult)
#define IDC_EDIT_HINGE_LIMIT_ANGLE2
afx_msg void OnBnClickedRadioAnchorCoordinates()
#define IDC_SPIN_HINGE_AXIS_YAW
float x
Definition: Vector.h:318
int i
Definition: process.py:33
#define BOOL
Definition: mprintf.c:71
#define IDC_EDIT_ANCHOR_Z
idGameEdit * gameEdit
Definition: GameEdit.cpp:668
afx_msg void OnDeltaposSpinHingeLimitAngle2(NMHDR *pNMHDR, LRESULT *pResult)
virtual const char * GetJointName(jointHandle_t handle) const =0
idStr joint1
Definition: DeclAF.h:68
#define IDC_EDIT_HINGE_AXIS_YAW
idDeclAF_Constraint * constraint
#define IDC_SPIN_HINGE_AXIS_PITCH
idAngles ToAngles(void) const
Definition: Vector.cpp:130
const idVec3 & ToVec3(void) const
Definition: DeclAF.h:78
const GLubyte * c
Definition: glext.h:4677
afx_msg void OnDeltaposSpinHingeLimitAngle1(NMHDR *pNMHDR, LRESULT *pResult)
idVec3 ToForward(void) const
Definition: Angles.cpp:117
afx_msg void OnDeltaposSpinHingeAxisPitch(NMHDR *pNMHDR, LRESULT *pResult)
#define NULL
Definition: Lib.h:88
float y
Definition: Vector.h:319
idAFVector axis
Definition: DeclAF.h:128
void LoadConstraint(idDeclAF_Constraint *c)
#define IDC_SPIN_ANCHOR_Y
virtual void DoDataExchange(CDataExchange *pDX)
int DefaultOnToolHitTest(const toolTip_t *toolTips, const CDialog *dialog, CPoint point, TOOLINFO *pTI)
Definition: StdAfx.cpp:75
virtual idRenderModel * ANIM_GetModelFromName(const char *modelName)
int UnsetSafeComboBoxSelection(CComboBox *combo, CString &string)
Definition: StdAfx.cpp:366
afx_msg void OnBnClickedRadioHingeLimitAngles()
#define IDC_SPIN_ANCHOR_X
bool EditControlEnterHit(CEdit *edit)
Definition: StdAfx.cpp:154
#define IDC_EDIT_ANCHOR_Y
afx_msg void OnDeltaposSpinAnchorY(NMHDR *pNMHDR, LRESULT *pResult)
#define IDC_EDIT_HINGE_AXIS_PITCH
#define IDC_RADIO_HINGE_LIMIT_NONE
int GetSafeComboBoxSelection(CComboBox *combo, CString &string, int skip)
Definition: StdAfx.cpp:341
void AFDialogSetFileModified(void)
Definition: DialogAF.cpp:613
afx_msg void OnCbnSelchangeComboHingeAxisJoint2()
float limitAngles[3]
Definition: DeclAF.h:135
#define IDC_EDIT_HINGE_LIMIT_ANGLE3
afx_msg void OnDeltaposSpinAnchorZ(NMHDR *pNMHDR, LRESULT *pResult)
tuple f
Definition: idal.py:89
idStr model
Definition: DeclAF.h:172
#define IDC_RADIO_ANCHOR_JOINT
enum idDeclAF_Constraint::@49 limit
virtual int OnToolHitTest(CPoint point, TOOLINFO *pTI) const
#define IDC_SPIN_ANCHOR_Z
const char * c_str(void) const
Definition: Str.h:487
#define FALSE
Definition: mprintf.c:70
enum idAFVector::@48 type
virtual int NumJoints(void) const =0
#define IDC_RADIO_HINGE_AXIS_ANGLES
#define TRUE
Definition: mprintf.c:69
afx_msg void OnDeltaposSpinHingeAxisYaw(NMHDR *pNMHDR, LRESULT *pResult)
#define IDC_COMBO_ANCHOR_JOINT
afx_msg void OnCbnSelchangeComboHingeAxisJoint1()
#define IDC_SPIN_HINGE_LIMIT_ANGLE2
#define IDC_RADIO_ANCHOR_COORDINATES
#define IDC_SPIN_HINGE_LIMIT_ANGLE3
#define IDC_RADIO_HINGE_LIMIT_ANGLES
#define IDD_DIALOG_AF_CONSTRAINT_HINGE
#define IDC_EDIT_HINGE_LIMIT_ANGLE1
afx_msg void OnDeltaposSpinHingeLimitAngle3(NMHDR *pNMHDR, LRESULT *pResult)
float EditVerifyFloat(CEdit *edit, bool allowNegative)
Definition: StdAfx.cpp:175
idStr joint2
Definition: DeclAF.h:69