# Dear ImGui

## 概要

Dear ImGuiは、C++向けの軽量でブロートフリーなグラフィカルユーザーインターフェース（GUI）ライブラリです。ゲームエンジン、リアルタイム3Dアプリケーション、組み込みアプリケーション向けに設計されており、開発者がコンテンツ作成ツールやデバッグ/可視化ツールを迅速に構築できるようサポートします。Immediate Mode GUI（IMGUI）パラダイムを採用し、状態の同期や保持を最小限に抑えたシンプルな設計が特徴です。

## 主な機能

| 機能カテゴリ | 説明 |
| --- | --- |
| ウィンドウ管理 | 移動可能・リサイズ可能なウィンドウの作成、メニューバー、スクロール領域のサポート |
| 入力ウィジェット | テキスト入力、スライダー、ボタン、チェックボックス、カラーピッカーなど多数のUI要素 |
| テーブル・リスト | BeginTable/EndTableによる高度なテーブルレイアウト、リストクリッパーによる大量データの効率的表示 |
| 描画システム | 頂点バッファとコマンドリストによる効率的なレンダリング、クリッピング、テクスチャ管理 |
| フォント管理 | TrueType/OpenTypeフォントのサポート、FreeType連携、動的フォントスケーリング |
| マルチプラットフォーム | Windows、macOS、Linux、iOS、Android、Webブラウザ（Emscripten）対応 |
| バックエンドシステム | 多数のグラフィックスAPIとプラットフォームに対応したバックエンドを提供 |
| デバッグツール | メトリクスウィンドウ、デモウィンドウ、IDスタックツールなどの開発支援機能 |

## 技術スタック

### コア

- 言語: C++ (C++11以降)
- アーキテクチャ: Immediate Mode GUI (IMGUI) パラダイム
- 外部依存: なし（自己完結型）

### 主要ライブラリ

- stb_truetype.h: TrueTypeフォントラスタライザ（組み込み）
- stb_textedit.h: テキスト編集（組み込み）
- stb_rect_pack.h: 矩形パッキング（組み込み）
- FreeType: オプションのフォントローダー（misc/freetype/）

## ディレクトリ構成

```
imgui-master/
├── imgui.h                    # メインヘッダー（エンドユーザーAPI）
├── imgui.cpp                  # コア実装
├── imgui_demo.cpp             # デモウィンドウ実装
├── imgui_draw.cpp             # 描画関連実装
├── imgui_tables.cpp           # テーブル機能実装
├── imgui_widgets.cpp          # ウィジェット実装
├── imgui_internal.h           # 内部API（上級者向け）
├── imconfig.h                 # コンパイル時設定
├── imstb_truetype.h           # stb_truetype（組み込み）
├── imstb_textedit.h           # stb_textedit（組み込み）
├── imstb_rectpack.h           # stb_rect_pack（組み込み）
├── backends/                  # プラットフォーム/レンダラーバックエンド
│   ├── imgui_impl_glfw.cpp/.h     # GLFW プラットフォーム
│   ├── imgui_impl_sdl2.cpp/.h     # SDL2 プラットフォーム
│   ├── imgui_impl_sdl3.cpp/.h     # SDL3 プラットフォーム
│   ├── imgui_impl_win32.cpp/.h    # Win32 プラットフォーム
│   ├── imgui_impl_opengl3.cpp/.h  # OpenGL3/ES/WebGL レンダラー
│   ├── imgui_impl_vulkan.cpp/.h   # Vulkan レンダラー
│   ├── imgui_impl_dx11.cpp/.h     # DirectX11 レンダラー
│   ├── imgui_impl_dx12.cpp/.h     # DirectX12 レンダラー
│   ├── imgui_impl_metal.mm/.h     # Metal レンダラー
│   └── ...                        # その他多数のバックエンド
├── examples/                  # サンプルアプリケーション
│   ├── example_glfw_opengl3/      # GLFW + OpenGL3
│   ├── example_sdl2_opengl3/      # SDL2 + OpenGL3
│   ├── example_win32_directx11/   # Win32 + DirectX11
│   └── ...                        # 20以上のサンプル
├── docs/                      # ドキュメント
│   ├── README.md                  # メインドキュメント
│   ├── BACKENDS.md                # バックエンドガイド
│   ├── EXAMPLES.md                # サンプル説明
│   ├── FAQ.md                     # よくある質問
│   ├── FONTS.md                   # フォント設定ガイド
│   └── CHANGELOG.txt              # 変更履歴
└── misc/                      # その他ユーティリティ
    ├── cpp/                       # C++標準ライブラリ連携
    ├── fonts/                     # サンプルフォント
    ├── freetype/                  # FreeType連携
    └── debuggers/                 # デバッガ支援ファイル
```

## セットアップ

### 必要条件

- C++11以降に対応したコンパイラ
- グラフィックスAPI（OpenGL、DirectX、Vulkan、Metal等）
- プラットフォームライブラリ（GLFW、SDL、Win32 API等）

### インストール手順

1. **ソースファイルの追加**:
   ルートフォルダの `imgui*.cpp`, `imgui*.h` ファイルをプロジェクトに追加

2. **バックエンドの選択と追加**:
   `backends/` フォルダから必要なバックエンドファイルを追加
   - プラットフォームバックエンド1つ（例: `imgui_impl_glfw.cpp/.h`）
   - レンダラーバックエンド1つ（例: `imgui_impl_opengl3.cpp/.h`）

3. **基本的な統合コード**:
   ```cpp
   // 初期化時
   ImGui::CreateContext();
   ImGui_ImplXXXX_Init(...);  // 各バックエンドの初期化

   // フレームの開始時
   ImGui_ImplXXXX_NewFrame();
   ImGui::NewFrame();

   // フレームの終了時
   ImGui::Render();
   ImGui_ImplXXXX_RenderDrawData(ImGui::GetDrawData());

   // シャットダウン時
   ImGui_ImplXXXX_Shutdown();
   ImGui::DestroyContext();
   ```

## 開発

### デモの実行

```cpp
// 任意の場所でデモウィンドウを表示
ImGui::ShowDemoWindow();
```

### サンプルのビルド

各サンプルディレクトリには以下のビルドファイルが含まれます:
- `Makefile`: Linux/macOS向け
- `build_win32.bat`: Windows (Visual Studio)向け
- `.vcxproj`: Visual Studio プロジェクト
- Xcode プロジェクト: Apple プラットフォーム向け

### 推奨バックエンド

| プラットフォーム | 推奨バックエンド |
| --- | --- |
| クロスプラットフォーム | SDL3 + SDL_GPU または GLFW + OpenGL3 |
| Windows | Win32 + DirectX11/12 |
| macOS/iOS | SDL3/GLFW + Metal |
| Web | GLFW/SDL + OpenGL3 (Emscripten) または WebGPU |

### 設定のカスタマイズ

`imconfig.h` を編集するか、ビルドシステムで `IMGUI_USER_CONFIG` マクロを定義してカスタム設定ファイルを指定:

```cpp
// 例: imconfig.h での設定
#define IMGUI_ENABLE_FREETYPE           // FreeTypeを使用
#define IMGUI_USE_WCHAR32               // Unicodeの拡張サポート
#define IMGUI_DEFINE_MATH_OPERATORS     // ImVec2/ImVec4の数学演算子
```
