Files
Client/GameTools/WORLDCREATOR/PageTriggerContainer.cpp
LGram16 dd97ddec92 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>
2025-11-29 20:17:20 +09:00

808 lines
18 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// 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;
}