Index: trunk/src/gui/gui_element.cc
===================================================================
--- trunk/src/gui/gui_element.cc	(revision 266)
+++ 	(revision )
@@ -1,111 +1,0 @@
-// Copyright (C) 2012-2013 ChaosForge / Kornel Kisielewicz
-// http://chaosforge.org/
-//
-// This file is part of NV Libraries.
-// For conditions of distribution and use, see copyright notice in nv.hh
-
-#include "nv/gui/gui_element.hh"
-
-using namespace nv;
-using namespace nv::gui;
-
-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 )
-{
-
-}
-
-bool element::on_event( const io_event& event )
-{
-	return m_parent ? ((element*)m_parent)->on_event( event ) : false;
-}
-
-element* element::get_element( const position& p )
-{
-	if ( !is_visible() ) return nullptr;
-
-	element* result = nullptr;
-	list::reverse_iterator it = m_children.rbegin();
-
-	while ( it != m_children.rend() )
-	{
-		result = ((element*)(*it))->get_element( p );
-		if ( result ) return result;
-		++it;
-	}
-
-	if ( contains( p ) ) return this;
-	return nullptr;
-}
-
-bool element::contains( const position& p ) const
-{
-	return m_absolute.contains( p );
-}
-
-void element::set_relative( const rectangle& r )
-{
-	m_dirty    = true;
-	m_relative = r;
-	recalculate_absolute();
-}
-
-void element::set_relative( const position& p )
-{
-	set_relative( rectangle( p, p + m_relative.get_size() ) );
-}
-
-void element::recalculate_absolute()
-{
-	rectangle pabsolute;
-
-	if ( m_parent )
-	{
-		pabsolute = ((element*)(m_parent))->m_absolute;
-	}
-
-	m_absolute = m_relative + pabsolute.ul;
-
-	for ( object* o : *this )
-	{
-		((element*)o)->recalculate_absolute();
-	}
-}
-
-void element::recalculate_absolute_children()
-{
-	for ( object* o : *this )
-	{
-		((element*)o)->recalculate_absolute();
-	}
-}
-
-
-bool element::move_to_top( element* child )
-{
-	list::iterator it = std::find( m_children.begin(), m_children.end(), (object*)child );
-	if ( it != m_children.end() )
-	{
-		m_children.erase( it );
-		m_children.push_back( child );
-		return true;
-	}	
-	return false;
-}
-
-bool element::move_to_bottom( element* child )
-{
-	list::iterator it = std::find( m_children.begin(), m_children.end(), (object*)child );
-	if ( it != m_children.end() )
-	{
-		m_children.erase( it );
-		m_children.push_front( child );
-		return true;
-	}	
-	return false;
-}
-
-element::~element()
-{
-	delete m_render_data;
-}
Index: trunk/src/gui/gui_environment.cc
===================================================================
--- trunk/src/gui/gui_environment.cc	(revision 266)
+++ trunk/src/gui/gui_environment.cc	(revision 267)
@@ -25,14 +25,9 @@
 #include "nv/gfx/texture_atlas.hh"
 
-#include <vector>
-
-using namespace nv;
-using namespace nv::gui;
-
-environment::environment( window* w, const std::string& shader_path )
+nv::gui::environment::environment( window* w, const std::string& shader_path )
 	: m_renderer( nullptr ), m_window( w ), m_screen( nullptr )
 {
 	m_area.dim( dimension( w->get_width(), w->get_height() ) );
-	m_screen = new screen( m_area );
+	m_screen = new element( m_area );
 	m_renderer = new renderer( w, shader_path );
 }
@@ -43,5 +38,5 @@
 }
 
-element* nv::gui::environment::create_element( element* parent, const rectangle& r )
+nv::gui::element* nv::gui::environment::create_element( element* parent, const rectangle& r )
 {
 	element* result = new element( r );
@@ -58,7 +53,7 @@
 }
 
-void environment::update( element* e, uint32 elapsed )
-{
-	e->on_update( elapsed );
+void nv::gui::environment::update( element* e, uint32 elapsed )
+{
+//	e->on_update( elapsed );
 	if ( e->is_visible() )
 	{
@@ -75,9 +70,9 @@
 }
 
-void environment::draw( element* e )
+void nv::gui::environment::draw( element* e )
 {
 	if ( e->is_visible() )
 	{
-		e->on_draw();
+//		e->on_draw();
 		m_renderer->draw( e );
 		for ( object* i : *e )
@@ -88,10 +83,10 @@
 }
 
-void environment::update()
+void nv::gui::environment::update()
 {
 	update( m_screen, 0 );
 }
 
-void environment::draw()
+void nv::gui::environment::draw()
 {
 	draw( m_screen );
@@ -99,10 +94,10 @@
 }
 
-void environment::add_child( element* child )
+void nv::gui::environment::add_child( element* child )
 {
 	m_screen->add_child( child );
 }
 
-void environment::destroy_children( element* e )
+void nv::gui::environment::destroy_children( element* e )
 {
 	while ( !e->m_children.empty() )
@@ -113,5 +108,5 @@
 
 
-environment::~environment()
+nv::gui::environment::~environment()
 {
 	destroy_element( m_screen );
@@ -119,2 +114,94 @@
 }
 
+bool nv::gui::environment::process_io_event( const io_event& )
+{
+	return false;
+}
+
+bool nv::gui::environment::process_io_event( element* e, const io_event& ev )
+{
+	return e->m_parent ? process_io_event( (element*)e->m_parent, ev ) : false;
+}
+
+nv::gui::element* nv::gui::environment::get_element( const position& p )
+{
+	return get_deepest_child( m_screen, p );
+}
+
+nv::gui::element* nv::gui::environment::get_deepest_child( element* e, const position& p )
+{
+	if ( !e->is_visible() ) return nullptr;
+
+	element* result = nullptr;
+	element::list::reverse_iterator it = e->m_children.rbegin();
+
+	while ( it != e->m_children.rend() )
+	{
+		result = get_deepest_child( (element*)(*it), p );
+		if ( result ) return result;
+		++it;
+	}
+
+	if ( e->contains( p ) ) return e;
+	return nullptr;
+}
+
+void nv::gui::environment::move_to_top( element* child )
+{
+	element* parent = (element*)child->m_parent;
+	if ( parent )
+	{
+		auto it = std::find( parent->m_children.begin(), parent->m_children.end(), (object*)child );
+		if ( it != parent->m_children.end() )
+		{
+			parent->m_children.erase( it );
+			parent->m_children.push_back( child );
+			parent->m_dirty = true;
+		}	
+	}
+}
+
+void nv::gui::environment::move_to_bottom( element* child )
+{
+	element* parent = (element*)child->m_parent;
+	if ( parent )
+	{
+		auto it = std::find( parent->m_children.begin(), parent->m_children.end(), (object*)child );
+		if ( it != parent->m_children.end() )
+		{
+			parent->m_children.erase( it );
+			parent->m_children.push_front( child );
+			parent->m_dirty = true;
+		}
+	}
+}
+
+void nv::gui::environment::set_relative( element* e, const rectangle& r )
+{
+	e->m_dirty    = true;
+	e->m_relative = r;
+	recalculate_absolute( e );
+}
+
+void nv::gui::environment::set_relative( element* e, const position& p )
+{
+	set_relative( e, rectangle( p, p + e->m_relative.get_size() ) );
+}
+
+void nv::gui::environment::recalculate_absolute( element* e )
+{
+	rectangle pabsolute;
+
+	if ( e->m_parent )
+	{
+		pabsolute = ((element*)(e->m_parent))->m_absolute;
+	}
+
+	e->m_absolute = e->m_relative + pabsolute.ul;
+
+	for ( object* o : e->m_children )
+	{
+		recalculate_absolute( ((element*)o) );
+	}
+}
+
Index: trunk/src/gui/gui_renderer.cc
===================================================================
--- trunk/src/gui/gui_renderer.cc	(revision 266)
+++ trunk/src/gui/gui_renderer.cc	(revision 267)
@@ -112,7 +112,5 @@
 	sr->varray     = m_window->get_device()->create_vertex_array();
 	sr->shader     = m_window->get_device()->create_program( nv::slurp( shader_path + ".vert" ), nv::slurp( shader_path + ".frag" ) );
-	sr->shader->set_uniform( "tex", 0 );
-	glm::mat4 projection = glm::ortho( 0.0f, float( m_window->get_width() ), float( m_window->get_height() ), 0.0f, -1.0f, 1.0f );
-	sr->shader->set_uniform( "nv_projection", projection );
+	m_scene_state.get_camera().set_ortho( 0.0f, float( m_window->get_width() ), float( m_window->get_height() ), 0.0f );
 
 	vertex_buffer* vb = (vertex_buffer*)sr->buffer.get_buffer();
@@ -274,7 +272,6 @@
 		sr->varray->update_vertex_buffer( nv::COLOR,    vb, false );
 	}
-	sr->texture->bind( 0 );
-	sr->shader->set_uniform( "tex", 0 );
-	m_window->get_context()->draw( TRIANGLES, m_render_state, sr->shader, sr->varray, sr->buffer.get_size() * 6 );
+	sr->texture->bind( nv::TEX_DIFFUSE );
+	m_window->get_context()->draw( TRIANGLES, m_render_state, m_scene_state, sr->shader, sr->varray, sr->buffer.get_size() * 6 );
 }
 
