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

📄 import3ds.cpp

📁 3DS_ImportCode
💻 CPP
📖 第 1 页 / 共 3 页
字号:
	rrlogfile = fopen("rrlogfile.txt","a");
	
	fprintf(rrlogfile, "%s%d", "objects = ",total_num_objects );
	fprintf(rrlogfile, "%s%d",     "  verts = ",total_num_verts ); 
	fprintf(rrlogfile, "%s%d\n",   "  faces = ",total_num_faces ); 	
	fprintf(rrlogfile, "memory allocated %d %s\n\n", mem, "KB");

	if(bEnable3dsLogfile)
	{
		fprintf(logfile, "\n\n%s %d\n", "num 3ds objects = ",total_num_objects);
		fprintf(logfile, "%s %d\n",     "total num verts = ",total_num_verts ); 
		fprintf(logfile, "%s %d\n",     "total num faces = ",total_num_faces ); 	
		fprintf(logfile, "memory allocated for 3ds model %d %s\n\n", mem, "KB");
	}


	strcpy(datfilename, filename);

	for(i = 0; i < 1024; i++)
	{
		if(datfilename[i] == '.')
		{
			if(datfilename[i+1] == '.')
			{
				i++;
			}
			else
			{
				file_ex_start = i;
				break;
			}
		}
	}

	if(file_ex_start == 0)
	{
		MessageBox(hwnd,"datfilename error :", NULL,  MB_OK);
		return FALSE;
	}

	strcpy(&datfilename[file_ex_start],".dat");


	if ((fp_3dsmodel = fopen(datfilename, "w+")) == 0) 
	{
		MessageBox(hwnd,"logfile error : Can't open", datfilename, MB_OK);
		fprintf(rrlogfile, "can't open datfile : %s\n", datfilename);
	}
	else
		fprintf(rrlogfile, "Writing datfile : %s\n", datfilename);

	fclose(rrlogfile);

	datfile_vert_cnt = 0;
	frame_num = 0;
	

	for(i = 0; i < total_num_verts; i++)
	{		
		// 3DS to DAT CONVERSION for Road Rage 1.1  --------------------
		// This piece of code is only intended to work with 3ds models
		// that are entirely composed of rectangles or boxes.
		// Also the "QuadTex" dat command is only supported in the latest
		// version of Road Rage 11dp (24th June)

		if(datfile_vert_cnt == 0)
		{
			fprintf(fp_3dsmodel,"TEXTURE %s\n", pCMyApp->TexMap[faces[quad_cnt].tex].tex_alias_name); // mapnames[faces[quad_cnt].tex]);
			fprintf(fp_3dsmodel, "QUADTEX ");
		}

		fprintf(fp_3dsmodel, "%f %f %f", 
				fverts[i][0],
				fverts[i][2],
				fverts[i][1]);

		fprintf(fp_3dsmodel, " %f %f\n", 
				mcoords[i].x,
				mcoords[i].y);

		datfile_vert_cnt++;

		if(datfile_vert_cnt > 3)
		{
			quad_cnt+=2;
			datfile_vert_cnt = 0;
			fprintf(fp_3dsmodel, "\n"); 
		}
		// end of DAT conversion -------------------------------------
	}
	
	int v, pos_keys, v_start, v_end;

	for(i = 0; i < total_num_objects; i++)
	{
		v_start  = oblist[i].verts_start;
		v_end    = oblist[i].verts_end;

		for(v = v_start; v <= v_end; v++)
		{
			fverts[v][0] -= oblist[i].pivot.x; 
			fverts[v][1] -= oblist[i].pivot.y;
			fverts[v][2] -= oblist[i].pivot.z;
		}
	}
	

	// copy verts into pmdata for all frames
	
	for(frame_num = 0; frame_num < total_num_frames; frame_num++)
	{
		for(i = 0; i < total_num_verts; i++)
		{
			pCMyApp->pmdata[pmodel_id].w[frame_num][i].x  = fverts[i][0];
			pCMyApp->pmdata[pmodel_id].w[frame_num][i].y  = fverts[i][1];
			pCMyApp->pmdata[pmodel_id].w[frame_num][i].z  = fverts[i][2];
		}
	}



	// Apply position track data


	float pos_x, pos_y, pos_z;

	if(bEnable3dsLogfile)
		fprintf(logfile, "APPLYING POSITION TRACK DATA\n\n");

	for(i = 0; i < total_num_objects; i++)
	{
		v_start  = oblist[i].verts_start;
		v_end    = oblist[i].verts_end;
		pos_keys = oblist[i].poskeys;

		//fprintf(logfile, "i: %d  obs: %d  v_start: %d  v_end: %d  pos_keys: %d\n", 
		//				  i, total_num_objects, v_start, v_end, pos_keys);


		for(j = 0; j < pos_keys; j++)
		{
			frame_num = oblist[i].pos_track[j].framenum;

			//fprintf(logfile, "j: %d  frame_num: %d  total_num_frames: %d\n",
			//	j, frame_num, total_num_frames);
				
			if((j < total_num_frames) && (frame_num < total_num_frames))
			{
				pos_x = oblist[i].pos_track[j].pos_x - oblist[i].local_centre_x;
				pos_y = oblist[i].pos_track[j].pos_y - oblist[i].local_centre_y;
				pos_z = oblist[i].pos_track[j].pos_z - oblist[i].local_centre_z;

				//fprintf(logfile, "i: %d  v_start: %d  v_end: %d\n", i, v_start, v_end);

				for(v = v_start; v <= v_end; v++)
				{
					pCMyApp->pmdata[pmodel_id].w[frame_num][v].x += pos_x;
					pCMyApp->pmdata[pmodel_id].w[frame_num][v].y += pos_y;
					pCMyApp->pmdata[pmodel_id].w[frame_num][v].z += pos_z;
					if(bEnable3dsLogfile)
						fprintf(logfile, "obj: %d  frame_num: %d  v: %d\n", i, frame_num, v);
				}
				if(bEnable3dsLogfile)
					fprintf(logfile, "\n");

			}
		}

	}

	if(bEnable3dsLogfile)
		fprintf(logfile, "\n\nAPPLYING ROTATION TRACK DATA\n\n");



	// Apply rotation track data

	int rot_keys;
	float axis_x, axis_y, axis_z, rot_angle;
	float rot_angle_x, rot_angle_y, rot_angle_z; 

	for(i = 0; i < total_num_objects; i++)
	{
		v_start  = oblist[i].verts_start;
		v_end    = oblist[i].verts_end;
		rot_keys = oblist[i].rotkeys;
		rot_angle = 0;

		for(j = 1; j < rot_keys; j++)
		{
			frame_num = oblist[i].rot_track[j].framenum;

			if((j < total_num_frames) && (frame_num < total_num_frames))
			{	
				axis_x = oblist[i].rot_track[j].axis_x; 
				axis_y = oblist[i].rot_track[j].axis_y; 
				axis_z = oblist[i].rot_track[j].axis_z;

				
				rot_angle += oblist[i].rot_track[j].rotation_rad;

				rot_angle_x = rot_angle * axis_x;
				rot_angle_y = rot_angle * axis_y;
				rot_angle_z = rot_angle * axis_z;
				
				if(bEnable3dsLogfile)
				{
					fprintf(logfile, "local xyz: %f %f %f\n", 
						oblist[i].local_centre_x,
						oblist[i].local_centre_y,
						oblist[i].local_centre_z);
				}

				for(v = v_start; v <= v_end; v++)
				{
					x = pCMyApp->pmdata[pmodel_id].w[frame_num][v].x - oblist[i].local_centre_x; 
					y = pCMyApp->pmdata[pmodel_id].w[frame_num][v].y - oblist[i].local_centre_y;
					z = pCMyApp->pmdata[pmodel_id].w[frame_num][v].z - oblist[i].local_centre_z;

					tx = x * (float)cos(rot_angle_z) + y * (float)sin(rot_angle_z);
					ty = y * (float)cos(rot_angle_z) - x * (float)sin(rot_angle_z);
					tz = z;

					x = tx;
					y = ty;
					z = tz;

					tx = x;
					ty = y * (float)cos(rot_angle_x) + z * (float)sin(rot_angle_x);
					tz = z * (float)cos(rot_angle_x) - y * (float)sin(rot_angle_x);

					x = tx;
					y = ty;
					z = tz;

					tx = x * (float)cos(rot_angle_y) - z * (float)sin(rot_angle_y);
					ty = y; 
					tz = z * (float)cos(rot_angle_y) + x * (float)sin(rot_angle_y);

					
					
					if(bEnable3dsLogfile)
					{
						fprintf(logfile, "i: %d  frame: %d  v: %d  angle: %f  ", i, frame_num, v, rot_angle);
						fprintf(logfile, "pxyz: %f %f %f  xyz: %f %f %f\n", x, y, z,
						pCMyApp->pmdata[pmodel_id].w[frame_num][v].x,
						pCMyApp->pmdata[pmodel_id].w[frame_num][v].y,
						pCMyApp->pmdata[pmodel_id].w[frame_num][v].z);
					}
					pCMyApp->pmdata[pmodel_id].w[frame_num][v].x  = tx + oblist[i].local_centre_x;
					pCMyApp->pmdata[pmodel_id].w[frame_num][v].y  = ty + oblist[i].local_centre_y;
					pCMyApp->pmdata[pmodel_id].w[frame_num][v].z  = tz + oblist[i].local_centre_z;
				}
				if(bEnable3dsLogfile)
					fprintf(logfile, "\n");
				
			}
		}

	}

	if(bEnable3dsLogfile)
		fprintf(logfile, "\n\nAPPLYING SCALE TRACK DATA\n\n");


	// Scale and rotate verts for all frames

	for(frame_num = 0; frame_num < total_num_frames; frame_num++)
	{
		for(i = 0; i < total_num_verts; i++)
		{	
			x  =  scale * pCMyApp->pmdata[pmodel_id].w[frame_num][i].x;
			y  =  scale * pCMyApp->pmdata[pmodel_id].w[frame_num][i].y;
			z  =  scale * pCMyApp->pmdata[pmodel_id].w[frame_num][i].z;

			angle = 0; 

			tx = x * (float)cos(angle) + z * (float)sin(angle);
			ty = y;
			tz = z * (float)cos(angle) - x * (float)sin(angle);

			pCMyApp->pmdata[pmodel_id].w[frame_num][i].x  = tx;
			pCMyApp->pmdata[pmodel_id].w[frame_num][i].y  = ty;
			pCMyApp->pmdata[pmodel_id].w[frame_num][i].z  = tz;
		}
	}



	fclose(fp_3dsmodel);

	cnt = 0;


	for(i = 0; i < total_num_faces; i++)
	{
		for (j = 0; j < 3; j++)
		{
			pCMyApp->pmdata[pmodel_id].f[cnt] = faces[i].v[j];	

			pCMyApp->pmdata[pmodel_id].t[cnt].x = mcoords[cnt].x;
			pCMyApp->pmdata[pmodel_id].t[cnt].y = mcoords[cnt].y;

			cnt++;
		}
	}
	
	for(i = 0; i < total_num_objects; i++)
	{
		pCMyApp->pmdata[pmodel_id].poly_cmd[i] = D3DPT_TRIANGLELIST;
		pCMyApp->pmdata[pmodel_id].num_verts_per_object[i] = (int)num_verts_in_object[i];
		pCMyApp->pmdata[pmodel_id].num_faces_per_object[i] = (int)num_faces_in_object[i];
		pCMyApp->pmdata[pmodel_id].texture_list[i] = object_texture[i];
	}


	loading_first_model_flag = FALSE;

	if(bEnable3dsLogfile)
		fclose(logfile);

	pCMyApp->pmdata[pmodel_id].num_polys_per_frame = total_num_objects;
	pCMyApp->pmdata[pmodel_id].num_faces = total_num_faces;
	pCMyApp->pmdata[pmodel_id].num_verts = total_num_verts; 
	pCMyApp->pmdata[pmodel_id].num_frames = total_num_frames;

	pCMyApp->pmdata[pmodel_id].skx = 1;
	pCMyApp->pmdata[pmodel_id].sky = 1;
	pCMyApp->pmdata[pmodel_id].tex_alias = 7;	
	pCMyApp->pmdata[pmodel_id].use_indexed_primitive = TRUE;

	ReleaseTempMemory();
	
	//Write_pmdata_debugfile(pCMyApp->m_hWnd, pmodel_id);

	return TRUE;
}



// PROCESS TRIANGLE DATA ROUTINES

BOOL C3DS::ProcessVertexData(HWND hwnd, FILE *fp)
{
	int	i, j ;
	int temp_int;
	float p, temp_float;
	unsigned short num_vertices;

	last_num_verts = total_num_verts;
	oblist[total_num_objects].verts_start = total_num_verts;
	
	fread(&num_vertices, sizeof(num_vertices), 1, fp);

	if(bEnable3dsLogfile)
		fprintf(logfile, "%s %d\n", "TRIANGLE_VERTEXLIST", num_vertices);

	num_verts_in_object[total_num_objects] = (short)num_vertices;

	if((total_num_verts + num_vertices) >= MAX_NUM_3DS_VERTICES)
		return FALSE;
			
	for (i = 0; i < (int)num_vertices; i++)
	{
		for (j = 0; j < 3; j++)
		{
			fread(&p, sizeof(float), 1, fp);
			temp_int = (int)( ((p * (float)10000) + (float)0.5));
			temp_float = (float)temp_int / (float)10000;
			fverts[total_num_verts][j] = temp_float;
		}

		if(bEnable3dsLogfile)
		{
			fprintf(logfile, " %f %f %f\n", 
				fverts[total_num_verts][0],
				fverts[total_num_verts][1],
				fverts[total_num_verts][2]);
		}

		// set default mapping co-ordinates, in case none are defined in model
		mcoords[total_num_verts].x = 0;
		mcoords[total_num_verts].y = 0;

		total_num_verts++;
	}	
	
	oblist[total_num_objects].verts_end = total_num_verts - 1;
	
	return TRUE;
}

BOOL C3DS::ProcessFaceData(HWND hwnd, FILE *fp)
{

	int	i, j, cnt = 0;
	unsigned short num_faces, face_index, ftemp;

	last_num_faces = total_num_faces;

	fread(&num_faces, sizeof(num_faces), 1, fp);

	if(bEnable3dsLogfile)
		fprintf(logfile, "%s %d\n", "TRIANGLE_FACELIST ", num_faces);

	num_faces_in_object[total_num_objects] = (short)num_faces;

	if((total_num_faces + num_faces) >= MAX_NUM_3DS_FACES)
		return FALSE;
			

	for (i = 0; i < (int)num_faces; i++)
	{
		for (j = 0; j < 4; j++)
		{
			fread(&face_index, sizeof(face_index), 1, fp);
			
			// note faces 1 to 3 are valid face indices, but the 4th one is NOT
			if(j < 3)
			{
				ftemp = (unsigned short)(face_index);// + last_num_verts);
				faces[total_num_faces].v[j] = ftemp;
				if(bEnable3dsLogfile)
					fprintf(logfile, " %d", face_index);
			}
			else
			{
				if(bEnable3dsLogfile)
				{
					fprintf(logfile, "   flags: %d => ", face_index);

					if((face_index & 0x0001) == 0x0001) 
						fprintf(logfile, "  AC: 1");
					else
						fprintf(logfile, "  AC: 0");


					if((face_index & 0x0002) == 0x0002) 
						fprintf(logfile, "  BC: 1");
					else
						fprintf(logfile, "  BC: 0");


					if((face_index & 0x0004) == 0x0004) 
						fprintf(logfile, "  AB: 1");
					else
						fprintf(logfile, "  AB: 0");
				}
			}
		}
		total_num_faces++;
		if(bEnable3dsLogfile)
			fprintf(logfile, "\n");
	}
	
	return TRUE;
}

void C3DS::ProcessTriSmoothData(FILE *fp)
{
	int i, num_faces;
	BYTE a,b,c,d;


	num_faces = num_faces_in_object[total_num_objects];

	for(i = 0;  i < num_faces; i++)
	{
		fread(&a, sizeof(BYTE), 1, fp);
		fread(&b, sizeof(BYTE), 1, fp);
		fread(&c, sizeof(BYTE), 1, fp);
		fread(&d, sizeof(BYTE), 1, fp);

		if(bEnable3dsLogfile)
			fprintf(logfile, " a,b,c,d : %d %d %d %d\n", a, b, c, d);
	}
}

void C3DS::ProcessTriLocalData(FILE *fp)
{
	float x,y,z;
	float local_centre_x, local_centre_y, local_centre_z;


	fread(&x, sizeof(float), 1, fp);
	fread(&y, sizeof(float), 1, fp);
	fread(&z, sizeof(float), 1, fp);

	if(bEnable3dsLogfile)
		fprintf(logfile, " x,y,z: %f %f %f\n", x, y, z);
		
	fread(&x, sizeof(float), 1, fp);
	fread(&y, sizeof(float), 1, fp);
	fread(&z, sizeof(float), 1, fp);

	if(bEnable3dsLogfile)
		fprintf(logfile, " x,y,z: %f %f %f\n", x, y, z);
	
	fread(&x, sizeof(float), 1, fp);
	fread(&y, sizeof(float), 1, fp);
	fread(&z, sizeof(float), 1, fp);

	if(bEnable3dsLogfile)
		fprintf(logfile, " x,y,z: %f %f %f\n", x, y, z);
	
	fread(&local_centre_x, sizeof(float), 1, fp);
	fread(&local_centre_y, sizeof(float), 1, fp);
	fread(&local_centre_z, sizeof(float), 1, fp);

	if(bEnable3dsLogfile)

⌨️ 快捷键说明

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