static float terrainComputeLightFactor(int i,int j,int offseti, int offsetj) { float factor,v[3]; if (terrainNormals != NULL) { if (terrainLightPos[3] == 0.0) /* directional light */ factor = terrainNormals[3*(i * terrainGridWidth + j)] * terrainLightPos[0] + terrainNormals[3*(i * terrainGridWidth + j) +1] * terrainLightPos[1] + terrainNormals[3*(i * terrainGridWidth + j) +2] * terrainLightPos[2]; else { /* positional light */ v[0] = terrainLightPos[0] - ((j + offsetj) + transX) * scaleX; v[1] = terrainLightPos[1] - terrainHeights[i*terrainGridWidth + j] + transY; v[2] = terrainLightPos[2] - ((offseti -i) + transZ) * scaleZ; terrainNormalize(v); factor = terrainNormals[3*(i * terrainGridWidth + j)] * v[0] + terrainNormals[3*(i * terrainGridWidth + j) +1] * v[1] + terrainNormals[3*(i * terrainGridWidth + j) +2] * v[2]; } if (factor < 0) factor = 0; } else factor = 1; return(factor); }
void terrainLightPosition(float x, float y, float z,float w) { terrainLightPos[0] = x; terrainLightPos[1] = y; terrainLightPos[2] = z; terrainLightPos[3] = w; /* normalise this vector to save time later */ if (terrainLightPos[3] == 0.0) terrainNormalize(terrainLightPos); }
static float terrainComputeLightFactor(int i,int j,int offseti, int offsetj) { float factor,v[3]; if (terrainLightPos[3] == 0.0) /* directional light */ factor = terrainNormals[3*(i * terrainGridWidth + j)] * terrainLightPos[0] + terrainNormals[3*(i * terrainGridWidth + j) +1] * terrainLightPos[1] + terrainNormals[3*(i * terrainGridWidth + j) +2] * terrainLightPos[2]; else { /* positional light */ v[0] = terrainLightPos[0] - (j + offsetj)*terrainStepWidth; v[1] = terrainLightPos[1] - terrainHeights[i*terrainGridWidth + j]; v[2] = terrainLightPos[2] - (offseti -i) * terrainStepLength; terrainNormalize(v); factor = terrainNormals[3*(i * terrainGridWidth + j)] * v[0] + terrainNormals[3*(i * terrainGridWidth + j) +1] * v[1] + terrainNormals[3*(i * terrainGridWidth + j) +2] * v[2]; } if (factor < 0) factor = 0; return(factor); }
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); } }