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