[2023 03 08] 목소리 더빙, 보이스 도와주는 프로그램 개발 연습 일지 (16-4) - 오브젝트 마우스 업데이터 구현 - Whitmem
[2023 03 08] 목소리 더빙, 보이스 도와주는 프로그램 개발 연습 일지 (16-4) - 오브젝트 마우스 업데이터 구현
Develop History
2023-03-07 07:19 게시 38fbb8f334b72ec2d4a7

0
0
110
이 페이지는 외부 공간에 무단 복제할 수 없으며 오직 있는 그대로 게시되며 부정확한 내용을 포함할 수 있습니다. 법률이 허용하는 한 가이드 라인에 맞춰 게시 내용을 인용하거나 출처로 표기할 수 있습니다.
This page is not to be distributed to external services; it is provided as is and may contain inaccuracies.
개요
이번 작업에서는 시각적으로 변한 건 많이 없지만 내부 처리 방법이 많이 변경되었다.
RendererInterface
RendererInterface 는 다른 렌더러 클래스에서 손 쉽게 선이나 그림을 그리고, 업데이트를 할 수 있도록 만들어진 클래스이다.
기본적으로 LocalCoordinationRendererInterface을 상속받아, 로컬 좌표계에 대한 데이터를 담을 수 있도록하였다. 전체 좌표계를 기준으로 하는 렌더러라고 하더라도 기본적으로 DRendererInterface를 상속받고, 로컬 좌표계를 위한 기능을 사용하지 않으면 된다. 만약, 로컬 좌표계를 사용하는 클래스의 경우 DLRendererInterface을 상속받아 사용할 수 있다.
UpdateRenderer 도 마찬가지로 DLRendererInterfaceDRendererInterface가 존재한다. 이는 마우스나 입력 업데이트에 대한 렌더러 클래스로, 이 역시 로컬 좌표계로 처리할 수 있다. 마우스가 특정 지점에 가면 커서가 바뀐다든지, 입력을 처리한다든지 등의 작업을 할 수 있도록 구현하였다.
예를 들어서, 전체적인 화면을 렌더링하는 고정 클래스가 있고, 화면 드래그를 처리하는 클래스가 있으면 이 두개를 같이 로드해서 각각 프레임마다 렌더해 주면, 알아서 처리하도록 한다.
상기 DFixedBackScreenRendererMainSystemRenderer 에서 초기 고정된 화면에 대한 프로세스를 진행하는데, 굳이 MainSystemRenderer로 나눈 이유는, DFixedBackScreenRenderer은 말 그대로 화면의 배경을 처리하는 클래스이기 때문에 이 클래스 내에 마우스 움직임을 담당하는 렌더러를 내장하기에는 부적절했고, 그렇기 때문에 Fixed 용도로 별도로 내놓은 것이다. 결과적으로 SystemUpdater 에 DFixedSystemMovementUpdater 를 생성하여 렌더가 되도록 구현하였다.
결과적으로 DFixedSystemMovementUpdater은 쓸데 없이 대리해주는 역할을 하고 있는데, 추후 마우스 움직임에 대한 추가 로드 사항이 있는 경우 추가를 하기 위해서 생성한 것이다. CMousePerspectiveUpdater는 단순히 마우스 드래그, 시점 조작만 제공하며, 제스쳐 기능을 추가하게 된다면 제스쳐에 대한 클래스를 별도로 생성해야 할 것이다. 제스쳐 역시 다른 렌더러에서도 동적으로 추가할 수 있도록 구성할 것이므로, DFixedSystemMovementUpdater은 마우스 움직임 처리, 제스쳐 처리 등을 한번에 모아서 렌더 해 줄 Facade 클래스가 되는 것이다.
물론 MainSystemRenderer에 직접 다 추가할 수 있겠지만, 추후 플러그인 기능, 여러 클래스들을 추가하게 되면 분류할 수 있도록 하기 위함이다. 이렇게 클래스를 만들게 된다고 하더라도 클래스는 다른 렌더러에서도 재활용할 수 있도록 RendererInterface를 상속하고 있기에 유지보수에도 용이하리라 생각했다.
아이템 출력자 구현
여기서 말하는 아이템 출력자란 기본적인 구성요소를 출력하도록 도와주는 클래스를 일컫는다. 트랙의 배경을 출력하도록 도와주는 DSingleTrackTextureRenderer와 vObject의 출력을 도와주는 LSingleObjectTextureRenderer, 또 이 내에 파형을 출력할 수 있도록 도와주는 로컬 좌표계 기준의 LWaveLineRenderer가 존재한다.
이러한 클래스들은 아이템을 출력할 때만 쓰는 것이 아니라 추후 상황 또는 확장 내용에 따라 가져다 사용할 수 있다.
컨트롤러 렌더러 구현
컨트롤러 렌더러란, 기본적인 화면상에 처리해야할 마우스 입력, 키보드 입력을 특정 장면에 사용할 수 있도록 처리 해주는 처리자를 일컫는다. 여기서는 전체적인 시점에 활용할 수 있는 CMousePerspectiveUpdaterCObjectMouseUpdater을 구현했다.
전자의 CMousePerspectiveUpdater은 화면의 전반적인 드래그시의 시점 이동을 위해 존재하지만 또 다른 씬이 존재할 때, 또는 또 다른 뷰포트에서도 시점 이동 방법은 동일하게 구현할 예정이라서 컴포넌트처럼 붙일 수 있도록 구현했다.
CObjectMouseUpdater는 오브젝트 한 개에 대한 마우스 움직임 처리 구현자이다. 한 트럭내에 오브젝트가 수 십개가 들어갈 수 있는데, 각각의 오브젝트의 클릭을 for문을 돌아가면서 직접 계산하기에는 비효율적이었기에, 하나의 오브젝트 렌더러에 CObjectMouseUpdater을 붙여주기로 결정하였다. 붙여주는 작업은 하나의 오브젝트의 처리 및 출력을 담당하는SingleVObjectRenderer가 생성되는 생성자 안에서 CObjectMouseUpdater을 같이 생성해 부착하도록 하였다.
기본적으로 LSingleObjectTextureRenderer은 오브젝트를 그리긴 하지만 배경을 그리는 것을 담당하고 있기 때문에 여기에 마우스 처리자를 넣는 건 좋은 설계가 아니라고 생각했다. 추후 보기 전용으로 오브젝트 배경만 따로 출력하기 위해 LSingleObjectTextureRenderer을 생성할 때 마우스 처리자가 같이 구현되면 곤란하기 때문이다. 즉 단순히 텍스처를 렌더링만 하는 클래스로 구성하였다.
또 다른 이유로는, SingleVObjectRenderer가 vObject의 처리를 구현하면서 로컬 좌표계 대리자를 이 안에서 선언하므로, 대리자를 같이 넘겨줄 수 있었기 때문이다.
CObjectMouseUpdater는 LSingleObjectTextureRenderer와 달리, 로컬 좌표계를 기준으로 둔다. 그렇기 때문에 마우스 입력을 구현할 때 오브젝트가 존재하는 좌표를 직접 계산할 필요 없이, 로컬 좌표계 기준으로 -5 ~ 5를 시작, 너비-5 ~ 너비 +5를 끝으로 Object의 사이즈를 조절할 수 있는 마우스 충돌 위치를 바로 지정할 수 있게된다. ( 유지보수에 용이하다. )
InputIOController
마지막으로 입력 컨트롤러이다. 기본적으로 C#에서 Keyboard 클래스와 Cursor 클래스, 마우스 클래스, 또는 System DLL을 load하여 GetStateKey 를 통해 키보드 입력을 바로 받을 수 있지만, 보다 효율적으로 관리하기 위해 InputIOController 클래스를 만들어주었다. GraphicMemory 클래스 내에 존재하는 대리자인 ControlPositionDelegator은 기본적으로 뷰포트의 마우스 입력 여부를 조회할 수 있도록 한다. 하지만 이는 실시간 조회로, 마우스가 최초로 클릭된 것인지 확인을 하기 위해서는 별도로 플래그 변수를 만들어 확인해야 한다. InputIOController는 이러한 부분에 착안하여 최초 한 번만 눌린 것인지 확인하는 메소드를 제공한다.
게다가, 보이스 작업 소프트웨어 특정상 추후 UI 구현시 키보드 키나 마우스 키를 수정하더라도 번거로움이 없도록 모든 키 맵핑을 여기서 관리하도록 하였다. 예를 들어 소스코드 내부에서 DefaultProcess에 대한 마우스 코드는 기본적으로 왼클릭으로 선언되어 있고, 이를 사용자가 휠 클릭이나, 우클릭으로 변경하는 경우 변경 사항이 반영되어 호출된다.
또한 사용자가 수정할 수 있도록 메소드를 미리 구현 해 두었다.
다음 목표
크기 조절 구현 및 UI 로드 창 구현, 파일 관리자 구현 및 오디오 파일 로드 구현, vObject 추가 구현하기
댓글 0개
댓글은 일회용 패스워드가 발급되며 사이트 이용 약관에 동의로 간주됩니다.
확인
Whitmemit 개인 일지 블로그는 개인이 운영하는 정보 공유 공간으로 사용자의 민감한 개인 정보를 직접 요구하거나 요청하지 않습니다. 기본적인 사이트 방문시 처리되는 처리 정보에 대해서는 '사이트 처리 방침'을 참고하십시오. 추가적인 기능의 제공을 위하여 쿠키 정보를 사용하고 있습니다. Whitmemit 에서 처리하는 정보는 식별 용도로 사용되며 기타 글꼴 및 폰트 라이브러리에서 쿠키 정보를 사용할 수 있습니다.
이 자료는 모두 필수 자료로 간주되며, 사이트 이용을 하거나, 탐색하는 경우 동의로 간주합니다.