Restructure repository to include all source folders
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>
This commit is contained in:
807
GameTools/WORLDCREATOR/PageTriggerContainer.cpp
Normal file
807
GameTools/WORLDCREATOR/PageTriggerContainer.cpp
Normal file
@@ -0,0 +1,807 @@
|
||||
// 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;
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user