/* * PVVMUD a 3D MUD * Copyright (C) 1998-1999 Programvareverkstedet (pvv@pvv.org) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include "globals.h" #include "parse.h" TreeNode_t * linkNode(TreeNode_t * n1, TreeNode_t * n2){ TreeNode_t * t = n1; if (t != NULL) { while (t->sibling != NULL) t = t->sibling; t->sibling = n2; return n1; } else return n2; } TreeNode_t * newFile(TreeNode_t * head, TreeNode_t * geometry){ TreeNode_t * treeNode = (TreeNode_t *)malloc( sizeof (TreeNode_t) ); treeNode->nodeKind = FileK; treeNode->child[0] = head; treeNode->child[1] = geometry; treeNode->sibling = NULL; return treeNode; } TreeNode_t * newHead(TreeNode_t * version){ TreeNode_t * treeNode = (TreeNode_t *)malloc( sizeof (TreeNode_t) ); treeNode->nodeKind = HeadK; treeNode->child[0] = version; treeNode->child[1] = NULL; treeNode->sibling = NULL; return treeNode; } TreeNode_t * newGeometry(TreeNode_t * list, TreeNode_t * poly){ TreeNode_t * treeNode = (TreeNode_t *)malloc( sizeof (TreeNode_t) ); treeNode->nodeKind = GeometryK; treeNode->child[0] = list; treeNode->child[1] = poly; treeNode->sibling = NULL; return treeNode; } TreeNode_t * newVertex(TreeNode_t * v1, TreeNode_t * v2, TreeNode_t * v3){ TreeNode_t * treeNode = (TreeNode_t *)malloc( sizeof (TreeNode_t) ); treeNode->nodeKind = VertexK; treeNode->child[0] = v1; treeNode->child[1] = v2; treeNode->child[2] = v3; treeNode->sibling = NULL; return treeNode; } TreeNode_t * newNormal(TreeNode_t * v1, TreeNode_t * v2, TreeNode_t * v3){ TreeNode_t * treeNode = (TreeNode_t *)malloc( sizeof (TreeNode_t) ); treeNode->nodeKind = NormalK; treeNode->child[0] = v1; treeNode->child[1] = v2; treeNode->child[2] = v3; treeNode->sibling = NULL; return treeNode; } TreeNode_t * newTexCoord(TreeNode_t * v1, TreeNode_t * v2){ TreeNode_t * treeNode = (TreeNode_t *)malloc( sizeof (TreeNode_t) ); treeNode->nodeKind = TexCoordK; treeNode->child[0] = v1; treeNode->child[1] = v2; treeNode->sibling = NULL; return treeNode; } TreeNode_t * newVertexList(TreeNode_t * vertex){ TreeNode_t * treeNode = (TreeNode_t *)malloc( sizeof (TreeNode_t) ); treeNode->nodeKind = VertexListK; treeNode->child[0] = vertex; treeNode->sibling = NULL; return treeNode; } TreeNode_t * newNormalList(TreeNode_t * normal){ TreeNode_t * treeNode = (TreeNode_t *)malloc( sizeof (TreeNode_t) ); treeNode->nodeKind = NormalListK; treeNode->child[0] = normal; treeNode->sibling = NULL; return treeNode; } TreeNode_t * newTexCoordList(TreeNode_t * texCoord){ TreeNode_t * treeNode = (TreeNode_t *)malloc( sizeof (TreeNode_t) ); treeNode->nodeKind = TexCoordListK; treeNode->child[0] = texCoord; treeNode->sibling = NULL; return treeNode; } TreeNode_t * newFloat(float value){ TreeNode_t * treeNode = (TreeNode_t *)malloc( sizeof (TreeNode_t) ); treeNode->nodeKind = FloatK; treeNode->attr.value = value; return treeNode; } TreeNode_t * newIndex(int index){ TreeNode_t * treeNode = (TreeNode_t *)malloc( sizeof (TreeNode_t) ); treeNode->nodeKind = IndexK; treeNode->attr.index = index; return treeNode; } TreeNode_t * newPoly(TreeNode_t * polyattr){ TreeNode_t * treeNode = (TreeNode_t *)malloc( sizeof (TreeNode_t) ); treeNode->nodeKind = PolyK; treeNode->child[0] = polyattr; treeNode->sibling = NULL; return treeNode; } TreeNode_t * newPolyType(PolyType_t polyType){ TreeNode_t * treeNode = (TreeNode_t *)malloc( sizeof (TreeNode_t) ); treeNode->nodeKind = PolyTypeK; treeNode->attr.polyType = polyType; treeNode->sibling = NULL; return treeNode; } TreeNode_t * newMaterial(char * name){ TreeNode_t * treeNode = (TreeNode_t *)malloc( sizeof (TreeNode_t) ); treeNode->nodeKind = MaterialK; treeNode->attr.name = name; treeNode->sibling = NULL; return treeNode; } TreeNode_t * newVertexIndexList(TreeNode_t * indexList){ TreeNode_t * treeNode = (TreeNode_t *)malloc( sizeof (TreeNode_t) ); treeNode->nodeKind = VertexIndexListK; treeNode->child[0] = indexList; treeNode->sibling = NULL; return treeNode; } TreeNode_t * newNormalIndexList(TreeNode_t * indexList){ TreeNode_t * treeNode = (TreeNode_t *)malloc( sizeof (TreeNode_t) ); treeNode->nodeKind = NormalIndexListK; treeNode->child[0] = indexList; treeNode->sibling = NULL; return treeNode; } TreeNode_t * newTexCoordIndexList(TreeNode_t * indexList){ TreeNode_t * treeNode = (TreeNode_t *)malloc( sizeof (TreeNode_t) ); treeNode->nodeKind = TexCoordIndexListK; treeNode->child[0] = indexList; treeNode->sibling = NULL; return treeNode; } void printTree(TreeNode_t * node){ if (node == NULL) return; switch (node->nodeKind){ case GeometryK: printf("Geometry {\n"); printTree(node->child[0]); printTree(node->child[1]); printf("}\n"); break; case VertexListK: printf("\tVertexList = [\t"); printTree(node->child[0]); printf(" ];\n"); printTree(node->sibling); break; case NormalListK: printf("\tNormalList = [\t"); printTree(node->child[0]); printf(" ];\n"); printTree(node->sibling); break; case TexCoordListK: printf("\tTexCoordList = [ "); printTree(node->child[0]); printf(" ];\n"); printTree(node->sibling); break; case VertexK: printf("( "); printTree(node->child[0]); printf(", "); printTree(node->child[1]); printf(", "); printTree(node->child[2]); printf(")"); if (node->sibling != NULL) { printf(",\n\t\t\t"); printTree(node->sibling); } break; case NormalK: printf("( "); printTree(node->child[0]); printf(", "); printTree(node->child[1]); printf(", "); printTree(node->child[2]); printf(")"); if (node->sibling != NULL) { printf(",\n\t\t\t"); printTree(node->sibling); } break; case TexCoordK: printf("( "); printTree(node->child[0]); printf(", "); printTree(node->child[1]); printf(")"); if (node->sibling != NULL) { printf(",\n\t\t\t"); printTree(node->sibling); } break; case PolyK: printf("\tPolygon {\n"); printTree(node->child[0]); printf("\t}\n"); printTree(node->sibling); break; case PolyTypeK: printf("\t\tType = "); switch(node->attr.polyType){ case PT_Polygon: printf("POLYGON"); break; case PT_Triangles: printf("TRIANGLES"); break; case PT_Quads: printf("QUADS"); break; case PT_Quad_strip: printf("QUAD_STRIP"); break; case PT_Triangle_strip: printf("TRIANGLE_STRIP"); break; case PT_Triangle_fan: printf("TRIANGLE_FAN"); break; } printf("\n"); printTree(node->sibling); break; case MaterialK: printf("\t\tMaterial = %s\n",node->attr.name); printTree(node->sibling); break; case VertexIndexListK: printf("\t\tVertex = [ "); printTree(node->child[0]); printf("];\n"); printTree(node->sibling); break; case NormalIndexListK: printf("\t\tNormal = [ "); printTree(node->child[0]); printf("];\n"); printTree(node->sibling); break; case TexCoordIndexListK: printf("\t\tTexCoord = [ "); printTree(node->child[0]); printf("];\n"); printTree(node->sibling); break; case IndexK: printf("%i",node->attr.index); if (node->sibling != NULL){ printf(", "); printTree(node->sibling); } break; case FloatK: printf("%f",node->attr.value); break; } }