Index: trunk/nv/interface/camera.hh
===================================================================
--- trunk/nv/interface/camera.hh	(revision 461)
+++ trunk/nv/interface/camera.hh	(revision 462)
@@ -79,7 +79,8 @@
 		mat4 get_mvp()        const { return m_camera.get_projection() * get_modelview(); }
 
-		mat4 get_view_inv()   const { return math::inverse( get_view() ); }
-		mat4 get_model_inv()  const { return math::inverse( get_model() ); }
-		mat3 get_normal()     const { return math::transpose( math::inverse( mat3( get_modelview() ) ) ); }
+		mat4 get_view_inv()      const { return math::inverse( get_view() ); }
+		mat4 get_model_inv()     const { return math::inverse( get_model() ); }
+		mat4 get_modelview_inv() const { return math::inverse( get_modelview() ); }
+		mat3 get_normal()        const { return math::transpose( math::inverse( mat3( get_modelview() ) ) ); }
 	protected:
 		mat4   m_model;
Index: trunk/nv/interface/device.hh
===================================================================
--- trunk/nv/interface/device.hh	(revision 461)
+++ trunk/nv/interface/device.hh	(revision 462)
@@ -271,12 +271,13 @@
 		{
 			engine_uniform_factory_map& factory_map = get_uniform_factory();
-			factory_map[ "nv_m_view" ]       = new engine_uniform_factory< engine_uniform_m_view >();
-			factory_map[ "nv_m_view_inv" ]   = new engine_uniform_factory< engine_uniform_m_view_inv >();
-			factory_map[ "nv_m_model" ]      = new engine_uniform_factory< engine_uniform_m_model >();
-			factory_map[ "nv_m_model_inv" ]  = new engine_uniform_factory< engine_uniform_m_model_inv >();
-			factory_map[ "nv_m_modelview" ]  = new engine_uniform_factory< engine_uniform_m_modelview >();
-			factory_map[ "nv_m_projection" ] = new engine_uniform_factory< engine_uniform_m_projection >();
-			factory_map[ "nv_m_normal" ]     = new engine_uniform_factory< engine_uniform_m_normal >();
-			factory_map[ "nv_m_mvp" ]        = new engine_uniform_factory< engine_uniform_m_mvp >();
+			factory_map[ "nv_m_view" ]          = new engine_uniform_factory< engine_uniform_m_view >();
+			factory_map[ "nv_m_view_inv" ]      = new engine_uniform_factory< engine_uniform_m_view_inv >();
+			factory_map[ "nv_m_model" ]         = new engine_uniform_factory< engine_uniform_m_model >();
+			factory_map[ "nv_m_model_inv" ]     = new engine_uniform_factory< engine_uniform_m_model_inv >();
+			factory_map[ "nv_m_modelview" ]     = new engine_uniform_factory< engine_uniform_m_modelview >();
+			factory_map[ "nv_m_modelview_inv" ] = new engine_uniform_factory< engine_uniform_m_modelview_inv >();
+			factory_map[ "nv_m_projection" ]    = new engine_uniform_factory< engine_uniform_m_projection >();
+			factory_map[ "nv_m_normal" ]        = new engine_uniform_factory< engine_uniform_m_normal >();
+			factory_map[ "nv_m_mvp" ]           = new engine_uniform_factory< engine_uniform_m_mvp >();
 			factory_map[ "nv_v_camera_position" ]  = new engine_uniform_factory< engine_uniform_v_camera_position >();
 			factory_map[ "nv_v_camera_direction" ] = new engine_uniform_factory< engine_uniform_v_camera_direction >();
Index: trunk/nv/interface/image_data.hh
===================================================================
--- trunk/nv/interface/image_data.hh	(revision 461)
+++ trunk/nv/interface/image_data.hh	(revision 462)
@@ -31,4 +31,7 @@
 		BGRA,
 		RED,
+		DEPTH16,
+		DEPTH24,
+		DEPTH32,
 	};
 	
Index: trunk/nv/interface/uniform.hh
===================================================================
--- trunk/nv/interface/uniform.hh	(revision 461)
+++ trunk/nv/interface/uniform.hh	(revision 462)
@@ -192,4 +192,11 @@
 	};
 
+	class engine_uniform_m_modelview_inv : public engine_uniform< mat4 >
+	{
+	public:
+		engine_uniform_m_modelview_inv( uniform_base* u ) : engine_uniform( u ) {}
+		virtual void set( const context*, const scene_state* s ) { m_uniform->set_value( s->get_modelview() ); }
+	};
+
 	class engine_uniform_m_projection : public engine_uniform< mat4 >
 	{
Index: trunk/nv/stl/math/quaternion.hh
===================================================================
--- trunk/nv/stl/math/quaternion.hh	(revision 461)
+++ trunk/nv/stl/math/quaternion.hh	(revision 462)
Index: trunk/src/gl/gl_context.cc
===================================================================
--- trunk/src/gl/gl_context.cc	(revision 461)
+++ trunk/src/gl/gl_context.cc	(revision 462)
@@ -121,5 +121,4 @@
 		glBindFramebuffer( GL_FRAMEBUFFER, info->glid );
 		unsigned gl_type = texture_type_to_enum( tinfo->type );
-
 		if ( tinfo )
 		{
@@ -141,5 +140,6 @@
 	{
 		glBindFramebuffer( GL_FRAMEBUFFER, info->glid );
-		if ( info->depth_rb_glid ) glDeleteRenderbuffers( 1, &(info->depth_rb_glid) );
+		if ( info->depth_rb_glid ) 
+			glDeleteRenderbuffers( 1, &(info->depth_rb_glid) );
 		glGenRenderbuffers( 1, &(info->depth_rb_glid) );
 		glBindRenderbuffer( GL_RENDERBUFFER, info->depth_rb_glid );
@@ -165,4 +165,6 @@
 bool nv::gl_context::check( framebuffer_slot ft )
 {
+ 	glDrawBuffer( 0 );
+ 	glReadBuffer( 0 );
 	if ( is_gl_extension_loaded( GL_EXT_FRAMEBUFFER_OBJECT ) && is_gl_extension_loaded( GL_EXT_FRAMEBUFFER_BLIT ) )
 	{
@@ -185,4 +187,6 @@
 		NV_LOG_ERROR( "gl_context::check : Framebuffer extensions not loaded!" );
 	}
+	glDrawBuffer( GL_BACK );
+	glReadBuffer( GL_BACK );
 	return false;
 }
@@ -592,13 +596,13 @@
 		if ( m_render_state.culling.face != cull.face )
 		{
-			glCullFace( culling_face_type_to_enum(cull.face) );
+			glCullFace( culling_face_type_to_enum( cull.face ) );
 			m_render_state.culling.face = cull.face;
 		}
-
-		if ( m_render_state.culling.order != cull.order )
-		{
-			glFrontFace( culling_order_type_to_enum( cull.order ) );
-			m_render_state.culling.order = cull.order;
-		}
+	}
+
+	if ( m_render_state.culling.order != cull.order )
+	{
+		glFrontFace( culling_order_type_to_enum( cull.order ) );
+		m_render_state.culling.order = cull.order;
 	}
 }
@@ -688,4 +692,5 @@
 	load_gl_extensions( GL_EXT_FRAMEBUFFER_BLIT | GL_EXT_FRAMEBUFFER_OBJECT );
 	force_apply_render_state( m_render_state );
+
 }
 
Index: trunk/src/gl/gl_enum.cc
===================================================================
--- trunk/src/gl/gl_enum.cc	(revision 461)
+++ trunk/src/gl/gl_enum.cc	(revision 462)
@@ -185,4 +185,7 @@
 	case BGRA    : return GL_BGRA;
 	case RED     : return GL_RED;
+	case DEPTH16 : return GL_DEPTH_COMPONENT;
+	case DEPTH24 : return GL_DEPTH_COMPONENT;
+	case DEPTH32 : return GL_DEPTH_COMPONENT;
 	NV_RETURN_COVERED_DEFAULT( 0 );
 	}
@@ -202,5 +205,7 @@
 	case BGRA    : return GL_RGBA8;
 	case RED     : return 0x8040; // GL_LUMINANCE8; // TODO: change to GL_R8!
-
+	case DEPTH16 : return GL_DEPTH_COMPONENT16;
+	case DEPTH24 : return GL_DEPTH_COMPONENT24;
+	case DEPTH32:  return GL_DEPTH_COMPONENT32;
 	NV_RETURN_COVERED_DEFAULT( 0 );
 	}
