1
0
forked from metin2/client

Compare commits

..

10 Commits

247 changed files with 2424 additions and 2177 deletions

1
bin/.gitignore vendored
View File

@ -18,7 +18,6 @@ syserr.txt
# Game files # Game files
pack/*.eix pack/*.eix
pack/*.epk pack/*.epk
pack/*.zip
# Guild images # Guild images
mark/ mark/

View File

@ -1,14 +0,0 @@
@echo off
setlocal enabledelayedexpansion
FOR /d %%i IN ("*") DO (
echo Packing %%i
rem "C:\Program Files\7-Zip\7z.exe" a "%%i.zip" ".\%%i\*" -m0=LZMA
rem "C:\Program Files\7-Zip-Zstandard\7za.exe" a "%%i.zip" ".\%%i\*" -m0=Zstd
"C:\Program Files\7-Zip\7z.exe" a "%%i.zip" ".\%%i\*"
if !errorlevel! neq 0 exit /b !errorlevel!
cls
)
pause

View File

@ -3,7 +3,7 @@
#include <d3d9.h> #include <d3d9.h>
#include <algorithm> #include <algorithm>
#include <vector> #include <math.h>
#define APP_NAME _T("Metin2 Config") #define APP_NAME _T("Metin2 Config")
#define FILENAME_CONFIG "metin2.cfg" #define FILENAME_CONFIG "metin2.cfg"
@ -164,24 +164,12 @@ BOOL CMainDialog::OnInitDialog(CWindow wndFocus, LPARAM lInitParam)
m_comboShadow.SetCurSel(m_stConfig.iShadowLevel); m_comboShadow.SetCurSel(m_stConfig.iShadowLevel);
// Language // Language
ATL::CString language;
// Load the languages into an array
std::vector<ATL::CString> languages;
for (int i = 0; i < kLanguageMax; ++i) { for (int i = 0; i < kLanguageMax; ++i) {
ATL::CString language;
language.LoadString(kLanguageConfig[i].stringId); language.LoadString(kLanguageConfig[i].stringId);
languages.push_back(language); m_comboLanguage.InsertString(i, language);
} }
// Sort the array
std::sort(languages.begin(), languages.end(), [](const ATL::CString& a, const ATL::CString& b) {
return a.CompareNoCase(b) < 0;
});
// Add the languages to the combo
for (auto& language : languages)
m_comboLanguage.AddString(language);
m_stConfig.language = std::clamp((int) m_stConfig.language, 0, kLanguageMax - 1); m_stConfig.language = std::clamp((int) m_stConfig.language, 0, kLanguageMax - 1);
m_comboLanguage.SetCurSel(m_stConfig.language); m_comboLanguage.SetCurSel(m_stConfig.language);
@ -241,66 +229,10 @@ void CMainDialog::InitDefaultConfig()
auto lang = PRIMARYLANGID(LANGIDFROMLCID(GetUserDefaultLCID())); auto lang = PRIMARYLANGID(LANGIDFROMLCID(GetUserDefaultLCID()));
switch (lang) { switch (lang) {
case LANG_CZECH:
m_stConfig.language = kLanguageCzech;
break;
case LANG_DANISH:
m_stConfig.language = kLanguageDanish;
break;
case LANG_DUTCH:
m_stConfig.language = kLanguageDutch;
break;
case LANG_ENGLISH:
m_stConfig.language = kLanguageEnglish;
break;
case LANG_FRENCH:
m_stConfig.language = kLanguageFrench;
break;
case LANG_GERMAN: case LANG_GERMAN:
m_stConfig.language = kLanguageGerman; m_stConfig.language = kLanguageGerman;
break; break;
case LANG_GREEK:
m_stConfig.language = kLanguageGreek;
break;
case LANG_HUNGARIAN:
m_stConfig.language = kLanguageHungarian;
break;
case LANG_ITALIAN:
m_stConfig.language = kLanguageItalian;
break;
case LANG_POLISH:
m_stConfig.language = kLanguagePolish;
break;
case LANG_PORTUGUESE:
m_stConfig.language = kLanguagePortuguese;
break;
case LANG_ROMANIAN:
m_stConfig.language = kLanguageRomanian;
break;
case LANG_RUSSIAN:
m_stConfig.language = kLanguageRussian;
break;
case LANG_SPANISH:
m_stConfig.language = kLanguageSpanish;
break;
case LANG_TURKISH:
m_stConfig.language = kLanguageTurkish;
break;
default: default:
m_stConfig.language = kLanguageEnglish; m_stConfig.language = kLanguageEnglish;
break; break;

View File

@ -1,15 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<dependency>
<dependentAssembly>
<assemblyIdentity
type="win32"
name="Microsoft.Windows.Common-Controls"
version="6.0.0.0"
processorArchitecture="*"
publicKeyToken="6595b64144ccf1df"
language="*"
/>
</dependentAssembly>
</dependency>
</assembly>

View File

@ -17,6 +17,3 @@ IDR_MAINFRAME ICON "metin2.ico"
#define METIN2_COMPONENT_TYPE VFT_APP #define METIN2_COMPONENT_TYPE VFT_APP
#include <version_info.rc> #include <version_info.rc>
// Visual Styles manifest
CREATEPROCESS_MANIFEST_RESOURCE_ID RT_MANIFEST "Metin2Config.exe.manifest"

View File

@ -31,18 +31,18 @@
<ConfigurationType>Application</ConfigurationType> <ConfigurationType>Application</ConfigurationType>
<PlatformToolset>v143</PlatformToolset> <PlatformToolset>v143</PlatformToolset>
<UseOfMfc>false</UseOfMfc> <UseOfMfc>false</UseOfMfc>
<CharacterSet>Unicode</CharacterSet> <CharacterSet>MultiByte</CharacterSet>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Distribute|Win32'" Label="Configuration"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Distribute|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType> <ConfigurationType>Application</ConfigurationType>
<PlatformToolset>v143</PlatformToolset> <PlatformToolset>v143</PlatformToolset>
<UseOfMfc>false</UseOfMfc> <UseOfMfc>false</UseOfMfc>
<CharacterSet>Unicode</CharacterSet> <CharacterSet>MultiByte</CharacterSet>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType> <ConfigurationType>Application</ConfigurationType>
<UseOfMfc>false</UseOfMfc> <UseOfMfc>false</UseOfMfc>
<CharacterSet>Unicode</CharacterSet> <CharacterSet>MultiByte</CharacterSet>
<PlatformToolset>v143</PlatformToolset> <PlatformToolset>v143</PlatformToolset>
</PropertyGroup> </PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />

Binary file not shown.

View File

@ -42,8 +42,8 @@ class CEffectData
void __ClearLightDataVector(); void __ClearLightDataVector();
void __ClearMeshDataVector(); void __ClearMeshDataVector();
// FIXME : 이 부분은 그다지 맘에 들지 않는다. 좋은 아이디어를 찾아내어 고치자. // FIXME : 이 부분은 그다지 맘에 들지 않는다. 좋은 아이디어를 찾아내어 고치자.
// 상위가 (특화된) 상위의 인터페이스 때문에 모양이 바뀌어야 한다는 것은 옳지 못하다. - [levites] // 상위가 (특화된) 상위의 인터페이스 때문에 모양이 바뀌어야 한다는 것은 옳지 못하다. - [levites]
virtual CParticleSystemData * AllocParticle(); virtual CParticleSystemData * AllocParticle();
virtual CEffectMeshScript * AllocMesh(); virtual CEffectMeshScript * AllocMesh();
virtual CLightData * AllocLight(); virtual CLightData * AllocLight();

View File

@ -52,7 +52,7 @@ void CEffectInstance::UpdateSound()
{ {
CSoundManager& rkSndMgr=CSoundManager::Instance(); CSoundManager& rkSndMgr=CSoundManager::Instance();
rkSndMgr.UpdateSoundInstance(m_matGlobal._41, m_matGlobal._42, m_matGlobal._43, m_dwFrame, m_pSoundInstanceVector); rkSndMgr.UpdateSoundInstance(m_matGlobal._41, m_matGlobal._42, m_matGlobal._43, m_dwFrame, m_pSoundInstanceVector);
// NOTE : 매트릭스에서 위치를 직접 얻어온다 - [levites] // NOTE : 매트릭스에서 위치를 직접 얻어온다 - [levites]
} }
++m_dwFrame; ++m_dwFrame;
} }

View File

@ -48,7 +48,7 @@ bool CEffectManager::IsAliveEffect(DWORD dwInstanceIndex)
void CEffectManager::Update() void CEffectManager::Update()
{ {
// 2004. 3. 1. myevan. 이펙트 모니터링 하는 코드 // 2004. 3. 1. myevan. 이펙트 모니터링 하는 코드
/* /*
if (GetAsyncKeyState(VK_F9)) if (GetAsyncKeyState(VK_F9))
{ {
@ -173,8 +173,8 @@ BOOL CEffectManager::RegisterEffect(const char * c_szFileName,bool isExistDelete
return TRUE; return TRUE;
} }
// CEffectData 를 포인터형으로 리턴하게 하고.. // CEffectData 를 포인터형으로 리턴하게 하고..
// CEffectData에서 CRC를 얻을수 있게 한다 // CEffectData에서 CRC를 얻을수 있게 한다
BOOL CEffectManager::RegisterEffect2(const char * c_szFileName, DWORD* pdwRetCRC, bool isNeedCache) BOOL CEffectManager::RegisterEffect2(const char * c_szFileName, DWORD* pdwRetCRC, bool isNeedCache)
{ {
std::string strFileName; std::string strFileName;

View File

@ -62,8 +62,8 @@ class CEffectManager : public CScreen, public CSingleton<CEffectManager>
bool GetEffectData(DWORD dwID, CEffectData ** ppEffect); bool GetEffectData(DWORD dwID, CEffectData ** ppEffect);
bool GetEffectData(DWORD dwID, const CEffectData ** c_ppEffect); bool GetEffectData(DWORD dwID, const CEffectData ** c_ppEffect);
// Area에 직접 찍는 Effect용 함수... EffectInstance의 Pointer를 반환한다. // Area에 직접 찍는 Effect용 함수... EffectInstance의 Pointer를 반환한다.
// EffectManager 내부 EffectInstanceMap을 이용하지 않는다. // EffectManager 내부 EffectInstanceMap을 이용하지 않는다.
void CreateUnsafeEffectInstance(DWORD dwEffectDataID, CEffectInstance ** ppEffectInstance); void CreateUnsafeEffectInstance(DWORD dwEffectDataID, CEffectInstance ** ppEffectInstance);
bool DestroyUnsafeEffectInstance(CEffectInstance * pEffectInstance); bool DestroyUnsafeEffectInstance(CEffectInstance * pEffectInstance);

View File

@ -9,7 +9,7 @@
class CEffectMeshInstance : public CEffectElementBaseInstance class CEffectMeshInstance : public CEffectElementBaseInstance
{ {
public: public:
// NOTE : Mesh 단위 텍스춰 데이타의 인스턴스이다. // NOTE : Mesh 단위 텍스춰 데이타의 인스턴스이다.
typedef struct STextureInstance typedef struct STextureInstance
{ {
CFrameController TextureFrameController; CFrameController TextureFrameController;

View File

@ -185,9 +185,9 @@ void CParticleInstance::Transform(const D3DXMATRIX * c_matLocal)
case BILLBOARD_TYPE_ALL: case BILLBOARD_TYPE_ALL:
default: default:
{ {
// NOTE : Rotation Routine. Camera의 Up Vector와 Cross Vector 자체를 View Vector 기준으로 // NOTE : Rotation Routine. Camera의 Up Vector와 Cross Vector 자체를 View Vector 기준으로
// Rotation 시킨다. // Rotation 시킨다.
// FIXME : 반드시 최적화 할 것! // FIXME : 반드시 최적화 할 것!
if (m_fRotation==0.0f) if (m_fRotation==0.0f)
{ {
v3Up = -c_rv3Cross; v3Up = -c_rv3Cross;
@ -239,7 +239,7 @@ void CParticleInstance::Transform(const D3DXMATRIX * c_matLocal)
D3DXVec3TransformNormal(&v3Up, &v3Up, c_matLocal); D3DXVec3TransformNormal(&v3Up, &v3Up, c_matLocal);
} }
// NOTE: 속도가 길이에 주는 영향 : log(velocity)만큼 늘어난다. // NOTE: 속도가 길이에 주는 영향 : log(velocity)만큼 늘어난다.
float length = D3DXVec3Length(&v3Up); float length = D3DXVec3Length(&v3Up);
if (length == 0.0f) if (length == 0.0f)
{ {
@ -342,9 +342,9 @@ void CParticleInstance::Transform(const D3DXMATRIX * c_matLocal, const float c_f
case BILLBOARD_TYPE_ALL: case BILLBOARD_TYPE_ALL:
default: default:
{ {
// NOTE : Rotation Routine. Camera의 Up Vector와 Cross Vector 자체를 View Vector 기준으로 // NOTE : Rotation Routine. Camera의 Up Vector와 Cross Vector 자체를 View Vector 기준으로
// Rotation 시킨다. // Rotation 시킨다.
// FIXME : 반드시 최적화 할 것! // FIXME : 반드시 최적화 할 것!
if (m_fRotation==0.0f) if (m_fRotation==0.0f)
{ {
v3Up = -c_rv3Cross; v3Up = -c_rv3Cross;
@ -373,7 +373,7 @@ void CParticleInstance::Transform(const D3DXMATRIX * c_matLocal, const float c_f
D3DXVec3TransformNormal(&v3Up, &v3Up, c_matLocal); D3DXVec3TransformNormal(&v3Up, &v3Up, c_matLocal);
} }
// NOTE: 속도가 길이에 주는 영향 : log(velocity)만큼 늘어난다. // NOTE: 속도가 길이에 주는 영향 : log(velocity)만큼 늘어난다.
float length = D3DXVec3Length(&v3Up); float length = D3DXVec3Length(&v3Up);
if (length == 0.0f) if (length == 0.0f)
{ {

View File

@ -161,8 +161,8 @@ void CParticleSystemInstance::CreateParticles(float fElapsedTime)
D3DXVec3TransformCoord(&v3TimePosition, &v3TimePosition, mc_pmatLocal); D3DXVec3TransformCoord(&v3TimePosition, &v3TimePosition, mc_pmatLocal);
} }
pInstance->m_v3StartPosition = v3TimePosition; pInstance->m_v3StartPosition = v3TimePosition;
// NOTE : Update를 호출하지 않고 Rendering 되기 때문에 length가 0이 되는 문제가 있다. // NOTE : Update를 호출하지 않고 Rendering 되기 때문에 length가 0이 되는 문제가 있다.
// Velocity를 구한 후 그만큼 빼준 값으로 초기화 해주도록 바꿨음 - [levites] // Velocity를 구한 후 그만큼 빼준 값으로 초기화 해주도록 바꿨음 - [levites]
//pInstance->m_v3LastPosition = pInstance->m_v3Position; //pInstance->m_v3LastPosition = pInstance->m_v3Position;
// Direction & Velocity // Direction & Velocity
@ -212,8 +212,8 @@ void CParticleSystemInstance::CreateParticles(float fElapsedTime)
// Rotation // Rotation
pInstance->m_fRotation = m_pParticleProperty->m_wRotationRandomStartingBegin; pInstance->m_fRotation = m_pParticleProperty->m_wRotationRandomStartingBegin;
pInstance->m_fRotation = frandom(m_pParticleProperty->m_wRotationRandomStartingBegin,m_pParticleProperty->m_wRotationRandomStartingEnd); pInstance->m_fRotation = frandom(m_pParticleProperty->m_wRotationRandomStartingBegin,m_pParticleProperty->m_wRotationRandomStartingEnd);
// Rotation - Lie 일 경우 LocalMatrix 의 Rotation 값을 Random 에 적용한다. // Rotation - Lie 일 경우 LocalMatrix 의 Rotation 값을 Random 에 적용한다.
// 매번 할 필요는 없을듯. 어느 정도의 최적화가 필요. - [levites] // 매번 할 필요는 없을듯. 어느 정도의 최적화가 필요. - [levites]
if (BILLBOARD_TYPE_LIE == m_pParticleProperty->m_byBillboardType && mc_pmatLocal) if (BILLBOARD_TYPE_LIE == m_pParticleProperty->m_byBillboardType && mc_pmatLocal)
{ {
pInstance->m_fRotation += fLieRotation; pInstance->m_fRotation += fLieRotation;
@ -486,7 +486,7 @@ void CParticleSystemInstance::OnInitialize()
void CParticleSystemInstance::OnDestroy() void CParticleSystemInstance::OnDestroy()
{ {
// 2004. 3. 1. myevan. 파티클 제거 루틴 // 2004. 3. 1. myevan. 파티클 제거 루틴
TParticleInstanceListVector::iterator i; TParticleInstanceListVector::iterator i;
for(i = m_ParticleInstanceListVector.begin(); i!=m_ParticleInstanceListVector.end(); ++i) for(i = m_ParticleInstanceListVector.begin(); i!=m_ParticleInstanceListVector.end(); ++i)
{ {

View File

@ -71,12 +71,12 @@ enum EBillBoardType
BILLBOARD_TYPE_ALL, BILLBOARD_TYPE_ALL,
BILLBOARD_TYPE_Y, BILLBOARD_TYPE_Y,
BILLBOARD_TYPE_LIE, // 바닥에 누은 형상 BILLBOARD_TYPE_LIE, // 바닥에 누은 형상
BILLBOARD_TYPE_2FACE, // / and \ BILLBOARD_TYPE_2FACE, // / and \
BILLBOARD_TYPE_3FACE, // / and \ and - BILLBOARD_TYPE_3FACE, // / and \ and -
//BILLBOARD_TYPE_RAY, // 잔상 //BILLBOARD_TYPE_RAY, // 잔상
}; };
@ -220,8 +220,8 @@ typedef std::vector<TTimeEventTypeVector2> TTimeEventTableVector2;
typedef std::vector<TTimeEventTypeVector3> TTimeEventTableVector3; typedef std::vector<TTimeEventTypeVector3> TTimeEventTableVector3;
// NOTE : TimeEventValue 함수들은 값을 넘겨 받지 말아야 하는 때도 있으므로 // NOTE : TimeEventValue 함수들은 값을 넘겨 받지 말아야 하는 때도 있으므로
// 값의 직접 리턴이 아닌 포인터 리턴으로 작성 했습니다. - [levites] // 값의 직접 리턴이 아닌 포인터 리턴으로 작성 했습니다. - [levites]
template <typename T> template <typename T>
__forceinline void GetTimeEventBlendValue(float fElapsedTime, std::vector<CTimeEvent<T> >& rVector, T * pReturnValue) __forceinline void GetTimeEventBlendValue(float fElapsedTime, std::vector<CTimeEvent<T> >& rVector, T * pReturnValue)

View File

@ -6,14 +6,14 @@ class _CPostItMemoryBlock;
/** /**
* @class CPostIt * @class CPostIt
* @brief * @brief
*/ */
class CPostIt class CPostIt
{ {
public: public:
/** /**
* @brief CPostIt constructor * @brief CPostIt constructor
* @param [in] szAppName : . * @param [in] szAppName : .
*/ */
explicit CPostIt( LPCSTR szAppName ); explicit CPostIt( LPCSTR szAppName );
@ -23,45 +23,45 @@ public:
~CPostIt( void ); ~CPostIt( void );
/** /**
* @brief CPostIt class에서 . * @brief CPostIt class에서 .
*/ */
BOOL Flush( void ); BOOL Flush( void );
/** /**
* @brief CPostIt class에서 . * @brief CPostIt class에서 .
*/ */
void Empty( void ); void Empty( void );
/** /**
* @brief . * @brief .
* @param [in] lpszKeyName : . "KEY" . * @param [in] lpszKeyName : . "KEY" .
* @param [in] lpszData : * @param [in] lpszData :
* @param [in] nSize : lpszData * @param [in] nSize : lpszData
*/ */
BOOL Get( LPCSTR lpszKeyName, LPSTR lpszData, DWORD nSize ); BOOL Get( LPCSTR lpszKeyName, LPSTR lpszData, DWORD nSize );
/** /**
* @brief . * @brief .
* @param [in] lpBuffer : . "KEY=DATA" . * @param [in] lpBuffer : . "KEY=DATA" .
*/ */
BOOL Set( LPCSTR lpszData ); BOOL Set( LPCSTR lpszData );
/** /**
* @brief . * @brief .
* @param [in] lpszKeyName : . "KEY" . * @param [in] lpszKeyName : . "KEY" .
* @param [in] lpszData : . "DATA" . * @param [in] lpszData : . "DATA" .
*/ */
BOOL Set( LPCSTR lpszKeyName, LPCSTR lpszData ); BOOL Set( LPCSTR lpszKeyName, LPCSTR lpszData );
/** /**
* @brief (DWORD) . * @brief (DWORD) .
* @param [in] lpBuffer : . "KEY=DATA" . * @param [in] lpBuffer : . "KEY=DATA" .
* @param [in] dwValue : . (DWORD) * @param [in] dwValue : . (DWORD)
*/ */
BOOL Set( LPCSTR lpszKeyName, DWORD dwValue ); BOOL Set( LPCSTR lpszKeyName, DWORD dwValue );
/** /**
* @brief CPostIt class를 . ( constructor에 , ) * @brief CPostIt class를 . ( constructor에 , )
* @param [in] pPostIt : Destination class * @param [in] pPostIt : Destination class
* @param [in] lpszKeyName : Destination class's new app-name * @param [in] lpszKeyName : Destination class's new app-name
*/ */

View File

@ -60,9 +60,9 @@ bool CDir::Create(const char * c_szFilter, const char* c_szPath, BOOL bCheckedEx
if (!c_szExtension) if (!c_szExtension)
continue; continue;
// NOTE : 임시 변수 - [levites] // NOTE : 임시 변수 - [levites]
// 최종적으로는 무조건 TRUE 형태로 만든다. // 최종적으로는 무조건 TRUE 형태로 만든다.
// 그전에 전 프로젝트의 CDir을 사용하는 곳에서 Extension을 "wav", "gr2" 이런식으로 넣게끔 한다. - [levites] // 그전에 전 프로젝트의 CDir을 사용하는 곳에서 Extension을 "wav", "gr2" 이런식으로 넣게끔 한다. - [levites]
if (bCheckedExtension) if (bCheckedExtension)
{ {
std::string strFilter = c_szFilter; std::string strFilter = c_szFilter;

View File

@ -72,7 +72,7 @@ int CMemoryTextFileLoader::SplitLine2(DWORD dwLine, CTokenVector* pstTokenVector
pstTokenVector->push_back(c_rstLine.substr(beginPos, endPos - beginPos)); pstTokenVector->push_back(c_rstLine.substr(beginPos, endPos - beginPos));
// 추가 코드. 맨뒤에 탭이 있는 경우를 체크한다. - [levites] // 추가 코드. 맨뒤에 탭이 있는 경우를 체크한다. - [levites]
if (int(c_rstLine.find_first_not_of(c_szDelimeter, basePos)) < 0) if (int(c_rstLine.find_first_not_of(c_szDelimeter, basePos)) < 0)
break; break;
} while (basePos < c_rstLine.length()); } while (basePos < c_rstLine.length());
@ -116,7 +116,7 @@ bool CMemoryTextFileLoader::SplitLine(DWORD dwLine, CTokenVector* pstTokenVector
pstTokenVector->push_back(c_rstLine.substr(beginPos, endPos - beginPos)); pstTokenVector->push_back(c_rstLine.substr(beginPos, endPos - beginPos));
// 추가 코드. 맨뒤에 탭이 있는 경우를 체크한다. - [levites] // 추가 코드. 맨뒤에 탭이 있는 경우를 체크한다. - [levites]
if (int(c_rstLine.find_first_not_of(c_szDelimeter, basePos)) < 0) if (int(c_rstLine.find_first_not_of(c_szDelimeter, basePos)) < 0)
break; break;
} while (basePos < c_rstLine.length()); } while (basePos < c_rstLine.length());

View File

@ -1,6 +1,6 @@
#pragma once #pragma once
#pragma warning(disable:4786) // character 255 넘어가는거 끄기 #pragma warning(disable:4786) // character 255 넘어가는거 끄기
#include <windows.h> #include <windows.h>
#include <vector> #include <vector>

View File

@ -85,7 +85,7 @@ BYTE* CMappedFile::AppendDataBlock( const void* pBlock, DWORD dwBlockSize )
void CMappedFile::Destroy() void CMappedFile::Destroy()
{ {
if (m_pLZObj) // 압축된 데이터가 이 포인터로 연결 된다 if (m_pLZObj) // 압축된 데이터가 이 포인터로 연결 된다
{ {
delete m_pLZObj; delete m_pLZObj;
m_pLZObj = NULL; m_pLZObj = NULL;
@ -144,7 +144,7 @@ int CMappedFile::Seek(DWORD offset, int iSeekType)
return m_seekPosition; return m_seekPosition;
} }
// 2004.09.16.myevan.MemoryMappedFile 98/ME 개수 제한 문제 체크 // 2004.09.16.myevan.MemoryMappedFile 98/ME 개수 제한 문제 체크
//DWORD g_dwCount=0; //DWORD g_dwCount=0;
int CMappedFile::Map(const void **dest, int offset, int size) int CMappedFile::Map(const void **dest, int offset, int size)
@ -192,7 +192,7 @@ int CMappedFile::Map(const void **dest, int offset, int size)
return 0; return 0;
} }
// 2004.09.16.myevan.MemoryMappedFile 98/ME 개수 제한 문제 체크 // 2004.09.16.myevan.MemoryMappedFile 98/ME 개수 제한 문제 체크
//g_dwCount++; //g_dwCount++;
//Tracenf("MAPFILE %d", g_dwCount); //Tracenf("MAPFILE %d", g_dwCount);
@ -247,7 +247,7 @@ void CMappedFile::Unmap(LPCVOID data)
{ {
if (UnmapViewOfFile(data)) if (UnmapViewOfFile(data))
{ {
// 2004.09.16.myevan.MemoryMappedFile 98/ME 개수 제한 문제 체크 // 2004.09.16.myevan.MemoryMappedFile 98/ME 개수 제한 문제 체크
//g_dwCount--; //g_dwCount--;
//Tracenf("UNMAPFILE %d", g_dwCount); //Tracenf("UNMAPFILE %d", g_dwCount);
} }

View File

@ -6,7 +6,7 @@
#endif #endif
#pragma warning(disable:4710) // not inlined #pragma warning(disable:4710) // not inlined
#pragma warning(disable:4786) // character 255 넘어가는거 끄기 #pragma warning(disable:4786) // character 255 넘어가는거 끄기
#pragma warning(disable:4244) // type conversion possible lose of data #pragma warning(disable:4244) // type conversion possible lose of data
#include <windows.h> #include <windows.h>

View File

@ -27,7 +27,7 @@ BOOL ELTimer_Init()
DWORD ELTimer_GetMSec() DWORD ELTimer_GetMSec()
{ {
//assert(gs_dwBaseTime!=0 && "ELTimer_Init 를 먼저 실행하세요"); //assert(gs_dwBaseTime!=0 && "ELTimer_Init 를 먼저 실행하세요");
//LARGE_INTEGER liTickCount; //LARGE_INTEGER liTickCount;
//QueryPerformanceCounter(&liTickCount); //QueryPerformanceCounter(&liTickCount);
return timeGetTime() - gs_dwBaseTime; //(liTickCount.QuadPart*1000 / gs_liTickCountPerSec.QuadPart)-gs_dwBaseTime; return timeGetTime() - gs_dwBaseTime; //(liTickCount.QuadPart*1000 / gs_liTickCountPerSec.QuadPart)-gs_dwBaseTime;
@ -36,7 +36,7 @@ DWORD ELTimer_GetMSec()
VOID ELTimer_SetServerMSec(DWORD dwServerTime) VOID ELTimer_SetServerMSec(DWORD dwServerTime)
{ {
NANOBEGIN NANOBEGIN
if (0 != dwServerTime) // nanomite를 위한 더미 if if (0 != dwServerTime) // nanomite를 위한 더미 if
{ {
gs_dwServerTime = dwServerTime; gs_dwServerTime = dwServerTime;
gs_dwClientTime = CTimer::instance().GetCurrentMillisecond(); gs_dwClientTime = CTimer::instance().GetCurrentMillisecond();
@ -70,7 +70,7 @@ CTimer::CTimer()
ELTimer_Init(); ELTimer_Init();
NANOBEGIN NANOBEGIN
if (this) // nanomite를 위한 더미 if if (this) // nanomite를 위한 더미 if
{ {
m_dwCurrentTime = 0; m_dwCurrentTime = 0;
m_bUseRealTime = true; m_bUseRealTime = true;

View File

@ -433,7 +433,7 @@ void MyCreateDirectory(const char* path)
if (strlen(path) >= 3) if (strlen(path) >= 3)
{ {
if (*(path + 1) == ':') // C:, D: 같은 경우를 체크 if (*(path + 1) == ':') // C:, D: 같은 경우를 체크
path += 3; path += 3;
} }

View File

@ -64,9 +64,9 @@ extern void GetExceptionPathName(const char * sz_Name, std::string & OnlyFileN
extern void GetWorkingFolder(std::string & strFileName); extern void GetWorkingFolder(std::string & strFileName);
extern void StringLowers(char * pString); extern void StringLowers(char * pString);
extern void StringPath(std::string & rString); extern void StringPath(std::string & rString);
extern void StringPath(char * pString); // 모두 소문자로 만들고, \는 /로 바꾼다. extern void StringPath(char * pString); // 모두 소문자로 만들고, \는 /로 바꾼다.
extern void StringPath(const char * c_szSrc, char * szDest); // 모두 소문자로 만들고, \는 /로 바꾼다. extern void StringPath(const char * c_szSrc, char * szDest); // 모두 소문자로 만들고, \는 /로 바꾼다.
extern void StringPath(const char * c_szSrc, std::string & rString); // 모두 소문자로 만들고, \는 /로 바꾼다. extern void StringPath(const char * c_szSrc, std::string & rString); // 모두 소문자로 만들고, \는 /로 바꾼다.
extern void PrintAsciiData(const void* data, int bytes); extern void PrintAsciiData(const void* data, int bytes);
bool IsFile(const char* filename); bool IsFile(const char* filename);
bool IsGlobalFileName(const char * c_szFileName); bool IsGlobalFileName(const char * c_szFileName);

View File

@ -120,9 +120,9 @@ void CLZObject::BeginCompress(const void * pvIn, UINT uiInLen)
m_pbIn = (const BYTE *) pvIn; m_pbIn = (const BYTE *) pvIn;
// sizeof(SHeader) + // sizeof(SHeader) +
// 암호화를 위한 fourCC 4바이트 // 암호화를 위한 fourCC 4바이트
// 압축된 후 만들어질 수 있는 최대 용량 + // 압축된 후 만들어질 수 있는 최대 용량 +
// 암호화를 위한 8 바이트 // 암호화를 위한 8 바이트
m_dwBufferSize = sizeof(THeader) + sizeof(DWORD) + (uiInLen + uiInLen / 64 + 16 + 3) + 8; m_dwBufferSize = sizeof(THeader) + sizeof(DWORD) + (uiInLen + uiInLen / 64 + 16 + 3) + 8;
m_pbBuffer = gs_freeMemMgr.Alloc(m_dwBufferSize); m_pbBuffer = gs_freeMemMgr.Alloc(m_dwBufferSize);
@ -139,9 +139,9 @@ void CLZObject::BeginCompressInBuffer(const void * pvIn, UINT uiInLen, void * /*
m_pbIn = (const BYTE *) pvIn; m_pbIn = (const BYTE *) pvIn;
// sizeof(SHeader) + // sizeof(SHeader) +
// 암호화를 위한 fourCC 4바이트 // 암호화를 위한 fourCC 4바이트
// 압축된 후 만들어질 수 있는 최대 용량 + // 압축된 후 만들어질 수 있는 최대 용량 +
// 암호화를 위한 8 바이트 // 암호화를 위한 8 바이트
m_dwBufferSize = sizeof(THeader) + sizeof(DWORD) + (uiInLen + uiInLen / 64 + 16 + 3) + 8; m_dwBufferSize = sizeof(THeader) + sizeof(DWORD) + (uiInLen + uiInLen / 64 + 16 + 3) + 8;
m_pbBuffer = gs_freeMemMgr.Alloc(m_dwBufferSize); m_pbBuffer = gs_freeMemMgr.Alloc(m_dwBufferSize);

View File

@ -12,9 +12,9 @@ class CLZObject
typedef struct SHeader typedef struct SHeader
{ {
DWORD dwFourCC; DWORD dwFourCC;
DWORD dwEncryptSize; // 암호화된 크기 DWORD dwEncryptSize; // 암호화된 크기
DWORD dwCompressedSize; // 압축된 데이터 크기 DWORD dwCompressedSize; // 압축된 데이터 크기
DWORD dwRealSize; // 실제 데이터 크기 DWORD dwRealSize; // 실제 데이터 크기
} THeader; } THeader;
#pragma pack() #pragma pack()

View File

@ -1,8 +1,8 @@
/* /*
* Filename: tea.c * Filename: tea.c
* Description: TEA * Description: TEA
* *
* Author: (aka. , Cronan), (aka. myevan, ) * Author: (aka. , Cronan), (aka. myevan, )
*/ */
#include "StdAfx.h" #include "StdAfx.h"
#include "tea.h" #include "tea.h"
@ -10,24 +10,24 @@
/* /*
* TEA Encryption Module Instruction * TEA Encryption Module Instruction
* Edited by aka. , Cronan * Edited by aka. , Cronan
* *
* void tea_code(const unsigned long sz, const unsigned long sy, const unsigned long *key, unsigned long *dest) * void tea_code(const unsigned long sz, const unsigned long sy, const unsigned long *key, unsigned long *dest)
* void tea_decode(const unsigned long sz, const unsigned long sy, const unsigned long *key, unsigned long *dest) * void tea_decode(const unsigned long sz, const unsigned long sy, const unsigned long *key, unsigned long *dest)
* 8 / . key 16 . * 8 / . key 16 .
* sz, sy 8 . * sz, sy 8 .
* *
* int tea_decrypt(unsigned long *dest, const unsigned long *src, const unsigned long *key, int size); * int tea_decrypt(unsigned long *dest, const unsigned long *src, const unsigned long *key, int size);
* int tea_encrypt(unsigned long *dest, const unsigned long *src, const unsigned long *key, int size); * int tea_encrypt(unsigned long *dest, const unsigned long *src, const unsigned long *key, int size);
* 8 / . size * 8 / . size
* 8 8 "늘려서" . * 8 8 "늘려서" .
* *
* ex. tea_code(pdwSrc[1], pdwSrc[0], pdwKey, pdwDest); * ex. tea_code(pdwSrc[1], pdwSrc[0], pdwKey, pdwDest);
* tea_decrypt(pdwDest, pdwSrc, pdwKey, nSize); * tea_decrypt(pdwDest, pdwSrc, pdwKey, nSize);
*/ */
#define TEA_ROUND 32 // 32 를 권장하며, 높을 수록 결과가 난해해 진다. #define TEA_ROUND 32 // 32 를 권장하며, 높을 수록 결과가 난해해 진다.
#define DELTA 0x9E3779B9 // DELTA 값 바꾸지 말것. #define DELTA 0x9E3779B9 // DELTA 값 바꾸지 말것.
void tea_code(const unsigned long sz, const unsigned long sy, const unsigned long *key, unsigned long *dest) void tea_code(const unsigned long sz, const unsigned long sy, const unsigned long *key, unsigned long *dest)
{ {

View File

@ -282,8 +282,8 @@ void CGrannyLODController::AddModel(CGraphicThing * pThing, int iSrcModel, CGran
} }
else else
{ {
// FIXME : CModelInstance::m_pgrnWorldPose를 Update에서 사용하는데, // FIXME : CModelInstance::m_pgrnWorldPose를 Update에서 사용하는데,
// Deform을 하지 않으면 NULL 입니다. 구조가 조금 바뀌어야 할지도.. - [levites] // Deform을 하지 않으면 NULL 입니다. 구조가 조금 바뀌어야 할지도.. - [levites]
pModelInstance->DeformNoSkin(&ms_matIdentity); pModelInstance->DeformNoSkin(&ms_matIdentity);
} }
@ -460,10 +460,10 @@ void CGrannyLODController::UpdateLODLevel(float fDistanceFromCenter, float fDist
assert(m_pCurrentModelInstance != NULL); assert(m_pCurrentModelInstance != NULL);
if (fDistanceFromCenter > LOD_APPLY_MIN) // 중심 LOD 예외 취소 if (fDistanceFromCenter > LOD_APPLY_MIN) // 중심 LOD 예외 취소
{ {
// 카메라부터 멀어질 수록 fLODRate가 작아진다 // 카메라부터 멀어질 수록 fLODRate가 작아진다
// 3개 LOD가 있을때.. 가장 먼게 0, 가까울 수록 숫자가 커진다 // 3개 LOD가 있을때.. 가장 먼게 0, 가까울 수록 숫자가 커진다
// 100fps 50fps 33fps 25fps 20fps // 100fps 50fps 33fps 25fps 20fps
// 10ms 20ms 30ms 40ms 50ms // 10ms 20ms 30ms 40ms 50ms

View File

@ -269,7 +269,7 @@ class CGrannyLODController : public CGraphicBase
BOOL isModelInstance(); BOOL isModelInstance();
CGrannyModelInstance* GetModelInstance(); CGrannyModelInstance* GetModelInstance();
bool HaveBlendThing() { return 0 != GetModelInstance() ? GetModelInstance()->HaveBlendThing() : false; } // NOTE: GetModelInstance() == 0일 때 클라 크래쉬나는 문제 수정(2012. 05. 07) bool HaveBlendThing() { return 0 != GetModelInstance() ? GetModelInstance()->HaveBlendThing() : false; } // NOTE: GetModelInstance() == 0일 때 클라 크래쉬나는 문제 수정(2012. 05. 07)
protected: protected:
void SetCurrentModelInstance(CGrannyModelInstance * pgrnModelInstance); void SetCurrentModelInstance(CGrannyModelInstance * pgrnModelInstance);

View File

@ -238,7 +238,7 @@ bool CGrannyMaterial::CreateFromGrannyMaterialPointer(granny_material * pgrnMate
pgrnOpacityTexture = GrannyGetMaterialTextureByType(m_pgrnMaterial, GrannyOpacityTexture); pgrnOpacityTexture = GrannyGetMaterialTextureByType(m_pgrnMaterial, GrannyOpacityTexture);
} }
// Two-Side 렌더링이 필요한 지 검사 // Two-Side 렌더링이 필요한 지 검사
{ {
granny_int32 twoSided = 0; granny_int32 twoSided = 0;
granny_data_type_definition TwoSidedFieldType[] = granny_data_type_definition TwoSidedFieldType[] =
@ -262,7 +262,7 @@ bool CGrannyMaterial::CreateFromGrannyMaterialPointer(granny_material * pgrnMate
if (pgrnOpacityTexture) if (pgrnOpacityTexture)
m_roImage[1].SetPointer(__GetImagePointer(pgrnOpacityTexture->FromFileName)); m_roImage[1].SetPointer(__GetImagePointer(pgrnOpacityTexture->FromFileName));
// 오퍼시티가 있으면 블렌딩 메쉬 // 오퍼시티가 있으면 블렌딩 메쉬
if (!m_roImage[1].IsNull()) if (!m_roImage[1].IsNull())
m_eType = TYPE_BLEND_PNT; m_eType = TYPE_BLEND_PNT;
else else
@ -285,7 +285,7 @@ void CGrannyMaterial::__ApplyDiffuseRenderState()
if (m_bTwoSideRender) if (m_bTwoSideRender)
{ {
// -_-렌더링 프로세스가 좀 구려서... Save & Restore 하면 순서때문에 좀 꼬인다. 귀찮으니 Save & Restore 대신 따로 저장해 둠. // -_-렌더링 프로세스가 좀 구려서... Save & Restore 하면 순서때문에 좀 꼬인다. 귀찮으니 Save & Restore 대신 따로 저장해 둠.
m_dwLastCullRenderStateForTwoSideRendering = STATEMANAGER.GetRenderState(D3DRS_CULLMODE); m_dwLastCullRenderStateForTwoSideRendering = STATEMANAGER.GetRenderState(D3DRS_CULLMODE);
STATEMANAGER.SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE); STATEMANAGER.SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
} }
@ -511,7 +511,7 @@ DWORD CGrannyMaterialPalette::GetMaterialCount() const
/* /*
void CActorInstance::BeginSpecularRender() void CActorInstance::BeginSpecularRender()
{ {
// NOTE - Blending해서 찍는 부분은 Specular를 적용시키지 않는다 - [levites] // NOTE - Blending해서 찍는 부분은 Specular를 적용시키지 않는다 - [levites]
STATEMANAGER.SaveRenderState(D3DRS_ALPHABLENDENABLE, FALSE); STATEMANAGER.SaveRenderState(D3DRS_ALPHABLENDENABLE, FALSE);
STATEMANAGER.SetRenderState(D3DRS_TEXTUREFACTOR, D3DXCOLOR(1.0f, 1.0f, 1.0f, m_AddColor.r)); STATEMANAGER.SetRenderState(D3DRS_TEXTUREFACTOR, D3DXCOLOR(1.0f, 1.0f, 1.0f, m_AddColor.r));

View File

@ -159,7 +159,7 @@ bool CGrannyMesh::LoadTriGroupNodeList(CGrannyMaterialPalette& rkMtrlPal)
assert(m_triGroupNodes == NULL); assert(m_triGroupNodes == NULL);
int mtrlCount = m_pgrnMesh->MaterialBindingCount; int mtrlCount = m_pgrnMesh->MaterialBindingCount;
if (mtrlCount <= 0) // 천의 동굴 2층 크래쉬 발생 if (mtrlCount <= 0) // 천의 동굴 2층 크래쉬 발생
return true; return true;
int GroupNodeCount = GrannyGetMeshTriangleGroupCount(m_pgrnMesh); int GroupNodeCount = GrannyGetMeshTriangleGroupCount(m_pgrnMesh);
@ -199,7 +199,7 @@ bool CGrannyMesh::LoadTriGroupNodeList(CGrannyMaterialPalette& rkMtrlPal)
void CGrannyMesh::RebuildTriGroupNodeList() void CGrannyMesh::RebuildTriGroupNodeList()
{ {
assert(!"CGrannyMesh::RebuildTriGroupNodeList() - 왜 리빌드를 하는가- -?"); assert(!"CGrannyMesh::RebuildTriGroupNodeList() - \xBF\xD6 \xB8\xAE\xBA\xF4\xB5\xE5\xB8\xA6 \xC7\xCF\xB4\xC2\xB0\xA1- -?");
/* /*
int mtrlCount = m_pgrnMesh->MaterialBindingCount; int mtrlCount = m_pgrnMesh->MaterialBindingCount;
int GroupNodeCount = GrannyGetMeshTriangleGroupCount(m_pgrnMesh); int GroupNodeCount = GrannyGetMeshTriangleGroupCount(m_pgrnMesh);

View File

@ -155,7 +155,7 @@ bool CGrannyModel::LoadMeshs()
assert(m_meshs == NULL); assert(m_meshs == NULL);
assert(m_pgrnModel != NULL); assert(m_pgrnModel != NULL);
if (m_pgrnModel->MeshBindingCount <= 0) // 메쉬가 없는 모델 if (m_pgrnModel->MeshBindingCount <= 0) // 메쉬가 없는 모델
return true; return true;
granny_skeleton * pgrnSkeleton = m_pgrnModel->Skeleton; granny_skeleton * pgrnSkeleton = m_pgrnModel->Skeleton;

View File

@ -55,12 +55,12 @@ class CGrannyModelInstance : public CGraphicCollisionObject
void DeformNoSkin(const D3DXMATRIX * c_pWorldMatrix); void DeformNoSkin(const D3DXMATRIX * c_pWorldMatrix);
void Deform(const D3DXMATRIX * c_pWorldMatrix); void Deform(const D3DXMATRIX * c_pWorldMatrix);
// FIXME : 현재는 하드웨어의 한계로 2장의 텍스춰로 제한이 되어있는 상태이기에 이런 // FIXME : 현재는 하드웨어의 한계로 2장의 텍스춰로 제한이 되어있는 상태이기에 이런
// 불안정한 아키텍춰가 가능하지만, 궁극적인 방향은 (모델 텍스춰 전부) + (효과용 텍스춰) // 불안정한 아키텍춰가 가능하지만, 궁극적인 방향은 (모델 텍스춰 전부) + (효과용 텍스춰)
// 이런식의 자동 셋팅이 이뤄져야 되지 않나 생각합니다. - [levites] // 이런식의 자동 셋팅이 이뤄져야 되지 않나 생각합니다. - [levites]
// NOTE : 내부에 if문을 포함 시키기 보다는 조금은 번거롭지만 이렇게 함수 콜 자체를 분리 // NOTE : 내부에 if문을 포함 시키기 보다는 조금은 번거롭지만 이렇게 함수 콜 자체를 분리
// 시키는 것이 퍼포먼스 적인 측면에서는 더 나은 것 같습니다. - [levites] // 시키는 것이 퍼포먼스 적인 측면에서는 더 나은 것 같습니다. - [levites]
// NOTE : 건물은 무조건 OneTexture. 캐릭터는 경우에 따라 TwoTexture. // NOTE : 건물은 무조건 OneTexture. 캐릭터는 경우에 따라 TwoTexture.
void RenderWithOneTexture(); void RenderWithOneTexture();
void RenderWithTwoTexture(); void RenderWithTwoTexture();
void BlendRenderWithOneTexture(); void BlendRenderWithOneTexture();
@ -160,7 +160,7 @@ class CGrannyModelInstance : public CGraphicCollisionObject
// Granny Data // Granny Data
granny_model_instance * m_pgrnModelInstance; granny_model_instance * m_pgrnModelInstance;
//granny_world_pose * m_pgrnWorldPose; // 현재 월드 포즈 포인터 //granny_world_pose * m_pgrnWorldPose; // 현재 월드 포즈 포인터
granny_control * m_pgrnCtrl; granny_control * m_pgrnCtrl;
granny_animation * m_pgrnAni; granny_animation * m_pgrnAni;
@ -182,7 +182,7 @@ class CGrannyModelInstance : public CGraphicCollisionObject
CGrannyMaterialPalette m_kMtrlPal; CGrannyMaterialPalette m_kMtrlPal;
// WORK // WORK
granny_world_pose* m_pgrnWorldPoseReal; // 실제 메모리는 여기에 할당 granny_world_pose* m_pgrnWorldPoseReal; // 실제 메모리는 여기에 할당
std::vector<granny_mesh_binding*> m_vct_pgrnMeshBinding; std::vector<granny_mesh_binding*> m_vct_pgrnMeshBinding;
// Dynamic Vertex Buffer // Dynamic Vertex Buffer

View File

@ -239,7 +239,7 @@ void CGraphicThingInstance::DrawBoundBox()
D3DXVECTOR3 vtMax; D3DXVECTOR3 vtMax;
SetDiffuseColor(0.0f, 1.0f, 0.0f); SetDiffuseColor(0.0f, 1.0f, 0.0f);
// 캐릭터 꽉차는 바운딩 박스 // 캐릭터 꽉차는 바운딩 박스
//GetBoundBox(&vtMin, &vtMax); //GetBoundBox(&vtMin, &vtMax);
//DrawLineCube(vtMin.x, vtMin.y, vtMin.z, vtMax.x, vtMax.y, vtMax.z); //DrawLineCube(vtMin.x, vtMin.y, vtMin.z, vtMax.x, vtMax.y, vtMax.z);
//const CThing::TMeshVector& rmeshVector=mc_pModel->meshVector; //const CThing::TMeshVector& rmeshVector=mc_pModel->meshVector;

View File

@ -161,7 +161,7 @@ void CGrannyModelInstance::__CreateMeshMatrices()
{ {
assert(m_pModel != NULL); assert(m_pModel != NULL);
if (m_pModel->GetMeshCount() <= 0) // 메쉬가 없는 (카메라 같은) 모델도 간혹 있다.. if (m_pModel->GetMeshCount() <= 0) // 메쉬가 없는 (카메라 같은) 모델도 간혹 있다..
return; return;
int meshCount = m_pModel->GetMeshCount(); int meshCount = m_pModel->GetMeshCount();
@ -274,14 +274,14 @@ const float * CGrannyModelInstance::GetBoneMatrixPointer(int iBone) const
const float * CGrannyModelInstance::GetCompositeBoneMatrixPointer(int iBone) const const float * CGrannyModelInstance::GetCompositeBoneMatrixPointer(int iBone) const
{ {
// NOTE : GrannyGetWorldPose4x4는 스케일 값등이 잘못나올 수 있음.. 그래니가 속도를 위해 // NOTE : GrannyGetWorldPose4x4는 스케일 값등이 잘못나올 수 있음.. 그래니가 속도를 위해
// GrannyGetWorldPose4x4에 모든 matrix 원소를 제 값으로 넣지 않음 // GrannyGetWorldPose4x4에 모든 matrix 원소를 제 값으로 넣지 않음
return GrannyGetWorldPoseComposite4x4(__GetWorldPosePtr(), iBone); return GrannyGetWorldPoseComposite4x4(__GetWorldPosePtr(), iBone);
} }
void CGrannyModelInstance::ReloadTexture() void CGrannyModelInstance::ReloadTexture()
{ {
assert("현재 사용하지 않음 - CGrannyModelInstance::ReloadTexture()"); assert("\xC7\xF6\xC0\xE7 \xBB\xE7\xBF\xEB\xC7\xCF\xC1\xF6 \xBE\xCA\xC0\xBD - CGrannyModelInstance::ReloadTexture()");
/* /*
assert(m_pModel != NULL); assert(m_pModel != NULL);
const CGrannyMaterialPalette & c_rGrannyMaterialPalette = m_pModel->GetMaterialPalette(); const CGrannyMaterialPalette & c_rGrannyMaterialPalette = m_pModel->GetMaterialPalette();

View File

@ -112,7 +112,7 @@ void CGrannyModelInstance::ChangeMotionPointer(const CGrannyMotion* pMotion, int
if (!pgrnModelInstance) if (!pgrnModelInstance)
return; return;
// 보간 되는 앞부분을 스킵 하기 위해 LocalTime 을 어느 정도 무시한다. - [levites] // 보간 되는 앞부분을 스킵 하기 위해 LocalTime 을 어느 정도 무시한다. - [levites]
float fSkipTime = 0.3f; float fSkipTime = 0.3f;
float localTime = GetLocalTime() - fSkipTime; float localTime = GetLocalTime() - fSkipTime;

View File

@ -47,7 +47,7 @@ void CGrannyModelInstance::DeformNoSkin(const D3DXMATRIX * c_pWorldMatrix)
// With One Texture // With One Texture
void CGrannyModelInstance::RenderWithOneTexture() void CGrannyModelInstance::RenderWithOneTexture()
{ {
// FIXME : Deform, Render, BlendRender를 묶어 상위에서 걸러주는 것이 더 나을 듯 - [levites] // FIXME : Deform, Render, BlendRender를 묶어 상위에서 걸러주는 것이 더 나을 듯 - [levites]
if (IsEmpty()) if (IsEmpty())
return; return;
@ -99,7 +99,7 @@ void CGrannyModelInstance::BlendRenderWithOneTexture()
// With Two Texture // With Two Texture
void CGrannyModelInstance::RenderWithTwoTexture() void CGrannyModelInstance::RenderWithTwoTexture()
{ {
// FIXME : Deform, Render, BlendRender를 묶어 상위에서 걸러주는 것이 더 나을 듯 - [levites] // FIXME : Deform, Render, BlendRender를 묶어 상위에서 걸러주는 것이 더 나을 듯 - [levites]
if (IsEmpty()) if (IsEmpty())
return; return;

View File

@ -1,6 +1,6 @@
#pragma once #pragma once
#pragma warning(disable:4786) // character 255 넘어가는거 끄기 #pragma warning(disable:4786) // character 255 넘어가는거 끄기
//#include <crtdbg.h> //#include <crtdbg.h>
#include <granny/granny.h> #include <granny/granny.h>

View File

@ -342,8 +342,8 @@ bool CGraphicThingInstance::GetBonePosition(int iModelIndex, int iBoneIndex, flo
*pfz = pfMatrix[14]; *pfz = pfMatrix[14];
return true; return true;
} }
//iSkelInstance 가 있으면 기본 본에 Link(본이 붙는것)시키고, //iSkelInstance 가 있으면 기본 본에 Link(본이 붙는것)시키고,
//없으면 기본 본에 attach(좌표만 가져다 쓰는것) 됩니다. //없으면 기본 본에 attach(좌표만 가져다 쓰는것) 됩니다.
bool CGraphicThingInstance::SetModelInstance(int iDstModelInstance, int iSrcModelThing, int iSrcModel,int iSkelInstance) bool CGraphicThingInstance::SetModelInstance(int iDstModelInstance, int iSrcModelThing, int iSrcModel,int iSkelInstance)
{ {
if (!CheckModelInstanceIndex(iDstModelInstance)) if (!CheckModelInstanceIndex(iDstModelInstance))
@ -735,7 +735,7 @@ void CGraphicThingInstance::UpdateLODLevel()
const D3DXVECTOR3 & c_rv3CameraPosition = pcurCamera->GetEye(); const D3DXVECTOR3 & c_rv3CameraPosition = pcurCamera->GetEye();
const D3DXVECTOR3 & c_v3Position = GetPosition(); const D3DXVECTOR3 & c_v3Position = GetPosition();
// NOTE : 중심으로부터의 거리 계산에 z값 차이는 사용하지 않는다. - [levites] // NOTE : 중심으로부터의 거리 계산에 z값 차이는 사용하지 않는다. - [levites]
CGrannyLODController::FUpdateLODLevel update; CGrannyLODController::FUpdateLODLevel update;
update.fDistanceFromCenter = sqrtf((c_rv3TargetPosition.x - c_v3Position.x) * (c_rv3TargetPosition.x - c_v3Position.x) + update.fDistanceFromCenter = sqrtf((c_rv3TargetPosition.x - c_v3Position.x) * (c_rv3TargetPosition.x - c_v3Position.x) +
(c_rv3TargetPosition.y - c_v3Position.y) * (c_rv3TargetPosition.y - c_v3Position.y)); (c_rv3TargetPosition.y - c_v3Position.y) * (c_rv3TargetPosition.y - c_v3Position.y));

View File

@ -34,7 +34,7 @@ class CGraphicThingInstance : public CGraphicObjectInstance
void UpdateLODLevel(); void UpdateLODLevel();
void UpdateTime(); void UpdateTime();
void DeformAll(); // ¸ðµç LOD µðÆû void DeformAll(); // 모든 LOD 디폼
bool LessRenderOrder(CGraphicThingInstance* pkThingInst); bool LessRenderOrder(CGraphicThingInstance* pkThingInst);

View File

@ -9,11 +9,11 @@
struct TGA_HEADER struct TGA_HEADER
{ {
char idLen; // 0 char idLen; // 0
char palType; // 파레트있으면 1, 없음 0 char palType; // 파레트있으면 1, 없음 0
char imgType; // 파레트있으면 1, 없음 2 char imgType; // 파레트있으면 1, 없음 2
WORD colorBegin; // 0 WORD colorBegin; // 0
WORD colorCount; // 파레트 있으면 256, 없음 0 WORD colorCount; // 파레트 있으면 256, 없음 0
char palEntrySize; // 파레트 있으면 24, 없음 0 char palEntrySize; // 파레트 있으면 24, 없음 0
WORD left; WORD left;
WORD top; WORD top;
WORD width; WORD width;

View File

@ -33,7 +33,7 @@ void CTGAImage::Create(int width, int height)
m_Header.width = (short) width; m_Header.width = (short) width;
m_Header.height = (short) height; m_Header.height = (short) height;
m_Header.colorBits = 32; m_Header.colorBits = 32;
m_Header.desc = 0x08; // alpha channel 있음 m_Header.desc = 0x08; // alpha channel 있음
CImage::Create(width, height); CImage::Create(width, height);
} }
@ -54,7 +54,7 @@ bool CTGAImage::LoadFromMemory(int iSize, const BYTE * c_pbMem)
switch (m_Header.imgType) switch (m_Header.imgType)
{ {
case 3: // 알파만 있는 것 (1bytes per pixel, 거의 안쓰임) case 3: // 알파만 있는 것 (1bytes per pixel, 거의 안쓰임)
{ {
for (i = 0; i < hxw; ++i) for (i = 0; i < hxw; ++i)
{ {
@ -64,7 +64,7 @@ bool CTGAImage::LoadFromMemory(int iSize, const BYTE * c_pbMem)
} }
break; break;
case 2: // 압축 안된 TGA case 2: // 압축 안된 TGA
{ {
if (m_Header.colorBits == 16) // 16bit if (m_Header.colorBits == 16) // 16bit
{ {
@ -112,7 +112,7 @@ bool CTGAImage::LoadFromMemory(int iSize, const BYTE * c_pbMem)
} }
break; break;
case 10: // 압축 된 TGA (RLE) case 10: // 압축 된 TGA (RLE)
{ {
BYTE rle; BYTE rle;
@ -123,7 +123,7 @@ bool CTGAImage::LoadFromMemory(int iSize, const BYTE * c_pbMem)
{ {
rle = (BYTE) *(c_pbMem++); --iSize; rle = (BYTE) *(c_pbMem++); --iSize;
if (rle < 0x80) // 압축 안된 곳 if (rle < 0x80) // 압축 안된 곳
{ {
rle++; rle++;
@ -146,7 +146,7 @@ bool CTGAImage::LoadFromMemory(int iSize, const BYTE * c_pbMem)
} }
else else
{ {
// 압축 된 곳 // 압축 된 곳
rle -= 127; rle -= 127;
b = (BYTE) *(c_pbMem++); --iSize; b = (BYTE) *(c_pbMem++); --iSize;
@ -315,7 +315,7 @@ bool CTGAImage::SaveToDiskFile(const char* c_szFileName)
fwrite(&m_Header, 18, 1, fp); fwrite(&m_Header, 18, 1, fp);
if (m_Header.imgType == 10) // RLE 압축으로 저장 if (m_Header.imgType == 10) // RLE 압축으로 저장
{ {
DWORD * data = GetBasePointer(); DWORD * data = GetBasePointer();

View File

@ -61,7 +61,7 @@ bool CAttributeData::OnLoad(int /*iSize*/, const void * c_pvBuf)
{ {
if (!c_pvBuf) if (!c_pvBuf)
{ {
// NOTE: 파일이 존재하지 않으면 다른곳에서 그래픽 모델을 기반으로 충돌 데이터를 생성하니 리소스를 파괴하지 않고 유지시킴. // NOTE: 파일이 존재하지 않으면 다른곳에서 그래픽 모델을 기반으로 충돌 데이터를 생성하니 리소스를 파괴하지 않고 유지시킴.
return true; return true;
} }

View File

@ -15,7 +15,7 @@ class CAttributeInstance
const char * GetDataFileName() const; const char * GetDataFileName() const;
// NOTE : Object 전용 // NOTE : Object 전용
void SetObjectPointer(CAttributeData * pAttributeData); void SetObjectPointer(CAttributeData * pAttributeData);
void RefreshObject(const D3DXMATRIX & c_rmatGlobal); void RefreshObject(const D3DXMATRIX & c_rmatGlobal);
CAttributeData * GetObjectPointer() const; CAttributeData * GetObjectPointer() const;

View File

@ -438,7 +438,7 @@ void CCamera::RotateEyeAroundTarget(float fPitchDegree, float fRollDegree)
D3DXMATRIX matRot, matRotPitch, matRotRoll; D3DXMATRIX matRot, matRotPitch, matRotRoll;
// 머리위로 넘어가기 막기... // 머리위로 넘어가기 막기...
if (m_fPitch + fPitchDegree > 80.0f) if (m_fPitch + fPitchDegree > 80.0f)
{ {
fPitchDegree = 80.0f - m_fPitch; fPitchDegree = 80.0f - m_fPitch;
@ -593,7 +593,7 @@ bool CCameraManager::isCurrentCamera(unsigned char ucCameraNum)
return false; return false;
} }
// 잡스러운 함수들... // 잡스러운 함수들...
bool CCameraManager::AddCamera(unsigned char ucCameraNum) bool CCameraManager::AddCamera(unsigned char ucCameraNum)
{ {
if(m_CameraMap.end() != m_CameraMap.find(ucCameraNum)) if(m_CameraMap.end() != m_CameraMap.find(ucCameraNum))

View File

@ -51,8 +51,8 @@ class CCamera
void SetResistance(float fResistance); void SetResistance(float fResistance);
private: private:
const CCamera & operator = (const CCamera &) ; // 지원하지 않음 const CCamera & operator = (const CCamera &) ; // 지원하지 않음
CCamera (const CCamera & ) ; //지원하지 않음 CCamera (const CCamera & ) ; //지원하지 않음
// Camera Update // Camera Update
eCameraState m_eCameraState; eCameraState m_eCameraState;
@ -85,14 +85,14 @@ class CCamera
D3DXMATRIX m_matInverseView; D3DXMATRIX m_matInverseView;
D3DXMATRIX m_matBillboard; // Special matrix for billboarding effects D3DXMATRIX m_matBillboard; // Special matrix for billboarding effects
//추가분 //추가분
float m_fPitch; float m_fPitch;
float m_fRoll; float m_fRoll;
float m_fDistance; float m_fDistance;
// 카메라 AI를 위한 Ray 들 // 카메라 AI를 위한 Ray 들
// 카메라를 둘러싼 Ray // 카메라를 둘러싼 Ray
CRay m_kCameraBottomToTerrainRay; CRay m_kCameraBottomToTerrainRay;
CRay m_kCameraFrontToTerrainRay; CRay m_kCameraFrontToTerrainRay;
CRay m_kCameraBackToTerrainRay; CRay m_kCameraBackToTerrainRay;
@ -124,14 +124,14 @@ class CCamera
bool m_bDrag; bool m_bDrag;
// protected: // protected:
// 물리 // 물리
D3DXVECTOR3 m_v3AngularAcceleration; D3DXVECTOR3 m_v3AngularAcceleration;
D3DXVECTOR3 m_v3AngularVelocity; D3DXVECTOR3 m_v3AngularVelocity;
float m_fResistance; float m_fResistance;
public: public:
////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////
// 물리 // 물리
////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////
void SetAngularAcceleration(D3DXVECTOR3 v3AngularAcceleration) { m_v3AngularAcceleration = v3AngularAcceleration; } void SetAngularAcceleration(D3DXVECTOR3 v3AngularAcceleration) { m_v3AngularAcceleration = v3AngularAcceleration; }
@ -185,7 +185,7 @@ class CCamera
float GetRoll() const { return m_fRoll; } float GetRoll() const { return m_fRoll; }
float GetDistance() const { return m_fDistance; } float GetDistance() const { return m_fDistance; }
void Pitch(const float fPitchDelta); //돌아가는 각도를 넣는다. void Pitch(const float fPitchDelta); //돌아가는 각도를 넣는다.
void Roll(const float fRollDelta); void Roll(const float fRollDelta);
void SetDistance(const float fdistance); void SetDistance(const float fdistance);
@ -193,35 +193,35 @@ class CCamera
// camera movement // camera movement
////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////
// 말그대로 이동... 카메라 위치와 타겟 위치가 모두 달라진다. // 말그대로 이동... 카메라 위치와 타겟 위치가 모두 달라진다.
void Move(const D3DXVECTOR3 & v3Displacement); void Move(const D3DXVECTOR3 & v3Displacement);
// 줌.. 카메라 위치만 이동.. 타겟 위치는 고정... // 줌.. 카메라 위치만 이동.. 타겟 위치는 고정...
void Zoom(float fRatio); void Zoom(float fRatio);
// 뷰 방향으로 이동.. 타겟위치가 달라지므로 줌과는 다르다... // 뷰 방향으로 이동.. 타겟위치가 달라지므로 줌과는 다르다...
void MoveAlongView(float fDistance); void MoveAlongView(float fDistance);
// 카메라 옆 방향으로 이동.. // 카메라 옆 방향으로 이동..
void MoveAlongCross(float fDistance); void MoveAlongCross(float fDistance);
// 카메라 업벡터 방향으로 이동... // 카메라 업벡터 방향으로 이동...
void MoveAlongUp(float fDistance); void MoveAlongUp(float fDistance);
// 카메라 옆 방향으로 이동... MoveAlongCross과 동일.. // 카메라 옆 방향으로 이동... MoveAlongCross과 동일..
void MoveLateral(float fDistance); void MoveLateral(float fDistance);
// 뷰 방향의 Z 성분을 무시한 XY평면 방향으로 이동.. // 뷰 방향의 Z 성분을 무시한 XY평면 방향으로 이동..
void MoveFront(float fDistance); void MoveFront(float fDistance);
// Z방향(연직 방향)으로 이동... // Z방향(연직 방향)으로 이동...
void MoveVertical(float fDistance); void MoveVertical(float fDistance);
// //카메라 위치는 고정시키고 머리만 든다. 타겟이 달라지겠죠? // //카메라 위치는 고정시키고 머리만 든다. 타겟이 달라지겠죠?
// //회전각을 라디안이 아닌 "도(Degree)"로 넣는다. // //회전각을 라디안이 아닌 "도(Degree)"로 넣는다.
// void RotateUpper(float fDegree); // void RotateUpper(float fDegree);
// 타겟 중심으로 돈다. Eterlib의 SetAroundCamera의 기능과 유사... // 타겟 중심으로 돈다. Eterlib의 SetAroundCamera의 기능과 유사...
// fPitchDegree는 수평(0도)로부터 아랫쪽으로 꺽어지는 각도... // fPitchDegree는 수평(0도)로부터 아랫쪽으로 꺽어지는 각도...
// fRollDegree는 타겟 중심으로 시계방향으로 도는 각도... // fRollDegree는 타겟 중심으로 시계방향으로 도는 각도...
void RotateEyeAroundTarget(float fPitchDegree, float fRollDegree); void RotateEyeAroundTarget(float fPitchDegree, float fRollDegree);
// 도는 중심점을 따로 지정 그 점을 중심으로 돈다. 타겟 점도 달라지겠죠? // 도는 중심점을 따로 지정 그 점을 중심으로 돈다. 타겟 점도 달라지겠죠?
void RotateEyeAroundPoint(const D3DXVECTOR3 & v3Point, float fPitchDegree, float fRollDegree); void RotateEyeAroundPoint(const D3DXVECTOR3 & v3Point, float fPitchDegree, float fRollDegree);
protected: protected:

View File

@ -230,7 +230,7 @@ bool CSphereCollisionInstance::OnMovementCollisionDynamicSphere(const CDynamicSp
{ {
if (square_distance_between_linesegment_and_point(s.v3LastPosition,s.v3Position,m_attribute.v3Position) < (m_attribute.fRadius+s.fRadius)*(m_attribute.fRadius+s.fRadius)) if (square_distance_between_linesegment_and_point(s.v3LastPosition,s.v3Position,m_attribute.v3Position) < (m_attribute.fRadius+s.fRadius)*(m_attribute.fRadius+s.fRadius))
{ {
// NOTE : 거리가 가까워 졌을때만.. - [levites] // NOTE : 거리가 가까워 졌을때만.. - [levites]
if (GetVector3Distance(s.v3Position, m_attribute.v3Position) < if (GetVector3Distance(s.v3Position, m_attribute.v3Position) <
GetVector3Distance(s.v3LastPosition, m_attribute.v3Position)) GetVector3Distance(s.v3LastPosition, m_attribute.v3Position))
return true; return true;
@ -321,7 +321,7 @@ bool CPlaneCollisionInstance::OnMovementCollisionDynamicSphere(const CDynamicSph
if (D3DXVec3Dot(&v3QuadPosition2, &m_attribute.v3InsideVector[2]) > - s.fRadius/*0.0f*/) if (D3DXVec3Dot(&v3QuadPosition2, &m_attribute.v3InsideVector[2]) > - s.fRadius/*0.0f*/)
if (D3DXVec3Dot(&v3QuadPosition2, &m_attribute.v3InsideVector[3]) > - s.fRadius/*0.0f*/) if (D3DXVec3Dot(&v3QuadPosition2, &m_attribute.v3InsideVector[3]) > - s.fRadius/*0.0f*/)
{ {
// NOTE : 거리가 가까워 졌을때만.. - [levites] // NOTE : 거리가 가까워 졌을때만.. - [levites]
if (fabs(D3DXVec3Dot(&(s.v3Position - m_attribute.v3Position), &m_attribute.v3Normal)) < if (fabs(D3DXVec3Dot(&(s.v3Position - m_attribute.v3Position), &m_attribute.v3Normal)) <
fabs(D3DXVec3Dot(&(s.v3LastPosition - m_attribute.v3Position), &m_attribute.v3Normal))) fabs(D3DXVec3Dot(&(s.v3LastPosition - m_attribute.v3Position), &m_attribute.v3Normal)))
return true; return true;
@ -471,14 +471,14 @@ bool CCylinderCollisionInstance::OnMovementCollisionDynamicSphere(const CDynamic
{ {
if (CollideCylinderVSDynamicSphere(m_attribute, s)) if (CollideCylinderVSDynamicSphere(m_attribute, s))
{ {
// NOTE : 거리가 가까워 졌을때만.. - [levites] // NOTE : 거리가 가까워 졌을때만.. - [levites]
if (GetVector3Distance(s.v3Position, m_attribute.v3Position) < if (GetVector3Distance(s.v3Position, m_attribute.v3Position) <
GetVector3Distance(s.v3LastPosition, m_attribute.v3Position)) GetVector3Distance(s.v3LastPosition, m_attribute.v3Position))
return true; return true;
} }
// NOTE : 이동 거리가 클 경우 빈틈없이 (원 크기 단위로) 이동하면서 전부 체크 해 본다 - [levites] // NOTE : 이동 거리가 클 경우 빈틈없이 (원 크기 단위로) 이동하면서 전부 체크 해 본다 - [levites]
D3DXVECTOR3 v3Distance = s.v3Position - s.v3LastPosition; D3DXVECTOR3 v3Distance = s.v3Position - s.v3LastPosition;
float fDistance = D3DXVec3Length(&v3Distance); float fDistance = D3DXVec3Length(&v3Distance);
if (s.fRadius<=0.0001f) if (s.fRadius<=0.0001f)

View File

@ -27,10 +27,10 @@ class CColorTransitionHelper
bool isTransitionStarted() { return m_bTransitionStarted; } bool isTransitionStarted() { return m_bTransitionStarted; }
private: private:
D3DCOLOR m_dwCurColor; // 현재 색 D3DCOLOR m_dwCurColor; // 현재 색
DWORD m_dwStartTime; // 바뀌기 시작하는 시간 DWORD m_dwStartTime; // 바뀌기 시작하는 시간
DWORD m_dwDuration; // 얼마 동안에 바뀌는가? DWORD m_dwDuration; // 얼마 동안에 바뀌는가?
bool m_bTransitionStarted; bool m_bTransitionStarted;

View File

@ -93,7 +93,7 @@ void CCullingManager::Reset()
void CCullingManager::Update() void CCullingManager::Update()
{ {
// TODO : update each object // TODO : update each object
// 하지말고 각자 하게 해보자 // 하지말고 각자 하게 해보자
//DWORD time = ELTimer_GetMSec(); //DWORD time = ELTimer_GetMSec();
//Reset(); //Reset();

View File

@ -42,15 +42,15 @@ protected:
D3DXPLANE m_v4FrontPlane; D3DXPLANE m_v4FrontPlane;
D3DXPLANE m_v4BackPlane; D3DXPLANE m_v4BackPlane;
// 개수 // 개수
DWORD m_dwVertexCount; DWORD m_dwVertexCount;
DWORD m_dwPrimitiveCount; DWORD m_dwPrimitiveCount;
// 버택스 버퍼와 인댁스 버퍼 // 버택스 버퍼와 인댁스 버퍼
// CGraphicVertexBuffer m_GraphicVertexBuffer; // CGraphicVertexBuffer m_GraphicVertexBuffer;
// CGraphicIndexBuffer m_GraphicIndexBuffer; // CGraphicIndexBuffer m_GraphicIndexBuffer;
// 버택스 버퍼와 인댁스 버퍼 대신에 배열 만들고 DrawIndexedPrimitiveUP로 그리자. // 버택스 버퍼와 인댁스 버퍼 대신에 배열 만들고 DrawIndexedPrimitiveUP로 그리자.
typedef struct typedef struct
{ {
WORD m_wMinIndex; WORD m_wMinIndex;

View File

@ -79,7 +79,7 @@ void CFileLoaderThread::Shutdown()
} }
while (!bRet); while (!bRet);
WaitForSingleObject(m_hThread, 10000); // 쓰레드가 종료 되기를 10초 기다림 WaitForSingleObject(m_hThread, 10000); // 쓰레드가 종료 되기를 10초 기다림
} }
UINT CFileLoaderThread::Execute(void * /*pvArg*/) UINT CFileLoaderThread::Execute(void * /*pvArg*/)

View File

@ -75,13 +75,13 @@ int CGraphicBase::ms_iWavingPower;
DWORD CGraphicBase::ms_dwFlashingEndTime; DWORD CGraphicBase::ms_dwFlashingEndTime;
D3DXCOLOR CGraphicBase::ms_FlashingColor; D3DXCOLOR CGraphicBase::ms_FlashingColor;
// Terrain picking용 Ray... CCamera 이용하는 버전.. 기존의 Ray와 통합 필요... // Terrain picking용 Ray... CCamera 이용하는 버전.. 기존의 Ray와 통합 필요...
CRay CGraphicBase::ms_Ray; CRay CGraphicBase::ms_Ray;
bool CGraphicBase::ms_bSupportDXT = true; bool CGraphicBase::ms_bSupportDXT = true;
bool CGraphicBase::ms_isLowTextureMemory = false; bool CGraphicBase::ms_isLowTextureMemory = false;
bool CGraphicBase::ms_isHighTextureMemory = false; bool CGraphicBase::ms_isHighTextureMemory = false;
// 2004.11.18.myevan.DynamicVertexBuffer로 교체 // 2004.11.18.myevan.DynamicVertexBuffer로 교체
/* /*
std::vector<TIndex> CGraphicBase::ms_lineIdxVector; std::vector<TIndex> CGraphicBase::ms_lineIdxVector;
std::vector<TIndex> CGraphicBase::ms_lineTriIdxVector; std::vector<TIndex> CGraphicBase::ms_lineTriIdxVector;

View File

@ -230,7 +230,7 @@ class CGraphicBase
void UpdatePipeLineMatrix(); void UpdatePipeLineMatrix();
protected: protected:
// 각종 D3DX Mesh 들 (컬루젼 데이터 등을 표시활 때 쓴다) // 각종 D3DX Mesh 들 (컬루젼 데이터 등을 표시활 때 쓴다)
static LPD3DXMESH ms_lpSphereMesh; static LPD3DXMESH ms_lpSphereMesh;
static LPD3DXMESH ms_lpCylinderMesh; static LPD3DXMESH ms_lpCylinderMesh;
@ -274,7 +274,7 @@ class CGraphicBase
static float ms_fNearY; static float ms_fNearY;
static float ms_fFarY; static float ms_fFarY;
// 2004.11.18.myevan.DynamicVertexBuffer로 교체 // 2004.11.18.myevan.DynamicVertexBuffer로 교체
/* /*
static std::vector<TIndex> ms_lineIdxVector; static std::vector<TIndex> ms_lineIdxVector;
static std::vector<TIndex> ms_lineTriIdxVector; static std::vector<TIndex> ms_lineTriIdxVector;
@ -292,7 +292,7 @@ class CGraphicBase
static DWORD ms_dwFlashingEndTime; static DWORD ms_dwFlashingEndTime;
static D3DXCOLOR ms_FlashingColor; static D3DXCOLOR ms_FlashingColor;
// Terrain picking용 Ray... CCamera 이용하는 버전.. 기존의 Ray와 통합 필요... // Terrain picking용 Ray... CCamera 이용하는 버전.. 기존의 Ray와 통합 필요...
static CRay ms_Ray; static CRay ms_Ray;
// //

View File

@ -18,8 +18,8 @@ class CGraphicCollisionObject : public CGraphicBase
bool IntersectSphere(const D3DXVECTOR3 & c_rv3Position, float fRadius, const D3DXVECTOR3 & c_rv3RayOriginal, const D3DXVECTOR3 & c_rv3RayDirection); bool IntersectSphere(const D3DXVECTOR3 & c_rv3Position, float fRadius, const D3DXVECTOR3 & c_rv3RayOriginal, const D3DXVECTOR3 & c_rv3RayDirection);
bool IntersectCylinder(const D3DXVECTOR3 & c_rv3Position, float fRadius, float fHeight, const D3DXVECTOR3 & c_rv3RayOriginal, const D3DXVECTOR3 & c_rv3RayDirection); bool IntersectCylinder(const D3DXVECTOR3 & c_rv3Position, float fRadius, float fHeight, const D3DXVECTOR3 & c_rv3RayOriginal, const D3DXVECTOR3 & c_rv3RayDirection);
// NOTE : ms_vtPickRayOrig와 ms_vtPickRayDir를 CGraphicBGase가 가지고 있는데 // NOTE : ms_vtPickRayOrig와 ms_vtPickRayDir를 CGraphicBGase가 가지고 있는데
// 굳이 인자로 넣어줘야 하는 이유가 있는가? Customize를 위해서? - [levites] // 굳이 인자로 넣어줘야 하는 이유가 있는가? Customize를 위해서? - [levites]
bool IntersectSphere(const D3DXVECTOR3 & c_rv3Position, float fRadius); bool IntersectSphere(const D3DXVECTOR3 & c_rv3Position, float fRadius);
bool IntersectCylinder(const D3DXVECTOR3 & c_rv3Position, float fRadius, float fHeight); bool IntersectCylinder(const D3DXVECTOR3 & c_rv3Position, float fRadius, float fHeight);
}; };

View File

@ -183,7 +183,7 @@ static DWORD s_MaxTextureWidth, s_MaxTextureHeight;
BOOL EL3D_ConfirmDevice(D3DCAPS9& rkD3DCaps, UINT uBehavior, D3DFORMAT /*eD3DFmt*/) BOOL EL3D_ConfirmDevice(D3DCAPS9& rkD3DCaps, UINT uBehavior, D3DFORMAT /*eD3DFmt*/)
{ {
// PUREDEVICE는 GetTransform / GetViewport 등이 되지 않는다. // PUREDEVICE는 GetTransform / GetViewport 등이 되지 않는다.
if (uBehavior & D3DCREATE_PUREDEVICE) if (uBehavior & D3DCREATE_PUREDEVICE)
return FALSE; return FALSE;
@ -369,7 +369,7 @@ RETRY:
ms_iD3DAdapterInfo, ms_iD3DAdapterInfo,
D3DDEVTYPE_HAL, D3DDEVTYPE_HAL,
hWnd, hWnd,
// 2004. 1. 9 myevan 버텍스 프로세싱 방식 자동 선택 추가 // 2004. 1. 9 myevan 버텍스 프로세싱 방식 자동 선택 추가
pkD3DModeInfo->m_dwD3DBehavior, pkD3DModeInfo->m_dwD3DBehavior,
&ms_d3dPresentParameter, &ms_d3dPresentParameter,
&ms_lpd3dDevice))) &ms_lpd3dDevice)))
@ -393,7 +393,7 @@ RETRY:
if (ErrorCorrection) if (ErrorCorrection)
return CREATE_DEVICE; return CREATE_DEVICE;
// 2004. 1. 9 myevan 큰의미 없는 코드인듯.. 에러나면 표시하고 종료하자 // 2004. 1. 9 myevan 큰의미 없는 코드인듯.. 에러나면 표시하고 종료하자
iReflashRate = 0; iReflashRate = 0;
++ErrorCorrection; ++ErrorCorrection;
iRet = CREATE_REFRESHRATE; iRet = CREATE_REFRESHRATE;

View File

@ -23,8 +23,8 @@ public:
CREATE_GET_DEVICE_CAPS2 = (1 << 3), CREATE_GET_DEVICE_CAPS2 = (1 << 3),
CREATE_DEVICE = (1 << 4), CREATE_DEVICE = (1 << 4),
CREATE_REFRESHRATE = (1 << 5), CREATE_REFRESHRATE = (1 << 5),
CREATE_ENUM = (1 << 6), // 2003. 01. 09. myevan 모드 리스트 얻기 실패 CREATE_ENUM = (1 << 6), // 2003. 01. 09. myevan 모드 리스트 얻기 실패
CREATE_DETECT = (1 << 7), // 2003. 01. 09. myevan 모드 선택 실패 CREATE_DETECT = (1 << 7), // 2003. 01. 09. myevan 모드 선택 실패
CREATE_NO_TNL = (1 << 8), CREATE_NO_TNL = (1 << 8),
CREATE_BAD_DRIVER = (1 << 9), CREATE_BAD_DRIVER = (1 << 9),
CREATE_FORMAT = (1 << 10), CREATE_FORMAT = (1 << 10),

View File

@ -116,7 +116,7 @@ void CGraphicExpandedImageInstance::OnRender()
break; break;
} }
// 2004.11.18.myevan.ctrl+alt+del 반복 사용시 튕기는 문제 // 2004.11.18.myevan.ctrl+alt+del 반복 사용시 튕기는 문제
if (CGraphicBase::SetPDTStream(vertices, 4)) if (CGraphicBase::SetPDTStream(vertices, 4))
{ {
CGraphicBase::SetDefaultIndexBuffer(CGraphicBase::DEFAULT_IB_FILL_RECT); CGraphicBase::SetDefaultIndexBuffer(CGraphicBase::DEFAULT_IB_FILL_RECT);

View File

@ -213,7 +213,7 @@ CGraphicFontTexture::TCharacterInfomation* CGraphicFontTexture::UpdateCharacterI
wchar_t keyValue = code.second; wchar_t keyValue = code.second;
if (keyValue == 0x08) if (keyValue == 0x08)
keyValue = L' '; // 탭은 공백으로 바꾼다 (아랍 출력시 탭 사용: NAME:\tTEXT -> TEXT\t:NAME 로 전환됨 ) keyValue = L' '; // 탭은 공백으로 바꾼다 (아랍 출력시 탭 사용: NAME:\tTEXT -> TEXT\t:NAME 로 전환됨 )
ABCFLOAT stABC; ABCFLOAT stABC;
SIZE size; SIZE size;

View File

@ -68,7 +68,7 @@ bool CGraphicImage::OnLoad(int iSize, const void * c_pvBuf)
m_imageTexture.SetFileName(CResource::GetFileName()); m_imageTexture.SetFileName(CResource::GetFileName());
// 특정 컴퓨터에서 Unknown으로 '안'하면 튕기는 현상이 있음-_-; -비엽 // 특정 컴퓨터에서 Unknown으로 '안'하면 튕기는 현상이 있음-_-; -비엽
if (!m_imageTexture.CreateFromMemoryFile(iSize, c_pvBuf, D3DFMT_UNKNOWN, m_dwFilter)) if (!m_imageTexture.CreateFromMemoryFile(iSize, c_pvBuf, D3DFMT_UNKNOWN, m_dwFilter))
return false; return false;

View File

@ -83,7 +83,7 @@ void CGraphicImageInstance::OnRender()
vertices[3].texCoord = TTextureCoordinate(eu, ev); vertices[3].texCoord = TTextureCoordinate(eu, ev);
vertices[3].diffuse = m_DiffuseColor; vertices[3].diffuse = m_DiffuseColor;
// 2004.11.18.myevan.ctrl+alt+del 반복 사용시 튕기는 문제 // 2004.11.18.myevan.ctrl+alt+del 반복 사용시 튕기는 문제
if (CGraphicBase::SetPDTStream(vertices, 4)) if (CGraphicBase::SetPDTStream(vertices, 4))
{ {
CGraphicBase::SetDefaultIndexBuffer(CGraphicBase::DEFAULT_IB_FILL_RECT); CGraphicBase::SetDefaultIndexBuffer(CGraphicBase::DEFAULT_IB_FILL_RECT);
@ -207,7 +207,7 @@ void CGraphicImageInstance::Initialize()
void CGraphicImageInstance::Destroy() void CGraphicImageInstance::Destroy()
{ {
m_roImage.SetPointer(NULL); // CRef 에서 레퍼런스 카운트가 떨어져야 함. m_roImage.SetPointer(NULL); // CRef 에서 레퍼런스 카운트가 떨어져야 함.
Initialize(); Initialize();
} }

View File

@ -44,7 +44,7 @@ bool CGraphicImageTexture::CreateDeviceObjects()
if (m_stFileName.empty()) if (m_stFileName.empty())
{ {
// 폰트 텍스쳐 // 폰트 텍스쳐
if (FAILED(ms_lpd3dDevice->CreateTexture(m_width, m_height, 1, 0, m_d3dFmt, D3DPOOL_MANAGED, &m_lpd3dTexture, NULL))) if (FAILED(ms_lpd3dDevice->CreateTexture(m_width, m_height, 1, 0, m_d3dFmt, D3DPOOL_MANAGED, &m_lpd3dTexture, NULL)))
return false; return false;
} }

View File

@ -97,18 +97,18 @@ struct LightComp
} }
}; };
// NOTE : FlushLight후 렌더링 // NOTE : FlushLight후 렌더링
// 그 후 반드시 RestoreLight를 해줘야만 한다. // 그 후 반드시 RestoreLight를 해줘야만 한다.
void CLightManager::FlushLight() void CLightManager::FlushLight()
{ {
Update(); Update();
m_LightSortVector.clear(); m_LightSortVector.clear();
// NOTE: Dynamic과 Static을 분리 시키고 CenterPosition이 바뀔때마다 Static만 // NOTE: Dynamic과 Static을 분리 시키고 CenterPosition이 바뀔때마다 Static만
// 다시 Flush 하는 식으로 최적화 할 수 있다. - [levites] // 다시 Flush 하는 식으로 최적화 할 수 있다. - [levites]
// light들의 거리를 추출해 정렬한다. // light들의 거리를 추출해 정렬한다.
TLightMap::iterator itor = m_LightMap.begin(); TLightMap::iterator itor = m_LightMap.begin();
for (; itor != m_LightMap.end(); ++itor) for (; itor != m_LightMap.end(); ++itor)
@ -124,7 +124,7 @@ void CLightManager::FlushLight()
// quick sort lights // quick sort lights
std::sort(m_LightSortVector.begin(), m_LightSortVector.end(), LightComp()); std::sort(m_LightSortVector.begin(), m_LightSortVector.end(), LightComp());
// NOTE - 거리로 정렬된 라이트를 Limit 갯수 만큼 제한해서 켜준다. // NOTE - 거리로 정렬된 라이트를 Limit 갯수 만큼 제한해서 켜준다.
STATEMANAGER.SaveRenderState(D3DRS_LIGHTING, TRUE); STATEMANAGER.SaveRenderState(D3DRS_LIGHTING, TRUE);
for (DWORD k = 0; k < min(m_dwLimitLightCount, m_LightSortVector.size()); ++k) for (DWORD k = 0; k < min(m_dwLimitLightCount, m_LightSortVector.size()); ++k)

View File

@ -93,8 +93,8 @@ class CLightManager : public CGraphicBase, public CLightBase, public CSingleton<
void Initialize(); void Initialize();
// NOTE : FlushLight후 렌더링 // NOTE : FlushLight후 렌더링
// 그 후 반드시 RestoreLight를 해줘야만 한다. // 그 후 반드시 RestoreLight를 해줘야만 한다.
void Update(); void Update();
void FlushLight(); void FlushLight();
void RestoreLight(); void RestoreLight();

View File

@ -241,7 +241,7 @@ void CGraphicMarkInstance::Initialize()
void CGraphicMarkInstance::Destroy() void CGraphicMarkInstance::Destroy()
{ {
m_roImage.SetPointer(NULL); // CRef 에서 레퍼런스 카운트가 떨어져야 함. m_roImage.SetPointer(NULL); // CRef 에서 레퍼런스 카운트가 떨어져야 함.
Initialize(); Initialize();
} }

View File

@ -53,7 +53,7 @@ void CScreen::RenderBox3d(float sx, float sy, float sz, float ex, float ey, floa
{ ex, ey, ez, ms_diffuseColor, 0.0f, 0.0f }, // 3 { ex, ey, ez, ms_diffuseColor, 0.0f, 0.0f }, // 3
{ sx, ey, ez, ms_diffuseColor, 0.0f, 0.0f }, // 2 { sx, ey, ez, ms_diffuseColor, 0.0f, 0.0f }, // 2
{ ex+1.0f, ey, ez, ms_diffuseColor, 0.0f, 0.0f } // 3, (x가 1증가된 3) { ex+1.0f, ey, ez, ms_diffuseColor, 0.0f, 0.0f } // 3, (x가 1증가된 3)
}; };
// 2004.11.18.myevan.DrawIndexPrimitiveUP -> DynamicVertexBuffer // 2004.11.18.myevan.DrawIndexPrimitiveUP -> DynamicVertexBuffer
@ -510,11 +510,11 @@ void CScreen::SetCursorPosition(int x, int y, int hres, int vres)
ms_vtPickRayOrig.y = matViewInverse._42; ms_vtPickRayOrig.y = matViewInverse._42;
ms_vtPickRayOrig.z = matViewInverse._43; ms_vtPickRayOrig.z = matViewInverse._43;
// // 2003. 9. 9 동현 추가 // // 2003. 9. 9 동현 추가
// // 지형 picking을 위한 뻘짓... ㅡㅡ; 위에 것과 통합 필요... // // 지형 picking을 위한 뻘짓... ㅡㅡ; 위에 것과 통합 필요...
ms_Ray.SetStartPoint(ms_vtPickRayOrig); ms_Ray.SetStartPoint(ms_vtPickRayOrig);
ms_Ray.SetDirection(-ms_vtPickRayDir, 51200.0f); ms_Ray.SetDirection(-ms_vtPickRayDir, 51200.0f);
// // 2003. 9. 9 동현 추가 // // 2003. 9. 9 동현 추가
} }
bool CScreen::GetCursorPosition(float* px, float* py, float* pz) bool CScreen::GetCursorPosition(float* px, float* py, float* pz)

View File

@ -38,9 +38,9 @@ bool CGraphicText::OnLoad(int /*iSize*/, const void* /*c_pvBuf*/)
bool bItalic = false; bool bItalic = false;
// format // format
// 굴림.fnt "굴림" 폰트 기본 사이즈 12 로 로딩 // 굴림.fnt "굴림" 폰트 기본 사이즈 12 로 로딩
// 굴림:18.fnt "굴림" 폰트 사이즈 18 로 로딩 // 굴림:18.fnt "굴림" 폰트 사이즈 18 로 로딩
// 굴림:14i.fnt "굴림" 폰트 사이즈 14 & 이탤릭으로 로딩 // 굴림:14i.fnt "굴림" 폰트 사이즈 14 & 이탤릭으로 로딩
const char * p = strrchr(GetFileName(), ':'); const char * p = strrchr(GetFileName(), ':');
if (p) if (p)

View File

@ -121,12 +121,12 @@ int ReadToken(const char* token)
void CGraphicTextInstance::Update() void CGraphicTextInstance::Update()
{ {
if (m_isUpdate) // 문자열이 바뀌었을 때만 업데이트 한다. if (m_isUpdate) // 문자열이 바뀌었을 때만 업데이트 한다.
return; return;
if (m_roText.IsNull()) if (m_roText.IsNull())
{ {
Tracef("CGraphicTextInstance::Update - 폰트가 설정되지 않았습니다\n"); Tracef("CGraphicTextInstance::Update - Font not set\n");
return; return;
} }
@ -139,7 +139,7 @@ void CGraphicTextInstance::Update()
UINT defCodePage = GetDefaultCodePage(); UINT defCodePage = GetDefaultCodePage();
UINT dataCodePage = defCodePage; // 아랍 및 베트남 내부 데이터를 UTF8 을 사용하려 했으나 실패 UINT dataCodePage = defCodePage; // 아랍 및 베트남 내부 데이터를 UTF8 을 사용하려 했으나 실패
CGraphicFontTexture::TCharacterInfomation* pSpaceInfo = pFontTexture->GetCharacterInfomation(dataCodePage, ' '); CGraphicFontTexture::TCharacterInfomation* pSpaceInfo = pFontTexture->GetCharacterInfomation(dataCodePage, ' ');
@ -185,7 +185,7 @@ void CGraphicTextInstance::Update()
bool isEnglish = true; bool isEnglish = true;
int nEnglishBase = wArabicTextLen - 1; int nEnglishBase = wArabicTextLen - 1;
//<<하이퍼 링크>> //<<하이퍼 링크>>
int x = 0; int x = 0;
int len; int len;
@ -194,7 +194,7 @@ void CGraphicTextInstance::Update()
std::wstring hyperlinkBuffer; std::wstring hyperlinkBuffer;
int no_hyperlink = 0; int no_hyperlink = 0;
// 심볼로 끝나면 아랍어 모드로 시작해야한다 // 심볼로 끝나면 아랍어 모드로 시작해야한다
if (Arabic_IsInSymbol(wArabicText[wArabicTextLen - 1])) if (Arabic_IsInSymbol(wArabicText[wArabicTextLen - 1]))
{ {
isEnglish = false; isEnglish = false;
@ -208,24 +208,24 @@ void CGraphicTextInstance::Update()
if (isEnglish) if (isEnglish)
{ {
// <<심볼의 경우 (ex. 기호, 공백)>> -> 영어 모드 유지. // <<심볼의 경우 (ex. 기호, 공백)>> -> 영어 모드 유지.
// <<(심볼이 아닌 것들 : 숫자, 영어, 아랍어)>> // <<(심볼이 아닌 것들 : 숫자, 영어, 아랍어)>>
// (1) 맨 앞의 심볼 or // (1) 맨 앞의 심볼 or
// (2) // (2)
// 1) 앞 글자가 아랍어 아님 && // 1) 앞 글자가 아랍어 아님 &&
// 2) 뒷 글자가 아랍어 아님 && // 2) 뒷 글자가 아랍어 아님 &&
// 3) 뒷 글자가 심볼'|'이 아님 && // 3) 뒷 글자가 심볼'|'이 아님 &&
// or // or
// (3) 현재 심볼이 '|' // (3) 현재 심볼이 '|'
// <<아랍어 모드로 넘어가는 경우 : 심볼에서.>> // <<아랍어 모드로 넘어가는 경우 : 심볼에서.>>
// 1) 앞글자 아랍어 // 1) 앞글자 아랍어
// 2) 뒷글자 아랍어 // 2) 뒷글자 아랍어
// //
// //
if (Arabic_IsInSymbol(wArabicChar) && ( if (Arabic_IsInSymbol(wArabicChar) && (
(i == 0) || (i == 0) ||
(i > 0 && (i > 0 &&
!(Arabic_HasPresentation(wArabicText, i - 1) || Arabic_IsInPresentation(wArabicText[i + 1])) && //앞글자, 뒷글자가 아랍어 아님. !(Arabic_HasPresentation(wArabicText, i - 1) || Arabic_IsInPresentation(wArabicText[i + 1])) && //앞글자, 뒷글자가 아랍어 아님.
wArabicText[i+1] != '|' wArabicText[i+1] != '|'
) || ) ||
wArabicText[i] == '|' wArabicText[i] == '|'
@ -234,10 +234,10 @@ void CGraphicTextInstance::Update()
// pass // pass
int temptest = 1; int temptest = 1;
} }
// (1)아랍어이거나 (2)아랍어 다음의 심볼이라면 아랍어 모드 전환 // (1)아랍어이거나 (2)아랍어 다음의 심볼이라면 아랍어 모드 전환
else if (Arabic_IsInPresentation(wArabicChar) || Arabic_IsInSymbol(wArabicChar)) else if (Arabic_IsInPresentation(wArabicChar) || Arabic_IsInSymbol(wArabicChar))
{ {
//그 전까지의 영어를 그린다. //그 전까지의 영어를 그린다.
for (int e = i + 1; e <= nEnglishBase;) { for (int e = i + 1; e <= nEnglishBase;) {
int ret = GetTextTag(&wArabicText[e], wArabicTextLen - e, len, hyperlinkBuffer); int ret = GetTextTag(&wArabicText[e], wArabicTextLen - e, len, hyperlinkBuffer);
@ -251,7 +251,7 @@ void CGraphicTextInstance::Update()
kHyperlink.ex += charWidth; kHyperlink.ex += charWidth;
//x += charWidth; //x += charWidth;
//기존 추가한 하이퍼링크의 좌표 수정. //기존 추가한 하이퍼링크의 좌표 수정.
for (int j = 1; j <= no_hyperlink; j++) for (int j = 1; j <= no_hyperlink; j++)
{ {
if(m_hyperlinkVector.size() < j) if(m_hyperlinkVector.size() < j)
@ -279,7 +279,7 @@ void CGraphicTextInstance::Update()
if (hyperlinkStep == 1) if (hyperlinkStep == 1)
{ {
++hyperlinkStep; ++hyperlinkStep;
kHyperlink.ex = kHyperlink.sx = 0; // 실제 텍스트가 시작되는 위치 kHyperlink.ex = kHyperlink.sx = 0; // 실제 텍스트가 시작되는 위치
} }
else else
{ {
@ -299,7 +299,7 @@ void CGraphicTextInstance::Update()
int charWidth = __DrawCharacter(pFontTexture, dataCodePage, Arabic_ConvSymbol(wArabicText[i]), dwColor); int charWidth = __DrawCharacter(pFontTexture, dataCodePage, Arabic_ConvSymbol(wArabicText[i]), dwColor);
kHyperlink.ex += charWidth; kHyperlink.ex += charWidth;
//기존 추가한 하이퍼링크의 좌표 수정. //기존 추가한 하이퍼링크의 좌표 수정.
for (int j = 1; j <= no_hyperlink; j++) for (int j = 1; j <= no_hyperlink; j++)
{ {
if(m_hyperlinkVector.size() < j) if(m_hyperlinkVector.size() < j)
@ -313,16 +313,16 @@ void CGraphicTextInstance::Update()
isEnglish = false; isEnglish = false;
} }
} }
else //[[[아랍어 모드]]] else //[[[아랍어 모드]]]
{ {
// 아랍어이거나 아랍어 출력중 나오는 심볼이라면 // 아랍어이거나 아랍어 출력중 나오는 심볼이라면
if (Arabic_IsInPresentation(wArabicChar) || Arabic_IsInSymbol(wArabicChar)) if (Arabic_IsInPresentation(wArabicChar) || Arabic_IsInSymbol(wArabicChar))
{ {
int charWidth = __DrawCharacter(pFontTexture, dataCodePage, Arabic_ConvSymbol(wArabicText[i]), dwColor); int charWidth = __DrawCharacter(pFontTexture, dataCodePage, Arabic_ConvSymbol(wArabicText[i]), dwColor);
kHyperlink.ex += charWidth; kHyperlink.ex += charWidth;
x += charWidth; x += charWidth;
//기존 추가한 하이퍼링크의 좌표 수정. //기존 추가한 하이퍼링크의 좌표 수정.
for (int j = 1; j <= no_hyperlink; j++) for (int j = 1; j <= no_hyperlink; j++)
{ {
if(m_hyperlinkVector.size() < j) if(m_hyperlinkVector.size() < j)
@ -333,7 +333,7 @@ void CGraphicTextInstance::Update()
tempLink.sx += charWidth; tempLink.sx += charWidth;
} }
} }
else //영어이거나, 영어 다음에 나오는 심볼이라면, else //영어이거나, 영어 다음에 나오는 심볼이라면,
{ {
nEnglishBase = i; nEnglishBase = i;
isEnglish = true; isEnglish = true;
@ -355,7 +355,7 @@ void CGraphicTextInstance::Update()
int charWidth = __DrawCharacter(pFontTexture, dataCodePage, wArabicText[e], dwColor); int charWidth = __DrawCharacter(pFontTexture, dataCodePage, wArabicText[e], dwColor);
kHyperlink.ex += charWidth; kHyperlink.ex += charWidth;
//기존 추가한 하이퍼링크의 좌표 수정. //기존 추가한 하이퍼링크의 좌표 수정.
for (int j = 1; j <= no_hyperlink; j++) for (int j = 1; j <= no_hyperlink; j++)
{ {
if(m_hyperlinkVector.size() < j) if(m_hyperlinkVector.size() < j)
@ -383,7 +383,7 @@ void CGraphicTextInstance::Update()
if (hyperlinkStep == 1) if (hyperlinkStep == 1)
{ {
++hyperlinkStep; ++hyperlinkStep;
kHyperlink.ex = kHyperlink.sx = 0; // 실제 텍스트가 시작되는 위치 kHyperlink.ex = kHyperlink.sx = 0; // 실제 텍스트가 시작되는 위치
} }
else else
{ {
@ -401,7 +401,7 @@ void CGraphicTextInstance::Update()
} }
} }
else // 아랍외 다른 지역. else // 아랍외 다른 지역.
{ {
int x = 0; int x = 0;
int len; int len;
@ -440,7 +440,7 @@ void CGraphicTextInstance::Update()
if (hyperlinkStep == 1) if (hyperlinkStep == 1)
{ {
++hyperlinkStep; ++hyperlinkStep;
kHyperlink.ex = kHyperlink.sx = x; // 실제 텍스트가 시작되는 위치 kHyperlink.ex = kHyperlink.sx = x; // 실제 텍스트가 시작되는 위치
} }
else else
{ {
@ -460,7 +460,7 @@ void CGraphicTextInstance::Update()
if (token < end) if (token < end)
{ {
int newCodePage = ReadToken(token); int newCodePage = ReadToken(token);
dataCodePage = newCodePage; // 아랍 및 베트남 내부 데이터를 UTF8 을 사용하려 했으나 실패 dataCodePage = newCodePage; // 아랍 및 베트남 내부 데이터를 UTF8 을 사용하려 했으나 실패
begin = token + 5; begin = token + 5;
} }
else else
@ -570,7 +570,7 @@ void CGraphicTextInstance::Render(RECT * pClipRect)
CGraphicFontTexture::TCharacterInfomation* pCurCharInfo; CGraphicFontTexture::TCharacterInfomation* pCurCharInfo;
// 테두리 // 테두리
if (m_isOutline) if (m_isOutline)
{ {
fCurX=fStanX; fCurX=fStanX;
@ -586,7 +586,7 @@ void CGraphicTextInstance::Render(RECT * pClipRect)
fFontHeight=float(pCurCharInfo->height); fFontHeight=float(pCurCharInfo->height);
fFontAdvance=float(pCurCharInfo->advance); fFontAdvance=float(pCurCharInfo->advance);
// NOTE : 폰트 출력에 Width 제한을 둡니다. - [levites] // NOTE : 폰트 출력에 Width 제한을 둡니다. - [levites]
if ((fCurX+fFontWidth)-m_v3Position.x > m_fLimitWidth) if ((fCurX+fFontWidth)-m_v3Position.x > m_fLimitWidth)
{ {
if (m_isMultiLine) if (m_isMultiLine)
@ -636,7 +636,7 @@ void CGraphicTextInstance::Render(RECT * pClipRect)
akVertex[2].y=fFontSy-feather; akVertex[2].y=fFontSy-feather;
akVertex[3].y=fFontEy+feather; akVertex[3].y=fFontEy+feather;
// 왼 // 왼
akVertex[0].x=fFontSx-fFontHalfWeight-feather; akVertex[0].x=fFontSx-fFontHalfWeight-feather;
akVertex[1].x=fFontSx-fFontHalfWeight-feather; akVertex[1].x=fFontSx-fFontHalfWeight-feather;
akVertex[2].x=fFontEx-fFontHalfWeight+feather; akVertex[2].x=fFontEx-fFontHalfWeight+feather;
@ -646,7 +646,7 @@ void CGraphicTextInstance::Render(RECT * pClipRect)
STATEMANAGER.DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 2); STATEMANAGER.DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 2);
// 오른 // 오른
akVertex[0].x=fFontSx+fFontHalfWeight-feather; akVertex[0].x=fFontSx+fFontHalfWeight-feather;
akVertex[1].x=fFontSx+fFontHalfWeight-feather; akVertex[1].x=fFontSx+fFontHalfWeight-feather;
akVertex[2].x=fFontEx+fFontHalfWeight+feather; akVertex[2].x=fFontEx+fFontHalfWeight+feather;
@ -660,7 +660,7 @@ void CGraphicTextInstance::Render(RECT * pClipRect)
akVertex[2].x=fFontEx+feather; akVertex[2].x=fFontEx+feather;
akVertex[3].x=fFontEx+feather; akVertex[3].x=fFontEx+feather;
// 위 // 위
akVertex[0].y=fFontSy-fFontHalfWeight-feather; akVertex[0].y=fFontSy-fFontHalfWeight-feather;
akVertex[1].y=fFontEy-fFontHalfWeight+feather; akVertex[1].y=fFontEy-fFontHalfWeight+feather;
akVertex[2].y=fFontSy-fFontHalfWeight-feather; akVertex[2].y=fFontSy-fFontHalfWeight-feather;
@ -670,7 +670,7 @@ void CGraphicTextInstance::Render(RECT * pClipRect)
if (CGraphicBase::SetPDTStream((SPDTVertex*)akVertex, 4)) if (CGraphicBase::SetPDTStream((SPDTVertex*)akVertex, 4))
STATEMANAGER.DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 2); STATEMANAGER.DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 2);
// 아래 // 아래
akVertex[0].y=fFontSy+fFontHalfWeight-feather; akVertex[0].y=fFontSy+fFontHalfWeight-feather;
akVertex[1].y=fFontEy+fFontHalfWeight+feather; akVertex[1].y=fFontEy+fFontHalfWeight+feather;
akVertex[2].y=fFontSy+fFontHalfWeight-feather; akVertex[2].y=fFontSy+fFontHalfWeight-feather;
@ -684,7 +684,7 @@ void CGraphicTextInstance::Render(RECT * pClipRect)
} }
} }
// 메인 폰트 // 메인 폰트
fCurX=fStanX; fCurX=fStanX;
fCurY=fStanY; fCurY=fStanY;
fFontMaxHeight=0.0f; fFontMaxHeight=0.0f;
@ -698,7 +698,7 @@ void CGraphicTextInstance::Render(RECT * pClipRect)
fFontMaxHeight=max(fFontHeight, pCurCharInfo->height); fFontMaxHeight=max(fFontHeight, pCurCharInfo->height);
fFontAdvance=float(pCurCharInfo->advance); fFontAdvance=float(pCurCharInfo->advance);
// NOTE : 폰트 출력에 Width 제한을 둡니다. - [levites] // NOTE : 폰트 출력에 Width 제한을 둡니다. - [levites]
if ((fCurX+fFontWidth)-m_v3Position.x > m_fLimitWidth) if ((fCurX+fFontWidth)-m_v3Position.x > m_fLimitWidth)
{ {
if (m_isMultiLine) if (m_isMultiLine)
@ -811,9 +811,9 @@ void CGraphicTextInstance::Render(RECT * pClipRect)
sy -= float(m_textHeight) / 2.0f; sy -= float(m_textHeight) / 2.0f;
break; break;
} }
// 최적화 사항 // 최적화 사항
// 같은텍스쳐를 사용한다면... STRIP을 구성하고, 텍스쳐가 변경되거나 끝나면 DrawPrimitive를 호출해 // 같은텍스쳐를 사용한다면... STRIP을 구성하고, 텍스쳐가 변경되거나 끝나면 DrawPrimitive를 호출해
// 최대한 숫자를 줄이도록하자! // 최대한 숫자를 줄이도록하자!
TPDTVertex vertices[4]; TPDTVertex vertices[4];
vertices[0].diffuse = diffuse; vertices[0].diffuse = diffuse;
@ -865,13 +865,13 @@ void CGraphicTextInstance::Render(RECT * pClipRect)
STATEMANAGER.SetRenderState(D3DRS_FOGENABLE, dwFogEnable); STATEMANAGER.SetRenderState(D3DRS_FOGENABLE, dwFogEnable);
STATEMANAGER.SetRenderState(D3DRS_LIGHTING, dwLighting); STATEMANAGER.SetRenderState(D3DRS_LIGHTING, dwLighting);
//금강경 링크 띄워주는 부분. //금강경 링크 띄워주는 부분.
if (m_hyperlinkVector.size() != 0) if (m_hyperlinkVector.size() != 0)
{ {
int lx = gs_mx - m_v3Position.x; int lx = gs_mx - m_v3Position.x;
int ly = gs_my - m_v3Position.y; int ly = gs_my - m_v3Position.y;
//아랍은 좌표 부호를 바꿔준다. //아랍은 좌표 부호를 바꿔준다.
if (GetDefaultCodePage() == CP_ARABIC) { if (GetDefaultCodePage() == CP_ARABIC) {
lx = -lx; lx = -lx;
ly = -ly + m_textHeight; ly = -ly + m_textHeight;
@ -1063,7 +1063,7 @@ WORD CGraphicTextInstance::GetTextLineCount()
float fFontAdvance=float(pCurCharInfo->advance); float fFontAdvance=float(pCurCharInfo->advance);
//float fFontHeight=float(pCurCharInfo->height); //float fFontHeight=float(pCurCharInfo->height);
// NOTE : 폰트 출력에 Width 제한을 둡니다. - [levites] // NOTE : 폰트 출력에 Width 제한을 둡니다. - [levites]
if (fx+fFontWidth > m_fLimitWidth) if (fx+fFontWidth > m_fLimitWidth)
{ {
fx = 0.0f; fx = 0.0f;
@ -1110,7 +1110,7 @@ void CGraphicTextInstance::__Initialize()
m_vAlign = VERTICAL_ALIGN_TOP; m_vAlign = VERTICAL_ALIGN_TOP;
m_iMax = 0; m_iMax = 0;
m_fLimitWidth = 1600.0f; // NOTE : 해상도의 최대치. 이보다 길게 쓸 일이 있을까? - [levites] m_fLimitWidth = 1600.0f; // NOTE : 해상도의 최대치. 이보다 길게 쓸 일이 있을까? - [levites]
m_isCursor = false; m_isCursor = false;
m_isSecret = false; m_isSecret = false;

View File

@ -3,7 +3,7 @@
bool CStaticVertexBuffer::Create(int vtxCount, DWORD fvf, bool /*isManaged*/) bool CStaticVertexBuffer::Create(int vtxCount, DWORD fvf, bool /*isManaged*/)
{ {
// 무조건 MANAGED 모드 // 무조건 MANAGED 모드
return CGraphicVertexBuffer::Create(vtxCount, fvf, D3DUSAGE_WRITEONLY, D3DPOOL_MANAGED); return CGraphicVertexBuffer::Create(vtxCount, fvf, D3DUSAGE_WRITEONLY, D3DPOOL_MANAGED);
} }

View File

@ -819,7 +819,7 @@ void CIME::SetCurPos(int offset)
} }
else else
{ {
// offset은 보여지는 텍스트의 위치로 온다. 따라서 새로 계산해야함. // offset은 보여지는 텍스트의 위치로 온다. 따라서 새로 계산해야함.
//ms_curpos = min(ms_lastpos, offset); //ms_curpos = min(ms_lastpos, offset);
ms_curpos = min(ms_lastpos, GetTextTagInternalPosFromRenderPos(m_wText, ms_lastpos, offset)); ms_curpos = min(ms_lastpos, GetTextTagInternalPosFromRenderPos(m_wText, ms_lastpos, offset));
} }
@ -1503,8 +1503,8 @@ void CIME::CheckInputLocale()
ms_wszCurrentIndicator[1] = towlower(szLang[1]); ms_wszCurrentIndicator[1] = towlower(szLang[1]);
} }
// 아랍어에서 영어로 변경시 코드 페이지를 바꾸지 않는다 // 아랍어에서 영어로 변경시 코드 페이지를 바꾸지 않는다
// 내용도 지우지 않는다. // 내용도 지우지 않는다.
if(ms_uOutputCodePage != 1256) { if(ms_uOutputCodePage != 1256) {
ms_uOutputCodePage = ms_uInputCodePage; ms_uOutputCodePage = ms_uInputCodePage;
Clear(); Clear();
@ -2147,7 +2147,7 @@ LRESULT CIME::WMComposition(HWND hWnd, UINT /*uiMsg*/, WPARAM /*wParam*/, LPARAM
AttributeProcess(hImc); AttributeProcess(hImc);
if(lParam&GCS_COMPSTR) if(lParam&GCS_COMPSTR)
{ {
if (ms_uOutputCodePage == 950) // 대만 주음 입력 처리 if (ms_uOutputCodePage == 950) // 대만 주음 입력 처리
{ {
if (lParam&GCS_COMPATTR) if (lParam&GCS_COMPATTR)
CompositionProcessBuilding(hImc); CompositionProcessBuilding(hImc);

View File

@ -72,7 +72,7 @@ bool CInputKeyboard::InitializeKeyboard(HWND hWnd)
if (FAILED(hr = ms_lpKeyboard->SetDataFormat(&c_dfDIKeyboard))) if (FAILED(hr = ms_lpKeyboard->SetDataFormat(&c_dfDIKeyboard)))
return false; return false;
// Alt + F4를 위해 비독점 모드로 - [levites] // Alt + F4를 위해 비독점 모드로 - [levites]
// DWORD dwCoopFlags = DISCL_FOREGROUND | DISCL_EXCLUSIVE; // DWORD dwCoopFlags = DISCL_FOREGROUND | DISCL_EXCLUSIVE;
// DWORD dwCoopFlags = DISCL_NONEXCLUSIVE | DISCL_BACKGROUND; // DWORD dwCoopFlags = DISCL_NONEXCLUSIVE | DISCL_BACKGROUND;
DWORD dwCoopFlags = DISCL_FOREGROUND | DISCL_NONEXCLUSIVE; DWORD dwCoopFlags = DISCL_FOREGROUND | DISCL_NONEXCLUSIVE;
@ -99,7 +99,7 @@ void CInputKeyboard::UpdateKeyboard()
{ {
hr = ms_lpKeyboard->Acquire(); hr = ms_lpKeyboard->Acquire();
// 현재 어플리케이션이 비활성화 되어 있어 입력을 받을 수 없다. // 현재 어플리케이션이 비활성화 되어 있어 입력을 받을 수 없다.
//if (hr == DIERR_OTHERAPPHASPRIO || hr == DIERR_NOTACQUIRED); //if (hr == DIERR_OTHERAPPHASPRIO || hr == DIERR_NOTACQUIRED);
return; return;
} }

View File

@ -206,7 +206,7 @@ void CLensFlare::DrawBeforeFlare()
STATEMANAGER.SaveRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA); STATEMANAGER.SaveRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
STATEMANAGER.SaveRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA); STATEMANAGER.SaveRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);
/* /*
if (m_fBeforeBright != 0.0f && m_bDrawFlare && m_bDrawBrightScreen && false) // ¿Ø false? if (m_fBeforeBright != 0.0f && m_bDrawFlare && m_bDrawBrightScreen && false) // false?
{ {
glColor4f(1.0f, 1.0f, 1.0f, m_fBeforeBright); glColor4f(1.0f, 1.0f, 1.0f, m_fBeforeBright);
glDisable(GL_TEXTURE_2D); glDisable(GL_TEXTURE_2D);

View File

@ -81,7 +81,7 @@ public:
CLensFlare(); CLensFlare();
virtual ~CLensFlare(); virtual ~CLensFlare();
void Compute(const D3DXVECTOR3 & c_rv3LightDirection); // D3DTS_VIEW로 부터 카메라 방향을 얻어오므로, 카메라 설정 뒤에 해야 함. void Compute(const D3DXVECTOR3 & c_rv3LightDirection); // D3DTS_VIEW로 부터 카메라 방향을 얻어오므로, 카메라 설정 뒤에 해야 함.
void DrawBeforeFlare(); void DrawBeforeFlare();
void DrawAfterFlare(); void DrawAfterFlare();

View File

@ -74,7 +74,7 @@ class CProfiler : public CSingleton<CProfiler>
{ {
CGraphicTextInstance * pGraphicTextInstance = CGraphicTextInstance::New(); CGraphicTextInstance * pGraphicTextInstance = CGraphicTextInstance::New();
CResource * pResource = CResourceManager::Instance().GetResourcePointer("±¼¸²Ã¼.fnt"); CResource * pResource = CResourceManager::Instance().GetResourcePointer("\xB1\xBC\xB8\xB2\xC3\xBC.fnt");
pGraphicTextInstance->Clear(); pGraphicTextInstance->Clear();
pGraphicTextInstance->SetTextPointer(static_cast<CGraphicText*>(pResource)); pGraphicTextInstance->SetTextPointer(static_cast<CGraphicText*>(pResource));
@ -114,7 +114,7 @@ class CProfiler : public CSingleton<CProfiler>
CGraphicTextInstance * pGraphicTextInstance = m_GraphicTextInstancePool.Alloc(); CGraphicTextInstance * pGraphicTextInstance = m_GraphicTextInstancePool.Alloc();
CResource * pResource = CResourceManager::Instance().GetResourcePointer("±¼¸²Ã¼.fnt"); CResource * pResource = CResourceManager::Instance().GetResourcePointer("\xB1\xBC\xB8\xB2\xC3\xBC.fnt");
pGraphicTextInstance->Clear(); pGraphicTextInstance->Clear();
pGraphicTextInstance->SetTextPointer(static_cast<CGraphicText*>(pResource)); pGraphicTextInstance->SetTextPointer(static_cast<CGraphicText*>(pResource));

View File

@ -131,8 +131,8 @@ int CResource::ConvertPathName(const char * c_szPathName, char * pszRetPathName,
void CResource::SetFileName(const char* c_szFileName) void CResource::SetFileName(const char* c_szFileName)
{ {
// 2004. 2. 1. myevan. 쓰레드가 사용되는 상황에서 static 변수는 사용하지 않는것이 좋다. // 2004. 2. 1. myevan. 쓰레드가 사용되는 상황에서 static 변수는 사용하지 않는것이 좋다.
// 2004. 2. 1. myevan. 파일 이름 처리를 std::string 사용 // 2004. 2. 1. myevan. 파일 이름 처리를 std::string 사용
m_stFileName=c_szFileName; m_stFileName=c_szFileName;
} }

View File

@ -10,9 +10,9 @@
int g_iLoadingDelayTime = 20; int g_iLoadingDelayTime = 20;
const long c_Deleting_Wait_Time = 30000; // 삭제 대기 시간 (30초) const long c_Deleting_Wait_Time = 30000; // 삭제 대기 시간 (30초)
const long c_DeletingCountPerFrame = 30; // 프레임당 체크 리소스 갯수 const long c_DeletingCountPerFrame = 30; // 프레임당 체크 리소스 갯수
const long c_Reference_Decrease_Wait_Time = 30000; // 선로딩 리소스의 해제 대기 시간 (30초) const long c_Reference_Decrease_Wait_Time = 30000; // 선로딩 리소스의 해제 대기 시간 (30초)
CFileLoaderThread CResourceManager::ms_loadingThread; CFileLoaderThread CResourceManager::ms_loadingThread;
@ -56,7 +56,7 @@ void CResourceManager::ProcessBackgroundLoading()
ms_loadingThread.Request(stFileName); ms_loadingThread.Request(stFileName);
m_WaitingMap.insert(TResourceRequestMap::value_type(dwFileCRC, stFileName)); m_WaitingMap.insert(TResourceRequestMap::value_type(dwFileCRC, stFileName));
itor = m_RequestMap.erase(itor); itor = m_RequestMap.erase(itor);
//break; // NOTE: 여기서 break 하면 천천히 로딩 된다. //break; // NOTE: 여기서 break 하면 천천히 로딩 된다.
} }
DWORD dwCurrentTime = ELTimer_GetMSec(); DWORD dwCurrentTime = ELTimer_GetMSec();
@ -74,7 +74,7 @@ void CResourceManager::ProcessBackgroundLoading()
pResource->OnLoad(pData->dwSize, pData->pvBuf); pResource->OnLoad(pData->dwSize, pData->pvBuf);
pResource->AddReferenceOnly(); pResource->AddReferenceOnly();
// 여기서 올라간 레퍼런스 카운트를 일정 시간이 지난 뒤에 풀어주기 위하여 // 여기서 올라간 레퍼런스 카운트를 일정 시간이 지난 뒤에 풀어주기 위하여
m_pResRefDecreaseWaitingMap.insert(TResourceRefDecreaseWaitingMap::value_type(dwCurrentTime, pResource)); m_pResRefDecreaseWaitingMap.insert(TResourceRefDecreaseWaitingMap::value_type(dwCurrentTime, pResource));
} }
} }
@ -85,7 +85,7 @@ void CResourceManager::ProcessBackgroundLoading()
delete pData; delete pData;
} }
// DO : 일정 시간이 지나고 난뒤 미리 로딩해 두었던 리소스의 레퍼런스 카운트를 감소 시킨다 - [levites] // DO : 일정 시간이 지나고 난뒤 미리 로딩해 두었던 리소스의 레퍼런스 카운트를 감소 시킨다 - [levites]
long lCurrentTime = ELTimer_GetMSec(); long lCurrentTime = ELTimer_GetMSec();
TResourceRefDecreaseWaitingMap::iterator itorRef = m_pResRefDecreaseWaitingMap.begin(); TResourceRefDecreaseWaitingMap::iterator itorRef = m_pResRefDecreaseWaitingMap.begin();
@ -233,7 +233,7 @@ CResource * CResourceManager::GetTypeResourcePointer(const char * c_szFileName,
DWORD dwFileCRC = __GetFileCRC(c_szFileName, &c_pszFile); DWORD dwFileCRC = __GetFileCRC(c_szFileName, &c_pszFile);
CResource * pResource = FindResourcePointer(dwFileCRC); CResource * pResource = FindResourcePointer(dwFileCRC);
if (pResource) // 이미 리소스가 있으면 리턴 한다. if (pResource) // 이미 리소스가 있으면 리턴 한다.
return pResource; return pResource;
CResource * (*newFunc) (const char *) = NULL; CResource * (*newFunc) (const char *) = NULL;
@ -283,7 +283,7 @@ CResource * CResourceManager::GetResourcePointer(const char * c_szFileName)
DWORD dwFileCRC = __GetFileCRC(c_szFileName, &c_pszFile); DWORD dwFileCRC = __GetFileCRC(c_szFileName, &c_pszFile);
CResource * pResource = FindResourcePointer(dwFileCRC); CResource * pResource = FindResourcePointer(dwFileCRC);
if (pResource) // 이미 리소스가 있으면 리턴 한다. if (pResource) // 이미 리소스가 있으면 리턴 한다.
return pResource; return pResource;
const char * pcFileExt = strrchr(c_pszFile, '.'); const char * pcFileExt = strrchr(c_pszFile, '.');

View File

@ -26,7 +26,7 @@ class CResourceManager : public CSingleton<CResourceManager>
CResource * GetResourcePointer(const char * c_szFileName); CResource * GetResourcePointer(const char * c_szFileName);
CResource * GetTypeResourcePointer(const char * c_szFileName, int iType=-1); CResource * GetTypeResourcePointer(const char * c_szFileName, int iType=-1);
// 추가 // 추가
bool isResourcePointerData(DWORD dwFileCRC); bool isResourcePointerData(DWORD dwFileCRC);
void RegisterResourceNewFunctionPointer(const char* c_szFileExt, CResource* (*pResNewFunc)(const char* c_szFileName)); void RegisterResourceNewFunctionPointer(const char* c_szFileExt, CResource* (*pResNewFunc)(const char* c_szFileName));
@ -63,7 +63,7 @@ class CResourceManager : public CSingleton<CResourceManager>
TResourceNewFunctionPointerMap m_pResNewFuncMap; TResourceNewFunctionPointerMap m_pResNewFuncMap;
TResourceNewFunctionByTypePointerMap m_pResNewFuncByTypeMap; TResourceNewFunctionByTypePointerMap m_pResNewFuncByTypeMap;
TResourceDeletingMap m_ResourceDeletingMap; TResourceDeletingMap m_ResourceDeletingMap;
TResourceRequestMap m_RequestMap; // 쓰레드로 로딩 요청한 리스트 TResourceRequestMap m_RequestMap; // 쓰레드로 로딩 요청한 리스트
TResourceRequestMap m_WaitingMap; TResourceRequestMap m_WaitingMap;
TResourceRefDecreaseWaitingMap m_pResRefDecreaseWaitingMap; TResourceRefDecreaseWaitingMap m_pResRefDecreaseWaitingMap;

View File

@ -272,7 +272,7 @@ void CSkyBox::SetCloudTexture(const char * c_szFileName)
CGraphicImageInstance * pGraphicImageInstance = GenerateTexture(c_szFileName); CGraphicImageInstance * pGraphicImageInstance = GenerateTexture(c_szFileName);
m_GraphicImageInstanceMap.insert(TGraphicImageInstanceMap::value_type(m_FaceCloud.m_strfacename, pGraphicImageInstance)); m_GraphicImageInstanceMap.insert(TGraphicImageInstanceMap::value_type(m_FaceCloud.m_strfacename, pGraphicImageInstance));
// 이거 안쓰는거 같은데요? [cronan] // 이거 안쓰는거 같은데요? [cronan]
// CGraphicImage * pImage = (CGraphicImage *) CResourceManager::Instance().GetResourcePointer("D:\\Ymir Work\\special/cloudalpha.tga"); // CGraphicImage * pImage = (CGraphicImage *) CResourceManager::Instance().GetResourcePointer("D:\\Ymir Work\\special/cloudalpha.tga");
// m_CloudAlphaImageInstance.SetImagePointer(pImage); // m_CloudAlphaImageInstance.SetImagePointer(pImage);
} }
@ -803,7 +803,7 @@ void CSkyBox::Update()
void CSkyBox::Render() void CSkyBox::Render()
{ {
// 2004.01.25 myevan 처리를 렌더링 후반으로 옮기고, DepthTest 처리 // 2004.01.25 myevan 처리를 렌더링 후반으로 옮기고, DepthTest 처리
STATEMANAGER.SaveRenderState(D3DRS_ZENABLE, TRUE); STATEMANAGER.SaveRenderState(D3DRS_ZENABLE, TRUE);
STATEMANAGER.SaveRenderState(D3DRS_ZWRITEENABLE, FALSE); STATEMANAGER.SaveRenderState(D3DRS_ZWRITEENABLE, FALSE);
STATEMANAGER.SaveRenderState(D3DRS_LIGHTING, FALSE); STATEMANAGER.SaveRenderState(D3DRS_LIGHTING, FALSE);
@ -872,7 +872,7 @@ void CSkyBox::RenderCloud()
if (!pCloudGraphicImageInstance) if (!pCloudGraphicImageInstance)
return; return;
// 2004.01.25 myevan 처리를 렌더링 후반으로 옮기고, DepthTest 처리 // 2004.01.25 myevan 처리를 렌더링 후반으로 옮기고, DepthTest 처리
STATEMANAGER.SaveRenderState(D3DRS_ZENABLE, TRUE); STATEMANAGER.SaveRenderState(D3DRS_ZENABLE, TRUE);
STATEMANAGER.SaveRenderState(D3DRS_ZWRITEENABLE, FALSE); STATEMANAGER.SaveRenderState(D3DRS_ZWRITEENABLE, FALSE);
STATEMANAGER.SaveRenderState(D3DRS_LIGHTING, FALSE); STATEMANAGER.SaveRenderState(D3DRS_LIGHTING, FALSE);

View File

@ -63,7 +63,7 @@ public:
private: private:
TPDTVertex m_Vertex[4]; TPDTVertex m_Vertex[4];
TIndex m_Indices[4]; // 인덱스 버퍼... TIndex m_Indices[4]; // 인덱스 버퍼...
CColorTransitionHelper m_Helper[4]; CColorTransitionHelper m_Helper[4];
}; };
@ -99,7 +99,7 @@ protected:
protected: protected:
////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////
// 타입 정의 // 타입 정의
typedef std::vector<CSkyObjectQuad> TSkyObjectQuadVector; typedef std::vector<CSkyObjectQuad> TSkyObjectQuadVector;
typedef TSkyObjectQuadVector::iterator TSkyObjectQuadIterator; typedef TSkyObjectQuadVector::iterator TSkyObjectQuadIterator;
@ -118,8 +118,8 @@ protected:
////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////
// 구름... // 구름...
TSkyObjectFace m_FaceCloud; // 구름 일단 한장... TSkyObjectFace m_FaceCloud; // 구름 일단 한장...
D3DXMATRIX m_matWorldCloud, m_matTranslationCloud, m_matTextureCloud; D3DXMATRIX m_matWorldCloud, m_matTranslationCloud, m_matTextureCloud;
D3DXVECTOR3 m_v3PositionCloud; D3DXVECTOR3 m_v3PositionCloud;
float m_fCloudScaleX, m_fCloudScaleY, m_fCloudHeight; float m_fCloudScaleX, m_fCloudScaleY, m_fCloudHeight;
@ -129,7 +129,7 @@ protected:
DWORD m_dwlastTime; DWORD m_dwlastTime;
// 스카이 박스 이미지... // 스카이 박스 이미지...
TGraphicImageInstanceMap m_GraphicImageInstanceMap; TGraphicImageInstanceMap m_GraphicImageInstanceMap;
// Transform... // Transform...
@ -137,7 +137,7 @@ protected:
D3DXVECTOR3 m_v3Position; D3DXVECTOR3 m_v3Position;
float m_fScaleX, m_fScaleY, m_fScaleZ; float m_fScaleX, m_fScaleY, m_fScaleZ;
// 랜더링 관련... 임시 변수.. // 랜더링 관련... 임시 변수..
unsigned char m_ucRenderMode; unsigned char m_ucRenderMode;
std::string m_strCurTime; std::string m_strCurTime;

View File

@ -8,7 +8,7 @@
#define _WIN32_DCOM #define _WIN32_DCOM
#pragma warning(disable:4710) // not inlined #pragma warning(disable:4710) // not inlined
#pragma warning(disable:4786) // character 255 넘어가는거 끄기 #pragma warning(disable:4786) // character 255 넘어가는거 끄기
#pragma warning(disable:4244) // type conversion possible lose of data #pragma warning(disable:4244) // type conversion possible lose of data
#pragma warning(disable:4018) #pragma warning(disable:4018)

View File

@ -19,7 +19,7 @@ int GetTextTag(const wchar_t * src, int maxLen, int & tagLen, std::wstring & ext
extraInfo.assign(++cur, 8); extraInfo.assign(++cur, 8);
return TEXT_TAG_COLOR; return TEXT_TAG_COLOR;
} }
else if (*cur == L'|') // ||는 |로 표시한다. else if (*cur == L'|') // ||는 |로 표시한다.
{ {
tagLen = 2; tagLen = 2;
return TEXT_TAG_TAG; return TEXT_TAG_TAG;
@ -29,7 +29,7 @@ int GetTextTag(const wchar_t * src, int maxLen, int & tagLen, std::wstring & ext
tagLen = 2; tagLen = 2;
return TEXT_TAG_RESTORE_COLOR; return TEXT_TAG_RESTORE_COLOR;
} }
else if (*cur == L'H') // hyperlink |Hitem:10000:0:0:0:0|h[이름]|h else if (*cur == L'H') // hyperlink |Hitem:10000:0:0:0:0|h[이름]|h
{ {
tagLen = 2; tagLen = 2;
return TEXT_TAG_HYPERLINK_START; return TEXT_TAG_HYPERLINK_START;
@ -154,20 +154,20 @@ int FindColorTagStartPosition(const wchar_t * src, int src_len)
const wchar_t * cur = src; const wchar_t * cur = src;
// |r의 경우 // |r의 경우
if (*cur == L'r' && *(cur - 1) == L'|') if (*cur == L'r' && *(cur - 1) == L'|')
{ {
int len = src_len; int len = src_len;
// ||r은 무시 // ||r은 무시
if (len >= 2 && *(cur - 2) == L'|') if (len >= 2 && *(cur - 2) == L'|')
return 1; return 1;
cur -= 2; cur -= 2;
len -= 2; len -= 2;
// |c까지 찾아서 |위치까지 리턴한다. // |c까지 찾아서 |위치까지 리턴한다.
while (len > 1) // 최소 2자를 검사해야 된다. while (len > 1) // 최소 2자를 검사해야 된다.
{ {
if (*cur == L'c' && *(cur - 1) == L'|') if (*cur == L'c' && *(cur - 1) == L'|')
return (src - cur) + 1; return (src - cur) + 1;
@ -175,9 +175,9 @@ int FindColorTagStartPosition(const wchar_t * src, int src_len)
--cur; --cur;
--len; --len;
} }
return (src_len); // 못찾으면 전부;; return (src_len); // 못찾으면 전부;;
} }
// ||의 경우 // ||의 경우
else if (*cur == L'|' && *(cur - 1) == L'|') else if (*cur == L'|' && *(cur - 1) == L'|')
return 1; return 1;

View File

@ -10,8 +10,8 @@ class CThread
protected: protected:
static UINT CALLBACK EntryPoint(void * pThis); static UINT CALLBACK EntryPoint(void * pThis);
virtual UINT Setup() = 0; // Execute이 불려지기 전에 불려진다. virtual UINT Setup() = 0; // Execute이 불려지기 전에 불려진다.
virtual UINT Execute(void * arg) = 0; // 실제 쓰레드가 하는 일이 들어가는 곳 virtual UINT Execute(void * arg) = 0; // 실제 쓰레드가 하는 일이 들어가는 곳
UINT Run(void * arg); UINT Run(void * arg);

View File

@ -214,13 +214,13 @@ const char* GetFontFaceFromCodePage9x(WORD codePage)
switch( codePage ) switch( codePage )
{ {
case CP_932: case CP_932:
return "굃굍 굊긕긘긞긏"; return "MS PGothic";
case CP_949: case CP_949:
return "굴림체"; return "GulimChe";
case CP_936: case CP_936:
return "芥竟"; return "SimSun";
case CP_950: case CP_950:
return "꾄ⁿ톱"; return "MingLiU";
case CP_874: case CP_874:
return "Tahoma"; return "Tahoma";
case CP_1252: case CP_1252:
@ -332,7 +332,7 @@ void base64_decode(const char * str,char * resultStr)
{ {
i=0; i=0;
strcpy(szDest, ""); strcpy(szDest, "");
while(nCount<length && i<4) // 4개의 바이트를 얻는다. while(nCount<length && i<4) // 4개의 바이트를 얻는다.
{ {
r = str[nCount++]; r = str[nCount++];
result = __base64_get(r); result = __base64_get(r);
@ -340,13 +340,13 @@ void base64_decode(const char * str,char * resultStr)
{ {
if(result!=-1) if(result!=-1)
szDest[i++] = result; szDest[i++] = result;
else szDest[i++] = '@'; // It's end (64번은 디코딩시 사용되지 않기 때문) else szDest[i++] = '@'; // It's end (64번은 디코딩시 사용되지 않기 때문)
} }
} }
if(i==4) // 4개의 소스를 모두 얻어냈다. 디코드 시작 if(i==4) // 4개의 소스를 모두 얻어냈다. 디코드 시작
{ {
if( nCount+3 >= length ) // 데이터의 끝에 도달했다. if( nCount+3 >= length ) // 데이터의 끝에 도달했다.
{ {
if( szDest[1] == '@' ) if( szDest[1] == '@' )
{ {

View File

@ -220,11 +220,11 @@ bool Group::GetArg(const char *c_arg_base, int arg_len, TArgList & argList)
{ {
isValue = true; isValue = true;
} }
// 값이 아니고, 이름이 시작되지 않았을 경우 빈칸은 건너 뛴다. // 값이 아니고, 이름이 시작되지 않았을 경우 빈칸은 건너 뛴다.
else if (!isValue && iNameLen == 0 && isspace((unsigned char) c)) else if (!isValue && iNameLen == 0 && isspace((unsigned char) c))
{ {
} }
// 엔터는 건너 뛴다 // 엔터는 건너 뛴다
else if (c == '\r' || c == '\n') else if (c == '\r' || c == '\n')
{ {
} }
@ -350,12 +350,12 @@ bool Group::Create(const std::string & stSource)
memcpy(box_data, data_begin, data_len); memcpy(box_data, data_begin, data_len);
box_data[data_len] = '\0'; box_data[data_len] = '\0';
data_len = LocaleString_RightTrim(box_data, data_len); // 오른쪽 빈칸 자르기 data_len = LocaleString_RightTrim(box_data, data_len); // 오른쪽 빈칸 자르기
} }
{ {
const char* space = LocaleString_FindChar(box_data, data_len, ' '); const char* space = LocaleString_FindChar(box_data, data_len, ' ');
if (space) // 인자가 있음 if (space) // 인자가 있음
{ {
int name_len = space - box_data; int name_len = space - box_data;
cmd.name.assign(box_data, name_len); cmd.name.assign(box_data, name_len);
@ -371,7 +371,7 @@ bool Group::Create(const std::string & stSource)
return false; return false;
} }
} }
else // 인자가 없으므로 모든 스트링이 명령어다. else // 인자가 없으므로 모든 스트링이 명령어다.
{ {
cmd.name.assign(box_data); cmd.name.assign(box_data);
cmd.argList.clear(); cmd.argList.clear();

View File

@ -55,30 +55,30 @@ namespace script
~Group(); ~Group();
public: public:
/** 스트링으로 부터 스크립트 그룹을 만든다. /** 스트링으로 부터 스크립트 그룹을 만든다.
* *
* GetError . * GetError .
* *
* @param stSource . * @param stSource .
* @return true, false * @return true, false
*/ */
bool Create(const std::string & stSource); bool Create(const std::string & stSource);
/** 명령어를 받는 메소드 /** 명령어를 받는 메소드
* *
* @param cmd . * @param cmd .
* @return true, false * @return true, false
*/ */
bool GetCmd(TCmd & cmd); bool GetCmd(TCmd & cmd);
/* /*
. .
*/ */
bool ReadCmd(TCmd & cmd); bool ReadCmd(TCmd & cmd);
/** 에러를 출력 받는 메소드 /** 에러를 출력 받는 메소드
* *
* @return stError . * @return stError .
*/ */
std::string & GetError(); std::string & GetError();

View File

@ -258,7 +258,7 @@ size_t Arabic_MakeShape(wchar_t* src, size_t srcLen, wchar_t* dst, size_t dstLen
if (Arabic_IsInMap(cur)) if (Arabic_IsInMap(cur))
{ {
// 이전 글자 얻어내기 // 이전 글자 얻어내기
wchar_t prev = 0; wchar_t prev = 0;
{ {
size_t prevIndex = srcIndex; size_t prevIndex = srcIndex;
@ -282,7 +282,7 @@ size_t Arabic_MakeShape(wchar_t* src, size_t srcLen, wchar_t* dst, size_t dstLen
} }
} }
// 다음 글자 얻어내기 // 다음 글자 얻어내기
wchar_t next = 0; wchar_t next = 0;
{ {
size_t nextIndex = srcIndex; size_t nextIndex = srcIndex;

View File

@ -1,4 +1,4 @@
#include "stdafx.h" #include "stdafx.h"
#include "StringCodec_Vietnamese.h" #include "StringCodec_Vietnamese.h"
#pragma warning(disable: 4310) // char 짤림 경고 무시 #pragma warning(disable: 4310) // char 짤림 경고 무시
@ -551,4 +551,4 @@ int EL_String_Encode_Vietnamese(const wchar_t* wide, int wideLen, char* multi, i
} }
return dest; return dest;
} }

View File

@ -7,6 +7,7 @@
#include "EterPack.h" #include "EterPack.h"
#include "Inline.h" #include "Inline.h"
#include "EterPackPolicy_CSHybridCrypt.h"
#pragma warning(push, 3) #pragma warning(push, 3)
#include <cryptopp/cryptlib.h> #include <cryptopp/cryptlib.h>
@ -198,12 +199,16 @@ FILE * CEterPack::ms_PackLogFile = NULL;
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
CEterPack::CEterPack() : m_indexCount(0), m_indexData(NULL), m_FragmentSize(0), m_bEncrypted(false), m_bReadOnly(false), m_bDecrypedIV(false) CEterPack::CEterPack() : m_indexCount(0), m_indexData(NULL), m_FragmentSize(0), m_bEncrypted(false), m_bReadOnly(false), m_bDecrypedIV(false)
{ {
m_pCSHybridCryptPolicy = new EterPackPolicy_CSHybridCrypt;
} }
CEterPack::~CEterPack() CEterPack::~CEterPack()
{ {
Destroy(); Destroy();
delete m_pCSHybridCryptPolicy;
m_pCSHybridCryptPolicy = NULL;
} }
void CEterPack::Destroy() void CEterPack::Destroy()
@ -224,6 +229,11 @@ void CEterPack::Destroy()
memset(m_indexFileName, 0, sizeof(m_indexFileName)); memset(m_indexFileName, 0, sizeof(m_indexFileName));
} }
const std::string& CEterPack::GetPathName()
{
return m_stPathName;
}
bool CEterPack::Create(CEterFileDict& rkFileDict, const char * dbname, const char* pathName, bool bReadOnly, const BYTE* iv) bool CEterPack::Create(CEterFileDict& rkFileDict, const char * dbname, const char* pathName, bool bReadOnly, const BYTE* iv)
{ {
if (iv) if (iv)
@ -232,6 +242,8 @@ bool CEterPack::Create(CEterFileDict& rkFileDict, const char * dbname, const cha
m_bDecrypedIV = false; m_bDecrypedIV = false;
} }
m_stPathName = pathName;
strncpy(m_dbName, dbname, DBNAME_MAX_LEN); strncpy(m_dbName, dbname, DBNAME_MAX_LEN);
strncpy(m_indexFileName, dbname, MAX_PATH); strncpy(m_indexFileName, dbname, MAX_PATH);
@ -242,7 +254,7 @@ bool CEterPack::Create(CEterFileDict& rkFileDict, const char * dbname, const cha
m_bReadOnly = bReadOnly; m_bReadOnly = bReadOnly;
// bReadOnly 모드가 아니고 데이터 베이스가 열린다면 생성 실패 // bReadOnly 모드가 아니고 데이터 베이스가 열린다면 생성 실패
if (!CreateIndexFile()) if (!CreateIndexFile())
return false; return false;
@ -271,7 +283,7 @@ bool CEterPack::DecryptIV(DWORD dwPanamaKey)
if (m_stIV_Panama.length() != 32) if (m_stIV_Panama.length() != 32)
return false; return false;
if (m_bDecrypedIV) // 이미 암호화가 풀렸으면 다시 처리 안함 if (m_bDecrypedIV) // 이미 암호화가 풀렸으면 다시 처리 안함
return true; return true;
DWORD* ivs = (DWORD*)&m_stIV_Panama[0]; DWORD* ivs = (DWORD*)&m_stIV_Panama[0];
@ -462,7 +474,7 @@ bool CEterPack::__BuildIndex(CEterFileDict& rkFileDict, bool bOverwrite)
m_DataPositionMap.insert(TDataPositionMap::value_type(index->filename_crc, index)); m_DataPositionMap.insert(TDataPositionMap::value_type(index->filename_crc, index));
if (bOverwrite) // 서버 연동 패킹 파일은 나중에 들어오지만 최상위로 등록해야한다 if (bOverwrite) // 서버 연동 패킹 파일은 나중에 들어오지만 최상위로 등록해야한다
rkFileDict.UpdateItem(this, index); rkFileDict.UpdateItem(this, index);
else else
rkFileDict.InsertItem(this, index); rkFileDict.InsertItem(this, index);
@ -480,7 +492,7 @@ bool CEterPack::__BuildIndex(CEterFileDict& rkFileDict, bool bOverwrite)
// //
//void CEterPack::ClearDataMemoryMap() //void CEterPack::ClearDataMemoryMap()
//{ //{
// // m_file이 data file이다... // // m_file이 data file이다...
// m_file.Destroy(); // m_file.Destroy();
// m_tLastAccessTime = 0; // m_tLastAccessTime = 0;
// m_bIsDataLoaded = false; // m_bIsDataLoaded = false;
@ -504,8 +516,8 @@ bool CEterPack::Get(CMappedFile& out_file, const char * filename, LPCVOID * data
// m_bIsDataLoaded = true; // m_bIsDataLoaded = true;
//} //}
// 기존에는 CEterPack에서 epk를 memory map에 올려놓고, 요청이 오면 그 부분을 링크해서 넘겨 줬었는데, // 기존에는 CEterPack에서 epk를 memory map에 올려놓고, 요청이 오면 그 부분을 링크해서 넘겨 줬었는데,
// 이제는 요청이 오면, 필요한 부분만 memory map에 올리고, 요청이 끝나면 해제하게 함. // 이제는 요청이 오면, 필요한 부분만 memory map에 올리고, 요청이 끝나면 해제하게 함.
out_file.Create(m_stDataFileName.c_str(), data, index->data_position, index->data_size); out_file.Create(m_stDataFileName.c_str(), data, index->data_position, index->data_size);
bool bIsSecurityCheckRequired = ( index->compressed_type == COMPRESSED_TYPE_SECURITY || bool bIsSecurityCheckRequired = ( index->compressed_type == COMPRESSED_TYPE_SECURITY ||
@ -560,6 +572,40 @@ bool CEterPack::Get(CMappedFile& out_file, const char * filename, LPCVOID * data
out_file.BindLZObject(zObj); out_file.BindLZObject(zObj);
*data = zObj->GetBuffer(); *data = zObj->GetBuffer();
} }
else if (COMPRESSED_TYPE_PANAMA == index->compressed_type)
{
CLZObject * zObj = new CLZObject;
__Decrypt_Panama(filename, static_cast<const BYTE*>(*data), index->data_size, *zObj);
out_file.BindLZObjectWithBufferedSize(zObj);
*data = zObj->GetBuffer();
}
else if (COMPRESSED_TYPE_HYBRIDCRYPT == index->compressed_type || COMPRESSED_TYPE_HYBRIDCRYPT_WITHSDB == index->compressed_type)
{
CLZObject * zObj = new CLZObject;
if( !m_pCSHybridCryptPolicy->DecryptMemory( std::string(filename), static_cast<const BYTE*>(*data), index->data_size, *zObj) )
{
return false;
}
out_file.BindLZObjectWithBufferedSize(zObj);
if( COMPRESSED_TYPE_HYBRIDCRYPT_WITHSDB == index->compressed_type)
{
BYTE* pSDBData;
int iSDBSize;
if( !m_pCSHybridCryptPolicy->GetSupplementaryDataBlock( std::string(filename), pSDBData, iSDBSize) )
{
return false;
}
*data = out_file.AppendDataBlock( pSDBData, iSDBSize );
}
else
{
*data = zObj->GetBuffer();
}
}
return true; return true;
} }
@ -632,6 +678,41 @@ bool CEterPack::Get2(CMappedFile& out_file, const char * filename, TEterPackInde
out_file.BindLZObject(zObj); out_file.BindLZObject(zObj);
*data = zObj->GetBuffer(); *data = zObj->GetBuffer();
} }
else if (COMPRESSED_TYPE_PANAMA == index->compressed_type)
{
CLZObject * zObj = new CLZObject;
__Decrypt_Panama(filename, static_cast<const BYTE*>(*data), index->data_size, *zObj);
out_file.BindLZObjectWithBufferedSize(zObj);
*data = zObj->GetBuffer();
}
else if (COMPRESSED_TYPE_HYBRIDCRYPT == index->compressed_type || COMPRESSED_TYPE_HYBRIDCRYPT_WITHSDB == index->compressed_type)
{
CLZObject * zObj = new CLZObject;
if( !m_pCSHybridCryptPolicy->DecryptMemory( std::string(filename), static_cast<const BYTE*>(*data), index->data_size, *zObj) )
{
return false;
}
out_file.BindLZObjectWithBufferedSize(zObj);
if( COMPRESSED_TYPE_HYBRIDCRYPT_WITHSDB == index->compressed_type)
{
BYTE* pSDBData;
int iSDBSize;
if( !m_pCSHybridCryptPolicy->GetSupplementaryDataBlock( std::string(filename), pSDBData, iSDBSize) )
{
return false;
}
*data = out_file.AppendDataBlock( pSDBData, iSDBSize );
}
else
{
*data = zObj->GetBuffer();
}
}
return true; return true;
} }
@ -703,6 +784,36 @@ bool CEterPack::Extract()
writeFile.Write(zObj.GetBuffer(), zObj.GetSize()); writeFile.Write(zObj.GetBuffer(), zObj.GetSize());
zObj.Clear(); zObj.Clear();
} }
else if (COMPRESSED_TYPE_PANAMA == index->compressed_type)
{
__Decrypt_Panama(index->filename, (const BYTE *) data + index->data_position, index->data_size, zObj);
writeFile.Write(zObj.GetBuffer(), zObj.GetBufferSize());
zObj.Clear();
}
else if (COMPRESSED_TYPE_HYBRIDCRYPT == index->compressed_type || COMPRESSED_TYPE_HYBRIDCRYPT_WITHSDB == index->compressed_type)
{
if( !m_pCSHybridCryptPolicy->DecryptMemory( std::string(index->filename), (const BYTE *) data + index->data_position, index->data_size, zObj) )
return false;
if( COMPRESSED_TYPE_HYBRIDCRYPT_WITHSDB == index->compressed_type)
{
dataMapFile.BindLZObjectWithBufferedSize(&zObj);
BYTE* pSDBData;
int iSDBSize;
if( !m_pCSHybridCryptPolicy->GetSupplementaryDataBlock( std::string(index->filename), pSDBData, iSDBSize) )
return false;
dataMapFile.AppendDataBlock( pSDBData, iSDBSize );
writeFile.Write(dataMapFile.AppendDataBlock( pSDBData, iSDBSize ),dataMapFile.Size());
}
else
{
writeFile.Write(zObj.GetBuffer(), zObj.GetBufferSize());
}
zObj.Clear();
}
else if (COMPRESSED_TYPE_NONE == index->compressed_type) else if (COMPRESSED_TYPE_NONE == index->compressed_type)
writeFile.Write((const char *) data + index->data_position, index->data_size); writeFile.Write((const char *) data + index->data_position, index->data_size);
@ -754,6 +865,19 @@ bool CEterPack::Put(const char * filename, const char * sourceFilename, BYTE pac
BYTE* pMappedData = (BYTE*)data; BYTE* pMappedData = (BYTE*)data;
int iMappedDataSize = mapFile.Size(); int iMappedDataSize = mapFile.Size();
if( packType == COMPRESSED_TYPE_HYBRIDCRYPT || packType == COMPRESSED_TYPE_HYBRIDCRYPT_WITHSDB )
{
m_pCSHybridCryptPolicy->GenerateCryptKey( std::string(filename) );
if( packType == COMPRESSED_TYPE_HYBRIDCRYPT_WITHSDB )
{
if( !m_pCSHybridCryptPolicy->GenerateSupplementaryDataBlock( std::string(filename), strRelateMapName, (const BYTE*)data, mapFile.Size(), pMappedData, iMappedDataSize ))
{
return false;
}
}
}
return Put(filename, pMappedData, iMappedDataSize, packType); return Put(filename, pMappedData, iMappedDataSize, packType);
} }
@ -828,6 +952,26 @@ bool CEterPack::Put(const char * filename, LPCVOID data, long len, BYTE packType
data = zObj.GetBuffer(); data = zObj.GetBuffer();
len = zObj.GetSize(); len = zObj.GetSize();
} }
else if (packType == COMPRESSED_TYPE_PANAMA)
{
if (!__Encrypt_Panama(filename, (const BYTE *) data, len, zObj))
{
return false;
}
data = zObj.GetBuffer();
len = zObj.GetBufferSize();
}
else if (packType == COMPRESSED_TYPE_HYBRIDCRYPT || packType == COMPRESSED_TYPE_HYBRIDCRYPT_WITHSDB )
{
if( !m_pCSHybridCryptPolicy->EncryptMemory( std::string(filename), (const BYTE *)data, len, zObj ) )
{
return false;
}
data = zObj.GetBuffer();
len = zObj.GetBufferSize();
}
#ifdef CHECKSUM_CHECK_MD5 #ifdef CHECKSUM_CHECK_MD5
@ -838,15 +982,15 @@ bool CEterPack::Put(const char * filename, LPCVOID data, long len, BYTE packType
data_crc = GetCRC32((const char *) data, len); data_crc = GetCRC32((const char *) data, len);
#endif #endif
// 기존 데이터가 있으면.. // 기존 데이터가 있으면..
if (pIndex) if (pIndex)
{ {
// 기존 data 크기가 넣을 데이터 크기를 수용할 수 있다면 // 기존 data 크기가 넣을 데이터 크기를 수용할 수 있다면
if (pIndex->real_data_size >= len) if (pIndex->real_data_size >= len)
{ {
++m_map_indexRefCount[pIndex->id]; ++m_map_indexRefCount[pIndex->id];
// 길이가 틀리거나, checksum이 틀릴 때만 저장 한다. // 길이가 틀리거나, checksum이 틀릴 때만 저장 한다.
if ( (pIndex->data_size != len) || if ( (pIndex->data_size != len) ||
#ifdef CHECKSUM_CHECK_MD5 #ifdef CHECKSUM_CHECK_MD5
(memcmp( pIndex->MD5Digest, context.digest, 16 ) != 0) ) (memcmp( pIndex->MD5Digest, context.digest, 16 ) != 0) )
@ -878,13 +1022,13 @@ bool CEterPack::Put(const char * filename, LPCVOID data, long len, BYTE packType
return true; return true;
} }
// 기존 데이터 크기가 새로 들어갈 것 보다 적다면, 새로 인덱스를 할당해 // 기존 데이터 크기가 새로 들어갈 것 보다 적다면, 새로 인덱스를 할당해
// 넣어야 한다. 원래 있던 인덱스는 비워 둔다. // 넣어야 한다. 원래 있던 인덱스는 비워 둔다.
PushFreeIndex(pIndex); PushFreeIndex(pIndex);
WriteIndex(fileIndex, pIndex); WriteIndex(fileIndex, pIndex);
} }
// 새 데이터 // 새 데이터
pIndex = NewIndex(fileIndex, filename, len); pIndex = NewIndex(fileIndex, filename, len);
pIndex->data_size = len; pIndex->data_size = len;
@ -933,7 +1077,7 @@ bool CEterPack::CreateIndexFile()
return false; return false;
// //
// 파일이 없으므로 새로 만든다. // 파일이 없으므로 새로 만든다.
// //
fp = fopen(m_indexFileName, "wb"); fp = fopen(m_indexFileName, "wb");
@ -963,16 +1107,16 @@ void CEterPack::WriteIndex(CFileBase & file, TEterPackIndex * index)
} }
/* /*
* Free Block . * Free Block .
* Free Block FREE_INDEX_BLOCK_SIZE (32768) * Free Block FREE_INDEX_BLOCK_SIZE (32768)
* . * .
* *
* 128k * 128k
* 128 * 1024 / FREE_INDEX_BLOCK_SIZE = 4 * 128 * 1024 / FREE_INDEX_BLOCK_SIZE = 4
* m_FreeIndexList[4] . * m_FreeIndexList[4] .
* *
* FREE_INDEX_BLOCK_SIZE FREE_INDEX_MAX_SIZE(512) . * FREE_INDEX_BLOCK_SIZE FREE_INDEX_MAX_SIZE(512) .
* 16MB 512 . * 16MB 512 .
*/ */
int CEterPack::GetFreeBlockIndex(long size) int CEterPack::GetFreeBlockIndex(long size)
{ {
@ -1009,7 +1153,7 @@ TEterPackIndex* CEterPack::NewIndex(CFileBase& file, const char* filename, long
{ {
TEterPackIndex* index = NULL; TEterPackIndex* index = NULL;
int block_size = size + (DATA_BLOCK_SIZE - (size % DATA_BLOCK_SIZE)); int block_size = size + (DATA_BLOCK_SIZE - (size % DATA_BLOCK_SIZE));
// if ((index = FindIndex(filename))) // 이미 인덱스가 존재하는지 확인 // if ((index = FindIndex(filename))) // 이미 인덱스가 존재하는지 확인
// return index; // return index;
int blockidx = GetFreeBlockIndex(block_size); int blockidx = GetFreeBlockIndex(block_size);
@ -1179,7 +1323,7 @@ const char * CEterPack::GetDBName()
void CEterPack::__CreateFileNameKey_Panama(const char * filename, BYTE * key, unsigned int keySize) void CEterPack::__CreateFileNameKey_Panama(const char * filename, BYTE * key, unsigned int keySize)
{ {
// 키 암호화 // 키 암호화
if (keySize != 32) if (keySize != 32)
return; return;
@ -1221,7 +1365,7 @@ void CEterPack::__CreateFileNameKey_Panama(const char * filename, BYTE * key, un
) // HashFilter ) // HashFilter
); // StringSource ); // StringSource
// 만들어진 키의 첫번째 4바이트로 다음 16바이트 키 생성 알고리즘 선택 // 만들어진 키의 첫번째 4바이트로 다음 16바이트 키 생성 알고리즘 선택
unsigned int idx2 = *(unsigned int*) key; unsigned int idx2 = *(unsigned int*) key;
switch (idx2 & 3) switch (idx2 & 3)
@ -1250,14 +1394,14 @@ void CEterPack::__CreateFileNameKey_Panama(const char * filename, BYTE * key, un
//) // HexEncoder //) // HexEncoder
) // HashFilter ) // HashFilter
); // StringSource ); // StringSource
// 키 생성 완료 // 키 생성 완료
} }
bool CEterPack::__Encrypt_Panama(const char* filename, const BYTE* data, SIZE_T dataSize, CLZObject& zObj) bool CEterPack::__Encrypt_Panama(const char* filename, const BYTE* data, SIZE_T dataSize, CLZObject& zObj)
{ {
if (32 != m_stIV_Panama.length()) if (32 != m_stIV_Panama.length())
{ {
// 해커가 이 메세지를 보면 힌트를 얻을까봐 디버그에서만 출력 // 해커가 이 메세지를 보면 힌트를 얻을까봐 디버그에서만 출력
#ifdef _DEBUG #ifdef _DEBUG
TraceError("IV not set (filename: %s)", filename); TraceError("IV not set (filename: %s)", filename);
#endif #endif
@ -1279,7 +1423,7 @@ bool CEterPack::__Encrypt_Panama(const char* filename, const BYTE* data, SIZE_T
__CreateFileNameKey_Panama(filename, key, sizeof(key)); __CreateFileNameKey_Panama(filename, key, sizeof(key));
Encryptor.SetKeyWithIV(key, sizeof(key), (const BYTE*) m_stIV_Panama.c_str(), 32); Encryptor.SetKeyWithIV(key, sizeof(key), (const BYTE*) m_stIV_Panama.c_str(), 32);
// MandatoryBlockSize에 나누어 떨어지게 만들고 최대 2048 바이트만 // MandatoryBlockSize에 나누어 떨어지게 만들고 최대 2048 바이트만
DWORD cryptSize = dataSize - (dataSize % Encryptor.MandatoryBlockSize()); DWORD cryptSize = dataSize - (dataSize % Encryptor.MandatoryBlockSize());
cryptSize = cryptSize > 2048 ? 2048 : cryptSize; cryptSize = cryptSize > 2048 ? 2048 : cryptSize;
@ -1314,7 +1458,7 @@ bool CEterPack::__Decrypt_Panama(const char* filename, const BYTE* data, SIZE_T
{ {
if (32 != m_stIV_Panama.length()) if (32 != m_stIV_Panama.length())
{ {
// 해커가 이 메세지를 보면 힌트를 얻을까봐 디버그에서만 출력 // 해커가 이 메세지를 보면 힌트를 얻을까봐 디버그에서만 출력
#ifdef _DEBUG #ifdef _DEBUG
TraceError("IV not set (filename: %s)", filename); TraceError("IV not set (filename: %s)", filename);
#endif #endif
@ -1328,7 +1472,7 @@ bool CEterPack::__Decrypt_Panama(const char* filename, const BYTE* data, SIZE_T
__CreateFileNameKey_Panama(filename, key, sizeof(key)); __CreateFileNameKey_Panama(filename, key, sizeof(key));
Decryptor.SetKeyWithIV(key, sizeof(key), (const BYTE*) m_stIV_Panama.c_str(), 32); Decryptor.SetKeyWithIV(key, sizeof(key), (const BYTE*) m_stIV_Panama.c_str(), 32);
// MandatoryBlockSize에 나누어 떨어지게 만들고 최대 2048 바이트만 // MandatoryBlockSize에 나누어 떨어지게 만들고 최대 2048 바이트만
DWORD cryptSize = dataSize - (dataSize % Decryptor.MandatoryBlockSize()); DWORD cryptSize = dataSize - (dataSize % Decryptor.MandatoryBlockSize());
cryptSize = cryptSize > 2048 ? 2048 : cryptSize; cryptSize = cryptSize > 2048 ? 2048 : cryptSize;
@ -1359,6 +1503,11 @@ bool CEterPack::__Decrypt_Panama(const char* filename, const BYTE* data, SIZE_T
return true; return true;
} }
EterPackPolicy_CSHybridCrypt* CEterPack::GetPackPolicy_HybridCrypt() const
{
return m_pCSHybridCryptPolicy;
}
///////////////////////// /////////////////////////

View File

@ -100,6 +100,8 @@ private:
TDict m_dict; TDict m_dict;
}; };
class EterPackPolicy_CSHybridCrypt;
class CEterPack class CEterPack
{ {
public: public:
@ -110,6 +112,7 @@ class CEterPack
bool Create(CEterFileDict& rkFileDict, const char * dbname, const char * pathName, bool bReadOnly = true, const BYTE* iv = NULL); bool Create(CEterFileDict& rkFileDict, const char * dbname, const char * pathName, bool bReadOnly = true, const BYTE* iv = NULL);
bool DecryptIV(DWORD dwPanamaKey); bool DecryptIV(DWORD dwPanamaKey);
const std::string& GetPathName();
const char * GetDBName(); const char * GetDBName();
bool Get(CMappedFile & mappedFile, const char * filename, LPCVOID * data); bool Get(CMappedFile & mappedFile, const char * filename, LPCVOID * data);
@ -131,9 +134,11 @@ class CEterPack
bool EncryptIndexFile(); bool EncryptIndexFile();
bool DecryptIndexFile(); bool DecryptIndexFile();
DWORD DeleteUnreferencedData(); // 몇개가 삭제 되었는지 리턴 한다. DWORD DeleteUnreferencedData(); // 몇개가 삭제 되었는지 리턴 한다.
bool GetNames(std::vector<std::string>* retNames); bool GetNames(std::vector<std::string>* retNames);
EterPackPolicy_CSHybridCrypt* GetPackPolicy_HybridCrypt() const;
private: private:
bool __BuildIndex(CEterFileDict& rkFileDict, bool bOverwirte=false); bool __BuildIndex(CEterFileDict& rkFileDict, bool bOverwirte=false);
@ -172,9 +177,13 @@ class CEterPack
std::unordered_map<DWORD, DWORD> m_map_indexRefCount; std::unordered_map<DWORD, DWORD> m_map_indexRefCount;
TDataPositionMap m_DataPositionMap; TDataPositionMap m_DataPositionMap;
TFreeIndexList m_FreeIndexList[FREE_INDEX_MAX_SIZE + 1]; // MAX 도 억세스 하므로 + 1 크기만큼 만든다. TFreeIndexList m_FreeIndexList[FREE_INDEX_MAX_SIZE + 1]; // MAX 도 억세스 하므로 + 1 크기만큼 만든다.
std::string m_stDataFileName; std::string m_stDataFileName;
std::string m_stPathName;
EterPackPolicy_CSHybridCrypt* m_pCSHybridCryptPolicy;
private: private:
void __CreateFileNameKey_Panama(const char * filename, BYTE * key, unsigned int keySize); void __CreateFileNameKey_Panama(const char * filename, BYTE * key, unsigned int keySize);
@ -184,8 +193,8 @@ class CEterPack
//private: //private:
// bool m_bIsDataLoaded; // bool m_bIsDataLoaded;
// // 그냥 time_t를 쓰면, 32bit time_t를 사용하는 소스에서는, // // 그냥 time_t를 쓰면, 32bit time_t를 사용하는 소스에서는,
// // CEterPack의 size를 실제 size - 4로 인식하기 때문에 문제가 발생할 수 있다. // // CEterPack의 size를 실제 size - 4로 인식하기 때문에 문제가 발생할 수 있다.
// __time64_t m_tLastAccessTime; // __time64_t m_tLastAccessTime;
//public: //public:
// __time64_t GetLastAccessTime() { return m_tLastAccessTime; } // __time64_t GetLastAccessTime() { return m_tLastAccessTime; }

View File

@ -191,8 +191,7 @@
<Optimization Condition="'$(Configuration)|$(Platform)'=='Distribute|Win32'">MaxSpeed</Optimization> <Optimization Condition="'$(Configuration)|$(Platform)'=='Distribute|Win32'">MaxSpeed</Optimization>
<Optimization Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">MaxSpeed</Optimization> <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">MaxSpeed</Optimization>
</ClCompile> </ClCompile>
<ClCompile Include="FileProvider.cpp" /> <ClCompile Include="EterPackPolicy_CSHybridCrypt.cpp" />
<ClCompile Include="Folder.cpp" />
<ClCompile Include="md5.c" /> <ClCompile Include="md5.c" />
<ClCompile Include="StdAfx.cpp"> <ClCompile Include="StdAfx.cpp">
<Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Disabled</Optimization> <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Disabled</Optimization>
@ -202,18 +201,15 @@
<Optimization Condition="'$(Configuration)|$(Platform)'=='Distribute|Win32'">MaxSpeed</Optimization> <Optimization Condition="'$(Configuration)|$(Platform)'=='Distribute|Win32'">MaxSpeed</Optimization>
<Optimization Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">MaxSpeed</Optimization> <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">MaxSpeed</Optimization>
</ClCompile> </ClCompile>
<ClCompile Include="ZIP.cpp" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClInclude Include="EterPack.h" /> <ClInclude Include="EterPack.h" />
<ClInclude Include="EterPackCursor.h" /> <ClInclude Include="EterPackCursor.h" />
<ClInclude Include="EterPackManager.h" /> <ClInclude Include="EterPackManager.h" />
<ClInclude Include="FileProvider.h" /> <ClInclude Include="EterPackPolicy_CSHybridCrypt.h" />
<ClInclude Include="Folder.h" />
<ClInclude Include="Inline.h" /> <ClInclude Include="Inline.h" />
<ClInclude Include="md5.h" /> <ClInclude Include="md5.h" />
<ClInclude Include="StdAfx.h" /> <ClInclude Include="StdAfx.h" />
<ClInclude Include="ZIP.h" />
</ItemGroup> </ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets"> <ImportGroup Label="ExtensionTargets">

View File

@ -9,9 +9,6 @@
<UniqueIdentifier>{c156ef19-8b61-496c-a499-8bf66e9ca80d}</UniqueIdentifier> <UniqueIdentifier>{c156ef19-8b61-496c-a499-8bf66e9ca80d}</UniqueIdentifier>
<Extensions>h;hpp;hxx;hm;inl</Extensions> <Extensions>h;hpp;hxx;hm;inl</Extensions>
</Filter> </Filter>
<Filter Include="File Providers">
<UniqueIdentifier>{6348898e-222d-4516-8d4e-e37f9e17d872}</UniqueIdentifier>
</Filter>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClCompile Include="EterPack.cpp"> <ClCompile Include="EterPack.cpp">
@ -23,21 +20,15 @@
<ClCompile Include="EterPackManager.cpp"> <ClCompile Include="EterPackManager.cpp">
<Filter>Source Files</Filter> <Filter>Source Files</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="EterPackPolicy_CSHybridCrypt.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="md5.c"> <ClCompile Include="md5.c">
<Filter>Source Files</Filter> <Filter>Source Files</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="StdAfx.cpp"> <ClCompile Include="StdAfx.cpp">
<Filter>Source Files</Filter> <Filter>Source Files</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="FileProvider.cpp">
<Filter>File Providers</Filter>
</ClCompile>
<ClCompile Include="Folder.cpp">
<Filter>File Providers</Filter>
</ClCompile>
<ClCompile Include="ZIP.cpp">
<Filter>File Providers</Filter>
</ClCompile>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClInclude Include="EterPack.h"> <ClInclude Include="EterPack.h">
@ -49,6 +40,9 @@
<ClInclude Include="EterPackManager.h"> <ClInclude Include="EterPackManager.h">
<Filter>Header Files</Filter> <Filter>Header Files</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="EterPackPolicy_CSHybridCrypt.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="Inline.h"> <ClInclude Include="Inline.h">
<Filter>Header Files</Filter> <Filter>Header Files</Filter>
</ClInclude> </ClInclude>
@ -58,14 +52,5 @@
<ClInclude Include="StdAfx.h"> <ClInclude Include="StdAfx.h">
<Filter>Header Files</Filter> <Filter>Header Files</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="Folder.h">
<Filter>File Providers</Filter>
</ClInclude>
<ClInclude Include="ZIP.h">
<Filter>File Providers</Filter>
</ClInclude>
<ClInclude Include="FileProvider.h">
<Filter>File Providers</Filter>
</ClInclude>
</ItemGroup> </ItemGroup>
</Project> </Project>

View File

@ -4,16 +4,38 @@
#include <assert.h> #include <assert.h>
#include "EterPackManager.h" #include "EterPackManager.h"
#include "EterPackPolicy_CSHybridCrypt.h"
#include "../eterBase/Debug.h" #include "../eterBase/Debug.h"
#include "../eterBase/CRC32.h" #include "../eterBase/CRC32.h"
#include "Folder.h"
#include "ZIP.h"
#define PATH_ABSOLUTE_YMIRWORK1 "d:/ymir work/" #define PATH_ABSOLUTE_YMIRWORK1 "d:/ymir work/"
#define PATH_ABSOLUTE_YMIRWORK2 "d:\\ymir work\\" #define PATH_ABSOLUTE_YMIRWORK2 "d:\\ymir work\\"
CEterPack* CEterPackManager::FindPack(const char* c_szPathName)
{
std::string strFileName;
if (0 == ConvertFileName(c_szPathName, strFileName))
{
return &m_RootPack;
}
else
{
for (TEterPackMap::iterator itor = m_DirPackMap.begin(); itor != m_DirPackMap.end(); ++itor)
{
const std::string & c_rstrName = itor->first;
CEterPack * pEterPack = itor->second;
if (CompareName(c_rstrName.c_str(), c_rstrName.length(), strFileName.c_str()))
{
return pEterPack;
}
}
}
return NULL;
}
void CEterPackManager::SetCacheMode() void CEterPackManager::SetCacheMode()
{ {
@ -26,19 +48,26 @@ void CEterPackManager::SetRelativePathMode()
} }
// StringPath std::string 버전 // StringPath std::string 버전
std::string CEterPackManager::ConvertFileName(std::string fileName) int CEterPackManager::ConvertFileName(const char * c_szFileName, std::string & rstrFileName)
{ {
std::string convertedFileName = fileName; rstrFileName = c_szFileName;
stl_lowers(convertedFileName); stl_lowers(rstrFileName);
for (DWORD i = 0; i < convertedFileName.length(); i++) int iCount = 0;
for (DWORD i = 0; i < rstrFileName.length(); ++i)
{ {
if (convertedFileName[i] == '\\') if (rstrFileName[i] == '/')
convertedFileName[i] = '/'; ++iCount;
else if (rstrFileName[i] == '\\')
{
rstrFileName[i] = '/';
++iCount;
}
} }
return convertedFileName; return iCount;
} }
bool CEterPackManager::CompareName(const char * c_szDirectoryName, DWORD /*dwLength*/, const char * c_szFileName) bool CEterPackManager::CompareName(const char * c_szDirectoryName, DWORD /*dwLength*/, const char * c_szFileName)
@ -63,7 +92,11 @@ void CEterPackManager::LoadStaticCache(const char* c_szFileName)
if (!m_isCacheMode) if (!m_isCacheMode)
return; return;
std::string strFileName = ConvertFileName(c_szFileName); std::string strFileName;
if (0 == ConvertFileName(c_szFileName, strFileName))
{
return;
}
DWORD dwFileNameHash = GetCRC32(strFileName.c_str(), strFileName.length()); DWORD dwFileNameHash = GetCRC32(strFileName.c_str(), strFileName.length());
@ -159,47 +192,66 @@ bool CEterPackManager::GetFromPack(CMappedFile & rMappedFile, const char * c_szF
{ {
FinderLock lock(m_csFinder); FinderLock lock(m_csFinder);
std::string strFileName = ConvertFileName(c_szFileName); static std::string strFileName;
DWORD dwFileNameHash = GetCRC32(strFileName.c_str(), strFileName.length()); if (0 == ConvertFileName(c_szFileName, strFileName))
SCache* pkCache = __FindCache(dwFileNameHash);
if (pkCache)
{ {
rMappedFile.Link(pkCache->m_dwBufSize, pkCache->m_abBufData); return m_RootPack.Get(rMappedFile, strFileName.c_str(), pData);
return true;
} }
else
{
DWORD dwFileNameHash = GetCRC32(strFileName.c_str(), strFileName.length());
SCache* pkCache = __FindCache(dwFileNameHash);
auto pkFileItem = m_FileDict.find(dwFileNameHash); if (pkCache)
{
rMappedFile.Link(pkCache->m_dwBufSize, pkCache->m_abBufData);
return true;
}
if (pkFileItem == m_FileDict.end()) { CEterFileDict::Item* pkFileItem = m_FileDict.GetItem(dwFileNameHash, strFileName.c_str());
if (pkFileItem)
if (pkFileItem->pkPack)
{
bool r = pkFileItem->pkPack->Get2(rMappedFile, strFileName.c_str(), pkFileItem->pkInfo, pData);
//pkFileItem->pkPack->ClearDataMemoryMap();
return r;
}
}
#ifdef _DEBUG #ifdef _DEBUG
TraceError("CANNOT_FIND_PACK_FILE [%s]", strFileName.c_str()); TraceError("CANNOT_FIND_PACK_FILE [%s]", strFileName.c_str());
#endif #endif
return false; return false;
}
auto data = std::make_shared<std::vector<char>>();
bool r = pkFileItem->second->getFile(strFileName, data);
// Keep the file loaded by always forcing a reference in the smart pointer (temporary hack)
keepDataReferencedArray.push_back(data);
rMappedFile.Link(data->size(), data->data());
*pData = (LPCVOID *) data->data();
return r;
} }
const time_t g_tCachingInterval = 10; // 10초 const time_t g_tCachingInterval = 10; // 10초
void CEterPackManager::ArrangeMemoryMappedPack()
{
//time_t curTime = time(NULL);
//CEterFileDict::TDict dict = m_FileDict.GetDict();
//for (CEterFileDict::TDict::iterator it = dict.begin(); it != dict.end(); ++it)
//{
// CEterFileDict::Item &rFileItem = it->second;
// CEterPack* pkPack = rFileItem.pkPack;
// if (pkPack)
// {
// if (curTime - pkPack->GetLastAccessTime() > g_tCachingInterval)
// {
// pkPack->ClearDataMemoryMap();
// }
// }
//}
}
bool CEterPackManager::GetFromFile(CMappedFile & rMappedFile, const char * c_szFileName, LPCVOID * pData) bool CEterPackManager::GetFromFile(CMappedFile & rMappedFile, const char * c_szFileName, LPCVOID * pData)
{ {
#ifndef _DEBUG #ifndef _DEBUG
//const char *pcExt = strchr(c_szFileName, '.'); //const char *pcExt = strchr(c_szFileName, '.');
//if (pcExt && //if (pcExt &&
// _strnicmp(pcExt, ".py", 3) == 0 && // python 스크립트 중 // _strnicmp(pcExt, ".py", 3) == 0 && // python 스크립트 중
// stricmp(c_szFileName, "logininfo.py") != 0 && // 로그인 정보 파일이 아니고 // stricmp(c_szFileName, "logininfo.py") != 0 && // 로그인 정보 파일이 아니고
// strnicmp(c_szFileName, "locale", 6) != 0 // strnicmp(c_szFileName, "locale", 6) != 0
// ) // )
//{ //{
@ -221,16 +273,24 @@ bool CEterPackManager::GetFromFile(CMappedFile & rMappedFile, const char * c_szF
bool CEterPackManager::isExistInPack(const char * c_szFileName) bool CEterPackManager::isExistInPack(const char * c_szFileName)
{ {
std::string strFileName = ConvertFileName(c_szFileName); std::string strFileName;
DWORD dwFileNameHash = GetCRC32(strFileName.c_str(), strFileName.length()); if (0 == ConvertFileName(c_szFileName, strFileName))
auto pkFileItem = m_FileDict.find(dwFileNameHash); {
return m_RootPack.IsExist(strFileName.c_str());
}
else
{
DWORD dwFileNameHash = GetCRC32(strFileName.c_str(), strFileName.length());
CEterFileDict::Item* pkFileItem = m_FileDict.GetItem(dwFileNameHash, strFileName.c_str());
if (pkFileItem == m_FileDict.end()) if (pkFileItem)
return false; if (pkFileItem->pkPack)
return pkFileItem->pkPack->IsExist(strFileName.c_str());
}
if (pkFileItem->second) // NOTE : 매치 되는 팩이 없다면 false - [levites]
return pkFileItem->second->fileExists(strFileName.c_str()); return false;
} }
bool CEterPackManager::isExist(const char * c_szFileName) bool CEterPackManager::isExist(const char * c_szFileName)
@ -257,38 +317,82 @@ bool CEterPackManager::isExist(const char * c_szFileName)
} }
void CEterPackManager::RegisterRootPack(const char * c_szName)
{
if (!m_RootPack.Create(m_FileDict, c_szName, ""))
{
TraceError("%s: Pack file does not exist", c_szName);
}
}
const char * CEterPackManager::GetRootPackFileName()
{
return m_RootPack.GetDBName();
}
bool CEterPackManager::DecryptPackIV(DWORD dwPanamaKey)
{
TEterPackMap::iterator itor = m_PackMap.begin();
while (itor != m_PackMap.end())
{
itor->second->DecryptIV(dwPanamaKey);
itor++;
}
return true;
}
bool CEterPackManager::RegisterPackWhenPackMaking(const char * c_szName, const char * c_szDirectory, CEterPack* pPack)
{
m_PackMap.insert(TEterPackMap::value_type(c_szName, pPack));
m_PackList.push_front(pPack);
m_DirPackMap.insert(TEterPackMap::value_type(c_szDirectory, pPack));
return true;
}
bool CEterPackManager::RegisterPack(const char * c_szName, const char * c_szDirectory, const BYTE* c_pbIV) bool CEterPackManager::RegisterPack(const char * c_szName, const char * c_szDirectory, const BYTE* c_pbIV)
{ {
auto it = m_PackMap.find(c_szName); CEterPack * pEterPack = NULL;
if (it != m_PackMap.end())
return true;
try {
bool bReadOnly = true;
std::shared_ptr<FileProvider> pack;
// TODO: allow configurable containers
//pack = std::make_shared<Folder>(c_szName);
pack = std::make_shared<ZIP>(std::string(c_szName) + ".zip");
auto packFiles = pack->listFiles();
for (auto const& fileName : packFiles) {
DWORD dwFileNameHash = GetCRC32(fileName.c_str(), fileName.length());
m_FileDict.insert({ dwFileNameHash, pack });
}
m_PackMap.insert(TEterPackMap::value_type(c_szName, pack));
}
catch (...)
{ {
TEterPackMap::iterator itor = m_PackMap.find(c_szName);
if (m_PackMap.end() == itor)
{
bool bReadOnly = true;
pEterPack = new CEterPack;
if (pEterPack->Create(m_FileDict, c_szName, c_szDirectory, bReadOnly, c_pbIV))
{
m_PackMap.insert(TEterPackMap::value_type(c_szName, pEterPack));
}
else
{
#ifdef _DEBUG #ifdef _DEBUG
Tracef("The eterpack doesn't exist [%s]\n", c_szName); Tracef("The eterpack doesn't exist [%s]\n", c_szName);
#endif #endif
delete pEterPack;
pEterPack = NULL;
return false;
}
}
else
{
pEterPack = itor->second;
}
} }
if (c_szDirectory && c_szDirectory[0] != '*')
{
TEterPackMap::iterator itor = m_DirPackMap.find(c_szDirectory);
if (m_DirPackMap.end() == itor)
{
m_PackList.push_front(pEterPack);
m_DirPackMap.insert(TEterPackMap::value_type(c_szDirectory, pEterPack));
}
}
return true;
} }
void CEterPackManager::SetSearchMode(bool bPackFirst) void CEterPackManager::SetSearchMode(bool bPackFirst)
@ -310,5 +414,200 @@ CEterPackManager::~CEterPackManager()
{ {
__ClearCacheMap(); __ClearCacheMap();
TEterPackMap::iterator i = m_PackMap.begin();
TEterPackMap::iterator e = m_PackMap.end();
while (i != e)
{
delete i->second;
i++;
}
DeleteCriticalSection(&m_csFinder); DeleteCriticalSection(&m_csFinder);
} }
void CEterPackManager::RetrieveHybridCryptPackKeys(const BYTE *pStream)
{
////dump file format
//total packagecnt (4byte)
// for packagecntpackage
// db name hash ( stl.h stringhash )
// extension cnt( 4byte)
// for extension cnt
// ext hash ( stl.h stringhash )
// key-16byte
// iv-16byte
int iMemOffset = 0;
int iPackageCnt;
DWORD dwPackageNameHash;
memcpy( &iPackageCnt, pStream + iMemOffset, sizeof(int) );
iMemOffset += sizeof(iPackageCnt);
for( int i = 0; i < iPackageCnt; ++i )
{
int iRecvedCryptKeySize = 0;
memcpy( &iRecvedCryptKeySize, pStream + iMemOffset, sizeof(iRecvedCryptKeySize) );
iRecvedCryptKeySize -= sizeof(dwPackageNameHash); // 서버에서 받은 key stream에는 filename hash가 포함되어 있으므로, hash 사이즈 만큼 배줌.
iMemOffset += sizeof(iRecvedCryptKeySize);
memcpy( &dwPackageNameHash, pStream + iMemOffset, sizeof(dwPackageNameHash) );
iMemOffset += sizeof(dwPackageNameHash);
TEterPackMap::const_iterator cit;
for( cit = m_PackMap.begin(); cit != m_PackMap.end(); ++cit )
{
std::string noPathName = CFileNameHelper::NoPath(std::string(cit->first));
if( dwPackageNameHash == stringhash().GetHash(noPathName) )
{
EterPackPolicy_CSHybridCrypt* pCryptPolicy = cit->second->GetPackPolicy_HybridCrypt();
int iHavedCryptKeySize = pCryptPolicy->ReadCryptKeyInfoFromStream( pStream + iMemOffset );
if (iRecvedCryptKeySize != iHavedCryptKeySize)
{
TraceError("CEterPackManager::RetrieveHybridCryptPackKeys cryptokey length of file(%s) is not matched. received(%d) != haved(%d)", noPathName.c_str(), iRecvedCryptKeySize, iHavedCryptKeySize);
}
break;
}
}
iMemOffset += iRecvedCryptKeySize;
}
}
void CEterPackManager::RetrieveHybridCryptPackSDB( const BYTE* pStream )
{
//cnt
//for cnt
//DWORD dwPackageIdentifier;
//DWORD dwFileIdentifier;
//std::vector<BYTE> vecSDBStream;
int iReadOffset = 0;
int iSDBInfoCount = 0;
memcpy( &iSDBInfoCount, pStream+iReadOffset, sizeof(int) );
iReadOffset += sizeof(int);
for( int i = 0; i < iSDBInfoCount; ++i )
{
DWORD dwPackgeIdentifier;
memcpy( &dwPackgeIdentifier, pStream+iReadOffset, sizeof(DWORD) );
iReadOffset += sizeof(DWORD);
TEterPackMap::const_iterator cit;
for( cit = m_PackMap.begin(); cit != m_PackMap.end(); ++cit )
{
std::string noPathName = CFileNameHelper::NoPath(std::string(cit->first));
if( dwPackgeIdentifier == stringhash().GetHash(noPathName) )
{
EterPackPolicy_CSHybridCrypt* pCryptPolicy = cit->second->GetPackPolicy_HybridCrypt();
iReadOffset += pCryptPolicy->ReadSupplementatyDataBlockFromStream( pStream+iReadOffset );
break;
}
}
}
}
void CEterPackManager::WriteHybridCryptPackInfo(const char* pFileName)
{
//NOTE : this file format contains a little bit of redundant data.
//however it`s better for seperating cryptkey & supplementary data block.
//dump file format
//SDB data offset(4)
// about cryptkey
//total packagecnt (4byte)
// for packagecnt
// db name hash 4byte( stl.h stringhash )
// extension cnt( 4byte)
// for extension cnt
// ext hash ( stl.h stringhash )
// key-16byte
// iv-16byte
//about SDB data
//total packagecnt (4byte)
// for packagecnt
// db name hash 4byte( stl.h stringhash ) +child node size(4byte)
// sdb file cnt( 4byte )
// for sdb file cnt
// filename hash ( stl.h stringhash )
// related map name size(4), relate map name
// sdb block size( 1byte )
// sdb blocks
CFileBase keyFile;
if( !keyFile.Create( pFileName, CFileBase::FILEMODE_WRITE) )
{
//TODO : write log
return;
}
int iKeyPackageCount = 0;
//write later ( SDB Offset & PackageCnt for Key )
keyFile.SeekCur(2*sizeof(int));
TEterPackMap::const_iterator cit;
for( cit = m_PackMap.begin(); cit != m_PackMap.end(); ++cit )
{
EterPackPolicy_CSHybridCrypt* pPolicy = cit->second->GetPackPolicy_HybridCrypt();
if( !pPolicy || !pPolicy->IsContainingCryptKey() )
continue;
iKeyPackageCount++;
std::string noPathName = CFileNameHelper::NoPath(std::string(cit->first));
DWORD dwPackNamehash = stringhash().GetHash(noPathName);
CMakePackLog::GetSingleton().Writef("CEterPackManager::WriteHybridCryptPackInfo PackName : %s, Hash : %x", noPathName.c_str(), dwPackNamehash);
keyFile.Write( &dwPackNamehash, sizeof(DWORD) );
pPolicy->WriteCryptKeyToFile( keyFile );
}
//Write SDB Data
int iSDBDataOffset = keyFile.GetPosition();
int iSDBPackageCnt = 0;
//Write SDB PackageCnt Later
keyFile.SeekCur(sizeof(int));
for( cit = m_PackMap.begin(); cit != m_PackMap.end(); ++cit )
{
EterPackPolicy_CSHybridCrypt* pPolicy = cit->second->GetPackPolicy_HybridCrypt();
if( !pPolicy || !pPolicy->IsContainingSDBFile() )
continue;
iSDBPackageCnt++;
std::string noPathName = CFileNameHelper::NoPath(std::string(cit->first));
DWORD dwPackNamehash = stringhash().GetHash(noPathName);
keyFile.Write( &dwPackNamehash, sizeof(DWORD) );
int iSDBSizeWriteOffset = keyFile.GetPosition();
keyFile.SeekCur(sizeof(int));
pPolicy->WriteSupplementaryDataBlockToFile( keyFile );
int iSDBSizeAfterWrite = keyFile.GetPosition();
keyFile.Seek(iSDBSizeWriteOffset);
int iSDBSize = iSDBSizeAfterWrite-(iSDBSizeWriteOffset+4);
keyFile.Write( &iSDBSize, sizeof(int) );
keyFile.Seek(iSDBSizeAfterWrite);
}
//write sdb data start offset & package cnt
keyFile.Seek(0);
keyFile.Write( &iSDBDataOffset, sizeof(int));
keyFile.Write( &iKeyPackageCount, sizeof(int));
keyFile.Seek(iSDBDataOffset);
keyFile.Write( &iSDBPackageCnt, sizeof(int));
keyFile.Close();
}

View File

@ -5,7 +5,6 @@
#include "../eterBase/Singleton.h" #include "../eterBase/Singleton.h"
#include "../eterBase/Stl.h" #include "../eterBase/Stl.h"
#include "FileProvider.h"
#include "EterPack.h" #include "EterPack.h"
class CEterPackManager : public CSingleton<CEterPackManager> class CEterPackManager : public CSingleton<CEterPackManager>
@ -23,8 +22,8 @@ class CEterPackManager : public CSingleton<CEterPackManager>
SEARCH_PACK_FIRST SEARCH_PACK_FIRST
}; };
typedef std::list<std::shared_ptr<FileProvider>> TEterPackList; typedef std::list<CEterPack*> TEterPackList;
typedef std::unordered_map<std::string, std::shared_ptr<FileProvider>, stringhash> TEterPackMap; typedef std::unordered_map<std::string, CEterPack*, stringhash> TEterPackMap;
public: public:
CEterPackManager(); CEterPackManager();
@ -46,13 +45,30 @@ class CEterPackManager : public CSingleton<CEterPackManager>
bool isExist(const char * c_szFileName); bool isExist(const char * c_szFileName);
bool isExistInPack(const char * c_szFileName); bool isExistInPack(const char * c_szFileName);
bool RegisterPack(const char * c_szName, const char * c_szDirectory, const BYTE* c_pbIV = NULL); bool RegisterPack(const char * c_szName, const char * c_szDirectory, const BYTE* c_pbIV = NULL);
std::string ConvertFileName(std::string fileName); void RegisterRootPack(const char * c_szName);
bool RegisterPackWhenPackMaking(const char * c_szName, const char * c_szDirectory, CEterPack* pPack);
bool DecryptPackIV(DWORD key);
const char * GetRootPackFileName();
//for hybridcrypt
void WriteHybridCryptPackInfo(const char* pFileName);
void RetrieveHybridCryptPackKeys( const BYTE* pStream );
void RetrieveHybridCryptPackSDB( const BYTE* pStream );
// 메모리에 매핑된 팩들 가운데, 정리해야할 것들 정리.
public:
void ArrangeMemoryMappedPack();
protected: protected:
int ConvertFileName(const char * c_szFileName, std::string & rstrFileName); // StringPath std::string 버전
bool CompareName(const char * c_szDirectoryName, DWORD iLength, const char * c_szFileName); bool CompareName(const char * c_szDirectoryName, DWORD iLength, const char * c_szFileName);
std::shared_ptr<FileProvider> FindPack(const char* c_szPathName); CEterPack* FindPack(const char* c_szPathName);
SCache* __FindCache(DWORD dwFileNameHash); SCache* __FindCache(DWORD dwFileNameHash);
void __ClearCacheMap(); void __ClearCacheMap();
@ -62,12 +78,13 @@ class CEterPackManager : public CSingleton<CEterPackManager>
bool m_isCacheMode; bool m_isCacheMode;
int m_iSearchMode; int m_iSearchMode;
std::unordered_map<DWORD, std::shared_ptr<FileProvider>> m_FileDict; CEterFileDict m_FileDict;
TEterPackMap m_PackMap; CEterPack m_RootPack;
TEterPackList m_PackList;
TEterPackMap m_PackMap;
TEterPackMap m_DirPackMap;
std::unordered_map<DWORD, SCache> m_kMap_dwNameKey_kCache; std::unordered_map<DWORD, SCache> m_kMap_dwNameKey_kCache;
std::vector<std::shared_ptr<std::vector<char>>> keepDataReferencedArray;
CRITICAL_SECTION m_csFinder; CRITICAL_SECTION m_csFinder;
}; };

View File

@ -1 +0,0 @@
#include "FileProvider.h"

View File

@ -1,16 +0,0 @@
#pragma once
#include <vector>
#include <string>
#include <sstream>
#include <memory>
class FileProvider
{
public:
virtual std::vector<std::string> listFiles() = 0;
virtual bool fileExists(const std::string& fileName) = 0;
virtual bool getFile(const std::string& fileName, std::shared_ptr<std::vector<char>>& fileData) = 0;
};

View File

@ -1,111 +0,0 @@
#include "Folder.h"
#include "EterPackManager.h"
#include <iostream>
#include <fstream>
#include <Windows.h>
#include "../eterBase/Stl.h"
void Folder::ListFiles(const std::string& directory, const std::string& relativePath = "") {
WIN32_FIND_DATA findData;
HANDLE hFind;
std::string searchPath = directory + "\\*";
// Start searching for files and directories
hFind = FindFirstFile(searchPath.c_str(), &findData);
if (hFind == INVALID_HANDLE_VALUE) {
std::cerr << L"Failed to open directory: " << directory << L"\n";
return;
}
do {
const std::string fileOrDirName = findData.cFileName;
// Skip the "." and ".." directories
if (fileOrDirName == "." || fileOrDirName == "..") {
continue;
}
// Construct the full and relative paths
std::string fullPath = directory + "\\" + fileOrDirName;
std::string currentRelativePath = relativePath + fileOrDirName;
// Check if the current entry is a directory
if (findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
// Recurse into the subdirectory
ListFiles(fullPath, currentRelativePath + "\\");
}
else {
if (currentRelativePath.rfind("ymir work\\", 0) == 0) {
currentRelativePath = "d:\\" + currentRelativePath;
}
currentRelativePath = CEterPackManager::Instance().ConvertFileName(currentRelativePath);
// Print the file's relative path
this->fileList.insert(currentRelativePath);
}
} while (FindNextFile(hFind, &findData) != 0);
FindClose(hFind);
}
Folder::Folder(const std::string& folderPath)
{
this->folderPath = folderPath;
ListFiles(folderPath);
}
std::vector<std::string> Folder::listFiles()
{
std::vector<std::string> result;
std::copy(fileList.begin(), fileList.end(), std::back_inserter(result));
return result;
}
bool Folder::fileExists(const std::string& fileName)
{
auto it = fileList.find(fileName);
if (it == fileList.end())
return false;
return true;
}
bool Folder::getFile(const std::string& fileName, std::shared_ptr<std::vector<char>>& fileData)
{
std::string realFileName = fileName;
std::string ymirPrefix = "d:/";
if (fileName.find(ymirPrefix) == 0)
realFileName = realFileName.substr(ymirPrefix.length());
realFileName = this->folderPath + "/" + realFileName;
// open the file:
std::ifstream file(realFileName, std::ios::binary);
// Stop eating new lines in binary mode!!!
file.unsetf(std::ios::skipws);
// get its size:
std::streampos fileSize;
file.seekg(0, std::ios::end);
fileSize = file.tellg();
file.seekg(0, std::ios::beg);
// reserve capacity
fileData->reserve(fileSize);
// read the data:
fileData->insert(fileData->begin(),
std::istream_iterator<BYTE>(file),
std::istream_iterator<BYTE>());
return true;
}

View File

@ -1,23 +0,0 @@
#pragma once
#include <string>
#include <set>
#include "FileProvider.h"
class Folder : public FileProvider
{
protected:
std::string folderPath;
std::set<std::string> fileList = {};
public:
Folder(const std::string& folderPath);
std::vector<std::string> listFiles();
bool fileExists(const std::string& fileName);
bool getFile(const std::string& fileName, std::shared_ptr<std::vector<char>>& fileData);
private:
void ListFiles(const std::string& directory, const std::string& relativePath);
};

View File

@ -1,88 +0,0 @@
#include "ZIP.h"
#include "EterPackManager.h"
#include <iostream>
#include <fstream>
#include <Windows.h>
#include "../eterBase/Stl.h"
ZIP::ZIP(const std::string& archivePath)
{
int err;
if ((zipFile = zip_open(archivePath.c_str(), 0, &err)) == NULL) {
zip_error_t error;
zip_error_init_with_code(&error, err);
fprintf(stderr, "Cannot open zip archive '%s': %s\n", archivePath.c_str(), zip_error_strerror(&error));
zip_error_fini(&error);
return;
}
// Read the list of files in the archive
zip_int64_t numEntries = zip_get_num_entries(zipFile, 0);
for (int index = 0; index < numEntries; index++)
{
zip_stat_t fileData;
zip_stat_index(zipFile, index, 0, &fileData);
std::string fileName(fileData.name);
if (fileData.size == 0) {
// Folder
continue;
}
if (fileName.rfind("ymir work/", 0) == 0) {
fileName = "d:/" + fileName;
}
fileName = CEterPackManager::Instance().ConvertFileName(fileName);
fileList.insert({ fileName, fileData.index });
}
}
ZIP::~ZIP()
{
zip_close(zipFile);
zipFile = nullptr;
}
std::vector<std::string> ZIP::listFiles()
{
std::vector<std::string> result;
for (auto const& file : fileList)
result.push_back(file.first);
return result;
}
bool ZIP::fileExists(const std::string& fileName)
{
auto it = fileList.find(fileName);
if (it == fileList.end())
return false;
return true;
}
bool ZIP::getFile(const std::string& fileName, std::shared_ptr<std::vector<char>>& fileData)
{
auto it = fileList.find(fileName);
if (it == fileList.end())
return false;
auto file = zip_fopen_index(zipFile, it->second, 0);
if (file == NULL)
return false;
zip_stat_t fileInfo;
zip_stat_index(zipFile, it->second, 0, &fileInfo);
fileData->resize(fileInfo.size);
auto retval = zip_fread(file, fileData->data(), fileData->size());
if (retval == -1)
return false;
return true;
}

View File

@ -1,20 +0,0 @@
#include <string>
#include <map>
#include <zip.h>
#include "FileProvider.h"
class ZIP : public FileProvider
{
protected:
zip_t* zipFile = nullptr;
std::map<std::string, zip_uint64_t> fileList;
public:
ZIP(const std::string& archivePath);
~ZIP();
std::vector<std::string> listFiles();
bool fileExists(const std::string& fileName);
bool getFile(const std::string& fileName, std::shared_ptr<std::vector<char>>& fileData);
};

View File

@ -287,7 +287,7 @@ PyObject* grpGetSplitingTextLineCount(PyObject* poSelf, PyObject* poArgs)
{ {
i += 1; i += 1;
// 자동 줄 바꿈되고 바로 | 가 있을 경우 // 자동 줄 바꿈되고 바로 | 가 있을 경우
if (iPosition>0) if (iPosition>0)
++iLineCount; ++iLineCount;
@ -337,15 +337,15 @@ PyObject* grpGetSplitingTextLine(PyObject* poSelf, PyObject* poArgs)
int iPosition = 0; int iPosition = 0;
int iLineCount = 0; int iLineCount = 0;
// 1차 : 조금 더 깔끔하게 안될까 -_-a // 1차 : 조금 더 깔끔하게 안될까 -_-a
// 2차 : 오.. 좀 나아졌다 +_+ // 2차 : 오.. 좀 나아졌다 +_+
for (DWORD i = 0; i < strlen(szText);) for (DWORD i = 0; i < strlen(szText);)
{ {
if ('|' == szText[i]) if ('|' == szText[i])
{ {
i += 1; i += 1;
// 자동 줄 바꿈되고 바로 | 가 있을 경우 // 자동 줄 바꿈되고 바로 | 가 있을 경우
if (iPosition>0) if (iPosition>0)
++iLineCount; ++iLineCount;
iPosition = 0; iPosition = 0;

View File

@ -18,10 +18,10 @@ void CGridSlotWindow::OnRenderPickingSlot()
DWORD dwSlotNumber = UI::CWindowManager::Instance().GetAttachingSlotNumber(); DWORD dwSlotNumber = UI::CWindowManager::Instance().GetAttachingSlotNumber();
DWORD dwItemIndex = UI::CWindowManager::Instance().GetAttachingIndex(); DWORD dwItemIndex = UI::CWindowManager::Instance().GetAttachingIndex();
// UseMode 이고.. // UseMode 이고..
if (m_isUseMode) if (m_isUseMode)
{ {
// Pick 된 아이템이 있으면.. // Pick 된 아이템이 있으면..
TSlot * pSlot = *SlotList.begin(); TSlot * pSlot = *SlotList.begin();
TSlot * pCenterSlot; TSlot * pCenterSlot;
if (GetSlotPointer(pSlot->dwCenterSlotNumber, &pCenterSlot)) if (GetSlotPointer(pSlot->dwCenterSlotNumber, &pCenterSlot))
@ -40,7 +40,7 @@ void CGridSlotWindow::OnRenderPickingSlot()
} }
} }
// 아니면 그냥 옮기기 // 아니면 그냥 옮기기
if (CheckMoving(dwSlotNumber, dwItemIndex, SlotList)) if (CheckMoving(dwSlotNumber, dwItemIndex, SlotList))
CPythonGraphic::Instance().SetDiffuseColor(1.0f, 1.0f, 1.0f, 0.5f); CPythonGraphic::Instance().SetDiffuseColor(1.0f, 1.0f, 1.0f, 0.5f);
else else
@ -85,8 +85,8 @@ BOOL CGridSlotWindow::GetPickedSlotPointer(TSlot ** ppSlot)
{ {
TSlot * pSlot = *itor; TSlot * pSlot = *itor;
// NOTE : 한 슬롯 이상 사이즈의 아이템의 경우 가장 왼쪽 위의 슬롯 포인터를 리턴한다. // NOTE : 한 슬롯 이상 사이즈의 아이템의 경우 가장 왼쪽 위의 슬롯 포인터를 리턴한다.
// 명시적이지 못한 코드.. 더 좋은 방법은 없는가? - [levites] // 명시적이지 못한 코드.. 더 좋은 방법은 없는가? - [levites]
if (!pMinSlot) if (!pMinSlot)
{ {
pMinSlot = pSlot; pMinSlot = pSlot;
@ -119,7 +119,7 @@ BOOL CGridSlotWindow::GetPickedSlotPointer(TSlot ** ppSlot)
*ppSlot = pCenterSlot; *ppSlot = pCenterSlot;
// 현재 아이템을 들고 있는 중이고.. // 현재 아이템을 들고 있는 중이고..
if (UI::CWindowManager::Instance().IsAttaching()) if (UI::CWindowManager::Instance().IsAttaching())
{ {
DWORD dwSlotNumber = UI::CWindowManager::Instance().GetAttachingSlotNumber(); DWORD dwSlotNumber = UI::CWindowManager::Instance().GetAttachingSlotNumber();
@ -159,7 +159,7 @@ BOOL CGridSlotWindow::GetPickedSlotList(int iWidth, int iHeight, std::list<TSlot
int ixStart = int(ix) - int(ixHalfStep - (ixHalfStep % 2)); int ixStart = int(ix) - int(ixHalfStep - (ixHalfStep % 2));
int ixEnd = int(ix) + int(ixHalfStep); int ixEnd = int(ix) + int(ixHalfStep);
// FIXME : 제대로 된 계산 공식을 찾자 - [levites] // FIXME : 제대로 된 계산 공식을 찾자 - [levites]
int iyStart = 0, iyEnd = 0; int iyStart = 0, iyEnd = 0;
if (1 == iHeight) if (1 == iHeight)
@ -214,7 +214,7 @@ BOOL CGridSlotWindow::GetPickedSlotList(int iWidth, int iHeight, std::list<TSlot
} }
} }
// Refine Scroll 등을 위한 예외 처리 // Refine Scroll 등을 위한 예외 처리
if (m_isUseMode && 1 == pSlotPointerList->size()) if (m_isUseMode && 1 == pSlotPointerList->size())
{ {
TSlot * pMainSlot = *pSlotPointerList->begin(); TSlot * pMainSlot = *pSlotPointerList->begin();
@ -349,11 +349,11 @@ BOOL CGridSlotWindow::CheckMoving(DWORD dwSlotNumber, DWORD dwItemIndex, const s
{ {
TSlot * pSlot = *itor; TSlot * pSlot = *itor;
if (dwSlotNumber != pSlot->dwCenterSlotNumber) // 들었던 자리가 아닐 경우에 if (dwSlotNumber != pSlot->dwCenterSlotNumber) // 들었던 자리가 아닐 경우에
{ {
if (0 != pSlot->dwItemIndex || pSlot->dwCenterSlotNumber != pSlot->dwSlotNumber) // 아이템이 있고 if (0 != pSlot->dwItemIndex || pSlot->dwCenterSlotNumber != pSlot->dwSlotNumber) // 아이템이 있고
{ {
if (dwItemIndex != pSlot->dwItemIndex) // 다른 아이템이면 못 옮김 if (dwItemIndex != pSlot->dwItemIndex) // 다른 아이템이면 못 옮김
return false; return false;
} }
} }

Some files were not shown because too many files have changed in this diff Show More