NativeRenderring.cs 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328
  1. /****************************************************************************
  2. * Copyright 2019 Nreal Techonology Limited. All rights reserved.
  3. *
  4. * This file is part of NRSDK.
  5. *
  6. * https://www.nreal.ai/
  7. *
  8. *****************************************************************************/
  9. namespace NRKernal
  10. {
  11. using System;
  12. using UnityEngine;
  13. using System.Runtime.InteropServices;
  14. using System.Diagnostics;
  15. /// <summary>
  16. /// HMD Eye offset Native API .
  17. /// </summary>
  18. public class NativeRenderring
  19. {
  20. private UInt64 m_RenderingHandle = 0;
  21. public UInt64 RenderingHandle
  22. {
  23. get
  24. {
  25. return m_RenderingHandle;
  26. }
  27. }
  28. private FrameInfo m_FrameInfo;
  29. private UInt64 m_ViewportListHandle;
  30. private IntPtr m_FrameTexturesPtr;
  31. public struct TexturesArray
  32. {
  33. [MarshalAs(UnmanagedType.SysInt)]
  34. public IntPtr leftTex;
  35. [MarshalAs(UnmanagedType.SysInt)]
  36. public IntPtr rightTex;
  37. }
  38. public NativeRenderring()
  39. {
  40. int sizeOfTextures = Marshal.SizeOf(typeof(TexturesArray));
  41. m_FrameTexturesPtr = Marshal.AllocHGlobal(sizeOfTextures);
  42. }
  43. ~NativeRenderring()
  44. {
  45. Marshal.FreeHGlobal(m_FrameTexturesPtr);
  46. }
  47. public bool Create()
  48. {
  49. var result = NativeApi.NRRenderingCreate(ref m_RenderingHandle);
  50. //AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
  51. //AndroidJavaObject activity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity");
  52. //AndroidJavaObject unityPlayerObj = activity.Get<AndroidJavaObject>("mUnityPlayer");
  53. //AndroidJavaObject surfaceViewObj = unityPlayerObj.Call<AndroidJavaObject>("getChildAt", 0);
  54. //AndroidJavaObject surfaceHolderObj = surfaceViewObj.Call<AndroidJavaObject>("getHolder");
  55. //AndroidJavaObject surfaceObj = surfaceHolderObj.Call<AndroidJavaObject>("getSurface");
  56. //var result = NativeApi.NRRenderingInitSetAndroidSurface(m_RenderingHandle, surfaceObj.GetRawObject());
  57. NativeErrorListener.Check(result, this, "Create");
  58. #if !UNITY_STANDALONE_WIN
  59. NativeColorSpace colorspace = QualitySettings.activeColorSpace == ColorSpace.Gamma ?
  60. NativeColorSpace.COLOR_SPACE_GAMMA : NativeColorSpace.COLOR_SPACE_LINEAR;
  61. NativeApi.NRRenderingInitSetTextureColorSpace(m_RenderingHandle, colorspace);
  62. #endif
  63. //NativeApi.NRRenderingInitSetFlags();
  64. return result == NativeResult.Success;
  65. }
  66. public bool Start()
  67. {
  68. if (m_RenderingHandle == 0)
  69. {
  70. return false;
  71. }
  72. var result = NativeApi.NRRenderingStart(m_RenderingHandle);
  73. NativeErrorListener.Check(result, this, "Start");
  74. return result == NativeResult.Success;
  75. }
  76. public bool Pause()
  77. {
  78. if (m_RenderingHandle == 0)
  79. {
  80. return false;
  81. }
  82. var result = NativeApi.NRRenderingPause(m_RenderingHandle);
  83. NativeErrorListener.Check(result, this, "Pause");
  84. return result == NativeResult.Success;
  85. }
  86. public bool Resume()
  87. {
  88. if (m_RenderingHandle == 0)
  89. {
  90. return false;
  91. }
  92. var result = NativeApi.NRRenderingResume(m_RenderingHandle);
  93. NativeErrorListener.Check(result, this, "Resume");
  94. return result == NativeResult.Success;
  95. }
  96. public void GetFramePresentTime(ref UInt64 present_time)
  97. {
  98. if (m_RenderingHandle == 0)
  99. {
  100. return;
  101. }
  102. NativeApi.NRRenderingGetFramePresentTime(m_RenderingHandle, ref present_time);
  103. }
  104. public bool GetFramePresentTimeByCount(ref UInt64 present_time, int count)
  105. {
  106. if (m_RenderingHandle == 0)
  107. {
  108. return false;
  109. }
  110. var result = NativeApi.NRRenderingGetFramePresentTimeByCount(m_RenderingHandle, count, ref present_time);
  111. return result == NativeResult.Success;
  112. }
  113. public bool DoRender()
  114. {
  115. if (m_RenderingHandle == 0)
  116. {
  117. return false;
  118. }
  119. #if !UNITY_EDITOR
  120. FrameInfo framinfo = m_FrameInfo;
  121. var result = NativeApi.NRRenderingDoRender(m_RenderingHandle, framinfo.leftTex, framinfo.rightTex, ref framinfo.headPose);
  122. return result == NativeResult.Success;
  123. #else
  124. return true;
  125. #endif
  126. }
  127. public void DoSubmitFrame(IFrameProcessor frameProcessor)
  128. {
  129. if (m_RenderingHandle == 0 || frameProcessor == null)
  130. return;
  131. FrameInfo framinfo = m_FrameInfo;
  132. var frame_handle = framinfo.frameHandle;
  133. // NRDebugger.Info("[NativeRenderer] DoSubmitFrame: frameCnt={2}, frameHandle={0}, viewportListHandle={1}", frame_handle, m_ViewportListHandle, Time.frameCount);
  134. NativeApi.NRFrameSetRenderingPose(m_RenderingHandle, frame_handle, ref framinfo.headPose);
  135. NativeApi.NRFrameSetFocusPlane(m_RenderingHandle, frame_handle, ref framinfo.focusPosition, ref framinfo.normalPosition);
  136. NativeApi.NRFrameSetPresentTime(m_RenderingHandle, frame_handle, framinfo.presentTime);
  137. NativeApi.NRFrameSetFlag(m_RenderingHandle, frame_handle, (int)(framinfo.changeFlag));
  138. frameProcessor.SubmitFrame(frame_handle, m_ViewportListHandle);
  139. m_ViewportListHandle = 0;
  140. }
  141. public UInt64 CreateFrameHandle()
  142. {
  143. UInt64 frame_handle = 0;
  144. NativeApi.NRFrameCreate(m_RenderingHandle, ref frame_handle);
  145. return frame_handle;
  146. }
  147. public void DoExtendedRenderring()
  148. {
  149. FrameInfo framinfo = m_FrameInfo;
  150. var frame_handle = framinfo.frameHandle;
  151. // NRDebugger.Info("[NativeRenderer] DoExtendedRenderring: frameHandle={0}", frame_handle);
  152. NativeApi.NRFrameSetColorTextures(m_RenderingHandle, frame_handle, m_FrameTexturesPtr, 2);
  153. NativeApi.NRFrameSetRenderingPose(m_RenderingHandle, frame_handle, ref framinfo.headPose);
  154. NativeApi.NRFrameSetFocusPlanePoint(m_RenderingHandle, frame_handle, ref framinfo.focusPosition);
  155. NativeApi.NRFrameSetFocusPlaneNormal(m_RenderingHandle, frame_handle, ref framinfo.normalPosition);
  156. NativeApi.NRFrameSetPresentTime(m_RenderingHandle, frame_handle, framinfo.presentTime);
  157. NativeApi.NRFrameSetFlag(m_RenderingHandle, frame_handle, (int)(framinfo.changeFlag));
  158. NativeApi.NRFrameSetColorTextureType(m_RenderingHandle, frame_handle, framinfo.textureType);
  159. var result = NativeApi.NRRenderingDoRenderEx(m_RenderingHandle, frame_handle);
  160. NativeErrorListener.Check(result, this, "DoRenderEXP");
  161. NativeApi.NRFrameDestroy(m_RenderingHandle, frame_handle);
  162. }
  163. public void WriteFrameData(FrameInfo frame, UInt64 viewportListHandle, bool directMode)
  164. {
  165. m_FrameInfo = frame;
  166. m_ViewportListHandle = viewportListHandle;
  167. if (directMode)
  168. {
  169. TexturesArray textures = new TexturesArray()
  170. {
  171. leftTex = frame.leftTex,
  172. rightTex = frame.rightTex
  173. };
  174. Marshal.StructureToPtr(textures, m_FrameTexturesPtr, true);
  175. }
  176. }
  177. public bool Destroy()
  178. {
  179. if (m_RenderingHandle == 0)
  180. {
  181. return false;
  182. }
  183. NativeResult result = NativeApi.NRRenderingDestroy(m_RenderingHandle);
  184. NativeErrorListener.Check(result, this, "Destroy");
  185. return result == NativeResult.Success;
  186. }
  187. private partial struct NativeApi
  188. {
  189. [DllImport(NativeConstants.NRNativeLibrary)]
  190. public static extern NativeResult NRRenderingCreate(ref UInt64 out_rendering_handle);
  191. [DllImport(NativeConstants.NRNativeLibrary)]
  192. public static extern NativeResult NRRenderingInitSetTextureColorSpace(UInt64 rendering_handle, NativeColorSpace color_space);
  193. [DllImport(NativeConstants.NRNativeLibrary)]
  194. public static extern NativeResult NRRenderingStart(UInt64 rendering_handle);
  195. [DllImport(NativeConstants.NRNativeLibrary)]
  196. public static extern NativeResult NRRenderingDestroy(UInt64 rendering_handle);
  197. [DllImport(NativeConstants.NRNativeLibrary)]
  198. public static extern NativeResult NRRenderingPause(UInt64 rendering_handle);
  199. [DllImport(NativeConstants.NRNativeLibrary)]
  200. public static extern NativeResult NRRenderingResume(UInt64 rendering_handle);
  201. #if !UNITY_EDITOR
  202. [DllImport(NativeConstants.NRNativeLibrary)]
  203. public static extern NativeResult NRRenderingInitSetAndroidSurface(
  204. UInt64 rendering_handle, IntPtr android_surface);
  205. #endif
  206. //overlay dont need this function
  207. [DllImport(NativeConstants.NRNativeLibrary)]
  208. public static extern NativeResult NRRenderingDoRenderEx(UInt64 rendering_handle, UInt64 frame_handle);
  209. //overlay dont need this function
  210. [DllImport(NativeConstants.NRNativeLibrary)]
  211. public static extern NativeResult NRRenderingInitSetFlags(UInt64 rendering_handle, NRRenderingFlags rendering_flags);
  212. //overlay dont need this function
  213. [DllImport(NativeConstants.NRNativeLibrary)]
  214. public static extern NativeResult NRFrameCreate(UInt64 rendering_handle, ref UInt64 out_frame_handle);
  215. //overlay dont need this function
  216. [DllImport(NativeConstants.NRNativeLibrary)]
  217. public static extern NativeResult NRFrameDestroy(UInt64 rendering_handle, UInt64 frame_handle);
  218. /// <summary>
  219. /// overlay dont need this function
  220. /// </summary>
  221. /// <param name="rendering_handle"></param>
  222. /// <param name="frame_handle"></param>
  223. /// <param name="color_textures"></param>
  224. /// <param name="color_texture_count"></param>
  225. /// <returns></returns>
  226. [DllImport(NativeConstants.NRNativeLibrary)]
  227. public static extern NativeResult NRFrameSetColorTextures(UInt64 rendering_handle, UInt64 frame_handle,
  228. IntPtr color_textures, int color_texture_count);
  229. [DllImport(NativeConstants.NRNativeLibrary)]
  230. public static extern NativeResult NRFrameSetRenderingPose(UInt64 rendering_handle, UInt64 frame_handle,
  231. ref NativeMat4f transform);
  232. [DllImport(NativeConstants.NRNativeLibrary)]
  233. public static extern NativeResult NRFrameSetFocusPlanePoint(UInt64 rendering_handle, UInt64 frame_handle,
  234. ref NativeVector3f plane_point);
  235. [DllImport(NativeConstants.NRNativeLibrary)]
  236. public static extern NativeResult NRFrameSetFocusPlaneNormal(UInt64 rendering_handle, UInt64 frame_handle,
  237. ref NativeVector3f plane_normal);
  238. [DllImport(NativeConstants.NRNativeLibrary)]
  239. public static extern NativeResult NRFrameSetPresentTime(UInt64 rendering_handle, UInt64 frame_handle, UInt64 present_time);
  240. [DllImport(NativeConstants.NRNativeLibrary)]
  241. public static extern NativeResult NRFrameSetFlag(UInt64 rendering_handle, UInt64 frame_handle,
  242. int change_flag);
  243. [DllImport(NativeConstants.NRNativeLibrary)]
  244. public static extern NativeResult NRFrameSetFocusPlane(UInt64 rendering_handle, UInt64 frame_handle, ref NativeVector3f plane_point, ref NativeVector3f plane_normal);
  245. /// <summary>
  246. /// overlay dont need this function
  247. /// </summary>
  248. /// <param name="rendering_handle"></param>
  249. /// <param name="frame_handle"></param>
  250. /// <param name="texture_type"></param>
  251. /// <returns></returns>
  252. [DllImport(NativeConstants.NRNativeLibrary)]
  253. public static extern NativeResult NRFrameSetColorTextureType(UInt64 rendering_handle, UInt64 frame_handle,
  254. NRTextureType texture_type);
  255. [DllImport(NativeConstants.NRNativeLibrary)]
  256. public static extern NativeResult NRRenderingGetFramePresentTime(UInt64 rendering_handle, ref UInt64 frame_present_time);
  257. [DllImport(NativeConstants.NRNativeLibrary)]
  258. public static extern NativeResult NRRenderingGetFramePresentTimeByCount(UInt64 rendering_handle,
  259. int extra_frame_count, ref UInt64 frame_present_time);
  260. /// <summary>
  261. /// overlay dont need this function
  262. /// </summary>
  263. /// <param name="rendering_handle"></param>
  264. /// <param name="left_eye_texture"></param>
  265. /// <param name="right_eye_texture"></param>
  266. /// <param name="head_pose"></param>
  267. /// <returns></returns>
  268. [DllImport(NativeConstants.NRNativeLibrary)]
  269. public static extern NativeResult NRRenderingDoRender(UInt64 rendering_handle,
  270. IntPtr left_eye_texture, IntPtr right_eye_texture, ref NativeMat4f head_pose);
  271. };
  272. }
  273. }