# Dear ImGui コードリーディングガイドライン

## はじめに

このガイドラインは、Dear ImGuiのコードベースを効率的に理解するための手引きです。
C++に精通していないエンジニアでも、段階的に学習できるよう構成されています。

**対象読者:**
- プロジェクトに新規参画するエンジニア
- 他言語からの経験者
- コードレビューを行う担当者

**プロジェクト概要:**
Dear ImGuiは、C++向けの軽量なImmediate Mode GUI（IMGUI）ライブラリです。ゲームエンジン、ツール、デバッガーなどの開発者向けUI構築に特化しており、プラットフォーム非依存で高いパフォーマンスを実現しています。

---

## 1. 言語基礎

> このセクションでは、C++の基本構文とDear ImGuiで使用される概念を解説します。

### 1.1 プログラム構造

Dear ImGuiはヘッダーファイル（.h）と実装ファイル（.cpp）のペアで構成されています。主要なヘッダーとして`imgui.h`があり、全ての公開APIを定義しています。

```cpp
// imgui.h:61-68
#pragma once

// Configuration file with compile-time options
#ifdef IMGUI_USER_CONFIG
#include IMGUI_USER_CONFIG
#endif
#include "imconfig.h"
```

### 1.2 データ型と変数

Dear ImGuiは独自のスカラーデータ型を定義しています。これらはプラットフォーム間の互換性を保証します。

```cpp
// imgui.h:159-168
// Scalar data types
typedef unsigned int        ImGuiID;// A unique ID used by widgets
typedef signed char         ImS8;   // 8-bit signed integer
typedef unsigned char       ImU8;   // 8-bit unsigned integer
typedef signed short        ImS16;  // 16-bit signed integer
typedef unsigned short      ImU16;  // 16-bit unsigned integer
typedef signed int          ImS32;  // 32-bit signed integer == int
typedef unsigned int        ImU32;  // 32-bit unsigned integer (often used for packed colors)
typedef signed   long long  ImS64;  // 64-bit signed integer
typedef unsigned long long  ImU64;  // 64-bit unsigned integer
```

2Dベクトル（位置やサイズ）用の構造体:

```cpp
// imgui.h:295-305
struct ImVec2
{
    float                                   x, y;
    constexpr ImVec2()                      : x(0.0f), y(0.0f) { }
    constexpr ImVec2(float _x, float _y)    : x(_x), y(_y) { }
    float& operator[] (size_t idx)          { IM_ASSERT(idx == 0 || idx == 1); return ((float*)(void*)(char*)this)[idx]; }
    float  operator[] (size_t idx) const    { IM_ASSERT(idx == 0 || idx == 1); return ((const float*)(const void*)(const char*)this)[idx]; }
#ifdef IM_VEC4_CLASS_EXTRA
    IM_VEC4_CLASS_EXTRA
#endif
};
```

### 1.3 制御構造

Dear ImGuiのAPI設計は「即時モード」パラダイムに基づいており、条件分岐を活用したUI構築が特徴です。

```cpp
// imgui.cpp:51-57（使用例）
ImGui::Text("Hello, world %d", 123);
if (ImGui::Button("Save"))
    MySaveFunction();
ImGui::InputText("string", buf, IM_COUNTOF(buf));
ImGui::SliderFloat("float", &f, 0.0f, 1.0f);
```

### 1.4 関数/メソッド定義

ImGui名前空間内で関数が定義されます。APIエクスポートマクロ`IMGUI_API`を使用しています。

```cpp
// imgui.h:392-404
namespace ImGui
{
    // Context creation and access
    IMGUI_API ImGuiContext* CreateContext(ImFontAtlas* shared_font_atlas = NULL);
    IMGUI_API void          DestroyContext(ImGuiContext* ctx = NULL);
    IMGUI_API ImGuiContext* GetCurrentContext();
    IMGUI_API void          SetCurrentContext(ImGuiContext* ctx);

    // Main
    IMGUI_API ImGuiIO&      GetIO();
    IMGUI_API ImGuiPlatformIO& GetPlatformIO();
    IMGUI_API ImGuiStyle&   GetStyle();
    IMGUI_API void          NewFrame();
```

### 1.5 モジュール/インポート

Dear ImGuiはシンプルなインクルードシステムを使用しています。

```cpp
// 使用例（examples/example_glfw_opengl3/main.cpp:10-12）
#include "imgui.h"
#include "imgui_impl_glfw.h"
#include "imgui_impl_opengl3.h"
```

設定カスタマイズには`imconfig.h`を編集するか、`IMGUI_USER_CONFIG`マクロを定義します。

---

## 2. プロジェクト固有の概念

> このセクションでは、Dear ImGui特有の概念を解説します。

### 2.1 Immediate Mode GUI（IMGUI）パラダイム

Dear ImGuiは「Immediate Mode」パラダイムを採用しています。従来の「Retained Mode」GUIとは異なり、UIの状態を保持せず、毎フレームUIを再構築します。

**特徴:**
- 状態の同期が不要
- コードとUIが直接対応
- デバッグが容易

```cpp
// imgui.cpp:206-217
// - Your code creates the UI every frame of your application loop, if your code doesn't run the UI is gone!
//   The UI can be highly dynamic, there are no construction or destruction steps, less superfluous
//   data retention on your side, less state duplication, less state synchronization, fewer bugs.
```

### 2.2 Begin/Endパターン

ウィンドウ、メニュー、ツリーなどのスコープ付き要素は`Begin`/`End`ペアで管理されます。

```cpp
// imgui.h:423-436
// - Begin() = push window to the stack and start appending to it. End() = pop window from the stack.
// - Passing 'bool* p_open != NULL' shows a window-closing widget in the upper-right corner of the window
// - Begin() return false to indicate the window is collapsed or fully clipped
// - Always call a matching End() for each Begin() call, regardless of its return value!
IMGUI_API bool          Begin(const char* name, bool* p_open = NULL, ImGuiWindowFlags flags = 0);
IMGUI_API void          End();
```

### 2.3 IDスタックシステム

ウィジェットの一意性を保証するためのIDスタックシステムがあります。

```cpp
// imgui.h:592-611
// - Short version: ID are hashes of the entire ID stack. If you are creating widgets in a loop you most likely
//   want to push a unique identifier (e.g. object pointer, loop index) to uniquely differentiate them.
// - You can also use the "Label##foobar" syntax within widget label to distinguish them from each others.
IMGUI_API void          PushID(const char* str_id);
IMGUI_API void          PushID(const void* ptr_id);
IMGUI_API void          PushID(int int_id);
IMGUI_API void          PopID();
```

### 2.4 バックエンドアーキテクチャ

Dear ImGuiはコアライブラリとバックエンドを分離しています。

**バックエンドの種類:**
1. **Platform Backend**: 入力（マウス/キーボード）、ウィンドウ管理
2. **Renderer Backend**: テクスチャ作成、描画コマンドの実行

```cpp
// backends/imgui_impl_glfw.cpp + backends/imgui_impl_opengl3.cpp の組み合わせ例
// examples/example_glfw_opengl3/main.cpp:97-102
ImGui_ImplGlfw_InitForOpenGL(window, true);
ImGui_ImplOpenGL3_Init(glsl_version);
```

---

## 3. 命名規則

> このセクションでは、プロジェクト全体で使用される命名規則を解説します。

### 3.1 ファイル・ディレクトリ命名

| パターン | 意味 | 例 |
|---------|------|-----|
| `imgui_*.cpp/h` | コア機能の実装ファイル | `imgui_widgets.cpp`, `imgui_draw.cpp` |
| `imgui_impl_*.cpp/h` | バックエンド実装 | `imgui_impl_glfw.cpp`, `imgui_impl_opengl3.cpp` |
| `imstb_*.h` | STBライブラリの組み込みコピー | `imstb_truetype.h`, `imstb_rectpack.h` |
| `imconfig.h` | ユーザー設定ファイル | `imconfig.h` |

### 3.2 クラス・関数・変数命名

| プレフィックス/サフィックス | 意味 | 例 |
|---------------------------|------|-----|
| `Im` | ImGui固有の型 | `ImVec2`, `ImGuiID`, `ImU32` |
| `ImGui` | ImGui構造体/列挙型 | `ImGuiContext`, `ImGuiIO`, `ImGuiStyle` |
| `ImDraw` | 描画関連 | `ImDrawList`, `ImDrawCmd`, `ImDrawVert` |
| `ImFont` | フォント関連 | `ImFont`, `ImFontAtlas`, `ImFontGlyph` |
| `IMGUI_API` | パブリックAPI関数 | `IMGUI_API void NewFrame()` |
| `IM_` | マクロ定義 | `IM_ASSERT`, `IM_COUNTOF` |
| `_` (先頭) | 内部/プライベートメンバー | `_TexData`, `_TexID` |
| `Flags` (末尾) | フラグ型 | `ImGuiWindowFlags`, `ImGuiTreeNodeFlags` |

### 3.3 セクション構成

各ファイルはセクションコメントで構造化されています。

```cpp
// imgui.cpp:46-102
// [SECTION] INCLUDES
// [SECTION] FORWARD DECLARATIONS
// [SECTION] CONTEXT AND MEMORY ALLOCATORS
// [SECTION] USER FACING STRUCTURES (ImGuiStyle, ImGuiIO, ImGuiPlatformIO)
// [SECTION] MISC HELPERS/UTILITIES
// ...
```

---

## 4. ディレクトリ構造

> このセクションでは、プロジェクトのディレクトリ構造を解説します。

```
imgui-master/
├── imgui.h                    # 主要公開API
├── imgui.cpp                  # コア実装（約95万行）
├── imgui_internal.h           # 内部API（拡張用）
├── imgui_widgets.cpp          # ウィジェット実装
├── imgui_draw.cpp             # 描画・フォント実装
├── imgui_tables.cpp           # テーブル機能実装
├── imgui_demo.cpp             # デモウィンドウ実装
├── imconfig.h                 # コンパイル時設定
├── imstb_*.h                  # STBライブラリ
├── backends/                  # プラットフォーム/レンダラバックエンド
│   ├── imgui_impl_glfw.*      # GLFW用Platform Backend
│   ├── imgui_impl_sdl2.*      # SDL2用Platform Backend
│   ├── imgui_impl_win32.*     # Win32用Platform Backend
│   ├── imgui_impl_opengl3.*   # OpenGL3用Renderer Backend
│   ├── imgui_impl_vulkan.*    # Vulkan用Renderer Backend
│   └── ...
├── examples/                  # サンプルアプリケーション
│   ├── example_glfw_opengl3/
│   ├── example_sdl2_vulkan/
│   └── ...
├── misc/                      # 追加ユーティリティ
│   ├── cpp/                   # std::string対応ヘルパー
│   ├── fonts/                 # サンプルフォント
│   ├── freetype/              # FreeType統合
│   └── debuggers/             # デバッガ補助ファイル
└── docs/                      # ドキュメント
    ├── FAQ.md
    ├── BACKENDS.md
    └── FONTS.md
```

### 各ディレクトリの役割

| ディレクトリ | 役割 | 主要ファイル |
|-------------|------|-------------|
| `/` (ルート) | コアライブラリ | `imgui.h`, `imgui.cpp`, `imgui_*.cpp` |
| `backends/` | プラットフォーム・レンダラ統合 | `imgui_impl_*.cpp/h` |
| `examples/` | サンプルアプリケーション | `main.cpp`, `Makefile` |
| `misc/cpp/` | C++標準ライブラリ対応 | `imgui_stdlib.h/cpp` |
| `misc/fonts/` | フォントファイル | `Roboto-Medium.ttf`, `ProggyClean.ttf` |
| `misc/freetype/` | FreeType統合 | `imgui_freetype.cpp/h` |
| `docs/` | ドキュメント | `FAQ.md`, `BACKENDS.md` |

---

## 5. アーキテクチャ

> このセクションでは、プロジェクトのアーキテクチャパターンを解説します。

### 5.1 全体アーキテクチャ

Dear ImGuiはレイヤードアーキテクチャを採用しています。

```
┌─────────────────────────────────────────────────────────┐
│                  ユーザーアプリケーション                 │
├─────────────────────────────────────────────────────────┤
│                    ImGui Public API                     │
│        (imgui.h: CreateContext, Begin, Button, etc.)    │
├─────────────────────────────────────────────────────────┤
│                   ImGui Core Layer                      │
│   (imgui.cpp, imgui_widgets.cpp, imgui_draw.cpp, etc.)  │
├──────────────────────┬──────────────────────────────────┤
│   Platform Backend   │       Renderer Backend           │
│  (imgui_impl_glfw)   │    (imgui_impl_opengl3)          │
├──────────────────────┴──────────────────────────────────┤
│              OS / Graphics API                          │
│         (GLFW/SDL/Win32 + OpenGL/Vulkan/DX)             │
└─────────────────────────────────────────────────────────┘
```

### 5.2 レイヤー構成

| レイヤー | 責務 | 代表的なファイル |
|---------|------|-----------------|
| Public API | ユーザー向け関数/型の定義 | `imgui.h` |
| Core Implementation | ウィジェット、描画、レイアウト | `imgui.cpp`, `imgui_widgets.cpp` |
| Internal API | 内部構造、拡張用API | `imgui_internal.h` |
| Platform Backend | 入力、ウィンドウ、クリップボード | `imgui_impl_glfw.cpp` |
| Renderer Backend | テクスチャ、描画コマンド実行 | `imgui_impl_opengl3.cpp` |

### 5.3 データフロー

```
[ユーザー入力] → [Platform Backend] → [ImGuiIO]
                                         ↓
[ユーザーコード] → [ImGui API] → [ImGuiContext]
                                         ↓
                               [ImDrawList/ImDrawData]
                                         ↓
                              [Renderer Backend] → [GPU描画]
```

**フレームサイクル:**
1. `NewFrame()`: フレーム開始、入力処理
2. UIコード実行: `Begin()`, `Button()`, `End()` など
3. `Render()`: 描画データ生成
4. `ImGui_ImplXXX_RenderDrawData()`: GPU描画

---

## 6. 主要コンポーネント

> このセクションでは、主要なコンポーネントとその連携を解説します。

### 6.1 エントリーポイント

アプリケーションの典型的な初期化フロー:

```cpp
// examples/example_glfw_opengl3/main.cpp:81-102
// Setup Dear ImGui context
IMGUI_CHECKVERSION();
ImGui::CreateContext();
ImGuiIO& io = ImGui::GetIO(); (void)io;
io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard;
io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad;

// Setup Dear ImGui style
ImGui::StyleColorsDark();

// Setup Platform/Renderer backends
ImGui_ImplGlfw_InitForOpenGL(window, true);
ImGui_ImplOpenGL3_Init(glsl_version);
```

### 6.2 コアウィジェット

ウィジェットは`imgui_widgets.cpp`に実装されています。

```cpp
// imgui_widgets.cpp:7-31 - セクション索引
// [SECTION] Widgets: Text, etc.
// [SECTION] Widgets: Main (Button, Image, Checkbox, RadioButton, ProgressBar, Bullet, etc.)
// [SECTION] Widgets: ComboBox
// [SECTION] Widgets: DragScalar, DragFloat, DragInt, etc.
// [SECTION] Widgets: SliderScalar, SliderFloat, SliderInt, etc.
// [SECTION] Widgets: InputText, InputTextMultiline
// [SECTION] Widgets: ColorEdit, ColorPicker, ColorButton, etc.
// [SECTION] Widgets: TreeNode, CollapsingHeader, etc.
// [SECTION] Widgets: Selectable
// [SECTION] Widgets: MenuItem, BeginMenu, EndMenu, etc.
// [SECTION] Widgets: BeginTabBar, EndTabBar, etc.
```

### 6.3 描画システム

描画は`ImDrawList`を通じて行われます。

```cpp
// imgui_draw.cpp:6-26 - セクション索引
// [SECTION] STB libraries implementation
// [SECTION] Style functions
// [SECTION] ImDrawList
// [SECTION] ImTriangulator, ImDrawList concave polygon fill
// [SECTION] ImDrawListSplitter
// [SECTION] ImDrawData
// [SECTION] ImFontConfig
// [SECTION] ImFontAtlas, ImFontAtlasBuilder
```

### 6.4 テーブル機能

テーブルは`imgui_tables.cpp`に実装されています。

```cpp
// imgui_tables.cpp:36-71 - 典型的なテーブルコールフロー
// - BeginTable()                               user begin into a table
// - TableSetupColumn()                         user submit columns details
// - TableSetupScrollFreeze()                   user submit scroll freeze information
// - TableHeadersRow() or TableHeader()         user submit a headers row
// - TableNextRow()                             user begin into a new row
// - TableSetColumnIndex() / TableNextColumn()  user begin into a cell
// - EndTable()                                 user ends the table
```

---

## 7. よく使われるパターン

> このセクションでは、コード内で頻出するパターンを解説します。

### パターン一覧

| パターン | 説明 | 出現頻度 | 代表的なファイル |
|---------|------|---------|-----------------|
| Begin/End | スコープ付き要素の開始/終了 | 高 | `imgui.h` |
| Push/Pop | スタック操作（スタイル、ID） | 高 | `imgui.h` |
| フラグ組み合わせ | ビット演算によるオプション指定 | 高 | 全ファイル |
| コールバック | ユーザー定義処理の注入 | 中 | `imgui.h` |

### 各パターンの詳細

#### パターン1: Begin/Endパターン

**目的:** スコープ付きUI要素の管理

**実装例:**
```cpp
// imgui.h:423-436
IMGUI_API bool          Begin(const char* name, bool* p_open = NULL, ImGuiWindowFlags flags = 0);
IMGUI_API void          End();

// 使用例
if (ImGui::Begin("My Window"))
{
    ImGui::Text("Content here");
}
ImGui::End(); // Begin()の戻り値に関わらず必ず呼ぶ
```

**解説:** ウィンドウ、メニュー、ツリーノードなどで使用。必ずペアで呼び出す必要があります。

#### パターン2: Push/Popパターン

**目的:** 一時的なスタイル/状態の変更

**実装例:**
```cpp
// imgui.h:528-537
IMGUI_API void          PushStyleColor(ImGuiCol idx, ImU32 col);
IMGUI_API void          PopStyleColor(int count = 1);
IMGUI_API void          PushStyleVar(ImGuiStyleVar idx, float val);
IMGUI_API void          PopStyleVar(int count = 1);

// 使用例
ImGui::PushStyleColor(ImGuiCol_Button, ImVec4(1,0,0,1));
ImGui::Button("Red Button");
ImGui::PopStyleColor();
```

#### パターン3: フラグ組み合わせ

**目的:** 複数オプションの同時指定

**実装例:**
```cpp
// imgui.h:246-268
typedef int ImGuiWindowFlags;       // -> enum ImGuiWindowFlags_
typedef int ImGuiTreeNodeFlags;     // -> enum ImGuiTreeNodeFlags_

// 使用例
ImGui::Begin("Window", NULL, ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoResize);
```

---

## 8. 業務フロー追跡の実践例

> このセクションでは、実際の業務フローをコードで追跡する方法を解説します。

### 8.1 フロー追跡の基本手順

1. エントリーポイントを特定
2. 処理の流れを追跡（呼び出し関係を追う）
3. データの変換を確認
4. 最終的な出力を確認

### 8.2 フロー追跡の実例

#### 例1: ボタンクリック処理フロー

**概要:** ユーザーがボタンをクリックしてから処理が実行されるまでの流れ

**処理フロー:**
```
ImGui::Button() → ButtonBehavior() → IsMouseClicked() → 戻り値true → ユーザー処理実行
```

**詳細な追跡:**

1. **ボタン呼び出し** (`imgui.h:632`)
   ```cpp
   IMGUI_API bool          Button(const char* label, const ImVec2& size = ImVec2(0, 0));
   ```

2. **内部でButtonBehaviorを呼び出し** (`imgui_widgets.cpp`内)
   - マウス位置のチェック
   - クリック状態の判定
   - ホバー状態の更新

3. **戻り値の判定** (ユーザーコード)
   ```cpp
   if (ImGui::Button("Save"))
       MySaveFunction();  // trueの場合のみ実行
   ```

#### 例2: フレームレンダリングフロー

**概要:** 1フレームの描画サイクル

**処理フロー:**
```
NewFrame() → [UIコード] → Render() → GetDrawData() → RenderDrawData()
```

**詳細な追跡:**

1. **フレーム開始** (`imgui.cpp`)
   ```cpp
   ImGui::NewFrame();  // 入力処理、内部状態リセット
   ```

2. **UI構築** (ユーザーコード)
   ```cpp
   ImGui::Begin("Window");
   ImGui::Text("Hello");
   ImGui::End();
   ```

3. **描画データ生成** (`imgui.cpp`)
   ```cpp
   ImGui::Render();
   ImDrawData* draw_data = ImGui::GetDrawData();
   ```

4. **GPU描画** (バックエンド)
   ```cpp
   ImGui_ImplOpenGL3_RenderDrawData(draw_data);
   ```

### 8.3 フロー追跡チェックリスト

- [ ] エントリーポイントを特定したか
- [ ] 呼び出し関係を把握したか
- [ ] データの変換ポイントを確認したか
- [ ] エラーハンドリングを確認したか
- [ ] 最終的な出力を確認したか

---

## 9. 設計書の参照順序

> このセクションでは、プロジェクト理解のための設計書参照順序を案内します。

### 9.1 目的別ロードマップ

#### 全体像を把握したい場合
1. `docs/README.md` - プロジェクト概要
2. `imgui.h` - 公開API一覧（コメントが充実）
3. `imgui_demo.cpp` - 全機能のデモ

#### 特定機能を理解したい場合
1. `imgui.h` - 該当関数の宣言とコメント
2. `imgui_demo.cpp` - 使用例を検索
3. 対応する実装ファイル（`imgui_widgets.cpp`など）

#### バックエンド統合を行う場合
1. `docs/BACKENDS.md` - バックエンド概要
2. `docs/EXAMPLES.md` - サンプル説明
3. `examples/` - 具体的な統合例

#### 改修作業を行う場合
1. `imgui_internal.h` - 内部API
2. 対象機能の実装ファイル
3. `imgui_demo.cpp` - テスト用コード

### 9.2 ドキュメント一覧

| ドキュメント | 概要 | 参照タイミング |
|-------------|------|---------------|
| `docs/README.md` | プロジェクト概要、クイックスタート | 初回 |
| `docs/FAQ.md` | よくある質問と回答 | 問題発生時 |
| `docs/BACKENDS.md` | バックエンド実装ガイド | 統合作業時 |
| `docs/FONTS.md` | フォント設定ガイド | フォント設定時 |
| `docs/EXAMPLES.md` | サンプル説明 | 学習時 |
| `imgui_demo.cpp` | 全機能デモ（ソースコード） | 常時参照 |

---

## 10. トラブルシューティング

> このセクションでは、コードリーディング時によくある問題と解決法を解説します。

### よくある疑問と回答

#### Q: ウィジェットが反応しない
A: IDの重複が原因の可能性があります。`PushID()`でユニークなIDを付与するか、`##`構文を使用してください。
```cpp
// imgui.h:598-601
// - "Q: Why is my widget not reacting when I click on it?"
// - Short version: ID are hashes of the entire ID stack.
```

#### Q: Begin()の戻り値を無視してよいか
A: `End()`は必ず呼ぶ必要がありますが、戻り値がfalseの場合は中のウィジェットをスキップできます。
```cpp
// imgui.h:429-433
// - Begin() return false to indicate the window is collapsed or fully clipped
// - Always call a matching End() for each Begin() call, regardless of its return value!
```

#### Q: 内部実装を拡張したい
A: `imgui_internal.h`をインクルードしてください。ただし、将来の互換性は保証されません。
```cpp
// imgui_internal.h:1-4
// You may use this file to debug, understand or extend Dear ImGui features
// but we don't provide any guarantee of forward compatibility.
```

### デバッグのヒント

1. **デモウィンドウの活用**: `ImGui::ShowDemoWindow()`を常に有効にしておく
2. **メトリクスウィンドウ**: `ImGui::ShowMetricsWindow()`で内部状態を確認
3. **IDスタックツール**: `ImGui::ShowIDStackToolWindow()`でID問題をデバッグ
4. **アサート確認**: `IM_ASSERT`のメッセージを確認（重要なエラー情報が含まれる）

---

## 付録

### A. 用語集

| 用語 | 説明 |
|-----|------|
| IMGUI | Immediate Mode GUI - 毎フレームUIを再構築するパラダイム |
| Context | ImGuiの全ての状態を保持する構造体 |
| DrawList | 描画コマンドのリスト |
| DrawData | レンダリング用に最終化された描画データ |
| Backend | プラットフォーム/レンダラ固有の実装 |
| Widget | UI要素（ボタン、スライダーなど） |
| Viewport | 描画領域（ウィンドウ） |

### B. ファイル一覧

| ファイル/ディレクトリ | 説明 | 主な内容 |
|---------------------|------|---------|
| `imgui.h` | 公開API定義 | 全ての公開関数、構造体、列挙型 |
| `imgui.cpp` | コア実装 | コンテキスト管理、ウィンドウ、入力 |
| `imgui_internal.h` | 内部API | 拡張用の内部構造体、関数 |
| `imgui_widgets.cpp` | ウィジェット | ボタン、スライダー、入力など |
| `imgui_draw.cpp` | 描画 | ImDrawList、フォント |
| `imgui_tables.cpp` | テーブル | テーブルレイアウト機能 |
| `imgui_demo.cpp` | デモ | 全機能のデモコード |
| `imconfig.h` | 設定 | コンパイル時オプション |
| `backends/` | バックエンド | プラットフォーム/レンダラ統合 |

### C. 参考資料

- [Dear ImGui公式リポジトリ](https://github.com/ocornut/imgui)
- [Dear ImGui Wiki](https://github.com/ocornut/imgui/wiki)
- [オンラインデモ](https://pthom.github.io/imgui_manual_online/manual/imgui_manual.html)
- [IMGUIパラダイムについて](https://github.com/ocornut/imgui/wiki#about-the-imgui-paradigm)
- [Dear ImGui FAQ](https://dearimgui.com/faq)
