Hello, I’ve trouble using glDrawElements, it is for study purpose. I’m still using OpenGL SDK 1.1 provided by Microsoft. I’ve been struggling with this about a month.
I try to render multiple objects (3 objects) at the same time. (Based on MS3D ASCII file format)
This is my loader function, I print those values are correct.
int iVal = NULL;
fread(&iVal, sizeof (int), 1, pIn);
pLevel[iLevel].iMesh = iVal;
pLevel[iLevel].pMesh = (SMesh*) malloc(sizeof (SMesh) * iVal);
//pLevel[iLevel].pMesh = new SMesh[iVal];
for (int i = 0; i < pLevel[iLevel].iMesh; ++i)
{
//pLevel[iLevel].pMesh[i].pName = (char*) malloc(sizeof (char) * 32);
//pLevel[iLevel].pMesh[i].mMat.pTexture = (char*) malloc(sizeof (char) * 32);
//pLevel[iLevel].pMesh[i].pName = new char[32];
//pLevel[iLevel].pMesh[i].mMat.pTexture = new char[32];
fread(pLine, sizeof (char), 32, pIn);
pLevel[iLevel].pMesh[i].pName = (char*) malloc(strlen(pLine) + 1);
//pLevel[iLevel].pMesh[i].pName = new char[strlen(pLine)+1];
strncpy(pLevel[iLevel].pMesh[i].pName, pLine, strlen(pLine));
pLevel[iLevel].pMesh[i].pName[strlen(pLine)] = '\0';
fread(pLine, sizeof (char), 32, pIn);
pLevel[iLevel].pMesh[i].mMat.pTexture = (char*) malloc(strlen(pLine)+1);
//pLevel[iLevel].pMesh[i].mMat.pTexture = new char[strlen(pLine)+1];
strncpy(pLevel[iLevel].pMesh[i].mMat.pTexture, pLine, strlen(pLine));
pLevel[iLevel].pMesh[i].mMat.pTexture[strlen(pLine)] = '\0';
fread(&pLevel[iLevel].pMesh[i].mMat.iSphere, sizeof (int), 1, pIn);
fread(&pLevel[iLevel].pMesh[i].mMat.fTransparancy, sizeof (float), 1, pIn);
pLevel[iLevel].pMesh[i].mMat.iID = TextureLoad(pLevel[iLevel].pMesh[i].mMat.pTexture);
fread(&iVal, sizeof (int), 1, pIn);
pLevel[iLevel].pMesh[i].iVe = iVal;
pLevel[iLevel].pMesh[i].pVe = (SVec3Df*) malloc(sizeof (SVec3Df) * iVal);
pLevel[iLevel].pMesh[i].pVt = (SVec2Df*) malloc(sizeof (SVec2Df) * iVal);
//pLevel[iLevel].pMesh[i].pVe = new SVec3Df[iVal];
//pLevel[iLevel].pMesh[i].pVt = new SVec2Df[iVal];
for (int j = 0; j < iVal; ++j)
{
fread(&pLevel[iLevel].pMesh[i].pVe[j], sizeof (float), 3, pIn);
fread(&pLevel[iLevel].pMesh[i].pVt[j], sizeof (float), 2, pIn);
}
fread(&iVal, sizeof (int), 1, pIn);
pLevel[iLevel].pMesh[i].iVn = iVal;
pLevel[iLevel].pMesh[i].pVn = (SVec3Df*) malloc(sizeof (SVec3Df) * iVal);
//pLevel[iLevel].pMesh[i].pVn = new SVec3Df[iVal];
for (int j = 0; j < iVal; ++j)
{
fread(&pLevel[iLevel].pMesh[i].pVn[j], sizeof (float), 3, pIn);
//printf("%f %f %f
", pLevel[iLevel].pMesh[i].pVn[j].fX, pLevel[iLevel].pMesh[i].pVn[j].fY, pLevel[iLevel].pMesh[i].pVn[j].fZ);
}
fread(&iVal, sizeof (int), 1, pIn);
pLevel[iLevel].pMesh[i].iTri = iVal * 3;
pLevel[iLevel].pMesh[i].pTri = (SVec3Di*) malloc(sizeof (SVec3Di) * iVal);
//pLevel[iLevel].pMesh[i].pTri = new SVec3Di[iVal];
for (int j = 0; j < iVal; ++j)
{
fread(&pLevel[iLevel].pMesh[i].pTri[j], sizeof (int), 3, pIn);
}
}
When I try to render, I got access violation reading location in the application.
This is the render function:
glPushMatrix();
for (int i = 0; i < pLevel[iLevel].iMesh; ++i)
{
glColor4f(1.0f, 1.0f, 1.0f, pLevel[iLevel].pMesh[i].mMat.fTransparancy);
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_NORMAL_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glVertexPointer(3, GL_FLOAT, sizeof (SVec3Df), &pLevel[iLevel].pMesh[i].pVe[0]);
glNormalPointer(GL_FLOAT, sizeof (SVec3Df), &pLevel[iLevel].pMesh[i].pVn[0]);
glTexCoordPointer(2, GL_FLOAT, sizeof (SVec2Df), &pLevel[iLevel].pMesh[i].pVt[0]);
glBindTexture(GL_TEXTURE_2D, pLevel[iLevel].pMesh[i].mMat.iID);
glDrawElements(GL_TRIANGLES, pLevel[iLevel].pMesh[i].iTri, GL_UNSIGNED_INT, &pLevel[iLevel].pMesh[i].pTri[0]);
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_NORMAL_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
}
Could it be the object loading order that causes the error? Because when I change the orders sometimes they crash, sometimes they don’t.
NB: I know lot of OpenGL 1.1 functions are deprecated, I do this for study purpose only. Thank you before