aboutsummaryrefslogtreecommitdiffstats
path: root/yage/entity/entity.h
diff options
context:
space:
mode:
Diffstat (limited to 'yage/entity/entity.h')
-rw-r--r--yage/entity/entity.h125
1 files changed, 19 insertions, 106 deletions
diff --git a/yage/entity/entity.h b/yage/entity/entity.h
index a032ad8a..2aa31a66 100644
--- a/yage/entity/entity.h
+++ b/yage/entity/entity.h
@@ -1,127 +1,40 @@
-/** ---------------------------------------------------------------------------
- * -*- c++ -*-
- * @file: entity.h
- *
- * Copyright (c) 2017 Yann Herklotz Grave <ymherklotz@gmail.com>
- * MIT License, see LICENSE file for more details.
- * ----------------------------------------------------------------------------
- */
-
#pragma once
-#include <memory>
#include <vector>
+#include "component.h"
+
namespace yage
{
-class Space;
-class ComponentGroup;
-
+/**
+ * The entity is currently just an unsigned integer, which may change to a
+ * class in the future.
+ */
typedef unsigned int Entity;
-/** Manages entities in a space.
+/**
+ * Has to keep track of all the different entities and their current state.
+ *
+ * The key actions on an Entity are: deleting, creating.
*/
class EntityManager
{
public:
- /** Default instance of an EntityManager.
- */
- EntityManager() = default;
-
- /** Creates an instance of the entity manager, which refers back to the
- * space it was created in and belongs to.
- *
- * @param space Current space that the EntityManager belongs to.
- */
- EntityManager(Space *space);
-
- /** Creates an instance of the entitiy manager with an initial size.
- *
- * @param space Current space that the EntityManager belongs to. @param n
- * Initial size of the EntityManager.
- */
- EntityManager(Space *space, std::size_t n);
-
- /** Creates an Entity and returns the handle to the entity, which can then
- * be used by the user to do operations on it.
- *
- * @return The handle to the entity that was created in the space.
- */
- Entity createEntity();
-
- /** Delete an entity.
- */
- void deleteEntity(Entity entity);
+ Entity create_entity();
+ EntityManager &delete_entity(Entity entity);
+ bool is_valid(Entity entity) const;
+ EntityManager &add_component(Entity entity, BaseComponent *component);
private:
- /** The next available handle to give to the user.
- */
- Entity next_entity_ = 0;
-
- /** The space that the entity manager belongs to.
- */
- Space *space_ = nullptr;
-
- /** The entities in the current space.
- */
- std::vector<Entity> entities_;
+ Entity update_next_entity();
- /** Component list of different component groups, that then contain the
- * different components for the entities.
- */
- std::vector<std::unique_ptr<ComponentGroup>> components;
-};
+ Entity next_entity_ = 0;
-/** Base component used to store components.
- *
- * Should not be inherited from when declaring a new component. Instead, the
- * Component<Derived> should be used.
- */
-class BaseComponent
-{
public:
- /** Group used to register a specific component internally with the entity
- * manager.
- */
- typedef unsigned Group;
-
-protected:
- static Group group_id_counter_;
-};
-
-/** The main component that is used to make a component from a defined struct.
- *
- * A component should only be declared as a struct and should not contain any
- * data itself.
- */
-template <typename Derived>
-class Component : public BaseComponent
-{
-private:
- friend class EntityManager;
-
- BaseComponent::Group group();
+ std::vector<ComponentGroup> component_group_;
+ std::vector<ComponentMask> component_masks_;
+ std::vector<Entity> deleted_;
};
-/** Contains a list of all components that belong to a sepecific group, these
- * are then stored in the main entity manager.
- */
-class ComponentGroup
-{
-private:
- friend class EntityManager;
-
- std::vector<BaseComponent *> components_;
-};
-
-// Template definitions
-
-template <typename Derived>
-BaseComponent::Group Component<Derived>::group()
-{
- static Group group_id = group_id_counter_++;
- return group_id;
-}
-
} // namespace yage