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