Trying to merge with develop

This commit is contained in:
Zoe Roux
2021-06-07 14:40:24 +02:00
112 changed files with 2955 additions and 1081 deletions
+42 -7
View File
@@ -6,7 +6,9 @@
#pragma once
#include <vector>
#include <list>
#include <functional>
#include <View/View.hpp>
#include "Entity/Entity.hpp"
namespace WAL
@@ -15,20 +17,51 @@ namespace WAL
class Scene
{
private:
static int _nextID;
//! @brief An ID representing this scene.
int _id = _nextID++;
//! @brief The list of registered entities
std::vector<Entity> _entities = {};
std::list<Entity> _entities = {};
//! @brief The list of cached views to update.
std::vector<std::shared_ptr<IView>> _views = {};
//! @brief Notify this scene that a component has been added to the given entity.
//! @param entity The entity with the new component
//! @param type The type of the component added.
void _componentAdded(Entity &entity, const std::type_index &type);
//! @brief Notify this scene that a component has been removed to the given entity.
//! @param entity The entity with the removed component
//! @param type The type of the component removed.
void _componentRemoved(const Entity &entity, const std::type_index &type);
//! @brief Remove an entity from every views.
//! @param entity The entity to remove.
void _entityRemoved(const Entity &entity);
public:
//! @brief Get the list of entities.
std::vector<Entity> &getEntities();
std::list<Entity> &getEntities();
//! @brief Add a new entity to the scene, you can use this method with the same arguments as the entity's constructor.
//! @return The current scene is returned to allow you to chain call.
template <class ...Params>
Entity &addEntity(Params &&...params)
//! @brief Add a new entity to the scene.
//! @param name The name of the created entity.
//! @return The created entity is returned.
Entity &addEntity(const std::string &name);
template<typename ...Components>
View<Components...> &view()
{
return this->_entities.emplace_back(std::forward<Params>(params)...);
static std::unordered_map<int, std::weak_ptr<View<Components...>>> cache;
auto existing = cache.find(this->_id);
if (existing != cache.end() && !existing->second.expired())
return *existing->second.lock();
auto view = std::make_shared<View<Components...>>(this->_entities);
this->_views.emplace_back(view);
cache.emplace(this->_id, view);
return *view;
}
//! @brief Delete entities marked as deleted.
void deleteMarkedEntities();
//! @brief A default constructor
Scene() = default;
//! @brief A scene is copy constructable
@@ -38,5 +71,7 @@ namespace WAL
//! @brief A scene is assignable
Scene &operator=(const Scene &);
Scene(Scene &&) = default;
friend Entity;
};
} // namespace WAL