// DlgCamera.cpp : implementation file // #include "stdafx.h" #include "worldcreator.h" #include "DlgCamera.h" #include "SceneManager.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CDlgCamera dialog CDlgCamera::CDlgCamera(CWnd* pParent /*=NULL*/) : CDialog(CDlgCamera::IDD, pParent) { //{{AFX_DATA_INIT(CDlgCamera) m_Timer = 0; m_fCameraPosX = 0.0f; m_fCameraPosY = 0.0f; m_fCameraPosZ = 0.0f; m_fCameraTargetX = 0.0f; m_fCameraTargetY = 0.0f; m_isPlay = FALSE; m_isRewind = FALSE; m_fCameraTargetZ = 0.0f; m_SelectTime = 0; m_fTotalTime = 0.0f; //}}AFX_DATA_INIT m_CameraList=NULL; } void CDlgCamera::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CDlgCamera) DDX_Control(pDX, IDC_LIST_CAMERANODE, m_CameraNodeList); DDX_Slider(pDX, IDC_SLIDER_TIMER, m_Timer); DDX_Text(pDX, IDC_EDIT_CAMERAPOSX, m_fCameraPosX); DDX_Text(pDX, IDC_EDIT_CAMERAPOSY, m_fCameraPosY); DDX_Text(pDX, IDC_EDIT_CAMERAPOSZ, m_fCameraPosZ); DDX_Text(pDX, IDC_EDIT_CAMERATARX, m_fCameraTargetX); DDX_Text(pDX, IDC_EDIT_CAMERATARY, m_fCameraTargetY); DDX_Check(pDX, IDC_CHECK_PLAY, m_isPlay); DDX_Check(pDX, IDC_CHECK_REWIND, m_isRewind); DDX_Text(pDX, IDC_EDIT_CAMERATARZ, m_fCameraTargetZ); DDX_Text(pDX, IDC_EDIT_SELECTIME, m_SelectTime); DDX_Text(pDX, IDC_EDIT_TOTALTIME, m_fTotalTime); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CDlgCamera, CDialog) //{{AFX_MSG_MAP(CDlgCamera) ON_NOTIFY(NM_RELEASEDCAPTURE, IDC_SLIDER_TIMER, OnReleasedcaptureSliderTimer) ON_BN_CLICKED(IDC_CHECK_PLAY, OnCheckPlay) ON_BN_CLICKED(IDC_CHECK_REWIND, OnCheckRewind) ON_BN_CLICKED(IDC_BUTTON_RECORD, OnButtonRecord) ON_LBN_DBLCLK(IDC_LIST_CAMERANODE, OnDblclkListCameranode) ON_BN_CLICKED(IDC_BUTTON_SUBFRAME, OnButtonSubframe) ON_BN_CLICKED(IDC_BUTTON_ADDFRAME, OnButtonAddframe) ON_BN_CLICKED(IDC_BUTTON_NODEDELETE, OnButtonNodedelete) ON_BN_CLICKED(IDC_BUTTON_NODELOAD, OnButtonNodeload) ON_BN_CLICKED(IDC_BUTTON_NODESAVE, OnButtonNodesave) ON_EN_CHANGE(IDC_EDIT_TOTALTIME, OnChangeEditTotaltime) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CDlgCamera message handlers void CDlgCamera::OnReleasedcaptureSliderTimer(NMHDR* pNMHDR, LRESULT* pResult) { // TODO: Add your control notification handler code here UpdateData(); m_SelectTime=m_Timer; UpdateData(FALSE); *pResult = 0; } void CDlgCamera::OnCheckPlay() { // TODO: Add your control notification handler code here UpdateData(); if(m_fTotalTime<= 0.01f) { return; } CSceneManager::GetCamera()->StartPlay(); } void CDlgCamera::OnCheckRewind() { // TODO: Add your control notification handler code here UpdateData(); } void CDlgCamera::OnButtonRecord() { if(m_CameraList==NULL) m_CameraList=CSceneManager::GetCamera()->GetCameraList(); // TODO: Add your control notification handler code here UpdateData(); m_SelectTime=m_Timer; D3DXQUATERNION qt; D3DXQuaternionRotationYawPitchRoll(&qt,CSceneManager::GetCamera()->GetRotationY(), CSceneManager::GetCamera()->GetRotationX(), CSceneManager::GetCamera()->GetRotationZ()); vector3 vecCameraPos=*(CSceneManager::GetCamera()->GetPosition()); quaternion qAngle; qAngle.x=qt.x; qAngle.y=qt.y; qAngle.z=qt.z; qAngle.w=qt.w; m_fCameraPosX=vecCameraPos.x; m_fCameraPosY=vecCameraPos.y; m_fCameraPosZ=vecCameraPos.z; CViewCamera::CameraNode AddNode; AddNode.m_vecPos=vecCameraPos; AddNode.m_Time=m_Timer; AddNode.m_qAngle=qAngle; if(m_CameraList->num==0) { m_CameraList->Add(AddNode); } else { bool isAlreadyWrite=false; for(int cNode=0;cNode< m_CameraList->num;cNode++) { if((*m_CameraList)[cNode].m_Time==m_Timer) { (*m_CameraList)[cNode]=AddNode; isAlreadyWrite=true; break; } } if(isAlreadyWrite==false) { for(cNode=1;cNode< m_CameraList->num;cNode++) { if( (*m_CameraList)[cNode].m_Time < m_Timer && m_Timer < (*m_CameraList)[cNode].m_Time ) { m_CameraList->Insert(AddNode,cNode); isAlreadyWrite=true; break; } } } if(isAlreadyWrite==false) { m_CameraList->Add(AddNode); } } UpdateList(); /* D3DXQuaternionRotationYawPitchRoll( D3DXQUATERNION* pOut, FLOAT Yaw,y FLOAT Pitch,x FLOAT Rollz ); */ /* vector3 vecCameraPos=*(CSceneManager::GetCamera()->GetPosition()); matrix matCameraPos=*(CSceneManager::GetCamera()->GetMatPosition()); matrix matToward,matUp; matToward.Translation(vector3(0.0f,0.0f,1.0f)); matUp.Translation(vector3(0.0f,1.0f,0.0f)); m_fCameraPosX=matCameraPos._41; m_fCameraPosY=matCameraPos._42; m_fCameraPosZ=matCameraPos._43; matToward=matToward*matCameraPos; matUp=matUp*matCameraPos; vector3 vecNowPos,vecTowardPos,vecUpPos; vecNowPos=matCameraPos.GetLoc(); vecTowardPos=matToward.GetLoc(); vecTowardPos=vecTowardPos-vecNowPos; vecUpPos=matUp.GetLoc(); vecUpPos=vecUpPos-vecNowPos; CViewCamera::CameraNode AddNode; AddNode.m_vecPos=vecNowPos; //AddNode.m_vecTarget=vecNowPos+vecTowardPos; vecTowardPos.Normalize(); AddNode.m_vecTarget=vecTowardPos; vecUpPos.Normalize(); AddNode.m_vecUp=vecUpPos; AddNode.m_Time=m_Timer; if(m_CameraList->num==0) { m_CameraList->Add(AddNode); } else { bool isAlreadyWrite=false; for(int cNode=0;cNode< m_CameraList->num;cNode++) { if((*m_CameraList)[cNode].m_Time==m_Timer) { (*m_CameraList)[cNode]=AddNode; isAlreadyWrite=true; break; } } if(isAlreadyWrite==false) { for(cNode=1;cNode< m_CameraList->num;cNode++) { if( (*m_CameraList)[cNode].m_Time < m_Timer && m_Timer < (*m_CameraList)[cNode].m_Time ) { m_CameraList->Insert(AddNode,cNode); isAlreadyWrite=true; break; } } } if(isAlreadyWrite==false) { m_CameraList->Add(AddNode); } } UpdateList(); //CSceneManager::GetCamera()->AddCameraNode(vecNowPos,vecNowPos+vecTowardPos,vector3(0.0f,1.0f,0.0f),0.0f); /* D3DXMatrixTranslation(&matT, vecT.x, vecT.y, vecT.z); D3DXMatrixMultiply(matPosition, &matT, matPosition); m_fCameraPosX=vecCameraPos.x; m_fCameraPosY=vecCameraPos.y; m_fCameraPosZ=vecCameraPos.z; */ UpdateData(FALSE); } BOOL CDlgCamera::OnInitDialog() { CDialog::OnInitDialog(); // TODO: Add extra initialization here return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } void CDlgCamera::UpdateList() { if(m_CameraList==NULL) m_CameraList=CSceneManager::GetCamera()->GetCameraList(); int nNode=m_CameraNodeList.GetCount(); for(int cNode=0;cNodenum;cNode++) { strNode.Format("%d",(*m_CameraList)[cNode].m_Time); m_CameraNodeList.AddString(strNode); } UpdateData(FALSE); } void CDlgCamera::OnDblclkListCameranode() { if(m_CameraList->num==0) return; int CurSel=m_CameraNodeList.GetCurSel(); m_fCameraPosX=(*m_CameraList)[CurSel].m_vecPos.x; m_fCameraPosY=(*m_CameraList)[CurSel].m_vecPos.y; m_fCameraPosZ=(*m_CameraList)[CurSel].m_vecPos.z; m_Timer=(*m_CameraList)[CurSel].m_Time; m_SelectTime=m_Timer; UpdateData(FALSE); // TODO: Add your control notification handler code here } void CDlgCamera::OnButtonSubframe() { // TODO: Add your control notification handler code here UpdateData(); m_Timer--; if(m_Timer<0) m_Timer=0; m_SelectTime=m_Timer; UpdateData(FALSE); } void CDlgCamera::OnButtonAddframe() { // TODO: Add your control notification handler code here UpdateData(); m_Timer++; if(m_Timer>100) m_Timer=100; UpdateData(FALSE); } void CDlgCamera::OnButtonNodedelete() { // TODO: Add your control notification handler code here m_CameraList->num=0; UpdateList(); } void CDlgCamera::OnButtonNodeload() { // TODO: Add your control notification handler code here CString strFilter = "ZallA 3D CameraAnimation Files (*.ZCA)|*.ZCA|All Files (*.*)|*.*||"; CFileDialog filedia(TRUE,NULL,NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,strFilter,this); filedia.DoModal(); CString strFilename=filedia.GetFileName(); if(strFilename!="") { CSceneManager::GetCamera()->Load(strFilename.LockBuffer()); } m_fTotalTime=CSceneManager::GetCamera()->GetTotalAniTime(); UpdateList(); UpdateData(FALSE); } void CDlgCamera::OnButtonNodesave() { // TODO: Add your control notification handler code here CString strFilter = "ZallA 3D CameraAnimation Files (*.ZCA)|*.ZCA|All Files (*.*)|*.*||"; CFileDialog filedia(FALSE,NULL,NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,strFilter,this); filedia.DoModal(); CString strFilename=filedia.GetFileName(); if(strFilename!="") { CSceneManager::GetCamera()->Save(strFilename.LockBuffer()); } } void CDlgCamera::OnChangeEditTotaltime() { // TODO: If this is a RICHEDIT control, the control will not // send this notification unless you override the CDialog::OnInitDialog() // function and call CRichEditCtrl().SetEventMask() // with the ENM_CHANGE flag ORed into the mask. // TODO: Add your control notification handler code here UpdateData(); CSceneManager::GetCamera()->SetTotalAniTime(m_fTotalTime); } BOOL CDlgCamera::PreTranslateMessage(MSG* pMsg) { // TODO: Add your specialized code here and/or call the base class if(pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_ESCAPE) { CSceneManager::GetCamera()->LoadViewMatrix(); CSceneManager::m_ViewerMode=0; OnOK(); } return CDialog::PreTranslateMessage(pMsg); }