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

📄 getcoord.cpp

📁 空战游戏flacon源码
💻 CPP
📖 第 1 页 / 共 3 页
字号:
	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 + -