📄 3dsfileloader.cpp
字号:
return;
if (!ReadBlock((char*) &flags, sizeof(flags)))
return;
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;
UserViewPortLayout(ViewPortLayout(style, active, unknow1, swap, unknow2, swap_prior, swap_view));
}
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;
UserViewPortData(ViewPortData(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));
}
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 + -