Я использую для программирования в 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] );
В 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 элементов, что мы ему и предоставили
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Пользователь должен вводить данные с клавиатуры, а программа должна их заносить в массив в зависимости от типа введённых данных (int, double, char)Как...
Начал недавно изучать C++ на windows, и сейчас мне очень интересно узнать от опытных людей - какие способы создания графического пользовательского...