-
Notifications
You must be signed in to change notification settings - Fork 0
Module Window
yoshin edited this page Feb 12, 2026
·
3 revisions
MiniLibX 윈도우 초기화, 이벤트 핸들링, 키 바인딩을 담당하는 모듈입니다.
| 파일 | 역할 |
|---|---|
window_init.c |
윈도우/이미지/UI 초기화, 훅 등록 |
window_lifecycle.c |
close_window — 리소스 정리 및 종료 |
window_events.c |
handle_key, handle_key_release — 키 이벤트 분기 |
window_key_handlers.c |
HUD, 오브젝트 선택, 변환 키 처리 |
window_loop.c |
render_loop — 프레임 루프 콜백 |
window_camera.c |
카메라 이동/회전/리셋 |
window_objects.c |
오브젝트 이동 처리 |
window_resize.c |
오브젝트 리사이즈 처리 |
window_rotate.c |
오브젝트 회전 처리 |
mlx_context.c |
MiniLibX 초기화 (mlx_init, mlx_new_window) |
mlx_pixel.c |
픽셀 쓰기 (put_pixel_to_buffer) |
mlx_pixel_codec.c |
픽셀 형식 변환 |
render_flags_set.c |
렌더 상태 플래그 헬퍼 |
render_create(scene)
├── malloc(t_render)
├── mlx_context_init()
│ ├── mlx_init()
│ ├── mlx_new_window(1440, 900, "miniRT")
│ ├── mlx_new_image()
│ └── mlx_get_data_addr()
├── init_render_state()
│ ├── pixel_timing_init()
│ └── debounce_init()
├── init_ui_components()
│ ├── hud_init()
│ ├── keyguide_init()
│ └── hud_calculate_total_pages()
└── register_hooks()
├── mlx_hook(close_window) // 윈도우 닫기
├── mlx_hook(handle_key) // 키 누름
├── mlx_hook(handle_key_release) // 키 해제
├── mlx_hook(handle_expose) // 윈도우 노출 시 재렌더링
└── mlx_loop_hook(render_loop) // 프레임 루프
해상도: 1440 x 900 (고정)
| 키 | 동작 | 설명 |
|---|---|---|
| W | 전진 | 시야 방향으로 이동 |
| X | 후진 | 시야 반대 방향으로 이동 |
| A | 좌 | 시야 직교 방향 좌측 |
| D | 우 | 시야 직교 방향 우측 |
| Q | 상승 | 월드 Y축 상향 |
| Z | 하강 | 월드 Y축 하향 |
| 키 | 동작 |
|---|---|
| E | 피치 위 (고개 올림) |
| C | 피치 아래 (고개 내림) |
| 1 | 요 좌 (좌회전) |
| 3 | 요 우 (우회전) |
| 키 | 동작 |
|---|---|
| S | 초기 위치 및 방향 복원 |
| 키 | 동작 |
|---|---|
| TAB | 다음 오브젝트 |
| 키 | 축 | 방향 |
|---|---|---|
| R | X | - |
| T | X | + |
| F | Y | - |
| G | Y | + |
| V | Z | - |
| B | Z | + |
| 키 | 대상 | 방향 |
|---|---|---|
| Y | 반지름 (구/원기둥/원뿔) | - |
| U | 반지름 (구/원기둥/원뿔) | + |
| N | 높이 (원기둥/원뿔) | - |
| M | 높이 (원기둥/원뿔) | + |
| 키 | 축 | 방향 |
|---|---|---|
| I / J | X | - / + |
| O / K | Y | - / + |
| P / L | Z | - / + |
| 키 | 축 | 방향 |
|---|---|---|
| [ | X | - |
| ] | X | + |
| ; | Y | - |
| ' | Y | + |
| , | Z | - |
| . | Z | + |
| 키 | 동작 |
|---|---|
| = | 다음 광원 선택 (순환) |
| 키 | 동작 |
|---|---|
| H | HUD 표시/숨김 |
| Up / Down | HUD 페이지 이동 |
| ESC | 프로그램 종료 |
handle_key(keycode, render)
├── ESC → close_window()
├── H/TAB/Up/Down/= → handle_hud_keys()
├── W/X/A/D/Q/Z/E/C/S/1/3 → handle_camera_keys()
└── R/T/F/G/V/B/[/]/;/'/,/./Y/U/N/M/I/J/O/K/P/L → handle_transform_keys()
├── R/T/F/G/V/B → handle_object_move()
├── [/]/;/'/,/. → handle_light_move()
├── Y/U/N/M → handle_object_resize()
└── I/J/O/K/P/L → handle_object_rotate()
handle_key_release(keycode, render)
└── (no-op)
키 누름 시 디바운스 FSM이 LQ preview를 트리거하고 (50ms throttle), 150ms 입력 없으면 full quality 렌더링을 수행합니다.
close_window(render)
├── cleanup_all_bump_maps() // 범프맵 XPM 리소스 해제
├── render_destroy(render)
│ ├── hud_cleanup()
│ ├── keyguide_cleanup()
│ ├── pixel_timing_cleanup()
│ ├── mlx_context_destroy() // mlx_destroy_image + mlx_destroy_window
│ └── free(render)
├── scene_destroy(scene)
│ ├── object_list_destroy()
│ ├── bvh_destroy()
│ ├── free_shadow_offset_lut()
│ └── free(scene)
└── exit(0)