# 機能設計書 264-imgui_impl_dx10

## 概要

本ドキュメントは、Dear ImGuiのDirectX10レンダラーバックエンド（imgui_impl_dx10）の機能設計を定義する。

### 本機能の処理概要

DirectX10レンダラーバックエンドは、Dear ImGuiのUI描画コマンドをDirectX10のシェーダーベースAPIに変換し、画面にUIを描画する機能を提供する。Shader Model 4.0を使用したプログラマブルパイプラインでレンダリングを行う。

**業務上の目的・背景**：
DirectX10を使用するWindowsアプリケーションにDear ImGuiを統合する必要がある場合に本バックエンドを使用する。DirectX10はWindows Vista以降でサポートされ、シェーダーベースのパイプラインを使用する最初のDirectXバージョンである。

**機能の利用シーン**：
- DirectX10アプリケーションへのImGuiデバッグUI追加
- Windows Vista/7環境でのDirectX10使用アプリケーション

**主要な処理内容**：
1. バックエンドの初期化（`ImGui_ImplDX10_Init`）：デバイス取得、DXGIファクトリ取得
2. デバイスオブジェクト作成（`ImGui_ImplDX10_CreateDeviceObjects`）：シェーダーコンパイル（vs_4_0/ps_4_0）
3. フレーム開始処理（`ImGui_ImplDX10_NewFrame`）：デバイスオブジェクト確認
4. 描画データのレンダリング（`ImGui_ImplDX10_RenderDrawData`）：VB/IB更新、描画実行
5. テクスチャ更新（`ImGui_ImplDX10_UpdateTexture`）：テクスチャ/SRV作成・更新・破棄
6. バックエンドの終了処理（`ImGui_ImplDX10_Shutdown`）：リソース解放

**関連システム・外部連携**：
- プラットフォームバックエンド（Win32）と組み合わせて使用
- DirectX10ランタイム、D3DCompiler

**権限による制御**：
特になし

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| - | 全画面 | 主画面 | すべてのDear ImGuiウィジェットの描画出力先 |

## 機能種別

レンダリングバックエンド / グラフィックスAPI抽象化

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|-----------------|
| device | ID3D10Device* | Yes | Direct3D10デバイス | nullptr以外 |
| draw_data | ImDrawData* | Yes | 描画コマンドリスト | DisplaySize > 0 |
| tex | ImTextureData* | Yes | テクスチャデータ | Status確認必須 |

### 入力データソース

- ID3D10Deviceインスタンス
- ImDrawData構造体
- ImTextureData構造体

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| 初期化結果 | bool | Init関数の成功/失敗 |
| テクスチャID | ID3D10ShaderResourceView* | SRVとして使用 |
| 画面出力 | Direct3D10描画 | バックバッファへのUI描画結果 |

### 出力先

- Direct3D10バックバッファ
- io.BackendRendererUserData
- platform_io.Renderer_RenderState（コールバック用）

## 処理フロー

### 処理シーケンス

```
1. ImGui_ImplDX10_Init(device)
   ├─ DXGIファクトリ取得（QueryInterface経由）
   └─ デバイス参照カウント増加

2. ImGui_ImplDX10_CreateDeviceObjects()
   ├─ D3DCompileでシェーダーコンパイル（vs_4_0, ps_4_0）
   ├─ CreateVertexShader / CreatePixelShader
   ├─ CreateInputLayout
   ├─ CreateBuffer（定数バッファ）
   ├─ CreateBlendState
   ├─ CreateRasterizerState
   ├─ CreateDepthStencilState
   └─ CreateSamplerState（Linear/Nearest）

3. [毎フレーム] ImGui_ImplDX10_NewFrame()
   └─ シェーダー未作成なら CreateDeviceObjects()

4. [毎フレーム] ImGui_ImplDX10_RenderDrawData(draw_data)
   ├─ テクスチャ更新
   ├─ VB/IB作成・拡張
   ├─ VB/IB Map/Unmap（データアップロード）
   ├─ DX10状態のバックアップ
   ├─ SetupRenderState
   ├─ RenderState設定
   ├─ 描画コマンド実行（DrawIndexed）
   └─ DX10状態の復元

5. ImGui_ImplDX10_Shutdown()
   └─ InvalidateDeviceObjects
```

### フローチャート

```mermaid
flowchart TD
    A[Init] --> B[NewFrame]
    B --> C{Shader作成済み?}
    C -->|No| D[CreateDeviceObjects]
    C -->|Yes| E[RenderDrawData]
    D --> E
    E --> F[Update Textures]
    F --> G[Create/Map VB/IB]
    G --> H[Backup DX10 State]
    H --> I[SetupRenderState]
    I --> J[For each DrawList/DrawCmd]
    J --> K[RSSetScissorRects]
    K --> L[PSSetShaderResources]
    L --> M[DrawIndexed]
    M --> N[Restore DX10 State]
    N --> O[Shutdown]
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-001 | シェーダーモデル | Shader Model 4.0（vs_4_0/ps_4_0） | シェーダーコンパイル時 |
| BR-002 | テクスチャ形式 | DXGI_FORMAT_R8G8B8A8_UNORM | テクスチャ作成時 |
| BR-003 | 大規模メッシュ対応 | 64K頂点以上サポート | DrawIndexedのVtxOffset使用 |

### 計算ロジック

**正射影行列**（行121-131）:
```cpp
float mvp[4][4] = {
    { 2.0f/(R-L),   0.0f,           0.0f,       0.0f },
    { 0.0f,         2.0f/(T-B),     0.0f,       0.0f },
    { 0.0f,         0.0f,           0.5f,       0.0f },
    { (R+L)/(L-R),  (T+B)/(B-T),    0.5f,       1.0f },
};
```

## データベース操作仕様

該当なし

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| IM_ASSERT | 初期化エラー | 二重初期化 | 初期化状態確認 |
| FAILED(hr) | シェーダーコンパイル失敗 | D3DCompile失敗 | return false |
| < 0 | バッファ作成失敗 | CreateBuffer失敗 | return |

### リトライ仕様

リトライなし

## トランザクション仕様

該当なし

## パフォーマンス要件

- D3D10_USAGE_DYNAMIC使用によるMap/Unmapアクセス
- 状態のバックアップ・復元（BACKUP_DX10_STATE構造体）

## セキュリティ考慮事項

- デバイスポインタの検証

## 備考

- d3dcompiler.libと自動リンク（#pragma comment）
- ImGui_ImplDX10_RenderState構造体でコールバック用状態を公開

---

## コードリーディングガイド

### 推奨読解順序

#### Step 1: データ構造を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | imgui_impl_dx10.cpp | `backends/imgui_impl_dx10.cpp` | ImGui_ImplDX10_Data構造体（行68-87）を確認 |
| 1-2 | imgui_impl_dx10.cpp | `backends/imgui_impl_dx10.cpp` | ImGui_ImplDX10_Texture構造体（行62-66）を確認 |

**読解のコツ**: DX10ではテクスチャとSRVが分離しているため、ImGui_ImplDX10_Textureで両方を管理する。

#### Step 2: シェーダー処理を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | imgui_impl_dx10.cpp | `backends/imgui_impl_dx10.cpp` | CreateDeviceObjects関数（行409-576）を確認 |
| 2-2 | imgui_impl_dx10.cpp | `backends/imgui_impl_dx10.cpp` | 頂点シェーダーソース（行424-450）を確認 |
| 2-3 | imgui_impl_dx10.cpp | `backends/imgui_impl_dx10.cpp` | ピクセルシェーダーソース（行489-503）を確認 |

**主要処理フロー**:
- **行453**: D3DCompile with "vs_4_0"
- **行455**: CreateVertexShader
- **行462-467**: InputLayout作成
- **行506**: D3DCompile with "ps_4_0"
- **行508**: CreatePixelShader

#### Step 3: レンダリング処理を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | imgui_impl_dx10.cpp | `backends/imgui_impl_dx10.cpp` | RenderDrawData関数（行157-327）を確認 |
| 3-2 | imgui_impl_dx10.cpp | `backends/imgui_impl_dx10.cpp` | SetupRenderState関数（行102-154）を確認 |

**主要処理フロー**:
- **行173-199**: VB/IB作成・拡張
- **行201-214**: Map/Unmap
- **行216-256**: BACKUP_DX10_STATE構造体による状態バックアップ
- **行303**: DrawIndexed

### プログラム呼び出し階層図

```
アプリケーション
    │
    ├─ ImGui_ImplDX10_Init(device)
    │      ├─ QueryInterface(IDXGIDevice)
    │      ├─ GetParent(IDXGIAdapter)
    │      └─ GetParent(IDXGIFactory)
    │
    ├─ [フレームループ]
    │      │
    │      ├─ ImGui_ImplDX10_NewFrame()
    │      │      └─ ImGui_ImplDX10_CreateDeviceObjects()
    │      │             ├─ D3DCompile() [vs_4_0, ps_4_0]
    │      │             ├─ CreateVertexShader()
    │      │             ├─ CreatePixelShader()
    │      │             ├─ CreateInputLayout()
    │      │             ├─ CreateBuffer() [定数バッファ]
    │      │             ├─ CreateBlendState()
    │      │             ├─ CreateRasterizerState()
    │      │             ├─ CreateDepthStencilState()
    │      │             └─ CreateSamplerState()
    │      │
    │      └─ ImGui_ImplDX10_RenderDrawData()
    │             ├─ ImGui_ImplDX10_UpdateTexture()
    │             ├─ pVB->Map() / pIB->Map()
    │             ├─ ImGui_ImplDX10_SetupRenderState()
    │             ├─ DrawIndexed()
    │             └─ [状態復元]
    │
    └─ ImGui_ImplDX10_Shutdown()
           └─ ImGui_ImplDX10_InvalidateDeviceObjects()
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| imgui_impl_dx10.h | `backends/imgui_impl_dx10.h` | ヘッダー | 公開API宣言、RenderState構造体 |
| imgui_impl_dx10.cpp | `backends/imgui_impl_dx10.cpp` | ソース | バックエンド実装本体（666行） |
| d3d10.h / d3d10_1.h | システム | ヘッダー | DirectX10 API宣言 |
| d3dcompiler.h | システム | ヘッダー | シェーダーコンパイラ |
