Hello everyone!
I think this maybe more related to perhaps more of how I calculated my normals, then a OpenGL issue. But I assume the best place to ask would be OpenGL forum encase if it's the way I told OpenGL to handle my normals.
Anyways I dont think my normals are calculated correctly, because I'm throwing in a rotating cube into my scene using triangles, and it appears only some triangles seem to light up correctly. Otherwise most of them are simply just black. Btw my scene is drawn clockwise if that makes a difference... And I'm using glNormalPointer, glVertexPointer, etc.. to draw everything and to make my OpenGL calls optimized as much as I can. ;)
Cube class constructor: Not really important I suspect since all this does is put together the cube and does nothing with the normals, but just encase...
Cube[0] = m_pos.m_X-m_size.m_X;
Cube[1] = m_pos.m_Y+m_size.m_Y;
Cube[2] = m_pos.m_Z+m_size.m_Z;
//Vector2
Cube[3] = m_pos.m_X+m_size.m_X;
Cube[4] = m_pos.m_Y+m_size.m_Y;
Cube[5] = m_pos.m_Z+m_size.m_Z;
//Vector3
Cube[6] = m_pos.m_X-m_size.m_X;
Cube[7] = m_pos.m_Y-m_size.m_Y;
Cube[8] = m_pos.m_Z+m_size.m_Z;
//Second triangle...
//Vector 1
Cube[9] = m_pos.m_X-m_size.m_X;
Cube[10] = m_pos.m_Y-m_size.m_Y;
Cube[11] = m_pos.m_Z+m_size.m_Z;
//Vector2
Cube[12] = m_pos.m_X+m_size.m_X;
Cube[13] = m_pos.m_Y+m_size.m_Y;
Cube[14] = m_pos.m_Z+m_size.m_Z;
//Vector3
Cube[15] = m_pos.m_X+m_size.m_X;
Cube[16] = m_pos.m_Y-m_size.m_Y;
Cube[17] = m_pos.m_Z+m_size.m_Z;
//BACK face...
//First triangle.
//Vector 1
Cube[18] = m_pos.m_X+m_size.m_X;
Cube[19] = m_pos.m_Y+m_size.m_Y;
Cube[20] = m_pos.m_Z-m_size.m_Z;
//Vector2
Cube[21] = m_pos.m_X-m_size.m_X;
Cube[22] = m_pos.m_Y+m_size.m_Y;
Cube[23] = m_pos.m_Z-m_size.m_Z;
//Vector3
Cube[24] = m_pos.m_X+m_size.m_X;
Cube[25] = m_pos.m_Y-m_size.m_Y;
Cube[26] = m_pos.m_Z-m_size.m_Z;
//Second triangle...
//Vector 1
Cube[27] = m_pos.m_X-m_size.m_X;
Cube[28] = m_pos.m_Y+m_size.m_Y;
Cube[29] = m_pos.m_Z-m_size.m_Z;
//Vector2
Cube[30] = m_pos.m_X-m_size.m_X;
Cube[31] = m_pos.m_Y-m_size.m_Y;
Cube[32] = m_pos.m_Z-m_size.m_Z;
//Vector3
Cube[33] = m_pos.m_X+m_size.m_X;
Cube[34] = m_pos.m_Y-m_size.m_Y;
Cube[35] = m_pos.m_Z-m_size.m_Z;
//LEFT face...
//First triangle.
//Vector 1
Cube[36] = m_pos.m_X+m_size.m_X;
Cube[37] = m_pos.m_Y-m_size.m_Y;
Cube[38] = m_pos.m_Z-m_size.m_Z;
//Vector2
Cube[39] = m_pos.m_X+m_size.m_X;
Cube[40] = m_pos.m_Y-m_size.m_Y;
Cube[41] = m_pos.m_Z+m_size.m_Z;
//Vector3
Cube[42] = m_pos.m_X+m_size.m_X;
Cube[43] = m_pos.m_Y+m_size.m_Y;
Cube[44] = m_pos.m_Z+m_size.m_Z;
//Second triangle...
//Vector 1
Cube[45] = m_pos.m_X+m_size.m_X;
Cube[46] = m_pos.m_Y+m_size.m_Y;
Cube[47] = m_pos.m_Z-m_size.m_Z;
//Vector2
Cube[48] = m_pos.m_X+m_size.m_X;
Cube[49] = m_pos.m_Y-m_size.m_Y;
Cube[50] = m_pos.m_Z-m_size.m_Z;
//Vector3
Cube[51] = m_pos.m_X+m_size.m_X;
Cube[52] = m_pos.m_Y+m_size.m_Y;
Cube[53] = m_pos.m_Z+m_size.m_Z;
//RIGHT face...
//First triangle.
//Vector 1
Cube[54] = m_pos.m_X-m_size.m_X;
Cube[55] = m_pos.m_Y-m_size.m_Y;
Cube[56] = m_pos.m_Z-m_size.m_Z;
//Vector2
Cube[57] = m_pos.m_X-m_size.m_X;
Cube[58] = m_pos.m_Y+m_size.m_Y;
Cube[59] = m_pos.m_Z-m_size.m_Z;
//Vector3
Cube[60] = m_pos.m_X-m_size.m_X;
Cube[61] = m_pos.m_Y-m_size.m_Y;
Cube[62] = m_pos.m_Z+m_size.m_Z;
//Second triangle...
//Vector 1
Cube[63] = m_pos.m_X-m_size.m_X;
Cube[64] = m_pos.m_Y+m_size.m_Y;
Cube[65] = m_pos.m_Z-m_size.m_Z;
//Vector2
Cube[66] = m_pos.m_X-m_size.m_X;
Cube[67] = m_pos.m_Y+m_size.m_Y;
Cube[68] = m_pos.m_Z+m_size.m_Z;
//Vector3
Cube[69] = m_pos.m_X-m_size.m_X;
Cube[70] = m_pos.m_Y-m_size.m_Y;
Cube[71] = m_pos.m_Z+m_size.m_Z;
//TOP face...
//First triangle.
//Vector 1
Cube[72] = m_pos.m_X+m_size.m_X;
Cube[73] = m_pos.m_Y+m_size.m_Y;
Cube[74] = m_pos.m_Z+m_size.m_Z;
//Vector2
Cube[75] = m_pos.m_X-m_size.m_X;
Cube[76] = m_pos.m_Y+m_size.m_Y;
Cube[77] = m_pos.m_Z+m_size.m_Z;
//Vector3
Cube[78] = m_pos.m_X+m_size.m_X;
Cube[79] = m_pos.m_Y+m_size.m_Y;
Cube[80] = m_pos.m_Z-m_size.m_Z;
//Second triangle...
//Vector 1
Cube[81] = m_pos.m_X-m_size.m_X;
Cube[82] = m_pos.m_Y+m_size.m_Y;
Cube[83] = m_pos.m_Z+m_size.m_Z;
//Vector2
Cube[84] = m_pos.m_X-m_size.m_X;
Cube[85] = m_pos.m_Y+m_size.m_Y;
Cube[86] = m_pos.m_Z-m_size.m_Z;
//Vector3
Cube[87] = m_pos.m_X+m_size.m_X;
Cube[88] = m_pos.m_Y+m_size.m_Y;
Cube[89] = m_pos.m_Z-m_size.m_Z;
//BOTTOM face...
//First triangle.
//Vector 1
Cube[90] = m_pos.m_X-m_size.m_X;
Cube[91] = m_pos.m_Y-m_size.m_Y;
Cube[92] = m_pos.m_Z+m_size.m_Z;
//Vector2
Cube[93] = m_pos.m_X+m_size.m_X;
Cube[94] = m_pos.m_Y-m_size.m_Y;
Cube[95] = m_pos.m_Z+m_size.m_Z;
//Vector3
Cube[96] = m_pos.m_X+m_size.m_X;
Cube[97] = m_pos.m_Y-m_size.m_Y;
Cube[98] = m_pos.m_Z-m_size.m_Z;
//Second triangle...
//Vector 1
Cube[99] = m_pos.m_X-m_size.m_X;
Cube[100] = m_pos.m_Y-m_size.m_Y;
Cube[101] = m_pos.m_Z+m_size.m_Z;
//Vector2
Cube[102] = m_pos.m_X+m_size.m_X;
Cube[103] = m_pos.m_Y-m_size.m_Y;
Cube[104] = m_pos.m_Z-m_size.m_Z;
//Vector3
Cube[105] = m_pos.m_X-m_size.m_X;
Cube[106] = m_pos.m_Y-m_size.m_Y;
Cube[107] = m_pos.m_Z-m_size.m_Z;
normals = GLShortcuts::calculateNormal(Cube, 12);
calculateNormal... I know it's a tiny bit messy, but it's partly because of debugging reasons...
float* GLShortcuts::calculateNormal(float vec[], size_t triangles)
{
float* normals = new float[triangles*3];
size_t normPos = 0;
size_t vexPos = 0;
for(size_t i = 0; i<triangles; i++)
{
VECTOR_3D v1 = VECTOR_3D(vec[vexPos], vec[vexPos+1], vec[vexPos+2]);
VECTOR_3D v2 = VECTOR_3D(vec[vexPos+3], vec[vexPos+4], vec[vexPos+5]);
VECTOR_3D v3 = VECTOR_3D(vec[vexPos+6], vec[vexPos+7], vec[vexPos+8]);
vexPos += 9;
VECTOR_3D crossVec1 = (v2 - v1);
VECTOR_3D crossVec2 = (v3 - v1);
VECTOR_3D normal;
normal.m_X = crossVec2.m_Y*crossVec1.m_Z - crossVec1.m_Y*crossVec2.m_Z;
normal.m_Y = crossVec1.m_X*crossVec2.m_Z - crossVec2.m_X*crossVec1.m_Z;
normal.m_Z = crossVec2.m_X*crossVec1.m_Y - crossVec2.m_Y*crossVec1.m_X;
normal.Normalize();
normals[normPos+0] = normal.m_X;
normals[normPos+1] = normal.m_Y;
normals[normPos+2] = normal.m_Z;
normPos+=3;
}
void CubeGL::draw(void)
{
if(m_texId > 0)
{
glEnable(GL_TEXTURE_2D);
glEnable(GL_BLEND);
}
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_NORMAL_ARRAY);
glVertexPointer(3, GL_FLOAT, 0, Cube);
glTexCoordPointer(2, GL_FLOAT, 0, UV_Coords);
glNormalPointer(GL_FLOAT, 0, normals);
glDrawArrays(GL_TRIANGLES, 0, 36);
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_NORMAL_ARRAY);
if(m_texId > 0)
{
glDisable(GL_TEXTURE_2D);
glDisable(GL_BLEND);
}
}
And thats the draw code. Assuming if I'm being a tard with how I'm calling the normals.