Skin文件即原来M2文件中的View部分,现在每一个View数据都单独保存在一个Skin文件中,这让M2文件变小了一些,当然了这点变化实际只是让View数据更加清晰,对于M2文件的大小影响实在么感觉,M2依然是那么大。这也么办法,M2文件定义的算比较通用,不论是什么模型,象人物,物品,武器,甚至天空等等,都使用M2来定义,这样每个M2都有相同的头部分,当然现在又都有了四个Skin文件,其大小是被模型自身的复杂度决定的。
下面是Skin文件结构解析的定义,同样采用了template方式定义,只是这次没有使用“特例化”模版,因为。。如果就一种类型,特个头,完全没事找事作。Template用过了头也是自找麻烦。
Skin结构解析定义
1 #ifndef __SKINSTRUCTURE_H__
2 #define __SKINSTRUCTURE_H__
3
4 #include <vector>
5
6 #include "DataTypes.h"
7 #include "FileBuffer.h"
8
9 namespace SKIN
10 {
11
12 enum StructType { ST_BASE, ST_HEADER, ST_INDEX, ST_TRIANGLE, ST_PROPERTY,
13 ST_SUBMESH, ST_TEXTURE};
14
15 class CBase
16 {
17 public:
18 CBase(StructType type) : m_eType(type) {}
19 virtual ~CBase() {}
20 public:
21 StructType m_eType;
22 };
23
24 class CHeader : public CBase
25 {
26 public:
27 CHeader() : CBase(ST_HEADER) {}
28 virtual ~CHeader() {}
29
30 int Read(CFileBuffer& fb)
31 {
32 return m_stHeader.Read(fb);
33 }
34 public:
35 Header_t m_stHeader;
36 };
37
38 template<StructType ST, typename T>
39 class CSubStruct : public CBase
40 {
41 public:
42 typedef std::vector<T> TVector;
43 public:
44 CSubStruct() : CBase(ST) {}
45 virtual ~CSubStruct() {}
46
47 int Read(CFileBuffer& fb, unsigned int offset, unsigned int size)
48 {
49 T data;
50 fb.Seek(offset);
51 for(unsigned int i = 0; i < size; ++ i)
52 {
53 data.Read(fb);
54 m_vct.push_back(data);
55 }
56 return fb.Good() ? 0 : -1;
57 }
58 public:
59 TVector m_vct;
60 };
61
62 typedef CHeader THeader;
63 typedef CSubStruct<ST_INDEX, UInt16_t> TIndex;
64 typedef CSubStruct<ST_TRIANGLE, UInt16_t> TTriangle;
65 typedef CSubStruct<ST_PROPERTY, UInt32_t> TProperty;
66 typedef CSubStruct<ST_SUBMESH, SubMesh_t> TSubMesh;
67 typedef CSubStruct<ST_TEXTURE, Texture_t> TTexture;
68
69
70 }//skin
71
72 #endif
73
74 这里是M2文件结构解析的部分定义,让大家看看对ST_HEADER和ST_NAME的两个类型的“特例化”定义是不是没事找事...
M2文件结构解析定义
1 template<>
2 class CSubStruct<ST_HEADER, Header_t> : public CBase
3 {
4 public:
5 CSubStruct() : CBase(ST_HEADER) {}
6 virtual ~CSubStruct() {}
7
8 int Read(CFileBuffer& fb)
9 {
10 return m_stHeader.Read(fb);
11 }
12 public:
13 Header_t m_stHeader;
14 };
15
16 template<>
17 class CSubStruct<ST_NAME, std::string> : public CBase
18 {
19 public:
20 CSubStruct() : CBase(ST_NAME) {}
21 virtual ~CSubStruct() {}
22
23 int Read(CFileBuffer& fb, unsigned int offset, unsigned int size)
24 {
25 fb.Seek(offset);
26 return fb.Read(m_strName);
27 }
28 public:
29 std::string m_strName;
30 };
31
32 typedef CSubStruct<ST_HEADER, Header_t> THeader;
33 typedef CSubStruct<ST_NAME, std::string> TName;