mirror of
https://github.com/prime31/FNA-VSCode-Template.git
synced 2026-02-01 19:10:16 +07:00
ImGui up and running
This commit is contained in:
78
project_name/ImGui/ImGuiFinalRenderDelegate.cs
Normal file
78
project_name/ImGui/ImGuiFinalRenderDelegate.cs
Normal file
@@ -0,0 +1,78 @@
|
||||
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()
|
||||
{
|
||||
var core = typeof(Core).GetField("_instance", BindingFlags.Static | BindingFlags.NonPublic).GetValue(null) as Core;
|
||||
_imGuiRenderer = new ImGuiRenderer(core);
|
||||
_imGuiRenderer.RebuildFontAtlas();
|
||||
}
|
||||
|
||||
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(new GameTime(TimeSpan.FromDays(0), TimeSpan.FromMilliseconds(Time.deltaTime * 1000)));
|
||||
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()
|
||||
{}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user