Как собрать данные волнового фронта .obj в массивы элементов и вершин минимального размера? - PullRequest
1 голос
/ 10 ноября 2019

У меня проблемы с размещением данных в файле wavefront .obj.

Это определения vec3 и vec2

template <typename T>
struct vec3 {
    T x;
    T y;
    T z;
};
template <typename T>
    struct vec2 {
    T x;
    T y;
};

, используемые в векторе:

+-----------------------------------+--------------+--------------+-------+
| std::vector<vec3<uint32_t>> f_vec | 0            | 1            | (...) |
+-----------------------------------+--------------+--------------+-------+
|                                   | v_vec_index  | v_vec_index  | (...) |
|                                   +--------------+--------------+-------+
|                                   | vt_vec_index | vt_vec_index | (...) |
|                                   +--------------+--------------+-------+
|                                   | vn_vec_index | vn_vec_index | (...) |
+-----------------------------------+--------------+--------------+-------+

Где:

  • v_vec_index - индекс std::vector<vec3<float>> v_vec с полями, содержащими координаты вершин x, y и z
  • vt_vec_indexявляется индексом std::vector<vec2<float>> vt_vec, содержащим текстуры u и v координат
  • vn_vec_index является индексом std::vector<vec3<float>> vn_vec с нормальными координатами x, y и z

Every f_vecполе используется для создания последовательности vert_x, vert_y, vert_z, tex_u, tex_v, norm_x, norm_y, norm_z значений с плавающей запятой внутри std::vector<float> vertex_array.

Кроме того, каждый индекс поля f_vec по умолчанию имеет значение std::vector<uint32_t>> element_array, то есть содержитдиапазон целых чисел от 0 до f_vec.size() - 1.

Проблема в том, что vec3 поля внутри f_vec могут повторяться. Таким образом, чтобы собрать только уникальные последовательности, упомянутые выше, я планировал включить что-то вроде этого:

+-----------------+---+---+---+---+---+
|      f_vec      | 0 | 1 | 2 | 3 | 4 |
+-----------------+---+---+---+---+---+
|                 | 1 | 3 | 1 | 3 | 4 |
|                 +---+---+---+---+---+
|                 | 2 | 2 | 2 | 2 | 5 |
|                 +---+---+---+---+---+
|                 | 2 | 4 | 2 | 4 | 5 |
+-----------------+---+---+---+---+---+

В это:

+------------------------+-----------------+---+---+---+---+---+
| whatever that would be |      index      | 0 | 1 | 2 | 3 | 4 |
+------------------------+-----------------+---+---+---+---+---+
|                        |       key       | 0 | 1 | 0 | 1 | 2 |
|                        +-----------------+---+---+---+---+---+
|                        |                 | 1 | 3 | 1 | 3 | 4 |
|                        |                 +---+---+---+---+---+
|                        | vec3 of indices | 2 | 2 | 2 | 2 | 5 |
|                        |                 +---+---+---+---+---+
|                        |                 | 2 | 4 | 2 | 4 | 5 |
+------------------------+-----------------+---+---+---+---+---+

Где каждый раз элемент f_vec будетбыть помещенным в "whatever container"

  • Было бы проверено, является ли оно уникальным

  • Если это так, то оно будет выдвинуто вконец container, где его ключ является следующим натуральным числом после самого большого ключа - значение ключа будет помещено в element_array, и внутри vertex_array

Как мне это сделать?

...