Пример #1
0
 internal void AddChild(MeshGeometry meshGeometry)
 {
     if (_children == null)
     {
         _children = new List <MeshGeometry>();
     }
     _children.Add(meshGeometry);
 }
        private static BoundingBox WriteGeometry(MeshGeometry Mesh, XmlWriter Writer)
        {
            BoundingBox bb = new BoundingBox();

            foreach (var item in Mesh.Children)
            {
                MeshGeometry m = item as MeshGeometry;
                if (m != null)
                {
                    Writer.WriteStartElement("Mesh");
                    BoundingBox childBB = WriteGeometry(m, Writer);
                    bb.IncludeBoundingBox(childBB);
                    Writer.WriteEndElement();
                }
            }
            if (Mesh.Positions.Count == Mesh.Normals.Count && Mesh.Positions.Count > 0)
            {
                for (int i = 0; i < Mesh.Normals.Count; i++)
                {
                    bb.IncludePoint(Mesh.Positions[i]);

                    Writer.WriteStartElement("PN");
                    Writer.WriteAttributeString("PX", Mesh.Positions[i].X.ToString());
                    Writer.WriteAttributeString("PY", Mesh.Positions[i].Y.ToString());
                    Writer.WriteAttributeString("PZ", Mesh.Positions[i].Z.ToString());

                    Writer.WriteAttributeString("NX", Mesh.Normals[i].X.ToString());
                    Writer.WriteAttributeString("NY", Mesh.Normals[i].Y.ToString());
                    Writer.WriteAttributeString("NZ", Mesh.Normals[i].Z.ToString());
                    Writer.WriteEndElement();
                }
                for (int i = 0; i < Mesh.TriangleIndices.Count;)
                {
                    Writer.WriteStartElement("F");
                    Writer.WriteAttributeString("I1", Mesh.TriangleIndices[i++].ToString());
                    Writer.WriteAttributeString("I2", Mesh.TriangleIndices[i++].ToString());
                    Writer.WriteAttributeString("I3", Mesh.TriangleIndices[i++].ToString());
                    Writer.WriteEndElement();
                }
            }
            if (bb.IsValid)
            {
                Writer.WriteStartElement("BB");
                Writer.WriteAttributeString("MnX", bb.PointMin.X.ToString());
                Writer.WriteAttributeString("MnY", bb.PointMin.Y.ToString());
                Writer.WriteAttributeString("MnZ", bb.PointMin.Z.ToString());

                Writer.WriteAttributeString("MxX", bb.PointMax.X.ToString());
                Writer.WriteAttributeString("MxY", bb.PointMax.Y.ToString());
                Writer.WriteAttributeString("MxZ", bb.PointMax.Z.ToString());
                Writer.WriteEndElement();
            }

            return(bb);
        }
Пример #3
0
        private MeshGeometry ReadTriangulatedModelAtCurrentPosition(int indent)
        {
            MeshGeometry mesh = new MeshGeometry();

            int iPositionsCount = _geomReader.ReadInt32();

            for (int iPos = 0; iPos < iPositionsCount; iPos++)
            {
                mesh.Positions.Add(
                    new Point3D(
                        _geomReader.ReadSingle(),
                        _geomReader.ReadSingle(),
                        _geomReader.ReadSingle())
                    );
            }

            int iIndexCount = _geomReader.ReadInt32();

            for (int iIdx = 0; iIdx < iIndexCount; iIdx++)
            {
                mesh.TriangleIndices.Add(
                    _geomReader.ReadInt32()
                    );
            }

            int iNormalsCount = _geomReader.ReadInt32();

            for (int iNrm = 0; iNrm < iNormalsCount; iNrm++)
            {
                mesh.Normals.Add(
                    new Vector3D(
                        _geomReader.ReadSingle(),
                        _geomReader.ReadSingle(),
                        _geomReader.ReadSingle())
                    );
            }

            int iChildrenCount = _geomReader.ReadInt32();

            Debug.Write(new string(' ', indent * 2));
            Debug.WriteLine("Pos/Nrm: " + iPositionsCount + " Idx: " + iIndexCount + " Chld: " + iChildrenCount);

            for (int iChld = 0; iChld < iChildrenCount; iChld++)
            {
                mesh.AddChild(ReadTriangulatedModelAtCurrentPosition(indent + 1));
            }
            return(mesh);
        }
Пример #4
0
 internal void AddChild(MeshGeometry meshGeometry)
 {
     if (_children == null)
         _children = new List<MeshGeometry>();
     _children.Add(meshGeometry);
 }
Пример #5
0
        private MeshGeometry ReadTriangulatedModelAtCurrentPosition(int indent)
        {
            MeshGeometry mesh = new MeshGeometry();

            int iPositionsCount = _geomReader.ReadInt32();

            for (int iPos = 0; iPos < iPositionsCount; iPos++)
            {
                mesh.Positions.Add(
                    new Point3D(
                        _geomReader.ReadSingle(),
                        _geomReader.ReadSingle(),
                        _geomReader.ReadSingle())
                    );
            }

            int iIndexCount = _geomReader.ReadInt32();
            for (int iIdx = 0; iIdx < iIndexCount; iIdx++)
            {
                mesh.TriangleIndices.Add(
                    _geomReader.ReadInt32()
                    );
            }

            int iNormalsCount = _geomReader.ReadInt32();
            for (int iNrm = 0; iNrm < iNormalsCount; iNrm++)
            {
                mesh.Normals.Add(
                    new Vector3D(
                        _geomReader.ReadSingle(),
                        _geomReader.ReadSingle(),
                        _geomReader.ReadSingle())
                    );
            }

            int iChildrenCount = _geomReader.ReadInt32();

            Debug.Write(new string(' ', indent*2));
            Debug.WriteLine("Pos/Nrm: " + iPositionsCount + " Idx: " + iIndexCount + " Chld: " + iChildrenCount);

            for (int iChld = 0; iChld < iChildrenCount; iChld++)
            {
                mesh.AddChild(ReadTriangulatedModelAtCurrentPosition(indent + 1));
            }
            return mesh;
        }
        private static BoundingBox WriteGeometry(MeshGeometry Mesh, XmlWriter Writer)
        {
            BoundingBox bb = new BoundingBox();
            foreach (var item in Mesh.Children)
            {
                MeshGeometry m = item as MeshGeometry;
                if (m != null)
                {
                    Writer.WriteStartElement("Mesh");
                    BoundingBox childBB = WriteGeometry(m, Writer);
                    bb.IncludeBoundingBox(childBB);
                    Writer.WriteEndElement();
                }
            }
            if (Mesh.Positions.Count == Mesh.Normals.Count && Mesh.Positions.Count > 0)
            {
                for (int i = 0; i < Mesh.Normals.Count; i++)
                {
                    bb.IncludePoint(Mesh.Positions[i]);

                    Writer.WriteStartElement("PN");
                    Writer.WriteAttributeString("PX", Mesh.Positions[i].X.ToString());
                    Writer.WriteAttributeString("PY", Mesh.Positions[i].Y.ToString());
                    Writer.WriteAttributeString("PZ", Mesh.Positions[i].Z.ToString());

                    Writer.WriteAttributeString("NX", Mesh.Normals[i].X.ToString());
                    Writer.WriteAttributeString("NY", Mesh.Normals[i].Y.ToString());
                    Writer.WriteAttributeString("NZ", Mesh.Normals[i].Z.ToString());
                    Writer.WriteEndElement();
                }
                for (int i = 0; i < Mesh.TriangleIndices.Count;)
                {
                    Writer.WriteStartElement("F");
                    Writer.WriteAttributeString("I1", Mesh.TriangleIndices[i++].ToString());
                    Writer.WriteAttributeString("I2", Mesh.TriangleIndices[i++].ToString());
                    Writer.WriteAttributeString("I3", Mesh.TriangleIndices[i++].ToString());
                    Writer.WriteEndElement();
                }
            }
            if (bb.IsValid)
            {
                Writer.WriteStartElement("BB");
                Writer.WriteAttributeString("MnX", bb.PointMin.X.ToString());
                Writer.WriteAttributeString("MnY", bb.PointMin.Y.ToString());
                Writer.WriteAttributeString("MnZ", bb.PointMin.Z.ToString());

                Writer.WriteAttributeString("MxX", bb.PointMax.X.ToString());
                Writer.WriteAttributeString("MxY", bb.PointMax.Y.ToString());
                Writer.WriteAttributeString("MxZ", bb.PointMax.Z.ToString());
                Writer.WriteEndElement();
            }

            return bb;
        }