private void TryRegister(GameObject gameObj) { UnityEngine.Renderer renderer = gameObj.renderer; if (((renderer != null) && (renderer.sharedMaterials != null)) && (renderer.enabled && this.FindValidTag(renderer.sharedMaterials))) { bool flag = false; if (((renderer.GetType() == typeof(MeshRenderer)) || (renderer.GetType() == typeof(SkinnedMeshRenderer))) || (flag = renderer.GetType() == typeof(ClothRenderer))) { if (flag && (gameObj.GetComponent <InteractiveCloth>().tearFactor != 0f)) { Debug.LogWarning("[Easyflow] Tearable cloth objects are not supported at this time. Ignoring cloth object \"" + renderer.name + "\""); } else if (gameObj.GetComponent <EasyflowObject>() == null) { gameObj.AddComponent <EasyflowObject>(); } } } }
static FbxNode ConnectionsNode (ref Mesh mesh, ref Renderer renderer) { List<FbxNode> subnodes = new List<FbxNode>(); //string nodetext = "Connections: {\n"; //nodetext += "\tConnect: \"OO\", \"Model::" + mesh.name + "\", \"Model::Scene\"\n"; subnodes.Add(new FbxNode(1, "Connect", "\"OO\", \"Model::" + mesh.name + "\", \"Model::Scene\"")); foreach(Material mat in renderer.sharedMaterials){ // Skip if the material is not defined if (mat==null) continue; // Add the material connection subnodes.Add(new FbxNode(1, "Connect", "\"OO\", \"Material::" + mat.name + "\", \"Model::" + mesh.name + "\"")); //nodetext += "\tConnect: \"OO\", \"Material::" + mat.name + "\", \"Model::" + mesh.name + "\"\n"; // Add textures if (mat.HasProperty("_MainTex")){ //nodetext += "\tConnect: \"OO\", \"Texture::" + mat.name + "_diff" + "\", \"Model::" + mesh.name + "\"\n"; subnodes.Add(new FbxNode(1, "Connect", "\"OO\", \"Texture::" + mat.name + "_diff" + "\", \"Model::" + mesh.name + "\"")); } if (mat.HasProperty("_BumpMap")){ //nodetext += "\tConnect: \"OO\", \"Texture::" + mat.name + "_bump" + "\", \"Model::" + mesh.name + "\"\n"; subnodes.Add(new FbxNode(1, "Connect", "\"OO\", \"Texture::" + mat.name + "_bump" + "\", \"Model::" + mesh.name + "\"")); } } if (renderer.GetType() == typeof(SkinnedMeshRenderer)){ SkinnedMeshRenderer skinnedrenderer = renderer as SkinnedMeshRenderer; //nodetext += new FbxNode(1, "Connect", "\"OO\", \"Deformer::Skin " + mesh.name + "\", \"Model::" + mesh.name + "\"").ToString(); subnodes.Add(new FbxNode(1, "Connect", "\"OO\", \"Deformer::Skin " + mesh.name + "\", \"Model::" + mesh.name + "\"")); foreach (Transform bone in skinnedrenderer.bones){ //nodetext += new FbxNode(1, "Connect", "\"OO\", \"SubDeformer::Cluster " + mesh.name + " " + bone.name + "\", \"Deformer::Skin " + mesh.name + "\"").ToString(); subnodes.Add(new FbxNode(1, "Connect", "\"OO\", \"SubDeformer::Cluster " + mesh.name + " " + bone.name + "\", \"Deformer::Skin " + mesh.name + "\"")); } foreach (Transform bone in skinnedrenderer.bones){ //nodetext += new FbxNode(1, "Connect", "\"OO\", \"Model::" + bone.name + "\", \"SubDeformer::Cluster " + mesh.name + " " + bone.name + "\"").ToString(); subnodes.Add(new FbxNode(1, "Connect", "\"OO\", \"Model::" + bone.name + "\", \"SubDeformer::Cluster " + mesh.name + " " + bone.name + "\"")); } // Add the heiarchy of models List<Transform> boneList = skinnedrenderer.bones.ToList(); while (boneList.Count > 0){ for (int i=0;i<boneList.Count;i++){ Transform parent = boneList[i].parent; if (!boneList.Contains(parent)){ if (System.Array.Exists(skinnedrenderer.bones, p=>p==parent)){ //nodetext += new FbxNode(1, "Connect", "\"OO\", \"Model::" + boneList[i].name + "\", \"Model::" + parent.name + "\"").ToString(); subnodes.Add(new FbxNode(1, "Connect", "\"OO\", \"Model::" + boneList[i].name + "\", \"Model::" + parent.name + "\"")); } else { //nodetext += new FbxNode(1, "Connect", "\"OO\", \"Model::" + boneList[i].name + "\", \"Model::Scene\"").ToString(); subnodes.Add(new FbxNode(1, "Connect", "\"OO\", \"Model::" + boneList[i].name + "\", \"Model::Scene\"")); } boneList.RemoveAt(i); } } } } //nodetext += "}"; //return nodetext; return new FbxContainerNode(0, "Connections", "", subnodes.ToArray()); }
public static string ExportToString (Mesh mesh, ref Renderer renderer, bool uselhcoords = true){ #if UNITY_EDITOR EditorUtility.DisplayProgressBar("EJM Software FBX Exporter", "Writing header", 0f); #endif string documenttext = "; FBX 6.1.0 project file\n; Copyright (C) 1997-2008 Autodesk Inc. and/or its licensors.\n; All rights reserved.\n; ----------------------------------------------------\n\n"; documenttext += FBXHeaderExtensionNode (); documenttext += "\n\n; Object definitions\n;------------------------------------------------------------------\n\n"; documenttext += DefinitionsNode (ref mesh, ref renderer).ToString(); documenttext += "\n\n; Object properties\n;------------------------------------------------------------------\n\n"; string skinmodelnodes = "", defnodes = "", posenode = ""; if (renderer.GetType() == typeof(SkinnedMeshRenderer)){ #if UNITY_EDITOR EditorUtility.DisplayProgressBar("EJM Software FBX Exporter", "Parsing skinning data", 0.33f); #endif SkinnedMeshRenderer skmr = renderer as SkinnedMeshRenderer; skinmodelnodes = SkinnedModelNodes(ref skmr); defnodes = DeformationNodes(ref mesh, ref skmr); posenode = PoseNode(ref mesh); } #if UNITY_EDITOR EditorUtility.DisplayProgressBar("EJM Software FBX Exporter", "Writing mesh data", 0.66f); #endif documenttext += ObjectsNode (ModelNodes (ref mesh, uselhcoords) + skinmodelnodes, MaterialNodes (ref renderer), TextureNodes(ref renderer), defnodes, posenode, GlobalSettingsNode ().ToString()); documenttext += "\n\n; Object connections\n;------------------------------------------------------------------\n\n"; documenttext += ConnectionsNode (ref mesh, ref renderer).ToString(); documenttext += "\n\n;Version 5 settings\n;------------------------------------------------------------------\n\n"; documenttext += Version5Node (); #if UNITY_EDITOR EditorUtility.ClearProgressBar(); #endif return documenttext; }
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; }