/// <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))); } }
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); }
/// <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); }