??? 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;