`UIElement3D` is no longer in public API. This prompted addition of `UIComponent::SetViewportIndex(unsigned index)` API for controlling which viewport is used for UI input mapping. If component does not belong to a node then index will be cached and used when component is added to a node. Not setting viewport index or setting invalid index will result in use of viewport at index 0.
`UIElement3D` no longer holds `UIComponent` pointer. Instead it holds `Node` pointer and obtains `Scene` and `StaticModel` directly from the model. This allows model to be removed and re-added without breaking. Note that after re-adding (likely new) `StaticModel` it is user's responsibility to set material returned by `UIComponent` to a new `StaticModel`.
`UIElement3D` no longer caches model pointer if component does not own the model. As a result of that flag `isStaticModelOwned_` was removed.
Swapped protected members and methods in `UIComponent` to fit style guidelines.
Turns out 3D UI implementation was not flexible enough. This change allows ultimate freedom by splitting up responsibilities correctly.
UIComponent is no longer responsible for storing batches and vertex data. This information was moved to new `RenderToTextureData` struct inside `UI` subsystem. `UI` and `UIComponent` are no longer friends of each other.
New class `UIElement3D` was created. It is used as root UI element of UI rendered in a 3D scene. It implements `ScreenToElement()` method which is used for translating screen coordinates to element coordinates. Previously `UIComponent` did translation of these coordinates. `UIElement3D::ElementToScreen()` is not implemented at this time and returns `{-1, -1}` (invalid coordinates). It is also possible to set a custom viewport to root element of `UIComponent` and this viewport will be used for processing user input.
In order to render UIElement to a texture it is enough to call SetRenderTexture(texture), where texture is set up as `TEXTURE_RENDERTARGET`. In order to properly support input of `UIElement` rendered to a texture user should subclass `UIElement` and implement `ScreenToElement()` method which properly translates global screen coordinates to local element coordinates.
New API:
* UIElement::SetRenderTexture(Texture2D*)
* UI::SetRenderTexture(UIElement*, Texture2D*)