void GFX_push_matrix( void )
{
	switch( gfx.matrix_mode )
	{
		case MODELVIEW_MATRIX:
		{
			mat4_copy_mat4( &gfx.modelview_matrix[ gfx.modelview_matrix_index + 1 ],
							&gfx.modelview_matrix[ gfx.modelview_matrix_index	  ] );
		
			++gfx.modelview_matrix_index;
			
			break;
		}

		case PROJECTION_MATRIX:
		{
			mat4_copy_mat4( &gfx.projection_matrix[ gfx.projection_matrix_index + 1 ],
							&gfx.projection_matrix[ gfx.projection_matrix_index	    ] );
			
			++gfx.projection_matrix_index;
			
			break;
		}
		
		case TEXTURE_MATRIX:
		{
			mat4_copy_mat4( &gfx.texture_matrix[ gfx.texture_matrix_index + 1 ],
							&gfx.texture_matrix[ gfx.texture_matrix_index     ] );
			
			++gfx.texture_matrix_index;
			
			break;
		}		
	}
}
void GFX_load_matrix( mat4 *m )
{
	switch( gfx.matrix_mode )
	{
		case MODELVIEW_MATRIX:
		{
			mat4_copy_mat4( GFX_get_modelview_matrix(), m );
			
			break;
		}
	
		case PROJECTION_MATRIX:
		{
			mat4_copy_mat4( GFX_get_projection_matrix(), m );
			
			break;
		}
		
		case TEXTURE_MATRIX:
		{
			mat4_copy_mat4( GFX_get_texture_matrix(), m );
			
			break;
		}		
	}
}
Exemplo n.º 3
0
void draw_scene( void )
{
	glClearColor( 0.0f, 0.0f, 0.0f, 1.0f );
	glClear( GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT );

	GFX_set_matrix_mode( PROJECTION_MATRIX );
	GFX_load_identity();
	
	GFX_set_perspective( 45.0f,
						 ( float )viewport_matrix[ 2 ] / ( float )viewport_matrix[ 3 ],
						 0.1f,
						 100.0f,
						 -90.0f );
	
	
	GFX_set_matrix_mode( MODELVIEW_MATRIX );
	GFX_load_identity();

	GFX_translate( 14.0f, -12.0f, 7.0f );

	GFX_rotate( 48.5f, 0.0f, 0.0f, 1.0f );

	GFX_rotate( 72.0, 1.0f, 0.0f, 0.0f );
	
	mat4_invert( GFX_get_modelview_matrix() );
	
	
	glActiveTexture( GL_TEXTURE0 );
	glBindTexture( GL_TEXTURE_2D, texture->tid );


	mat4 projector_matrix_copy;
	
	mat4_copy_mat4( &projector_matrix_copy, &projector_matrix );
	
	
	unsigned int i = 0;

	while( i != obj->n_objmesh ) {

		objmesh = &obj->objmesh[ i ];

		GFX_push_matrix();

		GFX_translate( objmesh->location.x,
					   objmesh->location.y,
					   objmesh->location.z );

		mat4_copy_mat4( &projector_matrix, &projector_matrix_copy );
		
		mat4_translate( &projector_matrix, &projector_matrix, &objmesh->location );


		OBJ_draw_mesh( obj, i );

		GFX_pop_matrix();
		
		++i;
	}
}
void mat4_multiply_mat4( mat4 *dst, mat4 *m0, mat4 *m1 )
{
	mat4 mat;

	mat.m[ 0 ].x = m0->m[ 0 ].x * m1->m[ 0 ].x + m0->m[ 1 ].x * m1->m[ 0 ].y + m0->m[ 2 ].x * m1->m[ 0 ].z + m0->m[ 3 ].x * m1->m[ 0 ].w;
	mat.m[ 0 ].y = m0->m[ 0 ].y * m1->m[ 0 ].x + m0->m[ 1 ].y * m1->m[ 0 ].y + m0->m[ 2 ].y * m1->m[ 0 ].z + m0->m[ 3 ].y * m1->m[ 0 ].w;
	mat.m[ 0 ].z = m0->m[ 0 ].z * m1->m[ 0 ].x + m0->m[ 1 ].z * m1->m[ 0 ].y + m0->m[ 2 ].z * m1->m[ 0 ].z + m0->m[ 3 ].z * m1->m[ 0 ].w;
	mat.m[ 0 ].w = m0->m[ 0 ].w * m1->m[ 0 ].x + m0->m[ 1 ].w * m1->m[ 0 ].y + m0->m[ 2 ].w * m1->m[ 0 ].z + m0->m[ 3 ].w * m1->m[ 0 ].w;

	mat.m[ 1 ].x = m0->m[ 0 ].x * m1->m[ 1 ].x + m0->m[ 1 ].x * m1->m[ 1 ].y + m0->m[ 2 ].x * m1->m[ 1 ].z + m0->m[ 3 ].x * m1->m[ 1 ].w;
	mat.m[ 1 ].y = m0->m[ 0 ].y * m1->m[ 1 ].x + m0->m[ 1 ].y * m1->m[ 1 ].y + m0->m[ 2 ].y * m1->m[ 1 ].z + m0->m[ 3 ].y * m1->m[ 1 ].w;
	mat.m[ 1 ].z = m0->m[ 0 ].z * m1->m[ 1 ].x + m0->m[ 1 ].z * m1->m[ 1 ].y + m0->m[ 2 ].z * m1->m[ 1 ].z + m0->m[ 3 ].z * m1->m[ 1 ].w;
	mat.m[ 1 ].w = m0->m[ 0 ].w * m1->m[ 1 ].x + m0->m[ 1 ].w * m1->m[ 1 ].y + m0->m[ 2 ].w * m1->m[ 1 ].z + m0->m[ 3 ].w * m1->m[ 1 ].w;

	mat.m[ 2 ].x = m0->m[ 0 ].x * m1->m[ 2 ].x + m0->m[ 1 ].x * m1->m[ 2 ].y + m0->m[ 2 ].x * m1->m[ 2 ].z + m0->m[ 3 ].x * m1->m[ 2 ].w;
	mat.m[ 2 ].y = m0->m[ 0 ].y * m1->m[ 2 ].x + m0->m[ 1 ].y * m1->m[ 2 ].y + m0->m[ 2 ].y * m1->m[ 2 ].z + m0->m[ 3 ].y * m1->m[ 2 ].w;
	mat.m[ 2 ].z = m0->m[ 0 ].z * m1->m[ 2 ].x + m0->m[ 1 ].z * m1->m[ 2 ].y + m0->m[ 2 ].z * m1->m[ 2 ].z + m0->m[ 3 ].z * m1->m[ 2 ].w;
	mat.m[ 2 ].w = m0->m[ 0 ].w * m1->m[ 2 ].x + m0->m[ 1 ].w * m1->m[ 2 ].y + m0->m[ 2 ].w * m1->m[ 2 ].z + m0->m[ 3 ].w * m1->m[ 2 ].w;

	mat.m[ 3 ].x = m0->m[ 0 ].x * m1->m[ 3 ].x + m0->m[ 1 ].x * m1->m[ 3 ].y + m0->m[ 2 ].x * m1->m[ 3 ].z + m0->m[ 3 ].x * m1->m[ 3 ].w;
	mat.m[ 3 ].y = m0->m[ 0 ].y * m1->m[ 3 ].x + m0->m[ 1 ].y * m1->m[ 3 ].y + m0->m[ 2 ].y * m1->m[ 3 ].z + m0->m[ 3 ].y * m1->m[ 3 ].w;
	mat.m[ 3 ].z = m0->m[ 0 ].z * m1->m[ 3 ].x + m0->m[ 1 ].z * m1->m[ 3 ].y + m0->m[ 2 ].z * m1->m[ 3 ].z + m0->m[ 3 ].z * m1->m[ 3 ].w;
	mat.m[ 3 ].w = m0->m[ 0 ].w * m1->m[ 3 ].x + m0->m[ 1 ].w * m1->m[ 3 ].y + m0->m[ 2 ].w * m1->m[ 3 ].z + m0->m[ 3 ].w * m1->m[ 3 ].w;

	mat4_copy_mat4( dst, &mat );
}
mat3 *GFX_get_normal_matrix( void )
{
	mat4 mat;
	
	mat4_copy_mat4( &mat, GFX_get_modelview_matrix() );

	mat4_invert_full( &mat );

	mat4_transpose( &mat );
	
	mat3_copy_mat4( &gfx.normal_matrix, &mat );

	return &gfx.normal_matrix;
}
void draw_scene(void)
{
    glBindFramebuffer(GL_FRAMEBUFFER, main_buffer);
    glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
    glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
    glViewport(0, 0, viewport_matrix[2], viewport_matrix[3]);
    GFX_set_matrix_mode(PROJECTION_MATRIX);
    GFX_load_identity();
    GFX_set_perspective(45.0f, (float)viewport_matrix[2] / (float)viewport_matrix[3], 0.1f, 100.0f, -90.0f);
    GFX_set_matrix_mode(MODELVIEW_MATRIX);
    GFX_load_identity();
    GFX_translate(14.0f, -12.0f, 7.0f);
    GFX_rotate(48.5f, 0.0f, 0.0f, 1.0f);
    GFX_rotate(72.0, 1.0f, 0.0f, 0.0f);
    mat4_invert(GFX_get_modelview_matrix());
    mat4 projector_matrix_copy;
    mat4_copy_mat4(&projector_matrix_copy, &projector_matrix);
    unsigned int i = 0;
    PROGRAM *program = OBJ_get_program(obj, "lighting", 0);
    while (i != obj->n_objmaterial) {
	obj->objmaterial[i].program = program;
	++i;
    }
    glActiveTexture(GL_TEXTURE0);
    glBindTexture(GL_TEXTURE_2D, depth_texture);
    i = 0;
    while (i != obj->n_objmesh) {
	objmesh = &obj->objmesh[i];
	GFX_push_matrix();
	GFX_translate(objmesh->location.x, objmesh->location.y, objmesh->location.z);
	mat4_copy_mat4(&projector_matrix, &projector_matrix_copy);
	mat4_translate(&projector_matrix, &projector_matrix, &objmesh->location);
	OBJ_draw_mesh(obj, i);
	GFX_pop_matrix();
	++i;
    }
}
unsigned char mat4_invert( mat4 *m )
{
	mat4 mat;
	
	float d = ( m->m[ 0 ].x * m->m[ 0 ].x + 
			    m->m[ 1 ].x * m->m[ 1 ].x + 
			    m->m[ 2 ].x * m->m[ 2 ].x );

	if( !d ) return 0;
	
	d = 1.0f / d;

	mat.m[ 0 ].x = d * m->m[ 0 ].x;
	mat.m[ 0 ].y = d * m->m[ 1 ].x;
	mat.m[ 0 ].z = d * m->m[ 2 ].x;

	mat.m[ 1 ].x = d * m->m[ 0 ].y;
	mat.m[ 1 ].y = d * m->m[ 1 ].y;
	mat.m[ 1 ].z = d * m->m[ 2 ].y;

	mat.m[ 2 ].x = d * m->m[ 0 ].z;	
	mat.m[ 2 ].y = d * m->m[ 1 ].z;
	mat.m[ 2 ].z = d * m->m[ 2 ].z;

	mat.m[ 3 ].x = -( mat.m[ 0 ].x * m->m[ 3 ].x + mat.m[ 1 ].x * m->m[ 3 ].y + mat.m[ 2 ].x * m->m[ 3 ].z );
	mat.m[ 3 ].y = -( mat.m[ 0 ].y * m->m[ 3 ].x + mat.m[ 1 ].y * m->m[ 3 ].y + mat.m[ 2 ].y * m->m[ 3 ].z );
	mat.m[ 3 ].z = -( mat.m[ 0 ].z * m->m[ 3 ].x + mat.m[ 1 ].z * m->m[ 3 ].y + mat.m[ 2 ].z * m->m[ 3 ].z );

	mat.m[ 0 ].w = 
	mat.m[ 1 ].w = 
	mat.m[ 2 ].w = 0.0f;
	mat.m[ 3 ].w = 1.0f;

	mat4_copy_mat4( m, &mat );
	
	return 1;
}
unsigned char mat4_invert_full( mat4 *m )
{
	mat4 inv;

	float d;

	inv.m[ 0 ].x = m->m[ 1 ].y * m->m[ 2 ].z * m->m[ 3 ].w - 
				   m->m[ 1 ].y * m->m[ 2 ].w * m->m[ 3 ].z - 
				   m->m[ 2 ].y * m->m[ 1 ].z * m->m[ 3 ].w +
				   m->m[ 2 ].y * m->m[ 1 ].w * m->m[ 3 ].z + 
				   m->m[ 3 ].y * m->m[ 1 ].z * m->m[ 2 ].w - 
				   m->m[ 3 ].y * m->m[ 1 ].w * m->m[ 2 ].z;
		 
	inv.m[ 1 ].x = -m->m[ 1 ].x * m->m[ 2 ].z * m->m[ 3 ].w +
					m->m[ 1 ].x * m->m[ 2 ].w * m->m[ 3 ].z +
					m->m[ 2 ].x * m->m[ 1 ].z * m->m[ 3 ].w -
					m->m[ 2 ].x * m->m[ 1 ].w * m->m[ 3 ].z -
					m->m[ 3 ].x * m->m[ 1 ].z * m->m[ 2 ].w +
					m->m[ 3 ].x * m->m[ 1 ].w * m->m[ 2 ].z;
		 
	inv.m[ 2 ].x = m->m[ 1 ].x * m->m[ 2 ].y * m->m[ 3 ].w -
				   m->m[ 1 ].x * m->m[ 2 ].w * m->m[ 3 ].y -
				   m->m[ 2 ].x * m->m[ 1 ].y * m->m[ 3 ].w +
				   m->m[ 2 ].x * m->m[ 1 ].w * m->m[ 3 ].y +
				   m->m[ 3 ].x * m->m[ 1 ].y * m->m[ 2 ].w -
				   m->m[ 3 ].x * m->m[ 1 ].w * m->m[ 2 ].y;
		 
	inv.m[ 3 ].x = -m->m[ 1 ].x * m->m[ 2 ].y * m->m[ 3 ].z +
					m->m[ 1 ].x * m->m[ 2 ].z * m->m[ 3 ].y +
					m->m[ 2 ].x * m->m[ 1 ].y * m->m[ 3 ].z -
					m->m[ 2 ].x * m->m[ 1 ].z * m->m[ 3 ].y -
					m->m[ 3 ].x * m->m[ 1 ].y * m->m[ 2 ].z +
					m->m[ 3 ].x * m->m[ 1 ].z * m->m[ 2 ].y;
		 
	inv.m[ 0 ].y = -m->m[ 0 ].y * m->m[ 2 ].z * m->m[ 3 ].w +
					m->m[ 0 ].y * m->m[ 2 ].w * m->m[ 3 ].z +
					m->m[ 2 ].y * m->m[ 0 ].z * m->m[ 3 ].w -
					m->m[ 2 ].y * m->m[ 0 ].w * m->m[ 3 ].z -
					m->m[ 3 ].y * m->m[ 0 ].z * m->m[ 2 ].w +
					m->m[ 3 ].y * m->m[ 0 ].w * m->m[ 2 ].z;
		 
	inv.m[ 1 ].y = m->m[ 0 ].x * m->m[ 2 ].z * m->m[ 3 ].w -
				   m->m[ 0 ].x * m->m[ 2 ].w * m->m[ 3 ].z -
				   m->m[ 2 ].x * m->m[ 0 ].z * m->m[ 3 ].w +
				   m->m[ 2 ].x * m->m[ 0 ].w * m->m[ 3 ].z +
				   m->m[ 3 ].x * m->m[ 0 ].z * m->m[ 2 ].w -
				   m->m[ 3 ].x * m->m[ 0 ].w * m->m[ 2 ].z;
		 
	inv.m[ 2 ].y = -m->m[ 0 ].x * m->m[ 2 ].y * m->m[ 3 ].w +
					m->m[ 0 ].x * m->m[ 2 ].w * m->m[ 3 ].y +
					m->m[ 2 ].x * m->m[ 0 ].y * m->m[ 3 ].w -
					m->m[ 2 ].x * m->m[ 0 ].w * m->m[ 3 ].y -
					m->m[ 3 ].x * m->m[ 0 ].y * m->m[ 2 ].w +
					m->m[ 3 ].x * m->m[ 0 ].w * m->m[ 2 ].y;
		 
	inv.m[ 3 ].y = m->m[ 0 ].x * m->m[ 2 ].y * m->m[ 3 ].z - 
				   m->m[ 0 ].x * m->m[ 2 ].z * m->m[ 3 ].y -
				   m->m[ 2 ].x * m->m[ 0 ].y * m->m[ 3 ].z +
				   m->m[ 2 ].x * m->m[ 0 ].z * m->m[ 3 ].y +
				   m->m[ 3 ].x * m->m[ 0 ].y * m->m[ 2 ].z -
				   m->m[ 3 ].x * m->m[ 0 ].z * m->m[ 2 ].y;
		 
	inv.m[ 0 ].z = m->m[ 0 ].y * m->m[ 1 ].z * m->m[ 3 ].w -
				   m->m[ 0 ].y * m->m[ 1 ].w * m->m[ 3 ].z -
				   m->m[ 1 ].y * m->m[ 0 ].z * m->m[ 3 ].w +
				   m->m[ 1 ].y * m->m[ 0 ].w * m->m[ 3 ].z +
				   m->m[ 3 ].y * m->m[ 0 ].z * m->m[ 1 ].w -
				   m->m[ 3 ].y * m->m[ 0 ].w * m->m[ 1 ].z;
		 
	inv.m[ 1 ].z = -m->m[ 0 ].x * m->m[ 1 ].z * m->m[ 3 ].w +
					m->m[ 0 ].x * m->m[ 1 ].w * m->m[ 3 ].z +
					m->m[ 1 ].x * m->m[ 0 ].z * m->m[ 3 ].w -
					m->m[ 1 ].x * m->m[ 0 ].w * m->m[ 3 ].z -
					m->m[ 3 ].x * m->m[ 0 ].z * m->m[ 1 ].w +
					m->m[ 3 ].x * m->m[ 0 ].w * m->m[ 1 ].z;
		 
	inv.m[ 2 ].z = m->m[ 0 ].x * m->m[ 1 ].y * m->m[ 3 ].w -
				   m->m[ 0 ].x * m->m[ 1 ].w * m->m[ 3 ].y -
				   m->m[ 1 ].x * m->m[ 0 ].y * m->m[ 3 ].w +
				   m->m[ 1 ].x * m->m[ 0 ].w * m->m[ 3 ].y +
				   m->m[ 3 ].x * m->m[ 0 ].y * m->m[ 1 ].w -
				   m->m[ 3 ].x * m->m[ 0 ].w * m->m[ 1 ].y;
		 
	inv.m[ 3 ].z = -m->m[ 0 ].x * m->m[ 1 ].y * m->m[ 3 ].z +
					m->m[ 0 ].x * m->m[ 1 ].z * m->m[ 3 ].y +
					m->m[ 1 ].x * m->m[ 0 ].y * m->m[ 3 ].z -
					m->m[ 1 ].x * m->m[ 0 ].z * m->m[ 3 ].y -
					m->m[ 3 ].x * m->m[ 0 ].y * m->m[ 1 ].z +
					m->m[ 3 ].x * m->m[ 0 ].z * m->m[ 1 ].y;
		 
	inv.m[ 0 ].w = -m->m[ 0 ].y * m->m[ 1 ].z * m->m[ 2 ].w +
					m->m[ 0 ].y * m->m[ 1 ].w * m->m[ 2 ].z +
					m->m[ 1 ].y * m->m[ 0 ].z * m->m[ 2 ].w -
					m->m[ 1 ].y * m->m[ 0 ].w * m->m[ 2 ].z -
					m->m[ 2 ].y * m->m[ 0 ].z * m->m[ 1 ].w +
					m->m[ 2 ].y * m->m[ 0 ].w * m->m[ 1 ].z;
		 
	inv.m[ 1 ].w = m->m[ 0 ].x * m->m[ 1 ].z * m->m[ 2 ].w -
				   m->m[ 0 ].x * m->m[ 1 ].w * m->m[ 2 ].z -
				   m->m[ 1 ].x * m->m[ 0 ].z * m->m[ 2 ].w +
				   m->m[ 1 ].x * m->m[ 0 ].w * m->m[ 2 ].z +
				   m->m[ 2 ].x * m->m[ 0 ].z * m->m[ 1 ].w -
				   m->m[ 2 ].x * m->m[ 0 ].w * m->m[ 1 ].z;
		 
	inv.m[ 2 ].w = -m->m[ 0 ].x * m->m[ 1 ].y * m->m[ 2 ].w +
					m->m[ 0 ].x * m->m[ 1 ].w * m->m[ 2 ].y +
					m->m[ 1 ].x * m->m[ 0 ].y * m->m[ 2 ].w -
					m->m[ 1 ].x * m->m[ 0 ].w * m->m[ 2 ].y -
					m->m[ 2 ].x * m->m[ 0 ].y * m->m[ 1 ].w +
					m->m[ 2 ].x * m->m[ 0 ].w * m->m[ 1 ].y;
		 
	inv.m[ 3 ].w = m->m[ 0 ].x * m->m[ 1 ].y * m->m[ 2 ].z -
				   m->m[ 0 ].x * m->m[ 1 ].z * m->m[ 2 ].y -
				   m->m[ 1 ].x * m->m[ 0 ].y * m->m[ 2 ].z +
				   m->m[ 1 ].x * m->m[ 0 ].z * m->m[ 2 ].y +
				   m->m[ 2 ].x * m->m[ 0 ].y * m->m[ 1 ].z -
				   m->m[ 2 ].x * m->m[ 0 ].z * m->m[ 1 ].y;

	d = m->m[ 0 ].x * inv.m[ 0 ].x + 
		m->m[ 0 ].y * inv.m[ 1 ].x +
		m->m[ 0 ].z * inv.m[ 2 ].x +
		m->m[ 0 ].w * inv.m[ 3 ].x;
	
	if( !d ) return 0;

	d = 1.0f / d;

	inv.m[ 0 ].x *= d;
	inv.m[ 0 ].y *= d;
	inv.m[ 0 ].z *= d;
	inv.m[ 0 ].w *= d;

	inv.m[ 1 ].x *= d;
	inv.m[ 1 ].y *= d;
	inv.m[ 1 ].z *= d;
	inv.m[ 1 ].w *= d;

	inv.m[ 2 ].x *= d;
	inv.m[ 2 ].y *= d;
	inv.m[ 2 ].z *= d;
	inv.m[ 2 ].w *= d;

	inv.m[ 3 ].x *= d;
	inv.m[ 3 ].y *= d;
	inv.m[ 3 ].z *= d;
	inv.m[ 3 ].w *= d;
	
	mat4_copy_mat4( m, &inv ); 
	
	return 1;
}