FNA-VSCode-Template/project_name/ImGui/ImGuiFinalRenderDelegate.cs
2019-02-14 14:36:47 -08:00

79 lines
2.3 KiB
C#

using System;
using System.Reflection;
using ImGuiNET;
using ImGuiNET.SampleProgram.XNA;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
namespace Nez
{
public class ImGuiFinalRenderDelegate : IFinalRenderDelegate
{
public Scene scene { get; set; }
ImGuiRenderer _imGuiRenderer;
RenderTarget2D _lastRenderTarget;
IntPtr _renderTargetId;
public ImGuiFinalRenderDelegate()
{
_imGuiRenderer = new ImGuiRenderer(Core.instance);
_imGuiRenderer.RebuildFontAtlas();
ImGui.GetIO().ConfigWindowsMoveFromTitleBarOnly = true;
}
public void handleFinalRender( Color letterboxColor, RenderTarget2D source, Rectangle finalRenderDestinationRect, SamplerState samplerState )
{
if(_lastRenderTarget != source)
{
// unbind the old texture if we had one
if(_lastRenderTarget != null)
_imGuiRenderer.UnbindTexture(_renderTargetId);
// bind the new texture
_lastRenderTarget = source;
_renderTargetId = _imGuiRenderer.BindTexture(source);
}
Core.graphicsDevice.setRenderTarget( null );
Core.graphicsDevice.Clear( letterboxColor );
_imGuiRenderer.BeforeLayout(Time.time);
layoutGui();
_imGuiRenderer.AfterLayout();
}
void layoutGui()
{
ImGui.ShowDemoWindow();
var maxSize = new System.Numerics.Vector2(_lastRenderTarget.Width, _lastRenderTarget.Height);
var minSize = maxSize / 4;
unsafe
{
ImGui.SetNextWindowSizeConstraints(minSize, maxSize, data =>
{
var size = (*data).CurrentSize;
var ratio = size.X / _lastRenderTarget.Width;
(*data).DesiredSize.Y = ratio * _lastRenderTarget.Height;
});
}
ImGui.SetNextWindowPos(new System.Numerics.Vector2(0, 0), ImGuiCond.FirstUseEver);
ImGui.Begin("Game Window");
ImGui.Image(_renderTargetId, ImGui.GetContentRegionAvail());
ImGui.End();
}
public void onAddedToScene()
{}
public void onSceneBackBufferSizeChanged( int newWidth, int newHeight )
{}
public void unload()
{}
}
}