У меня проблемы с размещением данных в файле 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
Как мне это сделать?