Compare commits

..

No commits in common. "master" and "experimental-archives" have entirely different histories.

273 changed files with 6494 additions and 2412 deletions

2
bin/.gitignore vendored
View File

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

View File

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

View File

@ -1,102 +0,0 @@
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

14
bin/pack/pack.bat Normal file
View File

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

View File

@ -85,6 +85,7 @@ class MainStream(object):
net.SetHandler(self) net.SetHandler(self)
net.SetTCPRecvBufferSize(128*1024) net.SetTCPRecvBufferSize(128*1024)
net.SetTCPSendBufferSize(4096) net.SetTCPSendBufferSize(4096)
net.SetUDPRecvBufferSize(4096)
self.id="" self.id=""
self.pwd="" self.pwd=""
@ -260,6 +261,8 @@ class MainStream(object):
else: else:
net.ConnectTCP(self.addr, self.port) net.ConnectTCP(self.addr, self.port)
#net.ConnectUDP(IP, Port)
def SetConnectInfo(self, addr, port, account_addr=0, account_port=0): def SetConnectInfo(self, addr, port, account_addr=0, account_port=0):
self.addr = addr self.addr = addr
self.port = port self.port = port

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_7ZIP_PATH=C:\Program Files\7-Zip\7z.exe rem SET M2_PML_PATH=C:\Users\User\Path\To\PackMakerLite\PackMakerLite.exe
rem Check the environment variables rem Check the environment variables
VERIFY OTHER 2>nul VERIFY OTHER 2>nul
@ -16,21 +16,17 @@ 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_7ZIP_PATH ( IF NOT DEFINED M2_PML_PATH (
ECHO M2_7ZIP_PATH is NOT defined! Please define M2_7ZIP_PATH with the path of your local 7-Zip "7z.exe" executable. ECHO M2_PML_PATH is NOT defined! Please define M2_PML_PATH with the path of your local PackMakerLite 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
@ -52,11 +48,12 @@ 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\*.zip" DEL /F /Q "bin\pack\*.eix"
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_7ZIP_PATH%" a "%%i.zip" ".\%%i\*" %M2_PML_PATH% --nolog --parallel -p "%%i"
if !errorlevel! neq 0 exit /b !errorlevel!
) )
MOVE /Y bin\pack\*.zip dist\pack\ MOVE /Y bin\pack\*.eix dist\pack\
MOVE /Y bin\pack\*.epk dist\pack\

View File

@ -0,0 +1,157 @@
#if defined(__BORLANDC__)
/* These definitions provided by Dr. Todd Brennan, 04Oct2002 */
#define SECUREBEGIN _asm {db 0xEB; db 0x03; db 0xD6; db 0xD6; db 0x00;}
#define SECUREEND _asm {db 0xEB; db 0x03; db 0xD6; db 0xD6; db 0xFF;}
#define SECUREBEGIN_A _asm {db 0xEB; db 0x03; db 0xD6; db 0xD6; db 0x01;}
#define SECUREEND_A _asm {db 0xEB; db 0x03; db 0xD6; db 0xD6; db 0xFF;}
#define SECUREBEGIN_B _asm {db 0xEB; db 0x03; db 0xD6; db 0xD6; db 0x02;}
#define SECUREEND_B _asm {db 0xEB; db 0x03; db 0xD6; db 0xD6; db 0xFF;}
#define SECUREBEGIN_C _asm {db 0xEB; db 0x03; db 0xD6; db 0xD6; db 0x03;}
#define SECUREEND_C _asm {db 0xEB; db 0x03; db 0xD6; db 0xD6; db 0xFF;}
#define SECUREBEGIN_D _asm {db 0xEB; db 0x03; db 0xD6; db 0xD6; db 0x04;}
#define SECUREEND_D _asm {db 0xEB; db 0x03; db 0xD6; db 0xD6; db 0xFF;}
#define SECUREBEGIN_E _asm {db 0xEB; db 0x03; db 0xD6; db 0xD6; db 0x05;}
#define SECUREEND_E _asm {db 0xEB; db 0x03; db 0xD6; db 0xD6; db 0xFF;}
#define SECUREBEGIN_F _asm {db 0xEB; db 0x03; db 0xD6; db 0xD6; db 0x06;}
#define SECUREEND_F _asm {db 0xEB; db 0x03; db 0xD6; db 0xD6; db 0xFF;}
#define SECUREBEGIN_G _asm {db 0xEB; db 0x03; db 0xD6; db 0xD6; db 0x07;}
#define SECUREEND_G _asm {db 0xEB; db 0x03; db 0xD6; db 0xD6; db 0xFF;}
#define SECUREBEGIN_H _asm {db 0xEB; db 0x03; db 0xD6; db 0xD6; db 0x08;}
#define SECUREEND_H _asm {db 0xEB; db 0x03; db 0xD6; db 0xD6; db 0xFF;}
#define SECUREBEGIN_I _asm {db 0xEB; db 0x03; db 0xD6; db 0xD6; db 0x09;}
#define SECUREEND_I _asm {db 0xEB; db 0x03; db 0xD6; db 0xD6; db 0xFF;}
#define SECUREBEGIN_J _asm {db 0xEB; db 0x03; db 0xD6; db 0xD6; db 0x0A;}
#define SECUREEND_J _asm {db 0xEB; db 0x03; db 0xD6; db 0xD6; db 0xFF;}
#define SECUREBEGIN_K _asm {db 0xEB; db 0x03; db 0xD6; db 0xD6; db 0x0B;}
#define SECUREEND_K _asm {db 0xEB; db 0x03; db 0xD6; db 0xD6; db 0xFF;}
#define NANOBEGIN _asm {db 0xEB; db 0x03; db 0xD6; db 0xD7; db 0x01;}
#define NANOEND _asm {db 0xEB; db 0x03; db 0xD6; db 0xD7; db 0x00;}
/* The former definitions for Borland C++ Builder, if anyone needs them. */
/*
#define SECUREBEGIN __emit__ (0xEB,0x03,0xD6,0xD6,0x00);
#define SECUREEND __emit__ (0xEB,0x03,0xD6,0xD6,0xFF);
#define SECUREBEGIN_A __emit__ (0xEB,0x03,0xD6,0xD6,0x01);
#define SECUREEND_A __emit__ (0xEB,0x03,0xD6,0xD6,0xFF);
#define SECUREBEGIN_B __emit__ (0xEB,0x03,0xD6,0xD6,0x02);
#define SECUREEND_B __emit__ (0xEB,0x03,0xD6,0xD6,0xFF);
#define SECUREBEGIN_C __emit__ (0xEB,0x03,0xD6,0xD6,0x03);
#define SECUREEND_C __emit__ (0xEB,0x03,0xD6,0xD6,0xFF);
#define NANOBEGIN __emit__ (0xEB,0x03,0xD6,0xD7,0x01);
#define NANOEND __emit__ (0xEB,0x03,0xD6,0xD7,0x00);
*/
#elif defined(__LCC__)
/* Provided by Rubem Pechansky, 26Feb2003 */
#define SECUREBEGIN _asm(".byte 0xEB,0x03,0xD6,0xD6,0x00");
#define SECUREEND _asm(".byte 0xEB,0x03,0xD6,0xD6,0xFF");
#define SECUREBEGIN_A _asm(".byte 0xEB,0x03,0xD6,0xD6,0x01");
#define SECUREEND_A _asm(".byte 0xEB,0x03,0xD6,0xD6,0xFF");
#define SECUREBEGIN_B _asm(".byte 0xEB,0x03,0xD6,0xD6,0x02");
#define SECUREEND_B _asm(".byte 0xEB,0x03,0xD6,0xD6,0xFF");
#define SECUREBEGIN_C _asm(".byte 0xEB,0x03,0xD6,0xD6,0x03");
#define SECUREEND_C _asm(".byte 0xEB,0x03,0xD6,0xD6,0xFF");
#define SECUREBEGIN_D _asm(".byte 0xEB,0x03,0xD6,0xD6,0x04");
#define SECUREEND_D _asm(".byte 0xEB,0x03,0xD6,0xD6,0xFF");
#define SECUREBEGIN_E _asm(".byte 0xEB,0x03,0xD6,0xD6,0x05");
#define SECUREEND_E _asm(".byte 0xEB,0x03,0xD6,0xD6,0xFF");
#define SECUREBEGIN_F _asm(".byte 0xEB,0x03,0xD6,0xD6,0x06");
#define SECUREEND_F _asm(".byte 0xEB,0x03,0xD6,0xD6,0xFF");
#define SECUREBEGIN_G _asm(".byte 0xEB,0x03,0xD6,0xD6,0x07");
#define SECUREEND_G _asm(".byte 0xEB,0x03,0xD6,0xD6,0xFF");
#define SECUREBEGIN_H _asm(".byte 0xEB,0x03,0xD6,0xD6,0x08");
#define SECUREEND_H _asm(".byte 0xEB,0x03,0xD6,0xD6,0xFF");
#define SECUREBEGIN_I _asm(".byte 0xEB,0x03,0xD6,0xD6,0x09");
#define SECUREEND_I _asm(".byte 0xEB,0x03,0xD6,0xD6,0xFF");
#define SECUREBEGIN_J _asm(".byte 0xEB,0x03,0xD6,0xD6,0x0A");
#define SECUREEND_J _asm(".byte 0xEB,0x03,0xD6,0xD6,0xFF");
#define SECUREBEGIN_K _asm(".byte 0xEB,0x03,0xD6,0xD6,0x0B");
#define SECUREEND_K _asm(".byte 0xEB,0x03,0xD6,0xD6,0xFF");
#define NANOBEGIN _asm(".byte 0xEB,0x03,0xD6,0xD7,0x01");
#define NANOEND _asm(".byte 0xEB,0x03,0xD6,0xD7,0x00");
#endif
#ifdef _WIN64
#define ARMACCESS_API __declspec(dllimport) __stdcall
extern "C" void ARMACCESS_API SECUREBEGIN(void);
extern "C" void ARMACCESS_API SECUREBEGIN_A(void);
extern "C" void ARMACCESS_API SECUREBEGIN_B(void);
extern "C" void ARMACCESS_API SECUREBEGIN_C(void);
extern "C" void ARMACCESS_API SECUREBEGIN_D(void);
extern "C" void ARMACCESS_API SECUREBEGIN_E(void);
extern "C" void ARMACCESS_API SECUREBEGIN_F(void);
extern "C" void ARMACCESS_API SECUREBEGIN_G(void);
extern "C" void ARMACCESS_API SECUREBEGIN_H(void);
extern "C" void ARMACCESS_API SECUREBEGIN_I(void);
extern "C" void ARMACCESS_API SECUREBEGIN_J(void);
extern "C" void ARMACCESS_API SECUREBEGIN_K(void);
extern "C" void ARMACCESS_API SECUREEND(void);
extern "C" void ARMACCESS_API SECUREEND_A(void);
extern "C" void ARMACCESS_API SECUREEND_B(void);
extern "C" void ARMACCESS_API SECUREEND_C(void);
extern "C" void ARMACCESS_API SECUREEND_D(void);
extern "C" void ARMACCESS_API SECUREEND_E(void);
extern "C" void ARMACCESS_API SECUREEND_F(void);
extern "C" void ARMACCESS_API SECUREEND_G(void);
extern "C" void ARMACCESS_API SECUREEND_H(void);
extern "C" void ARMACCESS_API SECUREEND_I(void);
extern "C" void ARMACCESS_API SECUREEND_J(void);
extern "C" void ARMACCESS_API SECUREEND_K(void);
extern "C" void ARMACCESS_API NANOBEGIN(void);
extern "C" void ARMACCESS_API NANOEND(void);
#define SECUREBEGIN SECUREBEGIN()
#define SECUREEND SECUREEND()
#define SECUREBEGIN_A SECUREBEGIN_A()
#define SECUREEND_A SECUREEND_A()
#define SECUREBEGIN_B SECUREBEGIN_B()
#define SECUREEND_B SECUREEND_B()
#define SECUREBEGIN_C SECUREBEGIN_C()
#define SECUREEND_C SECUREEND_C()
#define SECUREBEGIN_D SECUREBEGIN_D()
#define SECUREEND_D SECUREEND_D()
#define SECUREBEGIN_E SECUREBEGIN_E()
#define SECUREEND_E SECUREEND_E()
#define SECUREBEGIN_F SECUREBEGIN_F()
#define SECUREEND_F SECUREEND_F()
#define SECUREBEGIN_G SECUREBEGIN_G()
#define SECUREEND_G SECUREEND_G()
#define SECUREBEGIN_H SECUREBEGIN_H()
#define SECUREEND_H SECUREEND_H()
#define SECUREBEGIN_I SECUREBEGIN_I()
#define SECUREEND_I SECUREEND_I()
#define SECUREBEGIN_J SECUREBEGIN_J()
#define SECUREEND_J SECUREEND_J()
#define SECUREBEGIN_K SECUREBEGIN_K()
#define SECUREEND_K SECUREEND_K()
#define NANOBEGIN NANOBEGIN()
#define NANOEND NANOEND()
#else
#define SECUREBEGIN __asm _emit 0xEB __asm _emit 0x03 __asm _emit 0xD6 __asm _emit 0xD6 __asm _emit 0x00
#define SECUREEND __asm _emit 0xEB __asm _emit 0x03 __asm _emit 0xD6 __asm _emit 0xD6 __asm _emit 0xFF
#define SECUREBEGIN_A __asm _emit 0xEB __asm _emit 0x03 __asm _emit 0xD6 __asm _emit 0xD6 __asm _emit 0x01
#define SECUREEND_A __asm _emit 0xEB __asm _emit 0x03 __asm _emit 0xD6 __asm _emit 0xD6 __asm _emit 0xFF
#define SECUREBEGIN_B __asm _emit 0xEB __asm _emit 0x03 __asm _emit 0xD6 __asm _emit 0xD6 __asm _emit 0x02
#define SECUREEND_B __asm _emit 0xEB __asm _emit 0x03 __asm _emit 0xD6 __asm _emit 0xD6 __asm _emit 0xFF
#define SECUREBEGIN_C __asm _emit 0xEB __asm _emit 0x03 __asm _emit 0xD6 __asm _emit 0xD6 __asm _emit 0x03
#define SECUREEND_C __asm _emit 0xEB __asm _emit 0x03 __asm _emit 0xD6 __asm _emit 0xD6 __asm _emit 0xFF
#define SECUREBEGIN_D __asm _emit 0xEB __asm _emit 0x03 __asm _emit 0xD6 __asm _emit 0xD6 __asm _emit 0x04
#define SECUREEND_D __asm _emit 0xEB __asm _emit 0x03 __asm _emit 0xD6 __asm _emit 0xD6 __asm _emit 0xFF
#define SECUREBEGIN_E __asm _emit 0xEB __asm _emit 0x03 __asm _emit 0xD6 __asm _emit 0xD6 __asm _emit 0x05
#define SECUREEND_E __asm _emit 0xEB __asm _emit 0x03 __asm _emit 0xD6 __asm _emit 0xD6 __asm _emit 0xFF
#define SECUREBEGIN_F __asm _emit 0xEB __asm _emit 0x03 __asm _emit 0xD6 __asm _emit 0xD6 __asm _emit 0x06
#define SECUREEND_F __asm _emit 0xEB __asm _emit 0x03 __asm _emit 0xD6 __asm _emit 0xD6 __asm _emit 0xFF
#define SECUREBEGIN_G __asm _emit 0xEB __asm _emit 0x03 __asm _emit 0xD6 __asm _emit 0xD6 __asm _emit 0x07
#define SECUREEND_G __asm _emit 0xEB __asm _emit 0x03 __asm _emit 0xD6 __asm _emit 0xD6 __asm _emit 0xFF
#define SECUREBEGIN_H __asm _emit 0xEB __asm _emit 0x03 __asm _emit 0xD6 __asm _emit 0xD6 __asm _emit 0x08
#define SECUREEND_H __asm _emit 0xEB __asm _emit 0x03 __asm _emit 0xD6 __asm _emit 0xD6 __asm _emit 0xFF
#define SECUREBEGIN_I __asm _emit 0xEB __asm _emit 0x03 __asm _emit 0xD6 __asm _emit 0xD6 __asm _emit 0x09
#define SECUREEND_I __asm _emit 0xEB __asm _emit 0x03 __asm _emit 0xD6 __asm _emit 0xD6 __asm _emit 0xFF
#define SECUREBEGIN_J __asm _emit 0xEB __asm _emit 0x03 __asm _emit 0xD6 __asm _emit 0xD6 __asm _emit 0x0A
#define SECUREEND_J __asm _emit 0xEB __asm _emit 0x03 __asm _emit 0xD6 __asm _emit 0xD6 __asm _emit 0xFF
#define SECUREBEGIN_K __asm _emit 0xEB __asm _emit 0x03 __asm _emit 0xD6 __asm _emit 0xD6 __asm _emit 0x0B
#define SECUREEND_K __asm _emit 0xEB __asm _emit 0x03 __asm _emit 0xD6 __asm _emit 0xD6 __asm _emit 0xFF
#define NANOBEGIN __asm _emit 0xEB __asm _emit 0x03 __asm _emit 0xD6 __asm _emit 0xD7 __asm _emit 0x01
#define NANOEND __asm _emit 0xEB __asm _emit 0x03 __asm _emit 0xD6 __asm _emit 0xD7 __asm _emit 0x00
#endif

View File

@ -15,8 +15,8 @@
#endif #endif
VS_VERSION_INFO VERSIONINFO VS_VERSION_INFO VERSIONINFO
FILEVERSION 0,4,1,0 FILEVERSION 0, 3, 1, 0
PRODUCTVERSION 0,4,1,0 PRODUCTVERSION 0, 3, 1, 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.4.1.0" VALUE "FileVersion", "0.3.1.0"
VALUE "InternalName", METIN2_COMPONENT_INTERNALNAME VALUE "InternalName", METIN2_COMPONENT_INTERNALNAME
VALUE "LegalCopyright", "Copyright (C) 2022-2025" VALUE "LegalCopyright", "Copyright (C) 2024"
VALUE "OriginalFilename", METIN2_COMPONENT_FILENAME VALUE "OriginalFilename", METIN2_COMPONENT_FILENAME
VALUE "ProductName", "Metin2Config" VALUE "ProductName", "Metin2Config"
VALUE "ProductVersion", "0.4.1.0" VALUE "ProductVersion", "0.3.1.0"
END END
END END

View File

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

View File

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

View File

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

View File

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

View File

@ -192,14 +192,15 @@ BOOL CEffectMesh::__LoadData_Ver002(int iSize, const BYTE * c_pbBuf)
if (0 == strExtension.compare("ifl")) if (0 == strExtension.compare("ifl"))
{ {
CEterPackManager::TPackDataPtr motionData; LPCVOID pMotionData;
CMemoryTextFileLoader textFileLoader; CMappedFile File;
if (CEterPackManager::Instance().Get(pMeshData->szDiffuseMapFileName, motionData)) if (CEterPackManager::Instance().Get(File, pMeshData->szDiffuseMapFileName, &pMotionData))
{ {
CMemoryTextFileLoader textFileLoader;
std::vector<std::string> stTokenVector; std::vector<std::string> stTokenVector;
textFileLoader.Bind(motionData->size(), motionData->data()); textFileLoader.Bind(File.Size(), pMotionData);
std::string strPathName; std::string strPathName;
GetOnlyPathName(pMeshData->szDiffuseMapFileName, strPathName); GetOnlyPathName(pMeshData->szDiffuseMapFileName, strPathName);
@ -336,14 +337,15 @@ BOOL CEffectMesh::__LoadData_Ver001(int iSize, const BYTE * c_pbBuf)
if (0 == strExtension.compare("ifl")) if (0 == strExtension.compare("ifl"))
{ {
CEterPackManager::TPackDataPtr motionData; LPCVOID pMotionData;
CMemoryTextFileLoader textFileLoader; CMappedFile File;
if (CEterPackManager::Instance().Get(pMeshData->szDiffuseMapFileName, motionData)) if (CEterPackManager::Instance().Get(File, pMeshData->szDiffuseMapFileName, &pMotionData))
{ {
CMemoryTextFileLoader textFileLoader;
std::vector<std::string> stTokenVector; std::vector<std::string> stTokenVector;
textFileLoader.Bind(motionData->size(), motionData->data()); textFileLoader.Bind(File.Size(), pMotionData);
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 단위 텍스춰 데이타의 인스턴스이다. // NOTE : Mesh 단위 텍스춰 데이타의 인스턴스이다.
typedef struct STextureInstance typedef struct STextureInstance
{ {
CFrameController TextureFrameController; CFrameController TextureFrameController;

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -6,7 +6,7 @@
#endif #endif
#pragma warning(disable:4710) // not inlined #pragma warning(disable:4710) // not inlined
#pragma warning(disable:4786) // character 255 넘어가는거 끄기 #pragma warning(disable:4786) // character 255 넘어가는거 끄기
#pragma warning(disable:4244) // type conversion possible lose of data #pragma warning(disable:4244) // type conversion possible lose of data
#include <windows.h> #include <windows.h>
@ -40,6 +40,16 @@
#define atoi _atoi64 #define atoi _atoi64
#endif #endif
// Armadillo nanomite protection
#if !defined(NANOBEGIN) && !defined(NANOEND)
#ifdef _DEBUG
#define NANOBEGIN
#define NANOEND
#else
#include <armadillo/SecuredSections.h>
#endif
#endif
#include "vk.h" #include "vk.h"
#include "filename.h" #include "filename.h"
#include "ServiceDefs.h" #include "ServiceDefs.h"

View File

@ -27,7 +27,7 @@ BOOL ELTimer_Init()
DWORD ELTimer_GetMSec() DWORD ELTimer_GetMSec()
{ {
//assert(gs_dwBaseTime!=0 && "ELTimer_Init 를 먼저 실행하세요"); //assert(gs_dwBaseTime!=0 && "ELTimer_Init 를 먼저 실행하세요");
//LARGE_INTEGER liTickCount; //LARGE_INTEGER liTickCount;
//QueryPerformanceCounter(&liTickCount); //QueryPerformanceCounter(&liTickCount);
return timeGetTime() - gs_dwBaseTime; //(liTickCount.QuadPart*1000 / gs_liTickCountPerSec.QuadPart)-gs_dwBaseTime; return timeGetTime() - gs_dwBaseTime; //(liTickCount.QuadPart*1000 / gs_liTickCountPerSec.QuadPart)-gs_dwBaseTime;
@ -35,8 +35,13 @@ DWORD ELTimer_GetMSec()
VOID ELTimer_SetServerMSec(DWORD dwServerTime) VOID ELTimer_SetServerMSec(DWORD dwServerTime)
{ {
gs_dwServerTime = dwServerTime; NANOBEGIN
gs_dwClientTime = CTimer::instance().GetCurrentMillisecond(); if (0 != dwServerTime) // nanomite를 위한 더미 if
{
gs_dwServerTime = dwServerTime;
gs_dwClientTime = CTimer::instance().GetCurrentMillisecond();
}
NANOEND
} }
DWORD ELTimer_GetServerMSec() DWORD ELTimer_GetServerMSec()
@ -64,13 +69,18 @@ CTimer::CTimer()
{ {
ELTimer_Init(); ELTimer_Init();
m_dwCurrentTime = 0; NANOBEGIN
m_bUseRealTime = true; if (this) // nanomite를 위한 더미 if
m_index = 0; {
m_dwCurrentTime = 0;
m_bUseRealTime = true;
m_index = 0;
m_dwElapsedTime = 0; m_dwElapsedTime = 0;
m_fCurrentTime = 0.0f; m_fCurrentTime = 0.0f;
}
NANOEND
} }
CTimer::~CTimer() CTimer::~CTimer()

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -1,6 +1,6 @@
#pragma once #pragma once
#pragma warning(disable:4786) // character 255 넘어가는거 끄기 #pragma warning(disable:4786) // character 255 넘어가는거 끄기
//#include <crtdbg.h> //#include <crtdbg.h>
#include <granny/granny.h> #include <granny/granny.h>
@ -10,3 +10,13 @@
#include "../eterBase/Stl.h" #include "../eterBase/Stl.h"
#include "Util.h" #include "Util.h"
// Armadillo nanomite protection
#if !defined(NANOBEGIN) && !defined(NANOEND)
#ifdef _DEBUG
#define NANOBEGIN
#define NANOEND
#else
#include <armadillo/SecuredSections.h>
#endif
#endif

View File

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

View File

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

View File

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

View File

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

View File

@ -17,6 +17,7 @@ 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: 파일이 존재하지 않으면 다른곳에서 그래픽 모델을 기반으로 충돌 데이터를 생성하니 리소스를 파괴하지 않고 유지시킴. // NOTE: 파일이 존재하지 않으면 다른곳에서 그래픽 모델을 기반으로 충돌 데이터를 생성하니 리소스를 파괴하지 않고 유지시킴.
return true; return true;
} }

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -2,18 +2,20 @@
#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 fileName; std::string stFileName;
std::shared_ptr<std::vector<char>> data;
CMappedFile File;
LPVOID pvBuf;
DWORD dwSize;
} TData; } TData;
public: public:
@ -23,8 +25,8 @@ class CFileLoaderThread
int Create(void * arg); int Create(void * arg);
public: public:
void Request(const std::string& c_rstFileName); void Request(std::string & c_rstFileName);
bool Fetch(TData& data); bool Fetch(TData ** ppData);
void Shutdown(); void Shutdown();
protected: protected:
@ -47,10 +49,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용 Ray... CCamera 이용하는 버전.. 기존의 Ray와 통합 필요... // Terrain picking용 Ray... CCamera 이용하는 버전.. 기존의 Ray와 통합 필요...
CRay CGraphicBase::ms_Ray; CRay CGraphicBase::ms_Ray;
bool CGraphicBase::ms_bSupportDXT = true; bool CGraphicBase::ms_bSupportDXT = true;
bool CGraphicBase::ms_isLowTextureMemory = false; bool CGraphicBase::ms_isLowTextureMemory = false;
bool CGraphicBase::ms_isHighTextureMemory = false; bool CGraphicBase::ms_isHighTextureMemory = false;
// 2004.11.18.myevan.DynamicVertexBuffer로 교체 // 2004.11.18.myevan.DynamicVertexBuffer로 교체
/* /*
std::vector<TIndex> CGraphicBase::ms_lineIdxVector; std::vector<TIndex> CGraphicBase::ms_lineIdxVector;
std::vector<TIndex> CGraphicBase::ms_lineTriIdxVector; std::vector<TIndex> CGraphicBase::ms_lineTriIdxVector;

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -44,17 +44,19 @@ bool CGraphicImageTexture::CreateDeviceObjects()
if (m_stFileName.empty()) if (m_stFileName.empty())
{ {
// 폰트 텍스쳐 // 폰트 텍스쳐
if (FAILED(ms_lpd3dDevice->CreateTexture(m_width, m_height, 1, 0, m_d3dFmt, D3DPOOL_MANAGED, &m_lpd3dTexture, NULL))) if (FAILED(ms_lpd3dDevice->CreateTexture(m_width, m_height, 1, 0, m_d3dFmt, D3DPOOL_MANAGED, &m_lpd3dTexture, NULL)))
return false; return false;
} }
else else
{ {
CEterPackManager::TPackDataPtr data; CMappedFile mappedFile;
if (!CEterPackManager::Instance().Get(m_stFileName, data)) LPCVOID c_pvMap;
if (!CEterPackManager::Instance().Get(mappedFile, m_stFileName.c_str(), &c_pvMap))
return false; return false;
return CreateFromMemoryFile(data->size(), data->data(), m_d3dFmt, m_dwFilter); return CreateFromMemoryFile(mappedFile.Size(), c_pvMap, m_d3dFmt, m_dwFilter);
} }
m_bEmpty = false; m_bEmpty = false;

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -524,6 +524,7 @@ const char * GetRecvHeaderName(BYTE header)
stringList[154] = "HEADER_GC_AUTH_SUCCESS_OPENID"; stringList[154] = "HEADER_GC_AUTH_SUCCESS_OPENID";
stringList[0xfc] = "HEADER_GC_HANDSHAKE_OK"; stringList[0xfc] = "HEADER_GC_HANDSHAKE_OK";
stringList[0xfd] = "HEADER_GC_PHASE"; stringList[0xfd] = "HEADER_GC_PHASE";
stringList[0xfe] = "HEADER_GC_BINDUDP";
stringList[0xff] = "HEADER_GC_HANDSHAKE"; stringList[0xff] = "HEADER_GC_HANDSHAKE";
} }
return stringList[header].c_str(); return stringList[header].c_str();

View File

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

View File

@ -42,17 +42,18 @@ void CResource::Load()
const char * c_szFileName = GetFileName(); const char * c_szFileName = GetFileName();
DWORD dwStart = ELTimer_GetMSec(); DWORD dwStart = ELTimer_GetMSec();
CEterPackManager::TPackDataPtr fileData; CMappedFile file;
LPCVOID fileData;
//Tracenf("Load %s", c_szFileName); //Tracenf("Load %s", c_szFileName);
if (CEterPackManager::Instance().Get(c_szFileName, fileData)) if (CEterPackManager::Instance().Get(file, 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(fileData->size(), fileData->data())) if (OnLoad(file.Size(), fileData))
{ {
me_state = STATE_EXIST; me_state = STATE_EXIST;
} }
@ -80,11 +81,12 @@ void CResource::Reload()
Clear(); Clear();
Tracef("CResource::Reload %s\n", GetFileName()); Tracef("CResource::Reload %s\n", GetFileName());
CEterPackManager::TPackDataPtr fileData; CMappedFile file;
LPCVOID fileData;
if (CEterPackManager::Instance().Get(GetFileName(), fileData)) if (CEterPackManager::Instance().Get(file, GetFileName(), &fileData))
{ {
if (OnLoad(fileData->size(), fileData->data())) if (OnLoad(file.Size(), fileData))
{ {
me_state = STATE_EXIST; me_state = STATE_EXIST;
} }
@ -129,8 +131,8 @@ int CResource::ConvertPathName(const char * c_szPathName, char * pszRetPathName,
void CResource::SetFileName(const char* c_szFileName) void CResource::SetFileName(const char* c_szFileName)
{ {
// 2004. 2. 1. myevan. 쓰레드가 사용되는 상황에서 static 변수는 사용하지 않는것이 좋다. // 2004. 2. 1. myevan. 쓰레드가 사용되는 상황에서 static 변수는 사용하지 않는것이 좋다.
// 2004. 2. 1. myevan. 파일 이름 처리를 std::string 사용 // 2004. 2. 1. myevan. 파일 이름 처리를 std::string 사용
m_stFileName=c_szFileName; m_stFileName=c_szFileName;
} }

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -179,13 +179,14 @@ bool CTextFileLoader::Load(const char * c_szFileName)
{ {
m_strFileName = ""; m_strFileName = "";
CEterPackManager::TPackDataPtr data; const VOID* pvData;
if (!CEterPackManager::Instance().Get(c_szFileName, data)) CMappedFile kFile;
if (!CEterPackManager::Instance().Get(kFile, c_szFileName, &pvData))
return false; return false;
if (m_dwBufCapacity < data->size()) if (m_dwBufCapacity<kFile.Size())
{ {
m_dwBufCapacity = data->size(); m_dwBufCapacity=kFile.Size();
if (m_acBufData) if (m_acBufData)
delete [] m_acBufData; delete [] m_acBufData;
@ -193,8 +194,8 @@ bool CTextFileLoader::Load(const char * c_szFileName)
m_acBufData=new char[m_dwBufCapacity]; m_acBufData=new char[m_dwBufCapacity];
} }
m_dwBufSize = data->size(); m_dwBufSize=kFile.Size();
memcpy_s(m_acBufData, m_dwBufCapacity, data->data(), data->size()); memcpy(m_acBufData, pvData, m_dwBufSize);
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'|') // ||는 |로 표시한다. else if (*cur == L'|') // ||는 |로 표시한다.
{ {
tagLen = 2; tagLen = 2;
return TEXT_TAG_TAG; return TEXT_TAG_TAG;
@ -29,7 +29,7 @@ int GetTextTag(const wchar_t * src, int maxLen, int & tagLen, std::wstring & ext
tagLen = 2; tagLen = 2;
return TEXT_TAG_RESTORE_COLOR; return TEXT_TAG_RESTORE_COLOR;
} }
else if (*cur == L'H') // hyperlink |Hitem:10000:0:0:0:0|h[이름]|h else if (*cur == L'H') // hyperlink |Hitem:10000:0:0:0:0|h[이름]|h
{ {
tagLen = 2; tagLen = 2;
return TEXT_TAG_HYPERLINK_START; return TEXT_TAG_HYPERLINK_START;
@ -154,20 +154,20 @@ int FindColorTagStartPosition(const wchar_t * src, int src_len)
const wchar_t * cur = src; const wchar_t * cur = src;
// |r의 경우 // |r의 경우
if (*cur == L'r' && *(cur - 1) == L'|') if (*cur == L'r' && *(cur - 1) == L'|')
{ {
int len = src_len; int len = src_len;
// ||r은 무시 // ||r은 무시
if (len >= 2 && *(cur - 2) == L'|') if (len >= 2 && *(cur - 2) == L'|')
return 1; return 1;
cur -= 2; cur -= 2;
len -= 2; len -= 2;
// |c까지 찾아서 |위치까지 리턴한다. // |c까지 찾아서 |위치까지 리턴한다.
while (len > 1) // 최소 2자를 검사해야 된다. while (len > 1) // 최소 2자를 검사해야 된다.
{ {
if (*cur == L'c' && *(cur - 1) == L'|') if (*cur == L'c' && *(cur - 1) == L'|')
return (src - cur) + 1; return (src - cur) + 1;
@ -175,9 +175,9 @@ int FindColorTagStartPosition(const wchar_t * src, int src_len)
--cur; --cur;
--len; --len;
} }
return (src_len); // 못찾으면 전부;; return (src_len); // 못찾으면 전부;;
} }
// ||의 경우 // ||의 경우
else if (*cur == L'|' && *(cur - 1) == L'|') else if (*cur == L'|' && *(cur - 1) == L'|')
return 1; return 1;

View File

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

View File

@ -20,14 +20,16 @@ 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)
{ {
CEterPackManager::TPackDataPtr motionData; LPCVOID pMotionData;
CMemoryTextFileLoader textFileLoader; CMappedFile File;
if (!CEterPackManager::Instance().Get(c_szFileName, motionData)) if (!CEterPackManager::Instance().Get(File, c_szFileName, &pMotionData))
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)
{ {
@ -48,16 +50,18 @@ bool LoadTextData(const char * c_szFileName, CTokenMap & rstTokenMap)
bool LoadMultipleTextData(const char * c_szFileName, CTokenVectorMap & rstTokenVectorMap) bool LoadMultipleTextData(const char * c_szFileName, CTokenVectorMap & rstTokenVectorMap)
{ {
CEterPackManager::TPackDataPtr modelData; LPCVOID pModelData;
CMemoryTextFileLoader textFileLoader; CMappedFile File;
if (!CEterPackManager::Instance().Get(c_szFileName, modelData)) if (!CEterPackManager::Instance().Get(File, c_szFileName, &pModelData))
return false; return false;
DWORD i; DWORD i;
CMemoryTextFileLoader textFileLoader;
CTokenVector stTokenVector; CTokenVector stTokenVector;
textFileLoader.Bind(modelData->size(), modelData->data()); textFileLoader.Bind(File.Size(), pModelData);
for (i = 0; i < textFileLoader.GetLineCount(); ++i) for (i = 0; i < textFileLoader.GetLineCount(); ++i)
{ {
@ -210,13 +214,13 @@ const char* GetFontFaceFromCodePage9x(WORD codePage)
switch( codePage ) switch( codePage )
{ {
case CP_932: case CP_932:
return "MS PGothic"; return "굃굍 굊긕긘긞긏";
case CP_949: case CP_949:
return "GulimChe"; return "굴림체";
case CP_936: case CP_936:
return "SimSun"; return "芥竟";
case CP_950: case CP_950:
return "MingLiU"; return "꾄ⁿ톱";
case CP_874: case CP_874:
return "Tahoma"; return "Tahoma";
case CP_1252: case CP_1252:
@ -328,7 +332,7 @@ void base64_decode(const char * str,char * resultStr)
{ {
i=0; i=0;
strcpy(szDest, ""); strcpy(szDest, "");
while(nCount<length && i<4) // 4개의 바이트를 얻는다. while(nCount<length && i<4) // 4개의 바이트를 얻는다.
{ {
r = str[nCount++]; r = str[nCount++];
result = __base64_get(r); result = __base64_get(r);
@ -336,13 +340,13 @@ void base64_decode(const char * str,char * resultStr)
{ {
if(result!=-1) if(result!=-1)
szDest[i++] = result; szDest[i++] = result;
else szDest[i++] = '@'; // It's end (64번은 디코딩시 사용되지 않기 때문) else szDest[i++] = '@'; // It's end (64번은 디코딩시 사용되지 않기 때문)
} }
} }
if(i==4) // 4개의 소스를 모두 얻어냈다. 디코드 시작 if(i==4) // 4개의 소스를 모두 얻어냈다. 디코드 시작
{ {
if( nCount+3 >= length ) // 데이터의 끝에 도달했다. if( nCount+3 >= length ) // 데이터의 끝에 도달했다.
{ {
if( szDest[1] == '@' ) if( szDest[1] == '@' )
{ {

View File

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

View File

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

View File

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

View File

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

1416
src/EterPack/EterPack.cpp Normal file

File diff suppressed because it is too large Load Diff

234
src/EterPack/EterPack.h Normal file
View File

@ -0,0 +1,234 @@
#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 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 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(); // 몇개가 삭제 되었는지 리턴 한다.
bool GetNames(std::vector<std::string>* retNames);
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 도 억세스 하므로 + 1 크기만큼 만든다.
std::string m_stDataFileName;
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;
// // 그냥 time_t를 쓰면, 32bit time_t를 사용하는 소스에서는,
// // CEterPack의 size를 실제 size - 4로 인식하기 때문에 문제가 발생할 수 있다.
// __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,6 +170,20 @@
</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>
@ -177,14 +191,27 @@
<Optimization Condition="'$(Configuration)|$(Platform)'=='Distribute|Win32'">MaxSpeed</Optimization> <Optimization Condition="'$(Configuration)|$(Platform)'=='Distribute|Win32'">MaxSpeed</Optimization>
<Optimization Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">MaxSpeed</Optimization> <Optimization Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">MaxSpeed</Optimization>
</ClCompile> </ClCompile>
<ClCompile Include="FileProvider.cpp" />
<ClCompile Include="Folder.cpp" /> <ClCompile Include="Folder.cpp" />
<ClCompile Include="md5.c" />
<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>
<ClCompile Include="ZIP.cpp" /> <ClCompile Include="ZIP.cpp" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClInclude Include="EterPack.h" />
<ClInclude Include="EterPackCursor.h" />
<ClInclude Include="EterPackManager.h" /> <ClInclude Include="EterPackManager.h" />
<ClInclude Include="FileProvider.h" /> <ClInclude Include="FileProvider.h" />
<ClInclude Include="Folder.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" /> <ClInclude Include="ZIP.h" />
</ItemGroup> </ItemGroup>

View File

@ -14,9 +14,24 @@
</Filter> </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="md5.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="StdAfx.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="FileProvider.cpp">
<Filter>File Providers</Filter>
</ClCompile>
<ClCompile Include="Folder.cpp"> <ClCompile Include="Folder.cpp">
<Filter>File Providers</Filter> <Filter>File Providers</Filter>
</ClCompile> </ClCompile>
@ -25,12 +40,21 @@
</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="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>

View File

@ -0,0 +1,59 @@
#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

@ -0,0 +1,25 @@
#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,7 +1,5 @@
#include "StdAfx.h" #include "StdAfx.h"
#include <fstream>
#include <io.h> #include <io.h>
#include <assert.h> #include <assert.h>
@ -16,7 +14,19 @@
#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\\"
// StringPath std::string 버전
void CEterPackManager::SetCacheMode()
{
m_isCacheMode=true;
}
void CEterPackManager::SetRelativePathMode()
{
m_bTryRelativePath = true;
}
// StringPath std::string 버전
std::string CEterPackManager::ConvertFileName(std::string fileName) std::string CEterPackManager::ConvertFileName(std::string fileName)
{ {
std::string convertedFileName = fileName; std::string convertedFileName = fileName;
@ -48,6 +58,50 @@ 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 = ConvertFileName(c_szFileName);
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)
@ -63,37 +117,27 @@ struct TimeChecker
DWORD baseTime; DWORD baseTime;
}; };
bool CEterPackManager::Get(const std::string& fileName, TPackDataPtr& dataPtr) bool CEterPackManager::Get(CMappedFile & rMappedFile, const char * c_szFileName, LPCVOID * pData)
{ {
//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(fileName, dataPtr)) if (GetFromFile(rMappedFile, c_szFileName, pData))
{
return true; return true;
}
return GetFromPack(fileName, dataPtr); return GetFromPack(rMappedFile, c_szFileName, pData);
} }
if (GetFromPack(fileName, dataPtr)) if (GetFromPack(rMappedFile, c_szFileName, pData))
{
return true; return true;
}
return GetFromFile(fileName, dataPtr); return GetFromFile(rMappedFile, c_szFileName, pData);
}
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
@ -111,15 +155,24 @@ struct FinderLock
CRITICAL_SECTION* p_cs; CRITICAL_SECTION* p_cs;
}; };
bool CEterPackManager::GetFromPack(const std::string& fileName, TPackDataPtr& dataPtr) bool CEterPackManager::GetFromPack(CMappedFile & rMappedFile, const char * c_szFileName, LPCVOID * pData)
{ {
FinderLock lock(m_csFinder); FinderLock lock(m_csFinder);
std::string strFileName = ConvertFileName(fileName); std::string strFileName = ConvertFileName(c_szFileName);
auto pkFileItem = m_FileMap.find(strFileName); DWORD dwFileNameHash = GetCRC32(strFileName.c_str(), strFileName.length());
SCache* pkCache = __FindCache(dwFileNameHash);
if (pkFileItem == m_FileMap.end()) { if (pkCache)
{
rMappedFile.Link(pkCache->m_dwBufSize, pkCache->m_abBufData);
return true;
}
auto pkFileItem = m_FileDict.find(dwFileNameHash);
if (pkFileItem == m_FileDict.end()) {
#ifdef _DEBUG #ifdef _DEBUG
TraceError("CANNOT_FIND_PACK_FILE [%s]", strFileName.c_str()); TraceError("CANNOT_FIND_PACK_FILE [%s]", strFileName.c_str());
#endif #endif
@ -128,43 +181,56 @@ bool CEterPackManager::GetFromPack(const std::string& fileName, TPackDataPtr& da
} }
auto data = std::make_shared<std::vector<char>>(); auto data = std::make_shared<std::vector<char>>();
if (!pkFileItem->second->getFile(strFileName, data)) bool r = pkFileItem->second->getFile(strFileName, data);
return false;
// Keep the file loaded by always forcing a reference in the smart pointer (temporary hack)
keepDataReferencedArray.push_back(data);
// Set dataPtr to the retreived data pointer rMappedFile.Link(data->size(), data->data());
dataPtr = data; *pData = (LPCVOID *) data->data();
return r;
return true;
} }
bool CEterPackManager::GetFromFile(const std::string& fileName, TPackDataPtr& dataPtr) const time_t g_tCachingInterval = 10; // 10초
{
// Try to open the file
std::ifstream file(fileName, std::ios::binary);
if (!file.is_open())
return false;
// Read the file's contents bool CEterPackManager::GetFromFile(CMappedFile & rMappedFile, const char * c_szFileName, LPCVOID * pData)
dataPtr = std::make_shared<std::vector<char>>( {
std::istreambuf_iterator<char>(file), #ifndef _DEBUG
std::istreambuf_iterator<char>() //const char *pcExt = strchr(c_szFileName, '.');
); //if (pcExt &&
return true; // _strnicmp(pcExt, ".py", 3) == 0 && // python 스크립트 중
// stricmp(c_szFileName, "logininfo.py") != 0 && // 로그인 정보 파일이 아니고
// 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 = ConvertFileName(c_szFileName); std::string strFileName = ConvertFileName(c_szFileName);
auto pkFileItem = m_FileMap.find(strFileName); DWORD dwFileNameHash = GetCRC32(strFileName.c_str(), strFileName.length());
auto pkFileItem = m_FileDict.find(dwFileNameHash);
if (pkFileItem == m_FileMap.end()) if (pkFileItem == m_FileDict.end())
return false; return false;
if (!pkFileItem->second) if (pkFileItem->second)
return false; return pkFileItem->second->fileExists(strFileName.c_str());
return pkFileItem->second->fileExists(strFileName.c_str());
} }
bool CEterPackManager::isExist(const char * c_szFileName) bool CEterPackManager::isExist(const char * c_szFileName)
@ -174,31 +240,26 @@ 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; return _access(c_szFileName, 0) == 0 ? true : false;
} }
//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)
{
if (container == "FOLDER") {
return _access(name.c_str(), 0) == 0;
}
else if (container == "ZIP") {
std::string zipName = name + ".zip";
return _access(zipName.c_str(), 0) == 0;
}
throw std::runtime_error("Unexpected container type: " + container + "!"); bool CEterPackManager::RegisterPack(const char * c_szName, const char * c_szDirectory, const BYTE* c_pbIV)
}
bool CEterPackManager::RegisterPack(const std::string& name, const std::string& container)
{ {
auto it = m_PackMap.find(name); auto it = m_PackMap.find(c_szName);
if (it != m_PackMap.end()) if (it != m_PackMap.end())
return true; return true;
@ -208,31 +269,25 @@ bool CEterPackManager::RegisterPack(const std::string& name, const std::string&
std::shared_ptr<FileProvider> pack; std::shared_ptr<FileProvider> pack;
// Determine requested container type // TODO: allow configurable containers
if (container == "FOLDER")
pack = std::make_shared<Folder>(name); //pack = std::make_shared<Folder>(c_szName);
else if (container == "ZIP") pack = std::make_shared<ZIP>(std::string(c_szName) + ".zip");
pack = std::make_shared<ZIP>(name + ".zip");
else
throw std::runtime_error("Unexpected container type: " + container + "!");
// Load container data
auto packFiles = pack->listFiles(); auto packFiles = pack->listFiles();
for (auto const& fileName : packFiles) for (auto const& fileName : packFiles) {
m_FileMap.insert({ fileName, pack }); DWORD dwFileNameHash = GetCRC32(fileName.c_str(), fileName.length());
m_FileDict.insert({ dwFileNameHash, pack });
}
m_PackMap.insert({ name, pack }); m_PackMap.insert(TEterPackMap::value_type(c_szName, pack));
return true;
} }
catch (std::exception& e) catch (...)
{ {
#ifdef _DEBUG #ifdef _DEBUG
Tracef("Unable to load file provider '%s': %s\n", name.c_str(), e.what()); Tracef("The eterpack doesn't exist [%s]\n", c_szName);
#endif #endif
return false;
} }
} }
@ -246,16 +301,14 @@ int CEterPackManager::GetSearchMode()
return m_iSearchMode; return m_iSearchMode;
} }
CEterPackManager::CEterPackManager() : m_iSearchMode(SEARCH_FILE_FIRST) CEterPackManager::CEterPackManager() : m_bTryRelativePath(false), m_iSearchMode(SEARCH_FILE_FIRST), m_isCacheMode(false)
{ {
InitializeCriticalSection(&m_csFinder); InitializeCriticalSection(&m_csFinder);
} }
CEterPackManager::~CEterPackManager() CEterPackManager::~CEterPackManager()
{ {
__ClearCacheMap();
DeleteCriticalSection(&m_csFinder); DeleteCriticalSection(&m_csFinder);
} }
const CEterPackManager::TFileMap& CEterPackManager::GetFileMap() {
return this->m_FileMap;
}

View File

@ -6,9 +6,16 @@
#include "../eterBase/Stl.h" #include "../eterBase/Stl.h"
#include "FileProvider.h" #include "FileProvider.h"
#include "EterPack.h"
class CEterPackManager : public CSingleton<CEterPackManager> class CEterPackManager : public CSingleton<CEterPackManager>
{ {
public:
struct SCache
{
BYTE* m_abBufData;
DWORD m_dwBufSize;
};
public: public:
enum ESearchModes enum ESearchModes
{ {
@ -17,39 +24,50 @@ class CEterPackManager : public CSingleton<CEterPackManager>
}; };
typedef std::list<std::shared_ptr<FileProvider>> TEterPackList; typedef std::list<std::shared_ptr<FileProvider>> TEterPackList;
typedef std::unordered_map<std::string, std::shared_ptr<FileProvider>> TEterPackMap; typedef std::unordered_map<std::string, std::shared_ptr<FileProvider>, stringhash> TEterPackMap;
typedef std::unordered_map<std::string, std::shared_ptr<FileProvider>> TFileMap;
typedef std::shared_ptr<std::vector<char>> TPackDataPtr;
public: public:
CEterPackManager(); CEterPackManager();
virtual ~CEterPackManager(); virtual ~CEterPackManager();
void SetCacheMode();
void SetRelativePathMode();
void LoadStaticCache(const char* c_szFileName);
void SetSearchMode(bool bPackFirst); void SetSearchMode(bool bPackFirst);
int GetSearchMode(); int GetSearchMode();
bool Get(const std::string& fileName, TPackDataPtr& dataPtr); bool Get(CMappedFile & rMappedFile, const char * c_szFileName, LPCVOID * pData);
bool Get(const std::string& fileName, std::stringstream& dataStream);
bool GetFromPack(CMappedFile & rMappedFile, const char * c_szFileName, LPCVOID * pData);
bool GetFromFile(CMappedFile & rMappedFile, const char * c_szFileName, LPCVOID * pData);
bool isExist(const char * c_szFileName); bool isExist(const char * c_szFileName);
bool isExistInPack(const char * c_szFileName); bool isExistInPack(const char * c_szFileName);
bool PackExists(const std::string& name, const std::string& container); bool RegisterPack(const char * c_szName, const char * c_szDirectory, const BYTE* c_pbIV = NULL);
bool RegisterPack(const std::string& name, const std::string& container);
std::string ConvertFileName(std::string fileName); std::string ConvertFileName(std::string fileName);
const TFileMap& GetFileMap();
protected: protected:
bool CompareName(const char * c_szDirectoryName, DWORD iLength, const char * c_szFileName); bool CompareName(const char * c_szDirectoryName, DWORD iLength, const char * c_szFileName);
bool GetFromPack(const std::string& fileName, TPackDataPtr& dataPtr);
bool GetFromFile(const std::string& fileName, TPackDataPtr& dataPtr); std::shared_ptr<FileProvider> FindPack(const char* c_szPathName);
SCache* __FindCache(DWORD dwFileNameHash);
void __ClearCacheMap();
protected: protected:
bool m_bTryRelativePath;
bool m_isCacheMode;
int m_iSearchMode; int m_iSearchMode;
TFileMap m_FileMap; std::unordered_map<DWORD, std::shared_ptr<FileProvider>> m_FileDict;
TEterPackMap m_PackMap; TEterPackMap m_PackMap;
std::unordered_map<DWORD, SCache> m_kMap_dwNameKey_kCache;
std::vector<std::shared_ptr<std::vector<char>>> keepDataReferencedArray;
CRITICAL_SECTION m_csFinder; CRITICAL_SECTION m_csFinder;
}; };

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