📄 dumpflt.cpp
字号:
//--------------------------------------
/*
DumpFLT - Tool to dump the content of flt file
Usage: DumpFLT fltfile [fltopcode]
where fltfile is the fltfile to be dumped
fltopcode is the flt opcode to be dumped (Default to all)
Created by Erick Jap October 21, 1996
Copyright Spectrum Holobyte, Inc.
*/
//--------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <io.h>
//--------------------------------------
// FLT Opcodes
#define OPCODE_HEADER 1
#define OPCODE_GROUP 2
#define OPCODE_OBJECT 4
#define OPCODE_POLYGON 5
#define OPCODE_PUSH_LEVEL 10
#define OPCODE_POP_LEVEL 11
#define OPCODE_DEGREE_OF_FREEDOM 14
#define OPCODE_PUSH_SUBFACE 19
#define OPCODE_POP_SUBFACE 20
#define OPCODE_TEXT_COMMENT 31
#define OPCODE_COLOR_TABLE 32
#define OPCODE_LONG_IDENTIFIER 33
#define OPCODE_TRANSFORMATION_MATRIX 49
#define OPCODE_VECTOR 50
#define OPCODE_BINARY_SEPARATING_PLANE 55
#define OPCODE_REPLICATE_CODE 60
#define OPCODE_LOCAL_INSTANCE 61
#define OPCODE_LOCAL_INSTANCE_LIBRARY 62
#define OPCODE_EXTERNAL_REFERENCE 63
#define OPCODE_TEXTURE_REFERENCE_RECORD 64
// unused for version > 1500
#define OPCODE_MATERIAL_TABLE 66
#define OPCODE_SHARED_VERTEX_TABLE 67
// new name for version > 1500
#define OPCODE_VERTEX_PALETTE 67
#define OPCODE_VERTEX_COORDINATE 68
#define OPCODE_VERTEX_WITH_NORMAL 69
#define OPCODE_VERTEX_WITH_NORMAL_AND_UV 70
#define OPCODE_VERTEX_WITH_UV 71
#define OPCODE_VERTEX_LIST 72
#define OPCODE_LEVEL_OF_DETAIL 73
#define OPCODE_BOUNDING_BOX 74
#define OPCODE_ROTATE_ABOUT_EDGE_TRANSFORM 76
// unused for version > 1500
#define OPCODE_SCALE_TRANSFORM 77
#define OPCODE_TRANSLATE_TRANSFORM 78
#define OPCODE_SCALE_WITH_INDEPENDENT_XYZ_SCALE 79
#define OPCODE_ROTATE_ABOUT_POINT_TRANSFORM 80
#define OPCODE_ROTATE_AND_OR_SCALE_TRANSFORM 81
#define OPCODE_PUT_TRANSFORM 82
#define OPCODE_EYEPOINT_AND_TRACKPLANE_POSITION 83
#define OPCODE_ROAD_SEGMENT 87
#define OPCODE_ROAD_ZONE 88
#define OPCODE_MORPHING_VERTEX_LIST 89
#define OPCODE_LINKAGE_RECORD 90
#define OPCODE_SOUND_BEAD 91
#define OPCODE_ROAD_PATH_BEAD 92
#define OPCODE_SOUND_PALETTE 93
#define OPCODE_GENERAL_MATRIX_TRANSFORM 94
#define OPCODE_TEXT_BEAD 95
#define OPCODE_SWITCH_BEAD 96
#define OPCODE_LINE_STYLE_RECORD 97
#define OPCODE_CLIPPING_QUADRILATERAL_BEAD 98
#define OPCODE_LIGHT_SOURCE_RECORD 101
#define OPCODE_LIGHT_SOURCE_PALETTE 102
// unused for version > 1500
#define OPCODE_DELAUNAY_HEADER 103
#define OPCODE_DELAUNAY_POINTS 104
#define OPCODE_BOUNDING_SPHERE 105
#define OPCODE_BOUNDING_CYLINDER 106
#define OPCODE_BOUNDING_VOLUME_CENTER 108
#define OPCODE_BOUNDING_VOLUME_ORIENTATION 109
#define OPCODE_TEXTURE_MAPPING_PALETTE 112
#define OPCODE_MATERIAL_PALETTE 113
#define OPCODE_COLOR_NAME_PALETTE 114
#define OPCODE_CONTINUOUSLY_ADAPTIVE_TERRAIN 115
#define OPCODE_CAT_DATA 116
#define OPCODE_PUSH_ATTRIBUTE 122
#define OPCODE_POP_ATTRIBUTE 123
//--------------------------------------
inline void exch_char (char *a, char *b)
{
*a ^= *b;
*b ^= *a;
*a ^= *b;
}
inline short swap_short (short num)
{
char *cnum = (char *) #
exch_char (&cnum[1], &cnum[0]);
return num;
}
//--------------------------------------
char *getRecord (int in);
void printbyte (char *name, char *buffer, int total);
void displayRecord (char *rec, int rectype, int reclen);
//--------------------------------------
void main (int argc, char *argv[])
{
printf ("DumpFLT v1.0 by Erick Jap\n\n");
if (argc < 2) {
puts ("DumpFLT - Tool to dump the content of flt file");
puts ("Usage: DumpFLT fltfile [fltopcode]");
puts ("where fltfile is the flt file to be dumped");
puts (" fltopcode is the flt opcode to be dumped (Default to dump all)\n");
exit (1);
}
int infile = open (argv[1], O_BINARY | O_RDONLY);
if (!infile) {
printf ("Can not open input file %s\n", argv[1]);
exit (1);
}
int recfilter = -1;
if (argc > 2) recfilter = atoi (argv[2]);
while (!eof(infile)) {
char *record = getRecord (infile);
if (!record) exit (1);
unsigned short *srec = (unsigned short *) record;
unsigned short rectype = *(srec);
unsigned short reclen = *(srec+1);
int i = 1;
if (recfilter != -1) {
if (rectype != recfilter) i = 0;
}
if (i) {
*(srec) = swap_short (rectype);
*(srec+1) = swap_short (reclen);
displayRecord (record, rectype, reclen);
}
free (record);
}
close (infile);
}
char *getRecord (int infile)
{
short rectype, reclen;
read (infile, &rectype, 2);
read (infile, &reclen, 2);
rectype = swap_short (rectype);
reclen = swap_short (reclen);
char *buf = (char *) malloc (reclen);
if (!buf) {
printf ("\nCan not allocate memory for record %d len = %d\n",
rectype, reclen);
return 0;
}
short *sbuf = (short *) buf;
*sbuf++ = rectype;
*sbuf++ = reclen;
if (reclen > 4) read (infile, (char *) sbuf, reclen-4);
return buf;
}
void printbyte (char *name, char *buffer, int total)
{
printf ("%s\n", name);
int i = 0;
while (total--) {
unsigned char c = (unsigned char) *buffer++;
printf ("%02X", c);
i++;
i %= 16;
if (total) {
if (i) printf (" ");
else printf ("\n");
}
}
printf ("\n-----------------------------------------------\n\n");
}
void displayRecord (char *rec, int rectype, int reclen)
{
switch (rectype) {
case OPCODE_HEADER:
printbyte ("Header", rec, reclen);
break;
case OPCODE_GROUP:
printbyte ("Group", rec, reclen);
break;
case OPCODE_OBJECT:
printbyte ("Object", rec, reclen);
break;
case OPCODE_POLYGON:
printbyte ("Polygon", rec, reclen);
break;
case OPCODE_PUSH_LEVEL:
printbyte ("Push", rec, reclen);
break;
case OPCODE_POP_LEVEL:
printbyte ("Pop", rec, reclen);
break;
case OPCODE_DEGREE_OF_FREEDOM:
printbyte ("Degree of Freedom", rec, reclen);
break;
case OPCODE_PUSH_SUBFACE:
printbyte ("Push Subface", rec, reclen);
break;
case OPCODE_POP_SUBFACE:
printbyte ("Pop Subface", rec, reclen);
break;
case OPCODE_TEXT_COMMENT:
printbyte ("Text Comment", rec, reclen);
break;
case OPCODE_COLOR_TABLE:
printbyte ("Color Table", rec, reclen);
break;
case OPCODE_LONG_IDENTIFIER:
printbyte ("Long Identifier", rec, reclen);
break;
case OPCODE_TRANSFORMATION_MATRIX:
printbyte ("Transformation Matrix", rec, reclen);
break;
case OPCODE_VECTOR:
printbyte ("Vector", rec, reclen);
break;
case OPCODE_BINARY_SEPARATING_PLANE:
printbyte ("Binary Separating Plane", rec, reclen);
break;
case OPCODE_REPLICATE_CODE:
printbyte ("Replicate Code", rec, reclen);
break;
case OPCODE_LOCAL_INSTANCE:
printbyte ("Local Instance", rec, reclen);
break;
case OPCODE_LOCAL_INSTANCE_LIBRARY:
printbyte ("Local Instance Library", rec, reclen);
break;
case OPCODE_EXTERNAL_REFERENCE:
printbyte ("External Reference", rec, reclen);
break;
case OPCODE_TEXTURE_REFERENCE_RECORD:
printbyte ("Texture Reference", rec, reclen);
break;
case OPCODE_MATERIAL_TABLE:
printbyte ("Material Table", rec, reclen);
break;
case OPCODE_SHARED_VERTEX_TABLE:
// case OPCODE_VERTEX_PALETTE:
printbyte ("Shared Vertex or Vertex Palette", rec, reclen);
break;
case OPCODE_VERTEX_COORDINATE:
printbyte ("Vertex Coordinate", rec, reclen);
break;
case OPCODE_VERTEX_WITH_NORMAL:
printbyte ("Vertex with Normal", rec, reclen);
break;
case OPCODE_VERTEX_WITH_NORMAL_AND_UV:
printbyte ("Vertex with Normal and UV", rec, reclen);
break;
case OPCODE_VERTEX_WITH_UV:
printbyte ("Vertex with UV", rec, reclen);
break;
case OPCODE_VERTEX_LIST:
printbyte ("Vertex List", rec, reclen);
break;
case OPCODE_LEVEL_OF_DETAIL:
printbyte ("Level Of Detail", rec, reclen);
break;
case OPCODE_BOUNDING_BOX:
printbyte ("Bounding Box", rec, reclen);
break;
case OPCODE_ROTATE_ABOUT_EDGE_TRANSFORM:
printbyte ("Rotate about Edge Transform", rec, reclen);
break;
case OPCODE_SCALE_TRANSFORM:
printbyte ("Scale Transform", rec, reclen);
break;
case OPCODE_TRANSLATE_TRANSFORM:
printbyte ("Translate Transform", rec, reclen);
break;
case OPCODE_SCALE_WITH_INDEPENDENT_XYZ_SCALE:
printbyte ("Scale with independent XYZ", rec, reclen);
break;
case OPCODE_ROTATE_ABOUT_POINT_TRANSFORM:
printbyte ("Rotate about Point Transform", rec, reclen);
break;
case OPCODE_ROTATE_AND_OR_SCALE_TRANSFORM:
printbyte ("Rotate and/or Scale Transform", rec, reclen);
break;
case OPCODE_PUT_TRANSFORM:
printbyte ("Put Transform", rec, reclen);
break;
case OPCODE_EYEPOINT_AND_TRACKPLANE_POSITION:
printbyte ("Eyepoint and Trackplane Position", rec, reclen);
break;
case OPCODE_ROAD_SEGMENT:
printbyte ("Road Segment", rec, reclen);
break;
case OPCODE_ROAD_ZONE:
printbyte ("Road Zone", rec, reclen);
break;
case OPCODE_MORPHING_VERTEX_LIST:
printbyte ("Morphing Vertex List", rec, reclen);
break;
case OPCODE_LINKAGE_RECORD:
printbyte ("Linkage Record", rec, reclen);
break;
case OPCODE_SOUND_BEAD:
printbyte ("Sound Bead", rec, reclen);
break;
case OPCODE_ROAD_PATH_BEAD:
printbyte ("Road Path Bead", rec, reclen);
break;
case OPCODE_SOUND_PALETTE:
printbyte ("Sound Palette", rec, reclen);
break;
case OPCODE_GENERAL_MATRIX_TRANSFORM:
printbyte ("General Matrix Transform", rec, reclen);
break;
case OPCODE_TEXT_BEAD:
printbyte ("Text Bead", rec, reclen);
break;
case OPCODE_SWITCH_BEAD:
printbyte ("Switch Bead", rec, reclen);
break;
case OPCODE_LINE_STYLE_RECORD:
printbyte ("Line Style Record", rec, reclen);
break;
case OPCODE_CLIPPING_QUADRILATERAL_BEAD:
printbyte ("Clipping Quadrilateral Bead", rec, reclen);
break;
case OPCODE_LIGHT_SOURCE_RECORD:
printbyte ("Light Source Record", rec, reclen);
break;
case OPCODE_LIGHT_SOURCE_PALETTE:
printbyte ("Light Source Palette", rec, reclen);
break;
case OPCODE_DELAUNAY_HEADER:
printbyte ("Delaunay Header", rec, reclen);
break;
case OPCODE_DELAUNAY_POINTS:
printbyte ("Delaunay Points", rec, reclen);
break;
case OPCODE_BOUNDING_SPHERE:
printbyte ("Bounding Sphere", rec, reclen);
break;
case OPCODE_BOUNDING_CYLINDER:
printbyte ("Bounding Cylinder", rec, reclen);
break;
case OPCODE_BOUNDING_VOLUME_CENTER:
printbyte ("Bounding Volume Center", rec, reclen);
break;
case OPCODE_BOUNDING_VOLUME_ORIENTATION:
printbyte ("Bounding Volume Orientation", rec, reclen);
break;
case OPCODE_TEXTURE_MAPPING_PALETTE:
printbyte ("Texture Mapping Palette", rec, reclen);
break;
case OPCODE_MATERIAL_PALETTE:
printbyte ("Material Palette", rec, reclen);
break;
case OPCODE_COLOR_NAME_PALETTE:
printbyte ("Color Name Palette", rec, reclen);
break;
case OPCODE_CONTINUOUSLY_ADAPTIVE_TERRAIN:
printbyte ("Continuously Adaptive Terrain", rec, reclen);
break;
case OPCODE_CAT_DATA:
printbyte ("CAT Data", rec, reclen);
break;
case OPCODE_PUSH_ATTRIBUTE:
printbyte ("Push Attribute", rec, reclen);
break;
case OPCODE_POP_ATTRIBUTE:
printbyte ("Pop Attribute", rec, reclen);
break;
default:
printf ("Record type is unknown (%d), length is %d\n", rectype, reclen);
printbyte ("Unsupported Type", rec, reclen);
break;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -