Index: trunk/tests/md3_test/md3_test.cc
===================================================================
--- trunk/tests/md3_test/md3_test.cc	(revision 239)
+++ trunk/tests/md3_test/md3_test.cc	(revision 304)
@@ -7,6 +7,4 @@
 #include <nv/interface/context.hh>
 #include <nv/interface/window.hh>
-#include <nv/interface/program.hh>
-#include <nv/interface/texture2d.hh>
 #include <nv/interface/mesh_loader.hh>
 #include <nv/io/c_file_system.hh>
@@ -22,10 +20,10 @@
 #include <glm/gtx/matrix_interpolation.hpp>
 
-bool GPU_ANIMATION = false;
+bool GPU_ANIMATION = true;
 
 class mesh_part
 {
 public:
-	mesh_part( const std::string& path, nv::program* program, nv::window* window )
+	mesh_part( const std::string& path, nv::window* window )
 	{
 		NV_PROFILE("mesh_construct");
@@ -42,32 +40,34 @@
 		{
 			NV_PROFILE("create_mesh_data");
-			m_mesh_data = loader->release_mesh_data();
-			m_tag_map   = loader->create_tag_map();
+			m_mesh_data = loader->release_mesh_data_pack();
 		}
 		delete loader;
-
+		m_entry = nullptr;
 		{
 			NV_PROFILE("create_mesh");
 			if ( GPU_ANIMATION )
-				m_mesh      = new nv::keyframed_mesh_gpu( window->get_context(), m_mesh_data, m_tag_map, program );
+				m_mesh      = new nv::keyframed_mesh_gpu( window->get_context(), m_mesh_data->get_mesh(0), m_mesh_data->get_nodes() );
 			else
-				m_mesh      = new nv::keyframed_mesh_cpu( window->get_context(), m_mesh_data, m_tag_map );
-		}
-
-	}
-
-	nv::mat4 get_transform( const std::string& tag )
-	{
-		return m_mesh->get_tag( tag ).extract();
+				m_mesh      = new nv::keyframed_mesh_cpu( window->get_context(), m_mesh_data->get_mesh(0), m_mesh_data->get_nodes() );
+		}
+
+	}
+
+	nv::mat4 get_transform( nv::uint32 id )
+	{
+		return m_mesh->get_node_transform( id ).extract();
 	}
 
 	void setup_animation( nv::uint32 start, nv::uint32 stop, nv::uint32 fps, bool loop )
 	{
-		m_mesh->setup_animation( start, stop, fps, loop );
-	}
-
-	void update( nv::uint32 ms, nv::program* program )
+		delete m_entry;
+		m_entry = new nv::animation_entry("test", loop, fps, (float)start, float(stop-1) );
+		m_mesh->run_animation( m_entry );
+	}
+
+	void update( nv::uint32 ms, nv::program program )
 	{
 		m_mesh->update( ms );
+		m_mesh->update_animation( m_entry, ms );
 		m_mesh->update( program );
 	}
@@ -82,5 +82,4 @@
 	~mesh_part()
 	{
-		delete m_tag_map;
 		delete m_mesh_data;
 		delete m_mesh;
@@ -88,7 +87,7 @@
 
 private:
-	nv::tag_map*        m_tag_map;
-	nv::mesh_data*      m_mesh_data;
-	nv::keyframed_mesh* m_mesh;
+	nv::mesh_data_pack*  m_mesh_data;
+	nv::keyframed_mesh*  m_mesh;
+	nv::animation_entry* m_entry;
 };
 
@@ -102,7 +101,8 @@
 protected:
 	nv::device*       m_device;
+	nv::context*      m_context;
 	nv::window*       m_window;
-	nv::texture2d*    m_diffuse;
-	nv::texture2d*    m_diffuse_weapon;
+	nv::texture       m_diffuse;
+	nv::texture       m_diffuse_weapon;
 
 	nv::clear_state   m_clear_state;
@@ -114,5 +114,5 @@
 	mesh_part* m_head;
 	mesh_part* m_weapon;
-	nv::program* m_program;
+	nv::program m_program;
 };
 
@@ -120,13 +120,14 @@
 {
 	NV_PROFILE( "app_construct" );
-	m_device = new nv::gl_device();
-	m_window = m_device->create_window( 800, 600, false );
+	m_device  = new nv::gl_device();
+	m_window  = m_device->create_window( 800, 600, false );
+	m_context = m_window->get_context();
 
 	nv::sampler sampler( nv::sampler::LINEAR, nv::sampler::REPEAT );
 	nv::image_data* data = m_device->create_image_data( "data/doom.png" );
-	m_diffuse  = m_device->create_texture2d( data->get_size(), nv::RGBA, nv::UBYTE, sampler, (void*)data->get_data() );
+	m_diffuse  = m_device->create_texture( data->get_size(), nv::image_format( nv::RGBA, nv::UBYTE ), sampler, (void*)data->get_data() );
 	delete data;
 	data = m_device->create_image_data( "data/rocketl.png" );
-	m_diffuse_weapon = m_device->create_texture2d( data->get_size(), nv::RGBA, nv::UBYTE, sampler, (void*)data->get_data() );
+	m_diffuse_weapon = m_device->create_texture( data->get_size(), nv::image_format( nv::RGBA, nv::UBYTE ), sampler, (void*)data->get_data() );
 	delete data;
 
@@ -148,8 +149,8 @@
 		nv::slurp( "obj.frag" ) 
 	);
-	m_torso   = new mesh_part( "data/upper.md3", m_program, m_window );
-	m_legs    = new mesh_part( "data/lower.md3", m_program, m_window );
-	m_head    = new mesh_part( "data/head.md3", m_program, m_window );
-	m_weapon  = new mesh_part( "data/rocketl.md3", m_program, m_window );
+	m_torso   = new mesh_part( "data/upper.md3", m_window );
+	m_legs    = new mesh_part( "data/lower.md3", m_window );
+	m_head    = new mesh_part( "data/head.md3", m_window );
+	m_weapon  = new mesh_part( "data/rocketl.md3", m_window );
 	return true;
 }
@@ -176,9 +177,9 @@
 		ticks      = m_device->get_ticks();
 		nv::uint32 elapsed = ticks - last_ticks;
-		m_torso->update( elapsed, m_program );
-		m_legs->update( elapsed, m_program );
+		m_torso->update( ticks, m_program );
+		m_legs->update( ticks, m_program );
 		{
 			NV_PROFILE( "clear" );
-			m_window->get_context()->clear( m_clear_state );
+			m_context->clear( m_clear_state );
 		}
 
@@ -194,8 +195,8 @@
 			m_scene_state.get_camera().set_perspective(60.0f, 1.0f*800.0f/600.0f, 0.1f, 1000.0f);
 
-			m_diffuse->bind( 0 );
-			m_program->set_uniform( "light_position", glm::vec3(120.0, 120.0, 0) );
-			m_program->set_uniform( "light_diffuse",  glm::vec4(1.0,1.0,1.0,1.0) );
-			m_program->set_uniform( "light_specular", glm::vec4(1.0,1.0,1.0,1.0) );
+			m_context->bind( m_diffuse, nv::TEX_DIFFUSE );
+			m_device->set_uniform( m_program, "light_position", glm::vec3(120.0, 120.0, 0) );
+			m_device->set_uniform( m_program, "light_diffuse",  glm::vec4(1.0,1.0,1.0,1.0) );
+			m_device->set_uniform( m_program, "light_specular", glm::vec4(1.0,1.0,1.0,1.0) );
 		}
 
@@ -208,16 +209,16 @@
 
 			//model = m_legs->get_transform( "tag_torso", last_legs_frame, legs_frame, legs_interpolate );
-			model = m_legs->get_transform( "tag_torso" );
+			model = m_legs->get_transform( 0 );
 			m_scene_state.set_model( model );
 			m_window->get_context()->draw( m_render_state, m_scene_state, m_program, m_torso->get_mesh() );
 
-			glm::mat4 head = model * m_torso->get_transform( "tag_head" ); //, last_torso_frame, torso_frame, torso_interpolate );
+			glm::mat4 head = model * m_torso->get_transform( 0 ); //, last_torso_frame, torso_frame, torso_interpolate );
 			m_scene_state.set_model( head );
 			m_window->get_context()->draw( m_render_state, m_scene_state, m_program, m_head->get_mesh() );
 
-			glm::mat4 weapon = model * m_torso->get_transform( "tag_weapon" ); //, last_torso_frame, torso_frame, torso_interpolate );
+			glm::mat4 weapon = model * m_torso->get_transform( 2 ); //, last_torso_frame, torso_frame, torso_interpolate );
 			m_scene_state.set_model( weapon );
-			m_diffuse_weapon->bind( 0 );
-			m_window->get_context()->draw( m_render_state, m_scene_state, m_program, m_weapon->get_mesh() );
+			m_context->bind( m_diffuse_weapon, nv::TEX_DIFFUSE );
+			m_context->draw( m_render_state, m_scene_state, m_program, m_weapon->get_mesh() );
 
 		}
@@ -273,11 +274,11 @@
 application::~application()
 {
-	delete m_program;
+	m_device->release( m_program );
 	delete m_torso;
 	delete m_legs;
 	delete m_head;
 	delete m_weapon;
-	delete m_diffuse;
-	delete m_diffuse_weapon;
+	m_device->release( m_diffuse );
+	m_device->release( m_diffuse_weapon );
 	delete m_window;
 	delete m_device;
