123
This commit is contained in:
166
Cry3DEngine/StatObjCompiler.cpp
Normal file
166
Cry3DEngine/StatObjCompiler.cpp
Normal file
@@ -0,0 +1,166 @@
|
||||
////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Crytek Engine Source File.
|
||||
// Copyright (C), Crytek Studios, 2002.
|
||||
// -------------------------------------------------------------------------
|
||||
// File name: statobjconstr.cpp
|
||||
// Version: v1.00
|
||||
// Created: 28/5/2001 by Vladimir Kajalin
|
||||
// Compilers: Visual Studio.NET
|
||||
// Description: loading
|
||||
// -------------------------------------------------------------------------
|
||||
// History:
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "stdafx.h"
|
||||
|
||||
#include "StatObj.h"
|
||||
#include "MeshIdx.h"
|
||||
#include "irenderer.h"
|
||||
|
||||
#ifdef WIN64
|
||||
#pragma warning( push ) //AMD Port
|
||||
#pragma warning( disable : 4267 )
|
||||
#endif
|
||||
|
||||
bool CStatObj::CompileInNeeded()
|
||||
{
|
||||
if(!GetCVars()->e_ccgf_make_if_not_found)
|
||||
return true;
|
||||
|
||||
#ifdef WIN32
|
||||
|
||||
char szCompiledFileName[MAX_PATH_LENGTH];
|
||||
MakeCompiledFileName(szCompiledFileName,MAX_PATH_LENGTH);
|
||||
|
||||
CCGFHeader fileHeader;
|
||||
// read header from compiled first
|
||||
FILE * f = GetSystem()->GetIPak()->FOpen(szCompiledFileName, "rb");
|
||||
if(f)
|
||||
{
|
||||
int nReaded = GetSystem()->GetIPak()->FRead(&fileHeader, 1, sizeof(fileHeader), f);
|
||||
assert(nReaded == sizeof(CCGFHeader));
|
||||
GetSystem()->GetIPak()->FClose(f);
|
||||
}
|
||||
|
||||
// get date of source file
|
||||
FILE* fTmp = GetSystem()->GetIPak()->FOpen(m_szFileName, "rb");
|
||||
if (!fTmp)
|
||||
return false;
|
||||
|
||||
FILETIME ftSourceFileTime = GetSystem()->GetIPak()->GetModificationTime(fTmp);
|
||||
GetSystem()->GetIPak()->FClose(fTmp);
|
||||
if(ftSourceFileTime.dwHighDateTime == 0 && ftSourceFileTime.dwLowDateTime == 0)
|
||||
return false; // source file not found
|
||||
|
||||
#ifdef _DEBUG
|
||||
HANDLE _dbg_h = CreateFile (m_szFileName, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, 0, 0);
|
||||
FILETIME _dbg_ft = {0,0};
|
||||
if (_dbg_h != INVALID_HANDLE_VALUE)
|
||||
GetFileTime (_dbg_h, &_dbg_ft, NULL, &_dbg_ft);
|
||||
|
||||
SYSTEMTIME _dbg_st1, _dbg_st2;
|
||||
FileTimeToSystemTime(&fileHeader.SourceFileTime, &_dbg_st1);
|
||||
FileTimeToSystemTime(&ftSourceFileTime, &_dbg_st2);
|
||||
#endif
|
||||
|
||||
// compare date of source file and date of source file used to build this ccgf
|
||||
if(!CompareFileTime(&fileHeader.SourceFileTime, &ftSourceFileTime))
|
||||
if(!strcmp(fileHeader.szVersion,CCGF_FILE_VERSION))
|
||||
if(fileHeader.nStructuresCheckSummm == CCGFHeader::GetStructuresCheckSummm())
|
||||
{
|
||||
if(!fileHeader.nDataSize)
|
||||
{
|
||||
assert(m_szGeomName[0]);
|
||||
return false; // geom name was specified but not found in source sgf during compilation (valid state)
|
||||
}
|
||||
|
||||
return true; // no recompilation required
|
||||
}
|
||||
|
||||
// make command for execution
|
||||
char szRemoteCmdLine[512];
|
||||
snprintf(szRemoteCmdLine, sizeof(szRemoteCmdLine),
|
||||
RC_EXECUTABLE " \"%s\" /GeomName=%s /Stripify=%d /LoadAdditinalInfo=%d /KeepInLocalSpace=%d /StaticCGF=1 /refresh",
|
||||
m_szFileName, m_szGeomName,
|
||||
int(m_eVertsSharing==evs_ShareAndSortForCache), int(m_bLoadAdditinalInfo), int(m_bKeepInLocalSpace)
|
||||
);
|
||||
|
||||
STARTUPINFO si;
|
||||
ZeroMemory( &si, sizeof(si) );
|
||||
si.cb = sizeof(si);
|
||||
si.dwX = 100;
|
||||
si.dwY = 100;
|
||||
si.dwFlags = STARTF_USEPOSITION;
|
||||
|
||||
PROCESS_INFORMATION pi;
|
||||
ZeroMemory( &pi, sizeof(pi) );
|
||||
|
||||
// Start the child process.
|
||||
GetLog()->UpdateLoadingScreen("Executing " RC_EXECUTABLE " for %s", m_szFileName);
|
||||
GetLog()->Log("\004Command line: %s", szRemoteCmdLine);
|
||||
|
||||
if( !CreateProcess( NULL, // No module name (use command line).
|
||||
szRemoteCmdLine, // Command line.
|
||||
NULL, // Process handle not inheritable.
|
||||
NULL, // Thread handle not inheritable.
|
||||
FALSE, // Set handle inheritance to FALSE.
|
||||
GetCVars()->e_ccgf_make_if_not_found == 2 ? 0 : CREATE_NO_WINDOW, // No creation flags.
|
||||
NULL, // Use parent's environment block.
|
||||
NULL/*szFolderName*/, // Set starting directory.
|
||||
&si, // Pointer to STARTUPINFO structure.
|
||||
&pi ) // Pointer to PROCESS_INFORMATION structure.
|
||||
)
|
||||
{
|
||||
GetSystem()->Error( "CreateProcess failed: %s", szRemoteCmdLine);
|
||||
}
|
||||
|
||||
// Wait until child process exits.
|
||||
WaitForSingleObject( pi.hProcess, INFINITE );
|
||||
|
||||
// Close process and thread handles.
|
||||
CloseHandle( pi.hProcess );
|
||||
CloseHandle( pi.hThread );
|
||||
|
||||
// check compiled file
|
||||
f = GetSystem()->GetIPak()->FOpen(szCompiledFileName, "rb");
|
||||
if(f)
|
||||
{
|
||||
int nReaded = GetSystem()->GetIPak()->FRead(&fileHeader, 1, sizeof(fileHeader), f);
|
||||
GetSystem()->GetIPak()->FClose(f);
|
||||
if(nReaded == sizeof(CCGFHeader))
|
||||
{
|
||||
if( ftSourceFileTime.dwHighDateTime == fileHeader.SourceFileTime.dwHighDateTime &&
|
||||
ftSourceFileTime.dwLowDateTime == fileHeader.SourceFileTime.dwLowDateTime)
|
||||
{
|
||||
if(strcmp(fileHeader.szVersion,CCGF_FILE_VERSION))
|
||||
GetSystem()->Error(" " RC_EXECUTABLE " version error\n"
|
||||
"File produced by resource compiler has wrong version [%s]\n"
|
||||
"Must be [%s]\n"
|
||||
"File name is %s",
|
||||
fileHeader.szVersion, CCGF_FILE_VERSION, szCompiledFileName);
|
||||
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
GetSystem()->Error(" " RC_EXECUTABLE " execution error\n"
|
||||
"File produced by resource compiler has time stamp different from source file time\n"
|
||||
"File name is %s", szCompiledFileName);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
GetSystem()->Error(" " RC_EXECUTABLE " execution error\n"
|
||||
"Resource compiler was not able to produce CCGF file\n"
|
||||
"File name is %s", szCompiledFileName);
|
||||
|
||||
return false;
|
||||
|
||||
#endif // WIN32
|
||||
}
|
||||
|
||||
#ifdef WIN64
|
||||
#pragma warning( pop ) //AMD Port
|
||||
#endif
|
||||
Reference in New Issue
Block a user