Started adding animation.
diff --git a/Source/Actor.cpp b/Source/Actor.cpp
index d3baae5..0cacdf6 100644
--- a/Source/Actor.cpp
+++ b/Source/Actor.cpp
@@ -1,6 +1,7 @@
 #include "Actor.hpp"
 #include "ActorBone.hpp"
 #include "ActorRootBone.hpp"
+#include "ActorIKTarget.hpp"
 #include "BinaryReader.hpp"
 #include "BlockReader.hpp"
 #include "Exceptions/OverflowException.hpp"
@@ -64,7 +65,7 @@
 				actor->readNodesBlock(block);
 				break;
 			case BlockReader::Animations:
-				printf("GOT ANIMATIONS\n");
+				actor->readAnimationsBlock(block);
 				break;
 			default:
 				break;
@@ -99,6 +100,12 @@
 	}
 }
 
+void Actor::readAnimationsBlock(BlockReader* block)
+{
+	//int animationCount = (int)block->readUnsignedShort();
+
+}
+
 void Actor::readNodesBlock(BlockReader* block)
 {
 	m_NodeCount = block->readUnsignedShort()+1;
@@ -134,6 +141,7 @@
 			}
 			case BlockReader::ActorIKTarget:
 				m_SolverNodeCount++;
+				node = ActorIKTarget::read(this, nodeBlock);
 				break;
 
 			default:
diff --git a/Source/Actor.hpp b/Source/Actor.hpp
index 8ec0392..0cbb79a 100644
--- a/Source/Actor.hpp
+++ b/Source/Actor.hpp
@@ -19,6 +19,7 @@
 			ActorNode** m_Nodes;
 			ActorNode* m_Root;
 			void readNodesBlock(BlockReader* block);
+			void readAnimationsBlock(BlockReader* block);
 		
 		protected:
 			int m_MaxTextureIndex;
diff --git a/Source/ActorNode.cpp b/Source/ActorNode.cpp
index 0668209..2871df5 100644
--- a/Source/ActorNode.cpp
+++ b/Source/ActorNode.cpp
@@ -71,7 +71,7 @@
 	return m_Actor;
 }
 
-const std::string& ActorNode::name()
+const std::string& ActorNode::name() const
 {
 	return m_Name;
 }
diff --git a/Source/ActorNode.hpp b/Source/ActorNode.hpp
index 0b8b227..f5895d1 100644
--- a/Source/ActorNode.hpp
+++ b/Source/ActorNode.hpp
@@ -65,7 +65,7 @@
 			bool isWorldDirty() const;
 			bool isDirty() const;
 			Actor* actor();
-			const std::string& name();
+			const std::string& name() const;
 			const Mat2D& transform();
 			const Mat2D& worldTransform();
 			void overrideWorldTransform(const Mat2D& transform);
diff --git a/Source/Animation/ActorAnimation.cpp b/Source/Animation/ActorAnimation.cpp
new file mode 100644
index 0000000..9956b60
--- /dev/null
+++ b/Source/Animation/ActorAnimation.cpp
@@ -0,0 +1,26 @@
+#include "ActorAnimation.hpp"
+#include "../BlockReader.hpp"
+
+using namespace nima;
+
+const std::string& ActorAnimation::name() const
+{
+	return m_Name;
+}
+
+float ActorAnimation::duration() const
+{
+	return m_Duration;
+}
+
+ActorAnimation* ActorAnimation::read(BlockReader* reader, ActorNode** nodes)
+{
+	ActorAnimation* animation = new ActorAnimation();
+	animation->m_Name = reader->readString();
+	animation->m_FPS = (int)reader->readByte();
+	animation->m_Duration = reader->readFloat();
+	animation->m_IsLooping = reader->readByte() != 0;
+
+	//int numKeyedNodes = (int)reader->readUnsignedShort();
+	return animation;
+}
\ No newline at end of file
diff --git a/Source/Animation/ActorAnimation.hpp b/Source/Animation/ActorAnimation.hpp
new file mode 100644
index 0000000..44d061a
--- /dev/null
+++ b/Source/Animation/ActorAnimation.hpp
@@ -0,0 +1,28 @@
+#ifndef _NIMA_ACTORANIMATION_HPP_
+#define _NIMA_ACTORANIMATION_HPP_
+
+#include <string>
+
+namespace nima
+{
+	class BlockReader;
+	class ActorNode;
+	
+	class ActorAnimation
+	{
+		private:
+			std::string m_Name;
+			int m_FPS;
+			float m_Duration;
+			bool m_IsLooping;
+			//NodeAnimation[] m_AnimatedNodes;
+
+		public:
+			const std::string& name() const;
+			float duration() const;
+
+			static ActorAnimation* read(BlockReader* reader, ActorNode** nodes);
+
+	};
+}
+#endif
\ No newline at end of file
diff --git a/Source/Animation/KeyFrame.cpp b/Source/Animation/KeyFrame.cpp
new file mode 100644
index 0000000..cee7d6f
--- /dev/null
+++ b/Source/Animation/KeyFrame.cpp
@@ -0,0 +1,15 @@
+#include "KeyFrame.hpp"
+#include "../BlockReader.hpp"
+
+using namespace nima;
+
+float KeyFrame::time() const
+{
+	return m_Time;
+}
+
+bool KeyFrame::read(BlockReader* reader, KeyFrame* frame)
+{
+	frame->m_Time = (float)reader->readDouble();
+	return true;
+}
\ No newline at end of file
diff --git a/Source/Animation/KeyFrame.hpp b/Source/Animation/KeyFrame.hpp
new file mode 100644
index 0000000..bf04bf6
--- /dev/null
+++ b/Source/Animation/KeyFrame.hpp
@@ -0,0 +1,34 @@
+#ifndef _NIMA_KEYFRAME_HPP_
+#define _NIMA_KEYFRAME_HPP_
+
+namespace nima
+{
+	class BlockReader;
+	class ActorNode;
+	
+	class KeyFrame
+	{
+		public:
+			enum InterpolationTypes
+			{
+				Hold = 0,
+				Linear = 1,
+				Mirrored = 2,
+				Asymmetric = 3,
+				Disconnected = 4,
+				Progression = 5
+			};
+
+		protected:
+			float m_Time;
+		public:
+			float time() const;
+
+			static bool read(BlockReader* reader, KeyFrame* frame);
+
+			virtual void setNext(KeyFrame* frame) = 0;
+			virtual void applyInterpolation(ActorNode* node, float time, KeyFrame* toFrame, float mix) = 0;
+			virtual void apply(ActorNode* node, float mix) = 0;
+	};
+}
+#endif
\ No newline at end of file
diff --git a/Source/BinaryReader.cpp b/Source/BinaryReader.cpp
index 82ba906..44d892a 100644
--- a/Source/BinaryReader.cpp
+++ b/Source/BinaryReader.cpp
@@ -145,7 +145,27 @@
 	}
 	return *reinterpret_cast<float*>(bytes);
 
-	return 0;
+	return 0.0f;
+
+}
+
+double BinaryReader::readDouble()
+{
+	if(m_DataPosition+8 > m_DataLength)
+	{
+		throw OverflowException("Attempt to read past end of data in BinaryReader::readDouble.");
+	}
+	unsigned char* bytes = &m_Data[m_DataPosition];
+	m_DataPosition += 8;
+
+	if(m_SwapEndianness)
+	{
+		unsigned char sbytes[8] = { bytes[7], bytes[6], bytes[5], bytes[4], bytes[3], bytes[2], bytes[1], bytes[0] };
+		return *reinterpret_cast<double*>(sbytes);
+	}
+	return *reinterpret_cast<double*>(bytes);
+
+	return 0.0;
 
 }
 
diff --git a/Source/BinaryReader.hpp b/Source/BinaryReader.hpp
index 13accd8..2d63103 100644
--- a/Source/BinaryReader.hpp
+++ b/Source/BinaryReader.hpp
@@ -30,6 +30,7 @@
 			int readInt();
 			unsigned int readUnsignedInt();
 			float readFloat();
+			double readDouble();
 			short readShort();
 			unsigned short readUnsignedShort();
 			std::string readString();