123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211 |
- /* Copyright (c) 2002-2012 Croteam Ltd.
- This program is free software; you can redistribute it and/or modify
- it under the terms of version 2 of the GNU General Public License as published by
- the Free Software Foundation
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
- You should have received a copy of the GNU General Public License along
- with this program; if not, write to the Free Software Foundation, Inc.,
- 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */
- // DlgPgPosition.cpp : implementation file
- //
- #include "stdafx.h"
- #include "DlgPgPosition.h"
- #ifdef _DEBUG
- #undef new
- #define new DEBUG_NEW
- #undef THIS_FILE
- static char THIS_FILE[] = __FILE__;
- #endif
- /////////////////////////////////////////////////////////////////////////////
- // CDlgPgPosition property page
- IMPLEMENT_DYNCREATE(CDlgPgPosition, CPropertyPage)
- CDlgPgPosition::CDlgPgPosition() : CPropertyPage(CDlgPgPosition::IDD)
- {
- //{{AFX_DATA_INIT(CDlgPgPosition)
- m_fBanking = 0.0f;
- m_fHeading = 0.0f;
- m_fPitch = 0.0f;
- m_fX = 0.0f;
- m_fY = 0.0f;
- m_fZ = 0.0f;
- //}}AFX_DATA_INIT
- }
- CDlgPgPosition::~CDlgPgPosition()
- {
- }
- void CDlgPgPosition::DoDataExchange(CDataExchange* pDX)
- {
- if( theApp.m_bDisableDataExchange) return;
- CPropertyPage::DoDataExchange(pDX);
- SetModified( TRUE);
- // obtain document
- CWorldEditorDoc* pDoc = theApp.GetDocument();
- // if document doesn't exist, return
- if( pDoc == NULL) return;
- // get active view
- CWorldEditorView *pWorldEditorView = theApp.GetActiveView();
- // if dialog is recieving data
- if( pDX->m_bSaveAndValidate == FALSE)
- {
- // is CSG on?
- if( pDoc->m_pwoSecondLayer != NULL)
- {
- // yes, pick up coordinates for editting from second layer
- m_fHeading = DegAngle( pDoc->m_plSecondLayer.pl_OrientationAngle(1));
- m_fPitch = DegAngle( pDoc->m_plSecondLayer.pl_OrientationAngle(2));
- m_fBanking = DegAngle( pDoc->m_plSecondLayer.pl_OrientationAngle(3));
- m_fX = pDoc->m_plSecondLayer.pl_PositionVector(1);
- m_fY = pDoc->m_plSecondLayer.pl_PositionVector(2);
- m_fZ = pDoc->m_plSecondLayer.pl_PositionVector(3);
- }
- // otherwise if we are in entity mode and there is only one entity selected
- else if( (pDoc->m_iMode == ENTITY_MODE) && ( pDoc->m_selEntitySelection.Count() == 1) )
- {
- // lock selection's dynamic container
- pDoc->m_selEntitySelection.Lock();
- // get first entity
- CEntity *penEntityOne = pDoc->m_selEntitySelection.Pointer(0);
- // unlock selection's dynamic container
- pDoc->m_selEntitySelection.Unlock();
- // get placement of first entity
- CPlacement3D plEntityOnePlacement = penEntityOne->GetPlacement();
- m_fHeading = DegAngle( plEntityOnePlacement.pl_OrientationAngle(1));
- m_fPitch = DegAngle( plEntityOnePlacement.pl_OrientationAngle(2));
- m_fBanking = DegAngle( plEntityOnePlacement.pl_OrientationAngle(3));
- m_fX = plEntityOnePlacement.pl_PositionVector(1);
- m_fY = plEntityOnePlacement.pl_PositionVector(2);
- m_fZ = plEntityOnePlacement.pl_PositionVector(3);
- }
- m_udSelection.MarkUpdated();
- }
- //{{AFX_DATA_MAP(CDlgPgPosition)
- DDX_Text(pDX, IDC_EDIT_BANKING, m_fBanking);
- DDX_Text(pDX, IDC_EDIT_HEADING, m_fHeading);
- DDX_Text(pDX, IDC_EDIT_PITCH, m_fPitch);
- DDX_Text(pDX, IDC_EDIT_X, m_fX);
- DDX_Text(pDX, IDC_EDIT_Y, m_fY);
- DDX_Text(pDX, IDC_EDIT_Z, m_fZ);
- //}}AFX_DATA_MAP
- // if dialog is giving data
- if( pDX->m_bSaveAndValidate != FALSE)
- {
- // is CSG on?
- if( pDoc->m_pwoSecondLayer != NULL)
- {
- // yes, copy coordinates from editting controls into second layer
- pDoc->m_plSecondLayer.pl_OrientationAngle(1) = AngleDeg( m_fHeading);
- pDoc->m_plSecondLayer.pl_OrientationAngle(2) = AngleDeg( m_fPitch);
- pDoc->m_plSecondLayer.pl_OrientationAngle(3) = AngleDeg( m_fBanking);
- pDoc->m_plSecondLayer.pl_PositionVector(1) = m_fX;
- pDoc->m_plSecondLayer.pl_PositionVector(2) = m_fY;
- pDoc->m_plSecondLayer.pl_PositionVector(3) = m_fZ;
- // snap values to grid
- pDoc->SnapToGrid( pDoc->m_plSecondLayer, SNAP_FLOAT_12);
- theApp.m_vfpCurrent.vfp_plPrimitive = pDoc->m_plSecondLayer;
- // update all document's views
- pDoc->UpdateAllViews( NULL);
- }
- // otherwise if we are in entity mode
- else if( pDoc->m_iMode == ENTITY_MODE)
- {
- // there must be only one entity selected
- ASSERT( pDoc->m_selEntitySelection.Count() == 1);
-
- // lock selection's dynamic container
- pDoc->m_selEntitySelection.Lock();
- // get first entity
- CEntity *penEntityOne = pDoc->m_selEntitySelection.Pointer(0);
- // unlock selection's dynamic container
- pDoc->m_selEntitySelection.Unlock();
- // get placement of first entity
- CPlacement3D plEntityOnePlacement = penEntityOne->GetPlacement();
- plEntityOnePlacement.pl_OrientationAngle(1) = AngleDeg( m_fHeading);
- plEntityOnePlacement.pl_OrientationAngle(2) = AngleDeg( m_fPitch);
- plEntityOnePlacement.pl_OrientationAngle(3) = AngleDeg( m_fBanking);
- plEntityOnePlacement.pl_PositionVector(1) = m_fX;
- plEntityOnePlacement.pl_PositionVector(2) = m_fY;
- plEntityOnePlacement.pl_PositionVector(3) = m_fZ;
- // snap entity's placement
- pDoc->SnapToGrid( plEntityOnePlacement, SNAP_FLOAT_12);
-
- // set placement back to entity
- penEntityOne->SetPlacement( plEntityOnePlacement);
- pDoc->SetModifiedFlag( TRUE);
- pDoc->UpdateAllViews( NULL);
- m_udSelection.MarkUpdated();
- // update all document's views
- pDoc->UpdateAllViews( NULL);
- }
- }
- }
- BEGIN_MESSAGE_MAP(CDlgPgPosition, CPropertyPage)
- //{{AFX_MSG_MAP(CDlgPgPosition)
- // NOTE: the ClassWizard will add message map macros here
- //}}AFX_MSG_MAP
- END_MESSAGE_MAP()
- /////////////////////////////////////////////////////////////////////////////
- // CDlgPgPosition message handlers
- BOOL CDlgPgPosition::OnIdle(LONG lCount)
- {
- // obtain document
- CWorldEditorDoc* pDoc = theApp.GetDocument();
- if( (pDoc == NULL) || !IsWindow(m_hWnd)) return FALSE;
- // if selections have been changed (they are not up to date)
- if( !pDoc->m_chSelections.IsUpToDate( m_udSelection))
- {
- // update dialog data
- UpdateData( FALSE);
- }
- return TRUE;
- }
- BOOL CDlgPgPosition::PreTranslateMessage(MSG* pMsg)
- {
- if(pMsg->message==WM_KEYDOWN && pMsg->wParam==VK_RETURN)
- {
- // move coordinates from page to entity and snap them
- UpdateData( TRUE);
- // place snapped coordinates back to dialog
- UpdateData( FALSE);
- // the message is handled
- return TRUE;
- }
- return CPropertyPage::PreTranslateMessage(pMsg);
- }
|