diff --git a/.clang-tidy b/.clang-tidy index 8c981d4..7229322 100644 --- a/.clang-tidy +++ b/.clang-tidy @@ -1,45 +1,414 @@ --- -Checks: 'clang-diagnostic-*,clang-analyzer-*' +Checks: 'clang-diagnostic-*,clang-analyzer-*,-*,bugprone-*,cert-*,clang-analyzer-*,concurrency-*,cppcoreguidelines-*,modernize-*,performance-*,portability-*,readability-*' WarningsAsErrors: '' -HeaderFilterRegex: '' +HeaderFilterRegex: '.*' AnalyzeTemporaryDtors: false -FormatStyle: none +FormatStyle: file +User: derek CheckOptions: - - key: llvm-else-after-return.WarnOnConditionVariables + - key: cppcoreguidelines-no-malloc.Reallocations + value: '::realloc' + - key: cppcoreguidelines-owning-memory.LegacyResourceConsumers + value: '::free;::realloc;::freopen;::fclose' + - key: bugprone-reserved-identifier.Invert + value: 'false' + - key: modernize-use-auto.MinTypeNameLength + value: '5' + - key: bugprone-unused-return-value.CheckedFunctions + value: '::std::async;::std::launder;::std::remove;::std::remove_if;::std::unique;::std::unique_ptr::release;::std::basic_string::empty;::std::vector::empty;::std::back_inserter;::std::distance;::std::find;::std::find_if;::std::inserter;::std::lower_bound;::std::make_pair;::std::map::count;::std::map::find;::std::map::lower_bound;::std::multimap::equal_range;::std::multimap::upper_bound;::std::set::count;::std::set::find;::std::setfill;::std::setprecision;::std::setw;::std::upper_bound;::std::vector::at;::bsearch;::ferror;::feof;::isalnum;::isalpha;::isblank;::iscntrl;::isdigit;::isgraph;::islower;::isprint;::ispunct;::isspace;::isupper;::iswalnum;::iswprint;::iswspace;::isxdigit;::memchr;::memcmp;::strcmp;::strcoll;::strncmp;::strpbrk;::strrchr;::strspn;::strstr;::wcscmp;::access;::bind;::connect;::difftime;::dlsym;::fnmatch;::getaddrinfo;::getopt;::htonl;::htons;::iconv_open;::inet_addr;::isascii;::isatty;::mmap;::newlocale;::openat;::pathconf;::pthread_equal;::pthread_getspecific;::pthread_mutex_trylock;::readdir;::readlink;::recvmsg;::regexec;::scandir;::semget;::setjmp;::shm_open;::shmget;::sigismember;::strcasecmp;::strsignal;::ttyname' + - key: bugprone-narrowing-conversions.PedanticMode + value: 'false' + - key: cert-dcl51-cpp.AggressiveDependentMemberLookup + value: 'false' + - key: cppcoreguidelines-macro-usage.CheckCapsOnly + value: 'false' + - key: readability-inconsistent-declaration-parameter-name.Strict + value: 'false' + - key: cert-dcl37-c.AllowedIdentifiers + value: '' + - key: cert-err09-cpp.WarnOnLargeObjects + value: 'false' + - key: bugprone-suspicious-string-compare.WarnOnImplicitComparison + value: 'true' + - key: bugprone-argument-comment.CommentNullPtrs value: '0' - - key: modernize-loop-convert.MinConfidence - value: reasonable - - key: modernize-replace-auto-ptr.IncludeStyle + - key: cppcoreguidelines-narrowing-conversions.WarnOnFloatingPointNarrowingConversion + value: 'true' + - key: cppcoreguidelines-init-variables.IncludeStyle value: llvm - - key: cert-str34-c.DiagnoseSignedUnsignedCharComparisons - value: '0' - - key: google-readability-namespace-comments.ShortNamespaceLines - value: '10' + - key: modernize-use-nodiscard.ReplacementString + value: '[[nodiscard]]' + - key: modernize-loop-convert.MakeReverseRangeHeader + value: '' + - key: performance-move-constructor-init.IncludeStyle + value: llvm + - key: modernize-loop-convert.UseCxx20ReverseRanges + value: 'true' + - key: cert-oop57-cpp.MemSetNames + value: '' + - key: performance-type-promotion-in-math-fn.IncludeStyle + value: llvm + - key: bugprone-suspicious-include.ImplementationFileExtensions + value: 'c;cc;cpp;cxx' + - key: modernize-loop-convert.MakeReverseRangeFunction + value: '' + - key: readability-inconsistent-declaration-parameter-name.IgnoreMacros + value: 'true' + - key: bugprone-suspicious-missing-comma.SizeThreshold + value: '5' + - key: readability-identifier-naming.IgnoreFailedSplit + value: 'false' + - key: readability-qualified-auto.AddConstToQualified + value: 'true' + - key: bugprone-sizeof-expression.WarnOnSizeOfThis + value: 'true' + - key: bugprone-string-constructor.WarnOnLargeLength + value: 'true' + - key: cppcoreguidelines-explicit-virtual-functions.OverrideSpelling + value: override + - key: readability-uppercase-literal-suffix.IgnoreMacros + value: 'true' + - key: cert-dcl59-cpp.HeaderFileExtensions + value: ';h;hh;hpp;hxx' + - key: bugprone-dynamic-static-initializers.HeaderFileExtensions + value: ';h;hh;hpp;hxx' + - key: bugprone-suspicious-enum-usage.StrictMode + value: 'false' + - key: performance-unnecessary-copy-initialization.AllowedTypes + value: '' + - key: bugprone-suspicious-missing-comma.MaxConcatenatedTokens + value: '5' + - key: modernize-use-transparent-functors.SafeMode + value: 'false' + - key: modernize-make-shared.IgnoreMacros + value: 'true' + - key: bugprone-not-null-terminated-result.WantToUseSafeFunctions + value: 'true' + - key: bugprone-string-constructor.LargeLengthThreshold + value: '8388608' + - key: readability-simplify-boolean-expr.ChainedConditionalAssignment + value: 'false' + - key: cppcoreguidelines-avoid-magic-numbers.IgnoreAllFloatingPointValues + value: 'false' - key: cert-oop54-cpp.WarnOnlyIfThisHasSuspiciousField + value: 'false' + - key: cert-err09-cpp.CheckThrowTemporaries + value: 'true' + - key: bugprone-argument-comment.CommentStringLiterals value: '0' - - key: cppcoreguidelines-non-private-member-variables-in-classes.IgnoreClassesWithAllMemberVariablesBeingPublic - value: '1' - - key: cert-dcl16-c.NewSuffixes - value: 'L;LL;LU;LLU' - - key: google-readability-braces-around-statements.ShortStatementLines - value: '1' - - key: modernize-pass-by-value.IncludeStyle - value: llvm - - key: google-readability-namespace-comments.SpacesBeforeComments - value: '2' + - key: performance-inefficient-vector-operation.EnableProto + value: 'false' - key: modernize-loop-convert.MaxCopySize value: '16' - - key: cppcoreguidelines-explicit-virtual-functions.IgnoreDestructors + - key: bugprone-exception-escape.FunctionsThatShouldNotThrow + value: '' + - key: portability-simd-intrinsics.Suggest + value: 'false' + - key: cppcoreguidelines-pro-bounds-constant-array-index.GslHeader + value: '' + - key: readability-function-size.LineThreshold + value: '4294967295' + - key: modernize-make-shared.MakeSmartPtrFunctionHeader + value: '' + - key: modernize-make-shared.MakeSmartPtrFunction + value: 'std::make_shared' + - key: modernize-use-override.IgnoreDestructors + value: 'false' + - key: bugprone-sizeof-expression.WarnOnSizeOfConstant + value: 'true' + - key: readability-redundant-string-init.StringNames + value: '::std::basic_string_view;::std::basic_string' + - key: modernize-make-unique.IgnoreDefaultInitialization + value: 'true' + - key: modernize-use-emplace.ContainersWithPushBack + value: '::std::vector;::std::list;::std::deque' + - key: readability-magic-numbers.IgnoreBitFieldsWidths + value: 'true' + - key: modernize-make-unique.IncludeStyle + value: llvm + - key: modernize-use-override.OverrideSpelling + value: override + - key: concurrency-mt-unsafe.FunctionSet + value: any + - key: google-readability-braces-around-statements.ShortStatementLines value: '1' - - key: modernize-use-nullptr.NullMacros - value: 'NULL' - - key: llvm-qualified-auto.AddConstToQualified - value: '0' - - key: modernize-loop-convert.NamingStyle - value: CamelCase - - key: llvm-else-after-return.WarnOnUnfixable - value: '0' + - key: bugprone-reserved-identifier.AllowedIdentifiers + value: '' + - key: cppcoreguidelines-pro-type-member-init.IgnoreArrays + value: 'false' + - key: readability-else-after-return.WarnOnUnfixable + value: 'true' + - key: cppcoreguidelines-avoid-magic-numbers.IgnoredFloatingPointValues + value: '1.0;100.0;' + - key: modernize-use-emplace.IgnoreImplicitConstructors + value: 'false' + - key: cppcoreguidelines-macro-usage.IgnoreCommandLineMacros + value: 'true' + - key: modernize-use-equals-delete.IgnoreMacros + value: 'true' + - key: cppcoreguidelines-pro-bounds-constant-array-index.IncludeStyle + value: llvm + - key: readability-magic-numbers.IgnoreAllFloatingPointValues + value: 'false' + - key: bugprone-misplaced-widening-cast.CheckImplicitCasts + value: 'false' + - key: readability-uppercase-literal-suffix.NewSuffixes + value: '' + - key: modernize-loop-convert.MinConfidence + value: reasonable + - key: cppcoreguidelines-avoid-magic-numbers.IgnorePowersOf2IntegerValues + value: 'false' + - key: bugprone-suspicious-missing-comma.RatioThreshold + value: '0.200000' + - key: performance-unnecessary-value-param.AllowedTypes + value: '' + - key: cppcoreguidelines-avoid-magic-numbers.IgnoredIntegerValues + value: '1;2;3;4;' + - key: google-readability-namespace-comments.SpacesBeforeComments + value: '2' + - key: cppcoreguidelines-avoid-magic-numbers.IgnoreBitFieldsWidths + value: 'true' + - key: cert-err61-cpp.CheckThrowTemporaries + value: 'true' + - key: cppcoreguidelines-no-malloc.Allocations + value: '::malloc;::calloc' + - key: readability-function-size.BranchThreshold + value: '4294967295' + - key: readability-implicit-bool-conversion.AllowIntegerConditions + value: 'false' + - key: readability-function-size.StatementThreshold + value: '800' + - key: readability-identifier-naming.IgnoreMainLikeFunctions + value: 'false' + - key: cppcoreguidelines-init-variables.MathHeader + value: '' - key: google-readability-function-size.StatementThreshold value: '800' + - key: cert-msc51-cpp.DisallowedSeedTypes + value: 'time_t,std::time_t' + - key: bugprone-reserved-identifier.AggressiveDependentMemberLookup + value: 'false' + - key: modernize-use-equals-default.IgnoreMacros + value: 'true' + - key: cppcoreguidelines-special-member-functions.AllowSoleDefaultDtor + value: 'false' + - key: cert-dcl37-c.AggressiveDependentMemberLookup + value: 'false' + - key: cppcoreguidelines-no-malloc.Deallocations + value: '::free' + - key: modernize-use-emplace.SmartPointers + value: '::std::shared_ptr;::std::unique_ptr;::std::auto_ptr;::std::weak_ptr' + - key: bugprone-dangling-handle.HandleClasses + value: 'std::basic_string_view;std::experimental::basic_string_view' + - key: readability-magic-numbers.IgnorePowersOf2IntegerValues + value: 'false' + - key: cert-oop11-cpp.IncludeStyle + value: llvm + - key: readability-simplify-subscript-expr.Types + value: '::std::basic_string;::std::basic_string_view;::std::vector;::std::array' + - key: modernize-replace-auto-ptr.IncludeStyle + value: llvm + - key: performance-move-const-arg.CheckTriviallyCopyableMove + value: 'true' + - key: readability-static-accessed-through-instance.NameSpecifierNestingThreshold + value: '3' + - key: readability-function-size.VariableThreshold + value: '4294967295' + - key: cert-dcl16-c.NewSuffixes + value: 'L;LL;LU;LLU' + - key: bugprone-narrowing-conversions.WarnOnFloatingPointNarrowingConversion + value: 'true' + - key: readability-identifier-naming.GetConfigPerFile + value: 'true' + - key: cert-err61-cpp.MaxSize + value: '-1' + - key: modernize-use-default-member-init.UseAssignment + value: 'false' + - key: readability-function-size.NestingThreshold + value: '4294967295' + - key: modernize-use-override.AllowOverrideAndFinal + value: 'false' + - key: readability-function-size.ParameterThreshold + value: '4294967295' + - key: modernize-pass-by-value.ValuesOnly + value: 'false' + - key: modernize-loop-convert.IncludeStyle + value: llvm + - key: cert-str34-c.DiagnoseSignedUnsignedCharComparisons + value: 'false' + - key: bugprone-suspicious-string-compare.WarnOnLogicalNotComparison + value: 'false' + - key: cppcoreguidelines-explicit-virtual-functions.AllowOverrideAndFinal + value: 'false' + - key: readability-redundant-smartptr-get.IgnoreMacros + value: 'true' + - key: readability-identifier-naming.AggressiveDependentMemberLookup + value: 'false' + - key: cert-err61-cpp.WarnOnLargeObjects + value: 'false' + - key: modernize-use-emplace.TupleTypes + value: '::std::pair;::std::tuple' + - key: modernize-use-emplace.TupleMakeFunctions + value: '::std::make_pair;::std::make_tuple' + - key: cppcoreguidelines-owning-memory.LegacyResourceProducers + value: '::malloc;::aligned_alloc;::realloc;::calloc;::fopen;::freopen;::tmpfile' + - key: bugprone-argument-comment.StrictMode + value: '0' + - key: modernize-replace-random-shuffle.IncludeStyle + value: llvm + - key: modernize-use-bool-literals.IgnoreMacros + value: 'true' + - key: bugprone-unhandled-self-assignment.WarnOnlyIfThisHasSuspiciousField + value: 'true' + - key: google-readability-namespace-comments.ShortNamespaceLines + value: '10' + - key: bugprone-suspicious-string-compare.StringCompareLikeFunctions + value: '' + - key: modernize-avoid-bind.PermissiveParameterList + value: 'false' + - key: modernize-use-override.FinalSpelling + value: final + - key: cert-err09-cpp.MaxSize + value: '-1' + - key: modernize-use-noexcept.ReplacementString + value: '' + - key: modernize-use-using.IgnoreMacros + value: 'true' + - key: cppcoreguidelines-explicit-virtual-functions.FinalSpelling + value: final + - key: modernize-loop-convert.NamingStyle + value: CamelCase + - key: cppcoreguidelines-pro-type-member-init.UseAssignment + value: 'false' + - key: bugprone-suspicious-include.HeaderFileExtensions + value: ';h;hh;hpp;hxx' + - key: performance-no-automatic-move.AllowedTypes + value: '' + - key: performance-for-range-copy.WarnOnAllAutoCopies + value: 'false' + - key: bugprone-argument-comment.CommentIntegerLiterals + value: '0' + - key: bugprone-argument-comment.CommentCharacterLiterals + value: '0' + - key: modernize-pass-by-value.IncludeStyle + value: llvm + - key: bugprone-argument-comment.CommentFloatLiterals + value: '0' + - key: bugprone-too-small-loop-variable.MagnitudeBitsUpperLimit + value: '16' + - key: readability-simplify-boolean-expr.ChainedConditionalReturn + value: 'false' + - key: readability-else-after-return.WarnOnConditionVariables + value: 'true' + - key: modernize-use-nullptr.NullMacros + value: 'NULL' + - key: cppcoreguidelines-macro-usage.AllowedRegexp + value: '^DEBUG_*' + - key: cppcoreguidelines-narrowing-conversions.PedanticMode + value: 'false' + - key: modernize-make-shared.IgnoreDefaultInitialization + value: 'true' + - key: modernize-make-shared.IncludeStyle + value: llvm + - key: cppcoreguidelines-special-member-functions.AllowMissingMoveFunctions + value: 'false' + - key: bugprone-signed-char-misuse.CharTypdefsToIgnore + value: '' + - key: cert-dcl51-cpp.Invert + value: 'false' + - key: cppcoreguidelines-explicit-virtual-functions.IgnoreDestructors + value: 'true' + - key: modernize-make-unique.IgnoreMacros + value: 'true' + - key: performance-for-range-copy.AllowedTypes + value: '' + - key: bugprone-argument-comment.CommentBoolLiterals + value: '0' + - key: readability-braces-around-statements.ShortStatementLines + value: '0' + - key: bugprone-argument-comment.CommentUserDefinedLiterals + value: '0' + - key: readability-magic-numbers.IgnoredFloatingPointValues + value: '1.0;100.0;' + - key: performance-inefficient-string-concatenation.StrictMode + value: 'false' + - key: readability-implicit-bool-conversion.AllowPointerConditions + value: 'false' + - key: readability-redundant-declaration.IgnoreMacros + value: 'true' + - key: modernize-make-unique.MakeSmartPtrFunction + value: 'std::make_unique' + - key: portability-restrict-system-includes.Includes + value: '*' + - key: cert-dcl51-cpp.AllowedIdentifiers + value: '' + - key: cert-oop57-cpp.MemCpyNames + value: '' + - key: modernize-make-unique.MakeSmartPtrFunctionHeader + value: '' + - key: cppcoreguidelines-non-private-member-variables-in-classes.IgnorePublicMemberVariables + value: 'false' + - key: cppcoreguidelines-special-member-functions.AllowMissingMoveFunctionsWhenCopyIsDeleted + value: 'false' + - key: cert-oop57-cpp.MemCmpNames + value: '' + - key: modernize-use-noexcept.UseNoexceptFalse + value: 'true' + - key: readability-function-cognitive-complexity.Threshold + value: '25' + - key: cppcoreguidelines-non-private-member-variables-in-classes.IgnoreClassesWithAllMemberVariablesBeingPublic + value: 'true' + - key: bugprone-argument-comment.IgnoreSingleArgument + value: '0' + - key: bugprone-sizeof-expression.WarnOnSizeOfIntegerExpression + value: 'false' + - key: performance-faster-string-find.StringLikeClasses + value: '::std::basic_string;::std::basic_string_view' + - key: bugprone-assert-side-effect.CheckFunctionCalls + value: 'false' + - key: bugprone-string-constructor.StringNames + value: '::std::basic_string;::std::basic_string_view' + - key: bugprone-assert-side-effect.AssertMacros + value: assert + - key: bugprone-exception-escape.IgnoredExceptions + value: '' + - key: bugprone-signed-char-misuse.DiagnoseSignedUnsignedCharComparisons + value: 'true' + - key: modernize-use-default-member-init.IgnoreMacros + value: 'true' + - key: llvm-qualified-auto.AddConstToQualified + value: '0' + - key: cert-str34-c.CharTypdefsToIgnore + value: '' + - key: llvm-else-after-return.WarnOnConditionVariables + value: '0' + - key: bugprone-sizeof-expression.WarnOnSizeOfCompareToConstant + value: 'true' + - key: modernize-raw-string-literal.DelimiterStem + value: lit + - key: cert-dcl37-c.Invert + value: 'false' + - key: modernize-raw-string-literal.ReplaceShorterLiterals + value: 'false' + - key: readability-magic-numbers.IgnoredIntegerValues + value: '1;2;3;4;' + - key: modernize-use-auto.RemoveStars + value: 'false' + - key: performance-inefficient-vector-operation.VectorLikeClasses + value: '::std::vector' + - key: portability-simd-intrinsics.Std + value: '' + - key: readability-redundant-member-init.IgnoreBaseInCopyConstructors + value: 'false' + - key: performance-unnecessary-value-param.IncludeStyle + value: llvm + - key: cert-dcl16-c.IgnoreMacros + value: 'true' + - key: modernize-replace-disallow-copy-and-assign-macro.MacroName + value: DISALLOW_COPY_AND_ASSIGN + - key: llvm-else-after-return.WarnOnUnfixable + value: '0' + - key: cert-msc32-c.DisallowedSeedTypes + value: 'time_t,std::time_t' ... diff --git a/.gitmodules b/.gitmodules index 7a527c5..0bca1e8 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,6 @@ [submodule "data/res"] path = data/res url = git@gitlab.com:4VRDriver/fall-fever-resources.git +[submodule "lib/spdlog"] + path = lib/spdlog + url = git@github.com:gabime/spdlog.git diff --git a/CMakeLists.txt b/CMakeLists.txt index 8c676a9..5f945c1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -18,7 +18,7 @@ find_package(OpenGL REQUIRED) #find_package(Freetype REQUIRED) Will be used in the future # Specify the C++ standard -set(CMAKE_CXX_STANDARD 11) +set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED True) set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -D_DEBUG") diff --git a/imgui.ini b/imgui.ini index ecc3b9a..b108402 100644 --- a/imgui.ini +++ b/imgui.ini @@ -5,6 +5,11 @@ Collapsed=0 [Window][Debug Utils] Pos=9,24 -Size=689,372 +Size=598,357 +Collapsed=0 + +[Window][Entities] +Pos=1062,24 +Size=225,279 Collapsed=0 diff --git a/lib/CMakeLists.txt b/lib/CMakeLists.txt index ccfd69a..d4a6aab 100644 --- a/lib/CMakeLists.txt +++ b/lib/CMakeLists.txt @@ -3,3 +3,4 @@ add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/stb) add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/glm) add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/imgui) add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/jsoncpp) +add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/spdlog) diff --git a/lib/spdlog b/lib/spdlog new file mode 160000 index 0000000..8826011 --- /dev/null +++ b/lib/spdlog @@ -0,0 +1 @@ +Subproject commit 8826011c81b69e1f8427be520b357c19c74ea480 diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 8b93ef6..48c6fb2 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -6,6 +6,7 @@ add_executable(Fall-Fever ShaderProgram.cpp VertexArray.cpp Texture.cpp + TextureFactory.cpp Camera.cpp Mesh.cpp Model.cpp @@ -22,6 +23,7 @@ add_executable(Fall-Fever imgui/GeneralInfoWindow.cpp imgui/Handler.cpp imgui/Window.cpp + util/Log.cpp ) target_link_libraries( @@ -35,6 +37,7 @@ target_link_libraries( ${FREETYPE_LIBRARIES} imgui pthread + spdlog ) target_compile_options(Fall-Fever PRIVATE -Wall -Wextra -pedantic) diff --git a/src/Controller.cpp b/src/Controller.cpp index bc2d7fe..f2e5351 100644 --- a/src/Controller.cpp +++ b/src/Controller.cpp @@ -1,4 +1,3 @@ -#include #include #include @@ -30,6 +29,7 @@ #include "VertexArray.h" #include "Widget.h" #include "Window.h" +#include "util/Log.h" Controller::Controller() : m_gameWindow(std::unique_ptr(new Window)) { @@ -42,7 +42,7 @@ Controller::Controller() : m_gameWindow(std::unique_ptr(new Window)) for (auto &prototype : shaderProgramPrototypes) { m_shaderPrograms.push_back(new ShaderProgram(prototype)); - std::cout << "Loaded ShaderProgram \"" << prototype.name << "\"" << std::endl; + Log::logger().info("Loaded shaderprogram \"{}\"", prototype.name); } m_postProcessFrameBuffer = new FrameBuffer(m_gameWindow->getWindowWidth(), m_gameWindow->getWindowHeight(), @@ -105,8 +105,8 @@ void Controller::run() &lightColor, &m_exposure, &intensity); m_imguiHandler->addImguiWindow(generalWindow); - std::shared_ptr entityWindow = std::make_shared(m_scene->getEntities()); - m_imguiHandler->addImguiWindow(entityWindow); + // std::shared_ptr entityWindow = std::make_shared(m_scene->getEntities()); + // m_imguiHandler->addImguiWindow(entityWindow); #endif // This is the game loop @@ -236,8 +236,7 @@ ShaderProgram *Controller::getShaderProgramByName(const std::string &name, std:: return program; } } - - std::cout << "[Warning] ShaderProgram could not be found by name \"" << name << "\"" << std::endl; + Log::logger().critical("Shaderprogram could not be found by name \"{}\"", name); return nullptr; } diff --git a/src/Entity.cpp b/src/Entity.cpp index 3c93750..71b903f 100644 --- a/src/Entity.cpp +++ b/src/Entity.cpp @@ -135,6 +135,10 @@ ModelEntity::ModelEntity(Prototype prototype, Model *model, ShaderProgram *shade void ModelEntity::draw(glm::mat4 viewProjMatrix, glm::vec3 viewPosition) { + for (auto &child : m_children) + if (auto childModel = dynamic_cast(child)) + childModel->draw(viewProjMatrix, viewPosition); + m_shaderProgram->bind(); glm::mat4 modelViewProj = viewProjMatrix * m_modelMatrix; @@ -155,6 +159,10 @@ void ModelEntity::draw(glm::mat4 viewProjMatrix, glm::vec3 viewPosition) void ModelEntity::drawDirectionalShadows(glm::mat4 viewProjMatrix, ShaderProgram *shaderProgram) { + for (auto &child : m_children) + if (auto childModel = dynamic_cast(child)) + childModel->drawDirectionalShadows(viewProjMatrix, shaderProgram); + shaderProgram->bind(); glm::mat4 modelViewProj = viewProjMatrix * m_modelMatrix; @@ -168,6 +176,10 @@ void ModelEntity::drawDirectionalShadows(glm::mat4 viewProjMatrix, ShaderProgram void ModelEntity::drawPointShadows(ShaderProgram *shaderProgram) { + for (auto &child : m_children) + if (auto childModel = dynamic_cast(child)) + childModel->drawPointShadows(shaderProgram); + shaderProgram->bind(); shaderProgram->setUniform("u_modelMatrix", m_modelMatrix); diff --git a/src/EventHandler.cpp b/src/EventHandler.cpp index eb56bae..5759022 100644 --- a/src/EventHandler.cpp +++ b/src/EventHandler.cpp @@ -1,7 +1,6 @@ #include "EventHandler.h" #include "GLFW/glfw3.h" -#include CameraActionMap EventHandler::s_cameraActionMap = {{CameraAction::Forward, false}, {CameraAction::Backward, false}, {CameraAction::Up, false}, {CameraAction::Down, false}, diff --git a/src/FrameBuffer.cpp b/src/FrameBuffer.cpp index ae860b0..4079afc 100644 --- a/src/FrameBuffer.cpp +++ b/src/FrameBuffer.cpp @@ -1,10 +1,9 @@ #include "FrameBuffer.h" - #include "ShaderProgram.h" #include "Texture.h" +#include "util/Log.h" #include -#include AbstractFrameBuffer::~AbstractFrameBuffer() {} @@ -99,7 +98,7 @@ void FrameBuffer::generateTextures(uint32_t width, uint32_t height) glBindTexture(GL_TEXTURE_2D, 0); if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) - std::cout << "[Error] FrameBuffer is not complete!" << std::endl; + Log::logger().error("Framebuffer not complete"); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); unbind(); @@ -135,7 +134,7 @@ DepthMap::DepthMap(int RESOLUTION) glReadBuffer(GL_NONE); if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) - std::cout << "[Error] FrameBuffer is not complete!" << std::endl; + Log::logger().error("Framebuffer not complete"); unbind(); } @@ -163,7 +162,7 @@ DepthMapCube::DepthMapCube(int RESOLUTION) glReadBuffer(GL_NONE); if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) - std::cout << "[Error] FrameBuffer is not complete!" << std::endl; + Log::logger().error("Framebuffer not complete"); unbind(); } diff --git a/src/Helper.cpp b/src/Helper.cpp index a232b99..78bbb31 100644 --- a/src/Helper.cpp +++ b/src/Helper.cpp @@ -1,7 +1,7 @@ #include "Helper.h" +#include "util/Log.h" #include -#include #ifdef __linux__ #include @@ -122,13 +122,13 @@ void Helper::gl_debug_callback(GLenum source, GLenum type, GLuint id, GLenum sev } if (severity == GL_DEBUG_SEVERITY_HIGH || severity == GL_DEBUG_SEVERITY_MEDIUM) - std::cout << "[OpenGL Debug Message]" << std::endl - << "Message: " << _message << std::endl - << "Source: " << _source << std::endl - << "Type: " << _type << std::endl - << "ID: " << id << std::endl - << "Severity: " << _severity << std::endl - << std::endl; + Log::logger().info("[OpenGL Debug Message]\n" + "Message: {}\n" + "Source: {}\n" + "Type: {}\n" + "ID: {}\n" + "Severity: {}\n", + _message, _source, _type, id, _severity); } Helper::Timer::Timer(const std::string &name) : m_name(name) @@ -143,5 +143,5 @@ Helper::Timer::~Timer() m_duration = m_end - m_start; float ms = m_duration.count() * 1000.0f; - std::cout << "Timer " << m_name << " took " << ms << "ms!" << std::endl; + Log::logger().info("Timer {} took {}", m_name, ms); } diff --git a/src/JsonParser.cpp b/src/JsonParser.cpp index ebecd17..bad0efe 100644 --- a/src/JsonParser.cpp +++ b/src/JsonParser.cpp @@ -1,14 +1,14 @@ #include "JsonParser.h" +#include "util/Log.h" #include -#include JsonParser::JsonParser(const std::string &jsonFilepath) { std::ifstream file(jsonFilepath.c_str(), std::ifstream::binary); if (!file) { - std::cout << "Error reading file \"" << jsonFilepath << "\"." << std::endl; + Log::logger().warn("Could not read json file \"{}\"", jsonFilepath); return; } @@ -17,7 +17,7 @@ JsonParser::JsonParser(const std::string &jsonFilepath) bool parsingSuccessful = Json::parseFromStream(m_rbuilder, file, &m_root, &errs); file.close(); if (!parsingSuccessful) { - std::cout << "Failed to parse file\n" << errs << std::endl; + Log::logger().warn("Could not parse json file \"{}\":{}", jsonFilepath, errs); return; } } diff --git a/src/Menu.cpp b/src/Menu.cpp index 612e47a..1f12482 100644 --- a/src/Menu.cpp +++ b/src/Menu.cpp @@ -7,8 +7,7 @@ #include "Widget.h" #include "Window.h" #include "definitions/eventActions.h" - -#include +#include "util/Log.h" Menu::Menu(FrameBuffer *p_framebuffer, ShaderProgram *p_shaderProgram) : m_frameBuffer(p_framebuffer), m_shaderProgram(p_shaderProgram) diff --git a/src/Model.cpp b/src/Model.cpp index 99d5ce1..513bb5f 100644 --- a/src/Model.cpp +++ b/src/Model.cpp @@ -2,10 +2,10 @@ #include "Mesh.h" #include "ShaderProgram.h" #include "Texture.h" +#include "util/Log.h" #include #include -#include uint32_t Model::s_idCounter = 0; @@ -59,7 +59,7 @@ void Model::loadModel(const std::string &pathToModel) std::ifstream input(pathToModel, std::ios::in | std::ios::binary); if (!input.is_open()) { - std::cerr << "Could not find model file " << pathToModel << std::endl; + Log::logger().warn("Could not find model file {}", pathToModel); return; } @@ -94,9 +94,9 @@ void Model::loadModel(const std::string &pathToModel) for (unsigned int i = 0; i < numTextures; i++) { std::string texturePath = m_workingPath + '/' + textureSources[i].c_str(); - Texture::Prototype texturePrototype{texturePath, textureTypes[i]}; + auto loadModel = [=, &mutex]() { - Texture *currentTex = new Texture(texturePrototype.texturePath, texturePrototype.textureType); + Texture *currentTex = new Texture({texturePath, textureTypes[i]}); std::lock_guard lock(mutex); m_textures.push_back(currentTex); @@ -114,7 +114,7 @@ void Model::loadModel(const std::string &pathToModel) } if (!hasNormalMap) { - Texture *currentTex = new Texture("data/res/models/tex/fallback_normal.png", TextureType::Normal); + Texture *currentTex = new Texture({"data/res/models/tex/fallback_normal.png", TextureType::Normal}); m_textures.push_back(currentTex); } diff --git a/src/Scene.cpp b/src/Scene.cpp index cdca07c..f00fba6 100644 --- a/src/Scene.cpp +++ b/src/Scene.cpp @@ -8,9 +8,9 @@ #include "Model.h" #include "ShaderProgram.h" #include "Texture.h" +#include "util/Log.h" #include -#include #include Scene::Scene(std::vector shaderPrograms) @@ -41,8 +41,7 @@ Scene::Scene(std::vector shaderPrograms) auto loadModel = [=, &mutex]() { Model *currentModel = new Model(prototype); - std::cout << "Loaded Model \"" << prototype.modelName << "\" from \"" << prototype.modelPath << "\"" - << std::endl; + Log::logger().info("Loaded model \"{}\": {}", prototype.modelName, prototype.modelPath); std::lock_guard lock(mutex); m_models.push_back(currentModel); @@ -61,7 +60,7 @@ Scene::Scene(std::vector shaderPrograms) m_skybox = new Skybox(skyboxPrototype, getModelByName("cube"), Controller::getShaderProgramByName("skyboxProgram", shaderPrograms)); - std::cout << "Loaded Skybox \"" << skyboxPrototype.texturePath << "\"" << std::endl; + Log::logger().info("Loaded skybox: {}", skyboxPrototype.texturePath); }); std::vector entityPrototypes = modelParser.getEntityPrototypes(); @@ -74,8 +73,8 @@ Scene::Scene(std::vector shaderPrograms) if (!currentModel) { // Apply fallback model (first model in vector) currentModel = m_models[0]; - std::cout << "[Warning] Model could not be found by name \"" << prototype.modelName << "\"" - << std::endl; + + Log::logger().warn("Model could not be found by name \"{}\"", prototype.modelName); } // Get shaderprogram @@ -88,8 +87,7 @@ Scene::Scene(std::vector shaderPrograms) ModelEntity *currentEntity = new ModelEntity(prototype, currentModel, currentProgram); - std::cout << "Loaded Entity \"" << prototype.name << "\" with model \"" << prototype.modelName << "\"" - << std::endl; + Log::logger().info("Loaded entity \"{}\" with model \"{}\"", prototype.name, prototype.modelName); if (!prototype.parent.empty()) { Entity *parent = getEntityByName(prototype.parent); @@ -97,9 +95,8 @@ Scene::Scene(std::vector shaderPrograms) parent->addChild(currentEntity); currentEntity->setParent(parent); } - } - - m_entities.push_back(currentEntity); + } else + m_entities.push_back(currentEntity); } } @@ -156,7 +153,7 @@ void Scene::addEntity(ModelEntity *entity) m_entities.push_back(entity); } -void Scene::removeEntityByName(std::string name) +void Scene::removeEntityByName(const std::string &name) { for (auto it = m_entities.begin(); it != m_entities.end(); it++) { if ((*it)->getUniqueName() == name) { @@ -165,7 +162,7 @@ void Scene::removeEntityByName(std::string name) } } - std::cout << "[Warning] Entity with name " << name << " could not be removed." << std::endl; + Log::logger().warn("Entity \"{}\" could not be removed", name); } void Scene::clearEntities() @@ -309,25 +306,25 @@ void Scene::calculateShadows(ShaderProgram *directionalShaderProgram, ShaderProg glCullFace(GL_FRONT); } -Model *Scene::getModelByName(std::string name) +Model *Scene::getModelByName(const std::string &name) { for (auto it = m_models.begin(); it != m_models.end(); it++) { if ((*it)->getUniqueName() == name) { return *it; } } - std::cout << "[Warning] Model could not be found by unique name \"" << name << "\"" << std::endl; + Log::logger().warn("Model could not be found by unique name \"{}\"", name); return nullptr; } -ModelEntity *Scene::getEntityByName(std::string name) +ModelEntity *Scene::getEntityByName(const std::string &name) { for (auto it = m_entities.begin(); it != m_entities.end(); it++) { if ((*it)->getUniqueName() == name) { return *it; } } - std::cout << "[Warning] Entity could not be found by unique name \"" << name << "\"" << std::endl; + Log::logger().warn("Entity could not be found by unique name \"{}\"", name); return nullptr; } @@ -338,7 +335,7 @@ ModelEntity *Scene::getEntityById(uint32_t id) return *it; } } - std::cout << "[Warning] Entity could not be found by ID \"" << id << "\"" << std::endl; + Log::logger().warn("Entity could not be found by ID \"{}\"", id); return nullptr; } diff --git a/src/Scene.h b/src/Scene.h index f66e3f2..c00513d 100644 --- a/src/Scene.h +++ b/src/Scene.h @@ -24,7 +24,7 @@ public: ~Scene(); void addEntity(ModelEntity *entity); - void removeEntityByName(std::string name); + void removeEntityByName(const std::string &name); void clearEntities(); void updatePointLight(unsigned int lightId, bool active, glm::vec3 position, glm::vec3 color, float intensity); @@ -34,9 +34,9 @@ public: std::vector getPointLights(); DirectionalLight *getDirectionalLight(); Skybox *getSkybox(); - ModelEntity *getEntityByName(std::string name); + ModelEntity *getEntityByName(const std::string &name); ModelEntity *getEntityById(uint32_t id); - Model *getModelByName(std::string name); + Model *getModelByName(const std::string &name); void draw(glm::mat4 viewProjMatrix, glm::vec3 viewPosition); void calculateShadows(ShaderProgram *directionalShaderProgram, ShaderProgram *pointShaderProgram); diff --git a/src/Screen.cpp b/src/Screen.cpp index dac5aa6..a6ca590 100644 --- a/src/Screen.cpp +++ b/src/Screen.cpp @@ -13,7 +13,7 @@ Screen::Screen(Prototype prototype, FrameBuffer *framebuffer, ShaderProgram *sha { for (auto &prototype : prototype.widgetPrototypes) { auto texturePrototype = prototype.texturePrototype; - Texture *currentTexture = new Texture(texturePrototype.texturePath, texturePrototype.textureType); + Texture *currentTexture = new Texture({texturePrototype.texturePath, texturePrototype.textureType}); currentTexture->initializeOnGPU(); Widget *currentWidget = new Widget(prototype, currentTexture); diff --git a/src/ShaderProgram.cpp b/src/ShaderProgram.cpp index babe60b..3da4178 100644 --- a/src/ShaderProgram.cpp +++ b/src/ShaderProgram.cpp @@ -1,10 +1,8 @@ #include "ShaderProgram.h" +#include "util/Log.h" #include -#include #include -#include -#include ShaderProgram::ShaderProgram(Prototype prototype) : m_uniqueName(prototype.name) { @@ -29,10 +27,9 @@ ShaderProgram::ShaderProgram(Prototype prototype) : m_uniqueName(prototype.name) GLint isLinked = 0; glGetProgramiv(m_shaderProgramId, GL_LINK_STATUS, &isLinked); - if (!isLinked) { - std::cout << "Failed to link shaderProgram: " << prototype.vertexPath << ", " << prototype.geometryPath << ", " - << prototype.fragmentPath << std::endl; - } + if (!isLinked) + Log::logger().critical("Failed to link shaderProgram \"{}\", \"{}\", \"{}\"", prototype.vertexPath, + prototype.geometryPath, prototype.fragmentPath); #ifdef _RELEASE glDetachShader(program, vs); @@ -69,7 +66,7 @@ std::string ShaderProgram::parse(const std::string &filename) shaderfile.open(filename, std::ios::in); if (!shaderfile.is_open()) { - std::cerr << "Shader " << filename << " not found!" << std::endl; + Log::logger().critical("Shader \"{}\" not found", filename); exit(-1); } @@ -92,7 +89,7 @@ GLuint ShaderProgram::compile(const std::string &shaderSource, GLenum type) glGetShaderiv(shaderId, GL_INFO_LOG_LENGTH, &length); char *message = new char[length]; glGetShaderInfoLog(shaderId, length, &length, message); - std::cout << "Shader compile error: " << message << std::endl; + Log::logger().error("Shader compilation failed: {}", message); delete[] message; return 0; } diff --git a/src/Texture.cpp b/src/Texture.cpp index 62692a2..32e0e77 100644 --- a/src/Texture.cpp +++ b/src/Texture.cpp @@ -1,16 +1,15 @@ #include "Texture.h" #include "ShaderProgram.h" +#include "util/Log.h" -#include - -Texture::Texture(const std::string &path, TextureType type) : m_texturePath(path), m_textureType(type) +Texture::Texture(const Prototype &texturePrototype) + : m_texturePath(texturePrototype.texturePath), m_textureType(texturePrototype.textureType) { stbi_set_flip_vertically_on_load(1); m_textureBuffer = stbi_load(m_texturePath.c_str(), &m_textureWidth, &m_textureHeight, &m_numComponents, 0); - if (!m_textureBuffer) { - std::cout << "[Warning] Texture " << m_texturePath << " not found!" << std::endl; - return; - } + + if (!m_textureBuffer) + Log::logger().warn("Texture {} could not be loaded", m_texturePath); } Texture::~Texture() @@ -20,11 +19,6 @@ Texture::~Texture() void Texture::initializeOnGPU() { - if (m_isInitialized) - return; - - m_isInitialized = true; - GLenum internalFormat; GLenum dataFormat; @@ -111,7 +105,7 @@ std::string Texture::getPath() return m_texturePath; } -GLuint Texture::getTextureId() +GLuint Texture::textureId() { return m_textureId; } @@ -143,7 +137,7 @@ CubeMap::CubeMap(const std::string &texturePseudoPath) auto textureBuffer = stbi_load(path.c_str(), &m_textureWidth, &m_textureHeight, &numComponents, 0); if (!textureBuffer) { - std::cout << "[Warning] CubeMap Texture " << path.c_str() << " not found!" << std::endl; + Log::logger().warn("CubeMap texture {} could not be loaded", path); return; } diff --git a/src/Texture.h b/src/Texture.h index dac97c5..093077b 100644 --- a/src/Texture.h +++ b/src/Texture.h @@ -31,20 +31,22 @@ public: TextureType textureType; }; - Texture(const std::string &path, TextureType type); - ~Texture(); - - void initializeOnGPU(); - void bind(uint8_t textureUnit, ShaderProgram *shaderProgram, uint8_t textureTypeNum); void unbind(); TextureType getTextureType(); std::string getPath(); - GLuint getTextureId(); + GLuint textureId(); + + Texture(const Prototype &texturePrototype); // TODO make private + void initializeOnGPU(); // TODO make private + ~Texture(); // TODO make private private: - bool m_isInitialized = false; + Texture(const Texture &other) = delete; + Texture(Texture &&other) = delete; + Texture &operator=(const Texture &other) = delete; + Texture &operator=(Texture &&other) = delete; std::string m_texturePath; @@ -54,9 +56,11 @@ private: int32_t m_textureHeight; int32_t m_numComponents; - GLuint m_textureId; + GLuint m_textureId; // TODO inherit from abstract class resource TextureType m_textureType; + + friend class TextureFactory; }; class CubeMap diff --git a/src/TextureFactory.cpp b/src/TextureFactory.cpp new file mode 100644 index 0000000..41f90c7 --- /dev/null +++ b/src/TextureFactory.cpp @@ -0,0 +1,20 @@ +#include "TextureFactory.h" + +TextureFactory &TextureFactory::instance() +{ + static TextureFactory instance; + return instance; +} + +void TextureFactory::registerTexture(const Texture::Prototype &prototype) +{ + auto texture = std::make_unique(prototype); + m_textureMap.insert({texture->textureId(), std::move(texture)}); +} + +std::unique_ptr TextureFactory::texture(uint64_t resourceId) +{ + auto texture = std::move(m_textureMap.at(resourceId)); + texture->initializeOnGPU(); + return texture; +} diff --git a/src/TextureFactory.h b/src/TextureFactory.h new file mode 100644 index 0000000..8178ba2 --- /dev/null +++ b/src/TextureFactory.h @@ -0,0 +1,18 @@ +#pragma once + +#include "Texture.h" + +#include +#include + +class TextureFactory // TODO not yet used +{ +public: + static TextureFactory &instance(); + + void registerTexture(const Texture::Prototype &prototype); + std::unique_ptr texture(uint64_t resourceId); + +private: + std::map> m_textureMap; +}; \ No newline at end of file diff --git a/src/Widget.cpp b/src/Widget.cpp index 5f16dba..88fafd7 100644 --- a/src/Widget.cpp +++ b/src/Widget.cpp @@ -41,7 +41,7 @@ void Widget::draw(ShaderProgram *shaderProgram) glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); glActiveTexture(GL_TEXTURE0); - glBindTexture(GL_TEXTURE_2D, m_widgetTextures[0]->getTextureId()); + glBindTexture(GL_TEXTURE_2D, m_widgetTextures[0]->textureId()); GLint location = glGetUniformLocation(shaderProgram->getShaderProgramId(), "u_texture"); glUniform1i(location, 0); diff --git a/src/Window.cpp b/src/Window.cpp index 0cd11b5..87a33d1 100644 --- a/src/Window.cpp +++ b/src/Window.cpp @@ -2,16 +2,15 @@ #include "Helper.h" #include "ShaderProgram.h" #include "definitions/window.h" +#include "util/Log.h" #include -#include Window::Window() { // Initialize GLFW - if (!glfwInit()) { + if (!glfwInit()) exit(-1); - } m_width = INIT_WINDOW_WIDTH; m_height = INIT_WINDOW_HEIGHT; @@ -29,12 +28,11 @@ Window::Window() #endif m_window = glfwCreateWindow(m_width, m_height, "OpenGL", NULL, NULL); - if (!m_window) { - std::cout << "Failed to create window" << std::endl; - } + if (!m_window) + Log::logger().critical("Failed to create window"); // Wait for window to maximize (in case) - Helper::sleep(1000); + // Helper::sleep(1000); glfwGetWindowPos(m_window, &m_posX, &m_posY); glfwGetWindowSize(m_window, &m_width, &m_height); @@ -44,12 +42,12 @@ Window::Window() // Initialize GLAD if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)) { - std::cout << "Failed to initialize GLAD" << std::endl; + Log::logger().critical("Failed to initialize GLAD"); exit(-1); } #ifdef _DEBUG - std::cout << "OpenGL version: " << glGetString(GL_VERSION) << std::endl; + Log::logger().debug("OpenGL version: {}", glGetString(GL_VERSION)); glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS); glDebugMessageCallback(Helper::gl_debug_callback, NULL); diff --git a/src/imgui/EntityWindow.cpp b/src/imgui/EntityWindow.cpp index 6a0b32b..4f4a3f8 100644 --- a/src/imgui/EntityWindow.cpp +++ b/src/imgui/EntityWindow.cpp @@ -3,7 +3,7 @@ #include -Imgui::EntityWindow::EntityWindow(const std::vector &entities) : Window("Entities"), m_entites(entities) +Imgui::EntityWindow::EntityWindow(const std::vector entities) : Window("Entities"), m_entites(entities) {} void Imgui::EntityWindow::addWidgets() @@ -11,21 +11,28 @@ void Imgui::EntityWindow::addWidgets() ImGui::Text("Treelist"); for (const auto &entity : m_entites) { - // addChildWidget(*entity); + addChildWidget(*entity); } } void Imgui::EntityWindow::addChildWidget(const ModelEntity &entity) { if (entity.getChildren().empty()) { + ImGui::Indent(); ImGui::Text(entity.getUniqueName().c_str()); + ImGui::SameLine(); + ImGui::SmallButton("Edit"); + ImGui::Unindent(); } else { - if (ImGui::TreeNode(entity.getUniqueName().c_str())) { + bool expanded = ImGui::TreeNode(entity.getUniqueName().c_str()); + ImGui::SameLine(); + ImGui::SmallButton("Edit"); + + if (expanded) { for (const auto &child : entity.getChildren()) { addChildWidget(*(const ModelEntity *)child); } ImGui::TreePop(); - ImGui::Separator(); } } } \ No newline at end of file diff --git a/src/imgui/EntityWindow.h b/src/imgui/EntityWindow.h index 1a50606..46e51d5 100644 --- a/src/imgui/EntityWindow.h +++ b/src/imgui/EntityWindow.h @@ -11,14 +11,14 @@ namespace Imgui { class EntityWindow : public Window { public: - EntityWindow(const std::vector &entities); + EntityWindow(const std::vector entities); private: void addWidgets() override; static void addChildWidget(const ModelEntity &entity); - const std::vector &m_entites; + const std::vector m_entites; }; } // namespace Imgui \ No newline at end of file diff --git a/src/util/Log.cpp b/src/util/Log.cpp new file mode 100644 index 0000000..1975c21 --- /dev/null +++ b/src/util/Log.cpp @@ -0,0 +1,17 @@ +#include "Log.h" + +#include + +Log Log::s_instance; + +Log::Log() +{ + m_logger = spdlog::stdout_color_mt("Core"); + m_logger->set_level(spdlog::level::debug); + // m_logger->set_pattern(""); +} + +spdlog::logger &Log::logger() +{ + return *s_instance.m_logger; +} diff --git a/src/util/Log.h b/src/util/Log.h new file mode 100644 index 0000000..32d17ed --- /dev/null +++ b/src/util/Log.h @@ -0,0 +1,16 @@ +#pragma once + +#include + +class Log +{ +public: + static spdlog::logger &logger(); + +private: + Log(); + + static Log s_instance; + + std::shared_ptr m_logger; +}; \ No newline at end of file