현재 ZVEngine에서 UI를 생성하는 기능은
ImGui의 기능들을 각각의 객체로써 사용할 수 있도록 포팅되어 구현 되어있다.

아무튼 그래서 ImGui는 일종의 스코프 방식이다보니
이것들을 객체처럼 동작시키려면 모든 스코프에 대해서 동기화를 시켜주어야 한다.

예를 들어 ImGui에서 UI 창을 하나 생성하기 위해선 다음과 같은 코드 방식으로 동작한다

if (ImGui::Begin("라벨 명"))
{
	...UI 관련 코드들

	ImGui::End();
}

이것들을 동기화하기 위해서는 각 객체가 생성될 때마다 ImGui::Begin의 스코프 활성화 상태를 검사하고
이전에 생성된 객체에 대해서는 ImGui::End를 해주어야한다. 

아무튼 해당 동기화 코드를 본인은 현재의 Dialog 생성 객체를 의미하도록 static 객체를 통해 관리했고 
해당 상태들을 모두 대입 연산을 해주었는데 이를 포인터로 관리하도록 수정하였다.

왼쪽이 코드 수정 전이고 오른쪽이 수정 후 이다.
코드 cpp 파일 내부에서만 사용하도록 선언과 정의가 모두 cpp 내부로 감춰져있다.
기존에는 모든 상태에 대해서 대입으로 갱신했는데 이를 포인터로 바꾸고
해당 갱신에 대해서 명확하게 의미를 파악할 수 있도록 함수를 통해서 갱신 동작을 한다.
그리고 현재 사용중인 Dialog에 대한 확인은 string이 아니라 포인터의 주소로 확인하도록 했다.

 

Dialog 생성 시 동기화 코드이다. 상단에 strLabel 부분으로 비교하는 곳을 static 함수로 대체하여 의미를 명확하게 했다.
그리고 아래에 상태 갱신에 사용할 Chunk Data를 모두 대입하여 사용하던 부분을 포인터 갱신으로 바꾸었다.

메뉴바 또한 아래처럼 동기화 코드를 작성해서 기존 ImGui 방식에 대응되도록 수정했다.

 

다음처럼 layer( layer 는 일종의 렌더 타켓 중 하나를 의미함)를 생성 후
Dialog 객체를 사용해보고 테스트해보니 동작에 문제가 없음을 확인했다.

ImGui::MenuItem도 보통 BeginMenubar를 자동으로 해주어야 하지만 기존에 동기화 작업을 마쳤으므로 
외부에서 사용할 땐 일일히 스코프를 신경쓰지 않고 사용할 수 있게 됐다
그리고 해당되는 Dialog에서만 생성되도록 자동화가 잘 된 것을 확인할 수 있다.

 

-> 프로파일러에서 같은 카테고리(호출된 함수)에서 보낸 데이터는 같은 탭에 생성되도록 해야하는데, 중복 생성되는 것 때문에 이 부분도 수정해야할 것 같다.. 

 

'Diary > 개발 일지' 카테고리의 다른 글

[ZVEngine] 개발 일지 -5 : ComboBox  (0) 2024.05.22
[ZVEngine] 개발 일지 -4 : HotKey 구현  (0) 2024.05.17
[ZVEngine] 개발 일지 -2 : Profiler  (0) 2024.05.08
[ZVEngine] 개발 일지 -1  (0) 2024.04.22