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