public void Skin_SetGeometry_SetsGeometry() { // given: var skin = new FbxSkin(""); var mesh = new FbxMesh(""); // require: Assert.AreEqual(0, skin.GetSrcObjectCount()); Assert.AreEqual(0, skin.GetDstObjectCount()); Assert.AreEqual(null, skin.GetGeometry()); Assert.AreEqual(0, mesh.GetSrcObjectCount()); Assert.AreEqual(0, mesh.GetDstObjectCount()); Assert.AreEqual(0, mesh.GetDeformerCount()); // when: skin.SetGeometry(mesh); // then: Assert.AreEqual(0, skin.GetSrcObjectCount()); Assert.AreEqual(1, skin.GetDstObjectCount()); Assert.AreSame(mesh, skin.GetGeometry()); Assert.AreEqual(1, mesh.GetSrcObjectCount()); Assert.AreEqual(0, mesh.GetDstObjectCount()); Assert.AreEqual(1, mesh.GetDeformerCount()); Assert.AreSame(skin, mesh.GetDeformer(0)); }
public SkeletonBone(FbxNode boneNode, SkeletonBone parentBone, FbxSkin[] skins, SceneLoader scene) { //this.scene = scene; this.scene = scene; Node = boneNode; ParentBone = parentBone; //animationTrackKeyFrames = new List<HashSet<double>>(); cluster = Skeleton.FindCluster(Node, skins, out skin); //Поиск по всем skins во всех mesh. Можно было бы сделать эффективнее. globalMeshTransform = new FbxAMatrix(); globalMeshTransform.SetIdentity(); geometryOffset = new FbxAMatrix(); geometryOffset.SetIdentity(); if (cluster != null) { FbxNode meshNode = skin.GetGeometry()?.GetNode(); if (meshNode != null) { globalMeshTransform = meshNode.EvaluateGlobalTransform(FbxExtensions.ToFbxTime(-1)); // FbxMath.GetGlobalPosition( meshNode, FbxExtensions.ToFbxTime( -1 ), null ); geometryOffset = FbxMath.GetGeometryOffset(meshNode); } } InitialTransform = GetInitialTransform().ToMatrix4(); //Во внешнем коде надо использовать это значение, т.к. результат GetInitialTransform() может зависеть от установленного AnimationTrack }