Index: /trunk/nv/gfx/skeleton_instance.hh
===================================================================
--- /trunk/nv/gfx/skeleton_instance.hh	(revision 482)
+++ /trunk/nv/gfx/skeleton_instance.hh	(revision 483)
@@ -84,4 +84,7 @@
 		const transform* transforms() const { return m_transforms.data(); }
 		size_t size() const { return m_transforms.size(); }
+		void assign( const data_node_list* node_data );
+		void assign( const skeleton_transforms& other );
+		void interpolate( const skeleton_transforms& a, const skeleton_transforms& b, float t );
 		void animate_local( const mesh_nodes_data* node_data, const skeleton_binding& binding, float frame );
 		void animate( const mesh_nodes_data* node_data, const skeleton_binding& binding, float frame, bool local = false )
Index: /trunk/nv/interface/scene_node.hh
===================================================================
--- /trunk/nv/interface/scene_node.hh	(revision 482)
+++ /trunk/nv/interface/scene_node.hh	(revision 483)
@@ -81,4 +81,5 @@
 		list::const_iterator begin() { return m_children.cbegin(); }
 		list::const_iterator end()   { return m_children.cend(); }
+		list& children() { return m_children; }
 
 		virtual ~scene_node()
Index: /trunk/src/gfx/skeleton_instance.cc
===================================================================
--- /trunk/src/gfx/skeleton_instance.cc	(revision 482)
+++ /trunk/src/gfx/skeleton_instance.cc	(revision 483)
@@ -60,4 +60,32 @@
 	if ( bones.size() != m_matrix.size() )
 		m_matrix.resize( bones.size() );
+}
+
+void nv::skeleton_transforms::assign( const data_node_list* node_data )
+{
+	NV_ASSERT( node_data, "!!!" );
+	if ( m_transforms.size() != node_data->size() )
+		m_transforms.resize( node_data->size() );
+	for ( uint32 n = 0; n < node_data->size(); ++n )
+	{
+		const data_node_info& info = (*node_data)[ n ];
+		m_transforms[n] = transform( info.transform );
+	}
+}
+
+void nv::skeleton_transforms::interpolate( const skeleton_transforms& a, const skeleton_transforms& b, float t )
+{
+	NV_ASSERT( a.size() == b.size(), "!!!" );
+	if ( m_transforms.size() != a.size() )
+		m_transforms.resize( a.size() );
+	for ( uint32 n = 0; n < a.size(); ++n )
+	{
+		m_transforms[n] = nv::interpolate( a.m_transforms[n], b.m_transforms[n], t );
+	}
+}
+
+void nv::skeleton_transforms::assign( const skeleton_transforms& other )
+{
+	m_transforms.assign( other.m_transforms );
 }
 
