Complete disaster-recovery snapshot: engine/game source, game data assets, VC6 toolchain + DX SDKs, build outputs, deployed game, and _UNUSED archive. Large binaries in Git LFS; text preserved byte-for-byte (core.autocrlf=false, no eol attributes). See RECOVERY.md for the one-clone rebuild procedure.
238 lines
6.2 KiB
C++
238 lines
6.2 KiB
C++
// StateTreeView.cpp : implementation file
|
|
//
|
|
|
|
#include "stdafx.h"
|
|
#include "AnimScript.h"
|
|
#include "StateTreeView.h"
|
|
#include "AnimScriptDoc.h"
|
|
#include "modifyview.h"
|
|
#include "stateparamview.h"
|
|
|
|
#ifdef _DEBUG
|
|
#define new DEBUG_NEW
|
|
#undef THIS_FILE
|
|
static char THIS_FILE[] = __FILE__;
|
|
#endif
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CStateTreeView
|
|
|
|
IMPLEMENT_DYNCREATE(CStateTreeView, CTreeView)
|
|
|
|
CStateTreeView::CStateTreeView()
|
|
{
|
|
}
|
|
|
|
CStateTreeView::~CStateTreeView()
|
|
{
|
|
}
|
|
|
|
|
|
BEGIN_MESSAGE_MAP(CStateTreeView, CTreeView)
|
|
//{{AFX_MSG_MAP(CStateTreeView)
|
|
ON_NOTIFY_REFLECT(TVN_SELCHANGED, OnSelchanged)
|
|
ON_WM_CREATE()
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CStateTreeView drawing
|
|
|
|
void CStateTreeView::OnDraw(CDC* pDC)
|
|
{
|
|
CDocument* pDoc = GetDocument();
|
|
// TODO: add draw code here
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CStateTreeView diagnostics
|
|
|
|
#ifdef _DEBUG
|
|
void CStateTreeView::AssertValid() const
|
|
{
|
|
CTreeView::AssertValid();
|
|
}
|
|
|
|
void CStateTreeView::Dump(CDumpContext& dc) const
|
|
{
|
|
CTreeView::Dump(dc);
|
|
}
|
|
#endif //_DEBUG
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CStateTreeView message handlers
|
|
void CStateTreeView::OnInitialUpdate()
|
|
{
|
|
CTreeView::OnInitialUpdate();
|
|
}
|
|
|
|
void CStateTreeView::OnSelchanged(NMHDR* pNMHDR, LRESULT* pResult)
|
|
{
|
|
NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
|
|
|
|
CAnimNode *pNode = (CAnimNode *)this->GetTreeCtrl().GetItemData(this->GetTreeCtrl().GetSelectedItem());
|
|
CAnimScriptDoc* pDoc = (CAnimScriptDoc *)GetDocument();
|
|
pDoc->m_pSelectedNode = pNode;
|
|
|
|
GetDocument()->UpdateAllViews(this,NULL,NULL);
|
|
*pResult = 0;
|
|
}
|
|
|
|
BOOL CStateTreeView::PreCreateWindow(CREATESTRUCT& cs)
|
|
{
|
|
cs.style |= TVS_SHOWSELALWAYS | TVS_HASLINES | TVS_LINESATROOT | TVS_DISABLEDRAGDROP | TVS_FULLROWSELECT | TVS_HASBUTTONS;
|
|
return CTreeView::PreCreateWindow(cs);
|
|
}
|
|
|
|
void CStateTreeView::OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint)
|
|
{
|
|
if (pSender && pSender->IsKindOf(RUNTIME_CLASS(CModifyView)))
|
|
return;
|
|
|
|
if (lHint)
|
|
return;
|
|
|
|
CAnimScriptDoc* pDoc = (CAnimScriptDoc *)GetDocument();
|
|
CTreeCtrl *pCtrl = &this->GetTreeCtrl();
|
|
//Check all of the Animation States
|
|
HTREEITEM hItem = pCtrl->GetRootItem();
|
|
while (hItem)
|
|
{
|
|
CAnimStateNode *pAnimNode = (CAnimStateNode *)this->GetTreeCtrl().GetItemData(hItem);
|
|
if (pAnimNode->m_bValid)
|
|
{
|
|
pCtrl->SetItemState(hItem,TVIS_BOLD,TVIS_BOLD);
|
|
}
|
|
else
|
|
{
|
|
pCtrl->SetItemState(hItem,0,TVIS_BOLD);
|
|
}
|
|
hItem = pCtrl->GetNextItem(hItem, TVGN_NEXT);
|
|
}
|
|
|
|
// Check all of the transition states
|
|
POSITION pos = pDoc->m_listTransitions.GetHeadPosition();
|
|
while (pos)
|
|
{
|
|
CObject *pObj = pDoc->m_listTransitions.GetNext(pos);
|
|
CTransStateNode *pTransNode = (CTransStateNode *)pObj;
|
|
|
|
bool bAdd = false;
|
|
for (int x=0;x<2;x++)
|
|
{
|
|
CAnimNode *pNode = NULL;
|
|
if (0==x)
|
|
pNode = pTransNode->m_pStartNode;
|
|
else
|
|
pNode = pTransNode->m_pEndNode;
|
|
if (pNode)
|
|
{
|
|
// if (pNode->m_bValid)
|
|
{
|
|
//pTransNode should be a child of hItem
|
|
// Look for it, and if it's not there then add it.
|
|
bool bFound = false;
|
|
HTREEITEM hChild = pCtrl->GetChildItem(pNode->m_hItem);
|
|
while (hChild)
|
|
{
|
|
CTransStateNode *pNode1 = (CTransStateNode *)pCtrl->GetItemData(hChild);
|
|
if (pNode1&&pNode1->m_bValid)
|
|
pCtrl->SetItemState(hChild,TVIS_BOLD,TVIS_BOLD);
|
|
else
|
|
pCtrl->SetItemState(hChild,0,TVIS_BOLD);
|
|
if (pNode1 == pTransNode)
|
|
{
|
|
bFound = true;
|
|
bool bValidX = pTransNode->m_pStartNode?pTransNode->m_pStartNode->m_bValid:1;
|
|
bool bValidY = pTransNode->m_pEndNode?pTransNode->m_pEndNode->m_bValid:1;
|
|
if (!(bValidX & bValidY))
|
|
{
|
|
if (pNode->m_hItem)
|
|
{
|
|
pCtrl->DeleteItem(hChild);
|
|
CRect rc;
|
|
pCtrl->GetItemRect(pNode->m_hItem,&rc,false);
|
|
pCtrl->InvalidateRect(&rc);
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
hChild = pCtrl->GetNextItem(hChild,TVGN_NEXT);
|
|
}
|
|
/*if (bFound)
|
|
{
|
|
bool bValidX = pTransNode->m_pStartNode?pTransNode->m_pStartNode->m_bValid:1;
|
|
bool bValidY = pTransNode->m_pEndNode?pTransNode->m_pEndNode->m_bValid:1;
|
|
if (!(bValidX & bValidY))
|
|
{
|
|
if (pNode->m_hItem)
|
|
{
|
|
pCtrl->DeleteItem(pTransNode->m_hItem);
|
|
CRect rc;
|
|
pCtrl->GetItemRect(pNode->m_hItem,&rc,false);
|
|
pCtrl->InvalidateRect(&rc);
|
|
}
|
|
}
|
|
}
|
|
else*/
|
|
if (!bFound)
|
|
{
|
|
if (pNode->m_bValid)
|
|
{
|
|
bAdd = true;
|
|
bool bValidX = pTransNode->m_pStartNode?pTransNode->m_pStartNode->m_bValid:1;
|
|
bool bValidY = pTransNode->m_pEndNode?pTransNode->m_pEndNode->m_bValid:1;
|
|
if (bValidX & bValidY)
|
|
{
|
|
// Add pTransNode to pNode (parent)
|
|
hChild = pCtrl->InsertItem(pTransNode->GetName(),pNode->m_hItem);
|
|
pTransNode->m_hItem = hChild;
|
|
pCtrl->SetItemData(hChild,(DWORD)pTransNode);
|
|
|
|
// Invalidate the rect so that the "+" and other stuff gets drawn
|
|
CRect rc;
|
|
pCtrl->GetItemRect(hChild,&rc,false);
|
|
pCtrl->InvalidateRect(&rc);
|
|
|
|
pCtrl->GetItemRect(pNode->m_hItem,&rc,false);
|
|
pCtrl->InvalidateRect(&rc);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
/* else
|
|
{
|
|
if (pNode->m_hItem)
|
|
{
|
|
pCtrl->DeleteItem(pTransNode->m_hItem);
|
|
CRect rc;
|
|
pCtrl->GetItemRect(pNode->m_hItem,&rc,false);
|
|
pCtrl->InvalidateRect(&rc);
|
|
}
|
|
}*/
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
int CStateTreeView::OnCreate(LPCREATESTRUCT lpCreateStruct)
|
|
{
|
|
if (CTreeView::OnCreate(lpCreateStruct) == -1)
|
|
return -1;
|
|
|
|
CTreeCtrl *pCtrl = &this->GetTreeCtrl();
|
|
CAnimScriptDoc* pDoc = (CAnimScriptDoc *)GetDocument();
|
|
|
|
POSITION pos = pDoc->m_listStates.GetHeadPosition();
|
|
while (pos)
|
|
{
|
|
CObject *pObj = pDoc->m_listStates.GetNext(pos);
|
|
CAnimStateNode *pNode = (CAnimStateNode *)pObj;
|
|
|
|
HTREEITEM hItem = pCtrl->InsertItem(pNode->GetName());
|
|
pNode->m_hItem = hItem;
|
|
pCtrl->SetItemData(hItem,(DWORD)pNode);
|
|
}
|
|
return 0;
|
|
}
|