예제 #1
0
파일: terrain.cpp 프로젝트: consultit/tg
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);
}
예제 #2
0
파일: terrain.cpp 프로젝트: consultit/tg
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);
}
예제 #3
0
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);
}
예제 #4
0
파일: terrain.cpp 프로젝트: consultit/tg
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);
        }

}