Cover 의 Edit

에디터에서 커버를 편집하는 방식과 그에 따른 코드 흐름에 대해 알아본다.

편집 방식

코드 흐름

에디터에서 특정 대상을 편집하는 것에 대한 정의는 UnrealEd 프로젝트에 UnEdModes.h 와 UnEdModes.cpp 에 있다.

코드를 보면 알겠지만 Cover 이외 다양한 오브젝트들의 에디트 방식을 여기서 정의하고 있다.1)

UnEdModes.h
enum EEditorMode
{
    EM_None,
    EM_Default,
    EM_TerrainEdit,
    EM_Geometry,
    EM_StaticMesh,
    ...
    EM_CoverEdit,             // 여기서 에디트모드 타입 추가
    ...
};
 
...
 
class FEdModeCoverEdit : public FEdMode
{
private:
    UBOOL bCanAltDrag;
    UBOOL bTabDown;
    ACoverLink* LastSelectedCoverLink;
    FCoverSlot* LastSelectedCoverSlot;
 
public:
    FEdModeCoverEdit();
    virtual ~FEdModeCoverEdit();
 
    virtual void Enter();                          // 선택 되었을 경우 발생하는 이벤트.
    virtual void Exit();                           // (선택된 상태에서) 포커스가 해제된 경우 발생하는 이벤트
 
    virtual UBOOL InputKey( ... );                 // 키(마우스포함) 를 눌렀을 경우 발생하는 이벤트
    virtual UBOOL InputDelta( ... );               // 오브젝트를 이동/회전/확대 할 경우 발생하는 이벤트
    virtual void ActorSelectionChangeNotify();     // 선택 되었을 경우 발생하는 이벤트. 마지막으로 선택된 CoverLink 를 캐싱해둔다.
    virtual UBOOL UsesTransformWidget();
    virtual UBOOL UsesTransformWidget( ... );      // Space 로 에디트모드를 변경할 경우 (이동/회전/확대) 발생하는 이벤트
    virtual FVector GetWidgetLocation();           // 현재 오브젝트의 위치를 리턴.
    virtual UBOOL HandleDragDuplicate();           // Alt 드래그로 오브젝트를 복제할 경우 발생하는 이벤트
    virtual UBOOL HandleDuplicate();               // 오브젝트 복제가 일어날 때 발생하는 이벤트. UUnrealEdEngine::Exec_Actor 에서 "DUPLICATE" 신호
    virtual UBOOL HandleClick( ... );              // 화면에 마우스 클릭 시 발생하는 이벤트
    virtual void DrawHUD( ... );                   // UI 표시
};

GetWidgetLocation 함수는 화면에 위젯을 그리기 위해 현재 선택한 오브젝트의 위치를 얻기 위한 용도로 사용된다.

UnWidget.cpp
void FWidget::Render( ... )
{
    ...
 
    // 위치를 얻어서
    FVector Loc = GEditorModeTools().GetWidgetLocation();
 
    // 현재 에디트 모드에 따라 적당한 위젯을 그린다.
    switch ( GEditorModeTools().GetWidgetMode() )
    {
        case WM_Translate:
            Render_Translate( View, PDI, Loc, bDrawWidget );
            break;
 
        case WM_Rotate:
            Render_Rotate( View, PDI, Loc, bDrawWidget );
            break;
 
        case WM_Scale:
            Render_Scale( View, PDI, Loc, bDrawWidget );
            break;
 
            ...
    }
    ...
}
1) 새로운 타입의 오브젝트를 구현했고 이것을 에디터에서 편집하고 싶다면 Cover 에디트 방식을 참고하여 구현하면 될 것이다.