Index: /trunk/nv/lib/detail/gl_functions.inc
===================================================================
--- /trunk/nv/lib/detail/gl_functions.inc	(revision 228)
+++ /trunk/nv/lib/detail/gl_functions.inc	(revision 229)
@@ -179,2 +179,26 @@
 NV_GL_FUN_EXT( void , glUniformMatrix3x4fv , ( GLint , GLsizei , GLboolean , const GLfloat *) );
 NV_GL_FUN_EXT( void , glUniformMatrix4x3fv , ( GLint , GLsizei , GLboolean , const GLfloat *) );
+
+/* GL_EXT_FRAMEBUFFER */
+NV_GL_FUN_EXT( void , glBindFramebuffer , ( GLenum , GLuint ) );
+NV_GL_FUN_EXT( void , glBindRenderbuffer , ( GLenum , GLuint ) );
+NV_GL_FUN_EXT( GLenum , glCheckFramebufferStatus , ( GLenum ) );
+NV_GL_FUN_EXT( void , glDeleteFramebuffers , ( GLsizei , const GLuint*) );
+NV_GL_FUN_EXT( void , glDeleteRenderbuffers , ( GLsizei , const GLuint*) );
+NV_GL_FUN_EXT( void , glFramebufferRenderbuffer , ( GLenum , GLenum , GLenum , GLuint ) );
+NV_GL_FUN_EXT( void , glFramebufferTexture1D , ( GLenum , GLenum , GLenum , GLuint , GLint ) );
+NV_GL_FUN_EXT( void , glFramebufferTexture2D , ( GLenum , GLenum , GLenum , GLuint , GLint ) );
+NV_GL_FUN_EXT( void , glFramebufferTexture3D , ( GLenum , GLenum , GLenum , GLuint , GLint , GLint ) );
+NV_GL_FUN_EXT( void , glGenFramebuffers , ( GLsizei , GLuint* ) );
+NV_GL_FUN_EXT( void , glGenRenderbuffers , ( GLsizei , GLuint* ) );
+NV_GL_FUN_EXT( void , glGenerateMipmap , ( GLenum ) );
+NV_GL_FUN_EXT( void , glGetFramebufferAttachmentParameteriv , ( GLenum , GLenum , GLenum , GLint* ) );
+NV_GL_FUN_EXT( void , glGetRenderbufferParameteriv , ( GLenum , GLenum , GLint* ) );
+NV_GL_FUN_EXT( GLboolean , glIsFramebuffer , ( GLuint ) );
+NV_GL_FUN_EXT( GLboolean , glIsRenderbuffer , ( GLuint ) );
+NV_GL_FUN_EXT( void , glRenderbufferStorage , ( GLenum , GLenum , GLsizei , GLsizei ) );
+// NV_GL_FUN_EXT( void , glBlitFramebuffer , ( GLint , GLint , GLint , GLint , GLint , GLint , GLint , GLint , GLbitfield , GLenum ) );
+// NV_GL_FUN_EXT( void , glFramebufferTextureLayer , ( GLenum , GLenum , GLuint , GLint , GLint ) );
+// NV_GL_FUN_EXT( void , glRenderbufferStorageMultisample , ( GLenum , GLsizei , GLenum , GLsizei , GLsizei ) );
+
+
Index: /trunk/nv/lib/gl.hh
===================================================================
--- /trunk/nv/lib/gl.hh	(revision 228)
+++ /trunk/nv/lib/gl.hh	(revision 229)
@@ -503,4 +503,61 @@
 #define GL_COMPRESSED_SRGB_ALPHA 0x8C49
 
+/* GL_EXT_FRAMEBUFFER */
+/* We brutally force loading of the extension. Later, probably we'd need a runtime check for this */
+/* TODO: do it the nice way */
+#define GL_INVALID_FRAMEBUFFER_OPERATION 0x0506
+#define GL_MAX_RENDERBUFFER_SIZE 0x84E8
+#define GL_FRAMEBUFFER_BINDING 0x8CA6
+#define GL_RENDERBUFFER_BINDING 0x8CA7
+#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE 0x8CD0
+#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME 0x8CD1
+#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL 0x8CD2
+#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE 0x8CD3
+#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET 0x8CD4
+#define GL_FRAMEBUFFER_COMPLETE 0x8CD5
+#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT 0x8CD6
+#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT 0x8CD7
+#define GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS 0x8CD9
+#define GL_FRAMEBUFFER_INCOMPLETE_FORMATS 0x8CDA
+#define GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER 0x8CDB
+#define GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER 0x8CDC
+#define GL_FRAMEBUFFER_UNSUPPORTED 0x8CDD
+#define GL_MAX_COLOR_ATTACHMENTS 0x8CDF
+#define GL_COLOR_ATTACHMENT0 0x8CE0
+#define GL_COLOR_ATTACHMENT1 0x8CE1
+#define GL_COLOR_ATTACHMENT2 0x8CE2
+#define GL_COLOR_ATTACHMENT3 0x8CE3
+#define GL_COLOR_ATTACHMENT4 0x8CE4
+#define GL_COLOR_ATTACHMENT5 0x8CE5
+#define GL_COLOR_ATTACHMENT6 0x8CE6
+#define GL_COLOR_ATTACHMENT7 0x8CE7
+#define GL_COLOR_ATTACHMENT8 0x8CE8
+#define GL_COLOR_ATTACHMENT9 0x8CE9
+#define GL_COLOR_ATTACHMENT10 0x8CEA
+#define GL_COLOR_ATTACHMENT11 0x8CEB
+#define GL_COLOR_ATTACHMENT12 0x8CEC
+#define GL_COLOR_ATTACHMENT13 0x8CED
+#define GL_COLOR_ATTACHMENT14 0x8CEE
+#define GL_COLOR_ATTACHMENT15 0x8CEF
+#define GL_DEPTH_ATTACHMENT 0x8D00
+#define GL_STENCIL_ATTACHMENT 0x8D20
+#define GL_FRAMEBUFFER 0x8D40
+#define GL_RENDERBUFFER 0x8D41
+#define GL_RENDERBUFFER_WIDTH 0x8D42
+#define GL_RENDERBUFFER_HEIGHT 0x8D43
+#define GL_RENDERBUFFER_INTERNAL_FORMAT 0x8D44
+#define GL_STENCIL_INDEX1 0x8D46
+#define GL_STENCIL_INDEX4 0x8D47
+#define GL_STENCIL_INDEX8 0x8D48
+#define GL_STENCIL_INDEX16 0x8D49
+#define GL_RENDERBUFFER_RED_SIZE 0x8D50
+#define GL_RENDERBUFFER_GREEN_SIZE 0x8D51
+#define GL_RENDERBUFFER_BLUE_SIZE 0x8D52
+#define GL_RENDERBUFFER_ALPHA_SIZE 0x8D53
+#define GL_RENDERBUFFER_DEPTH_SIZE 0x8D54
+#define GL_RENDERBUFFER_STENCIL_SIZE 0x8D55
+
+
+
 #if defined(NV_GL_DYNAMIC)
 #	define NV_GL_FUN( rtype, fname, fparams ) NV_GL_API rtype ( NV_GL_APIENTRY *fname) fparams
Index: /trunk/nv/math.hh
===================================================================
--- /trunk/nv/math.hh	(revision 228)
+++ /trunk/nv/math.hh	(revision 229)
@@ -19,4 +19,5 @@
 #include <glm/gtc/matrix_transform.hpp>
 #include <glm/gtc/type_ptr.hpp>
+#include <glm/gtc/quaternion.hpp>
 
 namespace nv
Index: /trunk/nv/resource.hh
===================================================================
--- /trunk/nv/resource.hh	(revision 228)
+++ /trunk/nv/resource.hh	(revision 229)
@@ -23,16 +23,52 @@
 	{
 	public:
-		typedef std::shared_ptr< resource > ptr;
-	public:
+		resource() : m_size(0), m_rid(0), m_used(0), m_loaded(0), m_data(nullptr) {}
 		virtual bool load() = 0;
+		virtual bool initialize() { return true; };
+		virtual bool destroy() { return true; };
 		virtual bool unload() = 0;
 		bool is_loaded() const { return m_loaded; }
 		uid get_rid() const { return m_rid; }
 		uid get_size() const { return m_size; }
+		const void* get() { return m_data; }
+		void lock() { m_used++; }
+		void unlock() { m_used--; }
 		virtual ~resource() {}
 	private:
 		uint32 m_size;
 		uint32 m_rid;
+		uint32 m_used;
 		bool   m_loaded;
+		void*  m_data;
+	};
+
+	template< class DATA >
+	class resource_type : public resource
+	{
+	public:
+		explicit resource_type( DATA* data ) : m_data( data ) {}
+		virtual bool load() { return true; };
+		virtual bool unload() { return true; };
+		~resource_type() { delete data; }
+	};
+
+
+
+	template< class DATA >
+	class resource_handle
+	{
+	public:
+		explicit resource_handle( resource_type< DATA >& m_resource ) 
+			: m_resource( &a_resource ) { m_resource.lock(); }
+		void assign( resource_type< DATA >& a_resource ) 
+		{
+			m_resource.unlock();
+			m_resource = a_resource;
+			m_resource.lock();
+		}
+		const DATA* operator->() const { return (const DATA*)m_resource.get(); }
+		~resource_handle() { m_resource.unlock(); }
+	private:
+		resource& m_resource;
 	};
 
Index: /trunk/nv/resource_manager.hh
===================================================================
--- /trunk/nv/resource_manager.hh	(revision 228)
+++ /trunk/nv/resource_manager.hh	(revision 229)
@@ -56,9 +56,9 @@
 		}
 
-		resource::ptr get_raw_resource(uint32 id) const;
-		resource::ptr get_raw_resource(const std::string& id) const;
+		resource* get_raw_resource(uint32 id) const;
+		resource* get_raw_resource(const std::string& id) const;
 		
 	private:
-		typedef std::vector< resource::ptr > resources; 
+		typedef std::vector< resource* > resources; 
 		typedef std::unordered_map< std::string, uid > id_map;
 		typedef std::unordered_map< std::string, resource_constructor_func > constructor_map;
Index: /trunk/src/gl/gl_device.cc
===================================================================
--- /trunk/src/gl/gl_device.cc	(revision 228)
+++ /trunk/src/gl/gl_device.cc	(revision 229)
@@ -49,6 +49,6 @@
 	SDL_GL_SetAttribute( SDL_GL_DOUBLEBUFFER, 1 );
 
-	SDL_GL_SetAttribute( SDL_GL_MULTISAMPLEBUFFERS, 1 );
-	SDL_GL_SetAttribute( SDL_GL_MULTISAMPLESAMPLES, 4 );
+//	SDL_GL_SetAttribute( SDL_GL_MULTISAMPLEBUFFERS, 1 );
+//	SDL_GL_SetAttribute( SDL_GL_MULTISAMPLESAMPLES, 4 );
 
 #if NV_SDL_VERSION == NV_SDL_20
Index: /trunk/src/resource_manager.cc
===================================================================
--- /trunk/src/resource_manager.cc	(revision 228)
+++ /trunk/src/resource_manager.cc	(revision 229)
@@ -14,10 +14,10 @@
 }
 
-resource::ptr resource_manager::get_raw_resource(uint32 id) const
+resource* resource_manager::get_raw_resource(uint32 id) const
 {
 	return m_data[ id ];
 }
 
-resource::ptr resource_manager::get_raw_resource(const std::string& id) const
+resource* resource_manager::get_raw_resource(const std::string& id) const
 {
 	auto i = m_id_map.find( id );
@@ -26,10 +26,10 @@
 		return m_data[ (unsigned int)i->second ];
 	}
-	return resource::ptr();
+	return nullptr;
 }
 
-void resource_manager::register_resource_type( const std::string& name, resource_constructor_func c )
+void resource_manager::register_resource_type( const std::string& type_name, resource_constructor_func c )
 {
-	m_constructors[ name ] = c;
+	m_constructors[ type_name ] = c;
 }
 
Index: /trunk/tests/gui_test/nv_gui_test.cc
===================================================================
--- /trunk/tests/gui_test/nv_gui_test.cc	(revision 228)
+++ /trunk/tests/gui_test/nv_gui_test.cc	(revision 229)
@@ -27,5 +27,5 @@
 {
 	m_device = new nv::gl_device();
-	m_window = m_device->create_window( 800, 600 );
+	m_window = m_device->create_window( 800, 600, false );
 	m_clear_state.buffers = nv::clear_state::COLOR_AND_DEPTH_BUFFER;
 	m_guienv = new nv::gui::environment( m_window );
