void OnGUI() { EditorGUILayout.BeginVertical(); EditorGUILayout.LabelField("Select Target FBX Source"); m_ModelPrefab = EditorGUILayout.ObjectField(m_ModelPrefab, typeof(GameObject), false) as GameObject; ModelImporter importer = AssetImporter.GetAtPath(AssetDatabase.GetAssetPath(Selection.activeObject)) as ModelImporter; if (importer != null) { m_ModelPrefab = AssetDatabase.LoadAssetAtPath <GameObject>(AssetDatabase.GetAssetPath(Selection.activeObject)); } else { importer = AssetImporter.GetAtPath(AssetDatabase.GetAssetPath(m_ModelPrefab)) as ModelImporter; } if (!importer) { EditorGUILayout.LabelField("<Color=#FF0000>Select FBX Model</Color>", UEGUIStyle_Window.m_ErrorLabel); return; } m_GenerateUV = (enum_VertexData)EditorGUILayout.EnumPopup("Generate UV:", m_GenerateUV); if (m_GenerateUV != enum_VertexData.None && GUILayout.Button("Generate")) { if (UEAsset.SaveFilePath(out string filePath, "prefab", UEPath.RemoveExtension(UEPath.GetPathName(AssetDatabase.GetAssetPath(m_ModelPrefab))) + "_SN")) { GenerateSkinnedTarget(UEPath.FilePathToAssetPath(filePath), m_ModelPrefab, m_GenerateUV); } } EditorGUILayout.EndVertical(); }
public static void SetVertexData(this Mesh _srcMesh, enum_VertexData _dataType, List <Vector4> _data) { switch (_dataType) { default: throw new Exception("Invalid Vertex Data Type" + _dataType); case enum_VertexData.UV0: case enum_VertexData.UV1: case enum_VertexData.UV2: case enum_VertexData.UV3: case enum_VertexData.UV4: case enum_VertexData.UV5: case enum_VertexData.UV6: case enum_VertexData.UV7: _srcMesh.SetUVs((int)_dataType, _data); break; case enum_VertexData.Color: _srcMesh.SetColors(_data.ToArray(p => new Color(p.x, p.y, p.z, p.w))); break; case enum_VertexData.Tangent: _srcMesh.SetTangents(_data); break; case enum_VertexData.Normal: _srcMesh.SetNormals(_data.ToArray(vec4 => vec4.ToVector3())); break; } }
static Mesh GenerateMesh(Mesh _src, enum_VertexData _generateUV) { Mesh target = _src.Copy(); Vector3[] smoothNormals = GenerateSmoothNormals(target, ConvertToTangentSpace(_generateUV)); target.SetVertexData(_generateUV, smoothNormals.ToList()); return(target); }
static bool ConvertToTangentSpace(enum_VertexData _target) { switch (_target) { case enum_VertexData.Normal: case enum_VertexData.Tangent: return(false); } return(true); }
void SelectVectorData(enum_VertexData _data) { if (!m_VertexDataSource.Check(_data)) { return; } if (m_VertexDataSource != enum_VertexData.None) { m_ModifingMesh.GetVertexData(m_VertexDataSource, m_VertexDatas); } }
public static bool GetVertexData(this Mesh _srcMesh, enum_VertexData _dataType, List <Vector3> _data) { _data.Clear(); switch (_dataType) { default: throw new Exception("Invalid Vertex Data Type" + _dataType); case enum_VertexData.UV0: case enum_VertexData.UV1: case enum_VertexData.UV2: case enum_VertexData.UV3: case enum_VertexData.UV4: case enum_VertexData.UV5: case enum_VertexData.UV6: case enum_VertexData.UV7: _srcMesh.GetUVs((int)_dataType, _data); break; case enum_VertexData.Color: List <Color> colors = new List <Color>(); _srcMesh.GetColors(colors); foreach (var color in colors) { _data.Add(color.ToVector()); } break; case enum_VertexData.Tangent: List <Vector4> tangents = new List <Vector4>(); _srcMesh.GetTangents(tangents); foreach (var tangent in tangents) { _data.Add(tangent.ToVector3()); } break; case enum_VertexData.Normal: { List <Vector3> normalList = new List <Vector3>(); _srcMesh.GetNormals(normalList); foreach (var normal in normalList) { _data.Add(normal); } } break; } return(_data != null); }
public static void GenerateSkinnedTarget(string assetPath, GameObject _targetFBX, enum_VertexData _generateUV) { GameObject prefabSource = GameObject.Instantiate(_targetFBX); SkinnedMeshRenderer[] skinnedRenderers = prefabSource.GetComponentsInChildren <SkinnedMeshRenderer>(); MeshFilter[] meshFilters = prefabSource.GetComponentsInChildren <MeshFilter>(); List <Mesh> sourceMeshes = new List <Mesh>(); foreach (SkinnedMeshRenderer renderer in skinnedRenderers) { sourceMeshes.Add(renderer.sharedMesh); } foreach (MeshFilter filter in meshFilters) { sourceMeshes.Add(filter.sharedMesh); } List <KeyValuePair <string, Object> > targetSubAsset = new List <KeyValuePair <string, Object> >(); for (int i = 0; i < sourceMeshes.Count; i++) { targetSubAsset.Add(new KeyValuePair <string, Object>(sourceMeshes[i].name, GenerateMesh(sourceMeshes[i], _generateUV))); } GameObject mainAsset = PrefabUtility.SaveAsPrefabAsset(prefabSource, assetPath); UEAsset.CreateOrReplaceSubAsset(assetPath, targetSubAsset.ToArray()); Mesh[] meshes = AssetDatabase.LoadAllAssetRepresentationsAtPath(assetPath).ToArray(obj => (Mesh)obj); skinnedRenderers = mainAsset.GetComponentsInChildren <SkinnedMeshRenderer>(); for (int i = 0; i < skinnedRenderers.Length; i++) { skinnedRenderers[i].sharedMesh = meshes[i]; } meshFilters = mainAsset.GetComponentsInChildren <MeshFilter>(); for (int i = 0; i < meshFilters.Length; i++) { meshFilters[i].sharedMesh = meshes.Find(p => p.name == meshFilters[i].sharedMesh.name); } PrefabUtility.SavePrefabAsset(mainAsset); GameObject.DestroyImmediate(prefabSource); }