SnapData.cs 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380
  1. using CommonAI.Zone;
  2. using CommonAI.Zone.ZoneEditor;
  3. using CommonLang;
  4. using CommonLang.IO;
  5. using CommonLang.IO.Attribute;
  6. using System;
  7. using System.Collections.Generic;
  8. using System.IO;
  9. using System.Linq;
  10. using System.Text;
  11. namespace XmdsCommon.EditorData
  12. {
  13. public static class SceneSnapManager
  14. {
  15. private static string mSnapDataRoot;
  16. private static string mSnapDataRootExt;
  17. public static void SaveAllSceneSnap(EditorTemplatesData datas, DirectoryInfo data_root)
  18. {
  19. if (!data_root.Exists) { data_root.Create(); }
  20. foreach (var sd in datas.Scenes.Values)
  21. {
  22. //场景快照
  23. var snd = new SceneSnapData(sd);
  24. var bin = IOUtil.ObjectToBin(TemplateManager.MessageCodec, snd);
  25. File.WriteAllBytes(data_root.FullName + Path.DirectorySeparatorChar + sd.ID + ".snd", bin);
  26. }
  27. }
  28. public static void SaveAllSceneSnapExt(EditorTemplatesData datas, DirectoryInfo data_root)
  29. {
  30. if (!data_root.Exists) { data_root.Create(); }
  31. foreach (var sd in datas.Scenes.Values)
  32. {
  33. //单位快照
  34. var snd = new UnitSnapData(sd);
  35. var bin = IOUtil.ObjectToBin(TemplateManager.MessageCodec, snd);
  36. File.WriteAllBytes(data_root.FullName + Path.DirectorySeparatorChar + sd.ID + ".snd", bin);
  37. }
  38. }
  39. internal static void InitSceneSnap(string path, string pathExt)
  40. {
  41. mSnapDataRoot = path;
  42. mSnapDataRootExt = pathExt;
  43. }
  44. private static readonly Dictionary<int, SceneSnapData> dic = new Dictionary<int, SceneSnapData>();
  45. private static readonly Dictionary<int, UnitSnapData> unitDic = new Dictionary<int, UnitSnapData>();
  46. public static SceneSnapData LoadSceneSnapData(int sid)
  47. {
  48. SceneSnapData ret;
  49. if(dic.TryGetValue(sid , out ret))
  50. {
  51. return ret;
  52. }
  53. byte[] bin = Resource.LoadData(mSnapDataRoot + "/" + sid + ".snd");
  54. if (bin != null)
  55. {
  56. try
  57. {
  58. ret = IOUtil.BinToObject<SceneSnapData>(TemplateManager.MessageCodec, bin);
  59. dic.Add(sid , ret);
  60. return ret;
  61. }
  62. catch (Exception err)
  63. {
  64. throw new Exception("Load SceneSnap error ! " + sid, err);
  65. }
  66. }
  67. return null;
  68. }
  69. public static SceneSnapData LoadSceneSnapData(int sid ,byte[] bin)
  70. {
  71. SceneSnapData ret;
  72. if (dic.TryGetValue(sid, out ret))
  73. {
  74. return ret;
  75. }
  76. if (bin != null)
  77. {
  78. ret = IOUtil.BinToObject<SceneSnapData>(TemplateManager.MessageCodec, bin);
  79. dic.Add(sid, ret);
  80. return ret;
  81. }
  82. return null;
  83. }
  84. public static UnitSnapData LoadBinUnitSnapData(int sid, byte[] bin)
  85. {
  86. UnitSnapData ret;
  87. if (unitDic.TryGetValue(sid, out ret))
  88. {
  89. return ret;
  90. }
  91. if (bin != null)
  92. {
  93. ret = IOUtil.BinToObject<UnitSnapData>(TemplateManager.MessageCodec, bin);
  94. unitDic.Add(sid, ret);
  95. return ret;
  96. }
  97. return null;
  98. }
  99. public static UnitSnapData LoadSceneUnitSnapData(int sid)
  100. {
  101. UnitSnapData ret;
  102. if (unitDic.TryGetValue(sid, out ret))
  103. {
  104. return ret;
  105. }
  106. byte[] bin = Resource.LoadData(mSnapDataRootExt + "/" + sid + ".snd");
  107. if (bin != null)
  108. {
  109. try
  110. {
  111. ret = IOUtil.BinToObject<UnitSnapData>(TemplateManager.MessageCodec, bin);
  112. unitDic.Add(sid, ret);
  113. return ret;
  114. }
  115. catch (Exception err)
  116. {
  117. throw new Exception("Load UnitSnapData error ! " + sid, err);
  118. }
  119. }
  120. return null;
  121. }
  122. }
  123. /// <summary>
  124. /// 场景快照数据
  125. /// </summary>
  126. [MessageType(0xFA00000)]
  127. public class SceneSnapData : IExternalizable
  128. {
  129. public int id;
  130. public string name;
  131. public float width, height;
  132. public List<RegionSnapData> regions = new List<RegionSnapData>();
  133. public SceneSnapData() { }
  134. public SceneSnapData(SceneData src)
  135. {
  136. this.id = src.ID;
  137. this.name = src.Name;
  138. this.width = src.ZoneData.TotalWidth;
  139. this.height = src.ZoneData.TotalHeight;
  140. char[] split = new char[] { '_' };
  141. foreach (var rg in src.Regions)
  142. {
  143. try
  144. {
  145. if (rg.Name.StartsWith("snap_"))
  146. {
  147. RegionSnapData rgs = new RegionSnapData();
  148. rgs.full_name = rg.Name;
  149. rgs.x = rg.X;
  150. rgs.y = rg.Y;
  151. rgs.attributes.ParseLines(rg.Attributes);
  152. this.regions.Add(rgs);
  153. }
  154. }
  155. catch (Exception err)
  156. {
  157. throw new Exception(string.Format("parse snap data error : scene={0} region={1}", src, rg.Name), err);
  158. }
  159. }
  160. }
  161. public void ReadExternal(IInputStream input)
  162. {
  163. this.id = input.GetS32();
  164. this.name = input.GetUTF();
  165. this.width = input.GetF32();
  166. this.height = input.GetF32();
  167. this.regions = input.GetList<RegionSnapData>(input.GetExt<RegionSnapData>);
  168. }
  169. public void WriteExternal(IOutputStream output)
  170. {
  171. output.PutS32(this.id);
  172. output.PutUTF(this.name);
  173. output.PutF32(this.width);
  174. output.PutF32(this.height);
  175. output.PutList(this.regions, output.PutExt);
  176. }
  177. }
  178. [MessageType(0xFA00001)]
  179. public class RegionSnapData : IExternalizable
  180. {
  181. public string full_name;
  182. public float x, y;
  183. public readonly Properties attributes = new Properties();
  184. public void ReadExternal(IInputStream input)
  185. {
  186. this.full_name = input.GetUTF();
  187. this.x = input.GetF32();
  188. this.y = input.GetF32();
  189. int count = input.GetS32();
  190. for (int i=0; i< count; i++)
  191. {
  192. string k = input.GetUTF();
  193. string v = input.GetUTF();
  194. attributes[k] = v;
  195. }
  196. }
  197. public void WriteExternal(IOutputStream output)
  198. {
  199. output.PutUTF(this.full_name);
  200. output.PutF32(this.x);
  201. output.PutF32(this.y);
  202. output.PutS32(this.attributes.Count);
  203. foreach (var e in this.attributes)
  204. {
  205. output.PutUTF(e.Key);
  206. output.PutUTF(e.Value);
  207. }
  208. }
  209. }
  210. [MessageType(0xFA00002)]
  211. public class UnitSnapData : IExternalizable
  212. {
  213. //单位信息
  214. public List<UnitSnapDataItem> units = new List<UnitSnapDataItem>();
  215. //路点信息
  216. public List<PointFlagSnapDataItem> pointFlags = new List<PointFlagSnapDataItem>();
  217. public UnitSnapData() { }
  218. public UnitSnapData(SceneData src)
  219. {
  220. List<SceneObjectData> allList = new List<SceneObjectData>();
  221. allList.AddRange(src.Points);
  222. allList.AddRange(src.Regions);
  223. allList.AddRange(src.Decorations);
  224. allList.AddRange(src.Units);
  225. allList.AddRange(src.Items);
  226. allList.AddRange(src.Areas);
  227. //单位信息
  228. foreach (var unit in allList)
  229. {
  230. try
  231. {
  232. if (unit.MapShow)
  233. {
  234. UnitSnapDataItem rgs = new UnitSnapDataItem();
  235. rgs.unitName = unit.Name;
  236. rgs.x = unit.X;
  237. rgs.y = unit.Y;
  238. rgs.mapShow = unit.MapShow;
  239. rgs.unitMName = unit.UnitName;
  240. rgs.unitMIcon = unit.UnitIcon;
  241. rgs.offsetX = unit.OffsetX;
  242. rgs.offsetY = unit.OffsetY;
  243. rgs.lableOffsetX = unit.LableOffsetX;
  244. rgs.lableOffsetY = unit.LableOffsetY;
  245. rgs.lableColor = unit.LableColor;
  246. rgs.lableSize = unit.LableSize;
  247. rgs.lableOutLine = unit.LableOutline;
  248. this.units.Add(rgs);
  249. }
  250. }
  251. catch (Exception err)
  252. {
  253. throw new Exception(string.Format("parse snap unit data error : scene={0} region={1}", src, unit.Name), err);
  254. }
  255. }
  256. // 路点信息
  257. foreach (var point in src.Points)
  258. {
  259. try
  260. {
  261. PointFlagSnapDataItem pointFlag = new PointFlagSnapDataItem();
  262. pointFlag.pointName = point.Name;
  263. pointFlag.x = point.X;
  264. pointFlag.y = point.Y;
  265. this.pointFlags.Add(pointFlag);
  266. }
  267. catch (Exception err)
  268. {
  269. throw new Exception(string.Format("parse snap point flag data error : scene={0} region={1}", src, point.Name), err);
  270. }
  271. }
  272. }
  273. public void ReadExternal(IInputStream input)
  274. {
  275. this.units = input.GetList<UnitSnapDataItem>(input.GetExt<UnitSnapDataItem>);
  276. this.pointFlags = input.GetList<PointFlagSnapDataItem>(input.GetExt<PointFlagSnapDataItem>);
  277. }
  278. public void WriteExternal(IOutputStream output)
  279. {
  280. output.PutList(this.units, output.PutExt);
  281. output.PutList(this.pointFlags, output.PutExt);
  282. }
  283. }
  284. [MessageType(0xFA00003)]
  285. public class UnitSnapDataItem : IExternalizable
  286. {
  287. public String unitName;
  288. public float x, y;
  289. public bool mapShow;
  290. public String unitMName;
  291. public String unitMIcon;
  292. public float offsetX;
  293. public float offsetY;
  294. public float lableOffsetX;
  295. public float lableOffsetY;
  296. public int lableColor;
  297. public int lableSize;
  298. public bool lableOutLine;
  299. public void ReadExternal(IInputStream input)
  300. {
  301. this.unitName = input.GetUTF();
  302. this.x = input.GetF32();
  303. this.y = input.GetF32();
  304. this.mapShow = input.GetBool();
  305. this.unitMName = input.GetUTF();
  306. this.unitMIcon = input.GetUTF();
  307. this.offsetX = input.GetF32();
  308. this.offsetY = input.GetF32();
  309. this.lableOffsetX = input.GetF32();
  310. this.lableOffsetY = input.GetF32();
  311. this.lableColor = input.GetS32();
  312. this.lableSize = input.GetS32();
  313. this.lableOutLine = input.GetBool();
  314. }
  315. public void WriteExternal(IOutputStream output)
  316. {
  317. output.PutUTF(this.unitName);
  318. output.PutF32(this.x);
  319. output.PutF32(this.y);
  320. output.PutBool(this.mapShow);
  321. output.PutUTF(this.unitMName);
  322. output.PutUTF(this.unitMIcon);
  323. output.PutF32(this.offsetX);
  324. output.PutF32(this.offsetY);
  325. output.PutF32(this.lableOffsetX);
  326. output.PutF32(this.lableOffsetY);
  327. output.PutS32(this.lableColor);
  328. output.PutS32(this.lableSize);
  329. output.PutBool(this.lableOutLine);
  330. }
  331. }
  332. // 编辑器路点信息
  333. [MessageType(0xFA00004)]
  334. public class PointFlagSnapDataItem : IExternalizable
  335. {
  336. public String pointName;
  337. public float x, y;
  338. public void ReadExternal(IInputStream input)
  339. {
  340. this.pointName = input.GetUTF();
  341. this.x = input.GetF32();
  342. this.y = input.GetF32();
  343. }
  344. public void WriteExternal(IOutputStream output)
  345. {
  346. output.PutUTF(this.pointName);
  347. output.PutF32(this.x);
  348. output.PutF32(this.y);
  349. }
  350. }
  351. }