yukisaw

3ds model parser

Sep 15th, 2015
108
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.92 KB | None | 0 0
  1. #include <iostream>
  2. #include <conio.h>
  3. #include <iomanip>
  4. #include <windows.h>
  5. using namespace std;
  6.  
  7. char filename[] = "models/roof_block.3ds";
  8. unsigned short chunk, count, faces[4];
  9. unsigned int pos=0, lpos=0, len, end;
  10. float coord[3];
  11. char name;
  12.  
  13. int main()
  14. {
  15. setlocale( LC_ALL,"Russian" );
  16. wcout<<L"Загружаемый файл: \""<<filename<<"\""<<endl;
  17. FILE *model = fopen(filename, "r");    // r - Read на чтение файл
  18.     if (model == NULL) wcout<<L"Не удалось открыть файл."<<endl;
  19.     else wcout<<L"Файл открыт."<<endl;
  20.  
  21. pos += 2*fread(&chunk, 2, 1, model);
  22.     if (chunk == 0x4d4d) wcout<<L"Формат файла: 3ds."<<endl;
  23.     else wcout<<L"Неверный формат файла."<<endl;
  24.  
  25. pos += 4*fread(&end, 4, 1, model);
  26.     wcout<<L"Размер файла: "<<dec<<end<<L" байт"<<endl;
  27.  
  28. while (pos<end && lpos!=pos)
  29.     {
  30.         lpos = pos;
  31.         pos += 2*fread(&chunk, 2, 1, model);
  32.         pos += 4*fread(&len, 4, 1, model);
  33.         switch(chunk)
  34.         {
  35.             case 0x3d3d: wcout<<L"[Чанк объектов] : "<<len<<L" байт." << endl;
  36.                          break;
  37.             case 0x4100: wcout<<L"--[Сетка треугольников] : "<<len<<L" байт."<<endl;
  38.                          break;
  39.             case 0x4000: wcout<<L"-[Чанк объекта] Имя: ";
  40.                          do {
  41.                             pos+=fread(&name, 1, 1, model);
  42.                             wcout<<name;
  43.                             }while(name!='\0' && pos-lpos<len);
  44.                          wcout<<endl;
  45.                          break;
  46.             case 0xAFFF: wcout<<L"-[Материал] : "<<len<<L" байт."<<endl;
  47.                          break;
  48.             case 0xA000: wcout<<L"--[Название материала] : ";
  49.                          do {
  50.                             pos+=fread(&name, 1, 1, model);
  51.                             wcout<<name;
  52.                          } while(name!='\0' && pos-lpos<len);
  53.                          wcout<<endl;
  54.                          break;
  55.            /*   case 0xA010: wcout<<L"--[Ambient color] : "<<len<<endl;
  56.                          for (int i=0; i<24; i++){ pos+=fread(&name,1,1,model);
  57.                          wcout<<" "<<(int)name;}
  58.                          break;           */
  59.             case 0xA200: //wcout<<L"-[Текстура материала] : ";
  60.                          break;
  61.             case 0xA300: wcout<<L"--[Текстура материала] : ";
  62.                          do { pos+=fread(&name,1,1,model); wcout<<name;} while(name!='\0' && pos-lpos<len);
  63.                          wcout<<endl;
  64.                          break;
  65.             case 0x4110: wcout<<L"--[Список вершин] : "<< len << L" байт."<<endl;
  66.                          pos+=2*fread(&count, 2, 1, model); wcout<<dec<<count<<L" Вершин"<<endl;
  67.                          wcout<<L"Отобразить? y/n: "; name=getch(); wcout<<endl;
  68.                          while (count--) { pos+=12*fread(coord, 12, 1, model); if (name=='y') wcout<<count<<" : "<<coord[0]<<" "<<coord[1]<<" "<<coord[2]<<endl;}
  69.                          break;
  70.             case 0x4120: wcout<<L"--[Индексы вершин] : "<< len << L" байт."<<endl;
  71.                          pos+=2*fread(&count, 2, 1, model); wcout<<dec<<count<<L" граней."<<endl;
  72.                          wcout<<L"Отобразить? y/n: "; name=getch(); wcout<<endl;
  73.                          while(count--) { pos+=2*fread(&faces[0], 2, 1, model);
  74.                                           pos+=2*fread(&faces[1], 2, 1, model);
  75.                                           pos+=2*fread(&faces[2], 2, 1, model);
  76.                                           pos+=2*fread(&faces[3], 2, 1, model);
  77.                          if (name=='y') wcout<<"Grani: "<<faces[0]<<" "<<faces[1]<<" "<<faces[2]<<" Flag "<<faces[3]; wcout<<endl<<count<<endl;
  78.                          system("Pause>>null");}
  79.                          wcout<<endl;
  80.                          break;
  81.             case 0x4140: wcout<<L"--[Текстурные координаты] : "<<dec<<len<<L" байт."<<endl;
  82.                          pos+=2*fread(&count, 2, 1, model);  wcout<<count<<L" координат."<<endl;
  83.                          wcout<<L"Отобразить? y/n: "; name=getch(); wcout<<endl;
  84.                          while (count--) { pos+=4*fread(&coord[0], 4, 1, model);
  85.                                            pos+=4*fread(&coord[1], 4, 1, model);
  86.                          if (name=='y')wcout<<count<<": "<<coord[0]<<" "<<coord[1]<<endl;}
  87.                         break;
  88.             default: //wcout<<L"[Иная запись] : "<<hex<<chunk<<" : "<<dec<<len<<L" байт."<<endl;
  89.                      pos+=len-6; fseek(model, pos, SEEK_SET);
  90.                      break;
  91.         }
  92.     }
  93.         system("Pause>>null");
  94.  
  95. return 0;
  96. }
Advertisement
Add Comment
Please, Sign In to add comment