Index: trunk/src/gui/gui_element.cc
===================================================================
--- trunk/src/gui/gui_element.cc	(revision 239)
+++ trunk/src/gui/gui_element.cc	(revision 257)
@@ -7,37 +7,11 @@
 #include "nv/gui/gui_element.hh"
 
-#include "nv/gui/gui_environment.hh"
-
 using namespace nv;
 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 ), m_render_data( nullptr )
+element::element( const rectangle& r ) 
+	: object( "" ), m_class(""), m_relative( r ), m_absolute( r ), m_enabled( true ), m_visible( true ), m_dirty( true ), m_render_data( nullptr )
 {
 
-}
-
-void element::on_update( uint32 elapsed )
-{
-	if ( is_visible() )
-	{
-		for ( object* i : *this )
-		{
-			((element*)i)->on_update( elapsed );
-		}
-	}
-	((environment*)m_root)->update( this, elapsed );
-}
-
-void element::on_draw()
-{
-	if ( is_visible() )
-	{
-		((environment*)m_root)->draw( this );
-		for ( object* i : *this )
-		{
-			((element*)i)->on_draw();
-		}
-	}
 }
 
Index: trunk/src/gui/gui_environment.cc
===================================================================
--- trunk/src/gui/gui_environment.cc	(revision 239)
+++ trunk/src/gui/gui_environment.cc	(revision 257)
@@ -34,5 +34,5 @@
 {
 	m_area.dim( dimension( w->get_width(), w->get_height() ) );
-	m_screen = new screen( this, m_area );
+	m_screen = new screen( m_area );
 	m_renderer = new renderer( w, shader_path );
 	root::add_child( m_screen );
@@ -44,6 +44,23 @@
 }
 
+element* nv::gui::environment::create_element( element* parent, const rectangle& r )
+{
+	element* result = new element( r );
+	object_created( result );
+	if ( parent == nullptr ) parent = m_screen;
+	parent->add_child( result );
+	return result;
+}
+
 void environment::update( element* e, uint32 elapsed )
 {
+	e->on_update( elapsed );
+	if ( e->is_visible() )
+	{
+		for ( object* i : *e )
+		{
+			update( ((element*)i), elapsed );
+		}
+	}
 	if ( e->is_dirty() || e->m_render_data == nullptr )
 	{
@@ -55,15 +72,23 @@
 void environment::draw( element* e )
 {
-	m_renderer->draw( e );
+	if ( e->is_visible() )
+	{
+		e->on_draw();
+		m_renderer->draw( e );
+		for ( object* i : *e )
+		{
+			draw((element*)i);
+		}
+	}
 }
 
 void environment::update()
 {
-	m_screen->on_update( 0 );
+	update( m_screen, 0 );
 }
 
 void environment::draw()
 {
-	m_screen->on_draw();
+	draw( m_screen );
 	m_renderer->draw();
 }
@@ -77,5 +102,5 @@
 environment::~environment()
 {
-	destroy_children();
+	destroy_children( this );
 	delete m_renderer;
 }
