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

📄 q2md2fly.cpp

📁 是3D游戏一书中所讲的游戏引擎fly3D 包括fly3D引擎的源码及应用此引擎开发出来的游戏实例 有fly3D引擎的教程,易于step by step跟学
💻 CPP
字号:
#include "windows.h"
#include "stdio.h"
#include "math.h"
#include "q2md2fly.h"

FILE *fm=0,*ff=0;
dmdl_t dmdl;

float vert[MAX_VERTS][3];
float uv[MAX_VERTS][2];
short face[MAX_TRIANGLES][3];
short faceuv[MAX_TRIANGLES][3];
char framename[64]="";
char skinname[64]="";
int nstripfan,stripfancount[MAX_TRIANGLES];
dcomandvertex_t stripfan[MAX_TRIANGLES*3];

void load_faces()
{
	dtriangle_t tri;
	int i;

	fseek(fm,dmdl.ofs_tris,SEEK_SET);
	for( i=0;i<dmdl.num_tris;i++ )
	{
		fread(&tri,1,sizeof(tri),fm);
		face[i][2]=tri.index_xyz[0];
		face[i][1]=tri.index_xyz[1];
		face[i][0]=tri.index_xyz[2];
		faceuv[i][2]=tri.index_st[0];
		faceuv[i][1]=tri.index_st[1];
		faceuv[i][0]=tri.index_st[2];
	}
}

void load_uv()
{
	dstvert_t st;
	int i;

	fseek(fm,dmdl.ofs_st,SEEK_SET);
	for( i=0;i<dmdl.num_st;i++ )
	{
		fread(&st,1,sizeof(st),fm);
		uv[i][0]=(float)st.s/dmdl.skinwidth;
		uv[i][1]=(float)st.t/dmdl.skinheight;
	}
}

void load_frame(int n)
{
	daliasframe_t frame;
	int i;
	mat4x4 mr;
	vector v1,v2;
	v1.vec(1,0,0);
	v2.vec(0,1,0);
	mr.load_identity();
	mr.set_rotation(v1,-90);
	mr.set_rotation(v2,90);

	fseek(fm,dmdl.ofs_frames+dmdl.framesize*n,SEEK_SET);
	fread(&frame,1,sizeof(frame),fm);
	strcpy(framename,frame.name);
	fseek(fm,-(int)sizeof(dtrivertx_t),SEEK_CUR);
	for( i=0;i<dmdl.num_xyz;i++ )
	{
		fread(frame.verts,1,sizeof(dtrivertx_t),fm);
		v1.x=frame.verts->v[0]*frame.scale[0]+frame.translate[0];
		v1.y=frame.verts->v[1]*frame.scale[1]+frame.translate[1];
		v1.z=frame.verts->v[2]*frame.scale[2]+frame.translate[2];
		v2=v1*mr;
		vert[i][0]=v2.x;
		vert[i][1]=v2.y;
		vert[i][2]=v2.z;
	}
}

void write_head()
{
	float f[3]={ 0,0,0 };
	int i;
	
	i=9171;
	fwrite(&i,1,sizeof(int),ff);

	i=dmdl.num_tris;
	fwrite(&i,1,sizeof(int),ff);

	i=dmdl.num_xyz;
	fwrite(&i,1,sizeof(int),ff);

	i=dmdl.num_frames;
	fwrite(&i,1,sizeof(int),ff);

	fwrite(f,3,sizeof(float),ff);

	fwrite(skinname,1,64,ff);

	fwrite(&face[0][0],dmdl.num_tris,sizeof(short)*3,ff);

	for( i=0;i<dmdl.num_tris;i++ )
	{
		fwrite(&uv[faceuv[i][0]],2,sizeof(float),ff);
		fwrite(&uv[faceuv[i][1]],2,sizeof(float),ff);
		fwrite(&uv[faceuv[i][2]],2,sizeof(float),ff);
	}
}

main(int an,char **av)
{
	if (an==2 || an==3)
	{
		fm=fopen(av[1],"rb");
		if (fm)
			{
			fread(&dmdl,1,sizeof(dmdl),fm);
			if (dmdl.ident==IDALIASHEADER && dmdl.version==8)
				{
				char str[256];
				int n=0;
				if (strrchr(av[1],'\\'))
					strcpy(str,strrchr(av[1],'\\')+1);
				else
				if (strrchr(av[1],'/'))
					strcpy(str,strrchr(av[1],'/')+1);
				else
					strcpy(str,av[1]);
				if (strrchr(str,'.'))
					*strrchr(str,'.')=0;
				strcpy(skinname,str);
				strcat(skinname,".tga");
				if (an==3)
				{
					strcat(str,"_");
					strcat(str,av[2]);
				}
				strcat(str,".fao");
				printf("filename  : %s\n",str);
				printf("skinname  : %s\n",skinname);
				ff=fopen(str,"wb");
				if (ff)
					{
					load_faces();
					load_uv();
					printf("num_faces : %i\nnum_verts : %i\nnum_uv    : %i\nnum_frames: %i\n",dmdl.num_tris,dmdl.num_xyz,dmdl.num_st,dmdl.num_frames);
					write_head();

					for( int i=0;i<dmdl.num_frames;i++ )
						{
						load_frame(i);
						if (an==3 && strncmp(framename,av[2],strlen(av[2])))
							continue;
						n++;
						printf("frame %02i  : %s\n",n,framename);
						fwrite(&vert[0][0],dmdl.num_xyz,sizeof(float)*3,ff);
						}

					fseek(fm,dmdl.ofs_glcmds,SEEK_SET);
					nstripfan=0;
					i=0;
					while(1)
					{	
						fread(&stripfancount[nstripfan],1,sizeof(int),fm);
						if (stripfancount[nstripfan]==0) 
							break;
						fread(&stripfan[i],abs(stripfancount[nstripfan]),sizeof(dcomandvertex_t),fm);
						i+=abs(stripfancount[nstripfan]);
						nstripfan++;
					} 
					fwrite(&nstripfan,1,sizeof(int),ff);
					fwrite(&stripfancount[0],nstripfan,sizeof(int),ff);
					fwrite(&i,1,sizeof(int),ff);
					fwrite(&stripfan[0],i,sizeof(dcomandvertex_t),ff);

					fseek(ff,12,SEEK_SET);
					fwrite(&n,1,sizeof(int),ff);
					fclose(ff);
					}
				}
			fclose(fm);
			return 1;
			}
	}
	printf("Fly3D quake2 md2 converter\n");
	printf("use: q2md2fly q2model.md2 [animname]\n");
	return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -