// DisperseDlg.cpp : implementation file // #include "stdafx.h" #include "mw4gameed2.h" #include "DisperseDlg.h" #include "ObjectManager.h" #include "UndoManager.h" #include "DisperProg.h" #include "ObjCreateInfo.h" #include #include #include ///////////////////////////////////////////////////////////////////////////// // CDisperseDlg dialog CDisperseDlg::CDisperseDlg(ObjectManager *oman,CWnd* pParent /*=NULL*/) : CDialog(CDisperseDlg::IDD, pParent) { ObjMan=oman; //{{AFX_DATA_INIT(CDisperseDlg) m_BmpPath = _T(""); //}}AFX_DATA_INIT } void CDisperseDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CDisperseDlg) DDX_Control(pDX, IDC_RESOURCELIST, m_RList); DDX_Control(pDX, IDC_TYPETAB, m_TTab); DDX_Control(pDX, IDC_OBJLIST, m_ObjList); DDX_Text(pDX, IDC_BMPPATH, m_BmpPath); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CDisperseDlg, CDialog) //{{AFX_MSG_MAP(CDisperseDlg) ON_BN_CLICKED(IDC_ADDOBJ, OnAddobj) ON_BN_CLICKED(IDC_BROWSE, OnBrowse) ON_BN_CLICKED(IDC_DELOBJ, OnDelobj) ON_WM_CLOSE() ON_NOTIFY(TCN_SELCHANGE, IDC_TYPETAB, OnSelchangeTypetab) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CDisperseDlg message handlers void CDisperseDlg::OnAddobj() { // TODO: Add your control notification handler code here int scount=m_RList.GetSelCount(); if(scount<=0) return; int *selitms=new int[scount]; m_RList.GetSelItems(scount,selitms); int i; for(i=0;iPath); m_ObjList.SetItemDataPtr(itm,inf); } delete selitms; } void CDisperseDlg::OnBrowse() { UpdateData(TRUE); CFileDialog fdlg(TRUE,NULL,NULL,OFN_NOCHANGEDIR,"Bitmap Images (*.tif,*.gif,*.tga)|*.tif;*.gif;*.tga||",this); if(fdlg.DoModal()==IDOK) { m_BmpPath=fdlg.GetPathName(); UpdateData(FALSE); } } void CDisperseDlg::OnOK() { int i,objlcount=m_ObjList.GetCount(); // TODO: Add extra validation here if(m_BmpPath=="" || !gos_DoesFileExist(m_BmpPath)) { MessageBox("Cannot Load Bmp File","Dispersial Error",MB_OK); return; } if(objlcount<=0) { MessageBox("No Objects to Disperse","Dispersial Error",MB_OK); return; } Image img; img.Load((char *)(LPCSTR)m_BmpPath); img.Rotate180(); if(img.GetBpp()>8) img.ReduceTo8Bit(RMD_MAX); BYTE *dat=img.Lock(); int x,y; DWORD show_flag=0; float gridxsize,gridzsize; ObjCreateInfo **PList; PList=new ObjCreateInfo *[objlcount]; for(i=0;iGetMapSize(); gridxsize=MapSize.x/img.GetWidth(); gridzsize=MapSize.z/img.GetHeight(); ObjMan->ClearSelection(); AddCommand *com=NULL; AddCommand *lcom=NULL; int objtot=0; for(y=0;yAddAt(PList[objidx],&lcom,&show_flag,false,pos,rot); if(gobj!=NULL) { if(com==NULL && lcom) com=lcom; lcom=(AddCommand *)lcom->GetLastLink(); gobj->Select(); while(gobj->IsMultiTile()) { dlg.Misplace(); pos.x=(x*gridxsize+Stuff::Random::GetFraction()*gridxsize)-MapSize.x*0.5f; pos.z=(y*gridzsize+Stuff::Random::GetFraction()*gridzsize)-MapSize.z*0.5f; pos.y=0.0f; rot.yaw=Stuff::Random::GetFraction()*Two_Pi; rot.pitch=0.0f; rot.roll=0.0f; mat.BuildRotation(rot); mat.BuildTranslation(pos); gobj->SetMat(mat); } pcount++; if(pcount>=10) {dlg.Place(pcount); pcount=0;} } } } img.UnLock(); if(com) ObjMan->SaveUndoCommand(com); CDialog::OnOK(); delete PList; } void CDisperseDlg::OnDelobj() { int sel=m_ObjList.GetCurSel(); if(sel>=0) { delete (ObjCreateInfo *)m_ObjList.GetItemDataPtr(sel); m_ObjList.DeleteString(sel); } } void CDisperseDlg::OnClose() { // TODO: Add your message handler code here and/or call default int i; for(i=0;i=0) for(i=sp;iCreateType=ObjCreateInfo::OT_GAMEOBJ; inf->Path=res_name; m_RList.SetItemData(item,(unsigned long)inf); } if( sp!=-1 && tabsel==MiscList && depth==2 && base_name.CompareNoCase("path") && base_name.CompareNoCase("objective") ) { item=m_RList.AddString(base_name); ObjCreateInfo *inf=new ObjCreateInfo; inf->Path=res_name; if(!base_name.CompareNoCase("dropzone")) { inf->CreateType=ObjCreateInfo::OT_DROPZONE; } else if(!base_name.CompareNoCase("cameraship")) { inf->CreateType=ObjCreateInfo::OT_CAMERA; } else if(!base_name.CompareNoCase("navpoint")) { inf->CreateType=ObjCreateInfo::OT_NVGAMEOBJ; } else if(!base_name.CompareNoCase("objective")) { } else if(!base_name.CompareNoCase("fxgenerator")) { inf->CreateType=ObjCreateInfo::OT_FX; } m_RList.SetItemData(item,(unsigned long)inf); } } } } if(tabsel==MiscList) { ObjCreateInfo *inf; item=m_RList.AddString("Clipboard Contents"); inf=new ObjCreateInfo; inf->CreateType=ObjCreateInfo::OT_CLIPBOARD; inf->Path="Cilpboard Contents"; m_RList.SetItemData(item,(unsigned long)inf); } m_RList.SetCurSel(0); } void CDisperseDlg::OnSelchangeTypetab(NMHDR* pNMHDR, LRESULT* pResult) { GetGameData(); *pResult = 0; }