diff --git a/ConsoleAppTest.vcxproj b/ConsoleAppTest.vcxproj new file mode 100644 index 0000000..7ea976b --- /dev/null +++ b/ConsoleAppTest.vcxproj @@ -0,0 +1,158 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + 17.0 + Win32Proj + {6e4373c3-3e97-4007-9b8b-597f55378360} + ConsoleAppTest + 10.0 + GuiTestAppCpp + + + + Application + true + v143 + Unicode + + + Application + false + v143 + true + Unicode + + + Application + true + v143 + Unicode + + + Application + false + v143 + true + Unicode + + + + + + + + + + + + + + + + + + + + + + Level3 + true + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + + + + + Level3 + true + true + true + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + true + true + + + + + Level3 + true + _DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + stdcpplatest + lib\imgui\;lib\imgui\backends;%(AdditionalIncludeDirectories) + + + Console + true + d3d9.lib;%(AdditionalDependencies) + + + + + Level3 + true + true + true + NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + true + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ConsoleAppTest.vcxproj.filters b/ConsoleAppTest.vcxproj.filters new file mode 100644 index 0000000..994de89 --- /dev/null +++ b/ConsoleAppTest.vcxproj.filters @@ -0,0 +1,75 @@ + + + + + {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 + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + \ No newline at end of file diff --git a/GuiTestAppCpp.sln b/GuiTestAppCpp.sln new file mode 100644 index 0000000..bdd027b --- /dev/null +++ b/GuiTestAppCpp.sln @@ -0,0 +1,31 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.8.34330.188 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ConsoleAppTest", "ConsoleAppTest.vcxproj", "{6E4373C3-3E97-4007-9B8B-597F55378360}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 + Release|x64 = Release|x64 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {6E4373C3-3E97-4007-9B8B-597F55378360}.Debug|x64.ActiveCfg = Debug|x64 + {6E4373C3-3E97-4007-9B8B-597F55378360}.Debug|x64.Build.0 = Debug|x64 + {6E4373C3-3E97-4007-9B8B-597F55378360}.Debug|x86.ActiveCfg = Debug|Win32 + {6E4373C3-3E97-4007-9B8B-597F55378360}.Debug|x86.Build.0 = Debug|Win32 + {6E4373C3-3E97-4007-9B8B-597F55378360}.Release|x64.ActiveCfg = Release|x64 + {6E4373C3-3E97-4007-9B8B-597F55378360}.Release|x64.Build.0 = Release|x64 + {6E4373C3-3E97-4007-9B8B-597F55378360}.Release|x86.ActiveCfg = Release|Win32 + {6E4373C3-3E97-4007-9B8B-597F55378360}.Release|x86.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {80DEFCA4-1E7B-4E65-BB17-337558A1BF61} + EndGlobalSection +EndGlobal diff --git a/Main - Copy.cpp b/Main - Copy.cpp new file mode 100644 index 0000000..ba0d62e --- /dev/null +++ b/Main - Copy.cpp @@ -0,0 +1,42 @@ +#include +#include +#include + +// Fixes it to where I don't need to use std::cout and std::string +using namespace std; + +int main() +{ + // This is a way to define multiple variables at once + int player1_score = 25, player2_score = 40; + + // Variable declaration + int player3_score; + // Variable initialisation + player3_score = 22; + + // Constants (These can't be changed later) + const string playername = "kelson8"; + + // Pointer test (Both of these are valid) + const int *ptr = &player2_score; + const string* ptr1 = &playername; + + // "endl" makes a new line + // either "cout" or "printf" can be used to output text. + //cout << "Hello " << playername << " welcome to the party!" << endl; + //cout << "Nice, you got a high score of " << player2_score << endl; + + // This needs the * on it or it don't work right since it's a pointer, I still don't fully understand how these work. + cout << *ptr1 << " " << *ptr; + + // Newest C++ preview required for this to work. + //std::print("Hello {}, welcome to the party!", playername); + //std::print("Test"); + + // Why doesn't this printf work right? + //printf("Hello %s welcome to the party", playername); + //printf("Nice, you got a high score of %s", player2_score); + + return 0; +} \ No newline at end of file diff --git a/Main.cpp b/Main.cpp new file mode 100644 index 0000000..43ced88 --- /dev/null +++ b/Main.cpp @@ -0,0 +1,355 @@ +// Dear ImGui: standalone example application for DirectX 9 + +// Learn about Dear ImGui: +// - FAQ https://dearimgui.com/faq +// - Getting Started https://dearimgui.com/getting-started +// - Documentation https://dearimgui.com/docs (same as your local docs/ folder). +// - Introduction, links and more at the top of imgui.cpp + +#include "imgui.h" +#include "imgui_impl_dx9.h" +#include "imgui_impl_win32.h" +#include +#include + +#include +#include +#include + +#include "util/textFileFunctions.h" + +// Data +static LPDIRECT3D9 g_pD3D = nullptr; +static LPDIRECT3DDEVICE9 g_pd3dDevice = nullptr; +static UINT g_ResizeWidth = 0, g_ResizeHeight = 0; +static D3DPRESENT_PARAMETERS g_d3dpp = {}; + +// Forward declarations of helper functions +bool CreateDeviceD3D(HWND hWnd); +void CleanupDeviceD3D(); +void ResetDevice(); +LRESULT WINAPI WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam); + +static void HelpMarker(const char* desc) +{ + ImGui::TextDisabled("(?)"); + if (ImGui::BeginItemTooltip()) + { + ImGui::PushTextWrapPos(ImGui::GetFontSize() * 35.0f); + ImGui::TextUnformatted(desc); + ImGui::PopTextWrapPos(); + ImGui::EndTooltip(); + } +} + +// Will this work? + +static void setBulletText(const char* text) +{ + ImGui::BulletText(text); +} + +// + +// Main code +int main(int, char**) +{ + // Create application window + //ImGui_ImplWin32_EnableDpiAwareness(); + WNDCLASSEXW wc = { sizeof(wc), CS_CLASSDC, WndProc, 0L, 0L, GetModuleHandle(nullptr), nullptr, nullptr, nullptr, nullptr, L"ImGui Example", nullptr }; + ::RegisterClassExW(&wc); + HWND hwnd = ::CreateWindowW(wc.lpszClassName, L"Dear ImGui DirectX9 Example", WS_OVERLAPPEDWINDOW, 100, 100, 1280, 800, nullptr, nullptr, wc.hInstance, nullptr); + + // Initialize Direct3D + if (!CreateDeviceD3D(hwnd)) + { + CleanupDeviceD3D(); + ::UnregisterClassW(wc.lpszClassName, wc.hInstance); + return 1; + } + + // Show the window + ::ShowWindow(hwnd, SW_SHOWDEFAULT); + ::UpdateWindow(hwnd); + + // Setup Dear ImGui context + IMGUI_CHECKVERSION(); + ImGui::CreateContext(); + ImGuiIO& io = ImGui::GetIO(); (void)io; + io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard; // Enable Keyboard Controls + io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad; // Enable Gamepad Controls + + // Setup Dear ImGui style + ImGui::StyleColorsDark(); + //ImGui::StyleColorsLight(); + + // Setup Platform/Renderer backends + ImGui_ImplWin32_Init(hwnd); + ImGui_ImplDX9_Init(g_pd3dDevice); + + // Load Fonts + // - If no fonts are loaded, dear imgui will use the default font. You can also load multiple fonts and use ImGui::PushFont()/PopFont() to select them. + // - AddFontFromFileTTF() will return the ImFont* so you can store it if you need to select the font among multiple. + // - If the file cannot be loaded, the function will return a nullptr. Please handle those errors in your application (e.g. use an assertion, or display an error and quit). + // - The fonts will be rasterized at a given size (w/ oversampling) and stored into a texture when calling ImFontAtlas::Build()/GetTexDataAsXXXX(), which ImGui_ImplXXXX_NewFrame below will call. + // - Use '#define IMGUI_ENABLE_FREETYPE' in your imconfig file to use Freetype for higher quality font rendering. + // - Read 'docs/FONTS.md' for more instructions and details. + // - Remember that in C/C++ if you want to include a backslash \ in a string literal you need to write a double backslash \\ ! + //io.Fonts->AddFontDefault(); + //io.Fonts->AddFontFromFileTTF("c:\\Windows\\Fonts\\segoeui.ttf", 18.0f); + //io.Fonts->AddFontFromFileTTF("../../misc/fonts/DroidSans.ttf", 16.0f); + //io.Fonts->AddFontFromFileTTF("../../misc/fonts/Roboto-Medium.ttf", 16.0f); + //io.Fonts->AddFontFromFileTTF("../../misc/fonts/Cousine-Regular.ttf", 15.0f); + //ImFont* font = io.Fonts->AddFontFromFileTTF("c:\\Windows\\Fonts\\ArialUni.ttf", 18.0f, nullptr, io.Fonts->GetGlyphRangesJapanese()); + //IM_ASSERT(font != nullptr); + + // Our state + bool show_demo_window = true; + bool show_another_window = false; + ImVec4 clear_color = ImVec4(0.45f, 0.55f, 0.60f, 1.00f); + + // Show window + + + + // Main loop + bool done = false; + while (!done) + { + // Poll and handle messages (inputs, window resize, etc.) + // See the WndProc() function below for our to dispatch events to the Win32 backend. + MSG msg; + while (::PeekMessage(&msg, nullptr, 0U, 0U, PM_REMOVE)) + { + ::TranslateMessage(&msg); + ::DispatchMessage(&msg); + if (msg.message == WM_QUIT) + done = true; + } + if (done) + break; + + // Handle window resize (we don't resize directly in the WM_SIZE handler) + if (g_ResizeWidth != 0 && g_ResizeHeight != 0) + { + g_d3dpp.BackBufferWidth = g_ResizeWidth; + g_d3dpp.BackBufferHeight = g_ResizeHeight; + g_ResizeWidth = g_ResizeHeight = 0; + ResetDevice(); + } + + // Start the Dear ImGui frame + ImGui_ImplDX9_NewFrame(); + ImGui_ImplWin32_NewFrame(); + ImGui::NewFrame(); + + // + + // 1. Show the big demo window (Most of the sample code is in ImGui::ShowDemoWindow()! You can browse its code to learn more about Dear ImGui!). + if (show_demo_window) + ImGui::ShowDemoWindow(&show_demo_window); + + static bool show_app_main_menu_bar = false; + static bool toggle_text = false; + + + if (ImGui::Begin("My new window", nullptr, ImGuiWindowFlags_MenuBar)) + { + if (ImGui::CollapsingHeader("test1")) + { + ImGui::BulletText("Hello, this should show up."); + ImGui::Separator(); + + + + if (ImGui::Button("Menu toggle")) + { + std::cout << "Test" << std::endl; + // How would I check if dark mode is enabled? + //if (ImGui::GetStyle == ImGui) { + //ImGui::StyleColorsLight(); + //} + //else + // { + //ImGui::StyleColorsDark(); + //} + + } + + // I couldn't figure this out yet. + // This shows up for a second then dies. + ImGui::Separator(); + if (ImGui::Button("Click")) + { + + setBulletText("You clicked the button"); + //ImGui::BulletText("You clicked the button!"); + } + else + { + ImGui::BulletText("Button not pressed."); + } + + ImGui::Separator(); + + + // This below works for a dark mode toggle. + // 5-16-2024 @ 9:14PM + ImGui::Checkbox("Dark Mode", &toggle_text); + + if (toggle_text) + { + ImGui::StyleColorsLight(); + ImGui::BulletText("Off"); + } + else + { + ImGui::StyleColorsDark(); + ImGui::BulletText("On"); + } + + // Possibly implement feature to read from a text file and write it to some output box. + ImGui::Text("Test"); + + //if (ImGui::Checkbox("Show Text", &toggle_text)) + //{ + // ImGui::BulletText("Hello"); + //} + //else + //{ + // ImGui::BulletText("Hola"); + //} + + + // How do I update this text in code? + // Like if a button is pressed. + //ImGui::Separator(); + //ImGui::BulletText("Test"); + + } + + if (ImGui::CollapsingHeader("Text File Functions")) + { + ImGui::BulletText("I will add reading files, writing and more to this."); + ImGui::Separator(); + + // I almost got this working 5-17-2024 @ 3:14PM + // It doesn't print out all of the lines from the return value. + if (ImGui::Button("Test")) + { + std::cout << TextFileFunctions::printTextOutput("test.txt") << std::endl; + } + + + } + + //if (ImGui::BeginMenu("My menu")) + //{ + // //ImGui::BulletText("You should see this"); + // ImGui::MenuItem("test", NULL); + // ImGui::EndMenu(); + //} + + + + } ImGui::End(); + + // Rendering + ImGui::EndFrame(); + g_pd3dDevice->SetRenderState(D3DRS_ZENABLE, FALSE); + g_pd3dDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE); + g_pd3dDevice->SetRenderState(D3DRS_SCISSORTESTENABLE, FALSE); + D3DCOLOR clear_col_dx = D3DCOLOR_RGBA((int)(clear_color.x * clear_color.w * 255.0f), (int)(clear_color.y * clear_color.w * 255.0f), (int)(clear_color.z * clear_color.w * 255.0f), (int)(clear_color.w * 255.0f)); + g_pd3dDevice->Clear(0, nullptr, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, clear_col_dx, 1.0f, 0); + if (g_pd3dDevice->BeginScene() >= 0) + { + ImGui::Render(); + ImGui_ImplDX9_RenderDrawData(ImGui::GetDrawData()); + g_pd3dDevice->EndScene(); + } + HRESULT result = g_pd3dDevice->Present(nullptr, nullptr, nullptr, nullptr); + + // Handle loss of D3D9 device + if (result == D3DERR_DEVICELOST && g_pd3dDevice->TestCooperativeLevel() == D3DERR_DEVICENOTRESET) + ResetDevice(); + } + + ImGui_ImplDX9_Shutdown(); + ImGui_ImplWin32_Shutdown(); + ImGui::DestroyContext(); + + CleanupDeviceD3D(); + ::DestroyWindow(hwnd); + ::UnregisterClassW(wc.lpszClassName, wc.hInstance); + + return 0; +} + +// Helper functions + +bool CreateDeviceD3D(HWND hWnd) +{ + if ((g_pD3D = Direct3DCreate9(D3D_SDK_VERSION)) == nullptr) + return false; + + // Create the D3DDevice + ZeroMemory(&g_d3dpp, sizeof(g_d3dpp)); + g_d3dpp.Windowed = TRUE; + g_d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; + g_d3dpp.BackBufferFormat = D3DFMT_UNKNOWN; // Need to use an explicit format with alpha if needing per-pixel alpha composition. + g_d3dpp.EnableAutoDepthStencil = TRUE; + g_d3dpp.AutoDepthStencilFormat = D3DFMT_D16; + g_d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_ONE; // Present with vsync + //g_d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE; // Present without vsync, maximum unthrottled framerate + if (g_pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, D3DCREATE_HARDWARE_VERTEXPROCESSING, &g_d3dpp, &g_pd3dDevice) < 0) + return false; + + return true; +} + +void CleanupDeviceD3D() +{ + if (g_pd3dDevice) { g_pd3dDevice->Release(); g_pd3dDevice = nullptr; } + if (g_pD3D) { g_pD3D->Release(); g_pD3D = nullptr; } +} + +void ResetDevice() +{ + ImGui_ImplDX9_InvalidateDeviceObjects(); + HRESULT hr = g_pd3dDevice->Reset(&g_d3dpp); + if (hr == D3DERR_INVALIDCALL) + IM_ASSERT(0); + ImGui_ImplDX9_CreateDeviceObjects(); +} + +// Forward declare message handler from imgui_impl_win32.cpp +extern IMGUI_IMPL_API LRESULT ImGui_ImplWin32_WndProcHandler(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam); + +// Win32 message handler +// You can read the io.WantCaptureMouse, io.WantCaptureKeyboard flags to tell if dear imgui wants to use your inputs. +// - When io.WantCaptureMouse is true, do not dispatch mouse input data to your main application, or clear/overwrite your copy of the mouse data. +// - When io.WantCaptureKeyboard is true, do not dispatch keyboard input data to your main application, or clear/overwrite your copy of the keyboard data. +// Generally you may always pass all inputs to dear imgui, and hide them from your application based on those two flags. +LRESULT WINAPI WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) +{ + if (ImGui_ImplWin32_WndProcHandler(hWnd, msg, wParam, lParam)) + return true; + + switch (msg) + { + case WM_SIZE: + if (wParam == SIZE_MINIMIZED) + return 0; + g_ResizeWidth = (UINT)LOWORD(lParam); // Queue resize + g_ResizeHeight = (UINT)HIWORD(lParam); + return 0; + case WM_SYSCOMMAND: + if ((wParam & 0xfff0) == SC_KEYMENU) // Disable ALT application menu + return 0; + break; + case WM_DESTROY: + ::PostQuitMessage(0); + return 0; + } + return ::DefWindowProcW(hWnd, msg, wParam, lParam); +} diff --git a/imgui.ini b/imgui.ini new file mode 100644 index 0000000..7407f47 --- /dev/null +++ b/imgui.ini @@ -0,0 +1,37 @@ +[Window][Debug##Default] +Pos=65,141 +Size=400,400 +Collapsed=1 + +[Window][Dear ImGui Demo] +Pos=654,43 +Size=550,680 + +[Window][Hello, world!] +Pos=116,183 +Size=339,180 + +[Window][My new window] +Pos=48,170 +Size=517,436 + +[Window][Example: Console] +Pos=91,56 +Size=520,600 + +[Window][Example: Documents] +Pos=55,62 +Size=621,755 + +[Window][Dear ImGui Debug Log] +Pos=60,60 +Size=456,156 + +[Window][Dear ImGui Demo/ResizableChild_D5443E47] +IsChild=1 +Size=499,136 + +[Window][Dear ImGui Demo/Red_1D4E05CE] +IsChild=1 +Size=200,100 + diff --git a/test.txt b/test.txt new file mode 100644 index 0000000..b474cf6 --- /dev/null +++ b/test.txt @@ -0,0 +1,3 @@ +Hello +C++ +!!! \ No newline at end of file diff --git a/util/textFileFunctions.cpp b/util/textFileFunctions.cpp new file mode 100644 index 0000000..c049e32 --- /dev/null +++ b/util/textFileFunctions.cpp @@ -0,0 +1,85 @@ +#include +#include +#include +#include "textFileFunctions.h" + +// Checking if the file exists breaks without this +// https://stackoverflow.com/questions/19321804/this-function-or-variable-may-be-unsafe-visual-studio +#pragma warning(disable : 4996) //_CRT_SECURE_NO_WARNINGS + +// https://stackoverflow.com/questions/12774207/fastest-way-to-check-if-a-file-exists-using-standard-c-c11-14-17-c +inline bool TextFileFunctions::fileExistCheck(const std::string& name) +{ + if (FILE* file = fopen(name.c_str(), "r")) + { + fclose(file); + return true; + } + else + { + return false; + } +} + +// https://cplusplus.com/doc/tutorial/files/ +// Todo Try to print this to a ImGui text box. +void TextFileFunctions::readTextFile(std::string file) +{ + std::string line; + std::ifstream myfile(file); + + if (TextFileFunctions::fileExistCheck(file)) + { + if (myfile.is_open()) + { + while (std::getline(myfile, line)) + { + std::cout << line << '\n'; + } + myfile.close(); + } + else + { + std::cout << "Unable to open file!"; + } + } + else + { + std::cout << "File doesn't exist!"; + } + + //else cout << "Unable to open file!"; +} + +//static std::string testString1(std::string file std::string text) +//std::string TextFileFunctions::testString1(std::string file) + +// This doesn't fully work yet, once I finish it, it'll show up on a ImGui tab. +std::string TextFileFunctions::printTextOutput(std::string file) +{ + std::string line; + std::ifstream myfile(file); + + if (TextFileFunctions::fileExistCheck(file)) + { + if (myfile.is_open()) + { + while (std::getline(myfile, line)) + { + //std::cout << line << '\n'; + return line; + } + + //return line; + myfile.close(); + } + else + { + std::cout << "Unable to open file!"; + } + } + else + { + std::cout << "File doesn't exist!"; + } +} \ No newline at end of file diff --git a/util/textFileFunctions.h b/util/textFileFunctions.h new file mode 100644 index 0000000..e105c1a --- /dev/null +++ b/util/textFileFunctions.h @@ -0,0 +1,7 @@ +#pragma once +class TextFileFunctions { +public: + inline static bool fileExistCheck(const std::string& name); + static void readTextFile(std::string file); + static std::string printTextOutput(std::string file); +};