Mesh GetOrCreateInstance(FbxMesh fbxMesh)
    {
        Mesh mesh;

        if (m_meshInstances.TryGetValue(fbxMesh, out mesh))
        {
            return(mesh);
        }

        // create the unity mesh vertices
        var nVertices     = fbxMesh.GetControlPointsCount();
        var unityVertices = new Vector3[nVertices];

        for (int i = 0; i < nVertices; ++i)
        {
            unityVertices[i] = V3(fbxMesh.GetControlPointAt(i));
        }

        // create the unity mesh triangles. TODO: maybe handle non-triangular faces more intelligently
        var nPoly          = fbxMesh.GetPolygonCount();
        var unityTriangles = new List <int>();

        for (int polyIndex = 0; polyIndex < nPoly; ++polyIndex)
        {
            var polySize = fbxMesh.GetPolygonSize(polyIndex);
            if (polySize < 3)
            {
                // ignore lines and points
                continue;
            }

            // Add the first triangle
            unityTriangles.Add(fbxMesh.GetPolygonVertex(polyIndex, 0));
            unityTriangles.Add(fbxMesh.GetPolygonVertex(polyIndex, 1));
            unityTriangles.Add(fbxMesh.GetPolygonVertex(polyIndex, 2));

            // If there's more triangles, assume they're a fan around the first vertex.
            // Not necessarily true, but them's the breaks.
            for (int i = 3; i < polySize; ++i)
            {
                unityTriangles.Add(fbxMesh.GetPolygonVertex(polyIndex, 0));
                unityTriangles.Add(fbxMesh.GetPolygonVertex(polyIndex, i - 1));
                unityTriangles.Add(fbxMesh.GetPolygonVertex(polyIndex, i));
            }
        }

        mesh = new Mesh
        {
            name      = fbxMesh.GetName(),
            vertices  = unityVertices,
            triangles = unityTriangles.ToArray()
        };
        mesh.RecalculateNormals();
        m_meshInstances[fbxMesh] = mesh;
        return(mesh);
    }
Beispiel #2
0
        public void Mesh_SetNameSpaceThenSetInitialName_FirstCharacterIsStillMissing()
        {
            // given:
            var obj = new FbxMesh("asdf");

            obj.SetNameSpace("qwer");

            // require:
            Assert.AreEqual("asdf", obj.GetName());
            Assert.AreEqual("qwer", obj.GetNameSpaceOnly());

            // when:
            obj.SetInitialName("zxcv");

            // then:
            Assert.AreEqual("zxcv", obj.GetInitialName());
            Assert.AreEqual("zxcv", obj.GetName());
            Assert.AreEqual("xcv", obj.GetNameOnly());
        }
Beispiel #3
0
        public void Mesh_SetNameUsingColons_IncludesNamespace()
        {
            // given:
            var obj = new FbxMesh("asdf::Something|zxcv|qwer");

            // then:
            Assert.AreEqual("asdf::Something|zxcv|qwer", obj.GetName());
            Assert.AreEqual("", obj.GetNameSpaceOnly());
            Assert.AreEqual("Geometry::", obj.GetNameSpacePrefix());
            Assert.AreEqual("Geometry::asdf::Something|zxcv|qwer", obj.GetNameWithNameSpacePrefix());
        }
Beispiel #4
0
        public void Mesh_GetNameWithoutNameSpacePrefix_GetsNameWithoutNamespacePrefix()
        {
            // given:
            var obj = new FbxMesh("asdf");

            // require:
            Assert.AreEqual("asdf", obj.GetName());

            // then:
            Assert.AreEqual("asdf", obj.GetNameWithoutNameSpacePrefix());
        }
Beispiel #5
0
        public void Mesh_SetNameSpaceAndGetNameWithoutNameSpacePrefix_FirstCharacterIsNotMissing()
        {
            // given:
            var obj = new FbxMesh("asdf");

            obj.SetNameSpace("qwer");

            // require:
            Assert.AreEqual("asdf", obj.GetName());
            Assert.AreEqual("qwer", obj.GetNameSpaceOnly());

            // then:
            Assert.AreEqual("asdf", obj.GetNameWithoutNameSpacePrefix());
        }
Beispiel #6
0
        public void Mesh_SetNameSpaceAndGetNameWithoutNameSpacePrefix_IncludesNamespace()
        {
            // given:
            var obj = new FbxMesh("asdf");

            obj.SetNameSpace("qwer");

            // require:
            Assert.AreEqual("asdf", obj.GetName());
            Assert.AreEqual("qwer", obj.GetNameSpaceOnly());
            Assert.AreEqual("Geometry::", obj.GetNameSpacePrefix());

            // then:
            Assert.AreEqual("Geometry::asdf", obj.GetNameWithNameSpacePrefix());
        }
Beispiel #7
0
        protected override void CheckScene(FbxScene scene)
        {
            base.CheckScene(scene);

            FbxNode rootNode = scene.GetRootNode().GetChild(0);

            Assert.IsNotNull(rootNode);

            FbxMesh sharedMesh = rootNode.GetMesh();

            Assert.IsNotNull(sharedMesh);
            Assert.AreEqual(m_meshName, sharedMesh.GetName());

            int matIndex = rootNode.GetMaterialIndex(m_materialName);

            Assert.GreaterOrEqual(matIndex, 0);
            FbxSurfaceMaterial sharedMat = rootNode.GetMaterial(matIndex);

            Assert.IsNotNull(sharedMat);

            // check that the mesh is the same for all children
            CheckSceneHelper(rootNode, sharedMesh, sharedMat);
        }