1
0
forked from metin2/client

23 Commits
0.3.1 ... 0.4.0

Author SHA1 Message Date
6c1e703ee2 Merge pull request 'Add new archive manager, removed Panama & HybridCrypt, config utility improvements' (#20) from nightly into master
Reviewed-on: metin2/client#20
2025-04-12 10:36:11 +03:00
5ba1cb44b9 Bump version to 0.4.x 2025-04-12 10:04:17 +03:00
37847b1635 Merge new archive manager with zip file support 2025-04-12 08:28:41 +03:00
60cfea47e0 Remove .eix/.epk archives from .gitignore 2025-04-12 07:38:14 +03:00
51bde0b3d9 Merge pull request 'Sync nightly with master' (#18) from master into nightly
Reviewed-on: metin2/client#18
2025-04-12 07:35:20 +03:00
8b4d012e72 Updated build script to use 7-Zip for building archives 2025-04-12 07:26:00 +03:00
830e47b00b Improved pack initialization algorithm, archive types are now configurable in the Index file. 2025-04-12 07:00:29 +03:00
0ad2d3b7cc Merge pull request 'Convert source files from EUC-KR to UTF8' (#13) from Tr0n/client:chore/convert-euckr into master
Reviewed-on: metin2/client#13
Reviewed-by: Exynox <exynox@old-metin2.com>
2025-03-22 19:00:33 +02:00
540ba33b0e translate according to pr review 2025-01-12 18:37:38 +01:00
67c4325b01 lognf instancebase 2025-01-12 18:31:32 +01:00
62916f0622 logbox 2025-01-12 18:29:08 +01:00
2589163a49 translate commented out code and traces 2025-01-12 18:14:49 +01:00
077a365840 use modern fontfaces in GetFontFaceFromCodePage9x 2025-01-01 19:37:28 +01:00
c21c99393d Used shared pointers and string streams to read data from the CEterPackManager 2024-12-24 06:54:43 +02:00
373c184dfe convert comments in h files to utf8 2024-12-17 22:41:21 +01:00
361a62853d convert comments in cpp files to utf8 2024-12-17 22:41:21 +01:00
4525e3103d convert literals to escaped bytes 2024-12-17 22:41:21 +01:00
603f2207ef Made pack.bat exit on error 2024-12-16 20:07:39 +02:00
6564e417f9 Removed Panama & HybridCrypt, added experimental Folder and Zip archive providers 2024-12-16 20:00:39 +02:00
e7b6680895 Ordered languages alphabetically 2024-12-15 00:00:57 +02:00
187ecd53f2 Enabled visual styles for config utility 2024-12-14 23:45:03 +02:00
8d27c24328 Added French support in configuration tool 2024-12-14 22:20:41 +02:00
955c2a8fd9 Added Unicode support, Romanian translation 2024-12-14 21:53:05 +02:00
266 changed files with 2680 additions and 6347 deletions

3
bin/.gitignore vendored
View File

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

View File

@ -1,249 +1,102 @@
PACK patch1 ZIP
* season3_eu ZIP
patch1 patch2 ZIP
* metin2_patch_snow ZIP
season3_eu metin2_patch_snow_dungeon ZIP
* metin2_patch_etc_costume1 ZIP
patch2 metin2_patch_pet1 ZIP
* metin2_patch_pet2 ZIP
metin2_patch_snow metin2_patch_ramadan_costume ZIP
pack/ metin2_patch_flame ZIP
metin2_patch_snow_dungeon metin2_patch_flame_dungeon ZIP
pack/ metin2_patch_w21_etc ZIP
metin2_patch_etc_costume1 metin2_patch_w21_mobs ZIP
pack/ metin2_patch_w21_mobs_m ZIP
metin2_patch_pet1 metin2_patch_dss_box ZIP
pack/ metin2_patch_costume_soccer ZIP
metin2_patch_pet2 metin2_patch_easter1 ZIP
pack/ metin2_patch_mineral ZIP
metin2_patch_ramadan_costume metin2_patch_w20_sound ZIP
pack/ metin2_patch_ds ZIP
metin2_patch_flame metin2_patch_5th_armor ZIP
pack/ metin2_patch_w20_etc ZIP
metin2_patch_flame_dungeon metin2_patch_dragon_rock ZIP
pack/ metin2_patch_dragon_rock_mobs ZIP
metin2_patch_w21_etc metin2_patch_etc ZIP
pack/ metin2_patch_xmas ZIP
metin2_patch_w21_mobs metin2_patch_eu3 ZIP
pack/ metin2_patch_eu4 ZIP
metin2_patch_w21_mobs_m metin2_patch_mundi ZIP
pack/ metin2_patch_sd ZIP
metin2_patch_dss_box metin2_patch_halloween ZIP
pack/ metin2_patch_party ZIP
metin2_patch_costume_soccer metin2_patch_dance ZIP
pack/ pc ZIP
metin2_patch_easter1 pc2 ZIP
pack/ monster ZIP
metin2_patch_mineral monster2 ZIP
pack/ effect ZIP
metin2_patch_w20_sound zone ZIP
pack/ terrain ZIP
metin2_patch_ds npc ZIP
pack/ npc2 ZIP
metin2_patch_5th_armor tree ZIP
pack/ guild ZIP
metin2_patch_w20_etc item ZIP
pack/ textureset ZIP
metin2_patch_dragon_rock property ZIP
pack/ icon ZIP
metin2_patch_dragon_rock_mobs season1 ZIP
pack/ season2 ZIP
metin2_patch_etc outdoora1 ZIP
pack/ outdoora2 ZIP
metin2_patch_xmas outdoora3 ZIP
pack/ outdoorb1 ZIP
metin2_patch_eu3 outdoorb3 ZIP
pack/ outdoorc1 ZIP
metin2_patch_eu4 outdoorc3 ZIP
pack/ outdoorsnow1 ZIP
metin2_patch_mundi outdoordesert1 ZIP
pack/ outdoorflame1 ZIP
metin2_patch_sd outdoorfielddungeon1 ZIP
pack/ outdoort1 ZIP
metin2_patch_halloween outdoort2 ZIP
pack/ outdoort3 ZIP
metin2_patch_party outdoort4 ZIP
pack/ outdoorwedding ZIP
metin2_patch_dance outdoormilgyo1 ZIP
d:/ymir work/pc/ indoorspiderdungeon1 ZIP
pc indoordeviltower1 ZIP
d:/ymir work/pc2/ indoormonkeydungeon1 ZIP
pc2 indoormonkeydungeon2 ZIP
d:/ymir work/monster/ indoormonkeydungeon3 ZIP
monster outdoortrent02 ZIP
d:/ymir work/monster2/ outdoorguild1 ZIP
monster2 outdoorguild2 ZIP
d:/ymir work/effect/ outdoorguild3 ZIP
effect outdoortrent ZIP
d:/ymir work/zone/ outdoorduel ZIP
zone outdoorgmguildbuild ZIP
d:/ymir work/terrainmaps/ sound ZIP
terrain sound_m ZIP
d:/ymir work/npc/ sound2 ZIP
npc bgm ZIP
d:/ymir work/npc2/ ETC ZIP
npc2 locale_de ZIP
d:/ymir work/tree/ locale_es ZIP
tree locale_fr ZIP
d:/ymir work/guild/ locale_gr ZIP
guild locale_it ZIP
d:/ymir work/item/ locale_nl ZIP
item locale_pl ZIP
textureset/ locale_pt ZIP
textureset locale_tr ZIP
property/ locale_en ZIP
property locale_ro ZIP
icon/ locale_ru ZIP
icon locale_dk ZIP
season1/ locale_cz ZIP
season1 locale_hu ZIP
season2/ uiscript ZIP
season2 uiloading ZIP
metin2_map_a1/ root ZIP
outdoora1
map_a2/
outdoora2
metin2_map_a3/
outdoora3
metin2_map_b1/
outdoorb1
metin2_map_b3/
outdoorb3
metin2_map_c1/
outdoorc1
metin2_map_c3/
outdoorc3
map_n_snowm_01/
outdoorsnow1
metin2_map_n_desert_01/
outdoordesert1
metin2_map_n_flame_01/
outdoorflame1
map_b_fielddungeon/
outdoorfielddungeon1
metin2_map_t1/
outdoort1
metin2_map_t2/
outdoort2
metin2_map_t3/
outdoort3
metin2_map_t4/
outdoort4
metin2_map_wedding_01/
outdoorwedding
metin2_map_milgyo/
outdoormilgyo1
metin2_map_spiderdungeon/
indoorspiderdungeon1
metin2_map_deviltower1/
indoordeviltower1
metin2_map_monkeydungeon/
indoormonkeydungeon1
metin2_map_monkeydungeon_02/
indoormonkeydungeon2
metin2_map_monkeydungeon_03/
indoormonkeydungeon3
metin2_map_trent02/
outdoortrent02
metin2_map_guild_01/
outdoorguild1
metin2_map_guild_02/
outdoorguild2
metin2_map_guild_03/
outdoorguild3
metin2_map_trent/
outdoortrent
metin2_map_trent02/
outdoortrent02
metin2_map_duel/
outdoorduel
gm_guild_build/
outdoorgmguildbuild
sound/ambience/
sound
sound/common/
sound
sound/effect/
sound
sound/monster/
sound
sound/npc/
sound
sound/pc/
sound
sound/ui/
sound
sound/ambience/
sound_m
sound/common/
sound_m
sound/effect/
sound_m
sound/monster/
sound_m
sound/npc/
sound_m
sound/pc/
sound_m
sound/ui/
sound_m
sound/monster2/
sound2
sound/pc2/
sound2
bgm/
bgm
d:/ymir work/special/
ETC
d:/ymir work/environment/
ETC
locale/ca/
locale_ca
locale/ae/
locale_ae
locale/de/
locale_de
locale/es/
locale_es
locale/fr/
locale_fr
locale/gr/
locale_gr
locale/it/
locale_it
locale/nl/
locale_nl
locale/pl/
locale_pl
locale/pt/
locale_pt
locale/tr/
locale_tr
locale/uk/
locale_uk
locale/bg/
locale_bg
locale/en/
locale_en
locale/mx/
locale_mx
locale/ro/
locale_ro
locale/ru/
locale_ru
locale/dk/
locale_dk
locale/cz/
locale_cz
locale/hu/
locale_hu
locale/us/
locale_us
locale/pa/
locale_pa
uiscript/
uiscript
d:/ymir work/ui/
ETC
d:/ymir work/uiloading/
uiloading

102
bin/pack/Index.dev Normal file
View File

@ -0,0 +1,102 @@
patch1 FOLDER
season3_eu FOLDER
patch2 FOLDER
metin2_patch_snow FOLDER
metin2_patch_snow_dungeon FOLDER
metin2_patch_etc_costume1 FOLDER
metin2_patch_pet1 FOLDER
metin2_patch_pet2 FOLDER
metin2_patch_ramadan_costume FOLDER
metin2_patch_flame FOLDER
metin2_patch_flame_dungeon FOLDER
metin2_patch_w21_etc FOLDER
metin2_patch_w21_mobs FOLDER
metin2_patch_w21_mobs_m FOLDER
metin2_patch_dss_box FOLDER
metin2_patch_costume_soccer FOLDER
metin2_patch_easter1 FOLDER
metin2_patch_mineral FOLDER
metin2_patch_w20_sound FOLDER
metin2_patch_ds FOLDER
metin2_patch_5th_armor FOLDER
metin2_patch_w20_etc FOLDER
metin2_patch_dragon_rock FOLDER
metin2_patch_dragon_rock_mobs FOLDER
metin2_patch_etc FOLDER
metin2_patch_xmas FOLDER
metin2_patch_eu3 FOLDER
metin2_patch_eu4 FOLDER
metin2_patch_mundi FOLDER
metin2_patch_sd FOLDER
metin2_patch_halloween FOLDER
metin2_patch_party FOLDER
metin2_patch_dance FOLDER
pc FOLDER
pc2 FOLDER
monster FOLDER
monster2 FOLDER
effect FOLDER
zone FOLDER
terrain FOLDER
npc FOLDER
npc2 FOLDER
tree FOLDER
guild FOLDER
item FOLDER
textureset FOLDER
property FOLDER
icon FOLDER
season1 FOLDER
season2 FOLDER
outdoora1 FOLDER
outdoora2 FOLDER
outdoora3 FOLDER
outdoorb1 FOLDER
outdoorb3 FOLDER
outdoorc1 FOLDER
outdoorc3 FOLDER
outdoorsnow1 FOLDER
outdoordesert1 FOLDER
outdoorflame1 FOLDER
outdoorfielddungeon1 FOLDER
outdoort1 FOLDER
outdoort2 FOLDER
outdoort3 FOLDER
outdoort4 FOLDER
outdoorwedding FOLDER
outdoormilgyo1 FOLDER
indoorspiderdungeon1 FOLDER
indoordeviltower1 FOLDER
indoormonkeydungeon1 FOLDER
indoormonkeydungeon2 FOLDER
indoormonkeydungeon3 FOLDER
outdoortrent02 FOLDER
outdoorguild1 FOLDER
outdoorguild2 FOLDER
outdoorguild3 FOLDER
outdoortrent FOLDER
outdoorduel FOLDER
outdoorgmguildbuild FOLDER
sound FOLDER
sound_m FOLDER
sound2 FOLDER
bgm FOLDER
ETC FOLDER
locale_de FOLDER
locale_es FOLDER
locale_fr FOLDER
locale_gr FOLDER
locale_it FOLDER
locale_nl FOLDER
locale_pl FOLDER
locale_pt FOLDER
locale_tr FOLDER
locale_en FOLDER
locale_ro FOLDER
locale_ru FOLDER
locale_dk FOLDER
locale_cz FOLDER
locale_hu FOLDER
uiscript FOLDER
uiloading FOLDER
root FOLDER

View File

@ -6,7 +6,7 @@ ECHO Only use on a clean project directory.
ECHO ====================================================== ECHO ======================================================
rem SET M2_MSVC_DIR=C:\Program Files\Microsoft Visual Studio\2022\Community\ rem SET M2_MSVC_DIR=C:\Program Files\Microsoft Visual Studio\2022\Community\
rem SET M2_PML_PATH=C:\Users\User\Path\To\PackMakerLite\PackMakerLite.exe rem SET M2_7ZIP_PATH=C:\Program Files\7-Zip\7z.exe
rem Check the environment variables rem Check the environment variables
VERIFY OTHER 2>nul VERIFY OTHER 2>nul
@ -16,17 +16,21 @@ IF NOT DEFINED M2_MSVC_DIR (
ECHO M2_MSVC_DIR is NOT defined! Please define M2_MSVC_DIR with the path of your local MSVC install. ECHO M2_MSVC_DIR is NOT defined! Please define M2_MSVC_DIR with the path of your local MSVC install.
EXIT /B -1 EXIT /B -1
) )
IF NOT DEFINED M2_PML_PATH ( IF NOT DEFINED M2_7ZIP_PATH (
ECHO M2_PML_PATH is NOT defined! Please define M2_PML_PATH with the path of your local PackMakerLite executable. ECHO M2_7ZIP_PATH is NOT defined! Please define M2_7ZIP_PATH with the path of your local 7-Zip "7z.exe" executable.
EXIT /B -1 EXIT /B -1
) )
ENDLOCAL ENDLOCAL
rem Cause variables to be expanded at execution time (in order for !errorlevel! to work)
SETLOCAL EnableDelayedExpansion
rem Initialize the MSVC environment rem Initialize the MSVC environment
CALL "%M2_MSVC_DIR%\VC\Auxiliary\Build\vcvars32.bat" CALL "%M2_MSVC_DIR%\VC\Auxiliary\Build\vcvars32.bat"
rem Build rem Build
msbuild Metin2Client.sln /p:Configuration=Distribute /p:Platform="Win32" msbuild Metin2Client.sln /p:Configuration=Distribute /p:Platform="Win32"
if !errorlevel! neq 0 exit /b !errorlevel!
rem Start assembling the client package rem Start assembling the client package
RMDIR /S /Q dist RMDIR /S /Q dist
@ -48,12 +52,11 @@ MKDIR dist\screenshot\
xcopy bin\upload\ dist\upload\ /E /Y /Q xcopy bin\upload\ dist\upload\ /E /Y /Q
rem Build and copy the archives rem Build and copy the archives
DEL /F /Q "bin\pack\*.eix" DEL /F /Q "bin\pack\*.zip"
DEL /F /Q "bin\pack\*.epk"
FOR /d %%i IN ("bin\pack\*") DO ( FOR /d %%i IN ("bin\pack\*") DO (
echo Packing %%i echo Packing %%i
%M2_PML_PATH% --nolog --parallel -p "%%i" "%M2_7ZIP_PATH%" a "%%i.zip" ".\%%i\*"
if !errorlevel! neq 0 exit /b !errorlevel!
) )
MOVE /Y bin\pack\*.eix dist\pack\ MOVE /Y bin\pack\*.zip dist\pack\
MOVE /Y bin\pack\*.epk dist\pack\

View File

@ -3,7 +3,7 @@
#include <d3d9.h> #include <d3d9.h>
#include <algorithm> #include <algorithm>
#include <math.h> #include <vector>
#define APP_NAME _T("Metin2 Config") #define APP_NAME _T("Metin2 Config")
#define FILENAME_CONFIG "metin2.cfg" #define FILENAME_CONFIG "metin2.cfg"
@ -164,12 +164,24 @@ 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);
m_comboLanguage.InsertString(i, language); languages.push_back(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);
@ -229,10 +241,66 @@ 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

@ -0,0 +1,15 @@
<?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,3 +17,6 @@ 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>MultiByte</CharacterSet> <CharacterSet>Unicode</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>MultiByte</CharacterSet> <CharacterSet>Unicode</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>MultiByte</CharacterSet> <CharacterSet>Unicode</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

@ -15,8 +15,8 @@
#endif #endif
VS_VERSION_INFO VERSIONINFO VS_VERSION_INFO VERSIONINFO
FILEVERSION 0, 3, 1, 0 FILEVERSION 0,4,0,0
PRODUCTVERSION 0, 3, 1, 0 PRODUCTVERSION 0,4,0,0
FILEFLAGSMASK VS_FFI_FILEFLAGSMASK FILEFLAGSMASK VS_FFI_FILEFLAGSMASK
FILEFLAGS METIN2_DEBUG FILEFLAGS METIN2_DEBUG
FILEOS VOS__WINDOWS32 FILEOS VOS__WINDOWS32
@ -29,12 +29,12 @@ BEGIN
BEGIN BEGIN
VALUE "CompanyName", "The Old Metin2 Project" VALUE "CompanyName", "The Old Metin2 Project"
VALUE "FileDescription", METIN2_COMPONENT_DESCRIPTION VALUE "FileDescription", METIN2_COMPONENT_DESCRIPTION
VALUE "FileVersion", "0.3.1.0" VALUE "FileVersion", "0.4.0.0"
VALUE "InternalName", METIN2_COMPONENT_INTERNALNAME VALUE "InternalName", METIN2_COMPONENT_INTERNALNAME
VALUE "LegalCopyright", "Copyright (C) 2024" VALUE "LegalCopyright", "Copyright (C) 2022-2025"
VALUE "OriginalFilename", METIN2_COMPONENT_FILENAME VALUE "OriginalFilename", METIN2_COMPONENT_FILENAME
VALUE "ProductName", "Metin2Config" VALUE "ProductName", "Metin2Config"
VALUE "ProductVersion", "0.3.1.0" VALUE "ProductVersion", "0.4.0.0"
END END
END END

View File

@ -42,8 +42,8 @@ class CEffectData
void __ClearLightDataVector(); void __ClearLightDataVector();
void __ClearMeshDataVector(); void __ClearMeshDataVector();
// FIXME : <EFBFBD><EFBFBD> <20>κ<EFBFBD><CEBA><EFBFBD> <20>״<EFBFBD><D7B4><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʴ´<CAB4>. <20><><EFBFBD><EFBFBD> <20><><EFBFBD>̵<EFBFBD><CCB5> ã<>Ƴ<EFBFBD><C6B3><EFBFBD> <20><>ġ<EFBFBD><C4A1>. // FIXME : 이 부분은 그다지 맘에 들지 않는다. 좋은 아이디어를 찾아내어 고치자.
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (Ưȭ<C6AF><C8AD>) <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̽<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ٲ<EFBFBD><D9B2><EFBFBD><EFBFBD><EFBFBD> <20>Ѵٴ<D1B4> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ϴ<EFBFBD>. - [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 : <EFBFBD><EFBFBD>Ʈ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ġ<EFBFBD><C4A1> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>´<EFBFBD> - [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. <EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD> <20>ϴ<EFBFBD> <20>ڵ<EFBFBD> // 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 <EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> <20>ϰ<EFBFBD>.. // CEffectData 를 포인터형으로 리턴하게 하고..
// CEffectData<EFBFBD><EFBFBD><EFBFBD><EFBFBD> CRC<52><43> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ְ<EFBFBD> <20>Ѵ<EFBFBD> // 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<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> Effect<EFBFBD><EFBFBD> <20>Լ<EFBFBD>... EffectInstance<EFBFBD><EFBFBD> Pointer<EFBFBD><EFBFBD> <20><>ȯ<EFBFBD>Ѵ<EFBFBD>. // Area에 직접 찍는 Effect용 함수... EffectInstance Pointer를 반환한다.
// EffectManager <EFBFBD><EFBFBD><EFBFBD><EFBFBD> EffectInstanceMap<EFBFBD><EFBFBD> <20>̿<EFBFBD><CCBF><EFBFBD><EFBFBD><EFBFBD> <20>ʴ´<CAB4>. // EffectManager 내부 EffectInstanceMap을 이용하지 않는다.
void CreateUnsafeEffectInstance(DWORD dwEffectDataID, CEffectInstance ** ppEffectInstance); void CreateUnsafeEffectInstance(DWORD dwEffectDataID, CEffectInstance ** ppEffectInstance);
bool DestroyUnsafeEffectInstance(CEffectInstance * pEffectInstance); bool DestroyUnsafeEffectInstance(CEffectInstance * pEffectInstance);

View File

@ -192,15 +192,14 @@ BOOL CEffectMesh::__LoadData_Ver002(int iSize, const BYTE * c_pbBuf)
if (0 == strExtension.compare("ifl")) if (0 == strExtension.compare("ifl"))
{ {
LPCVOID pMotionData; CEterPackManager::TPackDataPtr motionData;
CMappedFile File; CMemoryTextFileLoader textFileLoader;
if (CEterPackManager::Instance().Get(File, pMeshData->szDiffuseMapFileName, &pMotionData)) if (CEterPackManager::Instance().Get(pMeshData->szDiffuseMapFileName, motionData))
{ {
CMemoryTextFileLoader textFileLoader;
std::vector<std::string> stTokenVector; std::vector<std::string> stTokenVector;
textFileLoader.Bind(File.Size(), pMotionData); textFileLoader.Bind(motionData->size(), motionData->data());
std::string strPathName; std::string strPathName;
GetOnlyPathName(pMeshData->szDiffuseMapFileName, strPathName); GetOnlyPathName(pMeshData->szDiffuseMapFileName, strPathName);
@ -337,15 +336,14 @@ BOOL CEffectMesh::__LoadData_Ver001(int iSize, const BYTE * c_pbBuf)
if (0 == strExtension.compare("ifl")) if (0 == strExtension.compare("ifl"))
{ {
LPCVOID pMotionData; CEterPackManager::TPackDataPtr motionData;
CMappedFile File; CMemoryTextFileLoader textFileLoader;
if (CEterPackManager::Instance().Get(File, pMeshData->szDiffuseMapFileName, &pMotionData)) if (CEterPackManager::Instance().Get(pMeshData->szDiffuseMapFileName, motionData))
{ {
CMemoryTextFileLoader textFileLoader;
std::vector<std::string> stTokenVector; std::vector<std::string> stTokenVector;
textFileLoader.Bind(File.Size(), pMotionData); textFileLoader.Bind(motionData->size(), motionData->data());
std::string strPathName; std::string strPathName;
GetOnlyPathName(pMeshData->szDiffuseMapFileName, strPathName); GetOnlyPathName(pMeshData->szDiffuseMapFileName, strPathName);

View File

@ -9,7 +9,7 @@
class CEffectMeshInstance : public CEffectElementBaseInstance class CEffectMeshInstance : public CEffectElementBaseInstance
{ {
public: public:
// NOTE : Mesh <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ؽ<EFBFBD><D8BD><EFBFBD> <20><><EFBFBD><EFBFBD>Ÿ<EFBFBD><C5B8> <20>ν<EFBFBD><CEBD>Ͻ<EFBFBD><CFBD>̴<EFBFBD>. // 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<EFBFBD><EFBFBD> Up Vector<EFBFBD><EFBFBD> Cross Vector <EFBFBD><EFBFBD>ü<EFBFBD><EFBFBD> View Vector <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> // NOTE : Rotation Routine. Camera Up Vector Cross Vector 자체를 View Vector 기준으로
// Rotation <EFBFBD><EFBFBD>Ų<EFBFBD><EFBFBD>. // Rotation 시킨다.
// FIXME : <EFBFBD>ݵ<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ȭ <20><> <20><>! // 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: <EFBFBD>ӵ<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>̿<EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD> : log(velocity)<EFBFBD><EFBFBD>ŭ <20>þ<C3BE><EEB3AD>. // 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<EFBFBD><EFBFBD> Up Vector<EFBFBD><EFBFBD> Cross Vector <EFBFBD><EFBFBD>ü<EFBFBD><EFBFBD> View Vector <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> // NOTE : Rotation Routine. Camera Up Vector Cross Vector 자체를 View Vector 기준으로
// Rotation <EFBFBD><EFBFBD>Ų<EFBFBD><EFBFBD>. // Rotation 시킨다.
// FIXME : <EFBFBD>ݵ<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ȭ <20><> <20><>! // 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: <EFBFBD>ӵ<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>̿<EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD> : log(velocity)<EFBFBD><EFBFBD>ŭ <20>þ<C3BE><EEB3AD>. // 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<EFBFBD><EFBFBD> ȣ<><C8A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʰ<EFBFBD> Rendering <20>DZ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> length<74><68> 0<><30> <20>Ǵ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִ<EFBFBD>. // NOTE : Update를 호출하지 않고 Rendering 되기 때문에 length가 0이 되는 문제가 있다.
// Velocity<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20>׸<EFBFBD>ŭ <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʱ<EFBFBD>ȭ <20><><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD> <20>ٲ<EFBFBD><D9B2><EFBFBD> - [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 <EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> LocalMatrix <EFBFBD><EFBFBD> Rotation <EFBFBD><EFBFBD><EFBFBD><EFBFBD> Random <EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>. // Rotation - Lie 일 경우 LocalMatrix Rotation 값을 Random 에 적용한다.
// <EFBFBD>Ź<EFBFBD> <20><> <20>ʿ<EFBFBD><CABF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ȭ<EFBFBD><C8AD> <20>ʿ<EFBFBD>. - [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. <EFBFBD><EFBFBD>ƼŬ <20><><EFBFBD><EFBFBD> <20><>ƾ // 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, // <EFBFBD>ٴڿ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> BILLBOARD_TYPE_LIE, // 바닥에 누은 형상
BILLBOARD_TYPE_2FACE, // / and \ BILLBOARD_TYPE_2FACE, // / and \
BILLBOARD_TYPE_3FACE, // / and \ and - BILLBOARD_TYPE_3FACE, // / and \ and -
//BILLBOARD_TYPE_RAY, // <EFBFBD>ܻ<EFBFBD> //BILLBOARD_TYPE_RAY, // 잔상
}; };
@ -220,8 +220,8 @@ typedef std::vector<TTimeEventTypeVector2> TTimeEventTableVector2;
typedef std::vector<TTimeEventTypeVector3> TTimeEventTableVector3; typedef std::vector<TTimeEventTypeVector3> TTimeEventTableVector3;
// NOTE : TimeEventValue <EFBFBD>Լ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ѱ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ƾ<EFBFBD> <20>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD> // NOTE : TimeEventValue 함수들은 값을 넘겨 받지 말아야 하는 때도 있으므로
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ƴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ۼ<EFBFBD> <20>߽<EFBFBD><DFBD>ϴ<EFBFBD>. - [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 <EFBFBD><EFBFBD><EFBFBD>ӷ<EFBFBD>ó<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϱ<EFBFBD> <20><><EFBFBD>Ͽ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ǵ<EFBFBD> Ŭ<><C5AC><EFBFBD><EFBFBD> * @brief 게임런처에서 게임 클라이언트로 정보를 전달 및 클라이언트에서 수신하기 위하여 사용되는 클래스
*/ */
class CPostIt class CPostIt
{ {
public: public:
/** /**
* @brief CPostIt constructor * @brief CPostIt constructor
* @param [in] szAppName : <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20≯<EFBFBD><CCB8><EFBFBD> <20><><EFBFBD><EFBFBD><EEB0A3>. * @param [in] szAppName : 게임의 이름이 들어간다.
*/ */
explicit CPostIt( LPCSTR szAppName ); explicit CPostIt( LPCSTR szAppName );
@ -23,45 +23,45 @@ public:
~CPostIt( void ); ~CPostIt( void );
/** /**
* @brief CPostIt class<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD>Ÿ<EFBFBD><C5B8> Ŭ<><C5AC><EFBFBD><EFBFBD><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>. * @brief CPostIt class에서 보유하고 있는 데이타를 클립보드에 저장한다.
*/ */
BOOL Flush( void ); BOOL Flush( void );
/** /**
* @brief CPostIt class<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD>Ÿ <20><> Ŭ<><C5AC><EFBFBD><EFBFBD><EFBFBD><20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. * @brief CPostIt class에서 보유하고 있는 데이타 및 클립보드에 있는 내용을 지운다.
*/ */
void Empty( void ); void Empty( void );
/** /**
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ÿ<EFBFBD><EFBFBD> <20>о<EFBFBD><D0BE>´<EFBFBD>. * @brief 데이타를 읽어온다.
* @param [in] lpszKeyName : <EFBFBD>ҷ<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ÿ<EFBFBD><C5B8> Ű. "KEY" <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִ´<D6B4>. * @param [in] lpszKeyName : 불러올 데이타의 키. "KEY" 식의 내용을 넣는다.
* @param [in] lpszData : <EFBFBD>ҷ<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ÿ<EFBFBD><C5B8> <20><><EFBFBD><EFBFBD> * @param [in] lpszData : 불러올 데이타의 버퍼
* @param [in] nSize : lpszData <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִ<EFBFBD><D6B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> * @param [in] nSize : lpszData 버퍼의 최대사이즈
*/ */
BOOL Get( LPCSTR lpszKeyName, LPSTR lpszData, DWORD nSize ); BOOL Get( LPCSTR lpszKeyName, LPSTR lpszData, DWORD nSize );
/** /**
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ÿ<EFBFBD><C5B8> <20>ִ´<D6B4>. * @brief 저장할 데이타를 넣는다.
* @param [in] lpBuffer : <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ÿ. "KEY=DATA" <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִ´<D6B4>. * @param [in] lpBuffer : 저장할 데이타. "KEY=DATA" 식의 내용을 넣는다.
*/ */
BOOL Set( LPCSTR lpszData ); BOOL Set( LPCSTR lpszData );
/** /**
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ÿ<EFBFBD><C5B8> <20>ִ´<D6B4>. * @brief 저장할 데이타를 넣는다.
* @param [in] lpszKeyName : <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ÿ<EFBFBD><C5B8> Ű. "KEY" <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִ´<D6B4>. * @param [in] lpszKeyName : 저장할 데이타의 키. "KEY" 식의 내용을 넣는다.
* @param [in] lpszData : <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ÿ. "DATA" <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִ´<D6B4>. * @param [in] lpszData : 저장할 데이타. "DATA" 식의 내용을 넣는다.
*/ */
BOOL Set( LPCSTR lpszKeyName, LPCSTR lpszData ); BOOL Set( LPCSTR lpszKeyName, LPCSTR lpszData );
/** /**
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ÿ(DWORD)<29><> <20>ִ´<D6B4>. * @brief 저장할 데이타(DWORD)를 넣는다.
* @param [in] lpBuffer : <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ÿ. "KEY=DATA" <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ÿ<EFBFBD><C5B8> <20>ִ´<D6B4>. * @param [in] lpBuffer : 저장할 데이타. "KEY=DATA" 식의 데이타를 넣는다.
* @param [in] dwValue : <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ÿ. (DWORD) * @param [in] dwValue : 저장할 데이타. (DWORD)
*/ */
BOOL Set( LPCSTR lpszKeyName, DWORD dwValue ); BOOL Set( LPCSTR lpszKeyName, DWORD dwValue );
/** /**
* @brief CPostIt class<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>. (Ŭ<><C5AC><EFBFBD><EFBFBD> constructor<6F><72> <20≯<EFBFBD> <20><><EFBFBD>ڰ<EFBFBD> <20>ֱ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><> <20≯<EFBFBD><CCB8><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ؾ<EFBFBD><D8BE><EFBFBD>) * @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 : <EFBFBD>ӽ<EFBFBD> <20><><EFBFBD><EFBFBD> - [levites] // NOTE : 임시 변수 - [levites]
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>δ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> TRUE <20><><EFBFBD>·<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. // 최종적으로는 무조건 TRUE 형태로 만든다.
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> CDir<69><72> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Extension<EFBFBD><EFBFBD> "wav", "gr2" <EFBFBD>̷<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ְԲ<D6B0> <20>Ѵ<EFBFBD>. - [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));
// <EFBFBD>߰<EFBFBD> <20>ڵ<EFBFBD>. <20>ǵڿ<C7B5> <20><><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD>츦 üũ<C3BC>Ѵ<EFBFBD>. - [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));
// <EFBFBD>߰<EFBFBD> <20>ڵ<EFBFBD>. <20>ǵڿ<C7B5> <20><><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD>츦 üũ<C3BC>Ѵ<EFBFBD>. - [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 <EFBFBD>Ѿ<EFBFBD>°<EFBFBD> <20><><EFBFBD><EFBFBD> #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) // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ͱ<EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>ͷ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ȴ<EFBFBD> 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 <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> üũ // 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 <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> üũ // 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 <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> üũ // 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 <EFBFBD>Ѿ<EFBFBD>°<EFBFBD> <20><><EFBFBD><EFBFBD> #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 <EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϼ<EFBFBD><CFBC><EFBFBD>"); //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<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> 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<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> 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: <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>츦 üũ 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); // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ҹ<EFBFBD><D2B9>ڷ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, \<5C><> /<2F><> <20>ٲ۴<D9B2>. extern void StringPath(char * pString); // 모두 소문자로 만들고, \는 /로 바꾼다.
extern void StringPath(const char * c_szSrc, char * szDest); // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ҹ<EFBFBD><D2B9>ڷ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, \<5C><> /<2F><> <20>ٲ۴<D9B2>. extern void StringPath(const char * c_szSrc, char * szDest); // 모두 소문자로 만들고, \는 /로 바꾼다.
extern void StringPath(const char * c_szSrc, std::string & rString); // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ҹ<EFBFBD><D2B9>ڷ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, \<5C><> /<2F><> <20>ٲ۴<D9B2>. 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) +
// <EFBFBD><EFBFBD>ȣȭ<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> fourCC 4<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ // 암호화를 위한 fourCC 4바이트
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20>ִ<EFBFBD> <20>ִ<EFBFBD> <20> + // 압축된 후 만들어질 수 있는 최대 용량 +
// <EFBFBD><EFBFBD>ȣȭ<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> 8 <20><><EFBFBD><EFBFBD>Ʈ // 암호화를 위한 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) +
// <EFBFBD><EFBFBD>ȣȭ<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> fourCC 4<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ // 암호화를 위한 fourCC 4바이트
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20>ִ<EFBFBD> <20>ִ<EFBFBD> <20> + // 압축된 후 만들어질 수 있는 최대 용량 +
// <EFBFBD><EFBFBD>ȣȭ<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> 8 <20><><EFBFBD><EFBFBD>Ʈ // 암호화를 위한 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; // <EFBFBD><EFBFBD>ȣȭ<EFBFBD><EFBFBD> ũ<><C5A9> DWORD dwEncryptSize; // 암호화된 크기
DWORD dwCompressedSize; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ũ<><C5A9> DWORD dwCompressedSize; // 압축된 데이터 크기
DWORD dwRealSize; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ũ<><C5A9> DWORD dwRealSize; // 실제 데이터 크기
} THeader; } THeader;
#pragma pack() #pragma pack()

View File

@ -1,8 +1,8 @@
/* /*
* Filename: tea.c * Filename: tea.c
* Description: TEA <EFBFBD><EFBFBD>ȣȭ <20><><EFBFBD><EFBFBD> * Description: TEA 암호화 모듈
* *
* Author: <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (aka. <EFBFBD><EFBFBD><EFBFBD><EFBFBD>, Cronan), <EFBFBD>ۿ<EFBFBD><EFBFBD><EFBFBD> (aka. myevan, <EFBFBD><EFBFBD><EFBFBD>ڷ<EFBFBD>) * 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 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> aka. <EFBFBD><EFBFBD><EFBFBD><EFBFBD>, 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<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><EFBFBD> <20><>ȣ/<2F><>ȣȭ <20>Ҷ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ȴ<EFBFBD>. key <EFBFBD><EFBFBD> 16 <EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ѵ<EFBFBD>. * 8바이트를 암호/복호화 할때 사용된다. key 16 바이트여야 한다.
* sz, sy <EFBFBD><EFBFBD> 8<><38><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>. * 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);
* <EFBFBD>Ѳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 8 <20><><EFBFBD><EFBFBD>Ʈ <20>̻<EFBFBD><CCBB><EFBFBD> <20><>ȣ/<2F><>ȣȭ <20>Ҷ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>. <20><><EFBFBD><EFBFBD> size <EFBFBD><EFBFBD> * 한꺼번에 8 바이트 이상을 암호/복호화 할때 사용한다. 만약 size
* 8<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ƴϸ<C6B4> 8<><38> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ũ<>⸦ "<22>÷<EFBFBD><C3B7><EFBFBD>" <20><>ȣȭ <20>Ѵ<EFBFBD>. * 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 <EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϸ<EFBFBD>, <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>. #define TEA_ROUND 32 // 32 를 권장하며, 높을 수록 결과가 난해해 진다.
#define DELTA 0x9E3779B9 // DELTA <EFBFBD><EFBFBD> <20>ٲ<EFBFBD><D9B2><EFBFBD> <20><><EFBFBD><EFBFBD>. #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<EFBFBD><EFBFBD> Update<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴµ<CFB4>, // FIXME : CModelInstance::m_pgrnWorldPose Update에서 사용하는데,
// Deform<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> NULL <20>Դϴ<D4B4>. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ٲ<EFBFBD><D9B2><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.. - [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) // <EFBFBD>߽<EFBFBD> LOD <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> if (fDistanceFromCenter > LOD_APPLY_MIN) // 중심 LOD 예외 취소
{ {
// ī<EFBFBD>޶<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>־<EFBFBD><D6BE><EFBFBD> <20><><EFBFBD><EFBFBD> fLODRate<74><65> <20>۾<EFBFBD><DBBE><EFBFBD><EFBFBD><EFBFBD> // 카메라부터 멀어질 수록 fLODRate가 작아진다
// 3<EFBFBD><EFBFBD> LOD<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.. <20><><EFBFBD><EFBFBD> <20>հ<EFBFBD> 0, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ڰ<EFBFBD> Ŀ<><C4BF><EFBFBD><EFBFBD> // 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<EFBFBD><EFBFBD> <20><> Ŭ<><C5AC> ũ<><C5A9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>(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 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʿ<EFBFBD><CABF><EFBFBD> <20><> <20>˻<EFBFBD> // 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));
// <EFBFBD><EFBFBD><EFBFBD>۽<EFBFBD>Ƽ<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>޽<EFBFBD> // 오퍼시티가 있으면 블렌딩 메쉬
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)
{ {
// -_-<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>μ<EFBFBD><CEBC><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>... Save & Restore <20>ϸ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD>δ<EFBFBD>. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Save & Restore <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>. // -_-렌더링 프로세스가 좀 구려서... 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<EFBFBD>ؼ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>κ<EFBFBD><CEBA><EFBFBD> Specular<61><72> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ű<EFBFBD><C5B0> <20>ʴ´<CAB4> - [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) // õ<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> 2<><32> ũ<><C5A9><EFBFBD><EFBFBD> <20>߻<EFBFBD> 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() - <EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><20>ϴ°<CFB4>- -?"); 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) // <EFBFBD>޽<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> 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 : <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ϵ<EFBFBD><CFB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ѱ<EFBFBD><D1B0><EFBFBD> 2<><32><EFBFBD><EFBFBD> <20>ؽ<EFBFBD><D8BD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ǿ<EFBFBD><C7BE>ִ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>̱⿡ <20>̷<EFBFBD> // FIXME : 현재는 하드웨어의 한계로 2장의 텍스춰로 제한이 되어있는 상태이기에 이런
// <EFBFBD>Ҿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ű<EFBFBD><C5B0><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20>ñ<EFBFBD><C3B1><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (<28><><EFBFBD><EFBFBD> <20>ؽ<EFBFBD><D8BD><EFBFBD> <20><><EFBFBD><EFBFBD>) + (ȿ<><C8BF><EFBFBD><EFBFBD> <20>ؽ<EFBFBD><D8BD><EFBFBD>) // 불안정한 아키텍춰가 가능하지만, 궁극적인 방향은 (모델 텍스춰 전부) + (효과용 텍스춰)
// <EFBFBD>̷<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ڵ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̷<EFBFBD><CCB7><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʳ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>մϴ<D5B4>. - [levites] // 이런식의 자동 셋팅이 이뤄져야 되지 않나 생각합니다. - [levites]
// NOTE : <EFBFBD><EFBFBD><EFBFBD>ο<EFBFBD> if<69><66><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>Ű<EFBFBD><C5B0> <20><><EFBFBD>ٴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ŷ<EFBFBD><C5B7><EFBFBD><EFBFBD><EFBFBD> <20>̷<EFBFBD><CCB7><EFBFBD> <20>Լ<EFBFBD> <20><> <20><>ü<EFBFBD><C3BC> <20>и<EFBFBD> // NOTE : 내부에 if문을 포함 시키기 보다는 조금은 번거롭지만 이렇게 함수 콜 자체를 분리
// <EFBFBD><EFBFBD>Ű<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ս<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><E9BFA1><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>. - [levites] // 시키는 것이 퍼포먼스 적인 측면에서는 더 나은 것 같습니다. - [levites]
// NOTE : <EFBFBD>ǹ<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> OneTexture. ij<EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD> <20><><EFBFBD><20><><EFBFBD><EFBFBD> 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; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> //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; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>޸𸮴<DEB8> <20><><EFBFBD><20>Ҵ<EFBFBD> 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);
// ij<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ٿ<EFBFBD><D9BF><EFBFBD> <20>ڽ<EFBFBD> // 캐릭터 꽉차는 바운딩 박스
//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) // <EFBFBD>޽<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><>޶<EFBFBD> <20><><EFBFBD><EFBFBD>) <20>𵨵<EFBFBD> <20><>Ȥ <20>ִ<EFBFBD>.. 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<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>߸<EFBFBD><DFB8><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>.. <20>׷<EFBFBD><D7B7>ϰ<EFBFBD> <20>ӵ<EFBFBD><D3B5><EFBFBD> <20><><EFBFBD><EFBFBD> // NOTE : GrannyGetWorldPose4x4는 스케일 값등이 잘못나올 수 있음.. 그래니가 속도를 위해
// GrannyGetWorldPose4x4<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> matrix <EFBFBD><EFBFBD><EFBFBD>Ҹ<EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> // GrannyGetWorldPose4x4에 모든 matrix 원소를 제 값으로 넣지 않음
return GrannyGetWorldPoseComposite4x4(__GetWorldPosePtr(), iBone); return GrannyGetWorldPoseComposite4x4(__GetWorldPosePtr(), iBone);
} }
void CGrannyModelInstance::ReloadTexture() void CGrannyModelInstance::ReloadTexture()
{ {
assert("<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> - 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;
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ǵ<EFBFBD> <20>պκ<D5BA><CEBA><EFBFBD> <20><>ŵ <20>ϱ<EFBFBD> <20><><EFBFBD><EFBFBD> LocalTime <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>. - [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<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ɷ<EFBFBD><C9B7>ִ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20><> - [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<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ɷ<EFBFBD><C9B7>ִ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20><> - [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 <EFBFBD>Ѿ<EFBFBD>°<EFBFBD> <20><><EFBFBD><EFBFBD> #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 <EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><20><><EFBFBD><EFBFBD> Link(<28><><EFBFBD><EFBFBD> <20>ٴ°<D9B4>)<29><>Ű<EFBFBD><C5B0>, //iSkelInstance 가 있으면 기본 본에 Link(본이 붙는것)시키고,
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><20><><EFBFBD><EFBFBD> attach(<28><>ǥ<EFBFBD><C7A5> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>°<EFBFBD>) <20>˴ϴ<CBB4>. //없으면 기본 본에 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 : <EFBFBD>߽<EFBFBD><EFBFBD><EFBFBD><EFBFBD>κ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ÿ<EFBFBD> <20><><EFBFBD>꿡 z<><7A> <20><><EFBFBD>̴<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʴ´<CAB4>. - [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(); // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> LOD <EFBFBD><EFBFBD><EFBFBD><EFBFBD> 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; // <EFBFBD>ķ<EFBFBD>Ʈ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 1, <20><><EFBFBD><EFBFBD> 0 char palType; // 파레트있으면 1, 없음 0
char imgType; // <EFBFBD>ķ<EFBFBD>Ʈ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 1, <20><><EFBFBD><EFBFBD> 2 char imgType; // 파레트있으면 1, 없음 2
WORD colorBegin; // 0 WORD colorBegin; // 0
WORD colorCount; // <EFBFBD>ķ<EFBFBD>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 256, <EFBFBD><EFBFBD><EFBFBD><EFBFBD> 0 WORD colorCount; // 파레트 있으면 256, 없음 0
char palEntrySize; // <EFBFBD>ķ<EFBFBD>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 24, <EFBFBD><EFBFBD><EFBFBD><EFBFBD> 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 <EFBFBD><EFBFBD><EFBFBD><EFBFBD> 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: // <EFBFBD><EFBFBD><EFBFBD>ĸ<EFBFBD> <20>ִ<EFBFBD> <20><> (1bytes per pixel, <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ⱦ<EFBFBD><C8BE><EFBFBD>) 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: // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ȵ<EFBFBD> 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: // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> 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) // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ȵ<EFBFBD> <20><> if (rle < 0x80) // 압축 안된 곳
{ {
rle++; rle++;
@ -146,7 +146,7 @@ bool CTGAImage::LoadFromMemory(int iSize, const BYTE * c_pbMem)
} }
else else
{ {
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><> // 압축 된 곳
rle -= 127; rle -= 127;
b = (BYTE) *(c_pbMem++); --iSize; b = (BYTE) *(c_pbMem++); --iSize;
@ -234,18 +234,6 @@ bool CTGAImage::LoadFromMemory(int iSize, const BYTE * c_pbMem)
return true; return true;
} }
bool CTGAImage::LoadFromDiskFile(const char * c_szFileName)
{
CMappedFile file;
const BYTE * c_pbMap;
if (!file.Create(c_szFileName, (const void **) &c_pbMap, 0, 0))
return false;
return LoadFromMemory(file.Size(), c_pbMap);
}
int CTGAImage::GetRLEPixelCount(const DWORD * data) int CTGAImage::GetRLEPixelCount(const DWORD * data)
{ {
int r = 0; int r = 0;
@ -315,7 +303,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 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> if (m_Header.imgType == 10) // RLE 압축으로 저장
{ {
DWORD * data = GetBasePointer(); DWORD * data = GetBasePointer();

View File

@ -17,7 +17,6 @@ class CTGAImage : public CImage
virtual void Create(int width, int height); virtual void Create(int width, int height);
virtual bool LoadFromMemory(int iSize, const BYTE * c_pbMem); virtual bool LoadFromMemory(int iSize, const BYTE * c_pbMem);
virtual bool LoadFromDiskFile(const char * c_szFileName);
virtual bool SaveToDiskFile(const char* c_szFileName); virtual bool SaveToDiskFile(const char* c_szFileName);
void SetCompressed(bool isCompress = true); void SetCompressed(bool isCompress = true);

View File

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

View File

@ -15,7 +15,7 @@ class CAttributeInstance
const char * GetDataFileName() const; const char * GetDataFileName() const;
// NOTE : Object <EFBFBD><EFBFBD><EFBFBD><EFBFBD> // 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;
// <EFBFBD>Ӹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ѿ<D1BE><EEB0A1> <20><><EFBFBD><EFBFBD>... // 머리위로 넘어가기 막기...
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;
} }
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Լ<EFBFBD><D4BC><EFBFBD>... // 잡스러운 함수들...
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 &) ; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> const CCamera & operator = (const CCamera &) ; // 지원하지 않음
CCamera (const CCamera & ) ; //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> 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
//<EFBFBD>߰<EFBFBD><EFBFBD><EFBFBD> //추가분
float m_fPitch; float m_fPitch;
float m_fRoll; float m_fRoll;
float m_fDistance; float m_fDistance;
// ī<EFBFBD>޶<EFBFBD> AI<41><49> <20><><EFBFBD><EFBFBD> Ray <EFBFBD><EFBFBD> // 카메라 AI를 위한 Ray
// ī<EFBFBD>޶<EFBFBD><EFBFBD><EFBFBD> <20>ѷ<EFBFBD><D1B7><EFBFBD> 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:
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> // 물리
D3DXVECTOR3 m_v3AngularAcceleration; D3DXVECTOR3 m_v3AngularAcceleration;
D3DXVECTOR3 m_v3AngularVelocity; D3DXVECTOR3 m_v3AngularVelocity;
float m_fResistance; float m_fResistance;
public: public:
////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> // 물리
////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////
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); //<EFBFBD><EFBFBD><EFBFBD>ư<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִ´<D6B4>. 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
////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////
// <EFBFBD><EFBFBD><EFBFBD>״<EFBFBD><EFBFBD><EFBFBD> <20>̵<EFBFBD>... ī<>޶<EFBFBD> <20><>ġ<EFBFBD><C4A1> Ÿ<><C5B8> <20><>ġ<EFBFBD><C4A1> <20><><EFBFBD><EFBFBD> <20>޶<EFBFBD><DEB6><EFBFBD><EFBFBD><EFBFBD>. // 말그대로 이동... 카메라 위치와 타겟 위치가 모두 달라진다.
void Move(const D3DXVECTOR3 & v3Displacement); void Move(const D3DXVECTOR3 & v3Displacement);
// <EFBFBD><EFBFBD>.. ī<EFBFBD>޶<EFBFBD> <20><>ġ<EFBFBD><C4A1> <20>̵<EFBFBD>.. Ÿ<><C5B8> <20><>ġ<EFBFBD><C4A1> <20><><EFBFBD><EFBFBD>... // .. 카메라 위치만 이동.. 타겟 위치는 고정...
void Zoom(float fRatio); void Zoom(float fRatio);
// <EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̵<EFBFBD>.. Ÿ<><C5B8><EFBFBD><EFBFBD>ġ<EFBFBD><C4A1> <20>޶<EFBFBD><DEB6><EFBFBD><EFBFBD>Ƿ<EFBFBD> <20>ܰ<EFBFBD><DCB0><EFBFBD> <20>ٸ<EFBFBD><D9B8><EFBFBD>... // 뷰 방향으로 이동.. 타겟위치가 달라지므로 줌과는 다르다...
void MoveAlongView(float fDistance); void MoveAlongView(float fDistance);
// ī<EFBFBD>޶<EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̵<EFBFBD>.. // 카메라 옆 방향으로 이동..
void MoveAlongCross(float fDistance); void MoveAlongCross(float fDistance);
// ī<EFBFBD>޶<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̵<EFBFBD>... // 카메라 업벡터 방향으로 이동...
void MoveAlongUp(float fDistance); void MoveAlongUp(float fDistance);
// ī<EFBFBD>޶<EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̵<EFBFBD>... MoveAlongCross<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.. // 카메라 옆 방향으로 이동... MoveAlongCross과 동일..
void MoveLateral(float fDistance); void MoveLateral(float fDistance);
// <EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Z <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> XY<58><59><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̵<EFBFBD>.. // 뷰 방향의 Z 성분을 무시한 XY평면 방향으로 이동..
void MoveFront(float fDistance); void MoveFront(float fDistance);
// Z<EFBFBD><EFBFBD><EFBFBD><EFBFBD>(<28><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>)<29><><EFBFBD><EFBFBD> <20>̵<EFBFBD>... // Z방향(연직 방향)으로 이동...
void MoveVertical(float fDistance); void MoveVertical(float fDistance);
// //ī<EFBFBD>޶<EFBFBD> <20><>ġ<EFBFBD><C4A1> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ű<EFBFBD><C5B0> <20>Ӹ<EFBFBD><D3B8><EFBFBD> <20><><EFBFBD><EFBFBD>. Ÿ<><C5B8><EFBFBD><EFBFBD> <20>޶<EFBFBD><DEB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>? // //카메라 위치는 고정시키고 머리만 든다. 타겟이 달라지겠죠?
// //ȸ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ƴ<EFBFBD> "<22><>(Degree)"<EFBFBD><EFBFBD> <20>ִ´<D6B4>. // //회전각을 라디안이 아닌 "도(Degree)"로 넣는다.
// void RotateUpper(float fDegree); // void RotateUpper(float fDegree);
// Ÿ<EFBFBD><EFBFBD> <20>߽<EFBFBD><DFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>. Eterlib<EFBFBD><EFBFBD> SetAroundCamera<EFBFBD><EFBFBD> <20><><EFBFBD>ɰ<EFBFBD> <20><><EFBFBD><EFBFBD>... // 타겟 중심으로 돈다. Eterlib SetAroundCamera의 기능과 유사...
// fPitchDegree<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>(0<><30>)<29>κ<EFBFBD><CEBA><EFBFBD> <20>Ʒ<EFBFBD><C6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>... // fPitchDegree는 수평(0도)로부터 아랫쪽으로 꺽어지는 각도...
// fRollDegree<EFBFBD><EFBFBD> Ÿ<><C5B8> <20>߽<EFBFBD><DFBD><EFBFBD><EFBFBD><EFBFBD> <20>ð<EFBFBD><C3B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>... // fRollDegree는 타겟 중심으로 시계방향으로 도는 각도...
void RotateEyeAroundTarget(float fPitchDegree, float fRollDegree); void RotateEyeAroundTarget(float fPitchDegree, float fRollDegree);
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>߽<EFBFBD><DFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20>߽<EFBFBD><DFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>. Ÿ<><C5B8> <20><><EFBFBD><EFBFBD> <20>޶<EFBFBD><DEB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>? // 도는 중심점을 따로 지정 그 점을 중심으로 돈다. 타겟 점도 달라지겠죠?
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 : <EFBFBD>Ÿ<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.. - [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 : <EFBFBD>Ÿ<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.. - [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 : <EFBFBD>Ÿ<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.. - [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 : <EFBFBD>̵<EFBFBD> <20>Ÿ<EFBFBD><C5B8><EFBFBD> Ŭ <20><><EFBFBD><EFBFBD> <20><>ƴ<EFBFBD><C6B4><EFBFBD><EFBFBD> (<28><> ũ<><C5A9> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>) <20>̵<EFBFBD><CCB5>ϸ鼭 <20><><EFBFBD><EFBFBD> üũ <20><> <20><><EFBFBD><EFBFBD> - [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; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> D3DCOLOR m_dwCurColor; // 현재 색
DWORD m_dwStartTime; // <EFBFBD>ٲ<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20>ð<EFBFBD> DWORD m_dwStartTime; // 바뀌기 시작하는 시간
DWORD m_dwDuration; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ȿ<EFBFBD> <20>ٲ<EFBFBD><D9B2>°<EFBFBD>? 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
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ϰ<EFBFBD> <20>غ<EFBFBD><D8BA><EFBFBD> // 하지말고 각자 하게 해보자
//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;
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> // 개수
DWORD m_dwVertexCount; DWORD m_dwVertexCount;
DWORD m_dwPrimitiveCount; DWORD m_dwPrimitiveCount;
// <EFBFBD><EFBFBD><EFBFBD>ý<EFBFBD> <20><><EFBFBD>ۿ<EFBFBD> <20>δ콺 <20><><EFBFBD><EFBFBD> // 버택스 버퍼와 인댁스 버퍼
// CGraphicVertexBuffer m_GraphicVertexBuffer; // CGraphicVertexBuffer m_GraphicVertexBuffer;
// CGraphicIndexBuffer m_GraphicIndexBuffer; // CGraphicIndexBuffer m_GraphicIndexBuffer;
// <EFBFBD><EFBFBD><EFBFBD>ý<EFBFBD> <20><><EFBFBD>ۿ<EFBFBD> <20>δ콺 <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ſ<EFBFBD> <20><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> DrawIndexedPrimitiveUP<EFBFBD><EFBFBD> <20>׸<EFBFBD><D7B8><EFBFBD>. // 버택스 버퍼와 인댁스 버퍼 대신에 배열 만들고 DrawIndexedPrimitiveUP로 그리자.
typedef struct typedef struct
{ {
WORD m_wMinIndex; WORD m_wMinIndex;

View File

@ -47,9 +47,6 @@ void CFileLoaderThread::Destroy()
CloseHandle(m_hSemaphore); CloseHandle(m_hSemaphore);
m_hSemaphore = NULL; m_hSemaphore = NULL;
} }
stl_wipe(m_pRequestDeque);
stl_wipe(m_pCompleteDeque);
} }
UINT CFileLoaderThread::Setup() UINT CFileLoaderThread::Setup()
@ -79,7 +76,7 @@ void CFileLoaderThread::Shutdown()
} }
while (!bRet); while (!bRet);
WaitForSingleObject(m_hThread, 10000); // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><20><><EFBFBD><EFBFBD> <20>DZ⸦ 10<31><30> <20><><EFBFBD>ٸ<EFBFBD> WaitForSingleObject(m_hThread, 10000); // 쓰레드가 종료 되기를 10초 기다림
} }
UINT CFileLoaderThread::Execute(void * /*pvArg*/) UINT CFileLoaderThread::Execute(void * /*pvArg*/)
@ -111,13 +108,11 @@ UINT CFileLoaderThread::Execute(void * /*pvArg*/)
return 1; return 1;
} }
void CFileLoaderThread::Request(std::string & c_rstFileName) // called in main thread void CFileLoaderThread::Request(const std::string& c_rstFileName) // called in main thread
{ {
TData * pData = new TData; TData pData;
pData.fileName = c_rstFileName;
pData->dwSize = 0; pData.data = nullptr;
pData->pvBuf = NULL;
pData->stFileName = c_rstFileName;
m_RequestMutex.Lock(); m_RequestMutex.Lock();
m_pRequestDeque.push_back(pData); m_pRequestDeque.push_back(pData);
@ -131,7 +126,7 @@ void CFileLoaderThread::Request(std::string & c_rstFileName) // called in main t
--m_iRestSemCount; --m_iRestSemCount;
} }
bool CFileLoaderThread::Fetch(TData ** ppData) // called in main thread bool CFileLoaderThread::Fetch(TData& data) // called in main thread
{ {
m_CompleteMutex.Lock(); m_CompleteMutex.Lock();
@ -141,7 +136,7 @@ bool CFileLoaderThread::Fetch(TData ** ppData) // called in main thread
return false; return false;
} }
*ppData = m_pCompleteDeque.front(); data = m_pCompleteDeque.front();
m_pCompleteDeque.pop_front(); m_pCompleteDeque.pop_front();
m_CompleteMutex.Unlock(); m_CompleteMutex.Unlock();
@ -158,22 +153,16 @@ void CFileLoaderThread::Process() // called in loader thread
return; return;
} }
TData * pData = m_pRequestDeque.front(); auto request = m_pRequestDeque.front();
m_pRequestDeque.pop_front(); m_pRequestDeque.pop_front();
m_RequestMutex.Unlock(); m_RequestMutex.Unlock();
LPCVOID pvBuf; if (!CEterPackManager::Instance().Get(request.fileName, request.data))
request.data = nullptr;
if (CEterPackManager::Instance().Get(pData->File, pData->stFileName.c_str(), &pvBuf))
{
pData->dwSize = pData->File.Size();
pData->pvBuf = new char [pData->dwSize];
memcpy(pData->pvBuf, pvBuf, pData->dwSize);
}
m_CompleteMutex.Lock(); m_CompleteMutex.Lock();
m_pCompleteDeque.push_back(pData); m_pCompleteDeque.push_back(request);
m_CompleteMutex.Unlock(); m_CompleteMutex.Unlock();
Sleep(g_iLoadingDelayTime); Sleep(g_iLoadingDelayTime);

View File

@ -2,20 +2,18 @@
#define __INC_YMIR_ETERLIB_FILELOADERTHREAD_H__ #define __INC_YMIR_ETERLIB_FILELOADERTHREAD_H__
#include <deque> #include <deque>
#include <memory>
#include <vector>
#include "Thread.h" #include "Thread.h"
#include "Mutex.h" #include "Mutex.h"
#include "../eterBase/MappedFile.h"
class CFileLoaderThread class CFileLoaderThread
{ {
public: public:
typedef struct SData typedef struct SData
{ {
std::string stFileName; std::string fileName;
std::shared_ptr<std::vector<char>> data;
CMappedFile File;
LPVOID pvBuf;
DWORD dwSize;
} TData; } TData;
public: public:
@ -25,8 +23,8 @@ class CFileLoaderThread
int Create(void * arg); int Create(void * arg);
public: public:
void Request(std::string & c_rstFileName); void Request(const std::string& c_rstFileName);
bool Fetch(TData ** ppData); bool Fetch(TData& data);
void Shutdown(); void Shutdown();
protected: protected:
@ -49,10 +47,10 @@ class CFileLoaderThread
void Process(); void Process();
private: private:
std::deque<TData *> m_pRequestDeque; std::deque<TData> m_pRequestDeque;
Mutex m_RequestMutex; Mutex m_RequestMutex;
std::deque<TData *> m_pCompleteDeque; std::deque<TData> m_pCompleteDeque;
Mutex m_CompleteMutex; Mutex m_CompleteMutex;
HANDLE m_hSemaphore; HANDLE m_hSemaphore;

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<EFBFBD><EFBFBD> Ray... CCamera <EFBFBD>̿<EFBFBD><EFBFBD>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD>.. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ray<61><79> <20><><EFBFBD><EFBFBD> <20>ʿ<EFBFBD>... // 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<EFBFBD><EFBFBD> <20><>ü // 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:
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> D3DX Mesh <EFBFBD><EFBFBD> (<28>÷<EFBFBD><C3B7><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ǥ<><C7A5>Ȱ <20><> <20><><EFBFBD><EFBFBD>) // 각종 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<EFBFBD><EFBFBD> <20><>ü // 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<EFBFBD><EFBFBD> Ray... CCamera <EFBFBD>̿<EFBFBD><EFBFBD>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD>.. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ray<61><79> <20><><EFBFBD><EFBFBD> <20>ʿ<EFBFBD>... // 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<EFBFBD><EFBFBD> ms_vtPickRayDir<EFBFBD><EFBFBD> CGraphicBGase<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִµ<D6B4> // NOTE : ms_vtPickRayOrig ms_vtPickRayDir CGraphicBGase가 가지고 있는데
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ڷ<EFBFBD> <20>־<EFBFBD><D6BE><EFBFBD><EFBFBD><EFBFBD> <20>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִ°<D6B4>? Customize<EFBFBD><EFBFBD> <20><><EFBFBD>ؼ<EFBFBD>? - [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<EFBFBD><EFBFBD> GetTransform / GetViewport <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʴ´<CAB4>. // 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 <EFBFBD><EFBFBD><EFBFBD>ؽ<EFBFBD> <20><><EFBFBD>μ<EFBFBD><CEBC><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ڵ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>߰<EFBFBD> // 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 ū<EFBFBD>ǹ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ڵ<EFBFBD><DAB5>ε<EFBFBD>.. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ǥ<><C7A5><EFBFBD>ϰ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> // 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 <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> CREATE_ENUM = (1 << 6), // 2003. 01. 09. myevan 모드 리스트 얻기 실패
CREATE_DETECT = (1 << 7), // 2003. 01. 09. myevan <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> 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 <EFBFBD>ݺ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ƨ<><C6A8><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> // 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' '; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ٲ۴<D9B2> (<28>ƶ<EFBFBD> <20><><EFBFBD>½<EFBFBD> <20><> <20><><EFBFBD><EFBFBD>: NAME:\tTEXT -> TEXT\t:NAME <EFBFBD><EFBFBD> <20><>ȯ<EFBFBD><C8AF> ) 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());
// Ư<EFBFBD><EFBFBD> <20><>ǻ<EFBFBD>Ϳ<EFBFBD><CDBF><EFBFBD> Unknown<77><6E><EFBFBD><EFBFBD> '<27><>'<27>ϸ<EFBFBD> ƨ<><C6A8><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>-_-; -<EFBFBD><EFBFBD><EFBFBD><EFBFBD> // 특정 컴퓨터에서 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 <EFBFBD>ݺ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ƨ<><C6A8><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> // 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 <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>۷<EFBFBD><DBB7><EFBFBD> ī<><C4AB>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>. m_roImage.SetPointer(NULL); // CRef 에서 레퍼런스 카운트가 떨어져야 함.
Initialize(); Initialize();
} }

View File

@ -44,19 +44,17 @@ bool CGraphicImageTexture::CreateDeviceObjects()
if (m_stFileName.empty()) if (m_stFileName.empty())
{ {
// <EFBFBD><EFBFBD>Ʈ <20>ؽ<EFBFBD><D8BD><EFBFBD> // 폰트 텍스쳐
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;
} }
else else
{ {
CMappedFile mappedFile; CEterPackManager::TPackDataPtr data;
LPCVOID c_pvMap; if (!CEterPackManager::Instance().Get(m_stFileName, data))
if (!CEterPackManager::Instance().Get(mappedFile, m_stFileName.c_str(), &c_pvMap))
return false; return false;
return CreateFromMemoryFile(mappedFile.Size(), c_pvMap, m_d3dFmt, m_dwFilter); return CreateFromMemoryFile(data->size(), data->data(), m_d3dFmt, m_dwFilter);
} }
m_bEmpty = false; m_bEmpty = false;

View File

@ -97,18 +97,18 @@ struct LightComp
} }
}; };
// NOTE : FlushLight<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> // NOTE : FlushLight후 렌더링
// <EFBFBD><EFBFBD> <20><> <20>ݵ<EFBFBD><DDB5><EFBFBD> RestoreLight<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>߸<EFBFBD> <20>Ѵ<EFBFBD>. // 그 후 반드시 RestoreLight를 해줘야만 한다.
void CLightManager::FlushLight() void CLightManager::FlushLight()
{ {
Update(); Update();
m_LightSortVector.clear(); m_LightSortVector.clear();
// NOTE: Dynamic<EFBFBD><EFBFBD> Static<EFBFBD><EFBFBD> <20>и<EFBFBD> <20><>Ű<EFBFBD><C5B0> CenterPosition<EFBFBD><EFBFBD> <20>ٲ𶧸<D9B2><F0B6A7B8><EFBFBD> Static<EFBFBD><EFBFBD> // NOTE: Dynamic Static을 분리 시키고 CenterPosition이 바뀔때마다 Static
// <EFBFBD>ٽ<EFBFBD> Flush <EFBFBD>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ȭ <20><> <20><> <20>ִ<EFBFBD>. - [levites] // 다시 Flush 하는 식으로 최적화 할 수 있다. - [levites]
// light<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ÿ<EFBFBD><C5B8><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>. // 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 - <EFBFBD>Ÿ<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ĵ<EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> Limit <20><><EFBFBD><EFBFBD> <20><>ŭ <20><><EFBFBD><EFBFBD><EFBFBD>ؼ<EFBFBD> <20><><EFBFBD>ش<EFBFBD>. // 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<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> // NOTE : FlushLight후 렌더링
// <EFBFBD><EFBFBD> <20><> <20>ݵ<EFBFBD><DDB5><EFBFBD> RestoreLight<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>߸<EFBFBD> <20>Ѵ<EFBFBD>. // 그 후 반드시 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 <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>۷<EFBFBD><DBB7><EFBFBD> ī<><C4AB>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>. 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<EFBFBD><EFBFBD> 1<><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 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 <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>߰<EFBFBD> // // 2003. 9. 9 동현 추가
// // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> picking<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>... <20>Ѥ<EFBFBD>; <20><><EFBFBD><EFBFBD> <20>Ͱ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʿ<EFBFBD>... // // 지형 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 <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>߰<EFBFBD> // // 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
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD>.fnt "<EFBFBD><EFBFBD><EFBFBD><EFBFBD>" <20><>Ʈ <20><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 12 <20><> <20>ε<EFBFBD> // 굴림.fnt "굴림" 폰트 기본 사이즈 12 로 로딩
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD>:18.fnt "<EFBFBD><EFBFBD><EFBFBD><EFBFBD>" <20><>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 18 <20><> <20>ε<EFBFBD> // 굴림:18.fnt "굴림" 폰트 사이즈 18 로 로딩
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD>:14i.fnt "<EFBFBD><EFBFBD><EFBFBD><EFBFBD>" <20><>Ʈ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 14 & <20><><EFBFBD>Ÿ<EFBFBD><C5B8><EFBFBD><EFBFBD><EFBFBD> <20>ε<EFBFBD> // 굴림: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) // <EFBFBD><EFBFBD><EFBFBD>ڿ<EFBFBD><EFBFBD><EFBFBD> <20>ٲ<EFBFBD><D9B2><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ <20>Ѵ<EFBFBD>. if (m_isUpdate) // 문자열이 바뀌었을 때만 업데이트 한다.
return; return;
if (m_roText.IsNull()) if (m_roText.IsNull())
{ {
Tracef("CGraphicTextInstance::Update - <EFBFBD><EFBFBD>Ʈ<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʾҽ<CABE><D2BD>ϴ<EFBFBD>\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; // <EFBFBD>ƶ<EFBFBD> <20><> <20><>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD> UTF8 <20><> <20><><EFBFBD><EFBFBD><EFBFBD>Ϸ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> 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;
//<<<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ũ>> //<<하이퍼 링크>>
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;
// <EFBFBD>ɺ<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ƶ<EFBFBD><C6B6><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ؾ<EFBFBD><D8BE>Ѵ<EFBFBD> // 심볼로 끝나면 아랍어 모드로 시작해야한다
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)
{ {
// <<<EFBFBD>ɺ<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> (ex. <20><>ȣ, <20><><EFBFBD><EFBFBD>)>> -> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>. // <<심볼의 경우 (ex. 기호, 공백)>> -> 영어 모드 유지.
// <<(<EFBFBD>ɺ<EFBFBD><EFBFBD><EFBFBD> <20>ƴ<EFBFBD> <20>͵<EFBFBD> : <20><><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD>, <20>ƶ<EFBFBD><C6B6><EFBFBD>)>> // <<(심볼이 아닌 것들 : 숫자, 영어, 아랍어)>>
// (1) <EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ɺ<EFBFBD> or // (1) 맨 앞의 심볼 or
// (2) // (2)
// 1) <EFBFBD><EFBFBD> <20><><EFBFBD>ڰ<EFBFBD> <20>ƶ<EFBFBD><C6B6><EFBFBD> <20>ƴ<EFBFBD> && // 1) 앞 글자가 아랍어 아님 &&
// 2) <EFBFBD><EFBFBD> <20><><EFBFBD>ڰ<EFBFBD> <20>ƶ<EFBFBD><C6B6><EFBFBD> <20>ƴ<EFBFBD> && // 2) 뒷 글자가 아랍어 아님 &&
// 3) <EFBFBD><EFBFBD> <20><><EFBFBD>ڰ<EFBFBD> <20>ɺ<EFBFBD>'|'<27><> <20>ƴ<EFBFBD> && // 3) 뒷 글자가 심볼'|'이 아님 &&
// or // or
// (3) <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ɺ<EFBFBD><C9BA><EFBFBD> '|' // (3) 현재 심볼이 '|'
// <<<EFBFBD>ƶ<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ѿ<D1BE><EEB0A1> <20><><EFBFBD><EFBFBD> : <20>ɺ<EFBFBD><C9BA><EFBFBD><EFBFBD><EFBFBD>.>> // <<아랍어 모드로 넘어가는 경우 : 심볼에서.>>
// 1) <EFBFBD>ձ<EFBFBD><EFBFBD><EFBFBD> <20>ƶ<EFBFBD><C6B6><EFBFBD> // 1) 앞글자 아랍어
// 2) <EFBFBD>ޱ<EFBFBD><EFBFBD><EFBFBD> <20>ƶ<EFBFBD><C6B6><EFBFBD> // 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])) && //<EFBFBD>ձ<EFBFBD><EFBFBD><EFBFBD>, <20>ޱ<EFBFBD><DEB1>ڰ<EFBFBD> <20>ƶ<EFBFBD><C6B6><EFBFBD> <20>ƴ<EFBFBD>. !(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)<EFBFBD>ƶ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>̰ų<EFBFBD> (2)<29>ƶ<EFBFBD><C6B6><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ɺ<EFBFBD><C9BA>̶<EFBFBD><CCB6><EFBFBD> <20>ƶ<EFBFBD><C6B6><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ȯ // (1)아랍어이거나 (2)아랍어 다음의 심볼이라면 아랍어 모드 전환
else if (Arabic_IsInPresentation(wArabicChar) || Arabic_IsInSymbol(wArabicChar)) else if (Arabic_IsInPresentation(wArabicChar) || Arabic_IsInSymbol(wArabicChar))
{ {
//<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><20>׸<EFBFBD><D7B8><EFBFBD>. //그 전까지의 영어를 그린다.
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;
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>߰<EFBFBD><DFB0><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>۸<EFBFBD>ũ<EFBFBD><C5A9> <20><>ǥ <20><><EFBFBD><EFBFBD>. //기존 추가한 하이퍼링크의 좌표 수정.
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; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ؽ<EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD>۵Ǵ<DBB5> <20><>ġ 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;
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>߰<EFBFBD><DFB0><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>۸<EFBFBD>ũ<EFBFBD><C5A9> <20><>ǥ <20><><EFBFBD><EFBFBD>. //기존 추가한 하이퍼링크의 좌표 수정.
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 //[[[<EFBFBD>ƶ<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>]]] else //[[[아랍어 모드]]]
{ {
// <EFBFBD>ƶ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>̰ų<EFBFBD> <20>ƶ<EFBFBD><C6B6><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ɺ<EFBFBD><C9BA>̶<EFBFBD><CCB6><EFBFBD> // 아랍어이거나 아랍어 출력중 나오는 심볼이라면
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;
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>߰<EFBFBD><DFB0><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>۸<EFBFBD>ũ<EFBFBD><C5A9> <20><>ǥ <20><><EFBFBD><EFBFBD>. //기존 추가한 하이퍼링크의 좌표 수정.
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 //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̰ų<EFBFBD>, <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ɺ<EFBFBD><C9BA>̶<EFBFBD><CCB6><EFBFBD>, 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;
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>߰<EFBFBD><DFB0><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>۸<EFBFBD>ũ<EFBFBD><C5A9> <20><>ǥ <20><><EFBFBD><EFBFBD>. //기존 추가한 하이퍼링크의 좌표 수정.
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; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ؽ<EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD>۵Ǵ<DBB5> <20><>ġ kHyperlink.ex = kHyperlink.sx = 0; // 실제 텍스트가 시작되는 위치
} }
else else
{ {
@ -401,7 +401,7 @@ void CGraphicTextInstance::Update()
} }
} }
else // <EFBFBD>ƶ<EFBFBD><EFBFBD><EFBFBD> <20>ٸ<EFBFBD> <20><><EFBFBD><EFBFBD>. 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; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ؽ<EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD>۵Ǵ<DBB5> <20><>ġ 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; // <EFBFBD>ƶ<EFBFBD> <20><> <20><>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD> UTF8 <20><> <20><><EFBFBD><EFBFBD><EFBFBD>Ϸ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> 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;
// <EFBFBD>׵θ<EFBFBD> // 테두리
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 : <EFBFBD><EFBFBD>Ʈ <20><><EFBFBD>¿<EFBFBD> Width <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ӵϴ<D3B4>. - [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;
// <EFBFBD><EFBFBD> //
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);
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> // 오른
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;
// <EFBFBD><EFBFBD> //
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);
// <EFBFBD>Ʒ<EFBFBD> // 아래
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)
} }
} }
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ʈ // 메인 폰트
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 : <EFBFBD><EFBFBD>Ʈ <20><><EFBFBD>¿<EFBFBD> Width <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ӵϴ<D3B4>. - [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;
} }
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȭ <20><><EFBFBD><EFBFBD> // 최적화 사항
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ؽ<EFBFBD><EFBFBD>ĸ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵٸ<D1B4>... STRIP<49><50> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD>, <20>ؽ<EFBFBD><D8BD>İ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ǰų<C7B0> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> DrawPrimitive<EFBFBD><EFBFBD> ȣ<><C8A3><EFBFBD><EFBFBD> // 같은텍스쳐를 사용한다면... STRIP을 구성하고, 텍스쳐가 변경되거나 끝나면 DrawPrimitive를 호출해
// <EFBFBD>ִ<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ڸ<EFBFBD> <20><><EFBFBD>̵<EFBFBD><CCB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>! // 최대한 숫자를 줄이도록하자!
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);
//<EFBFBD>ݰ<EFBFBD><EFBFBD><EFBFBD> <20><>ũ <20><><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD> <20>κ<EFBFBD>. //금강경 링크 띄워주는 부분.
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;
//<EFBFBD>ƶ<EFBFBD><EFBFBD><EFBFBD> <20><>ǥ <20><>ȣ<EFBFBD><C8A3> <20>ٲ<EFBFBD><D9B2>ش<EFBFBD>. //아랍은 좌표 부호를 바꿔준다.
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 : <EFBFBD><EFBFBD>Ʈ <20><><EFBFBD>¿<EFBFBD> Width <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ӵϴ<D3B4>. - [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 : <EFBFBD>ػ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִ<EFBFBD>ġ. <20>̺<EFBFBD><CCBA><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>? - [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*/)
{ {
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> MANAGED <EFBFBD><EFBFBD><EFBFBD><EFBFBD> // 무조건 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<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ؽ<EFBFBD>Ʈ<EFBFBD><C6AE> <20><>ġ<EFBFBD><C4A1> <20>´<EFBFBD>. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ؾ<EFBFBD><D8BE><EFBFBD>. // 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]);
} }
// <EFBFBD>ƶ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ڵ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ٲ<EFBFBD><D9B2><EFBFBD> <20>ʴ´<CAB4> // 아랍어에서 영어로 변경시 코드 페이지를 바꾸지 않는다
// <EFBFBD><EFBFBD><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʴ´<CAB4>. // 내용도 지우지 않는다.
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) // <EFBFBD><20><><EFBFBD><EFBFBD> <20>Է<EFBFBD> ó<><C3B3> 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<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> - [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();
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ø<EFBFBD><C3B8><EFBFBD><EFBFBD>̼<EFBFBD><CCBC><EFBFBD> <20><>Ȱ<EFBFBD><C8B0>ȭ <20>Ǿ<EFBFBD> <20>־<EFBFBD> <20>Է<EFBFBD><D4B7><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>. // 현재 어플리케이션이 비활성화 되어 있어 입력을 받을 수 없다.
//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) // <EFBFBD><EFBFBD> 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<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ī<>޶<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD>, ī<>޶<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ڿ<EFBFBD> <20>ؾ<EFBFBD> <20><>. 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("<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ü.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("<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ü.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

@ -42,18 +42,17 @@ void CResource::Load()
const char * c_szFileName = GetFileName(); const char * c_szFileName = GetFileName();
DWORD dwStart = ELTimer_GetMSec(); DWORD dwStart = ELTimer_GetMSec();
CMappedFile file; CEterPackManager::TPackDataPtr fileData;
LPCVOID fileData;
//Tracenf("Load %s", c_szFileName); //Tracenf("Load %s", c_szFileName);
if (CEterPackManager::Instance().Get(file, c_szFileName, &fileData)) if (CEterPackManager::Instance().Get(c_szFileName, fileData))
{ {
m_dwLoadCostMiliiSecond = ELTimer_GetMSec() - dwStart; m_dwLoadCostMiliiSecond = ELTimer_GetMSec() - dwStart;
//Tracef("CResource::Load %s (%d bytes) in %d ms\n", c_szFileName, file.Size(), m_dwLoadCostMiliiSecond); //Tracef("CResource::Load %s (%d bytes) in %d ms\n", c_szFileName, file.Size(), m_dwLoadCostMiliiSecond);
if (OnLoad(file.Size(), fileData)) if (OnLoad(fileData->size(), fileData->data()))
{ {
me_state = STATE_EXIST; me_state = STATE_EXIST;
} }
@ -81,12 +80,11 @@ void CResource::Reload()
Clear(); Clear();
Tracef("CResource::Reload %s\n", GetFileName()); Tracef("CResource::Reload %s\n", GetFileName());
CMappedFile file; CEterPackManager::TPackDataPtr fileData;
LPCVOID fileData;
if (CEterPackManager::Instance().Get(file, GetFileName(), &fileData)) if (CEterPackManager::Instance().Get(GetFileName(), fileData))
{ {
if (OnLoad(file.Size(), fileData)) if (OnLoad(fileData->size(), fileData->data()))
{ {
me_state = STATE_EXIST; me_state = STATE_EXIST;
} }
@ -131,8 +129,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. <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD>Ǵ<EFBFBD> <20><>Ȳ<EFBFBD><C8B2><EFBFBD><EFBFBD> static <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʴ°<CAB4><C2B0><EFBFBD> <20><><EFBFBD><EFBFBD>. // 2004. 2. 1. myevan. 쓰레드가 사용되는 상황에서 static 변수는 사용하지 않는것이 좋다.
// 2004. 2. 1. myevan. <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20≯<EFBFBD> ó<><C3B3><EFBFBD><EFBFBD> std::string <EFBFBD><EFBFBD><EFBFBD><EFBFBD> // 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; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ð<EFBFBD> (30<EFBFBD><EFBFBD>) const long c_Deleting_Wait_Time = 30000; // 삭제 대기 시간 (30)
const long c_DeletingCountPerFrame = 30; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӵ<EFBFBD> üũ <20><><EFBFBD>ҽ<EFBFBD> <20><><EFBFBD><EFBFBD> const long c_DeletingCountPerFrame = 30; // 프레임당 체크 리소스 갯수
const long c_Reference_Decrease_Wait_Time = 30000; // <EFBFBD><EFBFBD><EFBFBD>ε<EFBFBD> <20><><EFBFBD>ҽ<EFBFBD><D2BD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ð<EFBFBD> (30<EFBFBD><EFBFBD>) const long c_Reference_Decrease_Wait_Time = 30000; // 선로딩 리소스의 해제 대기 시간 (30)
CFileLoaderThread CResourceManager::ms_loadingThread; CFileLoaderThread CResourceManager::ms_loadingThread;
@ -56,36 +56,33 @@ 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: <EFBFBD><EFBFBD><EFBFBD> break <EFBFBD>ϸ<EFBFBD> õõ<C3B5><C3B5> <20>ε<EFBFBD> <20>ȴ<EFBFBD>. //break; // NOTE: 여기서 break 하면 천천히 로딩 된다.
} }
DWORD dwCurrentTime = ELTimer_GetMSec(); DWORD dwCurrentTime = ELTimer_GetMSec();
CFileLoaderThread::TData * pData; CFileLoaderThread::TData pData;
while (ms_loadingThread.Fetch(&pData)) while (ms_loadingThread.Fetch(pData))
{ {
//printf("LOD %s\n", pData->stFileName.c_str()); //printf("LOD %s\n", pData->stFileName.c_str());
CResource * pResource = GetResourcePointer(pData->stFileName.c_str()); CResource * pResource = GetResourcePointer(pData.fileName.c_str());
if (pResource) if (pResource)
{ {
if (pResource->IsEmpty()) if (pResource->IsEmpty())
{ {
pResource->OnLoad(pData->dwSize, pData->pvBuf); pResource->OnLoad(pData.data->size(), pData.data->data());
pResource->AddReferenceOnly(); pResource->AddReferenceOnly();
// <EFBFBD><EFBFBD><EFBFBD><20>ö<EFBFBD><C3B6><EFBFBD> <20><><EFBFBD>۷<EFBFBD><DBB7><EFBFBD> ī<><C4AB>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD> <20>ð<EFBFBD><C3B0><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ڿ<EFBFBD> Ǯ<><C7AE><EFBFBD>ֱ<EFBFBD> <20><><EFBFBD>Ͽ<EFBFBD> // 여기서 올라간 레퍼런스 카운트를 일정 시간이 지난 뒤에 풀어주기 위하여
m_pResRefDecreaseWaitingMap.insert(TResourceRefDecreaseWaitingMap::value_type(dwCurrentTime, pResource)); m_pResRefDecreaseWaitingMap.insert(TResourceRefDecreaseWaitingMap::value_type(dwCurrentTime, pResource));
} }
} }
m_WaitingMap.erase(GetCRC32(pData->stFileName.c_str(), pData->stFileName.size())); m_WaitingMap.erase(GetCRC32(pData.fileName.c_str(), pData.fileName.size()));
delete [] ((char *) pData->pvBuf);
delete pData;
} }
// DO : <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ð<EFBFBD><C3B0><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20≯<EFBFBD> <20>ε<EFBFBD><CEB5><EFBFBD> <20>ξ<EFBFBD><CEBE><EFBFBD> <20><><EFBFBD>ҽ<EFBFBD><D2BD><EFBFBD> <20><><EFBFBD>۷<EFBFBD><DBB7><EFBFBD> ī<><C4AB>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD> <20><>Ų<EFBFBD><C5B2> - [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 +230,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) // <EFBFBD>̹<EFBFBD> <20><><EFBFBD>ҽ<EFBFBD><D2BD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ѵ<EFBFBD>. if (pResource) // 이미 리소스가 있으면 리턴 한다.
return pResource; return pResource;
CResource * (*newFunc) (const char *) = NULL; CResource * (*newFunc) (const char *) = NULL;
@ -283,7 +280,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) // <EFBFBD>̹<EFBFBD> <20><><EFBFBD>ҽ<EFBFBD><D2BD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ѵ<EFBFBD>. if (pResource) // 이미 리소스가 있으면 리턴 한다.
return pResource; return pResource;
const char * pcFileExt = strrchr(c_pszFile, '.'); const char * pcFileExt = strrchr(c_pszFile, '.');

View File

@ -2,6 +2,7 @@
#include "Resource.h" #include "Resource.h"
#include "FileLoaderThread.h" #include "FileLoaderThread.h"
#include "../EterBase/Singleton.h"
#include <set> #include <set>
#include <map> #include <map>
@ -26,7 +27,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);
// <EFBFBD>߰<EFBFBD> // 추가
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 +64,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; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ε<EFBFBD> <20><>û<EFBFBD><C3BB> <20><><EFBFBD><EFBFBD>Ʈ 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));
// <EFBFBD>̰<EFBFBD> <20>Ⱦ<EFBFBD><C8BE>°<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>? [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 ó<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ĺ<EFBFBD><C4B9><EFBFBD><EFBFBD><EFBFBD> <20>ű<EFBFBD><C5B1><EFBFBD>, DepthTest ó<EFBFBD><EFBFBD> // 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 ó<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ĺ<EFBFBD><C4B9><EFBFBD><EFBFBD><EFBFBD> <20>ű<EFBFBD><C5B1><EFBFBD>, DepthTest ó<EFBFBD><EFBFBD> // 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]; // <EFBFBD>ε<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>... TIndex m_Indices[4]; // 인덱스 버퍼...
CColorTransitionHelper m_Helper[4]; CColorTransitionHelper m_Helper[4];
}; };
@ -99,7 +99,7 @@ protected:
protected: protected:
////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////
// Ÿ<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> // 타입 정의
typedef std::vector<CSkyObjectQuad> TSkyObjectQuadVector; typedef std::vector<CSkyObjectQuad> TSkyObjectQuadVector;
typedef TSkyObjectQuadVector::iterator TSkyObjectQuadIterator; typedef TSkyObjectQuadVector::iterator TSkyObjectQuadIterator;
@ -118,8 +118,8 @@ protected:
////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD>... // 구름...
TSkyObjectFace m_FaceCloud; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD>... 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;
// <EFBFBD><EFBFBD>ī<EFBFBD><EFBFBD> <20>ڽ<EFBFBD> <20>̹<EFBFBD><CCB9><EFBFBD>... // 스카이 박스 이미지...
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;
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>... <20>ӽ<EFBFBD> <20><><EFBFBD><EFBFBD>.. // 랜더링 관련... 임시 변수..
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 <EFBFBD>Ѿ<EFBFBD>°<EFBFBD> <20><><EFBFBD><EFBFBD> #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

@ -179,14 +179,13 @@ bool CTextFileLoader::Load(const char * c_szFileName)
{ {
m_strFileName = ""; m_strFileName = "";
const VOID* pvData; CEterPackManager::TPackDataPtr data;
CMappedFile kFile; if (!CEterPackManager::Instance().Get(c_szFileName, data))
if (!CEterPackManager::Instance().Get(kFile, c_szFileName, &pvData))
return false; return false;
if (m_dwBufCapacity<kFile.Size()) if (m_dwBufCapacity < data->size())
{ {
m_dwBufCapacity=kFile.Size(); m_dwBufCapacity = data->size();
if (m_acBufData) if (m_acBufData)
delete [] m_acBufData; delete [] m_acBufData;
@ -194,8 +193,8 @@ bool CTextFileLoader::Load(const char * c_szFileName)
m_acBufData=new char[m_dwBufCapacity]; m_acBufData=new char[m_dwBufCapacity];
} }
m_dwBufSize=kFile.Size(); m_dwBufSize = data->size();
memcpy(m_acBufData, pvData, m_dwBufSize); memcpy_s(m_acBufData, m_dwBufCapacity, data->data(), data->size());
m_strFileName = c_szFileName; m_strFileName = c_szFileName;
m_dwcurLineIndex = 0; m_dwcurLineIndex = 0;

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'|') // ||<EFBFBD><EFBFBD> |<7C><> ǥ<><C7A5><EFBFBD>Ѵ<EFBFBD>. 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[<EFBFBD≯<EFBFBD>]|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<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> // |r의 경우
if (*cur == L'r' && *(cur - 1) == L'|') if (*cur == L'r' && *(cur - 1) == L'|')
{ {
int len = src_len; int len = src_len;
// ||r<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> // ||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<EFBFBD><EFBFBD><EFBFBD><EFBFBD> ã<>Ƽ<EFBFBD> |<7C><>ġ<EFBFBD><C4A1><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>. // |c까지 찾아서 |위치까지 리턴한다.
while (len > 1) // <EFBFBD>ּ<EFBFBD> 2<>ڸ<EFBFBD> <20>˻<EFBFBD><CBBB>ؾ<EFBFBD> <20>ȴ<EFBFBD>. 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); // <EFBFBD><EFBFBD>ã<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>;; return (src_len); // 못찾으면 전부;;
} }
// ||<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> // ||의 경우
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<EFBFBD><EFBFBD> <20>ҷ<EFBFBD><D2B7><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ҷ<EFBFBD><D2B7><EFBFBD><EFBFBD><EFBFBD>. virtual UINT Setup() = 0; // Execute이 불려지기 전에 불려진다.
virtual UINT Execute(void * arg) = 0; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><20>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EEB0A1> <20><> virtual UINT Execute(void * arg) = 0; // 실제 쓰레드가 하는 일이 들어가는 곳
UINT Run(void * arg); UINT Run(void * arg);

View File

@ -20,16 +20,14 @@ void PrintfTabs(FILE * File, int iTabCount, const char * c_szString, ...)
bool LoadTextData(const char * c_szFileName, CTokenMap & rstTokenMap) bool LoadTextData(const char * c_szFileName, CTokenMap & rstTokenMap)
{ {
LPCVOID pMotionData; CEterPackManager::TPackDataPtr motionData;
CMappedFile File; CMemoryTextFileLoader textFileLoader;
if (!CEterPackManager::Instance().Get(File, c_szFileName, &pMotionData)) if (!CEterPackManager::Instance().Get(c_szFileName, motionData))
return false; return false;
CMemoryTextFileLoader textFileLoader;
CTokenVector stTokenVector; CTokenVector stTokenVector;
textFileLoader.Bind(motionData->size(), motionData->data());
textFileLoader.Bind(File.Size(), pMotionData);
for (DWORD i = 0; i < textFileLoader.GetLineCount(); ++i) for (DWORD i = 0; i < textFileLoader.GetLineCount(); ++i)
{ {
@ -50,18 +48,16 @@ bool LoadTextData(const char * c_szFileName, CTokenMap & rstTokenMap)
bool LoadMultipleTextData(const char * c_szFileName, CTokenVectorMap & rstTokenVectorMap) bool LoadMultipleTextData(const char * c_szFileName, CTokenVectorMap & rstTokenVectorMap)
{ {
LPCVOID pModelData; CEterPackManager::TPackDataPtr modelData;
CMappedFile File; CMemoryTextFileLoader textFileLoader;
if (!CEterPackManager::Instance().Get(File, c_szFileName, &pModelData)) if (!CEterPackManager::Instance().Get(c_szFileName, modelData))
return false; return false;
DWORD i; DWORD i;
CMemoryTextFileLoader textFileLoader;
CTokenVector stTokenVector; CTokenVector stTokenVector;
textFileLoader.Bind(File.Size(), pModelData); textFileLoader.Bind(modelData->size(), modelData->data());
for (i = 0; i < textFileLoader.GetLineCount(); ++i) for (i = 0; i < textFileLoader.GetLineCount(); ++i)
{ {
@ -214,13 +210,13 @@ const char* GetFontFaceFromCodePage9x(WORD codePage)
switch( codePage ) switch( codePage )
{ {
case CP_932: case CP_932:
return "<EFBFBD>l<EFBFBD>r <20>o<EFBFBD>S<EFBFBD>V<EFBFBD>b<EFBFBD>N"; return "MS PGothic";
case CP_949: case CP_949:
return "<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ü"; return "GulimChe";
case CP_936: case CP_936:
return "<EFBFBD><EFBFBD><EFBFBD><EFBFBD>"; return "SimSun";
case CP_950: case CP_950:
return "<EFBFBD>ө<EFBFBD><EFBFBD><EFBFBD>"; return "MingLiU";
case CP_874: case CP_874:
return "Tahoma"; return "Tahoma";
case CP_1252: case CP_1252:
@ -332,7 +328,7 @@ void base64_decode(const char * str,char * resultStr)
{ {
i=0; i=0;
strcpy(szDest, ""); strcpy(szDest, "");
while(nCount<length && i<4) // 4<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD>´<EFBFBD>. while(nCount<length && i<4) // 4개의 바이트를 얻는다.
{ {
r = str[nCount++]; r = str[nCount++];
result = __base64_get(r); result = __base64_get(r);
@ -340,13 +336,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<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʱ<EFBFBD> <20><><EFBFBD><EFBFBD>) else szDest[i++] = '@'; // It's end (64번은 디코딩시 사용되지 않기 때문)
} }
} }
if(i==4) // 4<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ҽ<EFBFBD><D2BD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>´<EFBFBD>. <20><><EFBFBD>ڵ<EFBFBD> <20><><EFBFBD><EFBFBD> if(i==4) // 4개의 소스를 모두 얻어냈다. 디코드 시작
{ {
if( nCount+3 >= length ) // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ߴ<EFBFBD>. 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;
} }
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ƴϰ<C6B4>, <20≯<EFBFBD><CCB8><EFBFBD> <20><><EFBFBD>۵<EFBFBD><DBB5><EFBFBD> <20>ʾ<EFBFBD><CABE><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ĭ<EFBFBD><C4AD> <20>dz<EFBFBD> <20>ڴ<EFBFBD>. // 값이 아니고, 이름이 시작되지 않았을 경우 빈칸은 건너 뛴다.
else if (!isValue && iNameLen == 0 && isspace((unsigned char) c)) else if (!isValue && iNameLen == 0 && isspace((unsigned char) c))
{ {
} }
// <EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD> <20>dz<EFBFBD> <20>ڴ<EFBFBD> // 엔터는 건너 뛴다
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); // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ĭ <20>ڸ<EFBFBD><DAB8><EFBFBD> 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) // <EFBFBD><EFBFBD><EFBFBD>ڰ<EFBFBD> <20><><EFBFBD><EFBFBD> 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 // <EFBFBD><EFBFBD><EFBFBD>ڰ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD> <20><><EFBFBD>ɾ<EFBFBD><C9BE><EFBFBD>. 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:
/** <EFBFBD><EFBFBD>Ʈ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ũ<EFBFBD><C5A9>Ʈ <20>׷<EFBFBD><D7B7><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. /** 스트링으로 부터 스크립트 그룹을 만든다.
* *
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϸ<EFBFBD> GetError <EFBFBD>޼ҵ<EFBFBD><EFBFBD><EFBFBD> Ȯ<><C8AE><EFBFBD><EFBFBD> <20><> <20>ִ<EFBFBD>. * 실패하면 GetError 메소드로 확인할 수 있다.
* *
* @param stSource <EFBFBD><EFBFBD> <20><>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>׷<EFBFBD><D7B7><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>. * @param stSource 이 스트링으로 부터 그룹이 만들어 진다.
* @return <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> true, <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϸ<EFBFBD> false * @return 성공시 true, 실패하면 false
*/ */
bool Create(const std::string & stSource); bool Create(const std::string & stSource);
/** <EFBFBD><EFBFBD><EFBFBD>ɾ <20>޴<EFBFBD> <20>޼ҵ<DEBC> /** 명령어를 받는 메소드
* *
* @param cmd <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ÿ<EFBFBD> <20><> <20><><EFBFBD><EFBFBD>ü<EFBFBD><C3BC> <20><><EFBFBD>ɾ <20><><EFBFBD><EFBFBD> <20>ȴ<EFBFBD>. * @param cmd 성공시에 이 구조체로 명령어가 복사 된다.
* @return <EFBFBD><EFBFBD><EFBFBD>ɾ <20><><EFBFBD><EFBFBD> <20>ִٸ<D6B4> true, <EFBFBD><EFBFBD><EFBFBD>ٸ<EFBFBD> false * @return 명령어가 남아 있다면 true, 없다면 false
*/ */
bool GetCmd(TCmd & cmd); bool GetCmd(TCmd & cmd);
/* /*
<EFBFBD><EFBFBD><EFBFBD>ɾ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʴ´<CAB4>. 명령어를 가져오되 꺼내지는 않는다.
*/ */
bool ReadCmd(TCmd & cmd); bool ReadCmd(TCmd & cmd);
/** <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>޴<EFBFBD> <20>޼ҵ<DEBC> /** 에러를 출력 받는 메소드
* *
* @return stError <EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ȴ<EFBFBD>. * @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))
{ {
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EEB3BB> // 이전 글자 얻어내기
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
} }
} }
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EEB3BB> // 다음 글자 얻어내기
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;
} }

File diff suppressed because it is too large Load Diff

View File

@ -1,243 +0,0 @@
#ifndef __INC_ETERPACKLIB_ETERPACK_H__
#define __INC_ETERPACKLIB_ETERPACK_H__
#include <list>
#include <unordered_map>
#include "../EterBase/MappedFile.h"
#ifndef MAKEFOURCC
#define MAKEFOURCC(ch0, ch1, ch2, ch3) \
((DWORD)(BYTE) (ch0 ) | ((DWORD)(BYTE) (ch1) << 8) | \
((DWORD)(BYTE) (ch2) << 16) | ((DWORD)(BYTE) (ch3) << 24))
#endif
//#define CHECKSUM_CHECK_MD5
#include "md5.h"
namespace eterpack
{
const DWORD c_PackCC = MAKEFOURCC('E', 'P', 'K', 'D');
const DWORD c_IndexCC = MAKEFOURCC('E', 'P', 'K', 'D');
const DWORD c_Version = 2;
// FourCC + Version + m_indexCount
const DWORD c_HeaderSize = sizeof(DWORD) + sizeof(DWORD) + sizeof(long);
};
enum EEterPackTypes
{
DBNAME_MAX_LEN = 255,
FILENAME_MAX_LEN = 160,
FREE_INDEX_BLOCK_SIZE = 32768,
FREE_INDEX_MAX_SIZE = 512,
DATA_BLOCK_SIZE = 256,
COMPRESSED_TYPE_NONE = 0,
COMPRESSED_TYPE_COMPRESS = 1,
COMPRESSED_TYPE_SECURITY = 2,
COMPRESSED_TYPE_PANAMA = 3,
COMPRESSED_TYPE_HYBRIDCRYPT = 4,
COMPRESSED_TYPE_HYBRIDCRYPT_WITHSDB = 5,
COMPRESSED_TYPE_COUNT = 6,
};
#pragma pack(push, 4)
typedef struct SEterPackIndex
{
long id;
char filename[FILENAME_MAX_LEN + 1];
DWORD filename_crc;
long real_data_size;
long data_size;
#ifdef CHECKSUM_CHECK_MD5
BYTE MD5Digest[16];
#else
DWORD data_crc;
#endif
long data_position;
char compressed_type;
} TEterPackIndex;
#pragma pack(pop)
typedef std::unordered_map<DWORD, TEterPackIndex *> TDataPositionMap;
typedef std::list<TEterPackIndex *> TFreeIndexList;
class CEterPack;
class CEterFileDict
{
public:
struct Item
{
Item() : pkPack(NULL), pkInfo(NULL) {}
CEterPack* pkPack;
TEterPackIndex* pkInfo;
};
enum
{
BUCKET_SIZE = 16,
};
typedef std::unordered_multimap<DWORD, Item> TDict;
public:
void InsertItem(CEterPack* pkPack, TEterPackIndex* pkInfo);
void UpdateItem(CEterPack* pkPack, TEterPackIndex* pkInfo);
Item* GetItem(DWORD dwFileNameHash, const char* c_pszFileName);
const TDict& GetDict() const
{
return m_dict;
}
private:
TDict m_dict;
};
class EterPackPolicy_CSHybridCrypt;
class CEterPack
{
public:
CEterPack();
virtual ~CEterPack();
void Destroy();
bool Create(CEterFileDict& rkFileDict, const char * dbname, const char * pathName, bool bReadOnly = true, const BYTE* iv = NULL);
bool DecryptIV(DWORD dwPanamaKey);
const std::string& GetPathName();
const char * GetDBName();
bool Get(CMappedFile & mappedFile, const char * filename, LPCVOID * data);
bool Get2(CMappedFile & mappedFile, const char * filename, TEterPackIndex* index, LPCVOID * data);
bool Put(const char * filename, const char * sourceFilename, BYTE packType, const std::string& strRelateMapName);
bool Put(const char * filename, LPCVOID data, long len, BYTE packType);
bool Delete(const char * filename);
bool Extract();
long GetFragmentSize();
bool IsExist(const char * filename);
TDataPositionMap & GetIndexMap();
bool EncryptIndexFile();
bool DecryptIndexFile();
DWORD DeleteUnreferencedData(); // <20><EFBFBD><EEB0B3> <20><><EFBFBD><EFBFBD> <20>Ǿ<EFBFBD><C7BE><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ѵ<EFBFBD>.
bool GetNames(std::vector<std::string>* retNames);
EterPackPolicy_CSHybridCrypt* GetPackPolicy_HybridCrypt() const;
private:
bool __BuildIndex(CEterFileDict& rkFileDict, bool bOverwirte=false);
bool CreateIndexFile();
TEterPackIndex * FindIndex(const char * filename);
long GetNewIndexPosition(CFileBase& file);
TEterPackIndex * NewIndex(CFileBase& file, const char * filename, long size);
void WriteIndex(CFileBase& file, TEterPackIndex * index);
int GetFreeBlockIndex(long size);
void PushFreeIndex(TEterPackIndex * index);
bool CreateDataFile();
long GetNewDataPosition(CFileBase& file);
bool ReadData(CFileBase& file, TEterPackIndex * index, LPVOID data, long maxsize);
bool WriteData(CFileBase& file, TEterPackIndex * index, LPCVOID data);
bool WriteNewData(CFileBase& file, TEterPackIndex * index, LPCVOID data);
bool Delete(TEterPackIndex * pIndex);
protected:
CMappedFile m_file;
char* m_file_data;
unsigned m_file_size;
long m_indexCount;
bool m_bEncrypted;
char m_dbName[DBNAME_MAX_LEN+1];
char m_indexFileName[MAX_PATH+1];
TEterPackIndex * m_indexData;
long m_FragmentSize;
bool m_bReadOnly;
bool m_bDecrypedIV;
std::unordered_map<DWORD, DWORD> m_map_indexRefCount;
TDataPositionMap m_DataPositionMap;
TFreeIndexList m_FreeIndexList[FREE_INDEX_MAX_SIZE + 1]; // MAX <20><> <20><EFBFBD><EFBCBC> <20>ϹǷ<CFB9> + 1 ũ<>⸸ŭ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
std::string m_stDataFileName;
std::string m_stPathName;
EterPackPolicy_CSHybridCrypt* m_pCSHybridCryptPolicy;
private:
void __CreateFileNameKey_Panama(const char * filename, BYTE * key, unsigned int keySize);
bool __Decrypt_Panama(const char* filename, const BYTE* data, SIZE_T dataSize, CLZObject& zObj);
bool __Encrypt_Panama(const char* filename, const BYTE* data, SIZE_T dataSize, CLZObject& zObj);
std::string m_stIV_Panama;
//private:
// bool m_bIsDataLoaded;
// // <20>׳<EFBFBD> time_t<5F><74> <20><><EFBFBD><EFBFBD>, 32bit time_t<5F><74> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20>ҽ<EFBFBD><D2BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,
// // CEterPack<63><6B> size<7A><65> <20><><EFBFBD><EFBFBD> size - 4<><34> <20>ν<EFBFBD><CEBD>ϱ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>߻<EFBFBD><DFBB><EFBFBD> <20><> <20>ִ<EFBFBD>.
// __time64_t m_tLastAccessTime;
//public:
// __time64_t GetLastAccessTime() { return m_tLastAccessTime; }
// void UpdateLastAccessTime();
// void ClearDataMemoryMap();
#ifdef CHECKSUM_CHECK_MD5
void GenerateMD5Hash( BYTE* pData, int nLength, IN OUT MD5_CTX& context );
#endif
};
class CMakePackLog
{
public:
static CMakePackLog& GetSingleton();
public:
CMakePackLog();
~CMakePackLog();
void SetFileName(const char* c_szFileName);
void Writef(const char* c_szFormat, ...);
void Writenf(const char* c_szFormat, ...);
void Write(const char* c_szBuf);
void WriteErrorf(const char* c_szFormat, ...);
void WriteErrornf(const char* c_szFormat, ...);
void WriteError(const char* c_szBuf);
void FlushError();
private:
void __Write(const char* c_szBuf, int nBufLen);
void __WriteError(const char* c_szBuf, int nBufLen);
bool __IsLogMode();
private:
FILE* m_fp;
FILE* m_fp_err;
std::string m_stFileName;
std::string m_stErrorFileName;
};
#endif

View File

@ -170,20 +170,6 @@
</Lib> </Lib>
</ItemDefinitionGroup> </ItemDefinitionGroup>
<ItemGroup> <ItemGroup>
<ClCompile Include="EterPack.cpp">
<Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Disabled</Optimization>
<BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">EnableFastChecks</BasicRuntimeChecks>
<BrowseInformation Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</BrowseInformation>
<Optimization Condition="'$(Configuration)|$(Platform)'=='Distribute|Win32'">MaxSpeed</Optimization>
<Optimization Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">MaxSpeed</Optimization>
</ClCompile>
<ClCompile Include="EterPackCursor.cpp">
<Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Disabled</Optimization>
<BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">EnableFastChecks</BasicRuntimeChecks>
<BrowseInformation Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</BrowseInformation>
<Optimization Condition="'$(Configuration)|$(Platform)'=='Distribute|Win32'">MaxSpeed</Optimization>
<Optimization Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">MaxSpeed</Optimization>
</ClCompile>
<ClCompile Include="EterPackManager.cpp"> <ClCompile Include="EterPackManager.cpp">
<Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Disabled</Optimization> <Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Disabled</Optimization>
<BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">EnableFastChecks</BasicRuntimeChecks> <BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">EnableFastChecks</BasicRuntimeChecks>
@ -191,25 +177,16 @@
<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="EterPackPolicy_CSHybridCrypt.cpp" /> <ClCompile Include="Folder.cpp" />
<ClCompile Include="md5.c" /> <ClCompile Include="ZIP.cpp" />
<ClCompile Include="StdAfx.cpp">
<Optimization Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Disabled</Optimization>
<BasicRuntimeChecks Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">EnableFastChecks</BasicRuntimeChecks>
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader>
<BrowseInformation Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</BrowseInformation>
<Optimization Condition="'$(Configuration)|$(Platform)'=='Distribute|Win32'">MaxSpeed</Optimization>
<Optimization Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">MaxSpeed</Optimization>
</ClCompile>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClInclude Include="EterPack.h" />
<ClInclude Include="EterPackCursor.h" />
<ClInclude Include="EterPackManager.h" /> <ClInclude Include="EterPackManager.h" />
<ClInclude Include="EterPackPolicy_CSHybridCrypt.h" /> <ClInclude Include="FileProvider.h" />
<ClInclude Include="Folder.h" />
<ClInclude Include="Inline.h" /> <ClInclude Include="Inline.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,48 +9,39 @@
<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">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="EterPackCursor.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="EterPackManager.cpp"> <ClCompile Include="EterPackManager.cpp">
<Filter>Source Files</Filter> <Filter>Source Files</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="EterPackPolicy_CSHybridCrypt.cpp"> <ClCompile Include="Folder.cpp">
<Filter>Source Files</Filter> <Filter>File Providers</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="md5.c"> <ClCompile Include="ZIP.cpp">
<Filter>Source Files</Filter> <Filter>File Providers</Filter>
</ClCompile>
<ClCompile Include="StdAfx.cpp">
<Filter>Source Files</Filter>
</ClCompile> </ClCompile>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClInclude Include="EterPack.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="EterPackCursor.h">
<Filter>Header Files</Filter>
</ClInclude>
<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>
<ClInclude Include="md5.h">
<Filter>Header Files</Filter>
</ClInclude>
<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

@ -1,59 +0,0 @@
#include "StdAfx.h"
#include "EterPackCursor.h"
#include "Inline.h"
CEterPackCursor::CEterPackCursor(CEterPack* pack) : m_pPack(pack), m_pData(NULL), m_ReadPoint(0)
{
}
CEterPackCursor::~CEterPackCursor()
{
Close();
}
bool CEterPackCursor::Open(const char* filename)
{
assert(m_pPack != NULL);
char tmpFilename[MAX_PATH + 1];
strncpy(tmpFilename, filename, MAX_PATH);
inlineConvertPackFilename(tmpFilename);
if (!m_pPack->Get(m_file, tmpFilename, &m_pData))
return false;
return true;
}
void CEterPackCursor::Close()
{
m_file.Destroy();
m_pData = NULL;
m_ReadPoint = 0;
}
void CEterPackCursor::Seek(long offset)
{
m_ReadPoint = max(0, min(Size(), offset));
}
bool CEterPackCursor::Read(LPVOID data, long size)
{
if (m_file.IsNull())
return false;
if (m_ReadPoint + size > Size())
return false;
memcpy(data, (char*) m_pData + m_ReadPoint, size);
m_ReadPoint += size;
return true;
}
long CEterPackCursor::Size()
{
if (m_file.IsNull())
return 0;
return m_file.Size();
}

View File

@ -1,25 +0,0 @@
#ifndef __INC_ETERPACKCURSOR_H__
#define __INC_ETERPACKCURSOR_H__
#include "EterPack.h"
class CEterPackCursor
{
public:
CEterPackCursor(CEterPack * pack);
~CEterPackCursor();
bool Open(const char* filename);
void Close();
void Seek(long offset);
bool Read(LPVOID data, long size);
long Size();
private:
CEterPack * m_pPack;
CMappedFile m_file;
LPCVOID m_pData;
long m_ReadPoint;
};
#endif

View File

@ -1,73 +1,34 @@
#include "StdAfx.h" #include "StdAfx.h"
#include <fstream>
#include <io.h> #include <io.h>
#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) // StringPath std::string 버전
std::string CEterPackManager::ConvertFileName(std::string fileName)
{ {
std::string strFileName; std::string convertedFileName = fileName;
stl_lowers(convertedFileName);
if (0 == ConvertFileName(c_szPathName, strFileName)) for (DWORD i = 0; i < convertedFileName.length(); i++)
{ {
return &m_RootPack; if (convertedFileName[i] == '\\')
} convertedFileName[i] = '/';
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; return convertedFileName;
}
void CEterPackManager::SetCacheMode()
{
m_isCacheMode=true;
}
void CEterPackManager::SetRelativePathMode()
{
m_bTryRelativePath = true;
}
// StringPath std::string <20><><EFBFBD><EFBFBD>
int CEterPackManager::ConvertFileName(const char * c_szFileName, std::string & rstrFileName)
{
rstrFileName = c_szFileName;
stl_lowers(rstrFileName);
int iCount = 0;
for (DWORD i = 0; i < rstrFileName.length(); ++i)
{
if (rstrFileName[i] == '/')
++iCount;
else if (rstrFileName[i] == '\\')
{
rstrFileName[i] = '/';
++iCount;
}
}
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)
@ -87,54 +48,6 @@ bool CEterPackManager::CompareName(const char * c_szDirectoryName, DWORD /*dwLen
return true; return true;
} }
void CEterPackManager::LoadStaticCache(const char* c_szFileName)
{
if (!m_isCacheMode)
return;
std::string strFileName;
if (0 == ConvertFileName(c_szFileName, strFileName))
{
return;
}
DWORD dwFileNameHash = GetCRC32(strFileName.c_str(), strFileName.length());
std::unordered_map<DWORD, SCache>::iterator f = m_kMap_dwNameKey_kCache.find(dwFileNameHash);
if (m_kMap_dwNameKey_kCache.end() != f)
return;
CMappedFile kMapFile;
const void* c_pvData;
if (!Get(kMapFile, c_szFileName, &c_pvData))
return;
SCache kNewCache;
kNewCache.m_dwBufSize = kMapFile.Size();
kNewCache.m_abBufData = new BYTE[kNewCache.m_dwBufSize];
memcpy(kNewCache.m_abBufData, c_pvData, kNewCache.m_dwBufSize);
m_kMap_dwNameKey_kCache.insert(std::unordered_map<DWORD, SCache>::value_type(dwFileNameHash, kNewCache));
}
CEterPackManager::SCache* CEterPackManager::__FindCache(DWORD dwFileNameHash)
{
std::unordered_map<DWORD, SCache>::iterator f=m_kMap_dwNameKey_kCache.find(dwFileNameHash);
if (m_kMap_dwNameKey_kCache.end()==f)
return NULL;
return &f->second;
}
void CEterPackManager::__ClearCacheMap()
{
std::unordered_map<DWORD, SCache>::iterator i;
for (i = m_kMap_dwNameKey_kCache.begin(); i != m_kMap_dwNameKey_kCache.end(); ++i)
delete [] i->second.m_abBufData;
m_kMap_dwNameKey_kCache.clear();
}
struct TimeChecker struct TimeChecker
{ {
TimeChecker(const char* name) : name(name) TimeChecker(const char* name) : name(name)
@ -150,27 +63,37 @@ struct TimeChecker
DWORD baseTime; DWORD baseTime;
}; };
bool CEterPackManager::Get(CMappedFile & rMappedFile, const char * c_szFileName, LPCVOID * pData) bool CEterPackManager::Get(const std::string& fileName, TPackDataPtr& dataPtr)
{ {
//TimeChecker timeChecker(c_szFileName); //TimeChecker timeChecker(c_szFileName);
//Logf(1, "Load %s\n", c_szFileName); //Logf(1, "Load %s\n", c_szFileName);
if (m_iSearchMode == SEARCH_FILE_FIRST) if (m_iSearchMode == SEARCH_FILE_FIRST)
{ {
if (GetFromFile(rMappedFile, c_szFileName, pData)) if (GetFromFile(fileName, dataPtr))
{
return true; return true;
}
return GetFromPack(rMappedFile, c_szFileName, pData); return GetFromPack(fileName, dataPtr);
} }
if (GetFromPack(rMappedFile, c_szFileName, pData)) if (GetFromPack(fileName, dataPtr))
{
return true; return true;
}
return GetFromFile(rMappedFile, c_szFileName, pData); return GetFromFile(fileName, dataPtr);
}
bool CEterPackManager::Get(const std::string& fileName, std::stringstream& dataStream)
{
CEterPackManager::TPackDataPtr data;
if (!Get(fileName, data))
return false;
// Copy the data from the pack into the file sstream
dataStream.str("");
std::copy(data->begin(), data->end(), std::ostream_iterator<char>(dataStream));
return true;
} }
struct FinderLock struct FinderLock
@ -188,109 +111,60 @@ struct FinderLock
CRITICAL_SECTION* p_cs; CRITICAL_SECTION* p_cs;
}; };
bool CEterPackManager::GetFromPack(CMappedFile & rMappedFile, const char * c_szFileName, LPCVOID * pData) bool CEterPackManager::GetFromPack(const std::string& fileName, TPackDataPtr& dataPtr)
{ {
FinderLock lock(m_csFinder); FinderLock lock(m_csFinder);
static std::string strFileName; std::string strFileName = ConvertFileName(fileName);
if (0 == ConvertFileName(c_szFileName, strFileName))
{
return m_RootPack.Get(rMappedFile, strFileName.c_str(), pData);
}
else
{
DWORD dwFileNameHash = GetCRC32(strFileName.c_str(), strFileName.length());
SCache* pkCache = __FindCache(dwFileNameHash);
if (pkCache) auto pkFileItem = m_FileMap.find(strFileName);
{
rMappedFile.Link(pkCache->m_dwBufSize, pkCache->m_abBufData);
return true;
}
CEterFileDict::Item* pkFileItem = m_FileDict.GetItem(dwFileNameHash, strFileName.c_str()); if (pkFileItem == m_FileMap.end()) {
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>>();
if (!pkFileItem->second->getFile(strFileName, data))
return false;
// Set dataPtr to the retreived data pointer
dataPtr = data;
return true;
} }
const time_t g_tCachingInterval = 10; // 10<31><30> bool CEterPackManager::GetFromFile(const std::string& fileName, TPackDataPtr& dataPtr)
void CEterPackManager::ArrangeMemoryMappedPack()
{ {
//time_t curTime = time(NULL); // Try to open the file
//CEterFileDict::TDict dict = m_FileDict.GetDict(); std::ifstream file(fileName, std::ios::binary);
//for (CEterFileDict::TDict::iterator it = dict.begin(); it != dict.end(); ++it) if (!file.is_open())
//{ return false;
// 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) // Read the file's contents
{ dataPtr = std::make_shared<std::vector<char>>(
#ifndef _DEBUG std::istreambuf_iterator<char>(file),
//const char *pcExt = strchr(c_szFileName, '.'); std::istreambuf_iterator<char>()
//if (pcExt && );
// _strnicmp(pcExt, ".py", 3) == 0 && // python <20><>ũ<EFBFBD><C5A9>Ʈ <20><> return true;
// stricmp(c_szFileName, "logininfo.py") != 0 && // <20>α<EFBFBD><CEB1><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ƴϰ<C6B4>
// strnicmp(c_szFileName, "locale", 6) != 0
// )
//{
// return false;
//}
#endif
//if(m_bTryRelativePath) {
// if (strnicmp(c_szFileName, PATH_ABSOLUTE_YMIRWORK1, strlen(PATH_ABSOLUTE_YMIRWORK1)) == 0 || strnicmp(c_szFileName, PATH_ABSOLUTE_YMIRWORK2, strlen(PATH_ABSOLUTE_YMIRWORK2)) == 0) {
// if(rMappedFile.Create(c_szFileName+strlen(PATH_ABSOLUTE_YMIRWORK1), pData, 0, 0))
// {
// return true;
// }
// }
//}
return rMappedFile.Create(c_szFileName, pData, 0, 0) ? true : false;
} }
bool CEterPackManager::isExistInPack(const char * c_szFileName) bool CEterPackManager::isExistInPack(const char * c_szFileName)
{ {
std::string strFileName; std::string strFileName = ConvertFileName(c_szFileName);
if (0 == ConvertFileName(c_szFileName, strFileName)) auto pkFileItem = m_FileMap.find(strFileName);
{
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) if (pkFileItem == m_FileMap.end())
if (pkFileItem->pkPack) return false;
return pkFileItem->pkPack->IsExist(strFileName.c_str());
}
// NOTE : <20><>ġ <20>Ǵ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ٸ<EFBFBD> false - [levites] if (!pkFileItem->second)
return false; return false;
return pkFileItem->second->fileExists(strFileName.c_str());
} }
bool CEterPackManager::isExist(const char * c_szFileName) bool CEterPackManager::isExist(const char * c_szFileName)
@ -300,99 +174,66 @@ bool CEterPackManager::isExist(const char * c_szFileName)
if (isExistInPack(c_szFileName)) if (isExistInPack(c_szFileName))
return true; return true;
return _access(c_szFileName, 0) == 0 ? true : false; return _access(c_szFileName, 0) == 0;
} }
//if(m_bTryRelativePath) {
// if (strnicmp(c_szFileName, PATH_ABSOLUTE_YMIRWORK1, strlen(PATH_ABSOLUTE_YMIRWORK1)) == 0 || strnicmp(c_szFileName, PATH_ABSOLUTE_YMIRWORK2, strlen(PATH_ABSOLUTE_YMIRWORK2)) == 0) {
// if(access(c_szFileName+strlen(PATH_ABSOLUTE_YMIRWORK1), 0) == 0)
// return true;
// }
//}
if (_access(c_szFileName, 0) == 0) if (_access(c_szFileName, 0) == 0)
return true; return true;
return isExistInPack(c_szFileName); return isExistInPack(c_szFileName);
} }
bool CEterPackManager::PackExists(const std::string& name, const std::string& container)
void CEterPackManager::RegisterRootPack(const char * c_szName)
{ {
if (!m_RootPack.Create(m_FileDict, c_szName, "")) if (container == "FOLDER") {
{ return _access(name.c_str(), 0) == 0;
TraceError("%s: Pack file does not exist", c_szName);
} }
} else if (container == "ZIP") {
std::string zipName = name + ".zip";
const char * CEterPackManager::GetRootPackFileName() return _access(zipName.c_str(), 0) == 0;
{
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;
throw std::runtime_error("Unexpected container type: " + container + "!");
} }
bool CEterPackManager::RegisterPackWhenPackMaking(const char * c_szName, const char * c_szDirectory, CEterPack* pPack) bool CEterPackManager::RegisterPack(const std::string& name, const std::string& container)
{ {
m_PackMap.insert(TEterPackMap::value_type(c_szName, pPack)); auto it = m_PackMap.find(name);
m_PackList.push_front(pPack);
m_DirPackMap.insert(TEterPackMap::value_type(c_szDirectory, pPack)); if (it != m_PackMap.end())
return true; return true;
}
try {
bool bReadOnly = true;
bool CEterPackManager::RegisterPack(const char * c_szName, const char * c_szDirectory, const BYTE* c_pbIV) std::shared_ptr<FileProvider> pack;
{
CEterPack * pEterPack = NULL;
{
TEterPackMap::iterator itor = m_PackMap.find(c_szName);
if (m_PackMap.end() == itor) // Determine requested container type
{ if (container == "FOLDER")
bool bReadOnly = true; pack = std::make_shared<Folder>(name);
else if (container == "ZIP")
pEterPack = new CEterPack; pack = std::make_shared<ZIP>(name + ".zip");
if (pEterPack->Create(m_FileDict, c_szName, c_szDirectory, bReadOnly, c_pbIV))
{
m_PackMap.insert(TEterPackMap::value_type(c_szName, pEterPack));
}
else
{
#ifdef _DEBUG
Tracef("The eterpack doesn't exist [%s]\n", c_szName);
#endif
delete pEterPack;
pEterPack = NULL;
return false;
}
}
else else
{ throw std::runtime_error("Unexpected container type: " + container + "!");
pEterPack = itor->second;
} // Load container data
auto packFiles = pack->listFiles();
for (auto const& fileName : packFiles)
m_FileMap.insert({ fileName, pack });
m_PackMap.insert({ name, pack });
return true;
} }
catch (std::exception& e)
if (c_szDirectory && c_szDirectory[0] != '*')
{ {
TEterPackMap::iterator itor = m_DirPackMap.find(c_szDirectory); #ifdef _DEBUG
if (m_DirPackMap.end() == itor) Tracef("Unable to load file provider '%s': %s\n", name.c_str(), e.what());
{ #endif
m_PackList.push_front(pEterPack);
m_DirPackMap.insert(TEterPackMap::value_type(c_szDirectory, pEterPack));
}
}
return true; return false;
}
} }
void CEterPackManager::SetSearchMode(bool bPackFirst) void CEterPackManager::SetSearchMode(bool bPackFirst)
@ -405,209 +246,16 @@ int CEterPackManager::GetSearchMode()
return m_iSearchMode; return m_iSearchMode;
} }
CEterPackManager::CEterPackManager() : m_bTryRelativePath(false), m_iSearchMode(SEARCH_FILE_FIRST), m_isCacheMode(false) CEterPackManager::CEterPackManager() : m_iSearchMode(SEARCH_FILE_FIRST)
{ {
InitializeCriticalSection(&m_csFinder); InitializeCriticalSection(&m_csFinder);
} }
CEterPackManager::~CEterPackManager() CEterPackManager::~CEterPackManager()
{ {
__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) const CEterPackManager::TFileMap& CEterPackManager::GetFileMap() {
{ return this->m_FileMap;
////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); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> key stream<61><6D><EFBFBD><EFBFBD> filename hash<73><68> <20><><EFBFBD>ԵǾ<D4B5> <20><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD>, hash <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ŭ <20><><EFBFBD><EFBFBD>.
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();
} }

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