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>
808 lines
18 KiB
C++
808 lines
18 KiB
C++
// PageTriggerContainer.cpp : implementation file
|
||
//
|
||
|
||
#include "stdafx.h"
|
||
#include "worldcreator.h"
|
||
#include "PageTriggerContainer.h"
|
||
#include "resource.h"
|
||
|
||
#include "DlgTriggerPoint.h"
|
||
#include "DlgTriggerProperty.h"
|
||
|
||
#include "MainFrm.h"
|
||
#include "WorldCreatorView.h"
|
||
#include <BGMController.h>
|
||
#include <TriggerEvent.h>
|
||
#include <assert.h>
|
||
|
||
#ifdef _DEBUG
|
||
#define new DEBUG_NEW
|
||
#undef THIS_FILE
|
||
static char THIS_FILE[] = __FILE__;
|
||
#endif
|
||
|
||
|
||
typedef unsigned char byte;
|
||
|
||
|
||
|
||
/////////////////////////////////////////////////////////////////////////////
|
||
//
|
||
|
||
enum eNodeType
|
||
{
|
||
TYPE_CATEGORY = 0,
|
||
TYPE_TRIGGER = 1,
|
||
TYPE_POINTS = 2,
|
||
TYPE_POINT = 3,
|
||
TYPE_EVENTS = 4,
|
||
TYPE_EVENT = 5,
|
||
};
|
||
|
||
/////////////////////////////////////////////////////////////////////////////
|
||
//
|
||
|
||
struct SNodeData
|
||
{
|
||
union
|
||
{
|
||
struct
|
||
{
|
||
DWORD type : 4;
|
||
DWORD index1 : 14;
|
||
DWORD index2 : 14;
|
||
};
|
||
DWORD value;
|
||
};
|
||
|
||
operator DWORD() { return value; }
|
||
|
||
SNodeData();
|
||
SNodeData( eNodeType Type );
|
||
SNodeData( DWORD nodeValue );
|
||
SNodeData( int eventID, const char * szArg );
|
||
SNodeData( float x, float y, float z, long objID );
|
||
|
||
void Delete();
|
||
void GetPoint( float & x, float & y, float & z, long & objID ) const;
|
||
void GetEvent( int & eventID, char * szArg ) const;
|
||
void SetEvent( int eventID, const char * szArg );
|
||
bool operator=( const SNodeData & rhs ) const { return value == rhs.value; }
|
||
void Select() const;
|
||
};
|
||
|
||
/////////////////////////////////////////////////////////////////////////////
|
||
//
|
||
|
||
|
||
SNodeData::SNodeData()
|
||
: type( TYPE_CATEGORY )
|
||
, index1( 0 )
|
||
, index2( 0 )
|
||
{}
|
||
|
||
SNodeData::SNodeData( eNodeType Type )
|
||
: type( Type )
|
||
, index1( 0 )
|
||
, index2( 0 )
|
||
{
|
||
if( type == TYPE_TRIGGER )
|
||
{
|
||
CBGMController & BGMC = CBGMController::GetInstance();
|
||
index1 = BGMC.AddTrigger();
|
||
}
|
||
}
|
||
|
||
SNodeData::SNodeData( DWORD nodeValue )
|
||
: value( nodeValue )
|
||
{}
|
||
|
||
SNodeData::SNodeData( int eventID, const char * szArg )
|
||
: type( TYPE_EVENT )
|
||
{
|
||
CBGMController & BGMC = CBGMController::GetInstance();
|
||
index1 = BGMC.GetSelectTrigger();
|
||
index2 = BGMC.AddEvent( eventID, szArg );
|
||
}
|
||
|
||
SNodeData::SNodeData( float x, float y, float z, long objID )
|
||
: type( TYPE_POINT )
|
||
{
|
||
CBGMController & BGMC = CBGMController::GetInstance();
|
||
index1 = BGMC.GetSelectTrigger();
|
||
index2 = BGMC.AddPoint( x, y, z, objID );
|
||
}
|
||
|
||
void SNodeData::Delete()
|
||
{
|
||
CBGMController & BGMC = CBGMController::GetInstance();
|
||
|
||
switch( type )
|
||
{
|
||
case TYPE_TRIGGER :
|
||
BGMC.SelectTrigger( index1 );
|
||
BGMC.DeleteTrigger();
|
||
break;
|
||
|
||
case TYPE_CATEGORY :
|
||
case TYPE_POINTS :
|
||
case TYPE_EVENTS :
|
||
break;
|
||
|
||
case TYPE_POINT :
|
||
BGMC.SelectPoint( index1, index2 );
|
||
BGMC.DeletePoint();
|
||
break;
|
||
|
||
case TYPE_EVENT :
|
||
BGMC.SelectTrigger( index1 );
|
||
BGMC.DeleteEvent( index2 );
|
||
break;
|
||
}
|
||
}
|
||
|
||
void SNodeData::GetPoint( float & x, float & y, float & z, long & objID ) const
|
||
{
|
||
CBGMController & BGMC = CBGMController::GetInstance();
|
||
BGMC.SelectPoint( index1, index2 );
|
||
BGMC.GetPoint( x, y, z, objID );
|
||
}
|
||
|
||
void SNodeData::GetEvent( int & eventID, char * szArg ) const
|
||
{
|
||
CBGMController & BGMC = CBGMController::GetInstance();
|
||
BGMC.SelectTrigger( index1 );
|
||
BGMC.GetEvent( index2, eventID, szArg );
|
||
}
|
||
|
||
void SNodeData::SetEvent( int eventID, const char * szArg )
|
||
{
|
||
CBGMController & BGMC = CBGMController::GetInstance();
|
||
BGMC.SelectTrigger( index1 );
|
||
BGMC.SetEvent( index2, eventID, szArg );
|
||
}
|
||
|
||
void SNodeData::Select() const
|
||
{
|
||
CBGMController & BGMC = CBGMController::GetInstance();
|
||
|
||
if( type == TYPE_TRIGGER )
|
||
{
|
||
BGMC.SelectTrigger( index1 );
|
||
}
|
||
else if( type == TYPE_POINT )
|
||
{
|
||
BGMC.SelectPoint( index1, index2 );
|
||
}
|
||
}
|
||
|
||
|
||
|
||
/////////////////////////////////////////////////////////////////////////////
|
||
// CPageTriggerContainer property page
|
||
|
||
IMPLEMENT_DYNCREATE(CPageTriggerContainer, CPropertyPage)
|
||
|
||
CPageTriggerContainer::CPageTriggerContainer() : CPropertyPage(CPageTriggerContainer::IDD)
|
||
{
|
||
//{{AFX_DATA_INIT(CPageTriggerContainer)
|
||
// NOTE: the ClassWizard will add member initialization here
|
||
//}}AFX_DATA_INIT
|
||
}
|
||
|
||
CPageTriggerContainer::~CPageTriggerContainer()
|
||
{
|
||
}
|
||
|
||
void CPageTriggerContainer::DoDataExchange(CDataExchange* pDX)
|
||
{
|
||
CPropertyPage::DoDataExchange(pDX);
|
||
//{{AFX_DATA_MAP(CPageTriggerContainer)
|
||
DDX_Control(pDX, IDC_EDIT_EPSILON, m_editEpsilon);
|
||
DDX_Control(pDX, IDC_TREE1, m_Tree);
|
||
//}}AFX_DATA_MAP
|
||
}
|
||
|
||
|
||
BEGIN_MESSAGE_MAP(CPageTriggerContainer, CPropertyPage)
|
||
//{{AFX_MSG_MAP(CPageTriggerContainer)
|
||
ON_NOTIFY(NM_RCLICK, IDC_TREE1, OnRclickTree1)
|
||
ON_COMMAND(MENU_NEWTRIGGER, OnNewtrigger)
|
||
ON_COMMAND(MENU_ADDPOINT, OnAddpoint)
|
||
ON_COMMAND(MENU_ADDCATEGORY, OnAddcategory)
|
||
ON_COMMAND(MENU_TRIGGERPROPERTY, OnTriggerproperty)
|
||
ON_COMMAND(MENU_DELETENODE, OnDeletenode)
|
||
ON_NOTIFY(TVN_ENDLABELEDIT, IDC_TREE1, OnEndlabeleditTree1)
|
||
ON_COMMAND(MENU_LOADTRIGGER, OnLoadtrigger)
|
||
ON_COMMAND(MENU_SAVETRIGGER, OnSavetrigger)
|
||
ON_COMMAND(MENU_BUILDTRIGGER, OnBuildtrigger)
|
||
ON_NOTIFY(TVN_BEGINDRAG, IDC_TREE1, OnBegindragTree1)
|
||
ON_COMMAND(ID_ADDEVENT, OnAddevent)
|
||
//}}AFX_MSG_MAP
|
||
END_MESSAGE_MAP()
|
||
|
||
/////////////////////////////////////////////////////////////////////////////
|
||
// CPageTriggerContainer message handlers
|
||
|
||
float CPageTriggerContainer::GetEpsilon()
|
||
{
|
||
char szEpsilon[1024];
|
||
m_editEpsilon.GetWindowText( szEpsilon, 1024 );
|
||
float epsilon;
|
||
epsilon = (float)strtod( szEpsilon, NULL );
|
||
|
||
return epsilon;
|
||
}
|
||
|
||
|
||
|
||
int CPageTriggerContainer::GetChildCount( HTREEITEM hItem )
|
||
{
|
||
if( hItem == NULL )
|
||
return 0;
|
||
|
||
HTREEITEM hChild = m_Tree.GetChildItem( hItem );
|
||
|
||
int i = 0;
|
||
|
||
while( hChild != NULL )
|
||
{
|
||
i++;
|
||
hChild = m_Tree.GetNextItem( hChild, TVGN_NEXT );
|
||
}
|
||
return i;
|
||
}
|
||
|
||
void CPageTriggerContainer::SetPos( HTREEITEM hItem, float x, float y, float z, long objID )
|
||
{
|
||
SNodeData nodeData = m_Tree.GetItemData( hItem );
|
||
|
||
CBGMController & BGMC = CBGMController::GetInstance();
|
||
|
||
if( nodeData.type == TYPE_POINT )
|
||
{
|
||
nodeData.Select();
|
||
BGMC.MovePoint( x, y, z );
|
||
BGMC.SetObjID( objID );
|
||
}
|
||
}
|
||
|
||
void CPageTriggerContainer::GetPos( HTREEITEM hItem, float & x, float & y, float & z, long & objID )
|
||
{
|
||
if( hItem == NULL )
|
||
{
|
||
x = y = z = 0.0f;
|
||
objID = 0;
|
||
}
|
||
|
||
SNodeData nodeData = m_Tree.GetItemData( hItem );
|
||
|
||
CBGMController & BGMC = CBGMController::GetInstance();
|
||
|
||
if( nodeData.type == TYPE_POINT )
|
||
{
|
||
nodeData.GetPoint( x, y, z, objID );
|
||
}
|
||
}
|
||
|
||
void CPageTriggerContainer::OnRclickTree1(NMHDR* pNMHDR, LRESULT* pResult)
|
||
{
|
||
CPoint point;
|
||
GetCursorPos(&point);
|
||
CMenu menu;
|
||
menu.LoadMenu(IDR_MENU_TRIGGER);
|
||
menu.GetSubMenu(0)->TrackPopupMenu(TPM_LEFTALIGN,point.x,point.y,this);
|
||
|
||
*pResult = 0;
|
||
}
|
||
|
||
void CPageTriggerContainer::OnNewtrigger()
|
||
{
|
||
HTREEITEM selected = m_Tree.GetSelectedItem();
|
||
|
||
if( selected == NULL )
|
||
return;
|
||
|
||
SNodeData nodeData = m_Tree.GetItemData( selected );
|
||
|
||
//<2F><><EFBFBD>õ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>쿡<EFBFBD><ECBFA1>...
|
||
if( nodeData.type != TYPE_CATEGORY )
|
||
return;
|
||
|
||
HTREEITEM added = m_Tree.InsertItem( "Ʈ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>", selected );
|
||
m_Tree.Expand( selected, TVE_EXPAND );
|
||
|
||
m_Tree.SetItemData( added, SNodeData( TYPE_TRIGGER ) );
|
||
|
||
HTREEITEM vertexes = m_Tree.InsertItem( "<EFBFBD><EFBFBD><EFBFBD><EFBFBD>", added, NULL );
|
||
m_Tree.SetItemData( vertexes, SNodeData( TYPE_POINTS ) );
|
||
|
||
HTREEITEM events = m_Tree.InsertItem( "<EFBFBD>̺<EFBFBD>Ʈ", added, NULL );
|
||
m_Tree.SetItemData( events, SNodeData( TYPE_EVENTS ) );
|
||
|
||
HTREEITEM hItem = m_Tree.InsertItem( "<EFBFBD><EFBFBD> #1", vertexes, NULL );
|
||
m_Tree.SetItemData( hItem, SNodeData( 0.0f, 0.0f, 0.0f, 0 ) );
|
||
|
||
hItem = m_Tree.InsertItem( "<EFBFBD><EFBFBD> #2", vertexes, NULL );
|
||
m_Tree.SetItemData( hItem, SNodeData( 0.0f, 0.0f, 0.0f, 0 ) );
|
||
|
||
hItem = m_Tree.InsertItem( "<EFBFBD><EFBFBD> #3", vertexes, NULL );
|
||
m_Tree.SetItemData( hItem, SNodeData( 0.0f, 0.0f, 0.0f, 0 ) );
|
||
|
||
hItem = m_Tree.InsertItem( "<EFBFBD>̺<EFBFBD>Ʈ #1", events, NULL );
|
||
m_Tree.SetItemData( hItem, SNodeData( EVENT_NONE, "" ) );
|
||
|
||
m_Tree.Expand( added, TVE_EXPAND );
|
||
}
|
||
|
||
void CPageTriggerContainer::OnAddpoint()
|
||
{
|
||
HTREEITEM selected = m_Tree.GetSelectedItem();
|
||
|
||
if( selected != NULL )
|
||
{
|
||
SNodeData nodeData = m_Tree.GetItemData( selected );
|
||
if( nodeData.type == TYPE_POINTS )
|
||
{
|
||
int ItemNum = GetChildCount( selected ) + 1;
|
||
CString itemText;
|
||
itemText.Format( "<EFBFBD><EFBFBD> #%d", ItemNum );
|
||
|
||
nodeData.Select();
|
||
|
||
HTREEITEM added = m_Tree.InsertItem( itemText, selected );
|
||
m_Tree.SetItemData( added, SNodeData( 0.0f, 0.0f, 0.0f, 0 ) );
|
||
m_Tree.Expand( selected, TVE_EXPAND );
|
||
}
|
||
}
|
||
}
|
||
|
||
void CPageTriggerContainer::OnAddcategory()
|
||
{
|
||
HTREEITEM selected = m_Tree.GetSelectedItem();
|
||
|
||
if( selected != NULL )
|
||
{
|
||
SNodeData nodeData = m_Tree.GetItemData( selected );
|
||
//<2F><><EFBFBD>õ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>쿡<EFBFBD><ECBFA1>...
|
||
if( nodeData.type == TYPE_CATEGORY )
|
||
{
|
||
HTREEITEM added = m_Tree.InsertItem( "<EFBFBD><EFBFBD><EFBFBD><EFBFBD>", selected );
|
||
m_Tree.SetItemData( added, SNodeData( TYPE_CATEGORY ) );
|
||
m_Tree.Expand( selected, TVE_EXPAND );
|
||
}
|
||
}
|
||
}
|
||
|
||
void CPageTriggerContainer::OnAddevent()
|
||
{
|
||
HTREEITEM selected = m_Tree.GetSelectedItem();
|
||
|
||
if( selected != NULL )
|
||
{
|
||
SNodeData nodeData = m_Tree.GetItemData( selected );
|
||
if( nodeData.type == TYPE_EVENTS )
|
||
{
|
||
int ItemNum = GetChildCount( selected ) + 1;
|
||
CString itemText;
|
||
itemText.Format( "<EFBFBD>̺<EFBFBD>Ʈ #%d", ItemNum );
|
||
|
||
SNodeData parentNode = m_Tree.GetItemData( m_Tree.GetParentItem( selected ) );
|
||
assert( parentNode.type == TYPE_TRIGGER );
|
||
parentNode.Select();
|
||
|
||
HTREEITEM added = m_Tree.InsertItem( itemText, selected );
|
||
m_Tree.SetItemData( added, SNodeData( EVENT_NONE, "" ) );
|
||
m_Tree.Expand( selected, TVE_EXPAND );
|
||
}
|
||
}
|
||
}
|
||
|
||
|
||
void CPageTriggerContainer::OnDeletenode()
|
||
{
|
||
HTREEITEM selected = m_Tree.GetSelectedItem();
|
||
|
||
if( selected == NULL )
|
||
return;
|
||
|
||
SNodeData nodeData = m_Tree.GetItemData( selected );
|
||
|
||
switch( nodeData.type )
|
||
{
|
||
case TYPE_POINT :
|
||
{
|
||
if( GetChildCount( m_Tree.GetParentItem( selected ) ) <= 3 )
|
||
{
|
||
MessageBox( "Ʈ<EFBFBD><EFBFBD><EFBFBD>Ÿ<EFBFBD> <20>̷<EFBFBD><CCB7><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 3<><33> <20>̻<EFBFBD><CCBB><EFBFBD> <20>Ǿ<EFBFBD><C7BE><EFBFBD> <20>ϹǷ<CFB9> <20>־<EFBFBD><D6BE><EFBFBD> <20><><EFBFBD>带 <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>." );
|
||
return;
|
||
}
|
||
|
||
float x, y, z;
|
||
long objID;
|
||
nodeData.GetPoint( x, y, z, objID );
|
||
|
||
CMainFrame *mf=(CMainFrame*)AfxGetApp()->m_pMainWnd;
|
||
CWorldCreatorView *av=(CWorldCreatorView *)mf->GetActiveView();
|
||
av->m_SceneManager->m_MapStorage.DelMeshMap( x, y, z, objID );
|
||
|
||
m_Tree.DeleteItem( selected );
|
||
nodeData.Delete();
|
||
|
||
break;
|
||
}
|
||
case TYPE_POINTS :
|
||
case TYPE_EVENTS :
|
||
break;
|
||
|
||
case TYPE_EVENT :
|
||
|
||
m_Tree.DeleteItem( selected );
|
||
nodeData.Delete();
|
||
break;
|
||
|
||
case TYPE_TRIGGER :
|
||
{
|
||
nodeData.Select();
|
||
|
||
CBGMController & BGMC = CBGMController::GetInstance();
|
||
CMainFrame *mf=(CMainFrame*)AfxGetApp()->m_pMainWnd;
|
||
CWorldCreatorView *av=(CWorldCreatorView *)mf->GetActiveView();
|
||
|
||
int i = 0;
|
||
float x, y, z;
|
||
long objID;
|
||
while( BGMC.SelectPoint( nodeData.index1, i ) )
|
||
{
|
||
BGMC.GetPoint( x, y, z, objID );
|
||
av->m_SceneManager->m_MapStorage.DelMeshMap( x, y, z, objID );
|
||
i++;
|
||
}
|
||
|
||
nodeData.Delete();
|
||
m_Tree.DeleteItem( selected );
|
||
|
||
break;
|
||
}
|
||
case TYPE_CATEGORY :
|
||
|
||
if( GetChildCount( selected ) == 0 )
|
||
m_Tree.DeleteItem( selected );
|
||
|
||
break;
|
||
}
|
||
}
|
||
|
||
BOOL CPageTriggerContainer::OnInitDialog()
|
||
{
|
||
CPropertyPage::OnInitDialog();
|
||
|
||
HTREEITEM added = m_Tree.InsertItem( "<EFBFBD>Ϲ<EFBFBD> Ʈ<><C6AE><EFBFBD><EFBFBD>" );
|
||
SNodeData nodeData( TYPE_CATEGORY );
|
||
m_Tree.SetItemData( added, nodeData );
|
||
|
||
m_editEpsilon.SetWindowText( "1000.0" );
|
||
|
||
return TRUE; // return TRUE unless you set the focus to a control
|
||
// EXCEPTION: OCX Property Pages should return FALSE
|
||
}
|
||
|
||
void CPageTriggerContainer::OnTriggerproperty()
|
||
{
|
||
HTREEITEM selected = m_Tree.GetSelectedItem();
|
||
if( selected == NULL )
|
||
return;
|
||
|
||
SNodeData nodeData = m_Tree.GetItemData( selected );
|
||
|
||
switch( nodeData.type )
|
||
{
|
||
case TYPE_CATEGORY :
|
||
case TYPE_TRIGGER :
|
||
case TYPE_POINTS :
|
||
case TYPE_EVENTS :
|
||
break;
|
||
case TYPE_POINT :
|
||
{
|
||
CDlgTriggerPoint dlg;
|
||
long objID;
|
||
|
||
nodeData.GetPoint( dlg.m_xPos, dlg.m_yPos, dlg.m_zPos, objID );
|
||
|
||
dlg.DoModal();
|
||
break;
|
||
}
|
||
case TYPE_EVENT :
|
||
{
|
||
CDlgTriggerProperty dlg;
|
||
|
||
char szArgBuf[1024];
|
||
int eventType;
|
||
nodeData.GetEvent( eventType, szArgBuf );
|
||
|
||
dlg.m_strEventArg = szArgBuf;
|
||
dlg.SetEventType( eventType );
|
||
|
||
if( dlg.DoModal() == IDOK )
|
||
{
|
||
nodeData.SetEvent( dlg.GetEventType(), dlg.m_strEventArg );
|
||
m_Tree.SetItemData( selected, nodeData );
|
||
}
|
||
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
|
||
|
||
|
||
void CPageTriggerContainer::OnEndlabeleditTree1(NMHDR* pNMHDR, LRESULT* pResult)
|
||
{
|
||
TV_DISPINFO* pTVDispInfo = (TV_DISPINFO*)pNMHDR;
|
||
|
||
*pResult = 1;
|
||
}
|
||
|
||
void CPageTriggerContainer::OnLoadtrigger()
|
||
{
|
||
CBGMController & BGMC = CBGMController::GetInstance();
|
||
|
||
CFileDialog FileDlg( TRUE, NULL, NULL, OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST | OFN_HIDEREADONLY
|
||
, "Trigger Files (*.Trg)|*.trg|AllFiles (*.*)|*.*||", this );
|
||
|
||
if( FileDlg.DoModal() == IDOK )
|
||
{
|
||
m_Tree.DeleteAllItems();
|
||
FILE * fp = fopen( FileDlg.GetPathName(), "rb" );
|
||
LoadAllItems( fp );
|
||
BGMC.Create( fp, true );
|
||
fclose( fp );
|
||
|
||
RenderAllObjects();
|
||
}
|
||
}
|
||
|
||
void CPageTriggerContainer::OnSavetrigger()
|
||
{
|
||
CBGMController & BGMC = CBGMController::GetInstance();
|
||
|
||
CFileDialog FileDlg( TRUE, NULL, NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT
|
||
, "Trigger Files (*.trg)|*.trg|AllFiles (*.*)|*.*||", this );
|
||
|
||
if( FileDlg.DoModal() == IDOK )
|
||
{
|
||
BGMC.Rebuild( GetEpsilon() );
|
||
|
||
FILE * fp = fopen( FileDlg.GetPathName(), "wb" );
|
||
SaveAllItems( fp );
|
||
BGMC.Save( fp );
|
||
fclose( fp );
|
||
}
|
||
}
|
||
|
||
void CPageTriggerContainer::LoadItem( HTREEITEM hItem, FILE * fp )
|
||
{
|
||
if( hItem == NULL )
|
||
return;
|
||
|
||
DWORD value;
|
||
int textLen = 0;
|
||
char szBuffer[1024];
|
||
|
||
fread( &value, sizeof( DWORD ), 1, fp );
|
||
fread( &textLen, sizeof( int ), 1, fp );
|
||
fread( szBuffer, sizeof( char ), textLen, fp );
|
||
|
||
szBuffer[ textLen ] = '\0';
|
||
|
||
m_Tree.SetItemData( hItem, value );
|
||
m_Tree.SetItemText( hItem, szBuffer );
|
||
}
|
||
|
||
void CPageTriggerContainer::SaveItem( HTREEITEM hItem, FILE * fp )
|
||
{
|
||
if( hItem == NULL )
|
||
return;
|
||
|
||
SNodeData nodeData = m_Tree.GetItemData( hItem );
|
||
CString itemText = m_Tree.GetItemText( hItem );
|
||
int textLen = itemText.GetLength();
|
||
|
||
fwrite( &nodeData.value, sizeof( DWORD ), 1, fp );
|
||
fwrite( &textLen, sizeof( int ), 1, fp );
|
||
fwrite( (const char*)itemText, sizeof( char ), textLen, fp );
|
||
}
|
||
|
||
|
||
void CPageTriggerContainer::LoadAllItems( FILE * fp )
|
||
{
|
||
if( fp == NULL )
|
||
return;
|
||
|
||
typedef pair<HTREEITEM,int> QueueNode;
|
||
queue<QueueNode> ItemQueue; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ڵ<EFBFBD>, <20>ڽ<EFBFBD> <20><><EFBFBD><EFBFBD>
|
||
|
||
int nChild = 0;
|
||
|
||
//1. <20><>Ʈ <20><><EFBFBD>尡 <20>ִ<EFBFBD><D6B4><EFBFBD><EFBFBD><EFBFBD> <20>о<EFBFBD><D0BE>´<EFBFBD>.
|
||
fread( &nChild, sizeof( int ), 1, fp );
|
||
|
||
//2. <20>о<EFBFBD><D0BE><EFBFBD> <20><><EFBFBD><EFBFBD> 0<≯<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
||
if( nChild == 0 )
|
||
return;
|
||
|
||
//3. <20><>Ʈ <20><><EFBFBD>带 <20>߰<EFBFBD><DFB0>ϰ<EFBFBD> <20>о<EFBFBD><D0BE>´<EFBFBD>.
|
||
HTREEITEM hItem = m_Tree.InsertItem( "" );
|
||
LoadItem( hItem, fp );
|
||
|
||
fread( &nChild, sizeof( int ), 1, fp );
|
||
|
||
//4. <20><>Ʈ <20><><EFBFBD>带 ť<><C5A5> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
|
||
ItemQueue.push( QueueNode( hItem, nChild ) );
|
||
|
||
//5. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ť<EFBFBD><C5A5> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||
while( !ItemQueue.empty() )
|
||
{
|
||
//5-1. ť<><C5A5><EFBFBD><EFBFBD> <20>ϳ<EFBFBD><CFB3><EFBFBD> <20><><EFBFBD>ͼ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
|
||
QueueNode node = ItemQueue.front();
|
||
ItemQueue.pop();
|
||
|
||
//5-3. <20>ڽ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ŭ
|
||
for( int i = 0; i < node.second; i++ )
|
||
{
|
||
//5-3-1. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>о<EFBFBD><D0BE>ͼ<EFBFBD> <20><><EFBFBD>带 <20>߰<EFBFBD><DFB0>Ѵ<EFBFBD>.
|
||
HTREEITEM hChildItem = m_Tree.InsertItem( "", node.first );
|
||
m_Tree.SetItemData( hChildItem, 0 );
|
||
LoadItem( hChildItem, fp );
|
||
|
||
//5-2. <20>ڽ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>о<EFBFBD><D0BE>´<EFBFBD>.
|
||
fread( &nChild, sizeof( int ), 1, fp );
|
||
|
||
//5-3-2. <20>߰<EFBFBD><DFB0><EFBFBD> <20><><EFBFBD>带 ť<><C5A5> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
|
||
ItemQueue.push( QueueNode( hChildItem, nChild ) );
|
||
}
|
||
}
|
||
}
|
||
|
||
void CPageTriggerContainer::SaveAllItems( FILE * fp )
|
||
{
|
||
if( fp == NULL )
|
||
return;
|
||
|
||
queue<HTREEITEM> ItemQueue;
|
||
|
||
//1.<2E><>Ʈ <20><><EFBFBD>带 ť<><C5A5> push
|
||
HTREEITEM hItem = m_Tree.GetRootItem();
|
||
|
||
int nChild = 0;
|
||
|
||
if( hItem != NULL )
|
||
{
|
||
nChild = 1;
|
||
ItemQueue.push( hItem );
|
||
}
|
||
|
||
fwrite( &nChild, sizeof( int ), 1, fp );
|
||
|
||
//2.ť<><C5A5> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||
while( !ItemQueue.empty() )
|
||
{
|
||
//2-1.ť<><C5A5><EFBFBD><EFBFBD> <20>ϳ<EFBFBD><CFB3><EFBFBD> pop<6F>ؿͼ<D8BF> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>忡 <20><><EFBFBD><EFBFBD>
|
||
hItem = ItemQueue.front();
|
||
ItemQueue.pop();
|
||
|
||
//2-2.<2E><><EFBFBD><EFBFBD> <20><><EFBFBD>带 <20><><EFBFBD><EFBFBD>
|
||
SaveItem( hItem, fp );
|
||
|
||
//2-3.<2E><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ڽ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||
nChild = GetChildCount( hItem );
|
||
fwrite( &nChild, sizeof( int ), 1, fp );
|
||
|
||
//2-4.<2E><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ڽ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ť<><C5A5> push
|
||
HTREEITEM hChild = m_Tree.GetChildItem( hItem );
|
||
|
||
while( hChild != NULL )
|
||
{
|
||
ItemQueue.push( hChild );
|
||
hChild = m_Tree.GetNextItem( hChild, TVGN_NEXT );
|
||
}
|
||
}
|
||
}
|
||
|
||
void CPageTriggerContainer::RenderAllObjects()
|
||
{
|
||
CBGMController & BGMC = CBGMController::GetInstance();
|
||
CMainFrame *mf=(CMainFrame*)AfxGetApp()->m_pMainWnd;
|
||
CWorldCreatorView *av=(CWorldCreatorView *)mf->GetActiveView();
|
||
|
||
|
||
int nPolygon = BGMC.GetPolygonCount();
|
||
|
||
for( int i = 0; i < nPolygon; i++ )
|
||
{
|
||
int nVertex = BGMC.GetVertexCount( i );
|
||
|
||
for( int j = 0; j < nVertex; j++ )
|
||
{
|
||
float x, y, z;
|
||
|
||
BGMC.GetVertex( i, j, x, y, z );
|
||
|
||
mf->m_MeshContainerBar.m_MeshContainerSheet->m_PageObjectContainer.AddObject(vector3( x, y, z ),"Cube.R3S");
|
||
long objID=av->m_SceneManager->m_MapStorage.m_TotalObjectSceneCount-1;
|
||
BGMC.SelectPoint( i, j );
|
||
BGMC.SetObjID( objID );
|
||
|
||
CSectorScene * pSector=av->m_SceneManager->PickTerrain( x, y, z );
|
||
if( pSector )
|
||
pSector->GenerateObject();
|
||
}
|
||
}
|
||
}
|
||
|
||
void CPageTriggerContainer::OnBuildtrigger()
|
||
{
|
||
CBGMController & BGMC = CBGMController::GetInstance();
|
||
|
||
BGMC.Rebuild( GetEpsilon() );
|
||
}
|
||
|
||
void CPageTriggerContainer::OnBegindragTree1(NMHDR* pNMHDR, LRESULT* pResult)
|
||
{
|
||
NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
|
||
|
||
HTREEITEM CurrentSelected = m_Tree.GetSelectedItem();
|
||
|
||
SNodeData nodeData = m_Tree.GetItemData( CurrentSelected );
|
||
|
||
if( nodeData.type == TYPE_POINT )
|
||
{
|
||
CMainFrame *mf=(CMainFrame*)AfxGetApp()->m_pMainWnd;
|
||
CWorldCreatorView *av=(CWorldCreatorView *)mf->GetActiveView();
|
||
av->ChangeMouseInterface(90);
|
||
}
|
||
|
||
*pResult = 0;
|
||
}
|
||
|
||
|
||
void CPageTriggerContainer::DeleteNode( unsigned index )
|
||
{
|
||
HTREEITEM item = m_Tree.GetRootItem();
|
||
SNodeData node;
|
||
node.type = TYPE_POINT;
|
||
node.index1 = ( index & 0xfffc000 ) >> 14;
|
||
node.index2 = index & 0x00003fff;
|
||
|
||
HTREEITEM finded = SearchItem( item, node );
|
||
|
||
if( finded != NULL )
|
||
{
|
||
m_Tree.DeleteItem( finded );
|
||
}
|
||
}
|
||
|
||
HTREEITEM CPageTriggerContainer::SearchItem( HTREEITEM item, DWORD nodeData )
|
||
{
|
||
item = m_Tree.GetChildItem( item );
|
||
SNodeData node = nodeData;
|
||
|
||
while( item != NULL )
|
||
{
|
||
SNodeData tempNode = m_Tree.GetItemData( item );
|
||
if( tempNode == node )
|
||
return item;
|
||
|
||
HTREEITEM hItemFinded = SearchItem( item, nodeData );
|
||
if( hItemFinded != NULL )
|
||
return hItemFinded;
|
||
|
||
item = m_Tree.GetNextItem( item, TVGN_NEXT );
|
||
}
|
||
|
||
return NULL;
|
||
}
|
||
|
||
|
||
|