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