Files
FC1/Editor/ThumbnailGenerator.cpp
romkazvo 34d6c5d489 123
2023-08-07 19:29:24 +08:00

179 lines
4.9 KiB
C++

////////////////////////////////////////////////////////////////////////////
//
// Crytek Engine Source File.
// Copyright (C), Crytek Studios, 2001.
// -------------------------------------------------------------------------
// File name: thumbnailgenerator.cpp
// Version: v1.00
// Created: 18/3/2002 by Timur.
// Compilers: Visual C++ 7.0
// Description:
// -------------------------------------------------------------------------
// History:
//
////////////////////////////////////////////////////////////////////////////
#include "StdAfx.h"
#include "thumbnailgenerator.h"
#include <io.h>
#include <I3DEngine.h>
CThumbnailGenerator::CThumbnailGenerator(void)
{
}
CThumbnailGenerator::~CThumbnailGenerator(void)
{
}
// Get directory contents.
static bool scan_directory( const CString &root,const CString &path,const CString &file,std::vector<CString> &files, bool recursive )
{
struct __finddata64_t c_file;
intptr_t hFile;
CString fullPath = root + path + file;
if( (hFile = _findfirst64( fullPath, &c_file )) == -1L ) {
return false;
} else {
// Find the rest of the .c files.
do {
if ((c_file.attrib & _A_SUBDIR) && recursive) {
// If recursive.
if (c_file.name[0] != '.') {
scan_directory( root,path + c_file.name + "\\",file,files,recursive );
}
continue;
}
files.push_back( path + c_file.name );
//FileInfo fi;
//fi.attrib = c_file.attrib;
//fi.name = path + c_file.name;
/*
// Add . after file name without extension.
if (fi.name.find('.') == CString::npos) {
fi.name.append( "." );
}
*/
//fi.size = c_file.size;
//fi.time = c_file.time_write;
//files.push_back( fi );
} while (_findnext64( hFile, &c_file ) == 0);
_findclose( hFile );
}
return true;
}
inline void GetThumbFileTime( const char *fileName,FILETIME &time )
{
HANDLE hFile = CreateFile( fileName, GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL );
if (INVALID_HANDLE_VALUE != hFile )
{
GetFileTime( hFile,NULL,NULL,&time );
CloseHandle( hFile );
}
}
inline void SetThumbFileTime( const char *fileName,FILETIME &time )
{
HANDLE hFile = CreateFile( fileName, GENERIC_WRITE,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL );
if (INVALID_HANDLE_VALUE != hFile )
{
SetFileTime( hFile,NULL,NULL,&time );
CloseHandle( hFile );
}
}
void CThumbnailGenerator::GenerateForDirectory( const CString &path )
{
//////////////////////////////////////////////////////////////////////////
std::vector<CString> files;
//CString dir = GetIEditor()->GetMasterCDFolder();
CString dir = path;
scan_directory( dir,"","*.*",files,true );
I3DEngine *engine = GetIEditor()->Get3DEngine();
int thumbSize = 128;
CImage image;
image.Allocate( thumbSize,thumbSize );
char fdir[_MAX_DIR];
char fname[_MAX_FNAME];
char fext[_MAX_EXT];
char bmpFile[1024];
GetIEditor()->ShowConsole( true );
CWaitProgress wait( "Generating CGF Thumbnails" );
for (int i = 0; i < files.size(); i++)
{
CString file = dir+files[i];
_splitpath( file,0,fdir,fname,fext );
//if (stricmp(fext,".cgf") != 0 && stricmp(fext,".bld") != 0)
if (stricmp(fext,".cgf") != 0)
continue;
if (!wait.Step( 100*i/files.size() ))
break;
_makepath( bmpFile,0,fdir,fname,".tmb" );
FILETIME ft1,ft2;
GetThumbFileTime( file,ft1 );
GetThumbFileTime( bmpFile,ft2 );
// Both cgf and bmp have same time stamp.
if (ft1.dwHighDateTime == ft2.dwHighDateTime && ft1.dwLowDateTime == ft1.dwLowDateTime)
continue;
//CLogFile::FormatLine( "Generating thumbnail for %s...",file );
IStatObj *obj = engine->MakeObject( file );
if (obj)
{
obj->MakeObjectPicture( (unsigned char*)image.GetData(),thumbSize );
CImageUtil::SaveBitmap( bmpFile,image,false );
SetThumbFileTime( bmpFile,ft1 );
SetFileAttributes( bmpFile,FILE_ATTRIBUTE_HIDDEN|FILE_ATTRIBUTE_NOT_CONTENT_INDEXED );
engine->ReleaseObject(obj);
}
}
//GetIEditor()->ShowConsole( false );
}
void CThumbnailGenerator::GenerateForFile( const CString &fileName )
{
I3DEngine *engine = GetIEditor()->Get3DEngine();
int thumbSize = 128;
CImage image;
image.Allocate( thumbSize,thumbSize );
char fdir[_MAX_DIR];
char fname[_MAX_FNAME];
char fext[_MAX_EXT];
char bmpFile[1024];
_splitpath( fileName,0,fdir,fname,fext );
_makepath( bmpFile,0,fdir,fname,".tmb" );
FILETIME ft1,ft2;
GetThumbFileTime( fileName,ft1 );
GetThumbFileTime( bmpFile,ft2 );
// Both cgf and bmp have same time stamp.
if (ft1.dwHighDateTime == ft2.dwHighDateTime && ft1.dwLowDateTime == ft1.dwLowDateTime)
return;
IStatObj *obj = engine->MakeObject( fileName,NULL,evs_ShareAndSortForCache );
if (obj)
{
obj->MakeObjectPicture( (unsigned char*)image.GetData(),thumbSize );
CImageUtil::SaveBitmap( bmpFile,image,false );
SetThumbFileTime( bmpFile,ft1 );
SetFileAttributes( bmpFile,FILE_ATTRIBUTE_HIDDEN|FILE_ATTRIBUTE_NOT_CONTENT_INDEXED );
engine->ReleaseObject(obj);
}
}