Here's a simple implementation of a viewport using this, inheriting from Image:
using Sandbox; using Sandbox.UI; /// <summary> /// A box that will display what a Camera sees. /// </summary> public partial class ViewPort : Image { /// <summary>The camera that will render to our texture.</summary> public CameraComponent Camera { get; set; } /// <summary>The image format that the texture will use.</summary> public ImageFormat TextureFormat { get; set; } = ImageFormat.RGBA8888; protected override void OnAfterTreeRender( bool firstTime ) { Vector2 textureSize = (Box.Rect.Size.Length != 0) ? Box.Rect.Size : new( 200, 200 ); Camera.RenderTarget = Texture.CreateRenderTarget( "camerapanel", TextureFormat, textureSize, Camera.RenderTarget ); Texture = Camera.RenderTarget; } protected override int BuildHash() => Box.Rect.Size.LengthSquared.FloorToInt(); }
You can then implement it inside a Razor
PanelComponent
like this:<ViewPort [email protected] />