Magically import images and more into Gamecraft as blocks
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

76 lines
2.1KB

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. using Newtonsoft.Json;
  5. using GamecraftModdingAPI;
  6. using GamecraftModdingAPI.Blocks;
  7. namespace Pixi.Common
  8. {
  9. public static class VoxelObjectNotationUtility
  10. {
  11. private static readonly float[] origin_base = new float[3] { 0, 0, 0 };
  12. private static Dictionary<string, BlockIDs> enumMap = null;
  13. public static string SerializeBlocks(Block[] blocks, float[] origin = null)
  14. {
  15. BlockJsonInfo[] blockJsons = new BlockJsonInfo[blocks.Length];
  16. for (int i = 0; i < blocks.Length; i++)
  17. {
  18. blockJsons[i] = JsonObject(blocks[i], origin);
  19. }
  20. return JsonConvert.SerializeObject(blockJsons);
  21. }
  22. public static byte[] SerializeBlocksToBytes(Block[] blocks)
  23. {
  24. return Encoding.UTF8.GetBytes(SerializeBlocks(blocks));
  25. }
  26. public static BlockJsonInfo[] DeserializeBlocks(byte[] data)
  27. {
  28. return DeserializeBlocks(Encoding.UTF8.GetString(data));
  29. }
  30. public static BlockJsonInfo[] DeserializeBlocks(string data)
  31. {
  32. return JsonConvert.DeserializeObject<BlockJsonInfo[]>(data);
  33. }
  34. public static BlockJsonInfo JsonObject(Block block, float[] origin = null)
  35. {
  36. if (origin == null) origin = origin_base;
  37. return new BlockJsonInfo
  38. {
  39. name = block.Type == BlockIDs.TextBlock ? block.Label : block.Type.ToString(),
  40. position = new float[3] { block.Position.x - origin[0], block.Position.y - origin[1], block.Position.z - origin[2]},
  41. rotation = new float[3] { block.Rotation.x, block.Rotation.y, block.Rotation.z },
  42. color = ColorSpaceUtility.UnquantizeToArray(block.Color),
  43. scale = new float[3] {block.Scale.x, block.Scale.y, block.Scale.z},
  44. };
  45. }
  46. public static BlockIDs NameToEnum(BlockJsonInfo block)
  47. {
  48. return NameToEnum(block.name);
  49. }
  50. public static BlockIDs NameToEnum(string name)
  51. {
  52. if (enumMap == null) GenerateEnumMap();
  53. return enumMap[name];
  54. }
  55. private static void GenerateEnumMap()
  56. {
  57. enumMap = new Dictionary<string, BlockIDs>();
  58. foreach(BlockIDs e in Enum.GetValues(typeof(BlockIDs)))
  59. {
  60. enumMap[e.ToString()] = e;
  61. }
  62. }
  63. }
  64. }