diff options
Diffstat (limited to 'lib/imgui-1.90.7/examples')
114 files changed, 18626 insertions, 0 deletions
diff --git a/lib/imgui-1.90.7/examples/README.txt b/lib/imgui-1.90.7/examples/README.txt new file mode 100644 index 0000000..6db2f3c --- /dev/null +++ b/lib/imgui-1.90.7/examples/README.txt @@ -0,0 +1,9 @@ +See BACKENDS and EXAMPLES files in the docs/ folder, or on the web at: https://github.com/ocornut/imgui/tree/master/docs + +Backends = Helper code to facilitate integration with platforms/graphics api (used by Examples + should be used by your app). +Examples = Standalone applications showcasing integration with platforms/graphics api. + +Some Examples have extra README files in their respective directory, please check them too! + +Once Dear ImGui is running (in either examples or your own application/game/engine), +run and refer to ImGui::ShowDemoWindow() in imgui_demo.cpp for the end-user API. diff --git a/lib/imgui-1.90.7/examples/example_allegro5/README.md b/lib/imgui-1.90.7/examples/example_allegro5/README.md new file mode 100644 index 0000000..4af31f6 --- /dev/null +++ b/lib/imgui-1.90.7/examples/example_allegro5/README.md @@ -0,0 +1,36 @@ + +# Configuration + +Dear ImGui outputs 16-bit vertex indices by default. +Allegro doesn't support them natively, so we have two solutions: convert the indices manually in imgui_impl_allegro5.cpp, or compile dear imgui with 32-bit indices. +You can either modify imconfig.h that comes with Dear ImGui (easier), or set a C++ preprocessor option IMGUI_USER_CONFIG to find to a filename. +We are providing `imconfig_allegro5.h` that enables 32-bit indices. +Note that the backend supports _BOTH_ 16-bit and 32-bit indices, but 32-bit indices will be slightly faster as they won't require a manual conversion. + +# How to Build + +### On Ubuntu 14.04+ and macOS + +```bash +g++ -DIMGUI_USER_CONFIG=\"examples/example_allegro5/imconfig_allegro5.h\" -I .. -I ../.. -I ../../backends main.cpp ../../backends/imgui_impl_allegro5.cpp ../../imgui*.cpp -lallegro -lallegro_main -lallegro_primitives -o allegro5_example +``` + +On macOS, install Allegro with homebrew: `brew install allegro`. + +### On Windows with Visual Studio's CLI + +You may install Allegro using vcpkg: +``` +git clone https://github.com/Microsoft/vcpkg +cd vcpkg +bootstrap-vcpkg.bat +vcpkg install allegro5 --triplet=x86-windows	; for win32 +vcpkg install allegro5 --triplet=x64-windows	; for win64 +vcpkg integrate install						    ; register include / libs in Visual Studio +``` + +Build: +``` +set ALLEGRODIR=path_to_your_allegro5_folder +cl /Zi /MD /utf-8 /I %ALLEGRODIR%\include /DIMGUI_USER_CONFIG=\"examples/example_allegro5/imconfig_allegro5.h\" /I .. /I ..\.. /I ..\..\backends main.cpp ..\..\backends\imgui_impl_allegro5.cpp ..\..\imgui*.cpp /link /LIBPATH:%ALLEGRODIR%\lib allegro-5.0.10-monolith-md.lib user32.lib +``` diff --git a/lib/imgui-1.90.7/examples/example_allegro5/example_allegro5.vcxproj b/lib/imgui-1.90.7/examples/example_allegro5/example_allegro5.vcxproj new file mode 100644 index 0000000..02f6a47 --- /dev/null +++ b/lib/imgui-1.90.7/examples/example_allegro5/example_allegro5.vcxproj @@ -0,0 +1,185 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> +  <ItemGroup Label="ProjectConfigurations"> +    <ProjectConfiguration Include="Debug|Win32"> +      <Configuration>Debug</Configuration> +      <Platform>Win32</Platform> +    </ProjectConfiguration> +    <ProjectConfiguration Include="Debug|x64"> +      <Configuration>Debug</Configuration> +      <Platform>x64</Platform> +    </ProjectConfiguration> +    <ProjectConfiguration Include="Release|Win32"> +      <Configuration>Release</Configuration> +      <Platform>Win32</Platform> +    </ProjectConfiguration> +    <ProjectConfiguration Include="Release|x64"> +      <Configuration>Release</Configuration> +      <Platform>x64</Platform> +    </ProjectConfiguration> +  </ItemGroup> +  <PropertyGroup Label="Globals"> +    <ProjectGuid>{73F235B5-7D31-4FC6-8682-DDC5A097B9C1}</ProjectGuid> +    <RootNamespace>example_allegro5</RootNamespace> +    <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion> +  </PropertyGroup> +  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> +  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> +    <ConfigurationType>Application</ConfigurationType> +    <UseDebugLibraries>true</UseDebugLibraries> +    <CharacterSet>MultiByte</CharacterSet> +    <PlatformToolset>v140</PlatformToolset> +  </PropertyGroup> +  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration"> +    <ConfigurationType>Application</ConfigurationType> +    <UseDebugLibraries>true</UseDebugLibraries> +    <CharacterSet>MultiByte</CharacterSet> +    <PlatformToolset>v140</PlatformToolset> +  </PropertyGroup> +  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration"> +    <ConfigurationType>Application</ConfigurationType> +    <UseDebugLibraries>false</UseDebugLibraries> +    <WholeProgramOptimization>true</WholeProgramOptimization> +    <CharacterSet>MultiByte</CharacterSet> +    <PlatformToolset>v140</PlatformToolset> +  </PropertyGroup> +  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration"> +    <ConfigurationType>Application</ConfigurationType> +    <UseDebugLibraries>false</UseDebugLibraries> +    <WholeProgramOptimization>true</WholeProgramOptimization> +    <CharacterSet>MultiByte</CharacterSet> +    <PlatformToolset>v140</PlatformToolset> +  </PropertyGroup> +  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> +  <ImportGroup Label="ExtensionSettings"> +  </ImportGroup> +  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> +    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> +  </ImportGroup> +  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets"> +    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> +  </ImportGroup> +  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> +    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> +  </ImportGroup> +  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets"> +    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> +  </ImportGroup> +  <PropertyGroup Label="UserMacros" /> +  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> +    <OutDir>$(ProjectDir)$(Configuration)\</OutDir> +    <IntDir>$(ProjectDir)$(Configuration)\</IntDir> +    <IncludePath>$(IncludePath)</IncludePath> +  </PropertyGroup> +  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> +    <OutDir>$(ProjectDir)$(Configuration)\</OutDir> +    <IntDir>$(ProjectDir)$(Configuration)\</IntDir> +    <IncludePath>$(IncludePath)</IncludePath> +  </PropertyGroup> +  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> +    <OutDir>$(ProjectDir)$(Configuration)\</OutDir> +    <IntDir>$(ProjectDir)$(Configuration)\</IntDir> +    <IncludePath>$(IncludePath)</IncludePath> +  </PropertyGroup> +  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> +    <OutDir>$(ProjectDir)$(Configuration)\</OutDir> +    <IntDir>$(ProjectDir)$(Configuration)\</IntDir> +    <IncludePath>$(IncludePath)</IncludePath> +  </PropertyGroup> +  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> +    <ClCompile> +      <WarningLevel>Level4</WarningLevel> +      <Optimization>Disabled</Optimization> +      <AdditionalIncludeDirectories>..\..;..\..\backends;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> +      <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions> +    </ClCompile> +    <Link> +      <GenerateDebugInformation>true</GenerateDebugInformation> +      <AdditionalLibraryDirectories>%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> +      <AdditionalDependencies>opengl32.lib;%(AdditionalDependencies)</AdditionalDependencies> +      <SubSystem>Console</SubSystem> +      <IgnoreSpecificDefaultLibraries>msvcrt.lib</IgnoreSpecificDefaultLibraries> +    </Link> +  </ItemDefinitionGroup> +  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> +    <ClCompile> +      <WarningLevel>Level4</WarningLevel> +      <Optimization>Disabled</Optimization> +      <AdditionalIncludeDirectories>..\..;..\..\backends;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> +      <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions> +    </ClCompile> +    <Link> +      <GenerateDebugInformation>true</GenerateDebugInformation> +      <AdditionalLibraryDirectories>%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> +      <AdditionalDependencies>opengl32.lib;%(AdditionalDependencies)</AdditionalDependencies> +      <SubSystem>Console</SubSystem> +      <IgnoreSpecificDefaultLibraries>msvcrt.lib</IgnoreSpecificDefaultLibraries> +    </Link> +  </ItemDefinitionGroup> +  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> +    <ClCompile> +      <WarningLevel>Level4</WarningLevel> +      <Optimization>MaxSpeed</Optimization> +      <FunctionLevelLinking>true</FunctionLevelLinking> +      <IntrinsicFunctions>true</IntrinsicFunctions> +      <AdditionalIncludeDirectories>..\..;..\..\backends;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> +      <BufferSecurityCheck>false</BufferSecurityCheck> +      <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions> +    </ClCompile> +    <Link> +      <GenerateDebugInformation>true</GenerateDebugInformation> +      <EnableCOMDATFolding>true</EnableCOMDATFolding> +      <OptimizeReferences>true</OptimizeReferences> +      <AdditionalLibraryDirectories>%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> +      <AdditionalDependencies>opengl32.lib;%(AdditionalDependencies)</AdditionalDependencies> +      <SubSystem>Console</SubSystem> +      <IgnoreSpecificDefaultLibraries> +      </IgnoreSpecificDefaultLibraries> +    </Link> +  </ItemDefinitionGroup> +  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> +    <ClCompile> +      <WarningLevel>Level4</WarningLevel> +      <Optimization>MaxSpeed</Optimization> +      <FunctionLevelLinking>true</FunctionLevelLinking> +      <IntrinsicFunctions>true</IntrinsicFunctions> +      <AdditionalIncludeDirectories>..\..;..\..\backends;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> +      <BufferSecurityCheck>false</BufferSecurityCheck> +      <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions> +    </ClCompile> +    <Link> +      <GenerateDebugInformation>true</GenerateDebugInformation> +      <EnableCOMDATFolding>true</EnableCOMDATFolding> +      <OptimizeReferences>true</OptimizeReferences> +      <AdditionalLibraryDirectories>%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> +      <AdditionalDependencies>opengl32.lib;%(AdditionalDependencies)</AdditionalDependencies> +      <SubSystem>Console</SubSystem> +      <IgnoreSpecificDefaultLibraries> +      </IgnoreSpecificDefaultLibraries> +    </Link> +  </ItemDefinitionGroup> +  <ItemGroup> +    <ClCompile Include="..\..\imgui.cpp" /> +    <ClCompile Include="..\..\imgui_demo.cpp" /> +    <ClCompile Include="..\..\imgui_draw.cpp" /> +    <ClCompile Include="..\..\imgui_tables.cpp" /> +    <ClCompile Include="..\..\imgui_widgets.cpp" /> +    <ClCompile Include="..\..\backends\imgui_impl_allegro5.cpp" /> +    <ClCompile Include="imconfig_allegro5.h" /> +    <ClCompile Include="main.cpp" /> +  </ItemGroup> +  <ItemGroup> +    <ClInclude Include="..\..\imconfig.h" /> +    <ClInclude Include="..\..\imgui.h" /> +    <ClInclude Include="..\..\imgui_internal.h" /> +    <ClInclude Include="..\..\backends\imgui_impl_allegro5.h" /> +  </ItemGroup> +  <ItemGroup> +    <None Include="..\..\misc\debuggers\imgui.natstepfilter" /> +    <None Include="..\..\misc\debuggers\imgui.natvis" /> +    <None Include="..\README.txt" /> +  </ItemGroup> +  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> +  <ImportGroup Label="ExtensionTargets"> +  </ImportGroup> +</Project>
\ No newline at end of file diff --git a/lib/imgui-1.90.7/examples/example_allegro5/example_allegro5.vcxproj.filters b/lib/imgui-1.90.7/examples/example_allegro5/example_allegro5.vcxproj.filters new file mode 100644 index 0000000..84881d3 --- /dev/null +++ b/lib/imgui-1.90.7/examples/example_allegro5/example_allegro5.vcxproj.filters @@ -0,0 +1,61 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> +  <ItemGroup> +    <Filter Include="imgui"> +      <UniqueIdentifier>{20b90ce4-7fcb-4731-b9a0-075f875de82d}</UniqueIdentifier> +    </Filter> +    <Filter Include="sources"> +      <UniqueIdentifier>{f18ab499-84e1-499f-8eff-9754361e0e52}</UniqueIdentifier> +      <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions> +    </Filter> +  </ItemGroup> +  <ItemGroup> +    <ClCompile Include="..\..\imgui.cpp"> +      <Filter>imgui</Filter> +    </ClCompile> +    <ClCompile Include="..\..\imgui_demo.cpp"> +      <Filter>imgui</Filter> +    </ClCompile> +    <ClCompile Include="..\..\imgui_draw.cpp"> +      <Filter>imgui</Filter> +    </ClCompile> +    <ClCompile Include="main.cpp"> +      <Filter>sources</Filter> +    </ClCompile> +    <ClCompile Include="..\..\backends\imgui_impl_allegro5.cpp"> +      <Filter>sources</Filter> +    </ClCompile> +    <ClCompile Include="imconfig_allegro5.h"> +      <Filter>sources</Filter> +    </ClCompile> +    <ClCompile Include="..\..\imgui_tables.cpp"> +      <Filter>imgui</Filter> +    </ClCompile> +    <ClCompile Include="..\..\imgui_widgets.cpp"> +      <Filter>imgui</Filter> +    </ClCompile> +  </ItemGroup> +  <ItemGroup> +    <ClInclude Include="..\..\imconfig.h"> +      <Filter>imgui</Filter> +    </ClInclude> +    <ClInclude Include="..\..\imgui.h"> +      <Filter>imgui</Filter> +    </ClInclude> +    <ClInclude Include="..\..\imgui_internal.h"> +      <Filter>imgui</Filter> +    </ClInclude> +    <ClInclude Include="..\..\backends\imgui_impl_allegro5.h"> +      <Filter>sources</Filter> +    </ClInclude> +  </ItemGroup> +  <ItemGroup> +    <None Include="..\README.txt" /> +    <None Include="..\..\misc\debuggers\imgui.natvis"> +      <Filter>imgui</Filter> +    </None> +    <None Include="..\..\misc\debuggers\imgui.natstepfilter"> +      <Filter>imgui</Filter> +    </None> +  </ItemGroup> +</Project>
\ No newline at end of file diff --git a/lib/imgui-1.90.7/examples/example_allegro5/imconfig_allegro5.h b/lib/imgui-1.90.7/examples/example_allegro5/imconfig_allegro5.h new file mode 100644 index 0000000..35afa67 --- /dev/null +++ b/lib/imgui-1.90.7/examples/example_allegro5/imconfig_allegro5.h @@ -0,0 +1,11 @@ +//----------------------------------------------------------------------------- +// COMPILE-TIME OPTIONS FOR DEAR IMGUI ALLEGRO 5 EXAMPLE +// See imconfig.h for the full template +// Because Allegro doesn't support 16-bit vertex indices, we enable the compile-time option of imgui to use 32-bit indices +//----------------------------------------------------------------------------- + +#pragma once + +// Use 32-bit vertex indices because Allegro doesn't support 16-bit ones +// This allows us to avoid converting vertices format at runtime +#define ImDrawIdx  int diff --git a/lib/imgui-1.90.7/examples/example_allegro5/main.cpp b/lib/imgui-1.90.7/examples/example_allegro5/main.cpp new file mode 100644 index 0000000..3ca061c --- /dev/null +++ b/lib/imgui-1.90.7/examples/example_allegro5/main.cpp @@ -0,0 +1,149 @@ +// Dear ImGui: standalone example application for Allegro 5 + +// 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 + +// On Windows, you can install Allegro5 using vcpkg: +//   git clone https://github.com/Microsoft/vcpkg +//   cd vcpkg +//   bootstrap - vcpkg.bat +//   vcpkg install allegro5 --triplet=x86-windows   ; for win32 +//   vcpkg install allegro5 --triplet=x64-windows   ; for win64 +//   vcpkg integrate install                        ; register include and libs in Visual Studio + +#include <stdint.h> +#include <allegro5/allegro.h> +#include <allegro5/allegro_primitives.h> +#include "imgui.h" +#include "imgui_impl_allegro5.h" + +int main(int, char**) +{ +    // Setup Allegro +    al_init(); +    al_install_keyboard(); +    al_install_mouse(); +    al_init_primitives_addon(); +    al_set_new_display_flags(ALLEGRO_RESIZABLE); +    ALLEGRO_DISPLAY* display = al_create_display(1280, 720); +    al_set_window_title(display, "Dear ImGui Allegro 5 example"); +    ALLEGRO_EVENT_QUEUE* queue = al_create_event_queue(); +    al_register_event_source(queue, al_get_display_event_source(display)); +    al_register_event_source(queue, al_get_keyboard_event_source()); +    al_register_event_source(queue, al_get_mouse_event_source()); + +    // Setup Dear ImGui context +    IMGUI_CHECKVERSION(); +    ImGui::CreateContext(); +    ImGuiIO& io = ImGui::GetIO(); (void)io; +    io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard;  // Enable Keyboard Controls + +    // Setup Dear ImGui style +    ImGui::StyleColorsDark(); +    //ImGui::StyleColorsLight(); + +    // Setup Platform/Renderer backends +    ImGui_ImplAllegro5_Init(display); + +    // 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); + +    bool show_demo_window = true; +    bool show_another_window = false; +    ImVec4 clear_color = ImVec4(0.45f, 0.55f, 0.60f, 1.00f); + +    // Main loop +    bool running = true; +    while (running) +    { +        // Poll and handle events (inputs, window resize, etc.) +        // 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. +        ALLEGRO_EVENT ev; +        while (al_get_next_event(queue, &ev)) +        { +            ImGui_ImplAllegro5_ProcessEvent(&ev); +            if (ev.type == ALLEGRO_EVENT_DISPLAY_CLOSE) +                running = false; +            if (ev.type == ALLEGRO_EVENT_DISPLAY_RESIZE) +            { +                ImGui_ImplAllegro5_InvalidateDeviceObjects(); +                al_acknowledge_resize(display); +                ImGui_ImplAllegro5_CreateDeviceObjects(); +            } +        } + +        // Start the Dear ImGui frame +        ImGui_ImplAllegro5_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); + +        // 2. Show a simple window that we create ourselves. We use a Begin/End pair to create a named window. +        { +            static float f = 0.0f; +            static int counter = 0; + +            ImGui::Begin("Hello, world!");                          // Create a window called "Hello, world!" and append into it. + +            ImGui::Text("This is some useful text.");               // Display some text (you can use a format strings too) +            ImGui::Checkbox("Demo Window", &show_demo_window);      // Edit bools storing our window open/close state +            ImGui::Checkbox("Another Window", &show_another_window); + +            ImGui::SliderFloat("float", &f, 0.0f, 1.0f);            // Edit 1 float using a slider from 0.0f to 1.0f +            ImGui::ColorEdit3("clear color", (float*)&clear_color); // Edit 3 floats representing a color + +            if (ImGui::Button("Button"))                            // Buttons return true when clicked (most widgets return true when edited/activated) +                counter++; +            ImGui::SameLine(); +            ImGui::Text("counter = %d", counter); + +            ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / io.Framerate, io.Framerate); +            ImGui::End(); +        } + +        // 3. Show another simple window. +        if (show_another_window) +        { +            ImGui::Begin("Another Window", &show_another_window);   // Pass a pointer to our bool variable (the window will have a closing button that will clear the bool when clicked) +            ImGui::Text("Hello from another window!"); +            if (ImGui::Button("Close Me")) +                show_another_window = false; +            ImGui::End(); +        } + +        // Rendering +        ImGui::Render(); +        al_clear_to_color(al_map_rgba_f(clear_color.x * clear_color.w, clear_color.y * clear_color.w, clear_color.z * clear_color.w, clear_color.w)); +        ImGui_ImplAllegro5_RenderDrawData(ImGui::GetDrawData()); +        al_flip_display(); +    } + +    // Cleanup +    ImGui_ImplAllegro5_Shutdown(); +    ImGui::DestroyContext(); +    al_destroy_event_queue(queue); +    al_destroy_display(display); + +    return 0; +} diff --git a/lib/imgui-1.90.7/examples/example_android_opengl3/CMakeLists.txt b/lib/imgui-1.90.7/examples/example_android_opengl3/CMakeLists.txt new file mode 100644 index 0000000..63531f4 --- /dev/null +++ b/lib/imgui-1.90.7/examples/example_android_opengl3/CMakeLists.txt @@ -0,0 +1,40 @@ +cmake_minimum_required(VERSION 3.6) + +project(ImGuiExample) + +set(CMAKE_CXX_STANDARD 11) +set(CMAKE_CXX_STANDARD_REQUIRED ON) +set(CMAKE_CXX_EXTENSIONS OFF) + +add_library(${CMAKE_PROJECT_NAME} SHARED +  ${CMAKE_CURRENT_SOURCE_DIR}/main.cpp +  ${CMAKE_CURRENT_SOURCE_DIR}/../../imgui.cpp +  ${CMAKE_CURRENT_SOURCE_DIR}/../../imgui_demo.cpp +  ${CMAKE_CURRENT_SOURCE_DIR}/../../imgui_draw.cpp +  ${CMAKE_CURRENT_SOURCE_DIR}/../../imgui_tables.cpp +  ${CMAKE_CURRENT_SOURCE_DIR}/../../imgui_widgets.cpp +  ${CMAKE_CURRENT_SOURCE_DIR}/../../backends/imgui_impl_android.cpp +  ${CMAKE_CURRENT_SOURCE_DIR}/../../backends/imgui_impl_opengl3.cpp +  ${ANDROID_NDK}/sources/android/native_app_glue/android_native_app_glue.c +) + +set(CMAKE_SHARED_LINKER_FLAGS +  "${CMAKE_SHARED_LINKER_FLAGS} -u ANativeActivity_onCreate" +) + +target_compile_definitions(${CMAKE_PROJECT_NAME} PRIVATE +  IMGUI_IMPL_OPENGL_ES3 +) + +target_include_directories(${CMAKE_PROJECT_NAME} PRIVATE +  ${CMAKE_CURRENT_SOURCE_DIR}/../.. +  ${CMAKE_CURRENT_SOURCE_DIR}/../../backends +  ${ANDROID_NDK}/sources/android/native_app_glue +) + +target_link_libraries(${CMAKE_PROJECT_NAME} PRIVATE +  android +  EGL +  GLESv3 +  log +) diff --git a/lib/imgui-1.90.7/examples/example_android_opengl3/android/.gitignore b/lib/imgui-1.90.7/examples/example_android_opengl3/android/.gitignore new file mode 100644 index 0000000..3c7a619 --- /dev/null +++ b/lib/imgui-1.90.7/examples/example_android_opengl3/android/.gitignore @@ -0,0 +1,12 @@ +.cxx +.externalNativeBuild +build/ +*.iml + +.idea +.gradle +local.properties + +# Android Studio puts a Gradle wrapper here, that we don't want: +gradle/ +gradlew* diff --git a/lib/imgui-1.90.7/examples/example_android_opengl3/android/app/build.gradle b/lib/imgui-1.90.7/examples/example_android_opengl3/android/app/build.gradle new file mode 100644 index 0000000..53181ba --- /dev/null +++ b/lib/imgui-1.90.7/examples/example_android_opengl3/android/app/build.gradle @@ -0,0 +1,46 @@ +apply plugin: 'com.android.application' +apply plugin: 'kotlin-android' + +android { +    compileSdkVersion 33 +    buildToolsVersion "33.0.2" +    ndkVersion "25.2.9519653" + +    defaultConfig { +        applicationId "imgui.example.android" +        namespace "imgui.example.android" +        minSdkVersion 24 +        targetSdkVersion 33 +        versionCode 1 +        versionName "1.0" +    } + +    buildTypes { +        release { +            minifyEnabled false +            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt') +        } +    } + +    compileOptions { +        sourceCompatibility JavaVersion.VERSION_11 +        targetCompatibility JavaVersion.VERSION_11 +    } + +    kotlinOptions { +        jvmTarget="11" +    } + +    externalNativeBuild { +        cmake { +            path "../../CMakeLists.txt" +            version '3.22.1' +        } +    } +} +repositories { +    mavenCentral() +} +dependencies { +    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" +} diff --git a/lib/imgui-1.90.7/examples/example_android_opengl3/android/app/src/main/AndroidManifest.xml b/lib/imgui-1.90.7/examples/example_android_opengl3/android/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..a87b95b --- /dev/null +++ b/lib/imgui-1.90.7/examples/example_android_opengl3/android/app/src/main/AndroidManifest.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="utf-8"?> +<manifest xmlns:android="http://schemas.android.com/apk/res/android"> + +    <application +        android:label="ImGuiExample" +        android:allowBackup="false" +        android:fullBackupContent="false" +        android:hasCode="true"> + +        <activity +            android:name="imgui.example.android.MainActivity" +            android:theme="@android:style/Theme.NoTitleBar.Fullscreen" +            android:configChanges="orientation|keyboardHidden|screenSize" +            android:exported="false"> +            <meta-data android:name="android.app.lib_name" +                android:value="ImGuiExample" /> + +            <intent-filter> +                <action android:name="android.intent.action.MAIN" /> +                <category android:name="android.intent.category.LAUNCHER" /> +            </intent-filter> +        </activity> +    </application> +</manifest> diff --git a/lib/imgui-1.90.7/examples/example_android_opengl3/android/app/src/main/java/MainActivity.kt b/lib/imgui-1.90.7/examples/example_android_opengl3/android/app/src/main/java/MainActivity.kt new file mode 100644 index 0000000..896a88c --- /dev/null +++ b/lib/imgui-1.90.7/examples/example_android_opengl3/android/app/src/main/java/MainActivity.kt @@ -0,0 +1,40 @@ +package imgui.example.android + +import android.app.NativeActivity +import android.os.Bundle +import android.content.Context +import android.view.inputmethod.InputMethodManager +import android.view.KeyEvent +import java.util.concurrent.LinkedBlockingQueue + +class MainActivity : NativeActivity() { +    public override fun onCreate(savedInstanceState: Bundle?) { +        super.onCreate(savedInstanceState) +    } + +    fun showSoftInput() { +        val inputMethodManager = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager +        inputMethodManager.showSoftInput(this.window.decorView, 0) +    } + +    fun hideSoftInput() { +        val inputMethodManager = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager +        inputMethodManager.hideSoftInputFromWindow(this.window.decorView.windowToken, 0) +    } + +    // Queue for the Unicode characters to be polled from native code (via pollUnicodeChar()) +    private var unicodeCharacterQueue: LinkedBlockingQueue<Int> = LinkedBlockingQueue() + +    // We assume dispatchKeyEvent() of the NativeActivity is actually called for every +    // KeyEvent and not consumed by any View before it reaches here +    override fun dispatchKeyEvent(event: KeyEvent): Boolean { +        if (event.action == KeyEvent.ACTION_DOWN) { +            unicodeCharacterQueue.offer(event.getUnicodeChar(event.metaState)) +        } +        return super.dispatchKeyEvent(event) +    } + +    fun pollUnicodeChar(): Int { +        return unicodeCharacterQueue.poll() ?: 0 +    } +} diff --git a/lib/imgui-1.90.7/examples/example_android_opengl3/android/build.gradle b/lib/imgui-1.90.7/examples/example_android_opengl3/android/build.gradle new file mode 100644 index 0000000..ccd2185 --- /dev/null +++ b/lib/imgui-1.90.7/examples/example_android_opengl3/android/build.gradle @@ -0,0 +1,24 @@ +buildscript { +    ext.kotlin_version = '1.8.0' +    repositories { +        google() +        mavenCentral() + +    } +    dependencies { +        classpath 'com.android.tools.build:gradle:7.4.1' +        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" + +    } +} + +allprojects { +    repositories { +        google() +        mavenCentral() +    } +} + +task clean(type: Delete) { +    delete rootProject.buildDir +} diff --git a/lib/imgui-1.90.7/examples/example_android_opengl3/android/settings.gradle b/lib/imgui-1.90.7/examples/example_android_opengl3/android/settings.gradle new file mode 100644 index 0000000..e7b4def --- /dev/null +++ b/lib/imgui-1.90.7/examples/example_android_opengl3/android/settings.gradle @@ -0,0 +1 @@ +include ':app' diff --git a/lib/imgui-1.90.7/examples/example_android_opengl3/main.cpp b/lib/imgui-1.90.7/examples/example_android_opengl3/main.cpp new file mode 100644 index 0000000..e0ad5f9 --- /dev/null +++ b/lib/imgui-1.90.7/examples/example_android_opengl3/main.cpp @@ -0,0 +1,383 @@ +// dear imgui: standalone example application for Android + OpenGL ES 3 + +// 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_android.h" +#include "imgui_impl_opengl3.h" +#include <android/log.h> +#include <android_native_app_glue.h> +#include <android/asset_manager.h> +#include <EGL/egl.h> +#include <GLES3/gl3.h> +#include <string> + +// Data +static EGLDisplay           g_EglDisplay = EGL_NO_DISPLAY; +static EGLSurface           g_EglSurface = EGL_NO_SURFACE; +static EGLContext           g_EglContext = EGL_NO_CONTEXT; +static struct android_app*  g_App = nullptr; +static bool                 g_Initialized = false; +static char                 g_LogTag[] = "ImGuiExample"; +static std::string          g_IniFilename = ""; + +// Forward declarations of helper functions +static void Init(struct android_app* app); +static void Shutdown(); +static void MainLoopStep(); +static int ShowSoftKeyboardInput(); +static int PollUnicodeChars(); +static int GetAssetData(const char* filename, void** out_data); + +// Main code +static void handleAppCmd(struct android_app* app, int32_t appCmd) +{ +    switch (appCmd) +    { +    case APP_CMD_SAVE_STATE: +        break; +    case APP_CMD_INIT_WINDOW: +        Init(app); +        break; +    case APP_CMD_TERM_WINDOW: +        Shutdown(); +        break; +    case APP_CMD_GAINED_FOCUS: +    case APP_CMD_LOST_FOCUS: +        break; +    } +} + +static int32_t handleInputEvent(struct android_app* app, AInputEvent* inputEvent) +{ +    return ImGui_ImplAndroid_HandleInputEvent(inputEvent); +} + +void android_main(struct android_app* app) +{ +    app->onAppCmd = handleAppCmd; +    app->onInputEvent = handleInputEvent; + +    while (true) +    { +        int out_events; +        struct android_poll_source* out_data; + +        // Poll all events. If the app is not visible, this loop blocks until g_Initialized == true. +        while (ALooper_pollAll(g_Initialized ? 0 : -1, nullptr, &out_events, (void**)&out_data) >= 0) +        { +            // Process one event +            if (out_data != nullptr) +                out_data->process(app, out_data); + +            // Exit the app by returning from within the infinite loop +            if (app->destroyRequested != 0) +            { +                // shutdown() should have been called already while processing the +                // app command APP_CMD_TERM_WINDOW. But we play save here +                if (!g_Initialized) +                    Shutdown(); + +                return; +            } +        } + +        // Initiate a new frame +        MainLoopStep(); +    } +} + +void Init(struct android_app* app) +{ +    if (g_Initialized) +        return; + +    g_App = app; +    ANativeWindow_acquire(g_App->window); + +    // Initialize EGL +    // This is mostly boilerplate code for EGL... +    { +        g_EglDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY); +        if (g_EglDisplay == EGL_NO_DISPLAY) +            __android_log_print(ANDROID_LOG_ERROR, g_LogTag, "%s", "eglGetDisplay(EGL_DEFAULT_DISPLAY) returned EGL_NO_DISPLAY"); + +        if (eglInitialize(g_EglDisplay, 0, 0) != EGL_TRUE) +            __android_log_print(ANDROID_LOG_ERROR, g_LogTag, "%s", "eglInitialize() returned with an error"); + +        const EGLint egl_attributes[] = { EGL_BLUE_SIZE, 8, EGL_GREEN_SIZE, 8, EGL_RED_SIZE, 8, EGL_DEPTH_SIZE, 24, EGL_SURFACE_TYPE, EGL_WINDOW_BIT, EGL_NONE }; +        EGLint num_configs = 0; +        if (eglChooseConfig(g_EglDisplay, egl_attributes, nullptr, 0, &num_configs) != EGL_TRUE) +            __android_log_print(ANDROID_LOG_ERROR, g_LogTag, "%s", "eglChooseConfig() returned with an error"); +        if (num_configs == 0) +            __android_log_print(ANDROID_LOG_ERROR, g_LogTag, "%s", "eglChooseConfig() returned 0 matching config"); + +        // Get the first matching config +        EGLConfig egl_config; +        eglChooseConfig(g_EglDisplay, egl_attributes, &egl_config, 1, &num_configs); +        EGLint egl_format; +        eglGetConfigAttrib(g_EglDisplay, egl_config, EGL_NATIVE_VISUAL_ID, &egl_format); +        ANativeWindow_setBuffersGeometry(g_App->window, 0, 0, egl_format); + +        const EGLint egl_context_attributes[] = { EGL_CONTEXT_CLIENT_VERSION, 3, EGL_NONE }; +        g_EglContext = eglCreateContext(g_EglDisplay, egl_config, EGL_NO_CONTEXT, egl_context_attributes); + +        if (g_EglContext == EGL_NO_CONTEXT) +            __android_log_print(ANDROID_LOG_ERROR, g_LogTag, "%s", "eglCreateContext() returned EGL_NO_CONTEXT"); + +        g_EglSurface = eglCreateWindowSurface(g_EglDisplay, egl_config, g_App->window, nullptr); +        eglMakeCurrent(g_EglDisplay, g_EglSurface, g_EglSurface, g_EglContext); +    } + +    // Setup Dear ImGui context +    IMGUI_CHECKVERSION(); +    ImGui::CreateContext(); +    ImGuiIO& io = ImGui::GetIO(); + +    // Redirect loading/saving of .ini file to our location. +    // Make sure 'g_IniFilename' persists while we use Dear ImGui. +    g_IniFilename = std::string(app->activity->internalDataPath) + "/imgui.ini"; +    io.IniFilename = g_IniFilename.c_str();; + +    // Setup Dear ImGui style +    ImGui::StyleColorsDark(); +    //ImGui::StyleColorsLight(); + +    // Setup Platform/Renderer backends +    ImGui_ImplAndroid_Init(g_App->window); +    ImGui_ImplOpenGL3_Init("#version 300 es"); + +    // 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. +    // - 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. +    // - 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 \\ ! +    // - Android: The TTF files have to be placed into the assets/ directory (android/app/src/main/assets), we use our GetAssetData() helper to retrieve them. + +    // We load the default font with increased size to improve readability on many devices with "high" DPI. +    // FIXME: Put some effort into DPI awareness. +    // Important: when calling AddFontFromMemoryTTF(), ownership of font_data is transferred by Dear ImGui by default (deleted is handled by Dear ImGui), unless we set FontDataOwnedByAtlas=false in ImFontConfig +    ImFontConfig font_cfg; +    font_cfg.SizePixels = 22.0f; +    io.Fonts->AddFontDefault(&font_cfg); +    //void* font_data; +    //int font_data_size; +    //ImFont* font; +    //font_data_size = GetAssetData("segoeui.ttf", &font_data); +    //font = io.Fonts->AddFontFromMemoryTTF(font_data, font_data_size, 16.0f); +    //IM_ASSERT(font != nullptr); +    //font_data_size = GetAssetData("DroidSans.ttf", &font_data); +    //font = io.Fonts->AddFontFromMemoryTTF(font_data, font_data_size, 16.0f); +    //IM_ASSERT(font != nullptr); +    //font_data_size = GetAssetData("Roboto-Medium.ttf", &font_data); +    //font = io.Fonts->AddFontFromMemoryTTF(font_data, font_data_size, 16.0f); +    //IM_ASSERT(font != nullptr); +    //font_data_size = GetAssetData("Cousine-Regular.ttf", &font_data); +    //font = io.Fonts->AddFontFromMemoryTTF(font_data, font_data_size, 15.0f); +    //IM_ASSERT(font != nullptr); +    //font_data_size = GetAssetData("ArialUni.ttf", &font_data); +    //font = io.Fonts->AddFontFromMemoryTTF(font_data, font_data_size, 18.0f, nullptr, io.Fonts->GetGlyphRangesJapanese()); +    //IM_ASSERT(font != nullptr); + +    // Arbitrary scale-up +    // FIXME: Put some effort into DPI awareness +    ImGui::GetStyle().ScaleAllSizes(3.0f); + +    g_Initialized = true; +} + +void MainLoopStep() +{ +    ImGuiIO& io = ImGui::GetIO(); +    if (g_EglDisplay == EGL_NO_DISPLAY) +        return; + +    // Our state +    // (we use static, which essentially makes the variable globals, as a convenience to keep the example code easy to follow) +    static bool show_demo_window = true; +    static bool show_another_window = false; +    static ImVec4 clear_color = ImVec4(0.45f, 0.55f, 0.60f, 1.00f); + +    // Poll Unicode characters via JNI +    // FIXME: do not call this every frame because of JNI overhead +    PollUnicodeChars(); + +    // Open on-screen (soft) input if requested by Dear ImGui +    static bool WantTextInputLast = false; +    if (io.WantTextInput && !WantTextInputLast) +        ShowSoftKeyboardInput(); +    WantTextInputLast = io.WantTextInput; + +    // Start the Dear ImGui frame +    ImGui_ImplOpenGL3_NewFrame(); +    ImGui_ImplAndroid_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); + +    // 2. Show a simple window that we create ourselves. We use a Begin/End pair to create a named window. +    { +        static float f = 0.0f; +        static int counter = 0; + +        ImGui::Begin("Hello, world!"); // Create a window called "Hello, world!" and append into it. + +        ImGui::Text("This is some useful text.");               // Display some text (you can use a format strings too) +        ImGui::Checkbox("Demo Window", &show_demo_window);      // Edit bools storing our window open/close state +        ImGui::Checkbox("Another Window", &show_another_window); + +        ImGui::SliderFloat("float", &f, 0.0f, 1.0f);            // Edit 1 float using a slider from 0.0f to 1.0f +        ImGui::ColorEdit3("clear color", (float*)&clear_color); // Edit 3 floats representing a color + +        if (ImGui::Button("Button"))                            // Buttons return true when clicked (most widgets return true when edited/activated) +            counter++; +        ImGui::SameLine(); +        ImGui::Text("counter = %d", counter); + +        ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / io.Framerate, io.Framerate); +        ImGui::End(); +    } + +    // 3. Show another simple window. +    if (show_another_window) +    { +        ImGui::Begin("Another Window", &show_another_window);   // Pass a pointer to our bool variable (the window will have a closing button that will clear the bool when clicked) +        ImGui::Text("Hello from another window!"); +        if (ImGui::Button("Close Me")) +            show_another_window = false; +        ImGui::End(); +    } + +    // Rendering +    ImGui::Render(); +    glViewport(0, 0, (int)io.DisplaySize.x, (int)io.DisplaySize.y); +    glClearColor(clear_color.x * clear_color.w, clear_color.y * clear_color.w, clear_color.z * clear_color.w, clear_color.w); +    glClear(GL_COLOR_BUFFER_BIT); +    ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData()); +    eglSwapBuffers(g_EglDisplay, g_EglSurface); +} + +void Shutdown() +{ +    if (!g_Initialized) +        return; + +    // Cleanup +    ImGui_ImplOpenGL3_Shutdown(); +    ImGui_ImplAndroid_Shutdown(); +    ImGui::DestroyContext(); + +    if (g_EglDisplay != EGL_NO_DISPLAY) +    { +        eglMakeCurrent(g_EglDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); + +        if (g_EglContext != EGL_NO_CONTEXT) +            eglDestroyContext(g_EglDisplay, g_EglContext); + +        if (g_EglSurface != EGL_NO_SURFACE) +            eglDestroySurface(g_EglDisplay, g_EglSurface); + +        eglTerminate(g_EglDisplay); +    } + +    g_EglDisplay = EGL_NO_DISPLAY; +    g_EglContext = EGL_NO_CONTEXT; +    g_EglSurface = EGL_NO_SURFACE; +    ANativeWindow_release(g_App->window); + +    g_Initialized = false; +} + +// Helper functions + +// Unfortunately, there is no way to show the on-screen input from native code. +// Therefore, we call ShowSoftKeyboardInput() of the main activity implemented in MainActivity.kt via JNI. +static int ShowSoftKeyboardInput() +{ +    JavaVM* java_vm = g_App->activity->vm; +    JNIEnv* java_env = nullptr; + +    jint jni_return = java_vm->GetEnv((void**)&java_env, JNI_VERSION_1_6); +    if (jni_return == JNI_ERR) +        return -1; + +    jni_return = java_vm->AttachCurrentThread(&java_env, nullptr); +    if (jni_return != JNI_OK) +        return -2; + +    jclass native_activity_clazz = java_env->GetObjectClass(g_App->activity->clazz); +    if (native_activity_clazz == nullptr) +        return -3; + +    jmethodID method_id = java_env->GetMethodID(native_activity_clazz, "showSoftInput", "()V"); +    if (method_id == nullptr) +        return -4; + +    java_env->CallVoidMethod(g_App->activity->clazz, method_id); + +    jni_return = java_vm->DetachCurrentThread(); +    if (jni_return != JNI_OK) +        return -5; + +    return 0; +} + +// Unfortunately, the native KeyEvent implementation has no getUnicodeChar() function. +// Therefore, we implement the processing of KeyEvents in MainActivity.kt and poll +// the resulting Unicode characters here via JNI and send them to Dear ImGui. +static int PollUnicodeChars() +{ +    JavaVM* java_vm = g_App->activity->vm; +    JNIEnv* java_env = nullptr; + +    jint jni_return = java_vm->GetEnv((void**)&java_env, JNI_VERSION_1_6); +    if (jni_return == JNI_ERR) +        return -1; + +    jni_return = java_vm->AttachCurrentThread(&java_env, nullptr); +    if (jni_return != JNI_OK) +        return -2; + +    jclass native_activity_clazz = java_env->GetObjectClass(g_App->activity->clazz); +    if (native_activity_clazz == nullptr) +        return -3; + +    jmethodID method_id = java_env->GetMethodID(native_activity_clazz, "pollUnicodeChar", "()I"); +    if (method_id == nullptr) +        return -4; + +    // Send the actual characters to Dear ImGui +    ImGuiIO& io = ImGui::GetIO(); +    jint unicode_character; +    while ((unicode_character = java_env->CallIntMethod(g_App->activity->clazz, method_id)) != 0) +        io.AddInputCharacter(unicode_character); + +    jni_return = java_vm->DetachCurrentThread(); +    if (jni_return != JNI_OK) +        return -5; + +    return 0; +} + +// Helper to retrieve data placed into the assets/ directory (android/app/src/main/assets) +static int GetAssetData(const char* filename, void** outData) +{ +    int num_bytes = 0; +    AAsset* asset_descriptor = AAssetManager_open(g_App->activity->assetManager, filename, AASSET_MODE_BUFFER); +    if (asset_descriptor) +    { +        num_bytes = AAsset_getLength(asset_descriptor); +        *outData = IM_ALLOC(num_bytes); +        int64_t num_bytes_read = AAsset_read(asset_descriptor, *outData, num_bytes); +        AAsset_close(asset_descriptor); +        IM_ASSERT(num_bytes_read == num_bytes); +    } +    return num_bytes; +} diff --git a/lib/imgui-1.90.7/examples/example_apple_metal/README.md b/lib/imgui-1.90.7/examples/example_apple_metal/README.md new file mode 100644 index 0000000..48a2b57 --- /dev/null +++ b/lib/imgui-1.90.7/examples/example_apple_metal/README.md @@ -0,0 +1,10 @@ +# iOS / OSX Metal example + +## Introduction + +This example shows how to integrate Dear ImGui with Metal. It is based on the "cross-platform" game template provided with Xcode as of Xcode 9. + +Consider basing your work off the example_glfw_metal/ or example_sdl2_metal/ examples. They are better supported and will be portable unlike this one. + + + diff --git a/lib/imgui-1.90.7/examples/example_apple_metal/example_apple_metal.xcodeproj/project.pbxproj b/lib/imgui-1.90.7/examples/example_apple_metal/example_apple_metal.xcodeproj/project.pbxproj new file mode 100644 index 0000000..4bb4fc2 --- /dev/null +++ b/lib/imgui-1.90.7/examples/example_apple_metal/example_apple_metal.xcodeproj/project.pbxproj @@ -0,0 +1,503 @@ +// !$*UTF8*$! +{ +	archiveVersion = 1; +	classes = { +	}; +	objectVersion = 48; +	objects = { + +/* Begin PBXBuildFile section */ +		05318E0F274C397200A8DE2E /* GameController.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 05318E0E274C397200A8DE2E /* GameController.framework */; }; +		07A82ED82139413D0078D120 /* imgui_widgets.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 07A82ED72139413C0078D120 /* imgui_widgets.cpp */; }; +		07A82ED92139418F0078D120 /* imgui_widgets.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 07A82ED72139413C0078D120 /* imgui_widgets.cpp */; }; +		5079822E257677DB0038A28D /* imgui_tables.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5079822D257677DB0038A28D /* imgui_tables.cpp */; }; +		8309BD8F253CCAAA0045E2A1 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8309BD8E253CCAAA0045E2A1 /* UIKit.framework */; }; +		8309BDA5253CCC070045E2A1 /* main.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8309BDA0253CCBC10045E2A1 /* main.mm */; }; +		8309BDA8253CCC080045E2A1 /* main.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8309BDA0253CCBC10045E2A1 /* main.mm */; }; +		8309BDBB253CCCAD0045E2A1 /* imgui_impl_metal.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8309BDB5253CCC9D0045E2A1 /* imgui_impl_metal.mm */; }; +		8309BDBE253CCCB60045E2A1 /* imgui_impl_metal.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8309BDB5253CCC9D0045E2A1 /* imgui_impl_metal.mm */; }; +		8309BDBF253CCCB60045E2A1 /* imgui_impl_osx.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8309BDB6253CCC9D0045E2A1 /* imgui_impl_osx.mm */; }; +		8309BDC6253CCCFE0045E2A1 /* AppKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8309BDC5253CCCFE0045E2A1 /* AppKit.framework */; }; +		8309BDFC253CDAB30045E2A1 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 8309BDF7253CDAAE0045E2A1 /* LaunchScreen.storyboard */; }; +		8309BE04253CDAB60045E2A1 /* MainMenu.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 8309BDFA253CDAAE0045E2A1 /* MainMenu.storyboard */; }; +		83BBE9E520EB46B900295997 /* Metal.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 83BBE9E420EB46B900295997 /* Metal.framework */; }; +		83BBE9E720EB46BD00295997 /* MetalKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 83BBE9E620EB46BD00295997 /* MetalKit.framework */; }; +		83BBE9EC20EB471700295997 /* MetalKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 83BBE9EA20EB471700295997 /* MetalKit.framework */; }; +		83BBE9ED20EB471700295997 /* Metal.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 83BBE9EB20EB471700295997 /* Metal.framework */; }; +		83BBEA0520EB54E700295997 /* imgui_draw.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 83BBEA0120EB54E700295997 /* imgui_draw.cpp */; }; +		83BBEA0620EB54E700295997 /* imgui_draw.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 83BBEA0120EB54E700295997 /* imgui_draw.cpp */; }; +		83BBEA0720EB54E700295997 /* imgui_demo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 83BBEA0220EB54E700295997 /* imgui_demo.cpp */; }; +		83BBEA0820EB54E700295997 /* imgui_demo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 83BBEA0220EB54E700295997 /* imgui_demo.cpp */; }; +		83BBEA0920EB54E700295997 /* imgui.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 83BBEA0320EB54E700295997 /* imgui.cpp */; }; +		83BBEA0A20EB54E700295997 /* imgui.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 83BBEA0320EB54E700295997 /* imgui.cpp */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ +		05318E0E274C397200A8DE2E /* GameController.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = GameController.framework; path = System/Library/Frameworks/GameController.framework; sourceTree = SDKROOT; }; +		07A82ED62139413C0078D120 /* imgui_internal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = imgui_internal.h; path = ../../imgui_internal.h; sourceTree = "<group>"; }; +		07A82ED72139413C0078D120 /* imgui_widgets.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = imgui_widgets.cpp; path = ../../imgui_widgets.cpp; sourceTree = "<group>"; }; +		5079822D257677DB0038A28D /* imgui_tables.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = imgui_tables.cpp; path = ../../imgui_tables.cpp; sourceTree = "<group>"; }; +		8307E7C420E9F9C900473790 /* example_apple_metal.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = example_apple_metal.app; sourceTree = BUILT_PRODUCTS_DIR; }; +		8307E7DA20E9F9C900473790 /* example_apple_metal.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = example_apple_metal.app; sourceTree = BUILT_PRODUCTS_DIR; }; +		8309BD8E253CCAAA0045E2A1 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk/System/Library/Frameworks/UIKit.framework; sourceTree = DEVELOPER_DIR; }; +		8309BDA0253CCBC10045E2A1 /* main.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = main.mm; sourceTree = "<group>"; }; +		8309BDB5253CCC9D0045E2A1 /* imgui_impl_metal.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = imgui_impl_metal.mm; path = ../../backends/imgui_impl_metal.mm; sourceTree = "<group>"; }; +		8309BDB6253CCC9D0045E2A1 /* imgui_impl_osx.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = imgui_impl_osx.mm; path = ../../backends/imgui_impl_osx.mm; sourceTree = "<group>"; }; +		8309BDC5253CCCFE0045E2A1 /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = System/Library/Frameworks/AppKit.framework; sourceTree = SDKROOT; }; +		8309BDF7253CDAAE0045E2A1 /* LaunchScreen.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = LaunchScreen.storyboard; sourceTree = "<group>"; }; +		8309BDF8253CDAAE0045E2A1 /* Info-iOS.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "Info-iOS.plist"; sourceTree = "<group>"; }; +		8309BDFA253CDAAE0045E2A1 /* MainMenu.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = MainMenu.storyboard; sourceTree = "<group>"; }; +		8309BDFB253CDAAE0045E2A1 /* Info-macOS.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "Info-macOS.plist"; sourceTree = "<group>"; }; +		83BBE9E420EB46B900295997 /* Metal.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Metal.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS11.4.sdk/System/Library/Frameworks/Metal.framework; sourceTree = DEVELOPER_DIR; }; +		83BBE9E620EB46BD00295997 /* MetalKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MetalKit.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS11.4.sdk/System/Library/Frameworks/MetalKit.framework; sourceTree = DEVELOPER_DIR; }; +		83BBE9E820EB46C100295997 /* ModelIO.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ModelIO.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS11.4.sdk/System/Library/Frameworks/ModelIO.framework; sourceTree = DEVELOPER_DIR; }; +		83BBE9EA20EB471700295997 /* MetalKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MetalKit.framework; path = System/Library/Frameworks/MetalKit.framework; sourceTree = SDKROOT; }; +		83BBE9EB20EB471700295997 /* Metal.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Metal.framework; path = System/Library/Frameworks/Metal.framework; sourceTree = SDKROOT; }; +		83BBE9EE20EB471C00295997 /* ModelIO.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ModelIO.framework; path = System/Library/Frameworks/ModelIO.framework; sourceTree = SDKROOT; }; +		83BBEA0020EB54E700295997 /* imgui.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = imgui.h; path = ../../imgui.h; sourceTree = "<group>"; }; +		83BBEA0120EB54E700295997 /* imgui_draw.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = imgui_draw.cpp; path = ../../imgui_draw.cpp; sourceTree = "<group>"; }; +		83BBEA0220EB54E700295997 /* imgui_demo.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = imgui_demo.cpp; path = ../../imgui_demo.cpp; sourceTree = "<group>"; }; +		83BBEA0320EB54E700295997 /* imgui.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = imgui.cpp; path = ../../imgui.cpp; sourceTree = "<group>"; }; +		83BBEA0420EB54E700295997 /* imconfig.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = imconfig.h; path = ../../imconfig.h; sourceTree = "<group>"; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ +		8307E7C120E9F9C900473790 /* Frameworks */ = { +			isa = PBXFrameworksBuildPhase; +			buildActionMask = 2147483647; +			files = ( +				8309BD8F253CCAAA0045E2A1 /* UIKit.framework in Frameworks */, +				83BBE9E720EB46BD00295997 /* MetalKit.framework in Frameworks */, +				83BBE9E520EB46B900295997 /* Metal.framework in Frameworks */, +			); +			runOnlyForDeploymentPostprocessing = 0; +		}; +		8307E7D720E9F9C900473790 /* Frameworks */ = { +			isa = PBXFrameworksBuildPhase; +			buildActionMask = 2147483647; +			files = ( +				8309BDC6253CCCFE0045E2A1 /* AppKit.framework in Frameworks */, +				83BBE9EC20EB471700295997 /* MetalKit.framework in Frameworks */, +				05318E0F274C397200A8DE2E /* GameController.framework in Frameworks */, +				83BBE9ED20EB471700295997 /* Metal.framework in Frameworks */, +			); +			runOnlyForDeploymentPostprocessing = 0; +		}; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ +		8307E7B520E9F9C700473790 = { +			isa = PBXGroup; +			children = ( +				83BBE9F020EB544400295997 /* imgui */, +				8309BD9E253CCBA70045E2A1 /* example */, +				8307E7C520E9F9C900473790 /* Products */, +				83BBE9E320EB46B800295997 /* Frameworks */, +			); +			sourceTree = "<group>"; +		}; +		8307E7C520E9F9C900473790 /* Products */ = { +			isa = PBXGroup; +			children = ( +				8307E7C420E9F9C900473790 /* example_apple_metal.app */, +				8307E7DA20E9F9C900473790 /* example_apple_metal.app */, +			); +			name = Products; +			sourceTree = "<group>"; +		}; +		8309BD9E253CCBA70045E2A1 /* example */ = { +			isa = PBXGroup; +			children = ( +				8309BDF6253CDAAE0045E2A1 /* iOS */, +				8309BDF9253CDAAE0045E2A1 /* macOS */, +				8309BDA0253CCBC10045E2A1 /* main.mm */, +			); +			name = example; +			sourceTree = "<group>"; +		}; +		8309BDF6253CDAAE0045E2A1 /* iOS */ = { +			isa = PBXGroup; +			children = ( +				8309BDF7253CDAAE0045E2A1 /* LaunchScreen.storyboard */, +				8309BDF8253CDAAE0045E2A1 /* Info-iOS.plist */, +			); +			path = iOS; +			sourceTree = "<group>"; +		}; +		8309BDF9253CDAAE0045E2A1 /* macOS */ = { +			isa = PBXGroup; +			children = ( +				8309BDFA253CDAAE0045E2A1 /* MainMenu.storyboard */, +				8309BDFB253CDAAE0045E2A1 /* Info-macOS.plist */, +			); +			path = macOS; +			sourceTree = "<group>"; +		}; +		83BBE9E320EB46B800295997 /* Frameworks */ = { +			isa = PBXGroup; +			children = ( +				05318E0E274C397200A8DE2E /* GameController.framework */, +				8309BDC5253CCCFE0045E2A1 /* AppKit.framework */, +				8309BD8E253CCAAA0045E2A1 /* UIKit.framework */, +				83BBE9EE20EB471C00295997 /* ModelIO.framework */, +				83BBE9EB20EB471700295997 /* Metal.framework */, +				83BBE9EA20EB471700295997 /* MetalKit.framework */, +				83BBE9E820EB46C100295997 /* ModelIO.framework */, +				83BBE9E620EB46BD00295997 /* MetalKit.framework */, +				83BBE9E420EB46B900295997 /* Metal.framework */, +			); +			name = Frameworks; +			sourceTree = "<group>"; +		}; +		83BBE9F020EB544400295997 /* imgui */ = { +			isa = PBXGroup; +			children = ( +				5079822D257677DB0038A28D /* imgui_tables.cpp */, +				8309BDB5253CCC9D0045E2A1 /* imgui_impl_metal.mm */, +				8309BDB6253CCC9D0045E2A1 /* imgui_impl_osx.mm */, +				83BBEA0420EB54E700295997 /* imconfig.h */, +				83BBEA0320EB54E700295997 /* imgui.cpp */, +				83BBEA0020EB54E700295997 /* imgui.h */, +				83BBEA0220EB54E700295997 /* imgui_demo.cpp */, +				83BBEA0120EB54E700295997 /* imgui_draw.cpp */, +				07A82ED62139413C0078D120 /* imgui_internal.h */, +				07A82ED72139413C0078D120 /* imgui_widgets.cpp */, +			); +			name = imgui; +			sourceTree = "<group>"; +		}; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ +		8307E7C320E9F9C900473790 /* example_apple_metal_ios */ = { +			isa = PBXNativeTarget; +			buildConfigurationList = 8307E7F020E9F9C900473790 /* Build configuration list for PBXNativeTarget "example_apple_metal_ios" */; +			buildPhases = ( +				8307E7C020E9F9C900473790 /* Sources */, +				8307E7C120E9F9C900473790 /* Frameworks */, +				8307E7C220E9F9C900473790 /* Resources */, +			); +			buildRules = ( +			); +			dependencies = ( +			); +			name = example_apple_metal_ios; +			productName = "imguiex iOS"; +			productReference = 8307E7C420E9F9C900473790 /* example_apple_metal.app */; +			productType = "com.apple.product-type.application"; +		}; +		8307E7D920E9F9C900473790 /* example_apple_metal_macos */ = { +			isa = PBXNativeTarget; +			buildConfigurationList = 8307E7F320E9F9C900473790 /* Build configuration list for PBXNativeTarget "example_apple_metal_macos" */; +			buildPhases = ( +				8307E7D620E9F9C900473790 /* Sources */, +				8307E7D720E9F9C900473790 /* Frameworks */, +				8307E7D820E9F9C900473790 /* Resources */, +			); +			buildRules = ( +			); +			dependencies = ( +			); +			name = example_apple_metal_macos; +			productName = "imguiex macOS"; +			productReference = 8307E7DA20E9F9C900473790 /* example_apple_metal.app */; +			productType = "com.apple.product-type.application"; +		}; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ +		8307E7B620E9F9C700473790 /* Project object */ = { +			isa = PBXProject; +			attributes = { +				LastUpgradeCheck = 1200; +				ORGANIZATIONNAME = "Warren Moore"; +				TargetAttributes = { +					8307E7C320E9F9C900473790 = { +						CreatedOnToolsVersion = 9.4.1; +						ProvisioningStyle = Automatic; +					}; +					8307E7D920E9F9C900473790 = { +						CreatedOnToolsVersion = 9.4.1; +						ProvisioningStyle = Automatic; +					}; +				}; +			}; +			buildConfigurationList = 8307E7B920E9F9C700473790 /* Build configuration list for PBXProject "example_apple_metal" */; +			compatibilityVersion = "Xcode 8.0"; +			developmentRegion = en; +			hasScannedForEncodings = 0; +			knownRegions = ( +				en, +				Base, +			); +			mainGroup = 8307E7B520E9F9C700473790; +			productRefGroup = 8307E7C520E9F9C900473790 /* Products */; +			projectDirPath = ""; +			projectRoot = ""; +			targets = ( +				8307E7C320E9F9C900473790 /* example_apple_metal_ios */, +				8307E7D920E9F9C900473790 /* example_apple_metal_macos */, +			); +		}; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ +		8307E7C220E9F9C900473790 /* Resources */ = { +			isa = PBXResourcesBuildPhase; +			buildActionMask = 2147483647; +			files = ( +				8309BDFC253CDAB30045E2A1 /* LaunchScreen.storyboard in Resources */, +			); +			runOnlyForDeploymentPostprocessing = 0; +		}; +		8307E7D820E9F9C900473790 /* Resources */ = { +			isa = PBXResourcesBuildPhase; +			buildActionMask = 2147483647; +			files = ( +				8309BE04253CDAB60045E2A1 /* MainMenu.storyboard in Resources */, +			); +			runOnlyForDeploymentPostprocessing = 0; +		}; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ +		8307E7C020E9F9C900473790 /* Sources */ = { +			isa = PBXSourcesBuildPhase; +			buildActionMask = 2147483647; +			files = ( +				8309BDBB253CCCAD0045E2A1 /* imgui_impl_metal.mm in Sources */, +				83BBEA0920EB54E700295997 /* imgui.cpp in Sources */, +				83BBEA0720EB54E700295997 /* imgui_demo.cpp in Sources */, +                83BBEA0520EB54E700295997 /* imgui_draw.cpp in Sources */, +				5079822E257677DB0038A28D /* imgui_tables.cpp in Sources */, +                07A82ED82139413D0078D120 /* imgui_widgets.cpp in Sources */, +				8309BDA5253CCC070045E2A1 /* main.mm in Sources */, +			); +			runOnlyForDeploymentPostprocessing = 0; +		}; +		8307E7D620E9F9C900473790 /* Sources */ = { +			isa = PBXSourcesBuildPhase; +			buildActionMask = 2147483647; +			files = ( +				8309BDBE253CCCB60045E2A1 /* imgui_impl_metal.mm in Sources */, +				8309BDBF253CCCB60045E2A1 /* imgui_impl_osx.mm in Sources */, +                83BBEA0A20EB54E700295997 /* imgui.cpp in Sources */, +                83BBEA0820EB54E700295997 /* imgui_demo.cpp in Sources */, +                83BBEA0620EB54E700295997 /* imgui_draw.cpp in Sources */, +                5079822E257677DB0038A28D /* imgui_tables.cpp in Sources */, +				07A82ED92139418F0078D120 /* imgui_widgets.cpp in Sources */, +				8309BDA8253CCC080045E2A1 /* main.mm in Sources */, +			); +			runOnlyForDeploymentPostprocessing = 0; +		}; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ +		8307E7EE20E9F9C900473790 /* Debug */ = { +			isa = XCBuildConfiguration; +			buildSettings = { +				ALWAYS_SEARCH_USER_PATHS = NO; +				CLANG_ANALYZER_NONNULL = YES; +				CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; +				CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; +				CLANG_CXX_LIBRARY = "libc++"; +				CLANG_ENABLE_MODULES = YES; +				CLANG_ENABLE_OBJC_ARC = YES; +				CLANG_ENABLE_OBJC_WEAK = YES; +				CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; +				CLANG_WARN_BOOL_CONVERSION = YES; +				CLANG_WARN_COMMA = YES; +				CLANG_WARN_CONSTANT_CONVERSION = YES; +				CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; +				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; +				CLANG_WARN_DOCUMENTATION_COMMENTS = YES; +				CLANG_WARN_EMPTY_BODY = YES; +				CLANG_WARN_ENUM_CONVERSION = YES; +				CLANG_WARN_INFINITE_RECURSION = YES; +				CLANG_WARN_INT_CONVERSION = YES; +				CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; +				CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; +				CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; +				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; +				CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; +				CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; +				CLANG_WARN_STRICT_PROTOTYPES = YES; +				CLANG_WARN_SUSPICIOUS_MOVE = YES; +				CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; +				CLANG_WARN_UNREACHABLE_CODE = YES; +				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; +				COPY_PHASE_STRIP = NO; +				DEBUG_INFORMATION_FORMAT = dwarf; +				ENABLE_STRICT_OBJC_MSGSEND = YES; +				ENABLE_TESTABILITY = YES; +				GCC_C_LANGUAGE_STANDARD = gnu11; +				GCC_DYNAMIC_NO_PIC = NO; +				GCC_NO_COMMON_BLOCKS = YES; +				GCC_OPTIMIZATION_LEVEL = 0; +				GCC_PREPROCESSOR_DEFINITIONS = ( +					"DEBUG=1", +					"$(inherited)", +				); +				GCC_WARN_64_TO_32_BIT_CONVERSION = YES; +				GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; +				GCC_WARN_UNDECLARED_SELECTOR = YES; +				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; +				GCC_WARN_UNUSED_FUNCTION = YES; +				GCC_WARN_UNUSED_VARIABLE = YES; +				MTL_ENABLE_DEBUG_INFO = YES; +				ONLY_ACTIVE_ARCH = YES; +			}; +			name = Debug; +		}; +		8307E7EF20E9F9C900473790 /* Release */ = { +			isa = XCBuildConfiguration; +			buildSettings = { +				ALWAYS_SEARCH_USER_PATHS = NO; +				CLANG_ANALYZER_NONNULL = YES; +				CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; +				CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; +				CLANG_CXX_LIBRARY = "libc++"; +				CLANG_ENABLE_MODULES = YES; +				CLANG_ENABLE_OBJC_ARC = YES; +				CLANG_ENABLE_OBJC_WEAK = YES; +				CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; +				CLANG_WARN_BOOL_CONVERSION = YES; +				CLANG_WARN_COMMA = YES; +				CLANG_WARN_CONSTANT_CONVERSION = YES; +				CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; +				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; +				CLANG_WARN_DOCUMENTATION_COMMENTS = YES; +				CLANG_WARN_EMPTY_BODY = YES; +				CLANG_WARN_ENUM_CONVERSION = YES; +				CLANG_WARN_INFINITE_RECURSION = YES; +				CLANG_WARN_INT_CONVERSION = YES; +				CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; +				CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; +				CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; +				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; +				CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; +				CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; +				CLANG_WARN_STRICT_PROTOTYPES = YES; +				CLANG_WARN_SUSPICIOUS_MOVE = YES; +				CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; +				CLANG_WARN_UNREACHABLE_CODE = YES; +				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; +				COPY_PHASE_STRIP = NO; +				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; +				ENABLE_NS_ASSERTIONS = NO; +				ENABLE_STRICT_OBJC_MSGSEND = YES; +				GCC_C_LANGUAGE_STANDARD = gnu11; +				GCC_NO_COMMON_BLOCKS = YES; +				GCC_WARN_64_TO_32_BIT_CONVERSION = YES; +				GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; +				GCC_WARN_UNDECLARED_SELECTOR = YES; +				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; +				GCC_WARN_UNUSED_FUNCTION = YES; +				GCC_WARN_UNUSED_VARIABLE = YES; +				MTL_ENABLE_DEBUG_INFO = NO; +			}; +			name = Release; +		}; +		8307E7F120E9F9C900473790 /* Debug */ = { +			isa = XCBuildConfiguration; +			buildSettings = { +				CODE_SIGN_IDENTITY = "iPhone Developer"; +				CODE_SIGN_STYLE = Automatic; +				DEVELOPMENT_TEAM = ""; +				INFOPLIST_FILE = "$(SRCROOT)/iOS/Info-iOS.plist"; +				IPHONEOS_DEPLOYMENT_TARGET = 10.0; +				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; +				PRODUCT_BUNDLE_IDENTIFIER = "org.imgui.example.apple-metal-ios"; +				PRODUCT_NAME = example_apple_metal; +				SDKROOT = iphoneos; +				TARGETED_DEVICE_FAMILY = "1,2"; +				USER_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../**"; +			}; +			name = Debug; +		}; +		8307E7F220E9F9C900473790 /* Release */ = { +			isa = XCBuildConfiguration; +			buildSettings = { +				CODE_SIGN_IDENTITY = "iPhone Developer"; +				CODE_SIGN_STYLE = Automatic; +				DEVELOPMENT_TEAM = ""; +				INFOPLIST_FILE = "$(SRCROOT)/iOS/Info-iOS.plist"; +				IPHONEOS_DEPLOYMENT_TARGET = 10.0; +				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; +				PRODUCT_BUNDLE_IDENTIFIER = "org.imgui.example.apple-metal-ios"; +				PRODUCT_NAME = example_apple_metal; +				SDKROOT = iphoneos; +				TARGETED_DEVICE_FAMILY = "1,2"; +				USER_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../**"; +				VALIDATE_PRODUCT = YES; +			}; +			name = Release; +		}; +		8307E7F420E9F9C900473790 /* Debug */ = { +			isa = XCBuildConfiguration; +			buildSettings = { +				CODE_SIGN_IDENTITY = "-"; +				CODE_SIGN_STYLE = Automatic; +				COMBINE_HIDPI_IMAGES = YES; +				DEVELOPMENT_TEAM = ""; +				INFOPLIST_FILE = "$(SRCROOT)/macOS/Info-macOS.plist"; +				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; +				MACOSX_DEPLOYMENT_TARGET = 10.12; +				PRODUCT_BUNDLE_IDENTIFIER = "org.imgui.example.apple-metal-macos"; +				PRODUCT_NAME = example_apple_metal; +				SDKROOT = macosx; +				USER_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../**"; +			}; +			name = Debug; +		}; +		8307E7F520E9F9C900473790 /* Release */ = { +			isa = XCBuildConfiguration; +			buildSettings = { +				CODE_SIGN_IDENTITY = "-"; +				CODE_SIGN_STYLE = Automatic; +				COMBINE_HIDPI_IMAGES = YES; +				DEVELOPMENT_TEAM = ""; +				INFOPLIST_FILE = "$(SRCROOT)/macOS/Info-macOS.plist"; +				LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; +				MACOSX_DEPLOYMENT_TARGET = 10.12; +				PRODUCT_BUNDLE_IDENTIFIER = "org.imgui.example.apple-metal-macos"; +				PRODUCT_NAME = example_apple_metal; +				SDKROOT = macosx; +				USER_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../**"; +			}; +			name = Release; +		}; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ +		8307E7B920E9F9C700473790 /* Build configuration list for PBXProject "example_apple_metal" */ = { +			isa = XCConfigurationList; +			buildConfigurations = ( +				8307E7EE20E9F9C900473790 /* Debug */, +				8307E7EF20E9F9C900473790 /* Release */, +			); +			defaultConfigurationIsVisible = 0; +			defaultConfigurationName = Release; +		}; +		8307E7F020E9F9C900473790 /* Build configuration list for PBXNativeTarget "example_apple_metal_ios" */ = { +			isa = XCConfigurationList; +			buildConfigurations = ( +				8307E7F120E9F9C900473790 /* Debug */, +				8307E7F220E9F9C900473790 /* Release */, +			); +			defaultConfigurationIsVisible = 0; +			defaultConfigurationName = Release; +		}; +		8307E7F320E9F9C900473790 /* Build configuration list for PBXNativeTarget "example_apple_metal_macos" */ = { +			isa = XCConfigurationList; +			buildConfigurations = ( +				8307E7F420E9F9C900473790 /* Debug */, +				8307E7F520E9F9C900473790 /* Release */, +			); +			defaultConfigurationIsVisible = 0; +			defaultConfigurationName = Release; +		}; +/* End XCConfigurationList section */ +	}; +	rootObject = 8307E7B620E9F9C700473790 /* Project object */; +} diff --git a/lib/imgui-1.90.7/examples/example_apple_metal/iOS/Info-iOS.plist b/lib/imgui-1.90.7/examples/example_apple_metal/iOS/Info-iOS.plist new file mode 100644 index 0000000..93ef078 --- /dev/null +++ b/lib/imgui-1.90.7/examples/example_apple_metal/iOS/Info-iOS.plist @@ -0,0 +1,49 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> +<plist version="1.0"> +<dict> +	<key>CFBundleDevelopmentRegion</key> +	<string>$(DEVELOPMENT_LANGUAGE)</string> +	<key>CFBundleExecutable</key> +	<string>$(EXECUTABLE_NAME)</string> +	<key>CFBundleIdentifier</key> +	<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string> +	<key>CFBundleInfoDictionaryVersion</key> +	<string>6.0</string> +	<key>CFBundleName</key> +	<string>imgui</string> +	<key>CFBundlePackageType</key> +	<string>APPL</string> +	<key>CFBundleShortVersionString</key> +	<string>1.0</string> +	<key>CFBundleVersion</key> +	<string>1</string> +	<key>LSRequiresIPhoneOS</key> +	<true/> +	<key>UILaunchStoryboardName</key> +	<string>LaunchScreen</string> +	<key>UIRequiredDeviceCapabilities</key> +	<array> +		<string>armv7</string> +		<string>metal</string> +	</array> +	<key>UIRequiresFullScreen</key> +	<true/> +	<key>UIStatusBarHidden</key> +	<true/> +	<key>UISupportedInterfaceOrientations</key> +	<array> +		<string>UIInterfaceOrientationPortrait</string> +		<string>UIInterfaceOrientationLandscapeLeft</string> +		<string>UIInterfaceOrientationLandscapeRight</string> +		<string>UIInterfaceOrientationPortraitUpsideDown</string> +	</array> +	<key>UISupportedInterfaceOrientations~ipad</key> +	<array> +		<string>UIInterfaceOrientationPortrait</string> +		<string>UIInterfaceOrientationPortraitUpsideDown</string> +		<string>UIInterfaceOrientationLandscapeLeft</string> +		<string>UIInterfaceOrientationLandscapeRight</string> +	</array> +</dict> +</plist> diff --git a/lib/imgui-1.90.7/examples/example_apple_metal/iOS/LaunchScreen.storyboard b/lib/imgui-1.90.7/examples/example_apple_metal/iOS/LaunchScreen.storyboard new file mode 100644 index 0000000..12c52cf --- /dev/null +++ b/lib/imgui-1.90.7/examples/example_apple_metal/iOS/LaunchScreen.storyboard @@ -0,0 +1,27 @@ +<?xml version="1.0" encoding="UTF-8"?> +<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="17156" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="01J-lp-oVM"> +    <device id="retina6_1" orientation="portrait" appearance="light"/> +    <dependencies> +        <deployment identifier="iOS"/> +        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="17125"/> +        <capability name="Safe area layout guides" minToolsVersion="9.0"/> +        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/> +    </dependencies> +    <scenes> +        <!--View Controller--> +        <scene sceneID="EHf-IW-A2E"> +            <objects> +                <viewController id="01J-lp-oVM" sceneMemberID="viewController"> +                    <view key="view" contentMode="scaleToFill" id="Ze5-6b-2t3"> +                        <rect key="frame" x="0.0" y="0.0" width="414" height="896"/> +                        <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> +                        <viewLayoutGuide key="safeArea" id="Bcu-3y-fUS"/> +                        <color key="backgroundColor" red="0.27843137254901962" green="0.36078431372549019" blue="0.50196078431372548" alpha="1" colorSpace="custom" customColorSpace="displayP3"/> +                    </view> +                </viewController> +                <placeholder placeholderIdentifier="IBFirstResponder" id="iYj-Kq-Ea1" userLabel="First Responder" sceneMemberID="firstResponder"/> +            </objects> +            <point key="canvasLocation" x="53" y="375"/> +        </scene> +    </scenes> +</document> diff --git a/lib/imgui-1.90.7/examples/example_apple_metal/macOS/Info-macOS.plist b/lib/imgui-1.90.7/examples/example_apple_metal/macOS/Info-macOS.plist new file mode 100644 index 0000000..6f4a2b2 --- /dev/null +++ b/lib/imgui-1.90.7/examples/example_apple_metal/macOS/Info-macOS.plist @@ -0,0 +1,30 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> +<plist version="1.0"> +<dict> +	<key>CFBundleDevelopmentRegion</key> +	<string>$(DEVELOPMENT_LANGUAGE)</string> +	<key>CFBundleExecutable</key> +	<string>$(EXECUTABLE_NAME)</string> +	<key>CFBundleIconFile</key> +	<string></string> +	<key>CFBundleIdentifier</key> +	<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string> +	<key>CFBundleInfoDictionaryVersion</key> +	<string>6.0</string> +	<key>CFBundleName</key> +	<string>imgui</string> +	<key>CFBundlePackageType</key> +	<string>APPL</string> +	<key>CFBundleShortVersionString</key> +	<string>1.0</string> +	<key>CFBundleVersion</key> +	<string>1</string> +	<key>LSMinimumSystemVersion</key> +	<string>$(MACOSX_DEPLOYMENT_TARGET)</string> +	<key>NSMainStoryboardFile</key> +	<string>MainMenu</string> +	<key>NSPrincipalClass</key> +	<string>NSApplication</string> +</dict> +</plist> diff --git a/lib/imgui-1.90.7/examples/example_apple_metal/macOS/MainMenu.storyboard b/lib/imgui-1.90.7/examples/example_apple_metal/macOS/MainMenu.storyboard new file mode 100644 index 0000000..38ad432 --- /dev/null +++ b/lib/imgui-1.90.7/examples/example_apple_metal/macOS/MainMenu.storyboard @@ -0,0 +1,93 @@ +<?xml version="1.0" encoding="UTF-8"?> +<document type="com.apple.InterfaceBuilder3.Cocoa.Storyboard.XIB" version="3.0" toolsVersion="17156" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES"> +    <dependencies> +        <deployment identifier="macosx"/> +        <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="17156"/> +    </dependencies> +    <scenes> +        <!--Application--> +        <scene sceneID="JPo-4y-FX3"> +            <objects> +                <application id="hnw-xV-0zn" sceneMemberID="viewController"> +                    <menu key="mainMenu" title="Main Menu" systemMenu="main" id="AYu-sK-qS6"> +                        <items> +                            <menuItem title="ImGui" id="1Xt-HY-uBw"> +                                <modifierMask key="keyEquivalentModifierMask"/> +                                <menu key="submenu" title="ImGui" systemMenu="apple" id="uQy-DD-JDr"> +                                    <items> +                                        <menuItem title="Services" id="NMo-om-nkz"> +                                            <modifierMask key="keyEquivalentModifierMask"/> +                                            <menu key="submenu" title="Services" systemMenu="services" id="hz9-B4-Xy5"/> +                                        </menuItem> +                                        <menuItem isSeparatorItem="YES" id="4je-JR-u6R"/> +                                        <menuItem title="Hide" keyEquivalent="h" id="Olw-nP-bQN"> +                                            <connections> +                                                <action selector="hide:" target="Ady-hI-5gd" id="PnN-Uc-m68"/> +                                            </connections> +                                        </menuItem> +                                        <menuItem title="Hide Others" keyEquivalent="h" id="Vdr-fp-XzO"> +                                            <modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/> +                                            <connections> +                                                <action selector="hideOtherApplications:" target="Ady-hI-5gd" id="VT4-aY-XCT"/> +                                            </connections> +                                        </menuItem> +                                        <menuItem title="Show All" id="Kd2-mp-pUS"> +                                            <modifierMask key="keyEquivalentModifierMask"/> +                                            <connections> +                                                <action selector="unhideAllApplications:" target="Ady-hI-5gd" id="Dhg-Le-xox"/> +                                            </connections> +                                        </menuItem> +                                        <menuItem isSeparatorItem="YES" id="kCx-OE-vgT"/> +                                        <menuItem title="Quit" keyEquivalent="q" id="4sb-4s-VLi"> +                                            <connections> +                                                <action selector="terminate:" target="Ady-hI-5gd" id="Te7-pn-YzF"/> +                                            </connections> +                                        </menuItem> +                                    </items> +                                </menu> +                            </menuItem> +                            <menuItem title="View" id="H8h-7b-M4v"> +                                <modifierMask key="keyEquivalentModifierMask"/> +                                <menu key="submenu" title="View" id="HyV-fh-RgO"> +                                    <items> +                                        <menuItem title="Enter Full Screen" keyEquivalent="f" id="4J7-dP-txa"> +                                            <modifierMask key="keyEquivalentModifierMask" control="YES" command="YES"/> +                                            <connections> +                                                <action selector="toggleFullScreen:" target="Ady-hI-5gd" id="dU3-MA-1Rq"/> +                                            </connections> +                                        </menuItem> +                                    </items> +                                </menu> +                            </menuItem> +                            <menuItem title="Window" id="aUF-d1-5bR"> +                                <modifierMask key="keyEquivalentModifierMask"/> +                                <menu key="submenu" title="Window" systemMenu="window" id="Td7-aD-5lo"> +                                    <items> +                                        <menuItem title="Minimize" keyEquivalent="m" id="OY7-WF-poV"> +                                            <connections> +                                                <action selector="performMiniaturize:" target="Ady-hI-5gd" id="VwT-WD-YPe"/> +                                            </connections> +                                        </menuItem> +                                        <menuItem title="Zoom" id="R4o-n2-Eq4"> +                                            <modifierMask key="keyEquivalentModifierMask"/> +                                            <connections> +                                                <action selector="performZoom:" target="Ady-hI-5gd" id="DIl-cC-cCs"/> +                                            </connections> +                                        </menuItem> +                                    </items> +                                </menu> +                            </menuItem> +                        </items> +                    </menu> +                    <connections> +                        <outlet property="delegate" destination="Voe-Tx-rLC" id="PrD-fu-P6m"/> +                    </connections> +                </application> +                <customObject id="Voe-Tx-rLC" customClass="AppDelegate"/> +                <customObject id="YLy-65-1bz" customClass="NSFontManager"/> +                <customObject id="Ady-hI-5gd" userLabel="First Responder" customClass="NSResponder" sceneMemberID="firstResponder"/> +            </objects> +            <point key="canvasLocation" x="-362" y="-38"/> +        </scene> +    </scenes> +</document> diff --git a/lib/imgui-1.90.7/examples/example_apple_metal/main.mm b/lib/imgui-1.90.7/examples/example_apple_metal/main.mm new file mode 100644 index 0000000..109ef61 --- /dev/null +++ b/lib/imgui-1.90.7/examples/example_apple_metal/main.mm @@ -0,0 +1,337 @@ +// Dear ImGui: standalone example application for OSX + Metal. + +// 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 + +#import <Foundation/Foundation.h> + +#if TARGET_OS_OSX +#import <Cocoa/Cocoa.h> +#else +#import <UIKit/UIKit.h> +#endif + +#import <Metal/Metal.h> +#import <MetalKit/MetalKit.h> + +#include "imgui.h" +#include "imgui_impl_metal.h" +#if TARGET_OS_OSX +#include "imgui_impl_osx.h" +@interface AppViewController : NSViewController<NSWindowDelegate> +@end +#else +@interface AppViewController : UIViewController +@end +#endif + +@interface AppViewController () <MTKViewDelegate> +@property (nonatomic, readonly) MTKView *mtkView; +@property (nonatomic, strong) id <MTLDevice> device; +@property (nonatomic, strong) id <MTLCommandQueue> commandQueue; +@end + +//----------------------------------------------------------------------------------- +// AppViewController +//----------------------------------------------------------------------------------- + +@implementation AppViewController + +-(instancetype)initWithNibName:(nullable NSString *)nibNameOrNil bundle:(nullable NSBundle *)nibBundleOrNil +{ +    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; + +    _device = MTLCreateSystemDefaultDevice(); +    _commandQueue = [_device newCommandQueue]; + +    if (!self.device) +    { +        NSLog(@"Metal is not supported"); +        abort(); +    } + +    // Setup Dear ImGui context +    // FIXME: This example doesn't have proper cleanup... +    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 Renderer backend +    ImGui_ImplMetal_Init(_device); + +    // 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); + +    return self; +} + +-(MTKView *)mtkView +{ +    return (MTKView *)self.view; +} + +-(void)loadView +{ +    self.view = [[MTKView alloc] initWithFrame:CGRectMake(0, 0, 1200, 720)]; +} + +-(void)viewDidLoad +{ +    [super viewDidLoad]; + +    self.mtkView.device = self.device; +    self.mtkView.delegate = self; + +#if TARGET_OS_OSX +    ImGui_ImplOSX_Init(self.view); +    [NSApp activateIgnoringOtherApps:YES]; +#endif +} + +-(void)drawInMTKView:(MTKView*)view +{ +    ImGuiIO& io = ImGui::GetIO(); +    io.DisplaySize.x = view.bounds.size.width; +    io.DisplaySize.y = view.bounds.size.height; + +#if TARGET_OS_OSX +    CGFloat framebufferScale = view.window.screen.backingScaleFactor ?: NSScreen.mainScreen.backingScaleFactor; +#else +    CGFloat framebufferScale = view.window.screen.scale ?: UIScreen.mainScreen.scale; +#endif +    io.DisplayFramebufferScale = ImVec2(framebufferScale, framebufferScale); + +    id<MTLCommandBuffer> commandBuffer = [self.commandQueue commandBuffer]; + +    MTLRenderPassDescriptor* renderPassDescriptor = view.currentRenderPassDescriptor; +    if (renderPassDescriptor == nil) +    { +        [commandBuffer commit]; +		return; +    } + +    // Start the Dear ImGui frame +    ImGui_ImplMetal_NewFrame(renderPassDescriptor); +#if TARGET_OS_OSX +    ImGui_ImplOSX_NewFrame(view); +#endif +    ImGui::NewFrame(); + +    // Our state (make them static = more or less global) as a convenience to keep the example terse. +    static bool show_demo_window = true; +    static bool show_another_window = false; +    static ImVec4 clear_color = ImVec4(0.45f, 0.55f, 0.60f, 1.00f); + +    // 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); + +    // 2. Show a simple window that we create ourselves. We use a Begin/End pair to create a named window. +    { +        static float f = 0.0f; +        static int counter = 0; + +        ImGui::Begin("Hello, world!");                          // Create a window called "Hello, world!" and append into it. + +        ImGui::Text("This is some useful text.");               // Display some text (you can use a format strings too) +        ImGui::Checkbox("Demo Window", &show_demo_window);      // Edit bools storing our window open/close state +        ImGui::Checkbox("Another Window", &show_another_window); + +        ImGui::SliderFloat("float", &f, 0.0f, 1.0f);            // Edit 1 float using a slider from 0.0f to 1.0f +        ImGui::ColorEdit3("clear color", (float*)&clear_color); // Edit 3 floats representing a color + +        if (ImGui::Button("Button"))                            // Buttons return true when clicked (most widgets return true when edited/activated) +            counter++; +        ImGui::SameLine(); +        ImGui::Text("counter = %d", counter); + +        ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / io.Framerate, io.Framerate); +        ImGui::End(); +    } + +    // 3. Show another simple window. +    if (show_another_window) +    { +        ImGui::Begin("Another Window", &show_another_window);   // Pass a pointer to our bool variable (the window will have a closing button that will clear the bool when clicked) +        ImGui::Text("Hello from another window!"); +        if (ImGui::Button("Close Me")) +            show_another_window = false; +        ImGui::End(); +    } + +    // Rendering +    ImGui::Render(); +    ImDrawData* draw_data = ImGui::GetDrawData(); + +    renderPassDescriptor.colorAttachments[0].clearColor = MTLClearColorMake(clear_color.x * clear_color.w, clear_color.y * clear_color.w, clear_color.z * clear_color.w, clear_color.w); +    id <MTLRenderCommandEncoder> renderEncoder = [commandBuffer renderCommandEncoderWithDescriptor:renderPassDescriptor]; +    [renderEncoder pushDebugGroup:@"Dear ImGui rendering"]; +    ImGui_ImplMetal_RenderDrawData(draw_data, commandBuffer, renderEncoder); +    [renderEncoder popDebugGroup]; +    [renderEncoder endEncoding]; + +	// Present +    [commandBuffer presentDrawable:view.currentDrawable]; +    [commandBuffer commit]; +} + +-(void)mtkView:(MTKView*)view drawableSizeWillChange:(CGSize)size +{ +} + +//----------------------------------------------------------------------------------- +// Input processing +//----------------------------------------------------------------------------------- + +#if TARGET_OS_OSX + +- (void)viewWillAppear +{ +    [super viewWillAppear]; +    self.view.window.delegate = self; +} + +- (void)windowWillClose:(NSNotification *)notification +{ +    ImGui_ImplMetal_Shutdown(); +    ImGui_ImplOSX_Shutdown(); +    ImGui::DestroyContext(); +} + +#else + +// This touch mapping is super cheesy/hacky. We treat any touch on the screen +// as if it were a depressed left mouse button, and we don't bother handling +// multitouch correctly at all. This causes the "cursor" to behave very erratically +// when there are multiple active touches. But for demo purposes, single-touch +// interaction actually works surprisingly well. +-(void)updateIOWithTouchEvent:(UIEvent *)event +{ +    UITouch *anyTouch = event.allTouches.anyObject; +    CGPoint touchLocation = [anyTouch locationInView:self.view]; +    ImGuiIO &io = ImGui::GetIO(); +    io.AddMouseSourceEvent(ImGuiMouseSource_TouchScreen); +    io.AddMousePosEvent(touchLocation.x, touchLocation.y); + +    BOOL hasActiveTouch = NO; +    for (UITouch *touch in event.allTouches) +    { +        if (touch.phase != UITouchPhaseEnded && touch.phase != UITouchPhaseCancelled) +        { +            hasActiveTouch = YES; +            break; +        } +    } +    io.AddMouseButtonEvent(0, hasActiveTouch); +} + +-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event      { [self updateIOWithTouchEvent:event]; } +-(void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event      { [self updateIOWithTouchEvent:event]; } +-(void)touchesCancelled:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event  { [self updateIOWithTouchEvent:event]; } +-(void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event      { [self updateIOWithTouchEvent:event]; } + +#endif + +@end + +//----------------------------------------------------------------------------------- +// AppDelegate +//----------------------------------------------------------------------------------- + +#if TARGET_OS_OSX + +@interface AppDelegate : NSObject <NSApplicationDelegate> +@property (nonatomic, strong) NSWindow *window; +@end + +@implementation AppDelegate + +-(BOOL)applicationShouldTerminateAfterLastWindowClosed:(NSApplication *)sender +{ +    return YES; +} + +-(instancetype)init +{ +    if (self = [super init]) +    { +        NSViewController *rootViewController = [[AppViewController alloc] initWithNibName:nil bundle:nil]; +        self.window = [[NSWindow alloc] initWithContentRect:NSZeroRect +                                                  styleMask:NSWindowStyleMaskTitled | NSWindowStyleMaskClosable | NSWindowStyleMaskResizable | NSWindowStyleMaskMiniaturizable +                                                    backing:NSBackingStoreBuffered +                                                      defer:NO]; +        self.window.contentViewController = rootViewController; +        [self.window center]; +        [self.window makeKeyAndOrderFront:self]; +    } +    return self; +} + +@end + +#else + +@interface AppDelegate : UIResponder <UIApplicationDelegate> +@property (strong, nonatomic) UIWindow *window; +@end + +@implementation AppDelegate + +-(BOOL)application:(UIApplication *)application +    didFinishLaunchingWithOptions:(NSDictionary<UIApplicationLaunchOptionsKey,id> *)launchOptions +{ +    UIViewController *rootViewController = [[AppViewController alloc] init]; +    self.window = [[UIWindow alloc] initWithFrame:UIScreen.mainScreen.bounds]; +    self.window.rootViewController = rootViewController; +    [self.window makeKeyAndVisible]; +    return YES; +} + +@end + +#endif + +//----------------------------------------------------------------------------------- +// Application main() function +//----------------------------------------------------------------------------------- + +#if TARGET_OS_OSX + +int main(int argc, const char * argv[]) +{ +    return NSApplicationMain(argc, argv); +} + +#else + +int main(int argc, char * argv[]) +{ +    @autoreleasepool +    { +        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); +    } +} + +#endif diff --git a/lib/imgui-1.90.7/examples/example_apple_opengl2/example_apple_opengl2.xcodeproj/project.pbxproj b/lib/imgui-1.90.7/examples/example_apple_opengl2/example_apple_opengl2.xcodeproj/project.pbxproj new file mode 100644 index 0000000..a168373 --- /dev/null +++ b/lib/imgui-1.90.7/examples/example_apple_opengl2/example_apple_opengl2.xcodeproj/project.pbxproj @@ -0,0 +1,332 @@ +// !$*UTF8*$! +{ +	archiveVersion = 1; +	classes = { +	}; +	objectVersion = 48; +	objects = { + +/* Begin PBXBuildFile section */ +		05E31B59274EF0700083FCB6 /* GameController.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 05E31B57274EF0360083FCB6 /* GameController.framework */; }; +		07A82EDB213941D00078D120 /* imgui_widgets.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 07A82EDA213941D00078D120 /* imgui_widgets.cpp */; }; +		4080A99820B02D340036BA46 /* main.mm in Sources */ = {isa = PBXBuildFile; fileRef = 4080A98A20B02CD90036BA46 /* main.mm */; }; +		4080A9A220B034280036BA46 /* imgui_impl_opengl2.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4080A99E20B034280036BA46 /* imgui_impl_opengl2.cpp */; }; +		4080A9AD20B0343C0036BA46 /* imgui_demo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4080A9A620B0343C0036BA46 /* imgui_demo.cpp */; }; +		4080A9AE20B0343C0036BA46 /* imgui.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4080A9A720B0343C0036BA46 /* imgui.cpp */; }; +		4080A9AF20B0343C0036BA46 /* imgui_draw.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4080A9AA20B0343C0036BA46 /* imgui_draw.cpp */; }; +		4080A9B020B0347A0036BA46 /* imgui_impl_osx.mm in Sources */ = {isa = PBXBuildFile; fileRef = 4080A99F20B034280036BA46 /* imgui_impl_osx.mm */; }; +		4080A9B320B034E40036BA46 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4080A9B220B034E40036BA46 /* Cocoa.framework */; }; +		4080A9B520B034EA0036BA46 /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4080A9B420B034EA0036BA46 /* OpenGL.framework */; }; +		50798230257677FD0038A28D /* imgui_tables.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5079822F257677FC0038A28D /* imgui_tables.cpp */; }; +/* End PBXBuildFile section */ + +/* Begin PBXCopyFilesBuildPhase section */ +		4080A96920B029B00036BA46 /* CopyFiles */ = { +			isa = PBXCopyFilesBuildPhase; +			buildActionMask = 2147483647; +			dstPath = /usr/share/man/man1/; +			dstSubfolderSpec = 0; +			files = ( +			); +			runOnlyForDeploymentPostprocessing = 1; +		}; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ +		05E31B57274EF0360083FCB6 /* GameController.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = GameController.framework; path = System/Library/Frameworks/GameController.framework; sourceTree = SDKROOT; }; +		07A82EDA213941D00078D120 /* imgui_widgets.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = imgui_widgets.cpp; path = ../../imgui_widgets.cpp; sourceTree = "<group>"; }; +		4080A96B20B029B00036BA46 /* example_osx_opengl2 */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = example_osx_opengl2; sourceTree = BUILT_PRODUCTS_DIR; }; +		4080A98A20B02CD90036BA46 /* main.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = main.mm; sourceTree = SOURCE_ROOT; }; +		4080A99E20B034280036BA46 /* imgui_impl_opengl2.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = imgui_impl_opengl2.cpp; path = ../../backends/imgui_impl_opengl2.cpp; sourceTree = "<group>"; }; +		4080A99F20B034280036BA46 /* imgui_impl_osx.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = imgui_impl_osx.mm; path = ../../backends/imgui_impl_osx.mm; sourceTree = "<group>"; }; +		4080A9A020B034280036BA46 /* imgui_impl_opengl2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = imgui_impl_opengl2.h; path = ../../backends/imgui_impl_opengl2.h; sourceTree = "<group>"; }; +		4080A9A120B034280036BA46 /* imgui_impl_osx.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = imgui_impl_osx.h; path = ../../backends/imgui_impl_osx.h; sourceTree = "<group>"; }; +		4080A9A520B0343C0036BA46 /* imgui_internal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = imgui_internal.h; path = ../../imgui_internal.h; sourceTree = "<group>"; }; +		4080A9A620B0343C0036BA46 /* imgui_demo.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = imgui_demo.cpp; path = ../../imgui_demo.cpp; sourceTree = "<group>"; }; +		4080A9A720B0343C0036BA46 /* imgui.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = imgui.cpp; path = ../../imgui.cpp; sourceTree = "<group>"; }; +		4080A9A820B0343C0036BA46 /* imgui.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = imgui.h; path = ../../imgui.h; sourceTree = "<group>"; }; +		4080A9AA20B0343C0036BA46 /* imgui_draw.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = imgui_draw.cpp; path = ../../imgui_draw.cpp; sourceTree = "<group>"; }; +		4080A9AC20B0343C0036BA46 /* imconfig.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = imconfig.h; path = ../../imconfig.h; sourceTree = "<group>"; }; +		4080A9B220B034E40036BA46 /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; }; +		4080A9B420B034EA0036BA46 /* OpenGL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGL.framework; path = System/Library/Frameworks/OpenGL.framework; sourceTree = SDKROOT; }; +		5079822F257677FC0038A28D /* imgui_tables.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = imgui_tables.cpp; path = ../../imgui_tables.cpp; sourceTree = "<group>"; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ +		4080A96820B029B00036BA46 /* Frameworks */ = { +			isa = PBXFrameworksBuildPhase; +			buildActionMask = 2147483647; +			files = ( +				4080A9B520B034EA0036BA46 /* OpenGL.framework in Frameworks */, +				4080A9B320B034E40036BA46 /* Cocoa.framework in Frameworks */, +				05E31B59274EF0700083FCB6 /* GameController.framework in Frameworks */, +			); +			runOnlyForDeploymentPostprocessing = 0; +		}; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ +		4080A96220B029B00036BA46 = { +			isa = PBXGroup; +			children = ( +				5079822F257677FC0038A28D /* imgui_tables.cpp */, +				4080A9AC20B0343C0036BA46 /* imconfig.h */, +				4080A9A720B0343C0036BA46 /* imgui.cpp */, +				4080A9A820B0343C0036BA46 /* imgui.h */, +				07A82EDA213941D00078D120 /* imgui_widgets.cpp */, +				4080A9A620B0343C0036BA46 /* imgui_demo.cpp */, +				4080A9AA20B0343C0036BA46 /* imgui_draw.cpp */, +				4080A9A520B0343C0036BA46 /* imgui_internal.h */, +				4080A99E20B034280036BA46 /* imgui_impl_opengl2.cpp */, +				4080A9A020B034280036BA46 /* imgui_impl_opengl2.h */, +				4080A9A120B034280036BA46 /* imgui_impl_osx.h */, +				4080A99F20B034280036BA46 /* imgui_impl_osx.mm */, +				4080A98A20B02CD90036BA46 /* main.mm */, +				4080A96C20B029B00036BA46 /* Products */, +				4080A9B120B034E40036BA46 /* Frameworks */, +			); +			sourceTree = "<group>"; +		}; +		4080A96C20B029B00036BA46 /* Products */ = { +			isa = PBXGroup; +			children = ( +				4080A96B20B029B00036BA46 /* example_osx_opengl2 */, +			); +			name = Products; +			sourceTree = "<group>"; +		}; +		4080A9B120B034E40036BA46 /* Frameworks */ = { +			isa = PBXGroup; +			children = ( +				05E31B57274EF0360083FCB6 /* GameController.framework */, +				4080A9B420B034EA0036BA46 /* OpenGL.framework */, +				4080A9B220B034E40036BA46 /* Cocoa.framework */, +			); +			name = Frameworks; +			sourceTree = "<group>"; +		}; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ +		4080A96A20B029B00036BA46 /* example_osx_opengl2 */ = { +			isa = PBXNativeTarget; +			buildConfigurationList = 4080A97220B029B00036BA46 /* Build configuration list for PBXNativeTarget "example_osx_opengl2" */; +			buildPhases = ( +				4080A96720B029B00036BA46 /* Sources */, +				4080A96820B029B00036BA46 /* Frameworks */, +				4080A96920B029B00036BA46 /* CopyFiles */, +			); +			buildRules = ( +			); +			dependencies = ( +			); +			name = example_osx_opengl2; +			productName = example_osx_opengl2; +			productReference = 4080A96B20B029B00036BA46 /* example_osx_opengl2 */; +			productType = "com.apple.product-type.tool"; +		}; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ +		4080A96320B029B00036BA46 /* Project object */ = { +			isa = PBXProject; +			attributes = { +				LastUpgradeCheck = 0930; +				ORGANIZATIONNAME = ImGui; +				TargetAttributes = { +					4080A96A20B029B00036BA46 = { +						CreatedOnToolsVersion = 9.3.1; +						ProvisioningStyle = Automatic; +					}; +				}; +			}; +			buildConfigurationList = 4080A96620B029B00036BA46 /* Build configuration list for PBXProject "example_apple_opengl2" */; +			compatibilityVersion = "Xcode 8.0"; +			developmentRegion = en; +			hasScannedForEncodings = 0; +			knownRegions = ( +				en, +			); +			mainGroup = 4080A96220B029B00036BA46; +			productRefGroup = 4080A96C20B029B00036BA46 /* Products */; +			projectDirPath = ""; +			projectRoot = ""; +			targets = ( +				4080A96A20B029B00036BA46 /* example_osx_opengl2 */, +			); +		}; +/* End PBXProject section */ + +/* Begin PBXSourcesBuildPhase section */ +		4080A96720B029B00036BA46 /* Sources */ = { +			isa = PBXSourcesBuildPhase; +			buildActionMask = 2147483647; +			files = ( +				4080A99820B02D340036BA46 /* main.mm in Sources */, +				4080A9AD20B0343C0036BA46 /* imgui_demo.cpp in Sources */, +				4080A9AF20B0343C0036BA46 /* imgui_draw.cpp in Sources */, +				4080A9A220B034280036BA46 /* imgui_impl_opengl2.cpp in Sources */, +				4080A9B020B0347A0036BA46 /* imgui_impl_osx.mm in Sources */, +				4080A9AE20B0343C0036BA46 /* imgui.cpp in Sources */, +				50798230257677FD0038A28D /* imgui_tables.cpp in Sources */, +				07A82EDB213941D00078D120 /* imgui_widgets.cpp in Sources */, +			); +			runOnlyForDeploymentPostprocessing = 0; +		}; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ +		4080A97020B029B00036BA46 /* Debug */ = { +			isa = XCBuildConfiguration; +			buildSettings = { +				ALWAYS_SEARCH_USER_PATHS = NO; +				CLANG_ANALYZER_NONNULL = YES; +				CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; +				CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; +				CLANG_CXX_LIBRARY = "libc++"; +				CLANG_ENABLE_MODULES = YES; +				CLANG_ENABLE_OBJC_ARC = YES; +				CLANG_ENABLE_OBJC_WEAK = YES; +				CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; +				CLANG_WARN_BOOL_CONVERSION = YES; +				CLANG_WARN_COMMA = YES; +				CLANG_WARN_CONSTANT_CONVERSION = YES; +				CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; +				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; +				CLANG_WARN_DOCUMENTATION_COMMENTS = YES; +				CLANG_WARN_EMPTY_BODY = YES; +				CLANG_WARN_ENUM_CONVERSION = YES; +				CLANG_WARN_INFINITE_RECURSION = YES; +				CLANG_WARN_INT_CONVERSION = YES; +				CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; +				CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; +				CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; +				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; +				CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; +				CLANG_WARN_STRICT_PROTOTYPES = YES; +				CLANG_WARN_SUSPICIOUS_MOVE = YES; +				CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; +				CLANG_WARN_UNREACHABLE_CODE = YES; +				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; +				CODE_SIGN_IDENTITY = "-"; +				COPY_PHASE_STRIP = NO; +				DEBUG_INFORMATION_FORMAT = dwarf; +				ENABLE_STRICT_OBJC_MSGSEND = YES; +				ENABLE_TESTABILITY = YES; +				GCC_C_LANGUAGE_STANDARD = gnu11; +				GCC_DYNAMIC_NO_PIC = NO; +				GCC_NO_COMMON_BLOCKS = YES; +				GCC_OPTIMIZATION_LEVEL = 0; +				GCC_PREPROCESSOR_DEFINITIONS = ( +					"DEBUG=1", +					"$(inherited)", +				); +				GCC_WARN_64_TO_32_BIT_CONVERSION = YES; +				GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; +				GCC_WARN_UNDECLARED_SELECTOR = YES; +				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; +				GCC_WARN_UNUSED_FUNCTION = YES; +				GCC_WARN_UNUSED_VARIABLE = YES; +				MACOSX_DEPLOYMENT_TARGET = 10.13; +				MTL_ENABLE_DEBUG_INFO = YES; +				ONLY_ACTIVE_ARCH = YES; +				SDKROOT = macosx; +			}; +			name = Debug; +		}; +		4080A97120B029B00036BA46 /* Release */ = { +			isa = XCBuildConfiguration; +			buildSettings = { +				ALWAYS_SEARCH_USER_PATHS = NO; +				CLANG_ANALYZER_NONNULL = YES; +				CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; +				CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; +				CLANG_CXX_LIBRARY = "libc++"; +				CLANG_ENABLE_MODULES = YES; +				CLANG_ENABLE_OBJC_ARC = YES; +				CLANG_ENABLE_OBJC_WEAK = YES; +				CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; +				CLANG_WARN_BOOL_CONVERSION = YES; +				CLANG_WARN_COMMA = YES; +				CLANG_WARN_CONSTANT_CONVERSION = YES; +				CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; +				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; +				CLANG_WARN_DOCUMENTATION_COMMENTS = YES; +				CLANG_WARN_EMPTY_BODY = YES; +				CLANG_WARN_ENUM_CONVERSION = YES; +				CLANG_WARN_INFINITE_RECURSION = YES; +				CLANG_WARN_INT_CONVERSION = YES; +				CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; +				CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; +				CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; +				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; +				CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; +				CLANG_WARN_STRICT_PROTOTYPES = YES; +				CLANG_WARN_SUSPICIOUS_MOVE = YES; +				CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; +				CLANG_WARN_UNREACHABLE_CODE = YES; +				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; +				CODE_SIGN_IDENTITY = "-"; +				COPY_PHASE_STRIP = NO; +				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; +				ENABLE_NS_ASSERTIONS = NO; +				ENABLE_STRICT_OBJC_MSGSEND = YES; +				GCC_C_LANGUAGE_STANDARD = gnu11; +				GCC_NO_COMMON_BLOCKS = YES; +				GCC_WARN_64_TO_32_BIT_CONVERSION = YES; +				GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; +				GCC_WARN_UNDECLARED_SELECTOR = YES; +				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; +				GCC_WARN_UNUSED_FUNCTION = YES; +				GCC_WARN_UNUSED_VARIABLE = YES; +				MACOSX_DEPLOYMENT_TARGET = 10.13; +				MTL_ENABLE_DEBUG_INFO = NO; +				SDKROOT = macosx; +			}; +			name = Release; +		}; +		4080A97320B029B00036BA46 /* Debug */ = { +			isa = XCBuildConfiguration; +			buildSettings = { +				CODE_SIGN_STYLE = Automatic; +				MACOSX_DEPLOYMENT_TARGET = 10.12; +				PRODUCT_NAME = "$(TARGET_NAME)"; +				USER_HEADER_SEARCH_PATHS = ../..; +			}; +			name = Debug; +		}; +		4080A97420B029B00036BA46 /* Release */ = { +			isa = XCBuildConfiguration; +			buildSettings = { +				CODE_SIGN_STYLE = Automatic; +				MACOSX_DEPLOYMENT_TARGET = 10.12; +				PRODUCT_NAME = "$(TARGET_NAME)"; +				USER_HEADER_SEARCH_PATHS = ../..; +			}; +			name = Release; +		}; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ +		4080A96620B029B00036BA46 /* Build configuration list for PBXProject "example_apple_opengl2" */ = { +			isa = XCConfigurationList; +			buildConfigurations = ( +				4080A97020B029B00036BA46 /* Debug */, +				4080A97120B029B00036BA46 /* Release */, +			); +			defaultConfigurationIsVisible = 0; +			defaultConfigurationName = Release; +		}; +		4080A97220B029B00036BA46 /* Build configuration list for PBXNativeTarget "example_osx_opengl2" */ = { +			isa = XCConfigurationList; +			buildConfigurations = ( +				4080A97320B029B00036BA46 /* Debug */, +				4080A97420B029B00036BA46 /* Release */, +			); +			defaultConfigurationIsVisible = 0; +			defaultConfigurationName = Release; +		}; +/* End XCConfigurationList section */ +	}; +	rootObject = 4080A96320B029B00036BA46 /* Project object */; +} diff --git a/lib/imgui-1.90.7/examples/example_apple_opengl2/main.mm b/lib/imgui-1.90.7/examples/example_apple_opengl2/main.mm new file mode 100644 index 0000000..815c0f7 --- /dev/null +++ b/lib/imgui-1.90.7/examples/example_apple_opengl2/main.mm @@ -0,0 +1,256 @@ +// Dear ImGui: standalone example application for OSX + OpenGL2, using legacy fixed pipeline + +// 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 + +#import <Cocoa/Cocoa.h> +#import <OpenGL/gl.h> +#import <OpenGL/glu.h> + +#include "imgui.h" +#include "imgui_impl_opengl2.h" +#include "imgui_impl_osx.h" + +//----------------------------------------------------------------------------------- +// AppView +//----------------------------------------------------------------------------------- + +@interface AppView : NSOpenGLView +{ +    NSTimer*    animationTimer; +} +@end + +@implementation AppView + +-(void)prepareOpenGL +{ +    [super prepareOpenGL]; + +#ifndef DEBUG +    GLint swapInterval = 1; +    [[self openGLContext] setValues:&swapInterval forParameter:NSOpenGLCPSwapInterval]; +    if (swapInterval == 0) +        NSLog(@"Error: Cannot set swap interval."); +#endif +} + +-(void)initialize +{ +    // Setup Dear ImGui context +    // FIXME: This example doesn't have proper cleanup... +    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_ImplOSX_Init(self); +    ImGui_ImplOpenGL2_Init(); + +    // 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); +} + +-(void)updateAndDrawDemoView +{ +    // Start the Dear ImGui frame +    ImGuiIO& io = ImGui::GetIO(); +    ImGui_ImplOpenGL2_NewFrame(); +    ImGui_ImplOSX_NewFrame(self); +    ImGui::NewFrame(); + +    // Our state (make them static = more or less global) as a convenience to keep the example terse. +    static bool show_demo_window = true; +    static bool show_another_window = false; +    static ImVec4 clear_color = ImVec4(0.45f, 0.55f, 0.60f, 1.00f); + +    // 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); + +    // 2. Show a simple window that we create ourselves. We use a Begin/End pair to create a named window. +    { +        static float f = 0.0f; +        static int counter = 0; + +        ImGui::Begin("Hello, world!");                          // Create a window called "Hello, world!" and append into it. + +        ImGui::Text("This is some useful text.");               // Display some text (you can use a format strings too) +        ImGui::Checkbox("Demo Window", &show_demo_window);      // Edit bools storing our window open/close state +        ImGui::Checkbox("Another Window", &show_another_window); + +        ImGui::SliderFloat("float", &f, 0.0f, 1.0f);            // Edit 1 float using a slider from 0.0f to 1.0f +        ImGui::ColorEdit3("clear color", (float*)&clear_color); // Edit 3 floats representing a color + +        if (ImGui::Button("Button"))                            // Buttons return true when clicked (most widgets return true when edited/activated) +            counter++; +        ImGui::SameLine(); +        ImGui::Text("counter = %d", counter); + +        ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / io.Framerate, io.Framerate); +        ImGui::End(); +    } + +    // 3. Show another simple window. +    if (show_another_window) +    { +        ImGui::Begin("Another Window", &show_another_window);   // Pass a pointer to our bool variable (the window will have a closing button that will clear the bool when clicked) +        ImGui::Text("Hello from another window!"); +        if (ImGui::Button("Close Me")) +            show_another_window = false; +        ImGui::End(); +    } + +    // Rendering +    ImGui::Render(); +    ImDrawData* draw_data = ImGui::GetDrawData(); + +    [[self openGLContext] makeCurrentContext]; +    GLsizei width  = (GLsizei)(draw_data->DisplaySize.x * draw_data->FramebufferScale.x); +    GLsizei height = (GLsizei)(draw_data->DisplaySize.y * draw_data->FramebufferScale.y); +    glViewport(0, 0, width, height); +    glClearColor(clear_color.x * clear_color.w, clear_color.y * clear_color.w, clear_color.z * clear_color.w, clear_color.w); +    glClear(GL_COLOR_BUFFER_BIT); + +    ImGui_ImplOpenGL2_RenderDrawData(draw_data); + +    // Present +    [[self openGLContext] flushBuffer]; + +    if (!animationTimer) +        animationTimer = [NSTimer scheduledTimerWithTimeInterval:0.017 target:self selector:@selector(animationTimerFired:) userInfo:nil repeats:YES]; +} + +-(void)reshape                              { [super reshape]; [[self openGLContext] update]; [self updateAndDrawDemoView]; } +-(void)drawRect:(NSRect)bounds              { [self updateAndDrawDemoView]; } +-(void)animationTimerFired:(NSTimer*)timer  { [self setNeedsDisplay:YES]; } +-(void)dealloc                              { animationTimer = nil; } + +@end + +//----------------------------------------------------------------------------------- +// AppDelegate +//----------------------------------------------------------------------------------- + +@interface AppDelegate : NSObject <NSApplicationDelegate> +@property (nonatomic, readonly) NSWindow* window; +@end + +@implementation AppDelegate +@synthesize window = _window; + +-(BOOL)applicationShouldTerminateAfterLastWindowClosed:(NSApplication *)theApplication +{ +    return YES; +} + +-(NSWindow*)window +{ +    if (_window != nil) +        return (_window); + +    NSRect viewRect = NSMakeRect(100.0, 100.0, 100.0 + 1280.0, 100 + 720.0); + +    _window = [[NSWindow alloc] initWithContentRect:viewRect styleMask:NSWindowStyleMaskTitled|NSWindowStyleMaskMiniaturizable|NSWindowStyleMaskResizable|NSWindowStyleMaskClosable backing:NSBackingStoreBuffered defer:YES]; +    [_window setTitle:@"Dear ImGui OSX+OpenGL2 Example"]; +    [_window setAcceptsMouseMovedEvents:YES]; +    [_window setOpaque:YES]; +    [_window makeKeyAndOrderFront:NSApp]; + +    return (_window); +} + +-(void)setupMenu +{ +    NSMenu* mainMenuBar = [[NSMenu alloc] init]; +    NSMenu* appMenu; +    NSMenuItem* menuItem; + +    appMenu = [[NSMenu alloc] initWithTitle:@"Dear ImGui OSX+OpenGL2 Example"]; +    menuItem = [appMenu addItemWithTitle:@"Quit Dear ImGui OSX+OpenGL2 Example" action:@selector(terminate:) keyEquivalent:@"q"]; +    [menuItem setKeyEquivalentModifierMask:NSEventModifierFlagCommand]; + +    menuItem = [[NSMenuItem alloc] init]; +    [menuItem setSubmenu:appMenu]; + +    [mainMenuBar addItem:menuItem]; + +    appMenu = nil; +    [NSApp setMainMenu:mainMenuBar]; +} + +-(void)dealloc +{ +    _window = nil; +} + +-(void)applicationDidFinishLaunching:(NSNotification *)aNotification +{ +    // Make the application a foreground application (else it won't receive keyboard events) +    ProcessSerialNumber psn = {0, kCurrentProcess}; +    TransformProcessType(&psn, kProcessTransformToForegroundApplication); + +    // Menu +    [self setupMenu]; + +    NSOpenGLPixelFormatAttribute attrs[] = +    { +        NSOpenGLPFADoubleBuffer, +        NSOpenGLPFADepthSize, 32, +        0 +    }; + +    NSOpenGLPixelFormat* format = [[NSOpenGLPixelFormat alloc] initWithAttributes:attrs]; +    AppView* view = [[AppView alloc] initWithFrame:self.window.frame pixelFormat:format]; +    format = nil; +#if MAC_OS_X_VERSION_MAX_ALLOWED >= 1070 +    if (floor(NSAppKitVersionNumber) > NSAppKitVersionNumber10_6) +        [view setWantsBestResolutionOpenGLSurface:YES]; +#endif // MAC_OS_X_VERSION_MAX_ALLOWED >= 1070 +    [self.window setContentView:view]; + +    if ([view openGLContext] == nil) +        NSLog(@"No OpenGL Context!"); + +    [view initialize]; +} + +@end + +//----------------------------------------------------------------------------------- +// Application main() function +//----------------------------------------------------------------------------------- + +int main(int argc, const char* argv[]) +{ +    @autoreleasepool +    { +        NSApp = [NSApplication sharedApplication]; +        AppDelegate* delegate = [[AppDelegate alloc] init]; +        [[NSApplication sharedApplication] setDelegate:delegate]; +        [NSApp run]; +    } +    return NSApplicationMain(argc, argv); +} diff --git a/lib/imgui-1.90.7/examples/example_glfw_metal/main.mm b/lib/imgui-1.90.7/examples/example_glfw_metal/main.mm new file mode 100644 index 0000000..e9bc63a --- /dev/null +++ b/lib/imgui-1.90.7/examples/example_glfw_metal/main.mm @@ -0,0 +1,177 @@ +// Dear ImGui: standalone example application for GLFW + Metal, using programmable pipeline +// (GLFW is a cross-platform general purpose library for handling windows, inputs, OpenGL/Vulkan/Metal graphics context creation, etc.) + +// 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_glfw.h" +#include "imgui_impl_metal.h" +#include <stdio.h> + +#define GLFW_INCLUDE_NONE +#define GLFW_EXPOSE_NATIVE_COCOA +#include <GLFW/glfw3.h> +#include <GLFW/glfw3native.h> + +#import <Metal/Metal.h> +#import <QuartzCore/QuartzCore.h> + +static void glfw_error_callback(int error, const char* description) +{ +    fprintf(stderr, "Glfw Error %d: %s\n", error, description); +} + +int main(int, char**) +{ +    // 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 style +    ImGui::StyleColorsDark(); +    //ImGui::StyleColorsLight(); + +    // 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); + +    // Setup window +    glfwSetErrorCallback(glfw_error_callback); +    if (!glfwInit()) +        return 1; + +    // Create window with graphics context +    glfwWindowHint(GLFW_CLIENT_API, GLFW_NO_API); +    GLFWwindow* window = glfwCreateWindow(1280, 720, "Dear ImGui GLFW+Metal example", nullptr, nullptr); +    if (window == nullptr) +        return 1; + +    id <MTLDevice> device = MTLCreateSystemDefaultDevice(); +    id <MTLCommandQueue> commandQueue = [device newCommandQueue]; + +    // Setup Platform/Renderer backends +    ImGui_ImplGlfw_InitForOpenGL(window, true); +    ImGui_ImplMetal_Init(device); + +    NSWindow *nswin = glfwGetCocoaWindow(window); +    CAMetalLayer *layer = [CAMetalLayer layer]; +    layer.device = device; +    layer.pixelFormat = MTLPixelFormatBGRA8Unorm; +    nswin.contentView.layer = layer; +    nswin.contentView.wantsLayer = YES; + +    MTLRenderPassDescriptor *renderPassDescriptor = [MTLRenderPassDescriptor new]; + +    // Our state +    bool show_demo_window = true; +    bool show_another_window = false; +    float clear_color[4] = {0.45f, 0.55f, 0.60f, 1.00f}; + +    // Main loop +    while (!glfwWindowShouldClose(window)) +    { +        @autoreleasepool +        { +            // Poll and handle events (inputs, window resize, etc.) +            // 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. +            glfwPollEvents(); + +            int width, height; +            glfwGetFramebufferSize(window, &width, &height); +            layer.drawableSize = CGSizeMake(width, height); +            id<CAMetalDrawable> drawable = [layer nextDrawable]; + +            id<MTLCommandBuffer> commandBuffer = [commandQueue commandBuffer]; +            renderPassDescriptor.colorAttachments[0].clearColor = MTLClearColorMake(clear_color[0] * clear_color[3], clear_color[1] * clear_color[3], clear_color[2] * clear_color[3], clear_color[3]); +            renderPassDescriptor.colorAttachments[0].texture = drawable.texture; +            renderPassDescriptor.colorAttachments[0].loadAction = MTLLoadActionClear; +            renderPassDescriptor.colorAttachments[0].storeAction = MTLStoreActionStore; +            id <MTLRenderCommandEncoder> renderEncoder = [commandBuffer renderCommandEncoderWithDescriptor:renderPassDescriptor]; +            [renderEncoder pushDebugGroup:@"ImGui demo"]; + +            // Start the Dear ImGui frame +            ImGui_ImplMetal_NewFrame(renderPassDescriptor); +            ImGui_ImplGlfw_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); + +            // 2. Show a simple window that we create ourselves. We use a Begin/End pair to create a named window. +            { +                static float f = 0.0f; +                static int counter = 0; + +                ImGui::Begin("Hello, world!");                          // Create a window called "Hello, world!" and append into it. + +                ImGui::Text("This is some useful text.");               // Display some text (you can use a format strings too) +                ImGui::Checkbox("Demo Window", &show_demo_window);      // Edit bools storing our window open/close state +                ImGui::Checkbox("Another Window", &show_another_window); + +                ImGui::SliderFloat("float", &f, 0.0f, 1.0f);            // Edit 1 float using a slider from 0.0f to 1.0f +                ImGui::ColorEdit3("clear color", (float*)&clear_color); // Edit 3 floats representing a color + +                if (ImGui::Button("Button"))                            // Buttons return true when clicked (most widgets return true when edited/activated) +                    counter++; +                ImGui::SameLine(); +                ImGui::Text("counter = %d", counter); + +                ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / io.Framerate, io.Framerate); +                ImGui::End(); +            } + +            // 3. Show another simple window. +            if (show_another_window) +            { +                ImGui::Begin("Another Window", &show_another_window);   // Pass a pointer to our bool variable (the window will have a closing button that will clear the bool when clicked) +                ImGui::Text("Hello from another window!"); +                if (ImGui::Button("Close Me")) +                    show_another_window = false; +                ImGui::End(); +            } + +            // Rendering +            ImGui::Render(); +            ImGui_ImplMetal_RenderDrawData(ImGui::GetDrawData(), commandBuffer, renderEncoder); + +            [renderEncoder popDebugGroup]; +            [renderEncoder endEncoding]; + +            [commandBuffer presentDrawable:drawable]; +            [commandBuffer commit]; +        } +    } + +    // Cleanup +    ImGui_ImplMetal_Shutdown(); +    ImGui_ImplGlfw_Shutdown(); +    ImGui::DestroyContext(); + +    glfwDestroyWindow(window); +    glfwTerminate(); + +    return 0; +} diff --git a/lib/imgui-1.90.7/examples/example_glfw_opengl2/build_win32.bat b/lib/imgui-1.90.7/examples/example_glfw_opengl2/build_win32.bat new file mode 100644 index 0000000..24c0e08 --- /dev/null +++ b/lib/imgui-1.90.7/examples/example_glfw_opengl2/build_win32.bat @@ -0,0 +1,8 @@ +@REM Build for Visual Studio compiler. Run your copy of vcvars32.bat or vcvarsall.bat to setup command-line compiler. +@set OUT_DIR=Debug +@set OUT_EXE=example_glfw_opengl2 +@set INCLUDES=/I..\.. /I..\..\backends /I..\libs\glfw\include +@set SOURCES=main.cpp ..\..\backends\imgui_impl_opengl2.cpp ..\..\backends\imgui_impl_glfw.cpp ..\..\imgui*.cpp +@set LIBS=/LIBPATH:..\libs\glfw\lib-vc2010-32 glfw3.lib opengl32.lib gdi32.lib shell32.lib +mkdir %OUT_DIR% +cl /nologo /Zi /MD /utf-8 %INCLUDES% %SOURCES% /Fe%OUT_DIR%/%OUT_EXE%.exe /Fo%OUT_DIR%/ /link %LIBS% diff --git a/lib/imgui-1.90.7/examples/example_glfw_opengl2/example_glfw_opengl2.vcxproj b/lib/imgui-1.90.7/examples/example_glfw_opengl2/example_glfw_opengl2.vcxproj new file mode 100644 index 0000000..2aa2550 --- /dev/null +++ b/lib/imgui-1.90.7/examples/example_glfw_opengl2/example_glfw_opengl2.vcxproj @@ -0,0 +1,186 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> +  <ItemGroup Label="ProjectConfigurations"> +    <ProjectConfiguration Include="Debug|Win32"> +      <Configuration>Debug</Configuration> +      <Platform>Win32</Platform> +    </ProjectConfiguration> +    <ProjectConfiguration Include="Debug|x64"> +      <Configuration>Debug</Configuration> +      <Platform>x64</Platform> +    </ProjectConfiguration> +    <ProjectConfiguration Include="Release|Win32"> +      <Configuration>Release</Configuration> +      <Platform>Win32</Platform> +    </ProjectConfiguration> +    <ProjectConfiguration Include="Release|x64"> +      <Configuration>Release</Configuration> +      <Platform>x64</Platform> +    </ProjectConfiguration> +  </ItemGroup> +  <PropertyGroup Label="Globals"> +    <ProjectGuid>{9CDA7840-B7A5-496D-A527-E95571496D18}</ProjectGuid> +    <RootNamespace>example_glfw_opengl2</RootNamespace> +    <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion> +  </PropertyGroup> +  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> +  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> +    <ConfigurationType>Application</ConfigurationType> +    <UseDebugLibraries>true</UseDebugLibraries> +    <CharacterSet>MultiByte</CharacterSet> +    <PlatformToolset>v140</PlatformToolset> +  </PropertyGroup> +  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration"> +    <ConfigurationType>Application</ConfigurationType> +    <UseDebugLibraries>true</UseDebugLibraries> +    <CharacterSet>MultiByte</CharacterSet> +    <PlatformToolset>v140</PlatformToolset> +  </PropertyGroup> +  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration"> +    <ConfigurationType>Application</ConfigurationType> +    <UseDebugLibraries>false</UseDebugLibraries> +    <WholeProgramOptimization>true</WholeProgramOptimization> +    <CharacterSet>MultiByte</CharacterSet> +    <PlatformToolset>v140</PlatformToolset> +  </PropertyGroup> +  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration"> +    <ConfigurationType>Application</ConfigurationType> +    <UseDebugLibraries>false</UseDebugLibraries> +    <WholeProgramOptimization>true</WholeProgramOptimization> +    <CharacterSet>MultiByte</CharacterSet> +    <PlatformToolset>v140</PlatformToolset> +  </PropertyGroup> +  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> +  <ImportGroup Label="ExtensionSettings"> +  </ImportGroup> +  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> +    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> +  </ImportGroup> +  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets"> +    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> +  </ImportGroup> +  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> +    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> +  </ImportGroup> +  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets"> +    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> +  </ImportGroup> +  <PropertyGroup Label="UserMacros" /> +  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> +    <OutDir>$(ProjectDir)$(Configuration)\</OutDir> +    <IntDir>$(ProjectDir)$(Configuration)\</IntDir> +    <IncludePath>$(IncludePath)</IncludePath> +  </PropertyGroup> +  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> +    <OutDir>$(ProjectDir)$(Configuration)\</OutDir> +    <IntDir>$(ProjectDir)$(Configuration)\</IntDir> +    <IncludePath>$(IncludePath)</IncludePath> +  </PropertyGroup> +  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> +    <OutDir>$(ProjectDir)$(Configuration)\</OutDir> +    <IntDir>$(ProjectDir)$(Configuration)\</IntDir> +    <IncludePath>$(IncludePath)</IncludePath> +  </PropertyGroup> +  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> +    <OutDir>$(ProjectDir)$(Configuration)\</OutDir> +    <IntDir>$(ProjectDir)$(Configuration)\</IntDir> +    <IncludePath>$(IncludePath)</IncludePath> +  </PropertyGroup> +  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> +    <ClCompile> +      <WarningLevel>Level4</WarningLevel> +      <Optimization>Disabled</Optimization> +      <AdditionalIncludeDirectories>..\..;..\..\backends;..\libs\glfw\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> +      <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions> +    </ClCompile> +    <Link> +      <GenerateDebugInformation>true</GenerateDebugInformation> +      <AdditionalLibraryDirectories>..\libs\glfw\lib-vc2010-32;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> +      <AdditionalDependencies>opengl32.lib;glfw3.lib;%(AdditionalDependencies)</AdditionalDependencies> +      <SubSystem>Console</SubSystem> +      <IgnoreSpecificDefaultLibraries>msvcrt.lib</IgnoreSpecificDefaultLibraries> +    </Link> +  </ItemDefinitionGroup> +  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> +    <ClCompile> +      <WarningLevel>Level4</WarningLevel> +      <Optimization>Disabled</Optimization> +      <AdditionalIncludeDirectories>..\..;..\..\backends;..\libs\glfw\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> +      <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions> +    </ClCompile> +    <Link> +      <GenerateDebugInformation>true</GenerateDebugInformation> +      <AdditionalLibraryDirectories>..\libs\glfw\lib-vc2010-64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> +      <AdditionalDependencies>opengl32.lib;glfw3.lib;%(AdditionalDependencies)</AdditionalDependencies> +      <SubSystem>Console</SubSystem> +      <IgnoreSpecificDefaultLibraries>msvcrt.lib</IgnoreSpecificDefaultLibraries> +    </Link> +  </ItemDefinitionGroup> +  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> +    <ClCompile> +      <WarningLevel>Level4</WarningLevel> +      <Optimization>MaxSpeed</Optimization> +      <FunctionLevelLinking>true</FunctionLevelLinking> +      <IntrinsicFunctions>true</IntrinsicFunctions> +      <AdditionalIncludeDirectories>..\..;..\..\backends;..\libs\glfw\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> +      <BufferSecurityCheck>false</BufferSecurityCheck> +      <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions> +    </ClCompile> +    <Link> +      <GenerateDebugInformation>true</GenerateDebugInformation> +      <EnableCOMDATFolding>true</EnableCOMDATFolding> +      <OptimizeReferences>true</OptimizeReferences> +      <AdditionalLibraryDirectories>..\libs\glfw\lib-vc2010-32;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> +      <AdditionalDependencies>opengl32.lib;glfw3.lib;%(AdditionalDependencies)</AdditionalDependencies> +      <SubSystem>Console</SubSystem> +      <IgnoreSpecificDefaultLibraries> +      </IgnoreSpecificDefaultLibraries> +    </Link> +  </ItemDefinitionGroup> +  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> +    <ClCompile> +      <WarningLevel>Level4</WarningLevel> +      <Optimization>MaxSpeed</Optimization> +      <FunctionLevelLinking>true</FunctionLevelLinking> +      <IntrinsicFunctions>true</IntrinsicFunctions> +      <AdditionalIncludeDirectories>..\..;..\..\backends;..\libs\glfw\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> +      <BufferSecurityCheck>false</BufferSecurityCheck> +      <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions> +    </ClCompile> +    <Link> +      <GenerateDebugInformation>true</GenerateDebugInformation> +      <EnableCOMDATFolding>true</EnableCOMDATFolding> +      <OptimizeReferences>true</OptimizeReferences> +      <AdditionalLibraryDirectories>..\libs\glfw\lib-vc2010-64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> +      <AdditionalDependencies>opengl32.lib;glfw3.lib;%(AdditionalDependencies)</AdditionalDependencies> +      <SubSystem>Console</SubSystem> +      <IgnoreSpecificDefaultLibraries> +      </IgnoreSpecificDefaultLibraries> +    </Link> +  </ItemDefinitionGroup> +  <ItemGroup> +    <ClCompile Include="..\..\imgui.cpp" /> +    <ClCompile Include="..\..\imgui_demo.cpp" /> +    <ClCompile Include="..\..\imgui_draw.cpp" /> +    <ClCompile Include="..\..\imgui_tables.cpp" /> +    <ClCompile Include="..\..\imgui_widgets.cpp" /> +    <ClCompile Include="..\..\backends\imgui_impl_glfw.cpp" /> +    <ClCompile Include="..\..\backends\imgui_impl_opengl2.cpp" /> +    <ClCompile Include="main.cpp" /> +  </ItemGroup> +  <ItemGroup> +    <ClInclude Include="..\..\imconfig.h" /> +    <ClInclude Include="..\..\imgui.h" /> +    <ClInclude Include="..\..\imgui_internal.h" /> +    <ClInclude Include="..\..\backends\imgui_impl_glfw.h" /> +    <ClInclude Include="..\..\backends\imgui_impl_opengl2.h" /> +  </ItemGroup> +  <ItemGroup> +    <None Include="..\..\misc\debuggers\imgui.natstepfilter" /> +    <None Include="..\..\misc\debuggers\imgui.natvis" /> +    <None Include="..\README.txt" /> +  </ItemGroup> +  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> +  <ImportGroup Label="ExtensionTargets"> +  </ImportGroup> +</Project>
\ No newline at end of file diff --git a/lib/imgui-1.90.7/examples/example_glfw_opengl2/example_glfw_opengl2.vcxproj.filters b/lib/imgui-1.90.7/examples/example_glfw_opengl2/example_glfw_opengl2.vcxproj.filters new file mode 100644 index 0000000..049b0b1 --- /dev/null +++ b/lib/imgui-1.90.7/examples/example_glfw_opengl2/example_glfw_opengl2.vcxproj.filters @@ -0,0 +1,64 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> +  <ItemGroup> +    <Filter Include="imgui"> +      <UniqueIdentifier>{c336cfe3-f0c4-464c-9ef0-a9e17a7ff222}</UniqueIdentifier> +    </Filter> +    <Filter Include="sources"> +      <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier> +      <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions> +    </Filter> +  </ItemGroup> +  <ItemGroup> +    <ClCompile Include="main.cpp"> +      <Filter>sources</Filter> +    </ClCompile> +    <ClCompile Include="..\..\imgui.cpp"> +      <Filter>imgui</Filter> +    </ClCompile> +    <ClCompile Include="..\..\imgui_demo.cpp"> +      <Filter>imgui</Filter> +    </ClCompile> +    <ClCompile Include="..\..\imgui_draw.cpp"> +      <Filter>imgui</Filter> +    </ClCompile> +    <ClCompile Include="..\..\imgui_tables.cpp"> +      <Filter>imgui</Filter> +    </ClCompile> +    <ClCompile Include="..\..\imgui_widgets.cpp"> +      <Filter>imgui</Filter> +    </ClCompile> +    <ClCompile Include="..\..\backends\imgui_impl_glfw.cpp"> +      <Filter>sources</Filter> +    </ClCompile> +    <ClCompile Include="..\..\backends\imgui_impl_opengl2.cpp"> +      <Filter>sources</Filter> +    </ClCompile> +  </ItemGroup> +  <ItemGroup> +    <ClInclude Include="..\..\imconfig.h"> +      <Filter>imgui</Filter> +    </ClInclude> +    <ClInclude Include="..\..\imgui.h"> +      <Filter>imgui</Filter> +    </ClInclude> +    <ClInclude Include="..\..\imgui_internal.h"> +      <Filter>imgui</Filter> +    </ClInclude> +    <ClInclude Include="..\..\backends\imgui_impl_glfw.h"> +      <Filter>sources</Filter> +    </ClInclude> +    <ClInclude Include="..\..\backends\imgui_impl_opengl2.h"> +      <Filter>sources</Filter> +    </ClInclude> +  </ItemGroup> +  <ItemGroup> +    <None Include="..\README.txt" /> +    <None Include="..\..\misc\debuggers\imgui.natvis"> +      <Filter>imgui</Filter> +    </None> +    <None Include="..\..\misc\debuggers\imgui.natstepfilter"> +      <Filter>imgui</Filter> +    </None> +  </ItemGroup> +</Project>
\ No newline at end of file diff --git a/lib/imgui-1.90.7/examples/example_glfw_opengl2/main.cpp b/lib/imgui-1.90.7/examples/example_glfw_opengl2/main.cpp new file mode 100644 index 0000000..5e47b00 --- /dev/null +++ b/lib/imgui-1.90.7/examples/example_glfw_opengl2/main.cpp @@ -0,0 +1,166 @@ +// Dear ImGui: standalone example application for GLFW + OpenGL2, using legacy fixed pipeline +// (GLFW is a cross-platform general purpose library for handling windows, inputs, OpenGL/Vulkan/Metal graphics context creation, etc.) + +// 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 + +// **DO NOT USE THIS CODE IF YOUR CODE/ENGINE IS USING MODERN OPENGL (SHADERS, VBO, VAO, etc.)** +// **Prefer using the code in the example_glfw_opengl2/ folder** +// See imgui_impl_glfw.cpp for details. + +#include "imgui.h" +#include "imgui_impl_glfw.h" +#include "imgui_impl_opengl2.h" +#include <stdio.h> +#ifdef __APPLE__ +#define GL_SILENCE_DEPRECATION +#endif +#include <GLFW/glfw3.h> + +// [Win32] Our example includes a copy of glfw3.lib pre-compiled with VS2010 to maximize ease of testing and compatibility with old VS compilers. +// To link with VS2010-era libraries, VS2015+ requires linking with legacy_stdio_definitions.lib, which we do using this pragma. +// Your own project should not be affected, as you are likely to link with a newer binary of GLFW that is adequate for your version of Visual Studio. +#if defined(_MSC_VER) && (_MSC_VER >= 1900) && !defined(IMGUI_DISABLE_WIN32_FUNCTIONS) +#pragma comment(lib, "legacy_stdio_definitions") +#endif + +static void glfw_error_callback(int error, const char* description) +{ +    fprintf(stderr, "GLFW Error %d: %s\n", error, description); +} + +// Main code +int main(int, char**) +{ +    glfwSetErrorCallback(glfw_error_callback); +    if (!glfwInit()) +        return 1; + +    // Create window with graphics context +    GLFWwindow* window = glfwCreateWindow(1280, 720, "Dear ImGui GLFW+OpenGL2 example", nullptr, nullptr); +    if (window == nullptr) +        return 1; +    glfwMakeContextCurrent(window); +    glfwSwapInterval(1); // Enable vsync + +    // 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_ImplGlfw_InitForOpenGL(window, true); +    ImGui_ImplOpenGL2_Init(); + +    // 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); + +    // Main loop +    while (!glfwWindowShouldClose(window)) +    { +        // Poll and handle events (inputs, window resize, etc.) +        // 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. +        glfwPollEvents(); + +        // Start the Dear ImGui frame +        ImGui_ImplOpenGL2_NewFrame(); +        ImGui_ImplGlfw_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); + +        // 2. Show a simple window that we create ourselves. We use a Begin/End pair to create a named window. +        { +            static float f = 0.0f; +            static int counter = 0; + +            ImGui::Begin("Hello, world!");                          // Create a window called "Hello, world!" and append into it. + +            ImGui::Text("This is some useful text.");               // Display some text (you can use a format strings too) +            ImGui::Checkbox("Demo Window", &show_demo_window);      // Edit bools storing our window open/close state +            ImGui::Checkbox("Another Window", &show_another_window); + +            ImGui::SliderFloat("float", &f, 0.0f, 1.0f);            // Edit 1 float using a slider from 0.0f to 1.0f +            ImGui::ColorEdit3("clear color", (float*)&clear_color); // Edit 3 floats representing a color + +            if (ImGui::Button("Button"))                            // Buttons return true when clicked (most widgets return true when edited/activated) +                counter++; +            ImGui::SameLine(); +            ImGui::Text("counter = %d", counter); + +            ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / io.Framerate, io.Framerate); +            ImGui::End(); +        } + +        // 3. Show another simple window. +        if (show_another_window) +        { +            ImGui::Begin("Another Window", &show_another_window);   // Pass a pointer to our bool variable (the window will have a closing button that will clear the bool when clicked) +            ImGui::Text("Hello from another window!"); +            if (ImGui::Button("Close Me")) +                show_another_window = false; +            ImGui::End(); +        } + +        // Rendering +        ImGui::Render(); +        int display_w, display_h; +        glfwGetFramebufferSize(window, &display_w, &display_h); +        glViewport(0, 0, display_w, display_h); +        glClearColor(clear_color.x * clear_color.w, clear_color.y * clear_color.w, clear_color.z * clear_color.w, clear_color.w); +        glClear(GL_COLOR_BUFFER_BIT); + +        // If you are using this code with non-legacy OpenGL header/contexts (which you should not, prefer using imgui_impl_opengl3.cpp!!), +        // you may need to backup/reset/restore other state, e.g. for current shader using the commented lines below. +        //GLint last_program; +        //glGetIntegerv(GL_CURRENT_PROGRAM, &last_program); +        //glUseProgram(0); +        ImGui_ImplOpenGL2_RenderDrawData(ImGui::GetDrawData()); +        //glUseProgram(last_program); + +        glfwMakeContextCurrent(window); +        glfwSwapBuffers(window); +    } + +    // Cleanup +    ImGui_ImplOpenGL2_Shutdown(); +    ImGui_ImplGlfw_Shutdown(); +    ImGui::DestroyContext(); + +    glfwDestroyWindow(window); +    glfwTerminate(); + +    return 0; +} diff --git a/lib/imgui-1.90.7/examples/example_glfw_opengl3/Makefile.emscripten b/lib/imgui-1.90.7/examples/example_glfw_opengl3/Makefile.emscripten new file mode 100644 index 0000000..bd972ab --- /dev/null +++ b/lib/imgui-1.90.7/examples/example_glfw_opengl3/Makefile.emscripten @@ -0,0 +1,91 @@ +# +# Makefile to use with GLFW+emscripten +# See https://emscripten.org/docs/getting_started/downloads.html +# for installation instructions. +# +# This Makefile assumes you have loaded emscripten's environment. +# (On Windows, you may need to execute emsdk_env.bat or encmdprompt.bat ahead) +# +# Running `make -f Makefile.emscripten` will produce three files: +#  - web/index.html +#  - web/index.js +#  - web/index.wasm +# +# All three are needed to run the demo. + +CC = emcc +CXX = em++ +WEB_DIR = web +EXE = $(WEB_DIR)/index.html +IMGUI_DIR = ../.. +SOURCES = main.cpp +SOURCES += $(IMGUI_DIR)/imgui.cpp $(IMGUI_DIR)/imgui_demo.cpp $(IMGUI_DIR)/imgui_draw.cpp $(IMGUI_DIR)/imgui_tables.cpp $(IMGUI_DIR)/imgui_widgets.cpp +SOURCES += $(IMGUI_DIR)/backends/imgui_impl_glfw.cpp $(IMGUI_DIR)/backends/imgui_impl_opengl3.cpp +OBJS = $(addsuffix .o, $(basename $(notdir $(SOURCES)))) +UNAME_S := $(shell uname -s) +CPPFLAGS = +LDFLAGS = +EMS = + +##--------------------------------------------------------------------- +## EMSCRIPTEN OPTIONS +##--------------------------------------------------------------------- + +# ("EMS" options gets added to both CPPFLAGS and LDFLAGS, whereas some options are for linker only) +EMS += -s DISABLE_EXCEPTION_CATCHING=1 +LDFLAGS += -s USE_GLFW=3 -s WASM=1 -s ALLOW_MEMORY_GROWTH=1 -s NO_EXIT_RUNTIME=0 -s ASSERTIONS=1 + +# Uncomment next line to fix possible rendering bugs with Emscripten version older then 1.39.0 (https://github.com/ocornut/imgui/issues/2877) +#EMS += -s BINARYEN_TRAP_MODE=clamp +#EMS += -s SAFE_HEAP=1    ## Adds overhead + +# Emscripten allows preloading a file or folder to be accessible at runtime. +# The Makefile for this example project suggests embedding the misc/fonts/ folder into our application, it will then be accessible as "/fonts" +# See documentation for more details: https://emscripten.org/docs/porting/files/packaging_files.html +# (Default value is 0. Set to 1 to enable file-system and include the misc/fonts/ folder as part of the build.) +USE_FILE_SYSTEM ?= 0 +ifeq ($(USE_FILE_SYSTEM), 0) +LDFLAGS += -s NO_FILESYSTEM=1 +CPPFLAGS += -DIMGUI_DISABLE_FILE_FUNCTIONS +endif +ifeq ($(USE_FILE_SYSTEM), 1) +LDFLAGS += --no-heap-copy --preload-file ../../misc/fonts@/fonts +endif + +##--------------------------------------------------------------------- +## FINAL BUILD FLAGS +##--------------------------------------------------------------------- + +CPPFLAGS += -I$(IMGUI_DIR) -I$(IMGUI_DIR)/backends +#CPPFLAGS += -g +CPPFLAGS += -Wall -Wformat -Os $(EMS) +LDFLAGS += --shell-file ../libs/emscripten/shell_minimal.html +LDFLAGS += $(EMS) + +##--------------------------------------------------------------------- +## BUILD RULES +##--------------------------------------------------------------------- + +%.o:%.cpp +	$(CXX) $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $< + +%.o:$(IMGUI_DIR)/%.cpp +	$(CXX) $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $< + +%.o:$(IMGUI_DIR)/backends/%.cpp +	$(CXX) $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $< + +all: $(EXE) +	@echo Build complete for $(EXE) + +$(WEB_DIR): +	mkdir $@ + +serve: all +	python3 -m http.server -d $(WEB_DIR) + +$(EXE): $(OBJS) $(WEB_DIR) +	$(CXX) -o $@ $(OBJS) $(LDFLAGS) + +clean: +	rm -rf $(OBJS) $(WEB_DIR) diff --git a/lib/imgui-1.90.7/examples/example_glfw_opengl3/build_win32.bat b/lib/imgui-1.90.7/examples/example_glfw_opengl3/build_win32.bat new file mode 100644 index 0000000..b5979ad --- /dev/null +++ b/lib/imgui-1.90.7/examples/example_glfw_opengl3/build_win32.bat @@ -0,0 +1,8 @@ +@REM Build for Visual Studio compiler. Run your copy of vcvars32.bat or vcvarsall.bat to setup command-line compiler. +@set OUT_DIR=Debug +@set OUT_EXE=example_glfw_opengl3 +@set INCLUDES=/I..\.. /I..\..\backends /I..\libs\glfw\include +@set SOURCES=main.cpp ..\..\backends\imgui_impl_glfw.cpp ..\..\backends\imgui_impl_opengl3.cpp ..\..\imgui*.cpp +@set LIBS=/LIBPATH:..\libs\glfw\lib-vc2010-32 glfw3.lib opengl32.lib gdi32.lib shell32.lib +mkdir %OUT_DIR% +cl /nologo /Zi /MD /utf-8 %INCLUDES% %SOURCES% /Fe%OUT_DIR%/%OUT_EXE%.exe /Fo%OUT_DIR%/ /link %LIBS% diff --git a/lib/imgui-1.90.7/examples/example_glfw_opengl3/example_glfw_opengl3.vcxproj b/lib/imgui-1.90.7/examples/example_glfw_opengl3/example_glfw_opengl3.vcxproj new file mode 100644 index 0000000..4bd503a --- /dev/null +++ b/lib/imgui-1.90.7/examples/example_glfw_opengl3/example_glfw_opengl3.vcxproj @@ -0,0 +1,187 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> +  <ItemGroup Label="ProjectConfigurations"> +    <ProjectConfiguration Include="Debug|Win32"> +      <Configuration>Debug</Configuration> +      <Platform>Win32</Platform> +    </ProjectConfiguration> +    <ProjectConfiguration Include="Debug|x64"> +      <Configuration>Debug</Configuration> +      <Platform>x64</Platform> +    </ProjectConfiguration> +    <ProjectConfiguration Include="Release|Win32"> +      <Configuration>Release</Configuration> +      <Platform>Win32</Platform> +    </ProjectConfiguration> +    <ProjectConfiguration Include="Release|x64"> +      <Configuration>Release</Configuration> +      <Platform>x64</Platform> +    </ProjectConfiguration> +  </ItemGroup> +  <PropertyGroup Label="Globals"> +    <ProjectGuid>{4a1fb5ea-22f5-42a8-ab92-1d2df5d47fb9}</ProjectGuid> +    <RootNamespace>example_glfw_opengl3</RootNamespace> +    <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion> +  </PropertyGroup> +  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> +  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> +    <ConfigurationType>Application</ConfigurationType> +    <UseDebugLibraries>true</UseDebugLibraries> +    <CharacterSet>MultiByte</CharacterSet> +    <PlatformToolset>v140</PlatformToolset> +  </PropertyGroup> +  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration"> +    <ConfigurationType>Application</ConfigurationType> +    <UseDebugLibraries>true</UseDebugLibraries> +    <CharacterSet>MultiByte</CharacterSet> +    <PlatformToolset>v140</PlatformToolset> +  </PropertyGroup> +  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration"> +    <ConfigurationType>Application</ConfigurationType> +    <UseDebugLibraries>false</UseDebugLibraries> +    <WholeProgramOptimization>true</WholeProgramOptimization> +    <CharacterSet>MultiByte</CharacterSet> +    <PlatformToolset>v140</PlatformToolset> +  </PropertyGroup> +  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration"> +    <ConfigurationType>Application</ConfigurationType> +    <UseDebugLibraries>false</UseDebugLibraries> +    <WholeProgramOptimization>true</WholeProgramOptimization> +    <CharacterSet>MultiByte</CharacterSet> +    <PlatformToolset>v140</PlatformToolset> +  </PropertyGroup> +  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> +  <ImportGroup Label="ExtensionSettings"> +  </ImportGroup> +  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> +    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> +  </ImportGroup> +  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets"> +    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> +  </ImportGroup> +  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> +    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> +  </ImportGroup> +  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets"> +    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> +  </ImportGroup> +  <PropertyGroup Label="UserMacros" /> +  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> +    <OutDir>$(ProjectDir)$(Configuration)\</OutDir> +    <IntDir>$(ProjectDir)$(Configuration)\</IntDir> +    <IncludePath>$(IncludePath)</IncludePath> +  </PropertyGroup> +  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> +    <OutDir>$(ProjectDir)$(Configuration)\</OutDir> +    <IntDir>$(ProjectDir)$(Configuration)\</IntDir> +    <IncludePath>$(IncludePath)</IncludePath> +  </PropertyGroup> +  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> +    <OutDir>$(ProjectDir)$(Configuration)\</OutDir> +    <IntDir>$(ProjectDir)$(Configuration)\</IntDir> +    <IncludePath>$(IncludePath)</IncludePath> +  </PropertyGroup> +  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> +    <OutDir>$(ProjectDir)$(Configuration)\</OutDir> +    <IntDir>$(ProjectDir)$(Configuration)\</IntDir> +    <IncludePath>$(IncludePath)</IncludePath> +  </PropertyGroup> +  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> +    <ClCompile> +      <WarningLevel>Level4</WarningLevel> +      <Optimization>Disabled</Optimization> +      <AdditionalIncludeDirectories>..\..;..\..\backends;..\libs\glfw\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> +      <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions> +    </ClCompile> +    <Link> +      <GenerateDebugInformation>true</GenerateDebugInformation> +      <AdditionalLibraryDirectories>..\libs\glfw\lib-vc2010-32;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> +      <AdditionalDependencies>opengl32.lib;glfw3.lib;%(AdditionalDependencies)</AdditionalDependencies> +      <SubSystem>Console</SubSystem> +      <IgnoreSpecificDefaultLibraries>msvcrt.lib</IgnoreSpecificDefaultLibraries> +    </Link> +  </ItemDefinitionGroup> +  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> +    <ClCompile> +      <WarningLevel>Level4</WarningLevel> +      <Optimization>Disabled</Optimization> +      <AdditionalIncludeDirectories>..\..;..\..\backends;..\libs\glfw\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> +      <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions> +    </ClCompile> +    <Link> +      <GenerateDebugInformation>true</GenerateDebugInformation> +      <AdditionalLibraryDirectories>..\libs\glfw\lib-vc2010-64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> +      <AdditionalDependencies>opengl32.lib;glfw3.lib;%(AdditionalDependencies)</AdditionalDependencies> +      <SubSystem>Console</SubSystem> +      <IgnoreSpecificDefaultLibraries>msvcrt.lib</IgnoreSpecificDefaultLibraries> +    </Link> +  </ItemDefinitionGroup> +  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> +    <ClCompile> +      <WarningLevel>Level4</WarningLevel> +      <Optimization>MaxSpeed</Optimization> +      <FunctionLevelLinking>true</FunctionLevelLinking> +      <IntrinsicFunctions>true</IntrinsicFunctions> +      <AdditionalIncludeDirectories>..\..;..\..\backends;..\libs\glfw\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> +      <BufferSecurityCheck>false</BufferSecurityCheck> +      <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions> +    </ClCompile> +    <Link> +      <GenerateDebugInformation>true</GenerateDebugInformation> +      <EnableCOMDATFolding>true</EnableCOMDATFolding> +      <OptimizeReferences>true</OptimizeReferences> +      <AdditionalLibraryDirectories>..\libs\glfw\lib-vc2010-32;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> +      <AdditionalDependencies>opengl32.lib;glfw3.lib;%(AdditionalDependencies)</AdditionalDependencies> +      <SubSystem>Console</SubSystem> +      <IgnoreSpecificDefaultLibraries> +      </IgnoreSpecificDefaultLibraries> +    </Link> +  </ItemDefinitionGroup> +  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> +    <ClCompile> +      <WarningLevel>Level4</WarningLevel> +      <Optimization>MaxSpeed</Optimization> +      <FunctionLevelLinking>true</FunctionLevelLinking> +      <IntrinsicFunctions>true</IntrinsicFunctions> +      <AdditionalIncludeDirectories>..\..;..\..\backends;..\libs\glfw\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> +      <BufferSecurityCheck>false</BufferSecurityCheck> +      <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions> +    </ClCompile> +    <Link> +      <GenerateDebugInformation>true</GenerateDebugInformation> +      <EnableCOMDATFolding>true</EnableCOMDATFolding> +      <OptimizeReferences>true</OptimizeReferences> +      <AdditionalLibraryDirectories>..\libs\glfw\lib-vc2010-64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> +      <AdditionalDependencies>opengl32.lib;glfw3.lib;%(AdditionalDependencies)</AdditionalDependencies> +      <SubSystem>Console</SubSystem> +      <IgnoreSpecificDefaultLibraries> +      </IgnoreSpecificDefaultLibraries> +    </Link> +  </ItemDefinitionGroup> +  <ItemGroup> +    <ClCompile Include="..\..\imgui.cpp" /> +    <ClCompile Include="..\..\imgui_demo.cpp" /> +    <ClCompile Include="..\..\imgui_draw.cpp" /> +    <ClCompile Include="..\..\imgui_tables.cpp" /> +    <ClCompile Include="..\..\imgui_widgets.cpp" /> +    <ClCompile Include="..\..\backends\imgui_impl_glfw.cpp" /> +    <ClCompile Include="..\..\backends\imgui_impl_opengl3.cpp" /> +    <ClCompile Include="main.cpp" /> +  </ItemGroup> +  <ItemGroup> +    <ClInclude Include="..\..\imconfig.h" /> +    <ClInclude Include="..\..\imgui.h" /> +    <ClInclude Include="..\..\imgui_internal.h" /> +    <ClInclude Include="..\..\backends\imgui_impl_glfw.h" /> +    <ClInclude Include="..\..\backends\imgui_impl_opengl3.h" /> +    <ClInclude Include="..\..\backends\imgui_impl_opengl3_loader.h" /> +  </ItemGroup> +  <ItemGroup> +    <None Include="..\..\misc\debuggers\imgui.natstepfilter" /> +    <None Include="..\..\misc\debuggers\imgui.natvis" /> +    <None Include="..\README.txt" /> +  </ItemGroup> +  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> +  <ImportGroup Label="ExtensionTargets"> +  </ImportGroup> +</Project>
\ No newline at end of file diff --git a/lib/imgui-1.90.7/examples/example_glfw_opengl3/example_glfw_opengl3.vcxproj.filters b/lib/imgui-1.90.7/examples/example_glfw_opengl3/example_glfw_opengl3.vcxproj.filters new file mode 100644 index 0000000..bc79bb1 --- /dev/null +++ b/lib/imgui-1.90.7/examples/example_glfw_opengl3/example_glfw_opengl3.vcxproj.filters @@ -0,0 +1,67 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> +  <ItemGroup> +    <Filter Include="imgui"> +      <UniqueIdentifier>{20b90ce4-7fcb-4731-b9a0-075f875de82d}</UniqueIdentifier> +    </Filter> +    <Filter Include="sources"> +      <UniqueIdentifier>{f18ab499-84e1-499f-8eff-9754361e0e52}</UniqueIdentifier> +      <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions> +    </Filter> +  </ItemGroup> +  <ItemGroup> +    <ClCompile Include="main.cpp"> +      <Filter>sources</Filter> +    </ClCompile> +    <ClCompile Include="..\..\imgui.cpp"> +      <Filter>imgui</Filter> +    </ClCompile> +    <ClCompile Include="..\..\imgui_demo.cpp"> +      <Filter>imgui</Filter> +    </ClCompile> +    <ClCompile Include="..\..\imgui_draw.cpp"> +      <Filter>imgui</Filter> +    </ClCompile> +    <ClCompile Include="..\..\imgui_tables.cpp"> +      <Filter>imgui</Filter> +    </ClCompile> +    <ClCompile Include="..\..\imgui_widgets.cpp"> +      <Filter>imgui</Filter> +    </ClCompile> +    <ClCompile Include="..\..\backends\imgui_impl_glfw.cpp"> +      <Filter>sources</Filter> +    </ClCompile> +    <ClCompile Include="..\..\backends\imgui_impl_opengl3.cpp"> +      <Filter>sources</Filter> +    </ClCompile> +  </ItemGroup> +  <ItemGroup> +    <ClInclude Include="..\..\imconfig.h"> +      <Filter>imgui</Filter> +    </ClInclude> +    <ClInclude Include="..\..\imgui.h"> +      <Filter>imgui</Filter> +    </ClInclude> +    <ClInclude Include="..\..\imgui_internal.h"> +      <Filter>imgui</Filter> +    </ClInclude> +    <ClInclude Include="..\..\backends\imgui_impl_glfw.h"> +      <Filter>sources</Filter> +    </ClInclude> +    <ClInclude Include="..\..\backends\imgui_impl_opengl3.h"> +      <Filter>sources</Filter> +    </ClInclude> +    <ClInclude Include="..\..\backends\imgui_impl_opengl3_loader.h"> +      <Filter>sources</Filter> +    </ClInclude> +  </ItemGroup> +  <ItemGroup> +    <None Include="..\README.txt" /> +    <None Include="..\..\misc\debuggers\imgui.natvis"> +      <Filter>imgui</Filter> +    </None> +    <None Include="..\..\misc\debuggers\imgui.natstepfilter"> +      <Filter>imgui</Filter> +    </None> +  </ItemGroup> +</Project>
\ No newline at end of file diff --git a/lib/imgui-1.90.7/examples/example_glfw_opengl3/main.cpp b/lib/imgui-1.90.7/examples/example_glfw_opengl3/main.cpp new file mode 100644 index 0000000..4438fa5 --- /dev/null +++ b/lib/imgui-1.90.7/examples/example_glfw_opengl3/main.cpp @@ -0,0 +1,197 @@ +// Dear ImGui: standalone example application for GLFW + OpenGL 3, using programmable pipeline +// (GLFW is a cross-platform general purpose library for handling windows, inputs, OpenGL/Vulkan/Metal graphics context creation, etc.) + +// 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_glfw.h" +#include "imgui_impl_opengl3.h" +#include <stdio.h> +#define GL_SILENCE_DEPRECATION +#if defined(IMGUI_IMPL_OPENGL_ES2) +#include <GLES2/gl2.h> +#endif +#include <GLFW/glfw3.h> // Will drag system OpenGL headers + +// [Win32] Our example includes a copy of glfw3.lib pre-compiled with VS2010 to maximize ease of testing and compatibility with old VS compilers. +// To link with VS2010-era libraries, VS2015+ requires linking with legacy_stdio_definitions.lib, which we do using this pragma. +// Your own project should not be affected, as you are likely to link with a newer binary of GLFW that is adequate for your version of Visual Studio. +#if defined(_MSC_VER) && (_MSC_VER >= 1900) && !defined(IMGUI_DISABLE_WIN32_FUNCTIONS) +#pragma comment(lib, "legacy_stdio_definitions") +#endif + +// This example can also compile and run with Emscripten! See 'Makefile.emscripten' for details. +#ifdef __EMSCRIPTEN__ +#include "../libs/emscripten/emscripten_mainloop_stub.h" +#endif + +static void glfw_error_callback(int error, const char* description) +{ +    fprintf(stderr, "GLFW Error %d: %s\n", error, description); +} + +// Main code +int main(int, char**) +{ +    glfwSetErrorCallback(glfw_error_callback); +    if (!glfwInit()) +        return 1; + +    // Decide GL+GLSL versions +#if defined(IMGUI_IMPL_OPENGL_ES2) +    // GL ES 2.0 + GLSL 100 +    const char* glsl_version = "#version 100"; +    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 2); +    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 0); +    glfwWindowHint(GLFW_CLIENT_API, GLFW_OPENGL_ES_API); +#elif defined(__APPLE__) +    // GL 3.2 + GLSL 150 +    const char* glsl_version = "#version 150"; +    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); +    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 2); +    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);  // 3.2+ only +    glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);            // Required on Mac +#else +    // GL 3.0 + GLSL 130 +    const char* glsl_version = "#version 130"; +    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); +    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 0); +    //glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);  // 3.2+ only +    //glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);            // 3.0+ only +#endif + +    // Create window with graphics context +    GLFWwindow* window = glfwCreateWindow(1280, 720, "Dear ImGui GLFW+OpenGL3 example", nullptr, nullptr); +    if (window == nullptr) +        return 1; +    glfwMakeContextCurrent(window); +    glfwSwapInterval(1); // Enable vsync + +    // 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_ImplGlfw_InitForOpenGL(window, true); +#ifdef __EMSCRIPTEN__ +    ImGui_ImplGlfw_InstallEmscriptenCanvasResizeCallback("#canvas"); +#endif +    ImGui_ImplOpenGL3_Init(glsl_version); + +    // 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 \\ ! +    // - Our Emscripten build process allows embedding fonts to be accessible at runtime from the "fonts/" folder. See Makefile.emscripten for details. +    //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); + +    // Main loop +#ifdef __EMSCRIPTEN__ +    // For an Emscripten build we are disabling file-system access, so let's not attempt to do a fopen() of the imgui.ini file. +    // You may manually call LoadIniSettingsFromMemory() to load settings from your own storage. +    io.IniFilename = nullptr; +    EMSCRIPTEN_MAINLOOP_BEGIN +#else +    while (!glfwWindowShouldClose(window)) +#endif +    { +        // Poll and handle events (inputs, window resize, etc.) +        // 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. +        glfwPollEvents(); + +        // Start the Dear ImGui frame +        ImGui_ImplOpenGL3_NewFrame(); +        ImGui_ImplGlfw_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); + +        // 2. Show a simple window that we create ourselves. We use a Begin/End pair to create a named window. +        { +            static float f = 0.0f; +            static int counter = 0; + +            ImGui::Begin("Hello, world!");                          // Create a window called "Hello, world!" and append into it. + +            ImGui::Text("This is some useful text.");               // Display some text (you can use a format strings too) +            ImGui::Checkbox("Demo Window", &show_demo_window);      // Edit bools storing our window open/close state +            ImGui::Checkbox("Another Window", &show_another_window); + +            ImGui::SliderFloat("float", &f, 0.0f, 1.0f);            // Edit 1 float using a slider from 0.0f to 1.0f +            ImGui::ColorEdit3("clear color", (float*)&clear_color); // Edit 3 floats representing a color + +            if (ImGui::Button("Button"))                            // Buttons return true when clicked (most widgets return true when edited/activated) +                counter++; +            ImGui::SameLine(); +            ImGui::Text("counter = %d", counter); + +            ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / io.Framerate, io.Framerate); +            ImGui::End(); +        } + +        // 3. Show another simple window. +        if (show_another_window) +        { +            ImGui::Begin("Another Window", &show_another_window);   // Pass a pointer to our bool variable (the window will have a closing button that will clear the bool when clicked) +            ImGui::Text("Hello from another window!"); +            if (ImGui::Button("Close Me")) +                show_another_window = false; +            ImGui::End(); +        } + +        // Rendering +        ImGui::Render(); +        int display_w, display_h; +        glfwGetFramebufferSize(window, &display_w, &display_h); +        glViewport(0, 0, display_w, display_h); +        glClearColor(clear_color.x * clear_color.w, clear_color.y * clear_color.w, clear_color.z * clear_color.w, clear_color.w); +        glClear(GL_COLOR_BUFFER_BIT); +        ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData()); + +        glfwSwapBuffers(window); +    } +#ifdef __EMSCRIPTEN__ +    EMSCRIPTEN_MAINLOOP_END; +#endif + +    // Cleanup +    ImGui_ImplOpenGL3_Shutdown(); +    ImGui_ImplGlfw_Shutdown(); +    ImGui::DestroyContext(); + +    glfwDestroyWindow(window); +    glfwTerminate(); + +    return 0; +} diff --git a/lib/imgui-1.90.7/examples/example_glfw_vulkan/CMakeLists.txt b/lib/imgui-1.90.7/examples/example_glfw_vulkan/CMakeLists.txt new file mode 100644 index 0000000..a6e5bf9 --- /dev/null +++ b/lib/imgui-1.90.7/examples/example_glfw_vulkan/CMakeLists.txt @@ -0,0 +1,45 @@ +# Example usage: +#  mkdir build +#  cd build +#  cmake -g "Visual Studio 14 2015" .. + +cmake_minimum_required(VERSION 2.8) +project(imgui_example_glfw_vulkan C CXX) + +if(NOT CMAKE_BUILD_TYPE) +  set(CMAKE_BUILD_TYPE Debug CACHE STRING "" FORCE) +endif() + +set(CMAKE_CXX_STANDARD 11) +set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DVK_PROTOTYPES") +set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DVK_PROTOTYPES") + +# GLFW +set(GLFW_DIR ../../../glfw) # Set this to point to an up-to-date GLFW repo +option(GLFW_BUILD_EXAMPLES "Build the GLFW example programs" OFF) +option(GLFW_BUILD_TESTS "Build the GLFW test programs" OFF) +option(GLFW_BUILD_DOCS "Build the GLFW documentation" OFF) +option(GLFW_INSTALL "Generate installation target" OFF) +option(GLFW_DOCUMENT_INTERNALS "Include internals in documentation" OFF) +add_subdirectory(${GLFW_DIR} binary_dir EXCLUDE_FROM_ALL) +include_directories(${GLFW_DIR}/include) + +# Dear ImGui +set(IMGUI_DIR ../../) +include_directories(${IMGUI_DIR} ${IMGUI_DIR}/backends ..) + +# Libraries +find_package(Vulkan REQUIRED) +#find_library(VULKAN_LIBRARY +  #NAMES vulkan vulkan-1) +#set(LIBRARIES "glfw;${VULKAN_LIBRARY}") +set(LIBRARIES "glfw;Vulkan::Vulkan") + +# Use vulkan headers from glfw: +include_directories(${GLFW_DIR}/deps) + +file(GLOB sources *.cpp) + +add_executable(example_glfw_vulkan ${sources} ${IMGUI_DIR}/backends/imgui_impl_glfw.cpp ${IMGUI_DIR}/backends/imgui_impl_vulkan.cpp ${IMGUI_DIR}/imgui.cpp ${IMGUI_DIR}/imgui_draw.cpp ${IMGUI_DIR}/imgui_demo.cpp ${IMGUI_DIR}/imgui_tables.cpp ${IMGUI_DIR}/imgui_widgets.cpp) +target_link_libraries(example_glfw_vulkan ${LIBRARIES}) +target_compile_definitions(example_glfw_vulkan PUBLIC -DImTextureID=ImU64) diff --git a/lib/imgui-1.90.7/examples/example_glfw_vulkan/build_win32.bat b/lib/imgui-1.90.7/examples/example_glfw_vulkan/build_win32.bat new file mode 100644 index 0000000..be92398 --- /dev/null +++ b/lib/imgui-1.90.7/examples/example_glfw_vulkan/build_win32.bat @@ -0,0 +1,14 @@ +@REM Build for Visual Studio compiler. Run your copy of vcvars32.bat or vcvarsall.bat to setup command-line compiler. + +@set OUT_EXE=example_glfw_vulkan +@set INCLUDES=/I..\.. /I..\..\backends /I..\libs\glfw\include /I %VULKAN_SDK%\include +@set SOURCES=main.cpp ..\..\backends\imgui_impl_vulkan.cpp ..\..\backends\imgui_impl_glfw.cpp ..\..\imgui*.cpp +@set LIBS=/LIBPATH:..\libs\glfw\lib-vc2010-32 /libpath:%VULKAN_SDK%\lib32 glfw3.lib opengl32.lib gdi32.lib shell32.lib vulkan-1.lib + +@set OUT_DIR=Debug +mkdir %OUT_DIR% +cl /nologo /Zi /MD /utf-8 %INCLUDES% /D ImTextureID=ImU64 %SOURCES% /Fe%OUT_DIR%/%OUT_EXE%.exe /Fo%OUT_DIR%/ /link %LIBS% + +@set OUT_DIR=Release +mkdir %OUT_DIR% +cl /nologo /Zi /MD /utf-8 /Ox /Oi %INCLUDES% /D ImTextureID=ImU64 %SOURCES% /Fe%OUT_DIR%/%OUT_EXE%.exe /Fo%OUT_DIR%/ /link %LIBS% diff --git a/lib/imgui-1.90.7/examples/example_glfw_vulkan/build_win64.bat b/lib/imgui-1.90.7/examples/example_glfw_vulkan/build_win64.bat new file mode 100644 index 0000000..c60b027 --- /dev/null +++ b/lib/imgui-1.90.7/examples/example_glfw_vulkan/build_win64.bat @@ -0,0 +1,13 @@ +@REM Build for Visual Studio compiler. Run your copy of amd64/vcvars32.bat to setup 64-bit command-line compiler. + +@set INCLUDES=/I..\.. /I..\..\backends /I..\libs\glfw\include /I %VULKAN_SDK%\include +@set SOURCES=main.cpp ..\..\backends\imgui_impl_vulkan.cpp ..\..\backends\imgui_impl_glfw.cpp ..\..\imgui*.cpp +@set LIBS=/LIBPATH:..\libs\glfw\lib-vc2010-64 /libpath:%VULKAN_SDK%\lib glfw3.lib opengl32.lib gdi32.lib shell32.lib vulkan-1.lib + +@set OUT_DIR=Debug +mkdir %OUT_DIR% +cl /nologo /Zi /MD /utf-8 %INCLUDES% /D ImTextureID=ImU64 %SOURCES% /Fe%OUT_DIR%/%OUT_EXE%.exe /Fo%OUT_DIR%/ /link %LIBS% + +@set OUT_DIR=Release +mkdir %OUT_DIR% +cl /nologo /Zi /MD /utf-8 /Ox /Oi %INCLUDES% /D ImTextureID=ImU64 %SOURCES% /Fe%OUT_DIR%/%OUT_EXE%.exe /Fo%OUT_DIR%/ /link %LIBS% diff --git a/lib/imgui-1.90.7/examples/example_glfw_vulkan/example_glfw_vulkan.vcxproj b/lib/imgui-1.90.7/examples/example_glfw_vulkan/example_glfw_vulkan.vcxproj new file mode 100644 index 0000000..d0d1c5f --- /dev/null +++ b/lib/imgui-1.90.7/examples/example_glfw_vulkan/example_glfw_vulkan.vcxproj @@ -0,0 +1,190 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> +  <ItemGroup Label="ProjectConfigurations"> +    <ProjectConfiguration Include="Debug|Win32"> +      <Configuration>Debug</Configuration> +      <Platform>Win32</Platform> +    </ProjectConfiguration> +    <ProjectConfiguration Include="Debug|x64"> +      <Configuration>Debug</Configuration> +      <Platform>x64</Platform> +    </ProjectConfiguration> +    <ProjectConfiguration Include="Release|Win32"> +      <Configuration>Release</Configuration> +      <Platform>Win32</Platform> +    </ProjectConfiguration> +    <ProjectConfiguration Include="Release|x64"> +      <Configuration>Release</Configuration> +      <Platform>x64</Platform> +    </ProjectConfiguration> +  </ItemGroup> +  <PropertyGroup Label="Globals"> +    <ProjectGuid>{57E2DF5A-6FC8-45BB-99DD-91A18C646E80}</ProjectGuid> +    <RootNamespace>example_glfw_vulkan</RootNamespace> +    <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion> +  </PropertyGroup> +  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> +  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> +    <ConfigurationType>Application</ConfigurationType> +    <UseDebugLibraries>true</UseDebugLibraries> +    <CharacterSet>MultiByte</CharacterSet> +    <PlatformToolset>v140</PlatformToolset> +  </PropertyGroup> +  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration"> +    <ConfigurationType>Application</ConfigurationType> +    <UseDebugLibraries>true</UseDebugLibraries> +    <CharacterSet>MultiByte</CharacterSet> +    <PlatformToolset>v140</PlatformToolset> +  </PropertyGroup> +  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration"> +    <ConfigurationType>Application</ConfigurationType> +    <UseDebugLibraries>false</UseDebugLibraries> +    <WholeProgramOptimization>true</WholeProgramOptimization> +    <CharacterSet>MultiByte</CharacterSet> +    <PlatformToolset>v140</PlatformToolset> +  </PropertyGroup> +  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration"> +    <ConfigurationType>Application</ConfigurationType> +    <UseDebugLibraries>false</UseDebugLibraries> +    <WholeProgramOptimization>true</WholeProgramOptimization> +    <CharacterSet>MultiByte</CharacterSet> +    <PlatformToolset>v140</PlatformToolset> +  </PropertyGroup> +  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> +  <ImportGroup Label="ExtensionSettings"> +  </ImportGroup> +  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> +    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> +  </ImportGroup> +  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets"> +    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> +  </ImportGroup> +  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> +    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> +  </ImportGroup> +  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets"> +    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> +  </ImportGroup> +  <PropertyGroup Label="UserMacros" /> +  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> +    <OutDir>$(ProjectDir)$(Configuration)\</OutDir> +    <IntDir>$(ProjectDir)$(Configuration)\</IntDir> +    <IncludePath>$(IncludePath)</IncludePath> +  </PropertyGroup> +  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> +    <OutDir>$(ProjectDir)$(Configuration)\</OutDir> +    <IntDir>$(ProjectDir)$(Configuration)\</IntDir> +    <IncludePath>$(IncludePath)</IncludePath> +  </PropertyGroup> +  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> +    <OutDir>$(ProjectDir)$(Configuration)\</OutDir> +    <IntDir>$(ProjectDir)$(Configuration)\</IntDir> +    <IncludePath>$(IncludePath)</IncludePath> +  </PropertyGroup> +  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> +    <OutDir>$(ProjectDir)$(Configuration)\</OutDir> +    <IntDir>$(ProjectDir)$(Configuration)\</IntDir> +    <IncludePath>$(IncludePath)</IncludePath> +  </PropertyGroup> +  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> +    <ClCompile> +      <WarningLevel>Level4</WarningLevel> +      <Optimization>Disabled</Optimization> +      <AdditionalIncludeDirectories>..\..;..\..\backends;%VULKAN_SDK%\include;..\libs\glfw\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> +      <PreprocessorDefinitions>ImTextureID=ImU64;_MBCS;%(PreprocessorDefinitions)</PreprocessorDefinitions> +      <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions> +    </ClCompile> +    <Link> +      <GenerateDebugInformation>true</GenerateDebugInformation> +      <AdditionalLibraryDirectories>%VULKAN_SDK%\lib32;..\libs\glfw\lib-vc2010-32;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> +      <AdditionalDependencies>vulkan-1.lib;glfw3.lib;%(AdditionalDependencies)</AdditionalDependencies> +      <SubSystem>Console</SubSystem> +      <IgnoreSpecificDefaultLibraries>msvcrt.lib</IgnoreSpecificDefaultLibraries> +    </Link> +  </ItemDefinitionGroup> +  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> +    <ClCompile> +      <WarningLevel>Level4</WarningLevel> +      <Optimization>Disabled</Optimization> +      <AdditionalIncludeDirectories>..\..;..\..\backends;%VULKAN_SDK%\include;..\libs\glfw\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> +      <PreprocessorDefinitions>ImTextureID=ImU64;_MBCS;%(PreprocessorDefinitions)</PreprocessorDefinitions> +      <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions> +    </ClCompile> +    <Link> +      <GenerateDebugInformation>true</GenerateDebugInformation> +      <AdditionalLibraryDirectories>%VULKAN_SDK%\lib;..\libs\glfw\lib-vc2010-64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> +      <AdditionalDependencies>vulkan-1.lib;glfw3.lib;%(AdditionalDependencies)</AdditionalDependencies> +      <SubSystem>Console</SubSystem> +      <IgnoreSpecificDefaultLibraries>msvcrt.lib</IgnoreSpecificDefaultLibraries> +    </Link> +  </ItemDefinitionGroup> +  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> +    <ClCompile> +      <WarningLevel>Level4</WarningLevel> +      <Optimization>MaxSpeed</Optimization> +      <FunctionLevelLinking>true</FunctionLevelLinking> +      <IntrinsicFunctions>true</IntrinsicFunctions> +      <AdditionalIncludeDirectories>..\..;..\..\backends;%VULKAN_SDK%\include;..\libs\glfw\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> +      <BufferSecurityCheck>false</BufferSecurityCheck> +      <PreprocessorDefinitions>ImTextureID=ImU64;_MBCS;%(PreprocessorDefinitions)</PreprocessorDefinitions> +      <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions> +    </ClCompile> +    <Link> +      <GenerateDebugInformation>true</GenerateDebugInformation> +      <EnableCOMDATFolding>true</EnableCOMDATFolding> +      <OptimizeReferences>true</OptimizeReferences> +      <AdditionalLibraryDirectories>%VULKAN_SDK%\lib32;..\libs\glfw\lib-vc2010-32;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> +      <AdditionalDependencies>vulkan-1.lib;glfw3.lib;%(AdditionalDependencies)</AdditionalDependencies> +      <SubSystem>Console</SubSystem> +      <IgnoreSpecificDefaultLibraries> +      </IgnoreSpecificDefaultLibraries> +    </Link> +  </ItemDefinitionGroup> +  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> +    <ClCompile> +      <WarningLevel>Level4</WarningLevel> +      <Optimization>MaxSpeed</Optimization> +      <FunctionLevelLinking>true</FunctionLevelLinking> +      <IntrinsicFunctions>true</IntrinsicFunctions> +      <AdditionalIncludeDirectories>..\..;..\..\backends;%VULKAN_SDK%\include;..\libs\glfw\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> +      <BufferSecurityCheck>false</BufferSecurityCheck> +      <PreprocessorDefinitions>ImTextureID=ImU64;_MBCS;%(PreprocessorDefinitions)</PreprocessorDefinitions> +      <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions> +    </ClCompile> +    <Link> +      <GenerateDebugInformation>true</GenerateDebugInformation> +      <EnableCOMDATFolding>true</EnableCOMDATFolding> +      <OptimizeReferences>true</OptimizeReferences> +      <AdditionalLibraryDirectories>%VULKAN_SDK%\lib;..\libs\glfw\lib-vc2010-64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> +      <AdditionalDependencies>vulkan-1.lib;glfw3.lib;%(AdditionalDependencies)</AdditionalDependencies> +      <SubSystem>Console</SubSystem> +      <IgnoreSpecificDefaultLibraries> +      </IgnoreSpecificDefaultLibraries> +    </Link> +  </ItemDefinitionGroup> +  <ItemGroup> +    <ClCompile Include="..\..\imgui.cpp" /> +    <ClCompile Include="..\..\imgui_demo.cpp" /> +    <ClCompile Include="..\..\imgui_draw.cpp" /> +    <ClCompile Include="..\..\imgui_tables.cpp" /> +    <ClCompile Include="..\..\imgui_widgets.cpp" /> +    <ClCompile Include="..\..\backends\imgui_impl_glfw.cpp" /> +    <ClCompile Include="..\..\backends\imgui_impl_vulkan.cpp" /> +    <ClCompile Include="main.cpp" /> +  </ItemGroup> +  <ItemGroup> +    <ClInclude Include="..\..\imconfig.h" /> +    <ClInclude Include="..\..\imgui.h" /> +    <ClInclude Include="..\..\imgui_internal.h" /> +    <ClInclude Include="..\..\backends\imgui_impl_glfw.h" /> +    <ClInclude Include="..\..\backends\imgui_impl_vulkan.h" /> +  </ItemGroup> +  <ItemGroup> +    <None Include="..\..\misc\debuggers\imgui.natstepfilter" /> +    <None Include="..\..\misc\debuggers\imgui.natvis" /> +    <None Include="..\README.txt" /> +  </ItemGroup> +  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> +  <ImportGroup Label="ExtensionTargets"> +  </ImportGroup> +</Project>
\ No newline at end of file diff --git a/lib/imgui-1.90.7/examples/example_glfw_vulkan/example_glfw_vulkan.vcxproj.filters b/lib/imgui-1.90.7/examples/example_glfw_vulkan/example_glfw_vulkan.vcxproj.filters new file mode 100644 index 0000000..510fc85 --- /dev/null +++ b/lib/imgui-1.90.7/examples/example_glfw_vulkan/example_glfw_vulkan.vcxproj.filters @@ -0,0 +1,64 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> +  <ItemGroup> +    <Filter Include="imgui"> +      <UniqueIdentifier>{20b90ce4-7fcb-4731-b9a0-075f875de82d}</UniqueIdentifier> +    </Filter> +    <Filter Include="sources"> +      <UniqueIdentifier>{f18ab499-84e1-499f-8eff-9754361e0e52}</UniqueIdentifier> +      <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions> +    </Filter> +  </ItemGroup> +  <ItemGroup> +    <ClCompile Include="main.cpp"> +      <Filter>sources</Filter> +    </ClCompile> +    <ClCompile Include="..\..\imgui.cpp"> +      <Filter>imgui</Filter> +    </ClCompile> +    <ClCompile Include="..\..\imgui_demo.cpp"> +      <Filter>imgui</Filter> +    </ClCompile> +    <ClCompile Include="..\..\imgui_draw.cpp"> +      <Filter>imgui</Filter> +    </ClCompile> +    <ClCompile Include="..\..\imgui_tables.cpp"> +      <Filter>imgui</Filter> +    </ClCompile> +    <ClCompile Include="..\..\imgui_widgets.cpp"> +      <Filter>imgui</Filter> +    </ClCompile> +    <ClCompile Include="..\..\backends\imgui_impl_glfw.cpp"> +      <Filter>sources</Filter> +    </ClCompile> +    <ClCompile Include="..\..\backends\imgui_impl_vulkan.cpp"> +      <Filter>sources</Filter> +    </ClCompile> +  </ItemGroup> +  <ItemGroup> +    <ClInclude Include="..\..\imconfig.h"> +      <Filter>imgui</Filter> +    </ClInclude> +    <ClInclude Include="..\..\imgui.h"> +      <Filter>imgui</Filter> +    </ClInclude> +    <ClInclude Include="..\..\imgui_internal.h"> +      <Filter>imgui</Filter> +    </ClInclude> +    <ClInclude Include="..\..\backends\imgui_impl_glfw.h"> +      <Filter>sources</Filter> +    </ClInclude> +    <ClInclude Include="..\..\backends\imgui_impl_vulkan.h"> +      <Filter>sources</Filter> +    </ClInclude> +  </ItemGroup> +  <ItemGroup> +    <None Include="..\README.txt" /> +    <None Include="..\..\misc\debuggers\imgui.natvis"> +      <Filter>imgui</Filter> +    </None> +    <None Include="..\..\misc\debuggers\imgui.natstepfilter"> +      <Filter>imgui</Filter> +    </None> +  </ItemGroup> +</Project>
\ No newline at end of file diff --git a/lib/imgui-1.90.7/examples/example_glfw_vulkan/main.cpp b/lib/imgui-1.90.7/examples/example_glfw_vulkan/main.cpp new file mode 100644 index 0000000..b6e53ed --- /dev/null +++ b/lib/imgui-1.90.7/examples/example_glfw_vulkan/main.cpp @@ -0,0 +1,572 @@ +// Dear ImGui: standalone example application for Glfw + Vulkan + +// 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 + +// Important note to the reader who wish to integrate imgui_impl_vulkan.cpp/.h in their own engine/app. +// - Common ImGui_ImplVulkan_XXX functions and structures are used to interface with imgui_impl_vulkan.cpp/.h. +//   You will use those if you want to use this rendering backend in your engine/app. +// - Helper ImGui_ImplVulkanH_XXX functions and structures are only used by this example (main.cpp) and by +//   the backend itself (imgui_impl_vulkan.cpp), but should PROBABLY NOT be used by your own engine/app code. +// Read comments in imgui_impl_vulkan.h. + +#include "imgui.h" +#include "imgui_impl_glfw.h" +#include "imgui_impl_vulkan.h" +#include <stdio.h>          // printf, fprintf +#include <stdlib.h>         // abort +#define GLFW_INCLUDE_NONE +#define GLFW_INCLUDE_VULKAN +#include <GLFW/glfw3.h> + +// Volk headers +#ifdef IMGUI_IMPL_VULKAN_USE_VOLK +#define VOLK_IMPLEMENTATION +#include <Volk/volk.h> +#endif + +// [Win32] Our example includes a copy of glfw3.lib pre-compiled with VS2010 to maximize ease of testing and compatibility with old VS compilers. +// To link with VS2010-era libraries, VS2015+ requires linking with legacy_stdio_definitions.lib, which we do using this pragma. +// Your own project should not be affected, as you are likely to link with a newer binary of GLFW that is adequate for your version of Visual Studio. +#if defined(_MSC_VER) && (_MSC_VER >= 1900) && !defined(IMGUI_DISABLE_WIN32_FUNCTIONS) +#pragma comment(lib, "legacy_stdio_definitions") +#endif + +//#define APP_USE_UNLIMITED_FRAME_RATE +#ifdef _DEBUG +#define APP_USE_VULKAN_DEBUG_REPORT +#endif + +// Data +static VkAllocationCallbacks*   g_Allocator = nullptr; +static VkInstance               g_Instance = VK_NULL_HANDLE; +static VkPhysicalDevice         g_PhysicalDevice = VK_NULL_HANDLE; +static VkDevice                 g_Device = VK_NULL_HANDLE; +static uint32_t                 g_QueueFamily = (uint32_t)-1; +static VkQueue                  g_Queue = VK_NULL_HANDLE; +static VkDebugReportCallbackEXT g_DebugReport = VK_NULL_HANDLE; +static VkPipelineCache          g_PipelineCache = VK_NULL_HANDLE; +static VkDescriptorPool         g_DescriptorPool = VK_NULL_HANDLE; + +static ImGui_ImplVulkanH_Window g_MainWindowData; +static int                      g_MinImageCount = 2; +static bool                     g_SwapChainRebuild = false; + +static void glfw_error_callback(int error, const char* description) +{ +    fprintf(stderr, "GLFW Error %d: %s\n", error, description); +} +static void check_vk_result(VkResult err) +{ +    if (err == 0) +        return; +    fprintf(stderr, "[vulkan] Error: VkResult = %d\n", err); +    if (err < 0) +        abort(); +} + +#ifdef APP_USE_VULKAN_DEBUG_REPORT +static VKAPI_ATTR VkBool32 VKAPI_CALL debug_report(VkDebugReportFlagsEXT flags, VkDebugReportObjectTypeEXT objectType, uint64_t object, size_t location, int32_t messageCode, const char* pLayerPrefix, const char* pMessage, void* pUserData) +{ +    (void)flags; (void)object; (void)location; (void)messageCode; (void)pUserData; (void)pLayerPrefix; // Unused arguments +    fprintf(stderr, "[vulkan] Debug report from ObjectType: %i\nMessage: %s\n\n", objectType, pMessage); +    return VK_FALSE; +} +#endif // APP_USE_VULKAN_DEBUG_REPORT + +static bool IsExtensionAvailable(const ImVector<VkExtensionProperties>& properties, const char* extension) +{ +    for (const VkExtensionProperties& p : properties) +        if (strcmp(p.extensionName, extension) == 0) +            return true; +    return false; +} + +static VkPhysicalDevice SetupVulkan_SelectPhysicalDevice() +{ +    uint32_t gpu_count; +    VkResult err = vkEnumeratePhysicalDevices(g_Instance, &gpu_count, nullptr); +    check_vk_result(err); +    IM_ASSERT(gpu_count > 0); + +    ImVector<VkPhysicalDevice> gpus; +    gpus.resize(gpu_count); +    err = vkEnumeratePhysicalDevices(g_Instance, &gpu_count, gpus.Data); +    check_vk_result(err); + +    // If a number >1 of GPUs got reported, find discrete GPU if present, or use first one available. This covers +    // most common cases (multi-gpu/integrated+dedicated graphics). Handling more complicated setups (multiple +    // dedicated GPUs) is out of scope of this sample. +    for (VkPhysicalDevice& device : gpus) +    { +        VkPhysicalDeviceProperties properties; +        vkGetPhysicalDeviceProperties(device, &properties); +        if (properties.deviceType == VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU) +            return device; +    } + +    // Use first GPU (Integrated) is a Discrete one is not available. +    if (gpu_count > 0) +        return gpus[0]; +    return VK_NULL_HANDLE; +} + +static void SetupVulkan(ImVector<const char*> instance_extensions) +{ +    VkResult err; +#ifdef IMGUI_IMPL_VULKAN_USE_VOLK +    volkInitialize(); +#endif + +    // Create Vulkan Instance +    { +        VkInstanceCreateInfo create_info = {}; +        create_info.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO; + +        // Enumerate available extensions +        uint32_t properties_count; +        ImVector<VkExtensionProperties> properties; +        vkEnumerateInstanceExtensionProperties(nullptr, &properties_count, nullptr); +        properties.resize(properties_count); +        err = vkEnumerateInstanceExtensionProperties(nullptr, &properties_count, properties.Data); +        check_vk_result(err); + +        // Enable required extensions +        if (IsExtensionAvailable(properties, VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) +            instance_extensions.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME); +#ifdef VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME +        if (IsExtensionAvailable(properties, VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME)) +        { +            instance_extensions.push_back(VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME); +            create_info.flags |= VK_INSTANCE_CREATE_ENUMERATE_PORTABILITY_BIT_KHR; +        } +#endif + +        // Enabling validation layers +#ifdef APP_USE_VULKAN_DEBUG_REPORT +        const char* layers[] = { "VK_LAYER_KHRONOS_validation" }; +        create_info.enabledLayerCount = 1; +        create_info.ppEnabledLayerNames = layers; +        instance_extensions.push_back("VK_EXT_debug_report"); +#endif + +        // Create Vulkan Instance +        create_info.enabledExtensionCount = (uint32_t)instance_extensions.Size; +        create_info.ppEnabledExtensionNames = instance_extensions.Data; +        err = vkCreateInstance(&create_info, g_Allocator, &g_Instance); +        check_vk_result(err); +#ifdef IMGUI_IMPL_VULKAN_USE_VOLK +        volkLoadInstance(g_Instance); +#endif + +        // Setup the debug report callback +#ifdef APP_USE_VULKAN_DEBUG_REPORT +        auto f_vkCreateDebugReportCallbackEXT = (PFN_vkCreateDebugReportCallbackEXT)vkGetInstanceProcAddr(g_Instance, "vkCreateDebugReportCallbackEXT"); +        IM_ASSERT(f_vkCreateDebugReportCallbackEXT != nullptr); +        VkDebugReportCallbackCreateInfoEXT debug_report_ci = {}; +        debug_report_ci.sType = VK_STRUCTURE_TYPE_DEBUG_REPORT_CALLBACK_CREATE_INFO_EXT; +        debug_report_ci.flags = VK_DEBUG_REPORT_ERROR_BIT_EXT | VK_DEBUG_REPORT_WARNING_BIT_EXT | VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT; +        debug_report_ci.pfnCallback = debug_report; +        debug_report_ci.pUserData = nullptr; +        err = f_vkCreateDebugReportCallbackEXT(g_Instance, &debug_report_ci, g_Allocator, &g_DebugReport); +        check_vk_result(err); +#endif +    } + +    // Select Physical Device (GPU) +    g_PhysicalDevice = SetupVulkan_SelectPhysicalDevice(); + +    // Select graphics queue family +    { +        uint32_t count; +        vkGetPhysicalDeviceQueueFamilyProperties(g_PhysicalDevice, &count, nullptr); +        VkQueueFamilyProperties* queues = (VkQueueFamilyProperties*)malloc(sizeof(VkQueueFamilyProperties) * count); +        vkGetPhysicalDeviceQueueFamilyProperties(g_PhysicalDevice, &count, queues); +        for (uint32_t i = 0; i < count; i++) +            if (queues[i].queueFlags & VK_QUEUE_GRAPHICS_BIT) +            { +                g_QueueFamily = i; +                break; +            } +        free(queues); +        IM_ASSERT(g_QueueFamily != (uint32_t)-1); +    } + +    // Create Logical Device (with 1 queue) +    { +        ImVector<const char*> device_extensions; +        device_extensions.push_back("VK_KHR_swapchain"); + +        // Enumerate physical device extension +        uint32_t properties_count; +        ImVector<VkExtensionProperties> properties; +        vkEnumerateDeviceExtensionProperties(g_PhysicalDevice, nullptr, &properties_count, nullptr); +        properties.resize(properties_count); +        vkEnumerateDeviceExtensionProperties(g_PhysicalDevice, nullptr, &properties_count, properties.Data); +#ifdef VK_KHR_PORTABILITY_SUBSET_EXTENSION_NAME +        if (IsExtensionAvailable(properties, VK_KHR_PORTABILITY_SUBSET_EXTENSION_NAME)) +            device_extensions.push_back(VK_KHR_PORTABILITY_SUBSET_EXTENSION_NAME); +#endif + +        const float queue_priority[] = { 1.0f }; +        VkDeviceQueueCreateInfo queue_info[1] = {}; +        queue_info[0].sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO; +        queue_info[0].queueFamilyIndex = g_QueueFamily; +        queue_info[0].queueCount = 1; +        queue_info[0].pQueuePriorities = queue_priority; +        VkDeviceCreateInfo create_info = {}; +        create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO; +        create_info.queueCreateInfoCount = sizeof(queue_info) / sizeof(queue_info[0]); +        create_info.pQueueCreateInfos = queue_info; +        create_info.enabledExtensionCount = (uint32_t)device_extensions.Size; +        create_info.ppEnabledExtensionNames = device_extensions.Data; +        err = vkCreateDevice(g_PhysicalDevice, &create_info, g_Allocator, &g_Device); +        check_vk_result(err); +        vkGetDeviceQueue(g_Device, g_QueueFamily, 0, &g_Queue); +    } + +    // Create Descriptor Pool +    // The example only requires a single combined image sampler descriptor for the font image and only uses one descriptor set (for that) +    // If you wish to load e.g. additional textures you may need to alter pools sizes. +    { +        VkDescriptorPoolSize pool_sizes[] = +        { +            { VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1 }, +        }; +        VkDescriptorPoolCreateInfo pool_info = {}; +        pool_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO; +        pool_info.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT; +        pool_info.maxSets = 1; +        pool_info.poolSizeCount = (uint32_t)IM_ARRAYSIZE(pool_sizes); +        pool_info.pPoolSizes = pool_sizes; +        err = vkCreateDescriptorPool(g_Device, &pool_info, g_Allocator, &g_DescriptorPool); +        check_vk_result(err); +    } +} + +// All the ImGui_ImplVulkanH_XXX structures/functions are optional helpers used by the demo. +// Your real engine/app may not use them. +static void SetupVulkanWindow(ImGui_ImplVulkanH_Window* wd, VkSurfaceKHR surface, int width, int height) +{ +    wd->Surface = surface; + +    // Check for WSI support +    VkBool32 res; +    vkGetPhysicalDeviceSurfaceSupportKHR(g_PhysicalDevice, g_QueueFamily, wd->Surface, &res); +    if (res != VK_TRUE) +    { +        fprintf(stderr, "Error no WSI support on physical device 0\n"); +        exit(-1); +    } + +    // Select Surface Format +    const VkFormat requestSurfaceImageFormat[] = { VK_FORMAT_B8G8R8A8_UNORM, VK_FORMAT_R8G8B8A8_UNORM, VK_FORMAT_B8G8R8_UNORM, VK_FORMAT_R8G8B8_UNORM }; +    const VkColorSpaceKHR requestSurfaceColorSpace = VK_COLORSPACE_SRGB_NONLINEAR_KHR; +    wd->SurfaceFormat = ImGui_ImplVulkanH_SelectSurfaceFormat(g_PhysicalDevice, wd->Surface, requestSurfaceImageFormat, (size_t)IM_ARRAYSIZE(requestSurfaceImageFormat), requestSurfaceColorSpace); + +    // Select Present Mode +#ifdef APP_USE_UNLIMITED_FRAME_RATE +    VkPresentModeKHR present_modes[] = { VK_PRESENT_MODE_MAILBOX_KHR, VK_PRESENT_MODE_IMMEDIATE_KHR, VK_PRESENT_MODE_FIFO_KHR }; +#else +    VkPresentModeKHR present_modes[] = { VK_PRESENT_MODE_FIFO_KHR }; +#endif +    wd->PresentMode = ImGui_ImplVulkanH_SelectPresentMode(g_PhysicalDevice, wd->Surface, &present_modes[0], IM_ARRAYSIZE(present_modes)); +    //printf("[vulkan] Selected PresentMode = %d\n", wd->PresentMode); + +    // Create SwapChain, RenderPass, Framebuffer, etc. +    IM_ASSERT(g_MinImageCount >= 2); +    ImGui_ImplVulkanH_CreateOrResizeWindow(g_Instance, g_PhysicalDevice, g_Device, wd, g_QueueFamily, g_Allocator, width, height, g_MinImageCount); +} + +static void CleanupVulkan() +{ +    vkDestroyDescriptorPool(g_Device, g_DescriptorPool, g_Allocator); + +#ifdef APP_USE_VULKAN_DEBUG_REPORT +    // Remove the debug report callback +    auto f_vkDestroyDebugReportCallbackEXT = (PFN_vkDestroyDebugReportCallbackEXT)vkGetInstanceProcAddr(g_Instance, "vkDestroyDebugReportCallbackEXT"); +    f_vkDestroyDebugReportCallbackEXT(g_Instance, g_DebugReport, g_Allocator); +#endif // APP_USE_VULKAN_DEBUG_REPORT + +    vkDestroyDevice(g_Device, g_Allocator); +    vkDestroyInstance(g_Instance, g_Allocator); +} + +static void CleanupVulkanWindow() +{ +    ImGui_ImplVulkanH_DestroyWindow(g_Instance, g_Device, &g_MainWindowData, g_Allocator); +} + +static void FrameRender(ImGui_ImplVulkanH_Window* wd, ImDrawData* draw_data) +{ +    VkResult err; + +    VkSemaphore image_acquired_semaphore  = wd->FrameSemaphores[wd->SemaphoreIndex].ImageAcquiredSemaphore; +    VkSemaphore render_complete_semaphore = wd->FrameSemaphores[wd->SemaphoreIndex].RenderCompleteSemaphore; +    err = vkAcquireNextImageKHR(g_Device, wd->Swapchain, UINT64_MAX, image_acquired_semaphore, VK_NULL_HANDLE, &wd->FrameIndex); +    if (err == VK_ERROR_OUT_OF_DATE_KHR || err == VK_SUBOPTIMAL_KHR) +    { +        g_SwapChainRebuild = true; +        return; +    } +    check_vk_result(err); + +    ImGui_ImplVulkanH_Frame* fd = &wd->Frames[wd->FrameIndex]; +    { +        err = vkWaitForFences(g_Device, 1, &fd->Fence, VK_TRUE, UINT64_MAX);    // wait indefinitely instead of periodically checking +        check_vk_result(err); + +        err = vkResetFences(g_Device, 1, &fd->Fence); +        check_vk_result(err); +    } +    { +        err = vkResetCommandPool(g_Device, fd->CommandPool, 0); +        check_vk_result(err); +        VkCommandBufferBeginInfo info = {}; +        info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO; +        info.flags |= VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT; +        err = vkBeginCommandBuffer(fd->CommandBuffer, &info); +        check_vk_result(err); +    } +    { +        VkRenderPassBeginInfo info = {}; +        info.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO; +        info.renderPass = wd->RenderPass; +        info.framebuffer = fd->Framebuffer; +        info.renderArea.extent.width = wd->Width; +        info.renderArea.extent.height = wd->Height; +        info.clearValueCount = 1; +        info.pClearValues = &wd->ClearValue; +        vkCmdBeginRenderPass(fd->CommandBuffer, &info, VK_SUBPASS_CONTENTS_INLINE); +    } + +    // Record dear imgui primitives into command buffer +    ImGui_ImplVulkan_RenderDrawData(draw_data, fd->CommandBuffer); + +    // Submit command buffer +    vkCmdEndRenderPass(fd->CommandBuffer); +    { +        VkPipelineStageFlags wait_stage = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; +        VkSubmitInfo info = {}; +        info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO; +        info.waitSemaphoreCount = 1; +        info.pWaitSemaphores = &image_acquired_semaphore; +        info.pWaitDstStageMask = &wait_stage; +        info.commandBufferCount = 1; +        info.pCommandBuffers = &fd->CommandBuffer; +        info.signalSemaphoreCount = 1; +        info.pSignalSemaphores = &render_complete_semaphore; + +        err = vkEndCommandBuffer(fd->CommandBuffer); +        check_vk_result(err); +        err = vkQueueSubmit(g_Queue, 1, &info, fd->Fence); +        check_vk_result(err); +    } +} + +static void FramePresent(ImGui_ImplVulkanH_Window* wd) +{ +    if (g_SwapChainRebuild) +        return; +    VkSemaphore render_complete_semaphore = wd->FrameSemaphores[wd->SemaphoreIndex].RenderCompleteSemaphore; +    VkPresentInfoKHR info = {}; +    info.sType = VK_STRUCTURE_TYPE_PRESENT_INFO_KHR; +    info.waitSemaphoreCount = 1; +    info.pWaitSemaphores = &render_complete_semaphore; +    info.swapchainCount = 1; +    info.pSwapchains = &wd->Swapchain; +    info.pImageIndices = &wd->FrameIndex; +    VkResult err = vkQueuePresentKHR(g_Queue, &info); +    if (err == VK_ERROR_OUT_OF_DATE_KHR || err == VK_SUBOPTIMAL_KHR) +    { +        g_SwapChainRebuild = true; +        return; +    } +    check_vk_result(err); +    wd->SemaphoreIndex = (wd->SemaphoreIndex + 1) % wd->SemaphoreCount; // Now we can use the next set of semaphores +} + +// Main code +int main(int, char**) +{ +    glfwSetErrorCallback(glfw_error_callback); +    if (!glfwInit()) +        return 1; + +    // Create window with Vulkan context +    glfwWindowHint(GLFW_CLIENT_API, GLFW_NO_API); +    GLFWwindow* window = glfwCreateWindow(1280, 720, "Dear ImGui GLFW+Vulkan example", nullptr, nullptr); +    if (!glfwVulkanSupported()) +    { +        printf("GLFW: Vulkan Not Supported\n"); +        return 1; +    } + +    ImVector<const char*> extensions; +    uint32_t extensions_count = 0; +    const char** glfw_extensions = glfwGetRequiredInstanceExtensions(&extensions_count); +    for (uint32_t i = 0; i < extensions_count; i++) +        extensions.push_back(glfw_extensions[i]); +    SetupVulkan(extensions); + +    // Create Window Surface +    VkSurfaceKHR surface; +    VkResult err = glfwCreateWindowSurface(g_Instance, window, g_Allocator, &surface); +    check_vk_result(err); + +    // Create Framebuffers +    int w, h; +    glfwGetFramebufferSize(window, &w, &h); +    ImGui_ImplVulkanH_Window* wd = &g_MainWindowData; +    SetupVulkanWindow(wd, surface, w, h); + +    // 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_ImplGlfw_InitForVulkan(window, true); +    ImGui_ImplVulkan_InitInfo init_info = {}; +    init_info.Instance = g_Instance; +    init_info.PhysicalDevice = g_PhysicalDevice; +    init_info.Device = g_Device; +    init_info.QueueFamily = g_QueueFamily; +    init_info.Queue = g_Queue; +    init_info.PipelineCache = g_PipelineCache; +    init_info.DescriptorPool = g_DescriptorPool; +    init_info.RenderPass = wd->RenderPass; +    init_info.Subpass = 0; +    init_info.MinImageCount = g_MinImageCount; +    init_info.ImageCount = wd->ImageCount; +    init_info.MSAASamples = VK_SAMPLE_COUNT_1_BIT; +    init_info.Allocator = g_Allocator; +    init_info.CheckVkResultFn = check_vk_result; +    ImGui_ImplVulkan_Init(&init_info); + +    // 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); + +    // Main loop +    while (!glfwWindowShouldClose(window)) +    { +        // Poll and handle events (inputs, window resize, etc.) +        // 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. +        glfwPollEvents(); + +        // Resize swap chain? +        if (g_SwapChainRebuild) +        { +            int width, height; +            glfwGetFramebufferSize(window, &width, &height); +            if (width > 0 && height > 0) +            { +                ImGui_ImplVulkan_SetMinImageCount(g_MinImageCount); +                ImGui_ImplVulkanH_CreateOrResizeWindow(g_Instance, g_PhysicalDevice, g_Device, &g_MainWindowData, g_QueueFamily, g_Allocator, width, height, g_MinImageCount); +                g_MainWindowData.FrameIndex = 0; +                g_SwapChainRebuild = false; +            } +        } + +        // Start the Dear ImGui frame +        ImGui_ImplVulkan_NewFrame(); +        ImGui_ImplGlfw_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); + +        // 2. Show a simple window that we create ourselves. We use a Begin/End pair to create a named window. +        { +            static float f = 0.0f; +            static int counter = 0; + +            ImGui::Begin("Hello, world!");                          // Create a window called "Hello, world!" and append into it. + +            ImGui::Text("This is some useful text.");               // Display some text (you can use a format strings too) +            ImGui::Checkbox("Demo Window", &show_demo_window);      // Edit bools storing our window open/close state +            ImGui::Checkbox("Another Window", &show_another_window); + +            ImGui::SliderFloat("float", &f, 0.0f, 1.0f);            // Edit 1 float using a slider from 0.0f to 1.0f +            ImGui::ColorEdit3("clear color", (float*)&clear_color); // Edit 3 floats representing a color + +            if (ImGui::Button("Button"))                            // Buttons return true when clicked (most widgets return true when edited/activated) +                counter++; +            ImGui::SameLine(); +            ImGui::Text("counter = %d", counter); + +            ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / io.Framerate, io.Framerate); +            ImGui::End(); +        } + +        // 3. Show another simple window. +        if (show_another_window) +        { +            ImGui::Begin("Another Window", &show_another_window);   // Pass a pointer to our bool variable (the window will have a closing button that will clear the bool when clicked) +            ImGui::Text("Hello from another window!"); +            if (ImGui::Button("Close Me")) +                show_another_window = false; +            ImGui::End(); +        } + +        // Rendering +        ImGui::Render(); +        ImDrawData* draw_data = ImGui::GetDrawData(); +        const bool is_minimized = (draw_data->DisplaySize.x <= 0.0f || draw_data->DisplaySize.y <= 0.0f); +        if (!is_minimized) +        { +            wd->ClearValue.color.float32[0] = clear_color.x * clear_color.w; +            wd->ClearValue.color.float32[1] = clear_color.y * clear_color.w; +            wd->ClearValue.color.float32[2] = clear_color.z * clear_color.w; +            wd->ClearValue.color.float32[3] = clear_color.w; +            FrameRender(wd, draw_data); +            FramePresent(wd); +        } +    } + +    // Cleanup +    err = vkDeviceWaitIdle(g_Device); +    check_vk_result(err); +    ImGui_ImplVulkan_Shutdown(); +    ImGui_ImplGlfw_Shutdown(); +    ImGui::DestroyContext(); + +    CleanupVulkanWindow(); +    CleanupVulkan(); + +    glfwDestroyWindow(window); +    glfwTerminate(); + +    return 0; +} diff --git a/lib/imgui-1.90.7/examples/example_glfw_wgpu/CMakeLists.txt b/lib/imgui-1.90.7/examples/example_glfw_wgpu/CMakeLists.txt new file mode 100644 index 0000000..e682836 --- /dev/null +++ b/lib/imgui-1.90.7/examples/example_glfw_wgpu/CMakeLists.txt @@ -0,0 +1,100 @@ +# Building for desktop (WebGPU-native) with Dawn: +#  1. git clone https://github.com/google/dawn dawn +#  2. cmake -B build -DIMGUI_DAWN_DIR=dawn +#  3. cmake --build build +# The resulting binary will be found at one of the following locations: +#   * build/Debug/example_glfw_wgpu[.exe] +#   * build/example_glfw_wgpu[.exe] + +# Building for Emscripten: +#  1. Install Emscripten SDK following the instructions: https://emscripten.org/docs/getting_started/downloads.html +#  2. Install Ninja build system +#  3. emcmake cmake -G Ninja -B build +#  3. cmake --build build +#  4. emrun build/index.html + +cmake_minimum_required(VERSION 3.10.2) +project(imgui_example_glfw_wgpu C CXX) + +if(NOT CMAKE_BUILD_TYPE) +  set(CMAKE_BUILD_TYPE Debug CACHE STRING "" FORCE) +endif() + +set(CMAKE_CXX_STANDARD 17) # Dawn requires C++17 + +# Dear ImGui +set(IMGUI_DIR ../../) + +# Libraries +if(EMSCRIPTEN) +  set(LIBRARIES glfw) +  add_compile_options(-sDISABLE_EXCEPTION_CATCHING=1 -DIMGUI_DISABLE_FILE_FUNCTIONS=1) +else() +  # Dawn wgpu desktop +  set(DAWN_FETCH_DEPENDENCIES ON) +  set(IMGUI_DAWN_DIR CACHE PATH "Path to Dawn repository") +  if (NOT IMGUI_DAWN_DIR) +    message(FATAL_ERROR "Please specify the Dawn repository by setting IMGUI_DAWN_DIR") +  endif() + +  option(DAWN_FETCH_DEPENDENCIES "Use fetch_dawn_dependencies.py as an alternative to using depot_tools" ON) + +  # Dawn builds many things by default - disable things we don't need +  option(DAWN_BUILD_SAMPLES "Enables building Dawn's samples" OFF) +  option(TINT_BUILD_CMD_TOOLS "Build the Tint command line tools" OFF) +  option(TINT_BUILD_DOCS "Build documentation" OFF) +  option(TINT_BUILD_TESTS "Build tests" OFF) +  if (NOT APPLE) +    option(TINT_BUILD_MSL_WRITER "Build the MSL output writer" OFF) +  endif() +  if(WIN32) +    option(TINT_BUILD_SPV_READER "Build the SPIR-V input reader" OFF) +    option(TINT_BUILD_WGSL_READER "Build the WGSL input reader" ON) +    option(TINT_BUILD_GLSL_WRITER "Build the GLSL output writer" OFF) +    option(TINT_BUILD_GLSL_VALIDATOR "Build the GLSL output validator" OFF) +    option(TINT_BUILD_SPV_WRITER "Build the SPIR-V output writer" OFF) +    option(TINT_BUILD_WGSL_WRITER "Build the WGSL output writer" ON) +  endif() + +  add_subdirectory("${IMGUI_DAWN_DIR}" "${CMAKE_CURRENT_BINARY_DIR}/dawn" EXCLUDE_FROM_ALL) + +  set(LIBRARIES webgpu_dawn webgpu_cpp webgpu_glfw glfw) +endif() + +add_executable(example_glfw_wgpu +  main.cpp +  # backend files +  ${IMGUI_DIR}/backends/imgui_impl_glfw.cpp +  ${IMGUI_DIR}/backends/imgui_impl_wgpu.cpp +  # Dear ImGui files +  ${IMGUI_DIR}/imgui.cpp +  ${IMGUI_DIR}/imgui_draw.cpp +  ${IMGUI_DIR}/imgui_demo.cpp +  ${IMGUI_DIR}/imgui_tables.cpp +  ${IMGUI_DIR}/imgui_widgets.cpp +) +target_include_directories(example_glfw_wgpu PUBLIC +  ${IMGUI_DIR} +  ${IMGUI_DIR}/backends +) + +target_link_libraries(example_glfw_wgpu PUBLIC ${LIBRARIES}) + +# Emscripten settings +if(EMSCRIPTEN) +  target_link_options(example_glfw_wgpu PRIVATE +    "-sUSE_WEBGPU=1" +    "-sUSE_GLFW=3" +    "-sWASM=1" +    "-sALLOW_MEMORY_GROWTH=1" +    "-sNO_EXIT_RUNTIME=0" +    "-sASSERTIONS=1" +    "-sDISABLE_EXCEPTION_CATCHING=1" +    "-sNO_FILESYSTEM=1" +  ) +  set_target_properties(example_glfw_wgpu PROPERTIES OUTPUT_NAME "index") +  # copy our custom index.html to build directory +  add_custom_command(TARGET example_glfw_wgpu POST_BUILD +    COMMAND ${CMAKE_COMMAND} -E copy_if_different "${CMAKE_CURRENT_LIST_DIR}/web/index.html" $<TARGET_FILE_DIR:example_glfw_wgpu> +  ) +endif() diff --git a/lib/imgui-1.90.7/examples/example_glfw_wgpu/Makefile.emscripten b/lib/imgui-1.90.7/examples/example_glfw_wgpu/Makefile.emscripten new file mode 100644 index 0000000..5c79f0c --- /dev/null +++ b/lib/imgui-1.90.7/examples/example_glfw_wgpu/Makefile.emscripten @@ -0,0 +1,88 @@ +# +# Makefile to use with emscripten +# See https://emscripten.org/docs/getting_started/downloads.html +# for installation instructions. +# +# This Makefile assumes you have loaded emscripten's environment. +# (On Windows, you may need to execute emsdk_env.bat or encmdprompt.bat ahead) +# +# Running `make` will produce three files: +#  - web/index.html (current stored in the repository) +#  - web/index.js +#  - web/index.wasm +# +# All three are needed to run the demo. + +CC = emcc +CXX = em++ +WEB_DIR = web +EXE = $(WEB_DIR)/index.js +IMGUI_DIR = ../.. +SOURCES = main.cpp +SOURCES += $(IMGUI_DIR)/imgui.cpp $(IMGUI_DIR)/imgui_demo.cpp $(IMGUI_DIR)/imgui_draw.cpp $(IMGUI_DIR)/imgui_tables.cpp $(IMGUI_DIR)/imgui_widgets.cpp +SOURCES += $(IMGUI_DIR)/backends/imgui_impl_glfw.cpp $(IMGUI_DIR)/backends/imgui_impl_wgpu.cpp +OBJS = $(addsuffix .o, $(basename $(notdir $(SOURCES)))) +UNAME_S := $(shell uname -s) +CPPFLAGS = +LDFLAGS = +EMS = + +##--------------------------------------------------------------------- +## EMSCRIPTEN OPTIONS +##--------------------------------------------------------------------- + +# ("EMS" options gets added to both CPPFLAGS and LDFLAGS, whereas some options are for linker only) +EMS += -s DISABLE_EXCEPTION_CATCHING=1 +LDFLAGS += -s USE_GLFW=3 -s USE_WEBGPU=1 +LDFLAGS += -s WASM=1 -s ALLOW_MEMORY_GROWTH=1 -s NO_EXIT_RUNTIME=0 -s ASSERTIONS=1 + +# Emscripten allows preloading a file or folder to be accessible at runtime. +# The Makefile for this example project suggests embedding the misc/fonts/ folder into our application, it will then be accessible as "/fonts" +# See documentation for more details: https://emscripten.org/docs/porting/files/packaging_files.html +# (Default value is 0. Set to 1 to enable file-system and include the misc/fonts/ folder as part of the build.) +USE_FILE_SYSTEM ?= 0 +ifeq ($(USE_FILE_SYSTEM), 0) +LDFLAGS += -s NO_FILESYSTEM=1 +CPPFLAGS += -DIMGUI_DISABLE_FILE_FUNCTIONS +endif +ifeq ($(USE_FILE_SYSTEM), 1) +LDFLAGS += --no-heap-copy --preload-file ../../misc/fonts@/fonts +endif + +##--------------------------------------------------------------------- +## FINAL BUILD FLAGS +##--------------------------------------------------------------------- + +CPPFLAGS += -I$(IMGUI_DIR) -I$(IMGUI_DIR)/backends +#CPPFLAGS += -g +CPPFLAGS += -Wall -Wformat -Os $(EMS) +#LDFLAGS += --shell-file shell_minimal.html +LDFLAGS += $(EMS) + +##--------------------------------------------------------------------- +## BUILD RULES +##--------------------------------------------------------------------- + +%.o:%.cpp +	$(CXX) $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $< + +%.o:$(IMGUI_DIR)/%.cpp +	$(CXX) $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $< + +%.o:$(IMGUI_DIR)/backends/%.cpp +	$(CXX) $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $< + +all: $(EXE) +	@echo Build complete for $(EXE) + +$(WEB_DIR): +	mkdir $@ + +serve: all +	python3 -m http.server -d $(WEB_DIR) + +$(EXE): $(OBJS) $(WEB_DIR) +	$(CXX) -o $@ $(OBJS) $(LDFLAGS) + +clean: +	rm -f $(EXE) $(OBJS) $(WEB_DIR)/*.js $(WEB_DIR)/*.wasm $(WEB_DIR)/*.wasm.pre diff --git a/lib/imgui-1.90.7/examples/example_glfw_wgpu/README.md b/lib/imgui-1.90.7/examples/example_glfw_wgpu/README.md new file mode 100644 index 0000000..399d431 --- /dev/null +++ b/lib/imgui-1.90.7/examples/example_glfw_wgpu/README.md @@ -0,0 +1,24 @@ +## How to Build + +- You need to install Emscripten from https://emscripten.org/docs/getting_started/downloads.html, and have the environment variables set, as described in https://emscripten.org/docs/getting_started/downloads.html#installation-instructions + +- Depending on your configuration, in Windows you may need to run `emsdk/emsdk_env.bat` in your console to access the Emscripten command-line tools. + +- You may also refer to our [Continuous Integration setup](https://github.com/ocornut/imgui/tree/master/.github/workflows) for Emscripten setup. + +- Then build using `make -f Makefile.emscripten` while in the `example_glfw_wgpu/` directory. + +- Requires recent Emscripten as WGPU is still a work-in-progress API. + +## How to Run + +To run on a local machine: +- Make sure your browse supports WGPU and it is enabled. WGPU is still WIP not enabled by default in most browser. +- `make serve` will use Python3 to spawn a local webserver, you can then browse http://localhost:8000 to access your build. +- Otherwise, generally you will need a local webserver: +  - Quoting [https://emscripten.org/docs/getting_started](https://emscripten.org/docs/getting_started/Tutorial.html#generating-html):<br> +_"Unfortunately several browsers (including Chrome, Safari, and Internet Explorer) do not support file:// [XHR](https://emscripten.org/docs/site/glossary.html#term-xhr) requests, and can’t load extra files needed by the HTML (like a .wasm file, or packaged file data as mentioned lower down). For these browsers you’ll need to serve the files using a [local webserver](https://emscripten.org/docs/getting_started/FAQ.html#faq-local-webserver) and then open http://localhost:8000/hello.html."_ +  - Emscripten SDK has a handy `emrun` command: `emrun web/example_glfw_wgpu.html --browser firefox` which will spawn a temporary local webserver (in Firefox). See https://emscripten.org/docs/compiling/Running-html-files-with-emrun.html for details. +  - You may use Python 3 builtin webserver: `python -m http.server -d web` (this is what `make serve` uses). +  - You may use Python 2 builtin webserver: `cd web && python -m SimpleHTTPServer`. +  - If you are accessing the files over a network, certain browsers, such as Firefox, will restrict Gamepad API access to secure contexts only (e.g. https only). diff --git a/lib/imgui-1.90.7/examples/example_glfw_wgpu/main.cpp b/lib/imgui-1.90.7/examples/example_glfw_wgpu/main.cpp new file mode 100644 index 0000000..4e47b83 --- /dev/null +++ b/lib/imgui-1.90.7/examples/example_glfw_wgpu/main.cpp @@ -0,0 +1,345 @@ +// Dear ImGui: standalone example application for using GLFW + WebGPU +// - Emscripten is supported for publishing on web. See https://emscripten.org. +// - Dawn is used as a WebGPU implementation on desktop. + +// 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_glfw.h" +#include "imgui_impl_wgpu.h" +#include <stdio.h> + +#ifdef __EMSCRIPTEN__ +#include <emscripten.h> +#include <emscripten/html5.h> +#include <emscripten/html5_webgpu.h> +#else +#include <webgpu/webgpu_glfw.h> +#endif + +#include <GLFW/glfw3.h> +#include <webgpu/webgpu.h> +#include <webgpu/webgpu_cpp.h> + +// This example can also compile and run with Emscripten! See 'Makefile.emscripten' for details. +#ifdef __EMSCRIPTEN__ +#include "../libs/emscripten/emscripten_mainloop_stub.h" +#endif + +// Global WebGPU required states +static WGPUInstance      wgpu_instance = nullptr; +static WGPUDevice        wgpu_device = nullptr; +static WGPUSurface       wgpu_surface = nullptr; +static WGPUTextureFormat wgpu_preferred_fmt = WGPUTextureFormat_RGBA8Unorm; +static WGPUSwapChain     wgpu_swap_chain = nullptr; +static int               wgpu_swap_chain_width = 1280; +static int               wgpu_swap_chain_height = 720; + +// Forward declarations +static bool InitWGPU(GLFWwindow* window); +static void CreateSwapChain(int width, int height); + +static void glfw_error_callback(int error, const char* description) +{ +    printf("GLFW Error %d: %s\n", error, description); +} + +static void wgpu_error_callback(WGPUErrorType error_type, const char* message, void*) +{ +    const char* error_type_lbl = ""; +    switch (error_type) +    { +    case WGPUErrorType_Validation:  error_type_lbl = "Validation"; break; +    case WGPUErrorType_OutOfMemory: error_type_lbl = "Out of memory"; break; +    case WGPUErrorType_Unknown:     error_type_lbl = "Unknown"; break; +    case WGPUErrorType_DeviceLost:  error_type_lbl = "Device lost"; break; +    default:                        error_type_lbl = "Unknown"; +    } +    printf("%s error: %s\n", error_type_lbl, message); +} + +// Main code +int main(int, char**) +{ +    glfwSetErrorCallback(glfw_error_callback); +    if (!glfwInit()) +        return 1; + +    // Make sure GLFW does not initialize any graphics context. +    // This needs to be done explicitly later. +    glfwWindowHint(GLFW_CLIENT_API, GLFW_NO_API); +    GLFWwindow* window = glfwCreateWindow(wgpu_swap_chain_width, wgpu_swap_chain_height, "Dear ImGui GLFW+WebGPU example", nullptr, nullptr); +    if (window == nullptr) +        return 1; + +    // Initialize the WebGPU environment +    if (!InitWGPU(window)) +    { +        if (window) +            glfwDestroyWindow(window); +        glfwTerminate(); +        return 1; +    } +    CreateSwapChain(wgpu_swap_chain_width, wgpu_swap_chain_height); +    glfwShowWindow(window); + +    // 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_ImplGlfw_InitForOther(window, true); +#ifdef __EMSCRIPTEN__ +    ImGui_ImplGlfw_InstallEmscriptenCanvasResizeCallback("#canvas"); +#endif +    ImGui_ImplWGPU_InitInfo init_info; +    init_info.Device = wgpu_device; +    init_info.NumFramesInFlight = 3; +    init_info.RenderTargetFormat = wgpu_preferred_fmt; +    init_info.DepthStencilFormat = WGPUTextureFormat_Undefined; +    ImGui_ImplWGPU_Init(&init_info); + +    // 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 \\ ! +    // - Emscripten allows preloading a file or folder to be accessible at runtime. See Makefile for details. +    //io.Fonts->AddFontDefault(); +#ifndef IMGUI_DISABLE_FILE_FUNCTIONS +    //io.Fonts->AddFontFromFileTTF("fonts/segoeui.ttf", 18.0f); +    //io.Fonts->AddFontFromFileTTF("fonts/DroidSans.ttf", 16.0f); +    //io.Fonts->AddFontFromFileTTF("fonts/Roboto-Medium.ttf", 16.0f); +    //io.Fonts->AddFontFromFileTTF("fonts/Cousine-Regular.ttf", 15.0f); +    //io.Fonts->AddFontFromFileTTF("fonts/ProggyTiny.ttf", 10.0f); +    //ImFont* font = io.Fonts->AddFontFromFileTTF("fonts/ArialUni.ttf", 18.0f, nullptr, io.Fonts->GetGlyphRangesJapanese()); +    //IM_ASSERT(font != nullptr); +#endif + +    // Our state +    bool show_demo_window = true; +    bool show_another_window = false; +    ImVec4 clear_color = ImVec4(0.45f, 0.55f, 0.60f, 1.00f); + +    // Main loop +#ifdef __EMSCRIPTEN__ +    // For an Emscripten build we are disabling file-system access, so let's not attempt to do a fopen() of the imgui.ini file. +    // You may manually call LoadIniSettingsFromMemory() to load settings from your own storage. +    io.IniFilename = nullptr; +    EMSCRIPTEN_MAINLOOP_BEGIN +#else +    while (!glfwWindowShouldClose(window)) +#endif +    { +        // Poll and handle events (inputs, window resize, etc.) +        // 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. +        glfwPollEvents(); + +        // React to changes in screen size +        int width, height; +        glfwGetFramebufferSize((GLFWwindow*)window, &width, &height); +        if (width != wgpu_swap_chain_width || height != wgpu_swap_chain_height) +        { +            ImGui_ImplWGPU_InvalidateDeviceObjects(); +            CreateSwapChain(width, height); +            ImGui_ImplWGPU_CreateDeviceObjects(); +        } + +        // Start the Dear ImGui frame +        ImGui_ImplWGPU_NewFrame(); +        ImGui_ImplGlfw_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); + +        // 2. Show a simple window that we create ourselves. We use a Begin/End pair to create a named window. +        { +            static float f = 0.0f; +            static int counter = 0; + +            ImGui::Begin("Hello, world!");                                // Create a window called "Hello, world!" and append into it. + +            ImGui::Text("This is some useful text.");                     // Display some text (you can use a format strings too) +            ImGui::Checkbox("Demo Window", &show_demo_window);            // Edit bools storing our window open/close state +            ImGui::Checkbox("Another Window", &show_another_window); + +            ImGui::SliderFloat("float", &f, 0.0f, 1.0f);                  // Edit 1 float using a slider from 0.0f to 1.0f +            ImGui::ColorEdit3("clear color", (float*)&clear_color);       // Edit 3 floats representing a color + +            if (ImGui::Button("Button"))                                  // Buttons return true when clicked (most widgets return true when edited/activated) +                counter++; +            ImGui::SameLine(); +            ImGui::Text("counter = %d", counter); + +            ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / io.Framerate, io.Framerate); +            ImGui::End(); +        } + +        // 3. Show another simple window. +        if (show_another_window) +        { +            ImGui::Begin("Another Window", &show_another_window);         // Pass a pointer to our bool variable (the window will have a closing button that will clear the bool when clicked) +            ImGui::Text("Hello from another window!"); +            if (ImGui::Button("Close Me")) +                show_another_window = false; +            ImGui::End(); +        } + +        // Rendering +        ImGui::Render(); + +#ifndef __EMSCRIPTEN__ +        // Tick needs to be called in Dawn to display validation errors +        wgpuDeviceTick(wgpu_device); +#endif + +        WGPURenderPassColorAttachment color_attachments = {}; +        color_attachments.depthSlice = WGPU_DEPTH_SLICE_UNDEFINED; +        color_attachments.loadOp = WGPULoadOp_Clear; +        color_attachments.storeOp = WGPUStoreOp_Store; +        color_attachments.clearValue = { clear_color.x * clear_color.w, clear_color.y * clear_color.w, clear_color.z * clear_color.w, clear_color.w }; +        color_attachments.view = wgpuSwapChainGetCurrentTextureView(wgpu_swap_chain); + +        WGPURenderPassDescriptor render_pass_desc = {}; +        render_pass_desc.colorAttachmentCount = 1; +        render_pass_desc.colorAttachments = &color_attachments; +        render_pass_desc.depthStencilAttachment = nullptr; + +        WGPUCommandEncoderDescriptor enc_desc = {}; +        WGPUCommandEncoder encoder = wgpuDeviceCreateCommandEncoder(wgpu_device, &enc_desc); + +        WGPURenderPassEncoder pass = wgpuCommandEncoderBeginRenderPass(encoder, &render_pass_desc); +        ImGui_ImplWGPU_RenderDrawData(ImGui::GetDrawData(), pass); +        wgpuRenderPassEncoderEnd(pass); + +        WGPUCommandBufferDescriptor cmd_buffer_desc = {}; +        WGPUCommandBuffer cmd_buffer = wgpuCommandEncoderFinish(encoder, &cmd_buffer_desc); +        WGPUQueue queue = wgpuDeviceGetQueue(wgpu_device); +        wgpuQueueSubmit(queue, 1, &cmd_buffer); + +#ifndef __EMSCRIPTEN__ +        wgpuSwapChainPresent(wgpu_swap_chain); +#endif + +        wgpuTextureViewRelease(color_attachments.view); +        wgpuRenderPassEncoderRelease(pass); +        wgpuCommandEncoderRelease(encoder); +        wgpuCommandBufferRelease(cmd_buffer); +    } +#ifdef __EMSCRIPTEN__ +    EMSCRIPTEN_MAINLOOP_END; +#endif + +    // Cleanup +    ImGui_ImplWGPU_Shutdown(); +    ImGui_ImplGlfw_Shutdown(); +    ImGui::DestroyContext(); + +    glfwDestroyWindow(window); +    glfwTerminate(); + +    return 0; +} + +#ifndef __EMSCRIPTEN__ +static WGPUAdapter RequestAdapter(WGPUInstance instance) +{ +    auto onAdapterRequestEnded = [](WGPURequestAdapterStatus status, WGPUAdapter adapter, const char* message, void* pUserData) +    { +        if (status == WGPURequestAdapterStatus_Success) +            *(WGPUAdapter*)(pUserData) = adapter; +        else +            printf("Could not get WebGPU adapter: %s\n", message); +}; +    WGPUAdapter adapter; +    wgpuInstanceRequestAdapter(instance, nullptr, onAdapterRequestEnded, (void*)&adapter); +    return adapter; +} + +static WGPUDevice RequestDevice(WGPUAdapter& adapter) +{ +    auto onDeviceRequestEnded = [](WGPURequestDeviceStatus status, WGPUDevice device, const char* message, void* pUserData) +    { +        if (status == WGPURequestDeviceStatus_Success) +            *(WGPUDevice*)(pUserData) = device; +        else +            printf("Could not get WebGPU device: %s\n", message); +    }; +    WGPUDevice device; +    wgpuAdapterRequestDevice(adapter, nullptr, onDeviceRequestEnded, (void*)&device); +    return device; +} +#endif + +static bool InitWGPU(GLFWwindow* window) +{ +    wgpu::Instance instance = wgpuCreateInstance(nullptr); + +#ifdef __EMSCRIPTEN__ +    wgpu_device = emscripten_webgpu_get_device(); +    if (!wgpu_device) +        return false; +#else +    WGPUAdapter adapter = RequestAdapter(instance.Get()); +    if (!adapter) +        return false; +    wgpu_device = RequestDevice(adapter); +#endif + +#ifdef __EMSCRIPTEN__ +    wgpu::SurfaceDescriptorFromCanvasHTMLSelector html_surface_desc = {}; +    html_surface_desc.selector = "#canvas"; +    wgpu::SurfaceDescriptor surface_desc = {}; +    surface_desc.nextInChain = &html_surface_desc; +    wgpu::Surface surface = instance.CreateSurface(&surface_desc); + +    wgpu::Adapter adapter = {}; +    wgpu_preferred_fmt = (WGPUTextureFormat)surface.GetPreferredFormat(adapter); +#else +    wgpu::Surface surface = wgpu::glfw::CreateSurfaceForWindow(instance, window); +    if (!surface) +        return false; +    wgpu_preferred_fmt = WGPUTextureFormat_BGRA8Unorm; +#endif + +    wgpu_instance = instance.MoveToCHandle(); +    wgpu_surface = surface.MoveToCHandle(); + +    wgpuDeviceSetUncapturedErrorCallback(wgpu_device, wgpu_error_callback, nullptr); + +    return true; +} + +static void CreateSwapChain(int width, int height) +{ +    if (wgpu_swap_chain) +        wgpuSwapChainRelease(wgpu_swap_chain); +    wgpu_swap_chain_width = width; +    wgpu_swap_chain_height = height; +    WGPUSwapChainDescriptor swap_chain_desc = {}; +    swap_chain_desc.usage = WGPUTextureUsage_RenderAttachment; +    swap_chain_desc.format = wgpu_preferred_fmt; +    swap_chain_desc.width = width; +    swap_chain_desc.height = height; +    swap_chain_desc.presentMode = WGPUPresentMode_Fifo; +    wgpu_swap_chain = wgpuDeviceCreateSwapChain(wgpu_device, wgpu_surface, &swap_chain_desc); +} diff --git a/lib/imgui-1.90.7/examples/example_glut_opengl2/example_glut_opengl2.vcxproj b/lib/imgui-1.90.7/examples/example_glut_opengl2/example_glut_opengl2.vcxproj new file mode 100644 index 0000000..c56452b --- /dev/null +++ b/lib/imgui-1.90.7/examples/example_glut_opengl2/example_glut_opengl2.vcxproj @@ -0,0 +1,186 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> +  <ItemGroup Label="ProjectConfigurations"> +    <ProjectConfiguration Include="Debug|Win32"> +      <Configuration>Debug</Configuration> +      <Platform>Win32</Platform> +    </ProjectConfiguration> +    <ProjectConfiguration Include="Debug|x64"> +      <Configuration>Debug</Configuration> +      <Platform>x64</Platform> +    </ProjectConfiguration> +    <ProjectConfiguration Include="Release|Win32"> +      <Configuration>Release</Configuration> +      <Platform>Win32</Platform> +    </ProjectConfiguration> +    <ProjectConfiguration Include="Release|x64"> +      <Configuration>Release</Configuration> +      <Platform>x64</Platform> +    </ProjectConfiguration> +  </ItemGroup> +  <PropertyGroup Label="Globals"> +    <ProjectGuid>{F90D0333-5FB1-440D-918D-DD39A1B5187E}</ProjectGuid> +    <RootNamespace>example_glut_opengl2</RootNamespace> +    <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion> +  </PropertyGroup> +  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> +  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> +    <ConfigurationType>Application</ConfigurationType> +    <UseDebugLibraries>true</UseDebugLibraries> +    <CharacterSet>MultiByte</CharacterSet> +    <PlatformToolset>v140</PlatformToolset> +  </PropertyGroup> +  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration"> +    <ConfigurationType>Application</ConfigurationType> +    <UseDebugLibraries>true</UseDebugLibraries> +    <CharacterSet>MultiByte</CharacterSet> +    <PlatformToolset>v140</PlatformToolset> +  </PropertyGroup> +  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration"> +    <ConfigurationType>Application</ConfigurationType> +    <UseDebugLibraries>false</UseDebugLibraries> +    <WholeProgramOptimization>true</WholeProgramOptimization> +    <CharacterSet>MultiByte</CharacterSet> +    <PlatformToolset>v140</PlatformToolset> +  </PropertyGroup> +  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration"> +    <ConfigurationType>Application</ConfigurationType> +    <UseDebugLibraries>false</UseDebugLibraries> +    <WholeProgramOptimization>true</WholeProgramOptimization> +    <CharacterSet>MultiByte</CharacterSet> +    <PlatformToolset>v140</PlatformToolset> +  </PropertyGroup> +  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> +  <ImportGroup Label="ExtensionSettings"> +  </ImportGroup> +  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> +    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> +  </ImportGroup> +  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets"> +    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> +  </ImportGroup> +  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> +    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> +  </ImportGroup> +  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets"> +    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> +  </ImportGroup> +  <PropertyGroup Label="UserMacros" /> +  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> +    <OutDir>$(ProjectDir)$(Configuration)\</OutDir> +    <IntDir>$(ProjectDir)$(Configuration)\</IntDir> +    <IncludePath>$(IncludePath)</IncludePath> +  </PropertyGroup> +  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> +    <OutDir>$(ProjectDir)$(Configuration)\</OutDir> +    <IntDir>$(ProjectDir)$(Configuration)\</IntDir> +    <IncludePath>$(IncludePath)</IncludePath> +  </PropertyGroup> +  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> +    <OutDir>$(ProjectDir)$(Configuration)\</OutDir> +    <IntDir>$(ProjectDir)$(Configuration)\</IntDir> +    <IncludePath>$(IncludePath)</IncludePath> +  </PropertyGroup> +  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> +    <OutDir>$(ProjectDir)$(Configuration)\</OutDir> +    <IntDir>$(ProjectDir)$(Configuration)\</IntDir> +    <IncludePath>$(IncludePath)</IncludePath> +  </PropertyGroup> +  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> +    <ClCompile> +      <WarningLevel>Level4</WarningLevel> +      <Optimization>Disabled</Optimization> +      <AdditionalIncludeDirectories>$(GLUT_INCLUDE_DIR);..\..;..\..\backends;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> +      <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions> +    </ClCompile> +    <Link> +      <GenerateDebugInformation>true</GenerateDebugInformation> +      <AdditionalLibraryDirectories>$(GLUT_ROOT_PATH)/lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> +      <AdditionalDependencies>opengl32.lib;freeglut.lib;%(AdditionalDependencies)</AdditionalDependencies> +      <SubSystem>Console</SubSystem> +      <IgnoreSpecificDefaultLibraries>msvcrt.lib</IgnoreSpecificDefaultLibraries> +    </Link> +  </ItemDefinitionGroup> +  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> +    <ClCompile> +      <WarningLevel>Level4</WarningLevel> +      <Optimization>Disabled</Optimization> +      <AdditionalIncludeDirectories>$(GLUT_INCLUDE_DIR);..\..;..\..\backends;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> +      <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions> +    </ClCompile> +    <Link> +      <GenerateDebugInformation>true</GenerateDebugInformation> +      <AdditionalLibraryDirectories>$(GLUT_ROOT_PATH)/lib/x64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> +      <AdditionalDependencies>opengl32.lib;freeglut.lib;%(AdditionalDependencies)</AdditionalDependencies> +      <SubSystem>Console</SubSystem> +      <IgnoreSpecificDefaultLibraries>msvcrt.lib</IgnoreSpecificDefaultLibraries> +    </Link> +  </ItemDefinitionGroup> +  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> +    <ClCompile> +      <WarningLevel>Level4</WarningLevel> +      <Optimization>MaxSpeed</Optimization> +      <FunctionLevelLinking>true</FunctionLevelLinking> +      <IntrinsicFunctions>true</IntrinsicFunctions> +      <AdditionalIncludeDirectories>$(GLUT_INCLUDE_DIR);..\..;..\..\backends;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> +      <BufferSecurityCheck>false</BufferSecurityCheck> +      <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions> +    </ClCompile> +    <Link> +      <GenerateDebugInformation>true</GenerateDebugInformation> +      <EnableCOMDATFolding>true</EnableCOMDATFolding> +      <OptimizeReferences>true</OptimizeReferences> +      <AdditionalLibraryDirectories>$(GLUT_ROOT_PATH)/lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> +      <AdditionalDependencies>opengl32.lib;freeglut.lib;%(AdditionalDependencies)</AdditionalDependencies> +      <SubSystem>Console</SubSystem> +      <IgnoreSpecificDefaultLibraries> +      </IgnoreSpecificDefaultLibraries> +    </Link> +  </ItemDefinitionGroup> +  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> +    <ClCompile> +      <WarningLevel>Level4</WarningLevel> +      <Optimization>MaxSpeed</Optimization> +      <FunctionLevelLinking>true</FunctionLevelLinking> +      <IntrinsicFunctions>true</IntrinsicFunctions> +      <AdditionalIncludeDirectories>$(GLUT_INCLUDE_DIR);..\..;..\..\backends;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> +      <BufferSecurityCheck>false</BufferSecurityCheck> +      <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions> +    </ClCompile> +    <Link> +      <GenerateDebugInformation>true</GenerateDebugInformation> +      <EnableCOMDATFolding>true</EnableCOMDATFolding> +      <OptimizeReferences>true</OptimizeReferences> +      <AdditionalLibraryDirectories>$(GLUT_ROOT_PATH)/lib/x64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> +      <AdditionalDependencies>opengl32.lib;freeglut.lib;%(AdditionalDependencies)</AdditionalDependencies> +      <SubSystem>Console</SubSystem> +      <IgnoreSpecificDefaultLibraries> +      </IgnoreSpecificDefaultLibraries> +    </Link> +  </ItemDefinitionGroup> +  <ItemGroup> +    <ClCompile Include="..\..\imgui.cpp" /> +    <ClCompile Include="..\..\imgui_demo.cpp" /> +    <ClCompile Include="..\..\imgui_draw.cpp" /> +    <ClCompile Include="..\..\imgui_tables.cpp" /> +    <ClCompile Include="..\..\imgui_widgets.cpp" /> +    <ClCompile Include="..\..\backends\imgui_impl_glut.cpp" /> +    <ClCompile Include="..\..\backends\imgui_impl_opengl2.cpp" /> +    <ClCompile Include="main.cpp" /> +  </ItemGroup> +  <ItemGroup> +    <ClInclude Include="..\..\imconfig.h" /> +    <ClInclude Include="..\..\imgui.h" /> +    <ClInclude Include="..\..\imgui_internal.h" /> +    <ClInclude Include="..\..\backends\imgui_impl_glut.h" /> +    <ClInclude Include="..\..\backends\imgui_impl_opengl2.h" /> +  </ItemGroup> +  <ItemGroup> +    <None Include="..\..\misc\debuggers\imgui.natstepfilter" /> +    <None Include="..\..\misc\debuggers\imgui.natvis" /> +    <None Include="..\README.txt" /> +  </ItemGroup> +  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> +  <ImportGroup Label="ExtensionTargets"> +  </ImportGroup> +</Project>
\ No newline at end of file diff --git a/lib/imgui-1.90.7/examples/example_glut_opengl2/example_glut_opengl2.vcxproj.filters b/lib/imgui-1.90.7/examples/example_glut_opengl2/example_glut_opengl2.vcxproj.filters new file mode 100644 index 0000000..0ac4a0b --- /dev/null +++ b/lib/imgui-1.90.7/examples/example_glut_opengl2/example_glut_opengl2.vcxproj.filters @@ -0,0 +1,64 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> +  <ItemGroup> +    <Filter Include="imgui"> +      <UniqueIdentifier>{c336cfe3-f0c4-464c-9ef0-a9e17a7ff222}</UniqueIdentifier> +    </Filter> +    <Filter Include="sources"> +      <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier> +      <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions> +    </Filter> +  </ItemGroup> +  <ItemGroup> +    <ClCompile Include="main.cpp"> +      <Filter>sources</Filter> +    </ClCompile> +    <ClCompile Include="..\..\imgui.cpp"> +      <Filter>imgui</Filter> +    </ClCompile> +    <ClCompile Include="..\..\imgui_demo.cpp"> +      <Filter>imgui</Filter> +    </ClCompile> +    <ClCompile Include="..\..\imgui_draw.cpp"> +      <Filter>imgui</Filter> +    </ClCompile> +    <ClCompile Include="..\..\imgui_tables.cpp"> +      <Filter>imgui</Filter> +    </ClCompile> +    <ClCompile Include="..\..\imgui_widgets.cpp"> +      <Filter>imgui</Filter> +    </ClCompile> +    <ClCompile Include="..\..\backends\imgui_impl_glut.cpp"> +      <Filter>sources</Filter> +    </ClCompile> +    <ClCompile Include="..\..\backends\imgui_impl_opengl2.cpp"> +      <Filter>sources</Filter> +    </ClCompile> +  </ItemGroup> +  <ItemGroup> +    <ClInclude Include="..\..\imconfig.h"> +      <Filter>imgui</Filter> +    </ClInclude> +    <ClInclude Include="..\..\imgui.h"> +      <Filter>imgui</Filter> +    </ClInclude> +    <ClInclude Include="..\..\imgui_internal.h"> +      <Filter>imgui</Filter> +    </ClInclude> +    <ClInclude Include="..\..\backends\imgui_impl_glut.h"> +      <Filter>sources</Filter> +    </ClInclude> +    <ClInclude Include="..\..\backends\imgui_impl_opengl2.h"> +      <Filter>sources</Filter> +    </ClInclude> +  </ItemGroup> +  <ItemGroup> +    <None Include="..\README.txt" /> +    <None Include="..\..\misc\debuggers\imgui.natvis"> +      <Filter>imgui</Filter> +    </None> +    <None Include="..\..\misc\debuggers\imgui.natstepfilter"> +      <Filter>imgui</Filter> +    </None> +  </ItemGroup> +</Project>
\ No newline at end of file diff --git a/lib/imgui-1.90.7/examples/example_glut_opengl2/main.cpp b/lib/imgui-1.90.7/examples/example_glut_opengl2/main.cpp new file mode 100644 index 0000000..58539ca --- /dev/null +++ b/lib/imgui-1.90.7/examples/example_glut_opengl2/main.cpp @@ -0,0 +1,164 @@ +// Dear ImGui: standalone example application for GLUT/FreeGLUT + OpenGL2, using legacy fixed pipeline + +// 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 + +// !!! GLUT/FreeGLUT IS OBSOLETE PREHISTORIC SOFTWARE. Using GLUT is not recommended unless you really miss the 90's. !!! +// !!! If someone or something is teaching you GLUT today, you are being abused. Please show some resistance. !!! +// !!! Nowadays, prefer using GLFW or SDL instead! + +// On Windows, you can install Freeglut using vcpkg: +//   git clone https://github.com/Microsoft/vcpkg +//   cd vcpkg +//   bootstrap - vcpkg.bat +//   vcpkg install freeglut --triplet=x86-windows   ; for win32 +//   vcpkg install freeglut --triplet=x64-windows   ; for win64 +//   vcpkg integrate install                        ; register include and libs in Visual Studio + +#include "imgui.h" +#include "imgui_impl_glut.h" +#include "imgui_impl_opengl2.h" +#define GL_SILENCE_DEPRECATION +#ifdef __APPLE__ +#include <GLUT/glut.h> +#else +#include <GL/freeglut.h> +#endif + +#ifdef _MSC_VER +#pragma warning (disable: 4505) // unreferenced local function has been removed +#endif + +// Forward declarations of helper functions +void MainLoopStep(); + +// Our state +static bool show_demo_window = true; +static bool show_another_window = false; +static ImVec4 clear_color = ImVec4(0.45f, 0.55f, 0.60f, 1.00f); + +int main(int argc, char** argv) +{ +    // Create GLUT window +    glutInit(&argc, argv); +#ifdef __FREEGLUT_EXT_H__ +    glutSetOption(GLUT_ACTION_ON_WINDOW_CLOSE, GLUT_ACTION_GLUTMAINLOOP_RETURNS); +#endif +    glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_MULTISAMPLE); +    glutInitWindowSize(1280, 720); +    glutCreateWindow("Dear ImGui GLUT+OpenGL2 Example"); + +    // Setup GLUT display function +    // We will also call ImGui_ImplGLUT_InstallFuncs() to get all the other functions installed for us, +    // otherwise it is possible to install our own functions and call the imgui_impl_glut.h functions ourselves. +    glutDisplayFunc(MainLoopStep); + +    // Setup Dear ImGui context +    IMGUI_CHECKVERSION(); +    ImGui::CreateContext(); +    ImGuiIO& io = ImGui::GetIO(); (void)io; +    io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard;     // Enable Keyboard Controls + +    // Setup Dear ImGui style +    ImGui::StyleColorsDark(); +    //ImGui::StyleColorsLight(); + +    // Setup Platform/Renderer backends +    // FIXME: Consider reworking this example to install our own GLUT funcs + forward calls ImGui_ImplGLUT_XXX ones, instead of using ImGui_ImplGLUT_InstallFuncs(). +    ImGui_ImplGLUT_Init(); +    ImGui_ImplOpenGL2_Init(); + +    // Install GLUT handlers (glutReshapeFunc(), glutMotionFunc(), glutPassiveMotionFunc(), glutMouseFunc(), glutKeyboardFunc() etc.) +    // 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. +    ImGui_ImplGLUT_InstallFuncs(); + + +    // 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); + +    // Main loop +    glutMainLoop(); + +    // Cleanup +    ImGui_ImplOpenGL2_Shutdown(); +    ImGui_ImplGLUT_Shutdown(); +    ImGui::DestroyContext(); + +    return 0; +} + +void MainLoopStep() +{ +    // Start the Dear ImGui frame +    ImGui_ImplOpenGL2_NewFrame(); +    ImGui_ImplGLUT_NewFrame(); +    ImGui::NewFrame(); +    ImGuiIO& io = ImGui::GetIO(); + +    // 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); + +    // 2. Show a simple window that we create ourselves. We use a Begin/End pair to create a named window. +    { +        static float f = 0.0f; +        static int counter = 0; + +        ImGui::Begin("Hello, world!");                          // Create a window called "Hello, world!" and append into it. + +        ImGui::Text("This is some useful text.");               // Display some text (you can use a format strings too) +        ImGui::Checkbox("Demo Window", &show_demo_window);      // Edit bools storing our window open/close state +        ImGui::Checkbox("Another Window", &show_another_window); + +        ImGui::SliderFloat("float", &f, 0.0f, 1.0f);            // Edit 1 float using a slider from 0.0f to 1.0f +        ImGui::ColorEdit3("clear color", (float*)&clear_color); // Edit 3 floats representing a color + +        if (ImGui::Button("Button"))                            // Buttons return true when clicked (most widgets return true when edited/activated) +            counter++; +        ImGui::SameLine(); +        ImGui::Text("counter = %d", counter); + +        ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / io.Framerate, io.Framerate); +        ImGui::End(); +    } + +    // 3. Show another simple window. +    if (show_another_window) +    { +        ImGui::Begin("Another Window", &show_another_window);   // Pass a pointer to our bool variable (the window will have a closing button that will clear the bool when clicked) +        ImGui::Text("Hello from another window!"); +        if (ImGui::Button("Close Me")) +            show_another_window = false; +        ImGui::End(); +    } + +    // Rendering +    ImGui::Render(); +    glViewport(0, 0, (GLsizei)io.DisplaySize.x, (GLsizei)io.DisplaySize.y); +    glClearColor(clear_color.x * clear_color.w, clear_color.y * clear_color.w, clear_color.z * clear_color.w, clear_color.w); +    glClear(GL_COLOR_BUFFER_BIT); +    //glUseProgram(0); // You may want this if using this code in an OpenGL 3+ context where shaders may be bound, but prefer using the GL3+ code. +    ImGui_ImplOpenGL2_RenderDrawData(ImGui::GetDrawData()); + +    glutSwapBuffers(); +    glutPostRedisplay(); +} diff --git a/lib/imgui-1.90.7/examples/example_null/build_win32.bat b/lib/imgui-1.90.7/examples/example_null/build_win32.bat new file mode 100644 index 0000000..be81d80 --- /dev/null +++ b/lib/imgui-1.90.7/examples/example_null/build_win32.bat @@ -0,0 +1,3 @@ +@REM Build for Visual Studio compiler. Run your copy of vcvars32.bat or vcvarsall.bat to setup command-line compiler. +mkdir Debug +cl /nologo /Zi /MD /utf-8 /I ..\.. %* *.cpp ..\..\*.cpp /FeDebug/example_null.exe /FoDebug/ /link gdi32.lib shell32.lib imm32.lib diff --git a/lib/imgui-1.90.7/examples/example_null/main.cpp b/lib/imgui-1.90.7/examples/example_null/main.cpp new file mode 100644 index 0000000..f7153cc --- /dev/null +++ b/lib/imgui-1.90.7/examples/example_null/main.cpp @@ -0,0 +1,37 @@ +// dear imgui: "null" example application +// (compile and link imgui, create context, run headless with NO INPUTS, NO GRAPHICS OUTPUT) +// This is useful to test building, but you cannot interact with anything here! +#include "imgui.h" +#include <stdio.h> + +int main(int, char**) +{ +    IMGUI_CHECKVERSION(); +    ImGui::CreateContext(); +    ImGuiIO& io = ImGui::GetIO(); + +    // Build atlas +    unsigned char* tex_pixels = nullptr; +    int tex_w, tex_h; +    io.Fonts->GetTexDataAsRGBA32(&tex_pixels, &tex_w, &tex_h); + +    for (int n = 0; n < 20; n++) +    { +        printf("NewFrame() %d\n", n); +        io.DisplaySize = ImVec2(1920, 1080); +        io.DeltaTime = 1.0f / 60.0f; +        ImGui::NewFrame(); + +        static float f = 0.0f; +        ImGui::Text("Hello, world!"); +        ImGui::SliderFloat("float", &f, 0.0f, 1.0f); +        ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / io.Framerate, io.Framerate); +        ImGui::ShowDemoWindow(nullptr); + +        ImGui::Render(); +    } + +    printf("DestroyContext()\n"); +    ImGui::DestroyContext(); +    return 0; +} diff --git a/lib/imgui-1.90.7/examples/example_sdl2_directx11/build_win32.bat b/lib/imgui-1.90.7/examples/example_sdl2_directx11/build_win32.bat new file mode 100644 index 0000000..f0b485c --- /dev/null +++ b/lib/imgui-1.90.7/examples/example_sdl2_directx11/build_win32.bat @@ -0,0 +1,8 @@ +@REM Build for Visual Studio compiler. Run your copy of vcvars32.bat or vcvarsall.bat to setup command-line compiler. +@set OUT_DIR=Debug +@set OUT_EXE=example_sdl2_directx11 +@set INCLUDES=/I..\.. /I..\..\backends /I%SDL2_DIR%\include /I "%WindowsSdkDir%Include\um" /I "%WindowsSdkDir%Include\shared" /I "%DXSDK_DIR%Include" +@set SOURCES=main.cpp ..\..\backends\imgui_impl_sdl2.cpp ..\..\backends\imgui_impl_dx11.cpp ..\..\imgui*.cpp +@set LIBS=/LIBPATH:%SDL2_DIR%\lib\x86 SDL2.lib SDL2main.lib /LIBPATH:"%DXSDK_DIR%/Lib/x86" d3d11.lib d3dcompiler.lib shell32.lib +mkdir %OUT_DIR% +cl /nologo /Zi /MD /utf-8 %INCLUDES% %SOURCES% /Fe%OUT_DIR%/%OUT_EXE%.exe /Fo%OUT_DIR%/ /link %LIBS% /subsystem:console diff --git a/lib/imgui-1.90.7/examples/example_sdl2_directx11/example_sdl2_directx11.vcxproj b/lib/imgui-1.90.7/examples/example_sdl2_directx11/example_sdl2_directx11.vcxproj new file mode 100644 index 0000000..c23800c --- /dev/null +++ b/lib/imgui-1.90.7/examples/example_sdl2_directx11/example_sdl2_directx11.vcxproj @@ -0,0 +1,187 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> +  <ItemGroup Label="ProjectConfigurations"> +    <ProjectConfiguration Include="Debug|Win32"> +      <Configuration>Debug</Configuration> +      <Platform>Win32</Platform> +    </ProjectConfiguration> +    <ProjectConfiguration Include="Debug|x64"> +      <Configuration>Debug</Configuration> +      <Platform>x64</Platform> +    </ProjectConfiguration> +    <ProjectConfiguration Include="Release|Win32"> +      <Configuration>Release</Configuration> +      <Platform>Win32</Platform> +    </ProjectConfiguration> +    <ProjectConfiguration Include="Release|x64"> +      <Configuration>Release</Configuration> +      <Platform>x64</Platform> +    </ProjectConfiguration> +  </ItemGroup> +  <PropertyGroup Label="Globals"> +    <ProjectGuid>{9E1987E3-1F19-45CA-B9C9-D31E791836D8}</ProjectGuid> +    <RootNamespace>example_sdl2_directx11</RootNamespace> +    <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion> +    <ProjectName>example_sdl2_directx11</ProjectName> +  </PropertyGroup> +  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> +  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> +    <ConfigurationType>Application</ConfigurationType> +    <UseDebugLibraries>true</UseDebugLibraries> +    <CharacterSet>MultiByte</CharacterSet> +    <PlatformToolset>v140</PlatformToolset> +  </PropertyGroup> +  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration"> +    <ConfigurationType>Application</ConfigurationType> +    <UseDebugLibraries>true</UseDebugLibraries> +    <CharacterSet>MultiByte</CharacterSet> +    <PlatformToolset>v140</PlatformToolset> +  </PropertyGroup> +  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration"> +    <ConfigurationType>Application</ConfigurationType> +    <UseDebugLibraries>false</UseDebugLibraries> +    <WholeProgramOptimization>true</WholeProgramOptimization> +    <CharacterSet>MultiByte</CharacterSet> +    <PlatformToolset>v140</PlatformToolset> +  </PropertyGroup> +  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration"> +    <ConfigurationType>Application</ConfigurationType> +    <UseDebugLibraries>false</UseDebugLibraries> +    <WholeProgramOptimization>true</WholeProgramOptimization> +    <CharacterSet>MultiByte</CharacterSet> +    <PlatformToolset>v140</PlatformToolset> +  </PropertyGroup> +  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> +  <ImportGroup Label="ExtensionSettings"> +  </ImportGroup> +  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> +    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> +  </ImportGroup> +  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets"> +    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> +  </ImportGroup> +  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> +    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> +  </ImportGroup> +  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets"> +    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> +  </ImportGroup> +  <PropertyGroup Label="UserMacros" /> +  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> +    <OutDir>$(ProjectDir)$(Configuration)\</OutDir> +    <IntDir>$(ProjectDir)$(Configuration)\</IntDir> +    <IncludePath>$(IncludePath)</IncludePath> +  </PropertyGroup> +  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> +    <OutDir>$(ProjectDir)$(Configuration)\</OutDir> +    <IntDir>$(ProjectDir)$(Configuration)\</IntDir> +    <IncludePath>$(IncludePath)</IncludePath> +  </PropertyGroup> +  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> +    <OutDir>$(ProjectDir)$(Configuration)\</OutDir> +    <IntDir>$(ProjectDir)$(Configuration)\</IntDir> +    <IncludePath>$(IncludePath)</IncludePath> +  </PropertyGroup> +  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> +    <OutDir>$(ProjectDir)$(Configuration)\</OutDir> +    <IntDir>$(ProjectDir)$(Configuration)\</IntDir> +    <IncludePath>$(IncludePath)</IncludePath> +  </PropertyGroup> +  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> +    <ClCompile> +      <WarningLevel>Level4</WarningLevel> +      <Optimization>Disabled</Optimization> +      <AdditionalIncludeDirectories>..\..;..\..\backends;%SDL2_DIR%\include;$(VcpkgCurrentInstalledDir)include\SDL2;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> +      <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions> +    </ClCompile> +    <Link> +      <GenerateDebugInformation>true</GenerateDebugInformation> +      <AdditionalLibraryDirectories>%SDL2_DIR%\lib\x86;$(DXSDK_DIR)/Lib/x86;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> +      <AdditionalDependencies>SDL2.lib;SDL2main.lib;d3d11.lib;d3dcompiler.lib;dxgi.lib;%(AdditionalDependencies)</AdditionalDependencies> +      <SubSystem>Console</SubSystem> +      <IgnoreSpecificDefaultLibraries>msvcrt.lib</IgnoreSpecificDefaultLibraries> +    </Link> +  </ItemDefinitionGroup> +  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> +    <ClCompile> +      <WarningLevel>Level4</WarningLevel> +      <Optimization>Disabled</Optimization> +      <AdditionalIncludeDirectories>..\..;..\..\backends;%SDL2_DIR%\include;$(VcpkgCurrentInstalledDir)include\SDL2;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> +      <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions> +    </ClCompile> +    <Link> +      <GenerateDebugInformation>true</GenerateDebugInformation> +      <AdditionalLibraryDirectories>%SDL2_DIR%\lib\x64;$(DXSDK_DIR)/Lib/x64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> +      <AdditionalDependencies>SDL2.lib;SDL2main.lib;d3d11.lib;d3dcompiler.lib;dxgi.lib;%(AdditionalDependencies)</AdditionalDependencies> +      <SubSystem>Console</SubSystem> +      <IgnoreSpecificDefaultLibraries>msvcrt.lib</IgnoreSpecificDefaultLibraries> +    </Link> +  </ItemDefinitionGroup> +  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> +    <ClCompile> +      <WarningLevel>Level4</WarningLevel> +      <Optimization>MaxSpeed</Optimization> +      <FunctionLevelLinking>true</FunctionLevelLinking> +      <IntrinsicFunctions>true</IntrinsicFunctions> +      <AdditionalIncludeDirectories>..\..;..\..\backends;%SDL2_DIR%\include;$(VcpkgCurrentInstalledDir)include\SDL2;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> +      <BufferSecurityCheck>false</BufferSecurityCheck> +      <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions> +    </ClCompile> +    <Link> +      <GenerateDebugInformation>true</GenerateDebugInformation> +      <EnableCOMDATFolding>true</EnableCOMDATFolding> +      <OptimizeReferences>true</OptimizeReferences> +      <AdditionalLibraryDirectories>%SDL2_DIR%\lib\x86;$(DXSDK_DIR)/Lib/x86;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> +      <AdditionalDependencies>SDL2.lib;SDL2main.lib;d3d11.lib;d3dcompiler.lib;dxgi.lib;%(AdditionalDependencies)</AdditionalDependencies> +      <SubSystem>Console</SubSystem> +      <IgnoreSpecificDefaultLibraries> +      </IgnoreSpecificDefaultLibraries> +    </Link> +  </ItemDefinitionGroup> +  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> +    <ClCompile> +      <WarningLevel>Level4</WarningLevel> +      <Optimization>MaxSpeed</Optimization> +      <FunctionLevelLinking>true</FunctionLevelLinking> +      <IntrinsicFunctions>true</IntrinsicFunctions> +      <AdditionalIncludeDirectories>..\..;..\..\backends;%SDL2_DIR%\include;$(VcpkgCurrentInstalledDir)include\SDL2;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> +      <BufferSecurityCheck>false</BufferSecurityCheck> +      <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions> +    </ClCompile> +    <Link> +      <GenerateDebugInformation>true</GenerateDebugInformation> +      <EnableCOMDATFolding>true</EnableCOMDATFolding> +      <OptimizeReferences>true</OptimizeReferences> +      <AdditionalLibraryDirectories>%SDL2_DIR%\lib\x64;$(DXSDK_DIR)/Lib/x64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> +      <AdditionalDependencies>SDL2.lib;SDL2main.lib;d3d11.lib;d3dcompiler.lib;dxgi.lib;%(AdditionalDependencies)</AdditionalDependencies> +      <SubSystem>Console</SubSystem> +      <IgnoreSpecificDefaultLibraries> +      </IgnoreSpecificDefaultLibraries> +    </Link> +  </ItemDefinitionGroup> +  <ItemGroup> +    <ClCompile Include="..\..\imgui.cpp" /> +    <ClCompile Include="..\..\imgui_demo.cpp" /> +    <ClCompile Include="..\..\imgui_draw.cpp" /> +    <ClCompile Include="..\..\imgui_tables.cpp" /> +    <ClCompile Include="..\..\imgui_widgets.cpp" /> +    <ClCompile Include="..\..\backends\imgui_impl_sdl2.cpp" /> +    <ClCompile Include="..\..\backends\imgui_impl_dx11.cpp" /> +    <ClCompile Include="main.cpp" /> +  </ItemGroup> +  <ItemGroup> +    <ClInclude Include="..\..\imconfig.h" /> +    <ClInclude Include="..\..\imgui.h" /> +    <ClInclude Include="..\..\imgui_internal.h" /> +    <ClInclude Include="..\..\backends\imgui_impl_sdl2.h" /> +    <ClInclude Include="..\..\backends\imgui_impl_dx11.h" /> +  </ItemGroup> +  <ItemGroup> +    <None Include="..\..\misc\debuggers\imgui.natstepfilter" /> +    <None Include="..\..\misc\debuggers\imgui.natvis" /> +    <None Include="..\README.txt" /> +  </ItemGroup> +  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> +  <ImportGroup Label="ExtensionTargets"> +  </ImportGroup> +</Project>
\ No newline at end of file diff --git a/lib/imgui-1.90.7/examples/example_sdl2_directx11/example_sdl2_directx11.vcxproj.filters b/lib/imgui-1.90.7/examples/example_sdl2_directx11/example_sdl2_directx11.vcxproj.filters new file mode 100644 index 0000000..92d11f8 --- /dev/null +++ b/lib/imgui-1.90.7/examples/example_sdl2_directx11/example_sdl2_directx11.vcxproj.filters @@ -0,0 +1,63 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> +  <ItemGroup> +    <Filter Include="imgui"> +      <UniqueIdentifier>{0587d7a3-f2ce-4d56-b84f-a0005d3bfce6}</UniqueIdentifier> +    </Filter> +    <Filter Include="sources"> +      <UniqueIdentifier>{08e36723-ce4f-4cff-9662-c40801cf1acf}</UniqueIdentifier> +    </Filter> +  </ItemGroup> +  <ItemGroup> +    <ClInclude Include="..\..\imconfig.h"> +      <Filter>imgui</Filter> +    </ClInclude> +    <ClInclude Include="..\..\imgui.h"> +      <Filter>imgui</Filter> +    </ClInclude> +    <ClInclude Include="..\..\imgui_internal.h"> +      <Filter>imgui</Filter> +    </ClInclude> +    <ClInclude Include="..\..\backends\imgui_impl_sdl2.h"> +      <Filter>sources</Filter> +    </ClInclude> +    <ClInclude Include="..\..\backends\imgui_impl_dx11.h"> +      <Filter>sources</Filter> +    </ClInclude> +  </ItemGroup> +  <ItemGroup> +    <ClCompile Include="..\..\imgui.cpp"> +      <Filter>imgui</Filter> +    </ClCompile> +    <ClCompile Include="main.cpp"> +      <Filter>sources</Filter> +    </ClCompile> +    <ClCompile Include="..\..\imgui_demo.cpp"> +      <Filter>imgui</Filter> +    </ClCompile> +    <ClCompile Include="..\..\imgui_draw.cpp"> +      <Filter>imgui</Filter> +    </ClCompile> +    <ClCompile Include="..\..\imgui_tables.cpp"> +      <Filter>imgui</Filter> +    </ClCompile> +    <ClCompile Include="..\..\imgui_widgets.cpp"> +      <Filter>imgui</Filter> +    </ClCompile> +    <ClCompile Include="..\..\backends\imgui_impl_sdl2.cpp"> +      <Filter>sources</Filter> +    </ClCompile> +    <ClCompile Include="..\..\backends\imgui_impl_dx11.cpp"> +      <Filter>sources</Filter> +    </ClCompile> +  </ItemGroup> +  <ItemGroup> +    <None Include="..\README.txt" /> +    <None Include="..\..\misc\debuggers\imgui.natvis"> +      <Filter>imgui</Filter> +    </None> +    <None Include="..\..\misc\debuggers\imgui.natstepfilter"> +      <Filter>imgui</Filter> +    </None> +  </ItemGroup> +</Project>
\ No newline at end of file diff --git a/lib/imgui-1.90.7/examples/example_sdl2_directx11/main.cpp b/lib/imgui-1.90.7/examples/example_sdl2_directx11/main.cpp new file mode 100644 index 0000000..3275baf --- /dev/null +++ b/lib/imgui-1.90.7/examples/example_sdl2_directx11/main.cpp @@ -0,0 +1,245 @@ +// Dear ImGui: standalone example application for SDL2 + DirectX 11 +// (SDL is a cross-platform general purpose library for handling windows, inputs, OpenGL/Vulkan/Metal graphics context creation, etc.) + +// 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_sdl2.h" +#include "imgui_impl_dx11.h" +#include <d3d11.h> +#include <stdio.h> +#include <SDL.h> +#include <SDL_syswm.h> + +// Data +static ID3D11Device*            g_pd3dDevice = nullptr; +static ID3D11DeviceContext*     g_pd3dDeviceContext = nullptr; +static IDXGISwapChain*          g_pSwapChain = nullptr; +static ID3D11RenderTargetView*  g_mainRenderTargetView = nullptr; + +// Forward declarations of helper functions +bool CreateDeviceD3D(HWND hWnd); +void CleanupDeviceD3D(); +void CreateRenderTarget(); +void CleanupRenderTarget(); + +// Main code +int main(int, char**) +{ +    // Setup SDL +    // (Some versions of SDL before <2.0.10 appears to have performance/stalling issues on a minority of Windows systems, +    // depending on whether SDL_INIT_GAMECONTROLLER is enabled or disabled.. updating to the latest version of SDL is recommended!) +    if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER | SDL_INIT_GAMECONTROLLER) != 0) +    { +        printf("Error: %s\n", SDL_GetError()); +        return -1; +    } + +    // From 2.0.18: Enable native IME. +#ifdef SDL_HINT_IME_SHOW_UI +    SDL_SetHint(SDL_HINT_IME_SHOW_UI, "1"); +#endif + +    // Setup window +    SDL_WindowFlags window_flags = (SDL_WindowFlags)(SDL_WINDOW_RESIZABLE | SDL_WINDOW_ALLOW_HIGHDPI); +    SDL_Window* window = SDL_CreateWindow("Dear ImGui SDL2+DirectX11 example", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 1280, 720, window_flags); +    if (window == nullptr) +    { +        printf("Error: SDL_CreateWindow(): %s\n", SDL_GetError()); +        return -1; +    } + +    SDL_SysWMinfo wmInfo; +    SDL_VERSION(&wmInfo.version); +    SDL_GetWindowWMInfo(window, &wmInfo); +    HWND hwnd = (HWND)wmInfo.info.win.window; + +    // Initialize Direct3D +    if (!CreateDeviceD3D(hwnd)) +    { +        CleanupDeviceD3D(); +        return 1; +    } + +    // 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_ImplSDL2_InitForD3D(window); +    ImGui_ImplDX11_Init(g_pd3dDevice, g_pd3dDeviceContext); + +    // 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); + +    // Main loop +    bool done = false; +    while (!done) +    { +        // Poll and handle events (inputs, window resize, etc.) +        // 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. +        SDL_Event event; +        while (SDL_PollEvent(&event)) +        { +            ImGui_ImplSDL2_ProcessEvent(&event); +            if (event.type == SDL_QUIT) +                done = true; +            if (event.type == SDL_WINDOWEVENT && event.window.event == SDL_WINDOWEVENT_CLOSE && event.window.windowID == SDL_GetWindowID(window)) +                done = true; +            if (event.type == SDL_WINDOWEVENT && event.window.event == SDL_WINDOWEVENT_RESIZED && event.window.windowID == SDL_GetWindowID(window)) +            { +                // Release all outstanding references to the swap chain's buffers before resizing. +                CleanupRenderTarget(); +                g_pSwapChain->ResizeBuffers(0, 0, 0, DXGI_FORMAT_UNKNOWN, 0); +                CreateRenderTarget(); +            } +        } + +        // Start the Dear ImGui frame +        ImGui_ImplDX11_NewFrame(); +        ImGui_ImplSDL2_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); + +        // 2. Show a simple window that we create ourselves. We use a Begin/End pair to create a named window. +        { +            static float f = 0.0f; +            static int counter = 0; + +            ImGui::Begin("Hello, world!");                          // Create a window called "Hello, world!" and append into it. + +            ImGui::Text("This is some useful text.");               // Display some text (you can use a format strings too) +            ImGui::Checkbox("Demo Window", &show_demo_window);      // Edit bools storing our window open/close state +            ImGui::Checkbox("Another Window", &show_another_window); + +            ImGui::SliderFloat("float", &f, 0.0f, 1.0f);            // Edit 1 float using a slider from 0.0f to 1.0f +            ImGui::ColorEdit3("clear color", (float*)&clear_color); // Edit 3 floats representing a color + +            if (ImGui::Button("Button"))                            // Buttons return true when clicked (most widgets return true when edited/activated) +                counter++; +            ImGui::SameLine(); +            ImGui::Text("counter = %d", counter); + +            ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / io.Framerate, io.Framerate); +            ImGui::End(); +        } + +        // 3. Show another simple window. +        if (show_another_window) +        { +            ImGui::Begin("Another Window", &show_another_window);   // Pass a pointer to our bool variable (the window will have a closing button that will clear the bool when clicked) +            ImGui::Text("Hello from another window!"); +            if (ImGui::Button("Close Me")) +                show_another_window = false; +            ImGui::End(); +        } + +        // Rendering +        ImGui::Render(); +        const float clear_color_with_alpha[4] = { clear_color.x * clear_color.w, clear_color.y * clear_color.w, clear_color.z * clear_color.w, clear_color.w }; +        g_pd3dDeviceContext->OMSetRenderTargets(1, &g_mainRenderTargetView, nullptr); +        g_pd3dDeviceContext->ClearRenderTargetView(g_mainRenderTargetView, clear_color_with_alpha); +        ImGui_ImplDX11_RenderDrawData(ImGui::GetDrawData()); + +        g_pSwapChain->Present(1, 0); // Present with vsync +        //g_pSwapChain->Present(0, 0); // Present without vsync +    } + +    // Cleanup +    ImGui_ImplDX11_Shutdown(); +    ImGui_ImplSDL2_Shutdown(); +    ImGui::DestroyContext(); + +    CleanupDeviceD3D(); +    SDL_DestroyWindow(window); +    SDL_Quit(); + +    return 0; +} + +// Helper functions to use DirectX11 +bool CreateDeviceD3D(HWND hWnd) +{ +    // Setup swap chain +    DXGI_SWAP_CHAIN_DESC sd; +    ZeroMemory(&sd, sizeof(sd)); +    sd.BufferCount = 2; +    sd.BufferDesc.Width = 0; +    sd.BufferDesc.Height = 0; +    sd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; +    sd.BufferDesc.RefreshRate.Numerator = 60; +    sd.BufferDesc.RefreshRate.Denominator = 1; +    sd.Flags = DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH; +    sd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; +    sd.OutputWindow = hWnd; +    sd.SampleDesc.Count = 1; +    sd.SampleDesc.Quality = 0; +    sd.Windowed = TRUE; +    sd.SwapEffect = DXGI_SWAP_EFFECT_DISCARD; + +    UINT createDeviceFlags = 0; +    //createDeviceFlags |= D3D11_CREATE_DEVICE_DEBUG; +    D3D_FEATURE_LEVEL featureLevel; +    const D3D_FEATURE_LEVEL featureLevelArray[2] = { D3D_FEATURE_LEVEL_11_0, D3D_FEATURE_LEVEL_10_0, }; +    if (D3D11CreateDeviceAndSwapChain(nullptr, D3D_DRIVER_TYPE_HARDWARE, nullptr, createDeviceFlags, featureLevelArray, 2, D3D11_SDK_VERSION, &sd, &g_pSwapChain, &g_pd3dDevice, &featureLevel, &g_pd3dDeviceContext) != S_OK) +        return false; + +    CreateRenderTarget(); +    return true; +} + +void CleanupDeviceD3D() +{ +    CleanupRenderTarget(); +    if (g_pSwapChain) { g_pSwapChain->Release(); g_pSwapChain = nullptr; } +    if (g_pd3dDeviceContext) { g_pd3dDeviceContext->Release(); g_pd3dDeviceContext = nullptr; } +    if (g_pd3dDevice) { g_pd3dDevice->Release(); g_pd3dDevice = nullptr; } +} + +void CreateRenderTarget() +{ +    ID3D11Texture2D* pBackBuffer; +    g_pSwapChain->GetBuffer(0, IID_PPV_ARGS(&pBackBuffer)); +    g_pd3dDevice->CreateRenderTargetView(pBackBuffer, nullptr, &g_mainRenderTargetView); +    pBackBuffer->Release(); +} + +void CleanupRenderTarget() +{ +    if (g_mainRenderTargetView) { g_mainRenderTargetView->Release(); g_mainRenderTargetView = nullptr; } +} diff --git a/lib/imgui-1.90.7/examples/example_sdl2_metal/main.mm b/lib/imgui-1.90.7/examples/example_sdl2_metal/main.mm new file mode 100644 index 0000000..d548127 --- /dev/null +++ b/lib/imgui-1.90.7/examples/example_sdl2_metal/main.mm @@ -0,0 +1,189 @@ +// Dear ImGui: standalone example application for SDL2 + Metal +// (SDL is a cross-platform general purpose library for handling windows, inputs, OpenGL/Vulkan/Metal graphics context creation, etc.) + +// 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_sdl2.h" +#include "imgui_impl_metal.h" +#include <stdio.h> +#include <SDL.h> + +#import <Metal/Metal.h> +#import <QuartzCore/QuartzCore.h> + +int main(int, char**) +{ +    // 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 style +    ImGui::StyleColorsDark(); +    //ImGui::StyleColorsLight(); + +    // 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); + +    // Setup SDL +    // (Some versions of SDL before <2.0.10 appears to have performance/stalling issues on a minority of Windows systems, +    // depending on whether SDL_INIT_GAMECONTROLLER is enabled or disabled.. updating to latest version of SDL is recommended!) +    if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER | SDL_INIT_GAMECONTROLLER) != 0) +    { +        printf("Error: %s\n", SDL_GetError()); +        return -1; +    } + +    // Inform SDL that we will be using metal for rendering. Without this hint initialization of metal renderer may fail. +    SDL_SetHint(SDL_HINT_RENDER_DRIVER, "metal"); + +    // Enable native IME. +    SDL_SetHint(SDL_HINT_IME_SHOW_UI, "1"); + +    SDL_Window* window = SDL_CreateWindow("Dear ImGui SDL+Metal example", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 1280, 720, SDL_WINDOW_RESIZABLE | SDL_WINDOW_ALLOW_HIGHDPI); +    if (window == nullptr) +    { +        printf("Error creating window: %s\n", SDL_GetError()); +        return -2; +    } + +    SDL_Renderer* renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC); +    if (renderer == nullptr) +    { +        printf("Error creating renderer: %s\n", SDL_GetError()); +        return -3; +    } + +    // Setup Platform/Renderer backends +    CAMetalLayer* layer = (__bridge CAMetalLayer*)SDL_RenderGetMetalLayer(renderer); +    layer.pixelFormat = MTLPixelFormatBGRA8Unorm; +    ImGui_ImplMetal_Init(layer.device); +    ImGui_ImplSDL2_InitForMetal(window); + +    id<MTLCommandQueue> commandQueue = [layer.device newCommandQueue]; +    MTLRenderPassDescriptor* renderPassDescriptor = [MTLRenderPassDescriptor new]; + +    // Our state +    bool show_demo_window = true; +    bool show_another_window = false; +    float clear_color[4] = {0.45f, 0.55f, 0.60f, 1.00f}; + +    // Main loop +    bool done = false; +    while (!done) +    { +        @autoreleasepool +        { +            // Poll and handle events (inputs, window resize, etc.) +            // 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. +            SDL_Event event; +            while (SDL_PollEvent(&event)) +            { +                ImGui_ImplSDL2_ProcessEvent(&event); +                if (event.type == SDL_QUIT) +                    done = true; +                if (event.type == SDL_WINDOWEVENT && event.window.event == SDL_WINDOWEVENT_CLOSE && event.window.windowID == SDL_GetWindowID(window)) +                    done = true; +            } + +            int width, height; +            SDL_GetRendererOutputSize(renderer, &width, &height); +            layer.drawableSize = CGSizeMake(width, height); +            id<CAMetalDrawable> drawable = [layer nextDrawable]; + +            id<MTLCommandBuffer> commandBuffer = [commandQueue commandBuffer]; +            renderPassDescriptor.colorAttachments[0].clearColor = MTLClearColorMake(clear_color[0] * clear_color[3], clear_color[1] * clear_color[3], clear_color[2] * clear_color[3], clear_color[3]); +            renderPassDescriptor.colorAttachments[0].texture = drawable.texture; +            renderPassDescriptor.colorAttachments[0].loadAction = MTLLoadActionClear; +            renderPassDescriptor.colorAttachments[0].storeAction = MTLStoreActionStore; +            id <MTLRenderCommandEncoder> renderEncoder = [commandBuffer renderCommandEncoderWithDescriptor:renderPassDescriptor]; +            [renderEncoder pushDebugGroup:@"ImGui demo"]; + +            // Start the Dear ImGui frame +            ImGui_ImplMetal_NewFrame(renderPassDescriptor); +            ImGui_ImplSDL2_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); + +            // 2. Show a simple window that we create ourselves. We use a Begin/End pair to create a named window. +            { +                static float f = 0.0f; +                static int counter = 0; + +                ImGui::Begin("Hello, world!");                          // Create a window called "Hello, world!" and append into it. + +                ImGui::Text("This is some useful text.");               // Display some text (you can use a format strings too) +                ImGui::Checkbox("Demo Window", &show_demo_window);      // Edit bools storing our window open/close state +                ImGui::Checkbox("Another Window", &show_another_window); + +                ImGui::SliderFloat("float", &f, 0.0f, 1.0f);            // Edit 1 float using a slider from 0.0f to 1.0f +                ImGui::ColorEdit3("clear color", (float*)&clear_color); // Edit 3 floats representing a color + +                if (ImGui::Button("Button"))                            // Buttons return true when clicked (most widgets return true when edited/activated) +                    counter++; +                ImGui::SameLine(); +                ImGui::Text("counter = %d", counter); + +                ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / io.Framerate, io.Framerate); +                ImGui::End(); +            } + +            // 3. Show another simple window. +            if (show_another_window) +            { +                ImGui::Begin("Another Window", &show_another_window);   // Pass a pointer to our bool variable (the window will have a closing button that will clear the bool when clicked) +                ImGui::Text("Hello from another window!"); +                if (ImGui::Button("Close Me")) +                    show_another_window = false; +                ImGui::End(); +            } + +            // Rendering +            ImGui::Render(); +            ImGui_ImplMetal_RenderDrawData(ImGui::GetDrawData(), commandBuffer, renderEncoder); + +            [renderEncoder popDebugGroup]; +            [renderEncoder endEncoding]; + +            [commandBuffer presentDrawable:drawable]; +            [commandBuffer commit]; +        } +    } + +    // Cleanup +    ImGui_ImplMetal_Shutdown(); +    ImGui_ImplSDL2_Shutdown(); +    ImGui::DestroyContext(); + +    SDL_DestroyRenderer(renderer); +    SDL_DestroyWindow(window); +    SDL_Quit(); + +    return 0; +} diff --git a/lib/imgui-1.90.7/examples/example_sdl2_opengl2/README.md b/lib/imgui-1.90.7/examples/example_sdl2_opengl2/README.md new file mode 100644 index 0000000..40a49e6 --- /dev/null +++ b/lib/imgui-1.90.7/examples/example_sdl2_opengl2/README.md @@ -0,0 +1,29 @@ + +# How to Build + +- On Windows with Visual Studio's IDE + +Use the provided project file (.vcxproj). Add to solution (imgui_examples.sln) if necessary. + +- On Windows with Visual Studio's CLI + +``` +set SDL2_DIR=path_to_your_sdl2_folder +cl /Zi /MD /I.. /I..\.. /I%SDL2_DIR%\include main.cpp ..\..\backends\imgui_impl_sdl2.cpp ..\..\backends\imgui_impl_opengl2.cpp ..\..\imgui*.cpp /FeDebug/example_sdl2_opengl2.exe /FoDebug/ /link /libpath:%SDL2_DIR%\lib\x86 SDL2.lib SDL2main.lib opengl32.lib /subsystem:console +#          ^^ include paths                  ^^ source files                                                            ^^ output exe                    ^^ output dir   ^^ libraries +# or for 64-bit: +cl /Zi /MD /I.. /I..\.. /I%SDL2_DIR%\include main.cpp ..\..\backends\imgui_impl_sdl2.cpp ..\..\backends\imgui_impl_opengl2.cpp ..\..\imgui*.cpp /FeDebug/example_sdl2_opengl2.exe /FoDebug/ /link /libpath:%SDL2_DIR%\lib\x64 SDL2.lib SDL2main.lib opengl32.lib /subsystem:console +``` + +- On Linux and similar Unixes + +``` +c++ `sdl2-config --cflags` -I .. -I ../.. -I ../../backends main.cpp ../../backends/imgui_impl_sdl2.cpp ../../backends/imgui_impl_opengl2.cpp ../../imgui*.cpp `sdl2-config --libs` -lGL +``` + +- On Mac OS X + +``` +brew install sdl2 +c++ `sdl2-config --cflags` -I .. -I ../.. -I ../../backends main.cpp ../../backends/imgui_impl_sdl2.cpp ../../backends/imgui_impl_opengl2.cpp ../../imgui*.cpp `sdl2-config --libs` -framework OpenGl +``` diff --git a/lib/imgui-1.90.7/examples/example_sdl2_opengl2/build_win32.bat b/lib/imgui-1.90.7/examples/example_sdl2_opengl2/build_win32.bat new file mode 100644 index 0000000..7543eda --- /dev/null +++ b/lib/imgui-1.90.7/examples/example_sdl2_opengl2/build_win32.bat @@ -0,0 +1,8 @@ +@REM Build for Visual Studio compiler. Run your copy of vcvars32.bat or vcvarsall.bat to setup command-line compiler. +@set OUT_DIR=Debug +@set OUT_EXE=example_sdl2_opengl2 +@set INCLUDES=/I..\.. /I..\..\backends /I%SDL2_DIR%\include +@set SOURCES=main.cpp ..\..\backends\imgui_impl_sdl2.cpp ..\..\backends\imgui_impl_opengl2.cpp ..\..\imgui*.cpp +@set LIBS=/LIBPATH:%SDL2_DIR%\lib\x86 SDL2.lib SDL2main.lib opengl32.lib shell32.lib +mkdir %OUT_DIR% +cl /nologo /Zi /MD /utf-8 %INCLUDES% %SOURCES% /Fe%OUT_DIR%/%OUT_EXE%.exe /Fo%OUT_DIR%/ /link %LIBS% /subsystem:console diff --git a/lib/imgui-1.90.7/examples/example_sdl2_opengl2/example_sdl2_opengl2.vcxproj b/lib/imgui-1.90.7/examples/example_sdl2_opengl2/example_sdl2_opengl2.vcxproj new file mode 100644 index 0000000..036463f --- /dev/null +++ b/lib/imgui-1.90.7/examples/example_sdl2_opengl2/example_sdl2_opengl2.vcxproj @@ -0,0 +1,186 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> +  <ItemGroup Label="ProjectConfigurations"> +    <ProjectConfiguration Include="Debug|Win32"> +      <Configuration>Debug</Configuration> +      <Platform>Win32</Platform> +    </ProjectConfiguration> +    <ProjectConfiguration Include="Debug|x64"> +      <Configuration>Debug</Configuration> +      <Platform>x64</Platform> +    </ProjectConfiguration> +    <ProjectConfiguration Include="Release|Win32"> +      <Configuration>Release</Configuration> +      <Platform>Win32</Platform> +    </ProjectConfiguration> +    <ProjectConfiguration Include="Release|x64"> +      <Configuration>Release</Configuration> +      <Platform>x64</Platform> +    </ProjectConfiguration> +  </ItemGroup> +  <PropertyGroup Label="Globals"> +    <ProjectGuid>{2AE17FDE-F7F3-4CAC-ADAB-0710EDA4F741}</ProjectGuid> +    <RootNamespace>example_sdl2_opengl2</RootNamespace> +    <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion> +  </PropertyGroup> +  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> +  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> +    <ConfigurationType>Application</ConfigurationType> +    <UseDebugLibraries>true</UseDebugLibraries> +    <CharacterSet>MultiByte</CharacterSet> +    <PlatformToolset>v140</PlatformToolset> +  </PropertyGroup> +  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration"> +    <ConfigurationType>Application</ConfigurationType> +    <UseDebugLibraries>true</UseDebugLibraries> +    <CharacterSet>MultiByte</CharacterSet> +    <PlatformToolset>v140</PlatformToolset> +  </PropertyGroup> +  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration"> +    <ConfigurationType>Application</ConfigurationType> +    <UseDebugLibraries>false</UseDebugLibraries> +    <WholeProgramOptimization>true</WholeProgramOptimization> +    <CharacterSet>MultiByte</CharacterSet> +    <PlatformToolset>v140</PlatformToolset> +  </PropertyGroup> +  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration"> +    <ConfigurationType>Application</ConfigurationType> +    <UseDebugLibraries>false</UseDebugLibraries> +    <WholeProgramOptimization>true</WholeProgramOptimization> +    <CharacterSet>MultiByte</CharacterSet> +    <PlatformToolset>v140</PlatformToolset> +  </PropertyGroup> +  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> +  <ImportGroup Label="ExtensionSettings"> +  </ImportGroup> +  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> +    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> +  </ImportGroup> +  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets"> +    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> +  </ImportGroup> +  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> +    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> +  </ImportGroup> +  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets"> +    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> +  </ImportGroup> +  <PropertyGroup Label="UserMacros" /> +  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> +    <OutDir>$(ProjectDir)$(Configuration)\</OutDir> +    <IntDir>$(ProjectDir)$(Configuration)\</IntDir> +    <IncludePath>$(IncludePath)</IncludePath> +  </PropertyGroup> +  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> +    <OutDir>$(ProjectDir)$(Configuration)\</OutDir> +    <IntDir>$(ProjectDir)$(Configuration)\</IntDir> +    <IncludePath>$(IncludePath)</IncludePath> +  </PropertyGroup> +  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> +    <OutDir>$(ProjectDir)$(Configuration)\</OutDir> +    <IntDir>$(ProjectDir)$(Configuration)\</IntDir> +    <IncludePath>$(IncludePath)</IncludePath> +  </PropertyGroup> +  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> +    <OutDir>$(ProjectDir)$(Configuration)\</OutDir> +    <IntDir>$(ProjectDir)$(Configuration)\</IntDir> +    <IncludePath>$(IncludePath)</IncludePath> +  </PropertyGroup> +  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> +    <ClCompile> +      <WarningLevel>Level4</WarningLevel> +      <Optimization>Disabled</Optimization> +      <AdditionalIncludeDirectories>..\..;..\..\backends;%SDL2_DIR%\include;$(VcpkgCurrentInstalledDir)include\SDL2;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> +      <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions> +    </ClCompile> +    <Link> +      <GenerateDebugInformation>true</GenerateDebugInformation> +      <AdditionalLibraryDirectories>%SDL2_DIR%\lib\x86;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> +      <AdditionalDependencies>opengl32.lib;SDL2.lib;SDL2main.lib;%(AdditionalDependencies)</AdditionalDependencies> +      <SubSystem>Console</SubSystem> +      <IgnoreSpecificDefaultLibraries>msvcrt.lib</IgnoreSpecificDefaultLibraries> +    </Link> +  </ItemDefinitionGroup> +  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> +    <ClCompile> +      <WarningLevel>Level4</WarningLevel> +      <Optimization>Disabled</Optimization> +      <AdditionalIncludeDirectories>..\..;..\..\backends;%SDL2_DIR%\include;$(VcpkgCurrentInstalledDir)include\SDL2;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> +      <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions> +    </ClCompile> +    <Link> +      <GenerateDebugInformation>true</GenerateDebugInformation> +      <AdditionalLibraryDirectories>%SDL2_DIR%\lib\x64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> +      <AdditionalDependencies>opengl32.lib;SDL2.lib;SDL2main.lib;%(AdditionalDependencies)</AdditionalDependencies> +      <SubSystem>Console</SubSystem> +      <IgnoreSpecificDefaultLibraries>msvcrt.lib</IgnoreSpecificDefaultLibraries> +    </Link> +  </ItemDefinitionGroup> +  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> +    <ClCompile> +      <WarningLevel>Level4</WarningLevel> +      <Optimization>MaxSpeed</Optimization> +      <FunctionLevelLinking>true</FunctionLevelLinking> +      <IntrinsicFunctions>true</IntrinsicFunctions> +      <AdditionalIncludeDirectories>..\..;..\..\backends;%SDL2_DIR%\include;$(VcpkgCurrentInstalledDir)include\SDL2;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> +      <BufferSecurityCheck>false</BufferSecurityCheck> +      <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions> +    </ClCompile> +    <Link> +      <GenerateDebugInformation>true</GenerateDebugInformation> +      <EnableCOMDATFolding>true</EnableCOMDATFolding> +      <OptimizeReferences>true</OptimizeReferences> +      <AdditionalLibraryDirectories>%SDL2_DIR%\lib\x86;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> +      <AdditionalDependencies>opengl32.lib;SDL2.lib;SDL2main.lib;%(AdditionalDependencies)</AdditionalDependencies> +      <SubSystem>Console</SubSystem> +      <IgnoreSpecificDefaultLibraries> +      </IgnoreSpecificDefaultLibraries> +    </Link> +  </ItemDefinitionGroup> +  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> +    <ClCompile> +      <WarningLevel>Level4</WarningLevel> +      <Optimization>MaxSpeed</Optimization> +      <FunctionLevelLinking>true</FunctionLevelLinking> +      <IntrinsicFunctions>true</IntrinsicFunctions> +      <AdditionalIncludeDirectories>..\..;..\..\backends;%SDL2_DIR%\include;$(VcpkgCurrentInstalledDir)include\SDL2;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> +      <BufferSecurityCheck>false</BufferSecurityCheck> +      <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions> +    </ClCompile> +    <Link> +      <GenerateDebugInformation>true</GenerateDebugInformation> +      <EnableCOMDATFolding>true</EnableCOMDATFolding> +      <OptimizeReferences>true</OptimizeReferences> +      <AdditionalLibraryDirectories>%SDL2_DIR%\lib\x64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> +      <AdditionalDependencies>opengl32.lib;SDL2.lib;SDL2main.lib;%(AdditionalDependencies)</AdditionalDependencies> +      <SubSystem>Console</SubSystem> +      <IgnoreSpecificDefaultLibraries> +      </IgnoreSpecificDefaultLibraries> +    </Link> +  </ItemDefinitionGroup> +  <ItemGroup> +    <ClCompile Include="..\..\imgui.cpp" /> +    <ClCompile Include="..\..\imgui_demo.cpp" /> +    <ClCompile Include="..\..\imgui_draw.cpp" /> +    <ClCompile Include="..\..\imgui_tables.cpp" /> +    <ClCompile Include="..\..\imgui_widgets.cpp" /> +    <ClCompile Include="..\..\backends\imgui_impl_sdl2.cpp" /> +    <ClCompile Include="..\..\backends\imgui_impl_opengl2.cpp" /> +    <ClCompile Include="main.cpp" /> +  </ItemGroup> +  <ItemGroup> +    <ClInclude Include="..\..\imconfig.h" /> +    <ClInclude Include="..\..\imgui.h" /> +    <ClInclude Include="..\..\imgui_internal.h" /> +    <ClInclude Include="..\..\backends\imgui_impl_sdl2.h" /> +    <ClInclude Include="..\..\backends\imgui_impl_opengl2.h" /> +  </ItemGroup> +  <ItemGroup> +    <None Include="..\..\misc\debuggers\imgui.natstepfilter" /> +    <None Include="..\..\misc\debuggers\imgui.natvis" /> +    <None Include="..\README.txt" /> +  </ItemGroup> +  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> +  <ImportGroup Label="ExtensionTargets"> +  </ImportGroup> +</Project>
\ No newline at end of file diff --git a/lib/imgui-1.90.7/examples/example_sdl2_opengl2/example_sdl2_opengl2.vcxproj.filters b/lib/imgui-1.90.7/examples/example_sdl2_opengl2/example_sdl2_opengl2.vcxproj.filters new file mode 100644 index 0000000..752a196 --- /dev/null +++ b/lib/imgui-1.90.7/examples/example_sdl2_opengl2/example_sdl2_opengl2.vcxproj.filters @@ -0,0 +1,64 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> +  <ItemGroup> +    <Filter Include="imgui"> +      <UniqueIdentifier>{20b90ce4-7fcb-4731-b9a0-075f875de82d}</UniqueIdentifier> +    </Filter> +    <Filter Include="sources"> +      <UniqueIdentifier>{f18ab499-84e1-499f-8eff-9754361e0e52}</UniqueIdentifier> +      <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions> +    </Filter> +  </ItemGroup> +  <ItemGroup> +    <ClCompile Include="..\..\imgui.cpp"> +      <Filter>imgui</Filter> +    </ClCompile> +    <ClCompile Include="..\..\imgui_demo.cpp"> +      <Filter>imgui</Filter> +    </ClCompile> +    <ClCompile Include="..\..\imgui_draw.cpp"> +      <Filter>imgui</Filter> +    </ClCompile> +    <ClCompile Include="main.cpp"> +      <Filter>sources</Filter> +    </ClCompile> +    <ClCompile Include="..\..\imgui_tables.cpp"> +      <Filter>imgui</Filter> +    </ClCompile> +    <ClCompile Include="..\..\imgui_widgets.cpp"> +      <Filter>imgui</Filter> +    </ClCompile> +    <ClCompile Include="..\..\backends\imgui_impl_sdl2.cpp"> +      <Filter>sources</Filter> +    </ClCompile> +    <ClCompile Include="..\..\backends\imgui_impl_opengl2.cpp"> +      <Filter>sources</Filter> +    </ClCompile> +  </ItemGroup> +  <ItemGroup> +    <ClInclude Include="..\..\imconfig.h"> +      <Filter>imgui</Filter> +    </ClInclude> +    <ClInclude Include="..\..\imgui.h"> +      <Filter>imgui</Filter> +    </ClInclude> +    <ClInclude Include="..\..\imgui_internal.h"> +      <Filter>imgui</Filter> +    </ClInclude> +    <ClInclude Include="..\..\backends\imgui_impl_opengl2.h"> +      <Filter>sources</Filter> +    </ClInclude> +    <ClInclude Include="..\..\backends\imgui_impl_sdl2.h"> +      <Filter>sources</Filter> +    </ClInclude> +  </ItemGroup> +  <ItemGroup> +    <None Include="..\README.txt" /> +    <None Include="..\..\misc\debuggers\imgui.natvis"> +      <Filter>imgui</Filter> +    </None> +    <None Include="..\..\misc\debuggers\imgui.natstepfilter"> +      <Filter>imgui</Filter> +    </None> +  </ItemGroup> +</Project>
\ No newline at end of file diff --git a/lib/imgui-1.90.7/examples/example_sdl2_opengl2/main.cpp b/lib/imgui-1.90.7/examples/example_sdl2_opengl2/main.cpp new file mode 100644 index 0000000..efb28ed --- /dev/null +++ b/lib/imgui-1.90.7/examples/example_sdl2_opengl2/main.cpp @@ -0,0 +1,171 @@ +// Dear ImGui: standalone example application for SDL2 + OpenGL +// (SDL is a cross-platform general purpose library for handling windows, inputs, OpenGL/Vulkan/Metal graphics context creation, etc.) + +// 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 + +// **DO NOT USE THIS CODE IF YOUR CODE/ENGINE IS USING MODERN OPENGL (SHADERS, VBO, VAO, etc.)** +// **Prefer using the code in the example_sdl2_opengl3/ folder** +// See imgui_impl_sdl2.cpp for details. + +#include "imgui.h" +#include "imgui_impl_sdl2.h" +#include "imgui_impl_opengl2.h" +#include <stdio.h> +#include <SDL.h> +#include <SDL_opengl.h> + +// Main code +int main(int, char**) +{ +    // Setup SDL +    if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER | SDL_INIT_GAMECONTROLLER) != 0) +    { +        printf("Error: %s\n", SDL_GetError()); +        return -1; +    } + +    // From 2.0.18: Enable native IME. +#ifdef SDL_HINT_IME_SHOW_UI +    SDL_SetHint(SDL_HINT_IME_SHOW_UI, "1"); +#endif + +    // Setup window +    SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); +    SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24); +    SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE, 8); +    SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 2); +    SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 2); +    SDL_WindowFlags window_flags = (SDL_WindowFlags)(SDL_WINDOW_OPENGL | SDL_WINDOW_RESIZABLE | SDL_WINDOW_ALLOW_HIGHDPI); +    SDL_Window* window = SDL_CreateWindow("Dear ImGui SDL2+OpenGL example", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 1280, 720, window_flags); +    if (window == nullptr) +    { +        printf("Error: SDL_CreateWindow(): %s\n", SDL_GetError()); +        return -1; +    } + +    SDL_GLContext gl_context = SDL_GL_CreateContext(window); +    SDL_GL_MakeCurrent(window, gl_context); +    SDL_GL_SetSwapInterval(1); // Enable vsync + +    // 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_ImplSDL2_InitForOpenGL(window, gl_context); +    ImGui_ImplOpenGL2_Init(); + +    // 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); + +    // Main loop +    bool done = false; +    while (!done) +    { +        // Poll and handle events (inputs, window resize, etc.) +        // 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. +        SDL_Event event; +        while (SDL_PollEvent(&event)) +        { +            ImGui_ImplSDL2_ProcessEvent(&event); +            if (event.type == SDL_QUIT) +                done = true; +            if (event.type == SDL_WINDOWEVENT && event.window.event == SDL_WINDOWEVENT_CLOSE && event.window.windowID == SDL_GetWindowID(window)) +                done = true; +        } + +        // Start the Dear ImGui frame +        ImGui_ImplOpenGL2_NewFrame(); +        ImGui_ImplSDL2_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); + +        // 2. Show a simple window that we create ourselves. We use a Begin/End pair to create a named window. +        { +            static float f = 0.0f; +            static int counter = 0; + +            ImGui::Begin("Hello, world!");                          // Create a window called "Hello, world!" and append into it. + +            ImGui::Text("This is some useful text.");               // Display some text (you can use a format strings too) +            ImGui::Checkbox("Demo Window", &show_demo_window);      // Edit bools storing our window open/close state +            ImGui::Checkbox("Another Window", &show_another_window); + +            ImGui::SliderFloat("float", &f, 0.0f, 1.0f);            // Edit 1 float using a slider from 0.0f to 1.0f +            ImGui::ColorEdit3("clear color", (float*)&clear_color); // Edit 3 floats representing a color + +            if (ImGui::Button("Button"))                            // Buttons return true when clicked (most widgets return true when edited/activated) +                counter++; +            ImGui::SameLine(); +            ImGui::Text("counter = %d", counter); + +            ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / io.Framerate, io.Framerate); +            ImGui::End(); +        } + +        // 3. Show another simple window. +        if (show_another_window) +        { +            ImGui::Begin("Another Window", &show_another_window);   // Pass a pointer to our bool variable (the window will have a closing button that will clear the bool when clicked) +            ImGui::Text("Hello from another window!"); +            if (ImGui::Button("Close Me")) +                show_another_window = false; +            ImGui::End(); +        } + +        // Rendering +        ImGui::Render(); +        glViewport(0, 0, (int)io.DisplaySize.x, (int)io.DisplaySize.y); +        glClearColor(clear_color.x * clear_color.w, clear_color.y * clear_color.w, clear_color.z * clear_color.w, clear_color.w); +        glClear(GL_COLOR_BUFFER_BIT); +        //glUseProgram(0); // You may want this if using this code in an OpenGL 3+ context where shaders may be bound +        ImGui_ImplOpenGL2_RenderDrawData(ImGui::GetDrawData()); +        SDL_GL_SwapWindow(window); +    } + +    // Cleanup +    ImGui_ImplOpenGL2_Shutdown(); +    ImGui_ImplSDL2_Shutdown(); +    ImGui::DestroyContext(); + +    SDL_GL_DeleteContext(gl_context); +    SDL_DestroyWindow(window); +    SDL_Quit(); + +    return 0; +} diff --git a/lib/imgui-1.90.7/examples/example_sdl2_opengl3/Makefile.emscripten b/lib/imgui-1.90.7/examples/example_sdl2_opengl3/Makefile.emscripten new file mode 100644 index 0000000..da03484 --- /dev/null +++ b/lib/imgui-1.90.7/examples/example_sdl2_opengl3/Makefile.emscripten @@ -0,0 +1,92 @@ +# +# Makefile to use with SDL+emscripten +# See https://emscripten.org/docs/getting_started/downloads.html +# for installation instructions. +# +# This Makefile assumes you have loaded emscripten's environment. +# (On Windows, you may need to execute emsdk_env.bat or encmdprompt.bat ahead) +# +# Running `make -f Makefile.emscripten` will produce three files: +#  - web/index.html +#  - web/index.js +#  - web/index.wasm +# +# All three are needed to run the demo. + +CC = emcc +CXX = em++ +WEB_DIR = web +EXE = $(WEB_DIR)/index.html +IMGUI_DIR = ../.. +SOURCES = main.cpp +SOURCES += $(IMGUI_DIR)/imgui.cpp $(IMGUI_DIR)/imgui_demo.cpp $(IMGUI_DIR)/imgui_draw.cpp $(IMGUI_DIR)/imgui_tables.cpp $(IMGUI_DIR)/imgui_widgets.cpp +SOURCES += $(IMGUI_DIR)/backends/imgui_impl_sdl2.cpp $(IMGUI_DIR)/backends/imgui_impl_opengl3.cpp +OBJS = $(addsuffix .o, $(basename $(notdir $(SOURCES)))) +UNAME_S := $(shell uname -s) +CPPFLAGS = +LDFLAGS = +EMS = + +##--------------------------------------------------------------------- +## EMSCRIPTEN OPTIONS +##--------------------------------------------------------------------- + +# ("EMS" options gets added to both CPPFLAGS and LDFLAGS, whereas some options are for linker only) +EMS += -s USE_SDL=2 +EMS += -s DISABLE_EXCEPTION_CATCHING=1 +LDFLAGS += -s WASM=1 -s ALLOW_MEMORY_GROWTH=1 -s NO_EXIT_RUNTIME=0 -s ASSERTIONS=1 + +# Uncomment next line to fix possible rendering bugs with Emscripten version older then 1.39.0 (https://github.com/ocornut/imgui/issues/2877) +#EMS += -s BINARYEN_TRAP_MODE=clamp +#EMS += -s SAFE_HEAP=1    ## Adds overhead + +# Emscripten allows preloading a file or folder to be accessible at runtime. +# The Makefile for this example project suggests embedding the misc/fonts/ folder into our application, it will then be accessible as "/fonts" +# See documentation for more details: https://emscripten.org/docs/porting/files/packaging_files.html +# (Default value is 0. Set to 1 to enable file-system and include the misc/fonts/ folder as part of the build.) +USE_FILE_SYSTEM ?= 0 +ifeq ($(USE_FILE_SYSTEM), 0) +LDFLAGS += -s NO_FILESYSTEM=1 +CPPFLAGS += -DIMGUI_DISABLE_FILE_FUNCTIONS +endif +ifeq ($(USE_FILE_SYSTEM), 1) +LDFLAGS += --no-heap-copy --preload-file ../../misc/fonts@/fonts +endif + +##--------------------------------------------------------------------- +## FINAL BUILD FLAGS +##--------------------------------------------------------------------- + +CPPFLAGS += -I$(IMGUI_DIR) -I$(IMGUI_DIR)/backends +#CPPFLAGS += -g +CPPFLAGS += -Wall -Wformat -Os $(EMS) +LDFLAGS += --shell-file ../libs/emscripten/shell_minimal.html +LDFLAGS += $(EMS) + +##--------------------------------------------------------------------- +## BUILD RULES +##--------------------------------------------------------------------- + +%.o:%.cpp +	$(CXX) $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $< + +%.o:$(IMGUI_DIR)/%.cpp +	$(CXX) $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $< + +%.o:$(IMGUI_DIR)/backends/%.cpp +	$(CXX) $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $< + +all: $(EXE) +	@echo Build complete for $(EXE) + +$(WEB_DIR): +	mkdir $@ + +serve: all +	python3 -m http.server -d $(WEB_DIR) + +$(EXE): $(OBJS) $(WEB_DIR) +	$(CXX) -o $@ $(OBJS) $(LDFLAGS) + +clean: +	rm -rf $(OBJS) $(WEB_DIR) diff --git a/lib/imgui-1.90.7/examples/example_sdl2_opengl3/README.md b/lib/imgui-1.90.7/examples/example_sdl2_opengl3/README.md new file mode 100644 index 0000000..81fd9fe --- /dev/null +++ b/lib/imgui-1.90.7/examples/example_sdl2_opengl3/README.md @@ -0,0 +1,57 @@ + +# How to Build + +## Windows with Visual Studio's IDE + +Use the provided project file (.vcxproj). Add to solution (imgui_examples.sln) if necessary. + +## Windows with Visual Studio's CLI + +Use build_win32.bat or directly: +``` +set SDL2_DIR=path_to_your_sdl2_folder +cl /Zi /MD /utf-8 /I.. /I..\.. /I%SDL2_DIR%\include main.cpp ..\..\backends\imgui_impl_sdl2.cpp ..\..\backends\imgui_impl_opengl3.cpp ..\..\imgui*.cpp /FeDebug/example_sdl2_opengl3.exe /FoDebug/ /link /libpath:%SDL2_DIR%\lib\x86 SDL2.lib SDL2main.lib opengl32.lib /subsystem:console +#                 ^^ include paths                  ^^ source files                                                                                    ^^ output exe                    ^^ output dir   ^^ libraries +# or for 64-bit: +cl /Zi /MD /utf-8 /I.. /I..\.. /I%SDL2_DIR%\include main.cpp ..\..\backends\imgui_impl_sdl2.cpp ..\..\backends\imgui_impl_opengl3.cpp ..\..\imgui*.cpp /FeDebug/example_sdl2_opengl3.exe /FoDebug/ /link /libpath:%SDL2_DIR%\lib\x64 SDL2.lib SDL2main.lib opengl32.lib /subsystem:console +``` + +## Linux and similar Unixes + +Use our Makefile or directly: +``` +c++ `sdl2-config --cflags` -I .. -I ../.. -I ../../backends +  main.cpp ../../backends/imgui_impl_sdl2.cpp ../../backends/imgui_impl_opengl3.cpp ../../imgui*.cpp +  `sdl2-config --libs` -lGL -ldl +``` + +## macOS + +Use our Makefile or directly: +``` +brew install sdl2 +c++ `sdl2-config --cflags` -I .. -I ../.. -I ../../backends +  main.cpp ../../backends/imgui_impl_sdl2.cpp ../../backends/imgui_impl_opengl3.cpp ../../imgui*.cpp +  `sdl2-config --libs` -framework OpenGl -framework CoreFoundation +``` + +## Emscripten + +**Building** + +You need to install Emscripten from https://emscripten.org/docs/getting_started/downloads.html, and have the environment variables set, as described in https://emscripten.org/docs/getting_started/downloads.html#installation-instructions + +- Depending on your configuration, in Windows you may need to run `emsdk/emsdk_env.bat` in your console to access the Emscripten command-line tools. +- You may also refer to our [Continuous Integration setup](https://github.com/ocornut/imgui/tree/master/.github/workflows) for Emscripten setup. +- Then build using `make -f Makefile.emscripten` while in the current directory. + +**Running an Emscripten project** + +To run on a local machine: +- `make -f Makefile.emscripten serve` will use Python3 to spawn a local webserver, you can then browse http://localhost:8000 to access your build. +- Otherwise, generally you will need a local webserver. Quoting [https://emscripten.org/docs/getting_started](https://emscripten.org/docs/getting_started/Tutorial.html#generating-html):<br> +_"Unfortunately several browsers (including Chrome, Safari, and Internet Explorer) do not support file:// [XHR](https://emscripten.org/docs/site/glossary.html#term-xhr) requests, and can’t load extra files needed by the HTML (like a .wasm file, or packaged file data as mentioned lower down). For these browsers you’ll need to serve the files using a [local webserver](https://emscripten.org/docs/getting_started/FAQ.html#faq-local-webserver) and then open http://localhost:8000/hello.html."_ +- Emscripten SDK has a handy `emrun` command: `emrun web/index.html --browser firefox` which will spawn a temporary local webserver (in Firefox). See https://emscripten.org/docs/compiling/Running-html-files-with-emrun.html for details. +- You may use Python 3 builtin webserver: `python -m http.server -d web` (this is what `make serve` uses). +- You may use Python 2 builtin webserver: `cd web && python -m SimpleHTTPServer`. +- If you are accessing the files over a network, certain browsers, such as Firefox, will restrict Gamepad API access to secure contexts only (e.g. https only). diff --git a/lib/imgui-1.90.7/examples/example_sdl2_opengl3/build_win32.bat b/lib/imgui-1.90.7/examples/example_sdl2_opengl3/build_win32.bat new file mode 100644 index 0000000..7b2fac9 --- /dev/null +++ b/lib/imgui-1.90.7/examples/example_sdl2_opengl3/build_win32.bat @@ -0,0 +1,8 @@ +@REM Build for Visual Studio compiler. Run your copy of vcvars32.bat or vcvarsall.bat to setup command-line compiler. +@set OUT_DIR=Debug +@set OUT_EXE=example_sdl2_opengl3 +@set INCLUDES=/I..\.. /I..\..\backends /I%SDL2_DIR%\include +@set SOURCES=main.cpp ..\..\backends\imgui_impl_sdl2.cpp ..\..\backends\imgui_impl_opengl3.cpp ..\..\imgui*.cpp +@set LIBS=/LIBPATH:%SDL2_DIR%\lib\x86 SDL2.lib SDL2main.lib opengl32.lib shell32.lib +mkdir %OUT_DIR% +cl /nologo /Zi /MD /utf-8 %INCLUDES% %SOURCES% /Fe%OUT_DIR%/%OUT_EXE%.exe /Fo%OUT_DIR%/ /link %LIBS% /subsystem:console diff --git a/lib/imgui-1.90.7/examples/example_sdl2_opengl3/example_sdl2_opengl3.vcxproj b/lib/imgui-1.90.7/examples/example_sdl2_opengl3/example_sdl2_opengl3.vcxproj new file mode 100644 index 0000000..6a81c67 --- /dev/null +++ b/lib/imgui-1.90.7/examples/example_sdl2_opengl3/example_sdl2_opengl3.vcxproj @@ -0,0 +1,187 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> +  <ItemGroup Label="ProjectConfigurations"> +    <ProjectConfiguration Include="Debug|Win32"> +      <Configuration>Debug</Configuration> +      <Platform>Win32</Platform> +    </ProjectConfiguration> +    <ProjectConfiguration Include="Debug|x64"> +      <Configuration>Debug</Configuration> +      <Platform>x64</Platform> +    </ProjectConfiguration> +    <ProjectConfiguration Include="Release|Win32"> +      <Configuration>Release</Configuration> +      <Platform>Win32</Platform> +    </ProjectConfiguration> +    <ProjectConfiguration Include="Release|x64"> +      <Configuration>Release</Configuration> +      <Platform>x64</Platform> +    </ProjectConfiguration> +  </ItemGroup> +  <PropertyGroup Label="Globals"> +    <ProjectGuid>{BBAEB705-1669-40F3-8567-04CF6A991F4C}</ProjectGuid> +    <RootNamespace>example_sdl2_opengl3</RootNamespace> +    <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion> +  </PropertyGroup> +  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> +  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> +    <ConfigurationType>Application</ConfigurationType> +    <UseDebugLibraries>true</UseDebugLibraries> +    <CharacterSet>MultiByte</CharacterSet> +    <PlatformToolset>v140</PlatformToolset> +  </PropertyGroup> +  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration"> +    <ConfigurationType>Application</ConfigurationType> +    <UseDebugLibraries>true</UseDebugLibraries> +    <CharacterSet>MultiByte</CharacterSet> +    <PlatformToolset>v140</PlatformToolset> +  </PropertyGroup> +  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration"> +    <ConfigurationType>Application</ConfigurationType> +    <UseDebugLibraries>false</UseDebugLibraries> +    <WholeProgramOptimization>true</WholeProgramOptimization> +    <CharacterSet>MultiByte</CharacterSet> +    <PlatformToolset>v140</PlatformToolset> +  </PropertyGroup> +  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration"> +    <ConfigurationType>Application</ConfigurationType> +    <UseDebugLibraries>false</UseDebugLibraries> +    <WholeProgramOptimization>true</WholeProgramOptimization> +    <CharacterSet>MultiByte</CharacterSet> +    <PlatformToolset>v140</PlatformToolset> +  </PropertyGroup> +  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> +  <ImportGroup Label="ExtensionSettings"> +  </ImportGroup> +  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> +    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> +  </ImportGroup> +  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets"> +    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> +  </ImportGroup> +  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> +    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> +  </ImportGroup> +  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets"> +    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> +  </ImportGroup> +  <PropertyGroup Label="UserMacros" /> +  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> +    <OutDir>$(ProjectDir)$(Configuration)\</OutDir> +    <IntDir>$(ProjectDir)$(Configuration)\</IntDir> +    <IncludePath>$(IncludePath)</IncludePath> +  </PropertyGroup> +  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> +    <OutDir>$(ProjectDir)$(Configuration)\</OutDir> +    <IntDir>$(ProjectDir)$(Configuration)\</IntDir> +    <IncludePath>$(IncludePath)</IncludePath> +  </PropertyGroup> +  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> +    <OutDir>$(ProjectDir)$(Configuration)\</OutDir> +    <IntDir>$(ProjectDir)$(Configuration)\</IntDir> +    <IncludePath>$(IncludePath)</IncludePath> +  </PropertyGroup> +  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> +    <OutDir>$(ProjectDir)$(Configuration)\</OutDir> +    <IntDir>$(ProjectDir)$(Configuration)\</IntDir> +    <IncludePath>$(IncludePath)</IncludePath> +  </PropertyGroup> +  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> +    <ClCompile> +      <WarningLevel>Level4</WarningLevel> +      <Optimization>Disabled</Optimization> +      <AdditionalIncludeDirectories>..\..;..\..\backends;%SDL2_DIR%\include;$(VcpkgCurrentInstalledDir)include\SDL2;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> +      <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions> +    </ClCompile> +    <Link> +      <GenerateDebugInformation>true</GenerateDebugInformation> +      <AdditionalLibraryDirectories>%SDL2_DIR%\lib\x86;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> +      <AdditionalDependencies>opengl32.lib;SDL2.lib;SDL2main.lib;%(AdditionalDependencies)</AdditionalDependencies> +      <SubSystem>Console</SubSystem> +      <IgnoreSpecificDefaultLibraries>msvcrt.lib</IgnoreSpecificDefaultLibraries> +    </Link> +  </ItemDefinitionGroup> +  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> +    <ClCompile> +      <WarningLevel>Level4</WarningLevel> +      <Optimization>Disabled</Optimization> +      <AdditionalIncludeDirectories>..\..;..\..\backends;%SDL2_DIR%\include;$(VcpkgCurrentInstalledDir)include\SDL2;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> +      <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions> +    </ClCompile> +    <Link> +      <GenerateDebugInformation>true</GenerateDebugInformation> +      <AdditionalLibraryDirectories>%SDL2_DIR%\lib\x64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> +      <AdditionalDependencies>opengl32.lib;SDL2.lib;SDL2main.lib;%(AdditionalDependencies)</AdditionalDependencies> +      <SubSystem>Console</SubSystem> +      <IgnoreSpecificDefaultLibraries>msvcrt.lib</IgnoreSpecificDefaultLibraries> +    </Link> +  </ItemDefinitionGroup> +  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> +    <ClCompile> +      <WarningLevel>Level4</WarningLevel> +      <Optimization>MaxSpeed</Optimization> +      <FunctionLevelLinking>true</FunctionLevelLinking> +      <IntrinsicFunctions>true</IntrinsicFunctions> +      <AdditionalIncludeDirectories>..\..;..\..\backends;%SDL2_DIR%\include;$(VcpkgCurrentInstalledDir)include\SDL2;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> +      <BufferSecurityCheck>false</BufferSecurityCheck> +      <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions> +    </ClCompile> +    <Link> +      <GenerateDebugInformation>true</GenerateDebugInformation> +      <EnableCOMDATFolding>true</EnableCOMDATFolding> +      <OptimizeReferences>true</OptimizeReferences> +      <AdditionalLibraryDirectories>%SDL2_DIR%\lib\x86;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> +      <AdditionalDependencies>opengl32.lib;SDL2.lib;SDL2main.lib;%(AdditionalDependencies)</AdditionalDependencies> +      <SubSystem>Console</SubSystem> +      <IgnoreSpecificDefaultLibraries> +      </IgnoreSpecificDefaultLibraries> +    </Link> +  </ItemDefinitionGroup> +  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> +    <ClCompile> +      <WarningLevel>Level4</WarningLevel> +      <Optimization>MaxSpeed</Optimization> +      <FunctionLevelLinking>true</FunctionLevelLinking> +      <IntrinsicFunctions>true</IntrinsicFunctions> +      <AdditionalIncludeDirectories>..\..;..\..\backends;%SDL2_DIR%\include;$(VcpkgCurrentInstalledDir)include\SDL2;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> +      <BufferSecurityCheck>false</BufferSecurityCheck> +      <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions> +    </ClCompile> +    <Link> +      <GenerateDebugInformation>true</GenerateDebugInformation> +      <EnableCOMDATFolding>true</EnableCOMDATFolding> +      <OptimizeReferences>true</OptimizeReferences> +      <AdditionalLibraryDirectories>%SDL2_DIR%\lib\x64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> +      <AdditionalDependencies>opengl32.lib;SDL2.lib;SDL2main.lib;%(AdditionalDependencies)</AdditionalDependencies> +      <SubSystem>Console</SubSystem> +      <IgnoreSpecificDefaultLibraries> +      </IgnoreSpecificDefaultLibraries> +    </Link> +  </ItemDefinitionGroup> +  <ItemGroup> +    <ClCompile Include="..\..\imgui.cpp" /> +    <ClCompile Include="..\..\imgui_demo.cpp" /> +    <ClCompile Include="..\..\imgui_draw.cpp" /> +    <ClCompile Include="..\..\imgui_tables.cpp" /> +    <ClCompile Include="..\..\imgui_widgets.cpp" /> +    <ClCompile Include="..\..\backends\imgui_impl_sdl2.cpp" /> +    <ClCompile Include="..\..\backends\imgui_impl_opengl3.cpp" /> +    <ClCompile Include="main.cpp" /> +  </ItemGroup> +  <ItemGroup> +    <ClInclude Include="..\..\imconfig.h" /> +    <ClInclude Include="..\..\imgui.h" /> +    <ClInclude Include="..\..\imgui_internal.h" /> +    <ClInclude Include="..\..\backends\imgui_impl_sdl2.h" /> +    <ClInclude Include="..\..\backends\imgui_impl_opengl3.h" /> +    <ClInclude Include="..\..\backends\imgui_impl_opengl3_loader.h" /> +  </ItemGroup> +  <ItemGroup> +    <None Include="..\..\misc\debuggers\imgui.natstepfilter" /> +    <None Include="..\..\misc\debuggers\imgui.natvis" /> +    <None Include="..\README.txt" /> +  </ItemGroup> +  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> +  <ImportGroup Label="ExtensionTargets"> +  </ImportGroup> +</Project>
\ No newline at end of file diff --git a/lib/imgui-1.90.7/examples/example_sdl2_opengl3/example_sdl2_opengl3.vcxproj.filters b/lib/imgui-1.90.7/examples/example_sdl2_opengl3/example_sdl2_opengl3.vcxproj.filters new file mode 100644 index 0000000..846d557 --- /dev/null +++ b/lib/imgui-1.90.7/examples/example_sdl2_opengl3/example_sdl2_opengl3.vcxproj.filters @@ -0,0 +1,67 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> +  <ItemGroup> +    <Filter Include="imgui"> +      <UniqueIdentifier>{20b90ce4-7fcb-4731-b9a0-075f875de82d}</UniqueIdentifier> +    </Filter> +    <Filter Include="sources"> +      <UniqueIdentifier>{f18ab499-84e1-499f-8eff-9754361e0e52}</UniqueIdentifier> +      <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions> +    </Filter> +  </ItemGroup> +  <ItemGroup> +    <ClCompile Include="..\..\imgui.cpp"> +      <Filter>imgui</Filter> +    </ClCompile> +    <ClCompile Include="..\..\imgui_demo.cpp"> +      <Filter>imgui</Filter> +    </ClCompile> +    <ClCompile Include="..\..\imgui_draw.cpp"> +      <Filter>imgui</Filter> +    </ClCompile> +    <ClCompile Include="main.cpp"> +      <Filter>sources</Filter> +    </ClCompile> +    <ClCompile Include="..\..\backends\imgui_impl_sdl2.cpp"> +      <Filter>sources</Filter> +    </ClCompile> +    <ClCompile Include="..\..\backends\imgui_impl_opengl3.cpp"> +      <Filter>sources</Filter> +    </ClCompile> +    <ClCompile Include="..\..\imgui_tables.cpp"> +      <Filter>imgui</Filter> +    </ClCompile> +    <ClCompile Include="..\..\imgui_widgets.cpp"> +      <Filter>imgui</Filter> +    </ClCompile> +  </ItemGroup> +  <ItemGroup> +    <ClInclude Include="..\..\imconfig.h"> +      <Filter>imgui</Filter> +    </ClInclude> +    <ClInclude Include="..\..\imgui.h"> +      <Filter>imgui</Filter> +    </ClInclude> +    <ClInclude Include="..\..\imgui_internal.h"> +      <Filter>imgui</Filter> +    </ClInclude> +    <ClInclude Include="..\..\backends\imgui_impl_sdl2.h"> +      <Filter>sources</Filter> +    </ClInclude> +    <ClInclude Include="..\..\backends\imgui_impl_opengl3.h"> +      <Filter>sources</Filter> +    </ClInclude> +    <ClInclude Include="..\..\backends\imgui_impl_opengl3_loader.h"> +      <Filter>sources</Filter> +    </ClInclude> +  </ItemGroup> +  <ItemGroup> +    <None Include="..\README.txt" /> +    <None Include="..\..\misc\debuggers\imgui.natvis"> +      <Filter>imgui</Filter> +    </None> +    <None Include="..\..\misc\debuggers\imgui.natstepfilter"> +      <Filter>imgui</Filter> +    </None> +  </ItemGroup> +</Project>
\ No newline at end of file diff --git a/lib/imgui-1.90.7/examples/example_sdl2_opengl3/main.cpp b/lib/imgui-1.90.7/examples/example_sdl2_opengl3/main.cpp new file mode 100644 index 0000000..d748c13 --- /dev/null +++ b/lib/imgui-1.90.7/examples/example_sdl2_opengl3/main.cpp @@ -0,0 +1,208 @@ +// Dear ImGui: standalone example application for SDL2 + OpenGL +// (SDL is a cross-platform general purpose library for handling windows, inputs, OpenGL/Vulkan/Metal graphics context creation, etc.) + +// 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_sdl2.h" +#include "imgui_impl_opengl3.h" +#include <stdio.h> +#include <SDL.h> +#if defined(IMGUI_IMPL_OPENGL_ES2) +#include <SDL_opengles2.h> +#else +#include <SDL_opengl.h> +#endif + +// This example can also compile and run with Emscripten! See 'Makefile.emscripten' for details. +#ifdef __EMSCRIPTEN__ +#include "../libs/emscripten/emscripten_mainloop_stub.h" +#endif + +// Main code +int main(int, char**) +{ +    // Setup SDL +    if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER | SDL_INIT_GAMECONTROLLER) != 0) +    { +        printf("Error: %s\n", SDL_GetError()); +        return -1; +    } + +    // Decide GL+GLSL versions +#if defined(IMGUI_IMPL_OPENGL_ES2) +    // GL ES 2.0 + GLSL 100 +    const char* glsl_version = "#version 100"; +    SDL_GL_SetAttribute(SDL_GL_CONTEXT_FLAGS, 0); +    SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_ES); +    SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 2); +    SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 0); +#elif defined(__APPLE__) +    // GL 3.2 Core + GLSL 150 +    const char* glsl_version = "#version 150"; +    SDL_GL_SetAttribute(SDL_GL_CONTEXT_FLAGS, SDL_GL_CONTEXT_FORWARD_COMPATIBLE_FLAG); // Always required on Mac +    SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE); +    SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3); +    SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 2); +#else +    // GL 3.0 + GLSL 130 +    const char* glsl_version = "#version 130"; +    SDL_GL_SetAttribute(SDL_GL_CONTEXT_FLAGS, 0); +    SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE); +    SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3); +    SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 0); +#endif + +    // From 2.0.18: Enable native IME. +#ifdef SDL_HINT_IME_SHOW_UI +    SDL_SetHint(SDL_HINT_IME_SHOW_UI, "1"); +#endif + +    // Create window with graphics context +    SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); +    SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24); +    SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE, 8); +    SDL_WindowFlags window_flags = (SDL_WindowFlags)(SDL_WINDOW_OPENGL | SDL_WINDOW_RESIZABLE | SDL_WINDOW_ALLOW_HIGHDPI); +    SDL_Window* window = SDL_CreateWindow("Dear ImGui SDL2+OpenGL3 example", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 1280, 720, window_flags); +    if (window == nullptr) +    { +        printf("Error: SDL_CreateWindow(): %s\n", SDL_GetError()); +        return -1; +    } + +    SDL_GLContext gl_context = SDL_GL_CreateContext(window); +    SDL_GL_MakeCurrent(window, gl_context); +    SDL_GL_SetSwapInterval(1); // Enable vsync + +    // 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_ImplSDL2_InitForOpenGL(window, gl_context); +    ImGui_ImplOpenGL3_Init(glsl_version); + +    // 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 \\ ! +    // - Our Emscripten build process allows embedding fonts to be accessible at runtime from the "fonts/" folder. See Makefile.emscripten for details. +    //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); + +    // Main loop +    bool done = false; +#ifdef __EMSCRIPTEN__ +    // For an Emscripten build we are disabling file-system access, so let's not attempt to do a fopen() of the imgui.ini file. +    // You may manually call LoadIniSettingsFromMemory() to load settings from your own storage. +    io.IniFilename = nullptr; +    EMSCRIPTEN_MAINLOOP_BEGIN +#else +    while (!done) +#endif +    { +        // Poll and handle events (inputs, window resize, etc.) +        // 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. +        SDL_Event event; +        while (SDL_PollEvent(&event)) +        { +            ImGui_ImplSDL2_ProcessEvent(&event); +            if (event.type == SDL_QUIT) +                done = true; +            if (event.type == SDL_WINDOWEVENT && event.window.event == SDL_WINDOWEVENT_CLOSE && event.window.windowID == SDL_GetWindowID(window)) +                done = true; +        } + +        // Start the Dear ImGui frame +        ImGui_ImplOpenGL3_NewFrame(); +        ImGui_ImplSDL2_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); + +        // 2. Show a simple window that we create ourselves. We use a Begin/End pair to create a named window. +        { +            static float f = 0.0f; +            static int counter = 0; + +            ImGui::Begin("Hello, world!");                          // Create a window called "Hello, world!" and append into it. + +            ImGui::Text("This is some useful text.");               // Display some text (you can use a format strings too) +            ImGui::Checkbox("Demo Window", &show_demo_window);      // Edit bools storing our window open/close state +            ImGui::Checkbox("Another Window", &show_another_window); + +            ImGui::SliderFloat("float", &f, 0.0f, 1.0f);            // Edit 1 float using a slider from 0.0f to 1.0f +            ImGui::ColorEdit3("clear color", (float*)&clear_color); // Edit 3 floats representing a color + +            if (ImGui::Button("Button"))                            // Buttons return true when clicked (most widgets return true when edited/activated) +                counter++; +            ImGui::SameLine(); +            ImGui::Text("counter = %d", counter); + +            ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / io.Framerate, io.Framerate); +            ImGui::End(); +        } + +        // 3. Show another simple window. +        if (show_another_window) +        { +            ImGui::Begin("Another Window", &show_another_window);   // Pass a pointer to our bool variable (the window will have a closing button that will clear the bool when clicked) +            ImGui::Text("Hello from another window!"); +            if (ImGui::Button("Close Me")) +                show_another_window = false; +            ImGui::End(); +        } + +        // Rendering +        ImGui::Render(); +        glViewport(0, 0, (int)io.DisplaySize.x, (int)io.DisplaySize.y); +        glClearColor(clear_color.x * clear_color.w, clear_color.y * clear_color.w, clear_color.z * clear_color.w, clear_color.w); +        glClear(GL_COLOR_BUFFER_BIT); +        ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData()); +        SDL_GL_SwapWindow(window); +    } +#ifdef __EMSCRIPTEN__ +    EMSCRIPTEN_MAINLOOP_END; +#endif + +    // Cleanup +    ImGui_ImplOpenGL3_Shutdown(); +    ImGui_ImplSDL2_Shutdown(); +    ImGui::DestroyContext(); + +    SDL_GL_DeleteContext(gl_context); +    SDL_DestroyWindow(window); +    SDL_Quit(); + +    return 0; +} diff --git a/lib/imgui-1.90.7/examples/example_sdl2_sdlrenderer2/README.md b/lib/imgui-1.90.7/examples/example_sdl2_sdlrenderer2/README.md new file mode 100644 index 0000000..ef6fe85 --- /dev/null +++ b/lib/imgui-1.90.7/examples/example_sdl2_sdlrenderer2/README.md @@ -0,0 +1,25 @@ + +# How to Build + +- On Windows with Visual Studio's CLI + +``` +set SDL2_DIR=path_to_your_sdl2_folder +cl /Zi /MD /utf-8 /I.. /I..\.. /I%SDL2_DIR%\include main.cpp ..\..\backends\imgui_impl_sdl2.cpp ..\..\backends\imgui_impl_sdlrenderer2.cpp ..\..\imgui*.cpp /FeDebug/example_sdl2_sdlrenderer.exe /FoDebug/ /link /libpath:%SDL2_DIR%\lib\x86 SDL2.lib SDL2main.lib /subsystem:console +#                 ^^ include paths                  ^^ source files                                                                                         ^^ output exe                         ^^ output dir  ^^ libraries +# or for 64-bit: +cl /Zi /MD /utf-8 /I.. /I..\.. /I%SDL2_DIR%\include main.cpp ..\..\backends\imgui_impl_sdl2.cpp ..\..\backends\imgui_impl_sdlrenderer2.cpp ..\..\imgui*.cpp /FeDebug/example_sdl2_sdlrenderer.exe /FoDebug/ /link /libpath:%SDL2_DIR%\lib\x64 SDL2.lib SDL2main.lib /subsystem:console +``` + +- On Linux and similar Unixes + +``` +c++ `sdl2-config --cflags` -I .. -I ../.. main.cpp ../../backends/imgui_impl_sdl2.cpp ../../backends/imgui_impl_sdlrenderer2.cpp ../../imgui*.cpp `sdl2-config --libs` -lGL +``` + +- On Mac OS X + +``` +brew install sdl2 +c++ `sdl2-config --cflags` -I .. -I ../.. main.cpp ../../backends/imgui_impl_sdl2.cpp ../../backends/imgui_impl_sdlrenderer2.cpp ../../imgui*.cpp `sdl2-config --libs` -framework OpenGl +``` diff --git a/lib/imgui-1.90.7/examples/example_sdl2_sdlrenderer2/build_win32.bat b/lib/imgui-1.90.7/examples/example_sdl2_sdlrenderer2/build_win32.bat new file mode 100644 index 0000000..e311bfc --- /dev/null +++ b/lib/imgui-1.90.7/examples/example_sdl2_sdlrenderer2/build_win32.bat @@ -0,0 +1,8 @@ +@REM Build for Visual Studio compiler. Run your copy of vcvars32.bat or vcvarsall.bat to setup command-line compiler. +@set OUT_DIR=Debug +@set OUT_EXE=example_sdl2_sdlrenderer_ +@set INCLUDES=/I..\.. /I..\..\backends /I%SDL2_DIR%\include +@set SOURCES=main.cpp ..\..\backends\imgui_impl_sdl2.cpp ..\..\backends\imgui_impl_sdlrenderer2.cpp ..\..\imgui*.cpp +@set LIBS=/LIBPATH:%SDL2_DIR%\lib\x86 SDL2.lib SDL2main.lib +mkdir %OUT_DIR% +cl /nologo /Zi /MD /utf-8 %INCLUDES% %SOURCES% /Fe%OUT_DIR%/%OUT_EXE%.exe /Fo%OUT_DIR%/ /link %LIBS% /subsystem:console diff --git a/lib/imgui-1.90.7/examples/example_sdl2_sdlrenderer2/example_sdl2_sdlrenderer2.vcxproj b/lib/imgui-1.90.7/examples/example_sdl2_sdlrenderer2/example_sdl2_sdlrenderer2.vcxproj new file mode 100644 index 0000000..cf2c890 --- /dev/null +++ b/lib/imgui-1.90.7/examples/example_sdl2_sdlrenderer2/example_sdl2_sdlrenderer2.vcxproj @@ -0,0 +1,187 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> +  <ItemGroup Label="ProjectConfigurations"> +    <ProjectConfiguration Include="Debug|Win32"> +      <Configuration>Debug</Configuration> +      <Platform>Win32</Platform> +    </ProjectConfiguration> +    <ProjectConfiguration Include="Debug|x64"> +      <Configuration>Debug</Configuration> +      <Platform>x64</Platform> +    </ProjectConfiguration> +    <ProjectConfiguration Include="Release|Win32"> +      <Configuration>Release</Configuration> +      <Platform>Win32</Platform> +    </ProjectConfiguration> +    <ProjectConfiguration Include="Release|x64"> +      <Configuration>Release</Configuration> +      <Platform>x64</Platform> +    </ProjectConfiguration> +  </ItemGroup> +  <PropertyGroup Label="Globals"> +    <ProjectGuid>{0C0B2BEA-311F-473C-9652-87923EF639E3}</ProjectGuid> +    <RootNamespace>example_sdl2_sdlrenderer2</RootNamespace> +    <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion> +    <ProjectName>example_sdl2_sdlrenderer2</ProjectName> +  </PropertyGroup> +  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> +  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> +    <ConfigurationType>Application</ConfigurationType> +    <UseDebugLibraries>true</UseDebugLibraries> +    <CharacterSet>MultiByte</CharacterSet> +    <PlatformToolset>v140</PlatformToolset> +  </PropertyGroup> +  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration"> +    <ConfigurationType>Application</ConfigurationType> +    <UseDebugLibraries>true</UseDebugLibraries> +    <CharacterSet>MultiByte</CharacterSet> +    <PlatformToolset>v140</PlatformToolset> +  </PropertyGroup> +  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration"> +    <ConfigurationType>Application</ConfigurationType> +    <UseDebugLibraries>false</UseDebugLibraries> +    <WholeProgramOptimization>true</WholeProgramOptimization> +    <CharacterSet>MultiByte</CharacterSet> +    <PlatformToolset>v140</PlatformToolset> +  </PropertyGroup> +  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration"> +    <ConfigurationType>Application</ConfigurationType> +    <UseDebugLibraries>false</UseDebugLibraries> +    <WholeProgramOptimization>true</WholeProgramOptimization> +    <CharacterSet>MultiByte</CharacterSet> +    <PlatformToolset>v140</PlatformToolset> +  </PropertyGroup> +  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> +  <ImportGroup Label="ExtensionSettings"> +  </ImportGroup> +  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> +    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> +  </ImportGroup> +  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets"> +    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> +  </ImportGroup> +  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> +    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> +  </ImportGroup> +  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets"> +    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> +  </ImportGroup> +  <PropertyGroup Label="UserMacros" /> +  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> +    <OutDir>$(ProjectDir)$(Configuration)\</OutDir> +    <IntDir>$(ProjectDir)$(Configuration)\</IntDir> +    <IncludePath>$(IncludePath)</IncludePath> +  </PropertyGroup> +  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> +    <OutDir>$(ProjectDir)$(Configuration)\</OutDir> +    <IntDir>$(ProjectDir)$(Configuration)\</IntDir> +    <IncludePath>$(IncludePath)</IncludePath> +  </PropertyGroup> +  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> +    <OutDir>$(ProjectDir)$(Configuration)\</OutDir> +    <IntDir>$(ProjectDir)$(Configuration)\</IntDir> +    <IncludePath>$(IncludePath)</IncludePath> +  </PropertyGroup> +  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> +    <OutDir>$(ProjectDir)$(Configuration)\</OutDir> +    <IntDir>$(ProjectDir)$(Configuration)\</IntDir> +    <IncludePath>$(IncludePath)</IncludePath> +  </PropertyGroup> +  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> +    <ClCompile> +      <WarningLevel>Level4</WarningLevel> +      <Optimization>Disabled</Optimization> +      <AdditionalIncludeDirectories>..\..;..\..\backends;%SDL2_DIR%\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> +      <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions> +    </ClCompile> +    <Link> +      <GenerateDebugInformation>true</GenerateDebugInformation> +      <AdditionalLibraryDirectories>%SDL2_DIR%\lib\x86;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> +      <AdditionalDependencies>SDL2.lib;SDL2main.lib;%(AdditionalDependencies)</AdditionalDependencies> +      <SubSystem>Console</SubSystem> +      <IgnoreSpecificDefaultLibraries>msvcrt.lib</IgnoreSpecificDefaultLibraries> +    </Link> +  </ItemDefinitionGroup> +  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> +    <ClCompile> +      <WarningLevel>Level4</WarningLevel> +      <Optimization>Disabled</Optimization> +      <AdditionalIncludeDirectories>..\..;..\..\backends;%SDL2_DIR%\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> +      <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions> +    </ClCompile> +    <Link> +      <GenerateDebugInformation>true</GenerateDebugInformation> +      <AdditionalLibraryDirectories>%SDL2_DIR%\lib\x64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> +      <AdditionalDependencies>SDL2.lib;SDL2main.lib;%(AdditionalDependencies)</AdditionalDependencies> +      <SubSystem>Console</SubSystem> +      <IgnoreSpecificDefaultLibraries>msvcrt.lib</IgnoreSpecificDefaultLibraries> +    </Link> +  </ItemDefinitionGroup> +  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> +    <ClCompile> +      <WarningLevel>Level4</WarningLevel> +      <Optimization>MaxSpeed</Optimization> +      <FunctionLevelLinking>true</FunctionLevelLinking> +      <IntrinsicFunctions>true</IntrinsicFunctions> +      <AdditionalIncludeDirectories>..\..;..\..\backends;%SDL2_DIR%\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> +      <BufferSecurityCheck>false</BufferSecurityCheck> +      <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions> +    </ClCompile> +    <Link> +      <GenerateDebugInformation>true</GenerateDebugInformation> +      <EnableCOMDATFolding>true</EnableCOMDATFolding> +      <OptimizeReferences>true</OptimizeReferences> +      <AdditionalLibraryDirectories>%SDL2_DIR%\lib\x86;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> +      <AdditionalDependencies>SDL2.lib;SDL2main.lib;%(AdditionalDependencies)</AdditionalDependencies> +      <SubSystem>Console</SubSystem> +      <IgnoreSpecificDefaultLibraries> +      </IgnoreSpecificDefaultLibraries> +    </Link> +  </ItemDefinitionGroup> +  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> +    <ClCompile> +      <WarningLevel>Level4</WarningLevel> +      <Optimization>MaxSpeed</Optimization> +      <FunctionLevelLinking>true</FunctionLevelLinking> +      <IntrinsicFunctions>true</IntrinsicFunctions> +      <AdditionalIncludeDirectories>..\..;..\..\backends;%SDL2_DIR%\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> +      <BufferSecurityCheck>false</BufferSecurityCheck> +      <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions> +    </ClCompile> +    <Link> +      <GenerateDebugInformation>true</GenerateDebugInformation> +      <EnableCOMDATFolding>true</EnableCOMDATFolding> +      <OptimizeReferences>true</OptimizeReferences> +      <AdditionalLibraryDirectories>%SDL2_DIR%\lib\x64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> +      <AdditionalDependencies>SDL2.lib;SDL2main.lib;%(AdditionalDependencies)</AdditionalDependencies> +      <SubSystem>Console</SubSystem> +      <IgnoreSpecificDefaultLibraries> +      </IgnoreSpecificDefaultLibraries> +    </Link> +  </ItemDefinitionGroup> +  <ItemGroup> +    <ClCompile Include="..\..\imgui.cpp" /> +    <ClCompile Include="..\..\imgui_demo.cpp" /> +    <ClCompile Include="..\..\imgui_draw.cpp" /> +    <ClCompile Include="..\..\imgui_tables.cpp" /> +    <ClCompile Include="..\..\imgui_widgets.cpp" /> +    <ClCompile Include="..\..\backends\imgui_impl_sdl2.cpp" /> +    <ClCompile Include="..\..\backends\imgui_impl_sdlrenderer2.cpp" /> +    <ClCompile Include="main.cpp" /> +  </ItemGroup> +  <ItemGroup> +    <ClInclude Include="..\..\imconfig.h" /> +    <ClInclude Include="..\..\imgui.h" /> +    <ClInclude Include="..\..\imgui_internal.h" /> +    <ClInclude Include="..\..\backends\imgui_impl_sdl2.h" /> +    <ClInclude Include="..\..\backends\imgui_impl_sdlrenderer2.h" /> +  </ItemGroup> +  <ItemGroup> +    <None Include="..\..\misc\debuggers\imgui.natstepfilter" /> +    <None Include="..\..\misc\debuggers\imgui.natvis" /> +    <None Include="..\README.txt" /> +  </ItemGroup> +  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> +  <ImportGroup Label="ExtensionTargets"> +  </ImportGroup> +</Project> diff --git a/lib/imgui-1.90.7/examples/example_sdl2_sdlrenderer2/example_sdl2_sdlrenderer2.vcxproj.filters b/lib/imgui-1.90.7/examples/example_sdl2_sdlrenderer2/example_sdl2_sdlrenderer2.vcxproj.filters new file mode 100644 index 0000000..5c6da42 --- /dev/null +++ b/lib/imgui-1.90.7/examples/example_sdl2_sdlrenderer2/example_sdl2_sdlrenderer2.vcxproj.filters @@ -0,0 +1,64 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> +  <ItemGroup> +    <Filter Include="imgui"> +      <UniqueIdentifier>{20b90ce4-7fcb-4731-b9a0-075f875de82d}</UniqueIdentifier> +    </Filter> +    <Filter Include="sources"> +      <UniqueIdentifier>{f18ab499-84e1-499f-8eff-9754361e0e52}</UniqueIdentifier> +      <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions> +    </Filter> +  </ItemGroup> +  <ItemGroup> +    <ClCompile Include="..\..\imgui.cpp"> +      <Filter>imgui</Filter> +    </ClCompile> +    <ClCompile Include="..\..\imgui_demo.cpp"> +      <Filter>imgui</Filter> +    </ClCompile> +    <ClCompile Include="..\..\imgui_draw.cpp"> +      <Filter>imgui</Filter> +    </ClCompile> +    <ClCompile Include="main.cpp"> +      <Filter>sources</Filter> +    </ClCompile> +    <ClCompile Include="..\..\imgui_tables.cpp"> +      <Filter>imgui</Filter> +    </ClCompile> +    <ClCompile Include="..\..\imgui_widgets.cpp"> +      <Filter>imgui</Filter> +    </ClCompile> +    <ClCompile Include="..\..\backends\imgui_impl_sdl2.cpp"> +      <Filter>sources</Filter> +    </ClCompile> +    <ClCompile Include="..\..\backends\imgui_impl_sdlrenderer2.cpp"> +      <Filter>sources</Filter> +    </ClCompile> +  </ItemGroup> +  <ItemGroup> +    <ClInclude Include="..\..\imconfig.h"> +      <Filter>imgui</Filter> +    </ClInclude> +    <ClInclude Include="..\..\imgui.h"> +      <Filter>imgui</Filter> +    </ClInclude> +    <ClInclude Include="..\..\imgui_internal.h"> +      <Filter>imgui</Filter> +    </ClInclude> +    <ClInclude Include="..\..\backends\imgui_impl_sdlrenderer2.h"> +      <Filter>sources</Filter> +    </ClInclude> +    <ClInclude Include="..\..\backends\imgui_impl_sdl2.h"> +      <Filter>sources</Filter> +    </ClInclude> +  </ItemGroup> +  <ItemGroup> +    <None Include="..\README.txt" /> +    <None Include="..\..\misc\debuggers\imgui.natvis"> +      <Filter>imgui</Filter> +    </None> +    <None Include="..\..\misc\debuggers\imgui.natstepfilter"> +      <Filter>imgui</Filter> +    </None> +  </ItemGroup> +</Project> diff --git a/lib/imgui-1.90.7/examples/example_sdl2_sdlrenderer2/main.cpp b/lib/imgui-1.90.7/examples/example_sdl2_sdlrenderer2/main.cpp new file mode 100644 index 0000000..8bb3099 --- /dev/null +++ b/lib/imgui-1.90.7/examples/example_sdl2_sdlrenderer2/main.cpp @@ -0,0 +1,172 @@ +// Dear ImGui: standalone example application for SDL2 + SDL_Renderer +// (SDL is a cross-platform general purpose library for handling windows, inputs, OpenGL/Vulkan/Metal graphics context creation, etc.) + +// 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 + +// Important to understand: SDL_Renderer is an _optional_ component of SDL2. +// For a multi-platform app consider using e.g. SDL+DirectX on Windows and SDL+OpenGL on Linux/OSX. + +#include "imgui.h" +#include "imgui_impl_sdl2.h" +#include "imgui_impl_sdlrenderer2.h" +#include <stdio.h> +#include <SDL.h> + +#if !SDL_VERSION_ATLEAST(2,0,17) +#error This backend requires SDL 2.0.17+ because of SDL_RenderGeometry() function +#endif + +// Main code +int main(int, char**) +{ +    // Setup SDL +    if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER | SDL_INIT_GAMECONTROLLER) != 0) +    { +        printf("Error: %s\n", SDL_GetError()); +        return -1; +    } + +    // From 2.0.18: Enable native IME. +#ifdef SDL_HINT_IME_SHOW_UI +    SDL_SetHint(SDL_HINT_IME_SHOW_UI, "1"); +#endif + +    // Create window with SDL_Renderer graphics context +    SDL_WindowFlags window_flags = (SDL_WindowFlags)(SDL_WINDOW_RESIZABLE | SDL_WINDOW_ALLOW_HIGHDPI); +    SDL_Window* window = SDL_CreateWindow("Dear ImGui SDL2+SDL_Renderer example", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 1280, 720, window_flags); +    if (window == nullptr) +    { +        printf("Error: SDL_CreateWindow(): %s\n", SDL_GetError()); +        return -1; +    } +    SDL_Renderer* renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_PRESENTVSYNC | SDL_RENDERER_ACCELERATED); +    if (renderer == nullptr) +    { +        SDL_Log("Error creating SDL_Renderer!"); +        return 0; +    } +    //SDL_RendererInfo info; +    //SDL_GetRendererInfo(renderer, &info); +    //SDL_Log("Current SDL_Renderer: %s", info.name); + +    // 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_ImplSDL2_InitForSDLRenderer(window, renderer); +    ImGui_ImplSDLRenderer2_Init(renderer); + +    // 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); + +    // Main loop +    bool done = false; +    while (!done) +    { +        // Poll and handle events (inputs, window resize, etc.) +        // 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. +        SDL_Event event; +        while (SDL_PollEvent(&event)) +        { +            ImGui_ImplSDL2_ProcessEvent(&event); +            if (event.type == SDL_QUIT) +                done = true; +            if (event.type == SDL_WINDOWEVENT && event.window.event == SDL_WINDOWEVENT_CLOSE && event.window.windowID == SDL_GetWindowID(window)) +                done = true; +        } + +        // Start the Dear ImGui frame +        ImGui_ImplSDLRenderer2_NewFrame(); +        ImGui_ImplSDL2_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); + +        // 2. Show a simple window that we create ourselves. We use a Begin/End pair to create a named window. +        { +            static float f = 0.0f; +            static int counter = 0; + +            ImGui::Begin("Hello, world!");                          // Create a window called "Hello, world!" and append into it. + +            ImGui::Text("This is some useful text.");               // Display some text (you can use a format strings too) +            ImGui::Checkbox("Demo Window", &show_demo_window);      // Edit bools storing our window open/close state +            ImGui::Checkbox("Another Window", &show_another_window); + +            ImGui::SliderFloat("float", &f, 0.0f, 1.0f);            // Edit 1 float using a slider from 0.0f to 1.0f +            ImGui::ColorEdit3("clear color", (float*)&clear_color); // Edit 3 floats representing a color + +            if (ImGui::Button("Button"))                            // Buttons return true when clicked (most widgets return true when edited/activated) +                counter++; +            ImGui::SameLine(); +            ImGui::Text("counter = %d", counter); + +            ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / io.Framerate, io.Framerate); +            ImGui::End(); +        } + +        // 3. Show another simple window. +        if (show_another_window) +        { +            ImGui::Begin("Another Window", &show_another_window);   // Pass a pointer to our bool variable (the window will have a closing button that will clear the bool when clicked) +            ImGui::Text("Hello from another window!"); +            if (ImGui::Button("Close Me")) +                show_another_window = false; +            ImGui::End(); +        } + +        // Rendering +        ImGui::Render(); +        SDL_RenderSetScale(renderer, io.DisplayFramebufferScale.x, io.DisplayFramebufferScale.y); +        SDL_SetRenderDrawColor(renderer, (Uint8)(clear_color.x * 255), (Uint8)(clear_color.y * 255), (Uint8)(clear_color.z * 255), (Uint8)(clear_color.w * 255)); +        SDL_RenderClear(renderer); +        ImGui_ImplSDLRenderer2_RenderDrawData(ImGui::GetDrawData(), renderer); +        SDL_RenderPresent(renderer); +    } + +    // Cleanup +    ImGui_ImplSDLRenderer2_Shutdown(); +    ImGui_ImplSDL2_Shutdown(); +    ImGui::DestroyContext(); + +    SDL_DestroyRenderer(renderer); +    SDL_DestroyWindow(window); +    SDL_Quit(); + +    return 0; +} diff --git a/lib/imgui-1.90.7/examples/example_sdl2_vulkan/build_win32.bat b/lib/imgui-1.90.7/examples/example_sdl2_vulkan/build_win32.bat new file mode 100644 index 0000000..8a4aefc --- /dev/null +++ b/lib/imgui-1.90.7/examples/example_sdl2_vulkan/build_win32.bat @@ -0,0 +1,10 @@ +@REM Build for Visual Studio compiler. Run your copy of vcvars32.bat or vcvarsall.bat to setup command-line compiler. + +@set OUT_EXE=example_sdl2_vulkan +@set INCLUDES=/I..\.. /I..\..\backends /I%SDL2_DIR%\include /I %VULKAN_SDK%\include +@set SOURCES=main.cpp ..\..\backends\imgui_impl_sdl2.cpp ..\..\backends\imgui_impl_vulkan.cpp ..\..\imgui*.cpp +@set LIBS=/LIBPATH:%SDL2_DIR%\lib\x86 /libpath:%VULKAN_SDK%\lib32 SDL2.lib SDL2main.lib shell32.lib vulkan-1.lib + +@set OUT_DIR=Debug +mkdir %OUT_DIR% +cl /nologo /Zi /MD /utf-8 %INCLUDES% /D ImTextureID=ImU64 %SOURCES% /Fe%OUT_DIR%/%OUT_EXE%.exe /Fo%OUT_DIR%/ /link %LIBS% /subsystem:console diff --git a/lib/imgui-1.90.7/examples/example_sdl2_vulkan/example_sdl2_vulkan.vcxproj b/lib/imgui-1.90.7/examples/example_sdl2_vulkan/example_sdl2_vulkan.vcxproj new file mode 100644 index 0000000..ba6afaf --- /dev/null +++ b/lib/imgui-1.90.7/examples/example_sdl2_vulkan/example_sdl2_vulkan.vcxproj @@ -0,0 +1,190 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> +  <ItemGroup Label="ProjectConfigurations"> +    <ProjectConfiguration Include="Debug|Win32"> +      <Configuration>Debug</Configuration> +      <Platform>Win32</Platform> +    </ProjectConfiguration> +    <ProjectConfiguration Include="Debug|x64"> +      <Configuration>Debug</Configuration> +      <Platform>x64</Platform> +    </ProjectConfiguration> +    <ProjectConfiguration Include="Release|Win32"> +      <Configuration>Release</Configuration> +      <Platform>Win32</Platform> +    </ProjectConfiguration> +    <ProjectConfiguration Include="Release|x64"> +      <Configuration>Release</Configuration> +      <Platform>x64</Platform> +    </ProjectConfiguration> +  </ItemGroup> +  <PropertyGroup Label="Globals"> +    <ProjectGuid>{BAE3D0B5-9695-4EB1-AD0F-75890EB4A3B3}</ProjectGuid> +    <RootNamespace>example_sdl2_vulkan</RootNamespace> +    <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion> +  </PropertyGroup> +  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> +  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> +    <ConfigurationType>Application</ConfigurationType> +    <UseDebugLibraries>true</UseDebugLibraries> +    <CharacterSet>MultiByte</CharacterSet> +    <PlatformToolset>v140</PlatformToolset> +  </PropertyGroup> +  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration"> +    <ConfigurationType>Application</ConfigurationType> +    <UseDebugLibraries>true</UseDebugLibraries> +    <CharacterSet>MultiByte</CharacterSet> +    <PlatformToolset>v140</PlatformToolset> +  </PropertyGroup> +  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration"> +    <ConfigurationType>Application</ConfigurationType> +    <UseDebugLibraries>false</UseDebugLibraries> +    <WholeProgramOptimization>true</WholeProgramOptimization> +    <CharacterSet>MultiByte</CharacterSet> +    <PlatformToolset>v140</PlatformToolset> +  </PropertyGroup> +  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration"> +    <ConfigurationType>Application</ConfigurationType> +    <UseDebugLibraries>false</UseDebugLibraries> +    <WholeProgramOptimization>true</WholeProgramOptimization> +    <CharacterSet>MultiByte</CharacterSet> +    <PlatformToolset>v140</PlatformToolset> +  </PropertyGroup> +  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> +  <ImportGroup Label="ExtensionSettings"> +  </ImportGroup> +  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> +    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> +  </ImportGroup> +  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets"> +    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> +  </ImportGroup> +  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> +    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> +  </ImportGroup> +  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets"> +    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> +  </ImportGroup> +  <PropertyGroup Label="UserMacros" /> +  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> +    <OutDir>$(ProjectDir)$(Configuration)\</OutDir> +    <IntDir>$(ProjectDir)$(Configuration)\</IntDir> +    <IncludePath>$(IncludePath)</IncludePath> +  </PropertyGroup> +  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> +    <OutDir>$(ProjectDir)$(Configuration)\</OutDir> +    <IntDir>$(ProjectDir)$(Configuration)\</IntDir> +    <IncludePath>$(IncludePath)</IncludePath> +  </PropertyGroup> +  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> +    <OutDir>$(ProjectDir)$(Configuration)\</OutDir> +    <IntDir>$(ProjectDir)$(Configuration)\</IntDir> +    <IncludePath>$(IncludePath)</IncludePath> +  </PropertyGroup> +  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> +    <OutDir>$(ProjectDir)$(Configuration)\</OutDir> +    <IntDir>$(ProjectDir)$(Configuration)\</IntDir> +    <IncludePath>$(IncludePath)</IncludePath> +  </PropertyGroup> +  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> +    <ClCompile> +      <WarningLevel>Level4</WarningLevel> +      <Optimization>Disabled</Optimization> +      <AdditionalIncludeDirectories>..\..;..\..\backends;%VULKAN_SDK%\include;%SDL2_DIR%\include;$(VcpkgCurrentInstalledDir)include\SDL2;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> +      <PreprocessorDefinitions>ImTextureID=ImU64;_MBCS;%(PreprocessorDefinitions)</PreprocessorDefinitions> +      <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions> +    </ClCompile> +    <Link> +      <GenerateDebugInformation>true</GenerateDebugInformation> +      <AdditionalLibraryDirectories>%VULKAN_SDK%\lib32;%SDL2_DIR%\lib\x86;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> +      <AdditionalDependencies>vulkan-1.lib;SDL2.lib;SDL2main.lib;%(AdditionalDependencies)</AdditionalDependencies> +      <SubSystem>Console</SubSystem> +      <IgnoreSpecificDefaultLibraries>msvcrt.lib</IgnoreSpecificDefaultLibraries> +    </Link> +  </ItemDefinitionGroup> +  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> +    <ClCompile> +      <WarningLevel>Level4</WarningLevel> +      <Optimization>Disabled</Optimization> +      <AdditionalIncludeDirectories>..\..;..\..\backends;%VULKAN_SDK%\include;%SDL2_DIR%\include;$(VcpkgCurrentInstalledDir)include\SDL2;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> +      <PreprocessorDefinitions>ImTextureID=ImU64;_MBCS;%(PreprocessorDefinitions)</PreprocessorDefinitions> +      <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions> +    </ClCompile> +    <Link> +      <GenerateDebugInformation>true</GenerateDebugInformation> +      <AdditionalLibraryDirectories>%VULKAN_SDK%\lib;%SDL2_DIR%\lib\x64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> +      <AdditionalDependencies>vulkan-1.lib;SDL2.lib;SDL2main.lib;%(AdditionalDependencies)</AdditionalDependencies> +      <SubSystem>Console</SubSystem> +      <IgnoreSpecificDefaultLibraries>msvcrt.lib</IgnoreSpecificDefaultLibraries> +    </Link> +  </ItemDefinitionGroup> +  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> +    <ClCompile> +      <WarningLevel>Level4</WarningLevel> +      <Optimization>MaxSpeed</Optimization> +      <FunctionLevelLinking>true</FunctionLevelLinking> +      <IntrinsicFunctions>true</IntrinsicFunctions> +      <AdditionalIncludeDirectories>..\..;..\..\backends;%VULKAN_SDK%\include;%SDL2_DIR%\include;$(VcpkgCurrentInstalledDir)include\SDL2;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> +      <BufferSecurityCheck>false</BufferSecurityCheck> +      <PreprocessorDefinitions>ImTextureID=ImU64;_MBCS;%(PreprocessorDefinitions)</PreprocessorDefinitions> +      <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions> +    </ClCompile> +    <Link> +      <GenerateDebugInformation>true</GenerateDebugInformation> +      <EnableCOMDATFolding>true</EnableCOMDATFolding> +      <OptimizeReferences>true</OptimizeReferences> +      <AdditionalLibraryDirectories>%VULKAN_SDK%\lib32;%SDL2_DIR%\lib\x86;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> +      <AdditionalDependencies>vulkan-1.lib;SDL2.lib;SDL2main.lib;%(AdditionalDependencies)</AdditionalDependencies> +      <SubSystem>Console</SubSystem> +      <IgnoreSpecificDefaultLibraries> +      </IgnoreSpecificDefaultLibraries> +    </Link> +  </ItemDefinitionGroup> +  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> +    <ClCompile> +      <WarningLevel>Level4</WarningLevel> +      <Optimization>MaxSpeed</Optimization> +      <FunctionLevelLinking>true</FunctionLevelLinking> +      <IntrinsicFunctions>true</IntrinsicFunctions> +      <AdditionalIncludeDirectories>..\..;..\..\backends;%VULKAN_SDK%\include;%SDL2_DIR%\include;$(VcpkgCurrentInstalledDir)include\SDL2;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> +      <BufferSecurityCheck>false</BufferSecurityCheck> +      <PreprocessorDefinitions>ImTextureID=ImU64;_MBCS;%(PreprocessorDefinitions)</PreprocessorDefinitions> +      <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions> +    </ClCompile> +    <Link> +      <GenerateDebugInformation>true</GenerateDebugInformation> +      <EnableCOMDATFolding>true</EnableCOMDATFolding> +      <OptimizeReferences>true</OptimizeReferences> +      <AdditionalLibraryDirectories>%VULKAN_SDK%\lib;%SDL2_DIR%\lib\x64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> +      <AdditionalDependencies>vulkan-1.lib;SDL2.lib;SDL2main.lib;%(AdditionalDependencies)</AdditionalDependencies> +      <SubSystem>Console</SubSystem> +      <IgnoreSpecificDefaultLibraries> +      </IgnoreSpecificDefaultLibraries> +    </Link> +  </ItemDefinitionGroup> +  <ItemGroup> +    <ClCompile Include="..\..\imgui.cpp" /> +    <ClCompile Include="..\..\imgui_demo.cpp" /> +    <ClCompile Include="..\..\imgui_draw.cpp" /> +    <ClCompile Include="..\..\imgui_tables.cpp" /> +    <ClCompile Include="..\..\imgui_widgets.cpp" /> +    <ClCompile Include="..\..\backends\imgui_impl_sdl2.cpp" /> +    <ClCompile Include="..\..\backends\imgui_impl_vulkan.cpp" /> +    <ClCompile Include="main.cpp" /> +  </ItemGroup> +  <ItemGroup> +    <ClInclude Include="..\..\imconfig.h" /> +    <ClInclude Include="..\..\imgui.h" /> +    <ClInclude Include="..\..\imgui_internal.h" /> +    <ClInclude Include="..\..\backends\imgui_impl_sdl2.h" /> +    <ClInclude Include="..\..\backends\imgui_impl_vulkan.h" /> +  </ItemGroup> +  <ItemGroup> +    <None Include="..\..\misc\debuggers\imgui.natstepfilter" /> +    <None Include="..\..\misc\debuggers\imgui.natvis" /> +    <None Include="..\README.txt" /> +  </ItemGroup> +  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> +  <ImportGroup Label="ExtensionTargets"> +  </ImportGroup> +</Project>
\ No newline at end of file diff --git a/lib/imgui-1.90.7/examples/example_sdl2_vulkan/example_sdl2_vulkan.vcxproj.filters b/lib/imgui-1.90.7/examples/example_sdl2_vulkan/example_sdl2_vulkan.vcxproj.filters new file mode 100644 index 0000000..ab42485 --- /dev/null +++ b/lib/imgui-1.90.7/examples/example_sdl2_vulkan/example_sdl2_vulkan.vcxproj.filters @@ -0,0 +1,64 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> +  <ItemGroup> +    <Filter Include="imgui"> +      <UniqueIdentifier>{20b90ce4-7fcb-4731-b9a0-075f875de82d}</UniqueIdentifier> +    </Filter> +    <Filter Include="sources"> +      <UniqueIdentifier>{f18ab499-84e1-499f-8eff-9754361e0e52}</UniqueIdentifier> +      <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions> +    </Filter> +  </ItemGroup> +  <ItemGroup> +    <ClCompile Include="..\..\imgui.cpp"> +      <Filter>imgui</Filter> +    </ClCompile> +    <ClCompile Include="..\..\imgui_demo.cpp"> +      <Filter>imgui</Filter> +    </ClCompile> +    <ClCompile Include="..\..\imgui_draw.cpp"> +      <Filter>imgui</Filter> +    </ClCompile> +    <ClCompile Include="..\..\backends\imgui_impl_sdl2.cpp"> +      <Filter>sources</Filter> +    </ClCompile> +    <ClCompile Include="main.cpp"> +      <Filter>sources</Filter> +    </ClCompile> +    <ClCompile Include="..\..\backends\imgui_impl_vulkan.cpp"> +      <Filter>sources</Filter> +    </ClCompile> +    <ClCompile Include="..\..\imgui_widgets.cpp"> +      <Filter>imgui</Filter> +    </ClCompile> +    <ClCompile Include="..\..\imgui_tables.cpp"> +      <Filter>imgui</Filter> +    </ClCompile> +  </ItemGroup> +  <ItemGroup> +    <ClInclude Include="..\..\imconfig.h"> +      <Filter>imgui</Filter> +    </ClInclude> +    <ClInclude Include="..\..\imgui.h"> +      <Filter>imgui</Filter> +    </ClInclude> +    <ClInclude Include="..\..\imgui_internal.h"> +      <Filter>imgui</Filter> +    </ClInclude> +    <ClInclude Include="..\..\backends\imgui_impl_sdl2.h"> +      <Filter>sources</Filter> +    </ClInclude> +    <ClInclude Include="..\..\backends\imgui_impl_vulkan.h"> +      <Filter>sources</Filter> +    </ClInclude> +  </ItemGroup> +  <ItemGroup> +    <None Include="..\README.txt" /> +    <None Include="..\..\misc\debuggers\imgui.natvis"> +      <Filter>imgui</Filter> +    </None> +    <None Include="..\..\misc\debuggers\imgui.natstepfilter"> +      <Filter>imgui</Filter> +    </None> +  </ItemGroup> +</Project>
\ No newline at end of file diff --git a/lib/imgui-1.90.7/examples/example_sdl2_vulkan/main.cpp b/lib/imgui-1.90.7/examples/example_sdl2_vulkan/main.cpp new file mode 100644 index 0000000..df0db4d --- /dev/null +++ b/lib/imgui-1.90.7/examples/example_sdl2_vulkan/main.cpp @@ -0,0 +1,581 @@ +// Dear ImGui: standalone example application for SDL2 + Vulkan + +// 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 + +// Important note to the reader who wish to integrate imgui_impl_vulkan.cpp/.h in their own engine/app. +// - Common ImGui_ImplVulkan_XXX functions and structures are used to interface with imgui_impl_vulkan.cpp/.h. +//   You will use those if you want to use this rendering backend in your engine/app. +// - Helper ImGui_ImplVulkanH_XXX functions and structures are only used by this example (main.cpp) and by +//   the backend itself (imgui_impl_vulkan.cpp), but should PROBABLY NOT be used by your own engine/app code. +// Read comments in imgui_impl_vulkan.h. + +#include "imgui.h" +#include "imgui_impl_sdl2.h" +#include "imgui_impl_vulkan.h" +#include <stdio.h>          // printf, fprintf +#include <stdlib.h>         // abort +#include <SDL.h> +#include <SDL_vulkan.h> + +// Volk headers +#ifdef IMGUI_IMPL_VULKAN_USE_VOLK +#define VOLK_IMPLEMENTATION +#include <Volk/volk.h> +#endif + +//#define APP_USE_UNLIMITED_FRAME_RATE +#ifdef _DEBUG +#define APP_USE_VULKAN_DEBUG_REPORT +#endif + +// Data +static VkAllocationCallbacks*   g_Allocator = nullptr; +static VkInstance               g_Instance = VK_NULL_HANDLE; +static VkPhysicalDevice         g_PhysicalDevice = VK_NULL_HANDLE; +static VkDevice                 g_Device = VK_NULL_HANDLE; +static uint32_t                 g_QueueFamily = (uint32_t)-1; +static VkQueue                  g_Queue = VK_NULL_HANDLE; +static VkDebugReportCallbackEXT g_DebugReport = VK_NULL_HANDLE; +static VkPipelineCache          g_PipelineCache = VK_NULL_HANDLE; +static VkDescriptorPool         g_DescriptorPool = VK_NULL_HANDLE; + +static ImGui_ImplVulkanH_Window g_MainWindowData; +static uint32_t                 g_MinImageCount = 2; +static bool                     g_SwapChainRebuild = false; + +static void check_vk_result(VkResult err) +{ +    if (err == 0) +        return; +    fprintf(stderr, "[vulkan] Error: VkResult = %d\n", err); +    if (err < 0) +        abort(); +} + +#ifdef APP_USE_VULKAN_DEBUG_REPORT +static VKAPI_ATTR VkBool32 VKAPI_CALL debug_report(VkDebugReportFlagsEXT flags, VkDebugReportObjectTypeEXT objectType, uint64_t object, size_t location, int32_t messageCode, const char* pLayerPrefix, const char* pMessage, void* pUserData) +{ +    (void)flags; (void)object; (void)location; (void)messageCode; (void)pUserData; (void)pLayerPrefix; // Unused arguments +    fprintf(stderr, "[vulkan] Debug report from ObjectType: %i\nMessage: %s\n\n", objectType, pMessage); +    return VK_FALSE; +} +#endif // APP_USE_VULKAN_DEBUG_REPORT + +static bool IsExtensionAvailable(const ImVector<VkExtensionProperties>& properties, const char* extension) +{ +    for (const VkExtensionProperties& p : properties) +        if (strcmp(p.extensionName, extension) == 0) +            return true; +    return false; +} + +static VkPhysicalDevice SetupVulkan_SelectPhysicalDevice() +{ +    uint32_t gpu_count; +    VkResult err = vkEnumeratePhysicalDevices(g_Instance, &gpu_count, nullptr); +    check_vk_result(err); +    IM_ASSERT(gpu_count > 0); + +    ImVector<VkPhysicalDevice> gpus; +    gpus.resize(gpu_count); +    err = vkEnumeratePhysicalDevices(g_Instance, &gpu_count, gpus.Data); +    check_vk_result(err); + +    // If a number >1 of GPUs got reported, find discrete GPU if present, or use first one available. This covers +    // most common cases (multi-gpu/integrated+dedicated graphics). Handling more complicated setups (multiple +    // dedicated GPUs) is out of scope of this sample. +    for (VkPhysicalDevice& device : gpus) +    { +        VkPhysicalDeviceProperties properties; +        vkGetPhysicalDeviceProperties(device, &properties); +        if (properties.deviceType == VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU) +            return device; +    } + +    // Use first GPU (Integrated) is a Discrete one is not available. +    if (gpu_count > 0) +        return gpus[0]; +    return VK_NULL_HANDLE; +} + +static void SetupVulkan(ImVector<const char*> instance_extensions) +{ +    VkResult err; +#ifdef IMGUI_IMPL_VULKAN_USE_VOLK +    volkInitialize(); +#endif + +    // Create Vulkan Instance +    { +        VkInstanceCreateInfo create_info = {}; +        create_info.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO; + +        // Enumerate available extensions +        uint32_t properties_count; +        ImVector<VkExtensionProperties> properties; +        vkEnumerateInstanceExtensionProperties(nullptr, &properties_count, nullptr); +        properties.resize(properties_count); +        err = vkEnumerateInstanceExtensionProperties(nullptr, &properties_count, properties.Data); +        check_vk_result(err); + +        // Enable required extensions +        if (IsExtensionAvailable(properties, VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) +            instance_extensions.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME); +#ifdef VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME +        if (IsExtensionAvailable(properties, VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME)) +        { +            instance_extensions.push_back(VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME); +            create_info.flags |= VK_INSTANCE_CREATE_ENUMERATE_PORTABILITY_BIT_KHR; +        } +#endif + +        // Enabling validation layers +#ifdef APP_USE_VULKAN_DEBUG_REPORT +        const char* layers[] = { "VK_LAYER_KHRONOS_validation" }; +        create_info.enabledLayerCount = 1; +        create_info.ppEnabledLayerNames = layers; +        instance_extensions.push_back("VK_EXT_debug_report"); +#endif + +        // Create Vulkan Instance +        create_info.enabledExtensionCount = (uint32_t)instance_extensions.Size; +        create_info.ppEnabledExtensionNames = instance_extensions.Data; +        err = vkCreateInstance(&create_info, g_Allocator, &g_Instance); +        check_vk_result(err); +#ifdef IMGUI_IMPL_VULKAN_USE_VOLK +        volkLoadInstance(g_Instance); +#endif + +        // Setup the debug report callback +#ifdef APP_USE_VULKAN_DEBUG_REPORT +        auto f_vkCreateDebugReportCallbackEXT = (PFN_vkCreateDebugReportCallbackEXT)vkGetInstanceProcAddr(g_Instance, "vkCreateDebugReportCallbackEXT"); +        IM_ASSERT(f_vkCreateDebugReportCallbackEXT != nullptr); +        VkDebugReportCallbackCreateInfoEXT debug_report_ci = {}; +        debug_report_ci.sType = VK_STRUCTURE_TYPE_DEBUG_REPORT_CALLBACK_CREATE_INFO_EXT; +        debug_report_ci.flags = VK_DEBUG_REPORT_ERROR_BIT_EXT | VK_DEBUG_REPORT_WARNING_BIT_EXT | VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT; +        debug_report_ci.pfnCallback = debug_report; +        debug_report_ci.pUserData = nullptr; +        err = f_vkCreateDebugReportCallbackEXT(g_Instance, &debug_report_ci, g_Allocator, &g_DebugReport); +        check_vk_result(err); +#endif +    } + +    // Select Physical Device (GPU) +    g_PhysicalDevice = SetupVulkan_SelectPhysicalDevice(); + +    // Select graphics queue family +    { +        uint32_t count; +        vkGetPhysicalDeviceQueueFamilyProperties(g_PhysicalDevice, &count, nullptr); +        VkQueueFamilyProperties* queues = (VkQueueFamilyProperties*)malloc(sizeof(VkQueueFamilyProperties) * count); +        vkGetPhysicalDeviceQueueFamilyProperties(g_PhysicalDevice, &count, queues); +        for (uint32_t i = 0; i < count; i++) +            if (queues[i].queueFlags & VK_QUEUE_GRAPHICS_BIT) +            { +                g_QueueFamily = i; +                break; +            } +        free(queues); +        IM_ASSERT(g_QueueFamily != (uint32_t)-1); +    } + +    // Create Logical Device (with 1 queue) +    { +        ImVector<const char*> device_extensions; +        device_extensions.push_back("VK_KHR_swapchain"); + +        // Enumerate physical device extension +        uint32_t properties_count; +        ImVector<VkExtensionProperties> properties; +        vkEnumerateDeviceExtensionProperties(g_PhysicalDevice, nullptr, &properties_count, nullptr); +        properties.resize(properties_count); +        vkEnumerateDeviceExtensionProperties(g_PhysicalDevice, nullptr, &properties_count, properties.Data); +#ifdef VK_KHR_PORTABILITY_SUBSET_EXTENSION_NAME +        if (IsExtensionAvailable(properties, VK_KHR_PORTABILITY_SUBSET_EXTENSION_NAME)) +            device_extensions.push_back(VK_KHR_PORTABILITY_SUBSET_EXTENSION_NAME); +#endif + +        const float queue_priority[] = { 1.0f }; +        VkDeviceQueueCreateInfo queue_info[1] = {}; +        queue_info[0].sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO; +        queue_info[0].queueFamilyIndex = g_QueueFamily; +        queue_info[0].queueCount = 1; +        queue_info[0].pQueuePriorities = queue_priority; +        VkDeviceCreateInfo create_info = {}; +        create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO; +        create_info.queueCreateInfoCount = sizeof(queue_info) / sizeof(queue_info[0]); +        create_info.pQueueCreateInfos = queue_info; +        create_info.enabledExtensionCount = (uint32_t)device_extensions.Size; +        create_info.ppEnabledExtensionNames = device_extensions.Data; +        err = vkCreateDevice(g_PhysicalDevice, &create_info, g_Allocator, &g_Device); +        check_vk_result(err); +        vkGetDeviceQueue(g_Device, g_QueueFamily, 0, &g_Queue); +    } + +    // Create Descriptor Pool +    // The example only requires a single combined image sampler descriptor for the font image and only uses one descriptor set (for that) +    // If you wish to load e.g. additional textures you may need to alter pools sizes. +    { +        VkDescriptorPoolSize pool_sizes[] = +        { +            { VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1 }, +        }; +        VkDescriptorPoolCreateInfo pool_info = {}; +        pool_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO; +        pool_info.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT; +        pool_info.maxSets = 1; +        pool_info.poolSizeCount = (uint32_t)IM_ARRAYSIZE(pool_sizes); +        pool_info.pPoolSizes = pool_sizes; +        err = vkCreateDescriptorPool(g_Device, &pool_info, g_Allocator, &g_DescriptorPool); +        check_vk_result(err); +    } +} + +// All the ImGui_ImplVulkanH_XXX structures/functions are optional helpers used by the demo. +// Your real engine/app may not use them. +static void SetupVulkanWindow(ImGui_ImplVulkanH_Window* wd, VkSurfaceKHR surface, int width, int height) +{ +    wd->Surface = surface; + +    // Check for WSI support +    VkBool32 res; +    vkGetPhysicalDeviceSurfaceSupportKHR(g_PhysicalDevice, g_QueueFamily, wd->Surface, &res); +    if (res != VK_TRUE) +    { +        fprintf(stderr, "Error no WSI support on physical device 0\n"); +        exit(-1); +    } + +    // Select Surface Format +    const VkFormat requestSurfaceImageFormat[] = { VK_FORMAT_B8G8R8A8_UNORM, VK_FORMAT_R8G8B8A8_UNORM, VK_FORMAT_B8G8R8_UNORM, VK_FORMAT_R8G8B8_UNORM }; +    const VkColorSpaceKHR requestSurfaceColorSpace = VK_COLORSPACE_SRGB_NONLINEAR_KHR; +    wd->SurfaceFormat = ImGui_ImplVulkanH_SelectSurfaceFormat(g_PhysicalDevice, wd->Surface, requestSurfaceImageFormat, (size_t)IM_ARRAYSIZE(requestSurfaceImageFormat), requestSurfaceColorSpace); + +    // Select Present Mode +#ifdef APP_UNLIMITED_FRAME_RATE +    VkPresentModeKHR present_modes[] = { VK_PRESENT_MODE_MAILBOX_KHR, VK_PRESENT_MODE_IMMEDIATE_KHR, VK_PRESENT_MODE_FIFO_KHR }; +#else +    VkPresentModeKHR present_modes[] = { VK_PRESENT_MODE_FIFO_KHR }; +#endif +    wd->PresentMode = ImGui_ImplVulkanH_SelectPresentMode(g_PhysicalDevice, wd->Surface, &present_modes[0], IM_ARRAYSIZE(present_modes)); +    //printf("[vulkan] Selected PresentMode = %d\n", wd->PresentMode); + +    // Create SwapChain, RenderPass, Framebuffer, etc. +    IM_ASSERT(g_MinImageCount >= 2); +    ImGui_ImplVulkanH_CreateOrResizeWindow(g_Instance, g_PhysicalDevice, g_Device, wd, g_QueueFamily, g_Allocator, width, height, g_MinImageCount); +} + +static void CleanupVulkan() +{ +    vkDestroyDescriptorPool(g_Device, g_DescriptorPool, g_Allocator); + +#ifdef APP_USE_VULKAN_DEBUG_REPORT +    // Remove the debug report callback +    auto f_vkDestroyDebugReportCallbackEXT = (PFN_vkDestroyDebugReportCallbackEXT)vkGetInstanceProcAddr(g_Instance, "vkDestroyDebugReportCallbackEXT"); +    f_vkDestroyDebugReportCallbackEXT(g_Instance, g_DebugReport, g_Allocator); +#endif // APP_USE_VULKAN_DEBUG_REPORT + +    vkDestroyDevice(g_Device, g_Allocator); +    vkDestroyInstance(g_Instance, g_Allocator); +} + +static void CleanupVulkanWindow() +{ +    ImGui_ImplVulkanH_DestroyWindow(g_Instance, g_Device, &g_MainWindowData, g_Allocator); +} + +static void FrameRender(ImGui_ImplVulkanH_Window* wd, ImDrawData* draw_data) +{ +    VkResult err; + +    VkSemaphore image_acquired_semaphore  = wd->FrameSemaphores[wd->SemaphoreIndex].ImageAcquiredSemaphore; +    VkSemaphore render_complete_semaphore = wd->FrameSemaphores[wd->SemaphoreIndex].RenderCompleteSemaphore; +    err = vkAcquireNextImageKHR(g_Device, wd->Swapchain, UINT64_MAX, image_acquired_semaphore, VK_NULL_HANDLE, &wd->FrameIndex); +    if (err == VK_ERROR_OUT_OF_DATE_KHR || err == VK_SUBOPTIMAL_KHR) +    { +        g_SwapChainRebuild = true; +        return; +    } +    check_vk_result(err); + +    ImGui_ImplVulkanH_Frame* fd = &wd->Frames[wd->FrameIndex]; +    { +        err = vkWaitForFences(g_Device, 1, &fd->Fence, VK_TRUE, UINT64_MAX);    // wait indefinitely instead of periodically checking +        check_vk_result(err); + +        err = vkResetFences(g_Device, 1, &fd->Fence); +        check_vk_result(err); +    } +    { +        err = vkResetCommandPool(g_Device, fd->CommandPool, 0); +        check_vk_result(err); +        VkCommandBufferBeginInfo info = {}; +        info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO; +        info.flags |= VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT; +        err = vkBeginCommandBuffer(fd->CommandBuffer, &info); +        check_vk_result(err); +    } +    { +        VkRenderPassBeginInfo info = {}; +        info.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO; +        info.renderPass = wd->RenderPass; +        info.framebuffer = fd->Framebuffer; +        info.renderArea.extent.width = wd->Width; +        info.renderArea.extent.height = wd->Height; +        info.clearValueCount = 1; +        info.pClearValues = &wd->ClearValue; +        vkCmdBeginRenderPass(fd->CommandBuffer, &info, VK_SUBPASS_CONTENTS_INLINE); +    } + +    // Record dear imgui primitives into command buffer +    ImGui_ImplVulkan_RenderDrawData(draw_data, fd->CommandBuffer); + +    // Submit command buffer +    vkCmdEndRenderPass(fd->CommandBuffer); +    { +        VkPipelineStageFlags wait_stage = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; +        VkSubmitInfo info = {}; +        info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO; +        info.waitSemaphoreCount = 1; +        info.pWaitSemaphores = &image_acquired_semaphore; +        info.pWaitDstStageMask = &wait_stage; +        info.commandBufferCount = 1; +        info.pCommandBuffers = &fd->CommandBuffer; +        info.signalSemaphoreCount = 1; +        info.pSignalSemaphores = &render_complete_semaphore; + +        err = vkEndCommandBuffer(fd->CommandBuffer); +        check_vk_result(err); +        err = vkQueueSubmit(g_Queue, 1, &info, fd->Fence); +        check_vk_result(err); +    } +} + +static void FramePresent(ImGui_ImplVulkanH_Window* wd) +{ +    if (g_SwapChainRebuild) +        return; +    VkSemaphore render_complete_semaphore = wd->FrameSemaphores[wd->SemaphoreIndex].RenderCompleteSemaphore; +    VkPresentInfoKHR info = {}; +    info.sType = VK_STRUCTURE_TYPE_PRESENT_INFO_KHR; +    info.waitSemaphoreCount = 1; +    info.pWaitSemaphores = &render_complete_semaphore; +    info.swapchainCount = 1; +    info.pSwapchains = &wd->Swapchain; +    info.pImageIndices = &wd->FrameIndex; +    VkResult err = vkQueuePresentKHR(g_Queue, &info); +    if (err == VK_ERROR_OUT_OF_DATE_KHR || err == VK_SUBOPTIMAL_KHR) +    { +        g_SwapChainRebuild = true; +        return; +    } +    check_vk_result(err); +    wd->SemaphoreIndex = (wd->SemaphoreIndex + 1) % wd->SemaphoreCount; // Now we can use the next set of semaphores +} + +// Main code +int main(int, char**) +{ +    // Setup SDL +    if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER | SDL_INIT_GAMECONTROLLER) != 0) +    { +        printf("Error: %s\n", SDL_GetError()); +        return -1; +    } + +    // From 2.0.18: Enable native IME. +#ifdef SDL_HINT_IME_SHOW_UI +    SDL_SetHint(SDL_HINT_IME_SHOW_UI, "1"); +#endif + +    // Create window with Vulkan graphics context +    SDL_WindowFlags window_flags = (SDL_WindowFlags)(SDL_WINDOW_VULKAN | SDL_WINDOW_RESIZABLE | SDL_WINDOW_ALLOW_HIGHDPI); +    SDL_Window* window = SDL_CreateWindow("Dear ImGui SDL2+Vulkan example", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 1280, 720, window_flags); +    if (window == nullptr) +    { +        printf("Error: SDL_CreateWindow(): %s\n", SDL_GetError()); +        return -1; +    } + +    ImVector<const char*> extensions; +    uint32_t extensions_count = 0; +    SDL_Vulkan_GetInstanceExtensions(window, &extensions_count, nullptr); +    extensions.resize(extensions_count); +    SDL_Vulkan_GetInstanceExtensions(window, &extensions_count, extensions.Data); +    SetupVulkan(extensions); + +    // Create Window Surface +    VkSurfaceKHR surface; +    VkResult err; +    if (SDL_Vulkan_CreateSurface(window, g_Instance, &surface) == 0) +    { +        printf("Failed to create Vulkan surface.\n"); +        return 1; +    } + +    // Create Framebuffers +    int w, h; +    SDL_GetWindowSize(window, &w, &h); +    ImGui_ImplVulkanH_Window* wd = &g_MainWindowData; +    SetupVulkanWindow(wd, surface, w, h); + +    // 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_ImplSDL2_InitForVulkan(window); +    ImGui_ImplVulkan_InitInfo init_info = {}; +    init_info.Instance = g_Instance; +    init_info.PhysicalDevice = g_PhysicalDevice; +    init_info.Device = g_Device; +    init_info.QueueFamily = g_QueueFamily; +    init_info.Queue = g_Queue; +    init_info.PipelineCache = g_PipelineCache; +    init_info.DescriptorPool = g_DescriptorPool; +    init_info.RenderPass = wd->RenderPass; +    init_info.Subpass = 0; +    init_info.MinImageCount = g_MinImageCount; +    init_info.ImageCount = wd->ImageCount; +    init_info.MSAASamples = VK_SAMPLE_COUNT_1_BIT; +    init_info.Allocator = g_Allocator; +    init_info.CheckVkResultFn = check_vk_result; +    ImGui_ImplVulkan_Init(&init_info); + +    // 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); + +    // Main loop +    bool done = false; +    while (!done) +    { +        // Poll and handle events (inputs, window resize, etc.) +        // 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. +        SDL_Event event; +        while (SDL_PollEvent(&event)) +        { +            ImGui_ImplSDL2_ProcessEvent(&event); +            if (event.type == SDL_QUIT) +                done = true; +            if (event.type == SDL_WINDOWEVENT && event.window.event == SDL_WINDOWEVENT_CLOSE && event.window.windowID == SDL_GetWindowID(window)) +                done = true; +        } + +        // Resize swap chain? +        if (g_SwapChainRebuild) +        { +            int width, height; +            SDL_GetWindowSize(window, &width, &height); +            if (width > 0 && height > 0) +            { +                ImGui_ImplVulkan_SetMinImageCount(g_MinImageCount); +                ImGui_ImplVulkanH_CreateOrResizeWindow(g_Instance, g_PhysicalDevice, g_Device, &g_MainWindowData, g_QueueFamily, g_Allocator, width, height, g_MinImageCount); +                g_MainWindowData.FrameIndex = 0; +                g_SwapChainRebuild = false; +            } +        } + +        // Start the Dear ImGui frame +        ImGui_ImplVulkan_NewFrame(); +        ImGui_ImplSDL2_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); + +        // 2. Show a simple window that we create ourselves. We use a Begin/End pair to create a named window. +        { +            static float f = 0.0f; +            static int counter = 0; + +            ImGui::Begin("Hello, world!");                          // Create a window called "Hello, world!" and append into it. + +            ImGui::Text("This is some useful text.");               // Display some text (you can use a format strings too) +            ImGui::Checkbox("Demo Window", &show_demo_window);      // Edit bools storing our window open/close state +            ImGui::Checkbox("Another Window", &show_another_window); + +            ImGui::SliderFloat("float", &f, 0.0f, 1.0f);            // Edit 1 float using a slider from 0.0f to 1.0f +            ImGui::ColorEdit3("clear color", (float*)&clear_color); // Edit 3 floats representing a color + +            if (ImGui::Button("Button"))                            // Buttons return true when clicked (most widgets return true when edited/activated) +                counter++; +            ImGui::SameLine(); +            ImGui::Text("counter = %d", counter); + +            ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / io.Framerate, io.Framerate); +            ImGui::End(); +        } + +        // 3. Show another simple window. +        if (show_another_window) +        { +            ImGui::Begin("Another Window", &show_another_window);   // Pass a pointer to our bool variable (the window will have a closing button that will clear the bool when clicked) +            ImGui::Text("Hello from another window!"); +            if (ImGui::Button("Close Me")) +                show_another_window = false; +            ImGui::End(); +        } + +        // Rendering +        ImGui::Render(); +        ImDrawData* draw_data = ImGui::GetDrawData(); +        const bool is_minimized = (draw_data->DisplaySize.x <= 0.0f || draw_data->DisplaySize.y <= 0.0f); +        if (!is_minimized) +        { +            wd->ClearValue.color.float32[0] = clear_color.x * clear_color.w; +            wd->ClearValue.color.float32[1] = clear_color.y * clear_color.w; +            wd->ClearValue.color.float32[2] = clear_color.z * clear_color.w; +            wd->ClearValue.color.float32[3] = clear_color.w; +            FrameRender(wd, draw_data); +            FramePresent(wd); +        } +    } + +    // Cleanup +    err = vkDeviceWaitIdle(g_Device); +    check_vk_result(err); +    ImGui_ImplVulkan_Shutdown(); +    ImGui_ImplSDL2_Shutdown(); +    ImGui::DestroyContext(); + +    CleanupVulkanWindow(); +    CleanupVulkan(); + +    SDL_DestroyWindow(window); +    SDL_Quit(); + +    return 0; +} diff --git a/lib/imgui-1.90.7/examples/example_sdl3_opengl3/Makefile.emscripten b/lib/imgui-1.90.7/examples/example_sdl3_opengl3/Makefile.emscripten new file mode 100644 index 0000000..9e9ffd6 --- /dev/null +++ b/lib/imgui-1.90.7/examples/example_sdl3_opengl3/Makefile.emscripten @@ -0,0 +1,96 @@ + +# IMPORTANT: SDL3 IS IN DEVELOPMENT, AS OF 2023-05-30, EMSCRIPTEN DOESN'T SUPPORT SDL3 YET. +# WE ARE LEAVING THIS MAKEFILE AROUND FOR THE DAY IT WILL SUPPORT IT. + +# +# Makefile to use with SDL+emscripten +# See https://emscripten.org/docs/getting_started/downloads.html +# for installation instructions. +# +# This Makefile assumes you have loaded emscripten's environment. +# (On Windows, you may need to execute emsdk_env.bat or encmdprompt.bat ahead) +# +# Running `make -f Makefile.emscripten` will produce three files: +#  - web/index.html +#  - web/index.js +#  - web/index.wasm +# +# All three are needed to run the demo. + +CC = emcc +CXX = em++ +WEB_DIR = web +EXE = $(WEB_DIR)/index.html +IMGUI_DIR = ../.. +SOURCES = main.cpp +SOURCES += $(IMGUI_DIR)/imgui.cpp $(IMGUI_DIR)/imgui_demo.cpp $(IMGUI_DIR)/imgui_draw.cpp $(IMGUI_DIR)/imgui_tables.cpp $(IMGUI_DIR)/imgui_widgets.cpp +SOURCES += $(IMGUI_DIR)/backends/imgui_impl_sdl3.cpp $(IMGUI_DIR)/backends/imgui_impl_opengl3.cpp +OBJS = $(addsuffix .o, $(basename $(notdir $(SOURCES)))) +UNAME_S := $(shell uname -s) +CPPFLAGS = +LDFLAGS = +EMS = + +##--------------------------------------------------------------------- +## EMSCRIPTEN OPTIONS +##--------------------------------------------------------------------- + +# ("EMS" options gets added to both CPPFLAGS and LDFLAGS, whereas some options are for linker only) +EMS += -s USE_SDL=2 +EMS += -s DISABLE_EXCEPTION_CATCHING=1 +LDFLAGS += -s WASM=1 -s ALLOW_MEMORY_GROWTH=1 -s NO_EXIT_RUNTIME=0 -s ASSERTIONS=1 + +# Uncomment next line to fix possible rendering bugs with Emscripten version older then 1.39.0 (https://github.com/ocornut/imgui/issues/2877) +#EMS += -s BINARYEN_TRAP_MODE=clamp +#EMS += -s SAFE_HEAP=1    ## Adds overhead + +# Emscripten allows preloading a file or folder to be accessible at runtime. +# The Makefile for this example project suggests embedding the misc/fonts/ folder into our application, it will then be accessible as "/fonts" +# See documentation for more details: https://emscripten.org/docs/porting/files/packaging_files.html +# (Default value is 0. Set to 1 to enable file-system and include the misc/fonts/ folder as part of the build.) +USE_FILE_SYSTEM ?= 0 +ifeq ($(USE_FILE_SYSTEM), 0) +LDFLAGS += -s NO_FILESYSTEM=1 +CPPFLAGS += -DIMGUI_DISABLE_FILE_FUNCTIONS +endif +ifeq ($(USE_FILE_SYSTEM), 1) +LDFLAGS += --no-heap-copy --preload-file ../../misc/fonts@/fonts +endif + +##--------------------------------------------------------------------- +## FINAL BUILD FLAGS +##--------------------------------------------------------------------- + +CPPFLAGS += -I$(IMGUI_DIR) -I$(IMGUI_DIR)/backends +#CPPFLAGS += -g +CPPFLAGS += -Wall -Wformat -Os $(EMS) +LDFLAGS += --shell-file ../libs/emscripten/shell_minimal.html +LDFLAGS += $(EMS) + +##--------------------------------------------------------------------- +## BUILD RULES +##--------------------------------------------------------------------- + +%.o:%.cpp +	$(CXX) $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $< + +%.o:$(IMGUI_DIR)/%.cpp +	$(CXX) $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $< + +%.o:$(IMGUI_DIR)/backends/%.cpp +	$(CXX) $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $< + +all: $(EXE) +	@echo Build complete for $(EXE) + +$(WEB_DIR): +	mkdir $@ + +serve: all +	python3 -m http.server -d $(WEB_DIR) + +$(EXE): $(OBJS) $(WEB_DIR) +	$(CXX) -o $@ $(OBJS) $(LDFLAGS) + +clean: +	rm -rf $(OBJS) $(WEB_DIR) diff --git a/lib/imgui-1.90.7/examples/example_sdl3_opengl3/README.md b/lib/imgui-1.90.7/examples/example_sdl3_opengl3/README.md new file mode 100644 index 0000000..5828e4b --- /dev/null +++ b/lib/imgui-1.90.7/examples/example_sdl3_opengl3/README.md @@ -0,0 +1,40 @@ + +# How to Build + +## Windows with Visual Studio's IDE + +Use the provided project file (.vcxproj). Add to solution (imgui_examples.sln) if necessary. + +## Windows with Visual Studio's CLI + +Use build_win32.bat or directly: +``` +set SDL2_DIR=path_to_your_sdl3_folder +cl /Zi /MD /utf-8 /I.. /I..\.. /I%SDL2_DIR%\include main.cpp ..\..\backends\imgui_impl_sdl3.cpp ..\..\backends\imgui_impl_opengl3.cpp ..\..\imgui*.cpp /FeDebug/example_sdl3_opengl3.exe /FoDebug/ /link /libpath:%SDL2_DIR%\lib\x86 SDL3.lib opengl32.lib /subsystem:console +#                 ^^ include paths     ^^ source files                                                                                    ^^ output exe                    ^^ output dir   ^^ libraries +# or for 64-bit: +cl /Zi /MD /utf-8 /I.. /I..\.. /I%SDL2_DIR%\include main.cpp ..\..\backends\imgui_impl_sdl3.cpp ..\..\backends\imgui_impl_opengl3.cpp ..\..\imgui*.cpp /FeDebug/example_sdl3_opengl3.exe /FoDebug/ /link /libpath:%SDL2_DIR%\lib\x64 SDL3.lib SDL2mainopengl32.lib /subsystem:console +``` + +## Linux and similar Unixes + +Use our Makefile or directly: +``` +c++ `sdl3-config --cflags` -I .. -I ../.. -I ../../backends +  main.cpp ../../backends/imgui_impl_sdl3.cpp ../../backends/imgui_impl_opengl3.cpp ../../imgui*.cpp +  `sdl3-config --libs` -lGL -ldl +``` + +## macOS + +Use our Makefile or directly: +``` +brew install sdl3 +c++ `sdl3-config --cflags` -I .. -I ../.. -I ../../backends +  main.cpp ../../backends/imgui_impl_sdl3.cpp ../../backends/imgui_impl_opengl3.cpp ../../imgui*.cpp +  `sdl3-config --libs` -framework OpenGl -framework CoreFoundation +``` + +## Emscripten + +As of 2023-05-30 Emscripten doesn't support SDL3 yet. diff --git a/lib/imgui-1.90.7/examples/example_sdl3_opengl3/build_win32.bat b/lib/imgui-1.90.7/examples/example_sdl3_opengl3/build_win32.bat new file mode 100644 index 0000000..5b8d5f8 --- /dev/null +++ b/lib/imgui-1.90.7/examples/example_sdl3_opengl3/build_win32.bat @@ -0,0 +1,8 @@ +@REM Build for Visual Studio compiler. Run your copy of vcvars32.bat or vcvarsall.bat to setup command-line compiler. +@set OUT_DIR=Debug +@set OUT_EXE=example_sdl3_opengl3 +@set INCLUDES=/I..\.. /I..\..\backends /I%SDL3_DIR%\include +@set SOURCES=main.cpp ..\..\backends\imgui_impl_sdl3.cpp ..\..\backends\imgui_impl_opengl3.cpp ..\..\imgui*.cpp +@set LIBS=/LIBPATH:%SDL3_DIR%\lib\x86 SDL3.lib opengl32.lib shell32.lib +mkdir %OUT_DIR% +cl /nologo /Zi /MD /utf-8 %INCLUDES% %SOURCES% /Fe%OUT_DIR%/%OUT_EXE%.exe /Fo%OUT_DIR%/ /link %LIBS% /subsystem:console diff --git a/lib/imgui-1.90.7/examples/example_sdl3_opengl3/example_sdl3_opengl3.vcxproj b/lib/imgui-1.90.7/examples/example_sdl3_opengl3/example_sdl3_opengl3.vcxproj new file mode 100644 index 0000000..051f87d --- /dev/null +++ b/lib/imgui-1.90.7/examples/example_sdl3_opengl3/example_sdl3_opengl3.vcxproj @@ -0,0 +1,187 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> +  <ItemGroup Label="ProjectConfigurations"> +    <ProjectConfiguration Include="Debug|Win32"> +      <Configuration>Debug</Configuration> +      <Platform>Win32</Platform> +    </ProjectConfiguration> +    <ProjectConfiguration Include="Debug|x64"> +      <Configuration>Debug</Configuration> +      <Platform>x64</Platform> +    </ProjectConfiguration> +    <ProjectConfiguration Include="Release|Win32"> +      <Configuration>Release</Configuration> +      <Platform>Win32</Platform> +    </ProjectConfiguration> +    <ProjectConfiguration Include="Release|x64"> +      <Configuration>Release</Configuration> +      <Platform>x64</Platform> +    </ProjectConfiguration> +  </ItemGroup> +  <PropertyGroup Label="Globals"> +    <ProjectGuid>{84AAA301-84FE-428B-9E3E-817BC8123C0C}</ProjectGuid> +    <RootNamespace>example_sdl3_opengl3</RootNamespace> +    <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion> +  </PropertyGroup> +  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> +  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> +    <ConfigurationType>Application</ConfigurationType> +    <UseDebugLibraries>true</UseDebugLibraries> +    <CharacterSet>MultiByte</CharacterSet> +    <PlatformToolset>v140</PlatformToolset> +  </PropertyGroup> +  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration"> +    <ConfigurationType>Application</ConfigurationType> +    <UseDebugLibraries>true</UseDebugLibraries> +    <CharacterSet>MultiByte</CharacterSet> +    <PlatformToolset>v140</PlatformToolset> +  </PropertyGroup> +  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration"> +    <ConfigurationType>Application</ConfigurationType> +    <UseDebugLibraries>false</UseDebugLibraries> +    <WholeProgramOptimization>true</WholeProgramOptimization> +    <CharacterSet>MultiByte</CharacterSet> +    <PlatformToolset>v140</PlatformToolset> +  </PropertyGroup> +  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration"> +    <ConfigurationType>Application</ConfigurationType> +    <UseDebugLibraries>false</UseDebugLibraries> +    <WholeProgramOptimization>true</WholeProgramOptimization> +    <CharacterSet>MultiByte</CharacterSet> +    <PlatformToolset>v140</PlatformToolset> +  </PropertyGroup> +  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> +  <ImportGroup Label="ExtensionSettings"> +  </ImportGroup> +  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> +    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> +  </ImportGroup> +  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets"> +    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> +  </ImportGroup> +  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> +    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> +  </ImportGroup> +  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets"> +    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> +  </ImportGroup> +  <PropertyGroup Label="UserMacros" /> +  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> +    <OutDir>$(ProjectDir)$(Configuration)\</OutDir> +    <IntDir>$(ProjectDir)$(Configuration)\</IntDir> +    <IncludePath>$(IncludePath)</IncludePath> +  </PropertyGroup> +  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> +    <OutDir>$(ProjectDir)$(Configuration)\</OutDir> +    <IntDir>$(ProjectDir)$(Configuration)\</IntDir> +    <IncludePath>$(IncludePath)</IncludePath> +  </PropertyGroup> +  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> +    <OutDir>$(ProjectDir)$(Configuration)\</OutDir> +    <IntDir>$(ProjectDir)$(Configuration)\</IntDir> +    <IncludePath>$(IncludePath)</IncludePath> +  </PropertyGroup> +  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> +    <OutDir>$(ProjectDir)$(Configuration)\</OutDir> +    <IntDir>$(ProjectDir)$(Configuration)\</IntDir> +    <IncludePath>$(IncludePath)</IncludePath> +  </PropertyGroup> +  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> +    <ClCompile> +      <WarningLevel>Level4</WarningLevel> +      <Optimization>Disabled</Optimization> +      <AdditionalIncludeDirectories>..\..;..\..\backends;%SDL3_DIR%\include;$(VcpkgCurrentInstalledDir)include\SDL3;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> +      <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions> +    </ClCompile> +    <Link> +      <GenerateDebugInformation>true</GenerateDebugInformation> +      <AdditionalLibraryDirectories>%SDL3_DIR%\lib\x86;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> +      <AdditionalDependencies>opengl32.lib;SDL3.lib;%(AdditionalDependencies)</AdditionalDependencies> +      <SubSystem>Console</SubSystem> +      <IgnoreSpecificDefaultLibraries>msvcrt.lib</IgnoreSpecificDefaultLibraries> +    </Link> +  </ItemDefinitionGroup> +  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> +    <ClCompile> +      <WarningLevel>Level4</WarningLevel> +      <Optimization>Disabled</Optimization> +      <AdditionalIncludeDirectories>..\..;..\..\backends;%SDL3_DIR%\include;$(VcpkgCurrentInstalledDir)include\SDL3;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> +      <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions> +    </ClCompile> +    <Link> +      <GenerateDebugInformation>true</GenerateDebugInformation> +      <AdditionalLibraryDirectories>%SDL3_DIR%\lib\x64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> +      <AdditionalDependencies>opengl32.lib;SDL3.lib;%(AdditionalDependencies)</AdditionalDependencies> +      <SubSystem>Console</SubSystem> +      <IgnoreSpecificDefaultLibraries>msvcrt.lib</IgnoreSpecificDefaultLibraries> +    </Link> +  </ItemDefinitionGroup> +  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> +    <ClCompile> +      <WarningLevel>Level4</WarningLevel> +      <Optimization>MaxSpeed</Optimization> +      <FunctionLevelLinking>true</FunctionLevelLinking> +      <IntrinsicFunctions>true</IntrinsicFunctions> +      <AdditionalIncludeDirectories>..\..;..\..\backends;%SDL3_DIR%\include;$(VcpkgCurrentInstalledDir)include\SDL3;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> +      <BufferSecurityCheck>false</BufferSecurityCheck> +      <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions> +    </ClCompile> +    <Link> +      <GenerateDebugInformation>true</GenerateDebugInformation> +      <EnableCOMDATFolding>true</EnableCOMDATFolding> +      <OptimizeReferences>true</OptimizeReferences> +      <AdditionalLibraryDirectories>%SDL3_DIR%\lib\x86;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> +      <AdditionalDependencies>opengl32.lib;SDL3.lib;%(AdditionalDependencies)</AdditionalDependencies> +      <SubSystem>Console</SubSystem> +      <IgnoreSpecificDefaultLibraries> +      </IgnoreSpecificDefaultLibraries> +    </Link> +  </ItemDefinitionGroup> +  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> +    <ClCompile> +      <WarningLevel>Level4</WarningLevel> +      <Optimization>MaxSpeed</Optimization> +      <FunctionLevelLinking>true</FunctionLevelLinking> +      <IntrinsicFunctions>true</IntrinsicFunctions> +      <AdditionalIncludeDirectories>..\..;..\..\backends;%SDL3_DIR%\include;$(VcpkgCurrentInstalledDir)include\SDL3;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> +      <BufferSecurityCheck>false</BufferSecurityCheck> +      <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions> +    </ClCompile> +    <Link> +      <GenerateDebugInformation>true</GenerateDebugInformation> +      <EnableCOMDATFolding>true</EnableCOMDATFolding> +      <OptimizeReferences>true</OptimizeReferences> +      <AdditionalLibraryDirectories>%SDL3_DIR%\lib\x64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> +      <AdditionalDependencies>opengl32.lib;SDL3.lib;%(AdditionalDependencies)</AdditionalDependencies> +      <SubSystem>Console</SubSystem> +      <IgnoreSpecificDefaultLibraries> +      </IgnoreSpecificDefaultLibraries> +    </Link> +  </ItemDefinitionGroup> +  <ItemGroup> +    <ClCompile Include="..\..\imgui.cpp" /> +    <ClCompile Include="..\..\imgui_demo.cpp" /> +    <ClCompile Include="..\..\imgui_draw.cpp" /> +    <ClCompile Include="..\..\imgui_tables.cpp" /> +    <ClCompile Include="..\..\imgui_widgets.cpp" /> +    <ClCompile Include="..\..\backends\imgui_impl_sdl3.cpp" /> +    <ClCompile Include="..\..\backends\imgui_impl_opengl3.cpp" /> +    <ClCompile Include="main.cpp" /> +  </ItemGroup> +  <ItemGroup> +    <ClInclude Include="..\..\imconfig.h" /> +    <ClInclude Include="..\..\imgui.h" /> +    <ClInclude Include="..\..\imgui_internal.h" /> +    <ClInclude Include="..\..\backends\imgui_impl_sdl3.h" /> +    <ClInclude Include="..\..\backends\imgui_impl_opengl3.h" /> +    <ClInclude Include="..\..\backends\imgui_impl_opengl3_loader.h" /> +  </ItemGroup> +  <ItemGroup> +    <None Include="..\..\misc\debuggers\imgui.natstepfilter" /> +    <None Include="..\..\misc\debuggers\imgui.natvis" /> +    <None Include="..\README.txt" /> +  </ItemGroup> +  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> +  <ImportGroup Label="ExtensionTargets"> +  </ImportGroup> +</Project>
\ No newline at end of file diff --git a/lib/imgui-1.90.7/examples/example_sdl3_opengl3/example_sdl3_opengl3.vcxproj.filters b/lib/imgui-1.90.7/examples/example_sdl3_opengl3/example_sdl3_opengl3.vcxproj.filters new file mode 100644 index 0000000..f365473 --- /dev/null +++ b/lib/imgui-1.90.7/examples/example_sdl3_opengl3/example_sdl3_opengl3.vcxproj.filters @@ -0,0 +1,67 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> +  <ItemGroup> +    <Filter Include="imgui"> +      <UniqueIdentifier>{20b90ce4-7fcb-4731-b9a0-075f875de82d}</UniqueIdentifier> +    </Filter> +    <Filter Include="sources"> +      <UniqueIdentifier>{f18ab499-84e1-499f-8eff-9754361e0e52}</UniqueIdentifier> +      <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions> +    </Filter> +  </ItemGroup> +  <ItemGroup> +    <ClCompile Include="..\..\imgui.cpp"> +      <Filter>imgui</Filter> +    </ClCompile> +    <ClCompile Include="..\..\imgui_demo.cpp"> +      <Filter>imgui</Filter> +    </ClCompile> +    <ClCompile Include="..\..\imgui_draw.cpp"> +      <Filter>imgui</Filter> +    </ClCompile> +    <ClCompile Include="main.cpp"> +      <Filter>sources</Filter> +    </ClCompile> +    <ClCompile Include="..\..\backends\imgui_impl_sdl3.cpp"> +      <Filter>sources</Filter> +    </ClCompile> +    <ClCompile Include="..\..\backends\imgui_impl_opengl3.cpp"> +      <Filter>sources</Filter> +    </ClCompile> +    <ClCompile Include="..\..\imgui_tables.cpp"> +      <Filter>imgui</Filter> +    </ClCompile> +    <ClCompile Include="..\..\imgui_widgets.cpp"> +      <Filter>imgui</Filter> +    </ClCompile> +  </ItemGroup> +  <ItemGroup> +    <ClInclude Include="..\..\imconfig.h"> +      <Filter>imgui</Filter> +    </ClInclude> +    <ClInclude Include="..\..\imgui.h"> +      <Filter>imgui</Filter> +    </ClInclude> +    <ClInclude Include="..\..\imgui_internal.h"> +      <Filter>imgui</Filter> +    </ClInclude> +    <ClInclude Include="..\..\backends\imgui_impl_sdl3.h"> +      <Filter>sources</Filter> +    </ClInclude> +    <ClInclude Include="..\..\backends\imgui_impl_opengl3.h"> +      <Filter>sources</Filter> +    </ClInclude> +    <ClInclude Include="..\..\backends\imgui_impl_opengl3_loader.h"> +      <Filter>sources</Filter> +    </ClInclude> +  </ItemGroup> +  <ItemGroup> +    <None Include="..\README.txt" /> +    <None Include="..\..\misc\debuggers\imgui.natvis"> +      <Filter>imgui</Filter> +    </None> +    <None Include="..\..\misc\debuggers\imgui.natstepfilter"> +      <Filter>imgui</Filter> +    </None> +  </ItemGroup> +</Project>
\ No newline at end of file diff --git a/lib/imgui-1.90.7/examples/example_sdl3_opengl3/main.cpp b/lib/imgui-1.90.7/examples/example_sdl3_opengl3/main.cpp new file mode 100644 index 0000000..da12589 --- /dev/null +++ b/lib/imgui-1.90.7/examples/example_sdl3_opengl3/main.cpp @@ -0,0 +1,207 @@ +// Dear ImGui: standalone example application for SDL3 + OpenGL +// (SDL is a cross-platform general purpose library for handling windows, inputs, OpenGL/Vulkan/Metal graphics context creation, etc.) + +// 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_sdl3.h" +#include "imgui_impl_opengl3.h" +#include <stdio.h> +#include <SDL3/SDL.h> +#if defined(IMGUI_IMPL_OPENGL_ES2) +#include <SDL3/SDL_opengles2.h> +#else +#include <SDL3/SDL_opengl.h> +#endif + +// This example doesn't compile with Emscripten yet! Awaiting SDL3 support. +#ifdef __EMSCRIPTEN__ +#include "../libs/emscripten/emscripten_mainloop_stub.h" +#endif + +// Main code +int main(int, char**) +{ +    // Setup SDL +    if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER | SDL_INIT_GAMEPAD) != 0) +    { +        printf("Error: SDL_Init(): %s\n", SDL_GetError()); +        return -1; +    } + +    // Decide GL+GLSL versions +#if defined(IMGUI_IMPL_OPENGL_ES2) +    // GL ES 2.0 + GLSL 100 +    const char* glsl_version = "#version 100"; +    SDL_GL_SetAttribute(SDL_GL_CONTEXT_FLAGS, 0); +    SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_ES); +    SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 2); +    SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 0); +#elif defined(__APPLE__) +    // GL 3.2 Core + GLSL 150 +    const char* glsl_version = "#version 150"; +    SDL_GL_SetAttribute(SDL_GL_CONTEXT_FLAGS, SDL_GL_CONTEXT_FORWARD_COMPATIBLE_FLAG); // Always required on Mac +    SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE); +    SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3); +    SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 2); +#else +    // GL 3.0 + GLSL 130 +    const char* glsl_version = "#version 130"; +    SDL_GL_SetAttribute(SDL_GL_CONTEXT_FLAGS, 0); +    SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE); +    SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3); +    SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 0); +#endif + +    // Enable native IME. +    SDL_SetHint(SDL_HINT_IME_SHOW_UI, "1"); + +    // Create window with graphics context +    SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); +    SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24); +    SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE, 8); +    Uint32 window_flags = SDL_WINDOW_OPENGL | SDL_WINDOW_RESIZABLE | SDL_WINDOW_HIDDEN; +    SDL_Window* window = SDL_CreateWindow("Dear ImGui SDL3+OpenGL3 example", 1280, 720, window_flags); +    if (window == nullptr) +    { +        printf("Error: SDL_CreateWindow(): %s\n", SDL_GetError()); +        return -1; +    } +    SDL_SetWindowPosition(window, SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED); +    SDL_GLContext gl_context = SDL_GL_CreateContext(window); +    SDL_GL_MakeCurrent(window, gl_context); +    SDL_GL_SetSwapInterval(1); // Enable vsync +    SDL_ShowWindow(window); + +    // 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_ImplSDL3_InitForOpenGL(window, gl_context); +    ImGui_ImplOpenGL3_Init(glsl_version); + +    // 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 \\ ! +    // - Our Emscripten build process allows embedding fonts to be accessible at runtime from the "fonts/" folder. See Makefile.emscripten for details. +    //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); + +    // Main loop +    bool done = false; +#ifdef __EMSCRIPTEN__ +    // For an Emscripten build we are disabling file-system access, so let's not attempt to do a fopen() of the imgui.ini file. +    // You may manually call LoadIniSettingsFromMemory() to load settings from your own storage. +    io.IniFilename = nullptr; +    EMSCRIPTEN_MAINLOOP_BEGIN +#else +    while (!done) +#endif +    { +        // Poll and handle events (inputs, window resize, etc.) +        // 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. +        SDL_Event event; +        while (SDL_PollEvent(&event)) +        { +            ImGui_ImplSDL3_ProcessEvent(&event); +            if (event.type == SDL_EVENT_QUIT) +                done = true; +            if (event.type == SDL_EVENT_WINDOW_CLOSE_REQUESTED && event.window.windowID == SDL_GetWindowID(window)) +                done = true; +        } + +        // Start the Dear ImGui frame +        ImGui_ImplOpenGL3_NewFrame(); +        ImGui_ImplSDL3_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); + +        // 2. Show a simple window that we create ourselves. We use a Begin/End pair to create a named window. +        { +            static float f = 0.0f; +            static int counter = 0; + +            ImGui::Begin("Hello, world!");                          // Create a window called "Hello, world!" and append into it. + +            ImGui::Text("This is some useful text.");               // Display some text (you can use a format strings too) +            ImGui::Checkbox("Demo Window", &show_demo_window);      // Edit bools storing our window open/close state +            ImGui::Checkbox("Another Window", &show_another_window); + +            ImGui::SliderFloat("float", &f, 0.0f, 1.0f);            // Edit 1 float using a slider from 0.0f to 1.0f +            ImGui::ColorEdit3("clear color", (float*)&clear_color); // Edit 3 floats representing a color + +            if (ImGui::Button("Button"))                            // Buttons return true when clicked (most widgets return true when edited/activated) +                counter++; +            ImGui::SameLine(); +            ImGui::Text("counter = %d", counter); + +            ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / io.Framerate, io.Framerate); +            ImGui::End(); +        } + +        // 3. Show another simple window. +        if (show_another_window) +        { +            ImGui::Begin("Another Window", &show_another_window);   // Pass a pointer to our bool variable (the window will have a closing button that will clear the bool when clicked) +            ImGui::Text("Hello from another window!"); +            if (ImGui::Button("Close Me")) +                show_another_window = false; +            ImGui::End(); +        } + +        // Rendering +        ImGui::Render(); +        glViewport(0, 0, (int)io.DisplaySize.x, (int)io.DisplaySize.y); +        glClearColor(clear_color.x * clear_color.w, clear_color.y * clear_color.w, clear_color.z * clear_color.w, clear_color.w); +        glClear(GL_COLOR_BUFFER_BIT); +        ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData()); +        SDL_GL_SwapWindow(window); +    } +#ifdef __EMSCRIPTEN__ +    EMSCRIPTEN_MAINLOOP_END; +#endif + +    // Cleanup +    ImGui_ImplOpenGL3_Shutdown(); +    ImGui_ImplSDL3_Shutdown(); +    ImGui::DestroyContext(); + +    SDL_GL_DeleteContext(gl_context); +    SDL_DestroyWindow(window); +    SDL_Quit(); + +    return 0; +} diff --git a/lib/imgui-1.90.7/examples/example_sdl3_sdlrenderer3/build_win32.bat b/lib/imgui-1.90.7/examples/example_sdl3_sdlrenderer3/build_win32.bat new file mode 100644 index 0000000..7bc131a --- /dev/null +++ b/lib/imgui-1.90.7/examples/example_sdl3_sdlrenderer3/build_win32.bat @@ -0,0 +1,8 @@ +@REM Build for Visual Studio compiler. Run your copy of vcvars32.bat or vcvarsall.bat to setup command-line compiler. +@set OUT_DIR=Debug +@set OUT_EXE=example_sdl3_sdlrenderer3 +@set INCLUDES=/I..\.. /I..\..\backends /I%SDL3_DIR%\include +@set SOURCES=main.cpp ..\..\backends\imgui_impl_sdl3.cpp ..\..\backends\imgui_impl_sdlrenderer3.cpp ..\..\imgui*.cpp +@set LIBS=/LIBPATH:%SDL3_DIR%\lib\x86 SDL3.lib +mkdir %OUT_DIR% +cl /nologo /Zi /MD /utf-8 %INCLUDES% %SOURCES% /Fe%OUT_DIR%/%OUT_EXE%.exe /Fo%OUT_DIR%/ /link %LIBS% /subsystem:console diff --git a/lib/imgui-1.90.7/examples/example_sdl3_sdlrenderer3/example_sdl3_sdlrenderer3.vcxproj b/lib/imgui-1.90.7/examples/example_sdl3_sdlrenderer3/example_sdl3_sdlrenderer3.vcxproj new file mode 100644 index 0000000..8b71324 --- /dev/null +++ b/lib/imgui-1.90.7/examples/example_sdl3_sdlrenderer3/example_sdl3_sdlrenderer3.vcxproj @@ -0,0 +1,186 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> +  <ItemGroup Label="ProjectConfigurations"> +    <ProjectConfiguration Include="Debug|Win32"> +      <Configuration>Debug</Configuration> +      <Platform>Win32</Platform> +    </ProjectConfiguration> +    <ProjectConfiguration Include="Debug|x64"> +      <Configuration>Debug</Configuration> +      <Platform>x64</Platform> +    </ProjectConfiguration> +    <ProjectConfiguration Include="Release|Win32"> +      <Configuration>Release</Configuration> +      <Platform>Win32</Platform> +    </ProjectConfiguration> +    <ProjectConfiguration Include="Release|x64"> +      <Configuration>Release</Configuration> +      <Platform>x64</Platform> +    </ProjectConfiguration> +  </ItemGroup> +  <PropertyGroup Label="Globals"> +    <ProjectGuid>{C0290D21-3AD2-4A35-ABBC-A2F5F48326DA}</ProjectGuid> +    <RootNamespace>example_sdl3_opengl3</RootNamespace> +    <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion> +  </PropertyGroup> +  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> +  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> +    <ConfigurationType>Application</ConfigurationType> +    <UseDebugLibraries>true</UseDebugLibraries> +    <CharacterSet>MultiByte</CharacterSet> +    <PlatformToolset>v140</PlatformToolset> +  </PropertyGroup> +  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration"> +    <ConfigurationType>Application</ConfigurationType> +    <UseDebugLibraries>true</UseDebugLibraries> +    <CharacterSet>MultiByte</CharacterSet> +    <PlatformToolset>v140</PlatformToolset> +  </PropertyGroup> +  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration"> +    <ConfigurationType>Application</ConfigurationType> +    <UseDebugLibraries>false</UseDebugLibraries> +    <WholeProgramOptimization>true</WholeProgramOptimization> +    <CharacterSet>MultiByte</CharacterSet> +    <PlatformToolset>v140</PlatformToolset> +  </PropertyGroup> +  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration"> +    <ConfigurationType>Application</ConfigurationType> +    <UseDebugLibraries>false</UseDebugLibraries> +    <WholeProgramOptimization>true</WholeProgramOptimization> +    <CharacterSet>MultiByte</CharacterSet> +    <PlatformToolset>v140</PlatformToolset> +  </PropertyGroup> +  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> +  <ImportGroup Label="ExtensionSettings"> +  </ImportGroup> +  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> +    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> +  </ImportGroup> +  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets"> +    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> +  </ImportGroup> +  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> +    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> +  </ImportGroup> +  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets"> +    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> +  </ImportGroup> +  <PropertyGroup Label="UserMacros" /> +  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> +    <OutDir>$(ProjectDir)$(Configuration)\</OutDir> +    <IntDir>$(ProjectDir)$(Configuration)\</IntDir> +    <IncludePath>$(IncludePath)</IncludePath> +  </PropertyGroup> +  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> +    <OutDir>$(ProjectDir)$(Configuration)\</OutDir> +    <IntDir>$(ProjectDir)$(Configuration)\</IntDir> +    <IncludePath>$(IncludePath)</IncludePath> +  </PropertyGroup> +  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> +    <OutDir>$(ProjectDir)$(Configuration)\</OutDir> +    <IntDir>$(ProjectDir)$(Configuration)\</IntDir> +    <IncludePath>$(IncludePath)</IncludePath> +  </PropertyGroup> +  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> +    <OutDir>$(ProjectDir)$(Configuration)\</OutDir> +    <IntDir>$(ProjectDir)$(Configuration)\</IntDir> +    <IncludePath>$(IncludePath)</IncludePath> +  </PropertyGroup> +  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> +    <ClCompile> +      <WarningLevel>Level4</WarningLevel> +      <Optimization>Disabled</Optimization> +      <AdditionalIncludeDirectories>..\..;..\..\backends;%SDL3_DIR%\include;$(VcpkgCurrentInstalledDir)include\SDL3;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> +      <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions> +    </ClCompile> +    <Link> +      <GenerateDebugInformation>true</GenerateDebugInformation> +      <AdditionalLibraryDirectories>%SDL3_DIR%\lib\x86;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> +      <AdditionalDependencies>opengl32.lib;SDL3.lib;%(AdditionalDependencies)</AdditionalDependencies> +      <SubSystem>Console</SubSystem> +      <IgnoreSpecificDefaultLibraries>msvcrt.lib</IgnoreSpecificDefaultLibraries> +    </Link> +  </ItemDefinitionGroup> +  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> +    <ClCompile> +      <WarningLevel>Level4</WarningLevel> +      <Optimization>Disabled</Optimization> +      <AdditionalIncludeDirectories>..\..;..\..\backends;%SDL3_DIR%\include;$(VcpkgCurrentInstalledDir)include\SDL3;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> +      <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions> +    </ClCompile> +    <Link> +      <GenerateDebugInformation>true</GenerateDebugInformation> +      <AdditionalLibraryDirectories>%SDL3_DIR%\lib\x64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> +      <AdditionalDependencies>opengl32.lib;SDL3.lib;%(AdditionalDependencies)</AdditionalDependencies> +      <SubSystem>Console</SubSystem> +      <IgnoreSpecificDefaultLibraries>msvcrt.lib</IgnoreSpecificDefaultLibraries> +    </Link> +  </ItemDefinitionGroup> +  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> +    <ClCompile> +      <WarningLevel>Level4</WarningLevel> +      <Optimization>MaxSpeed</Optimization> +      <FunctionLevelLinking>true</FunctionLevelLinking> +      <IntrinsicFunctions>true</IntrinsicFunctions> +      <AdditionalIncludeDirectories>..\..;..\..\backends;%SDL3_DIR%\include;$(VcpkgCurrentInstalledDir)include\SDL3;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> +      <BufferSecurityCheck>false</BufferSecurityCheck> +      <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions> +    </ClCompile> +    <Link> +      <GenerateDebugInformation>true</GenerateDebugInformation> +      <EnableCOMDATFolding>true</EnableCOMDATFolding> +      <OptimizeReferences>true</OptimizeReferences> +      <AdditionalLibraryDirectories>%SDL3_DIR%\lib\x86;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> +      <AdditionalDependencies>opengl32.lib;SDL3.lib;%(AdditionalDependencies)</AdditionalDependencies> +      <SubSystem>Console</SubSystem> +      <IgnoreSpecificDefaultLibraries> +      </IgnoreSpecificDefaultLibraries> +    </Link> +  </ItemDefinitionGroup> +  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> +    <ClCompile> +      <WarningLevel>Level4</WarningLevel> +      <Optimization>MaxSpeed</Optimization> +      <FunctionLevelLinking>true</FunctionLevelLinking> +      <IntrinsicFunctions>true</IntrinsicFunctions> +      <AdditionalIncludeDirectories>..\..;..\..\backends;%SDL3_DIR%\include;$(VcpkgCurrentInstalledDir)include\SDL3;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> +      <BufferSecurityCheck>false</BufferSecurityCheck> +      <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions> +    </ClCompile> +    <Link> +      <GenerateDebugInformation>true</GenerateDebugInformation> +      <EnableCOMDATFolding>true</EnableCOMDATFolding> +      <OptimizeReferences>true</OptimizeReferences> +      <AdditionalLibraryDirectories>%SDL3_DIR%\lib\x64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> +      <AdditionalDependencies>opengl32.lib;SDL3.lib;%(AdditionalDependencies)</AdditionalDependencies> +      <SubSystem>Console</SubSystem> +      <IgnoreSpecificDefaultLibraries> +      </IgnoreSpecificDefaultLibraries> +    </Link> +  </ItemDefinitionGroup> +  <ItemGroup> +    <ClCompile Include="..\..\backends\imgui_impl_sdlrenderer3.cpp" /> +    <ClCompile Include="..\..\imgui.cpp" /> +    <ClCompile Include="..\..\imgui_demo.cpp" /> +    <ClCompile Include="..\..\imgui_draw.cpp" /> +    <ClCompile Include="..\..\imgui_tables.cpp" /> +    <ClCompile Include="..\..\imgui_widgets.cpp" /> +    <ClCompile Include="..\..\backends\imgui_impl_sdl3.cpp" /> +    <ClCompile Include="main.cpp" /> +  </ItemGroup> +  <ItemGroup> +    <ClInclude Include="..\..\backends\imgui_impl_sdlrenderer3.h" /> +    <ClInclude Include="..\..\imconfig.h" /> +    <ClInclude Include="..\..\imgui.h" /> +    <ClInclude Include="..\..\imgui_internal.h" /> +    <ClInclude Include="..\..\backends\imgui_impl_sdl3.h" /> +  </ItemGroup> +  <ItemGroup> +    <None Include="..\..\misc\debuggers\imgui.natstepfilter" /> +    <None Include="..\..\misc\debuggers\imgui.natvis" /> +    <None Include="..\README.txt" /> +  </ItemGroup> +  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> +  <ImportGroup Label="ExtensionTargets"> +  </ImportGroup> +</Project>
\ No newline at end of file diff --git a/lib/imgui-1.90.7/examples/example_sdl3_sdlrenderer3/example_sdl3_sdlrenderer3.vcxproj.filters b/lib/imgui-1.90.7/examples/example_sdl3_sdlrenderer3/example_sdl3_sdlrenderer3.vcxproj.filters new file mode 100644 index 0000000..c41210d --- /dev/null +++ b/lib/imgui-1.90.7/examples/example_sdl3_sdlrenderer3/example_sdl3_sdlrenderer3.vcxproj.filters @@ -0,0 +1,64 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> +  <ItemGroup> +    <Filter Include="imgui"> +      <UniqueIdentifier>{20b90ce4-7fcb-4731-b9a0-075f875de82d}</UniqueIdentifier> +    </Filter> +    <Filter Include="sources"> +      <UniqueIdentifier>{f18ab499-84e1-499f-8eff-9754361e0e52}</UniqueIdentifier> +      <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions> +    </Filter> +  </ItemGroup> +  <ItemGroup> +    <ClCompile Include="..\..\imgui.cpp"> +      <Filter>imgui</Filter> +    </ClCompile> +    <ClCompile Include="..\..\imgui_demo.cpp"> +      <Filter>imgui</Filter> +    </ClCompile> +    <ClCompile Include="..\..\imgui_draw.cpp"> +      <Filter>imgui</Filter> +    </ClCompile> +    <ClCompile Include="main.cpp"> +      <Filter>sources</Filter> +    </ClCompile> +    <ClCompile Include="..\..\backends\imgui_impl_sdl3.cpp"> +      <Filter>sources</Filter> +    </ClCompile> +    <ClCompile Include="..\..\imgui_tables.cpp"> +      <Filter>imgui</Filter> +    </ClCompile> +    <ClCompile Include="..\..\imgui_widgets.cpp"> +      <Filter>imgui</Filter> +    </ClCompile> +    <ClCompile Include="..\..\backends\imgui_impl_sdlrenderer3.cpp"> +      <Filter>sources</Filter> +    </ClCompile> +  </ItemGroup> +  <ItemGroup> +    <ClInclude Include="..\..\imconfig.h"> +      <Filter>imgui</Filter> +    </ClInclude> +    <ClInclude Include="..\..\imgui.h"> +      <Filter>imgui</Filter> +    </ClInclude> +    <ClInclude Include="..\..\imgui_internal.h"> +      <Filter>imgui</Filter> +    </ClInclude> +    <ClInclude Include="..\..\backends\imgui_impl_sdl3.h"> +      <Filter>sources</Filter> +    </ClInclude> +    <ClInclude Include="..\..\backends\imgui_impl_sdlrenderer3.h"> +      <Filter>sources</Filter> +    </ClInclude> +  </ItemGroup> +  <ItemGroup> +    <None Include="..\README.txt" /> +    <None Include="..\..\misc\debuggers\imgui.natvis"> +      <Filter>imgui</Filter> +    </None> +    <None Include="..\..\misc\debuggers\imgui.natstepfilter"> +      <Filter>imgui</Filter> +    </None> +  </ItemGroup> +</Project>
\ No newline at end of file diff --git a/lib/imgui-1.90.7/examples/example_sdl3_sdlrenderer3/main.cpp b/lib/imgui-1.90.7/examples/example_sdl3_sdlrenderer3/main.cpp new file mode 100644 index 0000000..baa7cd7 --- /dev/null +++ b/lib/imgui-1.90.7/examples/example_sdl3_sdlrenderer3/main.cpp @@ -0,0 +1,179 @@ +// Dear ImGui: standalone example application for SDL3 + SDL_Renderer +// (SDL is a cross-platform general purpose library for handling windows, inputs, OpenGL/Vulkan/Metal graphics context creation, etc.) + +// 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 + +// Important to understand: SDL_Renderer is an _optional_ component of SDL3. +// For a multi-platform app consider using e.g. SDL+DirectX on Windows and SDL+OpenGL on Linux/OSX. + +#include "imgui.h" +#include "imgui_impl_sdl3.h" +#include "imgui_impl_sdlrenderer3.h" +#include <stdio.h> +#include <SDL3/SDL.h> +#if defined(IMGUI_IMPL_OPENGL_ES2) +#include <SDL3/SDL_opengles2.h> +#else +#include <SDL3/SDL_opengl.h> +#endif + +// Main code +int main(int, char**) +{ +    // Setup SDL +    if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER | SDL_INIT_GAMEPAD) != 0) +    { +        printf("Error: SDL_Init(): %s\n", SDL_GetError()); +        return -1; +    } + +    // Enable native IME. +    SDL_SetHint(SDL_HINT_IME_SHOW_UI, "1"); + +    // Create window with SDL_Renderer graphics context +    Uint32 window_flags = SDL_WINDOW_OPENGL | SDL_WINDOW_RESIZABLE | SDL_WINDOW_HIDDEN; +    SDL_Window* window = SDL_CreateWindow("Dear ImGui SDL3+SDL_Renderer example", 1280, 720, window_flags); +    if (window == nullptr) +    { +        printf("Error: SDL_CreateWindow(): %s\n", SDL_GetError()); +        return -1; +    } +    SDL_Renderer* renderer = SDL_CreateRenderer(window, nullptr); +    SDL_SetRenderVSync(renderer, 1); +    if (renderer == nullptr) +    { +        SDL_Log("Error: SDL_CreateRenderer(): %s\n", SDL_GetError()); +        return -1; +    } +    SDL_SetWindowPosition(window, SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED); +    SDL_ShowWindow(window); + +    // 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_ImplSDL3_InitForSDLRenderer(window, renderer); +    ImGui_ImplSDLRenderer3_Init(renderer); + +    // 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 \\ ! +    // - Our Emscripten build process allows embedding fonts to be accessible at runtime from the "fonts/" folder. See Makefile.emscripten for details. +    //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); + +    // Main loop +    bool done = false; +#ifdef __EMSCRIPTEN__ +    // For an Emscripten build we are disabling file-system access, so let's not attempt to do a fopen() of the imgui.ini file. +    // You may manually call LoadIniSettingsFromMemory() to load settings from your own storage. +    io.IniFilename = nullptr; +    EMSCRIPTEN_MAINLOOP_BEGIN +#else +    while (!done) +#endif +    { +        // Poll and handle events (inputs, window resize, etc.) +        // 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. +        SDL_Event event; +        while (SDL_PollEvent(&event)) +        { +            ImGui_ImplSDL3_ProcessEvent(&event); +            if (event.type == SDL_EVENT_QUIT) +                done = true; +            if (event.type == SDL_EVENT_WINDOW_CLOSE_REQUESTED && event.window.windowID == SDL_GetWindowID(window)) +                done = true; +        } + +        // Start the Dear ImGui frame +        ImGui_ImplSDLRenderer3_NewFrame(); +        ImGui_ImplSDL3_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); + +        // 2. Show a simple window that we create ourselves. We use a Begin/End pair to create a named window. +        { +            static float f = 0.0f; +            static int counter = 0; + +            ImGui::Begin("Hello, world!");                          // Create a window called "Hello, world!" and append into it. + +            ImGui::Text("This is some useful text.");               // Display some text (you can use a format strings too) +            ImGui::Checkbox("Demo Window", &show_demo_window);      // Edit bools storing our window open/close state +            ImGui::Checkbox("Another Window", &show_another_window); + +            ImGui::SliderFloat("float", &f, 0.0f, 1.0f);            // Edit 1 float using a slider from 0.0f to 1.0f +            ImGui::ColorEdit3("clear color", (float*)&clear_color); // Edit 3 floats representing a color + +            if (ImGui::Button("Button"))                            // Buttons return true when clicked (most widgets return true when edited/activated) +                counter++; +            ImGui::SameLine(); +            ImGui::Text("counter = %d", counter); + +            ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / io.Framerate, io.Framerate); +            ImGui::End(); +        } + +        // 3. Show another simple window. +        if (show_another_window) +        { +            ImGui::Begin("Another Window", &show_another_window);   // Pass a pointer to our bool variable (the window will have a closing button that will clear the bool when clicked) +            ImGui::Text("Hello from another window!"); +            if (ImGui::Button("Close Me")) +                show_another_window = false; +            ImGui::End(); +        } + +        // Rendering +        ImGui::Render(); +        //SDL_RenderSetScale(renderer, io.DisplayFramebufferScale.x, io.DisplayFramebufferScale.y); +        SDL_SetRenderDrawColor(renderer, (Uint8)(clear_color.x * 255), (Uint8)(clear_color.y * 255), (Uint8)(clear_color.z * 255), (Uint8)(clear_color.w * 255)); +        SDL_RenderClear(renderer); +        ImGui_ImplSDLRenderer3_RenderDrawData(ImGui::GetDrawData(), renderer); +        SDL_RenderPresent(renderer); +    } + +    // Cleanup +    ImGui_ImplSDLRenderer3_Shutdown(); +    ImGui_ImplSDL3_Shutdown(); +    ImGui::DestroyContext(); + +    SDL_DestroyRenderer(renderer); +    SDL_DestroyWindow(window); +    SDL_Quit(); + +    return 0; +} diff --git a/lib/imgui-1.90.7/examples/example_win32_directx10/build_win32.bat b/lib/imgui-1.90.7/examples/example_win32_directx10/build_win32.bat new file mode 100644 index 0000000..78a6e37 --- /dev/null +++ b/lib/imgui-1.90.7/examples/example_win32_directx10/build_win32.bat @@ -0,0 +1,8 @@ +@REM Build for Visual Studio compiler. Run your copy of vcvars32.bat or vcvarsall.bat to setup command-line compiler. +@set OUT_DIR=Debug +@set OUT_EXE=example_win32_directx10 +@set INCLUDES=/I..\.. /I..\..\backends /I "%WindowsSdkDir%Include\um" /I "%WindowsSdkDir%Include\shared" /I "%DXSDK_DIR%Include" +@set SOURCES=main.cpp ..\..\backends\imgui_impl_win32.cpp ..\..\backends\imgui_impl_dx10.cpp ..\..\imgui*.cpp +@set LIBS=/LIBPATH:"%DXSDK_DIR%/Lib/x86" d3d10.lib d3dcompiler.lib +mkdir %OUT_DIR% +cl /nologo /Zi /MD /utf-8 %INCLUDES% /D UNICODE /D _UNICODE %SOURCES% /Fe%OUT_DIR%/%OUT_EXE%.exe /Fo%OUT_DIR%/ /link %LIBS% diff --git a/lib/imgui-1.90.7/examples/example_win32_directx10/example_win32_directx10.vcxproj b/lib/imgui-1.90.7/examples/example_win32_directx10/example_win32_directx10.vcxproj new file mode 100644 index 0000000..d11aed8 --- /dev/null +++ b/lib/imgui-1.90.7/examples/example_win32_directx10/example_win32_directx10.vcxproj @@ -0,0 +1,176 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> +  <ItemGroup Label="ProjectConfigurations"> +    <ProjectConfiguration Include="Debug|Win32"> +      <Configuration>Debug</Configuration> +      <Platform>Win32</Platform> +    </ProjectConfiguration> +    <ProjectConfiguration Include="Debug|x64"> +      <Configuration>Debug</Configuration> +      <Platform>x64</Platform> +    </ProjectConfiguration> +    <ProjectConfiguration Include="Release|Win32"> +      <Configuration>Release</Configuration> +      <Platform>Win32</Platform> +    </ProjectConfiguration> +    <ProjectConfiguration Include="Release|x64"> +      <Configuration>Release</Configuration> +      <Platform>x64</Platform> +    </ProjectConfiguration> +  </ItemGroup> +  <PropertyGroup Label="Globals"> +    <ProjectGuid>{345A953E-A004-4648-B442-DC5F9F11068C}</ProjectGuid> +    <RootNamespace>example_win32_directx10</RootNamespace> +    <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion> +  </PropertyGroup> +  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> +  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> +    <ConfigurationType>Application</ConfigurationType> +    <UseDebugLibraries>true</UseDebugLibraries> +    <CharacterSet>Unicode</CharacterSet> +    <PlatformToolset>v140</PlatformToolset> +  </PropertyGroup> +  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration"> +    <ConfigurationType>Application</ConfigurationType> +    <UseDebugLibraries>true</UseDebugLibraries> +    <CharacterSet>Unicode</CharacterSet> +    <PlatformToolset>v140</PlatformToolset> +  </PropertyGroup> +  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration"> +    <ConfigurationType>Application</ConfigurationType> +    <UseDebugLibraries>false</UseDebugLibraries> +    <WholeProgramOptimization>true</WholeProgramOptimization> +    <CharacterSet>Unicode</CharacterSet> +    <PlatformToolset>v140</PlatformToolset> +  </PropertyGroup> +  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration"> +    <ConfigurationType>Application</ConfigurationType> +    <UseDebugLibraries>false</UseDebugLibraries> +    <WholeProgramOptimization>true</WholeProgramOptimization> +    <CharacterSet>Unicode</CharacterSet> +    <PlatformToolset>v140</PlatformToolset> +  </PropertyGroup> +  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> +  <ImportGroup Label="ExtensionSettings"> +  </ImportGroup> +  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> +    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> +  </ImportGroup> +  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets"> +    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> +  </ImportGroup> +  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> +    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> +  </ImportGroup> +  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets"> +    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> +  </ImportGroup> +  <PropertyGroup Label="UserMacros" /> +  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> +    <OutDir>$(ProjectDir)$(Configuration)\</OutDir> +    <IntDir>$(ProjectDir)$(Configuration)\</IntDir> +  </PropertyGroup> +  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> +    <OutDir>$(ProjectDir)$(Configuration)\</OutDir> +    <IntDir>$(ProjectDir)$(Configuration)\</IntDir> +  </PropertyGroup> +  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> +    <OutDir>$(ProjectDir)$(Configuration)\</OutDir> +    <IntDir>$(ProjectDir)$(Configuration)\</IntDir> +  </PropertyGroup> +  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> +    <OutDir>$(ProjectDir)$(Configuration)\</OutDir> +    <IntDir>$(ProjectDir)$(Configuration)\</IntDir> +  </PropertyGroup> +  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> +    <ClCompile> +      <WarningLevel>Level4</WarningLevel> +      <Optimization>Disabled</Optimization> +      <AdditionalIncludeDirectories>..\..;..\..\backends;%(AdditionalIncludeDirectories);</AdditionalIncludeDirectories> +      <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions> +    </ClCompile> +    <Link> +      <GenerateDebugInformation>true</GenerateDebugInformation> +      <AdditionalDependencies>d3d10.lib;d3dcompiler.lib;dxgi.lib;%(AdditionalDependencies)</AdditionalDependencies> +      <AdditionalLibraryDirectories>$(DXSDK_DIR)/Lib/x86;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> +      <SubSystem>Console</SubSystem> +    </Link> +  </ItemDefinitionGroup> +  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> +    <ClCompile> +      <WarningLevel>Level4</WarningLevel> +      <Optimization>Disabled</Optimization> +      <AdditionalIncludeDirectories>..\..;..\..\backends;%(AdditionalIncludeDirectories);</AdditionalIncludeDirectories> +      <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions> +    </ClCompile> +    <Link> +      <GenerateDebugInformation>true</GenerateDebugInformation> +      <AdditionalDependencies>d3d10.lib;d3dcompiler.lib;dxgi.lib;%(AdditionalDependencies)</AdditionalDependencies> +      <AdditionalLibraryDirectories>$(DXSDK_DIR)/Lib/x64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> +      <SubSystem>Console</SubSystem> +    </Link> +  </ItemDefinitionGroup> +  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> +    <ClCompile> +      <WarningLevel>Level4</WarningLevel> +      <Optimization>MaxSpeed</Optimization> +      <FunctionLevelLinking>true</FunctionLevelLinking> +      <IntrinsicFunctions>true</IntrinsicFunctions> +      <AdditionalIncludeDirectories>..\..;..\..\backends;%(AdditionalIncludeDirectories);</AdditionalIncludeDirectories> +      <BufferSecurityCheck>false</BufferSecurityCheck> +      <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions> +    </ClCompile> +    <Link> +      <GenerateDebugInformation>true</GenerateDebugInformation> +      <EnableCOMDATFolding>true</EnableCOMDATFolding> +      <OptimizeReferences>true</OptimizeReferences> +      <AdditionalDependencies>d3d10.lib;d3dcompiler.lib;dxgi.lib;%(AdditionalDependencies)</AdditionalDependencies> +      <AdditionalLibraryDirectories>$(DXSDK_DIR)/Lib/x86;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> +      <SubSystem>Console</SubSystem> +    </Link> +  </ItemDefinitionGroup> +  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> +    <ClCompile> +      <WarningLevel>Level4</WarningLevel> +      <Optimization>MaxSpeed</Optimization> +      <FunctionLevelLinking>true</FunctionLevelLinking> +      <IntrinsicFunctions>true</IntrinsicFunctions> +      <AdditionalIncludeDirectories>..\..;..\..\backends;%(AdditionalIncludeDirectories);</AdditionalIncludeDirectories> +      <BufferSecurityCheck>false</BufferSecurityCheck> +      <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions> +    </ClCompile> +    <Link> +      <GenerateDebugInformation>true</GenerateDebugInformation> +      <EnableCOMDATFolding>true</EnableCOMDATFolding> +      <OptimizeReferences>true</OptimizeReferences> +      <AdditionalDependencies>d3d10.lib;d3dcompiler.lib;dxgi.lib;%(AdditionalDependencies)</AdditionalDependencies> +      <AdditionalLibraryDirectories>$(DXSDK_DIR)/Lib/x64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> +      <SubSystem>Console</SubSystem> +    </Link> +  </ItemDefinitionGroup> +  <ItemGroup> +    <ClInclude Include="..\..\imconfig.h" /> +    <ClInclude Include="..\..\imgui.h" /> +    <ClInclude Include="..\..\imgui_internal.h" /> +    <ClInclude Include="..\..\backends\imgui_impl_dx10.h" /> +    <ClInclude Include="..\..\backends\imgui_impl_win32.h" /> +  </ItemGroup> +  <ItemGroup> +    <ClCompile Include="..\..\imgui.cpp" /> +    <ClCompile Include="..\..\imgui_demo.cpp" /> +    <ClCompile Include="..\..\imgui_draw.cpp" /> +    <ClCompile Include="..\..\imgui_tables.cpp" /> +    <ClCompile Include="..\..\imgui_widgets.cpp" /> +    <ClCompile Include="..\..\backends\imgui_impl_dx10.cpp" /> +    <ClCompile Include="..\..\backends\imgui_impl_win32.cpp" /> +    <ClCompile Include="main.cpp" /> +  </ItemGroup> +  <ItemGroup> +    <None Include="..\..\misc\debuggers\imgui.natstepfilter" /> +    <None Include="..\..\misc\debuggers\imgui.natvis" /> +    <None Include="..\README.txt" /> +  </ItemGroup> +  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> +  <ImportGroup Label="ExtensionTargets"> +  </ImportGroup> +</Project>
\ No newline at end of file diff --git a/lib/imgui-1.90.7/examples/example_win32_directx10/example_win32_directx10.vcxproj.filters b/lib/imgui-1.90.7/examples/example_win32_directx10/example_win32_directx10.vcxproj.filters new file mode 100644 index 0000000..33ab99b --- /dev/null +++ b/lib/imgui-1.90.7/examples/example_win32_directx10/example_win32_directx10.vcxproj.filters @@ -0,0 +1,63 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> +  <ItemGroup> +    <Filter Include="imgui"> +      <UniqueIdentifier>{0587d7a3-f2ce-4d56-b84f-a0005d3bfce6}</UniqueIdentifier> +    </Filter> +    <Filter Include="sources"> +      <UniqueIdentifier>{08e36723-ce4f-4cff-9662-c40801cf1acf}</UniqueIdentifier> +    </Filter> +  </ItemGroup> +  <ItemGroup> +    <ClInclude Include="..\..\imconfig.h"> +      <Filter>imgui</Filter> +    </ClInclude> +    <ClInclude Include="..\..\imgui.h"> +      <Filter>imgui</Filter> +    </ClInclude> +    <ClInclude Include="..\..\imgui_internal.h"> +      <Filter>imgui</Filter> +    </ClInclude> +    <ClInclude Include="..\..\backends\imgui_impl_dx10.h"> +      <Filter>sources</Filter> +    </ClInclude> +    <ClInclude Include="..\..\backends\imgui_impl_win32.h"> +      <Filter>sources</Filter> +    </ClInclude> +  </ItemGroup> +  <ItemGroup> +    <ClCompile Include="..\..\imgui.cpp"> +      <Filter>imgui</Filter> +    </ClCompile> +    <ClCompile Include="main.cpp"> +      <Filter>sources</Filter> +    </ClCompile> +    <ClCompile Include="..\..\imgui_demo.cpp"> +      <Filter>imgui</Filter> +    </ClCompile> +    <ClCompile Include="..\..\imgui_draw.cpp"> +      <Filter>imgui</Filter> +    </ClCompile> +    <ClCompile Include="..\..\backends\imgui_impl_dx10.cpp"> +      <Filter>sources</Filter> +    </ClCompile> +    <ClCompile Include="..\..\backends\imgui_impl_win32.cpp"> +      <Filter>sources</Filter> +    </ClCompile> +    <ClCompile Include="..\..\imgui_tables.cpp"> +      <Filter>imgui</Filter> +    </ClCompile> +    <ClCompile Include="..\..\imgui_widgets.cpp"> +      <Filter>imgui</Filter> +    </ClCompile> +  </ItemGroup> +  <ItemGroup> +    <None Include="..\README.txt" /> +    <None Include="..\..\misc\debuggers\imgui.natvis"> +      <Filter>imgui</Filter> +    </None> +    <None Include="..\..\misc\debuggers\imgui.natstepfilter"> +      <Filter>imgui</Filter> +    </None> +  </ItemGroup> +</Project>
\ No newline at end of file diff --git a/lib/imgui-1.90.7/examples/example_win32_directx10/main.cpp b/lib/imgui-1.90.7/examples/example_win32_directx10/main.cpp new file mode 100644 index 0000000..21198da --- /dev/null +++ b/lib/imgui-1.90.7/examples/example_win32_directx10/main.cpp @@ -0,0 +1,271 @@ +// Dear ImGui: standalone example application for DirectX 10 + +// 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_win32.h" +#include "imgui_impl_dx10.h" +#include <d3d10_1.h> +#include <d3d10.h> +#include <tchar.h> + +// Data +static ID3D10Device*            g_pd3dDevice = nullptr; +static IDXGISwapChain*          g_pSwapChain = nullptr; +static bool                     g_SwapChainOccluded = false; +static UINT                     g_ResizeWidth = 0, g_ResizeHeight = 0; +static ID3D10RenderTargetView*  g_mainRenderTargetView = nullptr; + +// Forward declarations of helper functions +bool CreateDeviceD3D(HWND hWnd); +void CleanupDeviceD3D(); +void CreateRenderTarget(); +void CleanupRenderTarget(); +LRESULT WINAPI WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam); + +// 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 DirectX10 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_ImplDX10_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); + +    // 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 being minimized or screen locked +        if (g_SwapChainOccluded && g_pSwapChain->Present(0, DXGI_PRESENT_TEST) == DXGI_STATUS_OCCLUDED) +        { +            ::Sleep(10); +            continue; +        } +        g_SwapChainOccluded = false; + +        // Handle window resize (we don't resize directly in the WM_SIZE handler) +        if (g_ResizeWidth != 0 && g_ResizeHeight != 0) +        { +            CleanupRenderTarget(); +            g_pSwapChain->ResizeBuffers(0, g_ResizeWidth, g_ResizeHeight, DXGI_FORMAT_UNKNOWN, 0); +            g_ResizeWidth = g_ResizeHeight = 0; +            CreateRenderTarget(); +        } + +        // Start the Dear ImGui frame +        ImGui_ImplDX10_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); + +        // 2. Show a simple window that we create ourselves. We use a Begin/End pair to create a named window. +        { +            static float f = 0.0f; +            static int counter = 0; + +            ImGui::Begin("Hello, world!");                          // Create a window called "Hello, world!" and append into it. + +            ImGui::Text("This is some useful text.");               // Display some text (you can use a format strings too) +            ImGui::Checkbox("Demo Window", &show_demo_window);      // Edit bools storing our window open/close state +            ImGui::Checkbox("Another Window", &show_another_window); + +            ImGui::SliderFloat("float", &f, 0.0f, 1.0f);            // Edit 1 float using a slider from 0.0f to 1.0f +            ImGui::ColorEdit3("clear color", (float*)&clear_color); // Edit 3 floats representing a color + +            if (ImGui::Button("Button"))                            // Buttons return true when clicked (most widgets return true when edited/activated) +                counter++; +            ImGui::SameLine(); +            ImGui::Text("counter = %d", counter); + +            ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / io.Framerate, io.Framerate); +            ImGui::End(); +        } + +        // 3. Show another simple window. +        if (show_another_window) +        { +            ImGui::Begin("Another Window", &show_another_window);   // Pass a pointer to our bool variable (the window will have a closing button that will clear the bool when clicked) +            ImGui::Text("Hello from another window!"); +            if (ImGui::Button("Close Me")) +                show_another_window = false; +            ImGui::End(); +        } + +        // Rendering +        ImGui::Render(); +        const float clear_color_with_alpha[4] = { clear_color.x * clear_color.w, clear_color.y * clear_color.w, clear_color.z * clear_color.w, clear_color.w }; +        g_pd3dDevice->OMSetRenderTargets(1, &g_mainRenderTargetView, nullptr); +        g_pd3dDevice->ClearRenderTargetView(g_mainRenderTargetView, clear_color_with_alpha); +        ImGui_ImplDX10_RenderDrawData(ImGui::GetDrawData()); + +        // Present +        HRESULT hr = g_pSwapChain->Present(1, 0);   // Present with vsync +        //HRESULT hr = g_pSwapChain->Present(0, 0); // Present without vsync +        g_SwapChainOccluded = (hr == DXGI_STATUS_OCCLUDED); +    } + +    // Cleanup +    ImGui_ImplDX10_Shutdown(); +    ImGui_ImplWin32_Shutdown(); +    ImGui::DestroyContext(); + +    CleanupDeviceD3D(); +    ::DestroyWindow(hwnd); +    ::UnregisterClassW(wc.lpszClassName, wc.hInstance); + +    return 0; +} + +// Helper functions + +bool CreateDeviceD3D(HWND hWnd) +{ +    // Setup swap chain +    DXGI_SWAP_CHAIN_DESC sd; +    ZeroMemory(&sd, sizeof(sd)); +    sd.BufferCount = 2; +    sd.BufferDesc.Width = 0; +    sd.BufferDesc.Height = 0; +    sd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; +    sd.BufferDesc.RefreshRate.Numerator = 60; +    sd.BufferDesc.RefreshRate.Denominator = 1; +    sd.Flags = DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH; +    sd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; +    sd.OutputWindow = hWnd; +    sd.SampleDesc.Count = 1; +    sd.SampleDesc.Quality = 0; +    sd.Windowed = TRUE; +    sd.SwapEffect = DXGI_SWAP_EFFECT_DISCARD; + +    UINT createDeviceFlags = 0; +    //createDeviceFlags |= D3D10_CREATE_DEVICE_DEBUG; +    HRESULT res = D3D10CreateDeviceAndSwapChain(nullptr, D3D10_DRIVER_TYPE_HARDWARE, nullptr, createDeviceFlags, D3D10_SDK_VERSION, &sd, &g_pSwapChain, &g_pd3dDevice); +    if (res == DXGI_ERROR_UNSUPPORTED) // Try high-performance WARP software driver if hardware is not available. +        res = D3D10CreateDeviceAndSwapChain(nullptr, D3D10_DRIVER_TYPE_WARP, nullptr, createDeviceFlags, D3D10_SDK_VERSION, &sd, &g_pSwapChain, &g_pd3dDevice); +    if (res != S_OK) +        return false; + +    CreateRenderTarget(); +    return true; +} + +void CleanupDeviceD3D() +{ +    CleanupRenderTarget(); +    if (g_pSwapChain) { g_pSwapChain->Release(); g_pSwapChain = nullptr; } +    if (g_pd3dDevice) { g_pd3dDevice->Release(); g_pd3dDevice = nullptr; } +} + +void CreateRenderTarget() +{ +    ID3D10Texture2D* pBackBuffer; +    g_pSwapChain->GetBuffer(0, IID_PPV_ARGS(&pBackBuffer)); +    g_pd3dDevice->CreateRenderTargetView(pBackBuffer, nullptr, &g_mainRenderTargetView); +    pBackBuffer->Release(); +} + +void CleanupRenderTarget() +{ +    if (g_mainRenderTargetView) { g_mainRenderTargetView->Release(); g_mainRenderTargetView = nullptr; } +} + +// 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/lib/imgui-1.90.7/examples/example_win32_directx11/build_win32.bat b/lib/imgui-1.90.7/examples/example_win32_directx11/build_win32.bat new file mode 100644 index 0000000..c9a717c --- /dev/null +++ b/lib/imgui-1.90.7/examples/example_win32_directx11/build_win32.bat @@ -0,0 +1,9 @@ +@REM Build for Visual Studio compiler. Run your copy of vcvars32.bat or vcvarsall.bat to setup command-line compiler. +@set OUT_DIR=Debug +@set OUT_EXE=example_win32_directx11 +@set INCLUDES=/I..\.. /I..\..\backends /I "%WindowsSdkDir%Include\um" /I "%WindowsSdkDir%Include\shared" /I "%DXSDK_DIR%Include" +@set SOURCES=main.cpp ..\..\backends\imgui_impl_dx11.cpp ..\..\backends\imgui_impl_win32.cpp ..\..\imgui*.cpp +@set LIBS=/LIBPATH:"%DXSDK_DIR%/Lib/x86" d3d11.lib d3dcompiler.lib +mkdir %OUT_DIR% +cl /nologo /Zi /MD /utf-8 %INCLUDES% /D UNICODE /D _UNICODE %SOURCES% /Fe%OUT_DIR%/%OUT_EXE%.exe /Fo%OUT_DIR%/ /link %LIBS% + diff --git a/lib/imgui-1.90.7/examples/example_win32_directx11/example_win32_directx11.vcxproj b/lib/imgui-1.90.7/examples/example_win32_directx11/example_win32_directx11.vcxproj new file mode 100644 index 0000000..bace6a2 --- /dev/null +++ b/lib/imgui-1.90.7/examples/example_win32_directx11/example_win32_directx11.vcxproj @@ -0,0 +1,175 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> +  <ItemGroup Label="ProjectConfigurations"> +    <ProjectConfiguration Include="Debug|Win32"> +      <Configuration>Debug</Configuration> +      <Platform>Win32</Platform> +    </ProjectConfiguration> +    <ProjectConfiguration Include="Debug|x64"> +      <Configuration>Debug</Configuration> +      <Platform>x64</Platform> +    </ProjectConfiguration> +    <ProjectConfiguration Include="Release|Win32"> +      <Configuration>Release</Configuration> +      <Platform>Win32</Platform> +    </ProjectConfiguration> +    <ProjectConfiguration Include="Release|x64"> +      <Configuration>Release</Configuration> +      <Platform>x64</Platform> +    </ProjectConfiguration> +  </ItemGroup> +  <PropertyGroup Label="Globals"> +    <ProjectGuid>{9F316E83-5AE5-4939-A723-305A94F48005}</ProjectGuid> +    <RootNamespace>example_win32_directx11</RootNamespace> +  </PropertyGroup> +  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> +  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> +    <ConfigurationType>Application</ConfigurationType> +    <UseDebugLibraries>true</UseDebugLibraries> +    <CharacterSet>Unicode</CharacterSet> +    <PlatformToolset>v140</PlatformToolset> +  </PropertyGroup> +  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration"> +    <ConfigurationType>Application</ConfigurationType> +    <UseDebugLibraries>true</UseDebugLibraries> +    <CharacterSet>Unicode</CharacterSet> +    <PlatformToolset>v140</PlatformToolset> +  </PropertyGroup> +  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration"> +    <ConfigurationType>Application</ConfigurationType> +    <UseDebugLibraries>false</UseDebugLibraries> +    <WholeProgramOptimization>true</WholeProgramOptimization> +    <CharacterSet>Unicode</CharacterSet> +    <PlatformToolset>v140</PlatformToolset> +  </PropertyGroup> +  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration"> +    <ConfigurationType>Application</ConfigurationType> +    <UseDebugLibraries>false</UseDebugLibraries> +    <WholeProgramOptimization>true</WholeProgramOptimization> +    <CharacterSet>Unicode</CharacterSet> +    <PlatformToolset>v140</PlatformToolset> +  </PropertyGroup> +  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> +  <ImportGroup Label="ExtensionSettings"> +  </ImportGroup> +  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> +    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> +  </ImportGroup> +  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets"> +    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> +  </ImportGroup> +  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> +    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> +  </ImportGroup> +  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets"> +    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> +  </ImportGroup> +  <PropertyGroup Label="UserMacros" /> +  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> +    <OutDir>$(ProjectDir)$(Configuration)\</OutDir> +    <IntDir>$(ProjectDir)$(Configuration)\</IntDir> +  </PropertyGroup> +  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> +    <OutDir>$(ProjectDir)$(Configuration)\</OutDir> +    <IntDir>$(ProjectDir)$(Configuration)\</IntDir> +  </PropertyGroup> +  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> +    <OutDir>$(ProjectDir)$(Configuration)\</OutDir> +    <IntDir>$(ProjectDir)$(Configuration)\</IntDir> +  </PropertyGroup> +  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> +    <OutDir>$(ProjectDir)$(Configuration)\</OutDir> +    <IntDir>$(ProjectDir)$(Configuration)\</IntDir> +  </PropertyGroup> +  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> +    <ClCompile> +      <WarningLevel>Level4</WarningLevel> +      <Optimization>Disabled</Optimization> +      <AdditionalIncludeDirectories>..\..;..\..\backends;%(AdditionalIncludeDirectories);</AdditionalIncludeDirectories> +      <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions> +    </ClCompile> +    <Link> +      <GenerateDebugInformation>true</GenerateDebugInformation> +      <AdditionalDependencies>d3d11.lib;d3dcompiler.lib;dxgi.lib;%(AdditionalDependencies)</AdditionalDependencies> +      <AdditionalLibraryDirectories>$(DXSDK_DIR)/Lib/x86;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> +      <SubSystem>Console</SubSystem> +    </Link> +  </ItemDefinitionGroup> +  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> +    <ClCompile> +      <WarningLevel>Level4</WarningLevel> +      <Optimization>Disabled</Optimization> +      <AdditionalIncludeDirectories>..\..;..\..\backends;%(AdditionalIncludeDirectories);</AdditionalIncludeDirectories> +      <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions> +    </ClCompile> +    <Link> +      <GenerateDebugInformation>true</GenerateDebugInformation> +      <AdditionalDependencies>d3d11.lib;d3dcompiler.lib;dxgi.lib;%(AdditionalDependencies)</AdditionalDependencies> +      <AdditionalLibraryDirectories>$(DXSDK_DIR)/Lib/x64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> +      <SubSystem>Console</SubSystem> +    </Link> +  </ItemDefinitionGroup> +  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> +    <ClCompile> +      <WarningLevel>Level4</WarningLevel> +      <Optimization>MaxSpeed</Optimization> +      <FunctionLevelLinking>true</FunctionLevelLinking> +      <IntrinsicFunctions>true</IntrinsicFunctions> +      <AdditionalIncludeDirectories>..\..;..\..\backends;%(AdditionalIncludeDirectories);</AdditionalIncludeDirectories> +      <BufferSecurityCheck>false</BufferSecurityCheck> +      <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions> +    </ClCompile> +    <Link> +      <GenerateDebugInformation>true</GenerateDebugInformation> +      <EnableCOMDATFolding>true</EnableCOMDATFolding> +      <OptimizeReferences>true</OptimizeReferences> +      <AdditionalDependencies>d3d11.lib;d3dcompiler.lib;dxgi.lib;%(AdditionalDependencies)</AdditionalDependencies> +      <AdditionalLibraryDirectories>$(DXSDK_DIR)/Lib/x86;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> +      <SubSystem>Console</SubSystem> +    </Link> +  </ItemDefinitionGroup> +  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> +    <ClCompile> +      <WarningLevel>Level4</WarningLevel> +      <Optimization>MaxSpeed</Optimization> +      <FunctionLevelLinking>true</FunctionLevelLinking> +      <IntrinsicFunctions>true</IntrinsicFunctions> +      <AdditionalIncludeDirectories>..\..;..\..\backends;%(AdditionalIncludeDirectories);</AdditionalIncludeDirectories> +      <BufferSecurityCheck>false</BufferSecurityCheck> +      <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions> +    </ClCompile> +    <Link> +      <GenerateDebugInformation>true</GenerateDebugInformation> +      <EnableCOMDATFolding>true</EnableCOMDATFolding> +      <OptimizeReferences>true</OptimizeReferences> +      <AdditionalDependencies>d3d11.lib;d3dcompiler.lib;dxgi.lib;%(AdditionalDependencies)</AdditionalDependencies> +      <AdditionalLibraryDirectories>$(DXSDK_DIR)/Lib/x64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> +      <SubSystem>Console</SubSystem> +    </Link> +  </ItemDefinitionGroup> +  <ItemGroup> +    <ClInclude Include="..\..\imconfig.h" /> +    <ClInclude Include="..\..\imgui.h" /> +    <ClInclude Include="..\..\imgui_internal.h" /> +    <ClInclude Include="..\..\backends\imgui_impl_dx11.h" /> +    <ClInclude Include="..\..\backends\imgui_impl_win32.h" /> +  </ItemGroup> +  <ItemGroup> +    <ClCompile Include="..\..\imgui.cpp" /> +    <ClCompile Include="..\..\imgui_demo.cpp" /> +    <ClCompile Include="..\..\imgui_draw.cpp" /> +    <ClCompile Include="..\..\imgui_tables.cpp" /> +    <ClCompile Include="..\..\imgui_widgets.cpp" /> +    <ClCompile Include="..\..\backends\imgui_impl_dx11.cpp" /> +    <ClCompile Include="..\..\backends\imgui_impl_win32.cpp" /> +    <ClCompile Include="main.cpp" /> +  </ItemGroup> +  <ItemGroup> +    <None Include="..\..\misc\debuggers\imgui.natstepfilter" /> +    <None Include="..\..\misc\debuggers\imgui.natvis" /> +    <None Include="..\README.txt" /> +  </ItemGroup> +  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> +  <ImportGroup Label="ExtensionTargets"> +  </ImportGroup> +</Project>
\ No newline at end of file diff --git a/lib/imgui-1.90.7/examples/example_win32_directx11/example_win32_directx11.vcxproj.filters b/lib/imgui-1.90.7/examples/example_win32_directx11/example_win32_directx11.vcxproj.filters new file mode 100644 index 0000000..63032a6 --- /dev/null +++ b/lib/imgui-1.90.7/examples/example_win32_directx11/example_win32_directx11.vcxproj.filters @@ -0,0 +1,63 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> +  <ItemGroup> +    <Filter Include="imgui"> +      <UniqueIdentifier>{0587d7a3-f2ce-4d56-b84f-a0005d3bfce6}</UniqueIdentifier> +    </Filter> +    <Filter Include="sources"> +      <UniqueIdentifier>{08e36723-ce4f-4cff-9662-c40801cf1acf}</UniqueIdentifier> +    </Filter> +  </ItemGroup> +  <ItemGroup> +    <ClInclude Include="..\..\imconfig.h"> +      <Filter>imgui</Filter> +    </ClInclude> +    <ClInclude Include="..\..\imgui.h"> +      <Filter>imgui</Filter> +    </ClInclude> +    <ClInclude Include="..\..\imgui_internal.h"> +      <Filter>imgui</Filter> +    </ClInclude> +    <ClInclude Include="..\..\backends\imgui_impl_win32.h"> +      <Filter>sources</Filter> +    </ClInclude> +    <ClInclude Include="..\..\backends\imgui_impl_dx11.h"> +      <Filter>sources</Filter> +    </ClInclude> +  </ItemGroup> +  <ItemGroup> +    <ClCompile Include="..\..\imgui.cpp"> +      <Filter>imgui</Filter> +    </ClCompile> +    <ClCompile Include="main.cpp"> +      <Filter>sources</Filter> +    </ClCompile> +    <ClCompile Include="..\..\imgui_demo.cpp"> +      <Filter>imgui</Filter> +    </ClCompile> +    <ClCompile Include="..\..\imgui_draw.cpp"> +      <Filter>imgui</Filter> +    </ClCompile> +    <ClCompile Include="..\..\imgui_widgets.cpp"> +      <Filter>imgui</Filter> +    </ClCompile> +    <ClCompile Include="..\..\backends\imgui_impl_win32.cpp"> +      <Filter>sources</Filter> +    </ClCompile> +    <ClCompile Include="..\..\backends\imgui_impl_dx11.cpp"> +      <Filter>sources</Filter> +    </ClCompile> +    <ClCompile Include="..\..\imgui_tables.cpp"> +      <Filter>imgui</Filter> +    </ClCompile> +  </ItemGroup> +  <ItemGroup> +    <None Include="..\README.txt" /> +    <None Include="..\..\misc\debuggers\imgui.natvis"> +      <Filter>imgui</Filter> +    </None> +    <None Include="..\..\misc\debuggers\imgui.natstepfilter"> +      <Filter>imgui</Filter> +    </None> +  </ItemGroup> +</Project>
\ No newline at end of file diff --git a/lib/imgui-1.90.7/examples/example_win32_directx11/main.cpp b/lib/imgui-1.90.7/examples/example_win32_directx11/main.cpp new file mode 100644 index 0000000..5285df1 --- /dev/null +++ b/lib/imgui-1.90.7/examples/example_win32_directx11/main.cpp @@ -0,0 +1,274 @@ +// Dear ImGui: standalone example application for DirectX 11 + +// 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_win32.h" +#include "imgui_impl_dx11.h" +#include <d3d11.h> +#include <tchar.h> + +// Data +static ID3D11Device*            g_pd3dDevice = nullptr; +static ID3D11DeviceContext*     g_pd3dDeviceContext = nullptr; +static IDXGISwapChain*          g_pSwapChain = nullptr; +static bool                     g_SwapChainOccluded = false; +static UINT                     g_ResizeWidth = 0, g_ResizeHeight = 0; +static ID3D11RenderTargetView*  g_mainRenderTargetView = nullptr; + +// Forward declarations of helper functions +bool CreateDeviceD3D(HWND hWnd); +void CleanupDeviceD3D(); +void CreateRenderTarget(); +void CleanupRenderTarget(); +LRESULT WINAPI WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam); + +// 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 DirectX11 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_ImplDX11_Init(g_pd3dDevice, g_pd3dDeviceContext); + +    // 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); + +    // 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 being minimized or screen locked +        if (g_SwapChainOccluded && g_pSwapChain->Present(0, DXGI_PRESENT_TEST) == DXGI_STATUS_OCCLUDED) +        { +            ::Sleep(10); +            continue; +        } +        g_SwapChainOccluded = false; + +        // Handle window resize (we don't resize directly in the WM_SIZE handler) +        if (g_ResizeWidth != 0 && g_ResizeHeight != 0) +        { +            CleanupRenderTarget(); +            g_pSwapChain->ResizeBuffers(0, g_ResizeWidth, g_ResizeHeight, DXGI_FORMAT_UNKNOWN, 0); +            g_ResizeWidth = g_ResizeHeight = 0; +            CreateRenderTarget(); +        } + +        // Start the Dear ImGui frame +        ImGui_ImplDX11_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); + +        // 2. Show a simple window that we create ourselves. We use a Begin/End pair to create a named window. +        { +            static float f = 0.0f; +            static int counter = 0; + +            ImGui::Begin("Hello, world!");                          // Create a window called "Hello, world!" and append into it. + +            ImGui::Text("This is some useful text.");               // Display some text (you can use a format strings too) +            ImGui::Checkbox("Demo Window", &show_demo_window);      // Edit bools storing our window open/close state +            ImGui::Checkbox("Another Window", &show_another_window); + +            ImGui::SliderFloat("float", &f, 0.0f, 1.0f);            // Edit 1 float using a slider from 0.0f to 1.0f +            ImGui::ColorEdit3("clear color", (float*)&clear_color); // Edit 3 floats representing a color + +            if (ImGui::Button("Button"))                            // Buttons return true when clicked (most widgets return true when edited/activated) +                counter++; +            ImGui::SameLine(); +            ImGui::Text("counter = %d", counter); + +            ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / io.Framerate, io.Framerate); +            ImGui::End(); +        } + +        // 3. Show another simple window. +        if (show_another_window) +        { +            ImGui::Begin("Another Window", &show_another_window);   // Pass a pointer to our bool variable (the window will have a closing button that will clear the bool when clicked) +            ImGui::Text("Hello from another window!"); +            if (ImGui::Button("Close Me")) +                show_another_window = false; +            ImGui::End(); +        } + +        // Rendering +        ImGui::Render(); +        const float clear_color_with_alpha[4] = { clear_color.x * clear_color.w, clear_color.y * clear_color.w, clear_color.z * clear_color.w, clear_color.w }; +        g_pd3dDeviceContext->OMSetRenderTargets(1, &g_mainRenderTargetView, nullptr); +        g_pd3dDeviceContext->ClearRenderTargetView(g_mainRenderTargetView, clear_color_with_alpha); +        ImGui_ImplDX11_RenderDrawData(ImGui::GetDrawData()); + +        // Present +        HRESULT hr = g_pSwapChain->Present(1, 0);   // Present with vsync +        //HRESULT hr = g_pSwapChain->Present(0, 0); // Present without vsync +        g_SwapChainOccluded = (hr == DXGI_STATUS_OCCLUDED); +    } + +    // Cleanup +    ImGui_ImplDX11_Shutdown(); +    ImGui_ImplWin32_Shutdown(); +    ImGui::DestroyContext(); + +    CleanupDeviceD3D(); +    ::DestroyWindow(hwnd); +    ::UnregisterClassW(wc.lpszClassName, wc.hInstance); + +    return 0; +} + +// Helper functions + +bool CreateDeviceD3D(HWND hWnd) +{ +    // Setup swap chain +    DXGI_SWAP_CHAIN_DESC sd; +    ZeroMemory(&sd, sizeof(sd)); +    sd.BufferCount = 2; +    sd.BufferDesc.Width = 0; +    sd.BufferDesc.Height = 0; +    sd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; +    sd.BufferDesc.RefreshRate.Numerator = 60; +    sd.BufferDesc.RefreshRate.Denominator = 1; +    sd.Flags = DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH; +    sd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; +    sd.OutputWindow = hWnd; +    sd.SampleDesc.Count = 1; +    sd.SampleDesc.Quality = 0; +    sd.Windowed = TRUE; +    sd.SwapEffect = DXGI_SWAP_EFFECT_DISCARD; + +    UINT createDeviceFlags = 0; +    //createDeviceFlags |= D3D11_CREATE_DEVICE_DEBUG; +    D3D_FEATURE_LEVEL featureLevel; +    const D3D_FEATURE_LEVEL featureLevelArray[2] = { D3D_FEATURE_LEVEL_11_0, D3D_FEATURE_LEVEL_10_0, }; +    HRESULT res = D3D11CreateDeviceAndSwapChain(nullptr, D3D_DRIVER_TYPE_HARDWARE, nullptr, createDeviceFlags, featureLevelArray, 2, D3D11_SDK_VERSION, &sd, &g_pSwapChain, &g_pd3dDevice, &featureLevel, &g_pd3dDeviceContext); +    if (res == DXGI_ERROR_UNSUPPORTED) // Try high-performance WARP software driver if hardware is not available. +        res = D3D11CreateDeviceAndSwapChain(nullptr, D3D_DRIVER_TYPE_WARP, nullptr, createDeviceFlags, featureLevelArray, 2, D3D11_SDK_VERSION, &sd, &g_pSwapChain, &g_pd3dDevice, &featureLevel, &g_pd3dDeviceContext); +    if (res != S_OK) +        return false; + +    CreateRenderTarget(); +    return true; +} + +void CleanupDeviceD3D() +{ +    CleanupRenderTarget(); +    if (g_pSwapChain) { g_pSwapChain->Release(); g_pSwapChain = nullptr; } +    if (g_pd3dDeviceContext) { g_pd3dDeviceContext->Release(); g_pd3dDeviceContext = nullptr; } +    if (g_pd3dDevice) { g_pd3dDevice->Release(); g_pd3dDevice = nullptr; } +} + +void CreateRenderTarget() +{ +    ID3D11Texture2D* pBackBuffer; +    g_pSwapChain->GetBuffer(0, IID_PPV_ARGS(&pBackBuffer)); +    g_pd3dDevice->CreateRenderTargetView(pBackBuffer, nullptr, &g_mainRenderTargetView); +    pBackBuffer->Release(); +} + +void CleanupRenderTarget() +{ +    if (g_mainRenderTargetView) { g_mainRenderTargetView->Release(); g_mainRenderTargetView = nullptr; } +} + +// 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/lib/imgui-1.90.7/examples/example_win32_directx12/build_win32.bat b/lib/imgui-1.90.7/examples/example_win32_directx12/build_win32.bat new file mode 100644 index 0000000..68e3c92 --- /dev/null +++ b/lib/imgui-1.90.7/examples/example_win32_directx12/build_win32.bat @@ -0,0 +1,9 @@ +@REM Build for Visual Studio compiler. Run your copy of vcvars32.bat or vcvarsall.bat to setup command-line compiler. +@REM Important: to build on 32-bit systems, the DX12 backends needs '#define ImTextureID ImU64', so we pass it here. +@set OUT_DIR=Debug +@set OUT_EXE=example_win32_directx12 +@set INCLUDES=/I..\.. /I..\..\backends /I "%WindowsSdkDir%Include\um" /I "%WindowsSdkDir%Include\shared" +@set SOURCES=main.cpp ..\..\backends\imgui_impl_dx12.cpp ..\..\backends\imgui_impl_win32.cpp ..\..\imgui*.cpp +@set LIBS=d3d12.lib d3dcompiler.lib dxgi.lib +mkdir Debug +cl /nologo /Zi /MD /utf-8 %INCLUDES% /D ImTextureID=ImU64 /D UNICODE /D _UNICODE %SOURCES% /Fe%OUT_DIR%/%OUT_EXE%.exe /Fo%OUT_DIR%/ /link %LIBS% diff --git a/lib/imgui-1.90.7/examples/example_win32_directx12/example_win32_directx12.vcxproj b/lib/imgui-1.90.7/examples/example_win32_directx12/example_win32_directx12.vcxproj new file mode 100644 index 0000000..7b64371 --- /dev/null +++ b/lib/imgui-1.90.7/examples/example_win32_directx12/example_win32_directx12.vcxproj @@ -0,0 +1,180 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> +  <ItemGroup Label="ProjectConfigurations"> +    <ProjectConfiguration Include="Debug|Win32"> +      <Configuration>Debug</Configuration> +      <Platform>Win32</Platform> +    </ProjectConfiguration> +    <ProjectConfiguration Include="Debug|x64"> +      <Configuration>Debug</Configuration> +      <Platform>x64</Platform> +    </ProjectConfiguration> +    <ProjectConfiguration Include="Release|Win32"> +      <Configuration>Release</Configuration> +      <Platform>Win32</Platform> +    </ProjectConfiguration> +    <ProjectConfiguration Include="Release|x64"> +      <Configuration>Release</Configuration> +      <Platform>x64</Platform> +    </ProjectConfiguration> +  </ItemGroup> +  <PropertyGroup Label="Globals"> +    <ProjectGuid>{b4cf9797-519d-4afe-a8f4-5141a6b521d3}</ProjectGuid> +    <RootNamespace>example_win32_directx12</RootNamespace> +    <WindowsTargetPlatformVersion>10.0.18362.0</WindowsTargetPlatformVersion> +  </PropertyGroup> +  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> +  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> +    <ConfigurationType>Application</ConfigurationType> +    <UseDebugLibraries>true</UseDebugLibraries> +    <CharacterSet>Unicode</CharacterSet> +    <PlatformToolset>v140</PlatformToolset> +  </PropertyGroup> +  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration"> +    <ConfigurationType>Application</ConfigurationType> +    <UseDebugLibraries>true</UseDebugLibraries> +    <CharacterSet>Unicode</CharacterSet> +    <PlatformToolset>v140</PlatformToolset> +  </PropertyGroup> +  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration"> +    <ConfigurationType>Application</ConfigurationType> +    <UseDebugLibraries>false</UseDebugLibraries> +    <WholeProgramOptimization>true</WholeProgramOptimization> +    <CharacterSet>Unicode</CharacterSet> +    <PlatformToolset>v140</PlatformToolset> +  </PropertyGroup> +  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration"> +    <ConfigurationType>Application</ConfigurationType> +    <UseDebugLibraries>false</UseDebugLibraries> +    <WholeProgramOptimization>true</WholeProgramOptimization> +    <CharacterSet>Unicode</CharacterSet> +    <PlatformToolset>v140</PlatformToolset> +  </PropertyGroup> +  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> +  <ImportGroup Label="ExtensionSettings"> +  </ImportGroup> +  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> +    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> +  </ImportGroup> +  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets"> +    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> +  </ImportGroup> +  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> +    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> +  </ImportGroup> +  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets"> +    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> +  </ImportGroup> +  <PropertyGroup Label="UserMacros" /> +  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> +    <OutDir>$(ProjectDir)$(Configuration)\</OutDir> +    <IntDir>$(ProjectDir)$(Configuration)\</IntDir> +  </PropertyGroup> +  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> +    <OutDir>$(ProjectDir)$(Configuration)\</OutDir> +    <IntDir>$(ProjectDir)$(Configuration)\</IntDir> +  </PropertyGroup> +  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> +    <OutDir>$(ProjectDir)$(Configuration)\</OutDir> +    <IntDir>$(ProjectDir)$(Configuration)\</IntDir> +  </PropertyGroup> +  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> +    <OutDir>$(ProjectDir)$(Configuration)\</OutDir> +    <IntDir>$(ProjectDir)$(Configuration)\</IntDir> +  </PropertyGroup> +  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> +    <ClCompile> +      <WarningLevel>Level4</WarningLevel> +      <Optimization>Disabled</Optimization> +      <AdditionalIncludeDirectories>..\..;..\..\backends;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> +      <PreprocessorDefinitions>ImTextureID=ImU64;_UNICODE;UNICODE;%(PreprocessorDefinitions)</PreprocessorDefinitions> +      <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions> +    </ClCompile> +    <Link> +      <GenerateDebugInformation>true</GenerateDebugInformation> +      <AdditionalDependencies>d3d12.lib;d3dcompiler.lib;dxgi.lib;%(AdditionalDependencies)</AdditionalDependencies> +      <AdditionalLibraryDirectories>%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> +      <SubSystem>Console</SubSystem> +    </Link> +  </ItemDefinitionGroup> +  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> +    <ClCompile> +      <WarningLevel>Level4</WarningLevel> +      <Optimization>Disabled</Optimization> +      <AdditionalIncludeDirectories>..\..;..\..\backends;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> +      <PreprocessorDefinitions>ImTextureID=ImU64;_UNICODE;UNICODE;%(PreprocessorDefinitions)</PreprocessorDefinitions> +      <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions> +    </ClCompile> +    <Link> +      <GenerateDebugInformation>true</GenerateDebugInformation> +      <AdditionalDependencies>d3d12.lib;d3dcompiler.lib;dxgi.lib;%(AdditionalDependencies)</AdditionalDependencies> +      <AdditionalLibraryDirectories>%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> +      <SubSystem>Console</SubSystem> +    </Link> +  </ItemDefinitionGroup> +  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> +    <ClCompile> +      <WarningLevel>Level4</WarningLevel> +      <Optimization>MaxSpeed</Optimization> +      <FunctionLevelLinking>true</FunctionLevelLinking> +      <IntrinsicFunctions>true</IntrinsicFunctions> +      <AdditionalIncludeDirectories>..\..;..\..\backends;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> +      <PreprocessorDefinitions>ImTextureID=ImU64;_UNICODE;UNICODE;%(PreprocessorDefinitions)</PreprocessorDefinitions> +      <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions> +    </ClCompile> +    <Link> +      <GenerateDebugInformation>true</GenerateDebugInformation> +      <EnableCOMDATFolding>true</EnableCOMDATFolding> +      <OptimizeReferences>true</OptimizeReferences> +      <AdditionalDependencies>d3d12.lib;d3dcompiler.lib;dxgi.lib;%(AdditionalDependencies)</AdditionalDependencies> +      <AdditionalLibraryDirectories>%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> +      <SubSystem>Console</SubSystem> +    </Link> +  </ItemDefinitionGroup> +  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> +    <ClCompile> +      <WarningLevel>Level4</WarningLevel> +      <Optimization>MaxSpeed</Optimization> +      <FunctionLevelLinking>true</FunctionLevelLinking> +      <IntrinsicFunctions>true</IntrinsicFunctions> +      <AdditionalIncludeDirectories>..\..;..\..\backends;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> +      <PreprocessorDefinitions>ImTextureID=ImU64;_UNICODE;UNICODE;%(PreprocessorDefinitions)</PreprocessorDefinitions> +      <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions> +    </ClCompile> +    <Link> +      <GenerateDebugInformation>true</GenerateDebugInformation> +      <EnableCOMDATFolding>true</EnableCOMDATFolding> +      <OptimizeReferences>true</OptimizeReferences> +      <AdditionalDependencies>d3d12.lib;d3dcompiler.lib;dxgi.lib;%(AdditionalDependencies)</AdditionalDependencies> +      <AdditionalLibraryDirectories>%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> +      <SubSystem>Console</SubSystem> +    </Link> +  </ItemDefinitionGroup> +  <ItemGroup> +    <ClInclude Include="..\..\imconfig.h" /> +    <ClInclude Include="..\..\imgui.h" /> +    <ClInclude Include="..\..\imgui_internal.h" /> +    <ClInclude Include="..\..\backends\imgui_impl_dx12.h" /> +    <ClInclude Include="..\..\backends\imgui_impl_win32.h" /> +  </ItemGroup> +  <ItemGroup> +    <ClCompile Include="..\..\imgui.cpp" /> +    <ClCompile Include="..\..\imgui_demo.cpp" /> +    <ClCompile Include="..\..\imgui_draw.cpp" /> +    <ClCompile Include="..\..\imgui_tables.cpp" /> +    <ClCompile Include="..\..\imgui_widgets.cpp" /> +    <ClCompile Include="..\..\backends\imgui_impl_dx12.cpp" /> +    <ClCompile Include="..\..\backends\imgui_impl_win32.cpp" /> +    <ClCompile Include="main.cpp" /> +  </ItemGroup> +  <ItemGroup> +    <None Include="..\..\misc\debuggers\imgui.natstepfilter" /> +    <None Include="..\README.txt" /> +  </ItemGroup> +  <ItemGroup> +    <Natvis Include="..\..\misc\debuggers\imgui.natvis" /> +  </ItemGroup> +  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> +  <ImportGroup Label="ExtensionTargets"> +  </ImportGroup> +</Project>
\ No newline at end of file diff --git a/lib/imgui-1.90.7/examples/example_win32_directx12/example_win32_directx12.vcxproj.filters b/lib/imgui-1.90.7/examples/example_win32_directx12/example_win32_directx12.vcxproj.filters new file mode 100644 index 0000000..23a9952 --- /dev/null +++ b/lib/imgui-1.90.7/examples/example_win32_directx12/example_win32_directx12.vcxproj.filters @@ -0,0 +1,65 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> +  <ItemGroup> +    <Filter Include="imgui"> +      <UniqueIdentifier>{fb3d294f-51ec-478e-a627-25831c80fefd}</UniqueIdentifier> +    </Filter> +    <Filter Include="sources"> +      <UniqueIdentifier>{4f33ddea-9910-456d-b868-4267eb3c2b19}</UniqueIdentifier> +    </Filter> +  </ItemGroup> +  <ItemGroup> +    <ClInclude Include="..\..\imconfig.h"> +      <Filter>imgui</Filter> +    </ClInclude> +    <ClInclude Include="..\..\imgui.h"> +      <Filter>imgui</Filter> +    </ClInclude> +    <ClInclude Include="..\..\imgui_internal.h"> +      <Filter>imgui</Filter> +    </ClInclude> +    <ClInclude Include="..\..\backends\imgui_impl_dx12.h"> +      <Filter>sources</Filter> +    </ClInclude> +    <ClInclude Include="..\..\backends\imgui_impl_win32.h"> +      <Filter>sources</Filter> +    </ClInclude> +  </ItemGroup> +  <ItemGroup> +    <ClCompile Include="..\..\imgui.cpp"> +      <Filter>imgui</Filter> +    </ClCompile> +    <ClCompile Include="main.cpp"> +      <Filter>sources</Filter> +    </ClCompile> +    <ClCompile Include="..\..\imgui_demo.cpp"> +      <Filter>imgui</Filter> +    </ClCompile> +    <ClCompile Include="..\..\imgui_draw.cpp"> +      <Filter>imgui</Filter> +    </ClCompile> +    <ClCompile Include="..\..\backends\imgui_impl_dx12.cpp"> +      <Filter>sources</Filter> +    </ClCompile> +    <ClCompile Include="..\..\backends\imgui_impl_win32.cpp"> +      <Filter>sources</Filter> +    </ClCompile> +    <ClCompile Include="..\..\imgui_tables.cpp"> +      <Filter>imgui</Filter> +    </ClCompile> +    <ClCompile Include="..\..\imgui_widgets.cpp"> +      <Filter>imgui</Filter> +    </ClCompile> +  </ItemGroup> +  <ItemGroup> +    <None Include="..\README.txt" /> +    <None Include="..\..\misc\debuggers\imgui.natstepfilter"> +      <Filter>imgui</Filter> +    </None> +  </ItemGroup> +  <ItemGroup> +    <Natvis Include="..\..\misc\debuggers\imgui.natvis"> +      <Filter>imgui</Filter> +    </Natvis> +  </ItemGroup> +</Project>
\ No newline at end of file diff --git a/lib/imgui-1.90.7/examples/example_win32_directx12/main.cpp b/lib/imgui-1.90.7/examples/example_win32_directx12/main.cpp new file mode 100644 index 0000000..57a481c --- /dev/null +++ b/lib/imgui-1.90.7/examples/example_win32_directx12/main.cpp @@ -0,0 +1,483 @@ +// Dear ImGui: standalone example application for DirectX 12 + +// 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 + +// Important: to compile on 32-bit systems, the DirectX12 backend requires code to be compiled with '#define ImTextureID ImU64'. +// This is because we need ImTextureID to carry a 64-bit value and by default ImTextureID is defined as void*. +// This define is set in the example .vcxproj file and need to be replicated in your app or by adding it to your imconfig.h file. + +#include "imgui.h" +#include "imgui_impl_win32.h" +#include "imgui_impl_dx12.h" +#include <d3d12.h> +#include <dxgi1_4.h> +#include <tchar.h> + +#ifdef _DEBUG +#define DX12_ENABLE_DEBUG_LAYER +#endif + +#ifdef DX12_ENABLE_DEBUG_LAYER +#include <dxgidebug.h> +#pragma comment(lib, "dxguid.lib") +#endif + +#include "imgui_internal.h" + +struct FrameContext +{ +    ID3D12CommandAllocator* CommandAllocator; +    UINT64                  FenceValue; +}; + +// Data +static int const                    NUM_FRAMES_IN_FLIGHT = 3; +static FrameContext                 g_frameContext[NUM_FRAMES_IN_FLIGHT] = {}; +static UINT                         g_frameIndex = 0; + +static int const                    NUM_BACK_BUFFERS = 3; +static ID3D12Device*                g_pd3dDevice = nullptr; +static ID3D12DescriptorHeap*        g_pd3dRtvDescHeap = nullptr; +static ID3D12DescriptorHeap*        g_pd3dSrvDescHeap = nullptr; +static ID3D12CommandQueue*          g_pd3dCommandQueue = nullptr; +static ID3D12GraphicsCommandList*   g_pd3dCommandList = nullptr; +static ID3D12Fence*                 g_fence = nullptr; +static HANDLE                       g_fenceEvent = nullptr; +static UINT64                       g_fenceLastSignaledValue = 0; +static IDXGISwapChain3*             g_pSwapChain = nullptr; +static bool                         g_SwapChainOccluded = false; +static HANDLE                       g_hSwapChainWaitableObject = nullptr; +static ID3D12Resource*              g_mainRenderTargetResource[NUM_BACK_BUFFERS] = {}; +static D3D12_CPU_DESCRIPTOR_HANDLE  g_mainRenderTargetDescriptor[NUM_BACK_BUFFERS] = {}; + +// Forward declarations of helper functions +bool CreateDeviceD3D(HWND hWnd); +void CleanupDeviceD3D(); +void CreateRenderTarget(); +void CleanupRenderTarget(); +void WaitForLastSubmittedFrame(); +FrameContext* WaitForNextFrameResources(); +LRESULT WINAPI WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam); + +// 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 DirectX12 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_ImplDX12_Init(g_pd3dDevice, NUM_FRAMES_IN_FLIGHT, +        DXGI_FORMAT_R8G8B8A8_UNORM, g_pd3dSrvDescHeap, +        g_pd3dSrvDescHeap->GetCPUDescriptorHandleForHeapStart(), +        g_pd3dSrvDescHeap->GetGPUDescriptorHandleForHeapStart()); + +    // 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); + +    // 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 screen locked +        if (g_SwapChainOccluded && g_pSwapChain->Present(0, DXGI_PRESENT_TEST) == DXGI_STATUS_OCCLUDED) +        { +            ::Sleep(10); +            continue; +        } +        g_SwapChainOccluded = false; + +        // Start the Dear ImGui frame +        ImGui_ImplDX12_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); + +        // 2. Show a simple window that we create ourselves. We use a Begin/End pair to create a named window. +        { +            static float f = 0.0f; +            static int counter = 0; + +            ImGui::Begin("Hello, world!");                          // Create a window called "Hello, world!" and append into it. + +            ImGui::Text("This is some useful text.");               // Display some text (you can use a format strings too) +            ImGui::Checkbox("Demo Window", &show_demo_window);      // Edit bools storing our window open/close state +            ImGui::Checkbox("Another Window", &show_another_window); + +            ImGui::SliderFloat("float", &f, 0.0f, 1.0f);            // Edit 1 float using a slider from 0.0f to 1.0f +            ImGui::ColorEdit3("clear color", (float*)&clear_color); // Edit 3 floats representing a color + +            if (ImGui::Button("Button"))                            // Buttons return true when clicked (most widgets return true when edited/activated) +                counter++; +            ImGui::SameLine(); +            ImGui::Text("counter = %d", counter); + +            ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / io.Framerate, io.Framerate); +            ImGui::End(); +        } + +        // 3. Show another simple window. +        if (show_another_window) +        { +            ImGui::Begin("Another Window", &show_another_window);   // Pass a pointer to our bool variable (the window will have a closing button that will clear the bool when clicked) +            ImGui::Text("Hello from another window!"); +            if (ImGui::Button("Close Me")) +                show_another_window = false; +            ImGui::End(); +        } + +        // Rendering +        ImGui::Render(); + +        FrameContext* frameCtx = WaitForNextFrameResources(); +        UINT backBufferIdx = g_pSwapChain->GetCurrentBackBufferIndex(); +        frameCtx->CommandAllocator->Reset(); + +        D3D12_RESOURCE_BARRIER barrier = {}; +        barrier.Type                   = D3D12_RESOURCE_BARRIER_TYPE_TRANSITION; +        barrier.Flags                  = D3D12_RESOURCE_BARRIER_FLAG_NONE; +        barrier.Transition.pResource   = g_mainRenderTargetResource[backBufferIdx]; +        barrier.Transition.Subresource = D3D12_RESOURCE_BARRIER_ALL_SUBRESOURCES; +        barrier.Transition.StateBefore = D3D12_RESOURCE_STATE_PRESENT; +        barrier.Transition.StateAfter  = D3D12_RESOURCE_STATE_RENDER_TARGET; +        g_pd3dCommandList->Reset(frameCtx->CommandAllocator, nullptr); +        g_pd3dCommandList->ResourceBarrier(1, &barrier); + +        // Render Dear ImGui graphics +        const float clear_color_with_alpha[4] = { clear_color.x * clear_color.w, clear_color.y * clear_color.w, clear_color.z * clear_color.w, clear_color.w }; +        g_pd3dCommandList->ClearRenderTargetView(g_mainRenderTargetDescriptor[backBufferIdx], clear_color_with_alpha, 0, nullptr); +        g_pd3dCommandList->OMSetRenderTargets(1, &g_mainRenderTargetDescriptor[backBufferIdx], FALSE, nullptr); +        g_pd3dCommandList->SetDescriptorHeaps(1, &g_pd3dSrvDescHeap); +        ImGui_ImplDX12_RenderDrawData(ImGui::GetDrawData(), g_pd3dCommandList); +        barrier.Transition.StateBefore = D3D12_RESOURCE_STATE_RENDER_TARGET; +        barrier.Transition.StateAfter  = D3D12_RESOURCE_STATE_PRESENT; +        g_pd3dCommandList->ResourceBarrier(1, &barrier); +        g_pd3dCommandList->Close(); + +        g_pd3dCommandQueue->ExecuteCommandLists(1, (ID3D12CommandList* const*)&g_pd3dCommandList); + +        // Present +        HRESULT hr = g_pSwapChain->Present(1, 0);   // Present with vsync +        //HRESULT hr = g_pSwapChain->Present(0, 0); // Present without vsync +        g_SwapChainOccluded = (hr == DXGI_STATUS_OCCLUDED); + +        UINT64 fenceValue = g_fenceLastSignaledValue + 1; +        g_pd3dCommandQueue->Signal(g_fence, fenceValue); +        g_fenceLastSignaledValue = fenceValue; +        frameCtx->FenceValue = fenceValue; +    } + +    WaitForLastSubmittedFrame(); + +    // Cleanup +    ImGui_ImplDX12_Shutdown(); +    ImGui_ImplWin32_Shutdown(); +    ImGui::DestroyContext(); + +    CleanupDeviceD3D(); +    ::DestroyWindow(hwnd); +    ::UnregisterClassW(wc.lpszClassName, wc.hInstance); + +    return 0; +} + +// Helper functions + +bool CreateDeviceD3D(HWND hWnd) +{ +    // Setup swap chain +    DXGI_SWAP_CHAIN_DESC1 sd; +    { +        ZeroMemory(&sd, sizeof(sd)); +        sd.BufferCount = NUM_BACK_BUFFERS; +        sd.Width = 0; +        sd.Height = 0; +        sd.Format = DXGI_FORMAT_R8G8B8A8_UNORM; +        sd.Flags = DXGI_SWAP_CHAIN_FLAG_FRAME_LATENCY_WAITABLE_OBJECT; +        sd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; +        sd.SampleDesc.Count = 1; +        sd.SampleDesc.Quality = 0; +        sd.SwapEffect = DXGI_SWAP_EFFECT_FLIP_DISCARD; +        sd.AlphaMode = DXGI_ALPHA_MODE_UNSPECIFIED; +        sd.Scaling = DXGI_SCALING_STRETCH; +        sd.Stereo = FALSE; +    } + +    // [DEBUG] Enable debug interface +#ifdef DX12_ENABLE_DEBUG_LAYER +    ID3D12Debug* pdx12Debug = nullptr; +    if (SUCCEEDED(D3D12GetDebugInterface(IID_PPV_ARGS(&pdx12Debug)))) +        pdx12Debug->EnableDebugLayer(); +#endif + +    // Create device +    D3D_FEATURE_LEVEL featureLevel = D3D_FEATURE_LEVEL_11_0; +    if (D3D12CreateDevice(nullptr, featureLevel, IID_PPV_ARGS(&g_pd3dDevice)) != S_OK) +        return false; + +    // [DEBUG] Setup debug interface to break on any warnings/errors +#ifdef DX12_ENABLE_DEBUG_LAYER +    if (pdx12Debug != nullptr) +    { +        ID3D12InfoQueue* pInfoQueue = nullptr; +        g_pd3dDevice->QueryInterface(IID_PPV_ARGS(&pInfoQueue)); +        pInfoQueue->SetBreakOnSeverity(D3D12_MESSAGE_SEVERITY_ERROR, true); +        pInfoQueue->SetBreakOnSeverity(D3D12_MESSAGE_SEVERITY_CORRUPTION, true); +        pInfoQueue->SetBreakOnSeverity(D3D12_MESSAGE_SEVERITY_WARNING, true); +        pInfoQueue->Release(); +        pdx12Debug->Release(); +    } +#endif + +    { +        D3D12_DESCRIPTOR_HEAP_DESC desc = {}; +        desc.Type = D3D12_DESCRIPTOR_HEAP_TYPE_RTV; +        desc.NumDescriptors = NUM_BACK_BUFFERS; +        desc.Flags = D3D12_DESCRIPTOR_HEAP_FLAG_NONE; +        desc.NodeMask = 1; +        if (g_pd3dDevice->CreateDescriptorHeap(&desc, IID_PPV_ARGS(&g_pd3dRtvDescHeap)) != S_OK) +            return false; + +        SIZE_T rtvDescriptorSize = g_pd3dDevice->GetDescriptorHandleIncrementSize(D3D12_DESCRIPTOR_HEAP_TYPE_RTV); +        D3D12_CPU_DESCRIPTOR_HANDLE rtvHandle = g_pd3dRtvDescHeap->GetCPUDescriptorHandleForHeapStart(); +        for (UINT i = 0; i < NUM_BACK_BUFFERS; i++) +        { +            g_mainRenderTargetDescriptor[i] = rtvHandle; +            rtvHandle.ptr += rtvDescriptorSize; +        } +    } + +    { +        D3D12_DESCRIPTOR_HEAP_DESC desc = {}; +        desc.Type = D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV; +        desc.NumDescriptors = 1; +        desc.Flags = D3D12_DESCRIPTOR_HEAP_FLAG_SHADER_VISIBLE; +        if (g_pd3dDevice->CreateDescriptorHeap(&desc, IID_PPV_ARGS(&g_pd3dSrvDescHeap)) != S_OK) +            return false; +    } + +    { +        D3D12_COMMAND_QUEUE_DESC desc = {}; +        desc.Type = D3D12_COMMAND_LIST_TYPE_DIRECT; +        desc.Flags = D3D12_COMMAND_QUEUE_FLAG_NONE; +        desc.NodeMask = 1; +        if (g_pd3dDevice->CreateCommandQueue(&desc, IID_PPV_ARGS(&g_pd3dCommandQueue)) != S_OK) +            return false; +    } + +    for (UINT i = 0; i < NUM_FRAMES_IN_FLIGHT; i++) +        if (g_pd3dDevice->CreateCommandAllocator(D3D12_COMMAND_LIST_TYPE_DIRECT, IID_PPV_ARGS(&g_frameContext[i].CommandAllocator)) != S_OK) +            return false; + +    if (g_pd3dDevice->CreateCommandList(0, D3D12_COMMAND_LIST_TYPE_DIRECT, g_frameContext[0].CommandAllocator, nullptr, IID_PPV_ARGS(&g_pd3dCommandList)) != S_OK || +        g_pd3dCommandList->Close() != S_OK) +        return false; + +    if (g_pd3dDevice->CreateFence(0, D3D12_FENCE_FLAG_NONE, IID_PPV_ARGS(&g_fence)) != S_OK) +        return false; + +    g_fenceEvent = CreateEvent(nullptr, FALSE, FALSE, nullptr); +    if (g_fenceEvent == nullptr) +        return false; + +    { +        IDXGIFactory4* dxgiFactory = nullptr; +        IDXGISwapChain1* swapChain1 = nullptr; +        if (CreateDXGIFactory1(IID_PPV_ARGS(&dxgiFactory)) != S_OK) +            return false; +        if (dxgiFactory->CreateSwapChainForHwnd(g_pd3dCommandQueue, hWnd, &sd, nullptr, nullptr, &swapChain1) != S_OK) +            return false; +        if (swapChain1->QueryInterface(IID_PPV_ARGS(&g_pSwapChain)) != S_OK) +            return false; +        swapChain1->Release(); +        dxgiFactory->Release(); +        g_pSwapChain->SetMaximumFrameLatency(NUM_BACK_BUFFERS); +        g_hSwapChainWaitableObject = g_pSwapChain->GetFrameLatencyWaitableObject(); +    } + +    CreateRenderTarget(); +    return true; +} + +void CleanupDeviceD3D() +{ +    CleanupRenderTarget(); +    if (g_pSwapChain) { g_pSwapChain->SetFullscreenState(false, nullptr); g_pSwapChain->Release(); g_pSwapChain = nullptr; } +    if (g_hSwapChainWaitableObject != nullptr) { CloseHandle(g_hSwapChainWaitableObject); } +    for (UINT i = 0; i < NUM_FRAMES_IN_FLIGHT; i++) +        if (g_frameContext[i].CommandAllocator) { g_frameContext[i].CommandAllocator->Release(); g_frameContext[i].CommandAllocator = nullptr; } +    if (g_pd3dCommandQueue) { g_pd3dCommandQueue->Release(); g_pd3dCommandQueue = nullptr; } +    if (g_pd3dCommandList) { g_pd3dCommandList->Release(); g_pd3dCommandList = nullptr; } +    if (g_pd3dRtvDescHeap) { g_pd3dRtvDescHeap->Release(); g_pd3dRtvDescHeap = nullptr; } +    if (g_pd3dSrvDescHeap) { g_pd3dSrvDescHeap->Release(); g_pd3dSrvDescHeap = nullptr; } +    if (g_fence) { g_fence->Release(); g_fence = nullptr; } +    if (g_fenceEvent) { CloseHandle(g_fenceEvent); g_fenceEvent = nullptr; } +    if (g_pd3dDevice) { g_pd3dDevice->Release(); g_pd3dDevice = nullptr; } + +#ifdef DX12_ENABLE_DEBUG_LAYER +    IDXGIDebug1* pDebug = nullptr; +    if (SUCCEEDED(DXGIGetDebugInterface1(0, IID_PPV_ARGS(&pDebug)))) +    { +        pDebug->ReportLiveObjects(DXGI_DEBUG_ALL, DXGI_DEBUG_RLO_SUMMARY); +        pDebug->Release(); +    } +#endif +} + +void CreateRenderTarget() +{ +    for (UINT i = 0; i < NUM_BACK_BUFFERS; i++) +    { +        ID3D12Resource* pBackBuffer = nullptr; +        g_pSwapChain->GetBuffer(i, IID_PPV_ARGS(&pBackBuffer)); +        g_pd3dDevice->CreateRenderTargetView(pBackBuffer, nullptr, g_mainRenderTargetDescriptor[i]); +        g_mainRenderTargetResource[i] = pBackBuffer; +    } +} + +void CleanupRenderTarget() +{ +    WaitForLastSubmittedFrame(); + +    for (UINT i = 0; i < NUM_BACK_BUFFERS; i++) +        if (g_mainRenderTargetResource[i]) { g_mainRenderTargetResource[i]->Release(); g_mainRenderTargetResource[i] = nullptr; } +} + +void WaitForLastSubmittedFrame() +{ +    FrameContext* frameCtx = &g_frameContext[g_frameIndex % NUM_FRAMES_IN_FLIGHT]; + +    UINT64 fenceValue = frameCtx->FenceValue; +    if (fenceValue == 0) +        return; // No fence was signaled + +    frameCtx->FenceValue = 0; +    if (g_fence->GetCompletedValue() >= fenceValue) +        return; + +    g_fence->SetEventOnCompletion(fenceValue, g_fenceEvent); +    WaitForSingleObject(g_fenceEvent, INFINITE); +} + +FrameContext* WaitForNextFrameResources() +{ +    UINT nextFrameIndex = g_frameIndex + 1; +    g_frameIndex = nextFrameIndex; + +    HANDLE waitableObjects[] = { g_hSwapChainWaitableObject, nullptr }; +    DWORD numWaitableObjects = 1; + +    FrameContext* frameCtx = &g_frameContext[nextFrameIndex % NUM_FRAMES_IN_FLIGHT]; +    UINT64 fenceValue = frameCtx->FenceValue; +    if (fenceValue != 0) // means no fence was signaled +    { +        frameCtx->FenceValue = 0; +        g_fence->SetEventOnCompletion(fenceValue, g_fenceEvent); +        waitableObjects[1] = g_fenceEvent; +        numWaitableObjects = 2; +    } + +    WaitForMultipleObjects(numWaitableObjects, waitableObjects, TRUE, INFINITE); + +    return frameCtx; +} + +// 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 (g_pd3dDevice != nullptr && wParam != SIZE_MINIMIZED) +        { +            WaitForLastSubmittedFrame(); +            CleanupRenderTarget(); +            HRESULT result = g_pSwapChain->ResizeBuffers(0, (UINT)LOWORD(lParam), (UINT)HIWORD(lParam), DXGI_FORMAT_UNKNOWN, DXGI_SWAP_CHAIN_FLAG_FRAME_LATENCY_WAITABLE_OBJECT); +            assert(SUCCEEDED(result) && "Failed to resize swapchain."); +            CreateRenderTarget(); +        } +        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/lib/imgui-1.90.7/examples/example_win32_directx9/build_win32.bat b/lib/imgui-1.90.7/examples/example_win32_directx9/build_win32.bat new file mode 100644 index 0000000..ece5ea1 --- /dev/null +++ b/lib/imgui-1.90.7/examples/example_win32_directx9/build_win32.bat @@ -0,0 +1,8 @@ +@REM Build for Visual Studio compiler. Run your copy of vcvars32.bat or vcvarsall.bat to setup command-line compiler. +@set OUT_DIR=Debug +@set OUT_EXE=example_win32_directx9 +@set INCLUDES=/I..\.. /I..\..\backends /I "%DXSDK_DIR%/Include" +@set SOURCES=main.cpp ..\..\backends\imgui_impl_dx9.cpp ..\..\backends\imgui_impl_win32.cpp ..\..\imgui*.cpp +@set LIBS=/LIBPATH:"%DXSDK_DIR%/Lib/x86" d3d9.lib +mkdir %OUT_DIR% +cl /nologo /Zi /MD /utf-8 %INCLUDES% /D UNICODE /D _UNICODE %SOURCES% /Fe%OUT_DIR%/%OUT_EXE%.exe /Fo%OUT_DIR%/ /link %LIBS% diff --git a/lib/imgui-1.90.7/examples/example_win32_directx9/example_win32_directx9.vcxproj b/lib/imgui-1.90.7/examples/example_win32_directx9/example_win32_directx9.vcxproj new file mode 100644 index 0000000..8c3f995 --- /dev/null +++ b/lib/imgui-1.90.7/examples/example_win32_directx9/example_win32_directx9.vcxproj @@ -0,0 +1,176 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> +  <ItemGroup Label="ProjectConfigurations"> +    <ProjectConfiguration Include="Debug|Win32"> +      <Configuration>Debug</Configuration> +      <Platform>Win32</Platform> +    </ProjectConfiguration> +    <ProjectConfiguration Include="Debug|x64"> +      <Configuration>Debug</Configuration> +      <Platform>x64</Platform> +    </ProjectConfiguration> +    <ProjectConfiguration Include="Release|Win32"> +      <Configuration>Release</Configuration> +      <Platform>Win32</Platform> +    </ProjectConfiguration> +    <ProjectConfiguration Include="Release|x64"> +      <Configuration>Release</Configuration> +      <Platform>x64</Platform> +    </ProjectConfiguration> +  </ItemGroup> +  <PropertyGroup Label="Globals"> +    <ProjectGuid>{4165A294-21F2-44CA-9B38-E3F935ABADF5}</ProjectGuid> +    <RootNamespace>example_win32_directx9</RootNamespace> +    <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion> +  </PropertyGroup> +  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> +  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> +    <ConfigurationType>Application</ConfigurationType> +    <UseDebugLibraries>true</UseDebugLibraries> +    <CharacterSet>Unicode</CharacterSet> +    <PlatformToolset>v140</PlatformToolset> +  </PropertyGroup> +  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration"> +    <ConfigurationType>Application</ConfigurationType> +    <UseDebugLibraries>true</UseDebugLibraries> +    <CharacterSet>Unicode</CharacterSet> +    <PlatformToolset>v140</PlatformToolset> +  </PropertyGroup> +  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration"> +    <ConfigurationType>Application</ConfigurationType> +    <UseDebugLibraries>false</UseDebugLibraries> +    <WholeProgramOptimization>true</WholeProgramOptimization> +    <CharacterSet>Unicode</CharacterSet> +    <PlatformToolset>v140</PlatformToolset> +  </PropertyGroup> +  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration"> +    <ConfigurationType>Application</ConfigurationType> +    <UseDebugLibraries>false</UseDebugLibraries> +    <WholeProgramOptimization>true</WholeProgramOptimization> +    <CharacterSet>Unicode</CharacterSet> +    <PlatformToolset>v140</PlatformToolset> +  </PropertyGroup> +  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> +  <ImportGroup Label="ExtensionSettings"> +  </ImportGroup> +  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> +    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> +  </ImportGroup> +  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets"> +    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> +  </ImportGroup> +  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> +    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> +  </ImportGroup> +  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets"> +    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> +  </ImportGroup> +  <PropertyGroup Label="UserMacros" /> +  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> +    <OutDir>$(ProjectDir)$(Configuration)\</OutDir> +    <IntDir>$(ProjectDir)$(Configuration)\</IntDir> +  </PropertyGroup> +  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> +    <OutDir>$(ProjectDir)$(Configuration)\</OutDir> +    <IntDir>$(ProjectDir)$(Configuration)\</IntDir> +  </PropertyGroup> +  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> +    <OutDir>$(ProjectDir)$(Configuration)\</OutDir> +    <IntDir>$(ProjectDir)$(Configuration)\</IntDir> +  </PropertyGroup> +  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> +    <OutDir>$(ProjectDir)$(Configuration)\</OutDir> +    <IntDir>$(ProjectDir)$(Configuration)\</IntDir> +  </PropertyGroup> +  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> +    <ClCompile> +      <WarningLevel>Level4</WarningLevel> +      <Optimization>Disabled</Optimization> +      <AdditionalIncludeDirectories>..\..;..\..\backends;%(AdditionalIncludeDirectories);$(DXSDK_DIR)Include;</AdditionalIncludeDirectories> +      <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions> +    </ClCompile> +    <Link> +      <GenerateDebugInformation>true</GenerateDebugInformation> +      <AdditionalLibraryDirectories>$(DXSDK_DIR)/Lib/x86;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> +      <AdditionalDependencies>d3d9.lib;%(AdditionalDependencies)</AdditionalDependencies> +      <SubSystem>Console</SubSystem> +    </Link> +  </ItemDefinitionGroup> +  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> +    <ClCompile> +      <WarningLevel>Level4</WarningLevel> +      <Optimization>Disabled</Optimization> +      <AdditionalIncludeDirectories>..\..;..\..\backends;%(AdditionalIncludeDirectories);$(DXSDK_DIR)Include;</AdditionalIncludeDirectories> +      <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions> +    </ClCompile> +    <Link> +      <GenerateDebugInformation>true</GenerateDebugInformation> +      <AdditionalLibraryDirectories>$(DXSDK_DIR)/Lib/x64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> +      <AdditionalDependencies>d3d9.lib;%(AdditionalDependencies)</AdditionalDependencies> +      <SubSystem>Console</SubSystem> +    </Link> +  </ItemDefinitionGroup> +  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> +    <ClCompile> +      <WarningLevel>Level4</WarningLevel> +      <Optimization>MaxSpeed</Optimization> +      <FunctionLevelLinking>true</FunctionLevelLinking> +      <IntrinsicFunctions>true</IntrinsicFunctions> +      <AdditionalIncludeDirectories>..\..;..\..\backends;%(AdditionalIncludeDirectories);$(DXSDK_DIR)Include;</AdditionalIncludeDirectories> +      <BufferSecurityCheck>false</BufferSecurityCheck> +      <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions> +    </ClCompile> +    <Link> +      <GenerateDebugInformation>true</GenerateDebugInformation> +      <EnableCOMDATFolding>true</EnableCOMDATFolding> +      <OptimizeReferences>true</OptimizeReferences> +      <AdditionalLibraryDirectories>$(DXSDK_DIR)/Lib/x86;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> +      <AdditionalDependencies>d3d9.lib;%(AdditionalDependencies)</AdditionalDependencies> +      <SubSystem>Console</SubSystem> +    </Link> +  </ItemDefinitionGroup> +  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> +    <ClCompile> +      <WarningLevel>Level4</WarningLevel> +      <Optimization>MaxSpeed</Optimization> +      <FunctionLevelLinking>true</FunctionLevelLinking> +      <IntrinsicFunctions>true</IntrinsicFunctions> +      <AdditionalIncludeDirectories>..\..;..\..\backends;%(AdditionalIncludeDirectories);$(DXSDK_DIR)Include;</AdditionalIncludeDirectories> +      <BufferSecurityCheck>false</BufferSecurityCheck> +      <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions> +    </ClCompile> +    <Link> +      <GenerateDebugInformation>true</GenerateDebugInformation> +      <EnableCOMDATFolding>true</EnableCOMDATFolding> +      <OptimizeReferences>true</OptimizeReferences> +      <AdditionalLibraryDirectories>$(DXSDK_DIR)/Lib/x64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> +      <AdditionalDependencies>d3d9.lib;%(AdditionalDependencies)</AdditionalDependencies> +      <SubSystem>Console</SubSystem> +    </Link> +  </ItemDefinitionGroup> +  <ItemGroup> +    <ClCompile Include="..\..\imgui.cpp" /> +    <ClCompile Include="..\..\imgui_demo.cpp" /> +    <ClCompile Include="..\..\imgui_draw.cpp" /> +    <ClCompile Include="..\..\imgui_tables.cpp" /> +    <ClCompile Include="..\..\imgui_widgets.cpp" /> +    <ClCompile Include="..\..\backends\imgui_impl_dx9.cpp" /> +    <ClCompile Include="..\..\backends\imgui_impl_win32.cpp" /> +    <ClCompile Include="main.cpp" /> +  </ItemGroup> +  <ItemGroup> +    <ClInclude Include="..\..\imconfig.h" /> +    <ClInclude Include="..\..\imgui.h" /> +    <ClInclude Include="..\..\imgui_internal.h" /> +    <ClInclude Include="..\..\backends\imgui_impl_dx9.h" /> +    <ClInclude Include="..\..\backends\imgui_impl_win32.h" /> +  </ItemGroup> +  <ItemGroup> +    <None Include="..\..\misc\debuggers\imgui.natstepfilter" /> +    <None Include="..\..\misc\debuggers\imgui.natvis" /> +    <None Include="..\README.txt" /> +  </ItemGroup> +  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> +  <ImportGroup Label="ExtensionTargets"> +  </ImportGroup> +</Project>
\ No newline at end of file diff --git a/lib/imgui-1.90.7/examples/example_win32_directx9/example_win32_directx9.vcxproj.filters b/lib/imgui-1.90.7/examples/example_win32_directx9/example_win32_directx9.vcxproj.filters new file mode 100644 index 0000000..5ed89d6 --- /dev/null +++ b/lib/imgui-1.90.7/examples/example_win32_directx9/example_win32_directx9.vcxproj.filters @@ -0,0 +1,64 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> +  <ItemGroup> +    <Filter Include="sources"> +      <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier> +      <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions> +    </Filter> +    <Filter Include="imgui"> +      <UniqueIdentifier>{a82cba23-9de0-45c2-b1e3-2eb1666702de}</UniqueIdentifier> +    </Filter> +  </ItemGroup> +  <ItemGroup> +    <ClCompile Include="main.cpp"> +      <Filter>sources</Filter> +    </ClCompile> +    <ClCompile Include="..\..\imgui.cpp"> +      <Filter>imgui</Filter> +    </ClCompile> +    <ClCompile Include="..\..\imgui_demo.cpp"> +      <Filter>imgui</Filter> +    </ClCompile> +    <ClCompile Include="..\..\imgui_draw.cpp"> +      <Filter>imgui</Filter> +    </ClCompile> +    <ClCompile Include="..\..\backends\imgui_impl_win32.cpp"> +      <Filter>sources</Filter> +    </ClCompile> +    <ClCompile Include="..\..\backends\imgui_impl_dx9.cpp"> +      <Filter>sources</Filter> +    </ClCompile> +    <ClCompile Include="..\..\imgui_tables.cpp"> +      <Filter>imgui</Filter> +    </ClCompile> +    <ClCompile Include="..\..\imgui_widgets.cpp"> +      <Filter>imgui</Filter> +    </ClCompile> +  </ItemGroup> +  <ItemGroup> +    <ClInclude Include="..\..\imconfig.h"> +      <Filter>imgui</Filter> +    </ClInclude> +    <ClInclude Include="..\..\imgui.h"> +      <Filter>imgui</Filter> +    </ClInclude> +    <ClInclude Include="..\..\imgui_internal.h"> +      <Filter>imgui</Filter> +    </ClInclude> +    <ClInclude Include="..\..\backends\imgui_impl_win32.h"> +      <Filter>sources</Filter> +    </ClInclude> +    <ClInclude Include="..\..\backends\imgui_impl_dx9.h"> +      <Filter>sources</Filter> +    </ClInclude> +  </ItemGroup> +  <ItemGroup> +    <None Include="..\README.txt" /> +    <None Include="..\..\misc\debuggers\imgui.natvis"> +      <Filter>imgui</Filter> +    </None> +    <None Include="..\..\misc\debuggers\imgui.natstepfilter"> +      <Filter>imgui</Filter> +    </None> +  </ItemGroup> +</Project>
\ No newline at end of file diff --git a/lib/imgui-1.90.7/examples/example_win32_directx9/main.cpp b/lib/imgui-1.90.7/examples/example_win32_directx9/main.cpp new file mode 100644 index 0000000..422248b --- /dev/null +++ b/lib/imgui-1.90.7/examples/example_win32_directx9/main.cpp @@ -0,0 +1,264 @@ +// 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 <d3d9.h> +#include <tchar.h> + +// Data +static LPDIRECT3D9              g_pD3D = nullptr; +static LPDIRECT3DDEVICE9        g_pd3dDevice = nullptr; +static bool                     g_DeviceLost = false; +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); + +// 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); + +    // 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 lost D3D9 device +        if (g_DeviceLost) +        { +            HRESULT hr = g_pd3dDevice->TestCooperativeLevel(); +            if (hr == D3DERR_DEVICELOST) +            { +                ::Sleep(10); +                continue; +            } +            if (hr == D3DERR_DEVICENOTRESET) +                ResetDevice(); +            g_DeviceLost = false; +        } + +        // 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); + +        // 2. Show a simple window that we create ourselves. We use a Begin/End pair to create a named window. +        { +            static float f = 0.0f; +            static int counter = 0; + +            ImGui::Begin("Hello, world!");                          // Create a window called "Hello, world!" and append into it. + +            ImGui::Text("This is some useful text.");               // Display some text (you can use a format strings too) +            ImGui::Checkbox("Demo Window", &show_demo_window);      // Edit bools storing our window open/close state +            ImGui::Checkbox("Another Window", &show_another_window); + +            ImGui::SliderFloat("float", &f, 0.0f, 1.0f);            // Edit 1 float using a slider from 0.0f to 1.0f +            ImGui::ColorEdit3("clear color", (float*)&clear_color); // Edit 3 floats representing a color + +            if (ImGui::Button("Button"))                            // Buttons return true when clicked (most widgets return true when edited/activated) +                counter++; +            ImGui::SameLine(); +            ImGui::Text("counter = %d", counter); + +            ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / io.Framerate, io.Framerate); +            ImGui::End(); +        } + +        // 3. Show another simple window. +        if (show_another_window) +        { +            ImGui::Begin("Another Window", &show_another_window);   // Pass a pointer to our bool variable (the window will have a closing button that will clear the bool when clicked) +            ImGui::Text("Hello from another window!"); +            if (ImGui::Button("Close Me")) +                show_another_window = false; +            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); +        if (result == D3DERR_DEVICELOST) +            g_DeviceLost = true; +    } + +    // Cleanup +    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/lib/imgui-1.90.7/examples/example_win32_opengl3/build_win32.bat b/lib/imgui-1.90.7/examples/example_win32_opengl3/build_win32.bat new file mode 100644 index 0000000..48df080 --- /dev/null +++ b/lib/imgui-1.90.7/examples/example_win32_opengl3/build_win32.bat @@ -0,0 +1,8 @@ +@REM Build for Visual Studio compiler. Run your copy of vcvars32.bat or vcvarsall.bat to setup command-line compiler. +@set OUT_DIR=Debug +@set OUT_EXE=example_win32_opengl3 +@set INCLUDES=/I..\.. /I..\..\backends +@set SOURCES=main.cpp ..\..\backends\imgui_impl_opengl3.cpp ..\..\backends\imgui_impl_win32.cpp ..\..\imgui*.cpp +@set LIBS=opengl32.lib +mkdir %OUT_DIR% +cl /nologo /Zi /MD /utf-8 %INCLUDES% /D UNICODE /D _UNICODE %SOURCES% /Fe%OUT_DIR%/%OUT_EXE%.exe /Fo%OUT_DIR%/ /link %LIBS% diff --git a/lib/imgui-1.90.7/examples/example_win32_opengl3/example_win32_opengl3.vcxproj b/lib/imgui-1.90.7/examples/example_win32_opengl3/example_win32_opengl3.vcxproj new file mode 100644 index 0000000..98fc38f --- /dev/null +++ b/lib/imgui-1.90.7/examples/example_win32_opengl3/example_win32_opengl3.vcxproj @@ -0,0 +1,176 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> +  <ItemGroup Label="ProjectConfigurations"> +    <ProjectConfiguration Include="Debug|Win32"> +      <Configuration>Debug</Configuration> +      <Platform>Win32</Platform> +    </ProjectConfiguration> +    <ProjectConfiguration Include="Debug|x64"> +      <Configuration>Debug</Configuration> +      <Platform>x64</Platform> +    </ProjectConfiguration> +    <ProjectConfiguration Include="Release|Win32"> +      <Configuration>Release</Configuration> +      <Platform>Win32</Platform> +    </ProjectConfiguration> +    <ProjectConfiguration Include="Release|x64"> +      <Configuration>Release</Configuration> +      <Platform>x64</Platform> +    </ProjectConfiguration> +  </ItemGroup> +  <PropertyGroup Label="Globals"> +    <ProjectGuid>{C624E5FF-D4FE-4D35-9164-B8A91864F98E}</ProjectGuid> +    <RootNamespace>example_win32_opengl2</RootNamespace> +    <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion> +  </PropertyGroup> +  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> +  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> +    <ConfigurationType>Application</ConfigurationType> +    <UseDebugLibraries>true</UseDebugLibraries> +    <CharacterSet>Unicode</CharacterSet> +    <PlatformToolset>v140</PlatformToolset> +  </PropertyGroup> +  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration"> +    <ConfigurationType>Application</ConfigurationType> +    <UseDebugLibraries>true</UseDebugLibraries> +    <CharacterSet>Unicode</CharacterSet> +    <PlatformToolset>v140</PlatformToolset> +  </PropertyGroup> +  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration"> +    <ConfigurationType>Application</ConfigurationType> +    <UseDebugLibraries>false</UseDebugLibraries> +    <WholeProgramOptimization>true</WholeProgramOptimization> +    <CharacterSet>Unicode</CharacterSet> +    <PlatformToolset>v140</PlatformToolset> +  </PropertyGroup> +  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration"> +    <ConfigurationType>Application</ConfigurationType> +    <UseDebugLibraries>false</UseDebugLibraries> +    <WholeProgramOptimization>true</WholeProgramOptimization> +    <CharacterSet>Unicode</CharacterSet> +    <PlatformToolset>v140</PlatformToolset> +  </PropertyGroup> +  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> +  <ImportGroup Label="ExtensionSettings"> +  </ImportGroup> +  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> +    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> +  </ImportGroup> +  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets"> +    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> +  </ImportGroup> +  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> +    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> +  </ImportGroup> +  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets"> +    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> +  </ImportGroup> +  <PropertyGroup Label="UserMacros" /> +  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> +    <OutDir>$(ProjectDir)$(Configuration)\</OutDir> +    <IntDir>$(ProjectDir)$(Configuration)\</IntDir> +  </PropertyGroup> +  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> +    <OutDir>$(ProjectDir)$(Configuration)\</OutDir> +    <IntDir>$(ProjectDir)$(Configuration)\</IntDir> +  </PropertyGroup> +  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> +    <OutDir>$(ProjectDir)$(Configuration)\</OutDir> +    <IntDir>$(ProjectDir)$(Configuration)\</IntDir> +  </PropertyGroup> +  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> +    <OutDir>$(ProjectDir)$(Configuration)\</OutDir> +    <IntDir>$(ProjectDir)$(Configuration)\</IntDir> +  </PropertyGroup> +  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> +    <ClCompile> +      <WarningLevel>Level4</WarningLevel> +      <Optimization>Disabled</Optimization> +      <AdditionalIncludeDirectories>..\..;..\..\backends;</AdditionalIncludeDirectories> +      <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions> +    </ClCompile> +    <Link> +      <GenerateDebugInformation>true</GenerateDebugInformation> +      <AdditionalLibraryDirectories>%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> +      <AdditionalDependencies>opengl32.lib;%(AdditionalDependencies)</AdditionalDependencies> +      <SubSystem>Console</SubSystem> +    </Link> +  </ItemDefinitionGroup> +  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> +    <ClCompile> +      <WarningLevel>Level4</WarningLevel> +      <Optimization>Disabled</Optimization> +      <AdditionalIncludeDirectories>..\..;..\..\backends;</AdditionalIncludeDirectories> +      <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions> +    </ClCompile> +    <Link> +      <GenerateDebugInformation>true</GenerateDebugInformation> +      <AdditionalLibraryDirectories>%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> +      <AdditionalDependencies>opengl32.lib;%(AdditionalDependencies)</AdditionalDependencies> +      <SubSystem>Console</SubSystem> +    </Link> +  </ItemDefinitionGroup> +  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> +    <ClCompile> +      <WarningLevel>Level4</WarningLevel> +      <Optimization>MaxSpeed</Optimization> +      <FunctionLevelLinking>true</FunctionLevelLinking> +      <IntrinsicFunctions>true</IntrinsicFunctions> +      <AdditionalIncludeDirectories>..\..;..\..\backends;</AdditionalIncludeDirectories> +      <BufferSecurityCheck>false</BufferSecurityCheck> +      <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions> +    </ClCompile> +    <Link> +      <GenerateDebugInformation>true</GenerateDebugInformation> +      <EnableCOMDATFolding>true</EnableCOMDATFolding> +      <OptimizeReferences>true</OptimizeReferences> +      <AdditionalLibraryDirectories>%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> +      <AdditionalDependencies>opengl32.lib;%(AdditionalDependencies)</AdditionalDependencies> +      <SubSystem>Console</SubSystem> +    </Link> +  </ItemDefinitionGroup> +  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> +    <ClCompile> +      <WarningLevel>Level4</WarningLevel> +      <Optimization>MaxSpeed</Optimization> +      <FunctionLevelLinking>true</FunctionLevelLinking> +      <IntrinsicFunctions>true</IntrinsicFunctions> +      <AdditionalIncludeDirectories>..\..;..\..\backends;</AdditionalIncludeDirectories> +      <BufferSecurityCheck>false</BufferSecurityCheck> +      <AdditionalOptions>/utf-8 %(AdditionalOptions)</AdditionalOptions> +    </ClCompile> +    <Link> +      <GenerateDebugInformation>true</GenerateDebugInformation> +      <EnableCOMDATFolding>true</EnableCOMDATFolding> +      <OptimizeReferences>true</OptimizeReferences> +      <AdditionalLibraryDirectories>%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> +      <AdditionalDependencies>opengl32.lib;%(AdditionalDependencies)</AdditionalDependencies> +      <SubSystem>Console</SubSystem> +    </Link> +  </ItemDefinitionGroup> +  <ItemGroup> +    <ClCompile Include="..\..\imgui.cpp" /> +    <ClCompile Include="..\..\imgui_demo.cpp" /> +    <ClCompile Include="..\..\imgui_draw.cpp" /> +    <ClCompile Include="..\..\imgui_tables.cpp" /> +    <ClCompile Include="..\..\imgui_widgets.cpp" /> +    <ClCompile Include="..\..\backends\imgui_impl_opengl3.cpp" /> +    <ClCompile Include="..\..\backends\imgui_impl_win32.cpp" /> +    <ClCompile Include="main.cpp" /> +  </ItemGroup> +  <ItemGroup> +    <ClInclude Include="..\..\imconfig.h" /> +    <ClInclude Include="..\..\imgui.h" /> +    <ClInclude Include="..\..\imgui_internal.h" /> +    <ClInclude Include="..\..\backends\imgui_impl_opengl3.h" /> +    <ClInclude Include="..\..\backends\imgui_impl_opengl3_loader.h" /> +    <ClInclude Include="..\..\backends\imgui_impl_win32.h" /> +  </ItemGroup> +  <ItemGroup> +    <None Include="..\..\misc\natvis\imgui.natvis" /> +    <None Include="..\README.txt" /> +  </ItemGroup> +  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> +  <ImportGroup Label="ExtensionTargets"> +  </ImportGroup> +</Project>
\ No newline at end of file diff --git a/lib/imgui-1.90.7/examples/example_win32_opengl3/example_win32_opengl3.vcxproj.filters b/lib/imgui-1.90.7/examples/example_win32_opengl3/example_win32_opengl3.vcxproj.filters new file mode 100644 index 0000000..47ed299 --- /dev/null +++ b/lib/imgui-1.90.7/examples/example_win32_opengl3/example_win32_opengl3.vcxproj.filters @@ -0,0 +1,64 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> +  <ItemGroup> +    <Filter Include="sources"> +      <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier> +      <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions> +    </Filter> +    <Filter Include="imgui"> +      <UniqueIdentifier>{a82cba23-9de0-45c2-b1e3-2eb1666702de}</UniqueIdentifier> +    </Filter> +  </ItemGroup> +  <ItemGroup> +    <ClCompile Include="main.cpp"> +      <Filter>sources</Filter> +    </ClCompile> +    <ClCompile Include="..\..\imgui.cpp"> +      <Filter>imgui</Filter> +    </ClCompile> +    <ClCompile Include="..\..\imgui_demo.cpp"> +      <Filter>imgui</Filter> +    </ClCompile> +    <ClCompile Include="..\..\imgui_draw.cpp"> +      <Filter>imgui</Filter> +    </ClCompile> +    <ClCompile Include="..\..\imgui_widgets.cpp"> +      <Filter>imgui</Filter> +    </ClCompile> +    <ClCompile Include="..\..\backends\imgui_impl_win32.cpp"> +      <Filter>sources</Filter> +    </ClCompile> +    <ClCompile Include="..\..\imgui_tables.cpp"> +      <Filter>imgui</Filter> +    </ClCompile> +    <ClCompile Include="..\..\backends\imgui_impl_opengl3.cpp"> +      <Filter>sources</Filter> +    </ClCompile> +  </ItemGroup> +  <ItemGroup> +    <ClInclude Include="..\..\imconfig.h"> +      <Filter>imgui</Filter> +    </ClInclude> +    <ClInclude Include="..\..\imgui.h"> +      <Filter>imgui</Filter> +    </ClInclude> +    <ClInclude Include="..\..\imgui_internal.h"> +      <Filter>imgui</Filter> +    </ClInclude> +    <ClInclude Include="..\..\backends\imgui_impl_win32.h"> +      <Filter>sources</Filter> +    </ClInclude> +    <ClInclude Include="..\..\backends\imgui_impl_opengl3.h"> +      <Filter>sources</Filter> +    </ClInclude> +    <ClInclude Include="..\..\backends\imgui_impl_opengl3_loader.h"> +      <Filter>sources</Filter> +    </ClInclude> +  </ItemGroup> +  <ItemGroup> +    <None Include="..\README.txt" /> +    <None Include="..\..\misc\natvis\imgui.natvis"> +      <Filter>sources</Filter> +    </None> +  </ItemGroup> +</Project>
\ No newline at end of file diff --git a/lib/imgui-1.90.7/examples/example_win32_opengl3/main.cpp b/lib/imgui-1.90.7/examples/example_win32_opengl3/main.cpp new file mode 100644 index 0000000..594931d --- /dev/null +++ b/lib/imgui-1.90.7/examples/example_win32_opengl3/main.cpp @@ -0,0 +1,238 @@ +// Dear ImGui: standalone example application for Win32 + OpenGL 3 + +// 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 + +// This is provided for completeness, however it is strongly recommended you use OpenGL with SDL or GLFW. + +#include "imgui.h" +#include "imgui_impl_opengl3.h" +#include "imgui_impl_win32.h" +#ifndef WIN32_LEAN_AND_MEAN +#define WIN32_LEAN_AND_MEAN +#endif +#include <windows.h> +#include <GL/GL.h> +#include <tchar.h> + +// Data stored per platform window +struct WGL_WindowData { HDC hDC; }; + +// Data +static HGLRC            g_hRC; +static WGL_WindowData   g_MainWindow; +static int              g_Width; +static int              g_Height; + +// Forward declarations of helper functions +bool CreateDeviceWGL(HWND hWnd, WGL_WindowData* data); +void CleanupDeviceWGL(HWND hWnd, WGL_WindowData* data); +void ResetDeviceWGL(); +LRESULT WINAPI WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam); + +// Main code +int main(int, char**) +{ +    // Create application window +    //ImGui_ImplWin32_EnableDpiAwareness(); +    WNDCLASSEXW wc = { sizeof(wc), CS_OWNDC, WndProc, 0L, 0L, GetModuleHandle(nullptr), nullptr, nullptr, nullptr, nullptr, L"ImGui Example", nullptr }; +    ::RegisterClassExW(&wc); +    HWND hwnd = ::CreateWindowW(wc.lpszClassName, L"Dear ImGui Win32+OpenGL3 Example", WS_OVERLAPPEDWINDOW, 100, 100, 1280, 800, nullptr, nullptr, wc.hInstance, nullptr); + +    // Initialize OpenGL +    if (!CreateDeviceWGL(hwnd, &g_MainWindow)) +    { +        CleanupDeviceWGL(hwnd, &g_MainWindow); +        ::DestroyWindow(hwnd); +        ::UnregisterClassW(wc.lpszClassName, wc.hInstance); +        return 1; +    } +    wglMakeCurrent(g_MainWindow.hDC, g_hRC); + +    // 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::StyleColorsClassic(); + +    // Setup Platform/Renderer backends +    ImGui_ImplWin32_InitForOpenGL(hwnd); +    ImGui_ImplOpenGL3_Init(); + +    // 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); + +    // 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; + +        // Start the Dear ImGui frame +        ImGui_ImplOpenGL3_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); + +        // 2. Show a simple window that we create ourselves. We use a Begin/End pair to create a named window. +        { +            static float f = 0.0f; +            static int counter = 0; + +            ImGui::Begin("Hello, world!");                          // Create a window called "Hello, world!" and append into it. + +            ImGui::Text("This is some useful text.");               // Display some text (you can use a format strings too) +            ImGui::Checkbox("Demo Window", &show_demo_window);      // Edit bools storing our window open/close state +            ImGui::Checkbox("Another Window", &show_another_window); + +            ImGui::SliderFloat("float", &f, 0.0f, 1.0f);            // Edit 1 float using a slider from 0.0f to 1.0f +            ImGui::ColorEdit3("clear color", (float*)&clear_color); // Edit 3 floats representing a color + +            if (ImGui::Button("Button"))                            // Buttons return true when clicked (most widgets return true when edited/activated) +                counter++; +            ImGui::SameLine(); +            ImGui::Text("counter = %d", counter); + +            ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / io.Framerate, io.Framerate); +            ImGui::End(); +        } + +        // 3. Show another simple window. +        if (show_another_window) +        { +            ImGui::Begin("Another Window", &show_another_window);   // Pass a pointer to our bool variable (the window will have a closing button that will clear the bool when clicked) +            ImGui::Text("Hello from another window!"); +            if (ImGui::Button("Close Me")) +                show_another_window = false; +            ImGui::End(); +        } + +        // Rendering +        ImGui::Render(); +        glViewport(0, 0, g_Width, g_Height); +        glClearColor(clear_color.x, clear_color.y, clear_color.z, clear_color.w); +        glClear(GL_COLOR_BUFFER_BIT); +        ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData()); + +        // Present +        ::SwapBuffers(g_MainWindow.hDC); +    } + +    ImGui_ImplOpenGL3_Shutdown(); +    ImGui_ImplWin32_Shutdown(); +    ImGui::DestroyContext(); + +    CleanupDeviceWGL(hwnd, &g_MainWindow); +    wglDeleteContext(g_hRC); +    ::DestroyWindow(hwnd); +    ::UnregisterClassW(wc.lpszClassName, wc.hInstance); + +    return 0; +} + +// Helper functions +bool CreateDeviceWGL(HWND hWnd, WGL_WindowData* data) +{ +    HDC hDc = ::GetDC(hWnd); +    PIXELFORMATDESCRIPTOR pfd = { 0 }; +    pfd.nSize = sizeof(pfd); +    pfd.nVersion = 1; +    pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER; +    pfd.iPixelType = PFD_TYPE_RGBA; +    pfd.cColorBits = 32; + +    const int pf = ::ChoosePixelFormat(hDc, &pfd); +    if (pf == 0) +        return false; +    if (::SetPixelFormat(hDc, pf, &pfd) == FALSE) +        return false; +    ::ReleaseDC(hWnd, hDc); + +    data->hDC = ::GetDC(hWnd); +    if (!g_hRC) +        g_hRC = wglCreateContext(data->hDC); +    return true; +} + +void CleanupDeviceWGL(HWND hWnd, WGL_WindowData* data) +{ +    wglMakeCurrent(nullptr, nullptr); +    ::ReleaseDC(hWnd, data->hDC); +} + +// 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) +        { +            g_Width = LOWORD(lParam); +            g_Height = 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/lib/imgui-1.90.7/examples/imgui_examples.sln b/lib/imgui-1.90.7/examples/imgui_examples.sln new file mode 100644 index 0000000..071bcbd --- /dev/null +++ b/lib/imgui-1.90.7/examples/imgui_examples.sln @@ -0,0 +1,151 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.2.32616.157 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "example_win32_directx9", "example_win32_directx9\example_win32_directx9.vcxproj", "{4165A294-21F2-44CA-9B38-E3F935ABADF5}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "example_win32_directx10", "example_win32_directx10\example_win32_directx10.vcxproj", "{345A953E-A004-4648-B442-DC5F9F11068C}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "example_win32_directx11", "example_win32_directx11\example_win32_directx11.vcxproj", "{9F316E83-5AE5-4939-A723-305A94F48005}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "example_win32_directx12", "example_win32_directx12\example_win32_directx12.vcxproj", "{B4CF9797-519D-4AFE-A8F4-5141A6B521D3}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "example_glfw_opengl2", "example_glfw_opengl2\example_glfw_opengl2.vcxproj", "{9CDA7840-B7A5-496D-A527-E95571496D18}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "example_glfw_opengl3", "example_glfw_opengl3\example_glfw_opengl3.vcxproj", "{4A1FB5EA-22F5-42A8-AB92-1D2DF5D47FB9}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "example_glfw_vulkan", "example_glfw_vulkan\example_glfw_vulkan.vcxproj", "{57E2DF5A-6FC8-45BB-99DD-91A18C646E80}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "example_sdl2_directx11", "example_sdl2_directx11\example_sdl2_directx11.vcxproj", "{9E1987E3-1F19-45CA-B9C9-D31E791836D8}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "example_sdl2_opengl2", "example_sdl2_opengl2\example_sdl2_opengl2.vcxproj", "{2AE17FDE-F7F3-4CAC-ADAB-0710EDA4F741}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "example_sdl2_opengl3", "example_sdl2_opengl3\example_sdl2_opengl3.vcxproj", "{BBAEB705-1669-40F3-8567-04CF6A991F4C}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "example_sdl2_vulkan", "example_sdl2_vulkan\example_sdl2_vulkan.vcxproj", "{BAE3D0B5-9695-4EB1-AD0F-75890EB4A3B3}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "example_win32_opengl3", "example_win32_opengl3\example_win32_opengl3.vcxproj", "{C624E5FF-D4FE-4D35-9164-B8A91864F98E}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "example_sdl2_sdlrenderer2", "example_sdl2_sdlrenderer2\example_sdl2_sdlrenderer2.vcxproj", "{0C0B2BEA-311F-473C-9652-87923EF639E3}" +EndProject +Global +	GlobalSection(SolutionConfigurationPlatforms) = preSolution +		Debug|Win32 = Debug|Win32 +		Debug|x64 = Debug|x64 +		Release|Win32 = Release|Win32 +		Release|x64 = Release|x64 +	EndGlobalSection +	GlobalSection(ProjectConfigurationPlatforms) = postSolution +		{4165A294-21F2-44CA-9B38-E3F935ABADF5}.Debug|Win32.ActiveCfg = Debug|Win32 +		{4165A294-21F2-44CA-9B38-E3F935ABADF5}.Debug|Win32.Build.0 = Debug|Win32 +		{4165A294-21F2-44CA-9B38-E3F935ABADF5}.Debug|x64.ActiveCfg = Debug|x64 +		{4165A294-21F2-44CA-9B38-E3F935ABADF5}.Debug|x64.Build.0 = Debug|x64 +		{4165A294-21F2-44CA-9B38-E3F935ABADF5}.Release|Win32.ActiveCfg = Release|Win32 +		{4165A294-21F2-44CA-9B38-E3F935ABADF5}.Release|Win32.Build.0 = Release|Win32 +		{4165A294-21F2-44CA-9B38-E3F935ABADF5}.Release|x64.ActiveCfg = Release|x64 +		{4165A294-21F2-44CA-9B38-E3F935ABADF5}.Release|x64.Build.0 = Release|x64 +		{345A953E-A004-4648-B442-DC5F9F11068C}.Debug|Win32.ActiveCfg = Debug|Win32 +		{345A953E-A004-4648-B442-DC5F9F11068C}.Debug|Win32.Build.0 = Debug|Win32 +		{345A953E-A004-4648-B442-DC5F9F11068C}.Debug|x64.ActiveCfg = Debug|x64 +		{345A953E-A004-4648-B442-DC5F9F11068C}.Debug|x64.Build.0 = Debug|x64 +		{345A953E-A004-4648-B442-DC5F9F11068C}.Release|Win32.ActiveCfg = Release|Win32 +		{345A953E-A004-4648-B442-DC5F9F11068C}.Release|Win32.Build.0 = Release|Win32 +		{345A953E-A004-4648-B442-DC5F9F11068C}.Release|x64.ActiveCfg = Release|x64 +		{345A953E-A004-4648-B442-DC5F9F11068C}.Release|x64.Build.0 = Release|x64 +		{9F316E83-5AE5-4939-A723-305A94F48005}.Debug|Win32.ActiveCfg = Debug|Win32 +		{9F316E83-5AE5-4939-A723-305A94F48005}.Debug|Win32.Build.0 = Debug|Win32 +		{9F316E83-5AE5-4939-A723-305A94F48005}.Debug|x64.ActiveCfg = Debug|x64 +		{9F316E83-5AE5-4939-A723-305A94F48005}.Debug|x64.Build.0 = Debug|x64 +		{9F316E83-5AE5-4939-A723-305A94F48005}.Release|Win32.ActiveCfg = Release|Win32 +		{9F316E83-5AE5-4939-A723-305A94F48005}.Release|Win32.Build.0 = Release|Win32 +		{9F316E83-5AE5-4939-A723-305A94F48005}.Release|x64.ActiveCfg = Release|x64 +		{9F316E83-5AE5-4939-A723-305A94F48005}.Release|x64.Build.0 = Release|x64 +		{B4CF9797-519D-4AFE-A8F4-5141A6B521D3}.Debug|Win32.ActiveCfg = Debug|Win32 +		{B4CF9797-519D-4AFE-A8F4-5141A6B521D3}.Debug|Win32.Build.0 = Debug|Win32 +		{B4CF9797-519D-4AFE-A8F4-5141A6B521D3}.Debug|x64.ActiveCfg = Debug|x64 +		{B4CF9797-519D-4AFE-A8F4-5141A6B521D3}.Debug|x64.Build.0 = Debug|x64 +		{B4CF9797-519D-4AFE-A8F4-5141A6B521D3}.Release|Win32.ActiveCfg = Release|Win32 +		{B4CF9797-519D-4AFE-A8F4-5141A6B521D3}.Release|Win32.Build.0 = Release|Win32 +		{B4CF9797-519D-4AFE-A8F4-5141A6B521D3}.Release|x64.ActiveCfg = Release|x64 +		{B4CF9797-519D-4AFE-A8F4-5141A6B521D3}.Release|x64.Build.0 = Release|x64 +		{9CDA7840-B7A5-496D-A527-E95571496D18}.Debug|Win32.ActiveCfg = Debug|Win32 +		{9CDA7840-B7A5-496D-A527-E95571496D18}.Debug|Win32.Build.0 = Debug|Win32 +		{9CDA7840-B7A5-496D-A527-E95571496D18}.Debug|x64.ActiveCfg = Debug|x64 +		{9CDA7840-B7A5-496D-A527-E95571496D18}.Debug|x64.Build.0 = Debug|x64 +		{9CDA7840-B7A5-496D-A527-E95571496D18}.Release|Win32.ActiveCfg = Release|Win32 +		{9CDA7840-B7A5-496D-A527-E95571496D18}.Release|Win32.Build.0 = Release|Win32 +		{9CDA7840-B7A5-496D-A527-E95571496D18}.Release|x64.ActiveCfg = Release|x64 +		{9CDA7840-B7A5-496D-A527-E95571496D18}.Release|x64.Build.0 = Release|x64 +		{4A1FB5EA-22F5-42A8-AB92-1D2DF5D47FB9}.Debug|Win32.ActiveCfg = Debug|Win32 +		{4A1FB5EA-22F5-42A8-AB92-1D2DF5D47FB9}.Debug|Win32.Build.0 = Debug|Win32 +		{4A1FB5EA-22F5-42A8-AB92-1D2DF5D47FB9}.Debug|x64.ActiveCfg = Debug|x64 +		{4A1FB5EA-22F5-42A8-AB92-1D2DF5D47FB9}.Debug|x64.Build.0 = Debug|x64 +		{4A1FB5EA-22F5-42A8-AB92-1D2DF5D47FB9}.Release|Win32.ActiveCfg = Release|Win32 +		{4A1FB5EA-22F5-42A8-AB92-1D2DF5D47FB9}.Release|Win32.Build.0 = Release|Win32 +		{4A1FB5EA-22F5-42A8-AB92-1D2DF5D47FB9}.Release|x64.ActiveCfg = Release|x64 +		{4A1FB5EA-22F5-42A8-AB92-1D2DF5D47FB9}.Release|x64.Build.0 = Release|x64 +		{57E2DF5A-6FC8-45BB-99DD-91A18C646E80}.Debug|Win32.ActiveCfg = Debug|Win32 +		{57E2DF5A-6FC8-45BB-99DD-91A18C646E80}.Debug|Win32.Build.0 = Debug|Win32 +		{57E2DF5A-6FC8-45BB-99DD-91A18C646E80}.Debug|x64.ActiveCfg = Debug|x64 +		{57E2DF5A-6FC8-45BB-99DD-91A18C646E80}.Debug|x64.Build.0 = Debug|x64 +		{57E2DF5A-6FC8-45BB-99DD-91A18C646E80}.Release|Win32.ActiveCfg = Release|Win32 +		{57E2DF5A-6FC8-45BB-99DD-91A18C646E80}.Release|Win32.Build.0 = Release|Win32 +		{57E2DF5A-6FC8-45BB-99DD-91A18C646E80}.Release|x64.ActiveCfg = Release|x64 +		{57E2DF5A-6FC8-45BB-99DD-91A18C646E80}.Release|x64.Build.0 = Release|x64 +		{9E1987E3-1F19-45CA-B9C9-D31E791836D8}.Debug|Win32.ActiveCfg = Debug|Win32 +		{9E1987E3-1F19-45CA-B9C9-D31E791836D8}.Debug|Win32.Build.0 = Debug|Win32 +		{9E1987E3-1F19-45CA-B9C9-D31E791836D8}.Debug|x64.ActiveCfg = Debug|x64 +		{9E1987E3-1F19-45CA-B9C9-D31E791836D8}.Debug|x64.Build.0 = Debug|x64 +		{9E1987E3-1F19-45CA-B9C9-D31E791836D8}.Release|Win32.ActiveCfg = Release|Win32 +		{9E1987E3-1F19-45CA-B9C9-D31E791836D8}.Release|Win32.Build.0 = Release|Win32 +		{9E1987E3-1F19-45CA-B9C9-D31E791836D8}.Release|x64.ActiveCfg = Release|x64 +		{9E1987E3-1F19-45CA-B9C9-D31E791836D8}.Release|x64.Build.0 = Release|x64 +		{2AE17FDE-F7F3-4CAC-ADAB-0710EDA4F741}.Debug|Win32.ActiveCfg = Debug|Win32 +		{2AE17FDE-F7F3-4CAC-ADAB-0710EDA4F741}.Debug|Win32.Build.0 = Debug|Win32 +		{2AE17FDE-F7F3-4CAC-ADAB-0710EDA4F741}.Debug|x64.ActiveCfg = Debug|x64 +		{2AE17FDE-F7F3-4CAC-ADAB-0710EDA4F741}.Debug|x64.Build.0 = Debug|x64 +		{2AE17FDE-F7F3-4CAC-ADAB-0710EDA4F741}.Release|Win32.ActiveCfg = Release|Win32 +		{2AE17FDE-F7F3-4CAC-ADAB-0710EDA4F741}.Release|Win32.Build.0 = Release|Win32 +		{2AE17FDE-F7F3-4CAC-ADAB-0710EDA4F741}.Release|x64.ActiveCfg = Release|x64 +		{2AE17FDE-F7F3-4CAC-ADAB-0710EDA4F741}.Release|x64.Build.0 = Release|x64 +		{BBAEB705-1669-40F3-8567-04CF6A991F4C}.Debug|Win32.ActiveCfg = Debug|Win32 +		{BBAEB705-1669-40F3-8567-04CF6A991F4C}.Debug|Win32.Build.0 = Debug|Win32 +		{BBAEB705-1669-40F3-8567-04CF6A991F4C}.Debug|x64.ActiveCfg = Debug|x64 +		{BBAEB705-1669-40F3-8567-04CF6A991F4C}.Debug|x64.Build.0 = Debug|x64 +		{BBAEB705-1669-40F3-8567-04CF6A991F4C}.Release|Win32.ActiveCfg = Release|Win32 +		{BBAEB705-1669-40F3-8567-04CF6A991F4C}.Release|Win32.Build.0 = Release|Win32 +		{BBAEB705-1669-40F3-8567-04CF6A991F4C}.Release|x64.ActiveCfg = Release|x64 +		{BBAEB705-1669-40F3-8567-04CF6A991F4C}.Release|x64.Build.0 = Release|x64 +		{BAE3D0B5-9695-4EB1-AD0F-75890EB4A3B3}.Debug|Win32.ActiveCfg = Debug|Win32 +		{BAE3D0B5-9695-4EB1-AD0F-75890EB4A3B3}.Debug|Win32.Build.0 = Debug|Win32 +		{BAE3D0B5-9695-4EB1-AD0F-75890EB4A3B3}.Debug|x64.ActiveCfg = Debug|x64 +		{BAE3D0B5-9695-4EB1-AD0F-75890EB4A3B3}.Debug|x64.Build.0 = Debug|x64 +		{BAE3D0B5-9695-4EB1-AD0F-75890EB4A3B3}.Release|Win32.ActiveCfg = Release|Win32 +		{BAE3D0B5-9695-4EB1-AD0F-75890EB4A3B3}.Release|Win32.Build.0 = Release|Win32 +		{BAE3D0B5-9695-4EB1-AD0F-75890EB4A3B3}.Release|x64.ActiveCfg = Release|x64 +		{BAE3D0B5-9695-4EB1-AD0F-75890EB4A3B3}.Release|x64.Build.0 = Release|x64 +		{C624E5FF-D4FE-4D35-9164-B8A91864F98E}.Debug|Win32.ActiveCfg = Debug|Win32 +		{C624E5FF-D4FE-4D35-9164-B8A91864F98E}.Debug|Win32.Build.0 = Debug|Win32 +		{C624E5FF-D4FE-4D35-9164-B8A91864F98E}.Debug|x64.ActiveCfg = Debug|x64 +		{C624E5FF-D4FE-4D35-9164-B8A91864F98E}.Debug|x64.Build.0 = Debug|x64 +		{C624E5FF-D4FE-4D35-9164-B8A91864F98E}.Release|Win32.ActiveCfg = Release|Win32 +		{C624E5FF-D4FE-4D35-9164-B8A91864F98E}.Release|Win32.Build.0 = Release|Win32 +		{C624E5FF-D4FE-4D35-9164-B8A91864F98E}.Release|x64.ActiveCfg = Release|x64 +		{C624E5FF-D4FE-4D35-9164-B8A91864F98E}.Release|x64.Build.0 = Release|x64 +		{0C0B2BEA-311F-473C-9652-87923EF639E3}.Debug|Win32.ActiveCfg = Debug|Win32 +		{0C0B2BEA-311F-473C-9652-87923EF639E3}.Debug|Win32.Build.0 = Debug|Win32 +		{0C0B2BEA-311F-473C-9652-87923EF639E3}.Debug|x64.ActiveCfg = Debug|x64 +		{0C0B2BEA-311F-473C-9652-87923EF639E3}.Debug|x64.Build.0 = Debug|x64 +		{0C0B2BEA-311F-473C-9652-87923EF639E3}.Release|Win32.ActiveCfg = Release|Win32 +		{0C0B2BEA-311F-473C-9652-87923EF639E3}.Release|Win32.Build.0 = Release|Win32 +		{0C0B2BEA-311F-473C-9652-87923EF639E3}.Release|x64.ActiveCfg = Release|x64 +		{0C0B2BEA-311F-473C-9652-87923EF639E3}.Release|x64.Build.0 = Release|x64 +	EndGlobalSection +	GlobalSection(SolutionProperties) = preSolution +		HideSolutionNode = FALSE +	EndGlobalSection +	GlobalSection(ExtensibilityGlobals) = postSolution +		SolutionGuid = {B1ACFD20-A0A9-4A4C-ADBA-E7608F0E2BEE} +	EndGlobalSection +EndGlobal diff --git a/lib/imgui-1.90.7/examples/libs/emscripten/emscripten_mainloop_stub.h b/lib/imgui-1.90.7/examples/libs/emscripten/emscripten_mainloop_stub.h new file mode 100644 index 0000000..05cf60f --- /dev/null +++ b/lib/imgui-1.90.7/examples/libs/emscripten/emscripten_mainloop_stub.h @@ -0,0 +1,37 @@ +// What does this file solves? +// - Since Dear ImGui 1.00 we took pride that most of our examples applications had their entire +//   main-loop inside the main() function. That's because: +//   - It makes the examples easier to read, keeping the code sequential. +//   - It permit the use of local variables, making it easier to try things and perform quick +//     changes when someone needs to quickly test something (vs having to structure the example +//     in order to pass data around). This is very important because people use those examples +//     to craft easy-to-past repro when they want to discuss features or report issues. +//   - It conveys at a glance that this is a no-BS framework, it won't take your main loop away from you. +//   - It is generally nice and elegant. +// - However, comes Emscripten... it is a wonderful and magical tech but it requires a "main loop" function. +// - Only some of our examples would run on Emscripten. Typically the ones rendering with GL or WGPU ones. +// - I tried to refactor those examples but felt it was problematic that other examples didn't follow the +//   same layout. Why would the SDL+GL example be structured one way and the SGL+DX11 be structured differently? +//   Especially as we are trying hard to convey that using a Dear ImGui backend in an *existing application* +//   should requires only a few dozens lines of code, and this should be consistent and symmetrical for all backends. +// - So the next logical step was to refactor all examples to follow that layout of using a "main loop" function. +//   This worked, but it made us lose all the nice things we had... + +// Since only about 3 examples really need to run with Emscripten, here's our solution: +// - Use some weird macros and capturing lambda to turn a loop in main() into a function. +// - Hide all that crap in this file so it doesn't make our examples unusually ugly. +//   As a stance and principle of Dear ImGui development we don't use C++ headers and we don't +//   want to suggest to the newcomer that we would ever use C++ headers as this would affect +//   the initial judgment of many of our target audience. +// - Technique is based on this idea: https://github.com/ocornut/imgui/pull/2492/ +#ifdef __EMSCRIPTEN__ +#include <emscripten.h> +#include <functional> +static std::function<void()>            MainLoopForEmscriptenP; +static void MainLoopForEmscripten()     { MainLoopForEmscriptenP(); } +#define EMSCRIPTEN_MAINLOOP_BEGIN       MainLoopForEmscriptenP = [&]() +#define EMSCRIPTEN_MAINLOOP_END         ; emscripten_set_main_loop(MainLoopForEmscripten, 0, true) +#else +#define EMSCRIPTEN_MAINLOOP_BEGIN +#define EMSCRIPTEN_MAINLOOP_END +#endif diff --git a/lib/imgui-1.90.7/examples/libs/emscripten/shell_minimal.html b/lib/imgui-1.90.7/examples/libs/emscripten/shell_minimal.html new file mode 100644 index 0000000..bcf6262 --- /dev/null +++ b/lib/imgui-1.90.7/examples/libs/emscripten/shell_minimal.html @@ -0,0 +1,65 @@ +<!doctype html> +<html lang="en-us"> +  <head> +    <meta charset="utf-8"> +    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no"/> +    <title>Dear ImGui Emscripten example</title> +    <style> +        body { margin: 0; background-color: black } +        /* FIXME: with our GLFW example this block seems to break resizing and io.DisplaySize gets stuck */ +        .emscripten { +            position: absolute; +            top: 0px; +            left: 0px; +            margin: 0px; +            border: 0; +            width: 100%; +            height: 100%; +            overflow: hidden; +            display: block; +            image-rendering: optimizeSpeed; +            image-rendering: -moz-crisp-edges; +            image-rendering: -o-crisp-edges; +            image-rendering: -webkit-optimize-contrast; +            image-rendering: optimize-contrast; +            image-rendering: crisp-edges; +            image-rendering: pixelated; +            -ms-interpolation-mode: nearest-neighbor; +        } +    </style> +  </head> +  <body> +    <canvas class="emscripten" id="canvas" oncontextmenu="event.preventDefault()"></canvas> +    <script type='text/javascript'> +      var Module = { +        preRun: [], +        postRun: [], +        print: (function() { +            return function(text) { +                text = Array.prototype.slice.call(arguments).join(' '); +                console.log(text); +            }; +        })(), +        printErr: function(text) { +            text = Array.prototype.slice.call(arguments).join(' '); +            console.error(text); +        }, +        canvas: (function() { +            var canvas = document.getElementById('canvas'); +            //canvas.addEventListener("webglcontextlost", function(e) { alert('FIXME: WebGL context lost, please reload the page'); e.preventDefault(); }, false); +            return canvas; +        })(), +        setStatus: function(text) { +            console.log("status: " + text); +        }, +        monitorRunDependencies: function(left) { +            // no run dependencies to log +        } +      }; +      window.onerror = function() { +        console.log("onerror: " + event); +      }; +    </script> +    {{{ SCRIPT }}} +  </body> +</html> diff --git a/lib/imgui-1.90.7/examples/libs/glfw/COPYING.txt b/lib/imgui-1.90.7/examples/libs/glfw/COPYING.txt new file mode 100644 index 0000000..b30c701 --- /dev/null +++ b/lib/imgui-1.90.7/examples/libs/glfw/COPYING.txt @@ -0,0 +1,22 @@ +Copyright (c) 2002-2006 Marcus Geelnard +Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org> + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any damages +arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not +   claim that you wrote the original software. If you use this software +   in a product, an acknowledgment in the product documentation would +   be appreciated but is not required. + +2. Altered source versions must be plainly marked as such, and must not +   be misrepresented as being the original software. + +3. This notice may not be removed or altered from any source +   distribution. + diff --git a/lib/imgui-1.90.7/examples/libs/glfw/include/GLFW/glfw3.h b/lib/imgui-1.90.7/examples/libs/glfw/include/GLFW/glfw3.h new file mode 100644 index 0000000..f8ca3d6 --- /dev/null +++ b/lib/imgui-1.90.7/examples/libs/glfw/include/GLFW/glfw3.h @@ -0,0 +1,4227 @@ +/************************************************************************* + * GLFW 3.2 - www.glfw.org + * A library for OpenGL, window and input + *------------------------------------------------------------------------ + * Copyright (c) 2002-2006 Marcus Geelnard + * Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org> + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + *    claim that you wrote the original software. If you use this software + *    in a product, an acknowledgment in the product documentation would + *    be appreciated but is not required. + * + * 2. Altered source versions must be plainly marked as such, and must not + *    be misrepresented as being the original software. + * + * 3. This notice may not be removed or altered from any source + *    distribution. + * + *************************************************************************/ + +#ifndef _glfw3_h_ +#define _glfw3_h_ + +#ifdef __cplusplus +extern "C" { +#endif + + +/************************************************************************* + * Doxygen documentation + *************************************************************************/ + +/*! @file glfw3.h + *  @brief The header of the GLFW 3 API. + * + *  This is the header file of the GLFW 3 API.  It defines all its types and + *  declares all its functions. + * + *  For more information about how to use this file, see @ref build_include. + */ +/*! @defgroup context Context reference + * + *  This is the reference documentation for OpenGL and OpenGL ES context related + *  functions.  For more task-oriented information, see the @ref context_guide. + */ +/*! @defgroup vulkan Vulkan reference + * + *  This is the reference documentation for Vulkan related functions and types. + *  For more task-oriented information, see the @ref vulkan_guide. + */ +/*! @defgroup init Initialization, version and error reference + * + *  This is the reference documentation for initialization and termination of + *  the library, version management and error handling.  For more task-oriented + *  information, see the @ref intro_guide. + */ +/*! @defgroup input Input reference + * + *  This is the reference documentation for input related functions and types. + *  For more task-oriented information, see the @ref input_guide. + */ +/*! @defgroup monitor Monitor reference + * + *  This is the reference documentation for monitor related functions and types. + *  For more task-oriented information, see the @ref monitor_guide. + */ +/*! @defgroup window Window reference + * + *  This is the reference documentation for window related functions and types, + *  including creation, deletion and event polling.  For more task-oriented + *  information, see the @ref window_guide. + */ + + +/************************************************************************* + * Compiler- and platform-specific preprocessor work + *************************************************************************/ + +/* If we are we on Windows, we want a single define for it. + */ +#if !defined(_WIN32) && (defined(__WIN32__) || defined(WIN32) || defined(__MINGW32__)) + #define _WIN32 +#endif /* _WIN32 */ + +/* It is customary to use APIENTRY for OpenGL function pointer declarations on + * all platforms.  Additionally, the Windows OpenGL header needs APIENTRY. + */ +#ifndef APIENTRY + #ifdef _WIN32 +  #define APIENTRY __stdcall + #else +  #define APIENTRY + #endif +#endif /* APIENTRY */ + +/* Some Windows OpenGL headers need this. + */ +#if !defined(WINGDIAPI) && defined(_WIN32) + #define WINGDIAPI __declspec(dllimport) + #define GLFW_WINGDIAPI_DEFINED +#endif /* WINGDIAPI */ + +/* Some Windows GLU headers need this. + */ +#if !defined(CALLBACK) && defined(_WIN32) + #define CALLBACK __stdcall + #define GLFW_CALLBACK_DEFINED +#endif /* CALLBACK */ + +/* Most Windows GLU headers need wchar_t. + * The OS X OpenGL header blocks the definition of ptrdiff_t by glext.h. + * Include it unconditionally to avoid surprising side-effects. + */ +#include <stddef.h> +#include <stdint.h> + +/* Include the chosen client API headers. + */ +#if defined(__APPLE__) + #if defined(GLFW_INCLUDE_GLCOREARB) +  #include <OpenGL/gl3.h> +  #if defined(GLFW_INCLUDE_GLEXT) +   #include <OpenGL/gl3ext.h> +  #endif + #elif !defined(GLFW_INCLUDE_NONE) +  #if !defined(GLFW_INCLUDE_GLEXT) +   #define GL_GLEXT_LEGACY +  #endif +  #include <OpenGL/gl.h> + #endif + #if defined(GLFW_INCLUDE_GLU) +  #include <OpenGL/glu.h> + #endif +#else + #if defined(GLFW_INCLUDE_GLCOREARB) +  #include <GL/glcorearb.h> + #elif defined(GLFW_INCLUDE_ES1) +  #include <GLES/gl.h> +  #if defined(GLFW_INCLUDE_GLEXT) +   #include <GLES/glext.h> +  #endif + #elif defined(GLFW_INCLUDE_ES2) +  #include <GLES2/gl2.h> +  #if defined(GLFW_INCLUDE_GLEXT) +   #include <GLES2/gl2ext.h> +  #endif + #elif defined(GLFW_INCLUDE_ES3) +  #include <GLES3/gl3.h> +  #if defined(GLFW_INCLUDE_GLEXT) +   #include <GLES2/gl2ext.h> +  #endif + #elif defined(GLFW_INCLUDE_ES31) +  #include <GLES3/gl31.h> +  #if defined(GLFW_INCLUDE_GLEXT) +   #include <GLES2/gl2ext.h> +  #endif + #elif defined(GLFW_INCLUDE_VULKAN) +  #include <vulkan/vulkan.h> + #elif !defined(GLFW_INCLUDE_NONE) +  #include <GL/gl.h> +  #if defined(GLFW_INCLUDE_GLEXT) +   #include <GL/glext.h> +  #endif + #endif + #if defined(GLFW_INCLUDE_GLU) +  #include <GL/glu.h> + #endif +#endif + +#if defined(GLFW_DLL) && defined(_GLFW_BUILD_DLL) + /* GLFW_DLL must be defined by applications that are linking against the DLL +  * version of the GLFW library.  _GLFW_BUILD_DLL is defined by the GLFW +  * configuration header when compiling the DLL version of the library. +  */ + #error "You must not have both GLFW_DLL and _GLFW_BUILD_DLL defined" +#endif + +/* GLFWAPI is used to declare public API functions for export + * from the DLL / shared library / dynamic library. + */ +#if defined(_WIN32) && defined(_GLFW_BUILD_DLL) + /* We are building GLFW as a Win32 DLL */ + #define GLFWAPI __declspec(dllexport) +#elif defined(_WIN32) && defined(GLFW_DLL) + /* We are calling GLFW as a Win32 DLL */ + #define GLFWAPI __declspec(dllimport) +#elif defined(__GNUC__) && defined(_GLFW_BUILD_DLL) + /* We are building GLFW as a shared / dynamic library */ + #define GLFWAPI __attribute__((visibility("default"))) +#else + /* We are building or calling GLFW as a static library */ + #define GLFWAPI +#endif + + +/************************************************************************* + * GLFW API tokens + *************************************************************************/ + +/*! @name GLFW version macros + *  @{ */ +/*! @brief The major version number of the GLFW library. + * + *  This is incremented when the API is changed in non-compatible ways. + *  @ingroup init + */ +#define GLFW_VERSION_MAJOR          3 +/*! @brief The minor version number of the GLFW library. + * + *  This is incremented when features are added to the API but it remains + *  backward-compatible. + *  @ingroup init + */ +#define GLFW_VERSION_MINOR          2 +/*! @brief The revision number of the GLFW library. + * + *  This is incremented when a bug fix release is made that does not contain any + *  API changes. + *  @ingroup init + */ +#define GLFW_VERSION_REVISION       0 +/*! @} */ + +/*! @name Boolean values + *  @{ */ +/*! @brief One. + * + *  One.  Seriously.  You don't _need_ to use this symbol in your code.  It's + *  just semantic sugar for the number 1.  You can use `1` or `true` or `_True` + *  or `GL_TRUE` or whatever you want. + */ +#define GLFW_TRUE                   1 +/*! @brief Zero. + * + *  Zero.  Seriously.  You don't _need_ to use this symbol in your code.  It's + *  just just semantic sugar for the number 0.  You can use `0` or `false` or + *  `_False` or `GL_FALSE` or whatever you want. + */ +#define GLFW_FALSE                  0 +/*! @} */ + +/*! @name Key and button actions + *  @{ */ +/*! @brief The key or mouse button was released. + * + *  The key or mouse button was released. + * + *  @ingroup input + */ +#define GLFW_RELEASE                0 +/*! @brief The key or mouse button was pressed. + * + *  The key or mouse button was pressed. + * + *  @ingroup input + */ +#define GLFW_PRESS                  1 +/*! @brief The key was held down until it repeated. + * + *  The key was held down until it repeated. + * + *  @ingroup input + */ +#define GLFW_REPEAT                 2 +/*! @} */ + +/*! @defgroup keys Keyboard keys + * + *  See [key input](@ref input_key) for how these are used. + * + *  These key codes are inspired by the _USB HID Usage Tables v1.12_ (p. 53-60), + *  but re-arranged to map to 7-bit ASCII for printable keys (function keys are + *  put in the 256+ range). + * + *  The naming of the key codes follow these rules: + *   - The US keyboard layout is used + *   - Names of printable alpha-numeric characters are used (e.g. "A", "R", + *     "3", etc.) + *   - For non-alphanumeric characters, Unicode:ish names are used (e.g. + *     "COMMA", "LEFT_SQUARE_BRACKET", etc.). Note that some names do not + *     correspond to the Unicode standard (usually for brevity) + *   - Keys that lack a clear US mapping are named "WORLD_x" + *   - For non-printable keys, custom names are used (e.g. "F4", + *     "BACKSPACE", etc.) + * + *  @ingroup input + *  @{ + */ + +/* The unknown key */ +#define GLFW_KEY_UNKNOWN            -1 + +/* Printable keys */ +#define GLFW_KEY_SPACE              32 +#define GLFW_KEY_APOSTROPHE         39  /* ' */ +#define GLFW_KEY_COMMA              44  /* , */ +#define GLFW_KEY_MINUS              45  /* - */ +#define GLFW_KEY_PERIOD             46  /* . */ +#define GLFW_KEY_SLASH              47  /* / */ +#define GLFW_KEY_0                  48 +#define GLFW_KEY_1                  49 +#define GLFW_KEY_2                  50 +#define GLFW_KEY_3                  51 +#define GLFW_KEY_4                  52 +#define GLFW_KEY_5                  53 +#define GLFW_KEY_6                  54 +#define GLFW_KEY_7                  55 +#define GLFW_KEY_8                  56 +#define GLFW_KEY_9                  57 +#define GLFW_KEY_SEMICOLON          59  /* ; */ +#define GLFW_KEY_EQUAL              61  /* = */ +#define GLFW_KEY_A                  65 +#define GLFW_KEY_B                  66 +#define GLFW_KEY_C                  67 +#define GLFW_KEY_D                  68 +#define GLFW_KEY_E                  69 +#define GLFW_KEY_F                  70 +#define GLFW_KEY_G                  71 +#define GLFW_KEY_H                  72 +#define GLFW_KEY_I                  73 +#define GLFW_KEY_J                  74 +#define GLFW_KEY_K                  75 +#define GLFW_KEY_L                  76 +#define GLFW_KEY_M                  77 +#define GLFW_KEY_N                  78 +#define GLFW_KEY_O                  79 +#define GLFW_KEY_P                  80 +#define GLFW_KEY_Q                  81 +#define GLFW_KEY_R                  82 +#define GLFW_KEY_S                  83 +#define GLFW_KEY_T                  84 +#define GLFW_KEY_U                  85 +#define GLFW_KEY_V                  86 +#define GLFW_KEY_W                  87 +#define GLFW_KEY_X                  88 +#define GLFW_KEY_Y                  89 +#define GLFW_KEY_Z                  90 +#define GLFW_KEY_LEFT_BRACKET       91  /* [ */ +#define GLFW_KEY_BACKSLASH          92  /* \ */ +#define GLFW_KEY_RIGHT_BRACKET      93  /* ] */ +#define GLFW_KEY_GRAVE_ACCENT       96  /* ` */ +#define GLFW_KEY_WORLD_1            161 /* non-US #1 */ +#define GLFW_KEY_WORLD_2            162 /* non-US #2 */ + +/* Function keys */ +#define GLFW_KEY_ESCAPE             256 +#define GLFW_KEY_ENTER              257 +#define GLFW_KEY_TAB                258 +#define GLFW_KEY_BACKSPACE          259 +#define GLFW_KEY_INSERT             260 +#define GLFW_KEY_DELETE             261 +#define GLFW_KEY_RIGHT              262 +#define GLFW_KEY_LEFT               263 +#define GLFW_KEY_DOWN               264 +#define GLFW_KEY_UP                 265 +#define GLFW_KEY_PAGE_UP            266 +#define GLFW_KEY_PAGE_DOWN          267 +#define GLFW_KEY_HOME               268 +#define GLFW_KEY_END                269 +#define GLFW_KEY_CAPS_LOCK          280 +#define GLFW_KEY_SCROLL_LOCK        281 +#define GLFW_KEY_NUM_LOCK           282 +#define GLFW_KEY_PRINT_SCREEN       283 +#define GLFW_KEY_PAUSE              284 +#define GLFW_KEY_F1                 290 +#define GLFW_KEY_F2                 291 +#define GLFW_KEY_F3                 292 +#define GLFW_KEY_F4                 293 +#define GLFW_KEY_F5                 294 +#define GLFW_KEY_F6                 295 +#define GLFW_KEY_F7                 296 +#define GLFW_KEY_F8                 297 +#define GLFW_KEY_F9                 298 +#define GLFW_KEY_F10                299 +#define GLFW_KEY_F11                300 +#define GLFW_KEY_F12                301 +#define GLFW_KEY_F13                302 +#define GLFW_KEY_F14                303 +#define GLFW_KEY_F15                304 +#define GLFW_KEY_F16                305 +#define GLFW_KEY_F17                306 +#define GLFW_KEY_F18                307 +#define GLFW_KEY_F19                308 +#define GLFW_KEY_F20                309 +#define GLFW_KEY_F21                310 +#define GLFW_KEY_F22                311 +#define GLFW_KEY_F23                312 +#define GLFW_KEY_F24                313 +#define GLFW_KEY_F25                314 +#define GLFW_KEY_KP_0               320 +#define GLFW_KEY_KP_1               321 +#define GLFW_KEY_KP_2               322 +#define GLFW_KEY_KP_3               323 +#define GLFW_KEY_KP_4               324 +#define GLFW_KEY_KP_5               325 +#define GLFW_KEY_KP_6               326 +#define GLFW_KEY_KP_7               327 +#define GLFW_KEY_KP_8               328 +#define GLFW_KEY_KP_9               329 +#define GLFW_KEY_KP_DECIMAL         330 +#define GLFW_KEY_KP_DIVIDE          331 +#define GLFW_KEY_KP_MULTIPLY        332 +#define GLFW_KEY_KP_SUBTRACT        333 +#define GLFW_KEY_KP_ADD             334 +#define GLFW_KEY_KP_ENTER           335 +#define GLFW_KEY_KP_EQUAL           336 +#define GLFW_KEY_LEFT_SHIFT         340 +#define GLFW_KEY_LEFT_CONTROL       341 +#define GLFW_KEY_LEFT_ALT           342 +#define GLFW_KEY_LEFT_SUPER         343 +#define GLFW_KEY_RIGHT_SHIFT        344 +#define GLFW_KEY_RIGHT_CONTROL      345 +#define GLFW_KEY_RIGHT_ALT          346 +#define GLFW_KEY_RIGHT_SUPER        347 +#define GLFW_KEY_MENU               348 + +#define GLFW_KEY_LAST               GLFW_KEY_MENU + +/*! @} */ + +/*! @defgroup mods Modifier key flags + * + *  See [key input](@ref input_key) for how these are used. + * + *  @ingroup input + *  @{ */ + +/*! @brief If this bit is set one or more Shift keys were held down. + */ +#define GLFW_MOD_SHIFT           0x0001 +/*! @brief If this bit is set one or more Control keys were held down. + */ +#define GLFW_MOD_CONTROL         0x0002 +/*! @brief If this bit is set one or more Alt keys were held down. + */ +#define GLFW_MOD_ALT             0x0004 +/*! @brief If this bit is set one or more Super keys were held down. + */ +#define GLFW_MOD_SUPER           0x0008 + +/*! @} */ + +/*! @defgroup buttons Mouse buttons + * + *  See [mouse button input](@ref input_mouse_button) for how these are used. + * + *  @ingroup input + *  @{ */ +#define GLFW_MOUSE_BUTTON_1         0 +#define GLFW_MOUSE_BUTTON_2         1 +#define GLFW_MOUSE_BUTTON_3         2 +#define GLFW_MOUSE_BUTTON_4         3 +#define GLFW_MOUSE_BUTTON_5         4 +#define GLFW_MOUSE_BUTTON_6         5 +#define GLFW_MOUSE_BUTTON_7         6 +#define GLFW_MOUSE_BUTTON_8         7 +#define GLFW_MOUSE_BUTTON_LAST      GLFW_MOUSE_BUTTON_8 +#define GLFW_MOUSE_BUTTON_LEFT      GLFW_MOUSE_BUTTON_1 +#define GLFW_MOUSE_BUTTON_RIGHT     GLFW_MOUSE_BUTTON_2 +#define GLFW_MOUSE_BUTTON_MIDDLE    GLFW_MOUSE_BUTTON_3 +/*! @} */ + +/*! @defgroup joysticks Joysticks + * + *  See [joystick input](@ref joystick) for how these are used. + * + *  @ingroup input + *  @{ */ +#define GLFW_JOYSTICK_1             0 +#define GLFW_JOYSTICK_2             1 +#define GLFW_JOYSTICK_3             2 +#define GLFW_JOYSTICK_4             3 +#define GLFW_JOYSTICK_5             4 +#define GLFW_JOYSTICK_6             5 +#define GLFW_JOYSTICK_7             6 +#define GLFW_JOYSTICK_8             7 +#define GLFW_JOYSTICK_9             8 +#define GLFW_JOYSTICK_10            9 +#define GLFW_JOYSTICK_11            10 +#define GLFW_JOYSTICK_12            11 +#define GLFW_JOYSTICK_13            12 +#define GLFW_JOYSTICK_14            13 +#define GLFW_JOYSTICK_15            14 +#define GLFW_JOYSTICK_16            15 +#define GLFW_JOYSTICK_LAST          GLFW_JOYSTICK_16 +/*! @} */ + +/*! @defgroup errors Error codes + * + *  See [error handling](@ref error_handling) for how these are used. + * + *  @ingroup init + *  @{ */ +/*! @brief GLFW has not been initialized. + * + *  This occurs if a GLFW function was called that must not be called unless the + *  library is [initialized](@ref intro_init). + * + *  @analysis Application programmer error.  Initialize GLFW before calling any + *  function that requires initialization. + */ +#define GLFW_NOT_INITIALIZED        0x00010001 +/*! @brief No context is current for this thread. + * + *  This occurs if a GLFW function was called that needs and operates on the + *  current OpenGL or OpenGL ES context but no context is current on the calling + *  thread.  One such function is @ref glfwSwapInterval. + * + *  @analysis Application programmer error.  Ensure a context is current before + *  calling functions that require a current context. + */ +#define GLFW_NO_CURRENT_CONTEXT     0x00010002 +/*! @brief One of the arguments to the function was an invalid enum value. + * + *  One of the arguments to the function was an invalid enum value, for example + *  requesting [GLFW_RED_BITS](@ref window_hints_fb) with @ref + *  glfwGetWindowAttrib. + * + *  @analysis Application programmer error.  Fix the offending call. + */ +#define GLFW_INVALID_ENUM           0x00010003 +/*! @brief One of the arguments to the function was an invalid value. + * + *  One of the arguments to the function was an invalid value, for example + *  requesting a non-existent OpenGL or OpenGL ES version like 2.7. + * + *  Requesting a valid but unavailable OpenGL or OpenGL ES version will instead + *  result in a @ref GLFW_VERSION_UNAVAILABLE error. + * + *  @analysis Application programmer error.  Fix the offending call. + */ +#define GLFW_INVALID_VALUE          0x00010004 +/*! @brief A memory allocation failed. + * + *  A memory allocation failed. + * + *  @analysis A bug in GLFW or the underlying operating system.  Report the bug + *  to our [issue tracker](https://github.com/glfw/glfw/issues). + */ +#define GLFW_OUT_OF_MEMORY          0x00010005 +/*! @brief GLFW could not find support for the requested API on the system. + * + *  GLFW could not find support for the requested API on the system. + * + *  @analysis The installed graphics driver does not support the requested + *  API, or does not support it via the chosen context creation backend. + *  Below are a few examples. + * + *  @par + *  Some pre-installed Windows graphics drivers do not support OpenGL.  AMD only + *  supports OpenGL ES via EGL, while Nvidia and Intel only support it via + *  a WGL or GLX extension.  OS X does not provide OpenGL ES at all.  The Mesa + *  EGL, OpenGL and OpenGL ES libraries do not interface with the Nvidia binary + *  driver.  Older graphics drivers do not support Vulkan. + */ +#define GLFW_API_UNAVAILABLE        0x00010006 +/*! @brief The requested OpenGL or OpenGL ES version is not available. + * + *  The requested OpenGL or OpenGL ES version (including any requested context + *  or framebuffer hints) is not available on this machine. + * + *  @analysis The machine does not support your requirements.  If your + *  application is sufficiently flexible, downgrade your requirements and try + *  again.  Otherwise, inform the user that their machine does not match your + *  requirements. + * + *  @par + *  Future invalid OpenGL and OpenGL ES versions, for example OpenGL 4.8 if 5.0 + *  comes out before the 4.x series gets that far, also fail with this error and + *  not @ref GLFW_INVALID_VALUE, because GLFW cannot know what future versions + *  will exist. + */ +#define GLFW_VERSION_UNAVAILABLE    0x00010007 +/*! @brief A platform-specific error occurred that does not match any of the + *  more specific categories. + * + *  A platform-specific error occurred that does not match any of the more + *  specific categories. + * + *  @analysis A bug or configuration error in GLFW, the underlying operating + *  system or its drivers, or a lack of required resources.  Report the issue to + *  our [issue tracker](https://github.com/glfw/glfw/issues). + */ +#define GLFW_PLATFORM_ERROR         0x00010008 +/*! @brief The requested format is not supported or available. + * + *  If emitted during window creation, the requested pixel format is not + *  supported. + * + *  If emitted when querying the clipboard, the contents of the clipboard could + *  not be converted to the requested format. + * + *  @analysis If emitted during window creation, one or more + *  [hard constraints](@ref window_hints_hard) did not match any of the + *  available pixel formats.  If your application is sufficiently flexible, + *  downgrade your requirements and try again.  Otherwise, inform the user that + *  their machine does not match your requirements. + * + *  @par + *  If emitted when querying the clipboard, ignore the error or report it to + *  the user, as appropriate. + */ +#define GLFW_FORMAT_UNAVAILABLE     0x00010009 +/*! @brief The specified window does not have an OpenGL or OpenGL ES context. + * + *  A window that does not have an OpenGL or OpenGL ES context was passed to + *  a function that requires it to have one. + * + *  @analysis Application programmer error.  Fix the offending call. + */ +#define GLFW_NO_WINDOW_CONTEXT      0x0001000A +/*! @} */ + +#define GLFW_FOCUSED                0x00020001 +#define GLFW_ICONIFIED              0x00020002 +#define GLFW_RESIZABLE              0x00020003 +#define GLFW_VISIBLE                0x00020004 +#define GLFW_DECORATED              0x00020005 +#define GLFW_AUTO_ICONIFY           0x00020006 +#define GLFW_FLOATING               0x00020007 +#define GLFW_MAXIMIZED              0x00020008 + +#define GLFW_RED_BITS               0x00021001 +#define GLFW_GREEN_BITS             0x00021002 +#define GLFW_BLUE_BITS              0x00021003 +#define GLFW_ALPHA_BITS             0x00021004 +#define GLFW_DEPTH_BITS             0x00021005 +#define GLFW_STENCIL_BITS           0x00021006 +#define GLFW_ACCUM_RED_BITS         0x00021007 +#define GLFW_ACCUM_GREEN_BITS       0x00021008 +#define GLFW_ACCUM_BLUE_BITS        0x00021009 +#define GLFW_ACCUM_ALPHA_BITS       0x0002100A +#define GLFW_AUX_BUFFERS            0x0002100B +#define GLFW_STEREO                 0x0002100C +#define GLFW_SAMPLES                0x0002100D +#define GLFW_SRGB_CAPABLE           0x0002100E +#define GLFW_REFRESH_RATE           0x0002100F +#define GLFW_DOUBLEBUFFER           0x00021010 + +#define GLFW_CLIENT_API             0x00022001 +#define GLFW_CONTEXT_VERSION_MAJOR  0x00022002 +#define GLFW_CONTEXT_VERSION_MINOR  0x00022003 +#define GLFW_CONTEXT_REVISION       0x00022004 +#define GLFW_CONTEXT_ROBUSTNESS     0x00022005 +#define GLFW_OPENGL_FORWARD_COMPAT  0x00022006 +#define GLFW_OPENGL_DEBUG_CONTEXT   0x00022007 +#define GLFW_OPENGL_PROFILE         0x00022008 +#define GLFW_CONTEXT_RELEASE_BEHAVIOR 0x00022009 +#define GLFW_CONTEXT_NO_ERROR       0x0002200A + +#define GLFW_NO_API                          0 +#define GLFW_OPENGL_API             0x00030001 +#define GLFW_OPENGL_ES_API          0x00030002 + +#define GLFW_NO_ROBUSTNESS                   0 +#define GLFW_NO_RESET_NOTIFICATION  0x00031001 +#define GLFW_LOSE_CONTEXT_ON_RESET  0x00031002 + +#define GLFW_OPENGL_ANY_PROFILE              0 +#define GLFW_OPENGL_CORE_PROFILE    0x00032001 +#define GLFW_OPENGL_COMPAT_PROFILE  0x00032002 + +#define GLFW_CURSOR                 0x00033001 +#define GLFW_STICKY_KEYS            0x00033002 +#define GLFW_STICKY_MOUSE_BUTTONS   0x00033003 + +#define GLFW_CURSOR_NORMAL          0x00034001 +#define GLFW_CURSOR_HIDDEN          0x00034002 +#define GLFW_CURSOR_DISABLED        0x00034003 + +#define GLFW_ANY_RELEASE_BEHAVIOR            0 +#define GLFW_RELEASE_BEHAVIOR_FLUSH 0x00035001 +#define GLFW_RELEASE_BEHAVIOR_NONE  0x00035002 + +/*! @defgroup shapes Standard cursor shapes + * + *  See [standard cursor creation](@ref cursor_standard) for how these are used. + * + *  @ingroup input + *  @{ */ + +/*! @brief The regular arrow cursor shape. + * + *  The regular arrow cursor. + */ +#define GLFW_ARROW_CURSOR           0x00036001 +/*! @brief The text input I-beam cursor shape. + * + *  The text input I-beam cursor shape. + */ +#define GLFW_IBEAM_CURSOR           0x00036002 +/*! @brief The crosshair shape. + * + *  The crosshair shape. + */ +#define GLFW_CROSSHAIR_CURSOR       0x00036003 +/*! @brief The hand shape. + * + *  The hand shape. + */ +#define GLFW_HAND_CURSOR            0x00036004 +/*! @brief The horizontal resize arrow shape. + * + *  The horizontal resize arrow shape. + */ +#define GLFW_HRESIZE_CURSOR         0x00036005 +/*! @brief The vertical resize arrow shape. + * + *  The vertical resize arrow shape. + */ +#define GLFW_VRESIZE_CURSOR         0x00036006 +/*! @} */ + +#define GLFW_CONNECTED              0x00040001 +#define GLFW_DISCONNECTED           0x00040002 + +#define GLFW_DONT_CARE              -1 + + +/************************************************************************* + * GLFW API types + *************************************************************************/ + +/*! @brief Client API function pointer type. + * + *  Generic function pointer used for returning client API function pointers + *  without forcing a cast from a regular pointer. + * + *  @sa @ref context_glext + *  @sa glfwGetProcAddress + * + *  @since Added in version 3.0. +  + *  @ingroup context + */ +typedef void (*GLFWglproc)(void); + +/*! @brief Vulkan API function pointer type. + * + *  Generic function pointer used for returning Vulkan API function pointers + *  without forcing a cast from a regular pointer. + * + *  @sa @ref vulkan_proc + *  @sa glfwGetInstanceProcAddress + * + *  @since Added in version 3.2. + * + *  @ingroup vulkan + */ +typedef void (*GLFWvkproc)(void); + +/*! @brief Opaque monitor object. + * + *  Opaque monitor object. + * + *  @see @ref monitor_object + * + *  @since Added in version 3.0. + * + *  @ingroup monitor + */ +typedef struct GLFWmonitor GLFWmonitor; + +/*! @brief Opaque window object. + * + *  Opaque window object. + * + *  @see @ref window_object + * + *  @since Added in version 3.0. + * + *  @ingroup window + */ +typedef struct GLFWwindow GLFWwindow; + +/*! @brief Opaque cursor object. + * + *  Opaque cursor object. + * + *  @see @ref cursor_object + * + *  @since Added in version 3.1. + * + *  @ingroup cursor + */ +typedef struct GLFWcursor GLFWcursor; + +/*! @brief The function signature for error callbacks. + * + *  This is the function signature for error callback functions. + * + *  @param[in] error An [error code](@ref errors). + *  @param[in] description A UTF-8 encoded string describing the error. + * + *  @sa @ref error_handling + *  @sa glfwSetErrorCallback + * + *  @since Added in version 3.0. + * + *  @ingroup init + */ +typedef void (* GLFWerrorfun)(int,const char*); + +/*! @brief The function signature for window position callbacks. + * + *  This is the function signature for window position callback functions. + * + *  @param[in] window The window that was moved. + *  @param[in] xpos The new x-coordinate, in screen coordinates, of the + *  upper-left corner of the client area of the window. + *  @param[in] ypos The new y-coordinate, in screen coordinates, of the + *  upper-left corner of the client area of the window. + * + *  @sa @ref window_pos + *  @sa glfwSetWindowPosCallback + * + *  @since Added in version 3.0. + * + *  @ingroup window + */ +typedef void (* GLFWwindowposfun)(GLFWwindow*,int,int); + +/*! @brief The function signature for window resize callbacks. + * + *  This is the function signature for window size callback functions. + * + *  @param[in] window The window that was resized. + *  @param[in] width The new width, in screen coordinates, of the window. + *  @param[in] height The new height, in screen coordinates, of the window. + * + *  @sa @ref window_size + *  @sa glfwSetWindowSizeCallback + * + *  @since Added in version 1.0. + *  @glfw3 Added window handle parameter. + * + *  @ingroup window + */ +typedef void (* GLFWwindowsizefun)(GLFWwindow*,int,int); + +/*! @brief The function signature for window close callbacks. + * + *  This is the function signature for window close callback functions. + * + *  @param[in] window The window that the user attempted to close. + * + *  @sa @ref window_close + *  @sa glfwSetWindowCloseCallback + * + *  @since Added in version 2.5. + *  @glfw3 Added window handle parameter. + * + *  @ingroup window + */ +typedef void (* GLFWwindowclosefun)(GLFWwindow*); + +/*! @brief The function signature for window content refresh callbacks. + * + *  This is the function signature for window refresh callback functions. + * + *  @param[in] window The window whose content needs to be refreshed. + * + *  @sa @ref window_refresh + *  @sa glfwSetWindowRefreshCallback + * + *  @since Added in version 2.5. + *  @glfw3 Added window handle parameter. + * + *  @ingroup window + */ +typedef void (* GLFWwindowrefreshfun)(GLFWwindow*); + +/*! @brief The function signature for window focus/defocus callbacks. + * + *  This is the function signature for window focus callback functions. + * + *  @param[in] window The window that gained or lost input focus. + *  @param[in] focused `GLFW_TRUE` if the window was given input focus, or + *  `GLFW_FALSE` if it lost it. + * + *  @sa @ref window_focus + *  @sa glfwSetWindowFocusCallback + * + *  @since Added in version 3.0. + * + *  @ingroup window + */ +typedef void (* GLFWwindowfocusfun)(GLFWwindow*,int); + +/*! @brief The function signature for window iconify/restore callbacks. + * + *  This is the function signature for window iconify/restore callback + *  functions. + * + *  @param[in] window The window that was iconified or restored. + *  @param[in] iconified `GLFW_TRUE` if the window was iconified, or + *  `GLFW_FALSE` if it was restored. + * + *  @sa @ref window_iconify + *  @sa glfwSetWindowIconifyCallback + * + *  @since Added in version 3.0. + * + *  @ingroup window + */ +typedef void (* GLFWwindowiconifyfun)(GLFWwindow*,int); + +/*! @brief The function signature for framebuffer resize callbacks. + * + *  This is the function signature for framebuffer resize callback + *  functions. + * + *  @param[in] window The window whose framebuffer was resized. + *  @param[in] width The new width, in pixels, of the framebuffer. + *  @param[in] height The new height, in pixels, of the framebuffer. + * + *  @sa @ref window_fbsize + *  @sa glfwSetFramebufferSizeCallback + * + *  @since Added in version 3.0. + * + *  @ingroup window + */ +typedef void (* GLFWframebuffersizefun)(GLFWwindow*,int,int); + +/*! @brief The function signature for mouse button callbacks. + * + *  This is the function signature for mouse button callback functions. + * + *  @param[in] window The window that received the event. + *  @param[in] button The [mouse button](@ref buttons) that was pressed or + *  released. + *  @param[in] action One of `GLFW_PRESS` or `GLFW_RELEASE`. + *  @param[in] mods Bit field describing which [modifier keys](@ref mods) were + *  held down. + * + *  @sa @ref input_mouse_button + *  @sa glfwSetMouseButtonCallback + * + *  @since Added in version 1.0. + *  @glfw3 Added window handle and modifier mask parameters. + * + *  @ingroup input + */ +typedef void (* GLFWmousebuttonfun)(GLFWwindow*,int,int,int); + +/*! @brief The function signature for cursor position callbacks. + * + *  This is the function signature for cursor position callback functions. + * + *  @param[in] window The window that received the event. + *  @param[in] xpos The new cursor x-coordinate, relative to the left edge of + *  the client area. + *  @param[in] ypos The new cursor y-coordinate, relative to the top edge of the + *  client area. + * + *  @sa @ref cursor_pos + *  @sa glfwSetCursorPosCallback + * + *  @since Added in version 3.0.  Replaces `GLFWmouseposfun`. + * + *  @ingroup input + */ +typedef void (* GLFWcursorposfun)(GLFWwindow*,double,double); + +/*! @brief The function signature for cursor enter/leave callbacks. + * + *  This is the function signature for cursor enter/leave callback functions. + * + *  @param[in] window The window that received the event. + *  @param[in] entered `GLFW_TRUE` if the cursor entered the window's client + *  area, or `GLFW_FALSE` if it left it. + * + *  @sa @ref cursor_enter + *  @sa glfwSetCursorEnterCallback + * + *  @since Added in version 3.0. + * + *  @ingroup input + */ +typedef void (* GLFWcursorenterfun)(GLFWwindow*,int); + +/*! @brief The function signature for scroll callbacks. + * + *  This is the function signature for scroll callback functions. + * + *  @param[in] window The window that received the event. + *  @param[in] xoffset The scroll offset along the x-axis. + *  @param[in] yoffset The scroll offset along the y-axis. + * + *  @sa @ref scrolling + *  @sa glfwSetScrollCallback + * + *  @since Added in version 3.0.  Replaces `GLFWmousewheelfun`. + * + *  @ingroup input + */ +typedef void (* GLFWscrollfun)(GLFWwindow*,double,double); + +/*! @brief The function signature for keyboard key callbacks. + * + *  This is the function signature for keyboard key callback functions. + * + *  @param[in] window The window that received the event. + *  @param[in] key The [keyboard key](@ref keys) that was pressed or released. + *  @param[in] scancode The system-specific scancode of the key. + *  @param[in] action `GLFW_PRESS`, `GLFW_RELEASE` or `GLFW_REPEAT`. + *  @param[in] mods Bit field describing which [modifier keys](@ref mods) were + *  held down. + * + *  @sa @ref input_key + *  @sa glfwSetKeyCallback + * + *  @since Added in version 1.0. + *  @glfw3 Added window handle, scancode and modifier mask parameters. + * + *  @ingroup input + */ +typedef void (* GLFWkeyfun)(GLFWwindow*,int,int,int,int); + +/*! @brief The function signature for Unicode character callbacks. + * + *  This is the function signature for Unicode character callback functions. + * + *  @param[in] window The window that received the event. + *  @param[in] codepoint The Unicode code point of the character. + * + *  @sa @ref input_char + *  @sa glfwSetCharCallback + * + *  @since Added in version 2.4. + *  @glfw3 Added window handle parameter. + * + *  @ingroup input + */ +typedef void (* GLFWcharfun)(GLFWwindow*,unsigned int); + +/*! @brief The function signature for Unicode character with modifiers + *  callbacks. + * + *  This is the function signature for Unicode character with modifiers callback + *  functions.  It is called for each input character, regardless of what + *  modifier keys are held down. + * + *  @param[in] window The window that received the event. + *  @param[in] codepoint The Unicode code point of the character. + *  @param[in] mods Bit field describing which [modifier keys](@ref mods) were + *  held down. + * + *  @sa @ref input_char + *  @sa glfwSetCharModsCallback + * + *  @since Added in version 3.1. + * + *  @ingroup input + */ +typedef void (* GLFWcharmodsfun)(GLFWwindow*,unsigned int,int); + +/*! @brief The function signature for file drop callbacks. + * + *  This is the function signature for file drop callbacks. + * + *  @param[in] window The window that received the event. + *  @param[in] count The number of dropped files. + *  @param[in] paths The UTF-8 encoded file and/or directory path names. + * + *  @sa @ref path_drop + *  @sa glfwSetDropCallback + * + *  @since Added in version 3.1. + * + *  @ingroup input + */ +typedef void (* GLFWdropfun)(GLFWwindow*,int,const char**); + +/*! @brief The function signature for monitor configuration callbacks. + * + *  This is the function signature for monitor configuration callback functions. + * + *  @param[in] monitor The monitor that was connected or disconnected. + *  @param[in] event One of `GLFW_CONNECTED` or `GLFW_DISCONNECTED`. + * + *  @sa @ref monitor_event + *  @sa glfwSetMonitorCallback + * + *  @since Added in version 3.0. + * + *  @ingroup monitor + */ +typedef void (* GLFWmonitorfun)(GLFWmonitor*,int); + +/*! @brief The function signature for joystick configuration callbacks. + * + *  This is the function signature for joystick configuration callback + *  functions. + * + *  @param[in] joy The joystick that was connected or disconnected. + *  @param[in] event One of `GLFW_CONNECTED` or `GLFW_DISCONNECTED`. + * + *  @sa @ref joystick_event + *  @sa glfwSetJoystickCallback + * + *  @since Added in version 3.2. + * + *  @ingroup input + */ +typedef void (* GLFWjoystickfun)(int,int); + +/*! @brief Video mode type. + * + *  This describes a single video mode. + * + *  @sa @ref monitor_modes + *  @sa glfwGetVideoMode glfwGetVideoModes + * + *  @since Added in version 1.0. + *  @glfw3 Added refresh rate member. + * + *  @ingroup monitor + */ +typedef struct GLFWvidmode +{ +    /*! The width, in screen coordinates, of the video mode. +     */ +    int width; +    /*! The height, in screen coordinates, of the video mode. +     */ +    int height; +    /*! The bit depth of the red channel of the video mode. +     */ +    int redBits; +    /*! The bit depth of the green channel of the video mode. +     */ +    int greenBits; +    /*! The bit depth of the blue channel of the video mode. +     */ +    int blueBits; +    /*! The refresh rate, in Hz, of the video mode. +     */ +    int refreshRate; +} GLFWvidmode; + +/*! @brief Gamma ramp. + * + *  This describes the gamma ramp for a monitor. + * + *  @sa @ref monitor_gamma + *  @sa glfwGetGammaRamp glfwSetGammaRamp + * + *  @since Added in version 3.0. + * + *  @ingroup monitor + */ +typedef struct GLFWgammaramp +{ +    /*! An array of value describing the response of the red channel. +     */ +    unsigned short* red; +    /*! An array of value describing the response of the green channel. +     */ +    unsigned short* green; +    /*! An array of value describing the response of the blue channel. +     */ +    unsigned short* blue; +    /*! The number of elements in each array. +     */ +    unsigned int size; +} GLFWgammaramp; + +/*! @brief Image data. + * + *  @sa @ref cursor_custom + * + *  @since Added in version 2.1. + *  @glfw3 Removed format and bytes-per-pixel members. + */ +typedef struct GLFWimage +{ +    /*! The width, in pixels, of this image. +     */ +    int width; +    /*! The height, in pixels, of this image. +     */ +    int height; +    /*! The pixel data of this image, arranged left-to-right, top-to-bottom. +     */ +    unsigned char* pixels; +} GLFWimage; + + +/************************************************************************* + * GLFW API functions + *************************************************************************/ + +/*! @brief Initializes the GLFW library. + * + *  This function initializes the GLFW library.  Before most GLFW functions can + *  be used, GLFW must be initialized, and before an application terminates GLFW + *  should be terminated in order to free any resources allocated during or + *  after initialization. + * + *  If this function fails, it calls @ref glfwTerminate before returning.  If it + *  succeeds, you should call @ref glfwTerminate before the application exits. + * + *  Additional calls to this function after successful initialization but before + *  termination will return `GLFW_TRUE` immediately. + * + *  @return `GLFW_TRUE` if successful, or `GLFW_FALSE` if an + *  [error](@ref error_handling) occurred. + * + *  @errors Possible errors include @ref GLFW_PLATFORM_ERROR. + * + *  @remark @osx This function will change the current directory of the + *  application to the `Contents/Resources` subdirectory of the application's + *  bundle, if present.  This can be disabled with a + *  [compile-time option](@ref compile_options_osx). + * + *  @thread_safety This function must only be called from the main thread. + * + *  @sa @ref intro_init + *  @sa glfwTerminate + * + *  @since Added in version 1.0. + * + *  @ingroup init + */ +GLFWAPI int glfwInit(void); + +/*! @brief Terminates the GLFW library. + * + *  This function destroys all remaining windows and cursors, restores any + *  modified gamma ramps and frees any other allocated resources.  Once this + *  function is called, you must again call @ref glfwInit successfully before + *  you will be able to use most GLFW functions. + * + *  If GLFW has been successfully initialized, this function should be called + *  before the application exits.  If initialization fails, there is no need to + *  call this function, as it is called by @ref glfwInit before it returns + *  failure. + * + *  @errors Possible errors include @ref GLFW_PLATFORM_ERROR. + * + *  @remark This function may be called before @ref glfwInit. + * + *  @warning The contexts of any remaining windows must not be current on any + *  other thread when this function is called. + * + *  @reentrancy This function must not be called from a callback. + * + *  @thread_safety This function must only be called from the main thread. + * + *  @sa @ref intro_init + *  @sa glfwInit + * + *  @since Added in version 1.0. + * + *  @ingroup init + */ +GLFWAPI void glfwTerminate(void); + +/*! @brief Retrieves the version of the GLFW library. + * + *  This function retrieves the major, minor and revision numbers of the GLFW + *  library.  It is intended for when you are using GLFW as a shared library and + *  want to ensure that you are using the minimum required version. + * + *  Any or all of the version arguments may be `NULL`. + * + *  @param[out] major Where to store the major version number, or `NULL`. + *  @param[out] minor Where to store the minor version number, or `NULL`. + *  @param[out] rev Where to store the revision number, or `NULL`. + * + *  @errors None. + * + *  @remark This function may be called before @ref glfwInit. + * + *  @thread_safety This function may be called from any thread. + * + *  @sa @ref intro_version + *  @sa glfwGetVersionString + * + *  @since Added in version 1.0. + * + *  @ingroup init + */ +GLFWAPI void glfwGetVersion(int* major, int* minor, int* rev); + +/*! @brief Returns a string describing the compile-time configuration. + * + *  This function returns the compile-time generated + *  [version string](@ref intro_version_string) of the GLFW library binary.  It + *  describes the version, platform, compiler and any platform-specific + *  compile-time options.  It should not be confused with the OpenGL or OpenGL + *  ES version string, queried with `glGetString`. + * + *  __Do not use the version string__ to parse the GLFW library version.  The + *  @ref glfwGetVersion function provides the version of the running library + *  binary in numerical format. + * + *  @return The ASCII encoded GLFW version string. + * + *  @errors None. + * + *  @remark This function may be called before @ref glfwInit. + * + *  @pointer_lifetime The returned string is static and compile-time generated. + * + *  @thread_safety This function may be called from any thread. + * + *  @sa @ref intro_version + *  @sa glfwGetVersion + * + *  @since Added in version 3.0. + * + *  @ingroup init + */ +GLFWAPI const char* glfwGetVersionString(void); + +/*! @brief Sets the error callback. + * + *  This function sets the error callback, which is called with an error code + *  and a human-readable description each time a GLFW error occurs. + * + *  The error callback is called on the thread where the error occurred.  If you + *  are using GLFW from multiple threads, your error callback needs to be + *  written accordingly. + * + *  Because the description string may have been generated specifically for that + *  error, it is not guaranteed to be valid after the callback has returned.  If + *  you wish to use it after the callback returns, you need to make a copy. + * + *  Once set, the error callback remains set even after the library has been + *  terminated. + * + *  @param[in] cbfun The new callback, or `NULL` to remove the currently set + *  callback. + *  @return The previously set callback, or `NULL` if no callback was set. + * + *  @errors None. + * + *  @remark This function may be called before @ref glfwInit. + * + *  @thread_safety This function must only be called from the main thread. + * + *  @sa @ref error_handling + * + *  @since Added in version 3.0. + * + *  @ingroup init + */ +GLFWAPI GLFWerrorfun glfwSetErrorCallback(GLFWerrorfun cbfun); + +/*! @brief Returns the currently connected monitors. + * + *  This function returns an array of handles for all currently connected + *  monitors.  The primary monitor is always first in the returned array.  If no + *  monitors were found, this function returns `NULL`. + * + *  @param[out] count Where to store the number of monitors in the returned + *  array.  This is set to zero if an error occurred. + *  @return An array of monitor handles, or `NULL` if no monitors were found or + *  if an [error](@ref error_handling) occurred. + * + *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + *  @pointer_lifetime The returned array is allocated and freed by GLFW.  You + *  should not free it yourself.  It is guaranteed to be valid only until the + *  monitor configuration changes or the library is terminated. + * + *  @thread_safety This function must only be called from the main thread. + * + *  @sa @ref monitor_monitors + *  @sa @ref monitor_event + *  @sa glfwGetPrimaryMonitor + * + *  @since Added in version 3.0. + * + *  @ingroup monitor + */ +GLFWAPI GLFWmonitor** glfwGetMonitors(int* count); + +/*! @brief Returns the primary monitor. + * + *  This function returns the primary monitor.  This is usually the monitor + *  where elements like the task bar or global menu bar are located. + * + *  @return The primary monitor, or `NULL` if no monitors were found or if an + *  [error](@ref error_handling) occurred. + * + *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + *  @thread_safety This function must only be called from the main thread. + * + *  @remark The primary monitor is always first in the array returned by @ref + *  glfwGetMonitors. + * + *  @sa @ref monitor_monitors + *  @sa glfwGetMonitors + * + *  @since Added in version 3.0. + * + *  @ingroup monitor + */ +GLFWAPI GLFWmonitor* glfwGetPrimaryMonitor(void); + +/*! @brief Returns the position of the monitor's viewport on the virtual screen. + * + *  This function returns the position, in screen coordinates, of the upper-left + *  corner of the specified monitor. + * + *  Any or all of the position arguments may be `NULL`.  If an error occurs, all + *  non-`NULL` position arguments will be set to zero. + * + *  @param[in] monitor The monitor to query. + *  @param[out] xpos Where to store the monitor x-coordinate, or `NULL`. + *  @param[out] ypos Where to store the monitor y-coordinate, or `NULL`. + * + *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + *  GLFW_PLATFORM_ERROR. + * + *  @thread_safety This function must only be called from the main thread. + * + *  @sa @ref monitor_properties + * + *  @since Added in version 3.0. + * + *  @ingroup monitor + */ +GLFWAPI void glfwGetMonitorPos(GLFWmonitor* monitor, int* xpos, int* ypos); + +/*! @brief Returns the physical size of the monitor. + * + *  This function returns the size, in millimetres, of the display area of the + *  specified monitor. + * + *  Some systems do not provide accurate monitor size information, either + *  because the monitor + *  [EDID](https://en.wikipedia.org/wiki/Extended_display_identification_data) + *  data is incorrect or because the driver does not report it accurately. + * + *  Any or all of the size arguments may be `NULL`.  If an error occurs, all + *  non-`NULL` size arguments will be set to zero. + * + *  @param[in] monitor The monitor to query. + *  @param[out] widthMM Where to store the width, in millimetres, of the + *  monitor's display area, or `NULL`. + *  @param[out] heightMM Where to store the height, in millimetres, of the + *  monitor's display area, or `NULL`. + * + *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + *  @remark @win32 calculates the returned physical size from the + *  current resolution and system DPI instead of querying the monitor EDID data. + * + *  @thread_safety This function must only be called from the main thread. + * + *  @sa @ref monitor_properties + * + *  @since Added in version 3.0. + * + *  @ingroup monitor + */ +GLFWAPI void glfwGetMonitorPhysicalSize(GLFWmonitor* monitor, int* widthMM, int* heightMM); + +/*! @brief Returns the name of the specified monitor. + * + *  This function returns a human-readable name, encoded as UTF-8, of the + *  specified monitor.  The name typically reflects the make and model of the + *  monitor and is not guaranteed to be unique among the connected monitors. + * + *  @param[in] monitor The monitor to query. + *  @return The UTF-8 encoded name of the monitor, or `NULL` if an + *  [error](@ref error_handling) occurred. + * + *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + *  @pointer_lifetime The returned string is allocated and freed by GLFW.  You + *  should not free it yourself.  It is valid until the specified monitor is + *  disconnected or the library is terminated. + * + *  @thread_safety This function must only be called from the main thread. + * + *  @sa @ref monitor_properties + * + *  @since Added in version 3.0. + * + *  @ingroup monitor + */ +GLFWAPI const char* glfwGetMonitorName(GLFWmonitor* monitor); + +/*! @brief Sets the monitor configuration callback. + * + *  This function sets the monitor configuration callback, or removes the + *  currently set callback.  This is called when a monitor is connected to or + *  disconnected from the system. + * + *  @param[in] cbfun The new callback, or `NULL` to remove the currently set + *  callback. + *  @return The previously set callback, or `NULL` if no callback was set or the + *  library had not been [initialized](@ref intro_init). + * + *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + *  @thread_safety This function must only be called from the main thread. + * + *  @sa @ref monitor_event + * + *  @since Added in version 3.0. + * + *  @ingroup monitor + */ +GLFWAPI GLFWmonitorfun glfwSetMonitorCallback(GLFWmonitorfun cbfun); + +/*! @brief Returns the available video modes for the specified monitor. + * + *  This function returns an array of all video modes supported by the specified + *  monitor.  The returned array is sorted in ascending order, first by color + *  bit depth (the sum of all channel depths) and then by resolution area (the + *  product of width and height). + * + *  @param[in] monitor The monitor to query. + *  @param[out] count Where to store the number of video modes in the returned + *  array.  This is set to zero if an error occurred. + *  @return An array of video modes, or `NULL` if an + *  [error](@ref error_handling) occurred. + * + *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + *  GLFW_PLATFORM_ERROR. + * + *  @pointer_lifetime The returned array is allocated and freed by GLFW.  You + *  should not free it yourself.  It is valid until the specified monitor is + *  disconnected, this function is called again for that monitor or the library + *  is terminated. + * + *  @thread_safety This function must only be called from the main thread. + * + *  @sa @ref monitor_modes + *  @sa glfwGetVideoMode + * + *  @since Added in version 1.0. + *  @glfw3 Changed to return an array of modes for a specific monitor. + * + *  @ingroup monitor + */ +GLFWAPI const GLFWvidmode* glfwGetVideoModes(GLFWmonitor* monitor, int* count); + +/*! @brief Returns the current mode of the specified monitor. + * + *  This function returns the current video mode of the specified monitor.  If + *  you have created a full screen window for that monitor, the return value + *  will depend on whether that window is iconified. + * + *  @param[in] monitor The monitor to query. + *  @return The current mode of the monitor, or `NULL` if an + *  [error](@ref error_handling) occurred. + * + *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + *  GLFW_PLATFORM_ERROR. + * + *  @pointer_lifetime The returned array is allocated and freed by GLFW.  You + *  should not free it yourself.  It is valid until the specified monitor is + *  disconnected or the library is terminated. + * + *  @thread_safety This function must only be called from the main thread. + * + *  @sa @ref monitor_modes + *  @sa glfwGetVideoModes + * + *  @since Added in version 3.0.  Replaces `glfwGetDesktopMode`. + * + *  @ingroup monitor + */ +GLFWAPI const GLFWvidmode* glfwGetVideoMode(GLFWmonitor* monitor); + +/*! @brief Generates a gamma ramp and sets it for the specified monitor. + * + *  This function generates a 256-element gamma ramp from the specified exponent + *  and then calls @ref glfwSetGammaRamp with it.  The value must be a finite + *  number greater than zero. + * + *  @param[in] monitor The monitor whose gamma ramp to set. + *  @param[in] gamma The desired exponent. + * + *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + *  GLFW_INVALID_VALUE and @ref GLFW_PLATFORM_ERROR. + * + *  @thread_safety This function must only be called from the main thread. + * + *  @sa @ref monitor_gamma + * + *  @since Added in version 3.0. + * + *  @ingroup monitor + */ +GLFWAPI void glfwSetGamma(GLFWmonitor* monitor, float gamma); + +/*! @brief Returns the current gamma ramp for the specified monitor. + * + *  This function returns the current gamma ramp of the specified monitor. + * + *  @param[in] monitor The monitor to query. + *  @return The current gamma ramp, or `NULL` if an + *  [error](@ref error_handling) occurred. + * + *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + *  GLFW_PLATFORM_ERROR. + * + *  @pointer_lifetime The returned structure and its arrays are allocated and + *  freed by GLFW.  You should not free them yourself.  They are valid until the + *  specified monitor is disconnected, this function is called again for that + *  monitor or the library is terminated. + * + *  @thread_safety This function must only be called from the main thread. + * + *  @sa @ref monitor_gamma + * + *  @since Added in version 3.0. + * + *  @ingroup monitor + */ +GLFWAPI const GLFWgammaramp* glfwGetGammaRamp(GLFWmonitor* monitor); + +/*! @brief Sets the current gamma ramp for the specified monitor. + * + *  This function sets the current gamma ramp for the specified monitor.  The + *  original gamma ramp for that monitor is saved by GLFW the first time this + *  function is called and is restored by @ref glfwTerminate. + * + *  @param[in] monitor The monitor whose gamma ramp to set. + *  @param[in] ramp The gamma ramp to use. + * + *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + *  GLFW_PLATFORM_ERROR. + * + *  @remark Gamma ramp sizes other than 256 are not supported by all platforms + *  or graphics hardware. + * + *  @remark @win32 The gamma ramp size must be 256. + * + *  @pointer_lifetime The specified gamma ramp is copied before this function + *  returns. + * + *  @thread_safety This function must only be called from the main thread. + * + *  @sa @ref monitor_gamma + * + *  @since Added in version 3.0. + * + *  @ingroup monitor + */ +GLFWAPI void glfwSetGammaRamp(GLFWmonitor* monitor, const GLFWgammaramp* ramp); + +/*! @brief Resets all window hints to their default values. + * + *  This function resets all window hints to their + *  [default values](@ref window_hints_values). + * + *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + *  @thread_safety This function must only be called from the main thread. + * + *  @sa @ref window_hints + *  @sa glfwWindowHint + * + *  @since Added in version 3.0. + * + *  @ingroup window + */ +GLFWAPI void glfwDefaultWindowHints(void); + +/*! @brief Sets the specified window hint to the desired value. + * + *  This function sets hints for the next call to @ref glfwCreateWindow.  The + *  hints, once set, retain their values until changed by a call to @ref + *  glfwWindowHint or @ref glfwDefaultWindowHints, or until the library is + *  terminated. + * + *  This function does not check whether the specified hint values are valid. + *  If you set hints to invalid values this will instead be reported by the next + *  call to @ref glfwCreateWindow. + * + *  @param[in] hint The [window hint](@ref window_hints) to set. + *  @param[in] value The new value of the window hint. + * + *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + *  GLFW_INVALID_ENUM. + * + *  @thread_safety This function must only be called from the main thread. + * + *  @sa @ref window_hints + *  @sa glfwDefaultWindowHints + * + *  @since Added in version 3.0.  Replaces `glfwOpenWindowHint`. + * + *  @ingroup window + */ +GLFWAPI void glfwWindowHint(int hint, int value); + +/*! @brief Creates a window and its associated context. + * + *  This function creates a window and its associated OpenGL or OpenGL ES + *  context.  Most of the options controlling how the window and its context + *  should be created are specified with [window hints](@ref window_hints). + * + *  Successful creation does not change which context is current.  Before you + *  can use the newly created context, you need to + *  [make it current](@ref context_current).  For information about the `share` + *  parameter, see @ref context_sharing. + * + *  The created window, framebuffer and context may differ from what you + *  requested, as not all parameters and hints are + *  [hard constraints](@ref window_hints_hard).  This includes the size of the + *  window, especially for full screen windows.  To query the actual attributes + *  of the created window, framebuffer and context, see @ref + *  glfwGetWindowAttrib, @ref glfwGetWindowSize and @ref glfwGetFramebufferSize. + * + *  To create a full screen window, you need to specify the monitor the window + *  will cover.  If no monitor is specified, the window will be windowed mode. + *  Unless you have a way for the user to choose a specific monitor, it is + *  recommended that you pick the primary monitor.  For more information on how + *  to query connected monitors, see @ref monitor_monitors. + * + *  For full screen windows, the specified size becomes the resolution of the + *  window's _desired video mode_.  As long as a full screen window is not + *  iconified, the supported video mode most closely matching the desired video + *  mode is set for the specified monitor.  For more information about full + *  screen windows, including the creation of so called _windowed full screen_ + *  or _borderless full screen_ windows, see @ref window_windowed_full_screen. + * + *  By default, newly created windows use the placement recommended by the + *  window system.  To create the window at a specific position, make it + *  initially invisible using the [GLFW_VISIBLE](@ref window_hints_wnd) window + *  hint, set its [position](@ref window_pos) and then [show](@ref window_hide) + *  it. + * + *  As long as at least one full screen window is not iconified, the screensaver + *  is prohibited from starting. + * + *  Window systems put limits on window sizes.  Very large or very small window + *  dimensions may be overridden by the window system on creation.  Check the + *  actual [size](@ref window_size) after creation. + * + *  The [swap interval](@ref buffer_swap) is not set during window creation and + *  the initial value may vary depending on driver settings and defaults. + * + *  @param[in] width The desired width, in screen coordinates, of the window. + *  This must be greater than zero. + *  @param[in] height The desired height, in screen coordinates, of the window. + *  This must be greater than zero. + *  @param[in] title The initial, UTF-8 encoded window title. + *  @param[in] monitor The monitor to use for full screen mode, or `NULL` for + *  windowed mode. + *  @param[in] share The window whose context to share resources with, or `NULL` + *  to not share resources. + *  @return The handle of the created window, or `NULL` if an + *  [error](@ref error_handling) occurred. + * + *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + *  GLFW_INVALID_ENUM, @ref GLFW_INVALID_VALUE, @ref GLFW_API_UNAVAILABLE, @ref + *  GLFW_VERSION_UNAVAILABLE, @ref GLFW_FORMAT_UNAVAILABLE and @ref + *  GLFW_PLATFORM_ERROR. + * + *  @remark @win32 Window creation will fail if the Microsoft GDI software + *  OpenGL implementation is the only one available. + * + *  @remark @win32 If the executable has an icon resource named `GLFW_ICON,` + *  it will be set as the icon for the window.  If no such icon is present, the + *  `IDI_WINLOGO` icon will be used instead. + * + *  @remark @win32 The context to share resources with must not be current on + *  any other thread. + * + *  @remark @osx The GLFW window has no icon, as it is not a document + *  window, but the dock icon will be the same as the application bundle's icon. + *  For more information on bundles, see the + *  [Bundle Programming Guide](https://developer.apple.com/library/mac/documentation/CoreFoundation/Conceptual/CFBundles/) + *  in the Mac Developer Library. + * + *  @remark @osx The first time a window is created the menu bar is populated + *  with common commands like Hide, Quit and About.  The About entry opens + *  a minimal about dialog with information from the application's bundle.  The + *  menu bar can be disabled with a + *  [compile-time option](@ref compile_options_osx). + * + *  @remark @osx On OS X 10.10 and later the window frame will not be rendered + *  at full resolution on Retina displays unless the `NSHighResolutionCapable` + *  key is enabled in the application bundle's `Info.plist`.  For more + *  information, see + *  [High Resolution Guidelines for OS X](https://developer.apple.com/library/mac/documentation/GraphicsAnimation/Conceptual/HighResolutionOSX/Explained/Explained.html) + *  in the Mac Developer Library.  The GLFW test and example programs use + *  a custom `Info.plist` template for this, which can be found as + *  `CMake/MacOSXBundleInfo.plist.in` in the source tree. + * + *  @remark @x11 There is no mechanism for setting the window icon yet. + * + *  @remark @x11 Some window managers will not respect the placement of + *  initially hidden windows. + * + *  @remark @x11 Due to the asynchronous nature of X11, it may take a moment for + *  a window to reach its requested state.  This means you may not be able to + *  query the final size, position or other attributes directly after window + *  creation. + * + *  @reentrancy This function must not be called from a callback. + * + *  @thread_safety This function must only be called from the main thread. + * + *  @sa @ref window_creation + *  @sa glfwDestroyWindow + * + *  @since Added in version 3.0.  Replaces `glfwOpenWindow`. + * + *  @ingroup window + */ +GLFWAPI GLFWwindow* glfwCreateWindow(int width, int height, const char* title, GLFWmonitor* monitor, GLFWwindow* share); + +/*! @brief Destroys the specified window and its context. + * + *  This function destroys the specified window and its context.  On calling + *  this function, no further callbacks will be called for that window. + * + *  If the context of the specified window is current on the main thread, it is + *  detached before being destroyed. + * + *  @param[in] window The window to destroy. + * + *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + *  GLFW_PLATFORM_ERROR. + * + *  @note The context of the specified window must not be current on any other + *  thread when this function is called. + * + *  @reentrancy This function must not be called from a callback. + * + *  @thread_safety This function must only be called from the main thread. + * + *  @sa @ref window_creation + *  @sa glfwCreateWindow + * + *  @since Added in version 3.0.  Replaces `glfwCloseWindow`. + * + *  @ingroup window + */ +GLFWAPI void glfwDestroyWindow(GLFWwindow* window); + +/*! @brief Checks the close flag of the specified window. + * + *  This function returns the value of the close flag of the specified window. + * + *  @param[in] window The window to query. + *  @return The value of the close flag. + * + *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + *  @thread_safety This function may be called from any thread.  Access is not + *  synchronized. + * + *  @sa @ref window_close + * + *  @since Added in version 3.0. + * + *  @ingroup window + */ +GLFWAPI int glfwWindowShouldClose(GLFWwindow* window); + +/*! @brief Sets the close flag of the specified window. + * + *  This function sets the value of the close flag of the specified window. + *  This can be used to override the user's attempt to close the window, or + *  to signal that it should be closed. + * + *  @param[in] window The window whose flag to change. + *  @param[in] value The new value. + * + *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + *  @thread_safety This function may be called from any thread.  Access is not + *  synchronized. + * + *  @sa @ref window_close + * + *  @since Added in version 3.0. + * + *  @ingroup window + */ +GLFWAPI void glfwSetWindowShouldClose(GLFWwindow* window, int value); + +/*! @brief Sets the title of the specified window. + * + *  This function sets the window title, encoded as UTF-8, of the specified + *  window. + * + *  @param[in] window The window whose title to change. + *  @param[in] title The UTF-8 encoded window title. + * + *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + *  GLFW_PLATFORM_ERROR. + * + *  @remark @osx The window title will not be updated until the next time you + *  process events. + * + *  @thread_safety This function must only be called from the main thread. + * + *  @sa @ref window_title + * + *  @since Added in version 1.0. + *  @glfw3 Added window handle parameter. + * + *  @ingroup window + */ +GLFWAPI void glfwSetWindowTitle(GLFWwindow* window, const char* title); + +/*! @brief Sets the icon for the specified window. + * + *  This function sets the icon of the specified window.  If passed an array of + *  candidate images, those of or closest to the sizes desired by the system are + *  selected.  If no images are specified, the window reverts to its default + *  icon. + * + *  The desired image sizes varies depending on platform and system settings. + *  The selected images will be rescaled as needed.  Good sizes include 16x16, + *  32x32 and 48x48. + * + *  @param[in] window The window whose icon to set. + *  @param[in] count The number of images in the specified array, or zero to + *  revert to the default window icon. + *  @param[in] images The images to create the icon from.  This is ignored if + *  count is zero. + * + *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + *  GLFW_PLATFORM_ERROR. + * + *  @pointer_lifetime The specified image data is copied before this function + *  returns. + * + *  @remark @osx The GLFW window has no icon, as it is not a document + *  window, but the dock icon will be the same as the application bundle's icon. + *  For more information on bundles, see the + *  [Bundle Programming Guide](https://developer.apple.com/library/mac/documentation/CoreFoundation/Conceptual/CFBundles/) + *  in the Mac Developer Library. + * + *  @thread_safety This function must only be called from the main thread. + * + *  @sa @ref window_icon + * + *  @since Added in version 3.2. + * + *  @ingroup window + */ +GLFWAPI void glfwSetWindowIcon(GLFWwindow* window, int count, const GLFWimage* images); + +/*! @brief Retrieves the position of the client area of the specified window. + * + *  This function retrieves the position, in screen coordinates, of the + *  upper-left corner of the client area of the specified window. + * + *  Any or all of the position arguments may be `NULL`.  If an error occurs, all + *  non-`NULL` position arguments will be set to zero. + * + *  @param[in] window The window to query. + *  @param[out] xpos Where to store the x-coordinate of the upper-left corner of + *  the client area, or `NULL`. + *  @param[out] ypos Where to store the y-coordinate of the upper-left corner of + *  the client area, or `NULL`. + * + *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + *  GLFW_PLATFORM_ERROR. + * + *  @thread_safety This function must only be called from the main thread. + * + *  @sa @ref window_pos + *  @sa glfwSetWindowPos + * + *  @since Added in version 3.0. + * + *  @ingroup window + */ +GLFWAPI void glfwGetWindowPos(GLFWwindow* window, int* xpos, int* ypos); + +/*! @brief Sets the position of the client area of the specified window. + * + *  This function sets the position, in screen coordinates, of the upper-left + *  corner of the client area of the specified windowed mode window.  If the + *  window is a full screen window, this function does nothing. + * + *  __Do not use this function__ to move an already visible window unless you + *  have very good reasons for doing so, as it will confuse and annoy the user. + * + *  The window manager may put limits on what positions are allowed.  GLFW + *  cannot and should not override these limits. + * + *  @param[in] window The window to query. + *  @param[in] xpos The x-coordinate of the upper-left corner of the client area. + *  @param[in] ypos The y-coordinate of the upper-left corner of the client area. + * + *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + *  GLFW_PLATFORM_ERROR. + * + *  @thread_safety This function must only be called from the main thread. + * + *  @sa @ref window_pos + *  @sa glfwGetWindowPos + * + *  @since Added in version 1.0. + *  @glfw3 Added window handle parameter. + * + *  @ingroup window + */ +GLFWAPI void glfwSetWindowPos(GLFWwindow* window, int xpos, int ypos); + +/*! @brief Retrieves the size of the client area of the specified window. + * + *  This function retrieves the size, in screen coordinates, of the client area + *  of the specified window.  If you wish to retrieve the size of the + *  framebuffer of the window in pixels, see @ref glfwGetFramebufferSize. + * + *  Any or all of the size arguments may be `NULL`.  If an error occurs, all + *  non-`NULL` size arguments will be set to zero. + * + *  @param[in] window The window whose size to retrieve. + *  @param[out] width Where to store the width, in screen coordinates, of the + *  client area, or `NULL`. + *  @param[out] height Where to store the height, in screen coordinates, of the + *  client area, or `NULL`. + * + *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + *  GLFW_PLATFORM_ERROR. + * + *  @thread_safety This function must only be called from the main thread. + * + *  @sa @ref window_size + *  @sa glfwSetWindowSize + * + *  @since Added in version 1.0. + *  @glfw3 Added window handle parameter. + * + *  @ingroup window + */ +GLFWAPI void glfwGetWindowSize(GLFWwindow* window, int* width, int* height); + +/*! @brief Sets the size limits of the specified window. + * + *  This function sets the size limits of the client area of the specified + *  window.  If the window is full screen, the size limits only take effect if + *  once it is made windowed.  If the window is not resizable, this function + *  does nothing. + * + *  The size limits are applied immediately to a windowed mode window and may + *  cause it to be resized. + * + *  @param[in] window The window to set limits for. + *  @param[in] minwidth The minimum width, in screen coordinates, of the client + *  area, or `GLFW_DONT_CARE`. + *  @param[in] minheight The minimum height, in screen coordinates, of the + *  client area, or `GLFW_DONT_CARE`. + *  @param[in] maxwidth The maximum width, in screen coordinates, of the client + *  area, or `GLFW_DONT_CARE`. + *  @param[in] maxheight The maximum height, in screen coordinates, of the + *  client area, or `GLFW_DONT_CARE`. + * + *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + *  GLFW_PLATFORM_ERROR. + * + *  @remark If you set size limits and an aspect ratio that conflict, the + *  results are undefined. + * + *  @thread_safety This function must only be called from the main thread. + * + *  @sa @ref window_sizelimits + *  @sa glfwSetWindowAspectRatio + * + *  @since Added in version 3.2. + * + *  @ingroup window + */ +GLFWAPI void glfwSetWindowSizeLimits(GLFWwindow* window, int minwidth, int minheight, int maxwidth, int maxheight); + +/*! @brief Sets the aspect ratio of the specified window. + * + *  This function sets the required aspect ratio of the client area of the + *  specified window.  If the window is full screen, the aspect ratio only takes + *  effect once it is made windowed.  If the window is not resizable, this + *  function does nothing. + * + *  The aspect ratio is specified as a numerator and a denominator and both + *  values must be greater than zero.  For example, the common 16:9 aspect ratio + *  is specified as 16 and 9, respectively. + * + *  If the numerator and denominator is set to `GLFW_DONT_CARE` then the aspect + *  ratio limit is disabled. + * + *  The aspect ratio is applied immediately to a windowed mode window and may + *  cause it to be resized. + * + *  @param[in] window The window to set limits for. + *  @param[in] numer The numerator of the desired aspect ratio, or + *  `GLFW_DONT_CARE`. + *  @param[in] denom The denominator of the desired aspect ratio, or + *  `GLFW_DONT_CARE`. + * + *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + *  GLFW_INVALID_VALUE and @ref GLFW_PLATFORM_ERROR. + * + *  @remark If you set size limits and an aspect ratio that conflict, the + *  results are undefined. + * + *  @thread_safety This function must only be called from the main thread. + * + *  @sa @ref window_sizelimits + *  @sa glfwSetWindowSizeLimits + * + *  @since Added in version 3.2. + * + *  @ingroup window + */ +GLFWAPI void glfwSetWindowAspectRatio(GLFWwindow* window, int numer, int denom); + +/*! @brief Sets the size of the client area of the specified window. + * + *  This function sets the size, in screen coordinates, of the client area of + *  the specified window. + * + *  For full screen windows, this function updates the resolution of its desired + *  video mode and switches to the video mode closest to it, without affecting + *  the window's context.  As the context is unaffected, the bit depths of the + *  framebuffer remain unchanged. + * + *  If you wish to update the refresh rate of the desired video mode in addition + *  to its resolution, see @ref glfwSetWindowMonitor. + * + *  The window manager may put limits on what sizes are allowed.  GLFW cannot + *  and should not override these limits. + * + *  @param[in] window The window to resize. + *  @param[in] width The desired width, in screen coordinates, of the window + *  client area. + *  @param[in] height The desired height, in screen coordinates, of the window + *  client area. + * + *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + *  GLFW_PLATFORM_ERROR. + * + *  @thread_safety This function must only be called from the main thread. + * + *  @sa @ref window_size + *  @sa glfwGetWindowSize + *  @sa glfwSetWindowMonitor + * + *  @since Added in version 1.0. + *  @glfw3 Added window handle parameter. + * + *  @ingroup window + */ +GLFWAPI void glfwSetWindowSize(GLFWwindow* window, int width, int height); + +/*! @brief Retrieves the size of the framebuffer of the specified window. + * + *  This function retrieves the size, in pixels, of the framebuffer of the + *  specified window.  If you wish to retrieve the size of the window in screen + *  coordinates, see @ref glfwGetWindowSize. + * + *  Any or all of the size arguments may be `NULL`.  If an error occurs, all + *  non-`NULL` size arguments will be set to zero. + * + *  @param[in] window The window whose framebuffer to query. + *  @param[out] width Where to store the width, in pixels, of the framebuffer, + *  or `NULL`. + *  @param[out] height Where to store the height, in pixels, of the framebuffer, + *  or `NULL`. + * + *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + *  GLFW_PLATFORM_ERROR. + * + *  @thread_safety This function must only be called from the main thread. + * + *  @sa @ref window_fbsize + *  @sa glfwSetFramebufferSizeCallback + * + *  @since Added in version 3.0. + * + *  @ingroup window + */ +GLFWAPI void glfwGetFramebufferSize(GLFWwindow* window, int* width, int* height); + +/*! @brief Retrieves the size of the frame of the window. + * + *  This function retrieves the size, in screen coordinates, of each edge of the + *  frame of the specified window.  This size includes the title bar, if the + *  window has one.  The size of the frame may vary depending on the + *  [window-related hints](@ref window_hints_wnd) used to create it. + * + *  Because this function retrieves the size of each window frame edge and not + *  the offset along a particular coordinate axis, the retrieved values will + *  always be zero or positive. + * + *  Any or all of the size arguments may be `NULL`.  If an error occurs, all + *  non-`NULL` size arguments will be set to zero. + * + *  @param[in] window The window whose frame size to query. + *  @param[out] left Where to store the size, in screen coordinates, of the left + *  edge of the window frame, or `NULL`. + *  @param[out] top Where to store the size, in screen coordinates, of the top + *  edge of the window frame, or `NULL`. + *  @param[out] right Where to store the size, in screen coordinates, of the + *  right edge of the window frame, or `NULL`. + *  @param[out] bottom Where to store the size, in screen coordinates, of the + *  bottom edge of the window frame, or `NULL`. + * + *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + *  GLFW_PLATFORM_ERROR. + * + *  @thread_safety This function must only be called from the main thread. + * + *  @sa @ref window_size + * + *  @since Added in version 3.1. + * + *  @ingroup window + */ +GLFWAPI void glfwGetWindowFrameSize(GLFWwindow* window, int* left, int* top, int* right, int* bottom); + +/*! @brief Iconifies the specified window. + * + *  This function iconifies (minimizes) the specified window if it was + *  previously restored.  If the window is already iconified, this function does + *  nothing. + * + *  If the specified window is a full screen window, the original monitor + *  resolution is restored until the window is restored. + * + *  @param[in] window The window to iconify. + * + *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + *  GLFW_PLATFORM_ERROR. + * + *  @thread_safety This function must only be called from the main thread. + * + *  @sa @ref window_iconify + *  @sa glfwRestoreWindow + *  @sa glfwMaximizeWindow + * + *  @since Added in version 2.1. + *  @glfw3 Added window handle parameter. + * + *  @ingroup window + */ +GLFWAPI void glfwIconifyWindow(GLFWwindow* window); + +/*! @brief Restores the specified window. + * + *  This function restores the specified window if it was previously iconified + *  (minimized) or maximized.  If the window is already restored, this function + *  does nothing. + * + *  If the specified window is a full screen window, the resolution chosen for + *  the window is restored on the selected monitor. + * + *  @param[in] window The window to restore. + * + *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + *  GLFW_PLATFORM_ERROR. + * + *  @thread_safety This function must only be called from the main thread. + * + *  @sa @ref window_iconify + *  @sa glfwIconifyWindow + *  @sa glfwMaximizeWindow + * + *  @since Added in version 2.1. + *  @glfw3 Added window handle parameter. + * + *  @ingroup window + */ +GLFWAPI void glfwRestoreWindow(GLFWwindow* window); + +/*! @brief Maximizes the specified window. + * + *  This function maximizes the specified window if it was previously not + *  maximized.  If the window is already maximized, this function does nothing. + * + *  If the specified window is a full screen window, this function does nothing. + * + *  @param[in] window The window to maximize. + * + *  @par Thread Safety + *  This function may only be called from the main thread. + * + *  @sa @ref window_iconify + *  @sa glfwIconifyWindow + *  @sa glfwRestoreWindow + * + *  @since Added in GLFW 3.2. + * + *  @ingroup window + */ +GLFWAPI void glfwMaximizeWindow(GLFWwindow* window); + +/*! @brief Makes the specified window visible. + * + *  This function makes the specified window visible if it was previously + *  hidden.  If the window is already visible or is in full screen mode, this + *  function does nothing. + * + *  @param[in] window The window to make visible. + * + *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + *  GLFW_PLATFORM_ERROR. + * + *  @thread_safety This function must only be called from the main thread. + * + *  @sa @ref window_hide + *  @sa glfwHideWindow + * + *  @since Added in version 3.0. + * + *  @ingroup window + */ +GLFWAPI void glfwShowWindow(GLFWwindow* window); + +/*! @brief Hides the specified window. + * + *  This function hides the specified window if it was previously visible.  If + *  the window is already hidden or is in full screen mode, this function does + *  nothing. + * + *  @param[in] window The window to hide. + * + *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + *  GLFW_PLATFORM_ERROR. + * + *  @thread_safety This function must only be called from the main thread. + * + *  @sa @ref window_hide + *  @sa glfwShowWindow + * + *  @since Added in version 3.0. + * + *  @ingroup window + */ +GLFWAPI void glfwHideWindow(GLFWwindow* window); + +/*! @brief Brings the specified window to front and sets input focus. + * + *  This function brings the specified window to front and sets input focus. + *  The window should already be visible and not iconified. + * + *  By default, both windowed and full screen mode windows are focused when + *  initially created.  Set the [GLFW_FOCUSED](@ref window_hints_wnd) to disable + *  this behavior. + * + *  __Do not use this function__ to steal focus from other applications unless + *  you are certain that is what the user wants.  Focus stealing can be + *  extremely disruptive. + * + *  @param[in] window The window to give input focus. + * + *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + *  GLFW_PLATFORM_ERROR. + * + *  @thread_safety This function must only be called from the main thread. + * + *  @sa @ref window_focus + * + *  @since Added in version 3.2. + * + *  @ingroup window + */ +GLFWAPI void glfwFocusWindow(GLFWwindow* window); + +/*! @brief Returns the monitor that the window uses for full screen mode. + * + *  This function returns the handle of the monitor that the specified window is + *  in full screen on. + * + *  @param[in] window The window to query. + *  @return The monitor, or `NULL` if the window is in windowed mode or an error + *  occurred. + * + *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + *  @thread_safety This function must only be called from the main thread. + * + *  @sa @ref window_monitor + *  @sa glfwSetWindowMonitor + * + *  @since Added in version 3.0. + * + *  @ingroup window + */ +GLFWAPI GLFWmonitor* glfwGetWindowMonitor(GLFWwindow* window); + +/*! @brief Sets the mode, monitor, video mode and placement of a window. + * + *  This function sets the monitor that the window uses for full screen mode or, + *  if the monitor is `NULL`, makes it windowed mode. + * + *  When setting a monitor, this function updates the width, height and refresh + *  rate of the desired video mode and switches to the video mode closest to it. + *  The window position is ignored when setting a monitor. + * + *  When the monitor is `NULL`, the position, width and height are used to + *  place the window client area.  The refresh rate is ignored when no monitor + *  is specified. + * + *  If you only wish to update the resolution of a full screen window or the + *  size of a windowed mode window, see @ref glfwSetWindowSize. + * + *  When a window transitions from full screen to windowed mode, this function + *  restores any previous window settings such as whether it is decorated, + *  floating, resizable, has size or aspect ratio limits, etc.. + * + *  @param[in] window The window whose monitor, size or video mode to set. + *  @param[in] monitor The desired monitor, or `NULL` to set windowed mode. + *  @param[in] xpos The desired x-coordinate of the upper-left corner of the + *  client area. + *  @param[in] ypos The desired y-coordinate of the upper-left corner of the + *  client area. + *  @param[in] width The desired with, in screen coordinates, of the client area + *  or video mode. + *  @param[in] height The desired height, in screen coordinates, of the client + *  area or video mode. + *  @param[in] refreshRate The desired refresh rate, in Hz, of the video mode. + * + *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + *  GLFW_PLATFORM_ERROR. + * + *  @thread_safety This function must only be called from the main thread. + * + *  @sa @ref window_monitor + *  @sa @ref window_full_screen + *  @sa glfwGetWindowMonitor + *  @sa glfwSetWindowSize + * + *  @since Added in version 3.2. + * + *  @ingroup window + */ +GLFWAPI void glfwSetWindowMonitor(GLFWwindow* window, GLFWmonitor* monitor, int xpos, int ypos, int width, int height, int refreshRate); + +/*! @brief Returns an attribute of the specified window. + * + *  This function returns the value of an attribute of the specified window or + *  its OpenGL or OpenGL ES context. + * + *  @param[in] window The window to query. + *  @param[in] attrib The [window attribute](@ref window_attribs) whose value to + *  return. + *  @return The value of the attribute, or zero if an + *  [error](@ref error_handling) occurred. + * + *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + *  GLFW_INVALID_ENUM and @ref GLFW_PLATFORM_ERROR. + * + *  @remark Framebuffer related hints are not window attributes.  See @ref + *  window_attribs_fb for more information. + * + *  @remark Zero is a valid value for many window and context related + *  attributes so you cannot use a return value of zero as an indication of + *  errors.  However, this function should not fail as long as it is passed + *  valid arguments and the library has been [initialized](@ref intro_init). + * + *  @thread_safety This function must only be called from the main thread. + * + *  @sa @ref window_attribs + * + *  @since Added in version 3.0.  Replaces `glfwGetWindowParam` and + *  `glfwGetGLVersion`. + * + *  @ingroup window + */ +GLFWAPI int glfwGetWindowAttrib(GLFWwindow* window, int attrib); + +/*! @brief Sets the user pointer of the specified window. + * + *  This function sets the user-defined pointer of the specified window.  The + *  current value is retained until the window is destroyed.  The initial value + *  is `NULL`. + * + *  @param[in] window The window whose pointer to set. + *  @param[in] pointer The new value. + * + *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + *  @thread_safety This function may be called from any thread.  Access is not + *  synchronized. + * + *  @sa @ref window_userptr + *  @sa glfwGetWindowUserPointer + * + *  @since Added in version 3.0. + * + *  @ingroup window + */ +GLFWAPI void glfwSetWindowUserPointer(GLFWwindow* window, void* pointer); + +/*! @brief Returns the user pointer of the specified window. + * + *  This function returns the current value of the user-defined pointer of the + *  specified window.  The initial value is `NULL`. + * + *  @param[in] window The window whose pointer to return. + * + *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + *  @thread_safety This function may be called from any thread.  Access is not + *  synchronized. + * + *  @sa @ref window_userptr + *  @sa glfwSetWindowUserPointer + * + *  @since Added in version 3.0. + * + *  @ingroup window + */ +GLFWAPI void* glfwGetWindowUserPointer(GLFWwindow* window); + +/*! @brief Sets the position callback for the specified window. + * + *  This function sets the position callback of the specified window, which is + *  called when the window is moved.  The callback is provided with the screen + *  position of the upper-left corner of the client area of the window. + * + *  @param[in] window The window whose callback to set. + *  @param[in] cbfun The new callback, or `NULL` to remove the currently set + *  callback. + *  @return The previously set callback, or `NULL` if no callback was set or the + *  library had not been [initialized](@ref intro_init). + * + *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + *  @thread_safety This function must only be called from the main thread. + * + *  @sa @ref window_pos + * + *  @since Added in version 3.0. + * + *  @ingroup window + */ +GLFWAPI GLFWwindowposfun glfwSetWindowPosCallback(GLFWwindow* window, GLFWwindowposfun cbfun); + +/*! @brief Sets the size callback for the specified window. + * + *  This function sets the size callback of the specified window, which is + *  called when the window is resized.  The callback is provided with the size, + *  in screen coordinates, of the client area of the window. + * + *  @param[in] window The window whose callback to set. + *  @param[in] cbfun The new callback, or `NULL` to remove the currently set + *  callback. + *  @return The previously set callback, or `NULL` if no callback was set or the + *  library had not been [initialized](@ref intro_init). + * + *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + *  @thread_safety This function must only be called from the main thread. + * + *  @sa @ref window_size + * + *  @since Added in version 1.0. + *  @glfw3 Added window handle parameter and return value. + * + *  @ingroup window + */ +GLFWAPI GLFWwindowsizefun glfwSetWindowSizeCallback(GLFWwindow* window, GLFWwindowsizefun cbfun); + +/*! @brief Sets the close callback for the specified window. + * + *  This function sets the close callback of the specified window, which is + *  called when the user attempts to close the window, for example by clicking + *  the close widget in the title bar. + * + *  The close flag is set before this callback is called, but you can modify it + *  at any time with @ref glfwSetWindowShouldClose. + * + *  The close callback is not triggered by @ref glfwDestroyWindow. + * + *  @param[in] window The window whose callback to set. + *  @param[in] cbfun The new callback, or `NULL` to remove the currently set + *  callback. + *  @return The previously set callback, or `NULL` if no callback was set or the + *  library had not been [initialized](@ref intro_init). + * + *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + *  @remark @osx Selecting Quit from the application menu will trigger the close + *  callback for all windows. + * + *  @thread_safety This function must only be called from the main thread. + * + *  @sa @ref window_close + * + *  @since Added in version 2.5. + *  @glfw3 Added window handle parameter and return value. + * + *  @ingroup window + */ +GLFWAPI GLFWwindowclosefun glfwSetWindowCloseCallback(GLFWwindow* window, GLFWwindowclosefun cbfun); + +/*! @brief Sets the refresh callback for the specified window. + * + *  This function sets the refresh callback of the specified window, which is + *  called when the client area of the window needs to be redrawn, for example + *  if the window has been exposed after having been covered by another window. + * + *  On compositing window systems such as Aero, Compiz or Aqua, where the window + *  contents are saved off-screen, this callback may be called only very + *  infrequently or never at all. + * + *  @param[in] window The window whose callback to set. + *  @param[in] cbfun The new callback, or `NULL` to remove the currently set + *  callback. + *  @return The previously set callback, or `NULL` if no callback was set or the + *  library had not been [initialized](@ref intro_init). + * + *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + *  @thread_safety This function must only be called from the main thread. + * + *  @sa @ref window_refresh + * + *  @since Added in version 2.5. + *  @glfw3 Added window handle parameter and return value. + * + *  @ingroup window + */ +GLFWAPI GLFWwindowrefreshfun glfwSetWindowRefreshCallback(GLFWwindow* window, GLFWwindowrefreshfun cbfun); + +/*! @brief Sets the focus callback for the specified window. + * + *  This function sets the focus callback of the specified window, which is + *  called when the window gains or loses input focus. + * + *  After the focus callback is called for a window that lost input focus, + *  synthetic key and mouse button release events will be generated for all such + *  that had been pressed.  For more information, see @ref glfwSetKeyCallback + *  and @ref glfwSetMouseButtonCallback. + * + *  @param[in] window The window whose callback to set. + *  @param[in] cbfun The new callback, or `NULL` to remove the currently set + *  callback. + *  @return The previously set callback, or `NULL` if no callback was set or the + *  library had not been [initialized](@ref intro_init). + * + *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + *  @thread_safety This function must only be called from the main thread. + * + *  @sa @ref window_focus + * + *  @since Added in version 3.0. + * + *  @ingroup window + */ +GLFWAPI GLFWwindowfocusfun glfwSetWindowFocusCallback(GLFWwindow* window, GLFWwindowfocusfun cbfun); + +/*! @brief Sets the iconify callback for the specified window. + * + *  This function sets the iconification callback of the specified window, which + *  is called when the window is iconified or restored. + * + *  @param[in] window The window whose callback to set. + *  @param[in] cbfun The new callback, or `NULL` to remove the currently set + *  callback. + *  @return The previously set callback, or `NULL` if no callback was set or the + *  library had not been [initialized](@ref intro_init). + * + *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + *  @thread_safety This function must only be called from the main thread. + * + *  @sa @ref window_iconify + * + *  @since Added in version 3.0. + * + *  @ingroup window + */ +GLFWAPI GLFWwindowiconifyfun glfwSetWindowIconifyCallback(GLFWwindow* window, GLFWwindowiconifyfun cbfun); + +/*! @brief Sets the framebuffer resize callback for the specified window. + * + *  This function sets the framebuffer resize callback of the specified window, + *  which is called when the framebuffer of the specified window is resized. + * + *  @param[in] window The window whose callback to set. + *  @param[in] cbfun The new callback, or `NULL` to remove the currently set + *  callback. + *  @return The previously set callback, or `NULL` if no callback was set or the + *  library had not been [initialized](@ref intro_init). + * + *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + *  @thread_safety This function must only be called from the main thread. + * + *  @sa @ref window_fbsize + * + *  @since Added in version 3.0. + * + *  @ingroup window + */ +GLFWAPI GLFWframebuffersizefun glfwSetFramebufferSizeCallback(GLFWwindow* window, GLFWframebuffersizefun cbfun); + +/*! @brief Processes all pending events. + * + *  This function processes only those events that are already in the event + *  queue and then returns immediately.  Processing events will cause the window + *  and input callbacks associated with those events to be called. + * + *  On some platforms, a window move, resize or menu operation will cause event + *  processing to block.  This is due to how event processing is designed on + *  those platforms.  You can use the + *  [window refresh callback](@ref window_refresh) to redraw the contents of + *  your window when necessary during such operations. + * + *  On some platforms, certain events are sent directly to the application + *  without going through the event queue, causing callbacks to be called + *  outside of a call to one of the event processing functions. + * + *  Event processing is not required for joystick input to work. + * + *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + *  GLFW_PLATFORM_ERROR. + * + *  @reentrancy This function must not be called from a callback. + * + *  @thread_safety This function must only be called from the main thread. + * + *  @sa @ref events + *  @sa glfwWaitEvents + *  @sa glfwWaitEventsTimeout + * + *  @since Added in version 1.0. + * + *  @ingroup window + */ +GLFWAPI void glfwPollEvents(void); + +/*! @brief Waits until events are queued and processes them. + * + *  This function puts the calling thread to sleep until at least one event is + *  available in the event queue.  Once one or more events are available, + *  it behaves exactly like @ref glfwPollEvents, i.e. the events in the queue + *  are processed and the function then returns immediately.  Processing events + *  will cause the window and input callbacks associated with those events to be + *  called. + * + *  Since not all events are associated with callbacks, this function may return + *  without a callback having been called even if you are monitoring all + *  callbacks. + * + *  On some platforms, a window move, resize or menu operation will cause event + *  processing to block.  This is due to how event processing is designed on + *  those platforms.  You can use the + *  [window refresh callback](@ref window_refresh) to redraw the contents of + *  your window when necessary during such operations. + * + *  On some platforms, certain callbacks may be called outside of a call to one + *  of the event processing functions. + * + *  If no windows exist, this function returns immediately.  For synchronization + *  of threads in applications that do not create windows, use your threading + *  library of choice. + * + *  Event processing is not required for joystick input to work. + * + *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + *  GLFW_PLATFORM_ERROR. + * + *  @reentrancy This function must not be called from a callback. + * + *  @thread_safety This function must only be called from the main thread. + * + *  @sa @ref events + *  @sa glfwPollEvents + *  @sa glfwWaitEventsTimeout + * + *  @since Added in version 2.5. + * + *  @ingroup window + */ +GLFWAPI void glfwWaitEvents(void); + +/*! @brief Waits with timeout until events are queued and processes them. + * + *  This function puts the calling thread to sleep until at least one event is + *  available in the event queue, or until the specified timeout is reached.  If + *  one or more events are available, it behaves exactly like @ref + *  glfwPollEvents, i.e. the events in the queue are processed and the function + *  then returns immediately.  Processing events will cause the window and input + *  callbacks associated with those events to be called. + * + *  The timeout value must be a positive finite number. + * + *  Since not all events are associated with callbacks, this function may return + *  without a callback having been called even if you are monitoring all + *  callbacks. + * + *  On some platforms, a window move, resize or menu operation will cause event + *  processing to block.  This is due to how event processing is designed on + *  those platforms.  You can use the + *  [window refresh callback](@ref window_refresh) to redraw the contents of + *  your window when necessary during such operations. + * + *  On some platforms, certain callbacks may be called outside of a call to one + *  of the event processing functions. + * + *  If no windows exist, this function returns immediately.  For synchronization + *  of threads in applications that do not create windows, use your threading + *  library of choice. + * + *  Event processing is not required for joystick input to work. + * + *  @param[in] timeout The maximum amount of time, in seconds, to wait. + * + *  @reentrancy This function must not be called from a callback. + * + *  @thread_safety This function must only be called from the main thread. + * + *  @sa @ref events + *  @sa glfwPollEvents + *  @sa glfwWaitEvents + * + *  @since Added in version 3.2. + * + *  @ingroup window + */ +GLFWAPI void glfwWaitEventsTimeout(double timeout); + +/*! @brief Posts an empty event to the event queue. + * + *  This function posts an empty event from the current thread to the event + *  queue, causing @ref glfwWaitEvents to return. + * + *  If no windows exist, this function returns immediately.  For synchronization + *  of threads in applications that do not create windows, use your threading + *  library of choice. + * + *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + *  GLFW_PLATFORM_ERROR. + * + *  @thread_safety This function may be called from any thread. + * + *  @sa @ref events + *  @sa glfwWaitEvents + * + *  @since Added in version 3.1. + * + *  @ingroup window + */ +GLFWAPI void glfwPostEmptyEvent(void); + +/*! @brief Returns the value of an input option for the specified window. + * + *  This function returns the value of an input option for the specified window. + *  The mode must be one of `GLFW_CURSOR`, `GLFW_STICKY_KEYS` or + *  `GLFW_STICKY_MOUSE_BUTTONS`. + * + *  @param[in] window The window to query. + *  @param[in] mode One of `GLFW_CURSOR`, `GLFW_STICKY_KEYS` or + *  `GLFW_STICKY_MOUSE_BUTTONS`. + * + *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + *  GLFW_INVALID_ENUM. + * + *  @thread_safety This function must only be called from the main thread. + * + *  @sa glfwSetInputMode + * + *  @since Added in version 3.0. + * + *  @ingroup input + */ +GLFWAPI int glfwGetInputMode(GLFWwindow* window, int mode); + +/*! @brief Sets an input option for the specified window. + * + *  This function sets an input mode option for the specified window.  The mode + *  must be one of `GLFW_CURSOR`, `GLFW_STICKY_KEYS` or + *  `GLFW_STICKY_MOUSE_BUTTONS`. + * + *  If the mode is `GLFW_CURSOR`, the value must be one of the following cursor + *  modes: + *  - `GLFW_CURSOR_NORMAL` makes the cursor visible and behaving normally. + *  - `GLFW_CURSOR_HIDDEN` makes the cursor invisible when it is over the client + *    area of the window but does not restrict the cursor from leaving. + *  - `GLFW_CURSOR_DISABLED` hides and grabs the cursor, providing virtual + *    and unlimited cursor movement.  This is useful for implementing for + *    example 3D camera controls. + * + *  If the mode is `GLFW_STICKY_KEYS`, the value must be either `GLFW_TRUE` to + *  enable sticky keys, or `GLFW_FALSE` to disable it.  If sticky keys are + *  enabled, a key press will ensure that @ref glfwGetKey returns `GLFW_PRESS` + *  the next time it is called even if the key had been released before the + *  call.  This is useful when you are only interested in whether keys have been + *  pressed but not when or in which order. + * + *  If the mode is `GLFW_STICKY_MOUSE_BUTTONS`, the value must be either + *  `GLFW_TRUE` to enable sticky mouse buttons, or `GLFW_FALSE` to disable it. + *  If sticky mouse buttons are enabled, a mouse button press will ensure that + *  @ref glfwGetMouseButton returns `GLFW_PRESS` the next time it is called even + *  if the mouse button had been released before the call.  This is useful when + *  you are only interested in whether mouse buttons have been pressed but not + *  when or in which order. + * + *  @param[in] window The window whose input mode to set. + *  @param[in] mode One of `GLFW_CURSOR`, `GLFW_STICKY_KEYS` or + *  `GLFW_STICKY_MOUSE_BUTTONS`. + *  @param[in] value The new value of the specified input mode. + * + *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + *  GLFW_INVALID_ENUM and @ref GLFW_PLATFORM_ERROR. + * + *  @thread_safety This function must only be called from the main thread. + * + *  @sa glfwGetInputMode + * + *  @since Added in version 3.0.  Replaces `glfwEnable` and `glfwDisable`. + * + *  @ingroup input + */ +GLFWAPI void glfwSetInputMode(GLFWwindow* window, int mode, int value); + +/*! @brief Returns the localized name of the specified printable key. + * + *  This function returns the localized name of the specified printable key. + *  This is intended for displaying key bindings to the user. + * + *  If the key is `GLFW_KEY_UNKNOWN`, the scancode is used instead, otherwise + *  the scancode is ignored.  If a non-printable key or (if the key is + *  `GLFW_KEY_UNKNOWN`) a scancode that maps to a non-printable key is + *  specified, this function returns `NULL`.           + * + *  This behavior allows you to pass in the arguments passed to the + *  [key callback](@ref input_key) without modification. + * + *  The printable keys are: + *  - `GLFW_KEY_APOSTROPHE` + *  - `GLFW_KEY_COMMA` + *  - `GLFW_KEY_MINUS` + *  - `GLFW_KEY_PERIOD` + *  - `GLFW_KEY_SLASH` + *  - `GLFW_KEY_SEMICOLON` + *  - `GLFW_KEY_EQUAL` + *  - `GLFW_KEY_LEFT_BRACKET` + *  - `GLFW_KEY_RIGHT_BRACKET` + *  - `GLFW_KEY_BACKSLASH` + *  - `GLFW_KEY_WORLD_1` + *  - `GLFW_KEY_WORLD_2` + *  - `GLFW_KEY_0` to `GLFW_KEY_9` + *  - `GLFW_KEY_A` to `GLFW_KEY_Z` + *  - `GLFW_KEY_KP_0` to `GLFW_KEY_KP_9` + *  - `GLFW_KEY_KP_DECIMAL` + *  - `GLFW_KEY_KP_DIVIDE` + *  - `GLFW_KEY_KP_MULTIPLY` + *  - `GLFW_KEY_KP_SUBTRACT` + *  - `GLFW_KEY_KP_ADD` + *  - `GLFW_KEY_KP_EQUAL` + * + *  @param[in] key The key to query, or `GLFW_KEY_UNKNOWN`. + *  @param[in] scancode The scancode of the key to query. + *  @return The localized name of the key, or `NULL`. + * + *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + *  GLFW_PLATFORM_ERROR. + * + *  @pointer_lifetime The returned string is allocated and freed by GLFW.  You + *  should not free it yourself.  It is valid until the next call to @ref + *  glfwGetKeyName, or until the library is terminated. + * + *  @thread_safety This function must only be called from the main thread. + * + *  @sa @ref input_key_name + * + *  @since Added in version 3.2. + * + *  @ingroup input + */ +GLFWAPI const char* glfwGetKeyName(int key, int scancode); + +/*! @brief Returns the last reported state of a keyboard key for the specified + *  window. + * + *  This function returns the last state reported for the specified key to the + *  specified window.  The returned state is one of `GLFW_PRESS` or + *  `GLFW_RELEASE`.  The higher-level action `GLFW_REPEAT` is only reported to + *  the key callback. + * + *  If the `GLFW_STICKY_KEYS` input mode is enabled, this function returns + *  `GLFW_PRESS` the first time you call it for a key that was pressed, even if + *  that key has already been released. + * + *  The key functions deal with physical keys, with [key tokens](@ref keys) + *  named after their use on the standard US keyboard layout.  If you want to + *  input text, use the Unicode character callback instead. + * + *  The [modifier key bit masks](@ref mods) are not key tokens and cannot be + *  used with this function. + * + *  __Do not use this function__ to implement [text input](@ref input_char). + * + *  @param[in] window The desired window. + *  @param[in] key The desired [keyboard key](@ref keys).  `GLFW_KEY_UNKNOWN` is + *  not a valid key for this function. + *  @return One of `GLFW_PRESS` or `GLFW_RELEASE`. + * + *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + *  GLFW_INVALID_ENUM. + * + *  @thread_safety This function must only be called from the main thread. + * + *  @sa @ref input_key + * + *  @since Added in version 1.0. + *  @glfw3 Added window handle parameter. + * + *  @ingroup input + */ +GLFWAPI int glfwGetKey(GLFWwindow* window, int key); + +/*! @brief Returns the last reported state of a mouse button for the specified + *  window. + * + *  This function returns the last state reported for the specified mouse button + *  to the specified window.  The returned state is one of `GLFW_PRESS` or + *  `GLFW_RELEASE`. + * + *  If the `GLFW_STICKY_MOUSE_BUTTONS` input mode is enabled, this function + *  `GLFW_PRESS` the first time you call it for a mouse button that was pressed, + *  even if that mouse button has already been released. + * + *  @param[in] window The desired window. + *  @param[in] button The desired [mouse button](@ref buttons). + *  @return One of `GLFW_PRESS` or `GLFW_RELEASE`. + * + *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + *  GLFW_INVALID_ENUM. + * + *  @thread_safety This function must only be called from the main thread. + * + *  @sa @ref input_mouse_button + * + *  @since Added in version 1.0. + *  @glfw3 Added window handle parameter. + * + *  @ingroup input + */ +GLFWAPI int glfwGetMouseButton(GLFWwindow* window, int button); + +/*! @brief Retrieves the position of the cursor relative to the client area of + *  the window. + * + *  This function returns the position of the cursor, in screen coordinates, + *  relative to the upper-left corner of the client area of the specified + *  window. + * + *  If the cursor is disabled (with `GLFW_CURSOR_DISABLED`) then the cursor + *  position is unbounded and limited only by the minimum and maximum values of + *  a `double`. + * + *  The coordinate can be converted to their integer equivalents with the + *  `floor` function.  Casting directly to an integer type works for positive + *  coordinates, but fails for negative ones. + * + *  Any or all of the position arguments may be `NULL`.  If an error occurs, all + *  non-`NULL` position arguments will be set to zero. + * + *  @param[in] window The desired window. + *  @param[out] xpos Where to store the cursor x-coordinate, relative to the + *  left edge of the client area, or `NULL`. + *  @param[out] ypos Where to store the cursor y-coordinate, relative to the to + *  top edge of the client area, or `NULL`. + * + *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + *  GLFW_PLATFORM_ERROR. + * + *  @thread_safety This function must only be called from the main thread. + * + *  @sa @ref cursor_pos + *  @sa glfwSetCursorPos + * + *  @since Added in version 3.0.  Replaces `glfwGetMousePos`. + * + *  @ingroup input + */ +GLFWAPI void glfwGetCursorPos(GLFWwindow* window, double* xpos, double* ypos); + +/*! @brief Sets the position of the cursor, relative to the client area of the + *  window. + * + *  This function sets the position, in screen coordinates, of the cursor + *  relative to the upper-left corner of the client area of the specified + *  window.  The window must have input focus.  If the window does not have + *  input focus when this function is called, it fails silently. + * + *  __Do not use this function__ to implement things like camera controls.  GLFW + *  already provides the `GLFW_CURSOR_DISABLED` cursor mode that hides the + *  cursor, transparently re-centers it and provides unconstrained cursor + *  motion.  See @ref glfwSetInputMode for more information. + * + *  If the cursor mode is `GLFW_CURSOR_DISABLED` then the cursor position is + *  unconstrained and limited only by the minimum and maximum values of + *  a `double`. + * + *  @param[in] window The desired window. + *  @param[in] xpos The desired x-coordinate, relative to the left edge of the + *  client area. + *  @param[in] ypos The desired y-coordinate, relative to the top edge of the + *  client area. + * + *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + *  GLFW_PLATFORM_ERROR. + * + *  @remark @x11 Due to the asynchronous nature of X11, it may take a moment for + *  the window focus event to arrive.  This means you may not be able to set the + *  cursor position directly after window creation. + * + *  @thread_safety This function must only be called from the main thread. + * + *  @sa @ref cursor_pos + *  @sa glfwGetCursorPos + * + *  @since Added in version 3.0.  Replaces `glfwSetMousePos`. + * + *  @ingroup input + */ +GLFWAPI void glfwSetCursorPos(GLFWwindow* window, double xpos, double ypos); + +/*! @brief Creates a custom cursor. + * + *  Creates a new custom cursor image that can be set for a window with @ref + *  glfwSetCursor.  The cursor can be destroyed with @ref glfwDestroyCursor. + *  Any remaining cursors are destroyed by @ref glfwTerminate. + * + *  The pixels are 32-bit, little-endian, non-premultiplied RGBA, i.e. eight + *  bits per channel.  They are arranged canonically as packed sequential rows, + *  starting from the top-left corner. + * + *  The cursor hotspot is specified in pixels, relative to the upper-left corner + *  of the cursor image.  Like all other coordinate systems in GLFW, the X-axis + *  points to the right and the Y-axis points down. + * + *  @param[in] image The desired cursor image. + *  @param[in] xhot The desired x-coordinate, in pixels, of the cursor hotspot. + *  @param[in] yhot The desired y-coordinate, in pixels, of the cursor hotspot. + *  @return The handle of the created cursor, or `NULL` if an + *  [error](@ref error_handling) occurred. + * + *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + *  GLFW_PLATFORM_ERROR. + * + *  @pointer_lifetime The specified image data is copied before this function + *  returns. + * + *  @reentrancy This function must not be called from a callback. + * + *  @thread_safety This function must only be called from the main thread. + * + *  @sa @ref cursor_object + *  @sa glfwDestroyCursor + *  @sa glfwCreateStandardCursor + * + *  @since Added in version 3.1. + * + *  @ingroup input + */ +GLFWAPI GLFWcursor* glfwCreateCursor(const GLFWimage* image, int xhot, int yhot); + +/*! @brief Creates a cursor with a standard shape. + * + *  Returns a cursor with a [standard shape](@ref shapes), that can be set for + *  a window with @ref glfwSetCursor. + * + *  @param[in] shape One of the [standard shapes](@ref shapes). + *  @return A new cursor ready to use or `NULL` if an + *  [error](@ref error_handling) occurred. + * + *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + *  GLFW_INVALID_ENUM and @ref GLFW_PLATFORM_ERROR. + * + *  @reentrancy This function must not be called from a callback. + * + *  @thread_safety This function must only be called from the main thread. + * + *  @sa @ref cursor_object + *  @sa glfwCreateCursor + * + *  @since Added in version 3.1. + * + *  @ingroup input + */ +GLFWAPI GLFWcursor* glfwCreateStandardCursor(int shape); + +/*! @brief Destroys a cursor. + * + *  This function destroys a cursor previously created with @ref + *  glfwCreateCursor.  Any remaining cursors will be destroyed by @ref + *  glfwTerminate. + * + *  @param[in] cursor The cursor object to destroy. + * + *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + *  GLFW_PLATFORM_ERROR. + * + *  @reentrancy This function must not be called from a callback. + * + *  @thread_safety This function must only be called from the main thread. + * + *  @sa @ref cursor_object + *  @sa glfwCreateCursor + * + *  @since Added in version 3.1. + * + *  @ingroup input + */ +GLFWAPI void glfwDestroyCursor(GLFWcursor* cursor); + +/*! @brief Sets the cursor for the window. + * + *  This function sets the cursor image to be used when the cursor is over the + *  client area of the specified window.  The set cursor will only be visible + *  when the [cursor mode](@ref cursor_mode) of the window is + *  `GLFW_CURSOR_NORMAL`. + * + *  On some platforms, the set cursor may not be visible unless the window also + *  has input focus. + * + *  @param[in] window The window to set the cursor for. + *  @param[in] cursor The cursor to set, or `NULL` to switch back to the default + *  arrow cursor. + * + *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + *  GLFW_PLATFORM_ERROR. + * + *  @thread_safety This function must only be called from the main thread. + * + *  @sa @ref cursor_object + * + *  @since Added in version 3.1. + * + *  @ingroup input + */ +GLFWAPI void glfwSetCursor(GLFWwindow* window, GLFWcursor* cursor); + +/*! @brief Sets the key callback. + * + *  This function sets the key callback of the specified window, which is called + *  when a key is pressed, repeated or released. + * + *  The key functions deal with physical keys, with layout independent + *  [key tokens](@ref keys) named after their values in the standard US keyboard + *  layout.  If you want to input text, use the + *  [character callback](@ref glfwSetCharCallback) instead. + * + *  When a window loses input focus, it will generate synthetic key release + *  events for all pressed keys.  You can tell these events from user-generated + *  events by the fact that the synthetic ones are generated after the focus + *  loss event has been processed, i.e. after the + *  [window focus callback](@ref glfwSetWindowFocusCallback) has been called. + * + *  The scancode of a key is specific to that platform or sometimes even to that + *  machine.  Scancodes are intended to allow users to bind keys that don't have + *  a GLFW key token.  Such keys have `key` set to `GLFW_KEY_UNKNOWN`, their + *  state is not saved and so it cannot be queried with @ref glfwGetKey. + * + *  Sometimes GLFW needs to generate synthetic key events, in which case the + *  scancode may be zero. + * + *  @param[in] window The window whose callback to set. + *  @param[in] cbfun The new key callback, or `NULL` to remove the currently + *  set callback. + *  @return The previously set callback, or `NULL` if no callback was set or the + *  library had not been [initialized](@ref intro_init). + * + *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + *  @thread_safety This function must only be called from the main thread. + * + *  @sa @ref input_key + * + *  @since Added in version 1.0. + *  @glfw3 Added window handle parameter and return value. + * + *  @ingroup input + */ +GLFWAPI GLFWkeyfun glfwSetKeyCallback(GLFWwindow* window, GLFWkeyfun cbfun); + +/*! @brief Sets the Unicode character callback. + * + *  This function sets the character callback of the specified window, which is + *  called when a Unicode character is input. + * + *  The character callback is intended for Unicode text input.  As it deals with + *  characters, it is keyboard layout dependent, whereas the + *  [key callback](@ref glfwSetKeyCallback) is not.  Characters do not map 1:1 + *  to physical keys, as a key may produce zero, one or more characters.  If you + *  want to know whether a specific physical key was pressed or released, see + *  the key callback instead. + * + *  The character callback behaves as system text input normally does and will + *  not be called if modifier keys are held down that would prevent normal text + *  input on that platform, for example a Super (Command) key on OS X or Alt key + *  on Windows.  There is a + *  [character with modifiers callback](@ref glfwSetCharModsCallback) that + *  receives these events. + * + *  @param[in] window The window whose callback to set. + *  @param[in] cbfun The new callback, or `NULL` to remove the currently set + *  callback. + *  @return The previously set callback, or `NULL` if no callback was set or the + *  library had not been [initialized](@ref intro_init). + * + *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + *  @thread_safety This function must only be called from the main thread. + * + *  @sa @ref input_char + * + *  @since Added in version 2.4. + *  @glfw3 Added window handle parameter and return value. + * + *  @ingroup input + */ +GLFWAPI GLFWcharfun glfwSetCharCallback(GLFWwindow* window, GLFWcharfun cbfun); + +/*! @brief Sets the Unicode character with modifiers callback. + * + *  This function sets the character with modifiers callback of the specified + *  window, which is called when a Unicode character is input regardless of what + *  modifier keys are used. + * + *  The character with modifiers callback is intended for implementing custom + *  Unicode character input.  For regular Unicode text input, see the + *  [character callback](@ref glfwSetCharCallback).  Like the character + *  callback, the character with modifiers callback deals with characters and is + *  keyboard layout dependent.  Characters do not map 1:1 to physical keys, as + *  a key may produce zero, one or more characters.  If you want to know whether + *  a specific physical key was pressed or released, see the + *  [key callback](@ref glfwSetKeyCallback) instead. + * + *  @param[in] window The window whose callback to set. + *  @param[in] cbfun The new callback, or `NULL` to remove the currently set + *  callback. + *  @return The previously set callback, or `NULL` if no callback was set or an + *  error occurred. + * + *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + *  @thread_safety This function must only be called from the main thread. + * + *  @sa @ref input_char + * + *  @since Added in version 3.1. + * + *  @ingroup input + */ +GLFWAPI GLFWcharmodsfun glfwSetCharModsCallback(GLFWwindow* window, GLFWcharmodsfun cbfun); + +/*! @brief Sets the mouse button callback. + * + *  This function sets the mouse button callback of the specified window, which + *  is called when a mouse button is pressed or released. + * + *  When a window loses input focus, it will generate synthetic mouse button + *  release events for all pressed mouse buttons.  You can tell these events + *  from user-generated events by the fact that the synthetic ones are generated + *  after the focus loss event has been processed, i.e. after the + *  [window focus callback](@ref glfwSetWindowFocusCallback) has been called. + * + *  @param[in] window The window whose callback to set. + *  @param[in] cbfun The new callback, or `NULL` to remove the currently set + *  callback. + *  @return The previously set callback, or `NULL` if no callback was set or the + *  library had not been [initialized](@ref intro_init). + * + *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + *  @thread_safety This function must only be called from the main thread. + * + *  @sa @ref input_mouse_button + * + *  @since Added in version 1.0. + *  @glfw3 Added window handle parameter and return value. + * + *  @ingroup input + */ +GLFWAPI GLFWmousebuttonfun glfwSetMouseButtonCallback(GLFWwindow* window, GLFWmousebuttonfun cbfun); + +/*! @brief Sets the cursor position callback. + * + *  This function sets the cursor position callback of the specified window, + *  which is called when the cursor is moved.  The callback is provided with the + *  position, in screen coordinates, relative to the upper-left corner of the + *  client area of the window. + * + *  @param[in] window The window whose callback to set. + *  @param[in] cbfun The new callback, or `NULL` to remove the currently set + *  callback. + *  @return The previously set callback, or `NULL` if no callback was set or the + *  library had not been [initialized](@ref intro_init). + * + *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + *  @thread_safety This function must only be called from the main thread. + * + *  @sa @ref cursor_pos + * + *  @since Added in version 3.0.  Replaces `glfwSetMousePosCallback`. + * + *  @ingroup input + */ +GLFWAPI GLFWcursorposfun glfwSetCursorPosCallback(GLFWwindow* window, GLFWcursorposfun cbfun); + +/*! @brief Sets the cursor enter/exit callback. + * + *  This function sets the cursor boundary crossing callback of the specified + *  window, which is called when the cursor enters or leaves the client area of + *  the window. + * + *  @param[in] window The window whose callback to set. + *  @param[in] cbfun The new callback, or `NULL` to remove the currently set + *  callback. + *  @return The previously set callback, or `NULL` if no callback was set or the + *  library had not been [initialized](@ref intro_init). + * + *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + *  @thread_safety This function must only be called from the main thread. + * + *  @sa @ref cursor_enter + * + *  @since Added in version 3.0. + * + *  @ingroup input + */ +GLFWAPI GLFWcursorenterfun glfwSetCursorEnterCallback(GLFWwindow* window, GLFWcursorenterfun cbfun); + +/*! @brief Sets the scroll callback. + * + *  This function sets the scroll callback of the specified window, which is + *  called when a scrolling device is used, such as a mouse wheel or scrolling + *  area of a touchpad. + * + *  The scroll callback receives all scrolling input, like that from a mouse + *  wheel or a touchpad scrolling area. + * + *  @param[in] window The window whose callback to set. + *  @param[in] cbfun The new scroll callback, or `NULL` to remove the currently + *  set callback. + *  @return The previously set callback, or `NULL` if no callback was set or the + *  library had not been [initialized](@ref intro_init). + * + *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + *  @thread_safety This function must only be called from the main thread. + * + *  @sa @ref scrolling + * + *  @since Added in version 3.0.  Replaces `glfwSetMouseWheelCallback`. + * + *  @ingroup input + */ +GLFWAPI GLFWscrollfun glfwSetScrollCallback(GLFWwindow* window, GLFWscrollfun cbfun); + +/*! @brief Sets the file drop callback. + * + *  This function sets the file drop callback of the specified window, which is + *  called when one or more dragged files are dropped on the window. + * + *  Because the path array and its strings may have been generated specifically + *  for that event, they are not guaranteed to be valid after the callback has + *  returned.  If you wish to use them after the callback returns, you need to + *  make a deep copy. + * + *  @param[in] window The window whose callback to set. + *  @param[in] cbfun The new file drop callback, or `NULL` to remove the + *  currently set callback. + *  @return The previously set callback, or `NULL` if no callback was set or the + *  library had not been [initialized](@ref intro_init). + * + *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + *  @thread_safety This function must only be called from the main thread. + * + *  @sa @ref path_drop + * + *  @since Added in version 3.1. + * + *  @ingroup input + */ +GLFWAPI GLFWdropfun glfwSetDropCallback(GLFWwindow* window, GLFWdropfun cbfun); + +/*! @brief Returns whether the specified joystick is present. + * + *  This function returns whether the specified joystick is present. + * + *  @param[in] joy The [joystick](@ref joysticks) to query. + *  @return `GLFW_TRUE` if the joystick is present, or `GLFW_FALSE` otherwise. + * + *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + *  GLFW_INVALID_ENUM and @ref GLFW_PLATFORM_ERROR. + * + *  @thread_safety This function must only be called from the main thread. + * + *  @sa @ref joystick + * + *  @since Added in version 3.0.  Replaces `glfwGetJoystickParam`. + * + *  @ingroup input + */ +GLFWAPI int glfwJoystickPresent(int joy); + +/*! @brief Returns the values of all axes of the specified joystick. + * + *  This function returns the values of all axes of the specified joystick. + *  Each element in the array is a value between -1.0 and 1.0. + * + *  Querying a joystick slot with no device present is not an error, but will + *  cause this function to return `NULL`.  Call @ref glfwJoystickPresent to + *  check device presence. + * + *  @param[in] joy The [joystick](@ref joysticks) to query. + *  @param[out] count Where to store the number of axis values in the returned + *  array.  This is set to zero if an error occurred. + *  @return An array of axis values, or `NULL` if the joystick is not present. + * + *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + *  GLFW_INVALID_ENUM and @ref GLFW_PLATFORM_ERROR. + * + *  @pointer_lifetime The returned array is allocated and freed by GLFW.  You + *  should not free it yourself.  It is valid until the specified joystick is + *  disconnected, this function is called again for that joystick or the library + *  is terminated. + * + *  @thread_safety This function must only be called from the main thread. + * + *  @sa @ref joystick_axis + * + *  @since Added in version 3.0.  Replaces `glfwGetJoystickPos`. + * + *  @ingroup input + */ +GLFWAPI const float* glfwGetJoystickAxes(int joy, int* count); + +/*! @brief Returns the state of all buttons of the specified joystick. + * + *  This function returns the state of all buttons of the specified joystick. + *  Each element in the array is either `GLFW_PRESS` or `GLFW_RELEASE`. + * + *  Querying a joystick slot with no device present is not an error, but will + *  cause this function to return `NULL`.  Call @ref glfwJoystickPresent to + *  check device presence. + * + *  @param[in] joy The [joystick](@ref joysticks) to query. + *  @param[out] count Where to store the number of button states in the returned + *  array.  This is set to zero if an error occurred. + *  @return An array of button states, or `NULL` if the joystick is not present. + * + *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + *  GLFW_INVALID_ENUM and @ref GLFW_PLATFORM_ERROR. + * + *  @pointer_lifetime The returned array is allocated and freed by GLFW.  You + *  should not free it yourself.  It is valid until the specified joystick is + *  disconnected, this function is called again for that joystick or the library + *  is terminated. + * + *  @thread_safety This function must only be called from the main thread. + * + *  @sa @ref joystick_button + * + *  @since Added in version 2.2. + *  @glfw3 Changed to return a dynamic array. + * + *  @ingroup input + */ +GLFWAPI const unsigned char* glfwGetJoystickButtons(int joy, int* count); + +/*! @brief Returns the name of the specified joystick. + * + *  This function returns the name, encoded as UTF-8, of the specified joystick. + *  The returned string is allocated and freed by GLFW.  You should not free it + *  yourself. + * + *  Querying a joystick slot with no device present is not an error, but will + *  cause this function to return `NULL`.  Call @ref glfwJoystickPresent to + *  check device presence. + * + *  @param[in] joy The [joystick](@ref joysticks) to query. + *  @return The UTF-8 encoded name of the joystick, or `NULL` if the joystick + *  is not present. + * + *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + *  GLFW_INVALID_ENUM and @ref GLFW_PLATFORM_ERROR. + * + *  @pointer_lifetime The returned string is allocated and freed by GLFW.  You + *  should not free it yourself.  It is valid until the specified joystick is + *  disconnected, this function is called again for that joystick or the library + *  is terminated. + * + *  @thread_safety This function must only be called from the main thread. + * + *  @sa @ref joystick_name + * + *  @since Added in version 3.0. + * + *  @ingroup input + */ +GLFWAPI const char* glfwGetJoystickName(int joy); + +/*! @brief Sets the joystick configuration callback. + * + *  This function sets the joystick configuration callback, or removes the + *  currently set callback.  This is called when a joystick is connected to or + *  disconnected from the system. + * + *  @param[in] cbfun The new callback, or `NULL` to remove the currently set + *  callback. + *  @return The previously set callback, or `NULL` if no callback was set or the + *  library had not been [initialized](@ref intro_init). + * + *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + *  @thread_safety This function must only be called from the main thread. + * + *  @sa @ref joystick_event + * + *  @since Added in version 3.2. + * + *  @ingroup input + */ +GLFWAPI GLFWjoystickfun glfwSetJoystickCallback(GLFWjoystickfun cbfun); + +/*! @brief Sets the clipboard to the specified string. + * + *  This function sets the system clipboard to the specified, UTF-8 encoded + *  string. + * + *  @param[in] window The window that will own the clipboard contents. + *  @param[in] string A UTF-8 encoded string. + * + *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + *  GLFW_PLATFORM_ERROR. + * + *  @pointer_lifetime The specified string is copied before this function + *  returns. + * + *  @thread_safety This function must only be called from the main thread. + * + *  @sa @ref clipboard + *  @sa glfwGetClipboardString + * + *  @since Added in version 3.0. + * + *  @ingroup input + */ +GLFWAPI void glfwSetClipboardString(GLFWwindow* window, const char* string); + +/*! @brief Returns the contents of the clipboard as a string. + * + *  This function returns the contents of the system clipboard, if it contains + *  or is convertible to a UTF-8 encoded string.  If the clipboard is empty or + *  if its contents cannot be converted, `NULL` is returned and a @ref + *  GLFW_FORMAT_UNAVAILABLE error is generated. + * + *  @param[in] window The window that will request the clipboard contents. + *  @return The contents of the clipboard as a UTF-8 encoded string, or `NULL` + *  if an [error](@ref error_handling) occurred. + * + *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + *  GLFW_PLATFORM_ERROR. + * + *  @pointer_lifetime The returned string is allocated and freed by GLFW.  You + *  should not free it yourself.  It is valid until the next call to @ref + *  glfwGetClipboardString or @ref glfwSetClipboardString, or until the library + *  is terminated. + * + *  @thread_safety This function must only be called from the main thread. + * + *  @sa @ref clipboard + *  @sa glfwSetClipboardString + * + *  @since Added in version 3.0. + * + *  @ingroup input + */ +GLFWAPI const char* glfwGetClipboardString(GLFWwindow* window); + +/*! @brief Returns the value of the GLFW timer. + * + *  This function returns the value of the GLFW timer.  Unless the timer has + *  been set using @ref glfwSetTime, the timer measures time elapsed since GLFW + *  was initialized. + * + *  The resolution of the timer is system dependent, but is usually on the order + *  of a few micro- or nanoseconds.  It uses the highest-resolution monotonic + *  time source on each supported platform. + * + *  @return The current value, in seconds, or zero if an + *  [error](@ref error_handling) occurred. + * + *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + *  @thread_safety This function may be called from any thread.  Reading of the + *  internal timer offset is not atomic. + * + *  @sa @ref time + * + *  @since Added in version 1.0. + * + *  @ingroup input + */ +GLFWAPI double glfwGetTime(void); + +/*! @brief Sets the GLFW timer. + * + *  This function sets the value of the GLFW timer.  It then continues to count + *  up from that value.  The value must be a positive finite number less than + *  or equal to 18446744073.0, which is approximately 584.5 years. + * + *  @param[in] time The new value, in seconds. + * + *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + *  GLFW_INVALID_VALUE. + * + *  @remark The upper limit of the timer is calculated as + *  floor((2<sup>64</sup> - 1) / 10<sup>9</sup>) and is due to implementations + *  storing nanoseconds in 64 bits.  The limit may be increased in the future. + * + *  @thread_safety This function may be called from any thread.  Writing of the + *  internal timer offset is not atomic. + * + *  @sa @ref time + * + *  @since Added in version 2.2. + * + *  @ingroup input + */ +GLFWAPI void glfwSetTime(double time); + +/*! @brief Returns the current value of the raw timer. + * + *  This function returns the current value of the raw timer, measured in + *  1 / frequency seconds.  To get the frequency, call @ref + *  glfwGetTimerFrequency. + * + *  @return The value of the timer, or zero if an  + *  [error](@ref error_handling) occurred. + * + *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + *  @thread_safety This function may be called from any thread. + * + *  @sa @ref time + *  @sa glfwGetTimerFrequency + * + *  @since Added in version 3.2. + * + *  @ingroup input + */ +GLFWAPI uint64_t glfwGetTimerValue(void); + +/*! @brief Returns the frequency, in Hz, of the raw timer. + * + *  This function returns the frequency, in Hz, of the raw timer. + * + *  @return The frequency of the timer, in Hz, or zero if an + *  [error](@ref error_handling) occurred. + * + *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + *  @thread_safety This function may be called from any thread. + * + *  @sa @ref time + *  @sa glfwGetTimerValue + * + *  @since Added in version 3.2. + * + *  @ingroup input + */ +GLFWAPI uint64_t glfwGetTimerFrequency(void); + +/*! @brief Makes the context of the specified window current for the calling + *  thread. + * + *  This function makes the OpenGL or OpenGL ES context of the specified window + *  current on the calling thread.  A context can only be made current on + *  a single thread at a time and each thread can have only a single current + *  context at a time. + * + *  By default, making a context non-current implicitly forces a pipeline flush. + *  On machines that support `GL_KHR_context_flush_control`, you can control + *  whether a context performs this flush by setting the + *  [GLFW_CONTEXT_RELEASE_BEHAVIOR](@ref window_hints_ctx) window hint. + * + *  The specified window must have an OpenGL or OpenGL ES context.  Specifying + *  a window without a context will generate a @ref GLFW_NO_WINDOW_CONTEXT + *  error. + * + *  @param[in] window The window whose context to make current, or `NULL` to + *  detach the current context. + * + *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + *  GLFW_NO_WINDOW_CONTEXT and @ref GLFW_PLATFORM_ERROR. + * + *  @thread_safety This function may be called from any thread. + * + *  @sa @ref context_current + *  @sa glfwGetCurrentContext + * + *  @since Added in version 3.0. + * + *  @ingroup context + */ +GLFWAPI void glfwMakeContextCurrent(GLFWwindow* window); + +/*! @brief Returns the window whose context is current on the calling thread. + * + *  This function returns the window whose OpenGL or OpenGL ES context is + *  current on the calling thread. + * + *  @return The window whose context is current, or `NULL` if no window's + *  context is current. + * + *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + *  @thread_safety This function may be called from any thread. + * + *  @sa @ref context_current + *  @sa glfwMakeContextCurrent + * + *  @since Added in version 3.0. + * + *  @ingroup context + */ +GLFWAPI GLFWwindow* glfwGetCurrentContext(void); + +/*! @brief Swaps the front and back buffers of the specified window. + * + *  This function swaps the front and back buffers of the specified window when + *  rendering with OpenGL or OpenGL ES.  If the swap interval is greater than + *  zero, the GPU driver waits the specified number of screen updates before + *  swapping the buffers. + * + *  The specified window must have an OpenGL or OpenGL ES context.  Specifying + *  a window without a context will generate a @ref GLFW_NO_WINDOW_CONTEXT + *  error. + * + *  This function does not apply to Vulkan.  If you are rendering with Vulkan, + *  see `vkQueuePresentKHR` instead. + * + *  @param[in] window The window whose buffers to swap. + * + *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + *  GLFW_NO_WINDOW_CONTEXT and @ref GLFW_PLATFORM_ERROR. + * + *  @remark __EGL:__ The context of the specified window must be current on the + *  calling thread. + * + *  @thread_safety This function may be called from any thread. + * + *  @sa @ref buffer_swap + *  @sa glfwSwapInterval + * + *  @since Added in version 1.0. + *  @glfw3 Added window handle parameter. + * + *  @ingroup window + */ +GLFWAPI void glfwSwapBuffers(GLFWwindow* window); + +/*! @brief Sets the swap interval for the current context. + * + *  This function sets the swap interval for the current OpenGL or OpenGL ES + *  context, i.e. the number of screen updates to wait from the time @ref + *  glfwSwapBuffers was called before swapping the buffers and returning.  This + *  is sometimes called _vertical synchronization_, _vertical retrace + *  synchronization_ or just _vsync_. + * + *  Contexts that support either of the `WGL_EXT_swap_control_tear` and + *  `GLX_EXT_swap_control_tear` extensions also accept negative swap intervals, + *  which allow the driver to swap even if a frame arrives a little bit late. + *  You can check for the presence of these extensions using @ref + *  glfwExtensionSupported.  For more information about swap tearing, see the + *  extension specifications. + * + *  A context must be current on the calling thread.  Calling this function + *  without a current context will cause a @ref GLFW_NO_CURRENT_CONTEXT error. + * + *  This function does not apply to Vulkan.  If you are rendering with Vulkan, + *  see the present mode of your swapchain instead. + * + *  @param[in] interval The minimum number of screen updates to wait for + *  until the buffers are swapped by @ref glfwSwapBuffers. + * + *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + *  GLFW_NO_CURRENT_CONTEXT and @ref GLFW_PLATFORM_ERROR. + * + *  @remark This function is not called during context creation, leaving the + *  swap interval set to whatever is the default on that platform.  This is done + *  because some swap interval extensions used by GLFW do not allow the swap + *  interval to be reset to zero once it has been set to a non-zero value. + * + *  @remark Some GPU drivers do not honor the requested swap interval, either + *  because of a user setting that overrides the application's request or due to + *  bugs in the driver. + * + *  @thread_safety This function may be called from any thread. + * + *  @sa @ref buffer_swap + *  @sa glfwSwapBuffers + * + *  @since Added in version 1.0. + * + *  @ingroup context + */ +GLFWAPI void glfwSwapInterval(int interval); + +/*! @brief Returns whether the specified extension is available. + * + *  This function returns whether the specified + *  [API extension](@ref context_glext) is supported by the current OpenGL or + *  OpenGL ES context.  It searches both for client API extension and context + *  creation API extensions. + * + *  A context must be current on the calling thread.  Calling this function + *  without a current context will cause a @ref GLFW_NO_CURRENT_CONTEXT error. + * + *  As this functions retrieves and searches one or more extension strings each + *  call, it is recommended that you cache its results if it is going to be used + *  frequently.  The extension strings will not change during the lifetime of + *  a context, so there is no danger in doing this. + * + *  This function does not apply to Vulkan.  If you are using Vulkan, see @ref + *  glfwGetRequiredInstanceExtensions, `vkEnumerateInstanceExtensionProperties` + *  and `vkEnumerateDeviceExtensionProperties` instead. + * + *  @param[in] extension The ASCII encoded name of the extension. + *  @return `GLFW_TRUE` if the extension is available, or `GLFW_FALSE` + *  otherwise. + * + *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + *  GLFW_NO_CURRENT_CONTEXT, @ref GLFW_INVALID_VALUE and @ref + *  GLFW_PLATFORM_ERROR. + * + *  @thread_safety This function may be called from any thread. + * + *  @sa @ref context_glext + *  @sa glfwGetProcAddress + * + *  @since Added in version 1.0. + * + *  @ingroup context + */ +GLFWAPI int glfwExtensionSupported(const char* extension); + +/*! @brief Returns the address of the specified function for the current + *  context. + * + *  This function returns the address of the specified OpenGL or OpenGL ES + *  [core or extension function](@ref context_glext), if it is supported + *  by the current context. + * + *  A context must be current on the calling thread.  Calling this function + *  without a current context will cause a @ref GLFW_NO_CURRENT_CONTEXT error. + * + *  This function does not apply to Vulkan.  If you are rendering with Vulkan, + *  see @ref glfwGetInstanceProcAddress, `vkGetInstanceProcAddr` and + *  `vkGetDeviceProcAddr` instead. + * + *  @param[in] procname The ASCII encoded name of the function. + *  @return The address of the function, or `NULL` if an + *  [error](@ref error_handling) occurred. + * + *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + *  GLFW_NO_CURRENT_CONTEXT and @ref GLFW_PLATFORM_ERROR. + * + *  @remark The address of a given function is not guaranteed to be the same + *  between contexts. + * + *  @remark This function may return a non-`NULL` address despite the + *  associated version or extension not being available.  Always check the + *  context version or extension string first. + * + *  @pointer_lifetime The returned function pointer is valid until the context + *  is destroyed or the library is terminated. + * + *  @thread_safety This function may be called from any thread. + * + *  @sa @ref context_glext + *  @sa glfwExtensionSupported + * + *  @since Added in version 1.0. + * + *  @ingroup context + */ +GLFWAPI GLFWglproc glfwGetProcAddress(const char* procname); + +/*! @brief Returns whether the Vulkan loader has been found. + * + *  This function returns whether the Vulkan loader has been found.  This check + *  is performed by @ref glfwInit. + * + *  The availability of a Vulkan loader does not by itself guarantee that window + *  surface creation or even device creation is possible.  Call @ref + *  glfwGetRequiredInstanceExtensions to check whether the extensions necessary + *  for Vulkan surface creation are available and @ref + *  glfwGetPhysicalDevicePresentationSupport to check whether a queue family of + *  a physical device supports image presentation. + * + *  @return `GLFW_TRUE` if Vulkan is available, or `GLFW_FALSE` otherwise. + * + *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + *  @thread_safety This function may be called from any thread. + * + *  @sa @ref vulkan_support + * + *  @since Added in version 3.2. + * + *  @ingroup vulkan + */ +GLFWAPI int glfwVulkanSupported(void); + +/*! @brief Returns the Vulkan instance extensions required by GLFW. + * + *  This function returns an array of names of Vulkan instance extensions required + *  by GLFW for creating Vulkan surfaces for GLFW windows.  If successful, the + *  list will always contains `VK_KHR_surface`, so if you don't require any + *  additional extensions you can pass this list directly to the + *  `VkInstanceCreateInfo` struct. + * + *  If Vulkan is not available on the machine, this function returns `NULL` and + *  generates a @ref GLFW_API_UNAVAILABLE error.  Call @ref glfwVulkanSupported + *  to check whether Vulkan is available. + * + *  If Vulkan is available but no set of extensions allowing window surface + *  creation was found, this function returns `NULL`.  You may still use Vulkan + *  for off-screen rendering and compute work. + * + *  @param[out] count Where to store the number of extensions in the returned + *  array.  This is set to zero if an error occurred. + *  @return An array of ASCII encoded extension names, or `NULL` if an + *  [error](@ref error_handling) occurred. + * + *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + *  GLFW_API_UNAVAILABLE. + * + *  @remarks Additional extensions may be required by future versions of GLFW. + *  You should check if any extensions you wish to enable are already in the + *  returned array, as it is an error to specify an extension more than once in + *  the `VkInstanceCreateInfo` struct. + * + *  @pointer_lifetime The returned array is allocated and freed by GLFW.  You + *  should not free it yourself.  It is guaranteed to be valid only until the + *  library is terminated. + * + *  @thread_safety This function may be called from any thread. + * + *  @sa @ref vulkan_ext + *  @sa glfwCreateWindowSurface + * + *  @since Added in version 3.2. + * + *  @ingroup vulkan + */ +GLFWAPI const char** glfwGetRequiredInstanceExtensions(uint32_t* count); + +#if defined(VK_VERSION_1_0) + +/*! @brief Returns the address of the specified Vulkan instance function. + * + *  This function returns the address of the specified Vulkan core or extension + *  function for the specified instance.  If instance is set to `NULL` it can + *  return any function exported from the Vulkan loader, including at least the + *  following functions: + * + *  - `vkEnumerateInstanceExtensionProperties` + *  - `vkEnumerateInstanceLayerProperties` + *  - `vkCreateInstance` + *  - `vkGetInstanceProcAddr` + * + *  If Vulkan is not available on the machine, this function returns `NULL` and + *  generates a @ref GLFW_API_UNAVAILABLE error.  Call @ref glfwVulkanSupported + *  to check whether Vulkan is available. + * + *  This function is equivalent to calling `vkGetInstanceProcAddr` with + *  a platform-specific query of the Vulkan loader as a fallback. + * + *  @param[in] instance The Vulkan instance to query, or `NULL` to retrieve + *  functions related to instance creation. + *  @param[in] procname The ASCII encoded name of the function. + *  @return The address of the function, or `NULL` if an + *  [error](@ref error_handling) occurred. + * + *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + *  GLFW_API_UNAVAILABLE. + * + *  @pointer_lifetime The returned function pointer is valid until the library + *  is terminated. + * + *  @thread_safety This function may be called from any thread. + * + *  @sa @ref vulkan_proc + * + *  @since Added in version 3.2. + * + *  @ingroup vulkan + */ +GLFWAPI GLFWvkproc glfwGetInstanceProcAddress(VkInstance instance, const char* procname); + +/*! @brief Returns whether the specified queue family can present images. + * + *  This function returns whether the specified queue family of the specified + *  physical device supports presentation to the platform GLFW was built for. + * + *  If Vulkan or the required window surface creation instance extensions are + *  not available on the machine, or if the specified instance was not created + *  with the required extensions, this function returns `GLFW_FALSE` and + *  generates a @ref GLFW_API_UNAVAILABLE error.  Call @ref glfwVulkanSupported + *  to check whether Vulkan is available and @ref + *  glfwGetRequiredInstanceExtensions to check what instance extensions are + *  required. + * + *  @param[in] instance The instance that the physical device belongs to. + *  @param[in] device The physical device that the queue family belongs to. + *  @param[in] queuefamily The index of the queue family to query. + *  @return `GLFW_TRUE` if the queue family supports presentation, or + *  `GLFW_FALSE` otherwise. + * + *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + *  GLFW_API_UNAVAILABLE and @ref GLFW_PLATFORM_ERROR. + * + *  @thread_safety This function may be called from any thread.  For + *  synchronization details of Vulkan objects, see the Vulkan specification. + * + *  @sa @ref vulkan_present + * + *  @since Added in version 3.2. + * + *  @ingroup vulkan + */ +GLFWAPI int glfwGetPhysicalDevicePresentationSupport(VkInstance instance, VkPhysicalDevice device, uint32_t queuefamily); + +/*! @brief Creates a Vulkan surface for the specified window. + * + *  This function creates a Vulkan surface for the specified window. + * + *  If the Vulkan loader was not found at initialization, this function returns + *  `VK_ERROR_INITIALIZATION_FAILED` and generates a @ref GLFW_API_UNAVAILABLE + *  error.  Call @ref glfwVulkanSupported to check whether the Vulkan loader was + *  found. + * + *  If the required window surface creation instance extensions are not + *  available or if the specified instance was not created with these extensions + *  enabled, this function returns `VK_ERROR_EXTENSION_NOT_PRESENT` and + *  generates a @ref GLFW_API_UNAVAILABLE error.  Call @ref + *  glfwGetRequiredInstanceExtensions to check what instance extensions are + *  required. + * + *  The window surface must be destroyed before the specified Vulkan instance. + *  It is the responsibility of the caller to destroy the window surface.  GLFW + *  does not destroy it for you.  Call `vkDestroySurfaceKHR` to destroy the + *  surface. + * + *  @param[in] instance The Vulkan instance to create the surface in. + *  @param[in] window The window to create the surface for. + *  @param[in] allocator The allocator to use, or `NULL` to use the default + *  allocator. + *  @param[out] surface Where to store the handle of the surface.  This is set + *  to `VK_NULL_HANDLE` if an error occurred. + *  @return `VK_SUCCESS` if successful, or a Vulkan error code if an + *  [error](@ref error_handling) occurred. + * + *  @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + *  GLFW_API_UNAVAILABLE and @ref GLFW_PLATFORM_ERROR. + * + *  @remarks If an error occurs before the creation call is made, GLFW returns + *  the Vulkan error code most appropriate for the error.  Appropriate use of + *  @ref glfwVulkanSupported and @ref glfwGetRequiredInstanceExtensions should + *  eliminate almost all occurrences of these errors. + * + *  @thread_safety This function may be called from any thread.  For + *  synchronization details of Vulkan objects, see the Vulkan specification. + * + *  @sa @ref vulkan_surface + *  @sa glfwGetRequiredInstanceExtensions + * + *  @since Added in version 3.2. + * + *  @ingroup vulkan + */ +GLFWAPI VkResult glfwCreateWindowSurface(VkInstance instance, GLFWwindow* window, const VkAllocationCallbacks* allocator, VkSurfaceKHR* surface); + +#endif /*VK_VERSION_1_0*/ + + +/************************************************************************* + * Global definition cleanup + *************************************************************************/ + +/* ------------------- BEGIN SYSTEM/COMPILER SPECIFIC -------------------- */ + +#ifdef GLFW_WINGDIAPI_DEFINED + #undef WINGDIAPI + #undef GLFW_WINGDIAPI_DEFINED +#endif + +#ifdef GLFW_CALLBACK_DEFINED + #undef CALLBACK + #undef GLFW_CALLBACK_DEFINED +#endif + +/* -------------------- END SYSTEM/COMPILER SPECIFIC --------------------- */ + + +#ifdef __cplusplus +} +#endif + +#endif /* _glfw3_h_ */ + diff --git a/lib/imgui-1.90.7/examples/libs/glfw/include/GLFW/glfw3native.h b/lib/imgui-1.90.7/examples/libs/glfw/include/GLFW/glfw3native.h new file mode 100644 index 0000000..9fa955e --- /dev/null +++ b/lib/imgui-1.90.7/examples/libs/glfw/include/GLFW/glfw3native.h @@ -0,0 +1,456 @@ +/************************************************************************* + * GLFW 3.2 - www.glfw.org + * A library for OpenGL, window and input + *------------------------------------------------------------------------ + * Copyright (c) 2002-2006 Marcus Geelnard + * Copyright (c) 2006-2010 Camilla Berglund <elmindreda@elmindreda.org> + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + *    claim that you wrote the original software. If you use this software + *    in a product, an acknowledgment in the product documentation would + *    be appreciated but is not required. + * + * 2. Altered source versions must be plainly marked as such, and must not + *    be misrepresented as being the original software. + * + * 3. This notice may not be removed or altered from any source + *    distribution. + * + *************************************************************************/ + +#ifndef _glfw3_native_h_ +#define _glfw3_native_h_ + +#ifdef __cplusplus +extern "C" { +#endif + + +/************************************************************************* + * Doxygen documentation + *************************************************************************/ + +/*! @file glfw3native.h + *  @brief The header of the native access functions. + * + *  This is the header file of the native access functions.  See @ref native for + *  more information. + */ +/*! @defgroup native Native access + * + *  **By using the native access functions you assert that you know what you're + *  doing and how to fix problems caused by using them.  If you don't, you + *  shouldn't be using them.** + * + *  Before the inclusion of @ref glfw3native.h, you may define exactly one + *  window system API macro and zero or more context creation API macros. + * + *  The chosen backends must match those the library was compiled for.  Failure + *  to do this will cause a link-time error. + * + *  The available window API macros are: + *  * `GLFW_EXPOSE_NATIVE_WIN32` + *  * `GLFW_EXPOSE_NATIVE_COCOA` + *  * `GLFW_EXPOSE_NATIVE_X11` + *  * `GLFW_EXPOSE_NATIVE_WAYLAND` + *  * `GLFW_EXPOSE_NATIVE_MIR` + * + *  The available context API macros are: + *  * `GLFW_EXPOSE_NATIVE_WGL` + *  * `GLFW_EXPOSE_NATIVE_NSGL` + *  * `GLFW_EXPOSE_NATIVE_GLX` + *  * `GLFW_EXPOSE_NATIVE_EGL` + * + *  These macros select which of the native access functions that are declared + *  and which platform-specific headers to include.  It is then up your (by + *  definition platform-specific) code to handle which of these should be + *  defined. + */ + + +/************************************************************************* + * System headers and types + *************************************************************************/ + +#if defined(GLFW_EXPOSE_NATIVE_WIN32) + // This is a workaround for the fact that glfw3.h needs to export APIENTRY (for + // example to allow applications to correctly declare a GL_ARB_debug_output + // callback) but windows.h assumes no one will define APIENTRY before it does + #undef APIENTRY + #include <windows.h> +#elif defined(GLFW_EXPOSE_NATIVE_COCOA) + #include <ApplicationServices/ApplicationServices.h> + #if defined(__OBJC__) +  #import <Cocoa/Cocoa.h> + #else +  typedef void* id; + #endif +#elif defined(GLFW_EXPOSE_NATIVE_X11) + #include <X11/Xlib.h> + #include <X11/extensions/Xrandr.h> +#elif defined(GLFW_EXPOSE_NATIVE_WAYLAND) + #include <wayland-client.h> +#elif defined(GLFW_EXPOSE_NATIVE_MIR) + #include <mir_toolkit/mir_client_library.h> +#endif + +#if defined(GLFW_EXPOSE_NATIVE_WGL) + /* WGL is declared by windows.h */ +#endif +#if defined(GLFW_EXPOSE_NATIVE_NSGL) + /* NSGL is declared by Cocoa.h */ +#endif +#if defined(GLFW_EXPOSE_NATIVE_GLX) + #include <GL/glx.h> +#endif +#if defined(GLFW_EXPOSE_NATIVE_EGL) + #include <EGL/egl.h> +#endif + + +/************************************************************************* + * Functions + *************************************************************************/ + +#if defined(GLFW_EXPOSE_NATIVE_WIN32) +/*! @brief Returns the adapter device name of the specified monitor. + * + *  @return The UTF-8 encoded adapter device name (for example `\\.\DISPLAY1`) + *  of the specified monitor, or `NULL` if an [error](@ref error_handling) + *  occurred. + * + *  @thread_safety This function may be called from any thread.  Access is not + *  synchronized. + * + *  @since Added in version 3.1. + * + *  @ingroup native + */ +GLFWAPI const char* glfwGetWin32Adapter(GLFWmonitor* monitor); + +/*! @brief Returns the display device name of the specified monitor. + * + *  @return The UTF-8 encoded display device name (for example + *  `\\.\DISPLAY1\Monitor0`) of the specified monitor, or `NULL` if an + *  [error](@ref error_handling) occurred. + * + *  @thread_safety This function may be called from any thread.  Access is not + *  synchronized. + * + *  @since Added in version 3.1. + * + *  @ingroup native + */ +GLFWAPI const char* glfwGetWin32Monitor(GLFWmonitor* monitor); + +/*! @brief Returns the `HWND` of the specified window. + * + *  @return The `HWND` of the specified window, or `NULL` if an + *  [error](@ref error_handling) occurred. + * + *  @thread_safety This function may be called from any thread.  Access is not + *  synchronized. + * + *  @since Added in version 3.0. + * + *  @ingroup native + */ +GLFWAPI HWND glfwGetWin32Window(GLFWwindow* window); +#endif + +#if defined(GLFW_EXPOSE_NATIVE_WGL) +/*! @brief Returns the `HGLRC` of the specified window. + * + *  @return The `HGLRC` of the specified window, or `NULL` if an + *  [error](@ref error_handling) occurred. + * + *  @thread_safety This function may be called from any thread.  Access is not + *  synchronized. + * + *  @since Added in version 3.0. + * + *  @ingroup native + */ +GLFWAPI HGLRC glfwGetWGLContext(GLFWwindow* window); +#endif + +#if defined(GLFW_EXPOSE_NATIVE_COCOA) +/*! @brief Returns the `CGDirectDisplayID` of the specified monitor. + * + *  @return The `CGDirectDisplayID` of the specified monitor, or + *  `kCGNullDirectDisplay` if an [error](@ref error_handling) occurred. + * + *  @thread_safety This function may be called from any thread.  Access is not + *  synchronized. + * + *  @since Added in version 3.1. + * + *  @ingroup native + */ +GLFWAPI CGDirectDisplayID glfwGetCocoaMonitor(GLFWmonitor* monitor); + +/*! @brief Returns the `NSWindow` of the specified window. + * + *  @return The `NSWindow` of the specified window, or `nil` if an + *  [error](@ref error_handling) occurred. + * + *  @thread_safety This function may be called from any thread.  Access is not + *  synchronized. + * + *  @since Added in version 3.0. + * + *  @ingroup native + */ +GLFWAPI id glfwGetCocoaWindow(GLFWwindow* window); +#endif + +#if defined(GLFW_EXPOSE_NATIVE_NSGL) +/*! @brief Returns the `NSOpenGLContext` of the specified window. + * + *  @return The `NSOpenGLContext` of the specified window, or `nil` if an + *  [error](@ref error_handling) occurred. + * + *  @thread_safety This function may be called from any thread.  Access is not + *  synchronized. + * + *  @since Added in version 3.0. + * + *  @ingroup native + */ +GLFWAPI id glfwGetNSGLContext(GLFWwindow* window); +#endif + +#if defined(GLFW_EXPOSE_NATIVE_X11) +/*! @brief Returns the `Display` used by GLFW. + * + *  @return The `Display` used by GLFW, or `NULL` if an + *  [error](@ref error_handling) occurred. + * + *  @thread_safety This function may be called from any thread.  Access is not + *  synchronized. + * + *  @since Added in version 3.0. + * + *  @ingroup native + */ +GLFWAPI Display* glfwGetX11Display(void); + +/*! @brief Returns the `RRCrtc` of the specified monitor. + * + *  @return The `RRCrtc` of the specified monitor, or `None` if an + *  [error](@ref error_handling) occurred. + * + *  @thread_safety This function may be called from any thread.  Access is not + *  synchronized. + * + *  @since Added in version 3.1. + * + *  @ingroup native + */ +GLFWAPI RRCrtc glfwGetX11Adapter(GLFWmonitor* monitor); + +/*! @brief Returns the `RROutput` of the specified monitor. + * + *  @return The `RROutput` of the specified monitor, or `None` if an + *  [error](@ref error_handling) occurred. + * + *  @thread_safety This function may be called from any thread.  Access is not + *  synchronized. + * + *  @since Added in version 3.1. + * + *  @ingroup native + */ +GLFWAPI RROutput glfwGetX11Monitor(GLFWmonitor* monitor); + +/*! @brief Returns the `Window` of the specified window. + * + *  @return The `Window` of the specified window, or `None` if an + *  [error](@ref error_handling) occurred. + * + *  @thread_safety This function may be called from any thread.  Access is not + *  synchronized. + * + *  @since Added in version 3.0. + * + *  @ingroup native + */ +GLFWAPI Window glfwGetX11Window(GLFWwindow* window); +#endif + +#if defined(GLFW_EXPOSE_NATIVE_GLX) +/*! @brief Returns the `GLXContext` of the specified window. + * + *  @return The `GLXContext` of the specified window, or `NULL` if an + *  [error](@ref error_handling) occurred. + * + *  @thread_safety This function may be called from any thread.  Access is not + *  synchronized. + * + *  @since Added in version 3.0. + * + *  @ingroup native + */ +GLFWAPI GLXContext glfwGetGLXContext(GLFWwindow* window); + +/*! @brief Returns the `GLXWindow` of the specified window. + * + *  @return The `GLXWindow` of the specified window, or `None` if an + *  [error](@ref error_handling) occurred. + * + *  @thread_safety This function may be called from any thread.  Access is not + *  synchronized. + * + *  @since Added in version 3.2. + * + *  @ingroup native + */ +GLFWAPI GLXWindow glfwGetGLXWindow(GLFWwindow* window); +#endif + +#if defined(GLFW_EXPOSE_NATIVE_WAYLAND) +/*! @brief Returns the `struct wl_display*` used by GLFW. + * + *  @return The `struct wl_display*` used by GLFW, or `NULL` if an + *  [error](@ref error_handling) occurred. + * + *  @thread_safety This function may be called from any thread.  Access is not + *  synchronized. + * + *  @since Added in version 3.2. + * + *  @ingroup native + */ +GLFWAPI struct wl_display* glfwGetWaylandDisplay(void); + +/*! @brief Returns the `struct wl_output*` of the specified monitor. + * + *  @return The `struct wl_output*` of the specified monitor, or `NULL` if an + *  [error](@ref error_handling) occurred. + * + *  @thread_safety This function may be called from any thread.  Access is not + *  synchronized. + * + *  @since Added in version 3.2. + * + *  @ingroup native + */ +GLFWAPI struct wl_output* glfwGetWaylandMonitor(GLFWmonitor* monitor); + +/*! @brief Returns the main `struct wl_surface*` of the specified window. + * + *  @return The main `struct wl_surface*` of the specified window, or `NULL` if + *  an [error](@ref error_handling) occurred. + * + *  @thread_safety This function may be called from any thread.  Access is not + *  synchronized. + * + *  @since Added in version 3.2. + * + *  @ingroup native + */ +GLFWAPI struct wl_surface* glfwGetWaylandWindow(GLFWwindow* window); +#endif + +#if defined(GLFW_EXPOSE_NATIVE_MIR) +/*! @brief Returns the `MirConnection*` used by GLFW. + * + *  @return The `MirConnection*` used by GLFW, or `NULL` if an + *  [error](@ref error_handling) occurred. + * + *  @thread_safety This function may be called from any thread.  Access is not + *  synchronized. + * + *  @since Added in version 3.2. + * + *  @ingroup native + */ +GLFWAPI MirConnection* glfwGetMirDisplay(void); + +/*! @brief Returns the Mir output ID of the specified monitor. + * + *  @return The Mir output ID of the specified monitor, or zero if an + *  [error](@ref error_handling) occurred. + * + *  @thread_safety This function may be called from any thread.  Access is not + *  synchronized. + * + *  @since Added in version 3.2. + * + *  @ingroup native + */ +GLFWAPI int glfwGetMirMonitor(GLFWmonitor* monitor); + +/*! @brief Returns the `MirSurface*` of the specified window. + * + *  @return The `MirSurface*` of the specified window, or `NULL` if an + *  [error](@ref error_handling) occurred. + * + *  @thread_safety This function may be called from any thread.  Access is not + *  synchronized. + * + *  @since Added in version 3.2. + * + *  @ingroup native + */ +GLFWAPI MirSurface* glfwGetMirWindow(GLFWwindow* window); +#endif + +#if defined(GLFW_EXPOSE_NATIVE_EGL) +/*! @brief Returns the `EGLDisplay` used by GLFW. + * + *  @return The `EGLDisplay` used by GLFW, or `EGL_NO_DISPLAY` if an + *  [error](@ref error_handling) occurred. + * + *  @thread_safety This function may be called from any thread.  Access is not + *  synchronized. + * + *  @since Added in version 3.0. + * + *  @ingroup native + */ +GLFWAPI EGLDisplay glfwGetEGLDisplay(void); + +/*! @brief Returns the `EGLContext` of the specified window. + * + *  @return The `EGLContext` of the specified window, or `EGL_NO_CONTEXT` if an + *  [error](@ref error_handling) occurred. + * + *  @thread_safety This function may be called from any thread.  Access is not + *  synchronized. + * + *  @since Added in version 3.0. + * + *  @ingroup native + */ +GLFWAPI EGLContext glfwGetEGLContext(GLFWwindow* window); + +/*! @brief Returns the `EGLSurface` of the specified window. + * + *  @return The `EGLSurface` of the specified window, or `EGL_NO_SURFACE` if an + *  [error](@ref error_handling) occurred. + * + *  @thread_safety This function may be called from any thread.  Access is not + *  synchronized. + * + *  @since Added in version 3.0. + * + *  @ingroup native + */ +GLFWAPI EGLSurface glfwGetEGLSurface(GLFWwindow* window); +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* _glfw3_native_h_ */ + diff --git a/lib/imgui-1.90.7/examples/libs/glfw/lib-vc2010-32/glfw3.lib b/lib/imgui-1.90.7/examples/libs/glfw/lib-vc2010-32/glfw3.lib Binary files differnew file mode 100644 index 0000000..348abec --- /dev/null +++ b/lib/imgui-1.90.7/examples/libs/glfw/lib-vc2010-32/glfw3.lib diff --git a/lib/imgui-1.90.7/examples/libs/glfw/lib-vc2010-64/glfw3.lib b/lib/imgui-1.90.7/examples/libs/glfw/lib-vc2010-64/glfw3.lib Binary files differnew file mode 100644 index 0000000..768f308 --- /dev/null +++ b/lib/imgui-1.90.7/examples/libs/glfw/lib-vc2010-64/glfw3.lib diff --git a/lib/imgui-1.90.7/examples/libs/usynergy/README.txt b/lib/imgui-1.90.7/examples/libs/usynergy/README.txt new file mode 100644 index 0000000..c86b909 --- /dev/null +++ b/lib/imgui-1.90.7/examples/libs/usynergy/README.txt @@ -0,0 +1,8 @@ + +uSynergy client -- Implementation for the embedded Synergy client library +version 1.0.0, July 7th, 2012 +Copyright (c) 2012 Alex Evans + +This is a copy of the files once found at: +  https://github.com/symless/synergy-core/tree/790d108a56ada9caad8e56ff777d444485a69da9/src/micro + diff --git a/lib/imgui-1.90.7/examples/libs/usynergy/uSynergy.c b/lib/imgui-1.90.7/examples/libs/usynergy/uSynergy.c new file mode 100644 index 0000000..8dce47b --- /dev/null +++ b/lib/imgui-1.90.7/examples/libs/usynergy/uSynergy.c @@ -0,0 +1,636 @@ +/* +uSynergy client -- Implementation for the embedded Synergy client library +  version 1.0.0, July 7th, 2012 + +Copyright (c) 2012 Alex Evans + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any damages +arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: + +   1. The origin of this software must not be misrepresented; you must not +   claim that you wrote the original software. If you use this software +   in a product, an acknowledgment in the product documentation would be +   appreciated but is not required. + +   2. Altered source versions must be plainly marked as such, and must not be +   misrepresented as being the original software. + +   3. This notice may not be removed or altered from any source +   distribution. +*/ +#include "uSynergy.h" +#include <stdio.h> +#include <string.h> + + + +//--------------------------------------------------------------------------------------------------------------------- +//	Internal helpers +//--------------------------------------------------------------------------------------------------------------------- + + + +/** +@brief Read 16 bit integer in network byte order and convert to native byte order +**/ +static int16_t sNetToNative16(const unsigned char *value) +{ +#ifdef USYNERGY_LITTLE_ENDIAN +	return value[1] | (value[0] << 8); +#else +	return value[0] | (value[1] << 8); +#endif +} + + + +/** +@brief Read 32 bit integer in network byte order and convert to native byte order +**/ +static int32_t sNetToNative32(const unsigned char *value) +{ +#ifdef USYNERGY_LITTLE_ENDIAN +	return value[3] | (value[2] << 8) | (value[1] << 16) | (value[0] << 24); +#else +	return value[0] | (value[1] << 8) | (value[2] << 16) | (value[3] << 24); +#endif +} + + + +/** +@brief Trace text to client +**/ +static void sTrace(uSynergyContext *context, const char* text) +{ +	// Don't trace if we don't have a trace function +	if (context->m_traceFunc != 0L) +		context->m_traceFunc(context->m_cookie, text); +} + + + +/** +@brief Add string to reply packet +**/ +static void sAddString(uSynergyContext *context, const char *string) +{ +	size_t len = strlen(string); +	memcpy(context->m_replyCur, string, len); +	context->m_replyCur += len; +} + + + +/** +@brief Add uint8 to reply packet +**/ +static void sAddUInt8(uSynergyContext *context, uint8_t value) +{ +	*context->m_replyCur++ = value; +} + + + +/** +@brief Add uint16 to reply packet +**/ +static void sAddUInt16(uSynergyContext *context, uint16_t value) +{ +	uint8_t *reply = context->m_replyCur; +	*reply++ = (uint8_t)(value >> 8); +	*reply++ = (uint8_t)value; +	context->m_replyCur = reply; +} + + + +/** +@brief Add uint32 to reply packet +**/ +static void sAddUInt32(uSynergyContext *context, uint32_t value) +{ +	uint8_t *reply = context->m_replyCur; +	*reply++ = (uint8_t)(value >> 24); +	*reply++ = (uint8_t)(value >> 16); +	*reply++ = (uint8_t)(value >> 8); +	*reply++ = (uint8_t)value; +	context->m_replyCur = reply; +} + + + +/** +@brief Send reply packet +**/ +static uSynergyBool sSendReply(uSynergyContext *context) +{ +	// Set header size +	uint8_t		*reply_buf	= context->m_replyBuffer; +	uint32_t	reply_len	= (uint32_t)(context->m_replyCur - reply_buf);				/* Total size of reply */ +	uint32_t	body_len	= reply_len - 4;											/* Size of body */ +	uSynergyBool ret; +	reply_buf[0] = (uint8_t)(body_len >> 24); +	reply_buf[1] = (uint8_t)(body_len >> 16); +	reply_buf[2] = (uint8_t)(body_len >> 8); +	reply_buf[3] = (uint8_t)body_len; + +	// Send reply +	ret = context->m_sendFunc(context->m_cookie, context->m_replyBuffer, reply_len); + +	// Reset reply buffer write pointer +	context->m_replyCur = context->m_replyBuffer+4; +	return ret; +} + + + +/** +@brief Call mouse callback after a mouse event +**/ +static void sSendMouseCallback(uSynergyContext *context) +{ +	// Skip if no callback is installed +	if (context->m_mouseCallback == 0L) +		return; + +	// Send callback +	context->m_mouseCallback(context->m_cookie, context->m_mouseX, context->m_mouseY, context->m_mouseWheelX, +		context->m_mouseWheelY, context->m_mouseButtonLeft, context->m_mouseButtonRight, context->m_mouseButtonMiddle); +} + + + +/** +@brief Send keyboard callback when a key has been pressed or released +**/ +static void sSendKeyboardCallback(uSynergyContext *context, uint16_t key, uint16_t modifiers, uSynergyBool down, uSynergyBool repeat) +{ +	// Skip if no callback is installed +	if (context->m_keyboardCallback == 0L) +		return; + +	// Send callback +	context->m_keyboardCallback(context->m_cookie, key, modifiers, down, repeat); +} + + + +/** +@brief Send joystick callback +**/ +static void sSendJoystickCallback(uSynergyContext *context, uint8_t joyNum) +{ +	int8_t *sticks; + +	// Skip if no callback is installed +	if (context->m_joystickCallback == 0L) +		return; + +	// Send callback +	sticks = context->m_joystickSticks[joyNum]; +	context->m_joystickCallback(context->m_cookie, joyNum, context->m_joystickButtons[joyNum], sticks[0], sticks[1], sticks[2], sticks[3]); +} + + + +/** +@brief Parse a single client message, update state, send callbacks and send replies +**/ +#define USYNERGY_IS_PACKET(pkt_id)	memcmp(message+4, pkt_id, 4)==0 +static void sProcessMessage(uSynergyContext *context, const uint8_t *message) +{ +	// We have a packet! +	if (memcmp(message+4, "Synergy", 7)==0) +	{ +		// Welcome message +		//		kMsgHello			= "Synergy%2i%2i" +		//		kMsgHelloBack		= "Synergy%2i%2i%s" +		sAddString(context, "Synergy"); +		sAddUInt16(context, USYNERGY_PROTOCOL_MAJOR); +		sAddUInt16(context, USYNERGY_PROTOCOL_MINOR); +		sAddUInt32(context, (uint32_t)strlen(context->m_clientName)); +		sAddString(context, context->m_clientName); +		if (!sSendReply(context)) +		{ +			// Send reply failed, let's try to reconnect +			sTrace(context, "SendReply failed, trying to reconnect in a second"); +			context->m_connected = USYNERGY_FALSE; +			context->m_sleepFunc(context->m_cookie, 1000); +		} +		else +		{ +			// Let's assume we're connected +			char buffer[256+1]; +			sprintf(buffer, "Connected as client \"%s\"", context->m_clientName); +			sTrace(context, buffer); +			context->m_hasReceivedHello = USYNERGY_TRUE; +		} +		return; +	} +	else if (USYNERGY_IS_PACKET("QINF")) +	{ +		// Screen info. Reply with DINF +		//		kMsgQInfo			= "QINF" +		//		kMsgDInfo			= "DINF%2i%2i%2i%2i%2i%2i%2i" +		uint16_t x = 0, y = 0, warp = 0; +		sAddString(context, "DINF"); +		sAddUInt16(context, x); +		sAddUInt16(context, y); +		sAddUInt16(context, context->m_clientWidth); +		sAddUInt16(context, context->m_clientHeight); +		sAddUInt16(context, warp); +		sAddUInt16(context, 0);		// mx? +		sAddUInt16(context, 0);		// my? +		sSendReply(context); +		return; +	} +	else if (USYNERGY_IS_PACKET("CIAK")) +	{ +		// Do nothing? +		//		kMsgCInfoAck		= "CIAK" +		return; +	} +	else if (USYNERGY_IS_PACKET("CROP")) +	{ +		// Do nothing? +		//		kMsgCResetOptions	= "CROP" +		return; +	} +	else if (USYNERGY_IS_PACKET("CINN")) +	{ +		// Screen enter. Reply with CNOP +		//		kMsgCEnter 			= "CINN%2i%2i%4i%2i" + +		// Obtain the Synergy sequence number +		context->m_sequenceNumber = sNetToNative32(message + 12); +		context->m_isCaptured = USYNERGY_TRUE; + +		// Call callback +		if (context->m_screenActiveCallback != 0L) +			context->m_screenActiveCallback(context->m_cookie, USYNERGY_TRUE); +	} +	else if (USYNERGY_IS_PACKET("COUT")) +	{ +		// Screen leave +		//		kMsgCLeave 			= "COUT" +		context->m_isCaptured = USYNERGY_FALSE; + +		// Call callback +		if (context->m_screenActiveCallback != 0L) +			context->m_screenActiveCallback(context->m_cookie, USYNERGY_FALSE); +	} +	else if (USYNERGY_IS_PACKET("DMDN")) +	{ +		// Mouse down +		//		kMsgDMouseDown		= "DMDN%1i" +		char btn = message[8]-1; +		if (btn==2) +			context->m_mouseButtonRight		= USYNERGY_TRUE; +		else if (btn==1) +			context->m_mouseButtonMiddle	= USYNERGY_TRUE; +		else +			context->m_mouseButtonLeft		= USYNERGY_TRUE; +		sSendMouseCallback(context); +	} +	else if (USYNERGY_IS_PACKET("DMUP")) +	{ +		// Mouse up +		//		kMsgDMouseUp		= "DMUP%1i" +		char btn = message[8]-1; +		if (btn==2) +			context->m_mouseButtonRight		= USYNERGY_FALSE; +		else if (btn==1) +			context->m_mouseButtonMiddle	= USYNERGY_FALSE; +		else +			context->m_mouseButtonLeft		= USYNERGY_FALSE; +		sSendMouseCallback(context); +	} +	else if (USYNERGY_IS_PACKET("DMMV")) +	{ +		// Mouse move. Reply with CNOP +		//		kMsgDMouseMove		= "DMMV%2i%2i" +		context->m_mouseX = sNetToNative16(message+8); +		context->m_mouseY = sNetToNative16(message+10); +		sSendMouseCallback(context); +	} +	else if (USYNERGY_IS_PACKET("DMWM")) +	{ +		// Mouse wheel +		//		kMsgDMouseWheel		= "DMWM%2i%2i" +		//		kMsgDMouseWheel1_0	= "DMWM%2i" +		context->m_mouseWheelX += sNetToNative16(message+8); +		context->m_mouseWheelY += sNetToNative16(message+10); +		sSendMouseCallback(context); +	} +	else if (USYNERGY_IS_PACKET("DKDN")) +	{ +		// Key down +		//		kMsgDKeyDown		= "DKDN%2i%2i%2i" +		//		kMsgDKeyDown1_0		= "DKDN%2i%2i" +		//uint16_t id = sNetToNative16(message+8); +		uint16_t mod = sNetToNative16(message+10); +		uint16_t key = sNetToNative16(message+12); +		sSendKeyboardCallback(context, key, mod, USYNERGY_TRUE, USYNERGY_FALSE); +	} +	else if (USYNERGY_IS_PACKET("DKRP")) +	{ +		// Key repeat +		//		kMsgDKeyRepeat		= "DKRP%2i%2i%2i%2i" +		//		kMsgDKeyRepeat1_0	= "DKRP%2i%2i%2i" +		uint16_t mod = sNetToNative16(message+10); +//		uint16_t count = sNetToNative16(message+12); +		uint16_t key = sNetToNative16(message+14); +		sSendKeyboardCallback(context, key, mod, USYNERGY_TRUE, USYNERGY_TRUE); +	} +	else if (USYNERGY_IS_PACKET("DKUP")) +	{ +		// Key up +		//		kMsgDKeyUp			= "DKUP%2i%2i%2i" +		//		kMsgDKeyUp1_0		= "DKUP%2i%2i" +		//uint16 id=Endian::sNetToNative(sbuf[4]); +		uint16_t mod = sNetToNative16(message+10); +		uint16_t key = sNetToNative16(message+12); +		sSendKeyboardCallback(context, key, mod, USYNERGY_FALSE, USYNERGY_FALSE); +	} +	else if (USYNERGY_IS_PACKET("DGBT")) +	{ +		// Joystick buttons +		//		kMsgDGameButtons	= "DGBT%1i%2i"; +		uint8_t	joy_num = message[8]; +		if (joy_num<USYNERGY_NUM_JOYSTICKS) +		{ +			// Copy button state, then send callback +			context->m_joystickButtons[joy_num] = (message[9] << 8) | message[10]; +			sSendJoystickCallback(context, joy_num); +		} +	} +	else if (USYNERGY_IS_PACKET("DGST")) +	{ +		// Joystick sticks +		//		kMsgDGameSticks		= "DGST%1i%1i%1i%1i%1i"; +		uint8_t	joy_num = message[8]; +		if (joy_num<USYNERGY_NUM_JOYSTICKS) +		{ +			// Copy stick state, then send callback +			memcpy(context->m_joystickSticks[joy_num], message+9, 4); +			sSendJoystickCallback(context, joy_num); +		} +	} +	else if (USYNERGY_IS_PACKET("DSOP")) +	{ +		// Set options +		//		kMsgDSetOptions		= "DSOP%4I" +	} +	else if (USYNERGY_IS_PACKET("CALV")) +	{ +		// Keepalive, reply with CALV and then CNOP +		//		kMsgCKeepAlive		= "CALV" +		sAddString(context, "CALV"); +		sSendReply(context); +		// now reply with CNOP +	} +	else if (USYNERGY_IS_PACKET("DCLP")) +	{ +		// Clipboard message +		//		kMsgDClipboard		= "DCLP%1i%4i%s" +		// +		// The clipboard message contains: +		//		1 uint32:	The size of the message +		//		4 chars: 	The identifier ("DCLP") +		//		1 uint8: 	The clipboard index +		//		1 uint32:	The sequence number. It's zero, because this message is always coming from the server? +		//		1 uint32:	The total size of the remaining 'string' (as per the Synergy %s string format (which is 1 uint32 for size followed by a char buffer (not necessarily null terminated)). +		//		1 uint32:	The number of formats present in the message +		// And then 'number of formats' times the following: +		//		1 uint32:	The format of the clipboard data +		//		1 uint32:	The size n of the clipboard data +		//		n uint8:	The clipboard data +		const uint8_t *	parse_msg	= message+17; +		uint32_t		num_formats = sNetToNative32(parse_msg); +		parse_msg += 4; +		for (; num_formats; num_formats--) +		{ +			// Parse clipboard format header +			uint32_t format	= sNetToNative32(parse_msg); +			uint32_t size	= sNetToNative32(parse_msg+4); +			parse_msg += 8; +			 +			// Call callback +			if (context->m_clipboardCallback) +				context->m_clipboardCallback(context->m_cookie, format, parse_msg, size); + +			parse_msg += size; +		} +	} +	else +	{ +		// Unknown packet, could be any of these +		//		kMsgCNoop 			= "CNOP" +		//		kMsgCClose 			= "CBYE" +		//		kMsgCClipboard 		= "CCLP%1i%4i" +		//		kMsgCScreenSaver 	= "CSEC%1i" +		//		kMsgDKeyRepeat		= "DKRP%2i%2i%2i%2i" +		//		kMsgDKeyRepeat1_0	= "DKRP%2i%2i%2i" +		//		kMsgDMouseRelMove	= "DMRM%2i%2i" +		//		kMsgEIncompatible	= "EICV%2i%2i" +		//		kMsgEBusy 			= "EBSY" +		//		kMsgEUnknown		= "EUNK" +		//		kMsgEBad			= "EBAD" +		char buffer[64]; +		sprintf(buffer, "Unknown packet '%c%c%c%c'", message[4], message[5], message[6], message[7]); +		sTrace(context, buffer); +		return; +	} + +	// Reply with CNOP maybe? +	sAddString(context, "CNOP"); +	sSendReply(context); +} +#undef USYNERGY_IS_PACKET + + + +/** +@brief Mark context as being disconnected +**/ +static void sSetDisconnected(uSynergyContext *context) +{ +	context->m_connected		= USYNERGY_FALSE; +	context->m_hasReceivedHello = USYNERGY_FALSE; +	context->m_isCaptured		= USYNERGY_FALSE; +	context->m_replyCur			= context->m_replyBuffer + 4; +	context->m_sequenceNumber	= 0; +} + + + +/** +@brief Update a connected context +**/ +static void sUpdateContext(uSynergyContext *context) +{ +	/* Receive data (blocking) */ +	int receive_size = USYNERGY_RECEIVE_BUFFER_SIZE - context->m_receiveOfs; +	int num_received = 0; +	int packlen = 0; +	if (context->m_receiveFunc(context->m_cookie, context->m_receiveBuffer + context->m_receiveOfs, receive_size, &num_received) == USYNERGY_FALSE) +	{ +		/* Receive failed, let's try to reconnect */ +		char buffer[128]; +		sprintf(buffer, "Receive failed (%d bytes asked, %d bytes received), trying to reconnect in a second", receive_size, num_received); +		sTrace(context, buffer); +		sSetDisconnected(context); +		context->m_sleepFunc(context->m_cookie, 1000); +		return; +	} +	context->m_receiveOfs += num_received; + +	/*	If we didn't receive any data then we're probably still polling to get connected and +		therefore not getting any data back. To avoid overloading the system with a Synergy +		thread that would hammer on polling, we let it rest for a bit if there's no data. */ +	if (num_received == 0) +		context->m_sleepFunc(context->m_cookie, 500); + +	/* Check for timeouts */ +	if (context->m_hasReceivedHello) +	{ +		uint32_t cur_time = context->m_getTimeFunc(); +		if (num_received == 0) +		{ +			/* Timeout after 2 secs of inactivity (we received no CALV) */ +			if ((cur_time - context->m_lastMessageTime) > USYNERGY_IDLE_TIMEOUT) +				sSetDisconnected(context); +		} +		else +			context->m_lastMessageTime = cur_time; +	} + +	/* Eat packets */ +	for (;;) +	{ +		/* Grab packet length and bail out if the packet goes beyond the end of the buffer */ +		packlen = sNetToNative32(context->m_receiveBuffer); +		if (packlen+4 > context->m_receiveOfs) +			break; + +		/* Process message */ +		sProcessMessage(context, context->m_receiveBuffer); + +		/* Move packet to front of buffer */ +		memmove(context->m_receiveBuffer, context->m_receiveBuffer+packlen+4, context->m_receiveOfs-packlen-4); +		context->m_receiveOfs -= packlen+4; +	} + +	/* Throw away over-sized packets */ +	if (packlen > USYNERGY_RECEIVE_BUFFER_SIZE) +	{ +		/* Oversized packet, ditch tail end */ +		char buffer[128]; +		sprintf(buffer, "Oversized packet: '%c%c%c%c' (length %d)", context->m_receiveBuffer[4], context->m_receiveBuffer[5], context->m_receiveBuffer[6], context->m_receiveBuffer[7], packlen); +		sTrace(context, buffer); +		num_received = context->m_receiveOfs-4; // 4 bytes for the size field +		while (num_received != packlen) +		{ +			int buffer_left = packlen - num_received; +			int to_receive = buffer_left < USYNERGY_RECEIVE_BUFFER_SIZE ? buffer_left : USYNERGY_RECEIVE_BUFFER_SIZE; +			int ditch_received = 0; +			if (context->m_receiveFunc(context->m_cookie, context->m_receiveBuffer, to_receive, &ditch_received) == USYNERGY_FALSE) +			{ +				/* Receive failed, let's try to reconnect */ +				sTrace(context, "Receive failed, trying to reconnect in a second"); +				sSetDisconnected(context); +				context->m_sleepFunc(context->m_cookie, 1000); +				break; +			} +			else +			{ +				num_received += ditch_received; +			} +		} +		context->m_receiveOfs = 0; +	} +} + + +//--------------------------------------------------------------------------------------------------------------------- +//	Public interface +//--------------------------------------------------------------------------------------------------------------------- + + + +/** +@brief Initialize uSynergy context +**/ +void uSynergyInit(uSynergyContext *context) +{ +	/* Zero memory */ +	memset(context, 0, sizeof(uSynergyContext)); + +	/* Initialize to default state */ +	sSetDisconnected(context); +} + + +/** +@brief Update uSynergy +**/ +void uSynergyUpdate(uSynergyContext *context) +{ +	if (context->m_connected) +	{ +		/* Update context, receive data, call callbacks */ +		sUpdateContext(context); +	} +	else +	{ +		/* Try to connect */ +		if (context->m_connectFunc(context->m_cookie)) +			context->m_connected = USYNERGY_TRUE; +	} +} + + + +/** +@brief Send clipboard data +**/ +void uSynergySendClipboard(uSynergyContext *context, const char *text) +{ +	// Calculate maximum size that will fit in a reply packet +	uint32_t overhead_size =	4 +					/* Message size */ +								4 +					/* Message ID */ +								1 +					/* Clipboard index */ +								4 +					/* Sequence number */ +								4 +					/* Rest of message size (because it's a Synergy string from here on) */ +								4 +					/* Number of clipboard formats */ +								4 +					/* Clipboard format */ +								4;					/* Clipboard data length */ +	uint32_t max_length = USYNERGY_REPLY_BUFFER_SIZE - overhead_size; +	 +	// Clip text to max length +	uint32_t text_length = (uint32_t)strlen(text); +	if (text_length > max_length) +	{ +		char buffer[128]; +		sprintf(buffer, "Clipboard buffer too small, clipboard truncated at %d characters", max_length); +		sTrace(context, buffer); +		text_length = max_length; +	} + +	// Assemble packet +	sAddString(context, "DCLP"); +	sAddUInt8(context, 0);							/* Clipboard index */ +	sAddUInt32(context, context->m_sequenceNumber); +	sAddUInt32(context, 4+4+4+text_length);			/* Rest of message size: numFormats, format, length, data */ +	sAddUInt32(context, 1);							/* Number of formats (only text for now) */ +	sAddUInt32(context, USYNERGY_CLIPBOARD_FORMAT_TEXT); +	sAddUInt32(context, text_length); +	sAddString(context, text); +	sSendReply(context); +} diff --git a/lib/imgui-1.90.7/examples/libs/usynergy/uSynergy.h b/lib/imgui-1.90.7/examples/libs/usynergy/uSynergy.h new file mode 100644 index 0000000..2d7f9fa --- /dev/null +++ b/lib/imgui-1.90.7/examples/libs/usynergy/uSynergy.h @@ -0,0 +1,420 @@ +/* +uSynergy client -- Interface for the embedded Synergy client library +  version 1.0.0, July 7th, 2012 + +Copyright (C) 2012 Synergy Si Ltd. +Copyright (c) 2012 Alex Evans + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any damages +arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: + +   1. The origin of this software must not be misrepresented; you must not +   claim that you wrote the original software. If you use this software +   in a product, an acknowledgment in the product documentation would be +   appreciated but is not required. + +   2. Altered source versions must be plainly marked as such, and must not be +   misrepresented as being the original software. + +   3. This notice may not be removed or altered from any source +   distribution. +*/ +#include <stdint.h> + +#ifdef __cplusplus +extern "C" { +#endif + + + +//--------------------------------------------------------------------------------------------------------------------- +//	Configuration +//--------------------------------------------------------------------------------------------------------------------- + + + +/** +@brief Determine endianness +**/ +#if defined(USYNERGY_LITTLE_ENDIAN) && defined(USYNERGY_BIG_ENDIAN) +	/* Ambiguous: both endians specified */ +	#error "Can't define both USYNERGY_LITTLE_ENDIAN and USYNERGY_BIG_ENDIAN" +#elif !defined(USYNERGY_LITTLE_ENDIAN) && !defined(USYNERGY_BIG_ENDIAN) +	/* Attempt to auto detect */ +	#if defined(__LITTLE_ENDIAN__) || defined(LITTLE_ENDIAN) || (_BYTE_ORDER == _LITTLE_ENDIAN) +		#define USYNERGY_LITTLE_ENDIAN +	#elif defined(__BIG_ENDIAN__) || defined(BIG_ENDIAN) || (_BYTE_ORDER == _BIG_ENDIAN) +		#define USYNERGY_BIG_ENDIAN +	#else +		#error "Can't detect endian-nes, please defined either USYNERGY_LITTLE_ENDIAN or USYNERGY_BIG_ENDIAN"; +	#endif +#else +	/* User-specified endian-nes, nothing to do for us */ +#endif + + + +//--------------------------------------------------------------------------------------------------------------------- +//	Types and Constants +//--------------------------------------------------------------------------------------------------------------------- + + + +/** +@brief Boolean type +**/ +typedef int			uSynergyBool; +#define				USYNERGY_FALSE					0				/* False value */ +#define				USYNERGY_TRUE					1				/* True value */ + + +/** +@brief User context type + +The uSynergyCookie type is an opaque type that is used by uSynergy to communicate to the client. It is passed along to +callback functions as context. +**/ +typedef struct { int ignored; } *					uSynergyCookie; + + + +/** +@brief Clipboard types +**/ +enum uSynergyClipboardFormat +{ +	USYNERGY_CLIPBOARD_FORMAT_TEXT					= 0,			/* Text format, UTF-8, newline is LF */ +	USYNERGY_CLIPBOARD_FORMAT_BITMAP				= 1,			/* Bitmap format, BMP 24/32bpp, BI_RGB */ +	USYNERGY_CLIPBOARD_FORMAT_HTML					= 2,			/* HTML format, HTML fragment, UTF-8, newline is LF */ +}; + + + +/** +@brief Constants and limits +**/ +#define				USYNERGY_NUM_JOYSTICKS			4				/* Maximum number of supported joysticks */ + +#define				USYNERGY_PROTOCOL_MAJOR			1				/* Major protocol version */ +#define				USYNERGY_PROTOCOL_MINOR			4				/* Minor protocol version */ + +#define				USYNERGY_IDLE_TIMEOUT			2000			/* Timeout in milliseconds before reconnecting */ + +#define				USYNERGY_TRACE_BUFFER_SIZE		1024			/* Maximum length of traced message */ +#define				USYNERGY_REPLY_BUFFER_SIZE		1024			/* Maximum size of a reply packet */ +#define				USYNERGY_RECEIVE_BUFFER_SIZE	4096			/* Maximum size of an incoming packet */ + + + +/** +@brief Keyboard constants +**/ +#define				USYNERGY_MODIFIER_SHIFT			0x0001			/* Shift key modifier */ +#define				USYNERGY_MODIFIER_CTRL			0x0002			/* Ctrl key modifier */ +#define				USYNERGY_MODIFIER_ALT			0x0004			/* Alt key modifier */ +#define				USYNERGY_MODIFIER_META			0x0008			/* Meta key modifier */ +#define				USYNERGY_MODIFIER_WIN			0x0010			/* Windows key modifier */ +#define				USYNERGY_MODIFIER_ALT_GR		0x0020			/* AltGr key modifier */ +#define				USYNERGY_MODIFIER_LEVEL5LOCK	0x0040			/* Level5Lock key modifier */ +#define				USYNERGY_MODIFIER_CAPSLOCK		0x1000			/* CapsLock key modifier */ +#define				USYNERGY_MODIFIER_NUMLOCK		0x2000			/* NumLock key modifier */ +#define				USYNERGY_MODIFIER_SCROLLOCK		0x4000			/* ScrollLock key modifier */ + + + + +//--------------------------------------------------------------------------------------------------------------------- +//	Functions and Callbacks +//--------------------------------------------------------------------------------------------------------------------- + + + +/** +@brief Connect function + +This function is called when uSynergy needs to connect to the host. It doesn't imply a network implementation or +destination address, that must all be handled on the user side. The function should return USYNERGY_TRUE if a +connection was established or USYNERGY_FALSE if it could not connect. + +When network errors occur (e.g. uSynergySend or uSynergyReceive fail) then the connect call will be called again +so the implementation of the function must close any old connections and clean up resources before retrying. + +@param cookie		Cookie supplied in the Synergy context +**/ +typedef uSynergyBool (*uSynergyConnectFunc)(uSynergyCookie cookie); + + + +/** +@brief Send function + +This function is called when uSynergy needs to send something over the default connection. It should return +USYNERGY_TRUE if sending succeeded and USYNERGY_FALSE otherwise. This function should block until the send +operation is completed. + +@param cookie		Cookie supplied in the Synergy context +@param buffer		Address of buffer to send +@param length		Length of buffer to send +**/ +typedef uSynergyBool (*uSynergySendFunc)(uSynergyCookie cookie, const uint8_t *buffer, int length); + + + +/** +@brief Receive function + +This function is called when uSynergy needs to receive data from the default connection. It should return +USYNERGY_TRUE if receiving data succeeded and USYNERGY_FALSE otherwise. This function should block until data +has been received and wait for data to become available. If @a outLength is set to 0 upon completion it is +assumed that the connection is alive, but still in a connecting state and needs time to settle. + +@param cookie		Cookie supplied in the Synergy context +@param buffer		Address of buffer to receive data into +@param maxLength	Maximum amount of bytes to write into the receive buffer +@param outLength	Address of integer that receives the actual amount of bytes written into @a buffer +**/ +typedef uSynergyBool (*uSynergyReceiveFunc)(uSynergyCookie cookie, uint8_t *buffer, int maxLength, int* outLength); + + + +/** +@brief Thread sleep function + +This function is called when uSynergy wants to suspend operation for a while before retrying an operation. It +is mostly used when a socket times out or disconnect occurs to prevent uSynergy from continuously hammering a +network connection in case the network is down. + +@param cookie		Cookie supplied in the Synergy context +@param timeMs		Time to sleep the current thread (in milliseconds) +**/ +typedef void		(*uSynergySleepFunc)(uSynergyCookie cookie, int timeMs); + + + +/** +@brief Get time function + +This function is called when uSynergy needs to know the current time. This is used to determine when timeouts +have occurred. The time base should be a cyclic millisecond time value. + +@returns			Time value in milliseconds +**/ +typedef uint32_t	(*uSynergyGetTimeFunc)(); + + + +/** +@brief Trace function + +This function is called when uSynergy wants to trace something. It is optional to show these messages, but they +are often useful when debugging. uSynergy only traces major events like connecting and disconnecting. Usually +only a single trace is shown when the connection is established and no more trace are called. + +@param cookie		Cookie supplied in the Synergy context +@param text			Text to be traced +**/ +typedef void		(*uSynergyTraceFunc)(uSynergyCookie cookie, const char *text); + + + +/** +@brief Screen active callback + +This callback is called when Synergy makes the screen active or inactive. This +callback is usually sent when the mouse enters or leaves the screen. + +@param cookie		Cookie supplied in the Synergy context +@param active		Activation flag, 1 if the screen has become active, 0 if the screen has become inactive +**/ +typedef void		(*uSynergyScreenActiveCallback)(uSynergyCookie cookie, uSynergyBool active); + + + +/** +@brief Mouse callback + +This callback is called when a mouse events happens. The mouse X and Y position, +wheel and button state is communicated in the message. It's up to the user to +interpret if this is a mouse up, down, double-click or other message. + +@param cookie		Cookie supplied in the Synergy context +@param x			Mouse X position +@param y			Mouse Y position +@param wheelX		Mouse wheel X position +@param wheelY		Mouse wheel Y position +@param buttonLeft	Left button pressed status, 0 for released, 1 for pressed +@param buttonMiddle	Middle button pressed status, 0 for released, 1 for pressed +@param buttonRight	Right button pressed status, 0 for released, 1 for pressed +**/ +typedef void		(*uSynergyMouseCallback)(uSynergyCookie cookie, uint16_t x, uint16_t y, int16_t wheelX, int16_t wheelY, uSynergyBool buttonLeft, uSynergyBool buttonRight, uSynergyBool buttonMiddle); + + + +/** +@brief Key event callback + +This callback is called when a key is pressed or released. + +@param cookie		Cookie supplied in the Synergy context +@param key			Key code of key that was pressed or released +@param modifiers	Status of modifier keys (alt, shift, etc.) +@param down			Down or up status, 1 is key is pressed down, 0 if key is released (up) +@param repeat		Repeat flag, 1 if the key is down because the key is repeating, 0 if the key is initially pressed by the user +**/ +typedef void		(*uSynergyKeyboardCallback)(uSynergyCookie cookie, uint16_t key, uint16_t modifiers, uSynergyBool down, uSynergyBool repeat); + + + +/** +@brief Joystick event callback + +This callback is called when a joystick stick or button changes. It is possible that multiple callbacks are +fired when different sticks or buttons change as these are individual messages in the packet stream. Each +callback will contain all the valid state for the different axes and buttons. The last callback received will +represent the most current joystick state. + +@param cookie		Cookie supplied in the Synergy context +@param joyNum		Joystick number, always in the range [0 ... USYNERGY_NUM_JOYSTICKS> +@param buttons		Button pressed mask +@param leftStickX	Left stick X position, in range [-127 ... 127] +@param leftStickY	Left stick Y position, in range [-127 ... 127] +@param rightStickX	Right stick X position, in range [-127 ... 127] +@param rightStickY	Right stick Y position, in range [-127 ... 127] +**/ +typedef void		(*uSynergyJoystickCallback)(uSynergyCookie cookie, uint8_t joyNum, uint16_t buttons, int8_t leftStickX, int8_t leftStickY, int8_t rightStickX, int8_t rightStickY); + + + +/** +@brief Clipboard event callback + +This callback is called when something is placed on the clipboard. Multiple callbacks may be fired for +multiple clipboard formats if they are supported. The data provided is read-only and may not be modified +by the application. + +@param cookie		Cookie supplied in the Synergy context +@param format		Clipboard format +@param data			Memory area containing the clipboard raw data +@param size			Size of clipboard data +**/ +typedef void		(*uSynergyClipboardCallback)(uSynergyCookie cookie, enum uSynergyClipboardFormat format, const uint8_t *data, uint32_t size); + + + +//--------------------------------------------------------------------------------------------------------------------- +//	Context +//--------------------------------------------------------------------------------------------------------------------- + + + +/** +@brief uSynergy context +**/ +typedef struct +{ +	/* Mandatory configuration data, filled in by client */ +	uSynergyConnectFunc				m_connectFunc;									/* Connect function */ +	uSynergySendFunc				m_sendFunc;										/* Send data function */ +	uSynergyReceiveFunc				m_receiveFunc;									/* Receive data function */ +	uSynergySleepFunc				m_sleepFunc;									/* Thread sleep function */ +	uSynergyGetTimeFunc				m_getTimeFunc;									/* Get current time function */ +	const char*						m_clientName;									/* Name of Synergy Screen / Client */ +	uint16_t						m_clientWidth;									/* Width of screen */ +	uint16_t						m_clientHeight;									/* Height of screen */ + +	/* Optional configuration data, filled in by client */ +	uSynergyCookie					m_cookie;										/* Cookie pointer passed to callback functions (can be NULL) */ +	uSynergyTraceFunc				m_traceFunc;									/* Function for tracing status (can be NULL) */ +	uSynergyScreenActiveCallback	m_screenActiveCallback;							/* Callback for entering and leaving screen */ +	uSynergyMouseCallback			m_mouseCallback;								/* Callback for mouse events */ +	uSynergyKeyboardCallback		m_keyboardCallback;								/* Callback for keyboard events */ +	uSynergyJoystickCallback		m_joystickCallback;								/* Callback for joystick events */ +	uSynergyClipboardCallback		m_clipboardCallback;							/* Callback for clipboard events */ + +	/* State data, used internall by client, initialized by uSynergyInit() */ +	uSynergyBool					m_connected;									/* Is our socket connected? */ +	uSynergyBool					m_hasReceivedHello;								/* Have we received a 'Hello' from the server? */ +	uSynergyBool					m_isCaptured;									/* Is Synergy active (i.e. this client is receiving input messages?) */ +	uint32_t						m_lastMessageTime;								/* Time at which last message was received */ +	uint32_t						m_sequenceNumber;								/* Packet sequence number */ +	uint8_t							m_receiveBuffer[USYNERGY_RECEIVE_BUFFER_SIZE];	/* Receive buffer */ +	int								m_receiveOfs;									/* Receive buffer offset */ +	uint8_t							m_replyBuffer[USYNERGY_REPLY_BUFFER_SIZE];		/* Reply buffer */ +	uint8_t*						m_replyCur;										/* Write offset into reply buffer */ +	uint16_t						m_mouseX;										/* Mouse X position */ +	uint16_t						m_mouseY;										/* Mouse Y position */ +	int16_t							m_mouseWheelX;									/* Mouse wheel X position */ +	int16_t							m_mouseWheelY;									/* Mouse wheel Y position */ +	uSynergyBool					m_mouseButtonLeft;								/* Mouse left button */ +	uSynergyBool					m_mouseButtonRight;								/* Mouse right button */ +	uSynergyBool					m_mouseButtonMiddle;							/* Mouse middle button */ +	int8_t							m_joystickSticks[USYNERGY_NUM_JOYSTICKS][4];	/* Joystick stick position in 2 axes for 2 sticks */ +	uint16_t						m_joystickButtons[USYNERGY_NUM_JOYSTICKS];		/* Joystick button state */ +} uSynergyContext; + + + +//--------------------------------------------------------------------------------------------------------------------- +//	Interface +//--------------------------------------------------------------------------------------------------------------------- + + + +/** +@brief Initialize uSynergy context + +This function initializes @a context for use. Call this function directly after +creating the context, before filling in any configuration data in it. Not calling +this function will cause undefined behavior. + +@param context	Context to be initialized +**/ +extern void		uSynergyInit(uSynergyContext *context); + + + +/** +@brief Update uSynergy + +This function updates uSynergy and does the bulk of the work. It does connection management, +receiving data, reconnecting after errors or timeouts and so on. It assumes that networking +operations are blocking and it can suspend the current thread if it needs to wait. It is +best practice to call uSynergyUpdate from a background thread so it is responsive. + +Because uSynergy relies mostly on blocking calls it will mostly stay in thread sleep state +waiting for system mutexes and won't eat much memory. + +uSynergyUpdate doesn't do any memory allocations or have any side effects beyond those of +the callbacks it calls. + +@param context	Context to be updated +**/ +extern void		uSynergyUpdate(uSynergyContext *context); + + + +/** +@brief Send clipboard data + +This function sets new clipboard data and sends it to the server. Use this function if +your client cuts or copies data onto the clipboard that it needs to share with the +server. + +Currently there is only support for plaintext, but HTML and image data could be +supported with some effort. + +@param context	Context to send clipboard data to +@param text		Text to set to the clipboard +**/ +extern void		uSynergySendClipboard(uSynergyContext *context, const char *text); + + + +#ifdef __cplusplus +}; +#endif  | 
