Esempio n. 1
0
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);
        }

}