Skip to content

v1.0.0

Latest

Choose a tag to compare

@routersys routersys released this 22 May 13:01
· 1 commit to main since this release

v1.0.0 - 図形の貼り付け for YMM4 初回リリース

YukkuriMovieMaker4 向けの映像エフェクトプラグイン 図形の貼り付け の初回リリースです。
任意の図形を指定した位置・サイズ・回転・不透明度で描画し、
Direct2D の ColorMatrixAffineTransform2DComposite エフェクトチェーンで
変形・不透明度制御・合成を行う映像エフェクトプラグインです。


新機能

1. エフェクトの登録

ShapePasteEffectVideoEffectBase を継承します。

  • [VideoEffect] 属性によりカテゴリ VideoEffectCategories.Decoration に登録されます。
  • 検索タグとして "Shape Paste""図形貼り付け" の 2 つが登録されます。
  • IsAviUtlSupported = false により AviUtl フィルタ形式(.exo 出力)は非対応です。
  • CreateExoVideoFilters は空のシーケンスを返却します。
  • LabelTexts.ShapePasteEffectDefaultName を返却します。
  • GetAnimatables()XYZOpacityZoomRotationLeftRight
    TopBottomShapeParameter の 11 個の IAnimatable インスタンスを返却します。
    すべてのアニメーションパラメータでキーフレームアニメーションに対応しています。

2. パラメータ

X・Y・Z(描画位置座標)

[AnimationSlider] 属性を持つ Animation プロパティです。
[DrawPositionVisible] 属性により IsFullyPinnedtrue の場合は非表示になります。

  • XY: 初期値 0、範囲 ±VeryLargeValue、単位 px。描画位置の平行移動に使用します。
    サイズ追従が有効な場合は固定端の位置から自動計算したオフセットが使用されます。
  • Z: 初期値 0、範囲 ±VeryLargeValue、単位 px。視点距離 1000 を基準とした
    透視投影スケールの算出に使用します。Z が視点距離(1000)に近づくと分母がゼロに
    近づくため、最小スケール 1e-5 でクランプして映像の消失を防ぎます。

Opacity(不透明度)

[AnimationSlider] 属性を持つ Animation プロパティです。初期値 100.0、範囲 0〜100、単位 %

ColorMatrix エフェクトのアルファ成分(M44)に opacity / 100.0 を設定することで
不透明度を制御します。RGB 成分(M11M22M33)は 1f で固定されます。

Zoom(拡大率)

[AnimationSlider] 属性を持つ Animation プロパティです。初期値 100.0、範囲 0〜VeryLargeValue、単位 %
[DrawPositionVisible] 属性により IsFullyPinnedtrue の場合は非表示になります。

Z 座標から算出した透視投影スケール(PerspectiveDistance / (PerspectiveDistance - Z))と
乗算した値を finalScale として AffineTransform2D のスケール変換に適用します。
finalScale は最小スケール 1e-5 でクランプされます。
サイズ追従が有効かつ IResizableShapeParameter に対応した図形の場合、スケールは 1f 固定となり
IResizableShapeParameter.Resize による直接リサイズが行われます。

Rotation(回転)

[AnimationSlider] 属性を持つ Animation プロパティです。初期値 0、範囲 ±VeryLargeValue、単位 °

度数法の値を value * Math.PI / 180.0 でラジアンに変換し、AffineTransform2D
回転変換に適用します。

InvertX・InvertY(左右反転・上下反転)

[ToggleSlider] 属性を持つ bool プロパティです。既定値は false

スケール行列の符号を反転(finalScaleX *= -1f / finalScaleY *= -1f)することで実現します。

DisplayMode(表示方法)

[EnumComboBox] 属性を持つ ShapeDisplayMode 列挙型プロパティです。
既定値は ShapeDisplayMode.Overlay(そのまま重ねて表示)です。

プロパティの変更は Set(ref field, value) により VideoEffectBase の変更通知機構を通じて
プロセッサへ伝播します。詳細は「3. 表示方法と合成モード」を参照してください。

IsBack(背面に描画)

[ToggleSlider] 属性を持つ bool プロパティです。既定値は false
[IsBackVisible] 属性により DisplayModeShapeDisplayMode.Overlay の場合のみ表示されます。

Overlay モード時に Composite の入力順を反転させることで、図形を元アイテムの
背面に配置します。

PinLeft・PinRight・PinTop・PinBottom(端の固定)

[ToggleSlider] 属性を持つ bool プロパティです。既定値はすべて false

各プロパティの変更通知は nameof(IsSizeTrackingEnabled) および nameof(IsFullyPinned)
追加で発行し、依存プロパティの表示状態を連動して更新します。

  • IsSizeTrackingEnabled: PinLeft || PinRight || PinTop || PinBottom。いずれか 1 つ以上が
    有効な場合にサイズ追従処理が起動します。
  • IsFullyPinned: PinLeft && PinRight && PinTop && PinBottom。4 辺すべて固定時に
    X・Y・Z・Zoom パラメータを非表示にします。

Left・Right・Top・Bottom(余白)

[AnimationSlider] 属性を持つ Animation プロパティです。初期値 0、範囲 ±VeryLargeValue、単位 px
各プロパティは対応する Pin が有効な場合のみ [LeftMarginVisible][RightMarginVisible]
[TopMarginVisible][BottomMarginVisible] 属性によって表示されます。

固定した端からのオフセット量を指定します。正の値で外側方向、負の値で内側方向に余白を設けます。
固定していない端については X・Y・Zoom で指定した位置・サイズが基準として使用されます。

ShapeType(種類)

[ShapeTypeComboBox] 属性を持つ Type プロパティです。
既定値は PluginLoader.GetPrimaryPluginType<IShapePlugin>() が返す型です。

BeginEditoldShapeType に現在値を保持し、EndEditAsync のタイミングで
ShapeType が変更されていた場合または ShapeParameternull の場合に
ShapeFactory.GetPlugin(ShapeType).CreateShapeParameter(ShapeParameter?.GetSharedData())
図形パラメータを再生成します。前の ShapeParameterGetSharedData() を引き継ぐため、
対応する共有項目は可能な範囲で維持されます。

ShapeParameter(図形パラメータ)

[Display(AutoGenerateField = true)] 属性を持つ IShapeParameter プロパティです。
既定値は new RectangleShapeParameter(null) です。

選択した図形プラグインに応じたパラメータが YMM4 の UI により自動生成されます。
GetAnimatables() の返却リストに含まれるため、図形パラメータ内のアニメーション値も
キーフレームアニメーションの対象となります。

3. 表示方法と合成モード

ShapeDisplayMode 列挙型の各値と Composite エフェクトへの設定対応は以下のとおりです。

CompositeMode 入力 0(背景) 入力 1(前景)
Replace(完全置換) SourceOver emptyImage(完全透明) 図形変換後出力
InsideArea(領域内に表示) SourceIn 元アイテム入力 図形変換後出力
AboveArea(領域上に重ねて表示) SourceAtop 元アイテム入力 図形変換後出力
Overlay(そのまま重ねて表示)IsBack = false SourceOver 元アイテム入力 図形変換後出力
Overlay(そのまま重ねて表示)IsBack = true SourceOver 図形変換後出力 元アイテム入力

input(元アイテム)が null の場合は emptyImage を代替として使用します。
shapeSource が未構築の場合も同様に emptyImage を代替として使用します。

emptyImageFlood(色 (0, 0, 0, 0))を Crop(矩形 (0, 0, 1, 1))で
切り抜いた完全透明の 1×1 画像として構築されます。

4. エフェクトチェーンの構築

ShapePasteEffectProcessorIVideoEffectProcessor を実装します。

コンストラクタでは以下のエフェクトを生成し、すべて disposer に登録します。

  1. new ColorMatrix(devices.DeviceContext)ColorMatrix エフェクト(shapeOpacity)を生成します。
  2. new AffineTransform2D(devices.DeviceContext)AffineTransform2D エフェクト(shapeTransform)を生成します。
    補間モードは AffineTransform2DInterpolationMode.Linear に設定されます。
  3. shapeTransform.Output を取得して shapeTransformOutput として保持します。
  4. new Composite(devices.DeviceContext)Composite エフェクトを生成します。
  5. composite.Output を取得して Output プロパティとして公開します。
  6. emptyImageFloodCrop の透明 1×1 画像)を構築します。
    エフェクトチェーンの接続は UpdateShapeSource および ConfigureComposite 内で
    フレームごとに動的に設定されます。

5. 図形ソースの更新とサイズ追従処理

UpdateShapeSource の処理フローは以下のとおりです。

  1. item.ShapeParameternull の場合は処理をスキップします。
  2. DisposeShapeSource で既存の shapeSource を破棄します。
  3. ShapeParameter.GetSharedData()ShapeFactory.GetPlugin(ShapeType).CreateShapeParameter(sharedData)
    liveParam を生成し、liveParam.CreateShapeSource(devices)shapeSource を構築します。
  4. shapeSource.Update(effectDescription) で初回更新を行います。
  5. IsSizeTrackingEnabledtrue かつ liveParamIResizableShapeParameter を実装し
    かつ input が非 null の場合、以下のサイズ追従処理を行います。
    • GetImageLocalBounds で図形および元アイテムの境界矩形を取得します。
    • 固定していない端は X・Y・Zoom・Z の値から算出した基準位置を使用します。
    • 固定している端は ±inputSize / 2.0 ± margin で目標位置を算出します。
    • IResizableShapeParameter.Resize(scaleX, scaleY) で図形を直接リサイズしたのち
      shapeSource.Update(effectDescription) で再更新します。
    • offsetX / offsetY には固定端から算出した中心座標を設定します。
    • finalScaleX / finalScaleY1f 固定となります。
    • 元アイテムの境界幅・高さが有限値でない場合はスケール計算にフォールバックします。
  6. InvertXtrue の場合 finalScaleX *= -1fInvertYtrue の場合 finalScaleY *= -1f を適用します。
  7. UpdateShapeTransform を呼び出して変換を確定します。
  8. shapeOpacity.SetInput(0, shapeSource.Output, true) で図形出力を ColorMatrix へ接続し、
    shapeTransform.SetInput(0, shapeOpacity.Output, true)AffineTransform2D へ接続します。

6. 変形の適用

UpdateShapeTransform の処理フローは以下のとおりです。

  1. shapeSourcenull の場合は処理をスキップします。
  2. Opacity の値から ColorMatrixM44(アルファ成分)を設定します。
    他の対角成分(M11M22M33)は 1f 固定、その他の成分は 0f 固定です。
  3. Rotation の現在値を value * Math.PI / 180.0 でラジアンに変換します。
  4. 以下の順で変換行列を合成して shapeTransform.TransformMatrix に設定します。
    • Matrix3x2.CreateScale(scaleX, scaleY)
    • Matrix3x2.CreateRotation(rotationRad)
    • Matrix3x2.CreateTranslation(offsetX, offsetY)

7. 入力管理とリソース解放

SetInputinput フィールドを更新します。
ClearInputinputnull にリセットしたのち DisposeShapeSource を呼び出します。

DisposeShapeSource では以下の順で図形ソースを解放します。

  1. shapeSourcenull の場合は処理をスキップします。

  2. shapeOpacity.SetInput(0, null, true)ColorMatrix の入力参照を解除します。

  3. shapeTransform.SetInput(0, null, true)AffineTransform2D の入力参照を解除します。

  4. shapeSource.Dispose() で図形ソースを解放し、shapeSourcenull にします。
    Dispose では以下の順でリソースを解放します。

  5. composite.SetInput(0, null, true) および composite.SetInput(1, null, true)
    Composite の入力参照を解除します。

  6. DisposeShapeSource() で図形ソースを解放します。

  7. disposer.Dispose() で登録済みのすべてのリソースを一括解放します。

8. プロパティ可視性制御

各プロパティの表示・非表示は ICustomVisibilityAttribute2 を実装したカスタム属性で制御されます。
すべての属性は PropertyVisibilityAttributeBase を基底クラスとして持ちます。

GetBindingSourcePropertyNamePath とする OneWay バインディングを返し、
VisibilityConverterpredicateIsVisible に委譲)で Visibility 値に変換します。

属性 監視プロパティ 表示条件
DrawPositionVisibleAttribute IsFullyPinned false のとき表示
IsBackVisibleAttribute DisplayMode ShapeDisplayMode.Overlay のとき表示
LeftMarginVisibleAttribute PinLeft true のとき表示
RightMarginVisibleAttribute PinRight true のとき表示
TopMarginVisibleAttribute PinTop true のとき表示
BottomMarginVisibleAttribute PinBottom true のとき表示

9. 多言語対応

Texts.csv(8 言語 × 56 キー)を YukkuriMovieMaker.Generator[AutoGenLocalizer] 属性が
処理し、各ロケールのリソースを自動生成します。対応言語は
日本語 / 英語 / 中国語簡体字 / 中国語繁体字 / 韓国語 / スペイン語 / アラビア語 / インドネシア語です。

キーグループ 用途
ShapePasteEffectDefaultName エフェクト名・Label プロパティ・[VideoEffect] 属性の表示名
ShapePasteEffectGroupName_* パラメータのグループ名(DrawDisplaySizeTrackingMarginShape
ShapePasteEffectDisplayName_* 各パラメータの表示名(19 項目)
ShapePasteEffectDiscription_* 各パラメータの説明文(19 項目)
ShapePasteEffectUnit_* アニメーションスライダーの単位(PixelsPercentDegrees
ShapePasteEffectEnum_DisplayMode_* ShapeDisplayMode 列挙値の表示名・説明文(4 値 × 2)