コード例 #1
0
    Stack <CombineInfo> GetCombineTree(NumberedHexaTile seed, NumberedHexaTile[] ignoreTiles)
    {
        Stack <CombineInfo> linkedTiles = new Stack <CombineInfo>();

        if (seed != null && seed.hasCell)
        {
            CombineInfo seedInfo = new CombineInfo(seed, 0);
            linkedTiles.Push(seedInfo);

            BuildCombineTree(seedInfo, ignoreTiles, ref linkedTiles);
        }

        return(linkedTiles);
    }
コード例 #2
0
    void BuildCombineTree(CombineInfo seedInfo, NumberedHexaTile[] ignoreTiles, ref Stack <CombineInfo> stack)
    {
        HexaTile[] neighbors = seedInfo.tile.neighbors;
        for (int i = 0, max = neighbors.Length; i < max; ++i)
        {
            NumberedHexaTile neighbor = neighbors[i] as NumberedHexaTile;
            if (neighbor != null &&
                neighbor.hasCell &&
                neighbor.number == seedInfo.tile.number &&
                Array.TrueForAll(stack.ToArray(), st => st.tile != neighbor) &&
                Array.TrueForAll(ignoreTiles, it => it.number != neighbor.number))
            {
                CombineInfo neighborInfo = new CombineInfo(neighbor, seedInfo.depth + 1);

                stack.Push(neighborInfo);

                BuildCombineTree(neighborInfo, ignoreTiles, ref stack);
            }
        }
    }
コード例 #3
0
    IEnumerator CombineTypeC(Stack <CombineInfo> linkedTileInfos)
    {
        int maxDepth = 0;

        CombineInfo[] listInfos = linkedTileInfos.ToArray();
        for (int i = 0, max = listInfos.Length; i < max; ++i)
        {
            if (listInfos[i].depth > maxDepth)
            {
                maxDepth = listInfos[i].depth;
            }
        }

        float durationPerDepth = _cellCombineDuration / maxDepth;

        while (linkedTileInfos.Count > 1)
        {
            CombineInfo      info       = linkedTileInfos.Pop();
            NumberedHexaTile linkedTile = info.tile;
            NumberedHexaTile targetTile = Array.Find(
                linkedTileInfos.ToArray(),
                ci => ci.tile.IsNeighbor(linkedTile)).tile;

            HexaCell cell = linkedTile.cell;
            Vector3  from = cell.transform.position + CELL_MOVE_OFFSET;
            Vector3  to   = targetTile.transform.position + CELL_MOVE_OFFSET;
            cell.LeanMove(from, to, durationPerDepth).
            setEaseInBack().
            setDelay((maxDepth - info.depth) * durationPerDepth).
            setOnComplete(() => linkedTile.Reset());
        }

        for (int i = 0; i < maxDepth; ++i)
        {
            yield return(new WaitForSeconds(durationPerDepth));

            SoundManager.Instance.PlayUISoundInstance(GameConstants.FX_CELL_COMBINING);
        }
    }
コード例 #4
0
        private static void OnUpdate(System.Object obj)
        {
            if (combineQueue.Count > 0)
            {
                CombineInfo    ci  = combineQueue.Peek();
                bool           doo = true;
                CharacterAsset ca;
                for (int i = 0, count = ci.items.Count; i < count; i++)
                {
                    ca = ci.items[i];
                    if (!ca.Check())
                    {
                        doo = false;
                    }
                }

                if (doo)
                {
                    combineQueue.Dequeue();
                    if (ci.packTex)
                    {
                        _Combine(ci);
                    }
                    else
                    {
                        _Combine_NPT(ci);
                    }
                }
            }

            if (curpi != null)
            {
                try
                {
                    if (curpi.texil.Count > 0)
                    {
                        if (Time.realtimeSinceStartup - prevSetPixelTime > 1f)
                        {
                            byte      index  = curpi.texil[0];
                            Texture2D tex    = curpi.tl.texInfo[index].tex;
                            Rect      rect   = curpi.rects[index];
                            Color[]   colors = tex.GetPixels(0, 0, (int)rect.width, (int)rect.height);
                            curTex.SetPixels((int)rect.xMin, (int)rect.yMin, (int)rect.width, (int)rect.height, colors);
                            curpi.texil.RemoveAt(0);
                            prevSetPixelTime = Time.realtimeSinceStartup;
                        }
                    }
                    else
                    {
                        //do
                        if (curTex == null)
                        {
                            return;
                        }

                        Rect rect;
                        for (short i = 0, count = (short)curpi.tl.texInfo.Length; i < count; i++)
                        {
                            rect           = curpi.rects[i];
                            rect.xMin      = rect.xMin / TEX_W;
                            rect.yMin      = rect.yMin / TEX_H;
                            curpi.rects[i] = rect;
                        }
                        curTex.Apply();
                        ProcessCombine(curpi.tl, curTex, curpi.rects);

                        if (piQueue.Count > 0)
                        {
                            curpi = piQueue.Dequeue();
                            CreateTexture2D();
                        }
                        else
                        {
                            curpi  = null;
                            curTex = null;
                        }
                    }
                }
                catch (System.Exception e)
                {
                    if (curpi != null)
                    {
                        if (curpi.tl != null && curpi.tl.endCombine != null)
                        {
                            curpi.tl.endCombine(null, -1, -1, curpi.tl.endParam);
                        }
                    }
                    if (piQueue.Count > 0)
                    {
                        curpi = piQueue.Dequeue();
                    }
                    else
                    {
                        curpi = null;
                    }
                    Debug.LogError("create texture error->" + e.ToString());
                }
            }
        }
コード例 #5
0
        private static void _Combine(CombineInfo combineInfo)
        {
            List <Mesh> meshList = new List <Mesh>();

            try
            {
                CharacterAsset         item = null;
                int                    i, j, k, count, count1, count2;
                List <CombineInstance> combineInstances = new List <CombineInstance>();
                List <Transform>       bones            = new List <Transform>();
                Transform[]            transforms       = combineInfo.root.GetComponentsInChildren <Transform>();


                TexInfo[]           texInfo = new TexInfo[combineInfo.items.Count];
                SkinnedMeshRenderer smr     = null;
                CombineInstance     ci;
                string[]            strs = null;
                string    str            = null;
                Transform transform;
                count2 = transforms.Length;
                count  = (short)combineInfo.items.Count;
                for (i = 0; i < count; i++)
                {
                    item = combineInfo.items[i];
                    smr  = item.GetSkinnedMeshRenderer();
                    if (smr == null)
                    {
                        return;
                    }
                    Mesh mesh = Mesh.Instantiate(smr.sharedMesh) as Mesh;
                    for (j = 0, count1 = smr.sharedMesh.subMeshCount; j < count1; j++)
                    {
                        ci              = new CombineInstance();
                        ci.mesh         = mesh;
                        ci.subMeshIndex = j;
                        combineInstances.Add(ci);
                    }

                    strs = item.GetBoneNames();
                    for (j = 0, count1 = strs.Length; j < count1; j++)
                    {
                        str = strs[j];
                        for (k = 0; k < count2; k++)
                        {
                            transform = transforms[k];
                            if (transform.name != str)
                            {
                                continue;
                            }
                            bones.Add(transform);
                            break;
                        }
                    }

                    meshList.Add(mesh);

                    Object.Destroy(smr.gameObject);
                }

                TempLoad tl     = null;
                string[] strArr = new string[count];

                string destName;
                string path;
                int    size;
                bool   encrypt;
                Example.VersionFile.Type fileType;
                for (i = 0; i < count; i++)
                {
                    item                = combineInfo.items[i];
                    strs                = item.GetTexNames();
                    tl                  = new TempLoad();
                    tl.texInfo          = texInfo;
                    tl.index            = (short)i;
                    tl.combineInstances = combineInstances;
                    tl.bones            = bones;
                    tl.meshList         = meshList;
                    tl.endCombine       = combineInfo.endCombine;
                    tl.endParam         = combineInfo.endParam;
                    tl.root             = combineInfo.root;
                    tl.over             = false;
                    tl.plus             = combineInfo.plus;
                    tl.sub              = combineInfo.sub;
                    tl.autoTemp         = combineInfo.autoTemp;
                    tl.texName          = strArr;
                    tl.light            = combineInfo.light;

                    GameUtils.stringBuilder.Remove(0, GameUtils.stringBuilder.Length);
                    GameUtils.stringBuilder.Append(strs[0]);

                    ResUpdate.GetLoadDetails(GameUtils.stringBuilder.ToString(), out destName, out path, out size, out encrypt, out fileType);
                    strArr[i] = GameUtils.stringBuilder.ToString();
                    ResLoader.LoadByPath(strArr[i], destName, path, fileType, size, OnLoad, tl, combineInfo.autoTemp);
                }
            }
            catch (System.Exception e)
            {
                for (int i = 0; i < meshList.Count; i++)
                {
                    Object.Destroy(meshList[i]);
                }
                if (combineInfo != null && combineInfo.endCombine != null)
                {
                    combineInfo.endCombine(null, -1, -1, combineInfo.endParam);
                }
                Debug.LogError("combine error->" + e.ToString());
            }
        }
コード例 #6
0
        public static void Combine(List <CharacterAsset> items, GameObject root, EndCombine endCombine, System.Object endParam, bool autoTemp, bool light, bool packTex)
        {
            lock (lockClone)
            {
                try
                {
                    int            plus = 0;
                    int            sub = 0;
                    int            i, iid;
                    CharacterAsset item  = null;
                    int            count = (short)items.Count;
                    for (i = 0; i < count; i++)
                    {
                        item = items[i];
                        iid  = item.id;

                        plus += iid;
                        if (sub == 0)
                        {
                            sub = iid;
                        }
                        else
                        {
                            sub -= iid;
                        }
                    }

                    if (combinedDic2.ContainsKey(plus))
                    {
                        Dictionary <int, List <CombineObj> > dic = combinedDic2[plus];
                        if (dic.ContainsKey(sub))
                        {
                            List <CombineObj> list = dic[sub];
                            if (list.Count > 0)
                            {
                                try
                                {
                                    if (!list[0].obj)
                                    {
                                        for (int m = 1; m < list.Count; m++)
                                        {
                                            if (list[m] == null || !list[m].obj)
                                            {
                                                list.RemoveAt(m);
                                                m--;
                                            }
                                        }
                                    }
                                    else
                                    {
                                        GameObject go = (GameObject)Object.Instantiate(list[0].obj);
                                        if (!go.activeSelf)
                                        {
                                            go.SetActive(true);
                                        }

                                        CombineObj co = new CombineObj();
                                        co.obj     = go;
                                        co.combine = false;
                                        list.Add(co);

                                        //add first, then avoid to del in callback
                                        if (endCombine != null)
                                        {
                                            endCombine(go, plus, sub, endParam);
                                        }

                                        Object.Destroy(root);
                                        items.Clear();
                                        return;
                                    }
                                }
                                catch (System.Exception e)
                                {
                                    Debug.LogError("combine body failed 3->" + e.ToString() + "^" + list.Count);
                                }
                            }
                        }
                    }

                    CombineInfo ci = new CombineInfo();
                    ci.items      = items;
                    ci.root       = root;
                    ci.endCombine = endCombine;
                    ci.endParam   = endParam;
                    ci.plus       = plus;
                    ci.sub        = sub;
                    ci.autoTemp   = autoTemp;
                    ci.light      = light;
                    ci.packTex    = packTex;
                    combineQueue.Enqueue(ci);
                }
                catch (System.Exception e)
                {
                    Debug.LogError("combine error->" + e.ToString());
                }
            }
        }
コード例 #7
0
        static void CombineGrassMeshes(GameObject root)
        {
            /*
             * if (LightmapSettings.lightmaps.Length == 0) {
             *  Debug.LogWarning("Grass Combing need the baked lightmaps!");
             *  return;
             * }
             */



            Dictionary <Material, Dictionary <int, List <MeshFilter> > > combinedMesheDatas = new Dictionary <Material, Dictionary <int, List <MeshFilter> > >();

            {
                GrassObject[] details = root.GetComponentsInChildren <GrassObject>();
                for (int i = 0; i < details.Length; i++)
                {
                    MeshFilter meshFilter    = details[i].GetComponent <MeshFilter>();
                    Renderer   renderer      = details[i].GetComponent <MeshRenderer>();
                    Material   material      = renderer.sharedMaterial;
                    int        lightmapIndex = renderer.lightmapIndex;

                    if (material == null)
                    {
                        continue;
                    }

                    /*
                     * if (lightmapIndex < 0) {
                     *  Debug.LogError("Invalid lightmap index: " + meshFilter.name);
                     *  return;
                     * }
                     */

                    if (meshFilter.sharedMesh.vertexCount != 4 && meshFilter.sharedMesh.vertexCount != 8)
                    {
                        Debug.LogError("Invalid grass mesh: " + meshFilter.name);
                        continue;
                    }

                    Dictionary <int, List <MeshFilter> > lightmap2MeshFilters;
                    if (!combinedMesheDatas.TryGetValue(material, out lightmap2MeshFilters))
                    {
                        List <MeshFilter> filters = new List <MeshFilter>();
                        filters.Add(meshFilter);
                        lightmap2MeshFilters = new Dictionary <int, List <MeshFilter> >();
                        lightmap2MeshFilters.Add(lightmapIndex, filters);

                        combinedMesheDatas.Add(material, lightmap2MeshFilters);
                    }
                    else
                    {
                        List <MeshFilter> filters;
                        if (!lightmap2MeshFilters.TryGetValue(lightmapIndex, out filters))
                        {
                            filters = new List <MeshFilter>();
                            filters.Add(meshFilter);
                            lightmap2MeshFilters.Add(lightmapIndex, filters);
                        }
                        else
                        {
                            filters.Add(meshFilter);
                        }
                    }
                }
            }



            foreach (KeyValuePair <Material, Dictionary <int, List <MeshFilter> > > combinedInfo in combinedMesheDatas)
            {
                Material materal = combinedInfo.Key;
                foreach (KeyValuePair <int, List <MeshFilter> > kvp in combinedInfo.Value)
                {
                    int lightmapIndex = kvp.Key;
                    List <MeshFilter>  meshFilters  = kvp.Value;
                    CombineInfo[]      combine      = new CombineInfo[meshFilters.Count];
                    List <CombinePart> combineParts = new List <CombinePart>();

                    int maxVertices = 0;
                    int startIndex  = 0;
                    for (int i = 0; i < meshFilters.Count; i++)
                    {
                        combine[i] = new CombineInfo();
                        Mesh mesh = meshFilters[i].sharedMesh;
                        combine[i]._mesh   = mesh;
                        combine[i]._matrix = meshFilters[i].transform.localToWorldMatrix;
                        combine[i]._lightmapTilingOffset = meshFilters[i].GetComponent <Renderer>().lightmapScaleOffset;
                        maxVertices += mesh.vertexCount;
                        if (maxVertices > 20000)    // 21.9k vertices limit
                        //Debug.Log(maxVertices);
                        {
                            CombinePart part = new CombinePart();
                            part._startIndex  = startIndex;
                            part._length      = i - startIndex;
                            part._maxVertices = maxVertices - mesh.vertexCount;
                            combineParts.Add(part);

                            startIndex  = i;
                            maxVertices = mesh.vertexCount;
                        }
                    }
                    CombinePart lastPart = new CombinePart();
                    lastPart._startIndex  = startIndex;
                    lastPart._length      = meshFilters.Count - startIndex;
                    lastPart._maxVertices = maxVertices;
                    combineParts.Add(lastPart);


                    for (int i = 0; i < combineParts.Count; i++)
                    {
                        CombinePart combinePart = combineParts[i];

                        GameObject go = new GameObject("__CombinedMeshes__");
                        go.hideFlags = HideFlags.NotEditable;
                        go.AddComponent <CombinedGrassMesh>();
                        // go.layer = LayerMask.NameToLayer("Vegetation");
                        go.transform.SetParent(root.transform);

                        MeshFilter meshfilter = go.AddComponent <MeshFilter>();
                        Mesh       newMesh    = GetCombinedMeshes(combine, combinePart._startIndex, combinePart._length, combinePart._maxVertices);
                        newMesh.name    = "CombinedMesh";
                        meshfilter.mesh = newMesh;
                        MeshRenderer meshRenderer = go.AddComponent <MeshRenderer>();
                        meshRenderer.lightmapIndex = lightmapIndex;

                        /*
                         * Shader replacementShader = GetReplacementShader(materal.shader.name);
                         * Material newMaterial = new Material(replacementShader);
                         * newMaterial.name = materal.name;
                         * newMaterial.mainTexture = materal.mainTexture;
                         * newMaterial.SetTexture("_LightMap", LightmapSettings.lightmaps[lightmapIndex].lightmapFar);
                         * newMaterial.SetFloat("_Cutoff", materal.GetFloat("_Cutoff"));
                         * if (materal.shader.name.Contains("Self-Illumin")) {
                         *  newMaterial.SetFloat("_IllumStrength", materal.GetFloat("_IllumStrength"));
                         *  newMaterial.SetTexture("_SpecIllumReflTex", materal.GetTexture("_SpecIllumReflTex"));
                         * }
                         * meshRenderer.material = newMaterial;
                         */
                        meshRenderer.sharedMaterial = materal;
                        go.SetActive(false);
                    }
                }
            }
        }
コード例 #8
0
        private static void _Combine_NPT(CombineInfo combineInfo)
        {
            List <Mesh> meshList = new List <Mesh>();

            try
            {
                CharacterAsset         item = null;
                int                    i, j, k, count, count1, count2;
                List <CombineInstance> combineInstances = new List <CombineInstance>();
                List <Transform>       bones            = new List <Transform>();
                List <Material>        materials        = new List <Material>();
                Transform[]            transforms       = combineInfo.root.GetComponentsInChildren <Transform>();

                SkinnedMeshRenderer smr = null;
                CombineInstance     ci;
                string[]            strs = null;
                string    str            = null;
                Transform transform;
                count2 = transforms.Length;
                count  = combineInfo.items.Count;
                for (i = 0; i < count; i++)
                {
                    item = combineInfo.items[i];
                    smr  = item.GetSkinnedMeshRenderer();
                    if (smr == null)
                    {
                        return;
                    }

                    materials.AddRange(smr.materials);

                    Mesh mesh = Mesh.Instantiate(smr.sharedMesh) as Mesh;
                    for (j = 0, count1 = smr.sharedMesh.subMeshCount; j < count1; j++)
                    {
                        ci              = new CombineInstance();
                        ci.mesh         = mesh;
                        ci.subMeshIndex = j;
                        combineInstances.Add(ci);
                    }

                    strs = item.GetBoneNames();
                    for (j = 0, count1 = strs.Length; j < count1; j++)
                    {
                        str = strs[j];
                        for (k = 0; k < count2; k++)
                        {
                            transform = transforms[k];
                            if (transform.name != str)
                            {
                                continue;
                            }
                            bones.Add(transform);
                            break;
                        }
                    }

                    meshList.Add(mesh);

                    Object.Destroy(smr.gameObject);
                }

                TempLoad_NPT tl = new TempLoad_NPT();
                tl.combineInstances = combineInstances;
                tl.bones            = bones;
                tl.meshList         = meshList;
                tl.materials        = materials;
                tl.endCombine       = combineInfo.endCombine;
                tl.endParam         = combineInfo.endParam;
                tl.root             = combineInfo.root;
                tl.plus             = combineInfo.plus;
                tl.sub   = combineInfo.sub;
                tl.light = combineInfo.light;

                ProcessCombine(tl);
            }
            catch (System.Exception e)
            {
                if (combineInfo != null && combineInfo.endCombine != null)
                {
                    combineInfo.endCombine(null, -1, -1, combineInfo.endParam);
                }
                Debug.LogError("combine error->" + e.ToString() + "\r\n" + e.StackTrace);
            }
        }