Looking for Feedback on Our Implementation Plan for our UI

4.13 will have some things things to help with this - chiefly is the Widget Interaction Component when it comes to interacting with widget component if you went down that path. With that avenue open to you, you could take mouse input and apply it to widgets in the world, negative aspects of that are that right now they still render before AA, so you’d probably want to switch to FxAA when on the main menu, rather than TxAA, as the ghosting effect to causes to UI generally isn’t desirable.

Another avenue involves using the retainer widget, you wouldn’t render it in the world, instead you’d simply render the UI using a retainer, and then apply a parabola distortion to get the desired bending effect. Negative bit here, is currently the retainer does not expose a delegate to allow you to transform the incoming mouse input into a new virtual space, so your parabola distortions wouldn’t hit test correctly. Solution would be to subclass SRetainerWidget, and update the GetBubblePathAndVirtualCursors and TranslateMouseCoordinateFor3DChild functions to be aware of a possible distortion and to make a new subclass of URetainerBox that creates your new SRetainer instead. You could get the material code from the engine material used in the widget component - same goes for the needed code to calculate the new mouse position, in Widget Component.

Glow is tricky, you’d either have to artificially blur some portion of the 0-1 range in your retainer shader, as we don’t yet have a HDR buffer in the Slate renderer, or you’d have to just fake it with a image overlaid on top of the text. This also holds true for the Widget Component - as it’s essentially a retainer widget, where the render target is rendered in the world, there’s another material (a standard world surface material) that is used for the widget component. As of 4.13, that can be overridden, you’ll need to duplicate a portion of the existing widget component when making an override, that does things like has a Parameter for the SlateTexture that is set on it, but other than that, you’re free to do any standard surface shader stuff, keeping in mind your input is still just a render target of the widgets.