Index: trunk/nv/gl/gl_vertex_buffer.hh
===================================================================
--- trunk/nv/gl/gl_vertex_buffer.hh	(revision 98)
+++ trunk/nv/gl/gl_vertex_buffer.hh	(revision 99)
@@ -24,4 +24,5 @@
 		gl_vertex_buffer( buffer_hint hint, int size, void* data = nullptr );
 		virtual void assign( void* data );
+		virtual void assign( void* data, int offset, int size );
 		virtual void bind();
 		virtual void unbind();
@@ -36,4 +37,5 @@
 		gl_index_buffer( buffer_hint hint, int size, void* data = nullptr );
 		virtual void assign( void* data );
+		virtual void assign( void* data, int offset, int size );
 		virtual void bind();
 		virtual void unbind();
Index: trunk/nv/gui/gui_element.hh
===================================================================
--- trunk/nv/gui/gui_element.hh	(revision 98)
+++ trunk/nv/gui/gui_element.hh	(revision 99)
@@ -27,5 +27,5 @@
 		public:
 			element() : object() {}
-			element( root* aroot, const rectangle r );
+			element( root* aroot, const rectangle& r );
 			element* get_element( const position& p );
 			virtual void on_update( uint32 elapsed );
@@ -49,5 +49,9 @@
 			virtual void set_class( const string& class_ ) { m_class = class_; m_dirty = true; }
 			virtual void recalculate_absolute();
+			virtual void recalculate_absolute_children();
+			virtual ~element();
 		protected:
+			friend class environment;
+
 			string    m_class;
 			string    m_text;
Index: trunk/nv/interface/vertex_buffer.hh
===================================================================
--- trunk/nv/interface/vertex_buffer.hh	(revision 98)
+++ trunk/nv/interface/vertex_buffer.hh	(revision 99)
@@ -33,4 +33,5 @@
 		buffer( buffer_hint hint, int size ) { m_size = size; m_hint = hint; }
 		virtual void assign( void* data ) = 0;
+		virtual void assign( void* data, int offset, int size ) = 0;
 		virtual void bind() = 0;
 		virtual void unbind() = 0;
Index: trunk/nv/object.hh
===================================================================
--- trunk/nv/object.hh	(revision 98)
+++ trunk/nv/object.hh	(revision 99)
@@ -144,4 +144,9 @@
 
 		/**
+		 * Returns object ID
+		 */
+		const std::string& get_id() const { return m_id; }
+
+		/**
 		 * Returns object UID
 		 */
Index: trunk/src/gl/gl_vertex_buffer.cc
===================================================================
--- trunk/src/gl/gl_vertex_buffer.cc	(revision 98)
+++ trunk/src/gl/gl_vertex_buffer.cc	(revision 99)
@@ -25,4 +25,12 @@
 	glBindBuffer( GL_ARRAY_BUFFER, 0);
 }
+
+void gl_vertex_buffer::assign( void* data, int offset, int size )
+{
+	glBindBuffer( GL_ARRAY_BUFFER, m_name.get_value() );
+	glBufferSubData( GL_ARRAY_BUFFER, offset, size, data );
+	glBindBuffer( GL_ARRAY_BUFFER, 0);
+}
+
 
 void gl_vertex_buffer::bind()
@@ -54,4 +62,11 @@
 	glBindBuffer( GL_ELEMENT_ARRAY_BUFFER, m_name.get_value() );
 	glBufferData( GL_ELEMENT_ARRAY_BUFFER, m_size, data, buffer_hint_to_enum( m_hint ) );
+	glBindBuffer( GL_ELEMENT_ARRAY_BUFFER, 0);
+}
+
+void gl_index_buffer::assign( void* data, int offset, int size )
+{
+	glBindBuffer( GL_ELEMENT_ARRAY_BUFFER, m_name.get_value() );
+	glBufferSubData( GL_ELEMENT_ARRAY_BUFFER, offset, size, data );
 	glBindBuffer( GL_ELEMENT_ARRAY_BUFFER, 0);
 }
Index: trunk/src/gui/gui_element.cc
===================================================================
--- trunk/src/gui/gui_element.cc	(revision 98)
+++ trunk/src/gui/gui_element.cc	(revision 99)
@@ -12,6 +12,6 @@
 using namespace nv::gui;
 
-element::element( root* aroot, const rectangle r ) 
-	: object( aroot, "" ), m_class(""), m_relative( r ), m_absolute( r ), m_enabled( true ), m_visible( true ), m_dirty( true )
+element::element( root* aroot, const rectangle& r ) 
+	: object( aroot, "" ), m_class(""), m_relative( r ), m_absolute( r ), m_enabled( true ), m_visible( true ), m_dirty( true ), m_render_data( nullptr )
 {
 
@@ -97,2 +97,15 @@
 	}
 }
+
+void element::recalculate_absolute_children()
+{
+	for ( object* o : *this )
+	{
+		((element*)o)->recalculate_absolute();
+	}
+}
+
+element::~element()
+{
+	delete m_render_data;
+}
Index: trunk/tests/lualib_test/lualib_test.cc
===================================================================
--- trunk/tests/lualib_test/lualib_test.cc	(revision 98)
+++ trunk/tests/lualib_test/lualib_test.cc	(revision 99)
@@ -10,10 +10,4 @@
 #include <functional>
 #include <nv/gui/gui_element.hh>
-
-struct test_struct
-{
-	std::string f;
-	int i;
-};
 
 int main(int, char* [])
@@ -32,4 +26,5 @@
 		state.do_file( "init.lua" );
 
+		log.set_level( nv::LOG_INFO );
 		for (;;)
 		{
@@ -56,6 +51,4 @@
 			if ( !result )
 			{
-				std::string error = lua_tostring( state, -1 );
-				std::cout << "ERROR : " << error << std::endl;
 				continue;
 			}
