📄 import3ds.cpp
字号:
//-----------------------------------------------------------------------------
// 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 + -