WPF를 이용한 에디터 만들기 – WPF를 이용하는 이유

WPF SYMBOL

DirectX 렌더러 프로그래밍을 하면서 슬슬 GUI환경을 구축해야할 필요성이 느껴진다. 배치된 오브젝트들의 속성들을 수정하기 위해서 JSON으로 스크립트를 구축하더라도 매번 수정하고 재시작해야 하는 수고로움이 있다. 이는 GUI환경을 통해 바로바로 수정한 내용들을 반영하여 확인할 수 있으면 매우 간편해진다.

GUI환경을 가장 간단한게 구축할 수 있는건 ImGUI를 이용하는 것이다. ImGUI 설치하기에서 미리 다루었다. 하지만 GUI코드들이 렌더러 코드들과 함께 있는게 마음에 들지 않았다. 의존성도 문제도 있고, GUI코드를 수정했으면 GUI프로젝트만 재빌드되면 하는 문제들도 있다. 따라서 일단 GUI프로젝트와 렌더러 프로젝트를 서로 분리하기로 했다.

최종적으로 이런 구조의 솔루션이 된다

WPF?


아주 예전부터 GUI프로젝트로 WPF를 계속 고민해왔던 부분이 있다. WPF로 GUI 에디터를 만들게 되면 여러가지 장점이 있다. 이미 널리 알려진 것들이기 때문에 따로 언급은 안하겠다. 하지만 단 한가지 단점이 이 많은 장점들을 가졌음에도 불구하고 WPF로 에디터를 만들 수 없게 만든다. 바로 기반 언어가 다르다는 것

WPF는 c#을 기반으로 하고 DirectX 렌더러는 보통 c++를 기반으로 한다. XNA를 사용하면 c#을 이용한 DirectX 렌더링을 할 수 있지만 사실상 사장된 기술이다. 이 기반 언어가 달라 c++로 만든 렌더러 라이브러리를 c#에서 이용하려면 굉장히 귀찮은 과정이 필요하다. c++/cli를 통해 c#에서 c++코드를 호출할 수 있도록 해줘야 하는 것이다.

문제는 이 c++/cli 코드를 만드는게 너무 귀찮아…

c++프로젝트에서 만든 특정 로직을 c#에서 호출하려면 다음과 같은 과정을 거쳐야 한다.

  • c++/cli 프로젝트 생성 ( dll 프로젝트 )
  • c++/cli 프로젝트에서 c++프로젝트의 함수를 호출하는 브릿지( 연결 ) 함수 작성
  • c#프로젝트에서 c++/cli 프로젝트의 dll을 로드하여 브릿지 함수 호출

이게 클래스 단위가 아닌 함수 단위로 작성되어야 한다. c++에서 작성되는 로직을 c#에서 호출가능하게 하려면 이걸 하나하나 다 추가로 작성해줘야 하는데다가 c++에서 함수 시그니처가 변경되기라도 하면 마찬가지로 c++/cli프로젝트, c#프로젝트에서도 같이 변경을 해줘야 한다. 정말 재미없는 그저 코딩 노가다일 뿐이다.

ImGUI


ImGUI라는 훌륭한 대체제가 있다. c++로 만들어진 GUI 라이브러리이다.

https://github.com/ocornut/imgui에서 소개된 스크린샷

동일한 c++기반이고 사용법도 직관적이며 매우 간단하다. 디자인도 예쁘고 여러모로 굉장히 좋은 라이브러리이다. 그래서 간단한 렌더러의 GUI 에디터 프로젝트에서 사용하기에는 좋다.

그럼에도 불구하고 WPF로 에디터를 만드는 이유는


AI 에이전트의 등장

AI가 등장했고, 그 발전이 엄청나다. 아직까진 아키텍처 레벨에서까지 AI를 이용한 코딩은 좀 무리가 있다는 판단을 하고 있지만 단순한 c++/cli프로젝트는 오히려 AI가 사람보다 더 정확하게 코딩을 해줄 수 있다. 굉장히 단순하고도 명확한 작업이므로 이 부분을 AI를 통해 코딩한다면 사실상 가장 큰 단점인 귀찮은 부분을 해소할 수 있다.

좀 더 복잡한 환경에서의 ImGUI

간단한 GUI는 ImGUI를 사용하는게 훨씬 쉽고 빠르게 진행할 수 있다. 하지만 규모가 좀 더 커졌을 때는 고민이 된다. 일단 기본적으로는 GUI 레이아웃도 c++코드로 작성을 해야 하기 때문에 이 부분을 스크립트로 빼고 또 이 스크립트를 만들기 위한 툴도 만들고 하다보면 일이 커진다. 그렇다고 c++코드로 레이아웃부터 관리하자니 사실상 하드 코딩이 되어버리기 때문에 레이아웃을 수정하기 위해 리빌드를 해야 하는 굉장히 안좋은 상황이 되어버린다. GUI관련 내용들이 많아질 수록 이런 관리들이 점점 더 어려워지기도 하고. 복잡한 환경에서의 GUI구축은 WPF가 확실히 이점이 있다.

좋은 튜토리얼

Game Engine Programming 001 – Introduction | C++ Game Engine유튜버가 마침 게임 엔진 프로그래밍을 다루면서 WPF로 에디터를 만든다. 이 유튜브를 참고해서 WPF로 에디터를 구축하는 노하우를 쌓는 것도 좋은 경험이 될 수 있을것으로 보인다.

일단 둘 다 할 수 있는 환경을 구축해보자.

그래서 처음에서 언급한대로 ImGUI를 이용한 GUI프로젝트인 Editor_Win32와 WPF를 이용한 GUI프로젝트인 Editor_WPF를 둘다 추가한다. 간단하고 빠르게 GUI를 만들어서 테스트할 때는 ImGUI를 이용하고, 정식으로 에디터를 만들때에는 WPF를 이용하기 위해서이다.

그래서 당분간은 이제 WPF를 통해 에디터의 기본 사양들을 구축하는 부분을 다루려고 한다. DirectX 렌더러 부분은 기본 사양이 구축된 이후에 이어서 다룰 것이다.

이전글 : DirectX11 – Depth-Stencil Buffer 사용하기

다음글 : WPF – Editor_WPF 프로젝트 추가

0 답글

댓글을 남겨주세요

Want to join the discussion?
Feel free to contribute!

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다