├── vcpkg.json ├── .editorconfig ├── cmake ├── Plugin.h.in ├── packaging.cmake └── version.rc.in ├── src ├── Offsets.h ├── PCH.h ├── Hooks.cpp ├── Hooks.h ├── main.cpp └── CMakeLists.txt ├── README.md ├── LICENSE ├── CMakeLists.txt ├── CMakePresets.json ├── .clang-format └── .gitignore /vcpkg.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "animationqueuefix", 3 | "version": "1", 4 | "dependencies": [ 5 | "fmt", 6 | "rapidcsv", 7 | "rsm-binary-io", 8 | "spdlog" 9 | ] 10 | } 11 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | [*] 2 | charset = utf-8 3 | insert_final_newline = true 4 | 5 | [*.{c,cmake,cpp,cxx,h,hpp,hxx}] 6 | indent_style = tab 7 | indent_size = 4 8 | 9 | [*.json] 10 | indent_style = space 11 | indent_size = 2 12 | -------------------------------------------------------------------------------- /cmake/Plugin.h.in: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include 4 | 5 | namespace Plugin 6 | { 7 | using namespace std::literals; 8 | 9 | inline constexpr REL::Version VERSION 10 | { 11 | // clang-format off 12 | @PROJECT_VERSION_MAJOR@u, 13 | @PROJECT_VERSION_MINOR@u, 14 | @PROJECT_VERSION_PATCH@u, 15 | // clang-format on 16 | }; 17 | 18 | inline constexpr auto NAME = "@PROJECT_NAME@"sv; 19 | } 20 | -------------------------------------------------------------------------------- /cmake/packaging.cmake: -------------------------------------------------------------------------------- 1 | set(CPACK_PACKAGE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/packaging") 2 | set(CPACK_PACKAGE_FILE_NAME "${PROJECT_NAME}-${PROJECT_VERSION}") 3 | set(CPACK_VERBATIM_VARIABLES ON) 4 | 5 | set(CPACK_GENERATOR "ZIP") 6 | set(CPACK_ARCHIVE_COMPONENT_INSTALL ON) 7 | 8 | get_cmake_property(CPACK_COMPONENTS_ALL COMPONENTS) 9 | list(REMOVE_ITEM CPACK_COMPONENTS_ALL "Unspecified") 10 | 11 | include(CPack) 12 | -------------------------------------------------------------------------------- /src/Offsets.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | static void** g_animationFileManager = (void**)REL::VariantID(520994, 407512, 0x30A9F50).address(); // 2F51EC0, 2FECA40, 30A9F50 4 | 5 | typedef void (*tAnimationFileManagerSingleton_UpdateQueue)(void* a_this); 6 | static REL::Relocation AnimationFileManagerSingleton_UpdateQueue{ REL::VariantID(63080, 63995, 0xB45AB0) }; // B0ACD0, B2F650, B45AB0 7 | -------------------------------------------------------------------------------- /src/PCH.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #pragma warning(push) 4 | #include 5 | #include 6 | #include 7 | 8 | #include 9 | 10 | #ifdef NDEBUG 11 | # include 12 | #else 13 | # include 14 | #endif 15 | #pragma warning(pop) 16 | 17 | using namespace std::literals; 18 | 19 | namespace logger = SKSE::log; 20 | 21 | namespace util 22 | { 23 | using SKSE::stl::report_and_fail; 24 | } 25 | 26 | #define DLLEXPORT __declspec(dllexport) 27 | 28 | #include "Plugin.h" 29 | -------------------------------------------------------------------------------- /src/Hooks.cpp: -------------------------------------------------------------------------------- 1 | #include "Hooks.h" 2 | #include "Offsets.h" 3 | 4 | namespace Hooks 5 | { 6 | void Install() 7 | { 8 | logger::info("Hooking..."); 9 | 10 | QueueFixHook::Hook(); 11 | 12 | logger::info("...success"); 13 | } 14 | 15 | void QueueFixHook::LoadAnim(void* a1, void* a2) 16 | { 17 | _LoadAnim(a1, a2); 18 | 19 | void* animationFileManager = *g_animationFileManager; 20 | 21 | RE::BSSpinLock* lock = (RE::BSSpinLock*)((uintptr_t)animationFileManager + 0x14); 22 | RE::BSSpinLockGuard locker(*lock); 23 | 24 | AnimationFileManagerSingleton_UpdateQueue(animationFileManager); 25 | } 26 | 27 | } 28 | -------------------------------------------------------------------------------- /src/Hooks.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include "Offsets.h" 3 | 4 | namespace Hooks 5 | { 6 | class QueueFixHook 7 | { 8 | public: 9 | static void Hook() 10 | { 11 | REL::Relocation hook{ REL::VariantID(62584, 63517, 0xB245D0) }; // AE9A70, B0DE90, B245D0 BSResource__EntryDB_BShkbHkxDB__DBTraits_::Func3 12 | 13 | SKSE::AllocTrampoline(14); 14 | auto& trampoline = SKSE::GetTrampoline(); 15 | 16 | _LoadAnim = trampoline.write_call<5>(hook.address() + 0x2B, LoadAnim); 17 | } 18 | 19 | private: 20 | static void LoadAnim(void* a1, void* a2); 21 | 22 | static inline REL::Relocation _LoadAnim; 23 | }; 24 | 25 | void Install(); 26 | } 27 | -------------------------------------------------------------------------------- /cmake/version.rc.in: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | 1 VERSIONINFO 4 | FILEVERSION @PROJECT_VERSION_MAJOR@, @PROJECT_VERSION_MINOR@, @PROJECT_VERSION_PATCH@, 0 5 | PRODUCTVERSION @PROJECT_VERSION_MAJOR@, @PROJECT_VERSION_MINOR@, @PROJECT_VERSION_PATCH@, 0 6 | FILEFLAGSMASK 0x17L 7 | #ifdef _DEBUG 8 | FILEFLAGS 0x1L 9 | #else 10 | FILEFLAGS 0x0L 11 | #endif 12 | FILEOS 0x4L 13 | FILETYPE 0x1L 14 | FILESUBTYPE 0x0L 15 | BEGIN 16 | BLOCK "StringFileInfo" 17 | BEGIN 18 | BLOCK "040904b0" 19 | BEGIN 20 | VALUE "FileDescription", "@PROJECT_NAME@" 21 | VALUE "FileVersion", "@PROJECT_VERSION@.0" 22 | VALUE "InternalName", "@PROJECT_NAME@" 23 | VALUE "LegalCopyright", "MIT License" 24 | VALUE "ProductName", "@PROJECT_NAME@" 25 | VALUE "ProductVersion", "@PROJECT_VERSION@.0" 26 | END 27 | END 28 | BLOCK "VarFileInfo" 29 | BEGIN 30 | VALUE "Translation", 0x409, 1200 31 | END 32 | END -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## Requirements 2 | * [CMake](https://cmake.org/) 3 | * Add this to your `PATH` 4 | * [The Elder Scrolls V: Skyrim Special Edition](https://store.steampowered.com/app/489830) 5 | * Add the environment variable `CompiledPluginsPath` to point to the folder where you want the .dll to be copied after building 6 | * [Vcpkg](https://github.com/microsoft/vcpkg) 7 | * Add the environment variable `VCPKG_ROOT` with the value as the path to the folder containing vcpkg 8 | * [Visual Studio Community 2022](https://visualstudio.microsoft.com/) 9 | * Desktop development with C++ 10 | * [CommonLibSSE-NG](https://github.com/CharmedBaryon/CommonLibSSE-NG/tree/v3.4.0) 11 | * Add the environment variable `CommonLibSSEPath_NG` with the value as the path to the folder containing CommonLibSSE-NG 12 | 13 | ## User Requirements 14 | * [Address Library for SKSE](https://www.nexusmods.com/skyrimspecialedition/mods/32444) 15 | 16 | ## Building 17 | ``` 18 | git clone https://github.com/ersh1/AnimationQueueFix/ 19 | cd AnimationQueueFix 20 | 21 | cmake --preset vs2022-windows 22 | cmake --build build --config Release 23 | ``` 24 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 Ersh 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. -------------------------------------------------------------------------------- /CMakeLists.txt: -------------------------------------------------------------------------------- 1 | cmake_minimum_required(VERSION 3.22) 2 | 3 | project( 4 | AnimationQueueFix 5 | VERSION 1.0.1 6 | LANGUAGES CXX 7 | ) 8 | set(CMAKE_CXX_STANDARD_REQUIRED ON) 9 | 10 | if("${PROJECT_SOURCE_DIR}" STREQUAL "${PROJECT_BINARY_DIR}") 11 | message(FATAL_ERROR "in-source builds are not allowed") 12 | endif() 13 | 14 | macro(set_from_environment VARIABLE) 15 | if(NOT DEFINED ${VARIABLE} AND DEFINED ENV{${VARIABLE}}) 16 | set(${VARIABLE} $ENV{${VARIABLE}}) 17 | endif() 18 | endmacro() 19 | 20 | set_from_environment(CompiledPluginsPath) 21 | if(NOT DEFINED CompiledPluginsPath) 22 | message(FATAL_ERROR "CompiledPluginsPath is not set") 23 | endif() 24 | 25 | option(COPY_OUTPUT "Copy the output of build operations to the game directory" ON) 26 | option(ENABLE_SKYRIM_SE "Enable support for Skyrim SE in the dynamic runtime feature." ON) 27 | option(ENABLE_SKYRIM_AE "Enable support for Skyrim AE in the dynamic runtime feature." ON) 28 | option(ENABLE_SKYRIM_VR "Enable support for Skyrim VR in the dynamic runtime feature." ON) 29 | set(BUILD_TESTS OFF) 30 | 31 | list(APPEND CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake") 32 | 33 | add_subdirectory(src) 34 | include(cmake/packaging.cmake) 35 | -------------------------------------------------------------------------------- /CMakePresets.json: -------------------------------------------------------------------------------- 1 | { 2 | "configurePresets": [ 3 | { 4 | "binaryDir": "${sourceDir}/build", 5 | "cacheVariables": { 6 | "CMAKE_BUILD_TYPE": { 7 | "type": "STRING", 8 | "value": "Debug" 9 | } 10 | }, 11 | "errors": { 12 | "deprecated": true 13 | }, 14 | "hidden": true, 15 | "name": "cmake-dev", 16 | "warnings": { 17 | "deprecated": true, 18 | "dev": true 19 | } 20 | }, 21 | { 22 | "cacheVariables": { 23 | "CMAKE_TOOLCHAIN_FILE": { 24 | "type": "STRING", 25 | "value": "$env{VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake" 26 | } 27 | }, 28 | "hidden": true, 29 | "name": "vcpkg" 30 | }, 31 | { 32 | "cacheVariables": { 33 | "CMAKE_MSVC_RUNTIME_LIBRARY": { 34 | "type": "STRING", 35 | "value": "MultiThreaded$<$:Debug>DLL" 36 | }, 37 | "VCPKG_TARGET_TRIPLET": { 38 | "type": "STRING", 39 | "value": "x64-windows-static-md" 40 | } 41 | }, 42 | "hidden": true, 43 | "name": "windows" 44 | }, 45 | { 46 | "architecture": { 47 | "strategy": "set", 48 | "value": "x64" 49 | }, 50 | "cacheVariables": { 51 | "CMAKE_CXX_FLAGS": "/EHsc /MP /W4 /WX" 52 | }, 53 | "generator": "Visual Studio 17 2022", 54 | "inherits": [ 55 | "cmake-dev", 56 | "vcpkg", 57 | "windows" 58 | ], 59 | "name": "vs2022-windows", 60 | "toolset": "v143" 61 | } 62 | ], 63 | "version": 3 64 | } -------------------------------------------------------------------------------- /src/main.cpp: -------------------------------------------------------------------------------- 1 | #include "Hooks.h" 2 | 3 | namespace 4 | { 5 | void InitializeLog() 6 | { 7 | #ifndef NDEBUG 8 | auto sink = std::make_shared(); 9 | #else 10 | auto path = logger::log_directory(); 11 | if (!path) { 12 | util::report_and_fail("Failed to find standard logging directory"sv); 13 | } 14 | 15 | *path /= fmt::format("{}.log"sv, Plugin::NAME); 16 | auto sink = std::make_shared(path->string(), true); 17 | #endif 18 | 19 | #ifndef NDEBUG 20 | const auto level = spdlog::level::trace; 21 | #else 22 | const auto level = spdlog::level::info; 23 | #endif 24 | 25 | auto log = std::make_shared("global log"s, std::move(sink)); 26 | log->set_level(level); 27 | log->flush_on(level); 28 | 29 | spdlog::set_default_logger(std::move(log)); 30 | spdlog::set_pattern("%g(%#): [%^%l%$] %v"s); 31 | } 32 | } 33 | 34 | extern "C" DLLEXPORT bool SKSEAPI SKSEPlugin_Query(const SKSE::QueryInterface* a_skse, SKSE::PluginInfo* a_info) 35 | { 36 | a_info->infoVersion = SKSE::PluginInfo::kVersion; 37 | a_info->name = Plugin::NAME.data(); 38 | a_info->version = Plugin::VERSION.pack(); 39 | 40 | if (a_skse->IsEditor()) { 41 | logger::critical("Loaded in editor, marking as incompatible"sv); 42 | return false; 43 | } 44 | 45 | const auto ver = a_skse->RuntimeVersion(); 46 | if (REL::Module::IsSE() && ver < SKSE::RUNTIME_SSE_1_5_39 || REL::Module::IsVR() && ver < SKSE::RUNTIME_LATEST_VR) { 47 | logger::critical(FMT_STRING("Unsupported runtime version {}"), ver.string()); 48 | return false; 49 | } 50 | 51 | return true; 52 | } 53 | 54 | extern "C" DLLEXPORT constinit auto SKSEPlugin_Version = []() { 55 | SKSE::PluginVersionData v; 56 | 57 | v.PluginVersion(Plugin::VERSION); 58 | v.PluginName(Plugin::NAME); 59 | v.AuthorName("Ersh"); 60 | v.UsesAddressLibrary(true); 61 | v.CompatibleVersions({ SKSE::RUNTIME_SSE_LATEST }); 62 | v.HasNoStructUse(true); 63 | 64 | return v; 65 | }(); 66 | 67 | extern "C" DLLEXPORT bool SKSEAPI SKSEPlugin_Load(const SKSE::LoadInterface* a_skse) 68 | { 69 | #ifndef NDEBUG 70 | while (!IsDebuggerPresent()) { 71 | Sleep(100); 72 | } 73 | #endif 74 | REL::Module::reset(); // Clib-NG bug workaround 75 | 76 | InitializeLog(); 77 | logger::info("{} v{}"sv, Plugin::NAME, Plugin::VERSION.string()); 78 | 79 | SKSE::Init(a_skse); 80 | 81 | Hooks::Install(); 82 | 83 | return true; 84 | } 85 | -------------------------------------------------------------------------------- /src/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | set(ROOT_DIR "${CMAKE_CURRENT_SOURCE_DIR}/..") 2 | 3 | set(SOURCE_DIR "${ROOT_DIR}/src") 4 | set(SOURCE_FILES 5 | "${SOURCE_DIR}/Hooks.cpp" 6 | "${SOURCE_DIR}/Hooks.h" 7 | "${SOURCE_DIR}/main.cpp" 8 | "${SOURCE_DIR}/Offsets.h" 9 | "${SOURCE_DIR}/PCH.h" 10 | ) 11 | 12 | source_group(TREE "${ROOT_DIR}" FILES ${SOURCE_FILES}) 13 | 14 | set(VERSION_HEADER "${CMAKE_CURRENT_BINARY_DIR}/src/Plugin.h") 15 | configure_file( 16 | "${ROOT_DIR}/cmake/Plugin.h.in" 17 | "${VERSION_HEADER}" 18 | @ONLY 19 | ) 20 | 21 | source_group("src" FILES "${VERSION_HEADER}") 22 | 23 | configure_file( 24 | "${ROOT_DIR}/cmake/version.rc.in" 25 | "${CMAKE_CURRENT_BINARY_DIR}/version.rc" 26 | @ONLY 27 | ) 28 | 29 | add_library( 30 | "${PROJECT_NAME}" 31 | SHARED 32 | ${SOURCE_FILES} 33 | "${VERSION_HEADER}" 34 | "${CMAKE_CURRENT_BINARY_DIR}/version.rc" 35 | "${ROOT_DIR}/.clang-format" 36 | "${ROOT_DIR}/.editorconfig" 37 | ) 38 | 39 | target_compile_features( 40 | "${PROJECT_NAME}" 41 | PRIVATE 42 | cxx_std_20 43 | ) 44 | 45 | if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC") 46 | target_compile_options( 47 | "${PROJECT_NAME}" 48 | PRIVATE 49 | "/sdl" # Enable Additional Security Checks 50 | "/utf-8" # Set Source and Executable character sets to UTF-8 51 | # "/Zi" # Debug Information Format 52 | 53 | "/await" 54 | 55 | "/permissive-" # Standards conformance 56 | "/Zc:preprocessor" # Enable preprocessor conformance mode 57 | 58 | "/wd4200" # nonstandard extension used : zero-sized array in struct/union 59 | 60 | "$<$:/ZI>" 61 | "$<$:/Zi;/Zc:inline;/JMC-;/Ob3>" 62 | ) 63 | 64 | target_link_options( 65 | "${PROJECT_NAME}" 66 | PRIVATE 67 | "$<$:/INCREMENTAL;/OPT:NOREF;/OPT:NOICF>" 68 | "$<$:/INCREMENTAL:NO;/OPT:REF;/OPT:ICF;/DEBUG:FULL>" 69 | ) 70 | endif() 71 | 72 | target_include_directories( 73 | "${PROJECT_NAME}" 74 | PRIVATE 75 | "${CMAKE_CURRENT_BINARY_DIR}/src" 76 | "${SOURCE_DIR}" 77 | ) 78 | 79 | add_subdirectory("$ENV{CommonLibSSEPath_NG}" CommonLibSSE EXCLUDE_FROM_ALL) 80 | 81 | target_link_libraries( 82 | "${PROJECT_NAME}" 83 | PRIVATE 84 | CommonLibSSE::CommonLibSSE 85 | ) 86 | 87 | target_precompile_headers( 88 | "${PROJECT_NAME}" 89 | PRIVATE 90 | "${SOURCE_DIR}/PCH.h" 91 | ) 92 | 93 | install( 94 | FILES 95 | "$" 96 | DESTINATION "SKSE/Plugins" 97 | COMPONENT "main" 98 | ) 99 | 100 | install( 101 | FILES 102 | "$" 103 | DESTINATION "/" 104 | COMPONENT "pdbs" 105 | ) 106 | 107 | if("${COPY_OUTPUT}") 108 | add_custom_command( 109 | TARGET "${PROJECT_NAME}" 110 | POST_BUILD 111 | COMMAND "${CMAKE_COMMAND}" -E copy_if_different "$" "${CompiledPluginsPath}/SKSE/Plugins/" 112 | COMMAND "${CMAKE_COMMAND}" -E copy_if_different "$" "${CompiledPluginsPath}/SKSE/Plugins/" 113 | VERBATIM 114 | ) 115 | endif() 116 | -------------------------------------------------------------------------------- /.clang-format: -------------------------------------------------------------------------------- 1 | --- 2 | AccessModifierOffset: -4 3 | AlignAfterOpenBracket: DontAlign 4 | AlignConsecutiveAssignments: 'false' 5 | AlignConsecutiveBitFields: 'false' 6 | AlignConsecutiveDeclarations: 'false' 7 | AlignConsecutiveMacros: 'false' 8 | AlignEscapedNewlines: Left 9 | AlignOperands: Align 10 | AlignTrailingComments: 'true' 11 | AllowAllArgumentsOnNextLine: 'false' 12 | AllowAllConstructorInitializersOnNextLine: 'false' 13 | AllowAllParametersOfDeclarationOnNextLine: 'false' 14 | AllowShortBlocksOnASingleLine: Empty 15 | AllowShortCaseLabelsOnASingleLine: 'false' 16 | AllowShortEnumsOnASingleLine: 'true' 17 | AllowShortFunctionsOnASingleLine: All 18 | AllowShortIfStatementsOnASingleLine: Never 19 | AllowShortLambdasOnASingleLine: All 20 | AllowShortLoopsOnASingleLine: 'true' 21 | AlwaysBreakAfterReturnType: None 22 | AlwaysBreakBeforeMultilineStrings: 'true' 23 | AlwaysBreakTemplateDeclarations: 'Yes' 24 | BinPackArguments: 'true' 25 | BinPackParameters: 'true' 26 | BitFieldColonSpacing: After 27 | BraceWrapping: 28 | AfterCaseLabel: 'true' 29 | AfterClass: 'true' 30 | AfterControlStatement: 'false' 31 | AfterEnum: 'true' 32 | AfterFunction: 'true' 33 | AfterNamespace: 'true' 34 | AfterStruct: 'true' 35 | AfterUnion: 'true' 36 | AfterExternBlock: 'true' 37 | BeforeCatch: 'false' 38 | BeforeElse: 'false' 39 | BeforeLambdaBody: 'false' 40 | BeforeWhile: 'false' 41 | IndentBraces: 'false' 42 | SplitEmptyFunction: 'false' 43 | SplitEmptyRecord: 'false' 44 | SplitEmptyNamespace: 'false' 45 | BreakBeforeBinaryOperators: None 46 | BreakBeforeBraces: Custom 47 | BreakBeforeTernaryOperators: 'false' 48 | BreakConstructorInitializers: AfterColon 49 | BreakInheritanceList: AfterColon 50 | BreakStringLiterals: 'true' 51 | ColumnLimit: 0 52 | CompactNamespaces: 'false' 53 | ConstructorInitializerAllOnOneLineOrOnePerLine: 'false' 54 | ConstructorInitializerIndentWidth: 4 55 | ContinuationIndentWidth: 4 56 | Cpp11BracedListStyle: 'false' 57 | DeriveLineEnding: 'true' 58 | DerivePointerAlignment: 'false' 59 | DisableFormat: 'false' 60 | FixNamespaceComments: 'false' 61 | IncludeBlocks: Preserve 62 | IndentCaseBlocks: 'true' 63 | IndentCaseLabels: 'false' 64 | IndentExternBlock: Indent 65 | IndentGotoLabels: 'false' 66 | IndentPPDirectives: AfterHash 67 | IndentWidth: 4 68 | IndentWrappedFunctionNames: 'true' 69 | KeepEmptyLinesAtTheStartOfBlocks: 'false' 70 | Language: Cpp 71 | MaxEmptyLinesToKeep: 1 72 | NamespaceIndentation: All 73 | PointerAlignment: Left 74 | ReflowComments : 'false' 75 | SortIncludes: 'true' 76 | SortUsingDeclarations: 'true' 77 | SpaceAfterCStyleCast: 'false' 78 | SpaceAfterLogicalNot: 'false' 79 | SpaceAfterTemplateKeyword: 'true' 80 | SpaceBeforeAssignmentOperators: 'true' 81 | SpaceBeforeCpp11BracedList: 'false' 82 | SpaceBeforeCtorInitializerColon: 'true' 83 | SpaceBeforeInheritanceColon: 'true' 84 | SpaceBeforeParens: ControlStatements 85 | SpaceBeforeRangeBasedForLoopColon: 'true' 86 | SpaceBeforeSquareBrackets: 'false' 87 | SpaceInEmptyBlock: 'false' 88 | SpaceInEmptyParentheses: 'false' 89 | SpacesBeforeTrailingComments: 2 90 | SpacesInAngles: 'false' 91 | SpacesInCStyleCastParentheses: 'false' 92 | SpacesInConditionalStatement: 'false' 93 | SpacesInContainerLiterals: 'true' 94 | SpacesInParentheses: 'false' 95 | SpacesInSquareBrackets: 'false' 96 | Standard: Latest 97 | TabWidth: 4 98 | UseCRLF: 'true' 99 | UseTab: AlignWithSpaces 100 | 101 | ... 102 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Created by https://www.toptal.com/developers/gitignore/api/cmake,visualstudio 2 | # Edit at https://www.toptal.com/developers/gitignore?templates=cmake,visualstudio 3 | 4 | ### CMake ### 5 | CMakeLists.txt.user 6 | CMakeCache.txt 7 | CMakeFiles 8 | CMakeScripts 9 | Testing 10 | Makefile 11 | cmake_install.cmake 12 | install_manifest.txt 13 | compile_commands.json 14 | CTestTestfile.cmake 15 | _deps 16 | 17 | ### CMake Patch ### 18 | # External projects 19 | *-prefix/ 20 | 21 | ### VisualStudio ### 22 | ## Ignore Visual Studio temporary files, build results, and 23 | ## files generated by popular Visual Studio add-ons. 24 | ## 25 | ## Get latest from https://github.com/github/gitignore/blob/main/VisualStudio.gitignore 26 | 27 | # User-specific files 28 | *.rsuser 29 | *.suo 30 | *.user 31 | *.userosscache 32 | *.sln.docstates 33 | 34 | # User-specific files (MonoDevelop/Xamarin Studio) 35 | *.userprefs 36 | 37 | # Mono auto generated files 38 | mono_crash.* 39 | 40 | # Build results 41 | [Dd]ebug/ 42 | [Dd]ebugPublic/ 43 | [Rr]elease/ 44 | [Rr]eleases/ 45 | x64/ 46 | x86/ 47 | [Ww][Ii][Nn]32/ 48 | [Aa][Rr][Mm]/ 49 | [Aa][Rr][Mm]64/ 50 | bld/ 51 | [Bb]in/ 52 | [Oo]bj/ 53 | [Ll]og/ 54 | [Ll]ogs/ 55 | 56 | # Visual Studio 2015/2017 cache/options directory 57 | .vs/ 58 | # Uncomment if you have tasks that create the project's static files in wwwroot 59 | #wwwroot/ 60 | 61 | # Visual Studio 2017 auto generated files 62 | Generated\ Files/ 63 | 64 | # MSTest test Results 65 | [Tt]est[Rr]esult*/ 66 | [Bb]uild[Ll]og.* 67 | 68 | # NUnit 69 | *.VisualState.xml 70 | TestResult.xml 71 | nunit-*.xml 72 | 73 | # Build Results of an ATL Project 74 | [Dd]ebugPS/ 75 | [Rr]eleasePS/ 76 | dlldata.c 77 | 78 | # Benchmark Results 79 | BenchmarkDotNet.Artifacts/ 80 | 81 | # .NET Core 82 | project.lock.json 83 | project.fragment.lock.json 84 | artifacts/ 85 | 86 | # ASP.NET Scaffolding 87 | ScaffoldingReadMe.txt 88 | 89 | # StyleCop 90 | StyleCopReport.xml 91 | 92 | # Files built by Visual Studio 93 | *_i.c 94 | *_p.c 95 | *_h.h 96 | *.ilk 97 | *.meta 98 | *.obj 99 | *.iobj 100 | *.pch 101 | *.pdb 102 | *.ipdb 103 | *.pgc 104 | *.pgd 105 | *.rsp 106 | *.sbr 107 | *.tlb 108 | *.tli 109 | *.tlh 110 | *.tmp 111 | *.tmp_proj 112 | *_wpftmp.csproj 113 | *.log 114 | *.tlog 115 | *.vspscc 116 | *.vssscc 117 | .builds 118 | *.pidb 119 | *.svclog 120 | *.scc 121 | 122 | # Chutzpah Test files 123 | _Chutzpah* 124 | 125 | # Visual C++ cache files 126 | ipch/ 127 | *.aps 128 | *.ncb 129 | *.opendb 130 | *.opensdf 131 | *.sdf 132 | *.cachefile 133 | *.VC.db 134 | *.VC.VC.opendb 135 | 136 | # Visual Studio profiler 137 | *.psess 138 | *.vsp 139 | *.vspx 140 | *.sap 141 | 142 | # Visual Studio Trace Files 143 | *.e2e 144 | 145 | # TFS 2012 Local Workspace 146 | $tf/ 147 | 148 | # Guidance Automation Toolkit 149 | *.gpState 150 | 151 | # ReSharper is a .NET coding add-in 152 | _ReSharper*/ 153 | *.[Rr]e[Ss]harper 154 | *.DotSettings.user 155 | 156 | # TeamCity is a build add-in 157 | _TeamCity* 158 | 159 | # DotCover is a Code Coverage Tool 160 | *.dotCover 161 | 162 | # AxoCover is a Code Coverage Tool 163 | .axoCover/* 164 | !.axoCover/settings.json 165 | 166 | # Coverlet is a free, cross platform Code Coverage Tool 167 | coverage*.json 168 | coverage*.xml 169 | coverage*.info 170 | 171 | # Visual Studio code coverage results 172 | *.coverage 173 | *.coveragexml 174 | 175 | # NCrunch 176 | _NCrunch_* 177 | .*crunch*.local.xml 178 | nCrunchTemp_* 179 | 180 | # MightyMoose 181 | *.mm.* 182 | AutoTest.Net/ 183 | 184 | # Web workbench (sass) 185 | .sass-cache/ 186 | 187 | # Installshield output folder 188 | [Ee]xpress/ 189 | 190 | # DocProject is a documentation generator add-in 191 | DocProject/buildhelp/ 192 | DocProject/Help/*.HxT 193 | DocProject/Help/*.HxC 194 | DocProject/Help/*.hhc 195 | DocProject/Help/*.hhk 196 | DocProject/Help/*.hhp 197 | DocProject/Help/Html2 198 | DocProject/Help/html 199 | 200 | # Click-Once directory 201 | publish/ 202 | 203 | # Publish Web Output 204 | *.[Pp]ublish.xml 205 | *.azurePubxml 206 | # Note: Comment the next line if you want to checkin your web deploy settings, 207 | # but database connection strings (with potential passwords) will be unencrypted 208 | *.pubxml 209 | *.publishproj 210 | 211 | # Microsoft Azure Web App publish settings. Comment the next line if you want to 212 | # checkin your Azure Web App publish settings, but sensitive information contained 213 | # in these scripts will be unencrypted 214 | PublishScripts/ 215 | 216 | # NuGet Packages 217 | *.nupkg 218 | # NuGet Symbol Packages 219 | *.snupkg 220 | # The packages folder can be ignored because of Package Restore 221 | **/[Pp]ackages/* 222 | # except build/, which is used as an MSBuild target. 223 | !**/[Pp]ackages/build/ 224 | # Uncomment if necessary however generally it will be regenerated when needed 225 | #!**/[Pp]ackages/repositories.config 226 | # NuGet v3's project.json files produces more ignorable files 227 | *.nuget.props 228 | *.nuget.targets 229 | 230 | # Microsoft Azure Build Output 231 | csx/ 232 | *.build.csdef 233 | 234 | # Microsoft Azure Emulator 235 | ecf/ 236 | rcf/ 237 | 238 | # Windows Store app package directories and files 239 | AppPackages/ 240 | BundleArtifacts/ 241 | Package.StoreAssociation.xml 242 | _pkginfo.txt 243 | *.appx 244 | *.appxbundle 245 | *.appxupload 246 | 247 | # Visual Studio cache files 248 | # files ending in .cache can be ignored 249 | *.[Cc]ache 250 | # but keep track of directories ending in .cache 251 | !?*.[Cc]ache/ 252 | 253 | # Others 254 | ClientBin/ 255 | ~$* 256 | *~ 257 | *.dbmdl 258 | *.dbproj.schemaview 259 | *.jfm 260 | *.pfx 261 | *.publishsettings 262 | orleans.codegen.cs 263 | 264 | # Including strong name files can present a security risk 265 | # (https://github.com/github/gitignore/pull/2483#issue-259490424) 266 | #*.snk 267 | 268 | # Since there are multiple workflows, uncomment next line to ignore bower_components 269 | # (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) 270 | #bower_components/ 271 | 272 | # RIA/Silverlight projects 273 | Generated_Code/ 274 | 275 | # Backup & report files from converting an old project file 276 | # to a newer Visual Studio version. Backup files are not needed, 277 | # because we have git ;-) 278 | _UpgradeReport_Files/ 279 | Backup*/ 280 | UpgradeLog*.XML 281 | UpgradeLog*.htm 282 | ServiceFabricBackup/ 283 | *.rptproj.bak 284 | 285 | # SQL Server files 286 | *.mdf 287 | *.ldf 288 | *.ndf 289 | 290 | # Business Intelligence projects 291 | *.rdl.data 292 | *.bim.layout 293 | *.bim_*.settings 294 | *.rptproj.rsuser 295 | *- [Bb]ackup.rdl 296 | *- [Bb]ackup ([0-9]).rdl 297 | *- [Bb]ackup ([0-9][0-9]).rdl 298 | 299 | # Microsoft Fakes 300 | FakesAssemblies/ 301 | 302 | # GhostDoc plugin setting file 303 | *.GhostDoc.xml 304 | 305 | # Node.js Tools for Visual Studio 306 | .ntvs_analysis.dat 307 | node_modules/ 308 | 309 | # Visual Studio 6 build log 310 | *.plg 311 | 312 | # Visual Studio 6 workspace options file 313 | *.opt 314 | 315 | # Visual Studio 6 auto-generated workspace file (contains which files were open etc.) 316 | *.vbw 317 | 318 | # Visual Studio 6 auto-generated project file (contains which files were open etc.) 319 | *.vbp 320 | 321 | # Visual Studio 6 workspace and project file (working project files containing files to include in project) 322 | *.dsw 323 | *.dsp 324 | 325 | # Visual Studio 6 technical files 326 | 327 | # Visual Studio LightSwitch build output 328 | **/*.HTMLClient/GeneratedArtifacts 329 | **/*.DesktopClient/GeneratedArtifacts 330 | **/*.DesktopClient/ModelManifest.xml 331 | **/*.Server/GeneratedArtifacts 332 | **/*.Server/ModelManifest.xml 333 | _Pvt_Extensions 334 | 335 | # Paket dependency manager 336 | .paket/paket.exe 337 | paket-files/ 338 | 339 | # FAKE - F# Make 340 | .fake/ 341 | 342 | # CodeRush personal settings 343 | .cr/personal 344 | 345 | # Python Tools for Visual Studio (PTVS) 346 | __pycache__/ 347 | *.pyc 348 | 349 | # Cake - Uncomment if you are using it 350 | # tools/** 351 | # !tools/packages.config 352 | 353 | # Tabs Studio 354 | *.tss 355 | 356 | # Telerik's JustMock configuration file 357 | *.jmconfig 358 | 359 | # BizTalk build output 360 | *.btp.cs 361 | *.btm.cs 362 | *.odx.cs 363 | *.xsd.cs 364 | 365 | # OpenCover UI analysis results 366 | OpenCover/ 367 | 368 | # Azure Stream Analytics local run output 369 | ASALocalRun/ 370 | 371 | # MSBuild Binary and Structured Log 372 | *.binlog 373 | 374 | # NVidia Nsight GPU debugger configuration file 375 | *.nvuser 376 | 377 | # MFractors (Xamarin productivity tool) working folder 378 | .mfractor/ 379 | 380 | # Local History for Visual Studio 381 | .localhistory/ 382 | 383 | # Visual Studio History (VSHistory) files 384 | .vshistory/ 385 | 386 | # BeatPulse healthcheck temp database 387 | healthchecksdb 388 | 389 | # Backup folder for Package Reference Convert tool in Visual Studio 2017 390 | MigrationBackup/ 391 | 392 | # Ionide (cross platform F# VS Code tools) working folder 393 | .ionide/ 394 | 395 | # Fody - auto-generated XML schema 396 | FodyWeavers.xsd 397 | 398 | # VS Code files for those working on multiple tools 399 | .vscode/* 400 | !.vscode/settings.json 401 | !.vscode/tasks.json 402 | !.vscode/launch.json 403 | !.vscode/extensions.json 404 | *.code-workspace 405 | 406 | # Local History for Visual Studio Code 407 | .history/ 408 | 409 | # Windows Installer files from build outputs 410 | *.cab 411 | *.msi 412 | *.msix 413 | *.msm 414 | *.msp 415 | 416 | # JetBrains Rider 417 | *.sln.iml 418 | 419 | ### VisualStudio Patch ### 420 | # Additional files built by Visual Studio 421 | 422 | # End of https://www.toptal.com/developers/gitignore/api/cmake,visualstudio 423 | 424 | /build --------------------------------------------------------------------------------