00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include "KeosMD2AnimatedLoader.h"
00022 #include "KeosRenderSystem.h"
00023 #include "KeosLogger.h"
00024 #include <fstream>
00025
00026 namespace Keos
00027 {
00028
00029
00030
00031
00032
00033 CAnimatedMeshKF* CMD2AnimatedLoader::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 !", "CMD2AnimatedLoader::LoadFromFile");
00047
00048
00049 if (Header.Version != ms_nMD2Version)
00050 LOADINGFAILED_EXCEPT(strFilename, "The file is not a valid model MD2 !", "CMD2AnimatedLoader::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 std::vector<CMeshGeom::TVertex> Vertices;
00072 std::vector<CMeshGeom::TIndex> Indices;
00073 File.seekg(Header.OffsetFrames, std::ios_base::beg);
00074 for (int nFrame = 0; nFrame < Header.NbFrames; nFrame++)
00075 {
00076 Frames[nFrame].Vertices.resize(Header.NbVertices);
00077 File.read(reinterpret_cast<char*>(&Frames[nFrame].Scale), sizeof(Frames[nFrame].Scale));
00078 File.read(reinterpret_cast<char*>(&Frames[nFrame].Translate), sizeof(Frames[nFrame].Translate));
00079 File.read(reinterpret_cast<char*>(&Frames[nFrame].Name), sizeof(Frames[nFrame].Name));
00080 File.read(reinterpret_cast<char*>(&Frames[nFrame].Vertices[0]), sizeof(TPoint) * Header.NbVertices);
00081
00082
00083 for (int i = 0; i < Header.NbTriangles; ++i)
00084 {
00085 for (int j = 0; j < 3; ++j)
00086 {
00087
00088 CMeshGeom::TVertex v;
00089 const TPoint& Vert = Frames[nFrame].Vertices[Triangles[i].Vertices[j]];
00090 const TTexCoord& TexC = TexCoords[Triangles[i].TexCoords[j]];
00091
00092
00093 v.Position.x = Vert.x * Frames[nFrame].Scale.x + Frames[nFrame].Translate.x;
00094 v.Position.y = Vert.y * Frames[nFrame].Scale.y + Frames[nFrame].Translate.y;
00095 v.Position.z = Vert.z * Frames[nFrame].Scale.z + Frames[nFrame].Translate.z;
00096 v.Normal = ms_NormalTable[Vert.n];
00097 v.Color = Renderer->ConvertColor(CColor::White);
00098 v.TexCoords.x = TexC.u / static_cast<float>(Header.TexWidth);
00099 v.TexCoords.y = TexC.v / static_cast<float>(Header.TexHeight);
00100
00101
00102 Vertices.push_back(v);
00103 if ((int)Indices.size() < Header.NbTriangles*3)
00104 Indices.push_back(i * 3 + 2 - j);
00105 }
00106 }
00107 }
00108
00109
00110 CAnimatedMeshKF *pMesh = new CAnimatedMeshKF(Vertices);
00111 CMeshGeom *pMeshGeom = new CMeshGeom(&Vertices[0], (int)Header.NbTriangles*3, &Indices[0], (int)Indices.size());
00112 pMesh->AddMeshGeom(pMeshGeom);
00113
00114
00115 CMaterial* pMaterial = new CMaterial();
00116 if (Header.NbTextures >= 1)
00117 pMaterial->CreateTexture(Textures[0].Name);
00118
00119
00120 pMesh->AddMaterial(pMaterial, 0);
00121
00122
00123 pMesh->AddAnimation(CAnimationInfoKF( 0, 39, 9 ));
00124 pMesh->AddAnimation(CAnimationInfoKF( 40, 45, 10 ));
00125 pMesh->AddAnimation(CAnimationInfoKF( 46, 53, 10 ));
00126 pMesh->AddAnimation(CAnimationInfoKF( 54, 57, 7 ));
00127 pMesh->AddAnimation(CAnimationInfoKF( 58, 61, 7 ));
00128 pMesh->AddAnimation(CAnimationInfoKF( 62, 65, 7 ));
00129 pMesh->AddAnimation(CAnimationInfoKF( 66, 71, 7 ));
00130 pMesh->AddAnimation(CAnimationInfoKF( 72, 83, 7 ));
00131 pMesh->AddAnimation(CAnimationInfoKF( 84, 94, 7 ));
00132 pMesh->AddAnimation(CAnimationInfoKF( 95, 111, 10 ));
00133 pMesh->AddAnimation(CAnimationInfoKF( 112, 122, 7 ));
00134 pMesh->AddAnimation(CAnimationInfoKF( 123, 134, 6 ));
00135 pMesh->AddAnimation(CAnimationInfoKF( 135, 153, 10 ));
00136 pMesh->AddAnimation(CAnimationInfoKF( 154, 159, 7 ));
00137 pMesh->AddAnimation(CAnimationInfoKF( 160, 168, 10 ));
00138 pMesh->AddAnimation(CAnimationInfoKF( 196, 172, 7 ));
00139 pMesh->AddAnimation(CAnimationInfoKF( 173, 177, 5 ));
00140 pMesh->AddAnimation(CAnimationInfoKF( 178, 183, 7 ));
00141 pMesh->AddAnimation(CAnimationInfoKF( 184, 189, 7 ));
00142 pMesh->AddAnimation(CAnimationInfoKF( 190, 197, 7 ));
00143
00144
00145 return pMesh;
00146 }
00147
00148
00149
00150 const TVector3F CMD2AnimatedLoader::ms_NormalTable[] =
00151 {
00152 TVector3F(-0.525731f, 0.000000f, 0.850651f),
00153 TVector3F(-0.442863f, 0.238856f, 0.864188f),
00154 TVector3F(-0.295242f, 0.000000f, 0.955423f),
00155 TVector3F(-0.309017f, 0.500000f, 0.809017f),
00156 TVector3F(-0.162460f, 0.262866f, 0.951056f),
00157 TVector3F( 0.000000f, 0.000000f, 1.000000f),
00158 TVector3F( 0.000000f, 0.850651f, 0.525731f),
00159 TVector3F(-0.147621f, 0.716567f, 0.681718f),
00160 TVector3F( 0.147621f, 0.716567f, 0.681718f),
00161 TVector3F( 0.000000f, 0.525731f, 0.850651f),
00162 TVector3F( 0.309017f, 0.500000f, 0.809017f),
00163 TVector3F( 0.525731f, 0.000000f, 0.850651f),
00164 TVector3F( 0.295242f, 0.000000f, 0.955423f),
00165 TVector3F( 0.442863f, 0.238856f, 0.864188f),
00166 TVector3F( 0.162460f, 0.262866f, 0.951056f),
00167 TVector3F(-0.681718f, 0.147621f, 0.716567f),
00168 TVector3F(-0.809017f, 0.309017f, 0.500000f),
00169 TVector3F(-0.587785f, 0.425325f, 0.688191f),
00170 TVector3F(-0.850651f, 0.525731f, 0.000000f),
00171 TVector3F(-0.864188f, 0.442863f, 0.238856f),
00172 TVector3F(-0.716567f, 0.681718f, 0.147621f),
00173 TVector3F(-0.688191f, 0.587785f, 0.425325f),
00174 TVector3F(-0.500000f, 0.809017f, 0.309017f),
00175 TVector3F(-0.238856f, 0.864188f, 0.442863f),
00176 TVector3F(-0.425325f, 0.688191f, 0.587785f),
00177 TVector3F(-0.716567f, 0.681718f, -0.147621f),
00178 TVector3F(-0.500000f, 0.809017f, -0.309017f),
00179 TVector3F(-0.525731f, 0.850651f, 0.000000f),
00180 TVector3F( 0.000000f, 0.850651f, -0.525731f),
00181 TVector3F(-0.238856f, 0.864188f, -0.442863f),
00182 TVector3F( 0.000000f, 0.955423f, -0.295242f),
00183 TVector3F(-0.262866f, 0.951056f, -0.162460f),
00184 TVector3F( 0.000000f, 1.000000f, 0.000000f),
00185 TVector3F( 0.000000f, 0.955423f, 0.295242f),
00186 TVector3F(-0.262866f, 0.951056f, 0.162460f),
00187 TVector3F( 0.238856f, 0.864188f, 0.442863f),
00188 TVector3F( 0.262866f, 0.951056f, 0.162460f),
00189 TVector3F( 0.500000f, 0.809017f, 0.309017f),
00190 TVector3F( 0.238856f, 0.864188f, -0.442863f),
00191 TVector3F( 0.262866f, 0.951056f, -0.162460f),
00192 TVector3F( 0.500000f, 0.809017f, -0.309017f),
00193 TVector3F( 0.850651f, 0.525731f, 0.000000f),
00194 TVector3F( 0.716567f, 0.681718f, 0.147621f),
00195 TVector3F( 0.716567f, 0.681718f, -0.147621f),
00196 TVector3F( 0.525731f, 0.850651f, 0.000000f),
00197 TVector3F( 0.425325f, 0.688191f, 0.587785f),
00198 TVector3F( 0.864188f, 0.442863f, 0.238856f),
00199 TVector3F( 0.688191f, 0.587785f, 0.425325f),
00200 TVector3F( 0.809017f, 0.309017f, 0.500000f),
00201 TVector3F( 0.681718f, 0.147621f, 0.716567f),
00202 TVector3F( 0.587785f, 0.425325f, 0.688191f),
00203 TVector3F( 0.955423f, 0.295242f, 0.000000f),
00204 TVector3F( 1.000000f, 0.000000f, 0.000000f),
00205 TVector3F( 0.951056f, 0.162460f, 0.262866f),
00206 TVector3F( 0.850651f, -0.525731f, 0.000000f),
00207 TVector3F( 0.955423f, -0.295242f, 0.000000f),
00208 TVector3F( 0.864188f, -0.442863f, 0.238856f),
00209 TVector3F( 0.951056f, -0.162460f, 0.262866f),
00210 TVector3F( 0.809017f, -0.309017f, 0.500000f),
00211 TVector3F( 0.681718f, -0.147621f, 0.716567f),
00212 TVector3F( 0.850651f, 0.000000f, 0.525731f),
00213 TVector3F( 0.864188f, 0.442863f, -0.238856f),
00214 TVector3F( 0.809017f, 0.309017f, -0.500000f),
00215 TVector3F( 0.951056f, 0.162460f, -0.262866f),
00216 TVector3F( 0.525731f, 0.000000f, -0.850651f),
00217 TVector3F( 0.681718f, 0.147621f, -0.716567f),
00218 TVector3F( 0.681718f, -0.147621f, -0.716567f),
00219 TVector3F( 0.850651f, 0.000000f, -0.525731f),
00220 TVector3F( 0.809017f, -0.309017f, -0.500000f),
00221 TVector3F( 0.864188f, -0.442863f, -0.238856f),
00222 TVector3F( 0.951056f, -0.162460f, -0.262866f),
00223 TVector3F( 0.147621f, 0.716567f, -0.681718f),
00224 TVector3F( 0.309017f, 0.500000f, -0.809017f),
00225 TVector3F( 0.425325f, 0.688191f, -0.587785f),
00226 TVector3F( 0.442863f, 0.238856f, -0.864188f),
00227 TVector3F( 0.587785f, 0.425325f, -0.688191f),
00228 TVector3F( 0.688191f, 0.587785f, -0.425325f),
00229 TVector3F(-0.147621f, 0.716567f, -0.681718f),
00230 TVector3F(-0.309017f, 0.500000f, -0.809017f),
00231 TVector3F( 0.000000f, 0.525731f, -0.850651f),
00232 TVector3F(-0.525731f, 0.000000f, -0.850651f),
00233 TVector3F(-0.442863f, 0.238856f, -0.864188f),
00234 TVector3F(-0.295242f, 0.000000f, -0.955423f),
00235 TVector3F(-0.162460f, 0.262866f, -0.951056f),
00236 TVector3F( 0.000000f, 0.000000f, -1.000000f),
00237 TVector3F( 0.295242f, 0.000000f, -0.955423f),
00238 TVector3F( 0.162460f, 0.262866f, -0.951056f),
00239 TVector3F(-0.442863f, -0.238856f, -0.864188f),
00240 TVector3F(-0.309017f, -0.500000f, -0.809017f),
00241 TVector3F(-0.162460f, -0.262866f, -0.951056f),
00242 TVector3F( 0.000000f, -0.850651f, -0.525731f),
00243 TVector3F(-0.147621f, -0.716567f, -0.681718f),
00244 TVector3F( 0.147621f, -0.716567f, -0.681718f),
00245 TVector3F( 0.000000f, -0.525731f, -0.850651f),
00246 TVector3F( 0.309017f, -0.500000f, -0.809017f),
00247 TVector3F( 0.442863f, -0.238856f, -0.864188f),
00248 TVector3F( 0.162460f, -0.262866f, -0.951056f),
00249 TVector3F( 0.238856f, -0.864188f, -0.442863f),
00250 TVector3F( 0.500000f, -0.809017f, -0.309017f),
00251 TVector3F( 0.425325f, -0.688191f, -0.587785f),
00252 TVector3F( 0.716567f, -0.681718f, -0.147621f),
00253 TVector3F( 0.688191f, -0.587785f, -0.425325f),
00254 TVector3F( 0.587785f, -0.425325f, -0.688191f),
00255 TVector3F( 0.000000f, -0.955423f, -0.295242f),
00256 TVector3F( 0.000000f, -1.000000f, 0.000000f),
00257 TVector3F( 0.262866f, -0.951056f, -0.162460f),
00258 TVector3F( 0.000000f, -0.850651f, 0.525731f),
00259 TVector3F( 0.000000f, -0.955423f, 0.295242f),
00260 TVector3F( 0.238856f, -0.864188f, 0.442863f),
00261 TVector3F( 0.262866f, -0.951056f, 0.162460f),
00262 TVector3F( 0.500000f, -0.809017f, 0.309017f),
00263 TVector3F( 0.716567f, -0.681718f, 0.147621f),
00264 TVector3F( 0.525731f, -0.850651f, 0.000000f),
00265 TVector3F(-0.238856f, -0.864188f, -0.442863f),
00266 TVector3F(-0.500000f, -0.809017f, -0.309017f),
00267 TVector3F(-0.262866f, -0.951056f, -0.162460f),
00268 TVector3F(-0.850651f, -0.525731f, 0.000000f),
00269 TVector3F(-0.716567f, -0.681718f, -0.147621f),
00270 TVector3F(-0.716567f, -0.681718f, 0.147621f),
00271 TVector3F(-0.525731f, -0.850651f, 0.000000f),
00272 TVector3F(-0.500000f, -0.809017f, 0.309017f),
00273 TVector3F(-0.238856f, -0.864188f, 0.442863f),
00274 TVector3F(-0.262866f, -0.951056f, 0.162460f),
00275 TVector3F(-0.864188f, -0.442863f, 0.238856f),
00276 TVector3F(-0.809017f, -0.309017f, 0.500000f),
00277 TVector3F(-0.688191f, -0.587785f, 0.425325f),
00278 TVector3F(-0.681718f, -0.147621f, 0.716567f),
00279 TVector3F(-0.442863f, -0.238856f, 0.864188f),
00280 TVector3F(-0.587785f, -0.425325f, 0.688191f),
00281 TVector3F(-0.309017f, -0.500000f, 0.809017f),
00282 TVector3F(-0.147621f, -0.716567f, 0.681718f),
00283 TVector3F(-0.425325f, -0.688191f, 0.587785f),
00284 TVector3F(-0.162460f, -0.262866f, 0.951056f),
00285 TVector3F( 0.442863f, -0.238856f, 0.864188f),
00286 TVector3F( 0.162460f, -0.262866f, 0.951056f),
00287 TVector3F( 0.309017f, -0.500000f, 0.809017f),
00288 TVector3F( 0.147621f, -0.716567f, 0.681718f),
00289 TVector3F( 0.000000f, -0.525731f, 0.850651f),
00290 TVector3F( 0.425325f, -0.688191f, 0.587785f),
00291 TVector3F( 0.587785f, -0.425325f, 0.688191f),
00292 TVector3F( 0.688191f, -0.587785f, 0.425325f),
00293 TVector3F(-0.955423f, 0.295242f, 0.000000f),
00294 TVector3F(-0.951056f, 0.162460f, 0.262866f),
00295 TVector3F(-1.000000f, 0.000000f, 0.000000f),
00296 TVector3F(-0.850651f, 0.000000f, 0.525731f),
00297 TVector3F(-0.955423f, -0.295242f, 0.000000f),
00298 TVector3F(-0.951056f, -0.162460f, 0.262866f),
00299 TVector3F(-0.864188f, 0.442863f, -0.238856f),
00300 TVector3F(-0.951056f, 0.162460f, -0.262866f),
00301 TVector3F(-0.809017f, 0.309017f, -0.500000f),
00302 TVector3F(-0.864188f, -0.442863f, -0.238856f),
00303 TVector3F(-0.951056f, -0.162460f, -0.262866f),
00304 TVector3F(-0.809017f, -0.309017f, -0.500000f),
00305 TVector3F(-0.681718f, 0.147621f, -0.716567f),
00306 TVector3F(-0.681718f, -0.147621f, -0.716567f),
00307 TVector3F(-0.850651f, 0.000000f, -0.525731f),
00308 TVector3F(-0.688191f, 0.587785f, -0.425325f),
00309 TVector3F(-0.587785f, 0.425325f, -0.688191f),
00310 TVector3F(-0.425325f, 0.688191f, -0.587785f),
00311 TVector3F(-0.425325f, -0.688191f, -0.587785f),
00312 TVector3F(-0.587785f, -0.425325f, -0.688191f),
00313 TVector3F(-0.688191f, -0.587785f, -0.425325f)
00314 };
00315 }