# 画面設計書 110-メインウィンドウ

## 概要

本ドキュメントは、GpuInteropアプリケーションのメインウィンドウの画面設計書です。

### 本画面の処理概要

本画面は、AvaloniaフレームワークのGPU相互運用機能をデモンストレーションするためのメインウィンドウです。VulkanまたはDirect3D 11を使用した3Dレンダリングをスライダーで制御できます。

**業務上の目的・背景**：本画面は、AvaloniaフレームワークがネイティブのGPU API（Vulkan、Direct3D 11）と相互運用できることを示すためのデモアプリケーションです。カスタムシェーダーを使用した3D回転アニメーション、Discoエフェクトなど、GPUレンダリングの能力を確認できます。また、FPSオーバーレイでレンダリングパフォーマンスをモニタリングできます。

**画面へのアクセス方法**：GpuInteropアプリケーションを起動すると、本ウィンドウが表示されます。起動時にVulkanまたはD3D11モードを選択できます。

**主要な操作・処理内容**：
1. Yawスライダーで水平方向の回転を調整
2. Pitchスライダーで垂直方向の回転を調整
3. Rollスライダーでロール方向の回転を調整
4. Discoスライダーでエフェクト強度を調整（対応デモの場合）

**画面遷移**：
- 遷移元：アプリケーション起動
- 遷移先：なし（単一ウィンドウアプリケーション）

**権限による表示制御**：本画面はデモアプリケーションのため、権限による表示制御は実装されていません。

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 42 | Window | 主機能 | GPU相互運用デモのメインウィンドウ表示 |

## 画面種別

メインウィンドウ

## URL/ルーティング

デスクトップアプリケーションのため、URLルーティングはありません。
クラス名: `GpuInterop.MainWindow`

## 入出力項目

| 項目名 | 種別 | データ型 | 必須 | 説明 |
|--------|------|----------|------|------|
| Yaw | 入力/出力 | float | - | 水平回転角度（0-10、初期値: 5） |
| Pitch | 入力/出力 | float | - | 垂直回転角度（0-10、初期値: 5） |
| Roll | 入力/出力 | float | - | ロール回転角度（0-10、初期値: 5） |
| Disco | 入力/出力 | float | - | Discoエフェクト強度（0-1、初期値: 0） |

## 表示項目

| 項目名 | コントロール名 | 種別 | 説明 |
|--------|--------------|------|------|
| GPU Demo | Demo | ContentControl | GPUレンダリングコンテンツ表示エリア |
| Info | Info | TextBlock | デモ情報テキスト |
| Yaw Slider | - | Slider | 水平回転制御（Maximum=10） |
| Pitch Slider | - | Slider | 垂直回転制御（Maximum=10） |
| Roll Slider | - | Slider | ロール回転制御（Maximum=10） |
| Disco Slider | - | Slider | Discoエフェクト制御（Maximum=1、DiscoVisible時のみ表示） |
| FPS Overlay | - | RendererDebugOverlays | FPS表示オーバーレイ |

## イベント仕様

### 1-OnPropertyChanged

Yaw/Pitch/Roll/Disco/Demoプロパティが変更された際に発火します。

**処理フロー**:
1. 変更されたプロパティを確認
2. Demoプロパティの場合、古いデモのUpdateをnullで呼び出し
3. 現在のデモのUpdateメソッドを呼び出してレンダリングを更新

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

本画面はデモアプリケーションであり、データベースとの連携はありません。

## メッセージ仕様

本画面では明示的なメッセージ表示はありません。

## 例外処理

| 例外状況 | 処理内容 |
|---------|---------|
| 不明なDemoType | InvalidOperationException($"Unknown demo type {unknown}")をスロー |

## 備考

- VulkanDemoControlとD3D11DemoControlの2種類のデモを切り替え可能
- RendererDiagnostics.DebugOverlaysでFPSオーバーレイを表示
- DiscoスライダーはDiscoVisibleがtrueの場合のみ表示
- IGpuDemoインターフェースでデモコントロールを抽象化

---

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

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

### 推奨読解順序

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

GPUデモの基本構造を理解します。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | GpuDemo.axaml.cs | `samples/GpuInterop/GpuDemo.axaml.cs` | GpuDemoコントロールのプロパティ定義 |
| 1-2 | IGpuDemo | `samples/GpuInterop/GpuDemo.axaml.cs` | デモインターフェース（113-116行） |

**読解のコツ**: GpuDemoはUserControlを継承し、Yaw/Pitch/Roll/Disco/Info/DiscoVisible/DemoのDirectPropertyを持ちます。IGpuDemoインターフェースはUpdateメソッドを定義しています。

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

処理の起点となるXAMLファイルとコードビハインドを確認します。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | MainWindow.axaml | `samples/GpuInterop/MainWindow.axaml` | ウィンドウ定義（最小限） |
| 2-2 | MainWindow.axaml.cs | `samples/GpuInterop/MainWindow.axaml.cs` | デモタイプに応じたContent設定 |
| 2-3 | GpuDemo.axaml | `samples/GpuInterop/GpuDemo.axaml` | GPUデモUIレイアウト |

**主要処理フロー**:
1. **MainWindow.axaml.cs 行13-14**: デフォルトコンストラクタでVulkanモード
2. **MainWindow.axaml.cs 行17-31**: DemoTypeに応じてVulkanDemoControlまたはD3D11DemoControlを作成
3. **MainWindow.axaml.cs 行33**: DebugOverlays.Fpsを有効化
4. **GpuDemo.axaml 行6**: ContentControlでデモを表示
5. **GpuDemo.axaml 行13-18**: Yaw/Pitch/Rollスライダーを配置
6. **GpuDemo.axaml 行19-27**: Discoエフェクトスライダー（条件付き表示）

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

実際のGPUレンダリング処理を確認します。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | VulkanDemoControl.cs | `samples/GpuInterop/VulkanDemo/VulkanDemoControl.cs` | Vulkanレンダリング実装 |
| 3-2 | D3D11DemoControl.cs | `samples/GpuInterop/D3DDemo/D3D11DemoControl.cs` | Direct3D 11レンダリング実装 |

**主要処理フロー**:
- IGpuDemo.Update()でパラメータを受け取り、GPUシェーダーに反映
- Yaw/Pitch/Rollで3D回転行列を計算
- Discoでカラーエフェクトを適用

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

```
MainWindow
    │
    ├─ コンストラクタ(DemoType)
    │      │
    │      ├─ InitializeComponent()
    │      │
    │      ├─ Title = demoType.ToString()
    │      │
    │      ├─ Content = new GpuDemo {
    │      │      Demo = demoType switch {
    │      │          Vulkan => new VulkanDemoControl(),
    │      │          D3D11 => new D3D11DemoControl(),
    │      │      }
    │      │  }
    │      │
    │      └─ RendererDiagnostics.DebugOverlays = Fps
    │
    └─ GpuDemo
           │
           ├─ Properties (DirectProperty)
           │      ├─ Yaw (float, 初期値: 5)
           │      ├─ Pitch (float, 初期値: 5)
           │      ├─ Roll (float, 初期値: 5)
           │      ├─ Disco (float, 初期値: 0)
           │      ├─ Info (string)
           │      ├─ DiscoVisible (bool)
           │      └─ Demo (IGpuDemo?)
           │
           ├─ OnPropertyChanged()
           │      └─ Demo?.Update(this, Yaw, Pitch, Roll, Disco)
           │
           └─ UI Layout
                  ├─ ContentControl (Demo)
                  ├─ Info TextBlock
                  └─ StackPanel (Sliders)
                         ├─ Yaw Slider
                         ├─ Pitch Slider
                         ├─ Roll Slider
                         └─ Disco Slider (IsVisible=DiscoVisible)
```

### データフロー図

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

Slider Drag ───▶ DirectProperty.Set ───▶ OnPropertyChanged()
                                                │
                                                ▼
                                         IGpuDemo.Update()
                                                │
                                                ├─ Yaw → 水平回転
                                                ├─ Pitch → 垂直回転
                                                ├─ Roll → ロール回転
                                                └─ Disco → エフェクト
                                                        │
                                                        ▼
                                                GPUシェーダー実行
                                                        │
                                                        ▼
                                                3Dレンダリング出力
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| MainWindow.axaml | `samples/GpuInterop/MainWindow.axaml` | ソース | ウィンドウ定義（XAML） |
| MainWindow.axaml.cs | `samples/GpuInterop/MainWindow.axaml.cs` | ソース | コードビハインド（デモ初期化） |
| GpuDemo.axaml | `samples/GpuInterop/GpuDemo.axaml` | ソース | GPUデモUIレイアウト |
| GpuDemo.axaml.cs | `samples/GpuInterop/GpuDemo.axaml.cs` | ソース | GPUデモコントロール（プロパティ定義） |
| VulkanDemoControl.cs | `samples/GpuInterop/VulkanDemo/VulkanDemoControl.cs` | ソース | Vulkanレンダリング実装 |
| D3D11DemoControl.cs | `samples/GpuInterop/D3DDemo/D3D11DemoControl.cs` | ソース | Direct3D 11レンダリング実装 |
| DemoType.cs | `samples/GpuInterop/DemoType.cs` | ソース | デモタイプ列挙型 |
