3. 스킨 렌더링

engine-3.jpg

목표 :
스킨을 로드하는 법을 알아본다.
각종 폴더 설정에 대해 알아본다.
스킨을 통해 오브젝트를 생성하는법을 알아본다.
생성된 오브젝트를 갱신하여 엔진에 렌더링을 요청하는법을 알아본다.



결과 :
스킨오브젝트를 생성후 렌더링 한다.

1> 스킨을 위한 HANDLE 과 오브젝트를 위한 HANDLE 을 선언한다.
;EPPHANDLE 은 엔진 전반에 걸쳐 사용되는 HANDLE 이다. 모든 오브젝트의 접근은 EPPHANDLE 를 통해
접근된다. 이번 예제에서는 간단하게 전역변수로써 두 변수를 선언 하였다.

EPPHANDLE g_hSkin = INVALID_HANDLE;
EPPHANDLE g_hObject = INVALID_HANDLE;

2> 리소스 로드를 위하여 init_once 라는 함수를 하나 생성한다.
; init_once 함수는 초기 엔진을 생성할때 한번만 호출되도록 한다.


3> 각종 리소스의 폴더들을 설정한다.
; 위에서 정의한 init_once 폴어 안쪽에 설정 한다.

char szCurrentPath[MAX_PATH];
 GetCurrentDirectory(MAX_PATH, szCurrentPath);

 // game res path
 g_engine_core.set_directory_game_path(GAME_DIR_PATH_BASE, szCurrentPath);
 g_engine_core.set_directory_game_path(GAME_DIR_PATH_OBJECT, "resource\\object\\");
 g_engine_core.set_directory_game_path(GAME_DIR_PATH_SKIN, "resource\\skin\\");
 // device res path
 g_engine_core.set_directory_display_path(DIR_PATH_TEXTURE, "resource\\texture\\");
 g_engine_core.set_directory_display_path(DIR_PATH_RENDER_METHOD, "resource\\rendermethod\\");


4> 스킨을 load 한다.
; 위의 init_once 함수의 아래쪽에 아래와 같은 코드를 삽입하자.

EPPHANDLE g_hSkin  = g_engine_core.load_object_skin( "주전자.eoj" );
if( g_hSkin  == INVALID_HANDLE) return false;
return true;

5> load 된 스킨을 활용해 오브젝트를 생성한다.
; 위의 init_once 함수의 아래쪽에 아래와 같은 코드를 삽입하자.

if(g_hSkin != INVALID_HANDLE)
      g_hObject = g_engine_core.create_object(g_hSkin)

if(g_hObject == INVALID_HANDLE)
     return false;
return true;

6> 생성된 오브젝트를 갱신한다.
; 아래 함수는 매프레임 호출되어져야 한다. process 함수 아래쪽에 삽입한다.

g_engine_core.update_object( g_hObject, &matrix);

7> 생성된 오브젝트와 로드된 skin 을 제거 한다.
; 리소스를 먼저 release 한 후, 오브젝트를 제거한다.

if(g_hSkin != INVALID_HANDLE) g_engine_core.release_object_skin(g_hSkin);
if(g_hObject != INVALID_HANDLE) g_engine_core.destroy_object(g_hObject);

8> 갱신된 오브젝트는 자동적으로 렌더링 된다.

Download
epp_engine_skin_rendering.cpp


* PARAMETER
void     set_directory_game_path(eGAME_RESOURCE_PATH p_ePath, char* p_szRelativePath);
void set_directory_display_path(eDISPLAY_RESOURCE_PATH p_ePath, char* p_szRelativePath); 
EPPHANDLE   load_object_skin(char* p_szFilename, uint16 p_uiPriority = 0xffff);
EPPHANDLE     create_object(EPPHANDLE p_hObject, uint16 p_uiPriority = 0xffff);
void       update_object(EPPHANDLE p_hObject, EPP_MATRIX* p_pMat = NULL);