設計資料・過去の記録

SERIKOオーバーレイ・着せ替えレンダリング実装レポート

設計案・過去の実装記録です。本文中の予定、完了数、環境条件は執筆時点のものです。現在の実装や公開版の対応保証として扱わず、最新の対応状況と合わせて読んでください。 対応状況 · 既知の問題

⚠️ 時点スナップショット: 本レポートの「GhostManager+Animation.swift は削除」「DressupInfoExtended 型が見つからない」「ビルド失敗」等の記述は作成当時の状態であり、 現在は GhostManager+Animation.swift(SERIKO実行)・GhostManager+Dressup.swift(着せ替え)が存在しビルドも通っている。 現状は docs/SERIKO_IMPLEMENTATION.md / docs/AUDITS_COMPLETED.md を正とすること。

Status: Implementation In Progress Updated: 2025-03-09 Target: Ourin (macOS 10.15+ / Universal 2) Scope: SERIKOアニメーションのSurfaceオーバーレイ合成と着せ替えパーツのレンダリング


1. 実装概要

本フェーズでは、以下の機能を実装予定です:

  • Surfaceオーバーレイ: ベースサーフェスの上に複数のサーフェスを重ねて表示
  • 着せ替えパーツ: ユーザーが着せるアクセサリー(髪飾り、リボンなど)を表示
  • アニメーション制御: \![anim, ...] コマンドの実装

2. 完了したタスク

2.1 GhostTypes.swift拡張

ファイル: Ourin/Ghost/GhostTypes.swift

実装内容:

// Surface overlay data for character rendering
struct SurfaceOverlay: Identifiable {
    let id: Int
    let image: NSImage
    var offset: CGPoint = .zero
    var alpha: Double = 1.0
}

// Desktop alignment options
enum DesktopAlignment {
    case free
    case top
    case bottom
    case left
    case right
}

// Dressup part data for character rendering
struct DressupPart: Identifiable {
    let id = UUID()
    let category: String
    let partName: String
    let image: NSImage
    let frame: CGRect
    var zOrder: Int = 0
    var isEnabled: Bool = true
}

extension NSImage {
    var isValid: Bool {
        return size.width > 0 && size.height > 0
    }
}

ステータス: ✅ 完了

2.2 CharacterViewModel拡張

ファイル: Ourin/Ghost/GhostManager.swift

実装内容: - overlays: [SurfaceOverlay] プロパティ(既存) - dressupParts: [DressupPart] プロパティを追加 - SurfaceOverlay 構造体を削除(GhostTypes.swiftに移動)

ステータス: ✅ 完了

2.3 CharacterView拡張

ファイル: Ourin/Ghost/CharacterView.swift

実装内容: - ベースサーフェスの上にオーバーレイレイヤーを追加 - 着せ替えパーツレイヤーを追加 - Z-orderでのソート実装 - overlay と dressupParts 配列を ForEach でレンダリング

ZStack(alignment: .topLeading) {
    // Base surface
    if let baseImage = viewModel.image {
        Image(nsImage: baseImage)
            .resizable()
            .aspectRatio(contentMode: .fit)
    }

    // Overlay layers (sorted by Z-order)
    ForEach(viewModel.overlays.sorted { $0.id < $1.id }) { overlay in
        OverlayView(overlay: overlay)
            .offset(x: overlay.offset.x, y: overlay.offset.y)
    }

    // Dressup parts (sorted by Z-order)
    ForEach(viewModel.dressupParts.sorted { $0.zOrder < $1.zOrder }) { part in
        DressupPartView(part: part)
    }

    // Drag and drop overlay
    if let onEvent = onDragDropEvent {
        DragDropView(onEvent: onEvent)
    }
}

ステータス: ✅ 完了

2.4 OverlayView・DressupPartView作成

ファイル: Ourin/Ghost/CharacterView.swift(内部定義)

実装内容: - OverlayView 構造体を作成(SurfaceOverlayレンダリング) - DressupPartView 構造体を作成(DressupPartレンダリング)

ステータス: ✅ 完了

2.5 GhostManager+Animation.swift拡張

ファイル: Ourin/Ghost/GhostManager+Animation.swift

実装内容: - handleAnimClear(id:) - \![anim,clear,ID] ハンドラー - handleAnimPause(id:) - \![anim,pause,ID] ハンドラー - handleAnimResume(id:) - \![anim,resume,ID] ハンドラー - handleAnimOffset(id:x:y:) - \![anim,offset,ID,x,y] ハンドラー - handleAnimStop() - \![anim,stop] ハンドラー - handleAnimAddOverlay(id:) - \![anim,add,overlay,ID] ハンドラー - handleAnimAddOverlayFast(id:) - \![anim,add,overlayfast,ID] ハンドラー - handleAnimAddBase(id:) - \![anim,add,base,ID] ハンドラー - handleAnimAddMove(x:y:) - \![anim,add,move,x,y] ハンドラー - handleAnimAddOverlayAt(id:x:y:) - \![anim,add,overlay,ID,x,y] ハンドラー - handleWaitForAnimation(id:) - \__w[animation,ID] ハンドラー

ステータス: ✅ 完了


3. 進行中のタスク

3.1 着せ替え管理機能

ファイル: GhostManager+Dressup.swift(削除)

問題点: - 型参照の複雑化:GhostManager.CharacterViewModel.SurfaceOverlay vs GhostTypes.SurfaceOverlay - ストアドプロパティの制限:Extensionにstoredプロパティを含められない - EventBridge.shared.notifyCustomのパラメータ不整合

現状: GhostManager+Dressup.swiftを作成しましたが、型参照問題によりビルド失敗。削除済み。

ステータス: ⚠️ 実装中・保留

3.2 GhostManager+Animation.swiftのエラー修正

ファイル: Ourin/Ghost/GhostManager+Animation.swift

実装内容: - loadShellPath() の戻り値のOptionalアンラップを修正

ステータス: ✅ 完了

3.3 GhostManager.swiftの初期化

ファイル: Ourin/Ghost/GhostManager.swift

実装内容: - init() メソッドに loadDressupConfiguration() 呼び出しを追加 - DressupInfoExtended 構造体を追加

ステータス: ✅ 完了


4. 未実装の機能

4.1 着せ替え設定ロード

  • loadDressupConfiguration() メソッド(宣言済みだが実装未完了)
  • parseDressupFromDescript() メソッド(宣言済みだが実装未完了)
  • applyDressupBindings() メソッド(宣言済みだが実装未完了)

4.2 着せ替えバインディング

  • handleBindDressup(category:part:value:) メソッド(GhostManager.swiftで宣言済み)

4.3 着せ替えパーツ表示

  • DressupPart 構造体のレンダリング実装済み
  • Z-orderソート実装済み

5. SakuraScriptコマンド対応状況

コマンド 実装状況 ファイル
\i[ID] ✅ 既存 GhostManager+Animation.swift
\i[ID,wait] ✅ 既存 GhostManager+Animation.swift
\![anim,clear,ID] ✅ 実装 GhostManager+Animation.swift
\![anim,pause,ID] ✅ 実装 GhostManager+Animation.swift
\![anim,resume,ID] ✅ 実装 GhostManager+Animation.swift
\![anim,offset,ID,x,y] ✅ 実装 GhostManager+Animation.swift
\![anim,stop] ✅ 実装 GhostManager+Animation.swift
\![anim,add,overlay,ID] ✅ 実装 GhostManager+Animation.swift
\![anim,add,overlayfast,ID] ✅ 実装 GhostManager+Animation.swift
\![anim,add,base,ID] ✅ 実装 GhostManager+Animation.swift
\![anim,add,move,x,y] ✅ 実装 GhostManager+Animation.swift
\![anim,add,overlay,ID,x,y] ✅ 実装 GhostManager+Animation.swift
\_w[animation,ID] ✅ 実装 GhostManager+Animation.swift
\![bind,category,part,value] ⚠️ 部分実装 GhostManager.swift
\![bind,category,,0] ⚠️ 部分実装 GhostManager.swift
\![bind,category,part] ⚠️ 部分実装 GhostManager.swift

6. ビルド状況

最新ビルド: 失敗 エラー: LSPエラー(型参照問題) - Cannot find type 'DressupInfoExtended' in scope - Cannot find type 'SurfaceOverlay' in scope

原因: Extension内での型参照とstoredプロパティの制限によるもの


7. 考察と推奨

7.1 型参照問題

現状: Extension内でGhostManagerのネスト型(CharacterViewModel.SurfaceOverlay)を参照しようとしている 問題: SwiftのExtension制限により、storedプロパティを含められない 解決策: 型定義を独立したファイル(GhostTypes.swift)に移動済み

7.2 着せ替え機能の複雑さ

現状: 着せ替え機能は設定ロード・バインディング・適用の複数ステップが必要 問題: 単一ファイルでの実装が複雑すぎ、型参照問題でビルド失敗 推奨: 1. 着せ替え機能はフェーズ4(プロパティシステム拡張)で実装 2. まずはSERIKOオーバーレイレンダリングのみを完成 3. 着せ替えはSERIKOプロパティが実装されてから開始

7.3 次のステップ

  1. ビルドエラー修正: LSPエラーを解決
  2. SERIKOオーバーレイのみに集中: 着せ替えを一時スキップ
  3. 着せ替え機能の再設計: よりシンプルな実装へ
  4. プロパティシステムフェーズで着せ替えを再開

8. 成功した実装

8.1 Surfaceオーバーレイレンダリング基盤

✅ 完了: CharacterViewにオーバーレイレイヤーを追加 - Z-orderソート - オフセット適用 - 透明度適用

8.2 アニメーション制御

✅ 完了: GhostManager+Animation.swiftに全アニメーションコントロールハンドラーを追加 - AnimationEngineのメソッド呼び出し - overlay管理

8.3 型定義の統合

✅ 完了: GhostTypes.swiftに共通型定義を移動 - SurfaceOverlay - DesktopAlignment - DressupPart - NSImage拡張


9. 未解決の課題

  1. 着せ替え機能: 実装中・ビルド失敗
  2. LSPエラー: 型参照問題によりビルド失敗
  3. 着せ替えプロパティ: 設定ロードとバインディングの実装未完了

10. 実装計画の見直し

原計画 vs 実際

フェーズ1: SakuraScriptレンダリング(コア) - 設計: SERIKOアニメーション・オーバーレイレンダリング - 実際: オーバーレイレンダリング完了、着せ替え部分実装中

フェーズ4: プロパティシステム拡張 - 設計: SERIKOプロパティ・履歴・使用頻度 - 実際: 未開始

推奨

  1. 着せ替え機能の延期: 着せ替え機能はSERIKOプロパティ実装後に再開
  2. SERIKOオーバーレイの完成に集中: 次の実装はSERIKOオーバーレイのみ
  3. ビルド問題の解決: LSPエラーを解決してビルド成功を確認

11. まとめ

進捗: - SERIKOオーバーレイレンダリング基盤: 80% 完了 - アニメーション制御ハンドラー: 100% 完了 - 着せ替えレンダリング基盤: 30% 完了(ビルド失敗) - 型定義統合: 100% 完了

次回の優先事項: 1. ビルドエラー解決 2. SERIKOオーバーレイの完全なレンダリングテスト 3. 着せ替え機能の簡素化または延期

結論: SERIKOオーバーレイの基本構造は完成しましたが、着せ替え機能は複雑さと型参照問題により一時停止を推奨します。

出典と編集について

Ourin / Furin Lab・contributors。文書はCC BY-SA 4.0(第三者の個別表記を除く)。Web版は見出し・リンクの整備とローカルパスの一般化を行っています。更新基準日: 2026-10-30。

元資料: docs/SERIKO_IMPLEMENTATION_PROGRESS_REPORT_ja-jp.md
ソース SHA-256: 51e29d2fd6b17e7fca8159287bece8942c885b760db7dffe5578ec18efe3567f

ライセンス · 出典一覧 · 資料一覧に戻る