using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEngine;
using UnityEngine.Gonbest.MagicCube;
using UnityEngine.SceneManagement;

namespace Thousandto.Launcher.ExternalLibs
{
    public class SceneSplit
    {
        private const string _rootName = "SceneRoot";
        private const string _vfxName = "[vfx]";
        private const string _farName = "[far]";
        private const string _nearName = "[near]";
        private const string _midle = "[midle]";
        private const string _timeLine = "[timeline]";
        private GameObject _sceneRoot = null;
        private GameObject _effectRoot = null;
        private SceneAssetsDiscriptFile _sceneScript = null;
        private List<SceneNodeCommpent> _childs = new List<SceneNodeCommpent>();
        private Dictionary<int, Mesh> _dicCombinMesh = new Dictionary<int, Mesh>();
        private List<SceneNodeCommpent> _tempNodeList = new List<SceneNodeCommpent>(500);

        //替换shader
        private Shader _replaceShader = null;
        private Material _replaceMat = null;

        //默认场景shader
        private Shader _defaultShader = null;
        private Material _defaultMat = null;

        private bool _isHideObj = false;

        #region//私有函数
        //初始化Root
        private void InitRoot()
        {
            if (_sceneRoot == null)
                _sceneRoot = GameObject.Find(_rootName);
            //if (_effectRoot == null)
            //    _effectRoot = _sceneRoot.transform.Find(_vfxName).gameObject;
            _childs.Clear();
            Renderer[] f_rdList = null;
            Renderer[] n_rdList = null;
            Renderer[] m_rdList = null;
            Renderer[] pf_rdList = null;
            Renderer[] pm_rdList = null;
            Renderer[] pn_rdList = null;
            Renderer[] pn_rdList_hide = null;    
            Renderer[] ot_rdList = null;
            for (int i = 0; i < _sceneRoot.transform.childCount; i++)
            {
                var child = _sceneRoot.transform.GetChild(i);
                if (child.name == _farName)
                {
                    f_rdList = child.GetComponentsInChildren<Renderer>(true);
                    for (int j = 0; j < f_rdList.Length; j++)
                    {
                        if (f_rdList[j].transform)
                        {
                            SceneNodeCommpent node = new SceneNodeCommpent();
                            node.Trans = f_rdList[j].transform;
                            node.RootType = NodeRootType.FarRoot;
                            if (f_rdList[j] is MeshRenderer)
                                node.RenderType = RendererType.MeshRenderer;
                            else if (f_rdList[j] is SkinnedMeshRenderer)
                                node.RenderType = RendererType.SkinMesh;
                            else if (f_rdList[j] is ParticleSystemRenderer)
                            {
                                node.RenderType = RendererType.ParticleSystemRenderer;
                                node.RootType = NodeRootType.ParticFar;
                            }
                            AddNode(node);
                        }
                    }
                }
                else if (child.name == _nearName)
                {
                    //添加Near节点
                    n_rdList = child.GetComponentsInChildren<Renderer>(true);
                    for (int j = 0; j < n_rdList.Length; j++)
                    {
                        if (n_rdList[j].transform)
                        {
                            SceneNodeCommpent node = new SceneNodeCommpent();
                            node.Trans = n_rdList[j].transform;
                            node.RootType = NodeRootType.NearRoot;
                            if (n_rdList[j] is MeshRenderer)
                                node.RenderType = RendererType.MeshRenderer;
                            else if (n_rdList[j] is SkinnedMeshRenderer)
                                node.RenderType = RendererType.SkinMesh;
                            else if (n_rdList[j] is ParticleSystemRenderer)
                            {
                                node.RenderType = RendererType.ParticleSystemRenderer;
                                node.RootType = NodeRootType.ParticNear;
                            }
                            AddNode(node);
                        }
                    }
                }
                else if (child.name == _midle)
                {
                    //添加Midle节点
                    m_rdList = child.GetComponentsInChildren<Renderer>(true);
                    for (int j = 0; j < m_rdList.Length; j++)
                    {
                        if (m_rdList[j].transform)
                        {
                            SceneNodeCommpent node = new SceneNodeCommpent();
                            node.Trans = m_rdList[j].transform;
                            node.RootType = NodeRootType.MidleRoot;
                            if (m_rdList[j] is MeshRenderer)
                                node.RenderType = RendererType.MeshRenderer;
                            else if (m_rdList[j] is SkinnedMeshRenderer)
                                node.RenderType = RendererType.SkinMesh;
                            else if (m_rdList[j] is ParticleSystemRenderer)
                            {
                                node.RenderType = RendererType.ParticleSystemRenderer;
                                node.RootType = NodeRootType.ParticMidle;
                            }
                            AddNode(node);
                        }
                    }
                }
                else if (child.name == _vfxName)
                {
                    for (int m = 0; m < child.childCount; m++)
                    {
                        var pChild = child.GetChild(m);
                        if (pChild.name == "[1]" || pChild.name == "[2]" || pChild.name == "[3]")
                        {
                            for (int k = 0; k < pChild.childCount; k++)
                            {
                                var ppChild = pChild.GetChild(k);
                                if (ppChild.name == "[far]")
                                {
                                    pf_rdList = ppChild.GetComponentsInChildren<Renderer>(true);
                                    //添加粒子Far节点
                                    for (int n = 0; n < pf_rdList.Length; n++)
                                    {
                                        ParticleSystemRenderer prd = pf_rdList[n].GetComponent<ParticleSystemRenderer>();
                                        if (prd != null)
                                        {
                                            SceneNodeCommpent node = new SceneNodeCommpent();
                                            node.Trans = pf_rdList[n].transform;
                                            node.RenderType = RendererType.ParticleSystemRenderer;
                                            node.RootType = NodeRootType.ParticFar;
                                            AddNode(node);
                                        }
                                        else
                                        {
                                            SceneNodeCommpent node = new SceneNodeCommpent();
                                            node.Trans = pf_rdList[n].transform;
                                            node.RootType = NodeRootType.NearRoot;
                                            if (pf_rdList[n] is MeshRenderer)
                                                node.RenderType = RendererType.MeshRenderer;
                                            else if (pf_rdList[n] is SkinnedMeshRenderer)
                                                node.RenderType = RendererType.SkinMesh;
                                            else if (pf_rdList[n] is TrailRenderer)
                                                node.RenderType = RendererType.TrailRender;
                                            AddNode(node);
                                        }
                                    }
                                }
                                else if (ppChild.name == "[midle]")
                                {
                                    pm_rdList = ppChild.GetComponentsInChildren<Renderer>(true);
                                    //添加粒子Near节点
                                    for (int n = 0; n < pm_rdList.Length; n++)
                                    {
                                        ParticleSystemRenderer prd = pm_rdList[n].GetComponent<ParticleSystemRenderer>();
                                        if (prd != null)
                                        {
                                            SceneNodeCommpent node = new SceneNodeCommpent();
                                            node.Trans = pm_rdList[n].transform;
                                            node.RenderType = RendererType.ParticleSystemRenderer;
                                            node.RootType = NodeRootType.ParticMidle;
                                            AddNode(node);
                                        }
                                        else
                                        {
                                            SceneNodeCommpent node = new SceneNodeCommpent();
                                            node.Trans = pm_rdList[n].transform;
                                            node.RootType = NodeRootType.MidleRoot;
                                            if (pm_rdList[n] is MeshRenderer)
                                                node.RenderType = RendererType.MeshRenderer;
                                            else if (pm_rdList[n] is SkinnedMeshRenderer)
                                                node.RenderType = RendererType.SkinMesh;
                                            else if (pm_rdList[n] is TrailRenderer)
                                                node.RenderType = RendererType.TrailRender;
                                            AddNode(node);
                                        }
                                    }
                                }
                                else if (ppChild.name == "[near]")
                                {
                                    pn_rdList = ppChild.GetComponentsInChildren<Renderer>(true);
                                    //添加粒子Near节点
                                    for (int n = 0; n < pn_rdList.Length; n++)
                                    {
                                        ParticleSystemRenderer prd = pn_rdList[n].GetComponent<ParticleSystemRenderer>();
                                        if (prd != null)
                                        {
                                            SceneNodeCommpent node = new SceneNodeCommpent();
                                            node.Trans = pn_rdList[n].transform;
                                            node.RenderType = RendererType.ParticleSystemRenderer;
                                            node.RootType = NodeRootType.ParticNear;
                                            AddNode(node);
                                        }
                                        else
                                        {
                                            SceneNodeCommpent node = new SceneNodeCommpent();
                                            node.Trans = pn_rdList[n].transform;
                                            node.RootType = NodeRootType.NearRoot;
                                            if (pn_rdList[n] is MeshRenderer)
                                                node.RenderType = RendererType.MeshRenderer;
                                            else if (pn_rdList[n] is SkinnedMeshRenderer)
                                                node.RenderType = RendererType.SkinMesh;
                                            else if (pn_rdList[n] is TrailRenderer)
                                                node.RenderType = RendererType.TrailRender;
                                            AddNode(node);
                                        }
                                    }
                                }
                                else if (ppChild.name == "[nearHide]")
                                {
                                    pn_rdList_hide = ppChild.GetComponentsInChildren<Renderer>(true);
                                    //添加粒子Near节点
                                    for (int n = 0; n < pn_rdList_hide.Length; n++)
                                    {
                                        ParticleSystemRenderer prd = pn_rdList[n].GetComponent<ParticleSystemRenderer>();
                                        if (prd != null)
                                        {
                                            SceneNodeCommpent node = new SceneNodeCommpent();
                                            node.Trans = pn_rdList_hide[n].transform;
                                            node.RenderType = RendererType.ParticleSystemRenderer;
                                            node.RootType = NodeRootType.ParticNearHide;
                                            AddNode(node);
                                        }
                                        else
                                        {
                                            SceneNodeCommpent node = new SceneNodeCommpent();
                                            node.Trans = pn_rdList_hide[n].transform;
                                            node.RootType = NodeRootType.NearRoot;
                                            if (pn_rdList_hide[n] is MeshRenderer)
                                                node.RenderType = RendererType.MeshRenderer;
                                            else if (pn_rdList_hide[n] is SkinnedMeshRenderer)
                                                node.RenderType = RendererType.SkinMesh;
                                            else if (pn_rdList_hide[n] is TrailRenderer)
                                                node.RenderType = RendererType.TrailRender;
                                            AddNode(node);
                                        }
                                    }
                                }
                            }
                        }
                        else
                        {
                            ot_rdList = pChild.GetComponentsInChildren<Renderer>(true);
                            //添加粒子Near节点
                            for (int n = 0; n < ot_rdList.Length; n++)
                            {
                                ParticleSystemRenderer prd = ot_rdList[n].GetComponent<ParticleSystemRenderer>();
                                if (prd != null)
                                {
                                    SceneNodeCommpent node = new SceneNodeCommpent();
                                    node.Trans = ot_rdList[n].transform;
                                    node.RenderType = RendererType.ParticleSystemRenderer;
                                    node.RootType = NodeRootType.Other;
                                    AddNode(node);
                                }
                                else
                                {
                                    SceneNodeCommpent node = new SceneNodeCommpent();
                                    node.Trans = ot_rdList[n].transform;
                                    node.RootType = NodeRootType.Other;
                                    if (ot_rdList[n] is MeshRenderer)
                                        node.RenderType = RendererType.MeshRenderer;
                                    else if (ot_rdList[n] is SkinnedMeshRenderer)
                                        node.RenderType = RendererType.SkinMesh;
                                    else if (ot_rdList[n] is TrailRenderer)
                                        node.RenderType = RendererType.TrailRender;
                                    AddNode(node);
                                }
                            }
                        }
                    }
                }
                else if (child.name == _timeLine)
                {
                    ot_rdList = child.GetComponentsInChildren<Renderer>(true);
                    for (int j = 0; j < ot_rdList.Length; j++)
                    {
                        if (ot_rdList[j].transform)
                        {
                            SceneNodeCommpent node = new SceneNodeCommpent();
                            node.Trans = ot_rdList[j].transform;
                            node.RootType = NodeRootType.FarRoot;
                            if (ot_rdList[j] is MeshRenderer)
                                node.RenderType = RendererType.MeshRenderer;
                            else if (ot_rdList[j] is SkinnedMeshRenderer)
                                node.RenderType = RendererType.SkinMesh;
                            else if (ot_rdList[j] is ParticleSystemRenderer)
                                node.RenderType = RendererType.ParticleSystemRenderer;
                            else if (ot_rdList[j] is TrailRenderer)
                                node.RenderType = RendererType.TrailRender;
                            AddNode(node);
                        }
                    }
                }
                else
                {
                    ot_rdList = child.GetComponentsInChildren<Renderer>(true);
                    for (int j = 0; j < ot_rdList.Length; j++)
                    {
                        if (ot_rdList[j].transform)
                        {
                            SceneNodeCommpent node = new SceneNodeCommpent();
                            node.Trans = ot_rdList[j].transform;
                            node.RootType = NodeRootType.Other;
                            if (ot_rdList[j] is MeshRenderer)
                                node.RenderType = RendererType.MeshRenderer;
                            else if (ot_rdList[j] is SkinnedMeshRenderer)
                                node.RenderType = RendererType.SkinMesh;
                            else if (ot_rdList[j] is ParticleSystemRenderer)
                                node.RenderType = RendererType.ParticleSystemRenderer;
                            else if (ot_rdList[j] is TrailRenderer)
                                node.RenderType = RendererType.TrailRender;
                            AddNode(node);
                        }
                    }
                }
            }
        }

        private void AddNode(SceneNodeCommpent node)
        {
            if (node != null)
            {
                node.IsActive = node.Trans.gameObject.activeSelf;
                _childs.Add(node);
            }
        }
        //开始lodmesh
        private void SplitScene()
        {
            _isHideObj = !string.Equals(SceneManager.GetActiveScene().name, "map039");
            InitRoot();
            //_sceneScript = ScriptableObject.CreateInstance<SceneAssetsDiscriptFile>();
            _sceneScript = RequireComponent<SceneAssetsDiscriptFile>(_sceneRoot);
            _sceneScript.Initialized();
            CalScene();
//#if UNITY_EDITOR
//            EditorCoroutineRunner.StartEditorCoroutine();
//#endif
        }

        private void CalScene()
        {
            Vector2 min = Vector2.zero;
            Vector2 max = Vector2.zero;
            bool isInitMinMax = false;
            for (int i = 0; i < _childs.Count; i++)
            {
                if (!_childs[i].Trans.gameObject.activeSelf)
                    continue;
                Vector3 childMin = Vector3.zero;
                Vector3 childMax = Vector3.zero;
                var rd = _childs[i].Trans.GetComponent<Renderer>();
                Mesh ms = null;
                if (_childs[i].RenderType == RendererType.MeshRenderer)
                {
                    MeshFilter mf = _childs[i].Trans.GetComponent<MeshFilter>();
                    ms = mf.sharedMesh;
                }
                else if (_childs[i].RenderType == RendererType.SkinMesh)
                {
                    SkinnedMeshRenderer skinRender = _childs[i].Trans.GetComponent<SkinnedMeshRenderer>();
                    ms = skinRender.sharedMesh;
                }
                else if (_childs[i].RenderType == RendererType.ParticleSystemRenderer)
                {
                    ParticleSystemRenderer prd = _childs[i].Trans.GetComponent<ParticleSystemRenderer>();
                    if (prd.meshCount != 0)
                    {
                        Mesh[] msArray = new Mesh[prd.meshCount];
                        prd.GetMeshes(msArray);
                        for (int j = 0; j < msArray.Length; j++)
                        {
                            if (_childs[i] == null || msArray[j] == null)
                                break;
                            ms = msArray[j];
                            break;
                        }
                    }
                }
                if (ms == null)
                    continue;
                Vector3[] tempVec = ms.vertices;
                for (int j = 0; j < tempVec.Length; j++)
                {
                    //var time = Time.realtimeSinceStartup;
                    Vector3 worldVec = _childs[i].Trans.TransformPoint(tempVec[j]);
                    //获取最小坐标和最大坐标
                    if (!isInitMinMax)
                    {
                        min.x = worldVec.x;
                        min.y = worldVec.z;
                        max.x = worldVec.x;
                        max.y = worldVec.z;
                        isInitMinMax = true;
                    }
                    else
                    {
                        min.x = worldVec.x < min.x ? worldVec.x : min.x;
                        min.y = worldVec.z < min.y ? worldVec.z : min.y;
                        max.x = worldVec.x > max.x ? worldVec.x : max.x;
                        max.y = worldVec.z > max.y ? worldVec.z : max.y;
                    }
                    if (j == 0)
                    {
                        childMin.x = worldVec.x;
                        childMin.y = worldVec.z;
                        childMax.x = worldVec.x;
                        childMax.y = worldVec.z;
                    }
                    else
                    {
                        childMin.x = worldVec.x < childMin.x ? worldVec.x : childMin.x;
                        childMin.y = worldVec.z < childMin.y ? worldVec.z : childMin.y;
                        childMax.x = worldVec.x > childMax.x ? worldVec.x : childMax.x;
                        childMax.y = worldVec.z > childMax.y ? worldVec.z : childMax.y;
                    }
                    //time = Time.realtimeSinceStartup - time;
                    //UnityEngine.Debug.LogError("11111111111111111111---------:" + time);
                }
                _childs[i].Min = childMin;
                _childs[i].Max = childMax;
            }
            if (Math.Abs(max.x - min.x) > 2048 || Math.Abs(max.y - min.y) > 2048)
            {
#if UNITY_EDITOR
                UnityEditor.SceneManagement.EditorSceneManager.CloseScene(SceneManager.GetActiveScene(), true);
                Debug.LogError(string.Format("场景有一个非鸡儿远的节点!!!!!!!!!快点检查,内存着不住了了!!!!!场景名字是:{0}", SceneManager.GetActiveScene().name));
                return;
#endif
            }
            for (int i = 0; i < (int)CellType.Count; i++)
            {
                _sceneScript.SetRegion(min, max, (CellType)i);
                var parts = _sceneScript.GetParts((CellType)i);
                CheckChild(parts, (CellType)i);

            }
            for (int i = 0; i < (int)CellType.Count; i++)
            {
                var parts = _sceneScript.GetParts((CellType)i);
                for (int m = 0; m < _childs.Count; m++)
                {
                    DifferentNode(parts, _childs[m], (CellType)i);
                    if (_isHideObj)
                    {
                        _childs[m].Trans.gameObject.SetActive(false);
                    }
                }
            }
            for (int i = 0; i < (int)CellType.Count; i++)
            {
                var parts = _sceneScript.GetParts((CellType)i);
                CheckPart(parts, (CellType)i);
            }
            //_sceneScript.ConvertMeshPath();
            _sceneScript.ConvertTexPath();
            _sceneScript.ConvertMatProperty();
            _sceneScript.ConvertCombinMeshPath();
            //合并场景网格
            //CombinMesh();
            //AssetDatabase.CreateAsset(_sceneScript, "Assets/TestScript/SceneAssetsDiscriptFile.asset");
#if UNITY_EDITOR
            //测试写材质球名字
            //SaveCSV();
            UnityEditor.SceneManagement.EditorSceneManager.SaveScene(SceneManager.GetActiveScene());
            UnityEditor.SceneManagement.EditorSceneManager.CloseScene(SceneManager.GetActiveScene(), true);
#endif
            _childs.Clear();
            //Resources.UnloadAsset()
            GC.Collect();
            GC.WaitForPendingFinalizers();
        }

        public void SaveCSV()
        {
            System.Text.StringBuilder sb = new System.Text.StringBuilder();
            //写出列名称
            for (int i = 0; i < _sceneScript.MatP_Dic.Length; i++)
            {
                var matInfo = _sceneScript.MatP_Dic[i];
                sb.Append(string.Format("材质球名字: {0}    ", matInfo.matName));
                sb.Append("\n");
            }
            System.IO.File.WriteAllText("EditorOut/" + "场景导出mat名字.csv", sb.ToString(), System.Text.Encoding.UTF8);
            Debug.LogFormat("结果文件被存储到:{0}", "EditorOut/" + "场景导出mat名字.csv");

        }

        private Material GetReplaceMat()
        {
            if (_replaceMat == null)
            {
                Shader sh = Shader.Find("Gonbest/FallBack/FBWithLightmap");
                Material mat = new Material(sh);
                _replaceShader = sh;
                _replaceMat = mat;
            }
            return _replaceMat;
        }

        private Material GetDefaultMat()
        {
            if (_defaultMat == null)
            {
                Shader sh = Shader.Find("Ares/Scene/NoDiffuse");
                Material mat = new Material(sh);
                _defaultShader = sh;
                _defaultMat = mat;
            }
            return _defaultMat;
        }

        private void CheckChild(RegionPart[] parts, CellType type)
        {
            for (int i = 0; i < _childs.Count; i++)
            {
                Bounds bounds;
                switch (_childs[i].RenderType)
                {
                    case RendererType.MeshRenderer:
                        {
                            Mesh ms = _childs[i].Trans.GetComponent<MeshFilter>().sharedMesh;
                            Transform trans = _childs[i].Trans;
                            if (trans == null || ms == null)
                                break;
                            bounds = GetBounds(_childs[i], ms);
                            _childs[i].SetBounds(bounds);
                            SetCommpentPart(parts,type, _childs[i], bounds);
                        }
                        break;
                    case RendererType.SkinMesh:
                        {
                            SkinnedMeshRenderer skinnedRender = _childs[i].Trans.GetComponent<SkinnedMeshRenderer>();
                            if (_childs[i].Trans == null || skinnedRender.sharedMesh == null)
                                break;
                            bounds = GetBounds(_childs[i], skinnedRender.sharedMesh);
                            _childs[i].SetBounds(bounds);
                            SetCommpentPart(parts, type, _childs[i], bounds);
                        }
                        break;
                    case RendererType.ParticleSystemRenderer:
                        {
                            ParticleSystemRenderer prd = _childs[i].Trans.GetComponent<ParticleSystemRenderer>();
                            if (prd.meshCount == 0)
                            {
                                SetCommpentPart(parts, type, _childs[i]);
                            }
                            else
                            {
                                Mesh[] msArray = new Mesh[prd.meshCount];
                                prd.GetMeshes(msArray);
                                for (int j = 0; j < msArray.Length; j++)
                                {
                                    if (_childs[i] == null || msArray[j] == null)
                                        break;
                                    //bounds = GetBounds(_childs[i], msArray[j]);
                                    bounds = GetParticleBounds(_childs[i], msArray[j]);
                                    SetCommpentPart(parts, type, _childs[i], bounds, j != 0 ? true : false);
                                }
                            }
                        }
                        break;
                    case RendererType.TrailRender:
                        {
                            TrailRenderer trd = _childs[i].Trans.GetComponent<TrailRenderer>();
                            var center = _childs[i].Trans.localToWorldMatrix.MultiplyPoint3x4(trd.bounds.center);
                            var extents = trd.bounds.extents;
                            var childMin = center - extents;
                            var childMax = center + extents;
                            var tr_Bounds = new Bounds(center, extents * 2);
                            tr_Bounds.min = childMin;
                            tr_Bounds.max = childMax;
                            SetCommpentPart(parts, type, _childs[i], tr_Bounds);
                            _childs[i].SetBounds(tr_Bounds);
                        }
                        break;
                }
            }
            //for (int i = 0; i < parts.Length; i++)
            //{
            //    var part = parts[i];
            //    if (part.Descripts == null || (part.Descripts != null && part.Descripts.Length == 0))
            //    {
            //        part.IsAvailable = false;
            //    }
            //}
        }

        private void CheckPart(RegionPart[] parts, CellType type)
        {
            for (int i = 0; i < parts.Length; i++)
            {
                var part = parts[i];
                var nodeList = part.GetNodes();
                List<SceneAssetDescript> dataList = new List<SceneAssetDescript>();
                for (int m = 0; m < nodeList.Count; m++)
                {
                    var node = nodeList[m];
                    Bounds bounds = new Bounds();
                    switch (node.RenderType)
                    {
                        case RendererType.MeshRenderer:
                            {
                                Mesh ms = node.Trans.GetComponent<MeshFilter>().sharedMesh;
                                Transform trans = node.Trans;
                                if (trans == null || ms == null)
                                    break;
                                var data = GetDataFile(node);
                                dataList.Add(data);
                                MeshFilter mf = node.Trans.GetComponent<MeshFilter>();
                                MeshRenderer mRd = node.Trans.GetComponent<MeshRenderer>();
                                if (node.IsUseDefaultShader)
                                {
                                    Material mat = GetDefaultMat();
                                    mRd.sharedMaterials = new Material[] { mat };
                                }
                                else
                                {
                                    Material mat = GetReplaceMat();
                                    mRd.sharedMaterials = new Material[] { mat };
                                }
                            }
                            break;
                        case RendererType.SkinMesh:
                            {
                                SkinnedMeshRenderer skinnedRender = node.Trans.GetComponent<SkinnedMeshRenderer>();
                                if (node.Trans == null || skinnedRender.sharedMesh == null)
                                    break;
                                var data = GetDataFile(node);
                                dataList.Add(data);
                                if (node.IsUseDefaultShader)
                                {
                                    Material mat = GetDefaultMat();
                                    skinnedRender.sharedMaterials = new Material[] { mat };
                                }
                                else
                                {
                                    Material mat = GetReplaceMat();
                                    skinnedRender.sharedMaterials = new Material[] { mat };
                                }
                                //skinnedRender.sharedMaterials = new Material[0];
                                //skinnedRender.sharedMesh = null;
                            }
                            break;
                        case RendererType.ParticleSystemRenderer:
                            {
                                ParticleSystemRenderer prd = node.Trans.GetComponent<ParticleSystemRenderer>();
                                if (prd.meshCount == 0)
                                {
                                    var data = GetDataFile(node);
                                    dataList.Add(data);
                                }
                                else
                                {
                                    Mesh[] msArray = new Mesh[prd.meshCount];
                                    prd.GetMeshes(msArray);
                                    for (int j = 0; j < msArray.Length; j++)
                                    {
                                        if (node == null || msArray[j] == null)
                                            break;
                                        bounds = GetBounds(node, msArray[j]);
                                        var data = GetDataFile(node, bounds);
                                        dataList.Add(data);
                                    }
                                }
                                if (node.IsUseDefaultShader)
                                {
                                    Material mat = GetDefaultMat();
                                    int lenght = prd.sharedMaterials.Length;
                                    prd.sharedMaterials = new Material[lenght];
                                    for (int k = 0; k < lenght; k++)
                                    {
                                        prd.sharedMaterials[k] = mat;
                                    }
                                }
                                else
                                {
                                    Material mat = GetReplaceMat();
                                    int lenght = prd.sharedMaterials.Length;
                                    prd.sharedMaterials = new Material[lenght];
                                    for (int k = 0; k < lenght; k++)
                                    {
                                        prd.sharedMaterials[k] = mat;
                                    }
                                }
                                //prd.SetMeshes(new Mesh[0]);
                                //prd.sharedMaterials = new Material[0];
                            }
                            break;
                        case RendererType.TrailRender:
                            {
                                TrailRenderer trd = node.Trans.GetComponent<TrailRenderer>();
                                var center = node.Trans.localToWorldMatrix.MultiplyPoint3x4(trd.bounds.center);
                                var extents = trd.bounds.extents;
                                var childMin = center - extents;
                                var childMax = center + extents;
                                var tr_Bounds = new Bounds(center, extents * 2);
                                tr_Bounds.min = childMin;
                                tr_Bounds.max = childMax;
                                var data = GetDataFile(node, bounds);
                                dataList.Add(data);
                                if (node.IsUseDefaultShader)
                                {
                                    Material mat = GetDefaultMat();
                                    trd.sharedMaterials = new Material[] { mat };
                                }
                                else
                                {
                                    Material mat = GetReplaceMat();
                                    trd.sharedMaterials = new Material[] { mat };
                                }
                            }
                            break;
                    }
                }
                SortChilds(ref dataList);
                part.Descripts = dataList.ToArray();
            }
        }

        private SceneAssetDescript GetDataFile(SceneNodeCommpent node)
        {
            SceneAssetDescript discript = new SceneAssetDescript();
            discript.NType = node.RootType;
            Bounds bounds = node.GetBounds();
            discript.SetBound(bounds);
            discript.SetData(node, node.RenderType, _sceneScript);
            return discript;
        }

        private SceneAssetDescript GetDataFile(SceneNodeCommpent node, Bounds bounds)
        {
            SceneAssetDescript discript = new SceneAssetDescript();
            discript.NType = node.RootType;
            discript.SetBound(bounds);
            discript.SetData(node, node.RenderType, _sceneScript);
            return discript;
        }


        private void SetCommpentPart(RegionPart[] parts,CellType type, SceneNodeCommpent node, Bounds bounds, bool isCheckName = false)
        {
            for (int j = 0; j < parts.Length; j++)
            {
                //if (j > 0)
                //    break;
                bool isLast = j == parts.Length - 1 ? true : false;
                //判断是否相交
                bool isIntersects = parts[j].Intersects(bounds);
                if (isIntersects)
                {
                    parts[j].AddNode(node);
                    List<int> refrenceList = null;
                    if (node.RefrenceDic.ContainsKey((int)type))
                    {
                        refrenceList = node.RefrenceDic[(int)type];
                        refrenceList.Add(j);
                    }
                    else
                    {
                        refrenceList = new List<int>();
                        refrenceList.Add(j);
                        node.RefrenceDic.Add((int)type, refrenceList);
                    }
                }
            }
        }

        private void SetCommpentPart(RegionPart[] parts, CellType type, SceneNodeCommpent node, bool isCheckName = false)
        {
            for (int j = 0; j < parts.Length; j++)
            {
                //if (j > 0)
                //    break;
                bool isLast = j == parts.Length - 1 ? true : false;
                //判断是否相交
                Bounds bounds = GetParticleBounds(node, null);
                node.SetBounds(bounds);
                bool isIntersects = parts[j].Intersects(bounds);
                if (isIntersects)
                {
                    parts[j].AddNode(node);
                    List<int> refrenceList = null;
                    if (node.RefrenceDic.ContainsKey((int)type))
                    {
                        refrenceList = node.RefrenceDic[(int)type];
                        refrenceList.Add(j);
                    }
                    else
                    {
                        refrenceList = new List<int>();
                        refrenceList.Add(j);
                        node.RefrenceDic.Add((int)type, refrenceList);
                    }
                }
            }
        }

        private void DifferentNode(RegionPart[] parts,SceneNodeCommpent node, CellType type)
        {
            List<int> list = node.GetRefrenceIds(CellType.Level_2);
            RefrenceSize size = _sceneScript.GetRefSize(type);
            if (list != null)
            {
                if (list.Count < size.Min || list.Count >= size.Max)
                {
                    list = node.GetRefrenceIds(type);
                    for (int i = 0; list != null && i < list.Count; i++)
                    {
                        _tempNodeList.Clear();
                        //List<SceneAssetDescript> desList = new List<SceneAssetDescript>();
                        //for (int m = 0; m < parts[list[i]].Descripts.Length; m++)
                        //{
                        //    if (parts[list[i]].Descripts[m].Trans != node.Trans)
                        //    {
                        //        desList.Add(parts[list[i]].Descripts[m]);
                        //    }
                        //}
                        var nodeList = parts[list[i]].GetNodes();
                        for (int m = 0; m < nodeList.Count; m++)
                        {
                            if (nodeList[m].Trans != node.Trans)
                            {
                                _tempNodeList.Add(nodeList[m]);
                            }
                        }
                        //parts[list[i]].Descripts = desList.ToArray();
                        parts[list[i]].SetNodes(_tempNodeList);
                    }
                }
            }
        }

        private Bounds GetBounds(SceneNodeCommpent node, Mesh ms)
        {
            var center = node.Trans.localToWorldMatrix.MultiplyPoint3x4(ms.bounds.center);
            var extents = new Vector3(Mathf.Abs(center.x - node.Min.x), 10, Mathf.Abs(center.z - node.Min.y));
            var childMin = center - extents;
            var childMax = center + extents;
            var bounds = new Bounds(center, extents * 2);
            bounds.min = childMin;
            bounds.max = childMax;
            return bounds;
        }

        private Bounds GetParticleBounds(SceneNodeCommpent node, Mesh ms)
        {
            Vector3 center = Vector3.zero;
            Vector3 extents = Vector3.zero;
            Bounds bounds;
            ParticleSystem ps = node.Trans.GetComponent<ParticleSystem>();
            if (ps.shape.enabled)
            {
                center = node.Trans.position;
                extents = new Vector3(ps.shape.radius / 2, 10, ps.shape.radius / 2);
            }
            else
            {
                if (ms == null)
                {
                    center = node.Trans.position;
                    extents = new Vector3(0.5f, 10, 0.5f);
                }
                else
                {
                    //使用mesh来求
                    center = node.Trans.localToWorldMatrix.MultiplyPoint3x4(ms.bounds.center);
                    extents = new Vector3(Mathf.Abs(center.x - node.Min.x), 10, Mathf.Abs(center.z - node.Min.y));
                }
            }
            var childMin = center - extents;
            var childMax = center + extents;
            bounds = new Bounds(center, extents * 2);
            bounds.min = childMin;
            bounds.max = childMax;
            return bounds;
        }

        private void SortChilds(ref List<SceneAssetDescript> list)
        {
            if (list == null)
                return;
            list.Sort((x, y) =>
            {
                if (x.Sort > y.Sort)
                {
                    return -1;
                }
                else if (x.Sort == y.Sort)
                {
                    return 0;
                }
                else
                {
                    return 1;
                }
            });
        }

        private void SetScale(Transform trans, ref float scale)
        {
            Transform parent = trans.parent;
            if (parent)
            {
                scale *= parent.localScale.x;
                SetScale(parent, ref scale);
            }
        }

        //合并场景相同材质球的网格
        //private void CombinMesh()
        //{
        //    _dicCombinMesh.Clear();
        //    string combinPath = "GameAssets/Resources/Scene/CombinMesh";
        //    string floderPath = Application.dataPath + "/" + combinPath;
        //    if (!Directory.Exists(floderPath))
        //        Directory.CreateDirectory(floderPath);
        //    //开始合并mesh
        //    var enumer = _sceneScript.DicCombinData.GetEnumerator();
        //    try
        //    {
        //        while (enumer.MoveNext())
        //        {
        //            //新建一个合并组,长度与 meshfilters一致
        //            CombineInstance[] combineInstances = new CombineInstance[enumer.Current.Value.Count]; 
        //            for (int i = 0; i < enumer.Current.Value.Count; i++)                                  
        //            {
        //                //将共享mesh,赋值
        //                combineInstances[i].mesh = enumer.Current.Value[i].mesh;                   
        //                //本地坐标转矩阵,赋值
        //                combineInstances[i].transform = enumer.Current.Value[i].trans.localToWorldMatrix; 
        //            }
        //            //声明一个新网格对象
        //            Mesh newMesh = new Mesh();
        //            //MatAssetsProperty matProperty = _sceneScript.GetMatProperty(enumer.Current.Key);
        //            newMesh.name = string.Format("Comb_MatProperty_{0}_Mesh",enumer.Current.Key );
        //            //将combineInstances数组传入函数
        //            newMesh.CombineMeshes(combineInstances,false);
        //            //保存合并的网格
        //            string assetPath = "Assets/GameAssets/Resources/";
        //            string path = string.Format("Scene/CombinMesh/{0}", newMesh.name);
        //            assetPath = assetPath + path + ".asset";
        //            UnityEditor.AssetDatabase.CreateAsset(newMesh, assetPath);
        //            if (!_dicCombinMesh.ContainsKey(enumer.Current.Key))
        //            {
        //                _dicCombinMesh[enumer.Current.Key] = newMesh;
        //            }
        //        }
        //    }
        //    finally
        //    {
        //        enumer.Dispose();
        //    }
        //}

        //获取或者添加脚本
        private T RequireComponent<T>(GameObject go) where T : Component
        {
            T ret = go.GetComponent<T>();
            if (ret == null)
            {
                ret = go.AddComponent<T>();
            }
            return ret;
        }
        #endregion

        #region//公共函数
        public static void SplitSceneData()
        {
            SceneSplit split = new SceneSplit();
            split.SplitScene();
        }
        #endregion
    }
}