お世話になっております
UMGのRetainerBoxにて、Effect Materialを設定し、
RetainerBox下のSlateアイテムを任意の図形にクリッピングして表示する、という利用法をしています
このとき、Effect Material適用後の見た目(クリッピングしたあとの見た目)は、
作成したウィジェットをレベルで表示しないと確認できないという認識でおります
イテレーションの高速化のため、
WidgetBlueprintエディターのDesignerタブ上で、マテリアル適用後の見た目が確認したいのですが、
こうした機能は既存のものや、UE4.17以降で計画されている実装にありますか?
あるいは、上記RetainerBoxのプレビュー機能を独自実装しようとする場合、
参考にできそうなエンジンコードの情報をご教示いただけますでしょうか
感覚としては、Imageウィジェットではマテリアル適用後の見た目をプレビューできているので、
このあたりに流用できる部分があるのかなと思っています。
一方、レベル中で行われるRetainerBoxの描画ではFWidgetRenderer::DrawWindow から、
一度RenderTargetに書き込んでから描画、というステップを踏んでいると思いますので、
そうしたRetainerBox固有の描画をエディター上で再現する方法についても理解する必要があるのかと考えています。
お世話になっております。
申し訳ありませんが、現状はお送り頂いた内容を実現する機能・実装予定はありません。こちら機能要望としてリクエストといたします。
UE-55621 Request for Confirming the result of Retainer Box’s Effect Material on the UMG Editor
取り急ぎの対応として、SRetainerWidget.cppのOnPaint関数にて以下の対応を行うとエディタ上でのマテリアル適用後のプレビューが行えることを確認いたしました。
int32 SRetainerWidget::OnPaint(const FPaintArgs& Args, const FGeometry& AllottedGeometry, const FSlateRect& MyCullingRect, FSlateWindowElementList& OutDrawElements, int32 LayerId, const FWidgetStyle& InWidgetStyle, bool bParentEnabled) const
{
STAT(FScopeCycleCounter PaintCycleCounter(MyStatId);)
SRetainerWidget* MutableThis = const_cast( this );
MutableThis->RefreshRenderingMode();
// add : comment out
// if ( bEnableRetainedRendering && IsAnythingVisibleToRender() )
{
SCOPE_CYCLE_COUNTER( STAT_SlateRetainerWidgetPaint );
CachedAllottedGeometry = AllottedGeometry;
CachedWindowToDesktopTransform = Args.GetWindowToDesktopTransform();
...
ただしこの対応だけでは常に余計な処理が走ってしまうため、例えばURetainerBoxにプレビュー用のbool変数を追加し、プレビューしたい時( bool変数がtrue )は今回コメントアウトした判定部分をスキップするなどの対応が必要になります。
お手数ですが、こちらの挙動を一度ご確認頂けますと幸いです。
よろしくお願いいたします。
ご返答ありがとうございました
UE4Editorでご紹介いただいた if文にかかわる変数の変更タイミングを調べまして、
UMGのエディター中で、上記if文内の描画を有効化する処理を書くことができました。
具体的には以下のような実装を行っています。
void URetainerBox::SynchronizeProperties()
{
Super::SynchronizeProperties();
MyRetainerWidget->SetEffectMaterial(EffectMaterial);
MyRetainerWidget->SetTextureParameter(TextureParameter);
MyRetainerWidget->SetWorld(GetWorld());
// @third party code - BEGIN
// to preview "effect material" in Widget Blueprint Designer
if (IsDesignTime()) // It means editor only proc
{
if (EffectMaterial)
{
MyRetainerWidget->SetRetainedRendering(true);
}
else
{
MyRetainerWidget->SetRetainedRendering(false);
}
}
// @third party code - END
}
差支えなければ、
公式なエンジンのバージョンへの適応をご検討いただけないでしょうか
お世話になっております。
コードをご共有頂き、誠にありがとうございます。頂いたコードを担当者にも共有し、公式に組み込むことができないかを依頼致します。
よろしくお願いいたします。