KeosMDLQ1Loader.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 "KeosMDLQ1Loader.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   // CMDLQ1Loader implementation
00034   //=======================================================================
00035 
00036   //-----------------------------------------------------------------------
00037   CMesh* CMDLQ1Loader::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) !", "CMDLQ1Loader::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) !", "CMDLQ1Loader::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     for ( i = 0; i < Header.NbFrames; i++ )
00100     {
00101       Frames[i].Vertices.resize(Header.NbVertices);
00102 
00103       File.read( reinterpret_cast<char*>(&Frames[i].Type), sizeof(long) );
00104       File.read( reinterpret_cast<char*>(&Frames[i].BBoxMin), sizeof(TPoint) );
00105       File.read( reinterpret_cast<char*>(&Frames[i].BBoxMax), sizeof(TPoint) );
00106       File.read( reinterpret_cast<char*>(&Frames[i].Name), sizeof(char) * 16 );
00107       File.read( reinterpret_cast<char*>(&(Frames[i].Vertices[0])), sizeof(TPoint) * Header.NbVertices );
00108     }
00109 
00110     // Transformation of the data
00111     std::vector<CMeshGeom::TVertex> Vertices;
00112     std::vector<CMeshGeom::TIndex>  Indices;
00113     for (int i = 0; i < Header.NbTriangles; ++i)
00114     {
00115       for (int j = 0; j < 3; ++j)
00116       {
00117         // Recovery of the information on the current point
00118         CMeshGeom::TVertex v;
00119         const TPoint&    Vert = Frames[0].Vertices[Triangles[i].Vertices[j]];
00120         const TTexCoord& TexC = TexCoords[Triangles[i].Vertices[j]];
00121 
00122         // Build the vertex
00123         v.Position.x  = Vert.x * Header.Scale.x + Header.Translate.x;
00124         v.Position.y  = Vert.y * Header.Scale.y + Header.Translate.y;
00125         v.Position.z  = Vert.z * Header.Scale.z + Header.Translate.z;
00126         v.Normal      = ms_NormalTable[Vert.n];
00127         v.Color       = Renderer->ConvertColor(CColor::White);
00128         int u = 0;
00129         if ( !Triangles[i].FacesFront && TexCoords[ Triangles[i].Vertices[j]].Onseam )
00130           u += Header.TexWidth / 2; // back face
00131         v.TexCoords.x = (TexC.u + u + 0.5) / static_cast<float>(Header.TexWidth);
00132         v.TexCoords.y = (TexC.v + 0.5) / static_cast<float>(Header.TexHeight);
00133 
00134         // Addition in the vertex buffer and in the index buffer
00135         Vertices.push_back(v);
00136         Indices.push_back(i * 3 + 2 - j);
00137       }
00138     }
00139 
00140     // Create the mesh and assign a material
00141     CMesh *pMesh = new CMesh();
00142     CMeshGeom* pMeshGeom = new CMeshGeom(&Vertices[0], (int)Vertices.size(), &Indices[0], (int)Indices.size());
00143     pMesh->AddMeshGeom(pMeshGeom);
00144     CMaterial *pMaterial = new CMaterial();
00145     pMaterial->CreateTexture(TextureImg);
00146     pMesh->AddMaterial(pMaterial, 0);
00147 
00148     return pMesh;
00149   }
00150 
00151   //-----------------------------------------------------------------------
00152   void CMDLQ1Loader::LoadColorMap( const String& strFilename, uchar* ColorMap )
00153   {
00154     std::fstream File;
00155 
00156     File.open( strFilename.c_str(), std::ios::in | std::ios::binary );
00157 
00158     if ( File.fail() )
00159       LOADINGFAILED_EXCEPT(strFilename, "", "CMDLQ1Loader::LoadColorMap");
00160 
00161     memset( ColorMap, 0, 768 );
00162     File.read( (char *)ColorMap, 768 );
00163 
00164     /*std::ofstream m_File("toto.txt");
00165     for (int i=0; i<768; i++)
00166         m_File << CStringConverter::ToString(ColorMap[i]) << ", ";*/
00167 
00168     File.close();
00169   }
00170 
00171   //-----------------------------------------------------------------------
00172   // Table of the normals
00173   const TVector3F CMDLQ1Loader::ms_NormalTable[] =
00174     {
00175       TVector3F(-0.525731f,  0.000000f,  0.850651f),
00176       TVector3F(-0.442863f,  0.238856f,  0.864188f),
00177       TVector3F(-0.295242f,  0.000000f,  0.955423f),
00178       TVector3F(-0.309017f,  0.500000f,  0.809017f),
00179       TVector3F(-0.162460f,  0.262866f,  0.951056f),
00180       TVector3F( 0.000000f,  0.000000f,  1.000000f),
00181       TVector3F( 0.000000f,  0.850651f,  0.525731f),
00182       TVector3F(-0.147621f,  0.716567f,  0.681718f),
00183       TVector3F( 0.147621f,  0.716567f,  0.681718f),
00184       TVector3F( 0.000000f,  0.525731f,  0.850651f),
00185       TVector3F( 0.309017f,  0.500000f,  0.809017f),
00186       TVector3F( 0.525731f,  0.000000f,  0.850651f),
00187       TVector3F( 0.295242f,  0.000000f,  0.955423f),
00188       TVector3F( 0.442863f,  0.238856f,  0.864188f),
00189       TVector3F( 0.162460f,  0.262866f,  0.951056f),
00190       TVector3F(-0.681718f,  0.147621f,  0.716567f),
00191       TVector3F(-0.809017f,  0.309017f,  0.500000f),
00192       TVector3F(-0.587785f,  0.425325f,  0.688191f),
00193       TVector3F(-0.850651f,  0.525731f,  0.000000f),
00194       TVector3F(-0.864188f,  0.442863f,  0.238856f),
00195       TVector3F(-0.716567f,  0.681718f,  0.147621f),
00196       TVector3F(-0.688191f,  0.587785f,  0.425325f),
00197       TVector3F(-0.500000f,  0.809017f,  0.309017f),
00198       TVector3F(-0.238856f,  0.864188f,  0.442863f),
00199       TVector3F(-0.425325f,  0.688191f,  0.587785f),
00200       TVector3F(-0.716567f,  0.681718f, -0.147621f),
00201       TVector3F(-0.500000f,  0.809017f, -0.309017f),
00202       TVector3F(-0.525731f,  0.850651f,  0.000000f),
00203       TVector3F( 0.000000f,  0.850651f, -0.525731f),
00204       TVector3F(-0.238856f,  0.864188f, -0.442863f),
00205       TVector3F( 0.000000f,  0.955423f, -0.295242f),
00206       TVector3F(-0.262866f,  0.951056f, -0.162460f),
00207       TVector3F( 0.000000f,  1.000000f,  0.000000f),
00208       TVector3F( 0.000000f,  0.955423f,  0.295242f),
00209       TVector3F(-0.262866f,  0.951056f,  0.162460f),
00210       TVector3F( 0.238856f,  0.864188f,  0.442863f),
00211       TVector3F( 0.262866f,  0.951056f,  0.162460f),
00212       TVector3F( 0.500000f,  0.809017f,  0.309017f),
00213       TVector3F( 0.238856f,  0.864188f, -0.442863f),
00214       TVector3F( 0.262866f,  0.951056f, -0.162460f),
00215       TVector3F( 0.500000f,  0.809017f, -0.309017f),
00216       TVector3F( 0.850651f,  0.525731f,  0.000000f),
00217       TVector3F( 0.716567f,  0.681718f,  0.147621f),
00218       TVector3F( 0.716567f,  0.681718f, -0.147621f),
00219       TVector3F( 0.525731f,  0.850651f,  0.000000f),
00220       TVector3F( 0.425325f,  0.688191f,  0.587785f),
00221       TVector3F( 0.864188f,  0.442863f,  0.238856f),
00222       TVector3F( 0.688191f,  0.587785f,  0.425325f),
00223       TVector3F( 0.809017f,  0.309017f,  0.500000f),
00224       TVector3F( 0.681718f,  0.147621f,  0.716567f),
00225       TVector3F( 0.587785f,  0.425325f,  0.688191f),
00226       TVector3F( 0.955423f,  0.295242f,  0.000000f),
00227       TVector3F( 1.000000f,  0.000000f,  0.000000f),
00228       TVector3F( 0.951056f,  0.162460f,  0.262866f),
00229       TVector3F( 0.850651f, -0.525731f,  0.000000f),
00230       TVector3F( 0.955423f, -0.295242f,  0.000000f),
00231       TVector3F( 0.864188f, -0.442863f,  0.238856f),
00232       TVector3F( 0.951056f, -0.162460f,  0.262866f),
00233       TVector3F( 0.809017f, -0.309017f,  0.500000f),
00234       TVector3F( 0.681718f, -0.147621f,  0.716567f),
00235       TVector3F( 0.850651f,  0.000000f,  0.525731f),
00236       TVector3F( 0.864188f,  0.442863f, -0.238856f),
00237       TVector3F( 0.809017f,  0.309017f, -0.500000f),
00238       TVector3F( 0.951056f,  0.162460f, -0.262866f),
00239       TVector3F( 0.525731f,  0.000000f, -0.850651f),
00240       TVector3F( 0.681718f,  0.147621f, -0.716567f),
00241       TVector3F( 0.681718f, -0.147621f, -0.716567f),
00242       TVector3F( 0.850651f,  0.000000f, -0.525731f),
00243       TVector3F( 0.809017f, -0.309017f, -0.500000f),
00244       TVector3F( 0.864188f, -0.442863f, -0.238856f),
00245       TVector3F( 0.951056f, -0.162460f, -0.262866f),
00246       TVector3F( 0.147621f,  0.716567f, -0.681718f),
00247       TVector3F( 0.309017f,  0.500000f, -0.809017f),
00248       TVector3F( 0.425325f,  0.688191f, -0.587785f),
00249       TVector3F( 0.442863f,  0.238856f, -0.864188f),
00250       TVector3F( 0.587785f,  0.425325f, -0.688191f),
00251       TVector3F( 0.688191f,  0.587785f, -0.425325f),
00252       TVector3F(-0.147621f,  0.716567f, -0.681718f),
00253       TVector3F(-0.309017f,  0.500000f, -0.809017f),
00254       TVector3F( 0.000000f,  0.525731f, -0.850651f),
00255       TVector3F(-0.525731f,  0.000000f, -0.850651f),
00256       TVector3F(-0.442863f,  0.238856f, -0.864188f),
00257       TVector3F(-0.295242f,  0.000000f, -0.955423f),
00258       TVector3F(-0.162460f,  0.262866f, -0.951056f),
00259       TVector3F( 0.000000f,  0.000000f, -1.000000f),
00260       TVector3F( 0.295242f,  0.000000f, -0.955423f),
00261       TVector3F( 0.162460f,  0.262866f, -0.951056f),
00262       TVector3F(-0.442863f, -0.238856f, -0.864188f),
00263       TVector3F(-0.309017f, -0.500000f, -0.809017f),
00264       TVector3F(-0.162460f, -0.262866f, -0.951056f),
00265       TVector3F( 0.000000f, -0.850651f, -0.525731f),
00266       TVector3F(-0.147621f, -0.716567f, -0.681718f),
00267       TVector3F( 0.147621f, -0.716567f, -0.681718f),
00268       TVector3F( 0.000000f, -0.525731f, -0.850651f),
00269       TVector3F( 0.309017f, -0.500000f, -0.809017f),
00270       TVector3F( 0.442863f, -0.238856f, -0.864188f),
00271       TVector3F( 0.162460f, -0.262866f, -0.951056f),
00272       TVector3F( 0.238856f, -0.864188f, -0.442863f),
00273       TVector3F( 0.500000f, -0.809017f, -0.309017f),
00274       TVector3F( 0.425325f, -0.688191f, -0.587785f),
00275       TVector3F( 0.716567f, -0.681718f, -0.147621f),
00276       TVector3F( 0.688191f, -0.587785f, -0.425325f),
00277       TVector3F( 0.587785f, -0.425325f, -0.688191f),
00278       TVector3F( 0.000000f, -0.955423f, -0.295242f),
00279       TVector3F( 0.000000f, -1.000000f,  0.000000f),
00280       TVector3F( 0.262866f, -0.951056f, -0.162460f),
00281       TVector3F( 0.000000f, -0.850651f,  0.525731f),
00282       TVector3F( 0.000000f, -0.955423f,  0.295242f),
00283       TVector3F( 0.238856f, -0.864188f,  0.442863f),
00284       TVector3F( 0.262866f, -0.951056f,  0.162460f),
00285       TVector3F( 0.500000f, -0.809017f,  0.309017f),
00286       TVector3F( 0.716567f, -0.681718f,  0.147621f),
00287       TVector3F( 0.525731f, -0.850651f,  0.000000f),
00288       TVector3F(-0.238856f, -0.864188f, -0.442863f),
00289       TVector3F(-0.500000f, -0.809017f, -0.309017f),
00290       TVector3F(-0.262866f, -0.951056f, -0.162460f),
00291       TVector3F(-0.850651f, -0.525731f,  0.000000f),
00292       TVector3F(-0.716567f, -0.681718f, -0.147621f),
00293       TVector3F(-0.716567f, -0.681718f,  0.147621f),
00294       TVector3F(-0.525731f, -0.850651f,  0.000000f),
00295       TVector3F(-0.500000f, -0.809017f,  0.309017f),
00296       TVector3F(-0.238856f, -0.864188f,  0.442863f),
00297       TVector3F(-0.262866f, -0.951056f,  0.162460f),
00298       TVector3F(-0.864188f, -0.442863f,  0.238856f),
00299       TVector3F(-0.809017f, -0.309017f,  0.500000f),
00300       TVector3F(-0.688191f, -0.587785f,  0.425325f),
00301       TVector3F(-0.681718f, -0.147621f,  0.716567f),
00302       TVector3F(-0.442863f, -0.238856f,  0.864188f),
00303       TVector3F(-0.587785f, -0.425325f,  0.688191f),
00304       TVector3F(-0.309017f, -0.500000f,  0.809017f),
00305       TVector3F(-0.147621f, -0.716567f,  0.681718f),
00306       TVector3F(-0.425325f, -0.688191f,  0.587785f),
00307       TVector3F(-0.162460f, -0.262866f,  0.951056f),
00308       TVector3F( 0.442863f, -0.238856f,  0.864188f),
00309       TVector3F( 0.162460f, -0.262866f,  0.951056f),
00310       TVector3F( 0.309017f, -0.500000f,  0.809017f),
00311       TVector3F( 0.147621f, -0.716567f,  0.681718f),
00312       TVector3F( 0.000000f, -0.525731f,  0.850651f),
00313       TVector3F( 0.425325f, -0.688191f,  0.587785f),
00314       TVector3F( 0.587785f, -0.425325f,  0.688191f),
00315       TVector3F( 0.688191f, -0.587785f,  0.425325f),
00316       TVector3F(-0.955423f,  0.295242f,  0.000000f),
00317       TVector3F(-0.951056f,  0.162460f,  0.262866f),
00318       TVector3F(-1.000000f,  0.000000f,  0.000000f),
00319       TVector3F(-0.850651f,  0.000000f,  0.525731f),
00320       TVector3F(-0.955423f, -0.295242f,  0.000000f),
00321       TVector3F(-0.951056f, -0.162460f,  0.262866f),
00322       TVector3F(-0.864188f,  0.442863f, -0.238856f),
00323       TVector3F(-0.951056f,  0.162460f, -0.262866f),
00324       TVector3F(-0.809017f,  0.309017f, -0.500000f),
00325       TVector3F(-0.864188f, -0.442863f, -0.238856f),
00326       TVector3F(-0.951056f, -0.162460f, -0.262866f),
00327       TVector3F(-0.809017f, -0.309017f, -0.500000f),
00328       TVector3F(-0.681718f,  0.147621f, -0.716567f),
00329       TVector3F(-0.681718f, -0.147621f, -0.716567f),
00330       TVector3F(-0.850651f,  0.000000f, -0.525731f),
00331       TVector3F(-0.688191f,  0.587785f, -0.425325f),
00332       TVector3F(-0.587785f,  0.425325f, -0.688191f),
00333       TVector3F(-0.425325f,  0.688191f, -0.587785f),
00334       TVector3F(-0.425325f, -0.688191f, -0.587785f),
00335       TVector3F(-0.587785f, -0.425325f, -0.688191f),
00336       TVector3F(-0.688191f, -0.587785f, -0.425325f)
00337     };
00338 
00339   //-----------------------------------------------------------------------
00340   // Default color map
00341   const uchar CMDLQ1Loader::ms_DefaultColorMap[] =
00342     {
00343       0,   0,   0,   1,   1,  15,  31,  31,  31,  47,  47,  47,  63,  63,  63,
00344       75,  75,  75,  91,  91,  91, 107, 107, 107, 123, 123, 123, 139, 139, 139,
00345       155, 155, 155, 171, 171, 171, 187, 187, 187, 203, 203, 203, 219, 219, 219,
00346       235, 235, 235,  15,  11,   7,  23,  15,  11,  31,  23,  11,  39,  27,  15,
00347       47,  35,  19,  55,  43,  23,  63,  47,  23,  75,  55,  27,  83,  59,  27,
00348       91,  67,  31,  99,  75,  31, 107,  83,  31, 115,  87,  31, 123,  95,  35,
00349       131, 103,  35, 143, 111,  35,  11,  11,  15,  19,  19,  27,  27,  27,  39,
00350       39,  39,  51,  47,  47,  63,  55,  55,  75,  63,  63,  87,  71,  71, 103,
00351       79,  79, 115,  91,  91, 127,  99,  99, 139, 107, 107, 151, 115, 115, 163,
00352       123, 123, 175, 131, 131, 187, 139, 139, 203,   0,   0,   0,   7,   7,   0,
00353       11,  11,   0,  19,  19,   0,  27,  27,   0,  35,  35,   0,  43,  43,   7,
00354       47,  47,   7,  55,  55,   7,  63,  63,   7,  71,  71,   7,  75,  75,  11,
00355       83,  83,  11,  91,  91,  11,  99,  99,  11, 107, 107,  15,   7,   0,   0,
00356       15,   0,   0,  23,   0,   0,  31,   0,   0,  39,   0,   0,  47,   0,   0,
00357       55,   0,   0,  63,   0,   0,  71,   0,   0,  79,   0,   0,  87,   0,   0,
00358       95,   0,   0, 103,   0,   0, 111,   0,   0, 119,   0,   0, 127,   0,   0,
00359       19,  19,   0,  27,  27,   0,  35,  35,   0,  47,  43,   0,  55,  47,   0,
00360       67,  55,   0,  75,  59,   7,  87,  67,   7,  95,  71,   7, 107,  75,  11,
00361       119,  83,  15, 131,  87,  19, 139,  91,  19, 151,  95,  27, 163,  99,  31,
00362       175, 103,  35,  35,  19,   7,  47,  23,  11,  59,  31,  15,  75,  35,  19,
00363       87,  43,  23,  99,  47,  31, 115,  55,  35, 127,  59,  43, 143,  67,  51,
00364       159,  79,  51, 175,  99,  47, 191, 119,  47, 207, 143,  43, 223, 171,  39,
00365       239, 203,  31, 255, 243,  27,  11,   7,   0,  27,  19,   0,  43,  35,  15,
00366       55,  43,  19,  71,  51,  27,  83,  55,  35,  99,  63,  43, 111,  71,  51,
00367       127,  83,  63, 139,  95,  71, 155, 107,  83, 167, 123,  95, 183, 135, 107,
00368       195, 147, 123, 211, 163, 139, 227, 179, 151, 171, 139, 163, 159, 127, 151,
00369       147, 115, 135, 139, 103, 123, 127,  91, 111, 119,  83,  99, 107,  75,  87,
00370       95,  63,  75,  87,  55,  67,  75,  47,  55,  67,  39,  47,  55,  31,  35,
00371       43,  23,  27,  35,  19,  19,  23,  11,  11,  15,   7,   7, 187, 115, 159,
00372       175, 107, 143, 163,  95, 131, 151,  87, 119, 139,  79, 107, 127,  75,  95,
00373       115,  67,  83, 107,  59,  75,  95,  51,  63,  83,  43,  55,  71,  35,  43,
00374       59,  31,  35,  47,  23,  27,  35,  19,  19,  23,  11,  11,  15,   7,   7,
00375       219, 195, 187, 203, 179, 167, 191, 163, 155, 175, 151, 139, 163, 135, 123,
00376       151, 123, 111, 135, 111,  95, 123,  99,  83, 107,  87,  71,  95,  75,  59,
00377       83,  63,  51,  67,  51,  39,  55,  43,  31,  39,  31,  23,  27,  19,  15,
00378       15,  11  , 7, 111, 131, 123, 103, 123, 111,  95, 115, 103,  87, 107,  95,
00379       79,  99,  87,  71,  91,  79,  63,  83,  71,  55,  75,  63,  47,  67,  55,
00380       43,  59,  47,  35,  51,  39,  31,  43,  31,  23,  35,  23,  15,  27,  19,
00381       11,  19,  11,   7,  11,   7, 255, 243,  27, 239, 223,  23, 219, 203,  19,
00382       203, 183,  15, 187, 167,  15, 171, 151,  11, 155, 131,   7, 139, 115,   7,
00383       123,  99,   7, 107,  83,   0,  91,  71,   0,  75,  55,   0,  59,  43,   0,
00384       43,  31,   0,  27,  15,   0,  11,   7,   0,   0,   0, 255,  11,  11, 239,
00385       19,  19, 223,  27,  27, 207,  35,  35, 191,  43,  43, 175,  47,  47, 159,
00386       47,  47, 143,  47,  47, 127,  47,  47, 111,  47,  47,  95,  43,  43,  79,
00387       35,  35,  63,  27,  27,  47,  19,  19,  31,  11,  11,  15,  43,   0,   0,
00388       59,   0,   0,  75,   7,   0,  95,   7,   0, 111,  15,   0, 127,  23,   7,
00389       147,  31,   7, 163,  39,  11, 183,  51,  15, 195,  75,  27, 207,  99,  43,
00390       219, 127,  59, 227, 151,  79, 231, 171,  95, 239, 191, 119, 247, 211, 139,
00391       167, 123,  59, 183, 155,  55, 199, 195,  55, 231, 227,  87, 127, 191, 255,
00392       171, 231, 255, 215, 255, 255, 103,   0,   0, 139,   0,   0, 179,   0,   0,
00393       215,   0,   0, 255,   0,   0, 255, 243, 147, 255, 247, 199, 255, 255, 255,
00394       159,  91,  83
00395     };
00396 } // namespace Keos

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