GLvoid SetUpNormals(){ VECTOR v1,v2,v3,v4,v5,v6; VECTOR n,n1,n2,n3,n4,n5,n6; for (int z = 0; z < terrain.size; z++ ) { for (int x = 0; x < terrain.size; x++ ) { if ( z == 0 && x == 0 ) { // back left corner - 1 tri 2 vertices v1 = terrain.CPoint[z+1][x] - terrain.CPoint[z][x]; v2 = terrain.CPoint[z][x+1] - terrain.CPoint[z][x]; n.Cross(v1,v2); } else if ( (z > 0 && z < (terrain.size-1)) && x == 0 ) { // left edge - 3 tri 4 vertices v1 = terrain.CPoint[z][x+1] - terrain.CPoint[z][x]; v2 = terrain.CPoint[z-1][x+1] - terrain.CPoint[z][x]; v3 = terrain.CPoint[z-1][x] - terrain.CPoint[z][x]; v4 = terrain.CPoint[z][x+1] - terrain.CPoint[z][x]; n1.Cross(v1,v2); n2.Cross(v2,v3); n3.Cross(v3,v4); n = (n1+n2+n3)/3.0f; } else if ( z == (terrain.size-1) && x == 0 ) { // front left corner - 2 tri 3 vertices v1 = terrain.CPoint[z][x+1] - terrain.CPoint[z][x]; v2 = terrain.CPoint[z-1][x+1] - terrain.CPoint[z][x]; v3 = terrain.CPoint[z-1][x] - terrain.CPoint[z][x]; n1.Cross(v1,v2); n2.Cross(v2,v3); n = (n1+n2)/2.0f; } else if ( z == (terrain.size-1) && (x > 0 && x < (terrain.size-1)) ) { // front edge - 3 tri 4 vertices v1 = terrain.CPoint[z][x+1] - terrain.CPoint[z][x]; v2 = terrain.CPoint[z-1][x+1] - terrain.CPoint[z][x]; v3 = terrain.CPoint[z-1][x] - terrain.CPoint[z][x]; v4 = terrain.CPoint[z][x-1] - terrain.CPoint[z][x]; n1.Cross(v1,v2); n2.Cross(v2,v3); n3.Cross(v3,v4); n = (n1+n2+n3)/3.0f; } else if ( z == (terrain.size-1) && x == (terrain.size-1) ) { // front right corner - 1 tri 2 vertices v1 = terrain.CPoint[z-1][x] - terrain.CPoint[z][x]; v2 = terrain.CPoint[z][x-1] - terrain.CPoint[z][x]; n1.Cross(v1,v2); n = n1; } else if ( ( z > 0 && z < (terrain.size-1)) && x == (terrain.size-1) ) { // right edge - 3 tri 4 vertices v1 = terrain.CPoint[z-1][x] - terrain.CPoint[z][x]; v2 = terrain.CPoint[z][x-1] - terrain.CPoint[z][x]; v3 = terrain.CPoint[z+1][x-1] - terrain.CPoint[z][x]; v4 = terrain.CPoint[z+1][x] - terrain.CPoint[z][x]; n1.Cross(v1,v2); n2.Cross(v2,v3); n3.Cross(v3,v4); n = (n1+n2+n3)/3.0f; } else if ( z == 0 && x == (terrain.size-1) ) { // back right corner - 2 tri 3 vertices v1 = terrain.CPoint[z][x-1] - terrain.CPoint[z][x]; v2 = terrain.CPoint[z+1][x-1] - terrain.CPoint[z][x-1]; v3 = terrain.CPoint[z+1][x-1] - terrain.CPoint[z][x]; v4 = terrain.CPoint[z+1][x] - terrain.CPoint[z][x]; n1.Cross(v1,v2); n2.Cross(v3,v4); n = (n1+n2)/2.0f; } else if ( z == 0 && ( x > 0 && x < (terrain.size-1)) ) { // back edge - 3 tri 4 vertices v1 = terrain.CPoint[z][x-1] - terrain.CPoint[z][x]; v2 = terrain.CPoint[z+1][x-1] - terrain.CPoint[z][x]; v3 = terrain.CPoint[z+1][x] - terrain.CPoint[z][x]; v4 = terrain.CPoint[z][x+1] - terrain.CPoint[z][x]; n1.Cross(v1,v2); n2.Cross(v2,v3); n3.Cross(v3,v4); n = (n1+n2+n3)/3.0f; } else { // internal - 6 tri 6 vertices v1 = terrain.CPoint[z][x+1] - terrain.CPoint[z][x]; v2 = terrain.CPoint[z-1][x+1] - terrain.CPoint[z][x]; v3 = terrain.CPoint[z-1][x] - terrain.CPoint[z][x]; v4 = terrain.CPoint[z][x-1] - terrain.CPoint[z][x]; v5 = terrain.CPoint[z+1][x-1] - terrain.CPoint[z][x]; v6 = terrain.CPoint[z+1][x] - terrain.CPoint[z][x]; n1.Cross(v1,v2); n2.Cross(v2,v3); n3.Cross(v3,v4); n4.Cross(v4,v5); n5.Cross(v5,v6); n6.Cross(v6,v1); n = (n1+n2+n3+n4+n5+n6)/6.0f; } n.Normalize(); terrain.CNormal[z][x].Set(n.x,n.y,n.z); } }}