home *** CD-ROM | disk | FTP | other *** search
/ Xentax forum attachments archive / xentax.7z / 8090 / ModelEdit.7z / EditOBBDlg.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  2006-03-08  |  7.9 KB  |  278 lines

  1. // EditOBBDlg.cpp : implementation file
  2. // 
  3.  
  4.  
  5. #include "precompile.h"
  6.  
  7. #include "modeledit.h"
  8. #include "solidrectwnd.h"
  9. #include "lteulerangles.h"
  10. #include "EditOBBDlg.h"
  11.  
  12. /////////////////////////////////////////////////////////////////////////////
  13. #ifdef _DEBUG
  14. #define new DEBUG_NEW
  15. #undef THIS_FILE
  16. static char THIS_FILE[] = __FILE__;
  17. #endif
  18.  
  19. /////////////////////////////////////////////////////////////////////////////
  20. // CEditOBBDlg dialog
  21.  
  22.  
  23. //CEditOBBDlg::CEditOBBDlg(const SOBB &obb,CWnd* pParent /*=NULL*/)
  24.     //: CDialog(CEditOBBDlg::IDD, pParent), m_OBB(obb)
  25. CEditOBBDlg::CEditOBBDlg(ModelNode *pNode ,CWnd* pParent /*=NULL*/)
  26.     : CDialog(CEditOBBDlg::IDD, pParent)
  27. {
  28.     m_Initialized = false;
  29.     m_InitOBB = m_OBB = pNode->GetOBB();
  30.     m_InitEnable = pNode->IsOBBEnabled();
  31.     m_CurEA = Eul_FromQuat( m_OBB.m_Orientation, EulOrdXYZs );
  32.     m_CurEA.x = RadiansToDegrees( m_CurEA.x );
  33.     m_CurEA.y = RadiansToDegrees( m_CurEA.y );
  34.     m_CurEA.z = RadiansToDegrees( m_CurEA.z );
  35.  
  36.     m_pModelNode = pNode;
  37.  
  38.     //{{AFX_DATA_INIT(CEditOBBDlg)
  39.         // NOTE: the ClassWizard will add member initialization here
  40.     //}}AFX_DATA_INIT
  41. }
  42.  
  43.  
  44. void CEditOBBDlg::DoDataExchange(CDataExchange* pDX)
  45. {
  46.     EulerAngles ea;
  47.     
  48.     CDialog::DoDataExchange(pDX);
  49.     //{{AFX_DATA_MAP(CEditOBBDlg)
  50.         // NOTE: the ClassWizard will add DDX and DDV calls here
  51.         DDX_Text( pDX, IDC_EDIT_OBB_POS_X, m_OBB.m_Pos.x);
  52.         DDX_Text( pDX, IDC_EDIT_OBB_POS_Y, m_OBB.m_Pos.y);
  53.         DDX_Text( pDX, IDC_EDIT_OBB_POS_Z, m_OBB.m_Pos.z);
  54.  
  55.         DDX_Text( pDX, IDC_EDIT_OBB_ROT_X, ea.x);
  56.         DDX_Text( pDX, IDC_EDIT_OBB_ROT_Y, ea.y);
  57.         DDX_Text( pDX, IDC_EDIT_OBB_ROT_Z, ea.z);
  58.  
  59.         DDX_Text( pDX, IDC_EDIT_OBB_SIZ_X, m_OBB.m_Size.x);
  60.         DDX_Text( pDX, IDC_EDIT_OBB_SIZ_Y, m_OBB.m_Size.y);
  61.         DDX_Text( pDX, IDC_EDIT_OBB_SIZ_Z, m_OBB.m_Size.z);
  62.  
  63.     
  64.     //}}AFX_DATA_MAP
  65.  
  66.     if(pDX->m_bSaveAndValidate)
  67.     {
  68.         if( ((CButton*)GetDlgItem(IDC_ENABLE_OBB))->GetCheck() == 0 )
  69.             m_pModelNode->DisableOBB();
  70.         else
  71.             m_pModelNode->EnableOBB();
  72.  
  73.         ea.x = DegreesToRadians( ea.x );
  74.         ea.y = DegreesToRadians( ea.y );
  75.         ea.z = DegreesToRadians( ea.z );
  76.         m_OBB.m_Orientation = Eul_ToQuat(ea);
  77.  
  78.         m_pModelNode->SetOBB(m_OBB);
  79.     }
  80. }
  81.  
  82. void CEditOBBDlg::OnCancel( void )
  83. {
  84.     m_pModelNode->SetOBB( m_InitOBB );
  85.     if( m_InitEnable )
  86.         m_pModelNode->EnableOBB();
  87.     else
  88.         m_pModelNode->DisableOBB();
  89.  
  90.     CDialog::OnCancel();
  91. }
  92.  
  93.  
  94. BEGIN_MESSAGE_MAP(CEditOBBDlg, CDialog)
  95.     //{{AFX_MSG_MAP(CEditOBBDlg)
  96.     ON_EN_CHANGE(IDC_EDIT_OBB_POS_X,OBBChange)
  97.     ON_EN_CHANGE(IDC_EDIT_OBB_POS_Y,OBBChange)
  98.     ON_EN_CHANGE(IDC_EDIT_OBB_POS_Z,OBBChange)
  99.     ON_EN_CHANGE(IDC_EDIT_OBB_ROT_X,OBBChange)
  100.     ON_EN_CHANGE(IDC_EDIT_OBB_ROT_Y,OBBChange)
  101.     ON_EN_CHANGE(IDC_EDIT_OBB_ROT_Z,OBBChange)
  102.     ON_EN_CHANGE(IDC_EDIT_OBB_SIZ_X,OBBChange)
  103.     ON_EN_CHANGE(IDC_EDIT_OBB_SIZ_Y,OBBChange)
  104.     ON_EN_CHANGE(IDC_EDIT_OBB_SIZ_Z,OBBChange)
  105.     ON_BN_CLICKED(IDC_ENABLE_OBB,OBBChange)
  106.     //}}AFX_MSG_MAP
  107. END_MESSAGE_MAP()
  108.  
  109. /////////////////////////////////////////////////////////////////////////////
  110. // CEditOBBDlg message handlers
  111.  
  112. BOOL CEditOBBDlg::OnInitDialog() 
  113. {
  114.     CDialog::OnInitDialog();
  115.     
  116.     m_Initialized = false;
  117.  
  118.     // Initialized dialog from obb.
  119.     char buf[128];
  120.     sprintf(buf,"%f",m_OBB.m_Pos.x);
  121.     ((CEdit*)GetDlgItem(IDC_EDIT_OBB_POS_X))->SetWindowText(buf);
  122.     sprintf(buf,"%f",m_OBB.m_Pos.y);
  123.     ((CEdit*)GetDlgItem(IDC_EDIT_OBB_POS_Y))->SetWindowText(buf); 
  124.     sprintf(buf,"%f",m_OBB.m_Pos.z);
  125.     ((CEdit*)GetDlgItem(IDC_EDIT_OBB_POS_Z))->SetWindowText(buf);
  126.     
  127.     sprintf(buf,"%f",m_CurEA.x);
  128.     ((CEdit*)GetDlgItem(IDC_EDIT_OBB_ROT_X))->SetWindowText(buf);
  129.     sprintf(buf,"%f",m_CurEA.y);
  130.     ((CEdit*)GetDlgItem(IDC_EDIT_OBB_ROT_Y))->SetWindowText(buf);
  131.     sprintf(buf,"%f",m_CurEA.z);
  132.     ((CEdit*)GetDlgItem(IDC_EDIT_OBB_ROT_Z))->SetWindowText(buf);
  133.     
  134.     sprintf(buf,"%f",m_OBB.m_Size.x);
  135.     ((CEdit*)GetDlgItem(IDC_EDIT_OBB_SIZ_X))->SetWindowText(buf);
  136.     sprintf(buf,"%f",m_OBB.m_Size.y);
  137.     ((CEdit*)GetDlgItem(IDC_EDIT_OBB_SIZ_Y))->SetWindowText(buf);
  138.     sprintf(buf,"%f",m_OBB.m_Size.z);
  139.     ((CEdit*)GetDlgItem(IDC_EDIT_OBB_SIZ_Z))->SetWindowText(buf);    
  140.  
  141.     ((CButton*)GetDlgItem(IDC_ENABLE_OBB))->SetCheck(m_pModelNode->IsOBBEnabled()) ;
  142.  
  143.     UINT CtlIDs[] = { IDC_EDIT_OBB_POS_X_TRACK, IDC_EDIT_OBB_POS_Y_TRACK, IDC_EDIT_OBB_POS_Z_TRACK,
  144.                       IDC_EDIT_OBB_ROT_X_TRACK, IDC_EDIT_OBB_ROT_Y_TRACK, IDC_EDIT_OBB_ROT_Z_TRACK,
  145.                       IDC_EDIT_OBB_SIZ_X_TRACK, IDC_EDIT_OBB_SIZ_Y_TRACK, IDC_EDIT_OBB_SIZ_Z_TRACK };
  146.     COLORREF RGBVals[] = { RGB(255,0,0), RGB(0,255,0), RGB(0,0,255),
  147.                            RGB(255,0,0), RGB(0,255,0), RGB(0,0,255),
  148.                            RGB(255,0,0), RGB(0,255,0), RGB(0,0,255) };
  149.  
  150.     for( int i = 0; i < 9; i++ )
  151.     {
  152.         trackers[i].m_CtlID = CtlIDs[i];
  153.         trackers[i].m_ParentDlg = this;
  154.  
  155.         CRect rect;
  156.         CWnd* wnd = GetDlgItem( CtlIDs[i] );
  157.         wnd->GetClientRect( &rect );
  158.         wnd->ClientToScreen( &rect );
  159.         ScreenToClient( &rect );
  160.  
  161.         trackers[i].Create( NULL, "RectTracker", WS_CHILD|WS_VISIBLE, rect, this, -1, NULL );
  162.         trackers[i].ModifyStyle( 0, WS_CHILD|WS_VISIBLE );
  163.         trackers[i].SetColor( RGBVals[i] );
  164.     }
  165.  
  166.     m_Initialized = true;
  167.  
  168.     return TRUE;  // return TRUE unless you set the focus to a control
  169.                   // EXCEPTION: OCX Property Pages should return FALSE
  170. }
  171.  
  172. void CEditOBBDlg::OBBChange( void )
  173. {
  174.     if( m_Initialized )
  175.         UpdateData();
  176. }
  177.  
  178. // called by the mouse trackers with value offset
  179. void CEditOBBDlg::TrackerCallback( UINT ctlID, float offset )
  180. {
  181.     UINT editCtlID;
  182.     float newEditVal;
  183.     char buf[128];
  184.  
  185.     switch( ctlID )
  186.     {
  187.     case IDC_EDIT_OBB_POS_X_TRACK: newEditVal = m_OBB.m_Pos.x + offset; editCtlID = IDC_EDIT_OBB_POS_X; break;
  188.     case IDC_EDIT_OBB_POS_Y_TRACK: newEditVal = m_OBB.m_Pos.y + offset; editCtlID = IDC_EDIT_OBB_POS_Y; break;
  189.     case IDC_EDIT_OBB_POS_Z_TRACK: newEditVal = m_OBB.m_Pos.z + offset; editCtlID = IDC_EDIT_OBB_POS_Z; break;
  190.     case IDC_EDIT_OBB_ROT_X_TRACK: newEditVal = (m_CurEA.x += offset); editCtlID = IDC_EDIT_OBB_ROT_X; break;
  191.     case IDC_EDIT_OBB_ROT_Y_TRACK: newEditVal = (m_CurEA.y += offset); editCtlID = IDC_EDIT_OBB_ROT_Y; break;
  192.     case IDC_EDIT_OBB_ROT_Z_TRACK: newEditVal = (m_CurEA.z += offset); editCtlID = IDC_EDIT_OBB_ROT_Z; break;
  193.     case IDC_EDIT_OBB_SIZ_X_TRACK: newEditVal = m_OBB.m_Size.x + offset; editCtlID = IDC_EDIT_OBB_SIZ_X; break;
  194.     case IDC_EDIT_OBB_SIZ_Y_TRACK: newEditVal = m_OBB.m_Size.y + offset; editCtlID = IDC_EDIT_OBB_SIZ_Y; break;
  195.     case IDC_EDIT_OBB_SIZ_Z_TRACK: newEditVal = m_OBB.m_Size.z + offset; editCtlID = IDC_EDIT_OBB_SIZ_Z; break;
  196.     default: ASSERT(0); return;
  197.     }
  198.  
  199.     sprintf( buf, "%f", newEditVal );
  200.     ((CEdit*)GetDlgItem( editCtlID ))->SetWindowText( buf );
  201.  
  202.     UpdateData();
  203. }
  204.  
  205.  
  206.  
  207. BEGIN_MESSAGE_MAP( COBBTracker, SolidRectWnd )
  208.     ON_WM_LBUTTONDOWN()
  209.     ON_WM_LBUTTONUP()
  210.     ON_WM_MOUSEMOVE()
  211.     ON_WM_CAPTURECHANGED()
  212. END_MESSAGE_MAP()
  213.  
  214. COBBTracker::COBBTracker()
  215. {
  216.     m_HasCapture = false;
  217. }
  218.  
  219. COBBTracker::~COBBTracker()
  220. {
  221.     ASSERT( !m_HasCapture );
  222. }
  223.  
  224. void COBBTracker::OnLButtonDown( UINT nFlags, CPoint point )
  225. {
  226.     ASSERT( !m_HasCapture );
  227.     SetCapture();
  228.     m_HasCapture = true;
  229.     m_InitPoint = point;
  230.     ShowCursor( false );
  231.  
  232.     SolidRectWnd::OnLButtonDown( nFlags, point );
  233. }
  234.  
  235. void COBBTracker::OnLButtonUp( UINT nFlags, CPoint point )
  236. {
  237.     if( m_HasCapture )
  238.     {
  239.         ReleaseCapture();
  240.     }
  241.  
  242.     SolidRectWnd::OnLButtonUp( nFlags, point );
  243. }
  244.  
  245. void COBBTracker::OnRButtonDown( UINT nFlags, CPoint point )
  246. {
  247.     if( m_HasCapture )
  248.     {
  249.         ReleaseCapture();
  250.     }
  251.  
  252.     SolidRectWnd::OnRButtonDown( nFlags, point );
  253. }
  254.  
  255. void COBBTracker::OnCaptureChanged( CWnd* pWnd )
  256. {
  257.     if( m_HasCapture )
  258.     {
  259.         ShowCursor( true );
  260.         m_HasCapture = false;
  261.     }
  262. }
  263.  
  264. void COBBTracker::OnMouseMove( UINT nFlags, CPoint point )
  265. {
  266.     if( m_HasCapture && (point != m_InitPoint) )
  267.     {
  268.         CPoint newPoint = m_InitPoint;
  269.         ClientToScreen( &newPoint );
  270.         SetCursorPos( newPoint.x, newPoint.y );
  271.  
  272.         float diff = (float)(point.x - m_InitPoint.x);
  273.         m_ParentDlg->TrackerCallback( m_CtlID, diff );
  274.     }
  275.  
  276.     SolidRectWnd::OnMouseMove( nFlags, point );
  277. }
  278.