# 画面設計書 111-GpuDemo

## 概要

本ドキュメントは、GpuInteropサンプルアプリケーションにおけるGPU相互運用デモの表示コントロール「GpuDemo」の画面設計書である。このコントロールは、OpenGLおよびVulkanを使用した3Dグラフィックスレンダリングの相互運用性をデモンストレーションするために設計されている。

### 本画面の処理概要

この画面は、GPU APIを用いた3Dレンダリングのデモを行うユーザーコントロールである。ユーザーは、スライダーを操作することで3Dオブジェクトの回転角度（Yaw、Pitch、Roll）をリアルタイムで制御できる。

**業務上の目的・背景**：Avaloniaフレームワークにおいて、OpenGLやVulkanなどの低レベルGPU APIとの相互運用機能をデモンストレーションすることが目的である。開発者がAvaloniaアプリケーション内でカスタムGPUレンダリングを実装する際の参考実装として提供されている。グラフィックス集約型アプリケーション（ゲーム、3Dモデリングツール、科学可視化等）の開発において、Avaloniaが高度なグラフィックス機能をサポートすることを示している。

**画面へのアクセス方法**：GpuInteropサンプルアプリケーションを起動すると、MainWindowのContentとしてGpuDemoコントロールが自動的に表示される。起動時のDemoTypeパラメータ（Vulkan/D3D11）により、使用するGPU APIが決定される。

**主要な操作・処理内容**：
1. Yawスライダーの操作：3Dオブジェクトのヨー角（Y軸周りの回転）を0〜10の範囲で調整
2. Pitchスライダーの操作：3Dオブジェクトのピッチ角（X軸周りの回転）を0〜10の範囲で調整
3. Rollスライダーの操作：3Dオブジェクトのロール角（Z軸周りの回転）を0〜10の範囲で調整
4. Discoスライダーの操作（表示時）：特殊効果の強度を0〜1の範囲で調整
5. 3Dレンダリングの表示：バックエンド（Vulkan/D3D11）による3D描画結果をリアルタイムで表示

**画面遷移**：
- 遷移元：GpuInterop MainWindow（No.110）から直接表示される
- 遷移先：なし（単一コントロールとして動作）

**権限による表示制御**：特になし。ただし、DiscoスライダーはDiscoVisibleプロパティによって表示・非表示が制御される。

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 106 | OpenGL | 主機能 | GPU相互運用デモの表示。OpenGLレンダリングバックエンドとの連携 |
| 107 | Vulkan | 補助機能 | Vulkanレンダリングバックエンドとの連携 |

## 画面種別

デモ / 表示

## URL/ルーティング

該当なし（デスクトップアプリケーションのUserControl）

## 入出力項目

| 項目名 | 種別 | データ型 | 必須 | 初期値 | 説明 |
|--------|------|----------|------|--------|------|
| Yaw | 入力 | float | - | 5 | ヨー角（Y軸回転）。0〜10の範囲 |
| Pitch | 入力 | float | - | 5 | ピッチ角（X軸回転）。0〜10の範囲 |
| Roll | 入力 | float | - | 5 | ロール角（Z軸回転）。0〜10の範囲 |
| Disco | 入力 | float | - | 0 | 特殊効果の強度。0〜1の範囲 |
| Demo | 入出力 | IGpuDemo? | - | null | GPUデモの実装インスタンス |
| DiscoVisible | 入力 | bool | - | false | Discoスライダーの表示状態 |
| Info | 出力 | string | - | 空文字列 | GPU情報テキスト |

## 表示項目

| 項目名 | 表示位置 | 説明 |
|--------|----------|------|
| デモコンテンツ | 画面中央 | IGpuDemo実装による3Dレンダリング結果 |
| GPU情報テキスト | 左上 | 現在のGPU/レンダリング情報 |
| Yawスライダー | 右側パネル | ヨー角調整用スライダー |
| Pitchスライダー | 右側パネル | ピッチ角調整用スライダー |
| Rollスライダー | 右側パネル | ロール角調整用スライダー |
| Discoスライダー | 右側パネル | 特殊効果調整用スライダー（条件付き表示） |

## イベント仕様

### 1-Yaw/Pitch/Roll/Disco値変更

ユーザーがスライダーを操作すると、対応するプロパティ（Yaw/Pitch/Roll/Disco）が更新される。

- **トリガー**：スライダーのValue変更
- **処理フロー**：
  1. SetAndRaiseメソッドによりプロパティ値を更新
  2. OnPropertyChangedが呼び出される
  3. _demo?.Update(this, Yaw, Pitch, Roll, Disco)によりGPUデモに新しい値を通知
  4. GPUデモ側でレンダリングパラメータを更新

### 2-Demo変更

Demoプロパティが変更されると、古いデモインスタンスのクリーンアップと新しいデモへのパラメータ適用が行われる。

- **トリガー**：Demoプロパティの設定
- **処理フロー**：
  1. 旧デモインスタンスに対してUpdate(null, 0, 0, 0, 0)を呼び出しクリーンアップ
  2. 新デモインスタンスに対してUpdate(this, Yaw, Pitch, Roll, Disco)を呼び出し

## データベース更新仕様

### 操作別データベース影響一覧

該当なし（データベースを使用しない）

## メッセージ仕様

該当なし

## 例外処理

| 状況 | 処理内容 |
|------|----------|
| GPUが利用不可能 | GPUデモコントロール側でエラーハンドリングを実装 |
| 無効なDemoType | MainWindow側でInvalidOperationExceptionをスロー |

## 備考

- このコントロールはGpuInteropサンプルアプリケーション専用のデモコントロールである
- 実際の3Dレンダリングは、VulkanDemoControlまたはD3D11DemoControlが担当する
- プラットフォームによってはVulkanまたはD3D11が利用できない場合がある
- FPSオーバーレイがMainWindowで有効化されている（RendererDebugOverlays.Fps）

---

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

本画面を理解するために参照すべきファイルと、推奨する読み解き順序を以下に示す。

### 推奨読解順序

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

まず、GPUデモで使用されるインターフェースと基本的なプロパティ構造を理解することが重要。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | GpuDemo.axaml.cs | `samples/GpuInterop/GpuDemo.axaml.cs` | IGpuDemoインターフェース（113-116行目）と、Yaw/Pitch/Roll/Discoプロパティの定義（14-93行目） |

**読解のコツ**: AvaloniaのDirectPropertyパターンを理解する。RegisterDirectによりプロパティの変更を効率的に検出し、SetAndRaiseで変更通知を行う。

#### Step 2: エントリーポイントを理解する

MainWindowからGpuDemoコントロールがどのように初期化されるかを確認する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | MainWindow.axaml.cs | `samples/GpuInterop/MainWindow.axaml.cs` | コンストラクタでGpuDemoを生成し、DemoTypeに応じてVulkanDemoControlまたはD3D11DemoControlを設定（22-31行目） |

**主要処理フロー**:
1. **17-19行目**: MainWindowコンストラクタでDemoTypeを受け取り、InitializeComponentを呼び出し
2. **21行目**: TitleをDemoType名に設定
3. **23-31行目**: GpuDemoインスタンスを生成し、Demoプロパティに適切なデモコントロールを設定
4. **33行目**: FPSオーバーレイを有効化

#### Step 3: UI定義を理解する

XAMLファイルでUIレイアウトとデータバインディングを確認する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | GpuDemo.axaml | `samples/GpuInterop/GpuDemo.axaml` | Grid内でのContentControl配置、スライダーのTwoWayバインディング、Disco表示の条件付き可視性 |

**主要処理フロー**:
- **6行目**: ContentControlでDemo（IGpuDemo）コンテンツを表示
- **9行目**: Infoプロパティをテキスト表示
- **14-18行目**: Yaw/Pitch/Rollスライダーの双方向バインディング
- **19-27行目**: DiscoVisible条件でDiscoスライダーを表示/非表示

#### Step 4: プロパティ変更ハンドリングを理解する

プロパティ変更時のGPUデモ更新処理を確認する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 4-1 | GpuDemo.axaml.cs | `samples/GpuInterop/GpuDemo.axaml.cs` | OnPropertyChangedオーバーライド（95-110行目）でのデモ更新ロジック |

**主要処理フロー**:
- **97-102行目**: Yaw/Pitch/Roll/Disco/Demoプロパティの変更を検出
- **104-105行目**: Demo変更時に旧デモをクリーンアップ
- **106行目**: 新しいパラメータでデモを更新

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

```
MainWindow (起動時)
    │
    └─ GpuDemo (生成)
           │
           ├─ VulkanDemoControl または D3D11DemoControl (Demo設定)
           │
           └─ OnPropertyChanged (スライダー操作時)
                  │
                  └─ IGpuDemo.Update() (レンダリングパラメータ更新)
```

### データフロー図

```
[入力]                    [処理]                         [出力]

ユーザー操作 ───▶ Slider.Value変更 ───▶ Yaw/Pitch/Roll/Discoプロパティ更新
                        │
                        ▼
                 SetAndRaise呼び出し
                        │
                        ▼
                 OnPropertyChanged発火
                        │
                        ▼
                 IGpuDemo.Update()呼び出し ───▶ 3Dレンダリング更新
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| GpuDemo.axaml | `samples/GpuInterop/GpuDemo.axaml` | XAML | UIレイアウト定義 |
| GpuDemo.axaml.cs | `samples/GpuInterop/GpuDemo.axaml.cs` | ソース | コードビハインド、プロパティ定義 |
| MainWindow.axaml | `samples/GpuInterop/MainWindow.axaml` | XAML | 親ウィンドウのUIレイアウト |
| MainWindow.axaml.cs | `samples/GpuInterop/MainWindow.axaml.cs` | ソース | GpuDemo初期化、DemoType切り替え |
| VulkanDemoControl | `samples/GpuInterop/VulkanDemo/` | ソース | Vulkanレンダリング実装 |
| D3D11DemoControl | `samples/GpuInterop/D3DDemo/` | ソース | Direct3D 11レンダリング実装 |
