예제 #1
0
        // OnPolymesh is called when a tessellated polymesh of a 3D face is being output.
        // The current material is applied to the polymesh.
        public void OnPolymesh(
            PolymeshTopology InPolymeshNode             // tessellated polymesh output node
            )
        {
            if (IgnoreElementGeometry())
            {
                return;
            }

            // Retrieve the Datasmith mesh being processed.
            FDatasmithFacadeMesh CurrentMesh         = GetCurrentMesh();
            Transform            MeshPointsTransform = GetCurrentMeshPointsTransform();

            // Retrieve the index of the current material and make the Datasmith mesh keep track of it.
            int CurrentMaterialIndex = GetCurrentMaterialIndex();

            int initialVertexCount = CurrentMesh.GetVertexCount();

            // Add the vertex points (in right-handed Z-up coordinates) to the Datasmith mesh.
            foreach (XYZ Point in InPolymeshNode.GetPoints())
            {
                XYZ FinalPoint = MeshPointsTransform != null?MeshPointsTransform.OfPoint(Point) : Point;

                CurrentMesh.AddVertex((float)FinalPoint.X, (float)FinalPoint.Y, (float)FinalPoint.Z);
            }

            // Add the vertex UV texture coordinates to the Datasmith mesh.
            foreach (UV uv in InPolymeshNode.GetUVs())
            {
                CurrentMesh.AddUV(0, (float)uv.U, (float)-uv.V);
            }

            IList <PolymeshFacet> Facets = InPolymeshNode.GetFacets();

            // Add the triangle vertex indexes to the Datasmith mesh.
            foreach (PolymeshFacet facet in Facets)
            {
                CurrentMesh.AddTriangle(initialVertexCount + facet.V1, initialVertexCount + facet.V2, initialVertexCount + facet.V3, CurrentMaterialIndex);
            }

            // Add the triangle vertex normals (in right-handed Z-up coordinates) to the Datasmith mesh.
            // Normals can be associated with either points or facets of the polymesh.
            switch (InPolymeshNode.DistributionOfNormals)
            {
            case DistributionOfNormals.AtEachPoint:
            {
                IList <XYZ> normals = InPolymeshNode.GetNormals();
                if (MeshPointsTransform != null)
                {
                    foreach (PolymeshFacet facet in Facets)
                    {
                        XYZ normal1 = MeshPointsTransform.OfVector(normals[facet.V1]);
                        XYZ normal2 = MeshPointsTransform.OfVector(normals[facet.V2]);
                        XYZ normal3 = MeshPointsTransform.OfVector(normals[facet.V3]);

                        CurrentMesh.AddNormal((float)normal1.X, (float)normal1.Y, (float)normal1.Z);
                        CurrentMesh.AddNormal((float)normal2.X, (float)normal2.Y, (float)normal2.Z);
                        CurrentMesh.AddNormal((float)normal3.X, (float)normal3.Y, (float)normal3.Z);
                    }
                }
                else
                {
                    foreach (PolymeshFacet facet in Facets)
                    {
                        XYZ normal1 = normals[facet.V1];
                        XYZ normal2 = normals[facet.V2];
                        XYZ normal3 = normals[facet.V3];

                        CurrentMesh.AddNormal((float)normal1.X, (float)normal1.Y, (float)normal1.Z);
                        CurrentMesh.AddNormal((float)normal2.X, (float)normal2.Y, (float)normal2.Z);
                        CurrentMesh.AddNormal((float)normal3.X, (float)normal3.Y, (float)normal3.Z);
                    }
                }

                break;
            }

            case DistributionOfNormals.OnePerFace:
            {
                XYZ normal = InPolymeshNode.GetNormals()[0];

                if (MeshPointsTransform != null)
                {
                    normal = MeshPointsTransform.OfVector(normal);
                }

                for (int i = 0; i < 3 * InPolymeshNode.NumberOfFacets; i++)
                {
                    CurrentMesh.AddNormal((float)normal.X, (float)normal.Y, (float)normal.Z);
                }
                break;
            }

            case DistributionOfNormals.OnEachFacet:
            {
                if (MeshPointsTransform != null)
                {
                    foreach (XYZ normal in InPolymeshNode.GetNormals())
                    {
                        XYZ FinalNormal = MeshPointsTransform.OfVector(normal);
                        CurrentMesh.AddNormal((float)FinalNormal.X, (float)FinalNormal.Y, (float)FinalNormal.Z);
                        CurrentMesh.AddNormal((float)FinalNormal.X, (float)FinalNormal.Y, (float)FinalNormal.Z);
                        CurrentMesh.AddNormal((float)FinalNormal.X, (float)FinalNormal.Y, (float)FinalNormal.Z);
                    }
                }
                else
                {
                    foreach (XYZ normal in InPolymeshNode.GetNormals())
                    {
                        CurrentMesh.AddNormal((float)normal.X, (float)normal.Y, (float)normal.Z);
                        CurrentMesh.AddNormal((float)normal.X, (float)normal.Y, (float)normal.Z);
                        CurrentMesh.AddNormal((float)normal.X, (float)normal.Y, (float)normal.Z);
                    }
                }
                break;
            }
            }
        }
예제 #2
0
 private static void AddNormalsToMesh(FDatasmithFacadeMesh Mesh, Vector3f NormalA, Vector3f NormalB, Vector3f NormalC)
 {
     Mesh.AddNormal(NormalA.X, NormalA.Y, NormalA.Z);
     Mesh.AddNormal(NormalB.X, NormalB.Y, NormalB.Z);
     Mesh.AddNormal(NormalC.X, NormalC.Y, NormalC.Z);
 }