diff --git a/NIF_Blocks.cpp b/NIF_Blocks.cpp index 74029b508b9667b7caa02f987d7fc1d93e930d1d..b91e2c3f7fdfac87367893cacd14290ae1d79456 100644 --- a/NIF_Blocks.cpp +++ b/NIF_Blocks.cpp @@ -3337,6 +3337,83 @@ string AKeyframeData::asString() const { return out.str(); } +/*********************************************************** + * NiPSysEmitterCtlrData methods + **********************************************************/ + +void NiPSysEmitterCtlrData::Read( istream& file, unsigned int version ) { + + //--Float Keys--// + uint numKeys = ReadUInt( file ); + + if (numKeys > 0) { + NifStream( f_key_type, file ); + float_keys.resize( numKeys ); + for ( uint i = 0; i < float_keys.size(); ++i ) { + NifStream( float_keys[i], file, f_key_type ); + } + } + + //--Byte Keys--// + numKeys = ReadUInt( file ); + + byte_keys.resize( numKeys ); + for ( uint i = 0; i < byte_keys.size(); ++i ) { + NifStream( byte_keys[i], file, LINEAR_KEY ); + } +} + +void NiPSysEmitterCtlrData::Write( ostream& file, unsigned int version ) const { + + //--Float Keys--// + WriteUInt( uint(float_keys.size()), file ); + + if (float_keys.size() > 0) { + NifStream( f_key_type, file ); + for ( uint i = 0; i < float_keys.size(); ++i ) { + NifStream( float_keys[i], file, f_key_type ); + } + } + + //--Byte Keys--// + WriteUInt( uint(byte_keys.size()), file ); + + for ( uint i = 0; i < byte_keys.size(); ++i ) { + NifStream( byte_keys[i], file, LINEAR_KEY ); + } +} + +string NiPSysEmitterCtlrData::asString() const { + stringstream out; + out.setf(ios::fixed, ios::floatfield); + out << setprecision(1); + + out << "Float Key Count: " << uint(float_keys.size()) << endl + << "Float Key Type: " << f_key_type << endl; + + if (verbose) { + vector< Key<float> >::const_iterator it; + for ( it = float_keys.begin(); it != float_keys.end(); ++it ) { + out << "Key Time: " << it->time << " Float Value: " << it->data << endl; + } + } else { + out << "<<Data Not Shown>>" << endl; + } + + out << "Byte Key Count: " << uint(byte_keys.size()) << endl; + + if (verbose) { + vector< Key<byte> >::const_iterator it; + for ( it = byte_keys.begin(); it != byte_keys.end(); ++it ) { + out << "Key Time: " << it->time << " Float Value: " << it->data << endl; + } + } else { + out << "<<Data Not Shown>>" << endl; + } + + return out.str(); +} + /*********************************************************** * NiBoolData methods **********************************************************/ diff --git a/NIF_Blocks.h b/NIF_Blocks.h index 6368624a9d7215c2845462d9b2aada31a93d2ef6..ce5dd561adb03b1a5c154e26ac83c5f1ec32134b 100644 --- a/NIF_Blocks.h +++ b/NIF_Blocks.h @@ -727,27 +727,6 @@ private: uint unkInt2; }; -/** - * NiPSysEmitterCtlrData - */ -class NiPSysEmitterCtlrData : public AData { -public: - NiPSysEmitterCtlrData() { - AddAttr( attr_int, "Unknown Int 1" ); - AddAttr( attr_int, "Unknown Int 2" ); - AddAttr( attr_int, "Unknown Int 3" ); - AddAttr( attr_float, "Unknown Float 1" ); - AddAttr( attr_int, "Unknown Int 4" ); - AddAttr( attr_int, "Unknown Int 5" ); - AddAttr( attr_byte, "Unknown Byte 1" ); - AddAttr( attr_float, "Unknown Float 2" ); - AddAttr( attr_byte, "Unknown Byte 2" ); - } - ~NiPSysEmitterCtlrData() {} - - string GetBlockType() const { return "NiPSysEmitterCtlrData"; } -}; - /** * NiMaterialProperty - material properties */ @@ -1750,6 +1729,24 @@ public: string GetBlockType() const { return "NiPSysSphereEmitter"; } }; +/** + * NiPSysEmitterCtlrData + */ +class NiPSysEmitterCtlrData : public AData { +public: + NiPSysEmitterCtlrData() {} + ~NiPSysEmitterCtlrData() {} + + string GetBlockType() const { return "NiPSysEmitterCtlrData"; } + void Read( istream& in, unsigned int version ); + void Write( ostream& out, unsigned int version ) const; + string asString() const; +private: + KeyType f_key_type; + vector< Key<float> > float_keys; + vector< Key<byte> > byte_keys; +}; + /** * AKeyframeData - */ @@ -2281,6 +2278,79 @@ public: }; +class NiBinaryExtraData : public AExtraData { +public: + NiBinaryExtraData() {} + ~NiBinaryExtraData() {} + string GetBlockType() const { return "NiBinaryExtraData"; }; + + void Read( istream& in, unsigned int version ) { + AExtraData::Read( in, version ); + + uint numBytes = ReadUInt( in ); + binData.resize( numBytes ); + NifStream( binData, in ); + + } + void Write( ostream& out, unsigned int version ) const { + AExtraData::Write( out, version ); + + WriteUInt( uint(binData.size()), out ); + NifStream( binData, out ); + } + + string asString() const { + stringstream out; + out.setf(ios::fixed, ios::floatfield); + out << setprecision(1); + + out << AExtraData::asString() + << "Binary Data (" << uint(binData.size()) << " bytes):" << endl; + + for ( uint i = 0; i < binData.size(); ++i ) { + out << " " << i << ": " << binData[i] << endl; + } + + return out.str(); + } +private: + vector<byte> binData; + +}; + +class NiVectorExtraData : public AExtraData { +public: + NiVectorExtraData() { + AddAttr( attr_vector3, "Vector Data" ); + AddAttr( attr_float, "Unknown Float" ); + } + ~NiVectorExtraData() {} + string GetBlockType() const { return "NiVectorExtraData"; }; + + void Read( istream& in, unsigned int version ) { + AExtraData::Read( in, version ); + GetAttr("Vector Data")->Read( in, version ); + GetAttr("Unknown Float")->Read( in, version ); + } + void Write( ostream& out, unsigned int version ) const { + GetAttr("Vector Data")->Write( out, version ); + GetAttr("Unknown Float")->Write( out, version ); + } + + string asString() const { + stringstream out; + out.setf(ios::fixed, ios::floatfield); + out << setprecision(1); + + out << AExtraData::asString() + << "Vector Data: " << GetAttr("Vector Data")->asString() << endl + << "Unknown Float: " << GetAttr("Unknown Float")->asString() << endl; + + return out.str(); + } + +}; + class NiColorExtraData : public AExtraData { public: NiColorExtraData() {} diff --git a/docsys_extract.cpp b/docsys_extract.cpp index 686466457b8af3726f473040ea945f065680e96c..7016ff0b842df98fdeedefdf6965a484fa421d46 100644 --- a/docsys_extract.cpp +++ b/docsys_extract.cpp @@ -863,6 +863,10 @@ IBlock * CreateNiBillboardNode() { return new NiBillboardNode; } +IBlock * CreateNiBinaryExtraData() { + return new NiBinaryExtraData; +} + IBlock * CreateNiBoneLODController() { return new NiBoneLODController; } @@ -1315,6 +1319,10 @@ IBlock * CreateNiUVData() { return new NiUVData; } +IBlock * CreateNiVectorExtraData() { + return new NiVectorExtraData; +} + IBlock * CreateNiVertexColorProperty() { return new NiVertexColorProperty; } @@ -1355,6 +1363,7 @@ void RegisterBlockFactories () { global_block_map["NiAutoNormalParticles"] = CreateNiAutoNormalParticles; global_block_map["NiAutoNormalParticlesData"] = CreateNiAutoNormalParticlesData; global_block_map["NiBillboardNode"] = CreateNiBillboardNode; + global_block_map["NiBinaryExtraData"] = CreateNiBinaryExtraData; global_block_map["NiBoneLODController"] = CreateNiBoneLODController; global_block_map["NiBoolData"] = CreateNiBoolData; global_block_map["NiBooleanExtraData"] = CreateNiBooleanExtraData; @@ -1468,6 +1477,7 @@ void RegisterBlockFactories () { global_block_map["NiTriStripsData"] = CreateNiTriStripsData; global_block_map["NiUVController"] = CreateNiUVController; global_block_map["NiUVData"] = CreateNiUVData; + global_block_map["NiVectorExtraData"] = CreateNiVectorExtraData; global_block_map["NiVertexColorProperty"] = CreateNiVertexColorProperty; global_block_map["NiVertWeightsExtraData"] = CreateNiVertWeightsExtraData; global_block_map["NiVisController"] = CreateNiVisController;