From 01e7904cc7d5ef58db5c9f5b54d8319bcc87c942 Mon Sep 17 00:00:00 2001 From: Shr1ftyy Date: Thu, 29 Aug 2024 01:45:26 +0930 Subject: [PATCH 1/5] feat: beginnings of an ECS --- .gitignore | 5 +- src/Component.h | 35 +++++ src/Ecs.h | 351 ++++++++++++++++++++++++++++++++++++++++++ src/PhysicsSystem.cpp | 25 +++ src/PhysicsSystem.h | 14 ++ src/main.cpp | 46 ++++++ 6 files changed, 475 insertions(+), 1 deletion(-) create mode 100644 src/Component.h create mode 100644 src/Ecs.h create mode 100644 src/PhysicsSystem.cpp create mode 100644 src/PhysicsSystem.h diff --git a/.gitignore b/.gitignore index cff2ee6..673f44b 100644 --- a/.gitignore +++ b/.gitignore @@ -4,4 +4,7 @@ build .vscode # imgui -imgui.ini \ No newline at end of file +imgui.ini + +# trace +*.trace \ No newline at end of file diff --git a/src/Component.h b/src/Component.h new file mode 100644 index 0000000..c6bee88 --- /dev/null +++ b/src/Component.h @@ -0,0 +1,35 @@ +#ifndef COMPONENT_H +#define COMPONENT_H + +#include +#include +#include + +#include +#include + + +using ComponentType = std::uint8_t; + +const ComponentType MAX_COMPONENTS = 32; +using Signature = std::bitset; + +struct Gravity +{ + glm::vec3 force; +}; + +struct RigidBody +{ + glm::vec3 velocity; + glm::vec3 acceleration; +}; + +struct Transform +{ + glm::vec3 position; + glm::quat rotation; + glm::vec3 scale; +}; + +#endif // COMPONENT_H \ No newline at end of file diff --git a/src/Ecs.h b/src/Ecs.h new file mode 100644 index 0000000..1ab04b5 --- /dev/null +++ b/src/Ecs.h @@ -0,0 +1,351 @@ +#ifndef ECS_H +#define ECS_H + +#include "Component.h" +#include +#include +#include +#include +#include +#include +#include + +using Entity = std::uint32_t; +const Entity MAX_ENTITIES = 5000; + +struct EntityManager { + // Queue of unused entity IDs + std::queue mAvailableEntities{}; + + // Array of signatures where the index corresponds to the entity ID + std::array mSignatures{}; + + // Total living entities - used to keep limits on how many exist + uint32_t mLivingEntityCount{}; + EntityManager() { + // Initialize the queue with all possible entity IDs + for (Entity entity = 0; entity < MAX_ENTITIES; ++entity) { + mAvailableEntities.push(entity); + } + } + + Entity CreateEntity() { + assert(mLivingEntityCount < MAX_ENTITIES && + "Too many entities in existence."); + + // Take an ID from the front of the queue + Entity id = mAvailableEntities.front(); + mAvailableEntities.pop(); + ++mLivingEntityCount; + + return id; + } + + void DestroyEntity(Entity entity) { + assert(entity < MAX_ENTITIES && "Entity out of range."); + + // Invalidate the destroyed entity's signature + mSignatures[entity].reset(); + + // Put the destroyed ID at the back of the queue + mAvailableEntities.push(entity); + --mLivingEntityCount; + } + + void SetSignature(Entity entity, Signature signature) { + assert(entity < MAX_ENTITIES && "Entity out of range."); + + // Put this entity's signature into the array + mSignatures[entity] = signature; + } + + Signature GetSignature(Entity entity) { + assert(entity < MAX_ENTITIES && "Entity out of range."); + + // Get this entity's signature from the array + return mSignatures[entity]; + } +}; + +struct IComponentArray { + public: + ~IComponentArray() = default; + void EntityDestroyed(Entity entity); +}; + +template struct ComponentArray : public IComponentArray { + void InsertData(Entity entity, T component) { + assert(mEntityToIndexMap.find(entity) == mEntityToIndexMap.end() && + "Component added to same entity more than once."); + + // Put new entry at end and update the maps + size_t newIndex = mSize; + mEntityToIndexMap[entity] = newIndex; + mIndexToEntityMap[newIndex] = entity; + mComponentArray[newIndex] = component; + ++mSize; + } + + void RemoveData(Entity entity) { + assert(mEntityToIndexMap.find(entity) != mEntityToIndexMap.end() && + "Removing non-existent component."); + + // Copy element at end into deleted element's place to maintain density + size_t indexOfRemovedEntity = mEntityToIndexMap[entity]; + size_t indexOfLastElement = mSize - 1; + mComponentArray[indexOfRemovedEntity] = + mComponentArray[indexOfLastElement]; + + // Update map to point to moved spot + Entity entityOfLastElement = mIndexToEntityMap[indexOfLastElement]; + mEntityToIndexMap[entityOfLastElement] = indexOfRemovedEntity; + mIndexToEntityMap[indexOfRemovedEntity] = entityOfLastElement; + + mEntityToIndexMap.erase(entity); + mIndexToEntityMap.erase(indexOfLastElement); + + --mSize; + } + + T &GetData(Entity entity) { + assert(mEntityToIndexMap.find(entity) != mEntityToIndexMap.end() && + "Retrieving non-existent component."); + + // Return a reference to the entity's component + return mComponentArray[mEntityToIndexMap[entity]]; + } + + void EntityDestroyed(Entity entity) { + if (mEntityToIndexMap.find(entity) != mEntityToIndexMap.end()) { + // Remove the entity's component if it existed + RemoveData(entity); + } + } + + // The packed array of components (of generic type T), + // set to a specified maximum amount, matching the maximum number + // of entities allowed to exist simultaneously, so that each entity + // has a unique spot. + std::array mComponentArray; + + // Map from an entity ID to an array index. + std::unordered_map mEntityToIndexMap; + + // Map from an array index to an entity ID. + std::unordered_map mIndexToEntityMap; + + // Total size of valid entries in the array. + size_t mSize; +}; + +struct ComponentManager { + template void RegisterComponent() { + const char *typeName = typeid(T).name(); + + assert(mComponentTypes.find(typeName) == mComponentTypes.end() && + "Registering component type more than once."); + + // Add this component type to the component type map + mComponentTypes.insert({typeName, mNextComponentType}); + + // Create a ComponentArray pointer and add it to the component arrays + // map + mComponentArrays.insert( + {typeName, std::make_shared>()}); + + // Increment the value so that the next component registered will be + // different + ++mNextComponentType; + } + + template ComponentType GetComponentType() { + const char *typeName = typeid(T).name(); + + assert(mComponentTypes.find(typeName) != mComponentTypes.end() && + "Component not registered before use."); + + // Return this component's type - used for creating signatures + return mComponentTypes[typeName]; + } + + template void AddComponent(Entity entity, T component) { + // Add a component to the array for an entity + GetComponentArray()->InsertData(entity, component); + } + + template void RemoveComponent(Entity entity) { + // Remove a component from the array for an entity + GetComponentArray()->RemoveData(entity); + } + + template T &GetComponent(Entity entity) { + // Get a reference to a component from the array for an entity + return GetComponentArray()->GetData(entity); + } + + void EntityDestroyed(Entity entity) { + // Notify each component array that an entity has been destroyed + // If it has a component for that entity, it will remove it + for (auto const &pair : mComponentArrays) { + auto const &component = pair.second; + + component->EntityDestroyed(entity); + } + } + + // Map from type string pointer to a component type + std::unordered_map mComponentTypes{}; + + // Map from type string pointer to a component array + std::unordered_map> + mComponentArrays{}; + + // The component type to be assigned to the next registered component - + // starting at 0 + ComponentType mNextComponentType{}; + + // Convenience function to get the statically casted pointer to the + // ComponentArray of type T. + template + std::shared_ptr> GetComponentArray() { + const char *typeName = typeid(T).name(); + + assert(mComponentTypes.find(typeName) != mComponentTypes.end() && + "Component not registered before use."); + + return std::static_pointer_cast>( + mComponentArrays[typeName]); + } +}; + +struct System { + public: + std::set mEntities; +}; + +struct SystemManager { + template std::shared_ptr RegisterSystem() { + const char *typeName = typeid(T).name(); + + assert(mSystems.find(typeName) == mSystems.end() && + "Registering system more than once."); + + // Create a pointer to the system and return it so it can be used + // externally + auto system = std::make_shared(); + mSystems.insert({typeName, system}); + return system; + } + + template void SetSignature(Signature signature) { + const char *typeName = typeid(T).name(); + + assert(mSystems.find(typeName) != mSystems.end() && + "System used before registered."); + + // Set the signature for this system + mSignatures.insert({typeName, signature}); + } + + void EntityDestroyed(Entity entity) { + // Erase a destroyed entity from all system lists + // mEntities is a set so no check needed + for (auto const &pair : mSystems) { + auto const &system = pair.second; + + system->mEntities.erase(entity); + } + } + + void EntitySignatureChanged(Entity entity, Signature entitySignature) { + // Notify each system that an entity's signature changed + for (auto const &pair : mSystems) { + auto const &type = pair.first; + auto const &system = pair.second; + auto const &systemSignature = mSignatures[type]; + + // Entity signature matches system signature - insert into set + if ((entitySignature & systemSignature) == systemSignature) { + system->mEntities.insert(entity); + } + // Entity signature does not match system signature - erase from set + else { + system->mEntities.erase(entity); + } + } + } + + // Map from system type string pointer to a signature + std::unordered_map mSignatures{}; + + // Map from system type string pointer to a system pointer + std::unordered_map> mSystems{}; +}; + +struct Coordinator { + void Init() { + // Create pointers to each manager + mComponentManager = std::make_unique(); + mEntityManager = std::make_unique(); + mSystemManager = std::make_unique(); + } + + // Entity methods + Entity CreateEntity() { return mEntityManager->CreateEntity(); } + + void DestroyEntity(Entity entity) { + mEntityManager->DestroyEntity(entity); + + mComponentManager->EntityDestroyed(entity); + + mSystemManager->EntityDestroyed(entity); + } + + // Component methods + template void RegisterComponent() { + mComponentManager->RegisterComponent(); + } + + template void AddComponent(Entity entity, T component) { + mComponentManager->AddComponent(entity, component); + + auto signature = mEntityManager->GetSignature(entity); + signature.set(mComponentManager->GetComponentType(), true); + mEntityManager->SetSignature(entity, signature); + + mSystemManager->EntitySignatureChanged(entity, signature); + } + + template void RemoveComponent(Entity entity) { + mComponentManager->RemoveComponent(entity); + + auto signature = mEntityManager->GetSignature(entity); + signature.set(mComponentManager->GetComponentType(), false); + mEntityManager->SetSignature(entity, signature); + + mSystemManager->EntitySignatureChanged(entity, signature); + } + + template T &GetComponent(Entity entity) { + return mComponentManager->GetComponent(entity); + } + + template ComponentType GetComponentType() { + return mComponentManager->GetComponentType(); + } + + // System methods + template std::shared_ptr RegisterSystem() { + return mSystemManager->RegisterSystem(); + } + + template void SetSystemSignature(Signature signature) { + mSystemManager->SetSignature(signature); + } + + std::unique_ptr mComponentManager; + std::unique_ptr mEntityManager; + std::unique_ptr mSystemManager; +}; + +#endif // ECS_H \ No newline at end of file diff --git a/src/PhysicsSystem.cpp b/src/PhysicsSystem.cpp new file mode 100644 index 0000000..d898bc5 --- /dev/null +++ b/src/PhysicsSystem.cpp @@ -0,0 +1,25 @@ +#include "PhysicsSystem.h" +#include "Component.h" +// #include "Components/Gravity.hpp" +// #include "Components/RigidBody.hpp" +// #include "Components/Thrust.hpp" +// #include "Components/Transform.hpp" +// #include "Core/Coordinator.hpp" + +extern Coordinator gCoordinator; + +void PhysicsSystem::Init() {} + +void PhysicsSystem::Update(float dt) { + for (auto const &entity : mEntities) { + auto &rigidBody = gCoordinator.GetComponent(entity); + auto &transform = gCoordinator.GetComponent(entity); + + // Forces + auto const &gravity = gCoordinator.GetComponent(entity); + + transform.position += rigidBody.velocity * dt; + + rigidBody.velocity += gravity.force * dt; + } +} diff --git a/src/PhysicsSystem.h b/src/PhysicsSystem.h new file mode 100644 index 0000000..bc30a60 --- /dev/null +++ b/src/PhysicsSystem.h @@ -0,0 +1,14 @@ +#ifndef PHYSICSSYSTEM_H +#define PHYSICSSYSTEM_H + +#include "ecs.h" + +class PhysicsSystem : public System +{ +public: + void Init(); + + void Update(float dt); +}; + +#endif // PHYSICSSYSTEM_H \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index 375f6e3..f58c585 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -13,10 +13,15 @@ #include "ChunkManager.h" #include "smolgl.h" +#include "ecs.h" +#include "PhysicsSystem.h" +#include "Component.h" + #include #include #include #include "utils.h" +#include void framebuffer_size_callback(GLFWwindow *window, int width, int height); void mouse_callback(GLFWwindow *window, double xpos, double ypos); @@ -35,7 +40,11 @@ float lastFrame = 0.0f; // key press map std::unordered_map keyPressMap; +// Terrain chunk manager ChunkManager chunkManager; +// Global coordinator +Coordinator gCoordinator; + const int FPS_HISTORY_CAP = 5000; const int MEM_HISTORY_CAP = 5000; std::vector fpsHistory; @@ -121,8 +130,38 @@ int main() { // render loop // ----------- + // generate terrain chunkManager.pregenerateChunks(); + // initialize coordinator + gCoordinator.Init(); + + gCoordinator.RegisterComponent(); + gCoordinator.RegisterComponent(); + gCoordinator.RegisterComponent(); + + auto physicsSystem = gCoordinator.RegisterSystem(); + + Signature signature; + signature.set(gCoordinator.GetComponentType()); + signature.set(gCoordinator.GetComponentType()); + signature.set(gCoordinator.GetComponentType()); + gCoordinator.SetSystemSignature(signature); + + std::vector entities(MAX_ENTITIES); + + // create a dummy "player entity" + + entities[0] = gCoordinator.CreateEntity(); + gCoordinator.AddComponent(entities[0], + Gravity{glm::vec3(0.0f, 0.5f, 0.0f)}); + gCoordinator.AddComponent( + entities[0], + RigidBody{glm::vec3(0.0f, 0.0f, 0.0f), glm::vec3(0.0f, 0.0f, 0.0f)}); + + + auto player = &(entities[0]); + while (!glfwWindowShouldClose(window)) { // per-frame time logic // -------------------- @@ -130,6 +169,8 @@ int main() { deltaTime = currentFrame - lastFrame; lastFrame = currentFrame; + physicsSystem->Update(deltaTime); + ImGui_ImplOpenGL3_NewFrame(); ImGui_ImplGlfw_NewFrame(); ImGui::NewFrame(); @@ -168,10 +209,15 @@ int main() { // Ends the window ImGui::End(); + // get player velocity + RigidBody playerRB = gCoordinator.GetComponent(*player); + ImGui::Begin("Camera"); ImGui::Text("fov: %.2f", fov); ImGui::Text("pos: (%.2f, %.3f, %.3f)", cameraPos.x, cameraPos.y, cameraPos.z); + ImGui::Text("velocity: (%.2f, %.3f, %.3f)", playerRB.velocity.x, playerRB.velocity.y, + playerRB.velocity.z); ImGui::Text("left: (%.2f, %.3f, %.3f)", cameraLeft.x, cameraLeft.y, cameraLeft.z); ImGui::Text("right: (%.2f, %.3f, %.3f)", cameraRight.x, cameraRight.y, From 3cb6e835d9f7144c004ce2184cdb024421f400e9 Mon Sep 17 00:00:00 2001 From: Shr1ftyy Date: Sun, 22 Sep 2024 19:46:00 +0930 Subject: [PATCH 2/5] feat: camera and chunk mananger is in coordinator --- .clang-tidy | 422 ++++++++++++------------- CMakeLists.txt | 6 +- src/Camera.h | 78 +++++ src/Chunk.h | 11 +- src/ChunkManager.h | 42 +-- src/ChunkMesh.h | 10 +- src/Component.h | 67 ++-- src/Ecs.h | 706 +++++++++++++++++++++--------------------- src/Frustum.h | 33 +- src/PhysicsSystem.cpp | 25 -- src/PhysicsSystem.h | 51 ++- src/main.cpp | 247 ++++++++------- src/smolgl.h | 31 -- 13 files changed, 897 insertions(+), 832 deletions(-) create mode 100644 src/Camera.h delete mode 100644 src/PhysicsSystem.cpp diff --git a/.clang-tidy b/.clang-tidy index 2062324..bd2c7af 100644 --- a/.clang-tidy +++ b/.clang-tidy @@ -1,211 +1,211 @@ -Checks: " - -*, - bugprone-*, - cert-*, - clang-analyzer-*, - clang-diagnostic-*, - concurrency-*, - cppcoreguidelines-*, - darwin-*, - google-*, - llvm-*, - misc-*, - modernize-*, - performance-*, - readability-*, - hicpp-exception-baseclass, - hicpp-multiway-paths-covered, - hicpp-no-assembler, - portability-std-allocator-const, - -bugprone-easily-swappable-parameters, - -cppcoreguidelines-avoid-magic-numbers, - -cppcoreguidelines-non-private-member-variables-in-classes, - -cppcoreguidelines-avoid-non-const-global-variables, - -cppcoreguidelines-owning-memory, - -google-readability-todo, - -google-readability-braces-around-statements, - -llvm-include-order, - -llvm-header-guard, - -misc-non-private-member-variables-in-classes, - -modernize-use-trailing-return-type, - -readability-braces-around-statements, - -readability-function-cognitive-complexity, - -readability-function-size, - -readability-identifier-length, - -readability-implicit-bool-conversion, - -readability-magic-numbers, - -bugprone-narrowing-conversions, - -cert-con36-c, - -cert-con54-cpp, - -cert-dcl03-c, - -cert-dcl16-c, - -cert-dcl37-c, - -cert-dcl51-cpp, - -cert-dcl54-cpp, - -cert-dcl59-cpp, - -cert-err09-cpp, - -cert-err61-cpp, - -cert-exp42-c, - -cert-fio38-c, - -cert-flp37-c, - -cert-msc30-c, - -cert-msc32-c, - -cert-msc54-cpp, - -cert-oop11-cpp, - -cert-oop54-cpp, - -cert-pos44-c, - -cert-pos47-c, - -cert-sig30-c, - -cert-str34-c, - -clang-analyzer-core.CallAndMessage, - -clang-analyzer-core.DivideZero, - -clang-analyzer-core.NonNullParamChecker, - -clang-analyzer-core.NullDereference, - -clang-analyzer-core.StackAddressEscape, - -clang-analyzer-core.UndefinedBinaryOperatorResult, - -clang-analyzer-core.VLASize, - -clang-analyzer-core.uninitialized.ArraySubscript, - -clang-analyzer-core.uninitialized.Assign, - -clang-analyzer-core.uninitialized.Branch, - -clang-analyzer-core.uninitialized.UndefReturn, - -clang-analyzer-cplusplus.Move, - -clang-analyzer-cplusplus.NewDelete, - -clang-analyzer-cplusplus.NewDeleteLeaks, - -clang-analyzer-deadcode.DeadStores, - -clang-analyzer-nullability.NullPassedToNonnull, - -clang-analyzer-nullability.NullReturnedFromNonnull, - -clang-analyzer-nullability.NullableDereferenced, - -clang-analyzer-nullability.NullablePassedToNonnull, - -clang-analyzer-optin.cplusplus.UninitializedObject, - -clang-analyzer-optin.cplusplus.VirtualCall, - -clang-analyzer-optin.mpi.MPI-Checker, - -clang-analyzer-optin.osx.cocoa.localizability.EmptyLocalizationContextChecker, - -clang-analyzer-optin.osx.cocoa.localizability.NonLocalizedStringChecker, - -clang-analyzer-osx.API, - -clang-analyzer-osx.SecKeychainAPI, - -clang-analyzer-osx.cocoa.AtSync, - -clang-analyzer-osx.cocoa.ClassRelease, - -clang-analyzer-osx.cocoa.Dealloc, - -clang-analyzer-osx.cocoa.IncompatibleMethodTypes, - -clang-analyzer-osx.cocoa.NSAutoreleasePool, - -clang-analyzer-osx.cocoa.NSError, - -clang-analyzer-osx.cocoa.NilArg, - -clang-analyzer-osx.cocoa.ObjCGenerics, - -clang-analyzer-osx.cocoa.RetainCount, - -clang-analyzer-osx.cocoa.SelfInit, - -clang-analyzer-osx.cocoa.SuperDealloc, - -clang-analyzer-osx.cocoa.UnusedIvars, - -clang-analyzer-osx.cocoa.VariadicMethodTypes, - -clang-analyzer-osx.coreFoundation.CFError, - -clang-analyzer-osx.coreFoundation.CFNumber, - -clang-analyzer-osx.coreFoundation.CFRetainRelease, - -clang-analyzer-osx.coreFoundation.containers.OutOfBounds, - -clang-analyzer-osx.coreFoundation.containers.PointerSizedValues, - -clang-analyzer-security.FloatLoopCounter, - -clang-analyzer-security.insecureAPI.DeprecatedOrUnsafeBufferHandling, - -clang-analyzer-security.insecureAPI.UncheckedReturn, - -clang-analyzer-security.insecureAPI.bcmp, - -clang-analyzer-security.insecureAPI.bcopy, - -clang-analyzer-security.insecureAPI.bzero, - -clang-analyzer-security.insecureAPI.getpw, - -clang-analyzer-security.insecureAPI.gets, - -clang-analyzer-security.insecureAPI.mkstemp, - -clang-analyzer-security.insecureAPI.mktemp, - -clang-analyzer-security.insecureAPI.rand, - -clang-analyzer-security.insecureAPI.strcpy, - -clang-analyzer-security.insecureAPI.vfork, - -clang-analyzer-unix.API, - -clang-analyzer-unix.Malloc, - -clang-analyzer-unix.MallocSizeof, - -clang-analyzer-unix.MismatchedDeallocator, - -clang-analyzer-unix.Vfork, - -clang-analyzer-unix.cstring.BadSizeArg, - -clang-analyzer-unix.cstring.NullArg, - -cppcoreguidelines-avoid-c-arrays, - -cppcoreguidelines-avoid-magic-numbers, - -cppcoreguidelines-c-copy-assignment-signature, - -cppcoreguidelines-explicit-virtual-functions, - -cppcoreguidelines-macro-to-enum, - -cppcoreguidelines-non-private-member-variables-in-classes, - -fuchsia-header-anon-namespaces, - -google-readability-braces-around-statements, - -google-readability-function-size, - -google-readability-namespace-comments, - -hicpp-avoid-c-arrays, - -hicpp-braces-around-statements, - -hicpp-deprecated-headers, - -hicpp-explicit-conversions, - -hicpp-function-size, - -hicpp-invalid-access-moved, - -hicpp-member-init, - -hicpp-move-const-arg, - -hicpp-named-parameter, - -hicpp-new-delete-operators, - -hicpp-no-array-decay, - -hicpp-no-malloc, - -hicpp-noexcept-move, - -hicpp-special-member-functions, - -hicpp-static-assert, - -hicpp-undelegated-constructor, - -hicpp-uppercase-literal-suffix, - -hicpp-use-auto, - -hicpp-use-emplace, - -hicpp-use-equals-default, - -hicpp-use-equals-delete, - -hicpp-use-noexcept, - -hicpp-use-nullptr, - -hicpp-use-override, - -hicpp-vararg, - -llvm-else-after-return, - -llvm-qualified-auto, - misc-definitions-in-headers, - -modernize-avoid-c-arrays, - -readability-uppercase-literal-suffix - " -CheckOptions: - # - key: readability-identifier-naming.ClassCase - # value: CamelCase - # - key: readability-identifier-naming.EnumCase - # value: CamelCase - # - key: readability-identifier-naming.StructCase - # value: CamelCase - # - key: readability-identifier-naming.UnionCase - # value: CamelCase - # - key: readability-identifier-naming.FunctionCase - # value: camelBack - # - key: readability-identifier-naming.MethodCase - # value: camelBack - # - key: readability-identifier-naming.MemberCase - # value: lower_case - # - key: readability-identifier-naming.ParameterCase - # value: lower_case - # - key: readability-identifier-naming.VariableCase - # value: lower_case - # - key: readability-identifier-naming.TemplateParameterCase - # value: CamelCase - # - key: readability-identifier-naming.TypedefCase - # value: CamelCase - # - key: readability-identifier-naming.TypeAliasCase - # value: CamelCase - # - key: readability-identifier-naming.ConstantCase - # value: CamelCase - # - key: readability-identifier-naming.ConstantPrefix - # value: k - # - key: readability-identifier-naming.LocalConstantCase - # value: lower_case - # - key: readability-identifier-naming.LocalConstantPrefix - # value: "" - # - key: readability-identifier-naming.NamespaceCase - # value: lower_case - # - key: readability-identifier-naming.MacroDefinitionCase - # value: UPPER_CASE - # - key: readability-identifier-naming.PrivateMemberPrefix - # value: _ - - key: HeaderFileExtensions - value: ["x" - - key: cppcoreguidelines-special-member-functions.AllowSoleDefaultDtor - value: true - -DoNo -FormatStyle: "file" -WarningsAsErrors: "*" +Checks: " + -*, + bugprone-*, + cert-*, + clang-analyzer-*, + clang-diagnostic-*, + concurrency-*, + cppcoreguidelines-*, + darwin-*, + google-*, + llvm-*, + misc-*, + modernize-*, + performance-*, + readability-*, + hicpp-exception-baseclass, + hicpp-multiway-paths-covered, + hicpp-no-assembler, + portability-std-allocator-const, + -bugprone-easily-swappable-parameters, + -cppcoreguidelines-avoid-magic-numbers, + -cppcoreguidelines-non-private-member-variables-in-classes, + -cppcoreguidelines-avoid-non-const-global-variables, + -cppcoreguidelines-owning-memory, + -google-readability-todo, + -google-readability-braces-around-statements, + -llvm-include-order, + -llvm-header-guard, + -misc-non-private-member-variables-in-classes, + -modernize-use-trailing-return-type, + -readability-braces-around-statements, + -readability-function-cognitive-complexity, + -readability-function-size, + -readability-identifier-length, + -readability-implicit-bool-conversion, + -readability-magic-numbers, + -bugprone-narrowing-conversions, + -cert-con36-c, + -cert-con54-cpp, + -cert-dcl03-c, + -cert-dcl16-c, + -cert-dcl37-c, + -cert-dcl51-cpp, + -cert-dcl54-cpp, + -cert-dcl59-cpp, + -cert-err09-cpp, + -cert-err61-cpp, + -cert-exp42-c, + -cert-fio38-c, + -cert-flp37-c, + -cert-msc30-c, + -cert-msc32-c, + -cert-msc54-cpp, + -cert-oop11-cpp, + -cert-oop54-cpp, + -cert-pos44-c, + -cert-pos47-c, + -cert-sig30-c, + -cert-str34-c, + -clang-analyzer-core.CallAndMessage, + -clang-analyzer-core.DivideZero, + -clang-analyzer-core.NonNullParamChecker, + -clang-analyzer-core.NullDereference, + -clang-analyzer-core.StackAddressEscape, + -clang-analyzer-core.UndefinedBinaryOperatorResult, + -clang-analyzer-core.VLASize, + -clang-analyzer-core.uninitialized.ArraySubscript, + -clang-analyzer-core.uninitialized.Assign, + -clang-analyzer-core.uninitialized.Branch, + -clang-analyzer-core.uninitialized.UndefReturn, + -clang-analyzer-cplusplus.Move, + -clang-analyzer-cplusplus.NewDelete, + -clang-analyzer-cplusplus.NewDeleteLeaks, + -clang-analyzer-deadcode.DeadStores, + -clang-analyzer-nullability.NullPassedToNonnull, + -clang-analyzer-nullability.NullReturnedFromNonnull, + -clang-analyzer-nullability.NullableDereferenced, + -clang-analyzer-nullability.NullablePassedToNonnull, + -clang-analyzer-optin.cplusplus.UninitializedObject, + -clang-analyzer-optin.cplusplus.VirtualCall, + -clang-analyzer-optin.mpi.MPI-Checker, + -clang-analyzer-optin.osx.cocoa.localizability.EmptyLocalizationContextChecker, + -clang-analyzer-optin.osx.cocoa.localizability.NonLocalizedStringChecker, + -clang-analyzer-osx.API, + -clang-analyzer-osx.SecKeychainAPI, + -clang-analyzer-osx.cocoa.AtSync, + -clang-analyzer-osx.cocoa.ClassRelease, + -clang-analyzer-osx.cocoa.Dealloc, + -clang-analyzer-osx.cocoa.IncompatibleMethodTypes, + -clang-analyzer-osx.cocoa.NSAutoreleasePool, + -clang-analyzer-osx.cocoa.NSError, + -clang-analyzer-osx.cocoa.NilArg, + -clang-analyzer-osx.cocoa.ObjCGenerics, + -clang-analyzer-osx.cocoa.RetainCount, + -clang-analyzer-osx.cocoa.SelfInit, + -clang-analyzer-osx.cocoa.SuperDealloc, + -clang-analyzer-osx.cocoa.UnusedIvars, + -clang-analyzer-osx.cocoa.VariadicMethodTypes, + -clang-analyzer-osx.coreFoundation.CFError, + -clang-analyzer-osx.coreFoundation.CFNumber, + -clang-analyzer-osx.coreFoundation.CFRetainRelease, + -clang-analyzer-osx.coreFoundation.containers.OutOfBounds, + -clang-analyzer-osx.coreFoundation.containers.PointerSizedValues, + -clang-analyzer-security.FloatLoopCounter, + -clang-analyzer-security.insecureAPI.DeprecatedOrUnsafeBufferHandling, + -clang-analyzer-security.insecureAPI.UncheckedReturn, + -clang-analyzer-security.insecureAPI.bcmp, + -clang-analyzer-security.insecureAPI.bcopy, + -clang-analyzer-security.insecureAPI.bzero, + -clang-analyzer-security.insecureAPI.getpw, + -clang-analyzer-security.insecureAPI.gets, + -clang-analyzer-security.insecureAPI.mkstemp, + -clang-analyzer-security.insecureAPI.mktemp, + -clang-analyzer-security.insecureAPI.rand, + -clang-analyzer-security.insecureAPI.strcpy, + -clang-analyzer-security.insecureAPI.vfork, + -clang-analyzer-unix.API, + -clang-analyzer-unix.Malloc, + -clang-analyzer-unix.MallocSizeof, + -clang-analyzer-unix.MismatchedDeallocator, + -clang-analyzer-unix.Vfork, + -clang-analyzer-unix.cstring.BadSizeArg, + -clang-analyzer-unix.cstring.NullArg, + -cppcoreguidelines-avoid-c-arrays, + -cppcoreguidelines-avoid-magic-numbers, + -cppcoreguidelines-c-copy-assignment-signature, + -cppcoreguidelines-explicit-virtual-functions, + -cppcoreguidelines-macro-to-enum, + -cppcoreguidelines-non-private-member-variables-in-classes, + -fuchsia-header-anon-namespaces, + -google-readability-braces-around-statements, + -google-readability-function-size, + -google-readability-namespace-comments, + -hicpp-avoid-c-arrays, + -hicpp-braces-around-statements, + -hicpp-deprecated-headers, + -hicpp-explicit-conversions, + -hicpp-function-size, + -hicpp-invalid-access-moved, + -hicpp-member-init, + -hicpp-move-const-arg, + -hicpp-named-parameter, + -hicpp-new-delete-operators, + -hicpp-no-array-decay, + -hicpp-no-malloc, + -hicpp-noexcept-move, + -hicpp-special-member-functions, + -hicpp-static-assert, + -hicpp-undelegated-constructor, + -hicpp-uppercase-literal-suffix, + -hicpp-use-auto, + -hicpp-use-emplace, + -hicpp-use-equals-default, + -hicpp-use-equals-delete, + -hicpp-use-noexcept, + -hicpp-use-nullptr, + -hicpp-use-override, + -hicpp-vararg, + -llvm-else-after-return, + -llvm-qualified-auto, + misc-definitions-in-headers, + -modernize-avoid-c-arrays, + -readability-uppercase-literal-suffix + " +CheckOptions: + # - key: readability-identifier-naming.ClassCase + # value: CamelCase + # - key: readability-identifier-naming.EnumCase + # value: CamelCase + # - key: readability-identifier-naming.StructCase + # value: CamelCase + # - key: readability-identifier-naming.UnionCase + # value: CamelCase + # - key: readability-identifier-naming.FunctionCase + # value: camelBack + # - key: readability-identifier-naming.MethodCase + # value: camelBack + # - key: readability-identifier-naming.MemberCase + # value: lower_case + # - key: readability-identifier-naming.ParameterCase + # value: lower_case + # - key: readability-identifier-naming.VariableCase + # value: lower_case + # - key: readability-identifier-naming.TemplateParameterCase + # value: CamelCase + # - key: readability-identifier-naming.TypedefCase + # value: CamelCase + # - key: readability-identifier-naming.TypeAliasCase + # value: CamelCase + # - key: readability-identifier-naming.ConstantCase + # value: CamelCase + # - key: readability-identifier-naming.ConstantPrefix + # value: k + # - key: readability-identifier-naming.LocalConstantCase + # value: lower_case + # - key: readability-identifier-naming.LocalConstantPrefix + # value: "" + # - key: readability-identifier-naming.NamespaceCase + # value: lower_case + # - key: readability-identifier-naming.MacroDefinitionCase + # value: UPPER_CASE + # - key: readability-identifier-naming.PrivateMemberPrefix + # value: _ + - key: HeaderFileExtensions + value: ["x" + - key: cppcoreguidelines-special-member-functions.AllowSoleDefaultDtor + value: true + +DoNo +FormatStyle: "file" +WarningsAsErrors: "*" diff --git a/CMakeLists.txt b/CMakeLists.txt index 8335da4..01335f6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -6,7 +6,11 @@ set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED True) # Add source files -file(GLOB SOURCES "src/*.cpp") +file(GLOB SOURCES "src/main.cpp") + +if(WIN32) + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Xlinker /errorlimit:0") +endif() # Add GLAD add_library(glad libs/glad/src/glad.c) diff --git a/src/Camera.h b/src/Camera.h new file mode 100644 index 0000000..a168954 --- /dev/null +++ b/src/Camera.h @@ -0,0 +1,78 @@ +#ifndef CAMERA_H +#define CAMERA_H + +#include "Frustum.h" + +// Frustum createFrustumFromCamera(Camera camera); + +struct Camera { + // TODO: figure out camera following + // Entity* attachedTo; + bool isFree = true; + // camera + float cameraSpeedMultiplier = 20.0f; + glm::vec3 cameraPos = glm::vec3(0.0f, 2.0f, 1.0f); + glm::vec3 cameraFront = glm::vec3(0.0f, 0.0f, -1.0f); + glm::vec3 cameraUp = glm::vec3(0.0f, 1.0f, 0.0f); + + glm::vec3 cameraRight = glm::vec3(1.0f, 0.0f, 0.0f); + + // Calculate the left vector (opposite of right) + glm::vec3 cameraLeft = -cameraRight; + + // The top vector is the same as the up vector in this case + glm::vec3 cameraTop = cameraUp; + + bool firstMouse = true; + float yaw = -90.0f; // yaw is initialized to -90.0 degrees since a yaw of + // 0.0 results in a direction vector pointing to the + // right so we initially rotate a bit to the left. + float pitch = 0.0f; + float lastX = 800.0f / 2.0; + float lastY = 600.0 / 2.0; + float fov = 45.0f; + + float zNear = 0.1f; + float zFar = 1000.0f; + + Frustum frustum; + + Camera(); +}; + +Frustum createFrustumFromCamera(Camera camera) { + Frustum frustum; + + float aspect = (float)SCR_WIDTH / (float)SCR_HEIGHT; + const float halfVSide = + camera.zFar * tanf((float)glm::radians(camera.fov) * .5f); + const float halfHSide = halfVSide * aspect; + const glm::vec3 frontMultFar = camera.zFar * camera.cameraFront; + + frustum.planes[Frustum::FRUSTUM_NEAR] = + Plane3(camera.cameraPos + camera.zNear * camera.cameraFront, + camera.cameraFront); + camera.frustum.planes[Frustum::FRUSTUM_FAR] = + Plane3(camera.cameraPos + frontMultFar, -camera.cameraFront); + camera.frustum.planes[Frustum::FRUSTUM_RIGHT] = + Plane3(camera.cameraPos, + glm::cross(frontMultFar - camera.cameraRight * halfHSide, + camera.cameraUp)); + frustum.planes[Frustum::FRUSTUM_LEFT] = + Plane3(camera.cameraPos, + glm::cross(camera.cameraUp, + frontMultFar + camera.cameraRight * halfHSide)); + frustum.planes[Frustum::FRUSTUM_TOP] = + Plane3(camera.cameraPos, + glm::cross(camera.cameraRight, + frontMultFar - camera.cameraUp * halfVSide)); + frustum.planes[Frustum::FRUSTUM_BOTTOM] = Plane3( + camera.cameraPos, glm::cross(frontMultFar + camera.cameraUp * halfVSide, + camera.cameraRight)); + + return frustum; +} + +Camera::Camera() { frustum = createFrustumFromCamera(*this); } + +#endif // CAMERA_H \ No newline at end of file diff --git a/src/Chunk.h b/src/Chunk.h index 1167135..5a8a859 100644 --- a/src/Chunk.h +++ b/src/Chunk.h @@ -4,7 +4,6 @@ #include "ChunkMesh.h" #include #include -#include /* TODO LIST: @@ -39,7 +38,7 @@ struct Chunk { void unload(); void rebuildMesh(); void setup(); - void render(); + void render(Camera camera); // BoundingBox getBoundingBox(); void initialize(); void AddCubeFace(ChunkMesh *mesh, int p1, int p2, int p3, int p4, @@ -148,7 +147,7 @@ void Chunk::setup() { } // renders the chunk -void Chunk::render() { DrawChunkMesh(mesh, material, chunkPosition); } +void Chunk::render(Camera camera) { DrawChunkMesh(camera, mesh, material, chunkPosition); } // BoundingBox Chunk::getBoundingBox() { // glm::vec3 max = {chunkPosition.x + CHUNK_SIZE * Block::BLOCK_RENDER_SIZE, @@ -164,8 +163,10 @@ void Chunk::initialize() { for (int y = 0; y < CHUNK_SIZE; y++) { for (int z = 0; z < CHUNK_SIZE; z++) { int index = getIndex(x, y, z); - blocks[index].isActive = (rand() % 2 == 0) ? false : true; - blocks[index].blockType = (rand() % 2 == 0) ? BlockType::Grass : BlockType::Sand; + // NOTE: there seems to be a "pattern" in some chunks - is the same seed be initted across threads? + // seems like it does: https://en.cppreference.com/w/cpp/numeric/random/rand + blocks[index].isActive = (std::rand() % 2 == 0) ? false : true; + blocks[index].blockType = (std::rand() % 2 == 0) ? BlockType::Grass : BlockType::Sand; // blocks[index].isActive = true; } } diff --git a/src/ChunkManager.h b/src/ChunkManager.h index 949a0ae..e84221c 100644 --- a/src/ChunkManager.h +++ b/src/ChunkManager.h @@ -1,6 +1,8 @@ #ifndef CHUNKMANAGER_H #define CHUNKMANAGER_H + #include "Chunk.h" + #include #include #include @@ -73,16 +75,15 @@ struct ChunkManager { ChunkManager(unsigned int _chunkGenDistance, unsigned int _chunkRenderDistance, Shader *_terrainShader); ~ChunkManager(); - void update(float dt, glm::vec3 newCameraPosition, - glm::vec3 newCameraLookAt); - void updateAsyncChunker(glm::vec3 newCameraPosition); + void update(float dt, Camera newCamera); + void updateAsyncChunker(Camera newCamera); void updateLoadList(); void updateSetupList(); void updateRebuildList(); void updateFlagsList(); void updateUnloadList(glm::vec3 newCameraPosition); void updateVisibilityList(glm::vec3 newCameraPosition); - void updateRenderList(glm::vec3 newCameraPosition); + void updateRenderList(glm::vec3 newCameraPosition, Frustum frustum); void pregenerateChunks(); @@ -91,7 +92,7 @@ struct ChunkManager { GetChunkGenRange(glm::vec3 newCameraPosition); std::pair GetChunkRenderRange(glm::vec3 newCameraPosition); - void render(); + void render(Camera newCamera); Shader *terrainShader; @@ -104,8 +105,7 @@ struct ChunkManager { bool genChunk; bool forceVisibilityupdate; - glm::vec3 cameraPosition; - glm::vec3 cameraLookAt; + Camera camera; unsigned int chunkGenDistance; unsigned int chunkRenderDistance; @@ -130,8 +130,8 @@ ChunkManager::ChunkManager(unsigned int _chunkGenDistance, ChunkManager::~ChunkManager() {} -void ChunkManager::update(float dt, glm::vec3 newCameraPosition, - glm::vec3 newCameraLookAt) { +// TODO: surely we can just pass the camera right? +void ChunkManager::update(float dt, Camera newCamera) { // if (genChunk) { // updateAsyncChunker(newCameraPosition); // // asyncChunkFuture = std::async(&ChunkManager::updateAsyncChunker, @@ -145,10 +145,11 @@ void ChunkManager::update(float dt, glm::vec3 newCameraPosition, updateRebuildList(); // updateFlagsList(); // updateUnloadList(newCameraPosition); - updateVisibilityList(newCameraPosition); - updateRenderList(newCameraPosition); - cameraPosition = newCameraPosition; - cameraLookAt = newCameraLookAt; + updateVisibilityList(newCamera.cameraPos); + updateRenderList(newCamera.cameraPos, newCamera.frustum); + camera = newCamera; + // cameraPosition = camera.cameraPos; + // cameraLookAt = newCameraLookAt; } float roundUp(float number, float fixedBase) { @@ -222,7 +223,7 @@ ChunkManager::GetChunkRenderRange(glm::vec3 newCameraPosition) { void ChunkManager::pregenerateChunks() { int halfWorldSize = - (WORLD_SIZE * (Chunk::CHUNK_SIZE * Block::BLOCK_RENDER_SIZE)) / 2; + (WORLD_SIZE * (Chunk::CHUNK_SIZE * Block::BLOCK_RENDER_SIZE)) / 2; std::vector> futures; // Store futures to manage threads @@ -267,13 +268,13 @@ void ChunkManager::pregenerateChunks() { } } -void ChunkManager::updateAsyncChunker(glm::vec3 newCameraPosition) { - if (newCameraPosition == cameraPosition) { +void ChunkManager::updateAsyncChunker(Camera newCamera) { + if (newCamera.cameraPos == camera.cameraPos) { return; } std::pair chunkRange = - GetChunkGenRange(newCameraPosition); + GetChunkGenRange(camera.cameraPos); glm::vec3 start = chunkRange.first; glm::vec3 end = chunkRange.second; @@ -444,7 +445,8 @@ void ChunkManager::updateRebuildList() { // chunkUnloadList.clear(); // } -void ChunkManager::updateRenderList(glm::vec3 newCameraPosition) { +void ChunkManager::updateRenderList(glm::vec3 newCameraPosition, + Frustum frustum) { // Clear the render list each frame BEFORE we do our tests to see what // chunks should be rendered chunkRenderList.clear(); @@ -497,9 +499,9 @@ void ChunkManager::updateVisibilityList(glm::vec3 newCameraPosition) { } } -void ChunkManager::render() { +void ChunkManager::render(Camera newCamera) { for (Chunk *chunk : chunkRenderList) { - chunk->render(); + chunk->render(newCamera); } } diff --git a/src/ChunkMesh.h b/src/ChunkMesh.h index 751b88f..097abcb 100644 --- a/src/ChunkMesh.h +++ b/src/ChunkMesh.h @@ -1,7 +1,9 @@ #ifndef MESH_H #define MESH_H -#include "smolgl.h" +// #include "smolgl.h" +#include "Camera.h" + #include #include #include @@ -124,14 +126,14 @@ void UnloadChunkMesh(ChunkMesh mesh) { free(mesh.indices); } -void DrawChunkMesh(ChunkMesh mesh, Material material, glm::vec3 position) { +void DrawChunkMesh(Camera camera, ChunkMesh mesh, Material material, glm::vec3 position) { material.shader->use(); glm::mat4 projection = glm::perspective( - glm::radians(fov), (float)SCR_WIDTH / SCR_HEIGHT, zNear, zFar); + glm::radians(camera.fov), (float)SCR_WIDTH / SCR_HEIGHT, camera.zNear, camera.zFar); material.shader->setMat4("projection", projection); - glm::mat4 view = glm::lookAt(cameraPos, cameraPos + cameraFront, cameraUp); + glm::mat4 view = glm::lookAt(camera.cameraPos, camera.cameraPos + camera.cameraFront, camera.cameraUp); material.shader->setMat4("view", view); glm::mat4 model = glm::mat4(1.0f); diff --git a/src/Component.h b/src/Component.h index c6bee88..0fbf748 100644 --- a/src/Component.h +++ b/src/Component.h @@ -1,35 +1,34 @@ -#ifndef COMPONENT_H -#define COMPONENT_H - -#include -#include -#include - -#include -#include - - -using ComponentType = std::uint8_t; - -const ComponentType MAX_COMPONENTS = 32; -using Signature = std::bitset; - -struct Gravity -{ - glm::vec3 force; -}; - -struct RigidBody -{ - glm::vec3 velocity; - glm::vec3 acceleration; -}; - -struct Transform -{ - glm::vec3 position; - glm::quat rotation; - glm::vec3 scale; -}; - +#ifndef COMPONENT_H +#define COMPONENT_H + +#include +#include + +#include +#include +#include + +using ComponentType = std::uint8_t; + +const ComponentType MAX_COMPONENTS = 32; +using Signature = std::bitset; + +struct Gravity +{ + glm::vec3 force; +}; + +struct RigidBody +{ + glm::vec3 velocity; + glm::vec3 acceleration; +}; + +struct Transform +{ + glm::vec3 position; + glm::quat rotation; + glm::vec3 scale; +}; + #endif // COMPONENT_H \ No newline at end of file diff --git a/src/Ecs.h b/src/Ecs.h index 1ab04b5..ef765d5 100644 --- a/src/Ecs.h +++ b/src/Ecs.h @@ -1,351 +1,357 @@ -#ifndef ECS_H -#define ECS_H - -#include "Component.h" -#include -#include -#include -#include -#include -#include -#include - -using Entity = std::uint32_t; -const Entity MAX_ENTITIES = 5000; - -struct EntityManager { - // Queue of unused entity IDs - std::queue mAvailableEntities{}; - - // Array of signatures where the index corresponds to the entity ID - std::array mSignatures{}; - - // Total living entities - used to keep limits on how many exist - uint32_t mLivingEntityCount{}; - EntityManager() { - // Initialize the queue with all possible entity IDs - for (Entity entity = 0; entity < MAX_ENTITIES; ++entity) { - mAvailableEntities.push(entity); - } - } - - Entity CreateEntity() { - assert(mLivingEntityCount < MAX_ENTITIES && - "Too many entities in existence."); - - // Take an ID from the front of the queue - Entity id = mAvailableEntities.front(); - mAvailableEntities.pop(); - ++mLivingEntityCount; - - return id; - } - - void DestroyEntity(Entity entity) { - assert(entity < MAX_ENTITIES && "Entity out of range."); - - // Invalidate the destroyed entity's signature - mSignatures[entity].reset(); - - // Put the destroyed ID at the back of the queue - mAvailableEntities.push(entity); - --mLivingEntityCount; - } - - void SetSignature(Entity entity, Signature signature) { - assert(entity < MAX_ENTITIES && "Entity out of range."); - - // Put this entity's signature into the array - mSignatures[entity] = signature; - } - - Signature GetSignature(Entity entity) { - assert(entity < MAX_ENTITIES && "Entity out of range."); - - // Get this entity's signature from the array - return mSignatures[entity]; - } -}; - -struct IComponentArray { - public: - ~IComponentArray() = default; - void EntityDestroyed(Entity entity); -}; - -template struct ComponentArray : public IComponentArray { - void InsertData(Entity entity, T component) { - assert(mEntityToIndexMap.find(entity) == mEntityToIndexMap.end() && - "Component added to same entity more than once."); - - // Put new entry at end and update the maps - size_t newIndex = mSize; - mEntityToIndexMap[entity] = newIndex; - mIndexToEntityMap[newIndex] = entity; - mComponentArray[newIndex] = component; - ++mSize; - } - - void RemoveData(Entity entity) { - assert(mEntityToIndexMap.find(entity) != mEntityToIndexMap.end() && - "Removing non-existent component."); - - // Copy element at end into deleted element's place to maintain density - size_t indexOfRemovedEntity = mEntityToIndexMap[entity]; - size_t indexOfLastElement = mSize - 1; - mComponentArray[indexOfRemovedEntity] = - mComponentArray[indexOfLastElement]; - - // Update map to point to moved spot - Entity entityOfLastElement = mIndexToEntityMap[indexOfLastElement]; - mEntityToIndexMap[entityOfLastElement] = indexOfRemovedEntity; - mIndexToEntityMap[indexOfRemovedEntity] = entityOfLastElement; - - mEntityToIndexMap.erase(entity); - mIndexToEntityMap.erase(indexOfLastElement); - - --mSize; - } - - T &GetData(Entity entity) { - assert(mEntityToIndexMap.find(entity) != mEntityToIndexMap.end() && - "Retrieving non-existent component."); - - // Return a reference to the entity's component - return mComponentArray[mEntityToIndexMap[entity]]; - } - - void EntityDestroyed(Entity entity) { - if (mEntityToIndexMap.find(entity) != mEntityToIndexMap.end()) { - // Remove the entity's component if it existed - RemoveData(entity); - } - } - - // The packed array of components (of generic type T), - // set to a specified maximum amount, matching the maximum number - // of entities allowed to exist simultaneously, so that each entity - // has a unique spot. - std::array mComponentArray; - - // Map from an entity ID to an array index. - std::unordered_map mEntityToIndexMap; - - // Map from an array index to an entity ID. - std::unordered_map mIndexToEntityMap; - - // Total size of valid entries in the array. - size_t mSize; -}; - -struct ComponentManager { - template void RegisterComponent() { - const char *typeName = typeid(T).name(); - - assert(mComponentTypes.find(typeName) == mComponentTypes.end() && - "Registering component type more than once."); - - // Add this component type to the component type map - mComponentTypes.insert({typeName, mNextComponentType}); - - // Create a ComponentArray pointer and add it to the component arrays - // map - mComponentArrays.insert( - {typeName, std::make_shared>()}); - - // Increment the value so that the next component registered will be - // different - ++mNextComponentType; - } - - template ComponentType GetComponentType() { - const char *typeName = typeid(T).name(); - - assert(mComponentTypes.find(typeName) != mComponentTypes.end() && - "Component not registered before use."); - - // Return this component's type - used for creating signatures - return mComponentTypes[typeName]; - } - - template void AddComponent(Entity entity, T component) { - // Add a component to the array for an entity - GetComponentArray()->InsertData(entity, component); - } - - template void RemoveComponent(Entity entity) { - // Remove a component from the array for an entity - GetComponentArray()->RemoveData(entity); - } - - template T &GetComponent(Entity entity) { - // Get a reference to a component from the array for an entity - return GetComponentArray()->GetData(entity); - } - - void EntityDestroyed(Entity entity) { - // Notify each component array that an entity has been destroyed - // If it has a component for that entity, it will remove it - for (auto const &pair : mComponentArrays) { - auto const &component = pair.second; - - component->EntityDestroyed(entity); - } - } - - // Map from type string pointer to a component type - std::unordered_map mComponentTypes{}; - - // Map from type string pointer to a component array - std::unordered_map> - mComponentArrays{}; - - // The component type to be assigned to the next registered component - - // starting at 0 - ComponentType mNextComponentType{}; - - // Convenience function to get the statically casted pointer to the - // ComponentArray of type T. - template - std::shared_ptr> GetComponentArray() { - const char *typeName = typeid(T).name(); - - assert(mComponentTypes.find(typeName) != mComponentTypes.end() && - "Component not registered before use."); - - return std::static_pointer_cast>( - mComponentArrays[typeName]); - } -}; - -struct System { - public: - std::set mEntities; -}; - -struct SystemManager { - template std::shared_ptr RegisterSystem() { - const char *typeName = typeid(T).name(); - - assert(mSystems.find(typeName) == mSystems.end() && - "Registering system more than once."); - - // Create a pointer to the system and return it so it can be used - // externally - auto system = std::make_shared(); - mSystems.insert({typeName, system}); - return system; - } - - template void SetSignature(Signature signature) { - const char *typeName = typeid(T).name(); - - assert(mSystems.find(typeName) != mSystems.end() && - "System used before registered."); - - // Set the signature for this system - mSignatures.insert({typeName, signature}); - } - - void EntityDestroyed(Entity entity) { - // Erase a destroyed entity from all system lists - // mEntities is a set so no check needed - for (auto const &pair : mSystems) { - auto const &system = pair.second; - - system->mEntities.erase(entity); - } - } - - void EntitySignatureChanged(Entity entity, Signature entitySignature) { - // Notify each system that an entity's signature changed - for (auto const &pair : mSystems) { - auto const &type = pair.first; - auto const &system = pair.second; - auto const &systemSignature = mSignatures[type]; - - // Entity signature matches system signature - insert into set - if ((entitySignature & systemSignature) == systemSignature) { - system->mEntities.insert(entity); - } - // Entity signature does not match system signature - erase from set - else { - system->mEntities.erase(entity); - } - } - } - - // Map from system type string pointer to a signature - std::unordered_map mSignatures{}; - - // Map from system type string pointer to a system pointer - std::unordered_map> mSystems{}; -}; - -struct Coordinator { - void Init() { - // Create pointers to each manager - mComponentManager = std::make_unique(); - mEntityManager = std::make_unique(); - mSystemManager = std::make_unique(); - } - - // Entity methods - Entity CreateEntity() { return mEntityManager->CreateEntity(); } - - void DestroyEntity(Entity entity) { - mEntityManager->DestroyEntity(entity); - - mComponentManager->EntityDestroyed(entity); - - mSystemManager->EntityDestroyed(entity); - } - - // Component methods - template void RegisterComponent() { - mComponentManager->RegisterComponent(); - } - - template void AddComponent(Entity entity, T component) { - mComponentManager->AddComponent(entity, component); - - auto signature = mEntityManager->GetSignature(entity); - signature.set(mComponentManager->GetComponentType(), true); - mEntityManager->SetSignature(entity, signature); - - mSystemManager->EntitySignatureChanged(entity, signature); - } - - template void RemoveComponent(Entity entity) { - mComponentManager->RemoveComponent(entity); - - auto signature = mEntityManager->GetSignature(entity); - signature.set(mComponentManager->GetComponentType(), false); - mEntityManager->SetSignature(entity, signature); - - mSystemManager->EntitySignatureChanged(entity, signature); - } - - template T &GetComponent(Entity entity) { - return mComponentManager->GetComponent(entity); - } - - template ComponentType GetComponentType() { - return mComponentManager->GetComponentType(); - } - - // System methods - template std::shared_ptr RegisterSystem() { - return mSystemManager->RegisterSystem(); - } - - template void SetSystemSignature(Signature signature) { - mSystemManager->SetSignature(signature); - } - - std::unique_ptr mComponentManager; - std::unique_ptr mEntityManager; - std::unique_ptr mSystemManager; -}; - +#ifndef ECS_H +#define ECS_H + +#include +#include +#include +#include +#include +#include +#include + +#include "Component.h" +#include "ChunkManager.h" + +using Entity = std::uint32_t; +const Entity MAX_ENTITIES = 5000; + +struct EntityManager { + // Queue of unused entity IDs + std::queue mAvailableEntities{}; + + // Array of signatures where the index corresponds to the entity ID + std::array mSignatures{}; + + // Total living entities - used to keep limits on how many exist + uint32_t mLivingEntityCount{}; + EntityManager() { + // Initialize the queue with all possible entity IDs + for (Entity entity = 0; entity < MAX_ENTITIES; ++entity) { + mAvailableEntities.push(entity); + } + } + + Entity CreateEntity() { + assert(mLivingEntityCount < MAX_ENTITIES && + "Too many entities in existence."); + + // Take an ID from the front of the queue + Entity id = mAvailableEntities.front(); + mAvailableEntities.pop(); + ++mLivingEntityCount; + + return id; + } + + void DestroyEntity(Entity entity) { + assert(entity < MAX_ENTITIES && "Entity out of range."); + + // Invalidate the destroyed entity's signature + mSignatures[entity].reset(); + + // Put the destroyed ID at the back of the queue + mAvailableEntities.push(entity); + --mLivingEntityCount; + } + + void SetSignature(Entity entity, Signature signature) { + assert(entity < MAX_ENTITIES && "Entity out of range."); + + // Put this entity's signature into the array + mSignatures[entity] = signature; + } + + Signature GetSignature(Entity entity) { + assert(entity < MAX_ENTITIES && "Entity out of range."); + + // Get this entity's signature from the array + return mSignatures[entity]; + } +}; + +struct IComponentArray { + public: + ~IComponentArray() = default; + void EntityDestroyed(Entity entity); +}; + +template struct ComponentArray : public IComponentArray { + void InsertData(Entity entity, T component) { + assert(mEntityToIndexMap.find(entity) == mEntityToIndexMap.end() && + "Component added to same entity more than once."); + + // Put new entry at end and update the maps + size_t newIndex = mSize; + mEntityToIndexMap[entity] = newIndex; + mIndexToEntityMap[newIndex] = entity; + mComponentArray[newIndex] = component; + ++mSize; + } + + void RemoveData(Entity entity) { + assert(mEntityToIndexMap.find(entity) != mEntityToIndexMap.end() && + "Removing non-existent component."); + + // Copy element at end into deleted element's place to maintain density + size_t indexOfRemovedEntity = mEntityToIndexMap[entity]; + size_t indexOfLastElement = mSize - 1; + mComponentArray[indexOfRemovedEntity] = + mComponentArray[indexOfLastElement]; + + // Update map to point to moved spot + Entity entityOfLastElement = mIndexToEntityMap[indexOfLastElement]; + mEntityToIndexMap[entityOfLastElement] = indexOfRemovedEntity; + mIndexToEntityMap[indexOfRemovedEntity] = entityOfLastElement; + + mEntityToIndexMap.erase(entity); + mIndexToEntityMap.erase(indexOfLastElement); + + --mSize; + } + + T &GetData(Entity entity) { + assert(mEntityToIndexMap.find(entity) != mEntityToIndexMap.end() && + "Retrieving non-existent component."); + + // Return a reference to the entity's component + return mComponentArray[mEntityToIndexMap[entity]]; + } + + void EntityDestroyed(Entity entity) { + if (mEntityToIndexMap.find(entity) != mEntityToIndexMap.end()) { + // Remove the entity's component if it existed + RemoveData(entity); + } + } + + // The packed array of components (of generic type T), + // set to a specified maximum amount, matching the maximum number + // of entities allowed to exist simultaneously, so that each entity + // has a unique spot. + std::array mComponentArray; + + // Map from an entity ID to an array index. + std::unordered_map mEntityToIndexMap; + + // Map from an array index to an entity ID. + std::unordered_map mIndexToEntityMap; + + // Total size of valid entries in the array. + size_t mSize; +}; + +struct ComponentManager { + template void RegisterComponent() { + const char *typeName = typeid(T).name(); + + assert(mComponentTypes.find(typeName) == mComponentTypes.end() && + "Registering component type more than once."); + + // Add this component type to the component type map + mComponentTypes.insert({typeName, mNextComponentType}); + + // Create a ComponentArray pointer and add it to the component arrays + // map + mComponentArrays.insert( + {typeName, std::make_shared>()}); + + // Increment the value so that the next component registered will be + // different + ++mNextComponentType; + } + + template ComponentType GetComponentType() { + const char *typeName = typeid(T).name(); + + assert(mComponentTypes.find(typeName) != mComponentTypes.end() && + "Component not registered before use."); + + // Return this component's type - used for creating signatures + return mComponentTypes[typeName]; + } + + template void AddComponent(Entity entity, T component) { + // Add a component to the array for an entity + GetComponentArray()->InsertData(entity, component); + } + + template void RemoveComponent(Entity entity) { + // Remove a component from the array for an entity + GetComponentArray()->RemoveData(entity); + } + + template T &GetComponent(Entity entity) { + // Get a reference to a component from the array for an entity + return GetComponentArray()->GetData(entity); + } + + void EntityDestroyed(Entity entity) { + // Notify each component array that an entity has been destroyed + // If it has a component for that entity, it will remove it + for (auto const &pair : mComponentArrays) { + auto const &component = pair.second; + + component->EntityDestroyed(entity); + } + } + + // Map from type string pointer to a component type + std::unordered_map mComponentTypes{}; + + // Map from type string pointer to a component array + std::unordered_map> + mComponentArrays{}; + + // The component type to be assigned to the next registered component - + // starting at 0 + ComponentType mNextComponentType{}; + + // Convenience function to get the statically casted pointer to the + // ComponentArray of type T. + template + std::shared_ptr> GetComponentArray() { + const char *typeName = typeid(T).name(); + + assert(mComponentTypes.find(typeName) != mComponentTypes.end() && + "Component not registered before use."); + + return std::static_pointer_cast>( + mComponentArrays[typeName]); + } +}; + +struct System { + public: + std::set mEntities; +}; + +struct SystemManager { + template std::shared_ptr RegisterSystem() { + const char *typeName = typeid(T).name(); + + assert(mSystems.find(typeName) == mSystems.end() && + "Registering system more than once."); + + // Create a pointer to the system and return it so it can be used + // externally + auto system = std::make_shared(); + mSystems.insert({typeName, system}); + return system; + } + + template void SetSignature(Signature signature) { + const char *typeName = typeid(T).name(); + + assert(mSystems.find(typeName) != mSystems.end() && + "System used before registered."); + + // Set the signature for this system + mSignatures.insert({typeName, signature}); + } + + void EntityDestroyed(Entity entity) { + // Erase a destroyed entity from all system lists + // mEntities is a set so no check needed + for (auto const &pair : mSystems) { + auto const &system = pair.second; + + system->mEntities.erase(entity); + } + } + + void EntitySignatureChanged(Entity entity, Signature entitySignature) { + // Notify each system that an entity's signature changed + for (auto const &pair : mSystems) { + auto const &type = pair.first; + auto const &system = pair.second; + auto const &systemSignature = mSignatures[type]; + + // Entity signature matches system signature - insert into set + if ((entitySignature & systemSignature) == systemSignature) { + system->mEntities.insert(entity); + } + // Entity signature does not match system signature - erase from set + else { + system->mEntities.erase(entity); + } + } + } + + // Map from system type string pointer to a signature + std::unordered_map mSignatures{}; + + // Map from system type string pointer to a system pointer + std::unordered_map> mSystems{}; +}; + +struct Coordinator { + void Init(ChunkManager* chunkManager) { + // Create pointers to each manager + mComponentManager = std::make_unique(); + mEntityManager = std::make_unique(); + mSystemManager = std::make_unique(); + mChunkManager = chunkManager; + mCamera = Camera(); + } + + // Entity methods + Entity CreateEntity() { return mEntityManager->CreateEntity(); } + + void DestroyEntity(Entity entity) { + mEntityManager->DestroyEntity(entity); + + mComponentManager->EntityDestroyed(entity); + + mSystemManager->EntityDestroyed(entity); + } + + // Component methods + template void RegisterComponent() { + mComponentManager->RegisterComponent(); + } + + template void AddComponent(Entity entity, T component) { + mComponentManager->AddComponent(entity, component); + + auto signature = mEntityManager->GetSignature(entity); + signature.set(mComponentManager->GetComponentType(), true); + mEntityManager->SetSignature(entity, signature); + + mSystemManager->EntitySignatureChanged(entity, signature); + } + + template void RemoveComponent(Entity entity) { + mComponentManager->RemoveComponent(entity); + + auto signature = mEntityManager->GetSignature(entity); + signature.set(mComponentManager->GetComponentType(), false); + mEntityManager->SetSignature(entity, signature); + + mSystemManager->EntitySignatureChanged(entity, signature); + } + + template T &GetComponent(Entity entity) { + return mComponentManager->GetComponent(entity); + } + + template ComponentType GetComponentType() { + return mComponentManager->GetComponentType(); + } + + // System methods + template std::shared_ptr RegisterSystem() { + return mSystemManager->RegisterSystem(); + } + + template void SetSystemSignature(Signature signature) { + mSystemManager->SetSignature(signature); + } + + std::unique_ptr mComponentManager; + std::unique_ptr mEntityManager; + std::unique_ptr mSystemManager; + ChunkManager* mChunkManager; + Camera mCamera; +}; + #endif // ECS_H \ No newline at end of file diff --git a/src/Frustum.h b/src/Frustum.h index da99415..eebe26d 100644 --- a/src/Frustum.h +++ b/src/Frustum.h @@ -1,7 +1,9 @@ #ifndef FRUSTUM_H #define FRUSTUM_H +// #include "Camera.h" #include "smolgl.h" + #include #include #include @@ -54,7 +56,7 @@ struct Frustum { int SphereInFrustum(const glm::vec3 &point, float radius); int CubeInFrustum(const glm::vec3 ¢er, float x, float y, float z); - static enum { + enum { FRUSTUM_TOP = 0, FRUSTUM_BOTTOM, FRUSTUM_LEFT, @@ -63,7 +65,7 @@ struct Frustum { FRUSTUM_FAR, }; - static enum { + enum { FRUSTUM_OUTSIDE = 0, FRUSTUM_INTERSECT, FRUSTUM_INSIDE, @@ -80,33 +82,6 @@ struct Frustum { Frustum::Frustum() {} Frustum::~Frustum() {} -Frustum createFrustumFromCamera(float aspect, float fovY, float zNear, - float zFar) { - Frustum frustum; - const float halfVSide = zFar * tanf((float)glm::radians(fovY) * .5f); - const float halfHSide = halfVSide * aspect; - const glm::vec3 frontMultFar = zFar * cameraFront; - - frustum.planes[Frustum::FRUSTUM_NEAR] = - Plane3(cameraPos + zNear * cameraFront, cameraFront); - frustum.planes[Frustum::FRUSTUM_FAR] = - Plane3(cameraPos + frontMultFar, -cameraFront); - frustum.planes[Frustum::FRUSTUM_RIGHT] = - Plane3(cameraPos, - glm::cross(frontMultFar - cameraRight * halfHSide, cameraUp)); - frustum.planes[Frustum::FRUSTUM_LEFT] = - Plane3(cameraPos, - glm::cross(cameraUp, frontMultFar + cameraRight * halfHSide)); - frustum.planes[Frustum::FRUSTUM_TOP] = - Plane3(cameraPos, - glm::cross(cameraRight, frontMultFar - cameraUp * halfVSide)); - frustum.planes[Frustum::FRUSTUM_BOTTOM] = - Plane3(cameraPos, - glm::cross(frontMultFar + cameraUp * halfVSide, cameraRight)); - - return frustum; -} - int Frustum::SphereInFrustum(const glm::vec3 &point, float radius) { int result = FRUSTUM_INSIDE; float distance; diff --git a/src/PhysicsSystem.cpp b/src/PhysicsSystem.cpp deleted file mode 100644 index d898bc5..0000000 --- a/src/PhysicsSystem.cpp +++ /dev/null @@ -1,25 +0,0 @@ -#include "PhysicsSystem.h" -#include "Component.h" -// #include "Components/Gravity.hpp" -// #include "Components/RigidBody.hpp" -// #include "Components/Thrust.hpp" -// #include "Components/Transform.hpp" -// #include "Core/Coordinator.hpp" - -extern Coordinator gCoordinator; - -void PhysicsSystem::Init() {} - -void PhysicsSystem::Update(float dt) { - for (auto const &entity : mEntities) { - auto &rigidBody = gCoordinator.GetComponent(entity); - auto &transform = gCoordinator.GetComponent(entity); - - // Forces - auto const &gravity = gCoordinator.GetComponent(entity); - - transform.position += rigidBody.velocity * dt; - - rigidBody.velocity += gravity.force * dt; - } -} diff --git a/src/PhysicsSystem.h b/src/PhysicsSystem.h index bc30a60..d61166c 100644 --- a/src/PhysicsSystem.h +++ b/src/PhysicsSystem.h @@ -1,14 +1,39 @@ -#ifndef PHYSICSSYSTEM_H -#define PHYSICSSYSTEM_H - -#include "ecs.h" - -class PhysicsSystem : public System -{ -public: - void Init(); - - void Update(float dt); -}; - +#ifndef PHYSICSSYSTEM_H +#define PHYSICSSYSTEM_H + +#include "Ecs.h" + +#include "Component.h" +// #include "Components/Gravity.hpp" +// #include "Components/RigidBody.hpp" +// #include "Components/Thrust.hpp" +// #include "Components/Transform.hpp" +// #include "Core/Coordinator.hpp" + +class PhysicsSystem : public System +{ +public: + void Init(); + + void Update(float dt); +}; + +extern Coordinator gCoordinator; + +void PhysicsSystem::Init() {} + +void PhysicsSystem::Update(float dt) { + for (auto const &entity : mEntities) { + auto &rigidBody = gCoordinator.GetComponent(entity); + auto &transform = gCoordinator.GetComponent(entity); + + // Forces + auto const &gravity = gCoordinator.GetComponent(entity); + + transform.position += rigidBody.velocity * dt; + + rigidBody.velocity += gravity.force * dt; + } +} + #endif // PHYSICSSYSTEM_H \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index f58c585..c681419 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -11,17 +11,11 @@ #include -#include "ChunkManager.h" -#include "smolgl.h" -#include "ecs.h" +#include "Ecs.h" #include "PhysicsSystem.h" -#include "Component.h" #include -#include -#include #include "utils.h" -#include void framebuffer_size_callback(GLFWwindow *window, int width, int height); void mouse_callback(GLFWwindow *window, double xpos, double ypos); @@ -41,7 +35,7 @@ float lastFrame = 0.0f; std::unordered_map keyPressMap; // Terrain chunk manager -ChunkManager chunkManager; +ChunkManager *chunkManager; // Global coordinator Coordinator gCoordinator; @@ -122,19 +116,16 @@ int main() { // Chunk chunk = Chunk(pos, ourShader); // chunk.load(); // chunk.setup(); - chunkManager = ChunkManager(4, 3, ourShader); char fpsStr[32] = "FPS: 0"; char memStr[32]; - // render loop - // ----------- + // initialize coordinator + chunkManager = new ChunkManager(4, 3, ourShader); + gCoordinator.Init(chunkManager); // generate terrain - chunkManager.pregenerateChunks(); - - // initialize coordinator - gCoordinator.Init(); + gCoordinator.mChunkManager->pregenerateChunks(); gCoordinator.RegisterComponent(); gCoordinator.RegisterComponent(); @@ -159,9 +150,11 @@ int main() { entities[0], RigidBody{glm::vec3(0.0f, 0.0f, 0.0f), glm::vec3(0.0f, 0.0f, 0.0f)}); - auto player = &(entities[0]); + // render loop + // ----------- + while (!glfwWindowShouldClose(window)) { // per-frame time logic // -------------------- @@ -184,9 +177,9 @@ int main() { glClearColor(0.2f, 0.3f, 0.3f, 1.0f); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - // chunk.render(); - chunkManager.update(deltaTime, cameraPos, cameraPos + cameraFront); - chunkManager.render(); + gCoordinator.mChunkManager->update(deltaTime, gCoordinator.mCamera); + + gCoordinator.mChunkManager->render(gCoordinator.mCamera); // Rendering // (Your code clears your framebuffer, renders your other stuff etc.) @@ -213,45 +206,62 @@ int main() { RigidBody playerRB = gCoordinator.GetComponent(*player); ImGui::Begin("Camera"); - ImGui::Text("fov: %.2f", fov); - ImGui::Text("pos: (%.2f, %.3f, %.3f)", cameraPos.x, cameraPos.y, - cameraPos.z); - ImGui::Text("velocity: (%.2f, %.3f, %.3f)", playerRB.velocity.x, playerRB.velocity.y, - playerRB.velocity.z); - ImGui::Text("left: (%.2f, %.3f, %.3f)", cameraLeft.x, cameraLeft.y, - cameraLeft.z); - ImGui::Text("right: (%.2f, %.3f, %.3f)", cameraRight.x, cameraRight.y, - cameraRight.z); - ImGui::Text("up: (%.2f, %.3f, %.3f)", cameraUp.x, cameraUp.y, - cameraUp.z); + ImGui::Text("fov: %.2f", gCoordinator.mCamera.fov); + ImGui::Text("pos: (%.2f, %.3f, %.3f)", gCoordinator.mCamera.cameraPos.x, + gCoordinator.mCamera.cameraPos.y, + gCoordinator.mCamera.cameraPos.z); + ImGui::Text("velocity: (%.2f, %.3f, %.3f)", playerRB.velocity.x, + playerRB.velocity.y, playerRB.velocity.z); + ImGui::Text("left: (%.2f, %.3f, %.3f)", + gCoordinator.mCamera.cameraLeft.x, + gCoordinator.mCamera.cameraLeft.y, + gCoordinator.mCamera.cameraLeft.z); + ImGui::Text("right: (%.2f, %.3f, %.3f)", + gCoordinator.mCamera.cameraRight.x, + gCoordinator.mCamera.cameraRight.y, + gCoordinator.mCamera.cameraRight.z); + ImGui::Text("up: (%.2f, %.3f, %.3f)", gCoordinator.mCamera.cameraUp.x, + gCoordinator.mCamera.cameraUp.y, + gCoordinator.mCamera.cameraUp.z); ImGui::Text("frustum:"); ImGui::Text("left d = %.2f", - frustum.planes[Frustum::FRUSTUM_LEFT].distance); + gCoordinator.mCamera.frustum.planes[Frustum::FRUSTUM_LEFT] + .distance); ImGui::Text("right d = %.2f", - frustum.planes[Frustum::FRUSTUM_RIGHT].distance); - ImGui::Text("left: n:(%.2f, %.3f, %.3f)\nright: n:(%.3f, %.3f, %.3f)", - frustum.planes[Frustum::FRUSTUM_LEFT].normal.x, - frustum.planes[Frustum::FRUSTUM_LEFT].normal.y, - frustum.planes[Frustum::FRUSTUM_LEFT].normal.z, - frustum.planes[Frustum::FRUSTUM_RIGHT].normal.x, - frustum.planes[Frustum::FRUSTUM_RIGHT].normal.y, - frustum.planes[Frustum::FRUSTUM_RIGHT].normal.z); - - ImGui::Text("near: n:(%.2f, %.3f, %.3f)\nfar: n:(%.3f, %.3f, %.3f)", - frustum.planes[Frustum::FRUSTUM_NEAR].normal.x, - frustum.planes[Frustum::FRUSTUM_NEAR].normal.y, - frustum.planes[Frustum::FRUSTUM_NEAR].normal.z, - frustum.planes[Frustum::FRUSTUM_FAR].normal.x, - frustum.planes[Frustum::FRUSTUM_FAR].normal.y, - frustum.planes[Frustum::FRUSTUM_FAR].normal.z); - - ImGui::Text("bottom: n:(%.2f, %.3f, %.3f)\ntop: n:(%.3f, %.3f, %.3f)", - frustum.planes[Frustum::FRUSTUM_BOTTOM].normal.x, - frustum.planes[Frustum::FRUSTUM_BOTTOM].normal.y, - frustum.planes[Frustum::FRUSTUM_BOTTOM].normal.z, - frustum.planes[Frustum::FRUSTUM_TOP].normal.x, - frustum.planes[Frustum::FRUSTUM_TOP].normal.y, - frustum.planes[Frustum::FRUSTUM_TOP].normal.z); + gCoordinator.mCamera.frustum.planes[Frustum::FRUSTUM_RIGHT] + .distance); + ImGui::Text( + "left: n:(%.2f, %.3f, %.3f)\nright: n:(%.3f, %.3f, %.3f)", + gCoordinator.mCamera.frustum.planes[Frustum::FRUSTUM_LEFT].normal.x, + gCoordinator.mCamera.frustum.planes[Frustum::FRUSTUM_LEFT].normal.y, + gCoordinator.mCamera.frustum.planes[Frustum::FRUSTUM_LEFT].normal.z, + gCoordinator.mCamera.frustum.planes[Frustum::FRUSTUM_RIGHT] + .normal.x, + gCoordinator.mCamera.frustum.planes[Frustum::FRUSTUM_RIGHT] + .normal.y, + gCoordinator.mCamera.frustum.planes[Frustum::FRUSTUM_RIGHT] + .normal.z); + + ImGui::Text( + "near: n:(%.2f, %.3f, %.3f)\nfar: n:(%.3f, %.3f, %.3f)", + gCoordinator.mCamera.frustum.planes[Frustum::FRUSTUM_NEAR].normal.x, + gCoordinator.mCamera.frustum.planes[Frustum::FRUSTUM_NEAR].normal.y, + gCoordinator.mCamera.frustum.planes[Frustum::FRUSTUM_NEAR].normal.z, + gCoordinator.mCamera.frustum.planes[Frustum::FRUSTUM_FAR].normal.x, + gCoordinator.mCamera.frustum.planes[Frustum::FRUSTUM_FAR].normal.y, + gCoordinator.mCamera.frustum.planes[Frustum::FRUSTUM_FAR].normal.z); + + ImGui::Text( + "bottom: n:(%.2f, %.3f, %.3f)\ntop: n:(%.3f, %.3f, %.3f)", + gCoordinator.mCamera.frustum.planes[Frustum::FRUSTUM_BOTTOM] + .normal.x, + gCoordinator.mCamera.frustum.planes[Frustum::FRUSTUM_BOTTOM] + .normal.y, + gCoordinator.mCamera.frustum.planes[Frustum::FRUSTUM_BOTTOM] + .normal.z, + gCoordinator.mCamera.frustum.planes[Frustum::FRUSTUM_TOP].normal.x, + gCoordinator.mCamera.frustum.planes[Frustum::FRUSTUM_TOP].normal.y, + gCoordinator.mCamera.frustum.planes[Frustum::FRUSTUM_TOP].normal.z); ImGui::End(); if (cursorOn) { @@ -260,20 +270,27 @@ int main() { // ImGui::DragInt("tps", &g.ticksPerSecond, 1, 0, 1000); // } // Text that appears in the window - ImGui::Checkbox("generate chunks", &chunkManager.genChunk); + ImGui::Checkbox("generate chunks", + &gCoordinator.mChunkManager->genChunk); ImGui::LabelText("##moveSpeedLabel", "Movement Speed"); - ImGui::SliderFloat("##moveSpeedSlider", &cameraSpeedMultiplier, + ImGui::SliderFloat("##moveSpeedSlider", + &gCoordinator.mCamera.cameraSpeedMultiplier, 1.0f, 1000.0f); ImGui::LabelText("##chunkGenDistanceLabel", "Chunk Gen Distance"); - ImGui::SliderInt("##chunkGenDistanceSlider", - (int *)&chunkManager.chunkGenDistance, 1, 16); + ImGui::SliderInt( + "##chunkGenDistanceSlider", + (int *)&(gCoordinator.mChunkManager->chunkGenDistance), 1, 16); ImGui::LabelText("##renderDistanceLabel", "Render Distance"); - ImGui::SliderInt("##renderDistanceSlider", - (int *)&chunkManager.chunkRenderDistance, 1, 16); + ImGui::SliderInt( + "##renderDistanceSlider", + (int *)&(gCoordinator.mChunkManager->chunkRenderDistance), 1, + 16); ImGui::LabelText("##zFarLabel", "zFar"); - ImGui::SliderFloat("##zFarSlider", &zFar, 1.0f, 2000.0f); + ImGui::SliderFloat("##zFarSlider", &gCoordinator.mCamera.zFar, 1.0f, + 2000.0f); ImGui::LabelText("##fovSliderLabel", "FOV"); - ImGui::SliderFloat("##fovSlider", &fov, 25.0f, 105.0f); + ImGui::SliderFloat("##fovSlider", &gCoordinator.mCamera.fov, 25.0f, + 105.0f); // Slider that appears in the window // Ends the window ImGui::End(); @@ -308,22 +325,29 @@ void processInput(GLFWwindow *window, bool *cursorOn) { if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS) glfwSetWindowShouldClose(window, true); - float cameraSpeed = static_cast(cameraSpeedMultiplier * deltaTime); + float cameraSpeed = static_cast( + gCoordinator.mCamera.cameraSpeedMultiplier * deltaTime); constexpr glm::vec3 up = glm::vec3(0.0, 1.0, 0.0); if (glfwGetKey(window, GLFW_KEY_W) == GLFW_PRESS) - cameraPos += cameraSpeed * cameraFront; + gCoordinator.mCamera.cameraPos += + cameraSpeed * gCoordinator.mCamera.cameraFront; if (glfwGetKey(window, GLFW_KEY_S) == GLFW_PRESS) - cameraPos -= cameraSpeed * cameraFront; + gCoordinator.mCamera.cameraPos -= + cameraSpeed * gCoordinator.mCamera.cameraFront; if (glfwGetKey(window, GLFW_KEY_A) == GLFW_PRESS) - cameraPos -= - glm::normalize(glm::cross(cameraFront, cameraUp)) * cameraSpeed; + gCoordinator.mCamera.cameraPos -= + glm::normalize(glm::cross(gCoordinator.mCamera.cameraFront, + gCoordinator.mCamera.cameraUp)) * + cameraSpeed; if (glfwGetKey(window, GLFW_KEY_D) == GLFW_PRESS) - cameraPos += - glm::normalize(glm::cross(cameraFront, cameraUp)) * cameraSpeed; + gCoordinator.mCamera.cameraPos += + glm::normalize(glm::cross(gCoordinator.mCamera.cameraFront, + gCoordinator.mCamera.cameraUp)) * + cameraSpeed; if (glfwGetKey(window, GLFW_KEY_SPACE) == GLFW_PRESS) - cameraPos += up * cameraSpeed; + gCoordinator.mCamera.cameraPos += up * cameraSpeed; if (glfwGetKey(window, GLFW_KEY_LEFT_SHIFT) == GLFW_PRESS) { - cameraPos -= up * cameraSpeed; + gCoordinator.mCamera.cameraPos -= up * cameraSpeed; } // insert into key press map @@ -349,12 +373,14 @@ void processInput(GLFWwindow *window, bool *cursorOn) { if (glfwGetKey(window, GLFW_KEY_X) == GLFW_RELEASE && keyPressMap[GLFW_KEY_X]) { - chunkManager.genChunk = !chunkManager.genChunk; + gCoordinator.mChunkManager->genChunk = + !gCoordinator.mChunkManager->genChunk; keyPressMap[GLFW_KEY_X] = false; } - frustum = createFrustumFromCamera((float)SCR_WIDTH / (float)SCR_HEIGHT, fov, - zNear, zFar); + // TODO: a better way to do this? + gCoordinator.mCamera.frustum = + createFrustumFromCamera(gCoordinator.mCamera); } // glfw: whenever the window size changed (by OS or user resize) this callback @@ -398,54 +424,57 @@ void mouse_callback(GLFWwindow *window, double xposIn, double yposIn) { float xpos = static_cast(xposIn); float ypos = static_cast(yposIn); - if (firstMouse) { - lastX = xpos; - lastY = ypos; - firstMouse = false; + if (gCoordinator.mCamera.firstMouse) { + gCoordinator.mCamera.lastX = xpos; + gCoordinator.mCamera.lastY = ypos; + gCoordinator.mCamera.firstMouse = false; } - float xoffset = xpos - lastX; - float yoffset = - lastY - ypos; // reversed since y-coordinates go from bottom to top - lastX = xpos; - lastY = ypos; + float xoffset = xpos - gCoordinator.mCamera.lastX; + float yoffset = gCoordinator.mCamera.lastY - + ypos; // reversed since y-coordinates go from bottom to top + gCoordinator.mCamera.lastX = xpos; + gCoordinator.mCamera.lastY = ypos; float sensitivity = 0.1f; // change this value to your liking xoffset *= sensitivity; yoffset *= sensitivity; - yaw += xoffset; - pitch += yoffset; + gCoordinator.mCamera.yaw += xoffset; + gCoordinator.mCamera.pitch += yoffset; // make sure that when pitch is out of bounds, screen doesn't get // flipped - if (pitch > 89.0f) - pitch = 89.0f; - if (pitch < -89.0f) - pitch = -89.0f; + if (gCoordinator.mCamera.pitch > 89.0f) + gCoordinator.mCamera.pitch = 89.0f; + if (gCoordinator.mCamera.pitch < -89.0f) + gCoordinator.mCamera.pitch = -89.0f; glm::vec3 front; - front.x = cos(glm::radians(yaw)) * cos(glm::radians(pitch)); - front.y = sin(glm::radians(pitch)); - front.z = sin(glm::radians(yaw)) * cos(glm::radians(pitch)); + front.x = cos(glm::radians(gCoordinator.mCamera.yaw)) * + cos(glm::radians(gCoordinator.mCamera.pitch)); + front.y = sin(glm::radians(gCoordinator.mCamera.pitch)); + front.z = sin(glm::radians(gCoordinator.mCamera.yaw)) * + cos(glm::radians(gCoordinator.mCamera.pitch)); - cameraFront = glm::normalize(front); + gCoordinator.mCamera.cameraFront = glm::normalize(front); // Calculate the right vector - cameraRight = - glm::normalize(glm::cross(cameraFront, glm::vec3(0.0f, 1.0f, 0.0f))); + gCoordinator.mCamera.cameraRight = glm::normalize(glm::cross( + gCoordinator.mCamera.cameraFront, glm::vec3(0.0f, 1.0f, 0.0f))); // Calculate the up vector - cameraUp = glm::normalize(glm::cross(cameraRight, cameraFront)); + gCoordinator.mCamera.cameraUp = glm::normalize(glm::cross( + gCoordinator.mCamera.cameraRight, gCoordinator.mCamera.cameraFront)); // Calculate the left vector (opposite of right) - cameraLeft = -cameraRight; + gCoordinator.mCamera.cameraLeft = -gCoordinator.mCamera.cameraRight; // The top vector is the same as the up vector in this case - cameraTop = cameraUp; + gCoordinator.mCamera.cameraTop = gCoordinator.mCamera.cameraUp; - frustum = createFrustumFromCamera((float)SCR_WIDTH / (float)SCR_HEIGHT, fov, - zNear, zFar); + gCoordinator.mCamera.frustum = + createFrustumFromCamera(gCoordinator.mCamera); } void imgui_mouse_callback(GLFWwindow *window, double xposIn, double yposIn) { @@ -458,12 +487,12 @@ void imgui_mouse_callback(GLFWwindow *window, double xposIn, double yposIn) { // glfw: whenever the mouse scroll wheel scrolls, this callback is called // ---------------------------------------------------------------------- void scroll_callback(GLFWwindow *window, double xoffset, double yoffset) { - cameraSpeedMultiplier -= (float)yoffset; - if (cameraSpeedMultiplier < 1.0f) - cameraSpeedMultiplier = 1.0f; - if (cameraSpeedMultiplier > 1000.0f) - cameraSpeedMultiplier = 1000.0f; - - frustum = createFrustumFromCamera((float)SCR_WIDTH / (float)SCR_HEIGHT, fov, - zNear, zFar); + gCoordinator.mCamera.cameraSpeedMultiplier -= (float)yoffset; + if (gCoordinator.mCamera.cameraSpeedMultiplier < 1.0f) + gCoordinator.mCamera.cameraSpeedMultiplier = 1.0f; + if (gCoordinator.mCamera.cameraSpeedMultiplier > 1000.0f) + gCoordinator.mCamera.cameraSpeedMultiplier = 1000.0f; + + gCoordinator.mCamera.frustum = + createFrustumFromCamera(gCoordinator.mCamera); } diff --git a/src/smolgl.h b/src/smolgl.h index d9e804f..eac33e5 100644 --- a/src/smolgl.h +++ b/src/smolgl.h @@ -10,37 +10,6 @@ const unsigned int SCR_WIDTH = 1280; const unsigned int SCR_HEIGHT = 720; -// camera -float cameraSpeedMultiplier = 20.0f; -glm::vec3 cameraPos = glm::vec3(0.0f, 2.0f, 1.0f); -glm::vec3 cameraFront = glm::vec3(0.0f, 0.0f, -1.0f); -glm::vec3 cameraUp = glm::vec3(0.0f, 1.0f, 0.0f); - -glm::vec3 cameraRight = glm::vec3(1.0f, 0.0f, 0.0f); - -// Calculate the left vector (opposite of right) -glm::vec3 cameraLeft = -cameraRight; - -// The top vector is the same as the up vector in this case -glm::vec3 cameraTop = cameraUp; - -bool firstMouse = true; -float yaw = -90.0f; // yaw is initialized to -90.0 degrees since a yaw of 0.0 - // results in a direction vector pointing to the right so we - // initially rotate a bit to the left. -float pitch = 0.0f; -float lastX = 800.0f / 2.0; -float lastY = 600.0 / 2.0; -float fov = 45.0f; - -float zNear = 0.1f; -float zFar = 1000.0f; - -#include "Frustum.h" - -Frustum frustum = - createFrustumFromCamera((float)SCR_WIDTH / (float)SCR_HEIGHT, fov, zNear, zFar); - #include #ifndef SMOLGL_DEFAULT_SHADER_ATTRIB_LOCATION_POSITION From 1b908515a3e6a3ea1cbda59b25d8ea36003e6583 Mon Sep 17 00:00:00 2001 From: Shr1ftyy Date: Sat, 28 Sep 2024 16:15:32 +0930 Subject: [PATCH 3/5] feat: smol change with ui, checking player properties --- src/main.cpp | 52 ++++++++++++++++------- src/shaders/shader.frag | 6 +-- src/shaders/shader.vert | 11 ++--- src/shaders/{camera.frag => terrain.frag} | 0 src/shaders/{camera.vert => terrain.vert} | 0 5 files changed, 45 insertions(+), 24 deletions(-) rename src/shaders/{camera.frag => terrain.frag} (100%) rename src/shaders/{camera.vert => terrain.vert} (100%) diff --git a/src/main.cpp b/src/main.cpp index c681419..83a8d42 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -110,7 +110,9 @@ int main() { // build and compile shader programs // ------------------------------------ Shader *ourShader = - new Shader("src/shaders/camera.vert", "src/shaders/camera.frag"); + new Shader("src/shaders/terrain.vert", "src/shaders/terrain.frag"); + Shader *defaultShader = + new Shader("src/shaders/shader.vert", "src/shaders/shader.frag"); // glm::vec3 pos = glm::vec3(0, 0, 0); // Chunk chunk = Chunk(pos, ourShader); @@ -142,15 +144,20 @@ int main() { std::vector entities(MAX_ENTITIES); // create a dummy "player entity" - entities[0] = gCoordinator.CreateEntity(); gCoordinator.AddComponent(entities[0], - Gravity{glm::vec3(0.0f, 0.5f, 0.0f)}); + Gravity{glm::vec3(0.0f, -0.05f, 0.0f)}); gCoordinator.AddComponent( entities[0], RigidBody{glm::vec3(0.0f, 0.0f, 0.0f), glm::vec3(0.0f, 0.0f, 0.0f)}); - auto player = &(entities[0]); + // place the entity in front of us + gCoordinator.AddComponent( + entities[0], Transform{.position = glm::vec3(0.0f, 10.0f, -5.0f), + .rotation = glm::vec3(0.0f, 0.0f, 0.0f), + .scale = glm::vec3(1.0f, 1.0f, 1.0f)}); + + auto player = entities[0]; // render loop // ----------- @@ -177,13 +184,18 @@ int main() { glClearColor(0.2f, 0.3f, 0.3f, 1.0f); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + // update gCoordinator.mChunkManager->update(deltaTime, gCoordinator.mCamera); + // get player deets + RigidBody playerRB = gCoordinator.GetComponent(player); + Transform playerTrans = gCoordinator.GetComponent(player); + // render gCoordinator.mChunkManager->render(gCoordinator.mCamera); - - // Rendering - // (Your code clears your framebuffer, renders your other stuff etc.) - // (Your code calls glfwSwapBuffers() etc.) + + // TODO: render the "player" entity + defaultShader->use(); + glUseProgram(0); // Calculate FPS int fps = calculateFPS(deltaTime); @@ -193,25 +205,33 @@ int main() { } std::sprintf(memStr, "RAM: %f MB", mem / 1000000); - ImGui::Begin("Stats"); - + ImGui::SetNextWindowPos(ImVec2(0.0f, 0.0f), ImGuiCond_Always, + ImVec2(0.0f, 0.0f)); + ImGuiWindowFlags statsFlags = + ImGuiWindowFlags_NoDecoration | ImGuiWindowFlags_AlwaysAutoResize | + ImGuiWindowFlags_NoSavedSettings | + ImGuiWindowFlags_NoFocusOnAppearing | ImGuiWindowFlags_NoNav; + statsFlags |= ImGuiWindowFlags_NoMove; + bool active = true; + ImGui::Begin("Stats", &active, statsFlags); ImGui::Text("%s", fpsStr); ImGui::Text("%s", memStr); - - // Slider that appears in the window + ImGui::Separator(); // Ends the window ImGui::End(); - // get player velocity - RigidBody playerRB = gCoordinator.GetComponent(*player); + ImGui::Begin("Player"); + ImGui::Text("velocity: (%.2f, %.3f, %.3f)", playerRB.velocity.x, + playerRB.velocity.y, playerRB.velocity.z); + ImGui::Text("position: (%.2f, %.3f, %.3f)", playerTrans.position.x, + playerTrans.position.y, playerTrans.position.z); + ImGui::End(); ImGui::Begin("Camera"); ImGui::Text("fov: %.2f", gCoordinator.mCamera.fov); ImGui::Text("pos: (%.2f, %.3f, %.3f)", gCoordinator.mCamera.cameraPos.x, gCoordinator.mCamera.cameraPos.y, gCoordinator.mCamera.cameraPos.z); - ImGui::Text("velocity: (%.2f, %.3f, %.3f)", playerRB.velocity.x, - playerRB.velocity.y, playerRB.velocity.z); ImGui::Text("left: (%.2f, %.3f, %.3f)", gCoordinator.mCamera.cameraLeft.x, gCoordinator.mCamera.cameraLeft.y, diff --git a/src/shaders/shader.frag b/src/shaders/shader.frag index b6c7a1d..e2906ab 100644 --- a/src/shaders/shader.frag +++ b/src/shaders/shader.frag @@ -1,9 +1,9 @@ #version 330 core out vec4 FragColor; -in vec3 ourColor; +in vec4 ourColor; void main() { - FragColor = vec4(ourColor, 1.0f); -} + FragColor = ourColor; +} \ No newline at end of file diff --git a/src/shaders/shader.vert b/src/shaders/shader.vert index 871ba1c..5bb8611 100644 --- a/src/shaders/shader.vert +++ b/src/shaders/shader.vert @@ -1,11 +1,12 @@ #version 330 core layout (location = 0) in vec3 aPos; -layout (location = 1) in vec3 aColor; +layout (location = 1) in vec2 aTexCoord; -out vec3 ourColor; +uniform mat4 model; +uniform mat4 view; +uniform mat4 projection; void main() { - gl_Position = vec4(aPos, 1.0); - ourColor = aColor; -} + gl_Position = projection * view * model * vec4(aPos, 1.0f); +} \ No newline at end of file diff --git a/src/shaders/camera.frag b/src/shaders/terrain.frag similarity index 100% rename from src/shaders/camera.frag rename to src/shaders/terrain.frag diff --git a/src/shaders/camera.vert b/src/shaders/terrain.vert similarity index 100% rename from src/shaders/camera.vert rename to src/shaders/terrain.vert From 11be8dcdd3c854081d5de565cac4f1421d037bb7 Mon Sep 17 00:00:00 2001 From: Syeam Bin Abdullah <49330057+Shr1ftyy@users.noreply.github.com> Date: Sat, 28 Sep 2024 16:24:22 +0930 Subject: [PATCH 4/5] Update README.md --- README.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/README.md b/README.md index 658bc7c..93d3204 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,6 @@ # Voxel Engine -![frustum-demo (1)](https://github.com/user-attachments/assets/d3c4ed18-d3ca-42a8-bc0a-ac5dd6c6debc) - +![preview](https://github.com/user-attachments/assets/f4f6eb2c-5e47-4f15-8a8e-db896befeffd) Make sure to clone this repository recursively! ``` From 0ac00946e16e9e227430e4dbb510a3d9ad5d69bf Mon Sep 17 00:00:00 2001 From: Shr1ftyy Date: Sat, 28 Sep 2024 16:27:37 +0930 Subject: [PATCH 5/5] chore: added overview --- README.md | 5 +++++ assets/overview.png | Bin 0 -> 169648 bytes 2 files changed, 5 insertions(+) create mode 100644 assets/overview.png diff --git a/README.md b/README.md index 93d3204..7b4e6d0 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,11 @@ ![preview](https://github.com/user-attachments/assets/f4f6eb2c-5e47-4f15-8a8e-db896befeffd) +## Overview +![overview](assets/overview.png) + +### Instructions + Make sure to clone this repository recursively! ``` git clone https://github.com/compsci-adl/voxel-engine --recursive diff --git a/assets/overview.png b/assets/overview.png new file mode 100644 index 0000000000000000000000000000000000000000..6b279e4de5c858ceafacc8d4ddaaabe9f1d1d5b2 GIT binary patch literal 169648 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 literal 0 HcmV?d00001