mat4 lookAt(vec4 pos, vec4 dir) {
	vec4 f = dir;
	normalizevec4(&f);
	vec4 u = {{0, 1, 0, 0}};
	vec4 s = crossvec4(f, u);
	normalizevec4(&s);
	u = crossvec4(s, f);

	mat4 out = IDENTITY_MATRIX;
	out.m[0] = s.x;
	out.m[4] = s.y;
	out.m[8] = s.z;

	out.m[1] = u.x;
	out.m[5] = u.y;
	out.m[9] = u.z;

	out.m[2] = -f.x;
	out.m[6] = -f.y;
	out.m[10] = -f.z;

	out.m[12] = -dotvec4(s, pos);
	out.m[13] = -dotvec4(u, pos);
	out.m[14] =  dotvec4(f, pos);
	return out;
}
예제 #2
0
파일: bounceGL.c 프로젝트: shua/jams
void rotateCamera(float yaw, float pitch) {
	cameraPitch += pitch;
	cameraYaw += yaw;
	const float hpi = 1.5707963;
	if(cameraPitch > hpi) cameraPitch = hpi;
	if(cameraPitch < -hpi) cameraPitch = -hpi;
	float cosp = cos(cameraPitch);
	cameraFoc.x = cosp * sin(cameraYaw);
	cameraFoc.y = sin(cameraPitch);
	cameraFoc.z = -cosp * cos(cameraYaw);
	cameraSid = crossvec4(cameraFoc, Y_AXIS);
	normalizevec4(&cameraSid);
	cameraDamage = 1;
}
struct _TTerrain* tterrain_init(GLfloat* vertex_buffer_data, GLfloat* uv_buffer_data, GLuint* tex){
    int i;
    struct _TTerrain *tterrain;
    tterrain = malloc(sizeof(struct _TTerrain));
    tterrain->vertex_buffer_data = vertex_buffer_data;
    tterrain->uv_buffer_data = malloc(2*(SQUARE_SIZE-1)*(SQUARE_SIZE-1)*6*sizeof(GLfloat));
    tterrain->normal_buffer_data = malloc(2*(SQUARE_SIZE)*(SQUARE_SIZE-1)*9*sizeof(GLfloat));
    //uv data
    for (i = 0; i < (2*(SQUARE_SIZE-1)*(SQUARE_SIZE-1)); i++) {
        tterrain->uv_buffer_data[i*6] = uv_buffer_data[0];
        tterrain->uv_buffer_data[i*6 + 1] = uv_buffer_data[1];
        tterrain->uv_buffer_data[i*6 + 2] = uv_buffer_data[2];
        tterrain->uv_buffer_data[i*6 + 3] = uv_buffer_data[3];
        tterrain->uv_buffer_data[i*6 + 4] = uv_buffer_data[4];
        tterrain->uv_buffer_data[i*6 + 5] = uv_buffer_data[5];
    }
    printf(" filled terraing UV data\n");
    //normals
    vec4 v1, v2, v3, edge1, edge2, normal;
    float normals[3*2*(SQUARE_SIZE-1)*(SQUARE_SIZE-1)];
    for (i = 0; i < (2*(SQUARE_SIZE-1)*(SQUARE_SIZE-1)); i++) {
        v1.x = vertex_buffer_data[i*9+0];
        v1.y = vertex_buffer_data[i*9+1];;
        v1.z = vertex_buffer_data[i*9+2];;
        v1.w = 0;

        v2.x = vertex_buffer_data[i*9+3];
        v2.y = vertex_buffer_data[i*9+4];;
        v2.z = vertex_buffer_data[i*9+5];;
        v2.w = 0;

        v3.x = vertex_buffer_data[i*9+6];
        v3.y = vertex_buffer_data[i*9+7];;
        v3.z = vertex_buffer_data[i*9+8];;
        v3.w = 0;

        edge1 = substractvec4(v2, v1);
        edge2 = substractvec4(v3, v1);
        normal = crossvec4(edge1, edge2);
        normalizevec4(&normal);
        normals[3*i+0] = normal.m[0];
        normals[3*i+1] = normal.m[1];
        normals[3*i+2] = normal.m[2];
    }
    int tr_index, tr_index2;
    float vertex_normals[3*SQUARE_SIZE*SQUARE_SIZE];
    for (i = 0; i < (SQUARE_SIZE)*(SQUARE_SIZE); i++) {
        tr_index = 2*(i-SQUARE_SIZE) - 2*(i/SQUARE_SIZE) + 1;
        tr_index2 = 2*i - 2*(i/SQUARE_SIZE) - 2;
        normals[3*tr_index+0] + normals[3*tr_index+3] + normals[3*tr_index+6];
        normals[3*tr_index+1] + normals[3*tr_index+4] + normals[3*tr_index+7];
        normals[3*tr_index+2] + normals[3*tr_index+5] + normals[3*tr_index+8];
        normals[3*tr_index2+0] + normals[3*tr_index2+3] + normals[3*tr_index2+6];
        normals[3*tr_index2+1] + normals[3*tr_index2+4] + normals[3*tr_index2+7];
        normals[3*tr_index2+2] + normals[3*tr_index2+5] + normals[3*tr_index2+8];

        vertex_normals[3*i + 0] = 0;
        vertex_normals[3*i + 1] = 0;
        vertex_normals[3*i + 2] = 0;

        if ((i>SQUARE_SIZE)&&((i%SQUARE_SIZE) != 0)) {
            vertex_normals[3*i + 0] += normals[3*tr_index+0];
            vertex_normals[3*i + 1] += normals[3*tr_index+1];
            vertex_normals[3*i + 2] += normals[3*tr_index+2];
        }
        if ((i>SQUARE_SIZE)&&(((i+1)%SQUARE_SIZE)!=0)){
            vertex_normals[3*i + 0] += normals[3*tr_index+3] + normals[3*tr_index+6];
            vertex_normals[3*i + 1] += normals[3*tr_index+4] + normals[3*tr_index+7];
            vertex_normals[3*i + 2] += normals[3*tr_index+5] + normals[3*tr_index+8];
        }
        if ((i > (SQUARE_SIZE*SQUARE_SIZE - SQUARE_SIZE))&&(((i+1)%SQUARE_SIZE)!=0)){
            vertex_normals[3*i + 0] += normals[3*tr_index2+6];
            vertex_normals[3*i + 1] += normals[3*tr_index2+7];
            vertex_normals[3*i + 2] += normals[3*tr_index2+8];
        }
        if (((i%SQUARE_SIZE) != 0)&&(i > (SQUARE_SIZE*SQUARE_SIZE - SQUARE_SIZE))){
           vertex_normals[3*i + 0] += normals[3*tr_index2+0] + normals[3*tr_index2+3];
           vertex_normals[3*i + 1] += normals[3*tr_index2+1] + normals[3*tr_index2+4];
           vertex_normals[3*i + 2] += normals[3*tr_index2+2] + normals[3*tr_index2+5];
        }
    }

    int x, y, bigN, k00, k01, k10, k11;
    for (i = 0; i < 2*((SQUARE_SIZE-1)*(SQUARE_SIZE-1));i++) {

        bigN = (i/2);
        x = bigN % (SQUARE_SIZE-1);
        y = bigN /(SQUARE_SIZE-1);
        k00 = 3*(x + (SQUARE_SIZE-1)*y);
        k01 = 3*(x + (SQUARE_SIZE-1)*(y+1));
        k10 = 3*(x + 1 + (SQUARE_SIZE-1)*y);
        k11 = 3*(x + 1 + (SQUARE_SIZE-1)*(y+1));
        if ((i%2) == 0) {
            tterrain->normal_buffer_data[i*9+0] = -vertex_normals[k01+0];
            tterrain->normal_buffer_data[i*9+1] = -vertex_normals[k01+1];
            tterrain->normal_buffer_data[i*9+2] = -vertex_normals[k01+2];
            tterrain->normal_buffer_data[i*9+3] = -vertex_normals[k00+0];
            tterrain->normal_buffer_data[i*9+4] = -vertex_normals[k00+1];
            tterrain->normal_buffer_data[i*9+5] = -vertex_normals[k00+2];
            tterrain->normal_buffer_data[i*9+6] = -vertex_normals[k10+0];
            tterrain->normal_buffer_data[i*9+7] = -vertex_normals[k10+1];
            tterrain->normal_buffer_data[i*9+8] = -vertex_normals[k10+2];
        } else {
            tterrain->normal_buffer_data[i*9+0] = -vertex_normals[k01+0];
            tterrain->normal_buffer_data[i*9+1] = -vertex_normals[k01+1];
            tterrain->normal_buffer_data[i*9+2] = -vertex_normals[k01+2];
            tterrain->normal_buffer_data[i*9+3] = -vertex_normals[k11+0];
            tterrain->normal_buffer_data[i*9+4] = -vertex_normals[k11+1];
            tterrain->normal_buffer_data[i*9+5] = -vertex_normals[k11+2];
            tterrain->normal_buffer_data[i*9+6] = -vertex_normals[k10+0];
            tterrain->normal_buffer_data[i*9+7] = -vertex_normals[k10+1];
            tterrain->normal_buffer_data[i*9+8] = -vertex_normals[k10+2];
        }
    }
    printf("tterrain->normal_buffer_data    %f \n", tterrain->normal_buffer_data[2*((SQUARE_SIZE-1)*(SQUARE_SIZE-1)-1)*9+6]        );
    printf("tterrain->normal_buffer_data    %f \n", tterrain->normal_buffer_data[2*((SQUARE_SIZE-1)*(SQUARE_SIZE-1)-1)*9+7]        );
    printf("tterrain->normal_buffer_data    %f \n", tterrain->normal_buffer_data[2*((SQUARE_SIZE-1)*(SQUARE_SIZE-1)-1)*9+8]        );



    printf(" filled terrain normals data\n");
    //texture
    tterrain->texture = tex;
    //buffers
    glGenBuffers(1, &(tterrain->vertexbuffer));
    glBindBuffer(GL_ARRAY_BUFFER, tterrain->vertexbuffer);
    glBufferData(GL_ARRAY_BUFFER, 2*(SQUARE_SIZE-1)*(SQUARE_SIZE-1)*9*sizeof(GLfloat), tterrain->vertex_buffer_data, GL_STATIC_DRAW);

	glGenBuffers(1, &(tterrain->uvbuffer));
	glBindBuffer(GL_ARRAY_BUFFER, tterrain->uvbuffer);
	glBufferData(GL_ARRAY_BUFFER, 2*(SQUARE_SIZE-1)*(SQUARE_SIZE-1)*6*sizeof(GLfloat), tterrain->uv_buffer_data, GL_STATIC_DRAW);

	glGenBuffers(1, &(tterrain->normalbuffer));
	glBindBuffer(GL_ARRAY_BUFFER, tterrain->normalbuffer);
	glBufferData(GL_ARRAY_BUFFER, 2*(SQUARE_SIZE-1)*(SQUARE_SIZE-1)*9*sizeof(GLfloat), tterrain->normal_buffer_data, GL_STATIC_DRAW);

	return tterrain;
};