Esempio n. 1
0
        /// <summary>
        /// Store a triangle, adding new vertices for it
        /// to our vertex lookup dictionary if needed and
        /// accumulating its volume and centroid contribution.
        /// </summary>
        void StoreTriangle(
            IList <XYZ> vertices,
            PolymeshFacet triangle,
            XYZ normal)
        {
            // Retrieve the three triangle vertices

            Transform currentTransform = CurrentTransform;

            XYZ[] p = new XYZ[] {
                currentTransform.OfPoint(vertices[triangle.V1]),
                currentTransform.OfPoint(vertices[triangle.V2]),
                currentTransform.OfPoint(vertices[triangle.V3])
            };

            // Ensure the three are ordered counter-clockwise

            //XYZ v = p[1] - p[0];
            //XYZ w = p[2] - p[0];

            //Debug.Assert( Util.IsRightHanded( v, w, normal ),
            //  "expected counter-clockwise vertex order" );

            // Centroid and volume calculation

            _centroid_volume.AddTriangle(p);

            // Store vertex, facet and normals

            for (int i = 0; i < 3; ++i)
            {
                PointInt q = new PointInt(p[i]);

                _triangles.Add(_vertices.AddVertex(q));

                _normalIndices.Add(_normals.AddNormal(
                                       currentTransform.OfVector(normal)));
            }
        }
Esempio n. 2
0
        public void OnPolymesh(PolymeshTopology node)
        {
            XMesh m = new XMesh();

            m.Name = "Mesh" + XData.Objects.Last().Meshs.Count;
            Transform t = Transforms.Peek();

            for (int i = 0; i < node.NumberOfFacets; i++)
            {
                PolymeshFacet f = node.GetFacet(i);
                m.Triangles.Add(f.V1);
                m.Triangles.Add(f.V2);
                m.Triangles.Add(f.V3);
            }
            for (int i = 0; i < node.NumberOfPoints; i++)
            {
                XYZ p = t.OfPoint(node.GetPoint(i));
                m.Vertexs.Add(new XVec3(p.X, p.Y, p.Z));
            }
            for (int i = 0; i < node.NumberOfNormals; i++)
            {
                XYZ n = t.OfVector(node.GetNormal(i));
                m.Normals.Add(new XVec3(n.X, n.Y, n.Z));
            }
            for (int i = 0; i < node.NumberOfUVs; i++)
            {
                UV u = node.GetUV(i);
                m.UVs.Add(new XVec2(u.U, u.V));
            }
            m.MaterialID = matLink[matid];
            XData.Objects.Last().Meshs.Add(m);
            string log = null;

            if (EnableLog)
            {
                log = "Mesh\n,Name:" + m.Name + "\nVertex:" + m.Vertexs.Count;
            }
            meshLog.Add(log);
        }
Esempio n. 3
0
        /// <summary>
        /// 当输出3d面的镶嵌多边形时,将调用此方法。
        /// </summary>
        /// <param name="polymesh">表示多边形网格拓扑的节点</param>
        void IExportContext.OnPolymesh(PolymeshTopology polymesh)
        {
            ModelGeometry exportedGeometry = new ModelGeometry
            {
                Points                = polymesh.GetPoints(),
                Normals               = polymesh.GetNormals(),
                Uvs                   = polymesh.GetUVs(),
                Transform             = transformationStack.Peek(),
                DistributionOfNormals = polymesh.DistributionOfNormals,
                Indices               = new List <int>(polymesh.GetFacets().Count * 3)
            };

            if (exportedGeometry.Transform.IsConformal && exportedGeometry.Transform.HasReflection)
            {
                using (IEnumerator <PolymeshFacet> enumerator = polymesh.GetFacets().GetEnumerator())
                {
                    while (enumerator.MoveNext())
                    {
                        PolymeshFacet current = enumerator.Current;
                        exportedGeometry.Indices.Add(current.V1);
                        exportedGeometry.Indices.Add(current.V3);
                        exportedGeometry.Indices.Add(current.V2);
                    }
                    goto Fine;
                }
            }
            foreach (PolymeshFacet current2 in polymesh.GetFacets())
            {
                exportedGeometry.Indices.Add(current2.V1);
                exportedGeometry.Indices.Add(current2.V2);
                exportedGeometry.Indices.Add(current2.V3);
            }
Fine:
            if (isElementDoubleSided)
            {
                exportedGeometry.MakeDoubleSided();
            }
            documentAndMaterialIdToGeometries[currentDocumentAndMaterialId].Add(exportedGeometry);
        }