KeosMD2AnimatedLoader.cpp

Go to the documentation of this file.
00001 /*
00002  * This source file is part of KEOS (Free 3D Engine)
00003  * For the latest info, see http://www.keosengine.org/
00004  * E-mails : thierry.vouriot@keosengine.org, yeri@keosengine.org
00005  *
00006  * This program is free software; you can redistribute it and/or modify it under
00007  * the terms of the GNU Lesser General Public License as published by the Free Software
00008  * Foundation; either version 2 of the License, or (at your option) any later
00009  * version.
00010  *
00011  * This program is distributed in the hope that it will be useful, but WITHOUT
00012  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
00013  * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
00014  *
00015  * You should have received a copy of the GNU Lesser General Public License along with
00016  * this program; if not, write to the Free Software Foundation, Inc., 59 Temple
00017  * Place - Suite 330, Boston, MA 02111-1307, USA, or go to
00018  * http://www.gnu.org/copyleft/lesser.txt.
00019  *
00020  */
00021 #include "KeosMD2AnimatedLoader.h"
00022 #include "KeosRenderSystem.h"
00023 #include "KeosLogger.h"
00024 #include <fstream>
00025 
00026 namespace Keos
00027 {
00028   //=======================================================================
00029   // CMD2AnimatedLoader implementation
00030   //=======================================================================
00031 
00032   //-----------------------------------------------------------------------
00033   CAnimatedMeshKF* CMD2AnimatedLoader::LoadFromFile(const String& strFilename)
00034   {
00035     // Open the file
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     // Read header
00041     THeader Header;
00042     File.read(reinterpret_cast<char*>(&Header), sizeof(Header));
00043 
00044     // Check Magic number
00045     if (Header.Ident != ms_nMagicId)
00046       LOADINGFAILED_EXCEPT(strFilename, "The file is not a valid model MD2 !", "CMD2AnimatedLoader::LoadFromFile");
00047 
00048     // Check version number
00049     if (Header.Version != ms_nMD2Version)
00050       LOADINGFAILED_EXCEPT(strFilename, "The file is not a valid model MD2 !", "CMD2AnimatedLoader::LoadFromFile");
00051 
00052     // Allocate all of our memory from the header's information
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     // Read skins names
00059     File.seekg(Header.OffsetTextures, std::ios_base::beg);
00060     File.read(reinterpret_cast<char*>(&Textures[0]), sizeof(TTexture) * Header.NbTextures);
00061 
00062     // Read texture coordinates
00063     File.seekg(Header.OffsetTexCoords, std::ios_base::beg);
00064     File.read(reinterpret_cast<char*>(&TexCoords[0]), sizeof(TTexCoord) * Header.NbTexCoords);
00065 
00066     // Read triangles/faces
00067     File.seekg(Header.OffsetTriangles, std::ios_base::beg);
00068     File.read(reinterpret_cast<char*>(&Triangles[0]), sizeof(TTriangle) * Header.NbTriangles);
00069 
00070     // Read the frames
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       // Transformation of the data
00083       for (int i = 0; i < Header.NbTriangles; ++i)
00084       {
00085         for (int j = 0; j < 3; ++j)
00086         {
00087           // Recovery of the information on the current point
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           // Build the vertex
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           // Addition in the vertex buffer and in the index buffer
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     // Create the mesh
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     // Create the material
00115     CMaterial* pMaterial = new CMaterial();
00116     if (Header.NbTextures >= 1)
00117       pMaterial->CreateTexture(Textures[0].Name);
00118 
00119     // Add the material to the mesh
00120     pMesh->AddMaterial(pMaterial, 0);
00121 
00122     // Add the animations informations
00123     pMesh->AddAnimation(CAnimationInfoKF(   0,  39,  9 ));   // STAND
00124     pMesh->AddAnimation(CAnimationInfoKF(  40,  45, 10 ));   // RUN
00125     pMesh->AddAnimation(CAnimationInfoKF(  46,  53, 10 ));   // ATTACK
00126     pMesh->AddAnimation(CAnimationInfoKF(  54,  57,  7 ));   // PAIN_A
00127     pMesh->AddAnimation(CAnimationInfoKF(  58,  61,  7 ));   // PAIN_B
00128     pMesh->AddAnimation(CAnimationInfoKF(  62,  65,  7 ));   // PAIN_C
00129     pMesh->AddAnimation(CAnimationInfoKF(  66,  71,  7 ));   // JUMP
00130     pMesh->AddAnimation(CAnimationInfoKF(  72,  83,  7 ));   // FLIP
00131     pMesh->AddAnimation(CAnimationInfoKF(  84,  94,  7 ));   // SALUTE
00132     pMesh->AddAnimation(CAnimationInfoKF(  95, 111, 10 ));   // FALLBACK
00133     pMesh->AddAnimation(CAnimationInfoKF( 112, 122,  7 ));   // WAVE
00134     pMesh->AddAnimation(CAnimationInfoKF( 123, 134,  6 ));   // POINT
00135     pMesh->AddAnimation(CAnimationInfoKF( 135, 153, 10 ));   // CROUCH_STAND
00136     pMesh->AddAnimation(CAnimationInfoKF( 154, 159,  7 ));   // CROUCH_WALK
00137     pMesh->AddAnimation(CAnimationInfoKF( 160, 168, 10 ));   // CROUCH_ATTACK
00138     pMesh->AddAnimation(CAnimationInfoKF( 196, 172,  7 ));   // CROUCH_PAIN
00139     pMesh->AddAnimation(CAnimationInfoKF( 173, 177,  5 ));   // CROUCH_DEATH
00140     pMesh->AddAnimation(CAnimationInfoKF( 178, 183,  7 ));   // DEATH_FALLBACK
00141     pMesh->AddAnimation(CAnimationInfoKF( 184, 189,  7 ));   // DEATH_FALLFORWARD
00142     pMesh->AddAnimation(CAnimationInfoKF( 190, 197,  7 ));   // DEATH_FALLBACKSLOW
00143     //pMesh->AddAnimation(CAnimationInfoKF( 198, 198,  5 ));   // BOOM
00144 
00145     return pMesh;
00146   }
00147 
00148   //-----------------------------------------------------------------------
00149   // Table of the normals
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 }

Generated on Fri Mar 9 14:29:02 2007 for Keos by  doxygen 1.5.1-p1