Example #1
0
        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();
        }
Example #2
0
    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;
        }
    }
Example #3
0
        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);
        }
Example #4
0
 static bool ConvertToTangentSpace(enum_VertexData _target)
 {
     switch (_target)
     {
     case enum_VertexData.Normal:
     case enum_VertexData.Tangent:
         return(false);
     }
     return(true);
 }
Example #5
0
 void SelectVectorData(enum_VertexData _data)
 {
     if (!m_VertexDataSource.Check(_data))
     {
         return;
     }
     if (m_VertexDataSource != enum_VertexData.None)
     {
         m_ModifingMesh.GetVertexData(m_VertexDataSource, m_VertexDatas);
     }
 }
Example #6
0
    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);
    }
Example #7
0
        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);
        }