Files
Client/GameTools/WORLDCREATOR/PageObjectContainer.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

493 lines
15 KiB
C++

// PageObjectContainer.cpp : implementation file
//
#include "stdafx.h"
#include "worldcreator.h"
#include "PageObjectContainer.h"
#include "DlgObjectLoad.h"
#include "MainFrm.h"
#include "WorldCreatorView.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CPageObjectContainer property page
IMPLEMENT_DYNCREATE(CPageObjectContainer, CPropertyPage)
CPageObjectContainer::CPageObjectContainer() : CPropertyPage(CPageObjectContainer::IDD)
{
//{{AFX_DATA_INIT(CPageObjectContainer)
m_bBspInput = FALSE;
m_bAddObj = FALSE;
//}}AFX_DATA_INIT
}
CPageObjectContainer::~CPageObjectContainer()
{
/*
for(int i=0;i<m_ObjectListNode.num;i++)
{
delete m_ObjectListNode[i];
}
*/
}
void CPageObjectContainer::DoDataExchange(CDataExchange* pDX)
{
CPropertyPage::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CPageObjectContainer)
DDX_Control(pDX, IDC_LIST_OBECTSCENE, m_ObjectList);
DDX_Check(pDX, IDC_BSPINPUT, m_bBspInput);
DDX_Check(pDX, IDC_CHECKADD, m_bAddObj);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CPageObjectContainer, CPropertyPage)
//{{AFX_MSG_MAP(CPageObjectContainer)
ON_NOTIFY(NM_RCLICK, IDC_LIST_OBECTSCENE, OnRclickListObectscene)
ON_COMMAND(MENU_OBJECT_LOAD, OnObjectLoad)
ON_NOTIFY(LVN_BEGINDRAG, IDC_LIST_OBECTSCENE, OnBegindragListObectscene)
ON_NOTIFY(NM_DBLCLK, IDC_LIST_OBECTSCENE, OnDblclkListObectscene)
ON_COMMAND(MENU_OBJECTDELETE, OnObjectdelete)
ON_BN_CLICKED(IDC_BSPINPUT, OnBspinput)
ON_BN_CLICKED(IDC_CHECKADD, OnCheckadd)
ON_NOTIFY(HDN_ITEMCLICK, IDC_LIST_OBECTSCENE, OnItemclickListObectscene)
ON_NOTIFY(NM_SETFOCUS, IDC_LIST_OBECTSCENE, OnSetfocusListObectscene)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CPageObjectContainer message handlers
void CPageObjectContainer::SelectObject()
{
m_SelectCur=m_ObjectList.GetNextItem(-1,LVNI_SELECTED);
if(m_SelectCur<0)
return;
m_strObjectName=m_ObjectListNode[m_SelectCur].m_strObjectName;
m_strObjectFileName=m_ObjectListNode[m_SelectCur].m_strObjectFilename;
m_isAlpha=m_ObjectListNode[m_SelectCur].m_IsAlpha;
m_isLight=m_ObjectListNode[m_SelectCur].m_IsLight;
}
//menu
void CPageObjectContainer::OnRclickListObectscene(NMHDR* pNMHDR, LRESULT* pResult)
{
// TODO: Add your control notification handler code here
CPoint point;
GetCursorPos(&point);
CMenu menu;
menu.LoadMenu(IDR_MENU_OBJECT);
menu.GetSubMenu(0)->TrackPopupMenu(TPM_LEFTALIGN,point.x,point.y,this);
*pResult = 0;
}
BOOL CPageObjectContainer::OnInitDialog()
{
CPropertyPage::OnInitDialog();
DWORD dwStyle;
dwStyle = m_ObjectList.SendMessage(LVM_GETEXTENDEDLISTVIEWSTYLE, 0 ,0);
dwStyle |= LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES ;
m_ObjectList.SendMessage( LVM_SETEXTENDEDLISTVIEWSTYLE, 0,dwStyle );
m_ObjectList.InsertColumn(0,"이름",LVCFMT_LEFT,80);
m_ObjectList.InsertColumn(1,"오브젝트",LVCFMT_LEFT,80);
m_ObjectList.InsertColumn(2,"알파",LVCFMT_LEFT,50);
m_ObjectList.InsertColumn(3,"라이트",LVCFMT_LEFT,50);
// TODO: Add extra initialization here
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void CPageObjectContainer::OnObjectLoad()
{
// TODO: Add your command handler code here
CDlgObjectLoad dlgObjectLoad;
if(dlgObjectLoad.DoModal()!=IDOK)
return;
CString strText;
ObjectListNode AddNode;
strcpy(AddNode.m_strObjectName,dlgObjectLoad.m_strObjectName.LockBuffer());
strcpy(AddNode.m_strObjectFilename,dlgObjectLoad.m_strObjectFilename.LockBuffer());
if(dlgObjectLoad.m_isAlpha)
AddNode.m_IsAlpha=true;
else
AddNode.m_IsAlpha=false;
if(dlgObjectLoad.m_isLight)
AddNode.m_IsLight=true;
else
AddNode.m_IsLight=false;
int nInsertItem=m_ObjectList.GetItemCount();
m_ObjectList.InsertItem(nInsertItem,dlgObjectLoad.m_strObjectName);
m_ObjectList.SetItemText(nInsertItem,1,dlgObjectLoad.m_strObjectFilename);
if(dlgObjectLoad.m_isAlpha)
m_ObjectList.SetItemText(nInsertItem,2,"Yes");
else
m_ObjectList.SetItemText(nInsertItem,2,"No");
if(dlgObjectLoad.m_isLight)
m_ObjectList.SetItemText(nInsertItem,3,"No");
else
m_ObjectList.SetItemText(nInsertItem,3,"No");
m_ObjectListNode.Add(AddNode);
}
void CPageObjectContainer::OnBegindragListObectscene(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
// TODO: Add your control notification handler code here
CMainFrame *mf=(CMainFrame*)AfxGetApp()->m_pMainWnd;
CWorldCreatorView *av=(CWorldCreatorView *)mf->GetActiveView();
SelectObject();
av->ChangeMouseInterface(3);
*pResult = 0;
}
void CPageObjectContainer::AddObject(float fXp, float fYp, float fZp)
{
if(CSceneManager::m_PickHouseScene)
{
if(CSceneManager::m_PickHouseScene->m_HouseObject->m_pBspObject)
{
if(CSceneManager::m_PickHouseScene->m_HouseObject->m_ObjectList.num%4==0)
{
if(AfxMessageBox("BSP의 입구를 넣겠습니까?",MB_YESNO,0)!=IDYES)
return;
CSceneManager::m_pBspScene=CSceneManager::m_PickHouseScene;
}
else if(CSceneManager::m_PickHouseScene->m_HouseObject->m_ObjectList.num%4==1)
{
if(AfxMessageBox("BSP의 스타트를 넣겠습니까?",MB_YESNO,0)!=IDYES)
return;
}
else if(CSceneManager::m_PickHouseScene->m_HouseObject->m_ObjectList.num%4==2)
{
if(AfxMessageBox("BSP의 출구를 넣겠습니까?",MB_YESNO,0)!=IDYES)
return;
CSceneManager::m_pBspScene=NULL;
}
else if(CSceneManager::m_PickHouseScene->m_HouseObject->m_ObjectList.num%4==3)
{
if(AfxMessageBox("필드의 출구를 넣겠습니까?",MB_YESNO,0)!=IDYES)
return;
}
}
else
{
if(AfxMessageBox("집안에 오브텍트를 넣겠습니까?",MB_YESNO,0)!=IDYES)
return;
}
if(m_SelectCur>=0)
{
matrix matInvTM,matTM;
matTM.Translation(vector3(fXp,fYp,fZp));
matInvTM.Inverse(CSceneManager::m_PickHouseScene->m_AccumulateTM);
CObjectScene *AddObjectScene=new CObjectScene();
AddObjectScene->m_TM=matTM*matInvTM;
AddObjectScene->m_pObject=CSceneManager::m_ObjectContainer.GetObject(m_strObjectFileName.LockBuffer(),m_isAlpha,m_isLight);
AddObjectScene->m_vecMaxBox=AddObjectScene->m_pObject->m_MaxBox;
AddObjectScene->m_vecMinBox=AddObjectScene->m_pObject->m_MinBox;
AddObjectScene->Init();
strcpy(AddObjectScene->m_strObjectName,m_strObjectFileName.LockBuffer());
AddObjectScene->m_isAlpha=true;
AddObjectScene->m_isLight=true;
CMainFrame *mf=(CMainFrame*)AfxGetApp()->m_pMainWnd;
CWorldCreatorView *av=(CWorldCreatorView *)mf->GetActiveView();
AddObjectScene->m_ObjectID=av->m_SceneManager->m_MapStorage.m_TotalInHouseLightSceneCount;
//AddObjectScene->m_ObjectID=CMapStorage::m_TotalInHouseObjectSceneCount;
CSceneManager::m_PickHouseScene->m_HouseObject->m_ObjectList.Add(AddObjectScene);
av->m_SceneManager->m_MapStorage.AddInHouseObject(CSceneManager::m_PickHouseScene->m_strOutName,
CSceneManager::m_PickHouseScene->m_strMedName,
CSceneManager::m_PickHouseScene->m_strInName,
CSceneManager::m_PickHouseScene->m_strBSPName,
m_strObjectFileName.LockBuffer(),AddObjectScene->m_TM,
m_isAlpha,m_isLight);
/*
CMapStorage::AddInHouseObject(CSceneManager::m_PickHouseScene->m_strOutName,
CSceneManager::m_PickHouseScene->m_strMedName,
CSceneManager::m_PickHouseScene->m_strInName,
m_strObjectFileName.LockBuffer(),AddObjectScene->m_TM,
m_isAlpha,m_isLight);
*/
CSceneManager::m_PickHouseScene->m_HouseObject->m_pInHouseMap=
av->m_SceneManager->m_MapStorage.CMapStorage::FindInHouseMap(
CSceneManager::m_PickHouseScene->m_strOutName,
CSceneManager::m_PickHouseScene->m_strMedName,
CSceneManager::m_PickHouseScene->m_strInName,
CSceneManager::m_PickHouseScene->m_strBSPName);
CSceneManager::m_PickHouseScene->UpdateBspPosition();
/*
*/
/*
CMapStorage::FindInHouseMap(
CSceneManager::m_PickHouseScene->m_strOutName,
CSceneManager::m_PickHouseScene->m_strMedName,
CSceneManager::m_PickHouseScene->m_strInName);
*/
CSceneManager::m_PickHouseScene->m_SelfLoadInObject=true;
return;
}
}
if(m_SelectCur>=0)
{
matrix matTM;
matTM.Translation(vector3(fXp,fYp,fZp));
if(CSceneManager::m_RBspSceneManager.m_pCurrentBspScene == NULL) // RBSP 추가
{
CMainFrame *mf=(CMainFrame*)AfxGetApp()->m_pMainWnd;
CWorldCreatorView *av=(CWorldCreatorView *)mf->GetActiveView();
av->m_SceneManager->m_MapStorage.AddMeshMap(fXp,fYp,fZp,m_strObjectFileName.LockBuffer(),matTM,m_isAlpha,m_isLight);
//CMapStorage::AddMeshMap(fXp,fYp,fZp,m_strObjectFileName.LockBuffer(),matTM,m_isAlpha,m_isLight);
}
else // RBSP추가
{
RBspScene *pScene = CSceneManager::m_RBspSceneManager.m_pCurrentBspScene;
int iCurrentLeaf = pScene->FindWorldLeaf(D3DXVECTOR3(fXp,fYp,fZp));
pScene->m_pLeafExs[iCurrentLeaf].InputR3SObject(fXp,fYp,fZp,m_strObjectFileName.LockBuffer(),matTM,m_isAlpha,m_isLight);
pScene->GenerateR3SObject();
}
}
}
void CPageObjectContainer::Save(FILE *fp)
{
fwrite(&m_ObjectListNode.num,sizeof(int),1,fp);
for(int cObject=0;cObject<m_ObjectListNode.num;cObject++)
{
fwrite(m_ObjectListNode[cObject].m_strObjectName,sizeof(char)*MAX_NAMEBUFFER,1,fp);
fwrite(m_ObjectListNode[cObject].m_strObjectFilename,sizeof(char)*MAX_NAMEBUFFER,1,fp);
fwrite(&m_ObjectListNode[cObject].m_IsAlpha,sizeof(bool),1,fp);
fwrite(&m_ObjectListNode[cObject].m_IsLight,sizeof(bool),1,fp);
}
}
void CPageObjectContainer::Load(FILE *fp,int iType)
{
if(!iType)
DeleteListData();
int cSavedObject=0;
fread(&cSavedObject,sizeof(int),1,fp);
for(int cObject=0;cObject<cSavedObject;cObject++)
{
ObjectListNode AddNode;
fread(AddNode.m_strObjectName,sizeof(char)*MAX_NAMEBUFFER,1,fp);
fread(AddNode.m_strObjectFilename,sizeof(char)*MAX_NAMEBUFFER,1,fp);
fread(&AddNode.m_IsAlpha,sizeof(bool),1,fp);
fread(&AddNode.m_IsLight,sizeof(bool),1,fp);
m_ObjectListNode.Add(AddNode);
}
UpdateList();
}
void CPageObjectContainer::DeleteListData()
{
m_ObjectListNode.num=0;
m_ObjectList.DeleteAllItems();
}
void CPageObjectContainer::UpdateList()
{
m_ObjectList.DeleteAllItems();
for(int i=0;i<m_ObjectListNode.num;i++)
{
m_ObjectList.InsertItem(i,m_ObjectListNode[i].m_strObjectName);
m_ObjectList.SetItemText(i,1,m_ObjectListNode[i].m_strObjectFilename);
if(m_ObjectListNode[i].m_IsAlpha)
m_ObjectList.SetItemText(i,2,"Yes");
else
m_ObjectList.SetItemText(i,2,"No");
if(m_ObjectListNode[i].m_IsLight)
m_ObjectList.SetItemText(i,3,"Yes");
else
m_ObjectList.SetItemText(i,3,"No");
}
}
void CPageObjectContainer::OnDblclkListObectscene(NMHDR* pNMHDR, LRESULT* pResult)
{
// TODO: Add your control notification handler code here
int SelectCur=m_ObjectList.GetNextItem(-1,LVNI_SELECTED);
if(SelectCur==-1)
return;
CDlgObjectLoad dlgObjectLoad;
dlgObjectLoad.m_strObjectName=m_ObjectListNode[SelectCur].m_strObjectName;
dlgObjectLoad.m_strObjectFilename=m_ObjectListNode[SelectCur].m_strObjectFilename;
dlgObjectLoad.m_isAlpha=m_ObjectListNode[SelectCur].m_IsAlpha;
dlgObjectLoad.m_isLight=m_ObjectListNode[SelectCur].m_IsLight;
if(dlgObjectLoad.DoModal()!=IDOK)
return;
CString strText;
strcpy(m_ObjectListNode[SelectCur].m_strObjectName,dlgObjectLoad.m_strObjectName.LockBuffer());
strcpy(m_ObjectListNode[SelectCur].m_strObjectFilename,dlgObjectLoad.m_strObjectFilename.LockBuffer());
if(dlgObjectLoad.m_isAlpha)
m_ObjectListNode[SelectCur].m_IsAlpha=true;
else
m_ObjectListNode[SelectCur].m_IsAlpha=false;
if(dlgObjectLoad.m_isLight)
m_ObjectListNode[SelectCur].m_IsLight=true;
else
m_ObjectListNode[SelectCur].m_IsLight=false;
m_ObjectList.SetItemText(SelectCur,0,dlgObjectLoad.m_strObjectName);
m_ObjectList.SetItemText(SelectCur,1,dlgObjectLoad.m_strObjectFilename);
if(dlgObjectLoad.m_isAlpha)
m_ObjectList.SetItemText(SelectCur,2,"Yes");
else
m_ObjectList.SetItemText(SelectCur,2,"No");
if(dlgObjectLoad.m_isLight)
m_ObjectList.SetItemText(SelectCur,3,"Yes");
else
m_ObjectList.SetItemText(SelectCur,3,"No");
*pResult = 0;
}
void CPageObjectContainer::OnObjectdelete()
{
// TODO: Add your command handler code here
SelectObject();
m_ObjectListNode.DelIndex(m_SelectCur);
UpdateList();
}
void CPageObjectContainer::AddObject(vector3 vecPos, char *strObjectName)
{
matrix matTM;
matTM.Translation(vecPos);
CMainFrame *mf=(CMainFrame*)AfxGetApp()->m_pMainWnd;
CWorldCreatorView *av=(CWorldCreatorView *)mf->GetActiveView();
av->m_SceneManager->m_MapStorage.AddMeshMap(vecPos.x,vecPos.y,vecPos.z,strObjectName,matTM,false,false);
}
//RBSP 추가
void CPageObjectContainer::OnBspinput()
{
m_bBspInput = (m_bBspInput == TRUE) ? FALSE : TRUE;
UpdateData(FALSE);
CMainFrame *mf=(CMainFrame*)AfxGetApp()->m_pMainWnd;
CWorldCreatorView *av=(CWorldCreatorView *)mf->GetActiveView();
if((CSceneManager::m_RBspSceneManager.m_pCurrentBspScene != NULL) && (m_bBspInput == TRUE)) // RBSP 추가
{
SelectObject();
av->ChangeMouseInterface(3);
}
else {
av->ChangeMouseInterface(-1);
}
// TODO: Add your control notification handler code here
}
void CPageObjectContainer::MoveTarget(int i)
{
int iTotalItem = m_ObjectList.GetItemCount();
m_SelectCur=m_ObjectList.GetNextItem(-1,LVNI_SELECTED);
UINT flag = LVIS_SELECTED | LVIS_FOCUSED; //선택, 포커스
if(m_SelectCur<0)
{
m_ObjectList.SetItemState(0,flag,flag);
m_SelectCur = 0;
}
if( i == 0 ) //Cursor Down
{
if(m_SelectCur + 1 < iTotalItem)
{
m_ObjectList.SetItemState(m_SelectCur + 1,flag,flag);
m_SelectCur = m_SelectCur + 1;
}
else
{
m_ObjectList.SetItemState(0,flag,flag);
m_SelectCur = 0;
}
}
else //Cursor Up
{
if(m_SelectCur - 1 >= 0)
{
m_ObjectList.SetItemState(m_SelectCur - 1,flag,flag);
m_SelectCur = m_SelectCur - 1;
}
else
{
m_ObjectList.SetItemState(iTotalItem - 1,flag,flag);
m_SelectCur = iTotalItem - 1;
}
}
m_ObjectList.RedrawWindow();
m_ObjectList.RedrawItems(0,iTotalItem -1);
SelectObject();
}
/*
void CPageObjectContainer::OnBUTTONClick()
{
}
*/
void CPageObjectContainer::OnCheckadd()
{
// TODO: Add your control notification handler code here
m_bAddObj = (m_bAddObj == TRUE) ? FALSE : TRUE;
UpdateData(FALSE);
CMainFrame *mf=(CMainFrame*)AfxGetApp()->m_pMainWnd;
CWorldCreatorView *av=(CWorldCreatorView *)mf->GetActiveView();
if((m_bAddObj == TRUE)) // RBSP 추가
{
SelectObject();
av->ChangeMouseInterface(3);
}
else {
av->ChangeMouseInterface(-1);
}
}
void CPageObjectContainer::OnItemclickListObectscene(NMHDR* pNMHDR, LRESULT* pResult)
{
HD_NOTIFY *phdn = (HD_NOTIFY *) pNMHDR;
// TODO: Add your control notification handler code here
SelectObject();
*pResult = 0;
}
void CPageObjectContainer::OnSetfocusListObectscene(NMHDR* pNMHDR, LRESULT* pResult)
{
// TODO: Add your control notification handler code here
SelectObject();
*pResult = 0;
}