diff --git a/Examples/ExampleMonoGame/DrawVertDeclaration.cs b/Examples/ExampleMonoGame/DrawVertDeclaration.cs
new file mode 100644
index 0000000..f548618
--- /dev/null
+++ b/Examples/ExampleMonoGame/DrawVertDeclaration.cs
@@ -0,0 +1,22 @@
+using Hexa.NET.ImGui;
+using Microsoft.Xna.Framework.Graphics;
+
+namespace ExampleMonoGame;
+
+public static class DrawVertDeclaration
+{
+ public static readonly VertexDeclaration Declaration;
+
+ public static readonly int Size;
+
+ static unsafe DrawVertDeclaration()
+ {
+ Size = sizeof(ImDrawVert);
+
+ VertexElement position = new VertexElement(0, VertexElementFormat.Vector2, VertexElementUsage.Position, 0);
+ VertexElement uv = new VertexElement(8, VertexElementFormat.Vector2, VertexElementUsage.TextureCoordinate, 0);
+ VertexElement color = new VertexElement(16, VertexElementFormat.Color, VertexElementUsage.Color, 0);
+
+ Declaration = new VertexDeclaration(Size, position, uv, color);
+ }
+}
diff --git a/Examples/ExampleMonoGame/ExampleMonoGame.csproj b/Examples/ExampleMonoGame/ExampleMonoGame.csproj
new file mode 100644
index 0000000..278c4a4
--- /dev/null
+++ b/Examples/ExampleMonoGame/ExampleMonoGame.csproj
@@ -0,0 +1,21 @@
+
+
+
+ WinExe
+ net8.0
+ Major
+ false
+ false
+ true
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Examples/ExampleMonoGame/ImGuiRenderer.cs b/Examples/ExampleMonoGame/ImGuiRenderer.cs
new file mode 100644
index 0000000..f42fc2d
--- /dev/null
+++ b/Examples/ExampleMonoGame/ImGuiRenderer.cs
@@ -0,0 +1,562 @@
+using System;
+using System.Collections.Generic;
+using System.Runtime.InteropServices;
+using Hexa.NET.ImGui;
+using Microsoft.Xna.Framework;
+using Microsoft.Xna.Framework.Graphics;
+using Microsoft.Xna.Framework.Input;
+
+namespace ExampleMonoGame;
+
+public class ImGuiRenderer
+{
+ private const float WHEEL_DELTA = 120;
+
+ private readonly Game _game;
+
+ // Graphics
+ private readonly GraphicsDevice _graphicsDevice;
+ private BasicEffect _effect;
+ private readonly RasterizerState _rasterizerState;
+
+ private byte[] _vertexData;
+ private VertexBuffer _vertexBuffer;
+ private int _vertexBufferSize;
+
+ private byte[] _indexData;
+ private IndexBuffer _indexBuffer;
+ private int _indexBufferSize;
+
+ // Textures
+ private readonly Dictionary _textures;
+ private int _nextTexId = 1;
+
+ // Input
+ private int _scrollWheelValue;
+ private int _horizontalScrollWheelValue;
+ private readonly Keys[] _allKeys = Enum.GetValues();
+
+ public ImGuiRenderer(Game game)
+ {
+ ArgumentNullException.ThrowIfNull(game);
+
+ ImGuiContextPtr context = ImGui.CreateContext();
+ ImGui.SetCurrentContext(context);
+
+ _game = game;
+ _graphicsDevice = game.GraphicsDevice;
+ _textures = new Dictionary();
+
+ _rasterizerState = new RasterizerState()
+ {
+ CullMode = CullMode.None,
+ DepthBias = 0,
+ FillMode = FillMode.Solid,
+ MultiSampleAntiAlias = false,
+ ScissorTestEnable = true,
+ SlopeScaleDepthBias = 0
+ };
+
+ SetupInput();
+ SetupBackendCapabilities();
+ }
+
+ private void SetupBackendCapabilities()
+ {
+ ImGuiIOPtr io = ImGui.GetIO();
+ io.BackendFlags |= ImGuiBackendFlags.RendererHasTextures;
+
+ // Set up platform IO for texture management
+ ImGuiPlatformIOPtr platformIO = ImGui.GetPlatformIO();
+
+ if (_graphicsDevice.GraphicsProfile == GraphicsProfile.Reach)
+ {
+ platformIO.RendererTextureMaxWidth = 2048;
+ platformIO.RendererTextureMaxHeight = 2048;
+ }
+ else
+ {
+ platformIO.RendererTextureMaxWidth = 4096;
+ platformIO.RendererTextureMaxHeight = 4096;
+ }
+ }
+
+ public virtual unsafe ImTextureRef BindTexture(Texture2D texture)
+ {
+ IntPtr texId = new IntPtr(_nextTexId++);
+
+ TextureInfo textureInfo = new TextureInfo()
+ {
+ Texture = texture,
+ IsManaged = false,
+ };
+
+ _textures[texId] = textureInfo;
+
+ return new ImTextureRef(null, texId);
+ }
+
+ public virtual void UnbindTexture(ImTextureRef textureRef)
+ {
+ if (_textures.TryGetValue(textureRef.TexID, out TextureInfo textureInfo))
+ {
+ if (textureInfo.IsManaged)
+ {
+ textureInfo.Texture?.Dispose();
+ }
+ _textures.Remove(textureRef.TexID);
+ }
+ }
+
+ public virtual void UpdateTexture(ImTextureDataPtr textureData)
+ {
+ switch (textureData.Status)
+ {
+ case ImTextureStatus.WantCreate:
+ CreateTexture(textureData);
+ break;
+
+ case ImTextureStatus.WantUpdates:
+ UpdateTextureData(textureData);
+ break;
+
+ case ImTextureStatus.WantDestroy:
+ DestroyTexture(textureData);
+ break;
+
+ case ImTextureStatus.Ok:
+ // Nothing to do
+ break;
+ }
+ }
+
+ private unsafe void CreateTexture(ImTextureDataPtr textureData)
+ {
+ SurfaceFormat format = textureData.Format == ImTextureFormat.Rgba32 ? SurfaceFormat.Color : SurfaceFormat.Alpha8;
+ Texture2D texture = new Texture2D(_graphicsDevice, textureData.Width, textureData.Height, false, format);
+
+ if (textureData.Pixels != null)
+ {
+ int pixelCount = textureData.Width * textureData.Height;
+ int bytesPerPixel = textureData.Format == ImTextureFormat.Rgba32 ? 4 : 1;
+ int dataSize = pixelCount * bytesPerPixel;
+
+ byte[] managedData = new byte[dataSize];
+ Marshal.Copy(new IntPtr(textureData.Pixels), managedData, 0, dataSize);
+ texture.SetData(managedData);
+ }
+
+ TextureInfo textureInfo = new TextureInfo()
+ {
+ Texture = texture,
+ IsManaged = true,
+ };
+
+ _textures[textureData.TexID] = textureInfo;
+ textureData.SetStatus(ImTextureStatus.Ok);
+ }
+
+ private unsafe void UpdateTextureData(ImTextureDataPtr textureData)
+ {
+ IntPtr texId = textureData.GetTexID();
+ if (!_textures.TryGetValue(texId, out TextureInfo textureInfo))
+ {
+ return;
+ }
+
+ Texture2D texture = textureInfo.Texture;
+
+ // Check if the texture's dimensions or format have changed
+ SurfaceFormat newFormat = textureData.Format == ImTextureFormat.Rgba32 ? SurfaceFormat.Color : SurfaceFormat.Alpha8;
+ if (texture.Width != textureData.Width || texture.Height != textureData.Height || texture.Format != newFormat)
+ {
+ texture.Dispose();
+ texture = new Texture2D(_graphicsDevice, textureData.Width, textureData.Height, false, newFormat);
+ textureInfo.Texture = texture;
+ }
+
+ // TODO: Look into doing only partial updates with textureData.Updates
+ // for now, just doing a full copy
+ if (textureData.Pixels != null)
+ {
+ int pixelCount = textureData.Width * textureData.Height;
+ int bytesPerPixel = textureData.Format == ImTextureFormat.Rgba32 ? 4 : 1;
+ int dataSize = pixelCount * bytesPerPixel;
+
+ byte[] managedData = new byte[dataSize];
+ Marshal.Copy(new IntPtr(textureData.Pixels), managedData, 0, dataSize);
+ texture.SetData(managedData);
+ }
+
+ textureData.SetStatus(ImTextureStatus.Ok);
+ }
+
+ private void DestroyTexture(ImTextureDataPtr textureData)
+ {
+ IntPtr texId = textureData.GetTexID();
+ if (_textures.TryGetValue(texId, out TextureInfo textureInfo))
+ {
+ if (textureInfo.IsManaged)
+ {
+ textureInfo.Texture?.Dispose();
+ }
+ _textures.Remove(texId);
+ }
+ }
+
+ public virtual void BeforeLayout(GameTime gameTime)
+ {
+ ImGui.GetIO().DeltaTime = (float)gameTime.ElapsedGameTime.TotalSeconds;
+ UpdateInput();
+ ImGui.NewFrame();
+ }
+
+ public virtual void AfterLayout()
+ {
+ ImGui.Render();
+
+ unsafe
+ {
+ ImDrawDataPtr drawData = ImGui.GetDrawData();
+ ProcessTextureUpdates(drawData);
+ RenderDrawData(drawData);
+ }
+ }
+
+ private unsafe void ProcessTextureUpdates(ImDrawDataPtr drawData)
+ {
+ if (drawData.Textures.Data == null) return;
+
+ for (int i = 0; i < drawData.Textures.Size; i++)
+ {
+ ImTextureDataPtr textureData = drawData.Textures.Data[i];
+ UpdateTexture(textureData);
+ }
+ }
+
+ protected virtual void SetupInput()
+ {
+ ImGuiIOPtr io = ImGui.GetIO();
+
+ //////////////////////////////////////////////
+ // MonoGame Specific
+ _game.Window.TextInput += (s, a) =>
+ {
+ if (a.Character == '\t')
+ {
+ return;
+ }
+
+ io.AddInputCharacter(a.Character);
+ };
+ //////////////////////////////////////////////
+
+ //////////////////////////////////////////////
+ // FNA-specific
+ // TextInputEx.TextInput += c =>
+ // {
+ // if (c == '\t')
+ // {
+ // return;
+ // }
+ // io.AddInputCharacter(c);
+ // };
+ //////////////////////////////////////////////
+ }
+
+ protected virtual Effect UpdateEffect(Texture2D texture)
+ {
+ ImGuiIOPtr io = ImGui.GetIO();
+
+ _effect ??= new BasicEffect(_graphicsDevice);
+
+ _effect.World = Matrix.Identity;
+ _effect.View = Matrix.Identity;
+ _effect.Projection = Matrix.CreateOrthographicOffCenter(0.0f, io.DisplaySize.X, io.DisplaySize.Y, 0.0f, -1.0f, 1.0f);
+ _effect.TextureEnabled = true;
+ _effect.Texture = texture;
+ _effect.VertexColorEnabled = true;
+
+ return _effect;
+ }
+
+ protected virtual void UpdateInput()
+ {
+ if (!_game.IsActive)
+ {
+ return;
+ }
+
+ ImGuiIOPtr io = ImGui.GetIO();
+ MouseState mouse = Mouse.GetState();
+ KeyboardState keyboard = Keyboard.GetState();
+
+ io.AddMousePosEvent(mouse.X, mouse.Y);
+ io.AddMouseButtonEvent(0, mouse.LeftButton == ButtonState.Pressed);
+ io.AddMouseButtonEvent(1, mouse.RightButton == ButtonState.Pressed);
+ io.AddMouseButtonEvent(2, mouse.MiddleButton == ButtonState.Pressed);
+ io.AddMouseButtonEvent(3, mouse.XButton1 == ButtonState.Pressed);
+ io.AddMouseButtonEvent(4, mouse.XButton2 == ButtonState.Pressed);
+
+ float mouseWheelX = (mouse.HorizontalScrollWheelValue - _horizontalScrollWheelValue) / WHEEL_DELTA;
+ float mouseWheelY = (mouse.ScrollWheelValue - _scrollWheelValue) / WHEEL_DELTA;
+ io.AddMouseWheelEvent(mouseWheelX, mouseWheelY);
+
+ _scrollWheelValue = mouse.ScrollWheelValue;
+ _horizontalScrollWheelValue = mouse.HorizontalScrollWheelValue;
+
+ foreach (Keys key in _allKeys)
+ {
+ if (TryMapKeys(key, out ImGuiKey imguiKey))
+ {
+ io.AddKeyEvent(imguiKey, keyboard.IsKeyDown(key));
+ }
+ }
+
+ int backBufferWidth = _graphicsDevice.PresentationParameters.BackBufferWidth;
+ int backBufferHeight = _graphicsDevice.PresentationParameters.BackBufferHeight;
+ io.DisplaySize = new System.Numerics.Vector2(backBufferWidth, backBufferHeight);
+
+ io.DisplayFramebufferScale = System.Numerics.Vector2.One;
+ }
+
+ private bool TryMapKeys(Keys key, out ImGuiKey imguiKey)
+ {
+ // Special case not handled in the switch..
+ // If the actual key we put in is "None", return none and true;
+ // otherwise, return none and false.
+ if (key == Keys.None)
+ {
+ imguiKey = ImGuiKey.None;
+ return true;
+ }
+
+ imguiKey = key switch
+ {
+ Keys.Back => ImGuiKey.Backspace,
+ Keys.Tab => ImGuiKey.Tab,
+ Keys.Enter => ImGuiKey.Enter,
+ Keys.CapsLock => ImGuiKey.CapsLock,
+ Keys.Escape => ImGuiKey.Escape,
+ Keys.Space => ImGuiKey.Space,
+ Keys.PageUp => ImGuiKey.PageUp,
+ Keys.PageDown => ImGuiKey.PageDown,
+ Keys.End => ImGuiKey.End,
+ Keys.Home => ImGuiKey.Home,
+ Keys.Left => ImGuiKey.LeftArrow,
+ Keys.Right => ImGuiKey.RightArrow,
+ Keys.Up => ImGuiKey.UpArrow,
+ Keys.Down => ImGuiKey.DownArrow,
+ Keys.PrintScreen => ImGuiKey.PrintScreen,
+ Keys.Insert => ImGuiKey.Insert,
+ Keys.Delete => ImGuiKey.Delete,
+ >= Keys.D0 and <= Keys.D9 => ImGuiKey.Key0 + (key - Keys.D0),
+ >= Keys.A and <= Keys.Z => ImGuiKey.A + (key - Keys.A),
+ >= Keys.NumPad0 and <= Keys.NumPad9 => ImGuiKey.Keypad0 + (key - Keys.NumPad0),
+ Keys.Multiply => ImGuiKey.KeypadMultiply,
+ Keys.Add => ImGuiKey.KeypadAdd,
+ Keys.Subtract => ImGuiKey.KeypadSubtract,
+ Keys.Decimal => ImGuiKey.KeypadDecimal,
+ Keys.Divide => ImGuiKey.KeypadDivide,
+ >= Keys.F1 and <= Keys.F24 => ImGuiKey.F1 + (key - Keys.F1),
+ Keys.NumLock => ImGuiKey.NumLock,
+ Keys.Scroll => ImGuiKey.ScrollLock,
+ Keys.LeftShift => ImGuiKey.ModShift,
+ Keys.LeftControl => ImGuiKey.ModCtrl,
+ Keys.LeftAlt => ImGuiKey.ModAlt,
+ Keys.OemSemicolon => ImGuiKey.Semicolon,
+ Keys.OemPlus => ImGuiKey.Equal,
+ Keys.OemComma => ImGuiKey.Comma,
+ Keys.OemMinus => ImGuiKey.Minus,
+ Keys.OemPeriod => ImGuiKey.Period,
+ Keys.OemQuestion => ImGuiKey.Slash,
+ Keys.OemTilde => ImGuiKey.GraveAccent,
+ Keys.OemOpenBrackets => ImGuiKey.LeftBracket,
+ Keys.OemCloseBrackets => ImGuiKey.RightBracket,
+ Keys.OemPipe => ImGuiKey.Backslash,
+ Keys.OemQuotes => ImGuiKey.Apostrophe,
+ Keys.BrowserBack => ImGuiKey.AppBack,
+ Keys.BrowserForward => ImGuiKey.AppForward,
+ _ => ImGuiKey.None
+ };
+
+ return imguiKey != ImGuiKey.None;
+ }
+
+ private unsafe void RenderDrawData(ImDrawData* drawData)
+ {
+ // Cache states so they can be restored when we're done.
+ Viewport lastViewport = _graphicsDevice.Viewport;
+ Rectangle lastScissorBox = _graphicsDevice.ScissorRectangle;
+ RasterizerState lastRasterizer = _graphicsDevice.RasterizerState;
+ DepthStencilState lastDepthStencil = _graphicsDevice.DepthStencilState;
+ Color lastBlendFactor = _graphicsDevice.BlendFactor;
+ BlendState lastBlendState = _graphicsDevice.BlendState;
+ SamplerState lastSamplerState = _graphicsDevice.SamplerStates[0];
+
+ // Setup render state:
+ // - alpha-blending enabled
+ _graphicsDevice.BlendFactor = Color.White;
+ _graphicsDevice.BlendState = BlendState.NonPremultiplied;
+
+ // - No face culling
+ // - Scissor testing enabled
+ _graphicsDevice.RasterizerState = _rasterizerState;
+
+ // - Depth read-only (testing enabled, writes disabled)
+ _graphicsDevice.DepthStencilState = DepthStencilState.DepthRead;
+
+ // - Point filtering for textures (no interpolation)
+ _graphicsDevice.SamplerStates[0] = SamplerState.PointClamp;
+
+ // Handle cases of screen coordinates != from framebuffer coordinates (e.g. retina displays)
+ drawData->ScaleClipRects(ImGui.GetIO().DisplayFramebufferScale);
+
+ // Setup projection
+ _graphicsDevice.Viewport = new Viewport(0, 0, _graphicsDevice.PresentationParameters.BackBufferWidth, _graphicsDevice.PresentationParameters.BackBufferHeight);
+
+ UpdateBuffers(drawData);
+
+ RenderCommandLists(drawData);
+
+ // Restore modified state
+ _graphicsDevice.Viewport = lastViewport;
+ _graphicsDevice.ScissorRectangle = lastScissorBox;
+ _graphicsDevice.RasterizerState = lastRasterizer;
+ _graphicsDevice.DepthStencilState = lastDepthStencil;
+ _graphicsDevice.BlendState = lastBlendState;
+ _graphicsDevice.BlendFactor = lastBlendFactor;
+ _graphicsDevice.SamplerStates[0] = lastSamplerState;
+ }
+
+ private unsafe void UpdateBuffers(ImDrawData* drawData)
+ {
+ if (drawData->TotalVtxCount == 0)
+ {
+ return;
+ }
+
+ // Expand buffers if we need more room
+ if (drawData->TotalVtxCount > _vertexBufferSize)
+ {
+ _vertexBuffer?.Dispose();
+
+ _vertexBufferSize = (int)(drawData->TotalVtxCount * 1.5f);
+ _vertexBuffer = new VertexBuffer(_graphicsDevice, DrawVertDeclaration.Declaration, _vertexBufferSize, BufferUsage.None);
+ _vertexData = new byte[_vertexBufferSize * DrawVertDeclaration.Size];
+ }
+
+ if (drawData->TotalIdxCount > _indexBufferSize)
+ {
+ _indexBuffer?.Dispose();
+
+ _indexBufferSize = (int)(drawData->TotalIdxCount * 1.5f);
+ _indexBuffer = new IndexBuffer(_graphicsDevice, IndexElementSize.SixteenBits, _indexBufferSize, BufferUsage.None);
+ _indexData = new byte[_indexBufferSize * sizeof(ushort)];
+ }
+
+ // Copy ImGui's vertices and indices to a set of managed byte arrays
+ int vtxOffset = 0;
+ int idxOffset = 0;
+
+ for (int n = 0; n < drawData->CmdListsCount; n++)
+ {
+ ImDrawList* cmdList = drawData->CmdLists.Data[n];
+
+ fixed (void* vtxDstPtr = &_vertexData[vtxOffset * DrawVertDeclaration.Size])
+ {
+ fixed (void* idxDstPtr = &_indexData[idxOffset * sizeof(ushort)])
+ {
+ Buffer.MemoryCopy(cmdList->VtxBuffer.Data, vtxDstPtr, _vertexData.Length, cmdList->VtxBuffer.Size * DrawVertDeclaration.Size);
+ Buffer.MemoryCopy(cmdList->IdxBuffer.Data, idxDstPtr, _indexData.Length, cmdList->IdxBuffer.Size * sizeof(ushort));
+ }
+ }
+
+ vtxOffset += cmdList->VtxBuffer.Size;
+ idxOffset += cmdList->IdxBuffer.Size;
+ }
+
+ // Copy the managed byte arrays to the gpu vertex- and index buffers
+ _vertexBuffer.SetData(_vertexData, 0, drawData->TotalVtxCount * DrawVertDeclaration.Size);
+ _indexBuffer.SetData(_indexData, 0, drawData->TotalIdxCount * sizeof(ushort));
+ }
+
+ private unsafe void RenderCommandLists(ImDrawData* drawData)
+ {
+ _graphicsDevice.SetVertexBuffer(_vertexBuffer);
+ _graphicsDevice.Indices = _indexBuffer;
+
+ int vtxOffset = 0;
+ int idxOffset = 0;
+
+ for (int n = 0; n < drawData->CmdListsCount; n++)
+ {
+ ImDrawList* cmdList = drawData->CmdLists.Data[n];
+
+ for (int cmdi = 0; cmdi < cmdList->CmdBuffer.Size; cmdi++)
+ {
+ ImDrawCmd* drawCmd = &cmdList->CmdBuffer.Data[cmdi];
+
+ if (drawCmd->ElemCount == 0)
+ {
+ continue;
+ }
+
+ // In v1.92, we need to handle ImTextureRef instead of ImTextureID
+ ImTextureRef textureRef = drawCmd->TexRef;
+ ImTextureID texId = textureRef.GetTexID();
+ if (!_textures.TryGetValue(texId, out TextureInfo textureInfo))
+ {
+ throw new InvalidOperationException($"Could not find a texture with id '{texId}', please check your bindings");
+ }
+
+ _graphicsDevice.ScissorRectangle = new Rectangle(
+ (int)drawCmd->ClipRect.X,
+ (int)drawCmd->ClipRect.Y,
+ (int)(drawCmd->ClipRect.Z - drawCmd->ClipRect.X),
+ (int)(drawCmd->ClipRect.W - drawCmd->ClipRect.Y)
+ );
+
+ Effect effect = UpdateEffect(textureInfo.Texture);
+
+ foreach (EffectPass pass in effect.CurrentTechnique.Passes)
+ {
+ pass.Apply();
+
+#pragma warning disable CS0618 // // FNA does not expose an alternative method.
+ _graphicsDevice.DrawIndexedPrimitives(
+ primitiveType: PrimitiveType.TriangleList,
+ baseVertex: (int)drawCmd->VtxOffset + vtxOffset,
+ minVertexIndex: 0,
+ numVertices: cmdList->VtxBuffer.Size,
+ startIndex: (int)drawCmd->IdxOffset + idxOffset,
+ primitiveCount: (int)drawCmd->ElemCount / 3
+ );
+#pragma warning restore CS0618
+ }
+ }
+
+ vtxOffset += cmdList->VtxBuffer.Size;
+ idxOffset += cmdList->IdxBuffer.Size;
+ }
+ }
+
+ public void Dispose()
+ {
+ _vertexBuffer?.Dispose();
+ _indexBuffer?.Dispose();
+ _effect?.Dispose();
+
+ // Clean up managed textures
+ foreach(TextureInfo textureInfo in _textures.Values)
+ {
+ if (textureInfo.IsManaged)
+ {
+ textureInfo.Texture?.Dispose();
+ }
+ }
+ _textures.Clear();
+
+ ImGui.DestroyContext();
+ }
+}
diff --git a/Examples/ExampleMonoGame/Program.cs b/Examples/ExampleMonoGame/Program.cs
new file mode 100644
index 0000000..8914af0
--- /dev/null
+++ b/Examples/ExampleMonoGame/Program.cs
@@ -0,0 +1,4 @@
+using ExampleMonoGame;
+
+using var game = new SampleGame();
+game.Run();
diff --git a/Examples/ExampleMonoGame/SampleGame.cs b/Examples/ExampleMonoGame/SampleGame.cs
new file mode 100644
index 0000000..b229b79
--- /dev/null
+++ b/Examples/ExampleMonoGame/SampleGame.cs
@@ -0,0 +1,166 @@
+using System;
+using Hexa.NET.ImGui;
+using Hexa.NET.Utilities.Text;
+using Microsoft.Xna.Framework;
+using Microsoft.Xna.Framework.Graphics;
+using Num = System.Numerics;
+
+namespace ExampleMonoGame;
+
+///
+/// Simple Monogame + ImGui example
+///
+public class SampleGame : Game
+{
+ private GraphicsDeviceManager _graphics;
+ private ImGuiRenderer _imGuiRenderer;
+
+ private Texture2D _xnaTexture;
+ private ImTextureRef _imGuiTexture;
+
+ public SampleGame()
+ {
+ _graphics = new GraphicsDeviceManager(this);
+ _graphics.PreferredBackBufferWidth = 1280;
+ _graphics.PreferredBackBufferHeight = 720;
+ _graphics.PreferMultiSampling = true;
+
+ IsMouseVisible = true;
+ }
+
+ protected override void Initialize()
+ {
+ _imGuiRenderer = new ImGuiRenderer(this);
+ base.Initialize();
+ }
+
+ protected override void LoadContent()
+ {
+ // Texture loading example
+
+ // First, load the texture as a Texture2D (can also be done using the content pipeline)
+ _xnaTexture = CreateTexture(GraphicsDevice, 300, 150, pixel =>
+ {
+ int red = (pixel % 300) / 2;
+ return new Color(red, 1, 1);
+ });
+
+ // Then, bind it to an ImGui-friendly pointer that we can use during regular ImGui.** calls.
+ _imGuiTexture = _imGuiRenderer.BindTexture(_xnaTexture);
+
+ base.LoadContent();
+ }
+
+ protected override void Draw(GameTime gameTime)
+ {
+ GraphicsDevice.Clear(new Color(_clearColor.X, _clearColor.Y, _clearColor.Z));
+
+ // Call BeforeLayout first to set things up
+ _imGuiRenderer.BeforeLayout(gameTime);
+
+ // Draw our UI
+ ImGuiLayout();
+
+ // Call AfterLayout now to finish up and draw all the things
+ _imGuiRenderer.AfterLayout();
+
+ base.Draw(gameTime);
+ }
+
+ // Direct port of the example at https://github.com/ocornut/imgui/blob/master/examples/example_sdl2_opengl2/main.cpp
+ private float _floatValue;
+
+ private bool _showTestWindow;
+ private bool _showAnotherWindow;
+ private Num.Vector3 _clearColor = new Num.Vector3(114f / 255f, 144f / 255f, 154f / 255f);
+ private readonly byte[] _textBuffer = new byte[100];
+
+ protected virtual void ImGuiLayout()
+ {
+ // 1. Show a simple window
+ // Tip: if we don't call ImGui.Begin()/ImGui.End() the widgets appears in a window automatically called "Debug"
+ {
+ ImGui.Text("Hello, world!"u8);
+ ImGui.SliderFloat("float"u8, ref _floatValue, 0.0f, 1.0f, string.Empty);
+ ImGui.ColorEdit3("clear color", ref _clearColor);
+ if (ImGui.Button("Test Window"u8))
+ {
+ _showTestWindow = !_showTestWindow;
+ }
+
+ if (ImGui.Button("Another Window"u8))
+ {
+ _showAnotherWindow = !_showAnotherWindow;
+ }
+
+ // Use StrBuilder for dynamic text instead of string.Format
+ // see:
+ unsafe
+ {
+ byte* buffer = stackalloc byte[128];
+ StrBuilder builder = new(buffer, 128);
+ builder.Reset();
+ builder.Append("Application average "u8);
+ builder.Append(1000f / ImGui.GetIO().Framerate, 3);
+ builder.Append(" ms/frame ("u8);
+ builder.Append(ImGui.GetIO().Framerate, 1);
+ builder.Append(" FPS)"u8);
+ builder.End();
+ ImGui.Text(builder);
+ }
+
+ ImGui.InputText("Text input"u8, ref _textBuffer[0], 100);
+
+ ImGui.Text("Texture sample"u8);
+ ImGui.Image(_imGuiTexture, new Num.Vector2(300, 150), Num.Vector2.Zero, Num.Vector2.One);
+ }
+
+ // 2. Show another simple window, this time using an explicit Begin/End pair
+ if (_showAnotherWindow)
+ {
+ ImGui.SetNextWindowSize(new Num.Vector2(200, 100), ImGuiCond.FirstUseEver);
+ ImGui.Begin("Another Window"u8, ref _showAnotherWindow);
+ ImGui.Text("Hello"u8);
+ ImGui.End();
+ }
+
+ // 3. Show the ImGui test window. Most of the sample code is in ImGui.ShowTestWindow()
+ if (_showTestWindow)
+ {
+ ImGui.SetNextWindowPos(new Num.Vector2(650, 20), ImGuiCond.FirstUseEver);
+ ImGui.ShowDemoWindow(ref _showTestWindow);
+ }
+ }
+
+ public static Texture2D CreateTexture(GraphicsDevice device, int width, int height, Func paint)
+ {
+ //initialize a texture
+ Texture2D texture = new Texture2D(device, width, height);
+
+ //the array holds the color for each pixel in the texture
+ Color[] data = new Color[width * height];
+ for (int pixel = 0; pixel < data.Length; pixel++)
+ {
+ //the function applies the color according to the specified pixel
+ data[pixel] = paint(pixel);
+ }
+
+ //set the color
+ texture.SetData(data);
+
+ return texture;
+ }
+
+ protected override void UnloadContent()
+ {
+ // Clean up ImGui resources
+ if (_imGuiTexture.TexID != ImTextureID.Null)
+ {
+ _imGuiRenderer.UnbindTexture(_imGuiTexture);
+ }
+
+ _imGuiRenderer?.Dispose();
+
+ base.UnloadContent();
+ }
+}
diff --git a/Examples/ExampleMonoGame/TextureInfo.cs b/Examples/ExampleMonoGame/TextureInfo.cs
new file mode 100644
index 0000000..5004b28
--- /dev/null
+++ b/Examples/ExampleMonoGame/TextureInfo.cs
@@ -0,0 +1,9 @@
+using Microsoft.Xna.Framework.Graphics;
+
+namespace ExampleMonoGame;
+
+public sealed class TextureInfo
+{
+ public Texture2D Texture { get; set; }
+ public bool IsManaged { get; set; }
+}
diff --git a/Hexa.NET.ImGui.sln b/Hexa.NET.ImGui.sln
index 58726cd..c1affa8 100644
--- a/Hexa.NET.ImGui.sln
+++ b/Hexa.NET.ImGui.sln
@@ -49,142 +49,420 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ExampleSDL3GPU", "Examples\
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ExampleSDL3OpenGL3", "Examples\ExampleSDL3OpenGL3\ExampleSDL3OpenGL3.csproj", "{908E06EF-201E-9A8C-B40E-2C48F9357DD4}"
EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ExampleMonoGame", "Examples\ExampleMonoGame\ExampleMonoGame.csproj", "{B41EDEA9-8352-42A6-A727-01AB4A518D7C}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
+ Debug|x64 = Debug|x64
+ Debug|x86 = Debug|x86
NodeEditor|Any CPU = NodeEditor|Any CPU
+ NodeEditor|x64 = NodeEditor|x64
+ NodeEditor|x86 = NodeEditor|x86
Release|Any CPU = Release|Any CPU
+ Release|x64 = Release|x64
+ Release|x86 = Release|x86
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{AF90A242-F593-40D0-9305-65D475EDE3C0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{AF90A242-F593-40D0-9305-65D475EDE3C0}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {AF90A242-F593-40D0-9305-65D475EDE3C0}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {AF90A242-F593-40D0-9305-65D475EDE3C0}.Debug|x64.Build.0 = Debug|Any CPU
+ {AF90A242-F593-40D0-9305-65D475EDE3C0}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {AF90A242-F593-40D0-9305-65D475EDE3C0}.Debug|x86.Build.0 = Debug|Any CPU
{AF90A242-F593-40D0-9305-65D475EDE3C0}.NodeEditor|Any CPU.ActiveCfg = NodeEditor|Any CPU
{AF90A242-F593-40D0-9305-65D475EDE3C0}.NodeEditor|Any CPU.Build.0 = NodeEditor|Any CPU
+ {AF90A242-F593-40D0-9305-65D475EDE3C0}.NodeEditor|x64.ActiveCfg = NodeEditor|Any CPU
+ {AF90A242-F593-40D0-9305-65D475EDE3C0}.NodeEditor|x64.Build.0 = NodeEditor|Any CPU
+ {AF90A242-F593-40D0-9305-65D475EDE3C0}.NodeEditor|x86.ActiveCfg = NodeEditor|Any CPU
+ {AF90A242-F593-40D0-9305-65D475EDE3C0}.NodeEditor|x86.Build.0 = NodeEditor|Any CPU
{AF90A242-F593-40D0-9305-65D475EDE3C0}.Release|Any CPU.ActiveCfg = Release|Any CPU
{AF90A242-F593-40D0-9305-65D475EDE3C0}.Release|Any CPU.Build.0 = Release|Any CPU
+ {AF90A242-F593-40D0-9305-65D475EDE3C0}.Release|x64.ActiveCfg = Release|Any CPU
+ {AF90A242-F593-40D0-9305-65D475EDE3C0}.Release|x64.Build.0 = Release|Any CPU
+ {AF90A242-F593-40D0-9305-65D475EDE3C0}.Release|x86.ActiveCfg = Release|Any CPU
+ {AF90A242-F593-40D0-9305-65D475EDE3C0}.Release|x86.Build.0 = Release|Any CPU
{4BF7EF20-6869-4BF8-8D67-F9BD34C036D5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{4BF7EF20-6869-4BF8-8D67-F9BD34C036D5}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {4BF7EF20-6869-4BF8-8D67-F9BD34C036D5}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {4BF7EF20-6869-4BF8-8D67-F9BD34C036D5}.Debug|x64.Build.0 = Debug|Any CPU
+ {4BF7EF20-6869-4BF8-8D67-F9BD34C036D5}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {4BF7EF20-6869-4BF8-8D67-F9BD34C036D5}.Debug|x86.Build.0 = Debug|Any CPU
{4BF7EF20-6869-4BF8-8D67-F9BD34C036D5}.NodeEditor|Any CPU.ActiveCfg = Release|Any CPU
{4BF7EF20-6869-4BF8-8D67-F9BD34C036D5}.NodeEditor|Any CPU.Build.0 = Release|Any CPU
+ {4BF7EF20-6869-4BF8-8D67-F9BD34C036D5}.NodeEditor|x64.ActiveCfg = NodeEditor|Any CPU
+ {4BF7EF20-6869-4BF8-8D67-F9BD34C036D5}.NodeEditor|x64.Build.0 = NodeEditor|Any CPU
+ {4BF7EF20-6869-4BF8-8D67-F9BD34C036D5}.NodeEditor|x86.ActiveCfg = NodeEditor|Any CPU
+ {4BF7EF20-6869-4BF8-8D67-F9BD34C036D5}.NodeEditor|x86.Build.0 = NodeEditor|Any CPU
{4BF7EF20-6869-4BF8-8D67-F9BD34C036D5}.Release|Any CPU.ActiveCfg = Release|Any CPU
{4BF7EF20-6869-4BF8-8D67-F9BD34C036D5}.Release|Any CPU.Build.0 = Release|Any CPU
+ {4BF7EF20-6869-4BF8-8D67-F9BD34C036D5}.Release|x64.ActiveCfg = Release|Any CPU
+ {4BF7EF20-6869-4BF8-8D67-F9BD34C036D5}.Release|x64.Build.0 = Release|Any CPU
+ {4BF7EF20-6869-4BF8-8D67-F9BD34C036D5}.Release|x86.ActiveCfg = Release|Any CPU
+ {4BF7EF20-6869-4BF8-8D67-F9BD34C036D5}.Release|x86.Build.0 = Release|Any CPU
{DE641B27-84A5-438D-9E7D-866BFF9C4554}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{DE641B27-84A5-438D-9E7D-866BFF9C4554}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {DE641B27-84A5-438D-9E7D-866BFF9C4554}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {DE641B27-84A5-438D-9E7D-866BFF9C4554}.Debug|x64.Build.0 = Debug|Any CPU
+ {DE641B27-84A5-438D-9E7D-866BFF9C4554}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {DE641B27-84A5-438D-9E7D-866BFF9C4554}.Debug|x86.Build.0 = Debug|Any CPU
{DE641B27-84A5-438D-9E7D-866BFF9C4554}.NodeEditor|Any CPU.ActiveCfg = Release|Any CPU
{DE641B27-84A5-438D-9E7D-866BFF9C4554}.NodeEditor|Any CPU.Build.0 = Release|Any CPU
+ {DE641B27-84A5-438D-9E7D-866BFF9C4554}.NodeEditor|x64.ActiveCfg = NodeEditor|Any CPU
+ {DE641B27-84A5-438D-9E7D-866BFF9C4554}.NodeEditor|x64.Build.0 = NodeEditor|Any CPU
+ {DE641B27-84A5-438D-9E7D-866BFF9C4554}.NodeEditor|x86.ActiveCfg = NodeEditor|Any CPU
+ {DE641B27-84A5-438D-9E7D-866BFF9C4554}.NodeEditor|x86.Build.0 = NodeEditor|Any CPU
{DE641B27-84A5-438D-9E7D-866BFF9C4554}.Release|Any CPU.ActiveCfg = Release|Any CPU
{DE641B27-84A5-438D-9E7D-866BFF9C4554}.Release|Any CPU.Build.0 = Release|Any CPU
+ {DE641B27-84A5-438D-9E7D-866BFF9C4554}.Release|x64.ActiveCfg = Release|Any CPU
+ {DE641B27-84A5-438D-9E7D-866BFF9C4554}.Release|x64.Build.0 = Release|Any CPU
+ {DE641B27-84A5-438D-9E7D-866BFF9C4554}.Release|x86.ActiveCfg = Release|Any CPU
+ {DE641B27-84A5-438D-9E7D-866BFF9C4554}.Release|x86.Build.0 = Release|Any CPU
{FDBF69AA-5B28-4A4C-AE2B-C30DCC7CED91}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{FDBF69AA-5B28-4A4C-AE2B-C30DCC7CED91}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {FDBF69AA-5B28-4A4C-AE2B-C30DCC7CED91}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {FDBF69AA-5B28-4A4C-AE2B-C30DCC7CED91}.Debug|x64.Build.0 = Debug|Any CPU
+ {FDBF69AA-5B28-4A4C-AE2B-C30DCC7CED91}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {FDBF69AA-5B28-4A4C-AE2B-C30DCC7CED91}.Debug|x86.Build.0 = Debug|Any CPU
{FDBF69AA-5B28-4A4C-AE2B-C30DCC7CED91}.NodeEditor|Any CPU.ActiveCfg = Release|Any CPU
{FDBF69AA-5B28-4A4C-AE2B-C30DCC7CED91}.NodeEditor|Any CPU.Build.0 = Release|Any CPU
+ {FDBF69AA-5B28-4A4C-AE2B-C30DCC7CED91}.NodeEditor|x64.ActiveCfg = NodeEditor|Any CPU
+ {FDBF69AA-5B28-4A4C-AE2B-C30DCC7CED91}.NodeEditor|x64.Build.0 = NodeEditor|Any CPU
+ {FDBF69AA-5B28-4A4C-AE2B-C30DCC7CED91}.NodeEditor|x86.ActiveCfg = NodeEditor|Any CPU
+ {FDBF69AA-5B28-4A4C-AE2B-C30DCC7CED91}.NodeEditor|x86.Build.0 = NodeEditor|Any CPU
{FDBF69AA-5B28-4A4C-AE2B-C30DCC7CED91}.Release|Any CPU.ActiveCfg = Release|Any CPU
{FDBF69AA-5B28-4A4C-AE2B-C30DCC7CED91}.Release|Any CPU.Build.0 = Release|Any CPU
+ {FDBF69AA-5B28-4A4C-AE2B-C30DCC7CED91}.Release|x64.ActiveCfg = Release|Any CPU
+ {FDBF69AA-5B28-4A4C-AE2B-C30DCC7CED91}.Release|x64.Build.0 = Release|Any CPU
+ {FDBF69AA-5B28-4A4C-AE2B-C30DCC7CED91}.Release|x86.ActiveCfg = Release|Any CPU
+ {FDBF69AA-5B28-4A4C-AE2B-C30DCC7CED91}.Release|x86.Build.0 = Release|Any CPU
{EE66DB89-A45C-45C4-A23B-99EF0BED4350}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{EE66DB89-A45C-45C4-A23B-99EF0BED4350}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {EE66DB89-A45C-45C4-A23B-99EF0BED4350}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {EE66DB89-A45C-45C4-A23B-99EF0BED4350}.Debug|x64.Build.0 = Debug|Any CPU
+ {EE66DB89-A45C-45C4-A23B-99EF0BED4350}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {EE66DB89-A45C-45C4-A23B-99EF0BED4350}.Debug|x86.Build.0 = Debug|Any CPU
{EE66DB89-A45C-45C4-A23B-99EF0BED4350}.NodeEditor|Any CPU.ActiveCfg = Release|Any CPU
{EE66DB89-A45C-45C4-A23B-99EF0BED4350}.NodeEditor|Any CPU.Build.0 = Release|Any CPU
+ {EE66DB89-A45C-45C4-A23B-99EF0BED4350}.NodeEditor|x64.ActiveCfg = NodeEditor|Any CPU
+ {EE66DB89-A45C-45C4-A23B-99EF0BED4350}.NodeEditor|x64.Build.0 = NodeEditor|Any CPU
+ {EE66DB89-A45C-45C4-A23B-99EF0BED4350}.NodeEditor|x86.ActiveCfg = NodeEditor|Any CPU
+ {EE66DB89-A45C-45C4-A23B-99EF0BED4350}.NodeEditor|x86.Build.0 = NodeEditor|Any CPU
{EE66DB89-A45C-45C4-A23B-99EF0BED4350}.Release|Any CPU.ActiveCfg = Release|Any CPU
{EE66DB89-A45C-45C4-A23B-99EF0BED4350}.Release|Any CPU.Build.0 = Release|Any CPU
+ {EE66DB89-A45C-45C4-A23B-99EF0BED4350}.Release|x64.ActiveCfg = Release|Any CPU
+ {EE66DB89-A45C-45C4-A23B-99EF0BED4350}.Release|x64.Build.0 = Release|Any CPU
+ {EE66DB89-A45C-45C4-A23B-99EF0BED4350}.Release|x86.ActiveCfg = Release|Any CPU
+ {EE66DB89-A45C-45C4-A23B-99EF0BED4350}.Release|x86.Build.0 = Release|Any CPU
{539452FB-6300-470C-8C46-E40BBF1C67BE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{539452FB-6300-470C-8C46-E40BBF1C67BE}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {539452FB-6300-470C-8C46-E40BBF1C67BE}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {539452FB-6300-470C-8C46-E40BBF1C67BE}.Debug|x64.Build.0 = Debug|Any CPU
+ {539452FB-6300-470C-8C46-E40BBF1C67BE}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {539452FB-6300-470C-8C46-E40BBF1C67BE}.Debug|x86.Build.0 = Debug|Any CPU
{539452FB-6300-470C-8C46-E40BBF1C67BE}.NodeEditor|Any CPU.ActiveCfg = Release|Any CPU
{539452FB-6300-470C-8C46-E40BBF1C67BE}.NodeEditor|Any CPU.Build.0 = Release|Any CPU
+ {539452FB-6300-470C-8C46-E40BBF1C67BE}.NodeEditor|x64.ActiveCfg = NodeEditor|Any CPU
+ {539452FB-6300-470C-8C46-E40BBF1C67BE}.NodeEditor|x64.Build.0 = NodeEditor|Any CPU
+ {539452FB-6300-470C-8C46-E40BBF1C67BE}.NodeEditor|x86.ActiveCfg = NodeEditor|Any CPU
+ {539452FB-6300-470C-8C46-E40BBF1C67BE}.NodeEditor|x86.Build.0 = NodeEditor|Any CPU
{539452FB-6300-470C-8C46-E40BBF1C67BE}.Release|Any CPU.ActiveCfg = Release|Any CPU
{539452FB-6300-470C-8C46-E40BBF1C67BE}.Release|Any CPU.Build.0 = Release|Any CPU
+ {539452FB-6300-470C-8C46-E40BBF1C67BE}.Release|x64.ActiveCfg = Release|Any CPU
+ {539452FB-6300-470C-8C46-E40BBF1C67BE}.Release|x64.Build.0 = Release|Any CPU
+ {539452FB-6300-470C-8C46-E40BBF1C67BE}.Release|x86.ActiveCfg = Release|Any CPU
+ {539452FB-6300-470C-8C46-E40BBF1C67BE}.Release|x86.Build.0 = Release|Any CPU
{EB050117-B80E-4B06-AE34-CB155DEE50BA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{EB050117-B80E-4B06-AE34-CB155DEE50BA}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {EB050117-B80E-4B06-AE34-CB155DEE50BA}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {EB050117-B80E-4B06-AE34-CB155DEE50BA}.Debug|x64.Build.0 = Debug|Any CPU
+ {EB050117-B80E-4B06-AE34-CB155DEE50BA}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {EB050117-B80E-4B06-AE34-CB155DEE50BA}.Debug|x86.Build.0 = Debug|Any CPU
{EB050117-B80E-4B06-AE34-CB155DEE50BA}.NodeEditor|Any CPU.ActiveCfg = Release|Any CPU
{EB050117-B80E-4B06-AE34-CB155DEE50BA}.NodeEditor|Any CPU.Build.0 = Release|Any CPU
+ {EB050117-B80E-4B06-AE34-CB155DEE50BA}.NodeEditor|x64.ActiveCfg = NodeEditor|Any CPU
+ {EB050117-B80E-4B06-AE34-CB155DEE50BA}.NodeEditor|x64.Build.0 = NodeEditor|Any CPU
+ {EB050117-B80E-4B06-AE34-CB155DEE50BA}.NodeEditor|x86.ActiveCfg = NodeEditor|Any CPU
+ {EB050117-B80E-4B06-AE34-CB155DEE50BA}.NodeEditor|x86.Build.0 = NodeEditor|Any CPU
{EB050117-B80E-4B06-AE34-CB155DEE50BA}.Release|Any CPU.ActiveCfg = Release|Any CPU
{EB050117-B80E-4B06-AE34-CB155DEE50BA}.Release|Any CPU.Build.0 = Release|Any CPU
+ {EB050117-B80E-4B06-AE34-CB155DEE50BA}.Release|x64.ActiveCfg = Release|Any CPU
+ {EB050117-B80E-4B06-AE34-CB155DEE50BA}.Release|x64.Build.0 = Release|Any CPU
+ {EB050117-B80E-4B06-AE34-CB155DEE50BA}.Release|x86.ActiveCfg = Release|Any CPU
+ {EB050117-B80E-4B06-AE34-CB155DEE50BA}.Release|x86.Build.0 = Release|Any CPU
{B1901287-072F-4E60-859E-F1CFFB952112}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{B1901287-072F-4E60-859E-F1CFFB952112}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {B1901287-072F-4E60-859E-F1CFFB952112}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {B1901287-072F-4E60-859E-F1CFFB952112}.Debug|x64.Build.0 = Debug|Any CPU
+ {B1901287-072F-4E60-859E-F1CFFB952112}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {B1901287-072F-4E60-859E-F1CFFB952112}.Debug|x86.Build.0 = Debug|Any CPU
{B1901287-072F-4E60-859E-F1CFFB952112}.NodeEditor|Any CPU.ActiveCfg = Release|Any CPU
{B1901287-072F-4E60-859E-F1CFFB952112}.NodeEditor|Any CPU.Build.0 = Release|Any CPU
+ {B1901287-072F-4E60-859E-F1CFFB952112}.NodeEditor|x64.ActiveCfg = NodeEditor|Any CPU
+ {B1901287-072F-4E60-859E-F1CFFB952112}.NodeEditor|x64.Build.0 = NodeEditor|Any CPU
+ {B1901287-072F-4E60-859E-F1CFFB952112}.NodeEditor|x86.ActiveCfg = NodeEditor|Any CPU
+ {B1901287-072F-4E60-859E-F1CFFB952112}.NodeEditor|x86.Build.0 = NodeEditor|Any CPU
{B1901287-072F-4E60-859E-F1CFFB952112}.Release|Any CPU.ActiveCfg = Release|Any CPU
{B1901287-072F-4E60-859E-F1CFFB952112}.Release|Any CPU.Build.0 = Release|Any CPU
+ {B1901287-072F-4E60-859E-F1CFFB952112}.Release|x64.ActiveCfg = Release|Any CPU
+ {B1901287-072F-4E60-859E-F1CFFB952112}.Release|x64.Build.0 = Release|Any CPU
+ {B1901287-072F-4E60-859E-F1CFFB952112}.Release|x86.ActiveCfg = Release|Any CPU
+ {B1901287-072F-4E60-859E-F1CFFB952112}.Release|x86.Build.0 = Release|Any CPU
{F9DA1313-55D8-406E-AE82-09A5C7BA532A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{F9DA1313-55D8-406E-AE82-09A5C7BA532A}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {F9DA1313-55D8-406E-AE82-09A5C7BA532A}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {F9DA1313-55D8-406E-AE82-09A5C7BA532A}.Debug|x64.Build.0 = Debug|Any CPU
+ {F9DA1313-55D8-406E-AE82-09A5C7BA532A}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {F9DA1313-55D8-406E-AE82-09A5C7BA532A}.Debug|x86.Build.0 = Debug|Any CPU
{F9DA1313-55D8-406E-AE82-09A5C7BA532A}.NodeEditor|Any CPU.ActiveCfg = Release|Any CPU
{F9DA1313-55D8-406E-AE82-09A5C7BA532A}.NodeEditor|Any CPU.Build.0 = Release|Any CPU
+ {F9DA1313-55D8-406E-AE82-09A5C7BA532A}.NodeEditor|x64.ActiveCfg = NodeEditor|Any CPU
+ {F9DA1313-55D8-406E-AE82-09A5C7BA532A}.NodeEditor|x64.Build.0 = NodeEditor|Any CPU
+ {F9DA1313-55D8-406E-AE82-09A5C7BA532A}.NodeEditor|x86.ActiveCfg = NodeEditor|Any CPU
+ {F9DA1313-55D8-406E-AE82-09A5C7BA532A}.NodeEditor|x86.Build.0 = NodeEditor|Any CPU
{F9DA1313-55D8-406E-AE82-09A5C7BA532A}.Release|Any CPU.ActiveCfg = Release|Any CPU
{F9DA1313-55D8-406E-AE82-09A5C7BA532A}.Release|Any CPU.Build.0 = Release|Any CPU
+ {F9DA1313-55D8-406E-AE82-09A5C7BA532A}.Release|x64.ActiveCfg = Release|Any CPU
+ {F9DA1313-55D8-406E-AE82-09A5C7BA532A}.Release|x64.Build.0 = Release|Any CPU
+ {F9DA1313-55D8-406E-AE82-09A5C7BA532A}.Release|x86.ActiveCfg = Release|Any CPU
+ {F9DA1313-55D8-406E-AE82-09A5C7BA532A}.Release|x86.Build.0 = Release|Any CPU
{885ABFD2-1091-4D9E-92AA-E174FBF2E35E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{885ABFD2-1091-4D9E-92AA-E174FBF2E35E}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {885ABFD2-1091-4D9E-92AA-E174FBF2E35E}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {885ABFD2-1091-4D9E-92AA-E174FBF2E35E}.Debug|x64.Build.0 = Debug|Any CPU
+ {885ABFD2-1091-4D9E-92AA-E174FBF2E35E}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {885ABFD2-1091-4D9E-92AA-E174FBF2E35E}.Debug|x86.Build.0 = Debug|Any CPU
{885ABFD2-1091-4D9E-92AA-E174FBF2E35E}.NodeEditor|Any CPU.ActiveCfg = Debug|Any CPU
{885ABFD2-1091-4D9E-92AA-E174FBF2E35E}.NodeEditor|Any CPU.Build.0 = Debug|Any CPU
+ {885ABFD2-1091-4D9E-92AA-E174FBF2E35E}.NodeEditor|x64.ActiveCfg = NodeEditor|Any CPU
+ {885ABFD2-1091-4D9E-92AA-E174FBF2E35E}.NodeEditor|x64.Build.0 = NodeEditor|Any CPU
+ {885ABFD2-1091-4D9E-92AA-E174FBF2E35E}.NodeEditor|x86.ActiveCfg = NodeEditor|Any CPU
+ {885ABFD2-1091-4D9E-92AA-E174FBF2E35E}.NodeEditor|x86.Build.0 = NodeEditor|Any CPU
{885ABFD2-1091-4D9E-92AA-E174FBF2E35E}.Release|Any CPU.ActiveCfg = Release|Any CPU
{885ABFD2-1091-4D9E-92AA-E174FBF2E35E}.Release|Any CPU.Build.0 = Release|Any CPU
+ {885ABFD2-1091-4D9E-92AA-E174FBF2E35E}.Release|x64.ActiveCfg = Release|Any CPU
+ {885ABFD2-1091-4D9E-92AA-E174FBF2E35E}.Release|x64.Build.0 = Release|Any CPU
+ {885ABFD2-1091-4D9E-92AA-E174FBF2E35E}.Release|x86.ActiveCfg = Release|Any CPU
+ {885ABFD2-1091-4D9E-92AA-E174FBF2E35E}.Release|x86.Build.0 = Release|Any CPU
{2955B4E2-72D0-42E8-8A6C-CCD91E9027C2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{2955B4E2-72D0-42E8-8A6C-CCD91E9027C2}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {2955B4E2-72D0-42E8-8A6C-CCD91E9027C2}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {2955B4E2-72D0-42E8-8A6C-CCD91E9027C2}.Debug|x64.Build.0 = Debug|Any CPU
+ {2955B4E2-72D0-42E8-8A6C-CCD91E9027C2}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {2955B4E2-72D0-42E8-8A6C-CCD91E9027C2}.Debug|x86.Build.0 = Debug|Any CPU
{2955B4E2-72D0-42E8-8A6C-CCD91E9027C2}.NodeEditor|Any CPU.ActiveCfg = Debug|Any CPU
{2955B4E2-72D0-42E8-8A6C-CCD91E9027C2}.NodeEditor|Any CPU.Build.0 = Debug|Any CPU
+ {2955B4E2-72D0-42E8-8A6C-CCD91E9027C2}.NodeEditor|x64.ActiveCfg = NodeEditor|Any CPU
+ {2955B4E2-72D0-42E8-8A6C-CCD91E9027C2}.NodeEditor|x64.Build.0 = NodeEditor|Any CPU
+ {2955B4E2-72D0-42E8-8A6C-CCD91E9027C2}.NodeEditor|x86.ActiveCfg = NodeEditor|Any CPU
+ {2955B4E2-72D0-42E8-8A6C-CCD91E9027C2}.NodeEditor|x86.Build.0 = NodeEditor|Any CPU
{2955B4E2-72D0-42E8-8A6C-CCD91E9027C2}.Release|Any CPU.ActiveCfg = Release|Any CPU
{2955B4E2-72D0-42E8-8A6C-CCD91E9027C2}.Release|Any CPU.Build.0 = Release|Any CPU
+ {2955B4E2-72D0-42E8-8A6C-CCD91E9027C2}.Release|x64.ActiveCfg = Release|Any CPU
+ {2955B4E2-72D0-42E8-8A6C-CCD91E9027C2}.Release|x64.Build.0 = Release|Any CPU
+ {2955B4E2-72D0-42E8-8A6C-CCD91E9027C2}.Release|x86.ActiveCfg = Release|Any CPU
+ {2955B4E2-72D0-42E8-8A6C-CCD91E9027C2}.Release|x86.Build.0 = Release|Any CPU
{EE3C539A-8469-41FA-9432-1488072F19A9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{EE3C539A-8469-41FA-9432-1488072F19A9}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {EE3C539A-8469-41FA-9432-1488072F19A9}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {EE3C539A-8469-41FA-9432-1488072F19A9}.Debug|x64.Build.0 = Debug|Any CPU
+ {EE3C539A-8469-41FA-9432-1488072F19A9}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {EE3C539A-8469-41FA-9432-1488072F19A9}.Debug|x86.Build.0 = Debug|Any CPU
{EE3C539A-8469-41FA-9432-1488072F19A9}.NodeEditor|Any CPU.ActiveCfg = Debug|Any CPU
{EE3C539A-8469-41FA-9432-1488072F19A9}.NodeEditor|Any CPU.Build.0 = Debug|Any CPU
+ {EE3C539A-8469-41FA-9432-1488072F19A9}.NodeEditor|x64.ActiveCfg = NodeEditor|Any CPU
+ {EE3C539A-8469-41FA-9432-1488072F19A9}.NodeEditor|x64.Build.0 = NodeEditor|Any CPU
+ {EE3C539A-8469-41FA-9432-1488072F19A9}.NodeEditor|x86.ActiveCfg = NodeEditor|Any CPU
+ {EE3C539A-8469-41FA-9432-1488072F19A9}.NodeEditor|x86.Build.0 = NodeEditor|Any CPU
{EE3C539A-8469-41FA-9432-1488072F19A9}.Release|Any CPU.ActiveCfg = Release|Any CPU
{EE3C539A-8469-41FA-9432-1488072F19A9}.Release|Any CPU.Build.0 = Release|Any CPU
+ {EE3C539A-8469-41FA-9432-1488072F19A9}.Release|x64.ActiveCfg = Release|Any CPU
+ {EE3C539A-8469-41FA-9432-1488072F19A9}.Release|x64.Build.0 = Release|Any CPU
+ {EE3C539A-8469-41FA-9432-1488072F19A9}.Release|x86.ActiveCfg = Release|Any CPU
+ {EE3C539A-8469-41FA-9432-1488072F19A9}.Release|x86.Build.0 = Release|Any CPU
{9C994C8C-F2BF-4A78-8349-6DA3FF8B0925}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{9C994C8C-F2BF-4A78-8349-6DA3FF8B0925}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {9C994C8C-F2BF-4A78-8349-6DA3FF8B0925}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {9C994C8C-F2BF-4A78-8349-6DA3FF8B0925}.Debug|x64.Build.0 = Debug|Any CPU
+ {9C994C8C-F2BF-4A78-8349-6DA3FF8B0925}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {9C994C8C-F2BF-4A78-8349-6DA3FF8B0925}.Debug|x86.Build.0 = Debug|Any CPU
{9C994C8C-F2BF-4A78-8349-6DA3FF8B0925}.NodeEditor|Any CPU.ActiveCfg = Debug|Any CPU
{9C994C8C-F2BF-4A78-8349-6DA3FF8B0925}.NodeEditor|Any CPU.Build.0 = Debug|Any CPU
+ {9C994C8C-F2BF-4A78-8349-6DA3FF8B0925}.NodeEditor|x64.ActiveCfg = NodeEditor|Any CPU
+ {9C994C8C-F2BF-4A78-8349-6DA3FF8B0925}.NodeEditor|x64.Build.0 = NodeEditor|Any CPU
+ {9C994C8C-F2BF-4A78-8349-6DA3FF8B0925}.NodeEditor|x86.ActiveCfg = NodeEditor|Any CPU
+ {9C994C8C-F2BF-4A78-8349-6DA3FF8B0925}.NodeEditor|x86.Build.0 = NodeEditor|Any CPU
{9C994C8C-F2BF-4A78-8349-6DA3FF8B0925}.Release|Any CPU.ActiveCfg = Release|Any CPU
{9C994C8C-F2BF-4A78-8349-6DA3FF8B0925}.Release|Any CPU.Build.0 = Release|Any CPU
+ {9C994C8C-F2BF-4A78-8349-6DA3FF8B0925}.Release|x64.ActiveCfg = Release|Any CPU
+ {9C994C8C-F2BF-4A78-8349-6DA3FF8B0925}.Release|x64.Build.0 = Release|Any CPU
+ {9C994C8C-F2BF-4A78-8349-6DA3FF8B0925}.Release|x86.ActiveCfg = Release|Any CPU
+ {9C994C8C-F2BF-4A78-8349-6DA3FF8B0925}.Release|x86.Build.0 = Release|Any CPU
{B4F77180-A941-4002-95E8-B142887F126C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{B4F77180-A941-4002-95E8-B142887F126C}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {B4F77180-A941-4002-95E8-B142887F126C}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {B4F77180-A941-4002-95E8-B142887F126C}.Debug|x64.Build.0 = Debug|Any CPU
+ {B4F77180-A941-4002-95E8-B142887F126C}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {B4F77180-A941-4002-95E8-B142887F126C}.Debug|x86.Build.0 = Debug|Any CPU
{B4F77180-A941-4002-95E8-B142887F126C}.NodeEditor|Any CPU.ActiveCfg = Debug|Any CPU
{B4F77180-A941-4002-95E8-B142887F126C}.NodeEditor|Any CPU.Build.0 = Debug|Any CPU
+ {B4F77180-A941-4002-95E8-B142887F126C}.NodeEditor|x64.ActiveCfg = NodeEditor|Any CPU
+ {B4F77180-A941-4002-95E8-B142887F126C}.NodeEditor|x64.Build.0 = NodeEditor|Any CPU
+ {B4F77180-A941-4002-95E8-B142887F126C}.NodeEditor|x86.ActiveCfg = NodeEditor|Any CPU
+ {B4F77180-A941-4002-95E8-B142887F126C}.NodeEditor|x86.Build.0 = NodeEditor|Any CPU
{B4F77180-A941-4002-95E8-B142887F126C}.Release|Any CPU.ActiveCfg = Release|Any CPU
{B4F77180-A941-4002-95E8-B142887F126C}.Release|Any CPU.Build.0 = Release|Any CPU
+ {B4F77180-A941-4002-95E8-B142887F126C}.Release|x64.ActiveCfg = Release|Any CPU
+ {B4F77180-A941-4002-95E8-B142887F126C}.Release|x64.Build.0 = Release|Any CPU
+ {B4F77180-A941-4002-95E8-B142887F126C}.Release|x86.ActiveCfg = Release|Any CPU
+ {B4F77180-A941-4002-95E8-B142887F126C}.Release|x86.Build.0 = Release|Any CPU
{7F16393F-E81B-4EE8-9E01-F6E15F960D08}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{7F16393F-E81B-4EE8-9E01-F6E15F960D08}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {7F16393F-E81B-4EE8-9E01-F6E15F960D08}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {7F16393F-E81B-4EE8-9E01-F6E15F960D08}.Debug|x64.Build.0 = Debug|Any CPU
+ {7F16393F-E81B-4EE8-9E01-F6E15F960D08}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {7F16393F-E81B-4EE8-9E01-F6E15F960D08}.Debug|x86.Build.0 = Debug|Any CPU
{7F16393F-E81B-4EE8-9E01-F6E15F960D08}.NodeEditor|Any CPU.ActiveCfg = Debug|Any CPU
{7F16393F-E81B-4EE8-9E01-F6E15F960D08}.NodeEditor|Any CPU.Build.0 = Debug|Any CPU
+ {7F16393F-E81B-4EE8-9E01-F6E15F960D08}.NodeEditor|x64.ActiveCfg = NodeEditor|Any CPU
+ {7F16393F-E81B-4EE8-9E01-F6E15F960D08}.NodeEditor|x64.Build.0 = NodeEditor|Any CPU
+ {7F16393F-E81B-4EE8-9E01-F6E15F960D08}.NodeEditor|x86.ActiveCfg = NodeEditor|Any CPU
+ {7F16393F-E81B-4EE8-9E01-F6E15F960D08}.NodeEditor|x86.Build.0 = NodeEditor|Any CPU
{7F16393F-E81B-4EE8-9E01-F6E15F960D08}.Release|Any CPU.ActiveCfg = Release|Any CPU
{7F16393F-E81B-4EE8-9E01-F6E15F960D08}.Release|Any CPU.Build.0 = Release|Any CPU
+ {7F16393F-E81B-4EE8-9E01-F6E15F960D08}.Release|x64.ActiveCfg = Release|Any CPU
+ {7F16393F-E81B-4EE8-9E01-F6E15F960D08}.Release|x64.Build.0 = Release|Any CPU
+ {7F16393F-E81B-4EE8-9E01-F6E15F960D08}.Release|x86.ActiveCfg = Release|Any CPU
+ {7F16393F-E81B-4EE8-9E01-F6E15F960D08}.Release|x86.Build.0 = Release|Any CPU
{891DDA5F-ABA9-4F35-AE9D-E7381A4EA870}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{891DDA5F-ABA9-4F35-AE9D-E7381A4EA870}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {891DDA5F-ABA9-4F35-AE9D-E7381A4EA870}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {891DDA5F-ABA9-4F35-AE9D-E7381A4EA870}.Debug|x64.Build.0 = Debug|Any CPU
+ {891DDA5F-ABA9-4F35-AE9D-E7381A4EA870}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {891DDA5F-ABA9-4F35-AE9D-E7381A4EA870}.Debug|x86.Build.0 = Debug|Any CPU
{891DDA5F-ABA9-4F35-AE9D-E7381A4EA870}.NodeEditor|Any CPU.ActiveCfg = Debug|Any CPU
{891DDA5F-ABA9-4F35-AE9D-E7381A4EA870}.NodeEditor|Any CPU.Build.0 = Debug|Any CPU
+ {891DDA5F-ABA9-4F35-AE9D-E7381A4EA870}.NodeEditor|x64.ActiveCfg = NodeEditor|Any CPU
+ {891DDA5F-ABA9-4F35-AE9D-E7381A4EA870}.NodeEditor|x64.Build.0 = NodeEditor|Any CPU
+ {891DDA5F-ABA9-4F35-AE9D-E7381A4EA870}.NodeEditor|x86.ActiveCfg = NodeEditor|Any CPU
+ {891DDA5F-ABA9-4F35-AE9D-E7381A4EA870}.NodeEditor|x86.Build.0 = NodeEditor|Any CPU
{891DDA5F-ABA9-4F35-AE9D-E7381A4EA870}.Release|Any CPU.ActiveCfg = Release|Any CPU
{891DDA5F-ABA9-4F35-AE9D-E7381A4EA870}.Release|Any CPU.Build.0 = Release|Any CPU
+ {891DDA5F-ABA9-4F35-AE9D-E7381A4EA870}.Release|x64.ActiveCfg = Release|Any CPU
+ {891DDA5F-ABA9-4F35-AE9D-E7381A4EA870}.Release|x64.Build.0 = Release|Any CPU
+ {891DDA5F-ABA9-4F35-AE9D-E7381A4EA870}.Release|x86.ActiveCfg = Release|Any CPU
+ {891DDA5F-ABA9-4F35-AE9D-E7381A4EA870}.Release|x86.Build.0 = Release|Any CPU
{65463793-8EC1-4AC0-BA19-7585C44CE501}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{65463793-8EC1-4AC0-BA19-7585C44CE501}.Debug|Any CPU.Build.0 = Debug|Any CPU
{65463793-8EC1-4AC0-BA19-7585C44CE501}.Debug|Any CPU.Deploy.0 = Debug|Any CPU
+ {65463793-8EC1-4AC0-BA19-7585C44CE501}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {65463793-8EC1-4AC0-BA19-7585C44CE501}.Debug|x64.Build.0 = Debug|Any CPU
+ {65463793-8EC1-4AC0-BA19-7585C44CE501}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {65463793-8EC1-4AC0-BA19-7585C44CE501}.Debug|x86.Build.0 = Debug|Any CPU
{65463793-8EC1-4AC0-BA19-7585C44CE501}.NodeEditor|Any CPU.ActiveCfg = Debug|Any CPU
{65463793-8EC1-4AC0-BA19-7585C44CE501}.NodeEditor|Any CPU.Build.0 = Debug|Any CPU
{65463793-8EC1-4AC0-BA19-7585C44CE501}.NodeEditor|Any CPU.Deploy.0 = Debug|Any CPU
+ {65463793-8EC1-4AC0-BA19-7585C44CE501}.NodeEditor|x64.ActiveCfg = NodeEditor|Any CPU
+ {65463793-8EC1-4AC0-BA19-7585C44CE501}.NodeEditor|x64.Build.0 = NodeEditor|Any CPU
+ {65463793-8EC1-4AC0-BA19-7585C44CE501}.NodeEditor|x86.ActiveCfg = NodeEditor|Any CPU
+ {65463793-8EC1-4AC0-BA19-7585C44CE501}.NodeEditor|x86.Build.0 = NodeEditor|Any CPU
{65463793-8EC1-4AC0-BA19-7585C44CE501}.Release|Any CPU.ActiveCfg = Release|Any CPU
{65463793-8EC1-4AC0-BA19-7585C44CE501}.Release|Any CPU.Build.0 = Release|Any CPU
{65463793-8EC1-4AC0-BA19-7585C44CE501}.Release|Any CPU.Deploy.0 = Release|Any CPU
+ {65463793-8EC1-4AC0-BA19-7585C44CE501}.Release|x64.ActiveCfg = Release|Any CPU
+ {65463793-8EC1-4AC0-BA19-7585C44CE501}.Release|x64.Build.0 = Release|Any CPU
+ {65463793-8EC1-4AC0-BA19-7585C44CE501}.Release|x86.ActiveCfg = Release|Any CPU
+ {65463793-8EC1-4AC0-BA19-7585C44CE501}.Release|x86.Build.0 = Release|Any CPU
{1C10A568-DF26-44EF-961D-CF7E5B2E0EC9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{1C10A568-DF26-44EF-961D-CF7E5B2E0EC9}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {1C10A568-DF26-44EF-961D-CF7E5B2E0EC9}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {1C10A568-DF26-44EF-961D-CF7E5B2E0EC9}.Debug|x64.Build.0 = Debug|Any CPU
+ {1C10A568-DF26-44EF-961D-CF7E5B2E0EC9}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {1C10A568-DF26-44EF-961D-CF7E5B2E0EC9}.Debug|x86.Build.0 = Debug|Any CPU
{1C10A568-DF26-44EF-961D-CF7E5B2E0EC9}.NodeEditor|Any CPU.ActiveCfg = Debug|Any CPU
{1C10A568-DF26-44EF-961D-CF7E5B2E0EC9}.NodeEditor|Any CPU.Build.0 = Debug|Any CPU
+ {1C10A568-DF26-44EF-961D-CF7E5B2E0EC9}.NodeEditor|x64.ActiveCfg = NodeEditor|Any CPU
+ {1C10A568-DF26-44EF-961D-CF7E5B2E0EC9}.NodeEditor|x64.Build.0 = NodeEditor|Any CPU
+ {1C10A568-DF26-44EF-961D-CF7E5B2E0EC9}.NodeEditor|x86.ActiveCfg = NodeEditor|Any CPU
+ {1C10A568-DF26-44EF-961D-CF7E5B2E0EC9}.NodeEditor|x86.Build.0 = NodeEditor|Any CPU
{1C10A568-DF26-44EF-961D-CF7E5B2E0EC9}.Release|Any CPU.ActiveCfg = Release|Any CPU
{1C10A568-DF26-44EF-961D-CF7E5B2E0EC9}.Release|Any CPU.Build.0 = Release|Any CPU
+ {1C10A568-DF26-44EF-961D-CF7E5B2E0EC9}.Release|x64.ActiveCfg = Release|Any CPU
+ {1C10A568-DF26-44EF-961D-CF7E5B2E0EC9}.Release|x64.Build.0 = Release|Any CPU
+ {1C10A568-DF26-44EF-961D-CF7E5B2E0EC9}.Release|x86.ActiveCfg = Release|Any CPU
+ {1C10A568-DF26-44EF-961D-CF7E5B2E0EC9}.Release|x86.Build.0 = Release|Any CPU
{19DD4710-AAC4-49CF-8E93-B41ABE197605}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{19DD4710-AAC4-49CF-8E93-B41ABE197605}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {19DD4710-AAC4-49CF-8E93-B41ABE197605}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {19DD4710-AAC4-49CF-8E93-B41ABE197605}.Debug|x64.Build.0 = Debug|Any CPU
+ {19DD4710-AAC4-49CF-8E93-B41ABE197605}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {19DD4710-AAC4-49CF-8E93-B41ABE197605}.Debug|x86.Build.0 = Debug|Any CPU
{19DD4710-AAC4-49CF-8E93-B41ABE197605}.NodeEditor|Any CPU.ActiveCfg = Debug|Any CPU
{19DD4710-AAC4-49CF-8E93-B41ABE197605}.NodeEditor|Any CPU.Build.0 = Debug|Any CPU
+ {19DD4710-AAC4-49CF-8E93-B41ABE197605}.NodeEditor|x64.ActiveCfg = NodeEditor|Any CPU
+ {19DD4710-AAC4-49CF-8E93-B41ABE197605}.NodeEditor|x64.Build.0 = NodeEditor|Any CPU
+ {19DD4710-AAC4-49CF-8E93-B41ABE197605}.NodeEditor|x86.ActiveCfg = NodeEditor|Any CPU
+ {19DD4710-AAC4-49CF-8E93-B41ABE197605}.NodeEditor|x86.Build.0 = NodeEditor|Any CPU
{19DD4710-AAC4-49CF-8E93-B41ABE197605}.Release|Any CPU.ActiveCfg = Release|Any CPU
{19DD4710-AAC4-49CF-8E93-B41ABE197605}.Release|Any CPU.Build.0 = Release|Any CPU
+ {19DD4710-AAC4-49CF-8E93-B41ABE197605}.Release|x64.ActiveCfg = Release|Any CPU
+ {19DD4710-AAC4-49CF-8E93-B41ABE197605}.Release|x64.Build.0 = Release|Any CPU
+ {19DD4710-AAC4-49CF-8E93-B41ABE197605}.Release|x86.ActiveCfg = Release|Any CPU
+ {19DD4710-AAC4-49CF-8E93-B41ABE197605}.Release|x86.Build.0 = Release|Any CPU
{CDE5895B-D5DA-8DB1-7F86-7AB42B050900}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{CDE5895B-D5DA-8DB1-7F86-7AB42B050900}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {CDE5895B-D5DA-8DB1-7F86-7AB42B050900}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {CDE5895B-D5DA-8DB1-7F86-7AB42B050900}.Debug|x64.Build.0 = Debug|Any CPU
+ {CDE5895B-D5DA-8DB1-7F86-7AB42B050900}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {CDE5895B-D5DA-8DB1-7F86-7AB42B050900}.Debug|x86.Build.0 = Debug|Any CPU
{CDE5895B-D5DA-8DB1-7F86-7AB42B050900}.NodeEditor|Any CPU.ActiveCfg = Debug|Any CPU
{CDE5895B-D5DA-8DB1-7F86-7AB42B050900}.NodeEditor|Any CPU.Build.0 = Debug|Any CPU
+ {CDE5895B-D5DA-8DB1-7F86-7AB42B050900}.NodeEditor|x64.ActiveCfg = NodeEditor|Any CPU
+ {CDE5895B-D5DA-8DB1-7F86-7AB42B050900}.NodeEditor|x64.Build.0 = NodeEditor|Any CPU
+ {CDE5895B-D5DA-8DB1-7F86-7AB42B050900}.NodeEditor|x86.ActiveCfg = NodeEditor|Any CPU
+ {CDE5895B-D5DA-8DB1-7F86-7AB42B050900}.NodeEditor|x86.Build.0 = NodeEditor|Any CPU
{CDE5895B-D5DA-8DB1-7F86-7AB42B050900}.Release|Any CPU.ActiveCfg = Release|Any CPU
{CDE5895B-D5DA-8DB1-7F86-7AB42B050900}.Release|Any CPU.Build.0 = Release|Any CPU
+ {CDE5895B-D5DA-8DB1-7F86-7AB42B050900}.Release|x64.ActiveCfg = Release|Any CPU
+ {CDE5895B-D5DA-8DB1-7F86-7AB42B050900}.Release|x64.Build.0 = Release|Any CPU
+ {CDE5895B-D5DA-8DB1-7F86-7AB42B050900}.Release|x86.ActiveCfg = Release|Any CPU
+ {CDE5895B-D5DA-8DB1-7F86-7AB42B050900}.Release|x86.Build.0 = Release|Any CPU
{908E06EF-201E-9A8C-B40E-2C48F9357DD4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{908E06EF-201E-9A8C-B40E-2C48F9357DD4}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {908E06EF-201E-9A8C-B40E-2C48F9357DD4}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {908E06EF-201E-9A8C-B40E-2C48F9357DD4}.Debug|x64.Build.0 = Debug|Any CPU
+ {908E06EF-201E-9A8C-B40E-2C48F9357DD4}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {908E06EF-201E-9A8C-B40E-2C48F9357DD4}.Debug|x86.Build.0 = Debug|Any CPU
{908E06EF-201E-9A8C-B40E-2C48F9357DD4}.NodeEditor|Any CPU.ActiveCfg = Debug|Any CPU
{908E06EF-201E-9A8C-B40E-2C48F9357DD4}.NodeEditor|Any CPU.Build.0 = Debug|Any CPU
+ {908E06EF-201E-9A8C-B40E-2C48F9357DD4}.NodeEditor|x64.ActiveCfg = NodeEditor|Any CPU
+ {908E06EF-201E-9A8C-B40E-2C48F9357DD4}.NodeEditor|x64.Build.0 = NodeEditor|Any CPU
+ {908E06EF-201E-9A8C-B40E-2C48F9357DD4}.NodeEditor|x86.ActiveCfg = NodeEditor|Any CPU
+ {908E06EF-201E-9A8C-B40E-2C48F9357DD4}.NodeEditor|x86.Build.0 = NodeEditor|Any CPU
{908E06EF-201E-9A8C-B40E-2C48F9357DD4}.Release|Any CPU.ActiveCfg = Release|Any CPU
{908E06EF-201E-9A8C-B40E-2C48F9357DD4}.Release|Any CPU.Build.0 = Release|Any CPU
+ {908E06EF-201E-9A8C-B40E-2C48F9357DD4}.Release|x64.ActiveCfg = Release|Any CPU
+ {908E06EF-201E-9A8C-B40E-2C48F9357DD4}.Release|x64.Build.0 = Release|Any CPU
+ {908E06EF-201E-9A8C-B40E-2C48F9357DD4}.Release|x86.ActiveCfg = Release|Any CPU
+ {908E06EF-201E-9A8C-B40E-2C48F9357DD4}.Release|x86.Build.0 = Release|Any CPU
+ {B41EDEA9-8352-42A6-A727-01AB4A518D7C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {B41EDEA9-8352-42A6-A727-01AB4A518D7C}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {B41EDEA9-8352-42A6-A727-01AB4A518D7C}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {B41EDEA9-8352-42A6-A727-01AB4A518D7C}.Debug|x64.Build.0 = Debug|Any CPU
+ {B41EDEA9-8352-42A6-A727-01AB4A518D7C}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {B41EDEA9-8352-42A6-A727-01AB4A518D7C}.Debug|x86.Build.0 = Debug|Any CPU
+ {B41EDEA9-8352-42A6-A727-01AB4A518D7C}.NodeEditor|Any CPU.ActiveCfg = Debug|Any CPU
+ {B41EDEA9-8352-42A6-A727-01AB4A518D7C}.NodeEditor|Any CPU.Build.0 = Debug|Any CPU
+ {B41EDEA9-8352-42A6-A727-01AB4A518D7C}.NodeEditor|x64.ActiveCfg = Debug|Any CPU
+ {B41EDEA9-8352-42A6-A727-01AB4A518D7C}.NodeEditor|x64.Build.0 = Debug|Any CPU
+ {B41EDEA9-8352-42A6-A727-01AB4A518D7C}.NodeEditor|x86.ActiveCfg = Debug|Any CPU
+ {B41EDEA9-8352-42A6-A727-01AB4A518D7C}.NodeEditor|x86.Build.0 = Debug|Any CPU
+ {B41EDEA9-8352-42A6-A727-01AB4A518D7C}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {B41EDEA9-8352-42A6-A727-01AB4A518D7C}.Release|Any CPU.Build.0 = Release|Any CPU
+ {B41EDEA9-8352-42A6-A727-01AB4A518D7C}.Release|x64.ActiveCfg = Release|Any CPU
+ {B41EDEA9-8352-42A6-A727-01AB4A518D7C}.Release|x64.Build.0 = Release|Any CPU
+ {B41EDEA9-8352-42A6-A727-01AB4A518D7C}.Release|x86.ActiveCfg = Release|Any CPU
+ {B41EDEA9-8352-42A6-A727-01AB4A518D7C}.Release|x86.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@@ -201,6 +479,7 @@ Global
{19DD4710-AAC4-49CF-8E93-B41ABE197605} = {3F724C26-47C3-4787-A028-F71C98E307B0}
{CDE5895B-D5DA-8DB1-7F86-7AB42B050900} = {3F724C26-47C3-4787-A028-F71C98E307B0}
{908E06EF-201E-9A8C-B40E-2C48F9357DD4} = {3F724C26-47C3-4787-A028-F71C98E307B0}
+ {B41EDEA9-8352-42A6-A727-01AB4A518D7C} = {3F724C26-47C3-4787-A028-F71C98E307B0}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {3BEE52D5-27E1-4BF1-ABD6-3F4E4A3F741A}