DragonNest/Client/EtViewer/LinkObjectDlg.cpp
2024-12-19 09:48:26 +08:00

209 lines
5.8 KiB
C++

// LinkObjectDlg.cpp : implementation file
//
#include "stdafx.h"
#include "EtViewer.h"
#include "LinkObjectDlg.h"
#include "ObjectBase.h"
#include "GlobalValue.h"
using namespace std;
// CLinkObjectDlg dialog
IMPLEMENT_DYNAMIC(CLinkObjectDlg, CXTPDialog)
CLinkObjectDlg::CLinkObjectDlg(CWnd* pParent /*=NULL*/)
: CXTPDialog(CLinkObjectDlg::IDD, pParent)
{
m_pSelectSkin = NULL;
m_pTargetSkin = NULL;
}
CLinkObjectDlg::~CLinkObjectDlg()
{
}
void CLinkObjectDlg::DoDataExchange(CDataExchange* pDX)
{
CXTPDialog::DoDataExchange(pDX);
DDX_Control(pDX, IDC_COMBO1, m_SelectObject);
DDX_Control(pDX, IDC_COMBO2, m_LinkTargetBone);
DDX_Control(pDX, IDC_COMBO3, m_LinkTargetObject);
DDX_Control(pDX, IDOK, m_OKButton);
}
BEGIN_MESSAGE_MAP(CLinkObjectDlg, CXTPDialog)
ON_BN_CLICKED(IDOK, &CLinkObjectDlg::OnBnClickedOk)
ON_BN_CLICKED(IDCANCEL, &CLinkObjectDlg::OnBnClickedCancel)
ON_WM_DESTROY()
ON_CBN_SELCHANGE(IDC_COMBO1, &CLinkObjectDlg::OnCbnSelchangeCombo1)
ON_CBN_SELCHANGE(IDC_COMBO3, &CLinkObjectDlg::OnCbnSelchangeCombo3)
ON_CBN_SELCHANGE(IDC_COMBO2, &CLinkObjectDlg::OnCbnSelchangeCombo2)
END_MESSAGE_MAP()
// CLinkObjectDlg message handlers
BOOL CLinkObjectDlg::OnInitDialog()
{
CXTPDialog::OnInitDialog();
m_SelectObject.AddString( "None" );
// m_pVecSkinObjectList.push_back( NULL );
m_LinkTargetObject.AddString( "None" );
m_LinkTargetObject.SetCurSel(0);
m_LinkTargetObject.EnableWindow( FALSE );
m_LinkTargetBone.AddString( "None" );
m_LinkTargetBone.SetCurSel(0);
m_LinkTargetBone.EnableWindow( FALSE );
CObjectBase *pRoot = CGlobalValue::GetInstance().GetOneObject( CObjectBase::SCENE );
if( pRoot == NULL ) return FALSE;
char szFileName[256];
for( DWORD i=0; i<pRoot->GetChildCount(); i++ ) {
CObjectSkin *pSkin = dynamic_cast<CObjectSkin *>(pRoot->GetChild(i));
if( !pSkin ) continue;
_GetFileName( szFileName, _countof(szFileName), pSkin->GetFileName() );
m_SelectObject.AddString( szFileName );
m_szMapSkinObject.insert( make_pair( szFileName, pSkin ) );
// m_pVecSkinObjectList.push_back( pSkin );
/*
HTREEITEM hRoot;
hRoot = m_Tree.InsertItem( pSkin->GetName() );
EtAniObjectHandle hHandle = pSkin->GetObjectHandle();
if( !hHandle ) continue;
EtAniHandle hAni = hHandle->GetAniHandle();
if( !hAni ) continue;
if( hAni->GetBoneCount() < 1 ) continue;
for( int j=0; j<hAni->GetBoneCount(); j++ ) {
CEtBone *pBone = hAni->GetBone(j);
if( pBone->IsRootBone() ) {
}
}
*/
}
m_SelectObject.SetCurSel(0);
m_OKButton.EnableWindow( FALSE );
return TRUE;
}
void CLinkObjectDlg::OnBnClickedOk()
{
// TODO: Add your control notification handler code here
if( !m_pSelectSkin || !m_pTargetSkin || m_szTargetBone.IsEmpty() ) return;
EtAniObjectHandle hHandle = m_pSelectSkin->GetObjectHandle();
if( !hHandle ) return;
EtAniObjectHandle hTargetHandle = m_pTargetSkin->GetObjectHandle();
if( !hTargetHandle ) return;
if( !hTargetHandle->GetAniHandle() ) return;
int nBoneIndex = -1;
if( strcmp( m_szTargetBone.GetBuffer(), "None" ) ) {
nBoneIndex = hTargetHandle->GetAniHandle()->GetBoneIndex( m_szTargetBone.GetBuffer() );
}
hHandle->SetParent( hTargetHandle, nBoneIndex );
CXTPDialog::OnOK();
}
void CLinkObjectDlg::OnBnClickedCancel()
{
// TODO: Add your control notification handler code here
CXTPDialog::OnCancel();
}
void CLinkObjectDlg::OnDestroy()
{
CXTPDialog::OnDestroy();
}
void CLinkObjectDlg::OnCbnSelchangeCombo1()
{
m_LinkTargetObject.ResetContent();
m_LinkTargetObject.AddString( "None" );
m_pSelectSkin = NULL;
int nCurSel = m_SelectObject.GetCurSel();
if( nCurSel == 0 ) {
m_LinkTargetObject.EnableWindow( FALSE );
m_LinkTargetObject.SetCurSel(0);
m_LinkTargetBone.EnableWindow( FALSE );
m_LinkTargetBone.SetCurSel(0);
m_OKButton.EnableWindow( FALSE );
}
else {
CString szSelectStr;
m_SelectObject.GetLBText( nCurSel, szSelectStr );
std::map<std::string, CObjectSkin *>::iterator it = m_szMapSkinObject.find( szSelectStr.GetBuffer() );
if( it == m_szMapSkinObject.end() ) return;
m_pSelectSkin = it->second;
CObjectBase *pRoot = CGlobalValue::GetInstance().GetOneObject( CObjectBase::SCENE );
char szFileName[256];
for( DWORD i=0; i<pRoot->GetChildCount(); i++ ) {
CObjectSkin *pSkin = dynamic_cast<CObjectSkin *>(pRoot->GetChild(i));
if( !pSkin ) continue;
if( m_pSelectSkin == pSkin ) continue;
_GetFileName( szFileName, _countof(szFileName), pSkin->GetFileName() );
m_LinkTargetObject.AddString( szFileName );
}
m_LinkTargetObject.EnableWindow( TRUE );
m_LinkTargetObject.SetCurSel(0);
m_LinkTargetBone.EnableWindow( FALSE );
m_LinkTargetBone.SetCurSel(0);
}
}
void CLinkObjectDlg::OnCbnSelchangeCombo3()
{
// TODO: Add your control notification handler code here
m_LinkTargetBone.ResetContent();
m_LinkTargetBone.AddString( "None" );
int nCurSel = m_LinkTargetObject.GetCurSel();
if( nCurSel == 0 ) {
m_LinkTargetBone.EnableWindow( FALSE );
m_LinkTargetBone.SetCurSel(0);
m_OKButton.EnableWindow( FALSE );
}
else {
CString szSelectStr;
m_LinkTargetObject.GetLBText( nCurSel, szSelectStr );
std::map<std::string, CObjectSkin *>::iterator it = m_szMapSkinObject.find( szSelectStr.GetBuffer() );
if( it == m_szMapSkinObject.end() ) return;
m_pTargetSkin = it->second;
EtAniObjectHandle hHandle = m_pTargetSkin->GetObjectHandle();
if( !hHandle ) return;
EtAniHandle hAni = hHandle->GetAniHandle();
if( !hAni ) return;
if( hAni->GetBoneCount() < 1 ) return;
for( int j=0; j<hAni->GetBoneCount(); j++ ) {
CEtBone *pBone = hAni->GetBone(j);
m_LinkTargetBone.AddString( pBone->GetName() );
}
m_LinkTargetBone.EnableWindow( TRUE );
m_LinkTargetBone.SetCurSel(0);
m_OKButton.EnableWindow( TRUE );
}
}
void CLinkObjectDlg::OnCbnSelchangeCombo2()
{
m_OKButton.EnableWindow( TRUE );
int nCurSel = m_LinkTargetBone.GetCurSel();
m_LinkTargetBone.GetLBText( nCurSel, m_szTargetBone );
}