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를 이용해 전달받은 이벤트를 감지하고, 해당 이벤트의 핸들러를 호출:
•
KeyPressedEvent → OnKeyPressed(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의 조작 모드를 변경하거나 추가 기능 실행능