Ejemplo n.º 1
0
		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;
		}