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++
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.
// 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,"<EFBFBD≯<EFBFBD>",LVCFMT_LEFT,80);
m_ObjectList.InsertColumn(1,"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ",LVCFMT_LEFT,80);
m_ObjectList.InsertColumn(2,"<EFBFBD><EFBFBD><EFBFBD><EFBFBD>",LVCFMT_LEFT,50);
m_ObjectList.InsertColumn(3,"<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ",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<EFBFBD><EFBFBD> <20>Ա<EFBFBD><D4B1><EFBFBD> <20>ְڽ<D6B0><DABD>ϱ<EFBFBD>?",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<EFBFBD><EFBFBD> <20><>ŸƮ<C5B8><C6AE> <20>ְڽ<D6B0><DABD>ϱ<EFBFBD>?",MB_YESNO,0)!=IDYES)
return;
}
else if(CSceneManager::m_PickHouseScene->m_HouseObject->m_ObjectList.num%4==2)
{
if(AfxMessageBox("BSP<EFBFBD><EFBFBD> <20><EFBFBD><E2B1B8> <20>ְڽ<D6B0><DABD>ϱ<EFBFBD>?",MB_YESNO,0)!=IDYES)
return;
CSceneManager::m_pBspScene=NULL;
}
else if(CSceneManager::m_PickHouseScene->m_HouseObject->m_ObjectList.num%4==3)
{
if(AfxMessageBox("<EFBFBD>ʵ<EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD><E2B1B8> <20>ְڽ<D6B0><DABD>ϱ<EFBFBD>?",MB_YESNO,0)!=IDYES)
return;
}
}
else
{
if(AfxMessageBox("<EFBFBD><EFBFBD><EFBFBD>ȿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20>ְڽ<D6B0><DABD>ϱ<EFBFBD>?",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 <20>߰<EFBFBD>
{
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<53>߰<EFBFBD>
{
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 <20>߰<EFBFBD>
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 <20>߰<EFBFBD>
{
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; //<2F><><EFBFBD><EFBFBD>, <20><>Ŀ<EFBFBD><C4BF>
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 <20>߰<EFBFBD>
{
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;
}