📄 3dsfileloader.cc
字号:
for (i = 0; i < 32; i++) if (flags & (1 << i)) if (!ReadBlock( (char *) &dat, sizeof(dat))) return; if (!ReadBlock((char *) pos, sizeof(pos))) return; UserTrackScale(nf, flags, pos[0], pos[1], pos[2]); }}void C3dsFileLoader::ReadTrMatrix(){ float rot[9]; float trans[3]; if (!ReadBlock((char *) rot, sizeof(rot))) return; if (!ReadBlock( (char *) trans, sizeof(trans))) return; Transform3dsMatrix Transform; Translate3dsMatrix Translate; Transform._11 = rot[0]; Transform._12 = rot[1]; Transform._13 = rot[2]; Transform._21 = rot[3]; Transform._22 = rot[4]; Transform._23 = rot[5]; Transform._31 = rot[6]; Transform._32 = rot[7]; Transform._33 = rot[8]; Translate._11 = trans[0]; Translate._12 = trans[1]; Translate._13 = trans[2]; UserTransformMatrix(Transform, Translate);}void C3dsFileLoader::ReadVertList(){ short nv; float c[3]; if (!ReadBlock((char *) &nv, 2)) return; while (nv-- > 0) { if (!ReadBlock((char *) c, sizeof(c))) return; User3dVert(c[0], c[1], c[2]); }}void C3dsFileLoader::ReadFaceList(){ unsigned short nv; unsigned short c[4]; if (!ReadBlock((char *) &nv, sizeof(nv))) return; while (nv-- > 0) { if (!ReadBlock((char *) c, sizeof(c))) return; User3dFace(c[0], c[1], c[2], c[3]); }}void C3dsFileLoader::ReadObjChunk(){ UserChunkObj();}void C3dsFileLoader::EndReading(){ UserEndOfFile();}void C3dsFileLoader::ReadOneUnit(){ float OneUnit; if (!ReadBlock((char *) &OneUnit, sizeof(OneUnit))) return; UserOneUnit(OneUnit);}void C3dsFileLoader::ReadViewPortLayout(){ unsigned short style; short active, unknow1, swap, unknow2, swap_prior, swap_view; if (!ReadBlock((char *) &style, sizeof(style))) return; if (!ReadBlock((char *) &active, sizeof(active))) return; if (!ReadBlock((char *) &unknow1, sizeof(unknow1))) return; if (!ReadBlock((char *) &swap, sizeof(swap))) return; if (!ReadBlock((char *) &unknow2, sizeof(unknow2))) return; if (!ReadBlock((char *) &swap_prior, sizeof(swap_prior))) return; if (!ReadBlock((char *) &swap_view, sizeof(swap_view))) return; ViewPortLayout viewtmp(style, active, unknow1, swap, unknow2, swap_prior, swap_view); UserViewPortLayout(viewtmp);}void C3dsFileLoader::ReadViewPortSize(){ short PosX, PosY, Width, Height; if (!ReadBlock((char *) &PosX, sizeof(PosX))) return; if (!ReadBlock((char *) &PosY, sizeof(PosY))) return; if (!ReadBlock((char *) &Width, sizeof(Width))) return; if (!ReadBlock((char *) &Height, sizeof(Height))) return; UserViewPortSize(PosX, PosY, Width, Height);}void C3dsFileLoader::ReadViewPortData(){ short flags, axis_lockout; short win_x, win_y, win_w, win_h, win_view; float zoom; float worldcenter_x, worldcenter_y, worldcenter_z; float horiz_ang, vert_ang; char camera_name[12]; if (!ReadBlock((char *) &flags, sizeof(flags))) return; if (!ReadBlock((char *) &axis_lockout, sizeof(axis_lockout))) return; if (!ReadBlock((char *) &win_x, sizeof(win_x))) return; if (!ReadBlock((char *) &win_y, sizeof(win_y))) return; if (!ReadBlock((char *) &win_w, sizeof(win_w))) return; if (!ReadBlock((char *) &win_h, sizeof(win_h))) return; if (!ReadBlock((char *) &win_view, sizeof(win_view))) return; if (!ReadBlock((char *) &zoom, sizeof(zoom))) return; if (!ReadBlock((char *) &worldcenter_x, sizeof(worldcenter_x))) return; if (!ReadBlock((char *) &worldcenter_y, sizeof(worldcenter_y))) return; if (!ReadBlock((char *) &worldcenter_z, sizeof(worldcenter_z))) return; if (!ReadBlock((char *) &horiz_ang, sizeof(horiz_ang))) return; if (!ReadBlock((char *) &vert_ang, sizeof(vert_ang))) return; if (!ReadBlock((char *) camera_name, CameraNameSize)) return; ViewPortData vporttmp(flags, axis_lockout, win_x, win_y, win_w, win_h, win_view, zoom, worldcenter_x, worldcenter_y, worldcenter_z, horiz_ang, vert_ang, camera_name); UserViewPortData(vporttmp);}void C3dsFileLoader::ReadViewUser(){ float c[3]; float Width, XYangle, YZangle, BackAngle; if (!ReadBlock((char *) c, sizeof(c))) return; if (!ReadBlock((char *) &Width, sizeof(Width))) return; if (!ReadBlock((char *) &XYangle, sizeof(XYangle))) return; if (!ReadBlock((char *) &YZangle, sizeof(YZangle))) return; if (!ReadBlock((char *) &BackAngle, sizeof(BackAngle))) return; UserViewUser(c[0], c[1], c[2], Width, XYangle, YZangle, BackAngle);}void C3dsFileLoader::ReadViewCamera(){ char camera_name[12]; if (!ReadBlock((char *) camera_name, CameraNameSize)) return; UserViewCamera(string(camera_name));}bool C3dsFileLoader::ParseChunks(){ if(!mInputFile.is_open()) return false; if(mInputFile.eof()) return false; chunk3ds chunk;// getchar(); if(!ReadBlock((char*) &chunk, sizeof(chunk3ds))) return false; switch(chunk.Flag) { case CHUNK_RGBF: cout << "Chunk RGBF detected" << endl; ReadRGBF(); ParseChunks(); break; case CHUNK_RGBB: cout << "Chunk RGBB detected" << endl; ReadRGBB(); ParseChunks(); break; case CHUNK_MAIN: cout << "Chunk Main detected" << endl; ParseChunks(); break; case CHUNK_OBJMESH: cout << "Chunk Object detected" << endl; ReadObjChunk(); ParseChunks(); break; case CHUNK_OBJBLOCK: cout << "Chunk Object Block detected" << endl; ReadObjBlock(); cout << endl; ParseChunks(); break; case CHUNK_TRIMESH: cout << "Chunk Trimesh detected" << endl; ParseChunks(); break; case CHUNK_VERTLIST: cout << "Chunk VertList detected at " << (PC - sizeof(chunk3ds)) << endl; ReadVertList(); ParseChunks(); break; case CHUNK_FACELIST: cout << "Chunk FaceList detected" << endl; ReadFaceList(); ParseChunks(); break; case CHUNK_FACEMAT: cout << "Chunk FaceMat detected" << endl; ReadFaceMat(); ParseChunks(); break; case CHUNK_MAPLIST: cout << "Chunk MapList detected" << endl; ReadMapList(); ParseChunks(); break; case CHUNK_SMOOLIST: cout << "Chunk SmoothList detected" << endl;// ReadSmoothList(); // Still unsupported SkipChunk(chunk); ParseChunks(); break; case CHUNK_TRMATRIX: cout << "Chunk TRMatrix detected" << endl; ReadTrMatrix(); ParseChunks(); break; case CHUNK_LIGHT: cout << "Chunk Light detected" << endl; ReadLight(); ParseChunks(); break; case CHUNK_SPOTLIGHT: cout << "Chunk SpotLight detected" << endl; ReadSpotLight(); ParseChunks(); break; case CHUNK_CAMERA: cout << "Chunk Camera detected" << endl; ReadCamera(); ParseChunks(); break; case CHUNK_MATERIAL: cout << "Chunk Material detected" << endl; ParseChunks(); break; case CHUNK_MATNAME: cout << "Chunk MatName detected" << endl; ReadMatName(); ParseChunks(); break; case CHUNK_MAPFILE: cout << "Chunk MapFile detected" << endl; ReadMapFile(); ParseChunks(); break; case CHUNK_KEYFRAMER: cout << "Chunk Keyframer detected" << endl; ParseChunks(); break; case CHUNK_TRACKINFO: cout << "Chunk TrackInfo detected" << endl; ParseChunks(); break; case CHUNK_TRACKOBJNAME: cout << "Chunk TrackObjName detected" << endl; ReadTrackObjName(); ParseChunks(); break; case CHUNK_TRACKPOS: cout << "Chunk TrackPos detected" << endl; ReadTrackPos(); ParseChunks(); break; case CHUNK_TRACKROTATE: cout << "Chunk TrackRotate detected" << endl; ReadTrackRot(); ParseChunks(); break; case CHUNK_TRACKSCALE: cout << "Chunk TrackScale detected" << endl; ReadTrackScale(); ParseChunks(); break; case CHUNK_OBJNUMBER: cout << "Chunk ObjNumber detected" << endl; ReadObjNumber(); ParseChunks(); break; default: cout << "Unknown Chunk at " << mInputFile.tellg() << " offset" << endl; SkipChunk(chunk); ParseChunks(); break; } return true;}bool C3dsFileLoader::SkipChunk(chunk3ds &chunk){ PC += (chunk.Size - sizeof(chunk3ds)); mInputFile.seekg(PC); if(mInputFile.eof()) return false; return true;}void C3dsFileLoader::ProcessFile(string FileName){ mInputFile.open(FileName.c_str(), ios::binary); FileSize(); if(mInputFile.is_open() == false) return; ParseChunks(); EndReading();}bool C3dsFileLoader::ReadBlock(char *dest, long size){ PC = mInputFile.tellg(); if(!mInputFile.read(dest, size) && mInputFile.eof()) return false; PC += size; mInputFile.seekg(PC); return true;}bool C3dsFileLoader::isOk(){ if(!mInputFile.is_open()) return false; if(mInputFile.eof()) return false; return true;}void C3dsFileLoader::FileSize(){ // get length of file: mInputFile.seekg (0, ios::end); mFileSize = mInputFile.tellg(); mInputFile.seekg (0, ios::beg);}void C3dsFileLoader::ReadASCIIZ(char *dest){ char c; long Count = 0; do { c = mInputFile.get(); // get character from file *dest++ = c; Count++; } while (c != 0); // loop while extraction from file is possible PC+= Count; mInputFile.seekg(PC);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -