Search
Duplicate

Guizmo 이동, 회전, 스케일링

SetKeyPressed(int keyCode, int scancode, int action, int mods)

이 함수는 키 입력이 발생했을 때, 적절한 이벤트(KeyPressedEvent 또는 KeyReleasedEvent)를 생성하고, 이를 mEventCallback을 통해 전달하는 역할을 합니다.

동작 과정

1.
입력된 키 상태(action)에 따라 이벤트를 생성
RELEASE(0): 키가 떼어짐 → KeyReleasedEvent
PRESS(1): 키가 처음 눌림 → KeyPressedEvent (isRepeat=false)
REPEAT(2): 키가 계속 눌려 있음 → KeyPressedEvent (isRepeat=true)
2.
이벤트를 생성한 후, mEventCallback을 호출하여 이를 전달
이후 OnEvent()에서 추가적인 처리 수행

OnEvent(ya::Event& e)

이 함수는 발생한 이벤트를 적절한 핸들러로 전달하는 역할을 합니다.

동작 과정

1.
EventDispatcher를 이용해 전달받은 이벤트를 감지하고, 해당 이벤트의 핸들러를 호출:
KeyPressedEventOnKeyPressed(e) 호출
KeyReleasedEvent → 현재 구현 없음 (TODO 주석)
MouseMovedEvent → 기본적으로 true를 반환하지만, 아직 추가 로직 없음
2.
이벤트가 처리되지 않았다면(e.Handled == false), mImguiEditor->OnEvent(e)를 호출하여 ImGui에서 이벤트를 처리

OnKeyPressed(ya::KeyPressedEvent& e)

이 함수는 키가 눌렸을 때, 특정 기능을 수행하는 역할을 합니다.
특히 ImGuizmo와 관련된 키 입력을 처리하는 부분이 중요합니다.

동작 과정

1.
REPEAT 키 입력 무시
e.IsRepeat()true이면 바로 false 반환
2.
컨트롤(Control) 및 시프트(Shift) 키 상태 확인
control: 왼쪽 또는 오른쪽 컨트롤 키가 눌려 있는지 확인
shift: 왼쪽 또는 오른쪽 시프트 키가 눌려 있는지 확인
3.
입력된 키 코드(e.GetKeyCode())에 따라 동작 수행
Q: ImGuizmo 사용 중이 아니면 기즈모(Gizmo) 모드를 해제
W: ImGuizmo 사용 중이 아니면 이동(Translate) 모드로 변경
E: ImGuizmo 사용 중이 아니면 회전(Rotate) 모드로 변경
R:
Control 키가 눌렸다면 스크립트 리로드 (현재 주석 처리됨)
그렇지 않다면 ImGuizmo 사용 중이 아닐 때 크기 조절(Scale) 모드로 변경

ImGuizmo 관련 동작 정리

이 코드에서 ImGuizmo를 활용하는 부분은 OnKeyPressed()의 키 입력 처리입니다.
각 키의 동작이 ImGuizmo의 조작 모드와 어떻게 연결되는지 살펴보겠습니다.
키 입력
ImGuizmo 동작
Q
기즈모 비활성화 (SetGuizmoType(-1))
W
이동 모드 (SetGuizmoType(ImGuizmo::OPERATION::TRANSLATE))
E
회전 모드 (SetGuizmoType(ImGuizmo::OPERATION::ROTATE))
R
크기 조절 모드 (SetGuizmoType(ImGuizmo::OPERATION::SCALE))
SetGuizmoType(int type) 함수는 ImGuizmo의 조작 모드를 변경하는 역할을 합니다.
ImGuizmo::IsUsing()은 현재 ImGuizmo가 활성화되어 조작 중인지 여부를 반환합니다.
활성화 상태라면 조작 중이므로 모드를 변경하지 않도록 합니다.

전체적인 코드 흐름

1.
키 입력 발생SetKeyPressed()에서 KeyPressedEvent 또는 KeyReleasedEvent 생성
2.
이벤트 전달OnEvent()에서 적절한 핸들러(OnKeyPressed()) 호출
3.
키 입력 처리OnKeyPressed()에서 특정 키에 따라 ImGuizmo의 조작 모드를 변경하거나 추가 기능 실행능