Как создать это общее поле структуры данных для моего класса Vulkan? - PullRequest
0 голосов
/ 04 февраля 2019

Я пытаюсь создать класс для «сущности» в Vulkan (сущность - это графический объект, который может быть визуализирован в окне);

Этот класс будет содержать соответствующий буфер вершин, а такжес макетом набора дескрипторов, пулом дескрипторов, наборами дескрипторов и т. д. проблема заключается в том, как управлять унифицированными буферами, потому что я хотел бы что-то вроде этого:

class Entity final {

public:

    enum class Uniform_Type : char {
        MODEL_MATRIX, VIEW_MATRIX, PROJECTION_MATRIX, AMBIENT_VECTOR, DIFFUSE_VECTOR,
        SPECULAR_VECTOR, SHININESS_FLOAT, LIGHT_AMBIENT_VECTOR, LIGHT_DIFFUSE_VECTOR,
        LIGHT_SPECULAR_VECTOR, IS_LIGHT_SOURCE_BOOLEAN, LIGHT_POSITION_VECTOR,
        VIEW_POSITION_VECTOR
    };

    // Private fields
    std::unordered_map<Uniform_Type, std::pair<WHAT_HERE, std::vector<Uniform_Buffer>>> uniformsMap;

};

, так что если мой класс нуждается только вмодель, вид и матрицу проекции, я сделаю что-то вроде этого (первый элемент std :: pair будет содержать соответствующий объект (матрица в данном случае), второй - вектор единообразных буферов, поэтому они могут быть кактак же, как и количество изображений в цепочке подкачки):

uniformsMap[MODEL_MATRIX] = { glm::mat4(1.0f), std::vector<Uniform_Buffer>() };
uniformsMap[VIEW_MATRIX] = { glm::mat4(1.0f), std::vector<Uniform_Buffer>() };
uniformsMap[PROJECTION_MATRIX] = { glm::mat4(1.0f), std::vector<Uniform_Buffer>() };

Проблема в том, что существуют различные виды унифицированных буферов (матрица, вектор, плавающее число, bool и т. д.), поэтому я застряло том, что писать как первый элемент объекта std :: pair.

Спасибо за ваше время.

1 Ответ

0 голосов
/ 04 февраля 2019

Вы можете использовать std::variant<>, который затем выведите на правильный тип с помощью get<>(), когда вам это нужно.

Шаблон будет представлять собой список всех возможных типов, которые вам понадобятся.

Кроме того, это более стиль, но я не фанат использования std::pair вот так.Это очень мало усилий, чтобы создать небольшую структуру с выделенными именами полей (кроме придумывания имен).И вам не придется иметь дело с особенностями std::pair.

...