Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <conio.h>
- #include <iomanip>
- #include <windows.h>
- using namespace std;
- char filename[] = "models/roof_block.3ds";
- unsigned short chunk, count, faces[4];
- unsigned int pos=0, lpos=0, len, end;
- float coord[3];
- char name;
- int main()
- {
- setlocale( LC_ALL,"Russian" );
- wcout<<L"Загружаемый файл: \""<<filename<<"\""<<endl;
- FILE *model = fopen(filename, "r"); // r - Read на чтение файл
- if (model == NULL) wcout<<L"Не удалось открыть файл."<<endl;
- else wcout<<L"Файл открыт."<<endl;
- pos += 2*fread(&chunk, 2, 1, model);
- if (chunk == 0x4d4d) wcout<<L"Формат файла: 3ds."<<endl;
- else wcout<<L"Неверный формат файла."<<endl;
- pos += 4*fread(&end, 4, 1, model);
- wcout<<L"Размер файла: "<<dec<<end<<L" байт"<<endl;
- while (pos<end && lpos!=pos)
- {
- lpos = pos;
- pos += 2*fread(&chunk, 2, 1, model);
- pos += 4*fread(&len, 4, 1, model);
- switch(chunk)
- {
- case 0x3d3d: wcout<<L"[Чанк объектов] : "<<len<<L" байт." << endl;
- break;
- case 0x4100: wcout<<L"--[Сетка треугольников] : "<<len<<L" байт."<<endl;
- break;
- case 0x4000: wcout<<L"-[Чанк объекта] Имя: ";
- do {
- pos+=fread(&name, 1, 1, model);
- wcout<<name;
- }while(name!='\0' && pos-lpos<len);
- wcout<<endl;
- break;
- case 0xAFFF: wcout<<L"-[Материал] : "<<len<<L" байт."<<endl;
- break;
- case 0xA000: wcout<<L"--[Название материала] : ";
- do {
- pos+=fread(&name, 1, 1, model);
- wcout<<name;
- } while(name!='\0' && pos-lpos<len);
- wcout<<endl;
- break;
- /* case 0xA010: wcout<<L"--[Ambient color] : "<<len<<endl;
- for (int i=0; i<24; i++){ pos+=fread(&name,1,1,model);
- wcout<<" "<<(int)name;}
- break; */
- case 0xA200: //wcout<<L"-[Текстура материала] : ";
- break;
- case 0xA300: wcout<<L"--[Текстура материала] : ";
- do { pos+=fread(&name,1,1,model); wcout<<name;} while(name!='\0' && pos-lpos<len);
- wcout<<endl;
- break;
- case 0x4110: wcout<<L"--[Список вершин] : "<< len << L" байт."<<endl;
- pos+=2*fread(&count, 2, 1, model); wcout<<dec<<count<<L" Вершин"<<endl;
- wcout<<L"Отобразить? y/n: "; name=getch(); wcout<<endl;
- while (count--) { pos+=12*fread(coord, 12, 1, model); if (name=='y') wcout<<count<<" : "<<coord[0]<<" "<<coord[1]<<" "<<coord[2]<<endl;}
- break;
- case 0x4120: wcout<<L"--[Индексы вершин] : "<< len << L" байт."<<endl;
- pos+=2*fread(&count, 2, 1, model); wcout<<dec<<count<<L" граней."<<endl;
- wcout<<L"Отобразить? y/n: "; name=getch(); wcout<<endl;
- while(count--) { pos+=2*fread(&faces[0], 2, 1, model);
- pos+=2*fread(&faces[1], 2, 1, model);
- pos+=2*fread(&faces[2], 2, 1, model);
- pos+=2*fread(&faces[3], 2, 1, model);
- if (name=='y') wcout<<"Grani: "<<faces[0]<<" "<<faces[1]<<" "<<faces[2]<<" Flag "<<faces[3]; wcout<<endl<<count<<endl;
- system("Pause>>null");}
- wcout<<endl;
- break;
- case 0x4140: wcout<<L"--[Текстурные координаты] : "<<dec<<len<<L" байт."<<endl;
- pos+=2*fread(&count, 2, 1, model); wcout<<count<<L" координат."<<endl;
- wcout<<L"Отобразить? y/n: "; name=getch(); wcout<<endl;
- while (count--) { pos+=4*fread(&coord[0], 4, 1, model);
- pos+=4*fread(&coord[1], 4, 1, model);
- if (name=='y')wcout<<count<<": "<<coord[0]<<" "<<coord[1]<<endl;}
- break;
- default: //wcout<<L"[Иная запись] : "<<hex<<chunk<<" : "<<dec<<len<<L" байт."<<endl;
- pos+=len-6; fseek(model, pos, SEEK_SET);
- break;
- }
- }
- system("Pause>>null");
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment