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); }
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()); }
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()); }
public void Mesh_GetNameWithoutNameSpacePrefix_GetsNameWithoutNamespacePrefix() { // given: var obj = new FbxMesh("asdf"); // require: Assert.AreEqual("asdf", obj.GetName()); // then: Assert.AreEqual("asdf", obj.GetNameWithoutNameSpacePrefix()); }
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()); }
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()); }
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); }