Move git root from Client/ to src/ to track all source code: - Client: Game client source (moved to Client/Client/) - Server: Game server source - GameTools: Development tools - CryptoSource: Encryption utilities - database: Database scripts - Script: Game scripts - rylCoder_16.02.2008_src: Legacy coder tools - GMFont, Game: Additional resources 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
380 lines
9.4 KiB
C++
380 lines
9.4 KiB
C++
// 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;cNode<nNode;cNode++)
|
|
{
|
|
m_CameraNodeList.DeleteString(0);
|
|
}
|
|
|
|
CString strNode;
|
|
for(cNode=0;cNode<m_CameraList->num;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);
|
|
}
|