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}