Ignore:
Timestamp:
Jan 27, 2023, 7:28:00 PM (2 years ago)
Author:
alloc
Message:
  • Major refactoring
  • Using Utf8Json for (de)serialization
  • Moving APIs to REST
  • Removing dependencies from WebServer and MapRenderer to ServerFixes
Location:
binary-improvements2/MapRendering
Files:
6 edited
1 copied

Legend:

Unmodified
Added
Removed
  • binary-improvements2/MapRendering/MapRendering.csproj

    r392 r402  
    8383      <Private>False</Private>
    8484    </Reference>
     85    <Reference Include="Utf8Json, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null">
     86      <HintPath>..\7dtd-binaries\Utf8Json.dll</HintPath>
     87      <Private>False</Private>
     88    </Reference>
    8589  </ItemGroup>
    8690  <ItemGroup>
     
    8892    <Compile Include="src\MapRenderBlockBuffer.cs" />
    8993    <Compile Include="src\MapRenderer.cs" />
     94    <Compile Include="src\MapTileCache.cs" />
    9095    <Compile Include="src\ModApi.cs" />
    9196    <Compile Include="src\AssemblyInfo.cs" />
     
    95100  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
    96101  <ItemGroup>
    97     <ProjectReference Include="..\7dtd-server-fixes\7dtd-server-fixes.csproj">
    98       <Project>{81DA7F87-1A66-4920-AADA-6EAF1971F8D0}</Project>
    99       <Name>7dtd-server-fixes</Name>
    100       <Private>False</Private>
    101     </ProjectReference>
    102   </ItemGroup>
    103   <ItemGroup>
    104102    <None Include="ModInfo.xml">
    105103      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    106104    </None>
    107105  </ItemGroup>
     106  <ItemGroup>
     107    <ProjectReference Include="..\WebServer\WebServer.csproj">
     108      <Project>{01b5f981-b9fd-4364-8f9e-9127130d2542}</Project>
     109      <Name>WebServer</Name>
     110      <Private>False</Private>
     111    </ProjectReference>
     112  </ItemGroup>
    108113</Project>
  • binary-improvements2/MapRendering/ModInfo.xml

    r391 r402  
    11<?xml version="1.0" encoding="UTF-8" ?>
    22<xml>
    3         <ModInfo>
    4                 <Name value="TFP_MapRendering" />
    5                 <Description value="Render the game map to image map tiles as it is uncovered" />
    6                 <Author value="The Fun Pimps LLC" />
    7                 <Version value="1" />
    8                 <Website value="" />
    9         </ModInfo>
     3        <Name value="TFP_MapRendering" />
     4        <DisplayName value="Map Renderer" />
     5        <Description value="Render the game map to image map tiles as it is uncovered" />
     6        <Author value="The Fun Pimps LLC" />
     7        <Version value="21.0" />
     8        <Website value="" />
    109</xml>
  • binary-improvements2/MapRendering/src/Commands/EnableRendering.cs

    r391 r402  
    1515                public override void Execute (List<string> _params, CommandSenderInfo _senderInfo) {
    1616                        if (_params.Count != 1) {
    17                                 SdtdConsole.Instance.Output ("Current state: " + MapRenderer.renderingEnabled);
     17                                SdtdConsole.Instance.Output ($"Current state: {MapRenderer.renderingEnabled}");
    1818                                return;
    1919                        }
    2020
    2121                        MapRenderer.renderingEnabled = _params [0].Equals ("1");
    22                         SdtdConsole.Instance.Output ("Set live map rendering to " + _params [0].Equals ("1"));
     22                        SdtdConsole.Instance.Output ($"Set live map rendering to {_params [0].Equals ("1")}");
    2323                }
    2424        }
  • binary-improvements2/MapRendering/src/MapRenderBlockBuffer.cs

    r391 r402  
    11using System;
    22using System.IO;
    3 using AllocsFixes.FileCache;
    43using Unity.Collections;
    54using UnityEngine;
     
    2120                        zoomLevel = _level;
    2221                        cache = _cache;
    23                         folderBase = Constants.MapDirectory + "/" + zoomLevel + "/";
     22                        folderBase = $"{Constants.MapDirectory}/{zoomLevel}/";
    2423
    2524                        {
     
    5251                                saveTextureToFile ();
    5352                        } catch (Exception e) {
    54                                 Log.Warning ("Exception in MapRenderBlockBuffer.SaveBlock(): " + e);
     53                                Log.Warning ($"Exception in MapRenderBlockBuffer.SaveBlock(): {e}");
    5554                        }
    5655                        Profiler.EndSample ();
     
    6463                                        string folder;
    6564                                        if (currentBlockMapPos.x != _block.x) {
    66                                                 folder = folderBase + _block.x + '/';
     65                                                folder = $"{folderBase}{_block.x}/";
    6766
    6867                                                Profiler.BeginSample ("LoadBlock.Directory");
     
    7372                                        }
    7473
    75                                         string fileName = folder + _block.y + ".png";
     74                                        string fileName = $"{folder}{_block.y}.png";
    7675                                        Profiler.EndSample ();
    7776                                       
     
    105104                public Color32[] GetHalfScaled () {
    106105                        Profiler.BeginSample ("HalfScaled.ResizeBuffer");
    107                         zoomBuffer.Resize (Constants.MapBlockSize, Constants.MapBlockSize);
     106                        zoomBuffer.Reinitialize (Constants.MapBlockSize, Constants.MapBlockSize);
    108107                        Profiler.EndSample ();
    109108
     
    156155                        Profiler.BeginSample ("HalfScaledNative.ResizeBuffer");
    157156                        if (zoomBuffer.format != blockMap.format || zoomBuffer.height != Constants.MapBlockSize / 2 || zoomBuffer.width != Constants.MapBlockSize / 2) {
    158                                 zoomBuffer.Resize (Constants.MapBlockSize / 2, Constants.MapBlockSize / 2, blockMap.format, false);
     157                                zoomBuffer.Reinitialize (Constants.MapBlockSize / 2, Constants.MapBlockSize / 2, blockMap.format, false);
    159158                        }
    160159                        Profiler.EndSample ();
     
    206205
    207206                        if (array != null) {
    208                                 Log.Error ("Map image tile " + _fileName + " has been corrupted, recreating tile");
     207                                Log.Error ($"Map image tile {_fileName} has been corrupted, recreating tile");
    209208                        }
    210209
    211210                        if (blockMap.format != Constants.DefaultTextureFormat || blockMap.height != Constants.MapBlockSize ||
    212211                            blockMap.width != Constants.MapBlockSize) {
    213                                 blockMap.Resize (Constants.MapBlockSize, Constants.MapBlockSize, Constants.DefaultTextureFormat,
     212                                blockMap.Reinitialize (Constants.MapBlockSize, Constants.MapBlockSize, Constants.DefaultTextureFormat,
    214213                                        false);
    215214                        }
  • binary-improvements2/MapRendering/src/MapRenderer.cs

    r391 r402  
    55using System.Text;
    66using System.Threading;
    7 using AllocsFixes.FileCache;
    8 using AllocsFixes.JSON;
    97using UnityEngine;
    108using UnityEngine.Profiling;
     9using Utf8Json;
     10using Webserver.FileCache;
    1111using Object = UnityEngine.Object;
    1212
     
    2727
    2828                private MapRenderer () {
    29                         Constants.MapDirectory = GameIO.GetSaveGameDir () + "/map";
    30 
    31                         lock (lockObject) {
    32                                 if (!LoadMapInfo ()) {
    33                                         WriteMapInfo ();
    34                                 }
     29                        Constants.MapDirectory = $"{GameIO.GetSaveGameDir ()}/map";
     30
     31                        if (!LoadMapInfo ()) {
     32                                WriteMapInfo ();
    3533                        }
    3634
     
    4745                public static MapRenderer Instance => instance ??= new MapRenderer ();
    4846
    49                 public static MapTileCache GetTileCache () {
     47                public static AbstractCache GetTileCache () {
    5048                        return Instance.cache;
    5149                }
     
    9593                                                }
    9694                                        } catch (Exception e) {
    97                                                 Log.Out ("Exception in MapRendering.RenderSingleChunk(): " + e);
     95                                                Log.Out ($"Exception in MapRendering.RenderSingleChunk(): {e}");
    9896                                        }
    9997                                }, _chunk);
     
    161159                                                        }
    162160                                                } catch (Exception e) {
    163                                                         Log.Out ("Exception: " + e);
     161                                                        Log.Out ($"Exception: {e}");
    164162                                                }
    165163                                        }
     
    177175                        if (fullMapTexture != null) {
    178176                                byte[] array = fullMapTexture.EncodeToPNG ();
    179                                 File.WriteAllBytes (Constants.MapDirectory + "/map.png", array);
     177                                File.WriteAllBytes ($"{Constants.MapDirectory}/map.png", array);
    180178                                Object.Destroy (fullMapTexture);
    181179                        }
     
    183181                        renderingFullMap = false;
    184182
    185                         Log.Out ("Generating map took: " + microStopwatch.ElapsedMilliseconds + " ms");
    186                         Log.Out ("World extent: " + minPos + " - " + maxPos);
     183                        Log.Out ($"Generating map took: {microStopwatch.ElapsedMilliseconds} ms");
     184                        Log.Out ($"World extent: {minPos} - {maxPos}");
    187185                }
    188186
     
    307305
    308306                private void WriteMapInfo () {
    309                         JsonObject mapInfo = new JsonObject ();
    310                         mapInfo.Add ("blockSize", new JsonNumber (Constants.MapBlockSize));
    311                         mapInfo.Add ("maxZoom", new JsonNumber (Constants.Zoomlevels - 1));
     307                        JsonWriter writer = new JsonWriter ();
     308                        writer.WriteBeginObject ();
     309                       
     310                        writer.WriteString ("blockSize");
     311                        writer.WriteNameSeparator ();
     312                        writer.WriteInt32 (Constants.MapBlockSize);
     313                       
     314                        writer.WriteValueSeparator ();
     315                        writer.WriteString ("maxZoom");
     316                        writer.WriteNameSeparator ();
     317                        writer.WriteInt32 (Constants.Zoomlevels - 1);
     318                       
     319                        writer.WriteEndObject ();
    312320
    313321                        Directory.CreateDirectory (Constants.MapDirectory);
    314                         File.WriteAllText (Constants.MapDirectory + "/mapinfo.json", mapInfo.ToString (), Encoding.UTF8);
     322                        File.WriteAllBytes ($"{Constants.MapDirectory}/mapinfo.json", writer.ToUtf8ByteArray ());
    315323                }
    316324
    317325                private bool LoadMapInfo () {
    318                         if (!File.Exists (Constants.MapDirectory + "/mapinfo.json")) {
     326                        if (!File.Exists ($"{Constants.MapDirectory}/mapinfo.json")) {
    319327                                return false;
    320328                        }
    321329
    322                         string json = File.ReadAllText (Constants.MapDirectory + "/mapinfo.json", Encoding.UTF8);
     330                        string json = File.ReadAllText ($"{Constants.MapDirectory}/mapinfo.json", Encoding.UTF8);
    323331                        try {
    324                                 JsonNode node = Parser.Parse (json);
    325                                 if (node is JsonObject jo) {
    326                                         if (jo.ContainsKey ("blockSize")) {
    327                                                 Constants.MapBlockSize = ((JsonNumber) jo ["blockSize"]).GetInt ();
    328                                         }
    329 
    330                                         if (jo.ContainsKey ("maxZoom")) {
    331                                                 Constants.Zoomlevels = ((JsonNumber) jo ["maxZoom"]).GetInt () + 1;
    332                                         }
    333 
    334                                         return true;
    335                                 }
    336                         } catch (MalformedJsonException e) {
    337                                 Log.Out ("Exception in LoadMapInfo: " + e);
    338                         } catch (InvalidCastException e) {
    339                                 Log.Out ("Exception in LoadMapInfo: " + e);
     332                                IDictionary<string,object> inputJson = JsonSerializer.Deserialize<IDictionary<string, object>> (json);
     333
     334                                if (inputJson.TryGetValue ("blockSize", out object fieldNode) && fieldNode is double value) {
     335                                        Constants.MapBlockSize = (int)value;
     336                                }
     337
     338                                if (inputJson.TryGetValue ("maxZoom", out fieldNode) && fieldNode is double value2) {
     339                                        Constants.Zoomlevels = (int)value2 + 1;
     340                                }
     341
     342                                return true;
     343                        } catch (Exception e) {
     344                                Log.Out ($"Exception in LoadMapInfo: {e}");
    340345                        }
    341346
  • binary-improvements2/MapRendering/src/MapTileCache.cs

    r399 r402  
    11using System;
     2using System.Diagnostics.CodeAnalysis;
    23using System.IO;
    34using UnityEngine;
    45using UnityEngine.Profiling;
     6using Webserver.FileCache;
    57using Object = UnityEngine.Object;
    68
    7 namespace AllocsFixes.FileCache {
     9namespace MapRendering {
    810        // Special "cache" for map tile folder as both map rendering and webserver access files in there.
    911        // Only map rendering tiles are cached. Writing is done by WriteThrough.
     
    2527                }
    2628
     29                // SetZoomCount only called before processing happens in MapRenderer.ctor, no locking required
     30                [SuppressMessage ("ReSharper", "InconsistentlySynchronizedField")]
    2731                public void SetZoomCount (int _count) {
    2832                        cache = new CurrentZoomFile[_count];
     
    5559                                }
    5660                        } catch (Exception e) {
    57                                 Log.Warning ("Error in MapTileCache.LoadTile: " + e);
     61                                Log.Warning ($"Error in MapTileCache.LoadTile: {e}");
    5862                        }
    5963
     
    8185                                }
    8286                        } catch (Exception e) {
    83                                 Log.Warning ("Error in MapTileCache.SaveTile: " + e);
     87                                Log.Warning ($"Error in MapTileCache.SaveTile: {e}");
    8488                        }
    8589                }
     
    9296                                }
    9397                        } catch (Exception e) {
    94                                 Log.Warning ("Error in MapTileCache.ResetTile: " + e);
     98                                Log.Warning ($"Error in MapTileCache.ResetTile: {e}");
    9599                        }
    96100                }
     
    108112                                }
    109113                        } catch (Exception e) {
    110                                 Log.Warning ("Error in MapTileCache.GetFileContent: " + e);
     114                                Log.Warning ($"Error in MapTileCache.GetFileContent: {e}");
    111115                        }
    112116
     
    119123
    120124                private static byte[] ReadAllBytes (string _path) {
    121                         using (FileStream fileStream = new FileStream(_path, FileMode.Open, FileAccess.Read, FileShare.Read, 4096)) {
    122                                 int bytesRead = 0;
    123                                 int bytesLeft = (int) fileStream.Length;
    124                                 byte[] result = new byte[bytesLeft];
    125                                 while (bytesLeft > 0) {
    126                                         int readThisTime = fileStream.Read (result, bytesRead, bytesLeft);
    127                                         if (readThisTime == 0) {
    128                                                 throw new IOException ("Unexpected end of stream");
    129                                         }
    130 
    131                                         bytesRead += readThisTime;
    132                                         bytesLeft -= readThisTime;
     125                        using FileStream fileStream = new FileStream(_path, FileMode.Open, FileAccess.Read, FileShare.Read, 4096);
     126                       
     127                        int bytesRead = 0;
     128                        int bytesLeft = (int) fileStream.Length;
     129                        byte[] result = new byte[bytesLeft];
     130                        while (bytesLeft > 0) {
     131                                int readThisTime = fileStream.Read (result, bytesRead, bytesLeft);
     132                                if (readThisTime == 0) {
     133                                        throw new IOException ("Unexpected end of stream");
    133134                                }
    134135
    135                                 return result;
     136                                bytesRead += readThisTime;
     137                                bytesLeft -= readThisTime;
    136138                        }
     139
     140                        return result;
    137141                }
    138142
  • binary-improvements2/MapRendering/src/ModApi.cs

    r391 r402  
    11using JetBrains.Annotations;
     2using Webserver;
     3using Webserver.UrlHandlers;
    24
    35namespace MapRendering {
     
    79                        ModEvents.GameShutdown.RegisterHandler (GameShutdown);
    810                        ModEvents.CalcChunkColorsDone.RegisterHandler (CalcChunkColorsDone);
     11
     12                        Web.ServerInitialized += _web => {
     13                                _web.RegisterPathHandler ("/map/", new StaticHandler (
     14                                        $"{GameIO.GetSaveGameDir ()}/map",
     15                                        MapRenderer.GetTileCache (),
     16                                        false,
     17                                        "web.map")
     18                                );
     19                        };
    920                }
    1021
Note: See TracChangeset for help on using the changeset viewer.