/* * 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 * newGeometry(TreeNode_t * head, TreeNode_t * object){ TreeNode_t * treeNode = (TreeNode_t *)malloc( sizeof (TreeNode_t) ); treeNode->nodeKind = GeometryK; treeNode->child[0] = head; treeNode->child[1] = object; treeNode->sibling = NULL; return treeNode; } TreeNode_t * newHead(){ TreeNode_t * treeNode = (TreeNode_t *)malloc( sizeof (TreeNode_t) ); treeNode->nodeKind = HeadK; 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 * newObject(TreeNode_t * head, TreeNode_t * objGeo){ TreeNode_t * treeNode = (TreeNode_t *)malloc( sizeof (TreeNode_t) ); treeNode->nodeKind = ObjectK; treeNode->child[0] = head; treeNode->child[1] = objGeo; treeNode->sibling = NULL; return treeNode; } TreeNode_t * newTriMesh(TreeNode_t * triMeshHead, TreeNode_t * vertexList, TreeNode_t * faceList){ TreeNode_t * treeNode = (TreeNode_t *)malloc( sizeof (TreeNode_t) ); treeNode->nodeKind = TriMeshK; treeNode->child[0] = triMeshHead; treeNode->child[1] = vertexList; treeNode->child[2] = faceList; treeNode->sibling = NULL; return treeNode; } TreeNode_t * newNum(int num){ TreeNode_t * treeNode = (TreeNode_t *)malloc( sizeof (TreeNode_t) ); treeNode->nodeKind = NumK; treeNode->attr.num = num; return treeNode; } TreeNode_t * newObjectHead(char * name){ TreeNode_t * treeNode = (TreeNode_t *)malloc( sizeof (TreeNode_t) ); treeNode->nodeKind = ObjectHeadK; treeNode->attr.name = name; treeNode->sibling = NULL; return treeNode; } TreeNode_t * newTriMeshHead(TreeNode_t * vertexNum, TreeNode_t * faceNum, int mapped){ TreeNode_t * treeNode = (TreeNode_t *)malloc( sizeof (TreeNode_t) ); treeNode->nodeKind = TriMeshHeadK; treeNode->child[0] = vertexNum; treeNode->child[1] = faceNum; treeNode->sibling = NULL; treeNode->attr.mapped = mapped; return treeNode; } TreeNode_t * newVertex(TreeNode_t * num, TreeNode_t * v1, TreeNode_t * v2, TreeNode_t * v3){ TreeNode_t * treeNode = (TreeNode_t *)malloc( sizeof (TreeNode_t) ); treeNode->nodeKind = VertexK; treeNode->child[0] = num; treeNode->child[1] = v1; treeNode->child[2] = v2; treeNode->child[3] = v3; treeNode->sibling = NULL; return treeNode; } TreeNode_t * newUVMapping(TreeNode_t * u, TreeNode_t * v){ TreeNode_t * treeNode = (TreeNode_t *)malloc( sizeof (TreeNode_t) ); treeNode->nodeKind = UVMappingK; treeNode->child[0] = u; treeNode->child[1] = v; treeNode->sibling = NULL; return treeNode; } TreeNode_t * newFace(TreeNode_t * num, TreeNode_t * v1, TreeNode_t * v2, TreeNode_t * v3){ TreeNode_t * treeNode = (TreeNode_t *)malloc( sizeof (TreeNode_t) ); treeNode->nodeKind = FaceK; treeNode->child[0] = num; treeNode->child[1] = v1; treeNode->child[2] = v2; treeNode->child[3] = v3; 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 * newSmoothing(TreeNode_t * smoothing){ TreeNode_t * treeNode = (TreeNode_t *)malloc( sizeof (TreeNode_t) ); treeNode->nodeKind = SmoothingK; treeNode->child[0] = smoothing; 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 HeadK: printf("\tHead\n"); break; case FloatK: printf("%f",node->attr.value); break; case ObjectK: printf("\tObject = [\n"); printTree(node->child[0]); printTree(node->child[1]); printf("\t];\n"); printTree(node->sibling); break; case ObjectHeadK: printf("\t\tHead %s\n",node->attr.name); break; case TriMeshK: printf("\t\tTri-Mesh [\n"); printTree(node->child[0]); printTree(node->child[1]); printTree(node->child[2]); printf("\t\t];\n"); break; case TriMeshHeadK: printf("\t\t\tHead ( "); printTree(node->child[0]); printf(", "); printTree(node->child[1]); printf(", %i)\n",node->attr.mapped); break; case NumK: printf("%i",node->attr.num); if (node->sibling != NULL){ printf(", "); printTree(node->sibling); } break; case VertexK: printf("\t\t\tXYZ ( "); printTree(node->child[0]); printf(": "); printTree(node->child[1]); printf(", "); printTree(node->child[2]); printf(", "); printTree(node->child[3]); printf(")\n"); if (node->sibling != NULL) { printTree(node->sibling); } break; case UVMappingK: printf("\t\t\tUV ( "); printTree(node->child[0]); printf(", "); printTree(node->child[1]); printf(")\n"); if (node->sibling != NULL) { printTree(node->sibling); } break; case FaceK: printf("\t\t\tFace( "); printTree(node->child[0]); printf(": "); printTree(node->child[1]); printf(", "); printTree(node->child[2]); printf(", "); printTree(node->child[3]); printf(")\n"); if (node->sibling != NULL) { printTree(node->sibling); } break; case MaterialK: printf("\t\t\tMaterial = \"%s\"\n",node->attr.name); printTree(node->sibling); break; case SmoothingK: printf("\t\t\tSmoothing = "); printTree(node->child[0]); printf("\n"); printTree(node->sibling); break; } }