00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include "KeosMD2Loader.h"
00022 #include "KeosRenderSystem.h"
00023 #include "KeosLogger.h"
00024 #include <fstream>
00025
00026 namespace Keos
00027 {
00028
00029
00030
00031
00032
00033 CMesh* CMD2Loader::LoadFromFile(const String& strFilename)
00034 {
00035
00036 std::ifstream File(strFilename.c_str(), std::ios_base::binary);
00037
00038 ILogger::Log("Load of the mesh : %s", strFilename.c_str());
00039
00040
00041 THeader Header;
00042 File.read(reinterpret_cast<char*>(&Header), sizeof(Header));
00043
00044
00045 if (Header.Ident != ms_nMagicId)
00046 LOADINGFAILED_EXCEPT(strFilename, "The file is not a valid model MD2 !", "CMD2Loader::LoadFromFile");
00047
00048
00049 if (Header.Version != ms_nMD2Version)
00050 LOADINGFAILED_EXCEPT(strFilename, "The file is not a valid model MD2 !", "CMD2Loader::LoadFromFile");
00051
00052
00053 std::vector<TTexture> Textures(Header.NbTextures);
00054 std::vector<TTexCoord> TexCoords(Header.NbTexCoords);
00055 std::vector<TTriangle> Triangles(Header.NbTriangles);
00056 std::vector<TFrame> Frames(Header.NbFrames);
00057
00058
00059 File.seekg(Header.OffsetTextures, std::ios_base::beg);
00060 File.read(reinterpret_cast<char*>(&Textures[0]), sizeof(TTexture) * Header.NbTextures);
00061
00062
00063 File.seekg(Header.OffsetTexCoords, std::ios_base::beg);
00064 File.read(reinterpret_cast<char*>(&TexCoords[0]), sizeof(TTexCoord) * Header.NbTexCoords);
00065
00066
00067 File.seekg(Header.OffsetTriangles, std::ios_base::beg);
00068 File.read(reinterpret_cast<char*>(&Triangles[0]), sizeof(TTriangle) * Header.NbTriangles);
00069
00070
00071 File.seekg(Header.OffsetFrames, std::ios_base::beg);
00072 Frames[0].Vertices.resize(Header.NbVertices);
00073 File.read(reinterpret_cast<char*>(&Frames[0].Scale), sizeof(Frames[0].Scale));
00074 File.read(reinterpret_cast<char*>(&Frames[0].Translate), sizeof(Frames[0].Translate));
00075 File.read(reinterpret_cast<char*>(&Frames[0].Name), sizeof(Frames[0].Name));
00076 File.read(reinterpret_cast<char*>(&Frames[0].Vertices[0]), sizeof(TPoint) * Header.NbVertices);
00077
00078
00079 std::vector<CMeshGeom::TVertex> Vertices;
00080 std::vector<CMeshGeom::TIndex> Indices;
00081 for (int i = 0; i < Header.NbTriangles; ++i)
00082 {
00083 for (int j = 0; j < 3; ++j)
00084 {
00085
00086 CMeshGeom::TVertex v;
00087 const TPoint& Vert = Frames[0].Vertices[Triangles[i].Vertices[j]];
00088 const TTexCoord& TexC = TexCoords[Triangles[i].TexCoords[j]];
00089
00090
00091 v.Position.x = Vert.x * Frames[0].Scale.x + Frames[0].Translate.x;
00092 v.Position.y = Vert.y * Frames[0].Scale.y + Frames[0].Translate.y;
00093 v.Position.z = Vert.z * Frames[0].Scale.z + Frames[0].Translate.z;
00094 v.Normal = ms_NormalTable[Vert.n];
00095 v.Color = Renderer->ConvertColor(CColor::White);
00096 v.TexCoords.x = TexC.u / static_cast<float>(Header.TexWidth);
00097 v.TexCoords.y = TexC.v / static_cast<float>(Header.TexHeight);
00098
00099
00100 Vertices.push_back(v);
00101 Indices.push_back(i * 3 + 2 - j);
00102 }
00103 }
00104
00105
00106 CMesh *pMesh = new CMesh();
00107 CMeshGeom *pMeshGeom = new CMeshGeom(&Vertices[0], (int)Vertices.size(), &Indices[0], (int)Indices.size());
00108 pMesh->AddMeshGeom(pMeshGeom);
00109
00110
00111 CMaterial* pMaterial = new CMaterial();
00112 if (Header.NbTextures >= 1)
00113 pMaterial->CreateTexture(Textures[0].Name);
00114
00115
00116 pMesh->AddMaterial(pMaterial, 0);
00117
00118 return pMesh;
00119 }
00120
00121
00122
00123 const TVector3F CMD2Loader::ms_NormalTable[] =
00124 {
00125 TVector3F(-0.525731f, 0.000000f, 0.850651f),
00126 TVector3F(-0.442863f, 0.238856f, 0.864188f),
00127 TVector3F(-0.295242f, 0.000000f, 0.955423f),
00128 TVector3F(-0.309017f, 0.500000f, 0.809017f),
00129 TVector3F(-0.162460f, 0.262866f, 0.951056f),
00130 TVector3F( 0.000000f, 0.000000f, 1.000000f),
00131 TVector3F( 0.000000f, 0.850651f, 0.525731f),
00132 TVector3F(-0.147621f, 0.716567f, 0.681718f),
00133 TVector3F( 0.147621f, 0.716567f, 0.681718f),
00134 TVector3F( 0.000000f, 0.525731f, 0.850651f),
00135 TVector3F( 0.309017f, 0.500000f, 0.809017f),
00136 TVector3F( 0.525731f, 0.000000f, 0.850651f),
00137 TVector3F( 0.295242f, 0.000000f, 0.955423f),
00138 TVector3F( 0.442863f, 0.238856f, 0.864188f),
00139 TVector3F( 0.162460f, 0.262866f, 0.951056f),
00140 TVector3F(-0.681718f, 0.147621f, 0.716567f),
00141 TVector3F(-0.809017f, 0.309017f, 0.500000f),
00142 TVector3F(-0.587785f, 0.425325f, 0.688191f),
00143 TVector3F(-0.850651f, 0.525731f, 0.000000f),
00144 TVector3F(-0.864188f, 0.442863f, 0.238856f),
00145 TVector3F(-0.716567f, 0.681718f, 0.147621f),
00146 TVector3F(-0.688191f, 0.587785f, 0.425325f),
00147 TVector3F(-0.500000f, 0.809017f, 0.309017f),
00148 TVector3F(-0.238856f, 0.864188f, 0.442863f),
00149 TVector3F(-0.425325f, 0.688191f, 0.587785f),
00150 TVector3F(-0.716567f, 0.681718f, -0.147621f),
00151 TVector3F(-0.500000f, 0.809017f, -0.309017f),
00152 TVector3F(-0.525731f, 0.850651f, 0.000000f),
00153 TVector3F( 0.000000f, 0.850651f, -0.525731f),
00154 TVector3F(-0.238856f, 0.864188f, -0.442863f),
00155 TVector3F( 0.000000f, 0.955423f, -0.295242f),
00156 TVector3F(-0.262866f, 0.951056f, -0.162460f),
00157 TVector3F( 0.000000f, 1.000000f, 0.000000f),
00158 TVector3F( 0.000000f, 0.955423f, 0.295242f),
00159 TVector3F(-0.262866f, 0.951056f, 0.162460f),
00160 TVector3F( 0.238856f, 0.864188f, 0.442863f),
00161 TVector3F( 0.262866f, 0.951056f, 0.162460f),
00162 TVector3F( 0.500000f, 0.809017f, 0.309017f),
00163 TVector3F( 0.238856f, 0.864188f, -0.442863f),
00164 TVector3F( 0.262866f, 0.951056f, -0.162460f),
00165 TVector3F( 0.500000f, 0.809017f, -0.309017f),
00166 TVector3F( 0.850651f, 0.525731f, 0.000000f),
00167 TVector3F( 0.716567f, 0.681718f, 0.147621f),
00168 TVector3F( 0.716567f, 0.681718f, -0.147621f),
00169 TVector3F( 0.525731f, 0.850651f, 0.000000f),
00170 TVector3F( 0.425325f, 0.688191f, 0.587785f),
00171 TVector3F( 0.864188f, 0.442863f, 0.238856f),
00172 TVector3F( 0.688191f, 0.587785f, 0.425325f),
00173 TVector3F( 0.809017f, 0.309017f, 0.500000f),
00174 TVector3F( 0.681718f, 0.147621f, 0.716567f),
00175 TVector3F( 0.587785f, 0.425325f, 0.688191f),
00176 TVector3F( 0.955423f, 0.295242f, 0.000000f),
00177 TVector3F( 1.000000f, 0.000000f, 0.000000f),
00178 TVector3F( 0.951056f, 0.162460f, 0.262866f),
00179 TVector3F( 0.850651f, -0.525731f, 0.000000f),
00180 TVector3F( 0.955423f, -0.295242f, 0.000000f),
00181 TVector3F( 0.864188f, -0.442863f, 0.238856f),
00182 TVector3F( 0.951056f, -0.162460f, 0.262866f),
00183 TVector3F( 0.809017f, -0.309017f, 0.500000f),
00184 TVector3F( 0.681718f, -0.147621f, 0.716567f),
00185 TVector3F( 0.850651f, 0.000000f, 0.525731f),
00186 TVector3F( 0.864188f, 0.442863f, -0.238856f),
00187 TVector3F( 0.809017f, 0.309017f, -0.500000f),
00188 TVector3F( 0.951056f, 0.162460f, -0.262866f),
00189 TVector3F( 0.525731f, 0.000000f, -0.850651f),
00190 TVector3F( 0.681718f, 0.147621f, -0.716567f),
00191 TVector3F( 0.681718f, -0.147621f, -0.716567f),
00192 TVector3F( 0.850651f, 0.000000f, -0.525731f),
00193 TVector3F( 0.809017f, -0.309017f, -0.500000f),
00194 TVector3F( 0.864188f, -0.442863f, -0.238856f),
00195 TVector3F( 0.951056f, -0.162460f, -0.262866f),
00196 TVector3F( 0.147621f, 0.716567f, -0.681718f),
00197 TVector3F( 0.309017f, 0.500000f, -0.809017f),
00198 TVector3F( 0.425325f, 0.688191f, -0.587785f),
00199 TVector3F( 0.442863f, 0.238856f, -0.864188f),
00200 TVector3F( 0.587785f, 0.425325f, -0.688191f),
00201 TVector3F( 0.688191f, 0.587785f, -0.425325f),
00202 TVector3F(-0.147621f, 0.716567f, -0.681718f),
00203 TVector3F(-0.309017f, 0.500000f, -0.809017f),
00204 TVector3F( 0.000000f, 0.525731f, -0.850651f),
00205 TVector3F(-0.525731f, 0.000000f, -0.850651f),
00206 TVector3F(-0.442863f, 0.238856f, -0.864188f),
00207 TVector3F(-0.295242f, 0.000000f, -0.955423f),
00208 TVector3F(-0.162460f, 0.262866f, -0.951056f),
00209 TVector3F( 0.000000f, 0.000000f, -1.000000f),
00210 TVector3F( 0.295242f, 0.000000f, -0.955423f),
00211 TVector3F( 0.162460f, 0.262866f, -0.951056f),
00212 TVector3F(-0.442863f, -0.238856f, -0.864188f),
00213 TVector3F(-0.309017f, -0.500000f, -0.809017f),
00214 TVector3F(-0.162460f, -0.262866f, -0.951056f),
00215 TVector3F( 0.000000f, -0.850651f, -0.525731f),
00216 TVector3F(-0.147621f, -0.716567f, -0.681718f),
00217 TVector3F( 0.147621f, -0.716567f, -0.681718f),
00218 TVector3F( 0.000000f, -0.525731f, -0.850651f),
00219 TVector3F( 0.309017f, -0.500000f, -0.809017f),
00220 TVector3F( 0.442863f, -0.238856f, -0.864188f),
00221 TVector3F( 0.162460f, -0.262866f, -0.951056f),
00222 TVector3F( 0.238856f, -0.864188f, -0.442863f),
00223 TVector3F( 0.500000f, -0.809017f, -0.309017f),
00224 TVector3F( 0.425325f, -0.688191f, -0.587785f),
00225 TVector3F( 0.716567f, -0.681718f, -0.147621f),
00226 TVector3F( 0.688191f, -0.587785f, -0.425325f),
00227 TVector3F( 0.587785f, -0.425325f, -0.688191f),
00228 TVector3F( 0.000000f, -0.955423f, -0.295242f),
00229 TVector3F( 0.000000f, -1.000000f, 0.000000f),
00230 TVector3F( 0.262866f, -0.951056f, -0.162460f),
00231 TVector3F( 0.000000f, -0.850651f, 0.525731f),
00232 TVector3F( 0.000000f, -0.955423f, 0.295242f),
00233 TVector3F( 0.238856f, -0.864188f, 0.442863f),
00234 TVector3F( 0.262866f, -0.951056f, 0.162460f),
00235 TVector3F( 0.500000f, -0.809017f, 0.309017f),
00236 TVector3F( 0.716567f, -0.681718f, 0.147621f),
00237 TVector3F( 0.525731f, -0.850651f, 0.000000f),
00238 TVector3F(-0.238856f, -0.864188f, -0.442863f),
00239 TVector3F(-0.500000f, -0.809017f, -0.309017f),
00240 TVector3F(-0.262866f, -0.951056f, -0.162460f),
00241 TVector3F(-0.850651f, -0.525731f, 0.000000f),
00242 TVector3F(-0.716567f, -0.681718f, -0.147621f),
00243 TVector3F(-0.716567f, -0.681718f, 0.147621f),
00244 TVector3F(-0.525731f, -0.850651f, 0.000000f),
00245 TVector3F(-0.500000f, -0.809017f, 0.309017f),
00246 TVector3F(-0.238856f, -0.864188f, 0.442863f),
00247 TVector3F(-0.262866f, -0.951056f, 0.162460f),
00248 TVector3F(-0.864188f, -0.442863f, 0.238856f),
00249 TVector3F(-0.809017f, -0.309017f, 0.500000f),
00250 TVector3F(-0.688191f, -0.587785f, 0.425325f),
00251 TVector3F(-0.681718f, -0.147621f, 0.716567f),
00252 TVector3F(-0.442863f, -0.238856f, 0.864188f),
00253 TVector3F(-0.587785f, -0.425325f, 0.688191f),
00254 TVector3F(-0.309017f, -0.500000f, 0.809017f),
00255 TVector3F(-0.147621f, -0.716567f, 0.681718f),
00256 TVector3F(-0.425325f, -0.688191f, 0.587785f),
00257 TVector3F(-0.162460f, -0.262866f, 0.951056f),
00258 TVector3F( 0.442863f, -0.238856f, 0.864188f),
00259 TVector3F( 0.162460f, -0.262866f, 0.951056f),
00260 TVector3F( 0.309017f, -0.500000f, 0.809017f),
00261 TVector3F( 0.147621f, -0.716567f, 0.681718f),
00262 TVector3F( 0.000000f, -0.525731f, 0.850651f),
00263 TVector3F( 0.425325f, -0.688191f, 0.587785f),
00264 TVector3F( 0.587785f, -0.425325f, 0.688191f),
00265 TVector3F( 0.688191f, -0.587785f, 0.425325f),
00266 TVector3F(-0.955423f, 0.295242f, 0.000000f),
00267 TVector3F(-0.951056f, 0.162460f, 0.262866f),
00268 TVector3F(-1.000000f, 0.000000f, 0.000000f),
00269 TVector3F(-0.850651f, 0.000000f, 0.525731f),
00270 TVector3F(-0.955423f, -0.295242f, 0.000000f),
00271 TVector3F(-0.951056f, -0.162460f, 0.262866f),
00272 TVector3F(-0.864188f, 0.442863f, -0.238856f),
00273 TVector3F(-0.951056f, 0.162460f, -0.262866f),
00274 TVector3F(-0.809017f, 0.309017f, -0.500000f),
00275 TVector3F(-0.864188f, -0.442863f, -0.238856f),
00276 TVector3F(-0.951056f, -0.162460f, -0.262866f),
00277 TVector3F(-0.809017f, -0.309017f, -0.500000f),
00278 TVector3F(-0.681718f, 0.147621f, -0.716567f),
00279 TVector3F(-0.681718f, -0.147621f, -0.716567f),
00280 TVector3F(-0.850651f, 0.000000f, -0.525731f),
00281 TVector3F(-0.688191f, 0.587785f, -0.425325f),
00282 TVector3F(-0.587785f, 0.425325f, -0.688191f),
00283 TVector3F(-0.425325f, 0.688191f, -0.587785f),
00284 TVector3F(-0.425325f, -0.688191f, -0.587785f),
00285 TVector3F(-0.587785f, -0.425325f, -0.688191f),
00286 TVector3F(-0.688191f, -0.587785f, -0.425325f)
00287 };
00288 }