📄 getcoord.cpp
字号:
short rectype1 = rectype;
if (rectype == OPCODE_LONG_IDENTIFIER) {
short *srec = (short *) tree -> prev -> record;
rectype1 = *srec;
}
if (rectype1 == OPCODE_OBJECT) {
treePtr *polytree = tree -> child;
if (polytree) {
short *srec2 = (short *) polytree -> record;
short rectype2 = *srec2;
if (rectype2 == OPCODE_POLYGON) {
setobjectid (polytree, tree -> counter);
}
}
}
}
void setobjectid (treePtr *tree, GLint objectid)
{
if (tree) {
tree -> objectid = objectid;
setobjectid (tree -> subface, objectid);
setobjectid (tree -> next, objectid);
}
}
void processRecord (treePtr *tree)
{
if (tree) {
processInfo (tree -> child);
processRecord (tree -> next);
}
}
void processInfo (treePtr *tree)
{
if (tree) {
short *srec = (short *) tree -> record;
short rectype = *srec;
if (rectype != OPCODE_VERTEX_LIST) {
processTreeRecord (tree);
}
processInfo (tree -> child);
processRecord (tree -> next);
}
}
void processRecord1 (treePtr *tree)
{
if (tree) {
processInfo1 (tree -> child);
processRecord1 (tree -> next);
}
}
void processInfo1 (treePtr *tree)
{
if (tree) {
processInfo1 (tree -> child);
processRecord1 (tree -> next);
processInfoSubface (tree -> subface);
}
}
void processInfoSubface (treePtr *tree)
{
if (tree) {
short *srec = (short *) tree -> record;
short rectype = *srec;
if (rectype != OPCODE_VERTEX_LIST) {
processTreeRecord (tree);
}
processInfoSubface (tree -> subface);
}
}
void processTreeRecord (treePtr *tree)
{
if (tree) {
char *rec = tree -> record;
short *srec = (short *) rec;
short rectype = *srec++;
short reclen = *srec++;
switch (rectype) {
case OPCODE_SWITCH_BEAD:
{
tree -> counter = switchcounter++;
tree -> beadcounter = ++beadcounter;
}
break;
case OPCODE_DEGREE_OF_FREEDOM:
{
tree -> counter = dofcounter++;
tree -> beadcounter = ++beadcounter;
}
break;
case OPCODE_LONG_IDENTIFIER:
{
if (tree -> prev) {
tree -> counter = tree -> prev -> counter;
tree -> beadcounter = tree -> prev -> beadcounter;
processPolygon (rectype, tree);
}
}
break;
case OPCODE_GROUP:
{
tree -> counter = groupcounter++;
tree -> beadcounter = ++beadcounter;
}
break;
case OPCODE_OBJECT:
{
tree -> counter = objectcounter++;
tree -> beadcounter = ++beadcounter;
processPolygon (rectype, tree);
}
break;
case OPCODE_BINARY_SEPARATING_PLANE:
{
tree -> counter = bspcounter++;
tree -> beadcounter = ++beadcounter;
}
break;
case OPCODE_POLYGON:
{
tree -> counter = polygoncounter++;
tree -> beadcounter += beadcounter;
}
break;
case OPCODE_BOUNDING_BOX:
{
tree -> counter = bboxcounter++;
tree -> beadcounter = ++beadcounter;
}
break;
case OPCODE_BOUNDING_SPHERE:
{
tree -> counter = bspherecounter++;
tree -> beadcounter = ++beadcounter;
}
break;
case OPCODE_TRANSFORMATION_MATRIX:
tree -> counter = matrixcounter++;
tree -> beadcounter += beadcounter;
break;
}
processTreeRecord (tree -> next);
}
}
void processBeadElement (CFileIO& myfile, treePtr *tree)
{
if (tree) {
char *rec = tree -> record;
short *srec = (short *) rec;
short rectype = *srec++;
short reclen = *srec++;
switch (rectype) {
case OPCODE_POLYGON:
{
if (fltversion > 1500) {//== 1520) {
aflt_PolygonRecord *poly;
poly = (aflt_PolygonRecord *) rec;
sprintf (buffer, "%s", poly -> IDField);
int i = checkForLongID (tree);
if (!polynameList.InNameList (buffer)) {
if (polyname[0]) {
// if (strcmp (polyname, buffer)) break;
if (strncmp (polyname, buffer, polynamelen)) break;
}
else if (polyfilename[0]) break;
}
treePtr *curtree;
if (i) curtree = tree -> next -> child;
else curtree = tree -> child;
if (curtree) {
aflt_VertexList *vtx;
vtx = (aflt_VertexList *) curtree -> record;
if (vtx -> Opcode == OPCODE_VERTEX_LIST) {
int numvtx = (vtx -> recordLen-4)/4;
if (numvtx > 2) {
vertexRecord *coord;
sprintf (buffer1, "GLvertex %s[] = {\n", buffer);
myfile.writedata (buffer1);
coord = findVertex (findVertexNo (vtx -> offset[0]));
sprintf (buffer1, "\t{ %f, %f, %f },\n", coord -> x, coord -> y, coord -> z);
myfile.writedata (buffer1);
coord = findVertex (findVertexNo (vtx -> offset[1]));
sprintf (buffer1, "\t{ %f, %f, %f },\n", coord -> x, coord -> y, coord -> z);
myfile.writedata (buffer1);
coord = findVertex (findVertexNo (vtx -> offset[2]));
sprintf (buffer1, "\t{ %f, %f, %f }\n", coord -> x, coord -> y, coord -> z);
myfile.writedata (buffer1);
myfile.writedata ("};\n");
}
else {
printf ("Error! Polygon %s must have at least 3 vertices\n", buffer);
}
}
else {
puts ("Error! Can not find VertexList record");
}
}
}
else {
flt_PolygonRecord *poly;
poly = (flt_PolygonRecord *) rec;
sprintf (buffer, "%s", poly -> IDField);
int i = checkForLongID (tree);
if (!polynameList.InNameList (buffer)) {
if (polyname[0]) {
// if (strcmp (polyname, buffer)) break;
if (strncmp (polyname, buffer, polynamelen)) break;
}
else if (polyfilename[0]) break;
}
treePtr *curtree;
if (i) curtree = tree -> next -> child;
else curtree = tree -> child;
if (curtree) {
flt_VertexList *vtx;
vtx = (flt_VertexList *) curtree -> record;
if (vtx -> Opcode == OPCODE_VERTEX_LIST) {
int numvtx = (vtx -> recordLen-4)/4;
if (numvtx > 2) {
vertexRecord *coord;
sprintf (buffer1, "GLvertex %s[] = {\n", buffer);
myfile.writedata (buffer1);
coord = findVertex (findVertexNo (vtx -> offset[0]));
sprintf (buffer1, "\t{ %f, %f, %f },\n", coord -> x, coord -> y, coord -> z);
myfile.writedata (buffer1);
coord = findVertex (findVertexNo (vtx -> offset[1]));
sprintf (buffer1, "\t{ %f, %f, %f },\n", coord -> x, coord -> y, coord -> z);
myfile.writedata (buffer1);
coord = findVertex (findVertexNo (vtx -> offset[2]));
sprintf (buffer1, "\t{ %f, %f, %f }\n", coord -> x, coord -> y, coord -> z);
myfile.writedata (buffer1);
myfile.writedata ("};\n");
}
else {
printf ("Error! Polygon %s must have at least 3 vertices\n", buffer);
}
}
else {
puts ("Error! Can not find VertexList record");
}
}
}
}
break;
}
processBeadElement (myfile, tree -> child);
processBeadElement (myfile, tree -> next);
processBeadElement (myfile, tree -> subface);
}
}
int convertColor (int color, int intensity)
{
int r, g, b, a;
r = color & 0xff;
g = (color >> 8) & 0xff;
b = (color >> 16) & 0xff;
a = (color >> 24) & 0xff;
r = (r * intensity) / 127;
g = ((g * intensity) / 127) << 8;
b = ((b * intensity) / 127) << 16;
a = ((a * intensity) / 127) << 24;
a = 0xff000000; // ignored alpha blend value
return r+g+b+a;
}
int checkForLongID (treePtr *tree)
{
if (tree -> next) {
short *srec = (short *) tree -> next -> record;
short rectype = *srec;
if (rectype == OPCODE_LONG_IDENTIFIER) {
flt_LongIDRecord *longid;
longid = (flt_LongIDRecord *) tree -> next -> record;
sprintf (buffer, "%s", longid -> id);
return 1;
}
}
return 0;
}
int saveRecordHeader (CFileIO& myfile, char *rec)
{
unsigned int colindex, colintensity, vertexcolor;
short *srec = (short *) rec;
short rectype = *srec++;
short reclen = *srec++;
vertexRecord *vtxptr;
switch (rectype) {
case OPCODE_SHARED_VERTEX_TABLE:
{
flt_SharedVertex *vtx;
vtx = (flt_SharedVertex *) rec;
vertexOffset += vtx -> recordLen;
}
break;
case OPCODE_VERTEX_COORDINATE:
{
vtxptr = getVertex ();
if (fltversion > 1500) {//== 1520) {
aflt_VertexCoordinate *vtx;
vtx = (aflt_VertexCoordinate *) rec;
storeVertex (vertexOffset, vertexno);
vertexOffset += vtx -> recordLen;
vtxptr -> id = vertexno++;
vtxptr -> x = (float) vtx -> x;
vtxptr -> y = (float) -vtx -> z;
vtxptr -> z = (float) vtx -> y;
if (!(vtx -> Flags & 0x2000)) {
colindex = vtx -> vertexColor >> 7;
vertexcolor = getColorFromTable (colindex);
colintensity = vtx -> vertexColor & 0x7f;
vertexcolor = convertColor (vertexcolor, colintensity);
vtxptr -> r = (float) (vertexcolor & 0xff) / (GLfloat) 255.0;
vtxptr -> g = (float) ((vertexcolor >> 8) & 0xff) / (GLfloat) 255.0;
vtxptr -> b = (float) ((vertexcolor >> 16) & 0xff) / (GLfloat) 255.0;
vtxptr -> a = (float) ((vertexcolor >> 24) & 0xff) / (GLfloat) 255.0;
}
}
else {
flt_VertexCoordinate *vtx;
vtx = (flt_VertexCoordinate *) rec;
storeVertex (vertexOffset, vertexno);
vertexOffset += vtx -> recordLen;
vtxptr -> id = vertexno++;
vtxptr -> x = (float) vtx -> x;
vtxptr -> y = (float) -vtx -> z;
vtxptr -> z = (float) vtx -> y;
if (!(vtx -> Flags & 0x2000)) {
colindex = vtx -> vertexColor >> 7;
vertexcolor = getColorFromTable (colindex);
colintensity = vtx -> vertexColor & 0x7f;
vertexcolor = convertColor (vertexcolor, colintensity);
vtxptr -> r = (float) (vertexcolor & 0xff) / (GLfloat) 255.0;
vtxptr -> g = (float) ((vertexcolor >> 8) & 0xff) / (GLfloat) 255.0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -