void terrainComputeNormals() { float *norm1,*norm2,*norm3,*norm4; int i,j,k; if (terrainNormals == NULL) return; for(i = 0; i < terrainGridLength; i++) for(j = 0; j < terrainGridWidth; j++) { norm1 = NULL; norm2 = NULL; norm3 = NULL; norm4 = NULL; /* normals for the four corners */ if (i == 0 && j == 0) { norm1 = terrainCrossProduct(0,0, 0,1, 1,0); terrainNormalize(norm1); } else if (j == terrainGridWidth-1 && i == terrainGridLength-1) { norm1 = terrainCrossProduct(j,i, j,i-1, j-1,i); terrainNormalize(norm1); } else if (j == 0 && i == terrainGridLength-1) { norm1 = terrainCrossProduct(j,i, j+1,i, j,i-1); terrainNormalize(norm1); } else if (j == terrainGridWidth-1 && i == 0) { norm1 = terrainCrossProduct(j,i, j-1,i, j,i+1); terrainNormalize(norm1); } /* normals for the borders */ else if (i == 0) { norm1 = terrainCrossProduct(j,0, j-1,0, j,1); terrainNormalize(norm1); norm2 = terrainCrossProduct(j,0,j,1,j+1,0); terrainNormalize(norm2); terrainAddVector(norm1,norm2); free(norm2); } else if (j == 0) { norm1 = terrainCrossProduct(0,i, 1,i, 0,i-1); terrainNormalize(norm1); norm2 = terrainCrossProduct(0,i, 0,i+1, 1,i); terrainNormalize(norm2); terrainAddVector(norm1,norm2); free(norm2); } else if (i == terrainGridLength-1) { norm1 = terrainCrossProduct(j,i, j+1,i, j,i-1); terrainNormalize(norm1); norm2 = terrainCrossProduct(j,i, j,i-1, j-1,i); terrainNormalize(norm2); terrainAddVector(norm1,norm2); free(norm2); } else if (j == terrainGridWidth-1) { norm1 = terrainCrossProduct(j,i, j,i-1, j-1,i); terrainNormalize(norm1); norm2 = terrainCrossProduct(j,i, j-1,i, j,i+1); terrainNormalize(norm2); terrainAddVector(norm1,norm2); free(norm2); } /* normals for the inner vertices using 8 neighbours */ else { norm1 = terrainCrossProduct(j,i, j-1,i, j-1,i+1); terrainNormalize(norm1); norm2 = terrainCrossProduct(j,i, j-1,i+1, j,i+1); terrainNormalize(norm2); terrainAddVector(norm1,norm2); free(norm2); norm2 = terrainCrossProduct(j,i, j,i+1, j+1,i+1); terrainNormalize(norm2); terrainAddVector(norm1,norm2); free(norm2); norm2 = terrainCrossProduct(j,i, j+1,i+1, j+1,i); terrainNormalize(norm2); terrainAddVector(norm1,norm2); free(norm2); norm2 = terrainCrossProduct(j,i, j+1,i, j+1,i-1); terrainNormalize(norm2); terrainAddVector(norm1,norm2); free(norm2); norm2 = terrainCrossProduct(j,i, j+1,i-1, j,i-1); terrainNormalize(norm2); terrainAddVector(norm1,norm2); free(norm2); norm2 = terrainCrossProduct(j,i, j,i-1, j-1,i-1); terrainNormalize(norm2); terrainAddVector(norm1,norm2); free(norm2); norm2 = terrainCrossProduct(j,i, j-1,i-1, j-1,i); terrainNormalize(norm2); terrainAddVector(norm1,norm2); free(norm2); } terrainNormalize(norm1); norm1[2] = - norm1[2]; for (k = 0; k< 3; k++) terrainNormals[3*(i*terrainGridWidth + j) + k] = norm1[k]; free(norm1); } }
void terrainComputeNormals() { float *norm1,*norm2,*norm3,*norm4; int i,j,k; if (terrainNormals == NULL) return; for(i = 0; i < length; i++) for(j = 0; j < width; j++) { norm1 = NULL; norm2 = NULL; norm3 = NULL; norm4 = NULL; // normals for the four corners if (i == 0 && j == 0) { norm1 = terrainCrossProduct(0,0, 0,1, 1,0); terrainNormalize(norm1); } else if (j == width-1 && i == length-1) { norm1 = terrainCrossProduct(i,j, j,i-1, j-1,i); terrainNormalize(norm1); } else if (j == 0 && i == length-1) { norm1 = terrainCrossProduct(i,j, j,i-1, j+1,i); terrainNormalize(norm1); } else if (j == width-1 && i == 0) { norm1 = terrainCrossProduct(i,j, j,i+1, j-1,i); terrainNormalize(norm1); } // normals for the borders else if (i == 0) { norm1 = terrainCrossProduct(j,0, j-1,0, j,1); terrainNormalize(norm1); norm2 = terrainCrossProduct(j,0,j,1,j+1,0); terrainNormalize(norm2); } else if (j == 0) { norm1 = terrainCrossProduct(0,i, 1,i, 0,i-1); terrainNormalize(norm1); norm2 = terrainCrossProduct(0,i, 0,i+1, 1,i); terrainNormalize(norm2); } else if (i == length-1) { norm1 = terrainCrossProduct(j,i, j,i-1, j+1,i); terrainNormalize(norm1); norm2 = terrainCrossProduct(j,i, j+1,i, j,i-1); terrainNormalize(norm2); } else if (j == width-1) { norm1 = terrainCrossProduct(j,i, j,i-1, j-1,i); terrainNormalize(norm1); norm2 = terrainCrossProduct(j,i, j-1,i, j,i+1); terrainNormalize(norm2); } // normals for the interior else { norm1 = terrainCrossProduct(j,i, j-1,i, j,i+1); terrainNormalize(norm1); norm2 = terrainCrossProduct(j,i, j,i+1, j+1,i); terrainNormalize(norm2); norm3 = terrainCrossProduct(j,i, j+1,i, j,i-1); terrainNormalize(norm3); norm4 = terrainCrossProduct(j,i, j,i-1, j-1,i); terrainNormalize(norm4); } if (norm2 != NULL) { terrainAddVector(norm1,norm2); free(norm2); } if (norm3 != NULL) { terrainAddVector(norm1,norm3); free(norm3); } if (norm4 != NULL) { terrainAddVector(norm1,norm4); free(norm4); } terrainNormalize(norm1); norm1[2] = - norm1[2]; for (k = 0; k< 3; k++) { terrainNormals[3*(i*width + j) + k] = norm1[k]; if((3*(i*width + j) + k) >= width *length*3) { std::cout<<"\nfunc:terrainComputeNormals() This can cause a heap corruption !!!"; std::cout<<"\nvalue is: "<<3*(i*width + j) + k; } } free(norm1); } }