Ignore:
Timestamp:
Sep 4, 2018, 1:00:48 PM (6 years ago)
Author:
alloc
Message:

Code style cleanup (mostly whitespace changes, enforcing braces, using cleanup)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • binary-improvements/MapRendering/MapRendering/MapRendering.cs

    r299 r325  
    1 using AllocsFixes.JSON;
    21using System;
     2using System.Collections;
    33using System.Collections.Generic;
    44using System.IO;
    55using System.Text;
    66using System.Threading;
     7using System.Timers;
     8using AllocsFixes.FileCache;
     9using AllocsFixes.JSON;
    710using UnityEngine;
    8 
    9 namespace AllocsFixes.MapRendering
    10 {
    11         public class MapRendering
    12         {
     11using Object = UnityEngine.Object;
     12
     13namespace AllocsFixes.MapRendering {
     14        public class MapRendering {
    1315                private static MapRendering instance;
     16
     17                private static readonly object lockObject = new object ();
     18                public static bool renderingEnabled = true;
     19                private readonly MapTileCache cache = new MapTileCache (Constants.MAP_BLOCK_SIZE);
     20                private readonly Dictionary<Vector2i, Color32[]> dirtyChunks = new Dictionary<Vector2i, Color32[]> ();
     21                private readonly MicroStopwatch msw = new MicroStopwatch ();
     22                private readonly MapRenderBlockBuffer[] zoomLevelBuffers;
     23                private Coroutine renderCoroutineRef;
     24                private bool renderingFullMap;
     25                private float renderTimeout = float.MaxValue;
     26
     27                private MapRendering () {
     28                        Constants.MAP_DIRECTORY = GameUtils.GetSaveGameDir () + "/map";
     29
     30                        lock (lockObject) {
     31                                if (!LoadMapInfo ()) {
     32                                        WriteMapInfo ();
     33                                }
     34                        }
     35
     36                        cache.SetZoomCount (Constants.ZOOMLEVELS);
     37
     38                        zoomLevelBuffers = new MapRenderBlockBuffer[Constants.ZOOMLEVELS];
     39                        for (int i = 0; i < Constants.ZOOMLEVELS; i++) {
     40                                zoomLevelBuffers [i] = new MapRenderBlockBuffer (i, cache);
     41                        }
     42
     43                        renderCoroutineRef = ThreadManager.StartCoroutine (renderCoroutine ());
     44                }
    1445
    1546                public static MapRendering Instance {
     
    1849                                        instance = new MapRendering ();
    1950                                }
     51
    2052                                return instance;
    2153                        }
    2254                }
    2355
    24                 private static object lockObject = new object ();
    25                 private MapRenderBlockBuffer[] zoomLevelBuffers;
    26                 private Dictionary<Vector2i, Color32[]> dirtyChunks = new Dictionary<Vector2i, Color32[]> ();
    27                 private bool renderingFullMap = false;
    28                 public static bool renderingEnabled = true;
    29                 private MicroStopwatch msw = new MicroStopwatch ();
    30                 private AllocsFixes.FileCache.MapTileCache cache = new AllocsFixes.FileCache.MapTileCache (Constants.MAP_BLOCK_SIZE);
    31                 private float renderTimeout = float.MaxValue;
    32                 private Coroutine renderCoroutineRef;
    33 
    34                 public static AllocsFixes.FileCache.MapTileCache GetTileCache() {
     56                public static MapTileCache GetTileCache () {
    3557                        return Instance.cache;
    3658                }
    3759
    38                 private MapRendering ()
    39                 {
    40                         Constants.MAP_DIRECTORY = GameUtils.GetSaveGameDir () + "/map";
    41 
    42                         lock (lockObject) {
    43                                 if (!LoadMapInfo ())
    44                                         WriteMapInfo ();
    45                         }
    46 
    47                         cache.SetZoomCount (Constants.ZOOMLEVELS);
    48 
    49                         zoomLevelBuffers = new MapRenderBlockBuffer[Constants.ZOOMLEVELS];
    50                         for (int i = 0; i < Constants.ZOOMLEVELS; i++) {
    51                                 zoomLevelBuffers [i] = new MapRenderBlockBuffer (i, cache);
    52                         }
    53 
    54                         renderCoroutineRef = ThreadManager.StartCoroutine (renderCoroutine ());
    55                 }
    56 
    57                 public static void Shutdown ()
    58                 {
     60                public static void Shutdown () {
    5961                        if (Instance.renderCoroutineRef != null) {
    6062                                ThreadManager.StopCoroutine (Instance.renderCoroutineRef);
     
    6365                }
    6466
    65                 public static void RenderSingleChunk (Chunk chunk)
    66                 {
     67                public static void RenderSingleChunk (Chunk chunk) {
    6768                        if (renderingEnabled) {
    68                                 ThreadPool.UnsafeQueueUserWorkItem ((o) =>
    69                                 {
     69                                ThreadPool.UnsafeQueueUserWorkItem (o => {
    7070                                        try {
    7171                                                if (!Instance.renderingFullMap) {
    7272                                                        lock (lockObject) {
    73                                                                 Chunk c = (Chunk)o;
     73                                                                Chunk c = (Chunk) o;
    7474                                                                Vector3i cPos = c.GetWorldPos ();
    75                                                                 Vector2i cPos2 = new Vector2i (cPos.x / Constants.MAP_CHUNK_SIZE, cPos.z / Constants.MAP_CHUNK_SIZE);
     75                                                                Vector2i cPos2 = new Vector2i (cPos.x / Constants.MAP_CHUNK_SIZE,
     76                                                                        cPos.z / Constants.MAP_CHUNK_SIZE);
    7677
    7778                                                                ushort[] mapColors = c.GetMapColors ();
    7879                                                                if (mapColors != null) {
    79                                                                         Color32[] realColors = new Color32[Constants.MAP_CHUNK_SIZE * Constants.MAP_CHUNK_SIZE];
     80                                                                        Color32[] realColors =
     81                                                                                new Color32[Constants.MAP_CHUNK_SIZE * Constants.MAP_CHUNK_SIZE];
    8082                                                                        for (int i_colors = 0; i_colors < mapColors.Length; i_colors++) {
    8183                                                                                realColors [i_colors] = shortColorToColor32 (mapColors [i_colors]);
    8284                                                                        }
     85
    8386                                                                        Instance.dirtyChunks [cPos2] = realColors;
     87
    8488                                                                        //Log.Out ("Add Dirty: " + cPos2);
    8589                                                                }
     
    9397                }
    9498
    95                 public void RenderFullMap ()
    96                 {
     99                public void RenderFullMap () {
    97100                        MicroStopwatch microStopwatch = new MicroStopwatch ();
    98101
     
    101104                        Texture2D fullMapTexture = null;
    102105
    103                         Vector2i minChunk = default(Vector2i), maxChunk = default(Vector2i);
    104                         Vector2i minPos = default(Vector2i), maxPos = default(Vector2i);
     106                        Vector2i minChunk = default (Vector2i), maxChunk = default (Vector2i);
     107                        Vector2i minPos = default (Vector2i), maxPos = default (Vector2i);
    105108                        int widthChunks, heightChunks, widthPix, heightPix;
    106                         getWorldExtent (rfm, out minChunk, out maxChunk, out minPos, out maxPos, out widthChunks, out heightChunks, out widthPix, out heightPix);
    107 
    108                         Log.Out (String.Format ("RenderMap: min: {0}, max: {1}, minPos: {2}, maxPos: {3}, w/h: {4}/{5}, wP/hP: {6}/{7}",
    109                                                 minChunk.ToString (), maxChunk.ToString (),
    110                                                 minPos.ToString (), maxPos.ToString (),
    111                                                 widthChunks, heightChunks,
    112                                                 widthPix, heightPix)
     109                        getWorldExtent (rfm, out minChunk, out maxChunk, out minPos, out maxPos, out widthChunks, out heightChunks,
     110                                out widthPix, out heightPix);
     111
     112                        Log.Out (string.Format (
     113                                "RenderMap: min: {0}, max: {1}, minPos: {2}, maxPos: {3}, w/h: {4}/{5}, wP/hP: {6}/{7}",
     114                                minChunk.ToString (), maxChunk.ToString (),
     115                                minPos.ToString (), maxPos.ToString (),
     116                                widthChunks, heightChunks,
     117                                widthPix, heightPix)
    113118                        );
    114119
     
    121126                                        Directory.Delete (Constants.MAP_DIRECTORY, true);
    122127                                }
     128
    123129                                WriteMapInfo ();
    124130
    125131                                renderingFullMap = true;
    126132
    127                                 if (widthPix <= 8192 && heightPix <= 8192)
     133                                if (widthPix <= 8192 && heightPix <= 8192) {
    128134                                        fullMapTexture = new Texture2D (widthPix, heightPix);
    129 
    130                                 Vector2i curFullMapPos = default(Vector2i);
    131                                 Vector2i curChunkPos = default(Vector2i);
     135                                }
     136
     137                                Vector2i curFullMapPos = default (Vector2i);
     138                                Vector2i curChunkPos = default (Vector2i);
    132139                                for (curFullMapPos.x = 0; curFullMapPos.x < widthPix; curFullMapPos.x += Constants.MAP_CHUNK_SIZE) {
    133                                         for (curFullMapPos.y = 0; curFullMapPos.y < heightPix; curFullMapPos.y += Constants.MAP_CHUNK_SIZE) {
    134                                                 curChunkPos.x = (curFullMapPos.x / Constants.MAP_CHUNK_SIZE) + minChunk.x;
    135                                                 curChunkPos.y = (curFullMapPos.y / Constants.MAP_CHUNK_SIZE) + minChunk.y;
     140                                        for (curFullMapPos.y = 0;
     141                                                curFullMapPos.y < heightPix;
     142                                                curFullMapPos.y += Constants.MAP_CHUNK_SIZE) {
     143                                                curChunkPos.x = curFullMapPos.x / Constants.MAP_CHUNK_SIZE + minChunk.x;
     144                                                curChunkPos.y = curFullMapPos.y / Constants.MAP_CHUNK_SIZE + minChunk.y;
    136145
    137146                                                try {
     
    141150                                                                ushort[] mapColors = c.GetMapColors ();
    142151                                                                if (mapColors != null) {
    143                                                                         Color32[] realColors = new Color32[Constants.MAP_CHUNK_SIZE * Constants.MAP_CHUNK_SIZE];
     152                                                                        Color32[] realColors =
     153                                                                                new Color32[Constants.MAP_CHUNK_SIZE * Constants.MAP_CHUNK_SIZE];
    144154                                                                        for (int i_colors = 0; i_colors < mapColors.Length; i_colors++) {
    145155                                                                                realColors [i_colors] = shortColorToColor32 (mapColors [i_colors]);
    146156                                                                        }
     157
    147158                                                                        dirtyChunks [curChunkPos] = realColors;
    148                                                                         if (fullMapTexture != null)
    149                                                                                 fullMapTexture.SetPixels32 (curFullMapPos.x, curFullMapPos.y, Constants.MAP_CHUNK_SIZE, Constants.MAP_CHUNK_SIZE, realColors);
     159                                                                        if (fullMapTexture != null) {
     160                                                                                fullMapTexture.SetPixels32 (curFullMapPos.x, curFullMapPos.y,
     161                                                                                        Constants.MAP_CHUNK_SIZE, Constants.MAP_CHUNK_SIZE, realColors);
     162                                                                        }
    150163                                                                }
    151164                                                        }
     
    159172                                        }
    160173
    161                                         Log.Out (String.Format ("RenderMap: {0}/{1} ({2}%)", curFullMapPos.x, widthPix, (int)((float)curFullMapPos.x / widthPix * 100)));
     174                                        Log.Out (string.Format ("RenderMap: {0}/{1} ({2}%)", curFullMapPos.x, widthPix,
     175                                                (int) ((float) curFullMapPos.x / widthPix * 100)));
    162176                                }
    163177                        }
     
    166180                                byte[] array = fullMapTexture.EncodeToPNG ();
    167181                                File.WriteAllBytes (Constants.MAP_DIRECTORY + "/map.png", array);
    168                                 UnityEngine.Object.Destroy (fullMapTexture);
     182                                Object.Destroy (fullMapTexture);
    169183                                fullMapTexture = null;
    170184                        }
     
    176190                }
    177191
    178                 private void SaveAllBlockMaps (object source, System.Timers.ElapsedEventArgs e)
    179                 {
     192                private void SaveAllBlockMaps (object source, ElapsedEventArgs e) {
    180193                        for (int i = 0; i < Constants.ZOOMLEVELS; i++) {
    181194                                zoomLevelBuffers [i].SaveBlock ();
     
    183196                }
    184197
    185                 private System.Collections.IEnumerator renderCoroutine () {
     198                private IEnumerator renderCoroutine () {
    186199                        while (true) {
    187200                                lock (lockObject) {
     
    189202                                                renderTimeout = Time.time + 0.5f;
    190203                                        }
     204
    191205                                        if (Time.time > renderTimeout || dirtyChunks.Count > 200) {
    192206                                                RenderDirtyChunks ();
    193207                                        }
    194208                                }
     209
    195210                                yield return new WaitForSeconds (0.2f);
    196211                        }
    197212                }
    198213
    199                 private void RenderDirtyChunks ()
    200                 {
     214                private void RenderDirtyChunks () {
    201215                        msw.ResetAndRestart ();
    202216
     
    210224                                //Log.Out ("Start Dirty: " + chunkPos);
    211225
    212                                 Vector2i block = default(Vector2i), blockOffset = default(Vector2i);
    213                                 getBlockNumber (chunkPos, out block, out blockOffset, Constants.MAP_BLOCK_TO_CHUNK_DIV, Constants.MAP_CHUNK_SIZE);
     226                                Vector2i block = default (Vector2i), blockOffset = default (Vector2i);
     227                                getBlockNumber (chunkPos, out block, out blockOffset, Constants.MAP_BLOCK_TO_CHUNK_DIV,
     228                                        Constants.MAP_CHUNK_SIZE);
    214229
    215230                                zoomLevelBuffers [Constants.ZOOMLEVELS - 1].LoadBlock (block);
    216231
    217                                 Vector2i v_block = default(Vector2i), v_blockOffset = default(Vector2i);
     232                                Vector2i v_block = default (Vector2i), v_blockOffset = default (Vector2i);
    218233                                foreach (Vector2i v in keys) {
    219                                         getBlockNumber (v, out v_block, out v_blockOffset, Constants.MAP_BLOCK_TO_CHUNK_DIV, Constants.MAP_CHUNK_SIZE);
     234                                        getBlockNumber (v, out v_block, out v_blockOffset, Constants.MAP_BLOCK_TO_CHUNK_DIV,
     235                                                Constants.MAP_CHUNK_SIZE);
    220236                                        if (v_block.Equals (block)) {
    221237                                                //Log.Out ("Dirty: " + v + " render: true");
    222238                                                chunksDone.Add (v);
    223239                                                if (dirtyChunks [v].Length != Constants.MAP_CHUNK_SIZE * Constants.MAP_CHUNK_SIZE) {
    224                                                         Log.Error (string.Format ("Rendering chunk has incorrect data size of {0} instead of {1}", dirtyChunks [v].Length, Constants.MAP_CHUNK_SIZE * Constants.MAP_CHUNK_SIZE));
    225                                                 }
    226                                                 zoomLevelBuffers [Constants.ZOOMLEVELS - 1].SetPart (v_blockOffset, Constants.MAP_CHUNK_SIZE, dirtyChunks [v]);
    227                                         } else {
    228                                                 //Log.Out ("Dirty: " + v + " render: false");
    229                                         }
    230                                 }
    231 
    232                                 foreach (Vector2i v in chunksDone)
     240                                                        Log.Error (string.Format ("Rendering chunk has incorrect data size of {0} instead of {1}",
     241                                                                dirtyChunks [v].Length, Constants.MAP_CHUNK_SIZE * Constants.MAP_CHUNK_SIZE));
     242                                                }
     243
     244                                                zoomLevelBuffers [Constants.ZOOMLEVELS - 1]
     245                                                        .SetPart (v_blockOffset, Constants.MAP_CHUNK_SIZE, dirtyChunks [v]);
     246                                        }
     247                                }
     248
     249                                foreach (Vector2i v in chunksDone) {
    233250                                        dirtyChunks.Remove (v);
     251                                }
    234252
    235253                                RenderZoomLevel (Constants.ZOOMLEVELS - 1, block);
     
    239257                }
    240258
    241                 private void RenderZoomLevel (int level, Vector2i innerBlock)
    242                 {
     259                private void RenderZoomLevel (int level, Vector2i innerBlock) {
    243260                        if (level > 0) {
    244                                 Vector2i block = default(Vector2i), blockOffset = default(Vector2i);
     261                                Vector2i block = default (Vector2i), blockOffset = default (Vector2i);
    245262                                getBlockNumber (innerBlock, out block, out blockOffset, 2, Constants.MAP_BLOCK_SIZE / 2);
    246263
    247264                                zoomLevelBuffers [level - 1].LoadBlock (block);
    248                                 zoomLevelBuffers [level - 1].SetPart (blockOffset, Constants.MAP_BLOCK_SIZE / 2, zoomLevelBuffers [level].GetHalfScaled ());
     265                                zoomLevelBuffers [level - 1].SetPart (blockOffset, Constants.MAP_BLOCK_SIZE / 2,
     266                                        zoomLevelBuffers [level].GetHalfScaled ());
    249267
    250268                                RenderZoomLevel (level - 1, block);
     
    252270                }
    253271
    254                 private void getBlockNumber (Vector2i innerPos, out Vector2i block, out Vector2i blockOffset, int scaleFactor, int offsetSize)
    255                 {
    256                         block = default(Vector2i);
    257                         blockOffset = default(Vector2i);
    258                         block.x = ((innerPos.x + 16777216) / scaleFactor) - (16777216 / scaleFactor);
    259                         block.y = ((innerPos.y + 16777216) / scaleFactor) - (16777216 / scaleFactor);
    260                         blockOffset.x = ((innerPos.x + 16777216) % scaleFactor) * offsetSize;
    261                         blockOffset.y = ((innerPos.y + 16777216) % scaleFactor) * offsetSize;
    262                 }
    263 
    264                 private void WriteMapInfo ()
    265                 {
     272                private void getBlockNumber (Vector2i innerPos, out Vector2i block, out Vector2i blockOffset, int scaleFactor,
     273                        int offsetSize) {
     274                        block = default (Vector2i);
     275                        blockOffset = default (Vector2i);
     276                        block.x = (innerPos.x + 16777216) / scaleFactor - 16777216 / scaleFactor;
     277                        block.y = (innerPos.y + 16777216) / scaleFactor - 16777216 / scaleFactor;
     278                        blockOffset.x = (innerPos.x + 16777216) % scaleFactor * offsetSize;
     279                        blockOffset.y = (innerPos.y + 16777216) % scaleFactor * offsetSize;
     280                }
     281
     282                private void WriteMapInfo () {
    266283                        JSONObject mapInfo = new JSONObject ();
    267284                        mapInfo.Add ("blockSize", new JSONNumber (Constants.MAP_BLOCK_SIZE));
     
    272289                }
    273290
    274                 private bool LoadMapInfo ()
    275                 {
     291                private bool LoadMapInfo () {
    276292                        if (File.Exists (Constants.MAP_DIRECTORY + "/mapinfo.json")) {
    277293                                string json = File.ReadAllText (Constants.MAP_DIRECTORY + "/mapinfo.json", Encoding.UTF8);
     
    279295                                        JSONNode node = Parser.Parse (json);
    280296                                        if (node is JSONObject) {
    281                                                 JSONObject jo = (JSONObject)node;
    282                                                 if (jo.ContainsKey ("blockSize"))
    283                                                         Constants.MAP_BLOCK_SIZE = ((JSONNumber)jo ["blockSize"]).GetInt ();
    284                                                 if (jo.ContainsKey ("maxZoom"))
    285                                                         Constants.ZOOMLEVELS = ((JSONNumber)jo ["maxZoom"]).GetInt () + 1;
     297                                                JSONObject jo = (JSONObject) node;
     298                                                if (jo.ContainsKey ("blockSize")) {
     299                                                        Constants.MAP_BLOCK_SIZE = ((JSONNumber) jo ["blockSize"]).GetInt ();
     300                                                }
     301
     302                                                if (jo.ContainsKey ("maxZoom")) {
     303                                                        Constants.ZOOMLEVELS = ((JSONNumber) jo ["maxZoom"]).GetInt () + 1;
     304                                                }
     305
    286306                                                return true;
    287307                                        }
     
    292312                                }
    293313                        }
     314
    294315                        return false;
    295316                }
    296317
    297318                private void getWorldExtent (RegionFileManager rfm, out Vector2i minChunk, out Vector2i maxChunk,
    298                                             out Vector2i minPos, out Vector2i maxPos,
    299                                             out int widthChunks, out int heightChunks,
    300                                             out int widthPix, out int heightPix)
    301                 {
    302                         minChunk = default(Vector2i);
    303                         maxChunk = default(Vector2i);
    304                         minPos = default(Vector2i);
    305                         maxPos = default(Vector2i);
     319                        out Vector2i minPos, out Vector2i maxPos,
     320                        out int widthChunks, out int heightChunks,
     321                        out int widthPix, out int heightPix) {
     322                        minChunk = default (Vector2i);
     323                        maxChunk = default (Vector2i);
     324                        minPos = default (Vector2i);
     325                        maxPos = default (Vector2i);
    306326
    307327                        long[] keys = rfm.GetAllChunkKeys ();
    308                         int minX = Int32.MaxValue;
    309                         int minY = Int32.MaxValue;
    310                         int maxX = Int32.MinValue;
    311                         int maxY = Int32.MinValue;
     328                        int minX = int.MaxValue;
     329                        int minY = int.MaxValue;
     330                        int maxX = int.MinValue;
     331                        int maxY = int.MinValue;
    312332                        foreach (long key in keys) {
    313333                                int x = WorldChunkCache.extractX (key);
    314334                                int y = WorldChunkCache.extractZ (key);
    315335
    316                                 if (x < minX)
     336                                if (x < minX) {
    317337                                        minX = x;
    318                                 if (x > maxX)
     338                                }
     339
     340                                if (x > maxX) {
    319341                                        maxX = x;
    320                                 if (y < minY)
     342                                }
     343
     344                                if (y < minY) {
    321345                                        minY = y;
    322                                 if (y > maxY)
     346                                }
     347
     348                                if (y > maxY) {
    323349                                        maxY = y;
     350                                }
    324351                        }
    325352
     
    343370                }
    344371
    345                 private static Color shortColorToColor (ushort col)
    346                 {
    347                         return new Color (((float)(col >> 10 & 31) / 31f), ((float)(col >> 5 & 31) / 31f), ((float)(col & 31) / 31f), 255);
    348                 }
    349 
    350                 private static Color32 shortColorToColor32 (ushort col)
    351                 {
    352                         byte r = (byte)(256 * (col >> 10 & 31) / 32);
    353                         byte g = (byte)(256 * (col >> 5 & 31) / 32);
    354                         byte b = (byte)(256 * (col & 31) / 32);
     372                private static Color shortColorToColor (ushort col) {
     373                        return new Color (((col >> 10) & 31) / 31f, ((col >> 5) & 31) / 31f, (col & 31) / 31f, 255);
     374                }
     375
     376                private static Color32 shortColorToColor32 (ushort col) {
     377                        byte r = (byte) (256 * ((col >> 10) & 31) / 32);
     378                        byte g = (byte) (256 * ((col >> 5) & 31) / 32);
     379                        byte b = (byte) (256 * (col & 31) / 32);
    355380                        byte a = 255;
    356381                        return new Color32 (r, g, b, a);
Note: See TracChangeset for help on using the changeset viewer.