AppManager.cs 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using CScript.Utilities;
  5. using CScript.Net;
  6. using CScript.Entity;
  7. using System;
  8. using System.IO;
  9. using UnityEngine.UI;
  10. using OpenCVForUnity.UnityUtils;
  11. using OpenCVForUnity.CoreModule;
  12. using OpenCVForUnity.ImgprocModule;
  13. using OpenCVForUnity.ImgcodecsModule;
  14. using SC.XR.Unity;
  15. using System.Text;
  16. using UnityEngine.Networking;
  17. using Newtonsoft.Json;
  18. namespace CScript.App
  19. {
  20. public enum ConnectType
  21. {
  22. None = 0,
  23. TCPServer = 1,
  24. Quic =2,
  25. }
  26. public class IpConfig
  27. {
  28. public string ip { get; set; }
  29. public int port { get; set; }
  30. }
  31. public class AppManager : MonoSingleton<AppManager>
  32. {
  33. Server _server;
  34. public ConnectType connectType = ConnectType.None;
  35. public Queue<NetMeshData> meshQueue = new Queue<NetMeshData>();
  36. private Dictionary<NetMeshData, Mat> _meshDataMatDic = new Dictionary<NetMeshData, Mat>();
  37. public GameObject MeshPoint;
  38. public Material meshFrontMaterial;
  39. public Material meshSideMaterial;
  40. public GameObject meshFrontPoint;
  41. public GameObject meshSidePoint;
  42. public GameObject meshFrontPointNew;
  43. public GameObject meshSidePointNew;
  44. public bool isRunHolographic;
  45. private Renderer _meshFrontRender;
  46. private MeshFilter _meshFrontFilter;
  47. private Renderer __meshFrontRenderChild;
  48. private MeshFilter _meshFrontFilterChild;
  49. private Renderer _meshSideRender;
  50. private MeshFilter _meshSideFilter;
  51. private NetMeshData _currMeshData;
  52. private Queue<byte[]> _meshDatas;
  53. private string configPath = "/Config/ConfigData.json";
  54. ConfigData configData;
  55. [SerializeField]
  56. private Transform meshPoint;
  57. IEnumerator renderThreadCoroutine;
  58. Mat _rgbMat;
  59. public Texture2D _tex;
  60. private bool _gotMeshData = false;
  61. public NetMeshData CurrMeshData
  62. {
  63. get
  64. {
  65. return _currMeshData;
  66. }
  67. private set
  68. {
  69. _currMeshData = value;
  70. if (_currMeshData != null)
  71. {
  72. _rgbMat = _meshDataMatDic[_currMeshData];
  73. // Imgcodecs.imwrite(Application.dataPath+"xxx.jpg", _rgbMat);
  74. if (_tex == null || _tex.width != _rgbMat.cols() || _tex.height != _rgbMat.rows())
  75. {
  76. _tex = new Texture2D(_rgbMat.cols(), _rgbMat.rows(), TextureFormat.RGB24, false);
  77. }
  78. _meshDataMatDic.Remove(_currMeshData);
  79. DrawModel(_currMeshData);
  80. CurrMeshData = null;
  81. ReadMeshData();
  82. }
  83. }
  84. }
  85. private void Awake()
  86. {
  87. _server = Server.Instance;
  88. _meshFrontFilter = AppConfig.isNewMeshData ? meshFrontPointNew.AddComponent<MeshFilter>() : meshFrontPoint.AddComponent<MeshFilter>();
  89. _meshFrontRender = AppConfig.isNewMeshData ? meshFrontPointNew.AddComponent<MeshRenderer>() : meshFrontPoint.AddComponent<MeshRenderer>();
  90. _meshFrontRender.material = meshFrontMaterial;
  91. _meshSideFilter = AppConfig.isNewMeshData ? meshSidePointNew.AddComponent<MeshFilter>() : meshSidePoint.AddComponent<MeshFilter>();
  92. _meshSideRender = AppConfig.isNewMeshData ? meshSidePointNew.AddComponent<MeshRenderer>() : meshSidePoint.AddComponent<MeshRenderer>();
  93. _meshSideRender.material = meshSideMaterial;
  94. _currMeshData = null;
  95. Net.NetDistribute.Instance.drawMeshAction += DrawMeshHandler;
  96. Net.NetDistribute.Instance.OnConnectAction += ConnectSuccess;
  97. if (AppConfig.isNewMeshData)
  98. {
  99. //connectType = ConnectType.TCPServer;
  100. }
  101. }
  102. bool isConnected;
  103. private void OnDestroy()
  104. {
  105. _server.Close();
  106. Net.NetDistribute.Instance.OnConnectAction -= ConnectSuccess;
  107. Net.NetDistribute.Instance.drawMeshAction -= DrawMeshHandler;
  108. }
  109. private byte[] PackMessage(NetMessage message)
  110. {
  111. byte[] package = null;
  112. using (MemoryStream ms = new MemoryStream())
  113. {
  114. ProtoBuf.Serializer.Serialize(ms, message);
  115. package = new byte[ms.Length];
  116. Buffer.BlockCopy(ms.GetBuffer(), 0, package, 0, (int)ms.Length);
  117. }
  118. return package;
  119. }
  120. void Start()
  121. {
  122. renderThreadCoroutine = CallAtEndOfFrames();
  123. _gotMeshData = false;
  124. Texture2D texture2D = Resources.Load("uvMap") as Texture2D;
  125. Mat imgMat = new Mat(texture2D.height, texture2D.width, CvType.CV_8UC4);
  126. Utils.texture2DToMat(texture2D, imgMat);
  127. ConectServerHandler();
  128. }
  129. string ipPath;
  130. IpConfig ip;
  131. private void ConectServerHandler()
  132. {
  133. // _server.Init("127.0.0.1", 5555);
  134. ipPath = Application.persistentDataPath + "/Ipconfig/" + "QXip.txt";
  135. StartCoroutine(SettingIP());
  136. // _server.Init("192.168.50.17", 6666);
  137. // _server.Connect();
  138. }
  139. private void ConnectSuccess(bool result, string reason)
  140. {
  141. if (result)
  142. {
  143. isConnected = true;
  144. }
  145. }
  146. IEnumerator SettingIP()
  147. {
  148. yield return new WaitForSeconds(0.2f);
  149. if (File.Exists(ipPath))
  150. {
  151. //var webRequest = UnityWebRequest.Get(ipPath);
  152. //yield return webRequest.SendWebRequest();
  153. //if (webRequest.error != null)
  154. //{
  155. // Debug.Log("通信中");
  156. // yield return webRequest;
  157. //}
  158. //var downloadHandler = webRequest.downloadHandler;
  159. //if (!downloadHandler.isDone)
  160. //{
  161. // Debug.Log("下载中");
  162. // yield return downloadHandler;
  163. //}
  164. //else
  165. //{
  166. // Debug.Log("下载成功");
  167. // Debug.Log(downloadHandler.data);
  168. // // if (!File.Exists(Application.dataPath + "/Resources/YourVideoName.mp4"))
  169. // string data = System.Text.Encoding.Default.GetString(downloadHandler.data);
  170. // ip = JsonConvert.DeserializeObject<IpConfig>(data);
  171. // if (ip.ip == null || ip.port <999)
  172. // Application.Quit();
  173. // _server.Init(ip.ip, ip.port);
  174. // _server.Connect();
  175. //}
  176. FileStream fileStream = new FileStream(ipPath, FileMode.Open, FileAccess.Read);
  177. fileStream.Seek(0, SeekOrigin.Begin);
  178. //创建文件长度缓冲区
  179. byte[] bytes = new byte[fileStream.Length];
  180. //读取文件
  181. fileStream.Read(bytes, 0, (int)fileStream.Length);
  182. Debug.Log(" bytes " + bytes.Length);
  183. //释放文件读取流
  184. fileStream.Close();
  185. fileStream.Dispose();
  186. fileStream = null;
  187. string data = System.Text.Encoding.Default.GetString(bytes);
  188. ip = JsonConvert.DeserializeObject<IpConfig>(data); _server.Init(ip.ip, ip.port);
  189. if (ip.ip == null || ip.port < 999)
  190. Application.Quit();
  191. _server.Init(ip.ip, ip.port);
  192. _server.Connect();
  193. }
  194. else
  195. {
  196. Directory.CreateDirectory(Application.persistentDataPath + "/Ipconfig");
  197. FileInfo fileInfo = new FileInfo(ipPath);
  198. //设置Log文件输出地址
  199. FileStream FileWriter = fileInfo.Open(FileMode.Create, FileAccess.ReadWrite, FileShare.Read);
  200. UTF8Encoding encoding = new UTF8Encoding();
  201. ip = new IpConfig();
  202. ip.ip = "192.168.50.120";
  203. ip.port = 6666;
  204. string data = JsonConvert.SerializeObject(ip);
  205. FileWriter.Write(encoding.GetBytes(data), 0, encoding.GetByteCount(data));
  206. FileWriter.Close();
  207. _server.Init(ip.ip, ip.port);
  208. _server.Connect();
  209. }
  210. }
  211. /// <summary>
  212. /// Calls at end of frames.
  213. /// </summary>
  214. private IEnumerator CallAtEndOfFrames()
  215. {
  216. while (true)
  217. {
  218. // Wait until all frame rendering is done
  219. yield return new WaitForEndOfFrame();
  220. if (_rgbMat != null && _tex != null)
  221. {
  222. Utils.matToTextureInRenderThread(_rgbMat, _tex);
  223. }
  224. }
  225. }
  226. private float imageDecodeTime;
  227. private void DrawMeshHandler(NetMeshData meshData, Mat rgbMat, int totalByte,float imageDecodeTime,int lostCount)
  228. {
  229. this.imageDecodeTime = imageDecodeTime;
  230. //this._rgbMat = rgbMat;
  231. // if (meshQueue.Count == 0)
  232. {
  233. meshQueue.Enqueue(meshData);
  234. _meshDataMatDic.Add(meshData, rgbMat);
  235. if (CurrMeshData == null)
  236. {
  237. _gotMeshData = true;
  238. }
  239. }
  240. }
  241. private void ReadMeshData()
  242. {
  243. if (CurrMeshData == null)
  244. {
  245. if (meshQueue.Count > 0)
  246. {
  247. CurrMeshData = meshQueue.Dequeue();
  248. }
  249. }
  250. }
  251. void Update()
  252. {
  253. if (_gotMeshData)
  254. {
  255. ReadMeshData();
  256. }
  257. }
  258. void DrawModel(NetMeshData meshData, bool isFront = true)
  259. {
  260. //Debug.LogWarning("DrawModel:"+ meshData.uvList.Length);
  261. if (_meshFrontFilter.sharedMesh != null)
  262. {
  263. _meshFrontFilter.sharedMesh.Clear();
  264. }
  265. _meshFrontFilter.sharedMesh = DrawMesh1(meshData);
  266. Utils.fastMatToTexture2D(_rgbMat, _tex);
  267. meshFrontMaterial.mainTexture = _tex;
  268. _meshFrontFilter.sharedMesh.uv = meshData.uvList;//uvArray;// meshData.uvList;
  269. _meshFrontFilter.sharedMesh.triangles = meshData.Triangles1;// triangles;// meshData.Triangles1;
  270. _meshFrontFilter.sharedMesh.colors = null;
  271. if (_meshSideFilter.sharedMesh != null)
  272. {
  273. _meshSideFilter.sharedMesh.Clear();
  274. }
  275. _meshSideFilter.sharedMesh = DrawMesh2(meshData);
  276. _meshSideFilter.sharedMesh.triangles = meshData.Triangles2;
  277. _meshSideFilter.sharedMesh.colors = meshData.colorList;
  278. }
  279. Mesh mesh1;
  280. Mesh mesh1Child;
  281. Mesh mesh2;
  282. Mesh DrawMesh1(NetMeshData meshData)
  283. {
  284. if (mesh1 == null)
  285. {
  286. mesh1 = new Mesh();
  287. mesh1.indexFormat = UnityEngine.Rendering.IndexFormat.UInt32;
  288. }
  289. mesh1.Clear();
  290. mesh1.vertices = meshData.frontVertexList;// meshData.frontVertexList;// newVertex;
  291. return mesh1;
  292. }
  293. Mesh DrawMesh2(NetMeshData meshData, bool isFront = true)
  294. {
  295. if (mesh2 == null)
  296. {
  297. mesh2 = new Mesh();
  298. }
  299. mesh2.Clear();
  300. mesh2.vertices = meshData.sideVertexList;// newVertex;
  301. return mesh2;
  302. }
  303. public void SaveConfig(string Path, string information)
  304. {
  305. FileStream aFile = new FileStream(@"" + Path, FileMode.OpenOrCreate, System.IO.FileAccess.ReadWrite, FileShare.ReadWrite);
  306. StreamWriter sw = new StreamWriter(aFile, Encoding.UTF8);
  307. sw.WriteLine(information);
  308. sw.Close();
  309. sw.Dispose();
  310. }
  311. }
  312. }