From a246159fd894c487c13bfcf9d37243b75712b87a Mon Sep 17 00:00:00 2001 From: Shon Ferguson <shonferg@users.sourceforge.net> Date: Mon, 25 Sep 2006 23:22:39 +0000 Subject: [PATCH] Updated from XML, adding NiClodSkinInstance and fixing NiClodData. Niflib can now open all Freedom Force NIF files. --- include/gen/obj_defines.h | 31 +++++--- include/obj/NiClodSkinInstance.h | 48 ++++++++++++ niflib.vcproj | 8 ++ src/gen/obj_factories.cpp | 3 + src/gen/obj_impl.cpp | 126 ++++++++++++++++++++----------- src/obj/NiClodSkinInstance.cpp | 37 +++++++++ 6 files changed, 201 insertions(+), 52 deletions(-) create mode 100644 include/obj/NiClodSkinInstance.h create mode 100644 src/obj/NiClodSkinInstance.cpp diff --git a/include/gen/obj_defines.h b/include/gen/obj_defines.h index ad863b24..610eb652 100644 --- a/include/gen/obj_defines.h +++ b/include/gen/obj_defines.h @@ -185,6 +185,7 @@ ushort unknownShort2; \ Ref<NiObject > unknownLink; \ #define NI_TRI_BASED_GEOM_DATA_MEMBERS \ +ushort numTriangles; \ #define A_P_SYS_DATA_MEMBERS \ bool hasUnknownFloats1; \ @@ -1035,6 +1036,8 @@ NiNode * skeletonRoot; \ mutable uint numBones; \ vector<NiNode * > bones; \ +#define NI_CLOD_SKIN_INSTANCE_MEMBERS \ + #define NI_SKIN_PARTITION_MEMBERS \ mutable uint numSkinPartitionBlocks; \ vector<SkinPartition > skinPartitionBlocks; \ @@ -1154,7 +1157,6 @@ Ref<NiTransformData > data; \ #define NI_TRI_SHAPE_MEMBERS \ #define NI_TRI_SHAPE_DATA_MEMBERS \ -mutable ushort numTriangles; \ uint numTrianglePoints; \ bool hasTriangles; \ vector<Triangle > triangles; \ @@ -1164,7 +1166,6 @@ vector<MatchGroup > matchGroups; \ #define NI_TRI_STRIPS_MEMBERS \ #define NI_TRI_STRIPS_DATA_MEMBERS \ -ushort numTriangles; \ mutable ushort numStrips; \ mutable vector<ushort > stripLengths; \ bool hasPoints; \ @@ -1173,10 +1174,15 @@ vector< vector<ushort > > points; \ #define NI_CLOD_MEMBERS \ #define NI_CLOD_DATA_MEMBERS \ -array<5,ushort> unknown5Shorts; \ +ushort unknownShorts; \ +mutable ushort unknownCount1; \ +mutable ushort unknownCount2; \ +mutable ushort unknownCount3; \ float unknownFloat; \ -uint unknownInt; \ -array<44,ushort> unknownClodShorts; \ +ushort unknownShort; \ +vector< array<6,ushort> > unknownClodShorts1; \ +vector<ushort > unknownClodShorts2; \ +vector< array<6,ushort> > unknownClodShorts3; \ #define NI_U_V_CONTROLLER_MEMBERS \ ushort unknownShort; \ @@ -1402,6 +1408,7 @@ CompareMode function; \ #define NI_SHADE_PROPERTY_MEMBERS #define NI_SKIN_DATA_MEMBERS #define NI_SKIN_INSTANCE_MEMBERS +#define NI_CLOD_SKIN_INSTANCE_MEMBERS #define NI_SKIN_PARTITION_MEMBERS #define NI_SOURCE_TEXTURE_MEMBERS #define NI_SPECULAR_PROPERTY_MEMBERS @@ -1624,7 +1631,8 @@ CompareMode function; \ #define NI_TRI_BASED_GEOM_DATA_PARENT NiGeometryData -#define NI_TRI_BASED_GEOM_DATA_CONSTRUCT +#define NI_TRI_BASED_GEOM_DATA_CONSTRUCT : numTriangles((ushort)0) + #define A_P_SYS_DATA_INCLUDE "NiGeometryData.h" #define A_P_SYS_DATA_PARENT NiGeometryData @@ -2490,6 +2498,11 @@ CompareMode function; \ #define NI_SKIN_INSTANCE_CONSTRUCT : data(NULL), skinPartition(NULL), skeletonRoot(NULL), numBones((uint)0) +#define NI_CLOD_SKIN_INSTANCE_INCLUDE "NiSkinInstance.h" + +#define NI_CLOD_SKIN_INSTANCE_PARENT NiSkinInstance + +#define NI_CLOD_SKIN_INSTANCE_CONSTRUCT #define NI_SKIN_PARTITION_INCLUDE "NiObject.h" #define NI_SKIN_PARTITION_PARENT NiObject @@ -2592,7 +2605,7 @@ CompareMode function; \ #define NI_TRI_SHAPE_DATA_PARENT NiTriBasedGeomData -#define NI_TRI_SHAPE_DATA_CONSTRUCT : numTriangles((ushort)0), numTrianglePoints((uint)0), hasTriangles(false), numMatchGroups((ushort)0) +#define NI_TRI_SHAPE_DATA_CONSTRUCT : numTrianglePoints((uint)0), hasTriangles(false), numMatchGroups((ushort)0) #define NI_TRI_STRIPS_INCLUDE "NiTriBasedGeom.h" @@ -2603,7 +2616,7 @@ CompareMode function; \ #define NI_TRI_STRIPS_DATA_PARENT NiTriBasedGeomData -#define NI_TRI_STRIPS_DATA_CONSTRUCT : numTriangles((ushort)0), numStrips((ushort)0), hasPoints(false) +#define NI_TRI_STRIPS_DATA_CONSTRUCT : numStrips((ushort)0), hasPoints(false) #define NI_CLOD_INCLUDE "NiTriBasedGeom.h" @@ -2614,7 +2627,7 @@ CompareMode function; \ #define NI_CLOD_DATA_PARENT NiTriBasedGeomData -#define NI_CLOD_DATA_CONSTRUCT : unknownFloat(0.0f), unknownInt((uint)0) +#define NI_CLOD_DATA_CONSTRUCT : unknownShorts((ushort)0), unknownCount1((ushort)0), unknownCount2((ushort)0), unknownCount3((ushort)0), unknownFloat(0.0f), unknownShort((ushort)0) #define NI_U_V_CONTROLLER_INCLUDE "NiTimeController.h" diff --git a/include/obj/NiClodSkinInstance.h b/include/obj/NiClodSkinInstance.h new file mode 100644 index 00000000..0a7c8663 --- /dev/null +++ b/include/obj/NiClodSkinInstance.h @@ -0,0 +1,48 @@ +/* Copyright (c) 2006, NIF File Format Library and Tools +All rights reserved. Please see niflib.h for licence. */ + +#ifndef _NICLODSKININSTANCE_H_ +#define _NICLODSKININSTANCE_H_ + +#include "NiSkinInstance.h" +namespace Niflib { + + +#include "../gen/obj_defines.h" + +class NiClodSkinInstance; +typedef Ref<NiClodSkinInstance> NiClodSkinInstanceRef; + +/*! + * NiClodSkinInstance - A copy of NISkinInstance for use with NiClod + * meshes. + */ + +class NIFLIB_API NiClodSkinInstance : public NI_CLOD_SKIN_INSTANCE_PARENT { +public: + NiClodSkinInstance(); + ~NiClodSkinInstance(); + //Run-Time Type Information + static const Type & TypeConst() { return TYPE; } +private: + static const Type TYPE; +public: + virtual void Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version ); + virtual void Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const; + virtual string asString( bool verbose = false ) const; + virtual void FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ); + virtual list<NiObjectRef> GetRefs() const; + virtual const Type & GetType() const; + +protected: + NI_CLOD_SKIN_INSTANCE_MEMBERS +private: + void InternalRead( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version ); + void InternalWrite( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const; + string InternalAsString( bool verbose ) const; + void InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ); + list<NiObjectRef> InternalGetRefs() const; +}; + +} +#endif diff --git a/niflib.vcproj b/niflib.vcproj index 8e2619f4..a3ccfbd0 100644 --- a/niflib.vcproj +++ b/niflib.vcproj @@ -838,6 +838,10 @@ RelativePath=".\src\obj\NiClodData.cpp" > </File> + <File + RelativePath=".\src\obj\NiClodSkinInstance.cpp" + > + </File> <File RelativePath=".\src\obj\NiCollisionData.cpp" > @@ -1928,6 +1932,10 @@ RelativePath=".\include\obj\NiClodData.h" > </File> + <File + RelativePath=".\include\obj\NiClodSkinInstance.h" + > + </File> <File RelativePath=".\include\obj\NiCollisionData.h" > diff --git a/src/gen/obj_factories.cpp b/src/gen/obj_factories.cpp index bd1a7d9a..d652ab2d 100644 --- a/src/gen/obj_factories.cpp +++ b/src/gen/obj_factories.cpp @@ -309,6 +309,8 @@ NiObject * CreateNiShadeProperty() { return new NiShadeProperty; } NiObject * CreateNiSkinData() { return new NiSkinData; } #include "../../include/obj/NiSkinInstance.h" NiObject * CreateNiSkinInstance() { return new NiSkinInstance; } +#include "../../include/obj/NiClodSkinInstance.h" +NiObject * CreateNiClodSkinInstance() { return new NiClodSkinInstance; } #include "../../include/obj/NiSkinPartition.h" NiObject * CreateNiSkinPartition() { return new NiSkinPartition; } #include "../../include/obj/NiSourceTexture.h" @@ -527,6 +529,7 @@ void RegisterBlockFactories() { global_block_map["NiShadeProperty"] = CreateNiShadeProperty; global_block_map["NiSkinData"] = CreateNiSkinData; global_block_map["NiSkinInstance"] = CreateNiSkinInstance; + global_block_map["NiClodSkinInstance"] = CreateNiClodSkinInstance; global_block_map["NiSkinPartition"] = CreateNiSkinPartition; global_block_map["NiSourceTexture"] = CreateNiSourceTexture; global_block_map["NiSpecularProperty"] = CreateNiSpecularProperty; diff --git a/src/gen/obj_impl.cpp b/src/gen/obj_impl.cpp index b78a6194..febf4390 100644 --- a/src/gen/obj_impl.cpp +++ b/src/gen/obj_impl.cpp @@ -155,6 +155,7 @@ using namespace std; #include "../../include/obj/NiShadeProperty.h" #include "../../include/obj/NiSkinData.h" #include "../../include/obj/NiSkinInstance.h" +#include "../../include/obj/NiClodSkinInstance.h" #include "../../include/obj/NiSkinPartition.h" #include "../../include/obj/NiSourceTexture.h" #include "../../include/obj/NiSpecularProperty.h" @@ -1890,15 +1891,18 @@ std::list<NiObjectRef> NiGeometryData::InternalGetRefs() const { void NiTriBasedGeomData::InternalRead( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version ) { NiGeometryData::Read( in, link_stack, version, user_version ); + NifStream( numTriangles, in, version ); } void NiTriBasedGeomData::InternalWrite( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const { NiGeometryData::Write( out, link_map, version, user_version ); + NifStream( numTriangles, out, version ); } std::string NiTriBasedGeomData::InternalAsString( bool verbose ) const { stringstream out; out << NiGeometryData::asString(); + out << " Num Triangles: " << numTriangles << endl; return out.str(); } @@ -9875,6 +9879,30 @@ std::list<NiObjectRef> NiSkinInstance::InternalGetRefs() const { return refs; } +void NiClodSkinInstance::InternalRead( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version ) { + NiSkinInstance::Read( in, link_stack, version, user_version ); +} + +void NiClodSkinInstance::InternalWrite( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const { + NiSkinInstance::Write( out, link_map, version, user_version ); +} + +std::string NiClodSkinInstance::InternalAsString( bool verbose ) const { + stringstream out; + out << NiSkinInstance::asString(); + return out.str(); +} + +void NiClodSkinInstance::InternalFixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) { + NiSkinInstance::FixLinks( objects, link_stack, version, user_version ); +} + +std::list<NiObjectRef> NiClodSkinInstance::InternalGetRefs() const { + list<Ref<NiObject> > refs; + refs = NiSkinInstance::GetRefs(); + return refs; +} + void NiSkinPartition::InternalRead( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version ) { NiObject::Read( in, link_stack, version, user_version ); NifStream( numSkinPartitionBlocks, in, version ); @@ -11603,7 +11631,6 @@ std::list<NiObjectRef> NiTriShape::InternalGetRefs() const { void NiTriShapeData::InternalRead( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version ) { NiTriBasedGeomData::Read( in, link_stack, version, user_version ); - NifStream( numTriangles, in, version ); NifStream( numTrianglePoints, in, version ); if ( version >= 0x0A010000 ) { NifStream( hasTriangles, in, version ); @@ -11636,8 +11663,6 @@ void NiTriShapeData::InternalRead( istream& in, list<uint> & link_stack, unsigne void NiTriShapeData::InternalWrite( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const { NiTriBasedGeomData::Write( out, link_map, version, user_version ); numMatchGroups = ushort(matchGroups.size()); - numTriangles = ushort(triangles.size()); - NifStream( numTriangles, out, version ); NifStream( numTrianglePoints, out, version ); if ( version >= 0x0A010000 ) { NifStream( hasTriangles, out, version ); @@ -11668,8 +11693,6 @@ std::string NiTriShapeData::InternalAsString( bool verbose ) const { stringstream out; out << NiTriBasedGeomData::asString(); numMatchGroups = ushort(matchGroups.size()); - numTriangles = ushort(triangles.size()); - out << " Num Triangles: " << numTriangles << endl; out << " Num Triangle Points: " << numTrianglePoints << endl; out << " Has Triangles: " << hasTriangles << endl; for (uint i1 = 0; i1 < triangles.size(); i1++) { @@ -11730,7 +11753,6 @@ std::list<NiObjectRef> NiTriStrips::InternalGetRefs() const { void NiTriStripsData::InternalRead( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version ) { NiTriBasedGeomData::Read( in, link_stack, version, user_version ); - NifStream( numTriangles, in, version ); NifStream( numStrips, in, version ); stripLengths.resize(numStrips); for (uint i1 = 0; i1 < stripLengths.size(); i1++) { @@ -11766,7 +11788,6 @@ void NiTriStripsData::InternalWrite( ostream& out, map<NiObjectRef,uint> link_ma for (uint i1 = 0; i1 < points.size(); i1++) stripLengths[i1] = ushort(points[i1].size()); numStrips = ushort(stripLengths.size()); - NifStream( numTriangles, out, version ); NifStream( numStrips, out, version ); for (uint i1 = 0; i1 < stripLengths.size(); i1++) { NifStream( stripLengths[i1], out, version ); @@ -11798,7 +11819,6 @@ std::string NiTriStripsData::InternalAsString( bool verbose ) const { for (uint i1 = 0; i1 < points.size(); i1++) stripLengths[i1] = ushort(points[i1].size()); numStrips = ushort(stripLengths.size()); - out << " Num Triangles: " << numTriangles << endl; out << " Num Strips: " << numStrips << endl; for (uint i1 = 0; i1 < stripLengths.size(); i1++) { if ( !verbose && ( i1 > MAXARRAYDUMP ) ) { @@ -11856,48 +11876,52 @@ std::list<NiObjectRef> NiClod::InternalGetRefs() const { void NiClodData::InternalRead( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version ) { NiTriBasedGeomData::Read( in, link_stack, version, user_version ); - for (uint i1 = 0; i1 < 5; i1++) { - NifStream( unknown5Shorts[i1], in, version ); - }; + NifStream( unknownShorts, in, version ); + NifStream( unknownCount1, in, version ); + NifStream( unknownCount2, in, version ); + NifStream( unknownCount3, in, version ); NifStream( unknownFloat, in, version ); - NifStream( unknownInt, in, version ); - if ( (unknownInt == 9) ) { - for (uint i2 = 0; i2 < 44; i2++) { - NifStream( unknownClodShorts[i2], in, version ); + NifStream( unknownShort, in, version ); + unknownClodShorts1.resize(unknownCount1); + for (uint i1 = 0; i1 < unknownClodShorts1.size(); i1++) { + for (uint i2 = 0; i2 < 6; i2++) { + NifStream( unknownClodShorts1[i1][i2], in, version ); }; }; - if ( (unknownInt == 199) ) { - for (uint i2 = 0; i2 < 233; i2++) { - NifStream( unknownClodShorts[i2], in, version ); - }; + unknownClodShorts2.resize(unknownCount2); + for (uint i1 = 0; i1 < unknownClodShorts2.size(); i1++) { + NifStream( unknownClodShorts2[i1], in, version ); }; - if ( (unknownInt == 24) ) { - for (uint i2 = 0; i2 < 57; i2++) { - NifStream( unknownClodShorts[i2], in, version ); + unknownClodShorts3.resize(unknownCount3); + for (uint i1 = 0; i1 < unknownClodShorts3.size(); i1++) { + for (uint i2 = 0; i2 < 6; i2++) { + NifStream( unknownClodShorts3[i1][i2], in, version ); }; }; } void NiClodData::InternalWrite( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const { NiTriBasedGeomData::Write( out, link_map, version, user_version ); - for (uint i1 = 0; i1 < 5; i1++) { - NifStream( unknown5Shorts[i1], out, version ); - }; + unknownCount3 = ushort(unknownClodShorts3.size()); + unknownCount2 = ushort(unknownClodShorts2.size()); + unknownCount1 = ushort(unknownClodShorts1.size()); + NifStream( unknownShorts, out, version ); + NifStream( unknownCount1, out, version ); + NifStream( unknownCount2, out, version ); + NifStream( unknownCount3, out, version ); NifStream( unknownFloat, out, version ); - NifStream( unknownInt, out, version ); - if ( (unknownInt == 9) ) { - for (uint i2 = 0; i2 < 44; i2++) { - NifStream( unknownClodShorts[i2], out, version ); + NifStream( unknownShort, out, version ); + for (uint i1 = 0; i1 < unknownClodShorts1.size(); i1++) { + for (uint i2 = 0; i2 < 6; i2++) { + NifStream( unknownClodShorts1[i1][i2], out, version ); }; }; - if ( (unknownInt == 199) ) { - for (uint i2 = 0; i2 < 233; i2++) { - NifStream( unknownClodShorts[i2], out, version ); - }; + for (uint i1 = 0; i1 < unknownClodShorts2.size(); i1++) { + NifStream( unknownClodShorts2[i1], out, version ); }; - if ( (unknownInt == 24) ) { - for (uint i2 = 0; i2 < 57; i2++) { - NifStream( unknownClodShorts[i2], out, version ); + for (uint i1 = 0; i1 < unknownClodShorts3.size(); i1++) { + for (uint i2 = 0; i2 < 6; i2++) { + NifStream( unknownClodShorts3[i1][i2], out, version ); }; }; } @@ -11905,22 +11929,38 @@ void NiClodData::InternalWrite( ostream& out, map<NiObjectRef,uint> link_map, un std::string NiClodData::InternalAsString( bool verbose ) const { stringstream out; out << NiTriBasedGeomData::asString(); - for (uint i1 = 0; i1 < 5; i1++) { + unknownCount3 = ushort(unknownClodShorts3.size()); + unknownCount2 = ushort(unknownClodShorts2.size()); + unknownCount1 = ushort(unknownClodShorts1.size()); + out << " Unknown Shorts: " << unknownShorts << endl; + out << " Unknown Count 1: " << unknownCount1 << endl; + out << " Unknown Count 2: " << unknownCount2 << endl; + out << " Unknown Count 3: " << unknownCount3 << endl; + out << " Unknown Float: " << unknownFloat << endl; + out << " Unknown Short: " << unknownShort << endl; + for (uint i1 = 0; i1 < unknownClodShorts1.size(); i1++) { + for (uint i2 = 0; i2 < 6; i2++) { + if ( !verbose && ( i2 > MAXARRAYDUMP ) ) { + out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl; + break; + }; + out << " Unknown Clod Shorts 1[" << i1 << "][" << i2 << "]: " << unknownClodShorts1[i1][i2] << endl; + }; + }; + for (uint i1 = 0; i1 < unknownClodShorts2.size(); i1++) { if ( !verbose && ( i1 > MAXARRAYDUMP ) ) { out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl; break; }; - out << " Unknown 5 Shorts[" << i1 << "]: " << unknown5Shorts[i1] << endl; + out << " Unknown Clod Shorts 2[" << i1 << "]: " << unknownClodShorts2[i1] << endl; }; - out << " Unknown Float: " << unknownFloat << endl; - out << " Unknown Int: " << unknownInt << endl; - if ( (unknownInt == 9) ) { - for (uint i2 = 0; i2 < 44; i2++) { + for (uint i1 = 0; i1 < unknownClodShorts3.size(); i1++) { + for (uint i2 = 0; i2 < 6; i2++) { if ( !verbose && ( i2 > MAXARRAYDUMP ) ) { out << "<Data Truncated. Use verbose mode to see complete listing.>" << endl; break; }; - out << " Unknown Clod Shorts[" << i2 << "]: " << unknownClodShorts[i2] << endl; + out << " Unknown Clod Shorts 3[" << i1 << "][" << i2 << "]: " << unknownClodShorts3[i1][i2] << endl; }; }; return out.str(); diff --git a/src/obj/NiClodSkinInstance.cpp b/src/obj/NiClodSkinInstance.cpp new file mode 100644 index 00000000..59d23221 --- /dev/null +++ b/src/obj/NiClodSkinInstance.cpp @@ -0,0 +1,37 @@ +/* Copyright (c) 2006, NIF File Format Library and Tools +All rights reserved. Please see niflib.h for licence. */ + +#include "../../include/obj/NiClodSkinInstance.h" +using namespace Niflib; + +//Definition of TYPE constant +const Type NiClodSkinInstance::TYPE("NiClodSkinInstance", &NI_CLOD_SKIN_INSTANCE_PARENT::TypeConst() ); + +NiClodSkinInstance::NiClodSkinInstance() NI_CLOD_SKIN_INSTANCE_CONSTRUCT {} + +NiClodSkinInstance::~NiClodSkinInstance() {} + +void NiClodSkinInstance::Read( istream& in, list<uint> & link_stack, unsigned int version, unsigned int user_version ) { + InternalRead( in, link_stack, version, user_version ); +} + +void NiClodSkinInstance::Write( ostream& out, map<NiObjectRef,uint> link_map, unsigned int version, unsigned int user_version ) const { + InternalWrite( out, link_map, version, user_version ); +} + +string NiClodSkinInstance::asString( bool verbose ) const { + return InternalAsString( verbose ); +} + +void NiClodSkinInstance::FixLinks( const map<unsigned,NiObjectRef> & objects, list<uint> & link_stack, unsigned int version, unsigned int user_version ) { + InternalFixLinks( objects, link_stack, version, user_version ); +} + +list<NiObjectRef> NiClodSkinInstance::GetRefs() const { + return InternalGetRefs(); +} + +const Type & NiClodSkinInstance::GetType() const { + return TYPE; +}; + -- GitLab