⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 3dsfileloader.cpp

📁 本文件中收录了多种3D文件格式
💻 CPP
📖 第 1 页 / 共 2 页
字号:
			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 + -