From 726619cf1ae045f7a7ae12ee29c5674c34fc5431 Mon Sep 17 00:00:00 2001
From: Shon Ferguson <shonferg@users.sourceforge.net>
Date: Sun, 16 Oct 2005 05:31:16 +0000
Subject: [PATCH] Finished support for NiTextKeyExtraData.

---
 NIF_Blocks.cpp | 24 ++++++++++++------------
 NIF_Blocks.h   | 18 +++++++++++++++---
 niflib.cpp     | 12 ++++++++----
 niflib.h       | 19 +++++++++++++++----
 4 files changed, 50 insertions(+), 23 deletions(-)

diff --git a/NIF_Blocks.cpp b/NIF_Blocks.cpp
index 77ca145f..7dee27bb 100644
--- a/NIF_Blocks.cpp
+++ b/NIF_Blocks.cpp
@@ -2124,10 +2124,10 @@ void NiTextKeyExtraData::Read( ifstream& in ) {
 
 	uint keyCount = ReadUInt( in );
 
-	keys.resize(keyCount);
-	for (uint i = 0; i < keys.size(); ++i ) {
-		keys[i].time = ReadFloat( in );
-		keys[i].data = ReadString( in );
+	_keys.resize(keyCount);
+	for (uint i = 0; i < _keys.size(); ++i ) {
+		_keys[i].time = ReadFloat( in );
+		_keys[i].data = ReadString( in );
 	}
 }
 
@@ -2138,11 +2138,11 @@ void NiTextKeyExtraData::Write( ofstream& out ) {
 	GetAttr("Next Extra Data")->Write( out );
 	GetAttr("Unknown Int")->Write( out );
 
-	WriteUInt( uint(keys.size()), out );
+	WriteUInt( uint(_keys.size()), out );
 
-	for (uint i = 0; i < keys.size(); ++i ) {
-		WriteFloat( keys[i].time, out );
-		WriteString( keys[i].data, out );
+	for (uint i = 0; i < _keys.size(); ++i ) {
+		WriteFloat( _keys[i].time, out );
+		WriteString( _keys[i].data, out );
 	}
 }
 
@@ -2153,12 +2153,12 @@ string NiTextKeyExtraData::asString() {
 
 	out << "Next Extra Data:  " <<  GetAttr("Next Extra Data")->asLink() << endl
 		<< "Unknown Int (Key Type?):  " << GetAttr("Unknown Int")->asInt() << endl
-		<< "Key Count:  " << uint(keys.size()) << endl;
+		<< "Key Count:  " << uint(_keys.size()) << endl;
 
 	if (verbose) {
-		for (uint i = 0; i < keys.size(); ++i ) {
-			out << "Key Time:  " << keys[i].time << endl
-				<< "Key Text:  " << keys[i].data << endl;
+		for (uint i = 0; i < _keys.size(); ++i ) {
+			out << "Key Time:  " << _keys[i].time << endl
+				<< "Key Text:  " << _keys[i].data << endl;
 		}
 	} else {
 		out << "<<Data Not Shown>>" << endl;
diff --git a/NIF_Blocks.h b/NIF_Blocks.h
index c2eca2dd..dd414443 100644
--- a/NIF_Blocks.h
+++ b/NIF_Blocks.h
@@ -1197,12 +1197,12 @@ class NiRotatingParticlesData : public ABlock{
 
 };
 
-class NiTextKeyExtraData : public AExtraData{
+class NiTextKeyExtraData : public AExtraData, public ITextKeyExtraData {
 
 	public:
 
 		NiTextKeyExtraData(){
-			AddAttr( "int", "Unknown Int" );	
+			AddAttr( "int", "Unknown Int" );
 		}
 		~NiTextKeyExtraData(){}
 
@@ -1211,8 +1211,20 @@ class NiTextKeyExtraData : public AExtraData{
 		string asString();
 		string GetBlockType() { return "NiTextKeyExtraData"; }
 
+		void * QueryInterface( int id ) {
+			if ( id == TextKeyExtraData ) {
+				return (void*)static_cast<ITextKeyExtraData*>(this);;
+			} else {
+				return AExtraData::QueryInterface( id );
+			}
+		}
+
+		//--ITextKeyExtraData Functions--//
+		virtual vector< Key<string> > GetRotateKeys() { return _keys; }
+		virtual void SetRotateKeys( vector< Key<string> > & keys ) { _keys = keys; }
+
 	private:
-		vector< Key<string> > keys;
+		vector< Key<string> > _keys;
 };
 
 class NiUVData : public ABlock{
diff --git a/niflib.cpp b/niflib.cpp
index ea3b2799..7a96c9c6 100644
--- a/niflib.cpp
+++ b/niflib.cpp
@@ -467,18 +467,22 @@ attr_ref::operator Texture() { return _attr->asTexture(); }
 
 //--Query Functions--//
 
-ITriShapeData * QueryTriShapeData( blk_ref block ) {
+ITriShapeData * QueryTriShapeData( blk_ref & block ) {
 	return (ITriShapeData*)block->QueryInterface( TriShapeData );
 }
 
-ISkinData * QuerySkinData( blk_ref block ) {
+ISkinData * QuerySkinData( blk_ref & block ) {
 	return (ISkinData*)block->QueryInterface( SkinData );
 }
 
-INode * QueryNode( blk_ref block ) {
+INode * QueryNode( blk_ref & block ) {
 	return (INode*)block->QueryInterface( Node );
 }
 
-IKeyframeData * QueryKeyframeData( blk_ref block ) {
+IKeyframeData * QueryKeyframeData( blk_ref & block ) {
 	return (IKeyframeData*)block->QueryInterface( KeyframeData );
 }
+
+ITextKeyExtraData * QueryTextKeyExtraData ( blk_ref & block ) {
+	return (ITextKeyExtraData*)block->QueryInterface( TextKeyExtraData );
+}
diff --git a/niflib.h b/niflib.h
index 168ccbe1..cb477d83 100644
--- a/niflib.h
+++ b/niflib.h
@@ -55,6 +55,7 @@ class IBlock;
 class ITriShapeData;
 class ISkinData;
 class IKeyframeData;
+class ITextKeyExtraData;
 class INode;
 class blk_ref;
 class attr_ref;
@@ -73,6 +74,7 @@ const int TriShapeData = 0;
 const int SkinData = 1;
 const int Node = 2;
 const int KeyframeData = 3;
+const int TextKeyExtraData = 4;
 
 //--Main Functions--//
 
@@ -99,10 +101,11 @@ unsigned int BlocksInMemory();
 
 //--Query Functions--//
 // These are shorthands for using QueryInterface, and required for scripting languages
-ITriShapeData * QueryTriShapeData( blk_ref block );
-ISkinData * QuerySkinData( blk_ref block );
-INode * QueryNode( blk_ref block );
-IKeyframeData * QueryKeyframeData( blk_ref block );
+ITriShapeData * QueryTriShapeData( blk_ref & block );
+ISkinData * QuerySkinData( blk_ref & block );
+INode * QueryNode( blk_ref & block );
+IKeyframeData * QueryKeyframeData( blk_ref & block );
+ITextKeyExtraData * QueryTextKeyExtraData ( blk_ref & block );
 
 //--TypeDefs--//
 
@@ -285,6 +288,14 @@ public:
 	virtual void SetScaleKeys( vector< Key<float> > & keys ) = 0;
 };
 
+class ITextKeyExtraData {
+public:
+	ITextKeyExtraData() {}
+	virtual ~ITextKeyExtraData () {}
+	virtual vector< Key<string> > GetRotateKeys() = 0;
+	virtual void SetRotateKeys( vector< Key<string> > & keys ) = 0;
+};
+
 //--Attribute Reference--//
 class attr_ref {
 public:
-- 
GitLab