diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml
index 669d6255a..930adf8ed 100644
--- a/.github/workflows/main.yml
+++ b/.github/workflows/main.yml
@@ -55,6 +55,7 @@ jobs:
bin/Release/Dalamud.*.dll
bin/Release/Dalamud.*.exe
bin/Release/FFXIVClientStructs.dll
+ bin/Release/cim*.dll
- name: Upload artifact
uses: actions/upload-artifact@v4
with:
diff --git a/.gitmodules b/.gitmodules
index dd184b54e..227653d48 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -10,3 +10,12 @@
[submodule "lib/TsudaKageyu-minhook"]
path = lib/TsudaKageyu-minhook
url = https://github.com/TsudaKageyu/minhook.git
+[submodule "lib/cimgui"]
+ path = lib/cimgui
+ url = https://github.com/goatcorp/gc-cimgui
+[submodule "lib/cimplot"]
+ path = lib/cimplot
+ url = https://github.com/goatcorp/gc-cimplot
+[submodule "lib/cimguizmo"]
+ path = lib/cimguizmo
+ url = https://github.com/goatcorp/gc-cimguizmo
diff --git a/.nuke/build.schema.json b/.nuke/build.schema.json
index 497f2b89a..e7e1a446a 100644
--- a/.nuke/build.schema.json
+++ b/.nuke/build.schema.json
@@ -78,9 +78,13 @@
"enum": [
"Clean",
"Compile",
+ "CompileCImGui",
+ "CompileCImGuizmo",
+ "CompileCImPlot",
"CompileDalamud",
"CompileDalamudBoot",
"CompileDalamudCrashHandler",
+ "CompileImGuiNatives",
"CompileInjector",
"CompileInjectorBoot",
"Restore",
@@ -100,9 +104,13 @@
"enum": [
"Clean",
"Compile",
+ "CompileCImGui",
+ "CompileCImGuizmo",
+ "CompileCImPlot",
"CompileDalamud",
"CompileDalamudBoot",
"CompileDalamudCrashHandler",
+ "CompileImGuiNatives",
"CompileInjector",
"CompileInjectorBoot",
"Restore",
diff --git a/Dalamud.sln b/Dalamud.sln
index 5d4b0737f..5b6f56c6e 100644
--- a/Dalamud.sln
+++ b/Dalamud.sln
@@ -16,6 +16,11 @@ EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "build", "build\build.csproj", "{94E5B016-02B1-459B-97D9-E783F28764B2}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Dalamud", "Dalamud\Dalamud.csproj", "{B92DAB43-2279-4A2C-96E3-D9D5910EDBEA}"
+ ProjectSection(ProjectDependencies) = postProject
+ {76CAA246-C405-4A8C-B0AE-F4A0EF3D4E16} = {76CAA246-C405-4A8C-B0AE-F4A0EF3D4E16}
+ {8430077C-F736-4246-A052-8EA1CECE844E} = {8430077C-F736-4246-A052-8EA1CECE844E}
+ {F258347D-31BE-4605-98CE-40E43BDF6F9D} = {F258347D-31BE-4605-98CE-40E43BDF6F9D}
+ EndProjectSection
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Dalamud.Boot", "Dalamud.Boot\Dalamud.Boot.vcxproj", "{55198DC3-A03D-408E-A8EB-2077780C8576}"
EndProject
@@ -53,6 +58,16 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Injector", "Injector", "{19
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Utilities", "Utilities", "{8F079208-C227-4D96-9427-2BEBE0003944}"
EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "cimgui", "external\cimgui\cimgui.vcxproj", "{8430077C-F736-4246-A052-8EA1CECE844E}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "imgui", "imgui", "{DBE5345E-6594-4A59-B183-1C3D5592269D}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "CS", "CS", "{8BBACF2D-7AB8-4610-A115-0E363D35C291}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "cimplot", "external\cimplot\cimplot.vcxproj", "{76CAA246-C405-4A8C-B0AE-F4A0EF3D4E16}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "cimguizmo", "external\cimguizmo\cimguizmo.vcxproj", "{F258347D-31BE-4605-98CE-40E43BDF6F9D}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -125,6 +140,18 @@ Global
{A6AA1C3F-9470-4922-9D3F-D4549657AB22}.Debug|Any CPU.Build.0 = Debug|Any CPU
{A6AA1C3F-9470-4922-9D3F-D4549657AB22}.Release|Any CPU.ActiveCfg = Release|Any CPU
{A6AA1C3F-9470-4922-9D3F-D4549657AB22}.Release|Any CPU.Build.0 = Release|Any CPU
+ {8430077C-F736-4246-A052-8EA1CECE844E}.Debug|Any CPU.ActiveCfg = Debug|x64
+ {8430077C-F736-4246-A052-8EA1CECE844E}.Debug|Any CPU.Build.0 = Debug|x64
+ {8430077C-F736-4246-A052-8EA1CECE844E}.Release|Any CPU.ActiveCfg = Release|x64
+ {8430077C-F736-4246-A052-8EA1CECE844E}.Release|Any CPU.Build.0 = Release|x64
+ {76CAA246-C405-4A8C-B0AE-F4A0EF3D4E16}.Debug|Any CPU.ActiveCfg = Debug|x64
+ {76CAA246-C405-4A8C-B0AE-F4A0EF3D4E16}.Debug|Any CPU.Build.0 = Debug|x64
+ {76CAA246-C405-4A8C-B0AE-F4A0EF3D4E16}.Release|Any CPU.ActiveCfg = Release|x64
+ {76CAA246-C405-4A8C-B0AE-F4A0EF3D4E16}.Release|Any CPU.Build.0 = Release|x64
+ {F258347D-31BE-4605-98CE-40E43BDF6F9D}.Debug|Any CPU.ActiveCfg = Debug|x64
+ {F258347D-31BE-4605-98CE-40E43BDF6F9D}.Debug|Any CPU.Build.0 = Debug|x64
+ {F258347D-31BE-4605-98CE-40E43BDF6F9D}.Release|Any CPU.ActiveCfg = Release|x64
+ {F258347D-31BE-4605-98CE-40E43BDF6F9D}.Release|Any CPU.Build.0 = Release|x64
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@@ -132,15 +159,20 @@ Global
GlobalSection(NestedProjects) = preSolution
{5B832F73-5F54-4ADC-870F-D0095EF72C9A} = {19775C83-7117-4A5F-AA00-18889F46A490}
{8874326B-E755-4D13-90B4-59AB263A3E6B} = {19775C83-7117-4A5F-AA00-18889F46A490}
- {0483026E-C6CE-4B1A-AA68-46544C08140B} = {E15BDA6D-E881-4482-94BA-BE5527E917FF}
- {C0E7E797-4FBF-4F46-BC57-463F3719BA7A} = {E15BDA6D-E881-4482-94BA-BE5527E917FF}
- {2F7FF0A8-B619-4572-86C7-71E46FE22FB8} = {E15BDA6D-E881-4482-94BA-BE5527E917FF}
+ {0483026E-C6CE-4B1A-AA68-46544C08140B} = {DBE5345E-6594-4A59-B183-1C3D5592269D}
+ {C0E7E797-4FBF-4F46-BC57-463F3719BA7A} = {DBE5345E-6594-4A59-B183-1C3D5592269D}
+ {2F7FF0A8-B619-4572-86C7-71E46FE22FB8} = {DBE5345E-6594-4A59-B183-1C3D5592269D}
{4AFDB34A-7467-4D41-B067-53BC4101D9D0} = {8F079208-C227-4D96-9427-2BEBE0003944}
- {C9B87BD7-AF49-41C3-91F1-D550ADEB7833} = {E15BDA6D-E881-4482-94BA-BE5527E917FF}
- {E0D51896-604F-4B40-8CFE-51941607B3A1} = {E15BDA6D-E881-4482-94BA-BE5527E917FF}
+ {C9B87BD7-AF49-41C3-91F1-D550ADEB7833} = {8BBACF2D-7AB8-4610-A115-0E363D35C291}
+ {E0D51896-604F-4B40-8CFE-51941607B3A1} = {8BBACF2D-7AB8-4610-A115-0E363D35C291}
{A568929D-6FF6-4DFA-9D14-5D7DC08FA5E0} = {8F079208-C227-4D96-9427-2BEBE0003944}
- {3620414C-7DFC-423E-929F-310E19F5D930} = {E15BDA6D-E881-4482-94BA-BE5527E917FF}
- {A6AA1C3F-9470-4922-9D3F-D4549657AB22} = {E15BDA6D-E881-4482-94BA-BE5527E917FF}
+ {3620414C-7DFC-423E-929F-310E19F5D930} = {8BBACF2D-7AB8-4610-A115-0E363D35C291}
+ {A6AA1C3F-9470-4922-9D3F-D4549657AB22} = {8BBACF2D-7AB8-4610-A115-0E363D35C291}
+ {8430077C-F736-4246-A052-8EA1CECE844E} = {DBE5345E-6594-4A59-B183-1C3D5592269D}
+ {DBE5345E-6594-4A59-B183-1C3D5592269D} = {E15BDA6D-E881-4482-94BA-BE5527E917FF}
+ {8BBACF2D-7AB8-4610-A115-0E363D35C291} = {E15BDA6D-E881-4482-94BA-BE5527E917FF}
+ {76CAA246-C405-4A8C-B0AE-F4A0EF3D4E16} = {DBE5345E-6594-4A59-B183-1C3D5592269D}
+ {F258347D-31BE-4605-98CE-40E43BDF6F9D} = {DBE5345E-6594-4A59-B183-1C3D5592269D}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {79B65AC9-C940-410E-AB61-7EA7E12C7599}
diff --git a/Dalamud/Dalamud.csproj b/Dalamud/Dalamud.csproj
index a6ac07227..1cd9fc336 100644
--- a/Dalamud/Dalamud.csproj
+++ b/Dalamud/Dalamud.csproj
@@ -3,7 +3,7 @@
net8.0-windows
x64
- x64;AnyCPU
+ x64
12.0
True
@@ -205,4 +205,18 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Dalamud/Interface/Internal/ImGuiDrawListFixProvider.cs b/Dalamud/Interface/Internal/ImGuiDrawListFixProvider.cs
deleted file mode 100644
index a682ed215..000000000
--- a/Dalamud/Interface/Internal/ImGuiDrawListFixProvider.cs
+++ /dev/null
@@ -1,222 +0,0 @@
-using System.Diagnostics;
-using System.Linq;
-using System.Numerics;
-
-using Dalamud.Hooking;
-
-using ImGuiNET;
-
-namespace Dalamud.Interface.Internal;
-
-///
-/// Fixes ImDrawList not correctly dealing with the current texture for that draw list not in tune with the global
-/// state. Currently, ImDrawList::AddPolyLine and ImDrawList::AddRectFilled are affected.
-///
-/// * The implementation for AddRectFilled is entirely replaced with the hook below.
-/// * The implementation for AddPolyLine is wrapped with Push/PopTextureID.
-///
-/// TODO:
-/// * imgui_draw.cpp:1433 ImDrawList::AddRectFilled
-/// The if block needs a PushTextureID(_Data->TexIdCommon)/PopTextureID() block,
-/// if _Data->TexIdCommon != _CmdHeader.TextureId.
-/// * imgui_draw.cpp:729 ImDrawList::AddPolyLine
-/// The if block always needs to call PushTextureID if the abovementioned condition is not met.
-/// Change push_texture_id to only have one condition.
-///
-[ServiceManager.EarlyLoadedService]
-internal sealed unsafe class ImGuiDrawListFixProvider : IInternalDisposableService
-{
- private const int CImGuiImDrawListAddPolyLineOffset = 0x589B0;
- private const int CImGuiImDrawListAddRectFilled = 0x59FD0;
- private const int CImGuiImDrawListAddImageRounded = 0x58390;
- private const int CImGuiImDrawListSharedDataTexIdCommonOffset = 0;
-
- private readonly Hook hookImDrawListAddPolyline;
- private readonly Hook hookImDrawListAddRectFilled;
- private readonly Hook hookImDrawListAddImageRounded;
-
- [ServiceManager.ServiceConstructor]
- private ImGuiDrawListFixProvider(InterfaceManager.InterfaceManagerWithScene imws)
- {
- // Force cimgui.dll to be loaded.
- _ = ImGui.GetCurrentContext();
- var cimgui = Process.GetCurrentProcess().Modules.Cast()
- .First(x => x.ModuleName == "cimgui.dll")
- .BaseAddress;
-
- this.hookImDrawListAddPolyline = Hook.FromAddress(
- cimgui + CImGuiImDrawListAddPolyLineOffset,
- this.ImDrawListAddPolylineDetour);
- this.hookImDrawListAddRectFilled = Hook.FromAddress(
- cimgui + CImGuiImDrawListAddRectFilled,
- this.ImDrawListAddRectFilledDetour);
- this.hookImDrawListAddImageRounded = Hook.FromAddress(
- cimgui + CImGuiImDrawListAddImageRounded,
- this.ImDrawListAddImageRoundedDetour);
- this.hookImDrawListAddPolyline.Enable();
- this.hookImDrawListAddRectFilled.Enable();
- this.hookImDrawListAddImageRounded.Enable();
- }
-
- private delegate void ImDrawListAddPolyLine(
- ImDrawListPtr drawListPtr,
- ref Vector2 points,
- int pointsCount,
- uint color,
- ImDrawFlags flags,
- float thickness);
-
- private delegate void ImDrawListAddRectFilled(
- ImDrawListPtr drawListPtr,
- ref Vector2 min,
- ref Vector2 max,
- uint col,
- float rounding,
- ImDrawFlags flags);
-
- private delegate void ImDrawListAddImageRounded(
- ImDrawListPtr drawListPtr,
- nint userTextureId, ref Vector2 xy0,
- ref Vector2 xy1,
- ref Vector2 uv0,
- ref Vector2 uv1,
- uint col,
- float rounding,
- ImDrawFlags flags);
-
- ///
- void IInternalDisposableService.DisposeService()
- {
- this.hookImDrawListAddPolyline.Dispose();
- this.hookImDrawListAddRectFilled.Dispose();
- this.hookImDrawListAddImageRounded.Dispose();
- }
-
- private static ImDrawFlags FixRectCornerFlags(ImDrawFlags flags)
- {
-#if !IMGUI_DISABLE_OBSOLETE_FUNCTIONS
- // Legacy Support for hard coded ~0 (used to be a suggested equivalent to ImDrawCornerFlags_All)
- // ~0 --> ImDrawFlags_RoundCornersAll or 0
- if ((int)flags == ~0)
- return ImDrawFlags.RoundCornersAll;
-
- // Legacy Support for hard coded 0x01 to 0x0F (matching 15 out of 16 old flags combinations)
- // 0x01 --> ImDrawFlags_RoundCornersTopLeft (VALUE 0x01 OVERLAPS ImDrawFlags_Closed but ImDrawFlags_Closed is never valid in this path!)
- // 0x02 --> ImDrawFlags_RoundCornersTopRight
- // 0x03 --> ImDrawFlags_RoundCornersTopLeft | ImDrawFlags_RoundCornersTopRight
- // 0x04 --> ImDrawFlags_RoundCornersBotLeft
- // 0x05 --> ImDrawFlags_RoundCornersTopLeft | ImDrawFlags_RoundCornersBotLeft
- // ...
- // 0x0F --> ImDrawFlags_RoundCornersAll or 0
- // (See all values in ImDrawCornerFlags_)
- if ((int)flags >= 0x01 && (int)flags <= 0x0F)
- return (ImDrawFlags)((int)flags << 4);
-
- // We cannot support hard coded 0x00 with 'float rounding > 0.0f' --> replace with ImDrawFlags_RoundCornersNone or use 'float rounding = 0.0f'
-#endif
-
- // If this triggers, please update your code replacing hardcoded values with new ImDrawFlags_RoundCorners* values.
- // Note that ImDrawFlags_Closed (== 0x01) is an invalid flag for AddRect(), AddRectFilled(), PathRect() etc...
- if (((int)flags & 0x0F) != 0)
- throw new ArgumentException("Misuse of legacy hardcoded ImDrawCornerFlags values!");
-
- if ((flags & ImDrawFlags.RoundCornersMask) == 0)
- flags |= ImDrawFlags.RoundCornersAll;
-
- return flags;
- }
-
- private void ImDrawListAddRectFilledDetour(
- ImDrawListPtr drawListPtr,
- ref Vector2 min,
- ref Vector2 max,
- uint col,
- float rounding,
- ImDrawFlags flags)
- {
- // Skip drawing if we're drawing something with alpha value of 0.
- if ((col & 0xFF000000) == 0)
- return;
-
- if (rounding < 0.5f || (flags & ImDrawFlags.RoundCornersMask) == ImDrawFlags.RoundCornersMask)
- {
- // Take the fast path of drawing two triangles if no rounded corners are required.
-
- var texIdCommon = *(nint*)(drawListPtr._Data + CImGuiImDrawListSharedDataTexIdCommonOffset);
- var pushTextureId = texIdCommon != drawListPtr._CmdHeader.TextureId;
- if (pushTextureId)
- drawListPtr.PushTextureID(texIdCommon);
-
- drawListPtr.PrimReserve(6, 4);
- drawListPtr.PrimRect(min, max, col);
-
- if (pushTextureId)
- drawListPtr.PopTextureID();
- }
- else
- {
- // Defer drawing rectangle with rounded corners to path drawing operations.
- // Note that this may have a slightly different extent behaviors from the above if case.
- // This is how it is in imgui_draw.cpp.
- drawListPtr.PathRect(min, max, rounding, flags);
- drawListPtr.PathFillConvex(col);
- }
- }
-
- private void ImDrawListAddPolylineDetour(
- ImDrawListPtr drawListPtr,
- ref Vector2 points,
- int pointsCount,
- uint color,
- ImDrawFlags flags,
- float thickness)
- {
- var texIdCommon = *(nint*)(drawListPtr._Data + CImGuiImDrawListSharedDataTexIdCommonOffset);
- var pushTextureId = texIdCommon != drawListPtr._CmdHeader.TextureId;
- if (pushTextureId)
- drawListPtr.PushTextureID(texIdCommon);
-
- this.hookImDrawListAddPolyline.Original(drawListPtr, ref points, pointsCount, color, flags, thickness);
-
- if (pushTextureId)
- drawListPtr.PopTextureID();
- }
-
- private void ImDrawListAddImageRoundedDetour(ImDrawListPtr drawListPtr, nint userTextureId, ref Vector2 xy0, ref Vector2 xy1, ref Vector2 uv0, ref Vector2 uv1, uint col, float rounding, ImDrawFlags flags)
- {
- // Skip drawing if we're drawing something with alpha value of 0.
- if ((col & 0xFF000000) == 0)
- return;
-
- // Handle non-rounded cases.
- flags = FixRectCornerFlags(flags);
- if (rounding < 0.5f || (flags & ImDrawFlags.RoundCornersMask) == ImDrawFlags.RoundCornersNone)
- {
- drawListPtr.AddImage(userTextureId, xy0, xy1, uv0, uv1, col);
- return;
- }
-
- // Temporary provide the requested image as the common texture ID, so that the underlying
- // ImDrawList::AddConvexPolyFilled does not create a separate draw command and then revert back.
- // ImDrawList::AddImageRounded will temporarily push the texture ID provided by the user if the latest draw
- // command does not point to the texture we're trying to draw. Once pushed, ImDrawList::AddConvexPolyFilled
- // will leave the list of draw commands alone, so that ImGui::ShadeVertsLinearUV can safely work on the latest
- // draw command.
- ref var texIdCommon = ref *(nint*)(drawListPtr._Data + CImGuiImDrawListSharedDataTexIdCommonOffset);
- var texIdCommonPrev = texIdCommon;
- texIdCommon = userTextureId;
-
- this.hookImDrawListAddImageRounded.Original(
- drawListPtr,
- texIdCommon,
- ref xy0,
- ref xy1,
- ref uv0,
- ref uv1,
- col,
- rounding,
- flags);
-
- texIdCommon = texIdCommonPrev;
- }
-}
diff --git a/build/DalamudBuild.cs b/build/DalamudBuild.cs
index d704d54e0..6340c36fa 100644
--- a/build/DalamudBuild.cs
+++ b/build/DalamudBuild.cs
@@ -47,6 +47,14 @@ public class DalamudBuild : NukeBuild
AbsolutePath TestProjectDir => RootDirectory / "Dalamud.Test";
AbsolutePath TestProjectFile => TestProjectDir / "Dalamud.Test.csproj";
+ AbsolutePath ExternalsDir => RootDirectory / "external";
+ AbsolutePath CImGuiDir => ExternalsDir / "cimgui";
+ AbsolutePath CImGuiProjectFile => CImGuiDir / "cimgui.vcxproj";
+ AbsolutePath CImPlotDir => ExternalsDir / "cimplot";
+ AbsolutePath CImPlotProjectFile => CImPlotDir / "cimplot.vcxproj";
+ AbsolutePath CImGuizmoDir => ExternalsDir / "cimguizmo";
+ AbsolutePath CImGuizmoProjectFile => CImGuizmoDir / "cimguizmo.vcxproj";
+
AbsolutePath ArtifactsDirectory => RootDirectory / "bin" / Configuration;
private static AbsolutePath LibraryDirectory => RootDirectory / "lib";
@@ -59,9 +67,42 @@ public class DalamudBuild : NukeBuild
DotNetTasks.DotNetRestore(s => s
.SetProjectFile(Solution));
});
-
+
+ Target CompileCImGui => _ => _
+ .Executes(() =>
+ {
+ MSBuildTasks.MSBuild(s => s
+ .SetTargetPath(CImGuiProjectFile)
+ .SetConfiguration(Configuration)
+ .SetTargetPlatform(MSBuildTargetPlatform.x64));
+ });
+
+ Target CompileCImPlot => _ => _
+ .Executes(() =>
+ {
+ MSBuildTasks.MSBuild(s => s
+ .SetTargetPath(CImPlotProjectFile)
+ .SetConfiguration(Configuration)
+ .SetTargetPlatform(MSBuildTargetPlatform.x64));
+ });
+
+ Target CompileCImGuizmo => _ => _
+ .Executes(() =>
+ {
+ MSBuildTasks.MSBuild(s => s
+ .SetTargetPath(CImGuizmoProjectFile)
+ .SetConfiguration(Configuration)
+ .SetTargetPlatform(MSBuildTargetPlatform.x64));
+ });
+
+ Target CompileImGuiNatives => _ => _
+ .DependsOn(CompileCImGui)
+ .DependsOn(CompileCImPlot)
+ .DependsOn(CompileCImGuizmo);
+
Target CompileDalamud => _ => _
.DependsOn(Restore)
+ .DependsOn(CompileImGuiNatives)
.Executes(() =>
{
DotNetTasks.DotNetBuild(s =>
@@ -138,6 +179,21 @@ public class DalamudBuild : NukeBuild
Target Clean => _ => _
.Executes(() =>
{
+ MSBuildTasks.MSBuild(s => s
+ .SetProjectFile(CImGuiProjectFile)
+ .SetConfiguration(Configuration)
+ .SetTargets("Clean"));
+
+ MSBuildTasks.MSBuild(s => s
+ .SetProjectFile(CImPlotProjectFile)
+ .SetConfiguration(Configuration)
+ .SetTargets("Clean"));
+
+ MSBuildTasks.MSBuild(s => s
+ .SetProjectFile(CImGuizmoProjectFile)
+ .SetConfiguration(Configuration)
+ .SetTargets("Clean"));
+
DotNetTasks.DotNetClean(s => s
.SetProject(DalamudProjectFile)
.SetConfiguration(Configuration));
diff --git a/external/Directory.Build.props b/external/Directory.Build.props
new file mode 100644
index 000000000..f719442cd
--- /dev/null
+++ b/external/Directory.Build.props
@@ -0,0 +1,3 @@
+
+
+
diff --git a/external/cimgui/cimgui.vcxproj b/external/cimgui/cimgui.vcxproj
new file mode 100644
index 000000000..c8a4294dc
--- /dev/null
+++ b/external/cimgui/cimgui.vcxproj
@@ -0,0 +1,104 @@
+
+
+
+
+ Debug
+ x64
+
+
+ Release
+ x64
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 17.0
+ Win32Proj
+ {8430077c-f736-4246-a052-8ea1cece844e}
+ cimgui
+ 10.0
+
+
+
+ DynamicLibrary
+ true
+ v143
+ Unicode
+
+
+ DynamicLibrary
+ false
+ v143
+ true
+ Unicode
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ..\$(Platform)\$(Configuration)\
+
+
+
+
+ ..\..\lib\cimgui\imgui;%(AdditionalIncludeDirectories)
+ NotUsing
+
+
+
+
+
+ Level3
+ true
+ _DEBUG;CIMGUI_EXPORTS;_WINDOWS;_USRDLL;IMGUI_DISABLE_OBSOLETE_FUNCTIONS=1;%(PreprocessorDefinitions)
+ true
+ MultiThreadedDebug
+
+
+ Windows
+ true
+ false
+
+
+
+
+ Level3
+ true
+ true
+ true
+ NDEBUG;CIMGUI_EXPORTS;_WINDOWS;_USRDLL;IMGUI_DISABLE_OBSOLETE_FUNCTIONS=1;%(PreprocessorDefinitions)
+ true
+ MultiThreaded
+
+
+ Windows
+ true
+ true
+ true
+ false
+
+
+
+
+
+
\ No newline at end of file
diff --git a/external/cimgui/cimgui.vcxproj.filters b/external/cimgui/cimgui.vcxproj.filters
new file mode 100644
index 000000000..d48c361f1
--- /dev/null
+++ b/external/cimgui/cimgui.vcxproj.filters
@@ -0,0 +1,45 @@
+
+
+
+
+ {4FC737F1-C7A5-4376-A066-2A32D752A2FF}
+ cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx
+
+
+ {93995380-89BD-4b04-88EB-625FBE52EBFB}
+ h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd
+
+
+ {67DA6AB6-F800-4c08-8B7A-83BB121AAD01}
+ rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms
+
+
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+
+
+ Header Files
+
+
+
\ No newline at end of file
diff --git a/external/cimguizmo/cimguizmo.vcxproj b/external/cimguizmo/cimguizmo.vcxproj
new file mode 100644
index 000000000..48b432327
--- /dev/null
+++ b/external/cimguizmo/cimguizmo.vcxproj
@@ -0,0 +1,108 @@
+
+
+
+
+ Debug
+ x64
+
+
+ Release
+ x64
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 17.0
+ Win32Proj
+ {F258347D-31BE-4605-98CE-40E43BDF6F9D}
+ cimplot
+ 10.0
+
+
+
+ DynamicLibrary
+ true
+ v143
+ Unicode
+
+
+ DynamicLibrary
+ false
+ v143
+ true
+ Unicode
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ..\$(Platform)\$(Configuration)\
+
+
+
+
+ ..\..\lib\cimgui\imgui;..\..\lib\cimguizmo\ImGuizmo;..\..\lib\cimgui;%(AdditionalIncludeDirectories)
+ NotUsing
+
+
+
+
+
+ Level3
+ true
+ _DEBUG;CIMGUIZMO_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)
+ true
+ MultiThreadedDebug
+
+
+ Windows
+ true
+ false
+
+
+
+
+ Level3
+ true
+ true
+ true
+ NDEBUG;CIMGUIZMO_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)
+ true
+ MultiThreaded
+
+
+ Windows
+ true
+ true
+ true
+ false
+
+
+
+
+
+
\ No newline at end of file
diff --git a/external/cimguizmo/cimguizmo.vcxproj.filters b/external/cimguizmo/cimguizmo.vcxproj.filters
new file mode 100644
index 000000000..f954dcc2c
--- /dev/null
+++ b/external/cimguizmo/cimguizmo.vcxproj.filters
@@ -0,0 +1,57 @@
+
+
+
+
+ {4FC737F1-C7A5-4376-A066-2A32D752A2FF}
+ cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx
+
+
+ {93995380-89BD-4b04-88EB-625FBE52EBFB}
+ h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd
+
+
+ {67DA6AB6-F800-4c08-8B7A-83BB121AAD01}
+ rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms
+
+
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+
+
+ Header Files
+
+
+
\ No newline at end of file
diff --git a/external/cimplot/cimplot.vcxproj b/external/cimplot/cimplot.vcxproj
new file mode 100644
index 000000000..c7ae46a6b
--- /dev/null
+++ b/external/cimplot/cimplot.vcxproj
@@ -0,0 +1,106 @@
+
+
+
+
+ Debug
+ x64
+
+
+ Release
+ x64
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 17.0
+ Win32Proj
+ {76caa246-c405-4a8c-b0ae-f4a0ef3d4e16}
+ cimplot
+ 10.0
+
+
+
+ DynamicLibrary
+ true
+ v143
+ Unicode
+
+
+ DynamicLibrary
+ false
+ v143
+ true
+ Unicode
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ..\$(Platform)\$(Configuration)\
+
+
+
+
+ ..\..\lib\cimgui\imgui;..\..\lib\cimplot\implot;..\..\lib\cimgui;%(AdditionalIncludeDirectories)
+ NotUsing
+
+
+
+
+
+ Level3
+ true
+ _DEBUG;CIMPLOT_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)
+ true
+ MultiThreadedDebug
+
+
+ Windows
+ true
+ false
+
+
+
+
+ Level3
+ true
+ true
+ true
+ NDEBUG;CIMPLOT_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)
+ true
+ MultiThreaded
+
+
+ Windows
+ true
+ true
+ true
+ false
+
+
+
+
+
+
\ No newline at end of file
diff --git a/external/cimplot/cimplot.vcxproj.filters b/external/cimplot/cimplot.vcxproj.filters
new file mode 100644
index 000000000..ad8bfd11b
--- /dev/null
+++ b/external/cimplot/cimplot.vcxproj.filters
@@ -0,0 +1,51 @@
+
+
+
+
+ {4FC737F1-C7A5-4376-A066-2A32D752A2FF}
+ cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx
+
+
+ {93995380-89BD-4b04-88EB-625FBE52EBFB}
+ h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd
+
+
+ {67DA6AB6-F800-4c08-8B7A-83BB121AAD01}
+ rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms
+
+
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
+
+
+
+ Header Files
+
+
+
\ No newline at end of file
diff --git a/lib/ImGuiScene b/lib/ImGuiScene
index b0d41471b..d336b20a8 160000
--- a/lib/ImGuiScene
+++ b/lib/ImGuiScene
@@ -1 +1 @@
-Subproject commit b0d41471b7ef3d69daaf6d862eb74e7e00a25651
+Subproject commit d336b20a85ea48723a98681b18bdfe14a56a3403
diff --git a/lib/cimgui b/lib/cimgui
new file mode 160000
index 000000000..a302ebabc
--- /dev/null
+++ b/lib/cimgui
@@ -0,0 +1 @@
+Subproject commit a302ebabcca49c2e37711ea14a0b0915d38253b0
diff --git a/lib/cimguizmo b/lib/cimguizmo
new file mode 160000
index 000000000..dbad4fdb4
--- /dev/null
+++ b/lib/cimguizmo
@@ -0,0 +1 @@
+Subproject commit dbad4fdb4d465e1f48d20c4c54a20925095297b0
diff --git a/lib/cimplot b/lib/cimplot
new file mode 160000
index 000000000..939f8f36d
--- /dev/null
+++ b/lib/cimplot
@@ -0,0 +1 @@
+Subproject commit 939f8f36deebd895f6cda522ee4bb2b798920935