Hey guys,
I have tried to write a generic plane class that when passed parameters will create a flat 2D plane. It all looks ok to me, but I get a run time error and I am not sure what is wrong.
I am pasting the main bits of code here, and attaching a picture that helps to explain how it works. Vertex3f is a class that holds 3 floats.
Code:
bool Plane::Create(float sX, float sY, int dX, int dY, char *tex)
{
texFile = tex;
sizeX = sX;
sizeY = sY;
divisionsX = dX;
divisionsY = dY;
int array_size = (divisionsX + 2) * (divisionsY + 2);
vertexBuffer = new Vector3f[array_size];
normalBuffer = new Vector3f[array_size];
texCoordBuffer = new Vector2f[array_size];
indexBuffer = new unsigned short[(((divisionsX+1)*2)+2)*(divisionsY+1)];
for (int i = 0; i < array_size; i++)
{
normalBuffer[i].x = 0.0f;
normalBuffer[i].y = 1.0f;
normalBuffer[i].z = 0.0f;
}
//generate vertex and tex co-ords.
float vertex_incX = sizeX / (divisionsX + 1);
float vertex_incY = sizeY / (divisionsY + 1);
int vPos = 0;
for (int i = 0; i <= divisionsY + 1; i++)
{
for (int j = 0; j <= divisionsX + 1; j++)
{
vertexBuffer[vPos].x = vertex_incX * j;
vertexBuffer[vPos].y = 0.0f;
vertexBuffer[vPos].z = vertex_incY * i;
texCoordBuffer[vPos].x = (float)(1 / (divisionsX + 1)) * j;
texCoordBuffer[vPos].y = (float)(1 / (divisionsY + 1)) * i;
vPos++;
}
}
//generate the index array.
int iPos = 0;
for (int j = 0; j <= divisionsY; j++)
{
int start1 = j * (divisionsX + 2);
int start2 = (j + 1) * (divisionsX + 2);
for (int i = 0; i <= divisionsX+1; i++)
{
indexBuffer[iPos] = start1;
iPos++;
indexBuffer[iPos] = start2;
iPos++;
start1++;
start2++;
}
}
texID = TextureManager::getInstance()->LoadTexture(texFile);
return true;
}
void Plane::Draw() const
{
glEnable(GL_TEXTURE_2D);
TextureManager::getInstance()->ApplyTexture(texID);
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, GL_FLOAT, 0, &vertexBuffer[0]);
glEnableClientState(GL_NORMAL_ARRAY);
glNormalPointer(GL_FLOAT, 0, &normalBuffer[0]);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glTexCoordPointer(2, GL_FLOAT, 0, &texCoordBuffer[0]);
int rowSize = ((divisionsX+1)*2)+2;
for (int i = 0; i< divisionsY + 1; i++)
{
glDrawElements(GL_TRIANGLE_STRIP, rowSize, GL_UNSIGNED_INT, &indexBuffer[i*rowSize]);
}
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_NORMAL_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glDisable(GL_TEXTURE_2D);
}
The problem is apparently with this line:
Code:
glDrawElements(GL_TRIANGLE_STRIP, rowSize, GL_UNSIGNED_INT, &indexBuffer[i*rowSize]);
It gives the error:
Unhandled exception at 0x691ca718 in Zargons2.exe: 0xC0000005: Access violation reading location 0x018360bc.
Any ideas?