Прежде всего, позвольте мне описать мои термины / реализации.
Компонент содержит только данные о чем-то.например,
class TransformComponent : public Component<TransformComponent> /*CRTP*/ {
public:
/*...*/
private:
Transform mTransform;
}
Кроме того, компонент может иметь несколько полезных функций о себе, если это необходимо.
Объект является контейнером компонентов и отвечает за его создание / удаление объекта.component.
class Entity {
public:
template <typename T, typename ...Args>
bool attach(Args ... args);
template <typename T>
bool detach();
template <typename T>
T* get();
/*...*/
private:
ComponentTypeBit mComponentBit;
std::unordered_map<ComponentTypeBit, ComponentIsh> mComponentMap;
}
Система управляет компонентом (ами) объекта.Система может быть заинтересована в одном или нескольких типах компонентов.Объект может быть зарегистрирован в системе.Если у сущности есть все компоненты, которые требуются системе, то система сохраняет указатель сущности.
template<typename ... Args>
class System {
public:
/*...*/
void registerEntity(Entity& entity);
void deregisterEntity(Entity& entity);
const std::vector<Entity*>& getEntities() const;
/*...*/
private:
ComponentTypeBit mComponentBit;
std::vector<Entity*> mEntities;
}
class HierarchySystem : public System<HierarchyComponent, TransformComponent> {
/*If a entity has HierarchyComponent and TransformComponent,
address of the entity adds to mEntities*/
}
Вопрос, конечно, не только в самом классе визуализации.
Если я хочу визуализировать произвольную (статическую) сетку, мне нужна матрица вида и матрица проекции с камеры.Отсюда началось мое замешательство.
На первый взгляд, я думаю, что рендерер сетки можно определить так:
class MeshRenderSystem : public System<TransformComponent, MeshComponent, MaterialComponent>
/*currently, MaterialComponent holds reference to fragment shader*/
Таким образом, я могу установить униформу матрицы модели и атрибуты вершины, материальную форму.Но куда мне положить матрицу вида и проекции?А как насчет вызова отрисовки?
Идея 1: class Scene
, которая содержит список объектов и камер.
Возможная проблема: камера не является объектом.Это означает, что мне нужно что-то вроде CameraTargetComponent
.Но чтобы обновить этот компонент, система должна ссылаться на Scene
Идея 2: CameraComponent
, которая представляет камеру.Таким образом, у камеры могут быть родительские или дочерние элементы на HierarchyComponent
.
Возможная проблема: если камера - это объект, где я должен хранить матрицу вида и проекции для рендеринга (потому что в моих системах нет очереди событий или наоборот)?Нужно ли мне что-то вроде Scene
снова?
Идея 3: SceneManager
с SystemProvider
и EntityProvider
.И если объект, созданный EntityProvider
и зарегистрированный в текущей сцене SceneManager
, то также зарегистрирован в системе.SceneManager
держите камеры и рендеры.