На первый взгляд я не увидел ничего явно неправильного. Но если, как вы говорите, он взрывается на int v = data.faceList[i].vertex[j];
, то вполне вероятно, что проблема либо в i
, либо j
, либо в том, что оба они слишком большие или слишком маленькие.
Помимо очевидного подхода к удобству работы с отладчиком и устранения этой ошибки, лучший подход к решению подобных проблем, вероятно, состоит в том, чтобы вообще их избегать. Некоторые вещи программисты более подвержены ошибкам, чем другие. Список длинный, но вы делаете по крайней мере два из них, в пиках, в своем коде.
1) Вы используете динамически распределяемые массивы
2) Вы используете петли ручной работы
Старайтесь избегать подобных вещей, используя инструменты, предоставляемые C ++. Начните с # 1 и избавьтесь от динамически размещаемых массивов.
У вас есть структура:
struct ObjFace{
int* vertex;
int* uv;
int* normal;
};
... с 3 указателями на int
. Вместо этого используйте vector
:
struct ObjFace{
vector<int> vertex;
vector<int> uv;
vector<int> normal;
};
... и тогда весь код, который вам приходилось писать раньше, теперь становится намного проще и гораздо менее подвержен ошибкам:
// all this goes away
//_data.faceList = new ObjFace[_data.numFaces];
//_data.vertexList = new ObjVert[_data.numVertices];
//_data.uvList = new ObjUV[_data.numUVcoords];
//_data.normalList = new ObjNormal[_data.numNormals];
... и:
// now you ask the vector how many elements it really has
for(int i = 0; i<data.faceList.size(); i++){
for(int j = 0; j<data.faceList.size(); j++){ //Ask the vector instead of assuming triangles
int v = data.faceList[i].vertex[j]; // Access violation here.
double vX = data.vertexList[v].x;
double vY = data.vertexList[v].y;
double vZ = data.vertexList[v].z;
glVertex3d(vX, vY, vZ);
}
}
Теперь посмотрите на этот цикл. Циклы являются очень распространенным источником ошибок. Лучший цикл - это цикл, который вам никогда не придется писать. Так что используйте вместо этого алгоритмы STL. Добавьте функцию в ObjFace для выполнения glVertex3d
для каждого из ее элементов:
struct ObjFace{
//...
void do_vertex() const
{
typedef vector<int> ints;
for( ints::iterator it = vertex.begin(); it != vertex.end(); ++it )
glVertex3d(it->x, it->y, it->z);
}
};
... затем вернитесь назад и уменьшите исходный цикл:
(псевдокод, фактический синтаксис более сложный)
typedef vector<ObjFace> ObjFaces;
for( ObjFaces::iterator it = data.faceList.begin(); it != data.faceList.end(); ++it )
it->do_vertex();
... или, чуть больше усилий:
for_each( data.faceList.begin(), data.faceList.end(), &ObjFace::do_vertex );