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

📄 import3ds.cpp

📁 3DS_ImportCode
💻 CPP
📖 第 1 页 / 共 3 页
字号:
//-----------------------------------------------------------------------------
// File: Import3DS.cpp
//
// Desc: Code for importing 3D Studio models
//
// Copyright (c) 1999 William Chin. All rights reserved.
//-----------------------------------------------------------------------------
//
#include <windows.h>
#include <stdio.h>
#include <math.h>
#include "world.hpp"
#include "D3DApp.h"
#include "roadrage.hpp"
#include "Import3DS.hpp"

extern CMyD3DApplication* pCMyApp;

OBJECT3DS oblist[MAX_NUM_3DS_OBJECTS];

int kf_count = 0;

short pt_flags;
short unknown;
unsigned long kfstart, kfend;
unsigned long kfcurframe;


int total_num_objects;
char object_names[MAX_NUM_3DS_OBJECTS][MAX_NAME_LENGTH];
BOOL command_found_flag;
BOOL loading_first_model_flag = TRUE;
BOOL bEnable3dsLogfile = FALSE;

int num_materials = 0;
int num_maps = 0;
int total_num_faces;
int total_num_verts;
int last_num_verts;
int last_num_faces;
int last_num_mcoords;
int total_num_mcoords;
int total_num_frames = 1;


FACE3DS				faces	 [MAX_NUM_3DS_FACES];
float				fverts	 [MAX_NUM_3DS_VERTICES][3];
MAPPING_COORDINATES mcoords	 [MAX_NUM_3DS_VERTICES]; 
int				object_texture[MAX_NUM_3DS_OBJECTS];

char material_list[MAX_NUM_3DS_TEXTURES][MAX_NAME_LENGTH];
char mapnames     [MAX_NUM_3DS_TEXTURES][MAX_NAME_LENGTH];

int	num_verts_in_object[MAX_NUM_3DS_OBJECTS];
int	num_faces_in_object[MAX_NUM_3DS_OBJECTS];


FILE *logfile;
FILE *fp_3dsmodel;



C3DS* pC3DS;  // global pointer to C3DS class

// class constructor
C3DS::C3DS()
{
	pC3DS = this;
}


BOOL C3DS::Import3DS(HWND hwnd, char *filename, int pmodel_id, float scale)
{
	FILE *fp; 
	FILE *fp_3dsmodel;
	FILE *rrlogfile;
	int done;
	int i,j,cnt;
	int length;
	int	data_length;
	int frame_num;
	int num_frames;
	int datfile_vert_cnt;
	int quad_cnt=0;
	unsigned short	command;
	char temp;
	float tx, ty, tz;
	float angle;
	float x,y,z;
	BOOL process_data_flag;
	char datfilename[1024];
	int file_ex_start = 0;


	total_num_objects = -1;
	kf_count = -1;
	total_num_faces = 0;
	total_num_verts = 0;
	last_num_faces = 0;
	last_num_verts = 0;
	num_maps = 0;
	num_materials = 0;
	last_num_mcoords = 0; 
	total_num_mcoords = 0;
	num_materials = 0;

	if ((fp = fopen(filename, "rb")) == 0) 
	{
		MessageBox(hwnd,"3DS File error : Can't open", filename, MB_OK);
		return FALSE;
	}


	if ((logfile = fopen("3dslogfile.txt", "w")) == 0) 
	{
		MessageBox(hwnd,"logfile error : Can't create", "3dslogfile.txt", MB_OK);
		return FALSE;
	}
	
	if(bEnable3dsLogfile)
	{
		fprintf(logfile, "3DS Logfile generated by D3DS viewer\n");
		fprintf(logfile, "3DS Model filename %s\n\n", filename);
	}


	done = 0;

	while (done == 0)
	{
		process_data_flag  = FALSE;
		command_found_flag = FALSE;

		fread(&command, sizeof(command), 1, fp);
		
		// Test for end of file

		if (feof(fp))
		{
			done = 1;
			break;
		}
		
		fread (&length, sizeof(length), 1, fp);
		data_length = length - 6;

		// Process 3DS file commands


		switch (command)
		{
			case TRIANGLE_MESH:
				PrintLogFile(logfile, "TRIANGLE_MESH");
				process_data_flag = TRUE;	
				break;

			case TRIANGLE_VERTEXLIST: 
				if(ProcessVertexData(hwnd, fp) == TRUE)
					process_data_flag = TRUE;
				else
				{
					MessageBox(hwnd,"Error : Too many verts", NULL, MB_OK);
					return FALSE;
				}
				break;

			case TRIANGLE_FACELIST: 
				if(ProcessFaceData(hwnd, fp) == TRUE)
					process_data_flag = TRUE;
				else
				{
					MessageBox(hwnd,"Error : Too many faces", NULL, MB_OK);
					return FALSE;
				}
				break;
			
			case TRIANGLE_MAPPINGCOORS:
				ProcessMappingData(hwnd, fp);
				process_data_flag = TRUE;
				break;

			case TRIANGLE_MATERIAL:
				ProcessMaterialData(hwnd, fp, pmodel_id);
				process_data_flag = TRUE;
				break;

			case EDIT_MATERIAL: 
				PrintLogFile(logfile, "\nEDIT_MATERIAL");	
				process_data_flag = TRUE;
				break;

			case MAT_NAME01:
				AddMaterialName(hwnd, fp);
				process_data_flag = TRUE;
				break;

			case TEXTURE_MAP:
				PrintLogFile(logfile, "TEXTURE_MAP");	
				process_data_flag = TRUE;
				break;
				
			case MAPPING_NAME:
				AddMapName(hwnd, fp, pmodel_id);
				process_data_flag = TRUE;
				break;
			
			case NAMED_OBJECT: 
				
				// read name and store
				
				total_num_objects++;

				for(i = 0; i < MAX_NAME_LENGTH; i++)
				{
					fread (&temp, 1, 1, fp); 
					
					if(total_num_objects >= MAX_NUM_3DS_OBJECTS )
						return FALSE;

					object_names[total_num_objects][i] = temp;
					data_length--;
				
					if(temp == 0)
					{
						if(bEnable3dsLogfile)
						{
							fprintf(logfile, "\n\n%s %s\n", "NAMED_OBJECT ", 
								object_names[total_num_objects]);
						}
		
						break;
					}
				}

				process_data_flag = TRUE;
				break;

			case MAIN3DS:
				PrintLogFile(logfile, "MAIN3DS");
				process_data_flag = TRUE;	
				break;

			case EDIT3DS:
				PrintLogFile(logfile, "EDIT3DS");
				process_data_flag = TRUE;	
				break;


			case KEYFRAME:
				PrintLogFile(logfile, "\n\nKEYFRAME");
				process_data_flag = TRUE;
				break;
			
			case KEYFRAME_MESH_INFO:
				PrintLogFile(logfile, "\nKEYFRAME_MESH_INFO");
				kf_count++;
				process_data_flag = TRUE;	
				break;

			case KEYFRAME_START_AND_END:
				PrintLogFile(logfile, "KEYFRAME_START_AND_END");
				fread(&kfstart, sizeof(unsigned long), 1, fp);
				fread(&kfend,	sizeof(unsigned long), 1, fp);
				process_data_flag = TRUE;	
				break;
				
			case KEYFRAME_HEADER:
				PrintLogFile(logfile, "KEYFRAME_HEADER");
				//process_data_flag = TRUE;	
				break;

			case KFCURTIME:
				fread(&kfcurframe, sizeof(long), 1, fp);
				if(bEnable3dsLogfile)
					fprintf(logfile, "KFCURTIME  %d\n", kfcurframe);
				process_data_flag = TRUE;	
				break;

			case PIVOT:
				ProcessPivots(hwnd, fp);
				process_data_flag = TRUE;	
				break;

			case POS_TRACK_TAG:  
				ProcessPositionTrack(hwnd, fp);
				process_data_flag = TRUE;	
				break;

			case ROT_TRACK_TAG:  
				ProcessRotationTrack(hwnd, fp);
				process_data_flag = TRUE;	
				break;
		
			case SCL_TRACK_TAG:
				ProcessScaleTrack(hwnd, fp);
				process_data_flag = TRUE;	
				break;
				
			case FOV_TRACK_TAG:	
				PrintLogFile(logfile, "PIVOT");
				//process_data_flag = TRUE;	
				break;

			case ROLL_TRACK_TAG:
				PrintLogFile(logfile, "PIVOT");
				//process_data_flag = TRUE;	
				break;

			case COL_TRACK_TAG:
				PrintLogFile(logfile, "PIVOT");
				//process_data_flag = TRUE;	
				break;

			case MORPH_TRACK_TAG:
				PrintLogFile(logfile, "PIVOT");
				//process_data_flag = TRUE;	
				break;

			case HOT_TRACK_TAG:
				PrintLogFile(logfile, "PIVOT");
				//process_data_flag = TRUE;	
				break;

			case FALL_TRACK_TAG:
				PrintLogFile(logfile, "PIVOT");
				//process_data_flag = TRUE;	
				break;

			case HIDE_TRACK_TAG:
				PrintLogFile(logfile, "PIVOT");
				//process_data_flag = TRUE;	
				break;

			
			case NODE_HDR:
				ProcessNodeHeader(fp);
				process_data_flag = TRUE;	
				break;

			case NODE_ID:
				ProcessNodeId(fp);
				process_data_flag = TRUE;	
				break;
				

			case M3DS_VERSION:
				Process3DSVersion(fp);
				process_data_flag = TRUE;
				break;

			case MESH_VERSION:
				PrintLogFile(logfile, "MESH_VERSION");
				break;
				
			case INT_PERCENTAGE:
				PrintLogFile(logfile, "INT_PERCENTAGE");	
				break;

			case MASTER_SCALE:
				ProcessMasterScale(fp);
				process_data_flag = TRUE;
				break;		

			case TRIANGLE_MAPPINGSTANDARD:
				PrintLogFile(logfile, "TRIANGLE_MAPPINGSTANDARD");
				break;	

			case TRIANGLE_VERTEXOPTIONS:
				PrintLogFile(logfile, "TRIANGLE_VERTEXOPTIONS");
				break;
	
			case TRIANGLE_SMOOTH:
				PrintLogFile(logfile, "TRIANGLE_SMOOTH");
				ProcessTriSmoothData(fp);
				process_data_flag = TRUE;	
				break;

			case TRI_LOCAL:
				PrintLogFile(logfile, "TRI_LOCAL");
				ProcessTriLocalData(fp);
				process_data_flag = TRUE;	
				break;


			// Skipping these commands / chunks


			case TRI_VISIBLE:
				PrintLogFile(logfile, "TRI_VISIBLE");
				break;

			case MATERIAL_AMBIENT:
				PrintLogFile(logfile, "MATERIAL_AMBIENT");
				break;

			case MATERIAL_DIFFUSE:
				PrintLogFile(logfile, "MATERIAL_DIFFUSE");
				break;

			case MATERIAL_SPECULAR:
				PrintLogFile(logfile, "MATERIAL_SPECULAR");
				break;

			case MATERIAL_SHININESS:
				PrintLogFile(logfile, "MATERIAL_SHININESS");
				break;

			case MATERIAL_SHIN_STRENGTH:
				PrintLogFile(logfile, "MATERIAL_SHIN_STRENGTH");
				break;
		
			case MAPPING_PARAMETERS:
				PrintLogFile(logfile, "MAPPING_PARAMETERS");
				break;
				
			case BLUR_PERCENTAGE:
				PrintLogFile(logfile, "BLUR_PERCENTAGE");
				break;

			case TRANS_PERCENT:
				PrintLogFile(logfile, "TRANS_PERCENT");
				break;
				
			case TRANS_FALLOFF_PERCENT:
				PrintLogFile(logfile, "TRANS_FALLOFF_PERCENT");
				break;

			case REFLECTION_BLUR_PER:
				PrintLogFile(logfile, "REFLECTION_BLUR_PER");
				break;
				
			case RENDER_TYPE:
				PrintLogFile(logfile, "RENDER_TYPE");
				break;
     
			case SELF_ILLUM:
				PrintLogFile(logfile, "SELF_ILLUM");
				break;
				
			case WIRE_THICKNESS:
				PrintLogFile(logfile, "WIRE_THICKNESS");
				break;

			case IN_TRANC:
				PrintLogFile(logfile, "IN_TRANC");
				break;
				
			case SOFTEN:
				PrintLogFile(logfile, "SOFTEN");
				break;

			break;
		} // end switch


		if(process_data_flag == FALSE)
		{
			if(command_found_flag == FALSE)
			{
				if(bEnable3dsLogfile)
				{
					fprintf(logfile, "\n");
					fprintf(logfile, "%s  %x\n", "UNKNOWN COMMAND ", command);
				}
			}
			// command was unrecognised, so skip it's data
			
			for(i = 0; i < data_length; i++)
			{
				fread (&temp, 1, 1, fp);
			}
			data_length = 0;
		}

	} // end while
	
	fclose (fp);
	

	total_num_objects++;


	// Transfer triangle list into the pmdata structure

	// allocate memory dynamically
	
	num_frames = MAX_NUM_3DS_FRAMES;

	pCMyApp->pmdata[pmodel_id].w = new VERT*[num_frames];
	
	for(i = 0; i < num_frames; i++)
		pCMyApp->pmdata[pmodel_id].w[i] = new VERT[total_num_verts];

	pCMyApp->pmdata[pmodel_id].f					= new  int[total_num_faces * 4];
	pCMyApp->pmdata[pmodel_id].num_verts_per_object = new  int[total_num_objects];
	pCMyApp->pmdata[pmodel_id].num_faces_per_object = new  int[total_num_objects];
	pCMyApp->pmdata[pmodel_id].poly_cmd				= new  D3DPRIMITIVETYPE[total_num_objects];
	pCMyApp->pmdata[pmodel_id].texture_list			= new  int[total_num_objects];
	pCMyApp->pmdata[pmodel_id].t					= new VERT[total_num_faces * 4];

	int mem = 0;
	mem += (sizeof(VERT)* total_num_verts * num_frames);
	mem += (sizeof(int) * total_num_faces * 4);
	mem += (sizeof(int) * total_num_objects);
	mem += (sizeof(int) * total_num_objects);
	mem += (sizeof(D3DPRIMITIVETYPE) * total_num_objects);
	mem += (sizeof(int) * total_num_objects);
	mem += (sizeof(VERT)* total_num_faces * 4);
	mem = mem /1024;

⌨️ 快捷键说明

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