static string DeformationNodes(ref Mesh mesh, ref SkinnedMeshRenderer renderer) { string text = ""; FbxContainerNode skinnode = new FbxContainerNode(1, "Deformer", "\"Deformer::Skin " + mesh.name + "\", \"Skin\"", new FbxNode[4]); skinnode.subnodes[0] = new FbxNode(2, "Version", "100"); skinnode.subnodes[1] = new FbxNode(2, "Multilayer", "0"); skinnode.subnodes[2] = new FbxNode(2, "Type", "\"Skin\""); skinnode.subnodes[3] = new FbxNode(2, "Link_DeformAcuracy", "50"); text += skinnode.ToString(); for (int i=0;i<renderer.bones.Length; i++){ FbxContainerNode node = new FbxContainerNode(1, "Deformer", "\"SubDeformer::Cluster " + mesh.name + " " + renderer.bones[i].name + "\", \"Cluster\"", new FbxNode[6]); node.subnodes[0] = new FbxNode(2, "Version", "100"); node.subnodes[1] = new FbxNode(2, "MultiLayer", "0"); node.subnodes[2] = new FbxNode(2, "Type", "Cluster"); node.subnodes[3] = new FbxNode(2, "Indexes", ""); node.subnodes[4] = new FbxNode(2, "Weights", ""); for (int j=0;j<mesh.vertexCount;j++){ BoneWeight weights = mesh.boneWeights[j]; if (weights.boneIndex0 == i){ node.subnodes[3].val += j.ToString() + ","; node.subnodes[4].val += weights.weight0 + ","; } else if (weights.boneIndex1 == i){ node.subnodes[3].val += j.ToString() + ","; node.subnodes[4].val += weights.weight1.ToString("n6") + ","; } else if (weights.boneIndex2 == i){ node.subnodes[3].val += j.ToString() + ","; node.subnodes[4].val += weights.weight2.ToString("n6") + ","; } else if (weights.boneIndex3 == i){ node.subnodes[3].val += j.ToString() + ","; node.subnodes[4].val += weights.weight3.ToString("n6") + ","; } } node.subnodes[5] = new FbxNode(2, "Transform", ""); for (int j=0;j<16;j++){ int x = System.Array.Exists(new int[]{1,2,3,4,8,12}, p=>p==j)?-1:1; node.subnodes[5].val += (x*mesh.bindposes[i][j]).ToString("n15") + ","; } node.subnodes[3].val = node.subnodes[3].val.TrimEnd(','); node.subnodes[4].val = node.subnodes[4].val.TrimEnd(','); node.subnodes[5].val = node.subnodes[5].val.TrimEnd(','); text += node.ToString(); } return text; }
static FbxNode DefinitionsNode (ref Mesh mesh, ref Renderer renderer) { // calculate the number of subnodes needed int subnodecount = 6; if (renderer.GetType() == typeof(SkinnedMeshRenderer)){ subnodecount += 2; } // calculate the counts int ModelCount = 1; int MatCount = MaterialNodeCount (ref renderer); int TexCount = TextureNodeCount (ref renderer); // create the node FbxContainerNode node = new FbxContainerNode(0, "Definitions", "", new FbxNode[subnodecount]); node.subnodes[0] = new FbxNode(1, "Version", "100"); node.subnodes[1] = new FbxNode(1, "Count", (ModelCount + MatCount + TexCount + 1).ToString()); node.subnodes[2] = new FbxContainerNode(2, "ObjectType", "\"Model\"", new FbxNode[1]{new FbxNode(3, "Count", ModelCount.ToString())}); node.subnodes[3] = new FbxContainerNode(2, "ObjectType", "\"Material\"", new FbxNode[1]{new FbxNode(3, "Count", MatCount.ToString())}); node.subnodes[4] = new FbxContainerNode(2, "ObjectType", "\"Texture\"", new FbxNode[1]{new FbxNode(3, "Count", TexCount.ToString())}); if (renderer.GetType() == typeof(SkinnedMeshRenderer)){ SkinnedMeshRenderer skinnedrenderer = renderer as SkinnedMeshRenderer; node.subnodes[5] = new FbxContainerNode(2, "ObjectType", "\"Deformer\"", new FbxNode[1]{new FbxNode(3, "Count", skinnedrenderer.bones.Length.ToString())}); node.subnodes[6] = new FbxContainerNode(2, "ObjectType", "\"Pose\"", new FbxNode[1]{new FbxNode(3, "Count", "1")}); } node.subnodes[subnodecount - 1] = new FbxContainerNode(2, "ObjectType", "\"GlobalSettings\"", new FbxNode[1]{new FbxNode(3, "Count", "1")});// There is always 1 global settings node return node; }