示例#1
0
 public override void ProcessNode(AseReader reader, AseNode parentNode)
 {
     ProcessNodePre(reader, parentNode);
     reader.ReadNextLine();
     while (!(reader.EndOfFile || reader.NodeParentEnd))
     {
         AseNode node = GetParser(reader.NodeName);
         if (node == null)
         {
             if (reader.NodeParentStart)
             {
                 TraverseUnhandledNodes(reader);
             }
             else
             {
                 ProcessInnerNode(reader, parentNode);
             }
         }
         else
         {
             node.ProcessNode(reader, this);
         }
         reader.ReadNextLine();
     }
     ProcessNodePost(reader, parentNode);
 }
示例#2
0
 protected void TraverseUnhandledNodes(AseReader reader)
 {
     reader.ReadNextLine();
     while (!reader.NodeParentEnd)
     {
         if (reader.NodeParentStart)
         {
             TraverseUnhandledNodes(reader);
         }
         reader.ReadNextLine();
     }
 }
示例#3
0
 public virtual void ProcessNode(AseReader reader, AseNode parentNode)
 {
     ProcessNodePre(reader, parentNode);
     reader.ReadNextLine();
     while (!(reader.EndOfFile || reader.NodeParentEnd))
     {
         if (reader.NodeParentStart)
         {
             TraverseUnhandledNodes(reader);
         }
         else
         {
             ProcessInnerNode(reader, parentNode);
         }
         reader.ReadNextLine();
     }
     ProcessNodePost(reader, parentNode);
 }
示例#4
0
        protected override void ProcessInnerNode(AseReader reader, AseNode parentNode)
        {
            AseMesh mesh = parentNode as AseMesh;

            if (reader.NodeName == "MESH_FACENORMAL")
            {
                AseStringTokenizer tokens = new AseStringTokenizer(reader.NodeData);
                int     index             = int.Parse(tokens.GetNext());
                AseFace face = mesh.FaceList[index];
                face.NormalFace = new AseVertex(
                    float.Parse(tokens.GetNext()),
                    float.Parse(tokens.GetNext()),
                    float.Parse(tokens.GetNext()));
                for (int i = 0; i < 3; i++)
                {
                    reader.ReadNextLine();
                    tokens = new AseStringTokenizer(reader.NodeData);
                    if (reader.NodeName == "MESH_VERTEXNORMAL")
                    {
                        int vIndex = int.Parse(tokens.GetNext());
                        if (vIndex == mesh.FaceList[index].A)
                        {
                            face.NormalA = new AseVertex(
                                float.Parse(tokens.GetNext()),
                                float.Parse(tokens.GetNext()),
                                float.Parse(tokens.GetNext()));
                        }
                        else if (vIndex == mesh.FaceList[index].B)
                        {
                            face.NormalB = new AseVertex(
                                float.Parse(tokens.GetNext()),
                                float.Parse(tokens.GetNext()),
                                float.Parse(tokens.GetNext()));
                        }
                        else if (vIndex == mesh.FaceList[index].C)
                        {
                            face.NormalC = new AseVertex(
                                float.Parse(tokens.GetNext()),
                                float.Parse(tokens.GetNext()),
                                float.Parse(tokens.GetNext()));
                        }
                    }
                    else
                    {
                        // we must have atleast 3 MESH_VERTEXNORMAL nodes
                        i--;
                    }
                }
                mesh.FaceList[index] = face;
            }
        }
示例#5
0
        public void Open(string filename)
        {
            StreamReader reader    = new StreamReader(filename);
            AseReader    aseReader = new AseReader(reader);

            aseReader.ReadNextLine();

            if (aseReader.NodeName != "3DSMAX_ASCIIEXPORT")
            {
                throw new AseException("Not a valid ASE file.");
            }

            int version = int.Parse(aseReader.NodeData);

            if (version != 200)
            {
                throw new AseException("The version of the ASE file is not supported.");
            }

            base.ProcessNode(aseReader, null);
            reader.Close();
        }