protected override void CheckScene(FbxScene scene)
        {
            base.CheckScene(scene);

            FbxScene origScene = CreateScene(FbxManager);

            Assert.IsNotNull(origScene);

            // Retrieve the mesh from each scene
            FbxMesh origMesh   = origScene.GetRootNode().GetChild(0).GetMesh();
            FbxMesh importMesh = scene.GetRootNode().GetChild(0).GetMesh();

            // get the layers
            FbxLayer origLayer   = origMesh.GetLayer(0 /* default layer */);
            FbxLayer importLayer = importMesh.GetLayer(0 /* default layer */);

            // Check normals
            CheckFbxElementVector4(origLayer.GetNormals(), importLayer.GetNormals());

            // Check binormals
            CheckFbxElementVector4(origLayer.GetBinormals(), importLayer.GetBinormals());

            // Check tangents
            CheckFbxElementVector4(origLayer.GetTangents(), importLayer.GetTangents());

            // Check vertex colors
            var origVertexColorElement   = origLayer.GetVertexColors();
            var importVertexColorElement = importLayer.GetVertexColors();

            Assert.AreEqual(origVertexColorElement.GetMappingMode(), importVertexColorElement.GetMappingMode());
            Assert.AreEqual(origVertexColorElement.GetReferenceMode(), importVertexColorElement.GetReferenceMode());

            var origVertexColorElementArray   = origVertexColorElement.GetDirectArray();
            var importVertexColorElementArray = importVertexColorElement.GetDirectArray();

            Assert.AreEqual(origVertexColorElementArray.GetCount(), importVertexColorElementArray.GetCount());

            for (int i = 0; i < origVertexColorElementArray.GetCount(); i++)
            {
                Assert.AreEqual(origVertexColorElementArray.GetAt(i), importVertexColorElementArray.GetAt(i));
            }

            // Check UVs
            var origUVElement   = origLayer.GetUVs();
            var importUVElement = importLayer.GetUVs();

            Assert.AreEqual(origUVElement.GetMappingMode(), importUVElement.GetMappingMode());
            Assert.AreEqual(origUVElement.GetReferenceMode(), importUVElement.GetReferenceMode());

            var origUVElementArray   = origUVElement.GetDirectArray();
            var importUVElementArray = importUVElement.GetDirectArray();

            Assert.AreEqual(origUVElementArray.GetCount(), importUVElementArray.GetCount());

            for (int i = 0; i < origUVElementArray.GetCount(); i++)
            {
                Assert.AreEqual(origUVElementArray.GetAt(i), importUVElementArray.GetAt(i));
            }

            var origUVElementIndex   = origUVElement.GetIndexArray();
            var importUVElementIndex = origUVElement.GetIndexArray();

            Assert.AreEqual(origUVElementIndex.GetCount(), importUVElementIndex.GetCount());

            for (int i = 0; i < origUVElementIndex.GetCount(); i++)
            {
                Assert.AreEqual(origUVElementIndex.GetAt(i), importUVElementIndex.GetAt(i));
            }
        }
        protected override void CheckScene(FbxScene scene)
        {
            base.CheckScene(scene);

            FbxScene origScene = CreateScene(FbxManager);

            Assert.IsNotNull(origScene);

            // Retrieve the mesh from each scene
            FbxMesh origMesh   = origScene.GetRootNode().GetChild(0).GetMesh();
            FbxMesh importMesh = scene.GetRootNode().GetChild(0).GetMesh();

            // get the layers
            FbxLayer origLayer   = origMesh.GetLayer(0 /* default layer */);
            FbxLayer importLayer = importMesh.GetLayer(0 /* default layer */);

            // Check UVs
            var origUVElement   = origLayer.GetUVs();
            var importUVElement = importLayer.GetUVs();

            Assert.AreEqual(origUVElement.GetMappingMode(), importUVElement.GetMappingMode());
            Assert.AreEqual(origUVElement.GetReferenceMode(), importUVElement.GetReferenceMode());

            var origUVElementArray   = origUVElement.GetDirectArray();
            var importUVElementArray = importUVElement.GetDirectArray();

            Assert.AreEqual(origUVElementArray.GetCount(), importUVElementArray.GetCount());

            for (int i = 0; i < origUVElementArray.GetCount(); i++)
            {
                Assert.AreEqual(origUVElementArray.GetAt(i), importUVElementArray.GetAt(i));
            }

            var origUVElementIndex   = origUVElement.GetIndexArray();
            var importUVElementIndex = origUVElement.GetIndexArray();

            Assert.AreEqual(origUVElementIndex.GetCount(), importUVElementIndex.GetCount());

            for (int i = 0; i < origUVElementIndex.GetCount(); i++)
            {
                Assert.AreEqual(origUVElementIndex.GetAt(i), importUVElementIndex.GetAt(i));
            }

            // Check material and texture
            var origNode     = origScene.GetRootNode().GetChild(0);
            int origMatIndex = origNode.GetMaterialIndex(m_materialName);

            Assert.GreaterOrEqual(origMatIndex, 0);
            var origMaterial = origNode.GetMaterial(origMatIndex);

            Assert.IsNotNull(origMaterial);

            var importNode     = scene.GetRootNode().GetChild(0);
            int importMatIndex = importNode.GetMaterialIndex(m_materialName);

            Assert.GreaterOrEqual(importMatIndex, 0);
            var importMaterial = importNode.GetMaterial(importMatIndex);

            Assert.IsNotNull(importMaterial);

            // TODO: Add ability to Downcast the material to an FbxSurfacePhong.
            Property[] materialProperties =
            {
                new Property(FbxSurfaceMaterial.sDiffuse,    PropertyType.Color),
                new Property(FbxSurfaceMaterial.sEmissive,   PropertyType.Color),
                new Property(FbxSurfaceMaterial.sAmbient,    PropertyType.Double3),
                new Property(FbxSurfaceMaterial.sSpecular,   PropertyType.Double3),
                new Property(FbxSurfaceMaterial.sBumpFactor, PropertyType.Double)
            };

            FbxProperty origMaterialDiffuseProperty   = null;
            FbxProperty importMaterialDiffuseProperty = null;

            foreach (var prop in materialProperties)
            {
                FbxProperty origProp = origMaterial.FindProperty(prop.name);
                Assert.IsNotNull(origProp);
                Assert.IsTrue(origProp.IsValid());

                FbxProperty importProp = importMaterial.FindProperty(prop.name);
                Assert.IsNotNull(importProp);
                Assert.IsTrue(importProp.IsValid());

                switch (prop.type)
                {
                case PropertyType.Color:
                    Assert.AreEqual(origProp.GetFbxColor(), importProp.GetFbxColor());
                    break;

                case PropertyType.Double3:
                    Assert.AreEqual(origProp.GetFbxDouble3(), importProp.GetFbxDouble3());
                    break;

                case PropertyType.Double:
                    Assert.AreEqual(origProp.GetDouble(), importProp.GetDouble());
                    break;

                default:
                    break;
                }

                if (prop.name.Equals(FbxSurfaceMaterial.sDiffuse))
                {
                    origMaterialDiffuseProperty   = origProp;
                    importMaterialDiffuseProperty = importProp;
                }
            }

            Assert.IsNotNull(origMaterialDiffuseProperty);
            Assert.IsNotNull(importMaterialDiffuseProperty);

            var origTexture = origMaterialDiffuseProperty.FindSrcObject(FbxSurfaceMaterial.sDiffuse + "_Texture");

            Assert.IsNotNull(origTexture);
            var importTexture = importMaterialDiffuseProperty.FindSrcObject(FbxSurfaceMaterial.sDiffuse + "_Texture");

            Assert.IsNotNull(importTexture);

            // TODO: Trying to Downcast the texture to an FbxFileTexture returns a null value,
            //       need to figure out how to fix this so we can access the texture properties.

            /*Assert.AreEqual (origTexture.GetFileName (), importTexture.GetFileName ());
             * Assert.AreEqual (origTexture.GetTextureUse (), importTexture.GetTextureUse ());
             * Assert.AreEqual (origTexture.GetMappingType (), importTexture.GetMappingType ());*/
        }
        protected override FbxScene CreateScene(FbxManager manager)
        {
            FbxScene scene = base.CreateScene(manager);

            // Add normals, binormals, UVs, tangents and vertex colors to the cube
            FbxMesh cubeMesh = scene.GetRootNode().GetChild(0).GetMesh();

            // Add normals
            /// Set the Normals on Layer 0.
            FbxLayer fbxLayer = cubeMesh.GetLayer(0 /* default layer */);

            if (fbxLayer == null)
            {
                cubeMesh.CreateLayer();
                fbxLayer = cubeMesh.GetLayer(0 /* default layer */);
            }

            using (var fbxLayerElement = FbxLayerElementNormal.Create(cubeMesh, "Normals"))
            {
                fbxLayerElement.SetMappingMode(FbxLayerElement.EMappingMode.eByControlPoint);
                fbxLayerElement.SetReferenceMode(FbxLayerElement.EReferenceMode.eDirect);

                // Add one normal per each vertex face index (3 per triangle)
                FbxLayerElementArray fbxElementArray = fbxLayerElement.GetDirectArray();

                // Assign the normal vectors in the same order the control points were defined
                FbxVector4[] normals = { normalZPos, normalXPos, normalZNeg, normalXNeg, normalYPos, normalYNeg };
                for (int n = 0; n < normals.Length; n++)
                {
                    for (int i = 0; i < 4; i++)
                    {
                        fbxElementArray.Add(normals [n]);
                    }
                }
                fbxLayer.SetNormals(fbxLayerElement);
            }

            /// Set the binormals on Layer 0.
            using (var fbxLayerElement = FbxLayerElementBinormal.Create(cubeMesh, "Binormals"))
            {
                fbxLayerElement.SetMappingMode(FbxLayerElement.EMappingMode.eByControlPoint);
                fbxLayerElement.SetReferenceMode(FbxLayerElement.EReferenceMode.eDirect);

                // Add one normal per each vertex face index (3 per triangle)
                FbxLayerElementArray fbxElementArray = fbxLayerElement.GetDirectArray();

                for (int n = 0; n < cubeMesh.GetControlPointsCount(); n++)
                {
                    fbxElementArray.Add(new FbxVector4(-1, 0, 1)); // TODO: set to correct values
                }
                fbxLayer.SetBinormals(fbxLayerElement);
            }

            /// Set the tangents on Layer 0.
            using (var fbxLayerElement = FbxLayerElementTangent.Create(cubeMesh, "Tangents"))
            {
                fbxLayerElement.SetMappingMode(FbxLayerElement.EMappingMode.eByControlPoint);
                fbxLayerElement.SetReferenceMode(FbxLayerElement.EReferenceMode.eDirect);

                // Add one normal per each vertex face index (3 per triangle)
                FbxLayerElementArray fbxElementArray = fbxLayerElement.GetDirectArray();

                for (int n = 0; n < cubeMesh.GetControlPointsCount(); n++)
                {
                    fbxElementArray.Add(new FbxVector4(0, -1, 1)); // TODO: set to correct values
                }
                fbxLayer.SetTangents(fbxLayerElement);
            }

            // set the vertex colors
            using (var fbxLayerElement = FbxLayerElementVertexColor.Create(cubeMesh, "VertexColors"))
            {
                fbxLayerElement.SetMappingMode(FbxLayerElement.EMappingMode.eByControlPoint);
                fbxLayerElement.SetReferenceMode(FbxLayerElement.EReferenceMode.eDirect);

                // Add one normal per each vertex face index (3 per triangle)
                FbxLayerElementArray fbxElementArray = fbxLayerElement.GetDirectArray();

                // make each vertex either black or white
                for (int n = 0; n < cubeMesh.GetControlPointsCount(); n++)
                {
                    fbxElementArray.Add(new FbxColor(n % 2, n % 2, n % 2));
                }

                fbxLayer.SetVertexColors(fbxLayerElement);
            }

            // set the UVs
            using (var fbxLayerElement = FbxLayerElementUV.Create(cubeMesh, "UVSet"))
            {
                fbxLayerElement.SetMappingMode(FbxLayerElement.EMappingMode.eByPolygonVertex);
                fbxLayerElement.SetReferenceMode(FbxLayerElement.EReferenceMode.eIndexToDirect);

                // set texture coordinates per vertex
                FbxLayerElementArray fbxElementArray = fbxLayerElement.GetDirectArray();

                for (int n = 0; n < 8; n++)
                {
                    fbxElementArray.Add(new FbxVector2(n % 2, 1));  // TODO: switch to correct values
                }

                // For each face index, point to a texture uv
                FbxLayerElementArray fbxIndexArray = fbxLayerElement.GetIndexArray();
                fbxIndexArray.SetCount(24);

                for (int vertIndex = 0; vertIndex < 24; vertIndex++)
                {
                    fbxIndexArray.SetAt(vertIndex, vertIndex % 8);  // TODO: switch to correct values
                }
                fbxLayer.SetUVs(fbxLayerElement, FbxLayerElement.EType.eTextureDiffuse);
            }

            return(scene);
        }
        protected override FbxScene CreateScene(FbxManager manager)
        {
            FbxScene scene = base.CreateScene(manager);

            // Set the UVs
            FbxMesh cubeMesh = scene.GetRootNode().GetChild(0).GetMesh();

            FbxLayer fbxLayer = cubeMesh.GetLayer(0 /* default layer */);

            if (fbxLayer == null)
            {
                cubeMesh.CreateLayer();
                fbxLayer = cubeMesh.GetLayer(0 /* default layer */);
            }

            using (var fbxLayerElement = FbxLayerElementUV.Create(cubeMesh, "UVSet"))
            {
                fbxLayerElement.SetMappingMode(FbxLayerElement.EMappingMode.eByPolygonVertex);
                fbxLayerElement.SetReferenceMode(FbxLayerElement.EReferenceMode.eIndexToDirect);

                // set texture coordinates per vertex
                FbxLayerElementArray fbxElementArray = fbxLayerElement.GetDirectArray();

                for (int n = 0; n < 8; n++)
                {
                    fbxElementArray.Add(new FbxVector2(n % 2, 1));  // TODO: switch to correct values
                }

                // For each face index, point to a texture uv
                FbxLayerElementArray fbxIndexArray = fbxLayerElement.GetIndexArray();
                fbxIndexArray.SetCount(24);

                for (int vertIndex = 0; vertIndex < 24; vertIndex++)
                {
                    fbxIndexArray.SetAt(vertIndex, vertIndex % 8);  // TODO: switch to correct values
                }
                fbxLayer.SetUVs(fbxLayerElement, FbxLayerElement.EType.eTextureDiffuse);
            }

            // Create the material
            var fbxMaterial = FbxSurfacePhong.Create(scene, m_materialName);

            fbxMaterial.Diffuse.Set(new FbxColor(1, 1, 1));
            fbxMaterial.Emissive.Set(new FbxColor(0.5, 0.1, 0.2));
            fbxMaterial.Ambient.Set(new FbxDouble3(0.3, 0.4, 0));
            fbxMaterial.BumpFactor.Set(0.6);
            fbxMaterial.Specular.Set(new FbxDouble3(0.8, 0.7, 0.9));

            // Create and add the texture
            var fbxMaterialProperty = fbxMaterial.FindProperty(FbxSurfaceMaterial.sDiffuse);

            Assert.IsNotNull(fbxMaterialProperty);
            Assert.IsTrue(fbxMaterialProperty.IsValid());

            var fbxTexture = FbxFileTexture.Create(fbxMaterial, FbxSurfaceMaterial.sDiffuse + "_Texture");

            fbxTexture.SetFileName("/path/to/some/texture.jpg");
            fbxTexture.SetTextureUse(FbxTexture.ETextureUse.eStandard);
            fbxTexture.SetMappingType(FbxTexture.EMappingType.eUV);

            fbxTexture.ConnectDstProperty(fbxMaterialProperty);

            scene.GetRootNode().GetChild(0).AddMaterial(fbxMaterial);
            return(scene);
        }
Пример #5
0
            /// <summary>
            /// Process UV data and configure the Mesh's UV attributes
            /// </summary>
            private void ProcessUVs(FbxMesh fbxMesh, Mesh unityMesh, int maxUVs = 4)
            {
                // Import UV sets (maximum defined by maxUVs)
                int uvsetIndex = 0;

                // First just try importing diffuse UVs from separate layers
                // (Maya exports that way)
                FbxLayerElementUV fbxFirstUVSet   = null;
                FbxLayer          fbxFirstUVLayer = null;

                // NOTE: assuming triangles
                int polygonIndexCount = fbxMesh.GetPolygonVertexCount();
                int vertexCount       = fbxMesh.GetControlPointsCount();

                int [] polygonVertexIndices = new int [polygonIndexCount];

                int j = 0;

                for (int polyIndex = 0; polyIndex < fbxMesh.GetPolygonCount(); ++polyIndex)
                {
                    for (int positionInPolygon = 0; positionInPolygon < fbxMesh.GetPolygonSize(polyIndex); ++positionInPolygon)
                    {
                        polygonVertexIndices [j++] = fbxMesh.GetPolygonVertex(polyIndex, positionInPolygon);
                    }
                }

                for (int i = 0; i < fbxMesh.GetLayerCount(); i++)
                {
                    FbxLayer fbxLayer = fbxMesh.GetLayer(i);
                    if (fbxLayer == null)
                    {
                        continue;
                    }

                    FbxLayerElementUV fbxUVSet = fbxLayer.GetUVs();

                    if (fbxUVSet == null)
                    {
                        continue;
                    }

                    if (fbxFirstUVSet != null)
                    {
                        fbxFirstUVSet   = fbxUVSet;
                        fbxFirstUVLayer = fbxLayer;
                    }

                    switch (uvsetIndex)
                    {
                    case 0:
                        unityMesh.uv = ProcessUVSet(fbxUVSet, polygonVertexIndices, vertexCount);
                        break;

                    case 1:
                        unityMesh.uv2 = ProcessUVSet(fbxUVSet, polygonVertexIndices, vertexCount);
                        break;

                    case 2:
                        unityMesh.uv3 = ProcessUVSet(fbxUVSet, polygonVertexIndices, vertexCount);
                        break;

                    case 3:
                        unityMesh.uv4 = ProcessUVSet(fbxUVSet, polygonVertexIndices, vertexCount);
                        break;
                    }
                    uvsetIndex++;

                    if (uvsetIndex == maxUVs)
                    {
                        break;
                    }
                }
                // If we have received one UV set, check whether the same layer contains an emissive UV set
                // that is different from diffuse UV set.
                // 3dsmax FBX exporters doesn't export UV sets as different layers, instead for lightmapping usually
                // a material is set up to have lightmap (2nd UV set) as self-illumination slot, and main texture
                // (1st UV set) as diffuse slot.
                if (uvsetIndex == 1 && fbxFirstUVSet != null)
                {
                    FbxLayerElementUV fbxSecondaryUVSet = null;

                    // TODO: check if we've already passed eTextureEmissive layer
                    for (int i = (int)FbxLayerElement.EType.eTextureEmissive; i < (int)FbxLayerElement.EType.eTypeCount; i++)
                    {
                        fbxSecondaryUVSet = fbxFirstUVLayer.GetUVs((FbxLayerElement.EType)i);

                        if (fbxSecondaryUVSet != null)
                        {
                            break;
                        }

                        if (fbxSecondaryUVSet != null)
                        {
                            unityMesh.uv2 = ProcessUVSet(fbxSecondaryUVSet,
                                                         polygonVertexIndices,
                                                         vertexCount);
                            uvsetIndex++;
                        }
                    }
                }
            }
Пример #6
0
        // For use only by FbxExportGlobals.
        internal static FbxMesh CreateFbxMesh(FbxExportGlobals G, GeometryPool pool, string poolName)
        {
            FbxMesh fbxMesh = FbxMesh.Create(G.m_manager, poolName);

            ExportMesh mesh   = new ExportMesh(pool);
            int        nVerts = mesh.m_pool.m_Vertices.Count;

            fbxMesh.InitControlPoints(nVerts);

            unsafe
            {
                fixed(Vector3 *f = mesh.m_pool.m_Vertices.GetBackingArray())
                {
                    Globals.SetControlPoints(fbxMesh, (IntPtr)f);
                }
            }

            List <int> triangles = mesh.m_pool.m_Tris;

            // Not available in Unity's wrappers
            // fbxMesh.ReservePolygonCount(triangles.Count / 3);
            // fbxMesh.ReservePolygonVertexCount(triangles.Count);
            for (int i = 0; i < triangles.Count; i += 3)
            {
                fbxMesh.BeginPolygon(-1 /* Material */, -1 /* Texture */, -1 /* Group */, false /* Legacy */);
                fbxMesh.AddPolygon(triangles[i]);
                fbxMesh.AddPolygon(triangles[i + 1]);
                fbxMesh.AddPolygon(triangles[i + 2]);
                fbxMesh.EndPolygon();
            }

            FbxLayer layer0 = fbxMesh.GetLayer(0);

            if (layer0 == null)
            {
                fbxMesh.CreateLayer();
                layer0 = fbxMesh.GetLayer(0);
            }

            var layerElementNormal = FbxLayerElementNormal.Create(fbxMesh, "normals");

            layerElementNormal.SetMappingMode(FbxLayerElement.EMappingMode.eByControlPoint);
            layerElementNormal.SetReferenceMode(FbxLayerElement.EReferenceMode.eDirect);
            CopyToFbx(layerElementNormal.GetDirectArray(), mesh.m_pool.m_Normals);
            layer0.SetNormals(layerElementNormal);

            var layerElementColor = FbxLayerElementVertexColor.Create(fbxMesh, "color");

            layerElementColor.SetMappingMode(FbxLayerElement.EMappingMode.eByControlPoint);
            layerElementColor.SetReferenceMode(FbxLayerElement.EReferenceMode.eDirect);
            CopyToFbx(layerElementColor.GetDirectArray(), mesh.m_linearColor);
            layer0.SetVertexColors(layerElementColor);

            var layerElementTangent = FbxLayerElementTangent.Create(fbxMesh, "tangents");

            layerElementTangent.SetMappingMode(FbxLayerElement.EMappingMode.eByControlPoint);
            layerElementTangent.SetReferenceMode(FbxLayerElement.EReferenceMode.eDirect);
            CopyToFbx(layerElementTangent.GetDirectArray(), mesh.m_pool.m_Tangents);
            layer0.SetTangents(layerElementTangent);

            // Compute and export binormals since Unity's FBX importer won't import the tangents without
            // them, even though they're not used.
            var layerElementBinormal = FbxLayerElementBinormal.Create(fbxMesh, "binormals");

            layerElementBinormal.SetMappingMode(FbxLayerElement.EMappingMode.eByControlPoint);
            layerElementBinormal.SetReferenceMode(FbxLayerElement.EReferenceMode.eDirect);
            var binormals = mesh.m_pool.m_Tangents
                            .Select((tan, idx) => {
                var b3 = Vector3.Cross(tan, mesh.m_pool.m_Normals[idx]) * tan.w;
                return(new Vector4(b3.x, b3.y, b3.z, 1));
            })
                            .ToList();

            CopyToFbx(layerElementBinormal.GetDirectArray(), binormals);
            layer0.SetBinormals(layerElementBinormal);

            var layerElementMaterial = FbxLayerElementMaterial.Create(fbxMesh, "materials");

            layerElementMaterial.SetMappingMode(FbxLayerElement.EMappingMode.eAllSame);
            layer0.SetMaterials(layerElementMaterial);

            // Export everything up to the last uvset containing data
            // even if some intermediate uvsets have no data.
            // Otherwise Unity will get the uvset numbering wrong on import

            List <List <Vector2> > uvSets = DemuxTexcoords(mesh.m_pool);

            for (int i = 0; i < uvSets.Count; i++)
            {
                FbxLayer layerN = fbxMesh.GetLayer(i);
                while (layerN == null)
                {
                    fbxMesh.CreateLayer();
                    layerN = fbxMesh.GetLayer(i);
                }
                var layerElementUV = FbxLayerElementUV.Create(fbxMesh, String.Format("uv{0}", i));
                layerElementUV.SetMappingMode(FbxLayerElement.EMappingMode.eByControlPoint);
                layerElementUV.SetReferenceMode(FbxLayerElement.EReferenceMode.eDirect);

                List <Vector2> uvSet = uvSets[i];
                if (uvSet == null)
                {
                    // Do nothing
                    // Replicates what the old fbx export code did; seems to work fine
                }
                else
                {
                    Debug.Assert(uvSet.Count == nVerts);
                    CopyToFbx(layerElementUV.GetDirectArray(), uvSet);
                }

                layerN.SetUVs(layerElementUV, FbxLayerElement.EType.eTextureDiffuse);
            }
            return(fbxMesh);
        }
Пример #7
0
        void PrintAttribute(FbxManager manager, FbxNodeAttribute attri)
        {
            FbxLayerElementVertexColor pp;


            Log.Info("attri " + attri.GetName());
            Log.Info("attri type " + Enum.GetName(typeof(FbxNodeAttribute.EType), attri.GetAttributeType()));
            //attri.is

            if (attri.GetAttributeType() == FbxNodeAttribute.EType.eMesh)
            {
                Type t = attri.GetType();
                Log.Info("type name " + t.Name);

                FbxMesh mesh = attri.GetNode().GetMesh();


                //FbxMesh mesh = attri as FbxMesh;
                if (mesh == null)
                {
                    Log.Error("convert mesh failed!");
                    return;
                }


                Console.WriteLine($"mesh.GetMeshEdgeCount() = {mesh.GetMeshEdgeCount()}; mesh.GetPolygonCount() = {mesh.GetPolygonCount()}; mesh.GetPolygonVertexCount()={mesh.GetPolygonVertexCount()}; " +
                                  $"mesh.GetTextureUVCount() {mesh.GetTextureUVCount()}; mesh.GetControlPointsCount()={mesh.GetControlPointsCount()}; mesh.GetElementTangentCount()={mesh.GetElementTangentCount()};" +
                                  $" mesh.GetElementNormalCount()={mesh.GetElementNormalCount()}; mesh.GetElementVertexColorCount()={mesh.GetElementVertexColorCount()};" +
                                  $"mesh.GetUVLayerCount() = {mesh.GetUVLayerCount()}; mesh.GetLayerCount() = {mesh.GetLayerCount()}");
                var pts = mesh.GetControlPoints();
                var ar  = FbxVector4Array.frompointer(pts);

                for (int i = 0; i < mesh.GetLayerCount(); i++)
                {
                    var layer = mesh.GetLayer(i);
                }

                try
                {
                    var v2 = new FbxVector2();

                    IntPtr mem = Marshal.AllocHGlobal(4);

                    FbxStringList lst = new FbxStringList();
                    //int nameCount = lst.GetCount();
                    mesh.GetUVSetNames(lst); //ToDo : что за List, расширяется ли он сам?
                    var name = lst.GetItemAt(0).mString.Buffer();

                    //var myBool = new _MyBool(mem);
                    //var res = mesh.GetPolygonVertexUV(0, 0, name, v2, myBool);
                    //            var c0 = v2.at(0);
                    //            var c2 = v2.at(1);

                    var    fbxArV2 = new FbxArrayFbxVector2();
                    var    fbxArI  = new FbxArrayInt();
                    var    res     = mesh.GetPolygonVertexUVs(name, fbxArV2, fbxArI);
                    var    ptr     = fbxArV2.GetAt(2).mData;
                    double coord1  = FbxWrapperNative.DoubleArrayFunc_getitem(ptr, 0);
                    double coord2  = FbxWrapperNative.DoubleArrayFunc_getitem(ptr, 1);
                    var    param   = FbxWrapperNative.new_FbxLayerElementArrayTemplateIntPtrFunc();
                    res = mesh.GetMaterialIndices(param);
                    var param2 = FbxWrapperNative.FbxLayerElementArrayTemplateIntPtrFunc_value(param);
                    int count  = param2.GetCount();

                    List <int> mind = new List <int>();
                    for (int i = 0; i < count; i++)
                    {
                        mind.Add(param2.GetAt(i));
                    }



                    //var vec = new FbxVector4Array(5);
                    //var res2 = mesh.GetPolygonVertexUVs("", , null);

                    bool res1 = mesh.GenerateTangentsData(0);
                    //bool res2 = mesh.GenerateTangentsDataForAllUVSets( );
                    var tCount = mesh.GetElementTangentCount();
                    var tang   = mesh.GetElementTangent(  );
                    var tangAr = tang.GetDirectArray();
                    int tC     = tangAr.GetCount();

                    //int binCount = mesh.GetElementBinormalCount();
                    //var bin = mesh.GetElementBinormal().GetDirectArray().GetCount();
                }
                catch (Exception ex)
                {
                }


                //var vertices =  mesh.GetPolygonVertices();

                //FbxMesh mesh;
                //FbxLayerElementUV uv = mesh.GetElementUV();

                //uv.GetDirectArray()


                FbxLayerElementNormal normal = mesh.GetElementNormal();

                //ToDo

                //DirectArrayFbxVector4 array = normal.GetDirectArray();
                var array = normal.GetDirectArray();

                Log.Info("normal count " + array.GetCount());
                //for (int i = 0; i < array.GetCount(); i++)
                //{
                //    FbxVector4 v = array.GetAt(i);
                //    SWIGTYPE_p_double data = v.mData;
                //    DoubleArray d = DoubleArray.frompointer(data);
                //    PrintDoubleArray(d, 4);
                //}
            }
        }
Пример #8
0
            /// <summary>
            /// Export the mesh's normals, binormals and tangents using
            /// layer 0.
            /// </summary>
            ///
            public void ExportNormalsEtc(MeshInfo mesh, FbxMesh fbxMesh)
            {
                /// Set the Normals on Layer 0.
                FbxLayer fbxLayer = fbxMesh.GetLayer(0 /* default layer */);

                if (fbxLayer == null)
                {
                    fbxMesh.CreateLayer();
                    fbxLayer = fbxMesh.GetLayer(0 /* default layer */);
                }

                using (var fbxLayerElement = FbxLayerElementNormal.Create(fbxMesh, "Normals"))
                {
                    fbxLayerElement.SetMappingMode(FbxLayerElement.EMappingMode.eByControlPoint);

                    // TODO: normals for each triangle vertex instead of averaged per control point
                    //fbxNormalLayer.SetMappingMode (FbxLayerElement.eByPolygonVertex);

                    fbxLayerElement.SetReferenceMode(FbxLayerElement.EReferenceMode.eDirect);

                    // Add one normal per each vertex face index (3 per triangle)
                    FbxLayerElementArray fbxElementArray = fbxLayerElement.GetDirectArray();

                    for (int n = 0; n < mesh.Normals.Length; n++)
                    {
                        fbxElementArray.Add(new FbxVector4(mesh.Normals [n] [0],
                                                           mesh.Normals [n] [1],
                                                           mesh.Normals [n] [2]));
                    }
                    fbxLayer.SetNormals(fbxLayerElement);
                }

                /// Set the binormals on Layer 0.
                using (var fbxLayerElement = FbxLayerElementBinormal.Create(fbxMesh, "Binormals"))
                {
                    fbxLayerElement.SetMappingMode(FbxLayerElement.EMappingMode.eByControlPoint);

                    // TODO: normals for each triangle vertex instead of averaged per control point
                    //fbxBinormalLayer.SetMappingMode (FbxLayerElement.eByPolygonVertex);

                    fbxLayerElement.SetReferenceMode(FbxLayerElement.EReferenceMode.eDirect);

                    // Add one normal per each vertex face index (3 per triangle)
                    FbxLayerElementArray fbxElementArray = fbxLayerElement.GetDirectArray();

                    for (int n = 0; n < mesh.Binormals.Length; n++)
                    {
                        fbxElementArray.Add(new FbxVector4(mesh.Binormals [n] [0],
                                                           mesh.Binormals [n] [1],
                                                           mesh.Binormals [n] [2]));
                    }
                    fbxLayer.SetBinormals(fbxLayerElement);
                }

                /// Set the tangents on Layer 0.
                using (var fbxLayerElement = FbxLayerElementTangent.Create(fbxMesh, "Tangents"))
                {
                    fbxLayerElement.SetMappingMode(FbxLayerElement.EMappingMode.eByControlPoint);

                    // TODO: normals for each triangle vertex instead of averaged per control point
                    //fbxBinormalLayer.SetMappingMode (FbxLayerElement.eByPolygonVertex);

                    fbxLayerElement.SetReferenceMode(FbxLayerElement.EReferenceMode.eDirect);

                    // Add one normal per each vertex face index (3 per triangle)
                    FbxLayerElementArray fbxElementArray = fbxLayerElement.GetDirectArray();

                    for (int n = 0; n < mesh.Normals.Length; n++)
                    {
                        fbxElementArray.Add(new FbxVector4(mesh.Tangents [n] [0],
                                                           mesh.Tangents [n] [1],
                                                           mesh.Tangents [n] [2]));
                    }
                    fbxLayer.SetTangents(fbxLayerElement);
                }
            }