Ejemplo n.º 1
0
    public override void ProcessReqsImmediatly()
    {
        try
        {
            while (mReqs.Count != 0)
            {
                RedGrass.RGChunk chunk = null;

                lock (mReqs)
                {
                    chunk = mReqs.Dequeue();
                }

                BinaryReader _in        = new BinaryReader(mOrgnGrassFile);
                INTVECTOR3   chunk32Pos = ChunkPosToPos32(chunk.xIndex, chunk.zIndex);
                int          expands    = mEvni.CHUNKSIZE / mEvni.Tile;

                lock (chunk)
                {
                    for (int _x = chunk32Pos.x; _x < chunk32Pos.x + expands; ++_x)
                    {
                        for (int _z = chunk32Pos.z; _z < chunk32Pos.z + expands; ++_z)
                        {
                            int index32 = Pos32ToIndex32(_x, _z);
                            _in.BaseStream.Seek(mOrgnOfsData[index32], SeekOrigin.Begin);
                            int count = mOrgnLenData[index32];
                            for (int i = 0; i < count; ++i)
                            {
                                RedGrass.RedGrassInstance rgi = new RedGrassInstance();

                                rgi.ReadFromStream(_in);

                                chunk.Write(rgi);
                            }
                        }
                    }
                }
            }
        }
        catch (System.Exception ex)
        {
            Debug.LogError(ex.ToString());
        }
    }
Ejemplo n.º 2
0
    public static void SaveToOriginalFile()
    {
        RedGrass.EvniAsset evni = Resources.Load(s_EvniPath) as RedGrass.EvniAsset;
        if (evni == null)
        {
            Debug.LogError("EvniAsset is missiing");
        }

        // Open or Create original subterrain data file
        FileStream orgnGrassFile = null;

        int[] orgnOfsData = new int[evni.XZTileCount];
        int[] orgnLenData = new int[evni.XZTileCount];
        if (File.Exists(s_orgnFilePath))
        {
            orgnGrassFile = new FileStream(s_orgnFilePath, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite);
            {
                BinaryReader _in = new BinaryReader(orgnGrassFile);

                for (int i = 0; i < evni.XZTileCount; ++i)
                {
                    orgnOfsData[i] = _in.ReadInt32();
                    orgnLenData[i] = _in.ReadInt32();
                }
            }
        }
        else
        {
            orgnGrassFile = new FileStream(s_orgnFilePath, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite);
        }

        // Merge the cache
        string[] raw_file_path = Directory.GetFiles(RGDemoEditorSaver.s_FileDirectory);
        Dictionary <int, Dictionary <INTVECTOR3, RedGrassInstance> > raw_file_add = new Dictionary <int, Dictionary <INTVECTOR3, RedGrassInstance> >();
        List <int>    version_list    = new List <int>();
        List <string> tempfile_to_del = new List <string>();

        for (int i = 0; i < raw_file_path.Length; i++)
        {
            EditorUtility.DisplayProgressBar("Merging Grasses...", "Read raw data.. (" + (i + 1).ToString() + " of " + raw_file_path.Length.ToString() + ")", 0.2f * ((float)(i) / (float)(raw_file_path.Length)));

            // the expanded-name must be "gs"
            if (raw_file_path[i].Substring(raw_file_path[i].LastIndexOf(".") + 1) != "gs")
            {
                continue;
            }

            // Read the caches
            using (FileStream raw_files = new FileStream(raw_file_path[i], FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite))
            {
                BinaryReader _in     = new BinaryReader(raw_files);
                int          version = _in.ReadInt32();
                version_list.Add(version);
                int cnt = _in.ReadInt32();

                raw_file_add.Add(version, new Dictionary <INTVECTOR3, RedGrassInstance>());
                for (int j = 0; j < cnt; ++j)
                {
                    RedGrassInstance rgi = new RedGrassInstance();
                    rgi.ReadFromStream(_in);
                    INTVECTOR3 index = Utils.WorldPosToVoxelPos(rgi.Position);
                    raw_file_add[version][index] = rgi;
                }
            }

            tempfile_to_del.Add(raw_file_path[i]);
        }

        if (version_list.Count == 0)
        {
            EditorUtility.ClearProgressBar();
            EditorUtility.DisplayDialog("Merging Grasses", "Nothing changed !", "OK");
            return;
        }

        // Descending order the version_list
        version_list.Sort(delegate(int small, int big) {
            if (small > big)
            {
                return(-1);
            }
            else if (small == big)
            {
                return(0);
            }
            else
            {
                return(1);
            }
        });

        // Merge cache to a list

        List <RedGrassInstance> file_add = new List <RedGrassInstance>();

        for (int i = 0; i < version_list.Count; ++i)
        {
            int version = version_list[i];

            // Add to list
            foreach (KeyValuePair <INTVECTOR3, RedGrassInstance> kvp in raw_file_add[version])
            {
                for (int j = i + 1; j < version_list.Count; ++j)
                {
                    int l_version = version_list[j];

                    if (raw_file_add[l_version].ContainsKey(kvp.Key))
                    {
                        raw_file_add[l_version].Remove(kvp.Key);
                    }
                }

                file_add.Add(kvp.Value);
            }
        }

        #region READ_ORIGINAL_FILE & REFRESH_DATA

        // Read old original file data
        Dictionary <INTVECTOR3, RedGrassInstance>[] old_datas = new Dictionary <INTVECTOR3, RedGrassInstance> [evni.XZTileCount];
        {
            string fileName = s_orgnFilePath.Substring(s_orgnFilePath.LastIndexOf("/") + 1);
            // Read now
            BinaryReader _in = new BinaryReader(orgnGrassFile);
            for (int j = 0; j < evni.XZTileCount; ++j)
            {
                if (j % 100 == 0)
                {
                    EditorUtility.DisplayProgressBar("Merging Grasses...", "Read file " + fileName + " data.." + (j + 1).ToString() + " of " + evni.XZTileCount.ToString() + ")",
                                                     ((float)(j) / (float)evni.XZTileCount));
                }

                old_datas[j] = new Dictionary <INTVECTOR3, RedGrassInstance>();

                if (orgnLenData[j] == 0)
                {
                    continue;
                }

                _in.BaseStream.Seek(orgnOfsData[j], SeekOrigin.Begin);
                int count = orgnLenData[j];
                for (int k = 0; k < count; ++k)
                {
                    RedGrassInstance rgi = new RedGrassInstance();
                    rgi.ReadFromStream(_in);
                    INTVECTOR3 index = Utils.WorldPosToVoxelPos(rgi.Position);
                    old_datas[j][index] = rgi;
                }
            }
        }

        // Add

        int _per = 0;
        foreach (RedGrassInstance rgi in file_add)
        {
            INTVECTOR3 w_i      = Utils.WorldPosToVoxelPos(rgi.Position);
            int        f_startX = evni.XStart;
            int        f_startZ = evni.ZStart;

            if (_per % 100 == 0)
            {
                EditorUtility.DisplayProgressBar("Merging Grasses...", "Calculate the Grasses...",
                                                 ((float)(_per) / (float)file_add.Count));
            }

//            for (int i = 0; i < evni.XZTileCount; ++i)
//			{
//				if (old_datas[i].ContainsKey(w_i))
//				{
//					old_datas[i][w_i] = rgi;
//					break;
//				}
//				else
//				{
//
//					int x = i % evni.XTileCount;
//					int z = i / evni.ZTileCount;
//					int startX = f_startX + x * evni.Tile;
//					int startZ = f_startZ + z * evni.Tile;
//					if (w_i.x >= startX && w_i.x < startX + evni.Tile
//					    && w_i.z >= startZ && w_i.z < startZ + evni.Tile)
//					{
//						old_datas[i].Add(w_i, rgi);
//						break;
//					}
//
//				}
//			}

            int chunk_x = ((int)w_i.x - f_startX) / evni.Tile;
            int chunk_z = ((int)w_i.z - f_startZ) / evni.Tile;
            int key     = chunk_x + chunk_z * evni.XTileCount;


            old_datas[key][w_i] = rgi;
//			RGScene
            _per++;
        }

        file_add.Clear();

        #endregion



        // Save to a series of Temp file
        string file_name = s_mergedFilePath;


        using (FileStream fs = new FileStream(file_name, FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite))
        {
            BinaryWriter _w = new BinaryWriter(fs);

            int[] offsets = new int[evni.XZTileCount];
            int[] lens    = new int[evni.XZTileCount];
            _w.Seek(evni.XZTileCount * 4 * 2, SeekOrigin.Begin);
            // Write Grass data
            for (int i = 0; i < evni.XZTileCount; i++)
            {
                if (i % 100 == 0)
                {
                    EditorUtility.DisplayProgressBar("Merging Grasses...", "Merge file data.. (" + (i + 1).ToString() + " of " + evni.XZTileCount.ToString() + ")",
                                                     ((float)(i) / (float)evni.XZTileCount));
                }
                offsets[i] = (int)fs.Position;

                if (old_datas[i].Count == 0)
                {
                    offsets[i] = 0;
                    continue;
                }

//				_w.Write(old_datas[i].Count);
                lens[i] = old_datas[i].Count;
                foreach (RedGrassInstance rgi in old_datas[i].Values)
                {
                    rgi.WriteToStream(_w);
                }
            }
            // Write Offset
            _w.Seek(0, SeekOrigin.Begin);
            for (int i = 0; i < evni.XZTileCount; i++)
            {
                _w.Write(offsets[i]);
                _w.Write(lens[i]);
            }


            fs.Close();
        }

        // Merge complete
        EditorUtility.ClearProgressBar();
        if (EditorUtility.DisplayDialog("Merge complete!", "Do you want to make it work ?", "Yes", "No"))
        {
            // Make it work

            File.Copy(s_mergedFilePath, s_orgnFilePath, true);

            // delete temp file
            File.Delete(s_mergedFilePath);
            if (File.Exists(s_mergedFilePath + ".meta"))
            {
                File.Delete(s_mergedFilePath + ".meta");
            }

            foreach (string tmpfile in tempfile_to_del)
            {
                if (File.Exists(tmpfile))
                {
                    File.Copy(tmpfile, tmpfile + ".bak", true);
                    File.Delete(tmpfile);
                }
            }
        }
        else
        {
            // Don't make it work
            File.Delete(s_mergedFilePath);
            if (File.Exists(s_mergedFilePath + ".meta"))
            {
                File.Delete(s_mergedFilePath + ".meta");
            }
        }
    }
Ejemplo n.º 3
0
    void GenOneTile()
    {
        if (idx == xzcount)
        {
            w.Seek(0, SeekOrigin.Begin);
            for (int i = 0; i < xzcount; ++i)
            {
                w.Write(offsets[i]);
                w.Write(lens[i]);
            }
            w.Close();
            fs.Close();
            MonoBehaviour.Destroy(this);
            return;
        }

        offsets[idx] = (int)(fs.Position);
        RaycastHit   rch;
        SimplexNoise noise = new SimplexNoise();

        for (int _x = 0; _x < tile; ++_x)
        {
            for (int _z = 0; _z < tile; ++_z)
            {
                Vector3 pos = new Vector3(x + _x + 0.5f, 1043, z + _z + 0.5f);
                float   ns  = (float)(noise.Noise(pos.x / 64.0f, pos.y / 64.0f, pos.z / 64.0f));
                float   nst = (float)(noise.Noise(pos.y / 100.0f, pos.z / 100.0f, pos.x / 100.0f));
                if (ns < -0.48f)
                {
                    continue;
                }
                float p = Mathf.Clamp01((float)(ns) + 0.5f);
                if (Physics.Raycast(pos, Vector3.down, out rch, 1000, 1 << Pathea.Layer.VFVoxelTerrain))
                {
                    RedGrassInstance vgi = new RedGrassInstance();
                    vgi.Position = rch.point;
                    vgi.Density  = p;
                    vgi.Normal   = rch.normal;
                    vgi.ColorF   = Color.white;
                    if (Random.value > Mathf.Sqrt(rch.normal.y))
                    {
                        vgi.Prototype = nst > 0 ? 64 : 65;
                        allGrasses[idx].Add(vgi);
                    }
                    vgi.Prototype = nst > 0 ? 0 : 1;
                    allGrasses[idx].Add(vgi);
                    Debug.DrawRay(rch.point, rch.normal, new Color(rch.normal.x * 0.5f + 0.5f, rch.normal.y * 0.5f + 0.5f, rch.normal.z * 0.5f + 0.5f), 1);
                }
            }
        }
        lens[idx] = allGrasses[idx].Count;

        foreach (RedGrassInstance vgi in allGrasses[idx])
        {
            vgi.WriteToStream(w);
        }
        allGrasses[idx].Clear();

        x += tile;
        if (x > xend - 1)
        {
            z += tile;
            x  = xstart;
        }
        idx++;
        Debug.Log(idx.ToString());
    }
Ejemplo n.º 4
0
    // Thread function
    void Run()
    {
        try
        {
            while (mRunning)
            {
                if (!mActive)
                {
                    Thread.Sleep(10);
                    continue;
                }

                while (true)
                {
                    RedGrass.RGChunk chunk = null;

                    lock (mReqs)
                    {
                        if (mReqs.Count == 0)
                        {
                            break;
                        }
                        chunk = mReqs.Dequeue();
                    }

                    if (mOrgnGrassFile == null)
                    {
                        continue;
                    }
                    BinaryReader _in        = new BinaryReader(mOrgnGrassFile);
                    INTVECTOR3   chunk32Pos = ChunkPosToPos32(chunk.xIndex, chunk.zIndex);
                    int          expands    = mEvni.CHUNKSIZE / mEvni.Tile;

                    lock (chunk)
                    {
                        for (int _x = chunk32Pos.x; _x < chunk32Pos.x + expands; ++_x)
                        {
                            for (int _z = chunk32Pos.z; _z < chunk32Pos.z + expands; ++_z)
                            {
                                int index32 = Pos32ToIndex32(_x, _z);
                                _in.BaseStream.Seek(mOrgnOfsData[index32], SeekOrigin.Begin);
                                int count = mOrgnLenData[index32];
                                for (int i = 0; i < count; ++i)
                                {
                                    RedGrass.RedGrassInstance rgi = new RedGrassInstance();

                                    rgi.ReadFromStream(_in);

                                    chunk.Write(rgi);
                                }
                            }
                        }
                    }
                }
                mStart = false;

                Thread.Sleep(10);
            }
        }
        catch (System.Exception ex)
        {
            Debug.LogError("<<<< Data IO Thread error >>>> \r\n" + ex);
        }
    }
Ejemplo n.º 5
0
    public static void SaveToOriginalFile()
    {
        RedGrass.EvniAsset evni = Resources.Load(s_EvniPath) as RedGrass.EvniAsset;
        if (evni == null)
        {
            Debug.LogError("EvniAsset is missiing");
        }

        // Open original subterrain data file
        FileStream[] orgnGrassFiles = new FileStream[9];
        int[,]  orgnOfsData = new int[9, evni.XZTileCount];

        for (int i = 0; i < 9; ++i)
        {
            orgnGrassFiles[i] = new FileStream(s_orgnFilePath[i], FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite);
            BinaryReader _in = new BinaryReader(orgnGrassFiles[i]);
            for (int j = 0; j < evni.XZTileCount; ++j)
            {
                orgnOfsData[i, j] = _in.ReadInt32();
            }
        }

        #region MERGE_CACHES
        // Merge the cache
        Dictionary <int, List <RedGrassInstance> > file_add_dic = new Dictionary <int, List <RedGrassInstance> >();

        string[] raw_file_path = Directory.GetFiles(GameConfig.GetUserDataPath() + GameConfig.CreateSystemData + "/Grasses/");
        Dictionary <int, Dictionary <INTVECTOR3, RedGrassInstance> > raw_file_add = new Dictionary <int, Dictionary <INTVECTOR3, RedGrassInstance> >();
        List <int>            version_list      = new List <int>();
        Dictionary <int, int> modify_file_index = new Dictionary <int, int>();
        List <string>         tempfile_to_del   = new List <string>();

        for (int i = 0; i < raw_file_path.Length; i++)
        {
            EditorUtility.DisplayProgressBar("Merging Grasses...", "Read raw data.. (" + (i + 1).ToString() + " of " + raw_file_path.Length.ToString() + ")", 0.2f * ((float)(i) / (float)(raw_file_path.Length)));

            // the expanded-name must be "gs"
            if (raw_file_path[i].Substring(raw_file_path[i].LastIndexOf(".") + 1) != "gs")
            {
                continue;
            }

            // Read the caches
            // Read the caches
            using (FileStream raw_files = new FileStream(raw_file_path[i], FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite))
            {
                BinaryReader _in     = new BinaryReader(raw_files);
                int          version = _in.ReadInt32();
                version_list.Add(version);
                int cnt = _in.ReadInt32();

                raw_file_add.Add(version, new Dictionary <INTVECTOR3, RedGrassInstance>());
                for (int j = 0; j < cnt; ++j)
                {
                    RedGrassInstance rgi = new RedGrassInstance();
                    rgi.ReadFromStream(_in);
                    INTVECTOR3 index = Utils.WorldPosToVoxelPos(rgi.Position);
                    raw_file_add[version][index] = rgi;
                }
            }

            tempfile_to_del.Add(raw_file_path[i]);
        }

        if (version_list.Count == 0)
        {
            EditorUtility.ClearProgressBar();
            EditorUtility.DisplayDialog("Merging Grasses", "Nothing changed !", "OK");
            return;
        }

        // Descending order the version_list
        version_list.Sort(delegate(int small, int big) {
            if (small > big)
            {
                return(-1);
            }
            else if (small == big)
            {
                return(0);
            }
            else
            {
                return(1);
            }
        });

        // Merge cache to a list
        for (int i = 0; i < version_list.Count; ++i)
        {
            int version = version_list[i];


            // Add to list
            foreach (KeyValuePair <INTVECTOR3, RedGrassInstance> kvp in raw_file_add[version])
            {
                for (int j = i + 1; j < version_list.Count; ++j)
                {
                    int l_version = version_list[j];
                    if (raw_file_add[l_version].ContainsKey(kvp.Key))
                    {
                        raw_file_add[l_version].Remove(kvp.Key);
                    }
                }

                // which the orgin file the vgi in
                Vector3    pos        = kvp.Value.Position;
                INTVECTOR3 chunkPos   = new INTVECTOR3((int)pos.x >> evni.SHIFT, 0, (int)pos.z >> evni.SHIFT);
                INTVECTOR3 chunk32Pos = ChunkPosToPos32(chunkPos.x, chunkPos.z, evni);
                int        f_index    = FindOrginFileIndex(chunk32Pos, evni);
                if (f_index != -1)
                {
                    if (file_add_dic.ContainsKey(f_index))
                    {
                        file_add_dic[f_index].Add(kvp.Value);
                    }
                    else
                    {
                        file_add_dic.Add(f_index, new List <RedGrassInstance>());
                        file_add_dic[f_index].Add(kvp.Value);
                    }

                    if (!modify_file_index.ContainsKey(f_index))
                    {
                        modify_file_index.Add(f_index, f_index);
                    }
                }
            }
        }
        #endregion

        #region READ_ORIGINAL_FILE & REFRESH_DATA

        // Read old original file data
        Dictionary <int, Dictionary <INTVECTOR3, RedGrassInstance>[]> old_datas = new Dictionary <int, Dictionary <INTVECTOR3, RedGrassInstance>[]>();

        foreach (int f_i in modify_file_index.Keys)
        {
            string fileName = s_orgnFilePath[f_i].Substring(s_orgnFilePath[f_i].LastIndexOf("/") + 1);

            old_datas.Add(f_i, new Dictionary <INTVECTOR3, RedGrassInstance> [evni.XZTileCount]);
            //Read now
            BinaryReader _in = new BinaryReader(orgnGrassFiles[f_i]);
            for (int j = 0; j < evni.XZTileCount; ++j)
            {
                if (j % 100 == 0)
                {
                    EditorUtility.DisplayProgressBar("Merging Grasses...", "Read file " + fileName + " data.." + (j + 1).ToString() + " of " + evni.XZTileCount.ToString() + ")",
                                                     ((float)(j) / (float)evni.XZTileCount));
                }

                old_datas[f_i][j] = new Dictionary <INTVECTOR3, RedGrassInstance>();

                if (orgnOfsData[f_i, j] == 0)
                {
                    continue;
                }

                _in.BaseStream.Seek(orgnOfsData[f_i, j], SeekOrigin.Begin);
                int count = _in.ReadInt32();
                for (int k = 0; k < count; ++k)
                {
                    RedGrassInstance vgi = new RedGrassInstance();
                    vgi.ReadFromStream(_in);
                    INTVECTOR3 index = Utils.WorldPosToVoxelPos(vgi.Position);
                    old_datas[f_i][j][index] = vgi;
                }
            }
        }

        // Add

        foreach (int f_i in file_add_dic.Keys)
        {
            int _per = 0;
            foreach (RedGrassInstance rgi in file_add_dic[f_i])
            {
                INTVECTOR3 w_i      = Utils.WorldPosToVoxelPos(rgi.Position);
                int        fileX    = f_i % evni.FileXCount;
                int        fileZ    = f_i / evni.FlieZCount;
                int        f_startX = evni.XStart + fileX * evni.XTileCount * evni.Tile;
                int        f_startZ = evni.ZStart + fileZ * evni.ZTileCount * evni.Tile;

                if (_per % 100 == 0)
                {
                    EditorUtility.DisplayProgressBar("Merging Grasses...", "Calculate the Grasses of file " + f_i.ToString() + "...",
                                                     ((float)(_per) / (float)file_add_dic[f_i].Count));
                }

                int chunk_x = ((int)w_i.x - f_startX) / evni.Tile;
                int chunk_z = ((int)w_i.z - f_startZ) / evni.Tile;
                int key     = chunk_x + chunk_z * evni.XTileCount;

                old_datas[f_i][key][w_i] = rgi;

                _per++;
            }
        }

        file_add_dic.Clear();
        #endregion


        // Save to a series of Temp file
        foreach (int f_i in modify_file_index.Keys)
        {
            string file_name = s_mergedFilePath[f_i];

            using (FileStream fs = new FileStream(file_name, FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite))
            {
                BinaryWriter _w = new BinaryWriter(fs);

                int[] offsets = new int[evni.XZTileCount];
                _w.Seek(evni.XZTileCount * 4, SeekOrigin.Begin);
                // Write Grass data
                for (int i = 0; i < evni.XZTileCount; i++)
                {
                    if (i % 100 == 0)
                    {
                        EditorUtility.DisplayProgressBar("Merging Grasses...", "Merge file data.. (" + (i + 1).ToString() + " of " + evni.XZTileCount.ToString() + ")",
                                                         ((float)(i) / (float)evni.XZTileCount));
                    }

                    offsets[i] = (int)fs.Position;

                    if (old_datas[f_i][i].Count == 0)
                    {
                        offsets[i] = 0;
                        continue;
                    }

                    _w.Write(old_datas[f_i][i].Count);
                    foreach (RedGrassInstance rgi in old_datas[f_i][i].Values)
                    {
                        rgi.WriteToStream(_w);
                    }
                }

                // write offset
                _w.Seek(0, SeekOrigin.Begin);
                for (int i = 0; i < evni.XZTileCount; i++)
                {
                    _w.Write(offsets[i]);
                }

                fs.Close();
            }
        }

        // Merge complete
        EditorUtility.ClearProgressBar();
        if (EditorUtility.DisplayDialog("Merge complete!", "Do you want to make it work ?", "Yes", "No"))
        {
            // Make it work
            foreach (int f_i in modify_file_index.Keys)
            {
                File.Copy(s_mergedFilePath[f_i], s_orgnFilePath[f_i], true);

                // delete temp file
                File.Delete(s_mergedFilePath[f_i]);
                if (File.Exists(s_mergedFilePath[f_i] + ".meta"))
                {
                    File.Delete(s_mergedFilePath[f_i] + ".meta");
                }

                foreach (string tmpfile in tempfile_to_del)
                {
                    if (File.Exists(tmpfile))
                    {
                        File.Copy(tmpfile, tmpfile + ".bak", true);
                        File.Delete(tmpfile);
                    }
                }
            }
        }
        else
        {
            // Don't make it work
            foreach (int f_i in modify_file_index.Keys)
            {
                File.Delete(s_mergedFilePath[f_i]);
                if (File.Exists(s_mergedFilePath[f_i] + ".meta"))
                {
                    File.Delete(s_mergedFilePath[f_i] + ".meta");
                }
            }
        }

        // Close the file
        for (int i = 0; i < 9; ++i)
        {
            orgnGrassFiles[i].Close();
        }
    }
    void Run()
    {
        try
        {
            while (mRunning)
            {
                if (!mActive)
                {
                    Thread.Sleep(10);
                    continue;
                }

                Monitor.TryEnter(VFDataRTGen.s_dicGrassInstList);

                try
                {
                    while (true)
                    {
                        RGChunk chunk = null;

                        lock (mReqs)
                        {
                            if (mReqs.Count == 0)
                            {
                                break;
                            }
                            chunk = mReqs.Dequeue();
                        }


                        INTVECTOR3 chunk32Pos = ChunkPosToPos32(chunk.xIndex, chunk.zIndex);

                        int expands = mEvni.CHUNKSIZE / mEvni.Tile;

                        lock (chunk)
                        {
                            for (int x = chunk32Pos.x; x < chunk32Pos.x + expands; ++x)
                            {
                                for (int z = chunk32Pos.z; z < chunk32Pos.z + expands; ++z)
                                {
                                    IntVector2 key = new IntVector2(x, z);
                                    if (VFDataRTGen.s_dicGrassInstList.ContainsKey(key))
                                    {
                                        foreach (VoxelGrassInstance vgi in VFDataRTGen.s_dicGrassInstList[key])
                                        {
                                            RedGrassInstance rgi = new RedGrassInstance();
                                            rgi.CopyTo(vgi);

                                            Vector3 pos = rgi.Position;
                                            if (!GrassDataSL.m_mapDelPos.ContainsKey(new INTVECTOR3((int)pos.x, (int)pos.y, (int)pos.z)))
                                            {
                                                chunk.Write(rgi);
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
                finally
                {
                    Monitor.Exit(VFDataRTGen.s_dicGrassInstList);
                }

                mStart = false;
                Thread.Sleep(10);
            }
        }
        catch (System.Exception ex)
        {
            Debug.LogError(ex.ToString());
        }
    }
Ejemplo n.º 7
0
    void Run()
    {
        try
        {
            while (mRunning)
            {
                if (!mActive)
                {
                    Thread.Sleep(10);
                    continue;
                }

                while (true)
                {
                    RGChunk chunk = null;

                    lock (mReqs)
                    {
                        if (mReqs.Count == 0)
                        {
                            break;
                        }
                        chunk = mReqs.Dequeue();
                    }

                    lock (mDestoryLockObj)
                    {
                        INTVECTOR3 chunk32Pos = ChunkPosToPos32(chunk.xIndex, chunk.zIndex);

                        // Find the file index
                        int file_index = FindOrginFileIndex(chunk32Pos);

                        if (file_index != -1 && mOrgnGrassFile[file_index] != null)
                        {
                            BinaryReader _in = new BinaryReader(mOrgnGrassFile[file_index]);

                            int expands = mEvni.CHUNKSIZE / mEvni.Tile;

                            lock (chunk)
                            {
                                for (int x = chunk32Pos.x; x < chunk32Pos.x + expands; ++x)
                                {
                                    for (int z = chunk32Pos.z; z < chunk32Pos.z + expands; ++z)
                                    {
                                        int _x = x % mEvni.XTileCount;
                                        int _z = z % mEvni.ZTileCount;

                                        int index32 = Pos32ToIndex32(_x, _z);

                                        if (mOrgnOfsData[file_index, index32] > 0)
                                        {
                                            _in.BaseStream.Seek(mOrgnOfsData[file_index, index32], SeekOrigin.Begin);
                                            int count = _in.ReadInt32();

                                            for (int i = 0; i < count; ++i)
                                            {
                                                RedGrassInstance rgi = new RedGrassInstance();
                                                rgi.ReadFromStream(_in);

                                                Vector3 pos = rgi.Position;
                                                if (!GrassDataSL.m_mapDelPos.ContainsKey(new INTVECTOR3((int)pos.x, (int)pos.y, (int)pos.z)))
                                                {
                                                    chunk.Write(rgi);
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }

                mStart = false;

                Thread.Sleep(10);
            }
        }
        catch (System.Exception ex)
        {
            Debug.LogWarning("<<<< Data IO Thread error >>>> \r\n" + ex);
        }
    }
Ejemplo n.º 8
0
    public override void ProcessReqsImmediatly()
    {
        try
        {
            while (mReqs.Count != 0)
            {
                RedGrass.RGChunk chunk = null;

                lock (mReqs)
                {
                    chunk = mReqs.Dequeue();
                }

                INTVECTOR3 chunk32Pos = ChunkPosToPos32(chunk.xIndex, chunk.zIndex);

                // Find the file index
                int file_index = FindOrginFileIndex(chunk32Pos);

                if (file_index != -1 && mOrgnGrassFile[file_index] != null)
                {
                    BinaryReader _in = new BinaryReader(mOrgnGrassFile[file_index]);

                    int expands = mEvni.CHUNKSIZE / mEvni.Tile;

                    lock (chunk)
                    {
                        for (int x = chunk32Pos.x; x < chunk32Pos.x + expands; ++x)
                        {
                            for (int z = chunk32Pos.z; z < chunk32Pos.z + expands; ++z)
                            {
                                int _x = x % mEvni.XTileCount;
                                int _z = z % mEvni.ZTileCount;

                                int index32 = Pos32ToIndex32(_x, _z);

                                if (mOrgnOfsData[file_index, index32] > 0)
                                {
                                    _in.BaseStream.Seek(mOrgnOfsData[file_index, index32], SeekOrigin.Begin);
                                    int count = _in.ReadInt32();

                                    for (int i = 0; i < count; ++i)
                                    {
                                        RedGrassInstance rgi = new RedGrassInstance();
                                        rgi.ReadFromStream(_in);

                                        Vector3 pos = rgi.Position;
                                        if (!GrassDataSL.m_mapDelPos.ContainsKey(new INTVECTOR3((int)pos.x, (int)pos.y, (int)pos.z)))
                                        {
                                            chunk.Write(rgi);
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
        catch (System.Exception ex)
        {
            Debug.LogWarning(ex.ToString());
        }
    }