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; } } }
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; }