1. EditorApplication 클래스
•
역할: 에디터의 중심 클래스 역할을 하며, 에디터의 초기화, 업데이트, 렌더링, 종료 등 주요 루프를 담당.
•
목적:
◦
에디터의 메인 프로세스를 제어하고, 주요 기능(프로젝트 열기, 씬 저장 등)을 실행.
◦
여러 EditorWindow를 관리하며 이를 통해 UI의 다양한 창을 제어.
•
주요 기능:
◦
Initialize(): 에디터 초기화.
◦
Update(): 로직 업데이트.
◦
OnGUI(): 렌더링 업데이트.
◦
Run(): 메인 루프 실행.
◦
Release(): 종료 및 리소스 해제.
◦
창 검색 기능(GetWindow): 이름으로 특정 윈도우 객체 반환.
◦
여러 프로젝트 및 씬 관련 작업(OpenProject, SaveScene, OpenScene 등).
#pragma once
#include "guiEditor.h"
#include "guiEditorWindow.h"
#include "..\\YamYamEngine_SOURCE\\yaRenderTarget.h"
namespace gui
{
/// <summary>
/// EditorApplication 클래스는 에디터에서 사용되는 메인 클래스로
/// 에디터의 메인 루프를 실행하고 에디터의 초기화 및 종료를 담당합니다.
/// </summary>
class EditorApplication
{
public:
enum class eState
{
Disable,
Active,
Destroy,
};
template <typename T>
T* GetWindow(const std::wstring& name)
{
auto iter = mEditorWindows.find(name);
if (iter == mEditorWindows.end())
return nullptr;
return dynamic_cast<T*>(iter->second);
}
///<summary>
///에디터를 초기화합니다.
///</summary>
static bool Initialize();
/// <summary>
/// 에디터를 로직을 업데이트합니다.
/// </summary>
static void Update();
/// <summary>
/// 에디터 렌더링을 업데이트합니다.
/// </summary>
static void OnGUI();
/// <summary>
/// 에디터 업데이트
/// </summary>
static void Run();
/// <summary>
/// 에디터를 종료합니다.
/// </summary>
static void Release();
static void OpenProject();
static void NewScene();
static void SaveScene();
static void SaveSceneAs();
static void OpenScene(const std::filesystem::path& path);
private:
static bool imGguiInitialize();
static void imGuiRender();
static std::map<std::wstring, EditorWindow*> mEditorWindows;
static ImGuiWindowFlags mFlag;
static ImGuiDockNodeFlags mDockspaceFlags;
static eState mState;
static bool mFullScreen;
static ya::math::Vector2 mViewportBounds[2];
static ya::math::Vector2 mViewportSize;
static bool mViewportFocused;
static bool mViewportHovered;
static ya::graphics::RenderTarget* mFrameBuffer;
};
}
C++
복사
2. Editor 클래스
•
역할: 에디터 내부의 특정 컴포넌트를 커스터마이징하고 관리.
•
목적:
◦
특정 객체의 Inspector 기능을 재정의하거나 확장하여, 커스터마이즈된 UI와 편집 기능 제공.
•
주요 기능:
◦
Initialize(), Update(), OnGUI(): 초기화, 갱신, 렌더링.
◦
OnEnable(), OnDisable(), OnDestroy(): 상태 변화 및 종료 처리.
◦
mState: 컴포넌트의 상태(Paused, Active, 등)를 관리.
#pragma once
#include "guiEntity.h"
namespace gui
{
/// <summary>
/// Editor는 특정 컴포넌트의 Inspector를 커스터마이징하는 데 사용됩니다.
/// Inspector 창에 표시되는 UI를 재정의하거나 확장합니다.
/// </summary>
class Editor : public Entity
{
public:
enum class eState
{
Paused,
Active,
Disabled,
Destroyed
};
Editor();
virtual ~Editor();
virtual void Initialize();
virtual void Update();
virtual void OnGUI();
virtual void OnEnable();
virtual void OnDisable();
virtual void OnDestroy();
private:
eState mState;
};
}
C++
복사
3. EditorWindow 클래스
•
역할: 독립적인 창(UI)을 생성 및 관리하며, 에디터에 새로운 도구나 워크플로우를 추가.
•
목적:
◦
사용자 인터페이스의 독립적인 창을 통해 새로운 도구 및 기능 제공.
◦
각각의 창이 독립적으로 초기화, 업데이트, 렌더링을 수행.
•
주요 기능:
◦
Initialize(), Update(), OnGUI(): 윈도우 초기화, 갱신, 렌더링.
◦
Run(): 창 실행.
◦
상태 관리(mState): 창의 상태를 Disable, Active, Destroy로 관리.
◦
크기 및 속성 관리: GetSize(), SetSize(), GetFlag(), 등.
#pragma once
#include "guiEntity.h"
namespace gui
{
/// <summary>
/// EditorWindow는 독립적인 창을 생성하여 에디터에 새로운 도구나 워크플로우를 추가하는 데 사용됩니다.
/// 에디터 에서 실행되는 완전히 새로운 사용자 인터페이스를 제공합니다.
/// </summary>
class EditorWindow : public Entity
{
public:
enum class eState
{
Disable,
Active,
Destroy,
};
EditorWindow();
virtual ~EditorWindow();
virtual void Initialize();
virtual void Update();
virtual void OnGUI();
virtual void Run();
virtual void OnEnable();
virtual void OnDisable();
virtual void OnDestroy();
ImGuiWindowFlags GetFlag() const { return mFlag; }
eState GetState() const { return mState; }
void SetState(eState state) { mState = state; }
ImVec2 GetSize() { return mSize; }
void SetSize(ImVec2 size) { mSize = size; }
private:
ImGuiWindowFlags mFlag;
eState mState;
ImVec2 mSize;
};
}
C++
복사
클래스 간 관계 및 작동 방식
1.
EditorApplication
•
에디터의 중심으로 EditorWindow와 같은 하위 객체를 관리.
•
전체 루프와 주요 기능을 제어.
2.
EditorWindow
•
독립적인 창을 관리하며, EditorApplication에 의해 호출 및 렌더링.
3.
Editor
•
EditorWindow 또는 EditorApplication의 일부로 특정 객체의 Inspector 또는 컴포넌트를 담당.
예시 흐름
1.
EditorApplication 초기화 및 실행 → 여러 EditorWindow 객체 생성.
2.
각 EditorWindow 가 독립적으로 UI 및 동작을 관리.
3.
특정 창에서 Editor 객체가 Inspector 기능 커스터마이징.
이 구조는 확장성과 유지보수성을 고려하여 잘 설계된 구조로 보입니다.
GUILayout 클래스
역할:
•
에디터에서 UI 요소를 효율적으로 배치하기 위한 도구 클래스.
•
Editor나 EditorWindow를 커스터마이징할 때 자동 레이아웃 계산을 제공하여 개발자가 UI 요소의 배치를 쉽게 구성할 수 있도록 돕는다.
목적:
•
개발자가 UI를 배치할 때 세부적인 위치나 크기를 수동으로 지정할 필요 없이, 자동으로 적절한 위치를 계산.
•
동적인 레이아웃 관리:
◦
창 크기 변경, 요소 추가/삭제 시 자동으로 배치가 조정됨.
◦
일정한 간격, 정렬, 비율 등 UI 구성의 일관성을 유지.
예상되는 기능 (현재 코드에는 정의되어 있지 않음):
아직 클래스 내부가 구현되지 않았지만, 일반적인 GUILayout 클래스에서 기대할 수 있는 기능은 다음과 같습니다:
1.
컨테이너 기능:
•
UI 요소들을 포함하는 영역 정의.
•
컨테이너 크기와 정렬에 따라 자식 요소들의 위치를 자동으로 결정.
2.
레이아웃 관련 함수:
•
Horizontal Layout: UI 요소들을 가로로 배치.
•
Vertical Layout: UI 요소들을 세로로 배치.
•
Grid Layout: UI 요소들을 그리드 형식으로 배치.
•
예:
cpp
코드 복사
GUILayout::BeginHorizontal();
GUILayout::Button("Button 1");
GUILayout::Button("Button 2");
GUILayout::EndHorizontal();
C++
복사
3.
간격 및 정렬:
•
요소 간 간격 설정 (padding, spacing).
•
정렬(왼쪽, 오른쪽, 중앙) 지원.
4.
동적 크기 관리:
•
UI 요소가 창 크기에 따라 자동으로 크기를 조정.
5.
상태 관리:
•
레이아웃 시작/종료(BeginLayout, EndLayout).
클래스 사용 예시 (가상 코드):
cpp
코드 복사
void EditorWindow::OnGUI()
{
GUILayout::BeginVertical();
GUILayout::Label("Settings");
GUILayout::Button("Save");
GUILayout::Button("Cancel");
GUILayout::EndVertical();
}
C++
복사
•
위와 같이 GUILayout을 사용하면 UI 구성 요소를 논리적이고 간단하게 정의 가능.
정리:
•
GUILayout 클래스는 에디터에서 UI 작업을 간소화하고 효율적으로 만들기 위해 설계된 자동 레이아웃 관리 도구입니다.
•
Editor나 EditorWindow 클래스와 함께 사용되어, UI 커스터마이징의 복잡도를 줄이고 생산성을 높이는 것이 주된 목표입니다.
추후 내부 구현에서 실제 기능과 사용 사례가 추가되면 더 많은 세부사항을 정의할 수 있을 것입니다.
#pragma once
namespace gui
{
/// <summary>
/// GUILayout 클래스는 에디터에서 UI를 만들기 위해 제공되는 클래스 중 하나로
/// 자동으로 레이아웃을 계산하여 간단하게 UI 요소를 배치할 수 있도록 돕습니다.
/// Editor나 EditorWindow를 커스터마이징할 때 사용됩니다.
/// </summary>
class GUILayout
{
//To do ...
};
}
C++
복사