00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
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
00034
00035
00036
00037 CAnimatedMeshKF* CMDLQ1AnimatedLoader::LoadFromFile(const String& strFilename)
00038 {
00039 int i;
00040
00041
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
00047 THeader Header;
00048 File.read(reinterpret_cast<char*>(&Header), sizeof(Header));
00049
00050
00051 if (Header.Ident != ms_nMagicId)
00052 LOADINGFAILED_EXCEPT(strFilename, "The file is not a valid model MDL (Quake1) !", "CMDLQ1AnimatedLoader::LoadFromFile");
00053
00054
00055 if (Header.Version != ms_nMDLQ1Version)
00056 LOADINGFAILED_EXCEPT(strFilename, "The file is not a valid model MDL (Quake1) !", "CMDLQ1AnimatedLoader::LoadFromFile");
00057
00058
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
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
00074 if (i == 0)
00075 {
00076 std::vector<uchar> Texels(Header.TexHeight * Header.TexWidth * 4);
00077
00078
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
00093 File.read( reinterpret_cast<char*>(&TexCoords[0]), sizeof(TTexCoord) * Header.NbVertices );
00094
00095
00096 File.read( reinterpret_cast<char*>(&Triangles[0]), sizeof(TTriangle) * Header.NbTriangles );
00097
00098
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
00112 for (int i = 0; i < Header.NbTriangles; ++i)
00113 {
00114 for (int j = 0; j < 3; ++j)
00115 {
00116
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
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;
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
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
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
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
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
00169 AnimInfo.Begin = i;
00170 AnimInfo.End = i;
00171
00172 strCurrentAnim = strFrameAnim;
00173 }
00174 else
00175 {
00176 AnimInfo.End = i;
00177 }
00178 }
00179
00180
00181 pMesh->AddAnimation(AnimInfo);
00182 ILogger::Log(" |- Anim%d: %s", nAnims++, strCurrentAnim.c_str());
00183
00184
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
00206
00207
00208
00209 File.close();
00210 }
00211
00212
00213
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
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 }