//TODO fix the filename of the textures as constant
    private void BuildBaseData()
    {
        #region Step1: Create Script

        GameObject pathDataObj = new GameObject();
        pathDataObj.name = "PathData";
        pathDataObj.transform.position = Vector3.zero;

        APahtData pathData = pathDataObj.AddComponent <APahtData>();

        #endregion

        #region Step2: Load HeightData and Obstacle 1

        EditorUtility.DisplayProgressBar("创建中", "正在创建行走数据以及高度法线数据, 1/34", 1 / 34.0f);

        Texture2D hTx = (Texture2D)EditorCommonFunctions.GetReadWritable(m_pGroundHeightmap);
        Texture2D nTx = (Texture2D)EditorCommonFunctions.GetReadWritable(m_pGroundNormalmap);
        pathData.m_fGridHeightData = new float[SceneConstant.m_iSceneSize * SceneConstant.m_iSceneSize];
        pathData.m_byGridStateData = new byte[SceneConstant.m_iSceneSize * SceneConstant.m_iSceneSize];
        pathData.m_v3NormalData    = new Vector3[SceneConstant.m_iSceneSize * SceneConstant.m_iSceneSize];

        for (int i = 0; i < SceneConstant.m_iSceneSize; ++i)
        {
            for (int j = 0; j < SceneConstant.m_iSceneSize; ++j)
            {
                pathData.m_fGridHeightData[i * SceneConstant.m_iSceneSize + j] = 4.0f * SceneConstant.m_fHighgroundHeight * (hTx.GetPixel(i, j).r - 0.5f);
                pathData.m_byGridStateData[i * SceneConstant.m_iSceneSize + j] = hTx.GetPixel(i, j).g > hTx.GetPixel(i, j).b
                    ? GridMath.m_byWalkable
                    : GridMath.m_byNoWalkable;
                Color cNormal = nTx.GetPixel(i, j);
                pathData.m_v3NormalData[i * SceneConstant.m_iSceneSize + j] = new Vector3(cNormal.r, cNormal.g, cNormal.b);
                pathData.m_v3NormalData[i * SceneConstant.m_iSceneSize + j] = (pathData.m_v3NormalData[i * SceneConstant.m_iSceneSize + j] - new Vector3(0.5f, 0.5f, 0.5f)) * 2.0f;
                pathData.m_v3NormalData[i * SceneConstant.m_iSceneSize + j].Normalize();
            }
        }

        #endregion

        #region Step3: Do Generate

        pathData.GenerateOptimaztion();

        #endregion

        EditorUtility.ClearProgressBar();
    }
    public static Texture2D GetTexture2DWithColor(Texture2D pMain, Texture2D pColor, Texture2D pShadow, Color cMain, Color cSub, bool bIsInv)
    {
        Texture2D pMainR = (Texture2D)EditorCommonFunctions.GetReadWritable(pMain);

        Color32[] pxMainR = pMainR.GetPixels32();
        Texture2D pColorR = (Texture2D)EditorCommonFunctions.GetReadWritable(pColor);

        Color32[] pxColorR = pColorR.GetPixels32();
        Texture2D pShadowR = (Texture2D)EditorCommonFunctions.GetReadWritable(pShadow);

        Color32[] pxShadowR = pShadowR.GetPixels32();
        int       iWidth    = Mathf.Max(pMainR.width, pColorR.width);
        int       iHeight   = Mathf.Max(pMainR.height, pColorR.height);
        Texture2D ret1      = new Texture2D(iWidth, iHeight, TextureFormat.RGB24, false);

        Color32[] res132_1 = new Color32[iWidth * iHeight];

        for (int i = 0; i < iWidth; ++i)
        {
            for (int j = 0; j < iHeight; ++j)
            {
                Color cMainTex   = pxMainR[(i * pMainR.width / iWidth) * pMainR.height + j * pMainR.height / iHeight];
                Color cColorTex  = pxColorR[(i * pColorR.width / iWidth) * pColorR.height + j * pColorR.height / iHeight];
                Color cShadowTex = pxShadowR[(i * pShadowR.width / iWidth) * pShadowR.height + j * pShadowR.height / iHeight];

                float shadowcol = Mathf.Clamp01((cShadowTex.r + 0.2f) * (1.0f + cColorTex.b * cColorTex.r));
                float rate      = cColorTex.b;
                float srate     = cColorTex.r;
                Color cor       = cSub * cColorTex.g + cMain * cColorTex.r;
                Color realC     = cMainTex * (1.0f - rate) + cor * rate;
                realC   = 1.5f * shadowcol * realC;
                realC.a = 1.0f;

                if (bIsInv)
                {
                    realC = (new Color(realC.r - 0.5f, realC.g - 0.5f, realC.b - 0.5f) * Mathf.Clamp(srate, 0.2f, 0.8f) + new Color(0.5f, 0.5f, 0.5f)) * 0.3f + 0.1f * cMain + 0.1f * Color.white;
                }

                res132_1[i * iHeight + j] = realC;
            }
        }
        ret1.SetPixels32(res132_1);
        return(ret1);
    }
Exemple #3
0
    void OnWizardCreate()
    {
        #region Step1: Check files

        if (string.IsNullOrEmpty(TemplateName))
        {
            CRuntimeLogger.LogError("必须有个模板名称");
            return;
        }

        Texture2D heighttx = (Texture2D)EditorCommonFunctions.GetReadWritable(HeightMap);
        if (null == heighttx || SceneConstant.m_iHightmapSize != heighttx.width || SceneConstant.m_iHightmapSize != heighttx.height)
        {
            CRuntimeLogger.LogError(string.Format("必须是{0}x{0}的高度贴图,如果你的图片正确,可以检查下导入设置是否是Editor/GUI", SceneConstant.m_iHightmapSize));
            return;
        }
        Texture2D groundtx = (Texture2D)EditorCommonFunctions.GetReadWritable(GroundMap);
        if (null == groundtx || SceneConstant.m_iHightmapSize != groundtx.width || SceneConstant.m_iHightmapSize != groundtx.height)
        {
            CRuntimeLogger.LogError(string.Format("必须是{0}x{0}的地皮贴图,如果你的图片正确,可以检查下导入设置是否是Editor/GUI", SceneConstant.m_iHightmapSize));
            return;
        }
        Texture2D doctx = (Texture2D)EditorCommonFunctions.GetReadWritable(DocMap);
        if (null == doctx || SceneConstant.m_iDecoratemapSize != doctx.width || SceneConstant.m_iDecoratemapSize != doctx.height)
        {
            CRuntimeLogger.LogError(string.Format("必须是{0}x{0}的装饰贴图", SceneConstant.m_iDecoratemapSize));
            return;
        }

        #endregion

        #region Step2: Create

        string sGroundFileName = SceneConstant.m_sArtworkPath + "Templates/"
                                 + string.Format("T{0}X{0}", SceneConstant.m_iHightmapSize)
                                 + "/GenerateMesh/" + TemplateName + ".asset";

        Texture2D wmap, nmap;
        SceneEditorUtility.CreateGround(heighttx, groundtx, doctx, sGroundFileName, GroundType, false, out wmap, out nmap);


        CSceneTexture sceneTx = new CSceneTexture {
            m_sSceneType = GroundType
        };
        if (!sceneTx.Load() || 81 != sceneTx.m_pElement.Count)
        {
            CRuntimeLogger.LogError(GroundType + "贴图配置文件有问题");
            return;
        }

        CSceneGroudTemplate groundTemplate = new CSceneGroudTemplate {
            m_sSceneType = GroundType
        };
        if (!groundTemplate.Load())
        {
            CRuntimeLogger.LogError(GroundType + "贴图配置文件有问题");
            return;
        }

        CSceneType type = new CSceneType();
        type.Load();
        if (null == type[GroundType])
        {
            CRuntimeLogger.LogError(GroundType + "的配置找不到?");
            return;
        }

        #endregion

        #region Step3: Make Record

        CSceneTemplate templates = new CSceneTemplate();
        templates.Load();
        CSceneTemplateElement element = templates[TemplateName];
        if (null == element)
        {
            element = templates.CreateElement(TemplateName);
        }

        element.m_sDecoratePath = AssetDatabase.GetAssetPath(DocMap);
        element.m_sGroundPath   = AssetDatabase.GetAssetPath(GroundMap);
        element.m_sHeightPath   = AssetDatabase.GetAssetPath(HeightMap);

        templates.Save();

        #endregion
    }
Exemple #4
0
    protected void BuildTextureDataWithFolder()
    {
        #region Step1: Find all files

        string sFolderTx = Application.dataPath + "/"
                           + SceneConstant.m_sArtworkPath
                           + TypeName
                           + SceneConstant.m_sSceneTexturesPath;
        string sFolderDoc = Application.dataPath + "/"
                            + SceneConstant.m_sArtworkPath
                            + TypeName
                            + SceneConstant.m_sDecoratesPath;

        CRuntimeLogger.Log("将从" + sFolderTx + "和" + sFolderDoc + "收集信息");
        DirectoryInfo dirtx  = new DirectoryInfo(sFolderTx);
        DirectoryInfo dirdoc = new DirectoryInfo(sFolderDoc);
        if (!dirtx.Exists || !dirdoc.Exists)
        {
            CRuntimeLogger.LogWarning("你选择目录内容不太对吧!");
            return;
        }

        List <FileInfo> allTextures = new List <FileInfo>();
        allTextures.AddRange(dirtx.GetFiles("*.png", SearchOption.AllDirectories));
        allTextures.AddRange(dirdoc.GetFiles("*.png", SearchOption.AllDirectories));
        List <FileInfo> allModels = dirdoc.GetFiles("*.fbx", SearchOption.AllDirectories).ToList();

        #endregion

        #region Step2: Create SceneType

        CSceneType scenetypes = new CSceneType();
        scenetypes.Load();
        if (null == scenetypes[TypeName])
        {
            CSceneTypeElement newType = scenetypes.CreateElement(TypeName);
            newType.m_bCanRot          = CanRotate;
            newType.m_eEdgeType        = EdgeType;
            newType.m_iCliffType       = CliffType;
            newType.m_bHasGroundOffset = HasGroundOffset;
        }
        else
        {
            scenetypes[TypeName].m_bCanRot          = CanRotate;
            scenetypes[TypeName].m_eEdgeType        = EdgeType;
            scenetypes[TypeName].m_iCliffType       = CliffType;
            scenetypes[TypeName].m_bHasGroundOffset = HasGroundOffset;
        }
        scenetypes.Save();

        #endregion

        #region Step3: Bake Texture Atlas

        Dictionary <int, int>          codes = new Dictionary <int, int>(new IntEqualityComparer());
        Dictionary <string, Texture2D> txDic = new Dictionary <string, Texture2D>();
        foreach (FileInfo fileInfo in allTextures)
        {
            string    sFileName  = CommonFunctions.GetLastName(fileInfo.FullName);
            string[]  twoparts   = sFileName.Split('_');
            string    sAssetPath = "Assets" + fileInfo.FullName.Replace("\\", "/").Replace(Application.dataPath.Replace("\\", "/"), "");
            Texture2D t1         = AssetDatabase.LoadAssetAtPath(sAssetPath, typeof(Texture2D)) as Texture2D;
            txDic.Add(sFileName, (Texture2D)EditorCommonFunctions.GetReadWritable(t1));

            //Check whether is a template texture
            int iCode, iRepeat;
            if (2 == twoparts.Length &&
                !string.IsNullOrEmpty(twoparts[0]) &&
                int.TryParse(twoparts[0].Substring(1, twoparts[0].Length - 1), out iCode) &&
                int.TryParse(twoparts[1], out iRepeat))
            {
                if (codes.ContainsKey(iCode))
                {
                    if (codes[iCode] < iRepeat)
                    {
                        codes[iCode] = iRepeat;
                    }
                }
                else
                {
                    codes.Add(iCode, iRepeat);
                }
            }
        }

        Dictionary <string, Rect> textureDic = EditorCommonFunctions.PackTexture(
            txDic,
            SceneConstant.m_sArtworkPath
            + TypeName
            + SceneConstant.m_sSceneTexturesPath,
            Shader.Find("Mobile/Unlit (Supports Lightmap)"), EditorCommonFunctions.EPackColorFormat.ForcePng);

        #endregion

        #region Step4: Make template

        CSceneGroudTemplate tamplate = new CSceneGroudTemplate {
            m_sSceneType = TypeName
        };

        foreach (KeyValuePair <string, Rect> kvp in textureDic)
        {
            CSceneGroudTemplateElement newGT = tamplate.CreateElement();
            tamplate.ChangeName(newGT.m_sElementName, kvp.Key);
            newGT.m_vUV = CommonFunctions.Rect2V4(kvp.Value);
        }
        tamplate.Save();

        #endregion

        #region Step5: Make Scene Texture

        CSceneTexture newT = new CSceneTexture {
            m_sSceneType = TypeName
        };

        for (int lt = 0; lt < 3; ++lt)
        {
            for (int rt = 0; rt < 3; ++rt)
            {
                for (int rb = 0; rb < 3; ++rb)
                {
                    for (int lb = 0; lb < 3; ++lb)
                    {
                        int  iCode, iRots;
                        bool bFlip;
                        FindCodeAndRot(codes, lt, rt, rb, lb, out iCode, out iRots, out bFlip);
                        if (iCode < 0)
                        {
                            CRuntimeLogger.LogError(string.Format("组合没有找到{0}-{1}-{2}-{3}", lt, rt, rb, lb));
                            return;
                        }

                        CSceneTextureElement newE = newT.CreateElement();

                        int iCode2 = lt * CommonFunctions.IntPow(3, 0)
                                     + rt * CommonFunctions.IntPow(3, 1)
                                     + rb * CommonFunctions.IntPow(3, 2)
                                     + lb * CommonFunctions.IntPow(3, 3);
                        newT.ChangeName(newE.m_sElementName, "T" + iCode2);
                        if (iCode2 != newE.m_iID)
                        {
                            newT.ChangeId(newE.m_iID, iCode2);
                        }

                        newE.m_iTemplate     = iCode;
                        newE.m_iRotNumber    = iRots;
                        newE.m_iTextureCount = codes[iCode];
                        newE.m_bReflect      = bFlip;
                    }
                }
            }
        }

        newT.Save();

        #endregion

        #region Step6: Make Decorate

        Dictionary <int, string> modelTemplates = new Dictionary <int, string>(new IntEqualityComparer());
        Dictionary <int, int>    modelRepeates  = new Dictionary <int, int>(new IntEqualityComparer());
        foreach (FileInfo fileInfo in allModels)
        {
            string   sFileName  = CommonFunctions.GetLastName(fileInfo.FullName);
            string[] twoparts   = sFileName.Split('_');
            string   sAssetPath = "Assets" + fileInfo.FullName.Replace("\\", "/").Replace(Application.dataPath.Replace("\\", "/"), "");

            //Check whether is a template texture
            int iCode, iRepeat;
            if (3 == twoparts.Length &&
                int.TryParse(twoparts[1], out iCode) &&
                int.TryParse(twoparts[2], out iRepeat) &&
                iCode < 3 && iCode >= 0)
            {
                //Make template data
                if (!modelTemplates.ContainsKey(iCode))
                {
                    modelTemplates.Add(iCode, twoparts[0] + "_" + iCode);
                }

                if (!modelRepeates.ContainsKey(iCode))
                {
                    modelRepeates.Add(iCode, iRepeat);
                }
                else if (modelRepeates[iCode] < iRepeat)
                {
                    modelRepeates[iCode] = iRepeat;
                }

                //Make the mesh
                List <Vector3> verts    = new List <Vector3>();
                List <Vector2> uvs      = new List <Vector2>();
                List <int>     trangles = new List <int>();

                GameObject go = AssetDatabase.LoadMainAssetAtPath(sAssetPath) as GameObject;
                if (null != go)
                {
                    foreach (MeshFilter mf in go.GetComponentsInChildren <MeshFilter>(true))
                    {
                        Mesh editablemesh = (Mesh)EditorCommonFunctions.GetReadWritable(mf.sharedMesh);
                        int  iVertCount   = verts.Count;
                        Rect rct;

                        MeshRenderer mr = mf.gameObject.GetComponent <MeshRenderer>();
                        if (null != mr && null != mr.sharedMaterial && null != mr.sharedMaterial.mainTexture &&
                            textureDic.ContainsKey(mr.sharedMaterial.mainTexture.name))
                        {
                            rct = textureDic[mr.sharedMaterial.mainTexture.name];
                        }
                        else if (textureDic.ContainsKey(editablemesh.name))
                        {
                            rct = textureDic[editablemesh.name];
                        }
                        else
                        {
                            CRuntimeLogger.LogWarning("Mesh找不到贴图:" + sAssetPath);
                            return;
                        }

                        if (mf.transform == go.transform)
                        {
                            verts.AddRange(editablemesh.vertices);
                        }
                        else
                        {
                            for (int i = 0; i < editablemesh.vertices.Length; ++i)
                            {
                                Vector3 worldPos = mf.transform.localToWorldMatrix.MultiplyVector(editablemesh.vertices[i]) + mf.transform.position;
                                verts.Add(go.transform.worldToLocalMatrix.MultiplyVector(worldPos - go.transform.position));
                            }
                        }
                        for (int i = 0; i < editablemesh.uv.Length; ++i)
                        {
                            float fX = Mathf.Clamp01(editablemesh.uv[i].x);
                            float fY = Mathf.Clamp01(editablemesh.uv[i].y);
                            uvs.Add(new Vector2(rct.xMin + rct.width * fX, rct.yMin + rct.height * fY));
                        }
                        for (int i = 0; i < editablemesh.triangles.Length; ++i)
                        {
                            trangles.Add(iVertCount + editablemesh.triangles[i]);
                        }
                    }
                }
                Mesh theMesh = new Mesh {
                    vertices = verts.ToArray(), uv = uvs.ToArray(), triangles = trangles.ToArray()
                };
                theMesh.RecalculateNormals();
                Unwrapping.GenerateSecondaryUVSet(theMesh);
                ;
                AssetDatabase.CreateAsset(theMesh, "Assets/"
                                          + SceneConstant.m_sArtworkPath + TypeName
                                          + SceneConstant.m_sDecoratesPath
                                          + "/Generate/" + sFileName + ".asset");
            }
        }

        CSceneDecorate doc = new CSceneDecorate {
            m_sSceneType = TypeName
        };
        CSceneDecorate olddoc = new CSceneDecorate {
            m_sSceneType = TypeName
        };
        olddoc.Load();
        foreach (KeyValuePair <int, string> kvp in modelTemplates)
        {
            CSceneDecorateElement element = doc.CreateElement(kvp.Value);
            if (element.m_iID != kvp.Key)
            {
                doc.ChangeId(element.m_iID, kvp.Key);
            }
            element.m_iDecrateRepeat = modelRepeates[kvp.Key];
            if (null != olddoc[kvp.Key])
            {
                element.m_bBlockPathfinding = olddoc[kvp.Key].m_bBlockPathfinding;
                element.m_iDecrateSize      = olddoc[kvp.Key].m_iDecrateSize;
                element.m_bOnlyRotateY      = olddoc[kvp.Key].m_bOnlyRotateY;
            }
        }
        doc.Save();
        AssetDatabase.Refresh();

        #endregion
    }
    protected void OnGUI()
    {
        if (null == m_pAllTemplates || null == m_sTemplateChooses || 0 == m_sTemplateChooses.Length)
        {
            EditorGUILayout.HelpBox("创建的模板并没有找到!", MessageType.Error);
            return;
        }

        int iIndex1 = 0;
        int iIndex2 = 0;

        for (int i = 0; i < m_sTemplateChooses.Length; ++i)
        {
            if (!string.IsNullOrEmpty(m_sT1) && m_sT1.Equals(m_sTemplateChooses[i]))
            {
                iIndex1 = i;
            }
            if (!string.IsNullOrEmpty(m_sT2) && m_sT2.Equals(m_sTemplateChooses[i]))
            {
                iIndex2 = i;
            }
        }

        //Choose Template 1
        EditorGUILayout.BeginHorizontal();
        int iChoose1 = EditorGUILayout.Popup("选择模板1", iIndex1, m_sTemplateChooses);

        m_sT1    = m_sTemplateChooses[iChoose1];
        m_iRot1  = EditorGUILayout.IntField("旋转次数", m_iRot1);
        m_bFlip1 = EditorGUILayout.Toggle("是否翻转", m_bFlip1);
        EditorGUILayout.EndHorizontal();

        //Choose Template 2
        EditorGUILayout.BeginHorizontal();
        int iChoose2 = EditorGUILayout.Popup("选择模板2", iIndex2, m_sTemplateChooses);

        m_sT2    = m_sTemplateChooses[iChoose2];
        m_iRot2  = EditorGUILayout.IntField("旋转次数", m_iRot2);
        m_bFlip2 = EditorGUILayout.Toggle("是否翻转", m_bFlip2);
        EditorGUILayout.EndHorizontal();

        bool bGenerateLittleMap = false;

        if (GUILayout.Button("随机生成"))
        {
            bGenerateLittleMap = true;
            m_sT1    = m_sTemplateChooses[Random.Range(0, m_sTemplateChooses.Length)];
            m_sT2    = m_sTemplateChooses[Random.Range(0, m_sTemplateChooses.Length)];
            m_iRot1  = Random.Range(0, 4);
            m_iRot2  = Random.Range(0, 4);
            m_bFlip1 = Random.Range(0.0f, 1.0f) > 0.5f;
            m_bFlip2 = Random.Range(0.0f, 1.0f) > 0.5f;
        }

        if (GUILayout.Button("看看小地图") || bGenerateLittleMap)
        {
            m_pHTexture = new Texture2D(SceneConstant.m_iSceneHeightMapSize, SceneConstant.m_iSceneHeightMapSize, TextureFormat.RGB565, false);
            m_pGTexture = new Texture2D(SceneConstant.m_iSceneHeightMapSize, SceneConstant.m_iSceneHeightMapSize, TextureFormat.RGB565, false);
            m_pDTexture = new Texture2D(SceneConstant.m_iSceneSize, SceneConstant.m_iSceneSize, TextureFormat.RGB565, false);

            Texture2D ht1 = (Texture2D)EditorCommonFunctions.GetReadWritable(
                AssetDatabase.LoadAssetAtPath <Texture2D>(m_pAllTemplates[m_sT1].m_sHeightPath));
            Texture2D ht2 = (Texture2D)EditorCommonFunctions.GetReadWritable(
                AssetDatabase.LoadAssetAtPath <Texture2D>(m_pAllTemplates[m_sT2].m_sHeightPath));

            Texture2D gt1 = (Texture2D)EditorCommonFunctions.GetReadWritable(
                AssetDatabase.LoadAssetAtPath <Texture2D>(m_pAllTemplates[m_sT1].m_sGroundPath));
            Texture2D gt2 = (Texture2D)EditorCommonFunctions.GetReadWritable(
                AssetDatabase.LoadAssetAtPath <Texture2D>(m_pAllTemplates[m_sT2].m_sGroundPath));

            Texture2D dt1 = (Texture2D)EditorCommonFunctions.GetReadWritable(
                AssetDatabase.LoadAssetAtPath <Texture2D>(m_pAllTemplates[m_sT1].m_sDecoratePath));
            Texture2D dt2 = (Texture2D)EditorCommonFunctions.GetReadWritable(
                AssetDatabase.LoadAssetAtPath <Texture2D>(m_pAllTemplates[m_sT2].m_sDecoratePath));

            for (int i = 0; i < 2 * SceneConstant.m_iHightmapSize - 1; ++i)
            {
                for (int j = 0; j < 2 * SceneConstant.m_iHightmapSize - 1; ++j) //0-64
                {
                    //0-31, 0-31
                    if (i < SceneConstant.m_iHightmapSize - 1 && j < SceneConstant.m_iHightmapSize - 1)
                    {
                        m_pHTexture.SetPixel(i, j, GetPixel(ht2, i, j, m_iRot2 + 2, m_bFlip2));
                        m_pGTexture.SetPixel(i, j, GetPixel(gt2, i, j, m_iRot2 + 2, m_bFlip2));
                    }
                    //33-64, 0-31
                    else if (i > SceneConstant.m_iHightmapSize - 1 && j < SceneConstant.m_iHightmapSize - 1)
                    {
                        m_pHTexture.SetPixel(i, j, GetPixel(ht1, i - SceneConstant.m_iHightmapSize + 1, j, m_iRot1 + 2, m_bFlip1));
                        m_pGTexture.SetPixel(i, j, GetPixel(gt1, i - SceneConstant.m_iHightmapSize + 1, j, m_iRot1 + 2, m_bFlip1));
                    }
                    else if (i > SceneConstant.m_iHightmapSize - 1 && j > SceneConstant.m_iHightmapSize - 1)
                    {
                        m_pHTexture.SetPixel(i, j, GetPixel(ht2, i - SceneConstant.m_iHightmapSize + 1, j - SceneConstant.m_iHightmapSize + 1, m_iRot2, m_bFlip2));
                        m_pGTexture.SetPixel(i, j, GetPixel(gt2, i - SceneConstant.m_iHightmapSize + 1, j - SceneConstant.m_iHightmapSize + 1, m_iRot2, m_bFlip2));
                    }
                    else if (i < SceneConstant.m_iHightmapSize - 1 && j > SceneConstant.m_iHightmapSize - 1)
                    {
                        m_pHTexture.SetPixel(i, j, GetPixel(ht1, i, j - SceneConstant.m_iHightmapSize + 1, m_iRot1, m_bFlip1));
                        m_pGTexture.SetPixel(i, j, GetPixel(gt1, i, j - SceneConstant.m_iHightmapSize + 1, m_iRot1, m_bFlip1));
                    }

                    else if (i == SceneConstant.m_iHightmapSize - 1 && j < SceneConstant.m_iHightmapSize - 1)
                    {
                        Color hc1 = GetPixel(ht2, i, j, m_iRot2 + 2, m_bFlip2);
                        Color hc2 = GetPixel(ht1, i - SceneConstant.m_iHightmapSize + 1, j, m_iRot1 + 2, m_bFlip1);
                        m_pHTexture.SetPixel(i, j, hc1 * 0.5f + hc2 * 0.5f);
                        Color gc1 = GetPixel(gt2, i, j, m_iRot2 + 2, m_bFlip2);
                        Color gc2 = GetPixel(gt1, i - SceneConstant.m_iHightmapSize + 1, j, m_iRot1 + 2, m_bFlip1);
                        m_pGTexture.SetPixel(i, j, gc1 * 0.5f + gc2 * 0.5f);
                    }
                    else if (i == SceneConstant.m_iHightmapSize - 1 && j > SceneConstant.m_iHightmapSize - 1)
                    {
                        Color hc1 = GetPixel(ht2, i - SceneConstant.m_iHightmapSize + 1, j - SceneConstant.m_iHightmapSize + 1, m_iRot2, m_bFlip2);
                        Color hc2 = GetPixel(ht1, i, j - SceneConstant.m_iHightmapSize + 1, m_iRot1, m_bFlip1);
                        m_pHTexture.SetPixel(i, j, hc1 * 0.5f + hc2 * 0.5f);
                        Color gc1 = GetPixel(gt2, i - SceneConstant.m_iHightmapSize + 1, j - SceneConstant.m_iHightmapSize + 1, m_iRot2, m_bFlip2);
                        Color gc2 = GetPixel(gt1, i, j - SceneConstant.m_iHightmapSize + 1, m_iRot1, m_bFlip1);
                        m_pGTexture.SetPixel(i, j, gc1 * 0.5f + gc2 * 0.5f);
                    }
                    else if (i > SceneConstant.m_iHightmapSize - 1 && j == SceneConstant.m_iHightmapSize - 1)
                    {
                        Color hc1 = GetPixel(ht1, i - SceneConstant.m_iHightmapSize + 1, j, m_iRot1 + 2, m_bFlip1);
                        Color hc2 = GetPixel(ht2, i - SceneConstant.m_iHightmapSize + 1, j - SceneConstant.m_iHightmapSize + 1, m_iRot2, m_bFlip2);
                        m_pHTexture.SetPixel(i, j, hc1 * 0.5f + hc2 * 0.5f);
                        Color gc1 = GetPixel(gt1, i - SceneConstant.m_iHightmapSize + 1, j, m_iRot1 + 2, m_bFlip1);
                        Color gc2 = GetPixel(gt2, i - SceneConstant.m_iHightmapSize + 1, j - SceneConstant.m_iHightmapSize + 1, m_iRot2, m_bFlip2);
                        m_pGTexture.SetPixel(i, j, gc1 * 0.5f + gc2 * 0.5f);
                    }
                    else if (i < SceneConstant.m_iHightmapSize - 1 && j == SceneConstant.m_iHightmapSize - 1)
                    {
                        Color hc1 = GetPixel(ht2, i, j, m_iRot2 + 2, m_bFlip2);
                        Color hc2 = GetPixel(ht1, i, j - SceneConstant.m_iHightmapSize + 1, m_iRot1, m_bFlip1);
                        m_pHTexture.SetPixel(i, j, hc1 * 0.5f + hc2 * 0.5f);
                        Color gc1 = GetPixel(gt2, i, j, m_iRot2 + 2, m_bFlip2);
                        Color gc2 = GetPixel(gt1, i, j - SceneConstant.m_iHightmapSize + 1, m_iRot1, m_bFlip1);
                        m_pGTexture.SetPixel(i, j, gc1 * 0.5f + gc2 * 0.5f);
                    }

                    else if (i == SceneConstant.m_iHightmapSize - 1 && j == SceneConstant.m_iHightmapSize - 1)
                    {
                        Color hc1 = GetPixel(ht2, i, j, m_iRot2 + 2, m_bFlip2);
                        Color hc2 = GetPixel(ht1, i - SceneConstant.m_iHightmapSize + 1, j, m_iRot1 + 2, m_bFlip1);
                        Color hc3 = GetPixel(ht2, i - SceneConstant.m_iHightmapSize + 1, j - SceneConstant.m_iHightmapSize + 1, m_iRot2, m_bFlip2);
                        Color hc4 = GetPixel(ht1, i, j - SceneConstant.m_iHightmapSize + 1, m_iRot1, m_bFlip1);
                        m_pHTexture.SetPixel(i, j, hc1 * 0.25f + hc2 * 0.25f + hc3 * 0.25f + hc4 * 0.25f);

                        Color gc1 = GetPixel(gt2, i, j, m_iRot2 + 2, m_bFlip2);
                        Color gc2 = GetPixel(gt1, i - SceneConstant.m_iHightmapSize + 1, j, m_iRot1 + 2, m_bFlip1);
                        Color gc3 = GetPixel(gt2, i - SceneConstant.m_iHightmapSize + 1, j - SceneConstant.m_iHightmapSize + 1, m_iRot2, m_bFlip2);
                        Color gc4 = GetPixel(gt1, i, j - SceneConstant.m_iHightmapSize + 1, m_iRot1, m_bFlip1);
                        m_pGTexture.SetPixel(i, j, gc1 * 0.25f + gc2 * 0.25f + gc3 * 0.25f + gc4 * 0.25f);
                    }

                    if (i < 2 * SceneConstant.m_iHightmapSize - 2 && j < 2 * SceneConstant.m_iHightmapSize - 2)
                    {
                        //0-31, 0-31
                        if (i < SceneConstant.m_iHightmapSize - 1 && j < SceneConstant.m_iHightmapSize - 1)
                        {
                            m_pDTexture.SetPixel(i, j, GetPixel(dt2, i, j, m_iRot2 + 2, m_bFlip2));
                        }
                        //32-63, 0-31
                        else if (i >= SceneConstant.m_iHightmapSize - 1 && j < SceneConstant.m_iHightmapSize - 1)
                        {
                            m_pDTexture.SetPixel(i, j, GetPixel(dt1, i - SceneConstant.m_iHightmapSize + 1, j, m_iRot1 + 2, m_bFlip1));
                        }
                        else if (i >= SceneConstant.m_iHightmapSize - 1 && j >= SceneConstant.m_iHightmapSize - 1)
                        {
                            m_pDTexture.SetPixel(i, j, GetPixel(dt2, i - SceneConstant.m_iHightmapSize + 1, j - SceneConstant.m_iHightmapSize + 1, m_iRot2, m_bFlip2));
                        }
                        else if (i < SceneConstant.m_iHightmapSize - 1 && j >= SceneConstant.m_iHightmapSize - 1)
                        {
                            m_pDTexture.SetPixel(i, j, GetPixel(dt1, i, j - SceneConstant.m_iHightmapSize + 1, m_iRot1, m_bFlip1));
                        }
                    }
                }
            }

            m_pHTexture.Apply();
            m_pGTexture.Apply();
            m_pDTexture.Apply();
        }

        EditorGUILayout.BeginHorizontal();

        if (null != m_pHTexture)
        {
            GUILayout.Box(m_pHTexture);
        }
        if (null != m_pGTexture)
        {
            GUILayout.Box(m_pGTexture);
        }
        if (null != m_pDTexture)
        {
            GUILayout.Box(m_pDTexture);
        }

        EditorGUILayout.EndHorizontal();

        if (null != m_pHTexture && null != m_pGTexture && null != m_pDTexture)
        {
            m_sGroundType      = EditorGUILayout.TextField("地图类型:", m_sGroundType);
            m_eSceneEdge       = (ESceneEdgeType)EditorGUILayout.EnumPopup("包边", m_eSceneEdge);
            m_sBattleFieldName = EditorGUILayout.TextField("战场文件名称:", m_sBattleFieldName);
            if (!string.IsNullOrEmpty(m_sBattleFieldName) && null != m_pSceneType[m_sGroundType])
            {
                if (GUILayout.Button("生成场景"))
                {
                    BakeEdge(m_pHTexture, m_pGTexture, m_pDTexture, m_eSceneEdge);

                    m_pWTexture = new Texture2D(SceneConstant.m_iSceneSize, SceneConstant.m_iSceneSize, TextureFormat.RGB565, false);
                    m_pNTexture = new Texture2D(SceneConstant.m_iSceneSize, SceneConstant.m_iSceneSize, TextureFormat.RGB565, false);

                    //Save textures
                    CommonFunctions.CreateFolder(Application.dataPath + "/" + SceneConstant.m_sArtworkPath + "BattleFields/" + m_sBattleFieldName + "/?");
                    File.WriteAllBytes(Application.dataPath + "/" + SceneConstant.m_sArtworkPath + "BattleFields/" + m_sBattleFieldName + "/Heightmap.png", m_pHTexture.EncodeToPNG());
                    File.WriteAllBytes(Application.dataPath + "/" + SceneConstant.m_sArtworkPath + "BattleFields/" + m_sBattleFieldName + "/Griundmap.png", m_pGTexture.EncodeToPNG());
                    File.WriteAllBytes(Application.dataPath + "/" + SceneConstant.m_sArtworkPath + "BattleFields/" + m_sBattleFieldName + "/Decoratemap.png", m_pDTexture.EncodeToPNG());

                    Texture2D wmap, nmap;
                    SceneEditorUtility.CreateGround(m_pHTexture, m_pGTexture, m_pDTexture, SceneConstant.m_sArtworkPath + "BattleFields/" + m_sBattleFieldName + ".asset", m_sGroundType, true, out wmap, out nmap);

                    File.WriteAllBytes(Application.dataPath + "/" + SceneConstant.m_sArtworkPath + "BattleFields/" + m_sBattleFieldName + "/Walkmap.png", wmap.EncodeToPNG());
                    File.WriteAllBytes(Application.dataPath + "/" + SceneConstant.m_sArtworkPath + "BattleFields/" + m_sBattleFieldName + "/Normalmap.png", nmap.EncodeToPNG());
                }
            }
        }
    }
    public static Dictionary <string, string> CreateMeshes(SCharRendererFullInfo[] mesh, Dictionary <string, Rect> rectList,
                                                           string sFileName, int iProgress, int iProgressFull, int iMc, int iSc)
    {
        Dictionary <string, string> ret = new Dictionary <string, string>();

        //Load Mesh
        foreach (SCharRendererFullInfo info in mesh)
        {
            if (!info.m_bDiscard)
            {
                for (int i = 0; i < iMc; ++i)
                {
                    for (int j = 0; j < iSc; ++j)
                    {
                        ++iProgress;
                        EditorUtility.DisplayProgressBar("正在生成Atlas模型", string.Format("{0}/{1}", iProgress, iProgressFull),
                                                         iProgress / (float)iProgressFull);


                        if (!info.m_bCombine)
                        {
                            #region Not Combine

                            string sTexture1 = string.Format("{0}_M{1}S{2}", info.m_sFullTexName, i, j);

                            Mesh theMesh  = (Mesh)EditorCommonFunctions.GetReadWritable(info.m_pMesh);
                            Mesh theMesh1 = new Mesh();

                            theMesh1.SetVertices(theMesh.vertices.ToList());
                            theMesh1.SetTriangles(theMesh.triangles.ToList(), 0);

                            List <Vector2> list1 = new List <Vector2>();
                            for (int k = 0; k < theMesh.uv.Length; ++k)
                            {
                                Vector2 vUV = theMesh.uv[k];
                                if (theMesh.uv[k].x <-0.01f || theMesh.uv[k].y <-0.01f || theMesh.uv[k].x> 1.01f ||
                                                     theMesh.uv[k].y> 1.01f)
                                {
                                    CRuntimeLogger.LogWarning("UV is not in 0 - 1, clampled!: FBX:" +
                                                              CommonFunctions.GetLastName(info.m_sMeshFilterName)
                                                              + " Model:" + info.m_pMesh.name);
                                }

                                vUV.x = Mathf.Clamp01(theMesh.uv[k].x);
                                vUV.y = Mathf.Clamp01(theMesh.uv[k].y);

                                Rect rect1 = rectList[sTexture1];
                                list1.Add(new Vector2(vUV.x * rect1.width + rect1.xMin, vUV.y * rect1.height + rect1.yMin));
                            }
                            theMesh1.uv = list1.ToArray();

                            theMesh1.uv2      = null;
                            theMesh1.normals  = null;
                            theMesh1.colors   = null;
                            theMesh1.tangents = null;

                            ;

                            //Create Mesh
                            string sName1 = string.Format("M{0}S{1}/", i, j) +
                                            CommonFunctions.GetLastName(info.m_sMeshFilterName)
                                            + "_" + info.m_pMesh.name
                                            + "_" + info.m_sFullTexName;

                            AssetDatabase.CreateAsset(theMesh1, "Assets/" + sFileName + sName1 + ".asset");
                            if (ret.ContainsKey(sName1))
                            {
                                CRuntimeLogger.LogWarning("有mesh的FBX文件重名!" + sName1);
                            }
                            else
                            {
                                ret.Add(sName1, "Assets/" + sFileName + sName1 + ".asset");
                            }
                            #endregion
                        }
                        else
                        {
                            #region Combine

                            List <Vector3> poses   = new List <Vector3>();
                            List <int>     indexes = new List <int>();
                            List <Vector2> uvs1    = new List <Vector2>();

                            for (int objIndex = 0; objIndex < info.m_pCombinedMeshObj.Length; ++objIndex)
                            {
                                string sTexture1  = string.Format("{0}_M{1}S{2}", info.m_sTextureNames[objIndex], i, j);
                                Mesh   theMesh    = (Mesh)EditorCommonFunctions.GetReadWritable(info.m_pCombinedMesh[objIndex]);
                                int    iOldPosNum = poses.Count;

                                if (0 == objIndex)
                                {
                                    poses = theMesh.vertices.ToList();
                                }
                                else
                                {
                                    foreach (Vector3 vets in theMesh.vertices)
                                    {
                                        Vector3 worldPos = info.m_pCombinedMeshObj[objIndex].transform.localToWorldMatrix.MultiplyVector(vets) + info.m_pCombinedMeshObj[objIndex].transform.position;
                                        poses.Add(info.m_pCombinedMeshObj[0].transform.worldToLocalMatrix.MultiplyVector(worldPos - info.m_pCombinedMeshObj[0].transform.position));
                                    }
                                }

                                if (0 == objIndex)
                                {
                                    indexes = theMesh.triangles.ToList();
                                }
                                else
                                {
                                    foreach (int oneind in theMesh.triangles)
                                    {
                                        indexes.Add(oneind + iOldPosNum);
                                    }
                                }

                                for (int k = 0; k < theMesh.uv.Length; ++k)
                                {
                                    Vector2 vUV = theMesh.uv[k];
                                    vUV.x = Mathf.Clamp01(theMesh.uv[k].x);
                                    vUV.y = Mathf.Clamp01(theMesh.uv[k].y);
                                    Rect rect1 = rectList[sTexture1];

                                    uvs1.Add(new Vector2(vUV.x * rect1.width + rect1.xMin, vUV.y * rect1.height + rect1.yMin));
                                }
                            }

                            Mesh theMesh1 = new Mesh();

                            theMesh1.SetVertices(poses);
                            theMesh1.SetTriangles(indexes, 0);
                            theMesh1.uv = uvs1.ToArray();

                            theMesh1.uv2      = null;
                            theMesh1.normals  = null;
                            theMesh1.colors   = null;
                            theMesh1.tangents = null;

                            ;

                            //Create Mesh
                            string sName1 = string.Format("M{0}S{1}/cmb_", i, j) +
                                            CommonFunctions.GetLastName(info.m_sMeshFilterName);

                            AssetDatabase.CreateAsset(theMesh1, "Assets/" + sFileName + sName1 + ".asset");
                            if (ret.ContainsKey(sName1))
                            {
                                CRuntimeLogger.LogWarning("有mesh的FBX文件重名!" + sName1);
                            }
                            else
                            {
                                ret.Add(sName1, "Assets/" + sFileName + sName1 + ".asset");
                            }
                            #endregion
                        }
                    }
                }
            }
        }

        return(ret);
    }