1. EditorApplication 클래스

#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;
	};
}


2. Editor 클래스

#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;
	};
}


3. EditorWindow 클래스

#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;
	};
}


클래스 간 관계 및 작동 방식

  1. EditorApplication