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

📄 hotreadr.cpp

📁 空战游戏flacon源码
💻 CPP
📖 第 1 页 / 共 4 页
字号:
			in.read ("%s", str);
			vtx.flag |= VERTEX_TYPE_NORMAL;
			k |= 1;
		}

		j = GetStringType ((GLbyte *) str);
		if (j == 'Text') {			// TextureCoordinate
			in.read ("%f", &(vtx.u));
			in.read ("%f", &(vtx.v));
			in.read ("%s", str);
			vtx.flag |= VERTEX_TYPE_TEXTURE;
			k |= 2;
		}

		j = GetStringType ((GLbyte *) str);
		if (j == 'Colo') {			// Color
			GLcolor rgbcolor;
			in.read ("%f", &(rgbcolor.r)); 
			in.read ("%f", &(rgbcolor.g));
			in.read ("%f", &(rgbcolor.b)); 
			in.read ("%f", &(rgbcolor.a));
			in.read ("%s", str);
			vtx.flag |= VERTEX_TYPE_GOURAUD;
			k |= 4;

			GLuint color = (((GLint) (rgbcolor.a * 255.0f)) << 24) |
					(((GLint) (rgbcolor.b * 255.0f)) << 16) |
					(((GLint) (rgbcolor.g * 255.0f)) <<  8) |
					 ((GLint) (rgbcolor.r * 255.0f));
			vtx.colorindex = CacheColor (color);

		}

		if (InsertVertex (&vtx, &coord, vtx.flag) == -1) return -2;
	}
	if (!(k & 1)) objData -> objectFlag |= GL_DETAIL_SMOOTH_SHADING;
	if (!(k & 2)) objData -> objectFlag |= GL_DETAIL_TEXTURE;
	if (!(k & 4)) objData -> objectFlag |= GL_DETAIL_GOURAUD;

	return 0;
}

GLint CHOTReader::readTextureList (GLint flag)
{
	if (TextureListPos == -1) return 1;
	char	str[256];
	GLint	i, j, k;

	in.movefileptr (TextureListPos);
	i = 0;
	j = 0;
	while (1) {
		in.read ("%s", str);
		strupr (str);
		k = *((int *) str);
		if (k == 'ZZZZ') break;
		if (!strcmp (str, "TEXTURENUM")) {
			in.read ("%s", str);
		}
		else if (!strcmp (str, "NAME")) {
			in.read ("%s", str);
		}
		else if (!strcmp (str, "PATTERNID")) {
			j++;
			in.read ("%d", &k);
			k++;
			if (i < k) i = k;
		}
		else if (!strcmp (str, "OFFSET")) {
			in.read ("%s", str);
			in.read ("%s", str);
		}
		else if (!strcmp (str, "TEXTURETYPE")) {
			in.read ("%s", str);
		}
	}
	objData -> TextureSetSize = j / objData -> TotalTextureSet;
	objData -> TotalTextures = i;

	i = objData -> TotalTextures * sizeof(GLbeadTexture);
	objData -> beadTexture = (GLbeadTexture *) glAllocateMemory (i);
	if (!objData -> beadTexture) {
		DisplayErrorMessage ((GLbyte *) "Can not allocate memory for texture!");
		return 2;
	}

	in.movefileptr (TextureListPos);
	while (1) {
		in.read ("%s", str);
		strupr (str);
		j = *((int *) str);
		if (j == 'ZZZZ') break;
		if (!strcmp (str, "TEXTURENUM")) {
			in.read ("%s", str);
		}
		else if (!strcmp (str, "NAME")) {
			in.read ("%s", str);
			i = glSearchTexture (str);
		}
		else if (!strcmp (str, "PATTERNID")) {
			in.read ("%d", &j);
			objData -> beadTexture[j].textureID = i;
//			if (objData -> hrc) {
				if (i != -1) glInsertTexture (i, flag);
//			}
		}
		else if (!strcmp (str, "OFFSET")) {
			in.read ("%s", str);
			in.read ("%s", str);
		}
		else if (!strcmp (str, "TEXTURETYPE")) {
			in.read ("%s", str);
		}
	}

	return 0;
}

GLint CHOTReader::countTotalString (char *string)
{
	GLint	i, total;
	char str[256];
	total = 0;
	while (1) {
		in.read ("%s", str);
		i = *((int *) str);
		if (i == 'ZZZZ') break;
		if (!strcmp (str, string)) total++;
	}
	return total;
}

GLint CHOTReader::readBeadList ()
{
	if (BeadListPos == -1) return -1;
	in.movefileptr (BeadListPos);

	objData -> beadRoot = readBeadData ();
	if (GlobalErrorFlag & 1) return -1;

	return 0;
}

GLbeadTree *CHOTReader::readBeadData ()
{
	in.read ("%s", inString);

	GLint type = GetStringType ((GLbyte *) inString);
	if (type == 'Bead') {

		GLbeadTree *bead = allocateBead ();
		if (!bead) {
			DisplayErrorMessage ((GLbyte *) "Can not allocate bead memory");
			return 0;
		}

		GLint tempfilepos = in.getfileptr ();
		in.read ("%s", inString);

		GLint filepos = in.getfileptr ();
		GLint pos = findString (inString);
		if (pos == -1) {
			GlobalErrorFlag |= 1;
			return 0;
		}
		in.movefileptr (pos);

		in.read ("%s", inString);
		type = GetStringType ((GLbyte *) inString);
		if (type == 'Bead') {
			in.movefileptr (tempfilepos);
			in.read ("%s", inString);
			pos = findString (inString);
			if (pos == -1) {
				GlobalErrorFlag |= 1;
				return 0;
			}
			in.movefileptr (pos);
		}
		else {
			int parenttype = -1;
			if (type == 'Name') {

				in.read ("%s", beadName);	// name
				strupr (beadName);
				in.read ("%s", inString);	// "Type"
				in.read ("%s", inString);	// type

				parenttype = GetStringType ((GLbyte *) inString);
				switch (parenttype) {
// Ignore polygon information
					case 'Info':	// Polygon Information
						{
						GLint	totalvert, j, k, l;
						in.read ("%s", inString);	// "VertexList"
						in.read ("%d", &totalvert);	// total vertices
						for (j=0; j < totalvert; j++) {
							in.read ("%d", &k);
						}

						while (1) {
							in.read ("%s", inString);
							type = GetStringType ((GLbyte *) inString);
							if (type == 'ZZZZ') break;
							switch (type) {
								case 'Colo':			// Color
									in.read ("%d", &j);
									in.read ("%d", &j);
									in.read ("%d", &j); 
									in.read ("%d", &j); 
									break;
								case 'Obje':			// ObjectID
									in.read ("%d", &j);
									break;
								case 'Text':			// TextureNo
									in.read ("%d", &j);
									in.read ("%d", &l);
									break;
								case 'Tran':			// Transparency
									in.read ("%d", &j);
									break;
								case 'TwoS':			// TwoSided
								case 'Wire':			// Wireframe
								case 'Bill':			// Billboard
								case 'Tree':			// Tree Billboard
								case 'NoSh':				// NoShading
									break;
								case 'Subf':			// Subface
									in.read ("%s", inString);	// Subface address
									GLint subfacepos = in.getfileptr ();
									pos = findString (inString);
									if (pos == -1) {
										GlobalErrorFlag |= 1;
										return 0;
									}
									in.movefileptr (pos);
									readBeadData ();
									in.movefileptr (subfacepos);
									break;
							}
						}
						}
						break;
					case 'Poly':	// Polygon
						{
						GLint	totalvert, j;
						in.read ("%s", inString);	// "VertexList"
						in.read ("%d", &totalvert);	// total vertices
						GLbeadPolygon *poly = allocatePolygon (totalvert);
						if (!poly) {
							DisplayErrorMessage ((GLbyte *) "Can not allocate polygon memory");
							return 0;
						}

						poly -> totalVertices = totalvert;
						poly -> faceType = 0;
						GLvertexData *vtxlist;
						GLint vtxtype = 0xffffffff;
						GLint	k, l;

						if (colorpatch) {
							for (j=0; j < totalvert; j++)
								in.read ("%d", &poly -> vertices[j]);
							GLvertexData *vtxptr;
							ColorPatchRecord *patch = colorpatch;
							for (l=0; l < totalcolorpatch;l++) {
								if (!strcmp(beadName, (char *) patch -> polyname)) {
									k = poly -> vertices[patch -> vtxnum];
									vtxptr = GetVertex (k);
									vtxptr -> colorindex = patch -> colorindex;
									vtxptr -> flag |= VERTEX_TYPE_GOURAUD;
									if (objData -> objectFlag & GL_DETAIL_GOURAUD)
										objData -> objectFlag &= ~GL_DETAIL_GOURAUD;
								}
								patch++;
							}
							for (j=0; j < totalvert; j++) {
								vtxlist = GetVertex(poly -> vertices[j]);
								vtxtype &= vtxlist -> flag;
							}
						}
						else {
							for (j=0; j < totalvert; j++) {
								in.read ("%d", &k);
								poly -> vertices[j] = k;
								vtxlist = GetVertex(k);
								vtxtype &= vtxlist -> flag;
							}
						}

						if (totalvert > 2) {
							poly -> vertices[j] = poly -> vertices[0];	// close it
							CalculatePlane (poly);
						}
						if (vtxtype & VERTEX_TYPE_NORMAL)
							poly -> faceType |= FACE_HAS_VERTEX_NORMAL;
						if (vtxtype & VERTEX_TYPE_GOURAUD) {
							poly -> faceType |= FACE_TYPE_GOURAUD;
							for (j=0; j < totalvert; j++) {
								vtxlist = GetVertex(poly -> vertices[j]);
								GLuint polyColor = ColorTable[vtxlist -> colorindex+1].color;
								if ((polyColor & 0xff000000) != 0xff000000)
									poly -> faceType |= FACE_USE_VERTEX_ALPHA;
							}
						}

						if (vtxtype & VERTEX_TYPE_GOURAUD)
							poly -> faceInfo = GL_POLY_GOURAUD_COLOR;
						else if (vtxtype & VERTEX_TYPE_NORMAL)
							poly -> faceInfo = GL_POLY_GOURAUD;
						else poly -> faceInfo = GL_POLY_SOLID_COLOR;

						poly -> subface = 0;
						poly -> faceTexture = 0;
						poly -> textureID = -1;
						poly -> faceAlpha = (GLfloat) 0.0;

						GLuint faceColor = 0;
						while (1) {
							in.read ("%s", inString);
							type = GetStringType ((GLbyte *) inString);
							if (type == 'ZZZZ') break;
							switch (type) {
								case 'Colo':			// Color
									in.read ("%d", &j);
									faceColor = j & 255;
									in.read ("%d", &j);
									faceColor |= ((j & 255) << 8);
									in.read ("%d", &j); 
									faceColor |= ((j & 255) << 16);
									in.read ("%d", &j); 
									faceColor |= ((j & 255) << 24);
									break;
								case 'Obje':			// ObjectID
									in.read ("%d", &j);
									break;
								case 'Text':			// TextureNo
									in.read ("%d", &j);
									in.read ("%d", &l);
									if (objData -> beadTexture) {
										k = objData -> beadTexture[j].textureID;
										if (k != -1) {
											if (vtxtype & VERTEX_TYPE_TEXTURE) {
												if (l) poly -> faceInfo = GL_POLY_TEXTURE_MASK;
												else poly -> faceInfo = GL_POLY_TEXTURE;
											}
											// new version save the texture index, not the real id
											poly -> textureID = j;//k;
										}
									}
									break;
								case 'Tran':			// Transparency
									in.read ("%d", &j);
									poly -> faceAlpha = 
										(GLfloat) (j & 0xffff) / (GLfloat) 0xffff;
									break;
								case 'TwoS':			// TwoSided
									poly -> faceType |= FACE_TYPE_TWOSIDED;
									break;
								case 'Wire':			// Wireframe
									poly -> faceType |= FACE_TYPE_WIREFRAME;
									break;
								case 'Bill':			// Billboard
									objData -> objectFlag |= OBJECT_TYPE_BILLBOARD;
									poly -> faceType |= FACE_TYPE_BILLBOARD;
									//poly -> faceType |= FACE_TYPE_TWOSIDED;
									for (j=0; j < totalvert; j++) {
										vtxlist = GetVertex(poly -> vertices[j]);
										GLvertex *coord = GetCoord(poly -> vertices[j]);
										poly -> vertices[j] = InsertVertex (vtxlist, coord, vtxlist -> flag | VERTEX_TYPE_BILLBOARD);
										if (poly -> vertices[j] == -1) {
											DisplayErrorMessage ((GLbyte *) "Can not duplicate billboard vertex");
											return 0;
										}
									}
									if (totalvert > 2) poly -> vertices[j] = poly -> vertices[0];	// close it
									break;
								case 'Tree':			// Tree Billboard
									objData -> objectFlag |= OBJECT_TYPE_BILLBOARD;
									poly -> faceType |= FACE_TYPE_TREE;
									//poly -> faceType |= FACE_TYPE_TWOSIDED;
									for (j=0; j < totalvert; j++) {
										vtxlist = GetVertex(poly -> vertices[j]);
										GLvertex *coord = GetCoord(poly -> vertices[j]);
										poly -> vertices[j] = InsertVertex (vtxlist, coord, vtxlist -> flag | VERTEX_TYPE_TREE);
										if (poly -> vertices[j] == -1) {
											DisplayErrorMessage ((GLbyte *) "Can not duplicate tree vertex");
											return 0;
										}
									}
									if (totalvert > 2) poly -> vertices[j] = poly -> vertices[0];	// close it
									break;
								case 'NoSh':				// NoShading
									poly -> faceType |= FACE_HAS_NO_SHADING;
									break;
								case 'Subf':			// Subface
									in.read ("%s", inString);	// Subface address
									GLint subfacepos = in.getfileptr ();
									pos = findString (inString);
									if (pos == -1) {
										GlobalErrorFlag |= 1;
										return 0;
									}
									in.movefileptr (pos);
									poly -> subface = readBeadData ();
									in.movefileptr (subfacepos);
									break;
							}
						}

						if (dynamicvertex) {
							GLvertexData *vtxptr;
							DynamicVertexRecord *vtx = dynamicvertex;
							for (l=0; l < totaldynamicvertex;l++) {
								if (!strcmp(beadName, (char *) vtx -> polyname)) {
									k = poly -> vertices[vtx -> vtxnum];
									vtx -> index = k;
									vtxptr = GetVertex (k);
									vtxptr -> flag |= VERTEX_TYPE_DYNAMIC;
								}
								vtx++;
							}
						}
						
						if (poly -> faceAlpha) {
							GLint a = (GLint) (poly -> faceAlpha * (GLfloat) 255.0);
							faceColor = (a << 24) | (faceColor & 0xffffff);
						}

						poly -> colorindex = CacheColor (faceColor);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -