У меня в настоящее время есть узел в моем мозгу о том, как правильно инициализировать массив GLFloats по строкам. Насколько я знаю, массив можно было бы написать так:
int a[2][2] = {{1,2},{3,4}}
В моем случае у меня есть массив
GLfloat targetVertices[10][72];
для вершин шести сторон кубов (точнее, десяти кубов). Координаты куба сохраняются в
float targetX[10], targetY[10], targetZ[10];
массивы. Я хотел бы инициализировать его следующим образом:
for(iii = 0; iii <= 9; iii++) {
targetVertices[iii] = { /*Side 1*/
targetX[iii]-1, targetY[iii]-1, targetZ[iii]-1,
targetX[iii]-1, targetY[iii]-1, targetZ[iii]+1,
targetX[iii]-1, targetY[iii]+1, targetZ[iii]+1,
targetX[iii]-1, targetY[iii]+1, targetZ[iii]-1,
/*Side 2*/
targetX[iii]+1, targetY[iii]-1, targetZ[iii]-1,
targetX[iii]+1, targetY[iii]-1, targetZ[iii]+1,
targetX[iii]+1, targetY[iii]+1, targetZ[iii]+1,
targetX[iii]+1, targetY[iii]+1, targetZ[iii]-1,
/*Side 3*/
targetX[iii]-1, targetY[iii]-1, targetZ[iii]-1,
targetX[iii]-1, targetY[iii]-1, targetZ[iii]+1,
targetX[iii]+1, targetY[iii]-1, targetZ[iii]+1,
targetX[iii]+1, targetY[iii]-1, targetZ[iii]-1,
/*Side 4*/
targetX[iii]-1, targetY[iii]+1, targetZ[iii]-1,
targetX[iii]-1, targetY[iii]+1, targetZ[iii]+1,
targetX[iii]+1, targetY[iii]+1, targetZ[iii]+1,
targetX[iii]+1, targetY[iii]+1, targetZ[iii]-1,
/*Side 5*/
targetX[iii]-1, targetY[iii]-1, targetZ[iii]-1,
targetX[iii]-1, targetY[iii]+1, targetZ[iii]-1,
targetX[iii]+1, targetY[iii]+1, targetZ[iii]-1,
targetX[iii]+1, targetY[iii]-1, targetZ[iii]-1,
/*Side 6*/
targetX[iii]-1, targetY[iii]-1, targetZ[iii]+1,
targetX[iii]-1, targetY[iii]+1, targetZ[iii]+1,
targetX[iii]+1, targetY[iii]+1, targetZ[iii]+1,
targetX[iii]+1, targetY[iii]-1, targetZ[iii]+1
};
}
К сожалению, мне всегда говорят о синтаксической ошибке относительно самой первой squiggly-скобки (C2059 и C2143, но это не имеет никакого смысла для меня там). Надеюсь, мой вопрос ясен, и кто-то может мне помочь. Я не нашел ничего похожего на мою проблему на этом или любом другом сайте.
Заранее спасибо!
Проблема с вашим синтаксисом заключается в следующем: targetVertices [iii] вы ссылаетесь на индекс iith массива, а не на весь столбец. 2D-массивы хранятся как массивы 1D, но предоставляют [] [] для простого доступа. Вы можете ссылаться на них как на одномерные, так и на двухмерные.
Вот более подходящий способ подойти к этому.
void addVertex(std::vector<GLfloat> &data, GLfloat x, GLfloat y, GLfloat z)
{
data.push_back(x);
data.push_back(y);
data.push_back(z);
}
void addCube(std::vector<GLfloat> &data, GLfloat x, GLfloat y, GLfloat z)
{
addVertex(data, x-1, y-1, z-1);
addVertex(data, x-1, y-1, z+1);
addVertex(data, x-1, y+1, z+1);
addVertex(data, x-1, y+1, z-1);
addVertex(data, x+1, y-1, z-1);
addVertex(data, x+1, y-1, z+1);
addVertex(data, x+1, y+1, z+1);
addVertex(data, x+1, y+1, z-1);
addVertex(data, x-1, y-1, z-1);
addVertex(data, x-1, y-1, z+1);
addVertex(data, x+1, y-1, z+1);
addVertex(data, x+1, y-1, z-1);
addVertex(data, x-1, y+1, z-1);
addVertex(data, x-1, y+1, z+1);
addVertex(data, x+1, y+1, z+1);
addVertex(data, x+1, y+1, z-1);
addVertex(data, x-1, y-1, z-1);
addVertex(data, x-1, y+1, z-1);
addVertex(data, x+1, y+1, z-1);
addVertex(data, x+1, y-1, z-1);
addVertex(data, x-1, y-1, z+1);
addVertex(data, x-1, y+1, z+1);
addVertex(data, x+1, y+1, z+1);
addVertex(data, x+1, y-1, z+1);
}
void makeCubes(std::vector<GLfloat> &data)
{
float targetX[10], targetY[10], targetZ[10];
data.clear();
data.reserve(720);
//...initialize the above arrays...
for (int i=0; i<10; i++)
{
std::vector<GLfloat> newData;
addCube(newData, targetX[i], targetY[i], targetZ[i]);
data.insert(data.begin(), newData.begin(), newData.end());
}
}
Вы можете легко преобразовать это в C-массив, взяв ссылку на первый элемент:
std::vector<GLfloat> data;
makeCubes(data);
GLfloat *cArray = &data[0];
Вызов glBufferData можно сделать следующим образом:
glBufferData(GL_ARRAY_BUFFER,
data.size()*sizeof(GLfloat),
&data[0],
GL_STREAM_DRAW);