00001
00002
00003
00004 #include "stdafx.h"
00005 #include "MapEditor.h"
00006 #include "Common/Console.h"
00007 #include "Common/Directory.h"
00008 #include "BrushTerrainDialog.h"
00009
00010 #include "Bitmap/Tga.h"
00011
00012
00013 IMPLEMENT_DYNAMIC(CBrushTerrainDialog, CDialog)
00014 CBrushTerrainDialog::CBrushTerrainDialog(CWnd* pParent )
00015 : CDialog(CBrushTerrainDialog::IDD, pParent)
00016 {
00017 m_ImageSizeX = 64;
00018 m_ImageSizeY = 64;
00019 m_ImageSizeX2 = 16;
00020 m_ImageSizeY2 = 16;
00021
00022
00023 }
00024
00025 CBrushTerrainDialog::~CBrushTerrainDialog()
00026 {
00027
00028 }
00029
00030 void CBrushTerrainDialog::DoDataExchange(CDataExchange* pDX)
00031 {
00032 CDialog::DoDataExchange(pDX);
00033 DDX_Control(pDX, IDC_LIST_TERRAIN, m_ListTerrain);
00034 DDX_Control(pDX, IDC_TERRAIN_DIRECTORY, m_TerrainDirectory);
00035 DDX_Control(pDX, IDC_BUTTON_VIEWLIST, m_ButtonViewList);
00036 DDX_Control(pDX, IDC_BUTTON_VIEWLARGEICON, m_ButtonViewLargeIcon);
00037 DDX_Control(pDX, IDC_BUTTON_VIEWSMALLICON, m_ButtonViewSmallIcon);
00038 DDX_Control(pDX, IDC_BUTTON_VIEWREPORT, m_ButtonViewReport);
00039 DDX_Control(pDX, IDC_CHECK_TEXTURE, m_CheckTexture);
00040 DDX_Control(pDX, IDC_CHECK_COLOR, m_CheckColor);
00041 DDX_Control(pDX, IDC_BUTTON_COLOR1, m_ButtonColor1);
00042 DDX_Control(pDX, IDC_BUTTON_COLOR2, m_ButtonColor2);
00043 }
00044
00045
00046 BEGIN_MESSAGE_MAP(CBrushTerrainDialog, CDialog)
00047 ON_BN_CLICKED(IDC_BUTTON_RELOAD, OnBnClickedButtonReload)
00048 ON_BN_CLICKED(IDC_BUTTON_VIEWLIST, OnBnClickedButtonViewlist)
00049 ON_BN_CLICKED(IDC_BUTTON_VIEWLARGEICON, OnBnClickedButtonViewlargeicon)
00050 ON_BN_CLICKED(IDC_BUTTON_VIEWSMALLICON, OnBnClickedButtonViewsmallicon)
00051 ON_BN_CLICKED(IDC_BUTTON_VIEWREPORT, OnBnClickedButtonViewreport)
00052 ON_BN_CLICKED(IDC_CHECK_TEXTURE, OnBnClickedCheckTexture)
00053 ON_BN_CLICKED(IDC_CHECK_COLOR, OnBnClickedCheckColor)
00054 ON_BN_CLICKED(IDC_BUTTON_SWAPCOLOR, OnBnClickedButtonSwapcolor)
00055 END_MESSAGE_MAP()
00056
00057
00058
00059
00060 void CBrushTerrainDialog::OnOK()
00061 {
00062
00063
00064
00065 }
00066
00067 void CBrushTerrainDialog::OnCancel()
00068 {
00069
00070
00071
00072 }
00073
00074 BOOL CBrushTerrainDialog::OnInitDialog()
00075 {
00076 CDialog::OnInitDialog();
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093 m_ImageList.Create( m_ImageSizeX, m_ImageSizeY, ILC_COLOR32, 0, 1 );
00094 m_ImageList2.Create( m_ImageSizeX2, m_ImageSizeY2, ILC_COLOR32, 0, 1 );
00095 m_ListTerrain.SetImageList( &m_ImageList, LVSIL_NORMAL );
00096 m_ListTerrain.SetImageList( &m_ImageList2, LVSIL_SMALL );
00097
00098
00099 m_ButtonViewList.SetIcon( LoadIcon( theApp.m_hInstance, MAKEINTRESOURCE( IDI_VWLIST ) ) );
00100 m_ButtonViewSmallIcon.SetIcon( LoadIcon( theApp.m_hInstance, MAKEINTRESOURCE( IDI_VWSMLIC ) ) );
00101 m_ButtonViewLargeIcon.SetIcon( LoadIcon( theApp.m_hInstance, MAKEINTRESOURCE( IDI_VWLRGIC ) ) );
00102 m_ButtonViewReport.SetIcon( LoadIcon( theApp.m_hInstance, MAKEINTRESOURCE( IDI_VWDLTS ) ) );
00103
00104 m_CheckTexture.SetCheck( BST_CHECKED );
00105 m_CheckColor.SetCheck( BST_UNCHECKED );
00106
00107 m_ButtonColor1.SetColor( RGB( 255, 255, 255 ) );
00108 m_ButtonColor2.SetColor( RGB( 0, 0, 0 ) );
00109
00110 Reload();
00111
00112 return TRUE;
00113
00114 }
00115
00116 void CBrushTerrainDialog::Reload()
00117 {
00118 DWORD ThreadId;
00119
00120 CreateThread( NULL, 0, ThreadReloadProc, this, 0, &ThreadId );
00121
00122 }
00123
00124 void CBrushTerrainDialog::SearchTexture( KStr sDir, KStr sShaderName, CFileFind* pFileFind )
00125 {
00126 BOOL bFound = TRUE;
00127 while( bFound )
00128 {
00129 bFound = pFileFind->FindNextFile();
00130
00131 if( pFileFind->IsDots() )
00132 continue;
00133
00134 if( pFileFind->IsDirectory() )
00135 {
00136 CFileFind NewFileFind;
00137
00138 KStr sNewShaderName = sShaderName;
00139 sNewShaderName += pFileFind->GetFileName();
00140 sNewShaderName += "/";
00141
00142 KStr sSearchDir = sDir;
00143 sSearchDir += sNewShaderName;
00144 sSearchDir += "*";
00145
00146
00147 if( NewFileFind.FindFile( sSearchDir, 0 ) )
00148 SearchTexture( sDir, sNewShaderName, &NewFileFind );
00149 }
00150 else
00151 {
00152
00153 CString FileName = pFileFind->GetFileName();
00154 CString Ext( ".tga" );
00155
00156 FileName.MakeLower();
00157
00158 if( ( FileName.GetLength() > Ext.GetLength() ) && ( FileName.Right( Ext.GetLength() ) == Ext ) )
00159 {
00160
00161 CString ShaderFileName = sShaderName;
00162 ShaderFileName += FileName;
00163
00164 m_ListTerrain.InsertItem( m_ListTerrain.GetItemCount(), ShaderFileName );
00165 }
00166 }
00167 }
00168 }
00169
00170 DWORD WINAPI CBrushTerrainDialog::ThreadReloadProc( LPVOID lpParameter )
00171 {
00172 CBrushTerrainDialog* pThis = (CBrushTerrainDialog*)lpParameter;
00173
00174
00175 pThis->m_Mutex.Lock();
00176
00177 pThis->m_ListTerrain.DeleteAllItems();
00178
00179 for( s32 Path = 0; Path < g_Directory.GetnPath(); Path ++ )
00180 {
00181
00182
00183
00184 CFileFind FileFind;
00185
00186
00187 KStr sDir = g_Directory.GetPath( KStr( "Textures" ), Path );
00188
00189 KStr sShaderName = "Maps/";
00190
00191 KStr sSearchDir = sDir;
00192 sSearchDir += sShaderName;
00193 sSearchDir += "*";
00194
00195 if( FileFind.FindFile( sSearchDir, 0 ) )
00196 pThis->SearchTexture( sDir, sShaderName, &FileFind );
00197 }
00198
00199
00200
00201
00202 int j;
00203 int max;
00204
00205 max = pThis->m_ImageList.GetImageCount();
00206 for( j = 0; j < max; j++ )
00207 {
00208 pThis->m_ImageList.Remove( 0 );
00209 }
00210
00211 max = pThis->m_ImageList2.GetImageCount();
00212 for( j = 0; j < max; j++ )
00213 {
00214 pThis->m_ImageList2.Remove( 0 );
00215 }
00216
00217 for( int i = 0; i < pThis->m_ListTerrain.GetItemCount(); i ++ )
00218 {
00219 KTga Tga;
00220 char pFileName[1024];
00221
00222 CBitmap Bitmap;
00223 CBitmap MiniBitmap;
00224 CBitmap MiniBitmap2;
00225 CDC BitmapDC;
00226 CDC MiniBitmapDC;
00227
00228 pThis->m_ListTerrain.GetItemText( i, 0, pFileName, sizeof( pFileName ) );
00229 LVITEM Item;
00230 Item.iItem = i;
00231 Item.iSubItem = 0;
00232 Item.mask = LVIF_IMAGE;
00233 Item.iImage = i;
00234 pThis->m_ListTerrain.SetItem( &Item );
00235
00236
00237 for( s32 Path = 0; Path < g_Directory.GetnPath(); Path ++ )
00238 {
00239 KStr sDir = g_Directory.GetPath( KStr( "Textures" ), Path );
00240 sDir += pFileName;
00241 if( Tga.LoadTGA( sDir ) )
00242 break;
00243 }
00244
00245
00246
00247
00248 CDC* pDC = pThis->GetDC();
00249
00250 BitmapDC.CreateCompatibleDC( pDC );
00251 Bitmap.CreateCompatibleBitmap( pDC, Tga.GetWidth(), Tga.GetHeight() );
00252 BITMAPINFO bi;
00253 ZeroMemory( &bi.bmiHeader, sizeof( bi.bmiHeader ) );
00254 bi.bmiHeader.biSize = sizeof( bi.bmiHeader );
00255 bi.bmiHeader.biWidth = Tga.GetWidth();
00256 bi.bmiHeader.biHeight = -((LONG)Tga.GetHeight());
00257 bi.bmiHeader.biPlanes = 1;
00258 bi.bmiHeader.biCompression = BI_RGB;
00259 bi.bmiHeader.biBitCount = 32;
00260 ::SetDIBits( BitmapDC.m_hDC, (HBITMAP)Bitmap.m_hObject, 0, Tga.GetHeight(), Tga.GetBitmap(),&bi , DIB_RGB_COLORS );
00261
00262 BitmapDC.SelectObject( Bitmap );
00263
00264
00265
00266 MiniBitmapDC.CreateCompatibleDC( pDC );
00267 MiniBitmap.CreateCompatibleBitmap( pDC, pThis->m_ImageSizeX, pThis->m_ImageSizeY );
00268 MiniBitmapDC.SelectObject( &MiniBitmap );
00269 MiniBitmapDC.SetStretchBltMode( HALFTONE );
00270 MiniBitmapDC.StretchBlt( 0, 0, pThis->m_ImageSizeX, pThis->m_ImageSizeY, &BitmapDC, 0, 0, Tga.GetWidth(), Tga.GetHeight(), SRCCOPY );
00271 MiniBitmapDC.DeleteDC();
00272 pThis->m_ImageList.Add( &MiniBitmap, RGB( 0, 0, 0 ) );
00273
00274
00275 MiniBitmapDC.CreateCompatibleDC( pDC );
00276 MiniBitmap2.CreateCompatibleBitmap( pDC, pThis->m_ImageSizeX2, pThis->m_ImageSizeY2 );
00277 MiniBitmapDC.SelectObject( &MiniBitmap2 );
00278 MiniBitmapDC.SetStretchBltMode( HALFTONE );
00279 MiniBitmapDC.StretchBlt( 0, 0, pThis->m_ImageSizeX2, pThis->m_ImageSizeY2, &BitmapDC, 0, 0, Tga.GetWidth(), Tga.GetHeight(), SRCCOPY );
00280 MiniBitmapDC.DeleteDC();
00281 pThis->m_ImageList2.Add( &MiniBitmap2, RGB( 0, 0, 0 ) );
00282
00283 pThis->ReleaseDC( pDC );
00284 }
00285
00286 pThis->m_ListTerrain.RedrawItems( 0, pThis->m_ListTerrain.GetItemCount() - 1);
00287
00288
00289 pThis->m_Mutex.Unlock();
00290
00291 return 0;
00292 }
00293
00294 void CBrushTerrainDialog::OnBnClickedButtonReload()
00295 {
00296 Reload();
00297 }
00298
00299 void CBrushTerrainDialog::OnBnClickedButtonViewlist()
00300 {
00301 m_ListTerrain.ModifyStyle( LVS_TYPEMASK, LVS_LIST );
00302 }
00303
00304 void CBrushTerrainDialog::OnBnClickedButtonViewlargeicon()
00305 {
00306 m_ListTerrain.ModifyStyle( LVS_TYPEMASK, LVS_ICON );
00307 }
00308
00309 void CBrushTerrainDialog::OnBnClickedButtonViewsmallicon()
00310 {
00311 m_ListTerrain.ModifyStyle( LVS_TYPEMASK, LVS_SMALLICON );
00312 }
00313
00314 void CBrushTerrainDialog::OnBnClickedButtonViewreport()
00315 {
00316 m_ListTerrain.ModifyStyle( LVS_TYPEMASK, LVS_REPORT );
00317 }
00318
00319 char* CBrushTerrainDialog::GetpTextureName()
00320 {
00321 int nItem = m_ListTerrain.GetNextItem( -1, LVNI_SELECTED);
00322
00323 if( nItem == -1 )
00324 return NULL;
00325
00326 m_ListTerrain.GetItemText( nItem, 0, m_pCurrentTextureName, sizeof( m_pCurrentTextureName ) );
00327
00328
00329 for( int i = (int)strlen( m_pCurrentTextureName ) - 1; i > 0; i -- )
00330 {
00331 if( m_pCurrentTextureName[i] == '.' )
00332 {
00333 m_pCurrentTextureName[i] = '\0';
00334 break;
00335 }
00336 }
00337
00338 return m_pCurrentTextureName;
00339 }
00340
00341 void CBrushTerrainDialog::OnBnClickedCheckTexture()
00342 {
00343 m_CheckTexture.SetCheck( BST_CHECKED );
00344 m_CheckColor.SetCheck( BST_UNCHECKED );
00345 }
00346
00347 void CBrushTerrainDialog::OnBnClickedCheckColor()
00348 {
00349 m_CheckTexture.SetCheck( BST_UNCHECKED );
00350 m_CheckColor.SetCheck( BST_CHECKED );
00351 }
00352
00353 void CBrushTerrainDialog::OnBnClickedButtonSwapcolor()
00354 {
00355 COLORREF Color;
00356
00357 Color = m_ButtonColor1.GetColor();
00358 m_ButtonColor1.SetColor( m_ButtonColor2.GetColor() );
00359 m_ButtonColor2.SetColor( Color );
00360 }