Entity Component System - MeshRenderSystem или просто MeshRenderer? - PullRequest
0 голосов
/ 08 марта 2019

Прежде всего, позвольте мне описать мои термины / реализации.

Компонент содержит только данные о чем-то.например,

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 держите камеры и рендеры.

...