Compare commits
No commits in common. "master" and "experimental-archives" have entirely different histories.
master
...
experiment
2
bin/.gitignore
vendored
2
bin/.gitignore
vendored
@ -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
|
||||||
|
351
bin/pack/Index
351
bin/pack/Index
@ -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
|
||||||
|
@ -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
14
bin/pack/pack.bat
Normal 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
|
@ -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
|
||||||
|
19
build.bat
19
build.bat
@ -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\
|
||||||
|
157
extern/include/armadillo/SecuredSections.h
vendored
Normal file
157
extern/include/armadillo/SecuredSections.h
vendored
Normal 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
|
@ -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
|
||||||
|
|
||||||
|
@ -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();
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
|
@ -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);
|
||||||
|
|
||||||
|
@ -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);
|
||||||
|
@ -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;
|
||||||
|
@ -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)
|
||||||
{
|
{
|
||||||
|
@ -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)
|
||||||
{
|
{
|
||||||
|
@ -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)
|
||||||
|
@ -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
|
||||||
*/
|
*/
|
||||||
|
@ -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;
|
||||||
|
@ -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());
|
||||||
|
@ -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>
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
@ -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"
|
||||||
|
@ -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()
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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);
|
||||||
|
@ -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);
|
||||||
|
@ -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()
|
||||||
|
|
||||||
|
@ -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)
|
||||||
{
|
{
|
||||||
|
@ -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
|
||||||
|
@ -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);
|
||||||
|
@ -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));
|
||||||
|
@ -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);
|
||||||
|
@ -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;
|
||||||
|
@ -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
|
||||||
|
@ -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;
|
||||||
|
@ -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();
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
@ -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));
|
||||||
|
@ -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);
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
@ -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();
|
||||||
|
|
||||||
|
@ -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);
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
@ -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))
|
||||||
|
@ -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:
|
||||||
|
@ -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)
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
@ -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();
|
||||||
|
@ -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;
|
||||||
|
@ -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);
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
|
|
||||||
//
|
//
|
||||||
|
@ -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);
|
||||||
};
|
};
|
||||||
|
@ -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;
|
||||||
|
@ -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),
|
||||||
|
@ -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);
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
@ -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)
|
||||||
|
@ -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();
|
||||||
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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)
|
||||||
|
@ -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)
|
||||||
|
@ -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;
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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);
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
|
@ -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();
|
||||||
|
@ -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();
|
||||||
|
@ -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));
|
||||||
|
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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, '.');
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
@ -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);
|
||||||
|
@ -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;
|
||||||
|
@ -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)
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
@ -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);
|
||||||
|
|
||||||
|
@ -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] == '@' )
|
||||||
{
|
{
|
||||||
|
@ -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();
|
||||||
|
@ -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();
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
@ -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
1416
src/EterPack/EterPack.cpp
Normal file
File diff suppressed because it is too large
Load Diff
234
src/EterPack/EterPack.h
Normal file
234
src/EterPack/EterPack.h
Normal 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
|
@ -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>
|
||||||
|
@ -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>
|
||||||
|
59
src/EterPack/EterPackCursor.cpp
Normal file
59
src/EterPack/EterPackCursor.cpp
Normal 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();
|
||||||
|
}
|
25
src/EterPack/EterPackCursor.h
Normal file
25
src/EterPack/EterPackCursor.h
Normal 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
|
@ -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;
|
|
||||||
}
|
|
||||||
|
@ -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
Loading…
x
Reference in New Issue
Block a user