private InvokeOnDisposal establishFrameBufferViewport(Vector2 roundedSize) { // Disable masking for generating the frame buffer since masking will be re-applied // when actually drawing later on anyways. This allows more information to be captured // in the frame buffer and helps with cached buffers being re-used. Rectangle screenSpaceMaskingRect = new Rectangle((int)Math.Floor(ScreenSpaceDrawRectangle.X), (int)Math.Floor(ScreenSpaceDrawRectangle.Y), (int)roundedSize.X + 1, (int)roundedSize.Y + 1); GLWrapper.PushMaskingInfo(new MaskingInfo { ScreenSpaceAABB = screenSpaceMaskingRect, MaskingRect = ScreenSpaceDrawRectangle, ToMaskingSpace = Matrix3.Identity, BlendRange = 1, AlphaExponent = 1, }, true); // Match viewport to FrameBuffer such that we don't draw unnecessary pixels. GLWrapper.PushViewport(new Rectangle(0, 0, (int)roundedSize.X, (int)roundedSize.Y)); return(new InvokeOnDisposal(delegate { GLWrapper.PopViewport(); GLWrapper.PopMaskingInfo(); })); }
protected override void PreDraw() { frameBuffer.Bind(); // Set viewport to the texture size GLWrapper.PushViewport(new Rectangle(0, 0, frameBuffer.Texture.Width, frameBuffer.Texture.Height)); // We need to draw children as if they were zero-based to the top-left of the texture // so we make the new zero be this container's position without affecting children in any negative ways GLWrapper.PushOrtho(new Rectangle((int)ScreenSpaceDrawQuad.TopLeft.X, (int)ScreenSpaceDrawQuad.TopLeft.Y, frameBuffer.Texture.Width, frameBuffer.Texture.Height)); GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit | ClearBufferMask.StencilBufferBit); }
protected override void PreDrawMask(FrameBuffer clippingMask) { clippingMask.Bind(); GLWrapper.PushViewport(new RectangleI(0, 0, clippingMask.Texture.Width, clippingMask.Texture.Height)); GLWrapper.Clear(new ClearInfo(Colour4.White)); GLWrapper.SetBlend(new BlendingParameters { Source = BlendingType.Zero, Destination = BlendingType.OneMinusSrcColor, SourceAlpha = BlendingType.Zero, DestinationAlpha = BlendingType.OneMinusSrcAlpha, }); }
private IDisposable establishFrameBufferViewport() { // Disable masking for generating the frame buffer since masking will be re-applied // when actually drawing later on anyways. This allows more information to be captured // in the frame buffer and helps with cached buffers being re-used. RectangleI screenSpaceMaskingRect = new RectangleI((int)Math.Floor(screenSpaceDrawRectangle.X), (int)Math.Floor(screenSpaceDrawRectangle.Y), (int)frameBufferSize.X + 1, (int)frameBufferSize.Y + 1); GLWrapper.PushMaskingInfo(new MaskingInfo { ScreenSpaceAABB = screenSpaceMaskingRect, MaskingRect = screenSpaceDrawRectangle, ToMaskingSpace = Matrix3.Identity, BlendRange = 1, AlphaExponent = 1, }, true); // Match viewport to FrameBuffer such that we don't draw unnecessary pixels. GLWrapper.PushViewport(new RectangleI(0, 0, (int)frameBufferSize.X, (int)frameBufferSize.Y)); GLWrapper.PushScissor(new RectangleI(0, 0, (int)frameBufferSize.X, (int)frameBufferSize.Y)); GLWrapper.PushScissorOffset(screenSpaceMaskingRect.Location); return(new ValueInvokeOnDisposal <BufferedDrawNode>(this, d => d.returnViewport())); }