как передать класс как массив?

69
06 марта 2022, 21:30

Я использую для программирования в opengl библиотеку glm. Я смотрел в glm и так и не понял как это делается. Меня интересует вот это. Как класс может передать себя как двумерный массив, хотя вроде внутренне он передаёт одномерный массив. но как это в c++ сделать простым способом? Вот пример о чем я говорю.

glm::mat4 proj;
        this->proj = glm::ortho ( 0.0f, width, 0.0f, height, 0.0f, 1.0f );
glUniformMatrix4fv ( this->proj_location, 1, GL_FALSE, &this->proj[0][0] );
Answer 1

В glm матрица определена как массив из четырёх векторов размерности 4:

template<typename T, qualifier Q>
struct mat<4, 4, T, Q>
{
    typedef vec<4, T, Q> col_type;
private:
    col_type value[4];

Также для матрицы определён operator[], возвращающий ссылку на i-ый вектор:

template<typename T, qualifier Q>
typename mat<4, 4, T, Q>::col_type & mat<4, 4, T, Q>::operator[](typename mat<4, 4, T, Q>::length_type i)
{
    return this->value[i];
}

Дальше. vec4 определён как T x, y, z, w. operator[] для вектора работает так: проверяется i, и в зависимости от его значения возвращается ссылка на соотвествующую координату:

template<typename T, qualifier Q>
T& vec<4, T, Q>::operator[](typename vec<4, T, Q>::length_type i)
{
    assert(i >= 0 && i < this->length());
    switch(i)
    {
    default:
    case 0:
        return x;
    case 1:
        return y;
    case 2:
        return z;
    case 3:
        return w;
    }
}

Что имеем в итоге: proj[0] возвращает ссылку на вектор, и (proj[0])[0] возвращает ссылку на координату. В памяти это выглядит вот так:
т.е. последовательно. Именно это и имеет значение. glUniformMatrix4fv просит массив из 16 элементов, что мы ему и предоставили

READ ALSO
заполнение массива в зависимости от введённого типа данных

заполнение массива в зависимости от введённого типа данных

Пользователь должен вводить данные с клавиатуры, а программа должна их заносить в массив в зависимости от типа введённых данных (int, double, char)Как...

164
Поиск пробела в строке

Поиск пробела в строке

При нахождение пробела в строке нужно завершить программу

147
Варианты создания GUI в windows на C++

Варианты создания GUI в windows на C++

Начал недавно изучать C++ на windows, и сейчас мне очень интересно узнать от опытных людей - какие способы создания графического пользовательского...

106