KeosMD2Loader.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 "KeosMD2Loader.h"
00022 #include "KeosRenderSystem.h"
00023 #include "KeosLogger.h"
00024 #include <fstream>
00025 
00026 namespace Keos
00027 {
00028   //=======================================================================
00029   // CMD2Loader implementation
00030   //=======================================================================
00031 
00032   //-----------------------------------------------------------------------
00033   CMesh* CMD2Loader::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 !", "CMD2Loader::LoadFromFile");
00047 
00048     // Check version number
00049     if (Header.Version != ms_nMD2Version)
00050       LOADINGFAILED_EXCEPT(strFilename, "The file is not a valid model MD2 !", "CMD2Loader::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 first frame
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     // Transformation of the data
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         // Recovery of the information on the current point
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         // Build the vertex
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         // Addition in the vertex buffer and in the index buffer
00100         Vertices.push_back(v);
00101         Indices.push_back(i * 3 + 2 - j);
00102       }
00103     }
00104 
00105     // Create the mesh
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     // Create the material
00111     CMaterial* pMaterial = new CMaterial();
00112     if (Header.NbTextures >= 1)
00113       pMaterial->CreateTexture(Textures[0].Name);
00114 
00115     // Add the material to the mesh
00116     pMesh->AddMaterial(pMaterial, 0);
00117 
00118     return pMesh;
00119   }
00120 
00121   //-----------------------------------------------------------------------
00122   // Table of the normals
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 }

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