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