MegaParseEditor.cs 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276
  1. 
  2. using UnityEditor;
  3. using UnityEngine;
  4. using System;
  5. using System.IO;
  6. using System.Collections.Generic;
  7. public delegate bool ParseBinCallbackType(BinaryReader br, string id);
  8. public delegate void ParseClassCallbackType(string classname, BinaryReader br);
  9. public class MegaParseBezFloatControl
  10. {
  11. static MegaBezFloatKeyControl con;
  12. static public MegaBezFloatKeyControl LoadBezFloatKeyControl(BinaryReader br)
  13. {
  14. con = new MegaBezFloatKeyControl();
  15. MegaParse.Parse(br, Parse);
  16. return con;
  17. }
  18. static public bool Parse(BinaryReader br, string id)
  19. {
  20. switch ( id )
  21. {
  22. case "Num":
  23. int num = br.ReadInt32();
  24. //Debug.Log("numkeys " + num);
  25. con.Keys = new MegaBezFloatKey[num];
  26. con.Times = new float[num];
  27. break;
  28. case "Keys":
  29. for ( int i = 0; i < con.Keys.Length; i++ )
  30. {
  31. con.Keys[i] = new MegaBezFloatKey();
  32. con.Keys[i].val = br.ReadSingle();
  33. con.Keys[i].intan = br.ReadSingle();
  34. con.Keys[i].outtan = br.ReadSingle();
  35. con.Times[i] = br.ReadSingle();
  36. }
  37. con.InitKeys();
  38. break;
  39. case "MKeys":
  40. for ( int i = 0; i < con.Keys.Length; i++ )
  41. {
  42. con.Keys[i] = new MegaBezFloatKey();
  43. con.Keys[i].val = br.ReadSingle();
  44. con.Keys[i].intan = br.ReadSingle();
  45. con.Keys[i].outtan = br.ReadSingle();
  46. con.Times[i] = br.ReadSingle();
  47. }
  48. con.InitKeys(1.0f);
  49. break;
  50. case "HKeys":
  51. for ( int i = 0; i < con.Keys.Length; i++ )
  52. {
  53. con.Keys[i] = new MegaBezFloatKey();
  54. con.Keys[i].val = br.ReadSingle();
  55. //Debug.Log("k" + i + " = " + con.Keys[i].val);
  56. con.Keys[i].intanx = br.ReadSingle();
  57. con.Keys[i].outtanx = br.ReadSingle();
  58. con.Keys[i].intan = br.ReadSingle();
  59. con.Keys[i].outtan = br.ReadSingle();
  60. con.Times[i] = br.ReadSingle();
  61. }
  62. con.InitKeysMaya();
  63. break;
  64. case "BKeys": // Blender keys
  65. Vector2 co = Vector2.zero;
  66. Vector2 left = Vector2.zero;
  67. Vector3 right = Vector2.zero;
  68. Vector2 pco = Vector2.zero;
  69. Vector2 pleft = Vector2.zero;
  70. Vector3 pright = Vector2.zero;
  71. for ( int i = 0; i < con.Keys.Length; i++ )
  72. {
  73. con.Keys[i] = new MegaBezFloatKey();
  74. co.x = br.ReadSingle();
  75. co.y = br.ReadSingle();
  76. left.x = br.ReadSingle();
  77. left.y = br.ReadSingle();
  78. right.x = br.ReadSingle();
  79. right.y = br.ReadSingle();
  80. if ( i > 0 )
  81. con.MakeKey(con.Keys[i - 1], pco, pleft, pright, co, left, right);
  82. pco = co;
  83. pleft = left;
  84. pright = right;
  85. con.Times[i] = co.x / 30.0f;
  86. }
  87. break;
  88. }
  89. return true;
  90. }
  91. }
  92. public class MegaParseBezVector3Control
  93. {
  94. static MegaBezVector3KeyControl con;
  95. static public MegaBezVector3KeyControl LoadBezVector3KeyControl(BinaryReader br)
  96. {
  97. con = new MegaBezVector3KeyControl();
  98. MegaParse.Parse(br, Parse);
  99. return con;
  100. }
  101. static public bool Parse(BinaryReader br, string id)
  102. {
  103. switch ( id )
  104. {
  105. case "Num":
  106. int num = br.ReadInt32();
  107. con.Keys = new MegaBezVector3Key[num];
  108. con.Times = new float[num];
  109. break;
  110. case "Keys":
  111. for ( int i = 0; i < con.Keys.Length; i++ )
  112. {
  113. con.Keys[i] = new MegaBezVector3Key();
  114. con.Keys[i].val = MegaParse.ReadP3(br);
  115. con.Keys[i].intan = MegaParse.ReadP3(br);
  116. con.Keys[i].outtan = MegaParse.ReadP3(br);
  117. con.Times[i] = br.ReadSingle();
  118. }
  119. con.InitKeys();
  120. break;
  121. }
  122. return true;
  123. }
  124. }
  125. public class MegaParse
  126. {
  127. static public Vector3 ReadP3(BinaryReader br)
  128. {
  129. Vector3 v = Vector3.zero;
  130. v.x = br.ReadSingle();
  131. v.y = br.ReadSingle();
  132. v.z = br.ReadSingle();
  133. return v;
  134. }
  135. static public string ReadString(BinaryReader br)
  136. {
  137. int len = br.ReadInt32();
  138. string str = new string(br.ReadChars(len - 1));
  139. br.ReadChar();
  140. return str;
  141. }
  142. static public string ReadStr(BinaryReader br)
  143. {
  144. string str = "";
  145. while ( true )
  146. {
  147. char c = br.ReadChar();
  148. if ( c == 0 )
  149. break;
  150. str += c;
  151. }
  152. return str;
  153. }
  154. static public Vector3[] ReadP3v(BinaryReader br)
  155. {
  156. int count = br.ReadInt32();
  157. Vector3[] tab = new Vector3[count];
  158. for ( int i = 0; i < count; i++ )
  159. {
  160. tab[i].x = br.ReadSingle();
  161. tab[i].y = br.ReadSingle();
  162. tab[i].z = br.ReadSingle();
  163. }
  164. return tab;
  165. }
  166. static public List<Vector3> ReadP3l(BinaryReader br)
  167. {
  168. int count = br.ReadInt32();
  169. List<Vector3> tab = new List<Vector3>(count);
  170. Vector3 p = Vector3.zero;
  171. for ( int i = 0; i < count; i++ )
  172. {
  173. p.x = br.ReadSingle();
  174. p.y = br.ReadSingle();
  175. p.z = br.ReadSingle();
  176. tab.Add(p);
  177. }
  178. return tab;
  179. }
  180. static public float ReadMotFloat(BinaryReader br)
  181. {
  182. byte[] floatBytes = br.ReadBytes(4);
  183. // swap the bytes
  184. Array.Reverse(floatBytes);
  185. // get the float from the byte array
  186. return BitConverter.ToSingle(floatBytes, 0);
  187. }
  188. static public double ReadMotDouble(BinaryReader br)
  189. {
  190. byte[] floatBytes = br.ReadBytes(8);
  191. // swap the bytes
  192. Array.Reverse(floatBytes);
  193. // get the float from the byte array
  194. return BitConverter.ToDouble(floatBytes, 0);
  195. }
  196. static public int ReadMotInt(BinaryReader br)
  197. {
  198. byte[] floatBytes = br.ReadBytes(4);
  199. // swap the bytes
  200. Array.Reverse(floatBytes);
  201. // get the float from the byte array
  202. return BitConverter.ToInt32(floatBytes, 0);
  203. }
  204. //public delegate bool ParseBinCallbackType(BinaryReader br, string id);
  205. //public delegate void ParseClassCallbackType(string classname, BinaryReader br);
  206. static public void Parse(BinaryReader br, ParseBinCallbackType cb)
  207. {
  208. bool readchunk = true;
  209. while ( readchunk )
  210. {
  211. string id = MegaParse.ReadString(br);
  212. if ( id == "eoc" )
  213. break;
  214. int skip = br.ReadInt32();
  215. long fpos = br.BaseStream.Position;
  216. if ( !cb(br, id) )
  217. {
  218. Debug.Log("Error Loading chunk id " + id);
  219. readchunk = false; // done
  220. break;
  221. }
  222. br.BaseStream.Position = fpos + skip;
  223. }
  224. }
  225. }