KeosMDLQ1AnimatedLoader.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 "KeosMDLQ1AnimatedLoader.h"
00022 #include "KeosRenderSystem.h"
00023 #include "KeosLogger.h"
00024 #include "KeosImage.h"
00025 #include "KeosMediaManager.h"
00026 #include "KeosString.h"
00027 #include "KeosMaterial.h"
00028 #include <fstream>
00029 
00030 namespace Keos
00031 {
00032   //=======================================================================
00033   // CMDLQ1AnimatedLoader implementation
00034   //=======================================================================
00035 
00036   //-----------------------------------------------------------------------
00037   CAnimatedMeshKF* CMDLQ1AnimatedLoader::LoadFromFile(const String& strFilename)
00038   {
00039     int i;
00040 
00041     // Open the file
00042     std::ifstream File(strFilename.c_str(), std::ios_base::binary);
00043 
00044     ILogger::Log("Load of the mesh : %s", strFilename.c_str());
00045 
00046     // Read header
00047     THeader Header;
00048     File.read(reinterpret_cast<char*>(&Header), sizeof(Header));
00049 
00050     // Check Magic number
00051     if (Header.Ident != ms_nMagicId)
00052       LOADINGFAILED_EXCEPT(strFilename, "The file is not a valid model MDL (Quake1) !", "CMDLQ1AnimatedLoader::LoadFromFile");
00053 
00054     // Check version number
00055     if (Header.Version != ms_nMDLQ1Version)
00056       LOADINGFAILED_EXCEPT(strFilename, "The file is not a valid model MDL (Quake1) !", "CMDLQ1AnimatedLoader::LoadFromFile");
00057 
00058     // Allocate all of our memory from the header's information
00059     std::vector<TTexture>  Textures(Header.NbTextures);
00060     std::vector<TTexCoord> TexCoords(Header.NbVertices);
00061     std::vector<TTriangle> Triangles(Header.NbTriangles);
00062     std::vector<TFrame>    Frames(Header.NbFrames);
00063 
00064     // Read textures
00065     CImage TextureImg;
00066     for ( i = 0; i < Header.NbTextures; i++ )
00067     {
00068       Textures[i].Data.resize(Header.TexHeight * Header.TexWidth);
00069 
00070       File.read( reinterpret_cast<char*>(&Textures[i].Group), sizeof( int ) );
00071       File.read( reinterpret_cast<char*>(&(Textures[i].Data[0])), Header.TexHeight * Header.TexWidth );
00072 
00073       // We use only the first texture for the moment
00074       if (i == 0)
00075       {
00076         std::vector<uchar>    Texels(Header.TexHeight * Header.TexWidth * 4);
00077 
00078         // convert 8 bits index color in RGB 32 bits
00080         for ( int j = 0; j < Header.TexHeight * Header.TexWidth; j++ )
00081         {
00082           Texels[ (j * 4) + 0 ] = ms_DefaultColorMap[ (Textures[i].Data[j] * 3) + 2 ];
00083           Texels[ (j * 4) + 1 ] = ms_DefaultColorMap[ (Textures[i].Data[j] * 3) + 1 ];
00084           Texels[ (j * 4) + 2 ] = ms_DefaultColorMap[ (Textures[i].Data[j] * 3) + 0 ];
00085           Texels[ (j * 4) + 3 ] = 0;
00086         }
00087 
00088         TextureImg = CImage(TVector2I(Header.TexWidth, Header.TexHeight), PXF_A8R8G8B8 , &Texels[0]);
00089       }
00090     }
00091 
00092     // Read texture coordinates
00093     File.read( reinterpret_cast<char*>(&TexCoords[0]), sizeof(TTexCoord) * Header.NbVertices );
00094 
00095     // Read triangles/faces
00096     File.read( reinterpret_cast<char*>(&Triangles[0]), sizeof(TTriangle) * Header.NbTriangles );
00097 
00098     // Read frames
00099     std::vector<CMeshGeom::TVertex> Vertices;
00100     std::vector<CMeshGeom::TIndex>  Indices;
00101     for ( int nFrame = 0; nFrame < Header.NbFrames; nFrame++ )
00102     {
00103       Frames[nFrame].Vertices.resize(Header.NbVertices);
00104 
00105       File.read( reinterpret_cast<char*>(&Frames[nFrame].Type), sizeof(long) );
00106       File.read( reinterpret_cast<char*>(&Frames[nFrame].BBoxMin), sizeof(TPoint) );
00107       File.read( reinterpret_cast<char*>(&Frames[nFrame].BBoxMax), sizeof(TPoint) );
00108       File.read( reinterpret_cast<char*>(&Frames[nFrame].Name), sizeof(char) * 16 );
00109       File.read( reinterpret_cast<char*>(&(Frames[nFrame].Vertices[0])), sizeof(TPoint) * Header.NbVertices );
00110 
00111       // Transformation of the data
00112       for (int i = 0; i < Header.NbTriangles; ++i)
00113       {
00114         for (int j = 0; j < 3; ++j)
00115         {
00116           // Recovery of the information on the current point
00117           CMeshGeom::TVertex v;
00118           const TPoint&    Vert = Frames[nFrame].Vertices[Triangles[i].Vertices[j]];
00119           const TTexCoord& TexC = TexCoords[Triangles[i].Vertices[j]];
00120 
00121           // Build the vertex
00122           v.Position.x  = Vert.x * Header.Scale.x + Header.Translate.x;
00123           v.Position.y  = Vert.y * Header.Scale.y + Header.Translate.y;
00124           v.Position.z  = Vert.z * Header.Scale.z + Header.Translate.z;
00125           v.Normal      = ms_NormalTable[Vert.n];
00126           v.Color       = Renderer->ConvertColor(CColor::White);
00127           int u = 0;
00128           if ( !Triangles[i].FacesFront && TexCoords[ Triangles[i].Vertices[j]].Onseam )
00129             u += Header.TexWidth / 2; // back face
00130           v.TexCoords.x = (TexC.u + u + 0.5) / static_cast<float>(Header.TexWidth);
00131           v.TexCoords.y = (TexC.v + 0.5) / static_cast<float>(Header.TexHeight);
00132 
00133           // Addition in the vertex buffer and in the index buffer
00134           Vertices.push_back(v);
00135           if ((int)Indices.size() < Header.NbTriangles*3)
00136             Indices.push_back(i * 3 + 2 - j);
00137         }
00138       }
00139     }
00140 
00141     // Create the mesh
00142     CAnimatedMeshKF *pMesh = new CAnimatedMeshKF(Vertices);
00143     CMeshGeom *pMeshGeom = new CMeshGeom(&Vertices[0], (int)Header.NbTriangles*3, &Indices[0], (int)Indices.size());
00144     pMesh->AddMeshGeom(pMeshGeom);
00145 
00146     // Search and add animations information
00147     String strCurrentAnim;
00148     CAnimationInfoKF AnimInfo;
00149     int nAnims = 0;
00150     for (int i = 0; i < Header.NbFrames; ++i)
00151     {
00152       String strFrameName = Frames[i].Name;
00153       String strFrameAnim;
00154 
00155       // Extract animation name from frame name
00156       String::size_type nLen = strFrameName.find_first_of ("0123456789");
00157 
00158       strFrameAnim.assign (strFrameName, 0, nLen);
00159 
00160       if (strCurrentAnim != strFrameAnim)
00161       {
00162         if (i > 0)
00163         {
00164           pMesh->AddAnimation(AnimInfo);
00165           ILogger::Log(" |- Anim%d: %s", nAnims++, strCurrentAnim.c_str());
00166         }
00167 
00168         // Initialize new anim info
00169         AnimInfo.Begin = i;
00170         AnimInfo.End = i;
00171 
00172         strCurrentAnim = strFrameAnim;
00173       }
00174       else
00175       {
00176         AnimInfo.End = i;
00177       }
00178     }
00179 
00180     // Insert last animation
00181     pMesh->AddAnimation(AnimInfo);
00182     ILogger::Log(" |- Anim%d: %s", nAnims++, strCurrentAnim.c_str());
00183 
00184     // Assign a material
00185     CMaterial *pMaterial = new CMaterial();
00186     pMaterial->CreateTexture(TextureImg);
00187     pMesh->AddMaterial(pMaterial, 0);
00188 
00189     return pMesh;
00190   }
00191 
00192   //-----------------------------------------------------------------------
00193   void CMDLQ1AnimatedLoader::LoadColorMap( const String& strFilename, uchar* ColorMap )
00194   {
00195     std::fstream File;
00196 
00197     File.open( strFilename.c_str(), std::ios::in | std::ios::binary );
00198 
00199     if ( File.fail() )
00200       LOADINGFAILED_EXCEPT(strFilename, "", "CMDLQ1AnimatedLoader::LoadColorMap");
00201 
00202     memset( ColorMap, 0, 768 );
00203     File.read( (char *)ColorMap, 768 );
00204 
00205     /*std::ofstream m_File("toto.txt");
00206     for (int i=0; i<768; i++)
00207         m_File << CStringConverter::ToString(ColorMap[i]) << ", ";*/
00208 
00209     File.close();
00210   }
00211 
00212   //-----------------------------------------------------------------------
00213   // Table of the normals
00214   const TVector3F CMDLQ1AnimatedLoader::ms_NormalTable[] =
00215     {
00216       TVector3F(-0.525731f,  0.000000f,  0.850651f),
00217       TVector3F(-0.442863f,  0.238856f,  0.864188f),
00218       TVector3F(-0.295242f,  0.000000f,  0.955423f),
00219       TVector3F(-0.309017f,  0.500000f,  0.809017f),
00220       TVector3F(-0.162460f,  0.262866f,  0.951056f),
00221       TVector3F( 0.000000f,  0.000000f,  1.000000f),
00222       TVector3F( 0.000000f,  0.850651f,  0.525731f),
00223       TVector3F(-0.147621f,  0.716567f,  0.681718f),
00224       TVector3F( 0.147621f,  0.716567f,  0.681718f),
00225       TVector3F( 0.000000f,  0.525731f,  0.850651f),
00226       TVector3F( 0.309017f,  0.500000f,  0.809017f),
00227       TVector3F( 0.525731f,  0.000000f,  0.850651f),
00228       TVector3F( 0.295242f,  0.000000f,  0.955423f),
00229       TVector3F( 0.442863f,  0.238856f,  0.864188f),
00230       TVector3F( 0.162460f,  0.262866f,  0.951056f),
00231       TVector3F(-0.681718f,  0.147621f,  0.716567f),
00232       TVector3F(-0.809017f,  0.309017f,  0.500000f),
00233       TVector3F(-0.587785f,  0.425325f,  0.688191f),
00234       TVector3F(-0.850651f,  0.525731f,  0.000000f),
00235       TVector3F(-0.864188f,  0.442863f,  0.238856f),
00236       TVector3F(-0.716567f,  0.681718f,  0.147621f),
00237       TVector3F(-0.688191f,  0.587785f,  0.425325f),
00238       TVector3F(-0.500000f,  0.809017f,  0.309017f),
00239       TVector3F(-0.238856f,  0.864188f,  0.442863f),
00240       TVector3F(-0.425325f,  0.688191f,  0.587785f),
00241       TVector3F(-0.716567f,  0.681718f, -0.147621f),
00242       TVector3F(-0.500000f,  0.809017f, -0.309017f),
00243       TVector3F(-0.525731f,  0.850651f,  0.000000f),
00244       TVector3F( 0.000000f,  0.850651f, -0.525731f),
00245       TVector3F(-0.238856f,  0.864188f, -0.442863f),
00246       TVector3F( 0.000000f,  0.955423f, -0.295242f),
00247       TVector3F(-0.262866f,  0.951056f, -0.162460f),
00248       TVector3F( 0.000000f,  1.000000f,  0.000000f),
00249       TVector3F( 0.000000f,  0.955423f,  0.295242f),
00250       TVector3F(-0.262866f,  0.951056f,  0.162460f),
00251       TVector3F( 0.238856f,  0.864188f,  0.442863f),
00252       TVector3F( 0.262866f,  0.951056f,  0.162460f),
00253       TVector3F( 0.500000f,  0.809017f,  0.309017f),
00254       TVector3F( 0.238856f,  0.864188f, -0.442863f),
00255       TVector3F( 0.262866f,  0.951056f, -0.162460f),
00256       TVector3F( 0.500000f,  0.809017f, -0.309017f),
00257       TVector3F( 0.850651f,  0.525731f,  0.000000f),
00258       TVector3F( 0.716567f,  0.681718f,  0.147621f),
00259       TVector3F( 0.716567f,  0.681718f, -0.147621f),
00260       TVector3F( 0.525731f,  0.850651f,  0.000000f),
00261       TVector3F( 0.425325f,  0.688191f,  0.587785f),
00262       TVector3F( 0.864188f,  0.442863f,  0.238856f),
00263       TVector3F( 0.688191f,  0.587785f,  0.425325f),
00264       TVector3F( 0.809017f,  0.309017f,  0.500000f),
00265       TVector3F( 0.681718f,  0.147621f,  0.716567f),
00266       TVector3F( 0.587785f,  0.425325f,  0.688191f),
00267       TVector3F( 0.955423f,  0.295242f,  0.000000f),
00268       TVector3F( 1.000000f,  0.000000f,  0.000000f),
00269       TVector3F( 0.951056f,  0.162460f,  0.262866f),
00270       TVector3F( 0.850651f, -0.525731f,  0.000000f),
00271       TVector3F( 0.955423f, -0.295242f,  0.000000f),
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.681718f, -0.147621f,  0.716567f),
00276       TVector3F( 0.850651f,  0.000000f,  0.525731f),
00277       TVector3F( 0.864188f,  0.442863f, -0.238856f),
00278       TVector3F( 0.809017f,  0.309017f, -0.500000f),
00279       TVector3F( 0.951056f,  0.162460f, -0.262866f),
00280       TVector3F( 0.525731f,  0.000000f, -0.850651f),
00281       TVector3F( 0.681718f,  0.147621f, -0.716567f),
00282       TVector3F( 0.681718f, -0.147621f, -0.716567f),
00283       TVector3F( 0.850651f,  0.000000f, -0.525731f),
00284       TVector3F( 0.809017f, -0.309017f, -0.500000f),
00285       TVector3F( 0.864188f, -0.442863f, -0.238856f),
00286       TVector3F( 0.951056f, -0.162460f, -0.262866f),
00287       TVector3F( 0.147621f,  0.716567f, -0.681718f),
00288       TVector3F( 0.309017f,  0.500000f, -0.809017f),
00289       TVector3F( 0.425325f,  0.688191f, -0.587785f),
00290       TVector3F( 0.442863f,  0.238856f, -0.864188f),
00291       TVector3F( 0.587785f,  0.425325f, -0.688191f),
00292       TVector3F( 0.688191f,  0.587785f, -0.425325f),
00293       TVector3F(-0.147621f,  0.716567f, -0.681718f),
00294       TVector3F(-0.309017f,  0.500000f, -0.809017f),
00295       TVector3F( 0.000000f,  0.525731f, -0.850651f),
00296       TVector3F(-0.525731f,  0.000000f, -0.850651f),
00297       TVector3F(-0.442863f,  0.238856f, -0.864188f),
00298       TVector3F(-0.295242f,  0.000000f, -0.955423f),
00299       TVector3F(-0.162460f,  0.262866f, -0.951056f),
00300       TVector3F( 0.000000f,  0.000000f, -1.000000f),
00301       TVector3F( 0.295242f,  0.000000f, -0.955423f),
00302       TVector3F( 0.162460f,  0.262866f, -0.951056f),
00303       TVector3F(-0.442863f, -0.238856f, -0.864188f),
00304       TVector3F(-0.309017f, -0.500000f, -0.809017f),
00305       TVector3F(-0.162460f, -0.262866f, -0.951056f),
00306       TVector3F( 0.000000f, -0.850651f, -0.525731f),
00307       TVector3F(-0.147621f, -0.716567f, -0.681718f),
00308       TVector3F( 0.147621f, -0.716567f, -0.681718f),
00309       TVector3F( 0.000000f, -0.525731f, -0.850651f),
00310       TVector3F( 0.309017f, -0.500000f, -0.809017f),
00311       TVector3F( 0.442863f, -0.238856f, -0.864188f),
00312       TVector3F( 0.162460f, -0.262866f, -0.951056f),
00313       TVector3F( 0.238856f, -0.864188f, -0.442863f),
00314       TVector3F( 0.500000f, -0.809017f, -0.309017f),
00315       TVector3F( 0.425325f, -0.688191f, -0.587785f),
00316       TVector3F( 0.716567f, -0.681718f, -0.147621f),
00317       TVector3F( 0.688191f, -0.587785f, -0.425325f),
00318       TVector3F( 0.587785f, -0.425325f, -0.688191f),
00319       TVector3F( 0.000000f, -0.955423f, -0.295242f),
00320       TVector3F( 0.000000f, -1.000000f,  0.000000f),
00321       TVector3F( 0.262866f, -0.951056f, -0.162460f),
00322       TVector3F( 0.000000f, -0.850651f,  0.525731f),
00323       TVector3F( 0.000000f, -0.955423f,  0.295242f),
00324       TVector3F( 0.238856f, -0.864188f,  0.442863f),
00325       TVector3F( 0.262866f, -0.951056f,  0.162460f),
00326       TVector3F( 0.500000f, -0.809017f,  0.309017f),
00327       TVector3F( 0.716567f, -0.681718f,  0.147621f),
00328       TVector3F( 0.525731f, -0.850651f,  0.000000f),
00329       TVector3F(-0.238856f, -0.864188f, -0.442863f),
00330       TVector3F(-0.500000f, -0.809017f, -0.309017f),
00331       TVector3F(-0.262866f, -0.951056f, -0.162460f),
00332       TVector3F(-0.850651f, -0.525731f,  0.000000f),
00333       TVector3F(-0.716567f, -0.681718f, -0.147621f),
00334       TVector3F(-0.716567f, -0.681718f,  0.147621f),
00335       TVector3F(-0.525731f, -0.850651f,  0.000000f),
00336       TVector3F(-0.500000f, -0.809017f,  0.309017f),
00337       TVector3F(-0.238856f, -0.864188f,  0.442863f),
00338       TVector3F(-0.262866f, -0.951056f,  0.162460f),
00339       TVector3F(-0.864188f, -0.442863f,  0.238856f),
00340       TVector3F(-0.809017f, -0.309017f,  0.500000f),
00341       TVector3F(-0.688191f, -0.587785f,  0.425325f),
00342       TVector3F(-0.681718f, -0.147621f,  0.716567f),
00343       TVector3F(-0.442863f, -0.238856f,  0.864188f),
00344       TVector3F(-0.587785f, -0.425325f,  0.688191f),
00345       TVector3F(-0.309017f, -0.500000f,  0.809017f),
00346       TVector3F(-0.147621f, -0.716567f,  0.681718f),
00347       TVector3F(-0.425325f, -0.688191f,  0.587785f),
00348       TVector3F(-0.162460f, -0.262866f,  0.951056f),
00349       TVector3F( 0.442863f, -0.238856f,  0.864188f),
00350       TVector3F( 0.162460f, -0.262866f,  0.951056f),
00351       TVector3F( 0.309017f, -0.500000f,  0.809017f),
00352       TVector3F( 0.147621f, -0.716567f,  0.681718f),
00353       TVector3F( 0.000000f, -0.525731f,  0.850651f),
00354       TVector3F( 0.425325f, -0.688191f,  0.587785f),
00355       TVector3F( 0.587785f, -0.425325f,  0.688191f),
00356       TVector3F( 0.688191f, -0.587785f,  0.425325f),
00357       TVector3F(-0.955423f,  0.295242f,  0.000000f),
00358       TVector3F(-0.951056f,  0.162460f,  0.262866f),
00359       TVector3F(-1.000000f,  0.000000f,  0.000000f),
00360       TVector3F(-0.850651f,  0.000000f,  0.525731f),
00361       TVector3F(-0.955423f, -0.295242f,  0.000000f),
00362       TVector3F(-0.951056f, -0.162460f,  0.262866f),
00363       TVector3F(-0.864188f,  0.442863f, -0.238856f),
00364       TVector3F(-0.951056f,  0.162460f, -0.262866f),
00365       TVector3F(-0.809017f,  0.309017f, -0.500000f),
00366       TVector3F(-0.864188f, -0.442863f, -0.238856f),
00367       TVector3F(-0.951056f, -0.162460f, -0.262866f),
00368       TVector3F(-0.809017f, -0.309017f, -0.500000f),
00369       TVector3F(-0.681718f,  0.147621f, -0.716567f),
00370       TVector3F(-0.681718f, -0.147621f, -0.716567f),
00371       TVector3F(-0.850651f,  0.000000f, -0.525731f),
00372       TVector3F(-0.688191f,  0.587785f, -0.425325f),
00373       TVector3F(-0.587785f,  0.425325f, -0.688191f),
00374       TVector3F(-0.425325f,  0.688191f, -0.587785f),
00375       TVector3F(-0.425325f, -0.688191f, -0.587785f),
00376       TVector3F(-0.587785f, -0.425325f, -0.688191f),
00377       TVector3F(-0.688191f, -0.587785f, -0.425325f)
00378     };
00379 
00380   //-----------------------------------------------------------------------
00381   // Default color map
00382   const uchar CMDLQ1AnimatedLoader::ms_DefaultColorMap[] =
00383     {
00384       0,   0,   0,   1,   1,  15,  31,  31,  31,  47,  47,  47,  63,  63,  63,
00385       75,  75,  75,  91,  91,  91, 107, 107, 107, 123, 123, 123, 139, 139, 139,
00386       155, 155, 155, 171, 171, 171, 187, 187, 187, 203, 203, 203, 219, 219, 219,
00387       235, 235, 235,  15,  11,   7,  23,  15,  11,  31,  23,  11,  39,  27,  15,
00388       47,  35,  19,  55,  43,  23,  63,  47,  23,  75,  55,  27,  83,  59,  27,
00389       91,  67,  31,  99,  75,  31, 107,  83,  31, 115,  87,  31, 123,  95,  35,
00390       131, 103,  35, 143, 111,  35,  11,  11,  15,  19,  19,  27,  27,  27,  39,
00391       39,  39,  51,  47,  47,  63,  55,  55,  75,  63,  63,  87,  71,  71, 103,
00392       79,  79, 115,  91,  91, 127,  99,  99, 139, 107, 107, 151, 115, 115, 163,
00393       123, 123, 175, 131, 131, 187, 139, 139, 203,   0,   0,   0,   7,   7,   0,
00394       11,  11,   0,  19,  19,   0,  27,  27,   0,  35,  35,   0,  43,  43,   7,
00395       47,  47,   7,  55,  55,   7,  63,  63,   7,  71,  71,   7,  75,  75,  11,
00396       83,  83,  11,  91,  91,  11,  99,  99,  11, 107, 107,  15,   7,   0,   0,
00397       15,   0,   0,  23,   0,   0,  31,   0,   0,  39,   0,   0,  47,   0,   0,
00398       55,   0,   0,  63,   0,   0,  71,   0,   0,  79,   0,   0,  87,   0,   0,
00399       95,   0,   0, 103,   0,   0, 111,   0,   0, 119,   0,   0, 127,   0,   0,
00400       19,  19,   0,  27,  27,   0,  35,  35,   0,  47,  43,   0,  55,  47,   0,
00401       67,  55,   0,  75,  59,   7,  87,  67,   7,  95,  71,   7, 107,  75,  11,
00402       119,  83,  15, 131,  87,  19, 139,  91,  19, 151,  95,  27, 163,  99,  31,
00403       175, 103,  35,  35,  19,   7,  47,  23,  11,  59,  31,  15,  75,  35,  19,
00404       87,  43,  23,  99,  47,  31, 115,  55,  35, 127,  59,  43, 143,  67,  51,
00405       159,  79,  51, 175,  99,  47, 191, 119,  47, 207, 143,  43, 223, 171,  39,
00406       239, 203,  31, 255, 243,  27,  11,   7,   0,  27,  19,   0,  43,  35,  15,
00407       55,  43,  19,  71,  51,  27,  83,  55,  35,  99,  63,  43, 111,  71,  51,
00408       127,  83,  63, 139,  95,  71, 155, 107,  83, 167, 123,  95, 183, 135, 107,
00409       195, 147, 123, 211, 163, 139, 227, 179, 151, 171, 139, 163, 159, 127, 151,
00410       147, 115, 135, 139, 103, 123, 127,  91, 111, 119,  83,  99, 107,  75,  87,
00411       95,  63,  75,  87,  55,  67,  75,  47,  55,  67,  39,  47,  55,  31,  35,
00412       43,  23,  27,  35,  19,  19,  23,  11,  11,  15,   7,   7, 187, 115, 159,
00413       175, 107, 143, 163,  95, 131, 151,  87, 119, 139,  79, 107, 127,  75,  95,
00414       115,  67,  83, 107,  59,  75,  95,  51,  63,  83,  43,  55,  71,  35,  43,
00415       59,  31,  35,  47,  23,  27,  35,  19,  19,  23,  11,  11,  15,   7,   7,
00416       219, 195, 187, 203, 179, 167, 191, 163, 155, 175, 151, 139, 163, 135, 123,
00417       151, 123, 111, 135, 111,  95, 123,  99,  83, 107,  87,  71,  95,  75,  59,
00418       83,  63,  51,  67,  51,  39,  55,  43,  31,  39,  31,  23,  27,  19,  15,
00419       15,  11  , 7, 111, 131, 123, 103, 123, 111,  95, 115, 103,  87, 107,  95,
00420       79,  99,  87,  71,  91,  79,  63,  83,  71,  55,  75,  63,  47,  67,  55,
00421       43,  59,  47,  35,  51,  39,  31,  43,  31,  23,  35,  23,  15,  27,  19,
00422       11,  19,  11,   7,  11,   7, 255, 243,  27, 239, 223,  23, 219, 203,  19,
00423       203, 183,  15, 187, 167,  15, 171, 151,  11, 155, 131,   7, 139, 115,   7,
00424       123,  99,   7, 107,  83,   0,  91,  71,   0,  75,  55,   0,  59,  43,   0,
00425       43,  31,   0,  27,  15,   0,  11,   7,   0,   0,   0, 255,  11,  11, 239,
00426       19,  19, 223,  27,  27, 207,  35,  35, 191,  43,  43, 175,  47,  47, 159,
00427       47,  47, 143,  47,  47, 127,  47,  47, 111,  47,  47,  95,  43,  43,  79,
00428       35,  35,  63,  27,  27,  47,  19,  19,  31,  11,  11,  15,  43,   0,   0,
00429       59,   0,   0,  75,   7,   0,  95,   7,   0, 111,  15,   0, 127,  23,   7,
00430       147,  31,   7, 163,  39,  11, 183,  51,  15, 195,  75,  27, 207,  99,  43,
00431       219, 127,  59, 227, 151,  79, 231, 171,  95, 239, 191, 119, 247, 211, 139,
00432       167, 123,  59, 183, 155,  55, 199, 195,  55, 231, 227,  87, 127, 191, 255,
00433       171, 231, 255, 215, 255, 255, 103,   0,   0, 139,   0,   0, 179,   0,   0,
00434       215,   0,   0, 255,   0,   0, 255, 243, 147, 255, 247, 199, 255, 255, 255,
00435       159,  91,  83
00436     };
00437 } // namespace Keos

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