RayTracing
Serial.cpp
См. документацию.
00001 //Serializer.cpp
00002 
00003 #include "stdio.h"
00004 #include "Serial.h"
00005 
00006 QString StartStr = "<?xml version = \"1.0\"?>\n<Scene>\n";
00007 QString EndStr = "</Scene>";
00008 QString StringStr1 = "<String Name = \"";
00009 QString StringStr2 = "\"> ";
00010 QString StringStr3 = " </String>\n";
00011 QString BoolStr1 = "<Bool Name = \"";
00012 QString BoolStr2 = "\"> ";
00013 QString BoolStr3 = " </Bool>\n";
00014 QString IntStr1 = "<Int Name = \"";
00015 QString IntStr2 = "\"> ";
00016 QString IntStr3 = " </Int>\n";
00017 QString FloatStr1 = "<Float Name = \"";
00018 QString FloatStr2 = "\"> ";
00019 QString FloatStr3 = " </Float>\n";
00020 QString VectorStr1 = "<Vector Name = \"";
00021 QString VectorStr2 = "\"> ";
00022 QString VectorStr3 = " </Vector>\n";
00024 char TmpStr[256];
00025 
00026 Serializer::Serializer()
00027 {
00028     File = NULL;
00029     format = XML;
00030 }
00031 
00032 Serializer::~Serializer(){}
00033 
00034 void Serializer::SerPic(int &Width, int &Height, char *Name)
00035 {
00036     QString StrOpen = "<Screen>\n", StrClose = "</Screen>\n";
00037     int p = 0;
00038     if (!readWrite && !format) p = 1;
00039 
00040     if(readWrite)
00041     {
00042         //fprintf(f, StrOpen);
00043         File->write(StrOpen.toAscii());
00044         File->flush();
00045     }
00046     else
00047         //fread(TmpStr, 1, strlen(StrOpen), f);
00048         File->readLine(TmpStr, StrOpen.length() + p);
00049 
00050     SerStr(Name, "Attribute");
00051 
00052     SerInt(Width, "Width");
00053     SerInt(Height, "Height");
00054 
00055 
00056     if(readWrite)
00057     {
00058         //fprintf(f, StrClose);
00059         File->write(StrClose.toAscii());
00060         File->flush();
00061     }
00062     else
00063         //fread(TmpStr, 1, strlen(StrClose), f);
00064         File->readLine(TmpStr, StrClose.length() + p);
00065 }
00066 
00067 void Serializer::SerCam(Vector3D &Camera, char *Name)
00068 {
00069     int p = 0;
00070     if (!readWrite && !format) p = 1;
00071 
00072     QString StrOpen = "<Camera>\n", StrClose = "</Camera>\n";
00073     if(readWrite)
00074     {
00075         //fprintf(f, StrOpen);
00076         File->write(StrOpen.toAscii());
00077         File->flush();
00078     }
00079     else
00080         //fread(TmpStr, 1, strlen(StrOpen), f);
00081         File->readLine(TmpStr, StrOpen.length() + p);
00082 
00083     SerStr(Name, "Attribute");
00084 
00085     SerVec(Camera, "Position");
00086 
00087     if(readWrite)
00088     {
00089         //fprintf(f, StrClose);
00090         File->write(StrClose.toAscii());
00091         File->flush();
00092     }
00093     else
00094         //fread(TmpStr, 1, strlen(StrClose), f);
00095         File->readLine(TmpStr, StrClose.length() + p);
00096 }
00097 
00098 void Serializer::SerMat(Mater &Material, char * Name)
00099 {
00100     int p = 0;
00101     if (!readWrite && !format) p = 1;
00102 
00103     QString StrOpen = "<Material>\n", StrClose = "</Material>\n";
00104     if(readWrite)
00105     {
00106         //fprintf(f, StrOpen);
00107         File->write(StrOpen.toAscii());
00108         File->flush();
00109     }
00110     else
00111         //fread(TmpStr, 1, strlen(StrOpen), f);
00112         File->readLine(TmpStr, StrOpen.length() + p);
00113 
00114     SerStr (Name, "Attribute");
00115 
00116     SerVec(Material.Colour, "Color");
00117     SerVec(Material.Specular, "Specular");
00118     SerVec(Material.Reflectivity, "Reflectivity");
00119 
00120     if(readWrite)
00121     {
00122         //fprintf(f, StrClose);
00123         File->write(StrClose.toAscii());
00124         File->flush();
00125     }
00126     else
00127         //fread(TmpStr, 1, strlen(StrClose), f);
00128         File->readLine(TmpStr, StrClose.length() + p);
00129 }
00130 
00131 void Serializer::SerSph(Sphere &Sphere, char *Name)
00132 {
00133     int p = 0;
00134     if (!readWrite && !format) p = 1;
00135 
00136     QString StrOpen = "<Sphere>\n", StrClose = "</Sphere>\n";
00137     if(readWrite)
00138     {
00139         //fprintf(f, StrOpen);
00140         File->write(StrOpen.toAscii());
00141         File->flush();
00142     }
00143     else
00144         //fread(TmpStr, 1, strlen(StrOpen), f);
00145         File->readLine(TmpStr, StrOpen.length() + p);
00146 
00147     SerStr(Name, "Attribute");
00148         
00149     SerVec(Sphere.Position, "Position");
00150     SerFloat(Sphere.Radius, "Radius");
00151     SerMat(Sphere.Material, "Material");
00152 
00153     if(readWrite)
00154     {
00155         //fprintf(f, StrClose);
00156         File->write(StrClose.toAscii());
00157         File->flush();
00158     }
00159     else
00160         //fread(TmpStr, 1, strlen(StrClose), f);
00161         File->readLine(TmpStr, StrClose.length() + p);
00162 }
00163 
00164 void Serializer::SerThor(Thor &Thor, char *Name)
00165 {
00166     int p = 0;
00167     if (!readWrite && !format) p = 1;
00168 
00169     QString StrOpen = "<Thor>\n", StrClose = "</Thor>\n";
00170     if(readWrite)
00171     {
00172         //fprintf(f, StrOpen);
00173         File->write(StrOpen.toAscii());
00174         File->flush();
00175     }
00176     else
00177         //fread(TmpStr, 1, strlen(StrOpen), f);
00178         File->readLine(TmpStr, StrOpen.length() + p);
00179 
00180     SerStr(Name, "Attribute");
00181 
00182     SerVec(Thor.PosCen, "Position");
00183     SerFloat(Thor.Radius, "Radius");
00184     SerFloat(Thor.Width, "Width");
00185     SerMat(Thor.Material, "Material");
00186 
00187     if(readWrite)
00188     {
00189         //fprintf(f, StrClose);
00190         File->write(StrClose.toAscii());
00191         File->flush();
00192     }
00193     else
00194         //fread(TmpStr, 1, strlen(StrClose), f);
00195         File->readLine(TmpStr, StrClose.length() + p);
00196 }
00197 
00198 void Serializer::SerLight(Light &Light, char *Name)
00199 {
00200     int p = 0;
00201     if (!readWrite && !format) p = 1;
00202 
00203     QString StrOpen = "<Light>\n", StrClose = "</Light>\n";
00204     if(readWrite)
00205     {
00206         //fprintf(f, StrOpen);
00207         File->write(StrOpen.toAscii());
00208         File->flush();
00209     }
00210     else
00211         //fread(TmpStr, 1, strlen(StrOpen), f);
00212         File->readLine(TmpStr, StrOpen.length() + p);
00213 
00214     SerStr(Name, "Caption");
00215         
00216     SerVec(Light.Position, "Position");
00217     SerVec(Light.Colour, "Color");
00218     SerFloat(Light.ConstAttenuation, "ConstAttenuation");
00219     SerFloat(Light.LinearAttenuation, "LinearAttenuation");
00220     SerFloat(Light.QuadricAttenuation, "QuadricAttenuation");
00221 
00222     if(readWrite)
00223     {
00224         //fprintf(f, StrClose);
00225         File->write(StrClose.toAscii());
00226         File->flush();
00227     }
00228     else
00229         //fread(TmpStr, 1, strlen(StrClose), f);
00230         File->readLine(TmpStr, StrClose.length() + p);
00231 }
00232 
00233 XMLS::XMLS()
00234 {
00235     format = XML;
00236     readWrite = WR;
00237 }
00238 
00239 XMLS::~XMLS()
00240 {
00241 }
00242 
00243 bool XMLS::Start(QString FileName)
00244 {
00245 
00246     File = new QFile(FileName);
00247     if(!File->open(QIODevice::WriteOnly))
00248         return false;
00249 
00250     //int Len = StartStr.length();
00251         
00252     File->write(StartStr.toAscii());
00253     File->flush();
00254 
00255     return true;
00256 }
00257 
00258 void XMLS::SerStr(char * Value, char * Name)
00259 {       
00260     //fprintf(f, StringStr, Name, Value);
00261     File->write(StringStr1.toAscii());
00262     File->write(Name);
00263     File->write(StringStr2.toAscii());
00264     File->write(Value);
00265     File->write(StringStr3.toAscii());
00266     File->flush();
00267 }
00268 
00269 void XMLS::SerBool(bool &Value, char * Name)
00270 {
00271     //fprintf(f, '\t');
00272     File->write(BoolStr1.toAscii());
00273     File->write(Name);
00274     File->write(BoolStr2.toAscii());
00275     if(Value)
00276     {
00277         //fprintf(f, BoolStr, Name, "true");
00278         File->write("true");
00279     }
00280     else
00281         //fprintf(f, BoolStr, Name, "false");
00282         File->write("false");
00283 
00284     File->write(BoolStr3.toAscii());
00285     File->flush();
00286 }
00287 
00288 void XMLS::SerInt(int &Value, char * Name)
00289 {
00290     //fprintf(f, '\t');
00291     //fprintf(f, IntStr, Name, Value);
00292     File->write(IntStr1.toAscii());
00293     File->write(Name);
00294     File->write(IntStr2.toAscii());
00295     char buffer[20];
00296     char *p;
00297     p = itoa(Value, buffer, 10);
00298     File->write(p);;
00299     File->write(IntStr3.toAscii());
00300     File->flush();
00301 }
00302 
00303 void XMLS::SerFloat(float &Value, char * Name)
00304 {
00305     //fprintf(f, '\t');
00306     //fprintf(f, FloatStr, Name, Value);
00307     File->write(FloatStr1.toAscii());
00308     File->write(Name);
00309     File->write(FloatStr2.toAscii());
00310     char buffer[20];
00311     sprintf(buffer, "%f", Value );
00312     File->write(buffer);
00313     File->write(FloatStr3.toAscii());
00314     File->flush();
00315 }
00316 
00317 void XMLS::SerVec(Vector3D &Value, char * Name)
00318 {
00319     //fprintf(f, '\t');
00320     //fprintf(f, VectorStr, Name, Value.X, Value.Y, Value.Z);
00321     File->write(VectorStr1.toAscii());
00322     File->write(Name);
00323     File->write(VectorStr2.toAscii());
00324     char buffer[20];
00325     sprintf(buffer, "%f %f %f", Value.X, Value.Y, Value.Z);
00326     File->write(buffer);
00327     File->write(VectorStr3.toAscii());
00328     File->flush();
00329 }
00330 
00331 void XMLS::End()
00332 {
00333     //int Len = strlen(EndStr);
00334     //fwrite(EndStr, 1, Len, f);
00335     File->write(EndStr.toAscii());
00336     File->flush();
00337     File->close();
00338     delete File;
00339 }
00340 
00341 XMLL::XMLL()
00342 {
00343     format = XML;
00344     readWrite = RE;
00345 }
00346 
00347 XMLL::~XMLL()
00348 {
00349 }
00350 
00351 bool XMLL::Start(QString FileName)
00352 {
00353     //fscanf(f, StartStr);
00354 
00355     File = new QFile(FileName);
00356     if(!File->open(QIODevice::ReadOnly))
00357         return false;
00358 
00359     char *temp = new char [256];
00360     File->read(temp, StartStr.length());
00361     delete temp;
00362 
00363     return true;
00364 }
00365 
00366 void XMLL::SerStr(char * Value, char * Name)
00367 {
00368     int i;
00369     char c, p;
00370 
00371     for(i = 0; i < 2; i++)
00372     {
00373         do
00374         {
00375             File->getChar(&c);
00376             //c = fgetc(f);
00377             if(c == EOF) return;
00378         }
00379         while(c != '\"');
00380     }
00381 
00382     do
00383     {
00384         File->getChar(&c);
00385         //c = fgetc(f);
00386         if(c == EOF) return;
00387     }
00388     while(c != '>');
00389     File->getChar(&p);
00390     //fgetc(f);
00391 
00392     i = 0;
00393 
00394     do
00395     {
00396 
00397         File->getChar(&c);
00398         //c = fgetc(f);
00399         if(c == EOF) return;
00400 
00401         TmpStr[i] = c;
00402         i++;
00403     }
00404     while(c != '<');
00405     TmpStr[i-2] = 0;
00406 
00407     //fread(TmpStr, 1, strlen("/Int>\n"), f);
00408     File->read(TmpStr, strlen("/Int>\n"));
00409 }
00410 
00411 void XMLL::SerBool(bool &Value, char * Name)
00412 {
00413     int i;
00414     char c;
00415     char str[256];
00416 
00417     for(i = 0; i < 2; i++)
00418     {
00419         do
00420         {
00421             //c = fgetc(f);
00422             File->getChar(&c);
00423             if(c == EOF) return;
00424         }
00425     while(c != '\"');
00426     }
00427 
00428     do
00429     {
00430         //c = fgetc(f);
00431         File->getChar(&c);
00432         if(c == EOF) return;
00433     }
00434     while(c != '>');
00435     //fgetc(f);
00436     File->getChar(&c);
00437 
00438     //fscanf(f, "%s", str);
00439     File->readLine(str, sizeof(str));
00440     if(!strcmp(str, "true"))
00441         Value = true;
00442     else
00443         Value = false;
00444     //fread(TmpStr, 1, strlen("</Bool>\n"), f);
00445     File->read(TmpStr, strlen("</Bool>\n"));
00446 }
00447 
00448 void XMLL::SerInt(int &Value, char * Name)
00449 {
00450     int i;
00451     char c;
00452     char str[256];
00453 
00454     for(i = 0; i < 2; i++)
00455     {
00456         do
00457         {
00458             //c = fgetc(f);
00459             File->getChar(&c);
00460             if(c == EOF) return;
00461         }
00462     while(c != '\"');
00463     }
00464 
00465     do
00466     {
00467         //c = fgetc(f);
00468         File->getChar(&c);
00469         if(c == EOF) return;
00470     }
00471     while(c != '>');
00472     //fgetc(f);
00473     File->getChar(&c);
00474 
00475     File->readLine(str, sizeof(str));
00476     sscanf(str, "%d", &Value);
00477     //fread(TmpStr, 1, strlen("</Int>\n"), f);
00478     File->read(TmpStr, strlen("</Int>\\n"));
00479 }
00480 
00481 void XMLL::SerFloat(float &Value, char * Name)
00482 {
00483     int i;
00484     char c;
00485     char str[256];
00486 
00487     for(i = 0; i < 2; i++)
00488     {
00489         do
00490         {
00491             //c = fgetc(f);
00492             File->getChar(&c);
00493             if(c == EOF) return;
00494         }
00495     while(c != '\"');
00496     }
00497 
00498     do
00499     {
00500         //c = fgetc(f);
00501         File->getChar(&c);
00502         if(c == EOF) return;
00503     }
00504     while(c != '>');
00505     //fgetc(f);
00506     File->getChar(&c);
00507 
00508     File->readLine(str, sizeof(str));
00509     sscanf(str, "%f", &Value);
00510     //fscanf(f, "%f", &Value);
00511     //fread(TmpStr, 1, strlen("</Float>\n"), f);
00512     File->read(TmpStr, strlen("</Float>\n"));
00513 }
00514 
00515 void XMLL::SerVec(Vector3D &Value, char * Name)
00516 {
00517     int i;
00518     char c;
00519     char str[256];
00520 
00521     for(i = 0; i < 2; i++)
00522     {
00523         do
00524         {
00525             //c = fgetc(f);
00526             File->getChar(&c);
00527             if(c == EOF) return;
00528         }
00529     while(c != '\"');
00530     }
00531 
00532     do
00533     {
00534         //c = fgetc(f);
00535         File->getChar(&c);
00536         if(c == EOF) return;
00537     }
00538     while(c != '>');
00539     //fgetc(f);
00540     File->getChar(&c);
00541 
00542     File->readLine(str, sizeof(str));
00543     //sscanf(str, "%d", &Value);
00544     sscanf(str, "%f %f %f", &Value.X, &Value.Y, &Value.Z);
00545     //fread(TmpStr, 1, strlen("</Float>\n"), f);
00546     File->read(TmpStr, strlen("</Float>\n"));
00547 }
00548 
00549 void XMLL::End()
00550 {
00551     //int Len = strlen(EndStr);
00552     //fread(TmpStr, 1, Len, f);
00553     File->read(TmpStr, EndStr.length());
00554     File->close();
00555     delete File;
00556 }
00557 
00558 BinS::BinS()
00559 {
00560     format = Bin;
00561     readWrite = WR;
00562 }
00563 
00564 BinS::~BinS()
00565 {
00566 }
00567 
00568 bool BinS::Start(QString FileName)
00569 {
00570     //f = fopen(FileName, "wb");
00571     //return (f != NULL);
00572 
00573     File = new QFile(FileName);
00574     return (File->open(QIODevice::WriteOnly));
00575 }
00576 
00577 void BinS::SerStr(char * Value, char * Name)
00578 {
00579     //int Len = strlen(Value);
00580     //fwrite(&Len, sizeof(int), 1, f);
00581     //fwrite(Value, 1, Len, f); 
00582     File->write("char* ");
00583     File->write(Value, sizeof(Value));
00584     File->write("\n", 1);
00585     File->flush();
00586 }
00587 
00588 void BinS::SerBool(bool &Value, char * Name)
00589 {
00590     //fwrite(&Value, sizeof(bool), 1, f);
00591     File->write("bool ");
00592     char buffer[20];
00593     sprintf(buffer, "%b", Value);
00594     File->write(buffer);
00595     File->write("\n", 1);
00596     File->flush();
00597 }
00598 
00599 void BinS::SerInt(int &Value, char * Name)
00600 {
00601     //fwrite(&Value, sizeof(int), 1, f);
00602     File->write("int ");
00603     char buffer[20];
00604     sprintf(buffer, "%i", Value);
00605     File->write(buffer);
00606     File->write("\n", 1);
00607     File->flush();
00608 }
00609 
00610 void BinS::SerFloat(float &Value, char * Name)
00611 {
00612     //fwrite(&Value, sizeof(float), 1, f);
00613     File->write("float ");
00614     char buffer[20];
00615     sprintf(buffer, "%f", Value);
00616     File->write(buffer);
00617     File->write("\n", 1);
00618     File->flush();
00619 }
00620 
00621 void BinS::SerVec(Vector3D &Value, char * Name)
00622 {
00623     SerStr(Name, "Vector3D");
00624     SerFloat(Value.X);
00625     SerFloat(Value.Y);
00626     SerFloat(Value.Z);
00627 }
00628 
00629 void BinS::End()
00630 {
00631     File->close();
00632     delete File;
00633 }
00634 
00635 BinL::BinL()
00636 {
00637     format = Bin;
00638     readWrite = RE;
00639 }
00640 
00641 BinL::~BinL()
00642 {
00643 }
00644 
00645 bool BinL::Start(QString FileName)
00646 {
00647     //f = fopen(FileName, "rb");
00648     //return (f != NULL);
00649     File = new QFile(FileName);
00650     if(!File->open(QIODevice::ReadOnly))
00651         return false;
00652 
00653     char buffer[256];
00654     //File->readLine(buffer, sizeof(buffer));
00655     return true;
00656 }
00657 
00658 void BinL::SerStr(char * Value, char * Name)
00659 {
00660     //int Len;
00661     //fread(&Len, sizeof(int), 1, f);
00662     //fread(TmpStr, 1, Len, f);
00663     char buffer[256];
00664     File->readLine(buffer, sizeof(buffer));
00665     char buf1 = 'A';
00666 }
00667 
00668 void BinL::SerBool(bool &Value, char * Name)
00669 {
00670     //fread(&Value, sizeof(bool), 1, f);
00671     char buffer[256];
00672     char buf[8];
00673     File->readLine(buffer, qint64(sizeof(buffer)));
00674     sscanf(buffer, "%s %b", buf, &Value);
00675     //delete [] buf;
00676     //delete [] buffer;
00677     char buf1 = 'A';
00678 }
00679 
00680 void BinL::SerInt(int &Value, char * Name)
00681 {
00682     //fread(&Value, sizeof(int), 1, f);
00683     char buffer[256];
00684     char buf[8];
00685     File->readLine(buffer, qint64(sizeof(buffer)));
00686     sscanf(buffer, "%s %d", buf, &Value);
00687     //delete [] buf;
00688     //delete [] buffer;
00689     char buf1 = 'A';
00690 }
00691 
00692 void BinL::SerFloat(float &Value, char * Name)
00693 {
00694     //fread(&Value, sizeof(float), 1, f);
00695     char buffer[256];
00696     char buf[8];
00697     File->readLine(buffer, qint64(sizeof(buffer)));
00698     sscanf(buffer, "%s %f", buf, &Value);
00699     //delete [] buf;
00700     //delete [] buffer;
00701     char buf1 = 'A';
00702 }
00703 
00704 void BinL::SerVec(Vector3D &Value, char * Name)
00705 {
00706     SerStr(Name, "Caption");
00707     SerFloat(Value.X);
00708     SerFloat(Value.Y);
00709     SerFloat(Value.Z);
00710     char buf1 = 'A';
00711 }
00712 
00713 void BinL::End()
00714 {
00715     delete File;
00716 }