/// Control whether rendering goes into the retaining buffer (it's slower) or straight to the viewport.
/// This could be useful as a performance hack, or if someone was very clever, they could wait for a control to get deactivated, enable retaining, and render it one more time.
/// Of course, even better still is to be able to repaint viewports continually, but sometimes thats annoying.
/// </summary>
publicboolRetain
{
get{return_retain;}
set
{
if(_retain&&!value)
{
rt.Dispose();
rt=null;
}
_retain=value;
}
}
bool_retain=true;
IGLGL;
RenderTargetrt;
GuiRendererGuiRenderer;
publicoverridevoidBegin()
{
base.Begin();
if(_retain)
{
//TODO - frugalize me
if(rt!=null)
rt.Dispose();
rt=GL.CreateRenderTarget(Width,Height);
rt.Bind();
}
}
protectedoverridevoidOnPaint(PaintEventArgse)
{
base.OnPaint(e);
//todo - check whether we're begun?
base.Begin();
Draw();
base.End();
}
voidDraw()
{
if(rt==null)return;
GuiRenderer.Begin(Width,Height,true);
GuiRenderer.SetBlendState(GL.BlendNone);
GuiRenderer.Draw(rt.Texture2d);
GuiRenderer.End();
base.SwapBuffers();
}
publicoverridevoidSwapBuffers()
{
//if we're not retaining, then we havent been collecting into a framebuffer. just swap it
if(!_retain)
{
base.SwapBuffers();
return;
}
//if we're retaining, then we cant draw until we unbind! its semantically a bit odd, but we expect users to call SwapBuffers() before end, so we cant unbind in End() even thoug hit makes a bit more sense.