/**************************************************************************** * Copyright 2019 Nreal Techonology Limited. All rights reserved. * * This file is part of NRSDK. * * https://www.nreal.ai/ * *****************************************************************************/ namespace NRKernal { using System; using UnityEngine; using System.Runtime.InteropServices; using System.Diagnostics; /// /// HMD Eye offset Native API . /// public class NativeRenderring { private UInt64 m_RenderingHandle = 0; public UInt64 RenderingHandle { get { return m_RenderingHandle; } } private FrameInfo m_FrameInfo; private UInt64 m_ViewportListHandle; private IntPtr m_FrameTexturesPtr; public struct TexturesArray { [MarshalAs(UnmanagedType.SysInt)] public IntPtr leftTex; [MarshalAs(UnmanagedType.SysInt)] public IntPtr rightTex; } public NativeRenderring() { int sizeOfTextures = Marshal.SizeOf(typeof(TexturesArray)); m_FrameTexturesPtr = Marshal.AllocHGlobal(sizeOfTextures); } ~NativeRenderring() { Marshal.FreeHGlobal(m_FrameTexturesPtr); } public bool Create() { var result = NativeApi.NRRenderingCreate(ref m_RenderingHandle); //AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); //AndroidJavaObject activity = unityPlayer.GetStatic("currentActivity"); //AndroidJavaObject unityPlayerObj = activity.Get("mUnityPlayer"); //AndroidJavaObject surfaceViewObj = unityPlayerObj.Call("getChildAt", 0); //AndroidJavaObject surfaceHolderObj = surfaceViewObj.Call("getHolder"); //AndroidJavaObject surfaceObj = surfaceHolderObj.Call("getSurface"); //var result = NativeApi.NRRenderingInitSetAndroidSurface(m_RenderingHandle, surfaceObj.GetRawObject()); NativeErrorListener.Check(result, this, "Create"); #if !UNITY_STANDALONE_WIN NativeColorSpace colorspace = QualitySettings.activeColorSpace == ColorSpace.Gamma ? NativeColorSpace.COLOR_SPACE_GAMMA : NativeColorSpace.COLOR_SPACE_LINEAR; NativeApi.NRRenderingInitSetTextureColorSpace(m_RenderingHandle, colorspace); #endif //NativeApi.NRRenderingInitSetFlags(); return result == NativeResult.Success; } public bool Start() { if (m_RenderingHandle == 0) { return false; } var result = NativeApi.NRRenderingStart(m_RenderingHandle); NativeErrorListener.Check(result, this, "Start"); return result == NativeResult.Success; } public bool Pause() { if (m_RenderingHandle == 0) { return false; } var result = NativeApi.NRRenderingPause(m_RenderingHandle); NativeErrorListener.Check(result, this, "Pause"); return result == NativeResult.Success; } public bool Resume() { if (m_RenderingHandle == 0) { return false; } var result = NativeApi.NRRenderingResume(m_RenderingHandle); NativeErrorListener.Check(result, this, "Resume"); return result == NativeResult.Success; } public void GetFramePresentTime(ref UInt64 present_time) { if (m_RenderingHandle == 0) { return; } NativeApi.NRRenderingGetFramePresentTime(m_RenderingHandle, ref present_time); } public bool GetFramePresentTimeByCount(ref UInt64 present_time, int count) { if (m_RenderingHandle == 0) { return false; } var result = NativeApi.NRRenderingGetFramePresentTimeByCount(m_RenderingHandle, count, ref present_time); return result == NativeResult.Success; } public bool DoRender() { if (m_RenderingHandle == 0) { return false; } #if !UNITY_EDITOR FrameInfo framinfo = m_FrameInfo; var result = NativeApi.NRRenderingDoRender(m_RenderingHandle, framinfo.leftTex, framinfo.rightTex, ref framinfo.headPose); return result == NativeResult.Success; #else return true; #endif } public void DoSubmitFrame(IFrameProcessor frameProcessor) { if (m_RenderingHandle == 0 || frameProcessor == null) return; FrameInfo framinfo = m_FrameInfo; var frame_handle = framinfo.frameHandle; // NRDebugger.Info("[NativeRenderer] DoSubmitFrame: frameCnt={2}, frameHandle={0}, viewportListHandle={1}", frame_handle, m_ViewportListHandle, Time.frameCount); NativeApi.NRFrameSetRenderingPose(m_RenderingHandle, frame_handle, ref framinfo.headPose); NativeApi.NRFrameSetFocusPlane(m_RenderingHandle, frame_handle, ref framinfo.focusPosition, ref framinfo.normalPosition); NativeApi.NRFrameSetPresentTime(m_RenderingHandle, frame_handle, framinfo.presentTime); NativeApi.NRFrameSetFlag(m_RenderingHandle, frame_handle, (int)(framinfo.changeFlag)); frameProcessor.SubmitFrame(frame_handle, m_ViewportListHandle); m_ViewportListHandle = 0; } public UInt64 CreateFrameHandle() { UInt64 frame_handle = 0; NativeApi.NRFrameCreate(m_RenderingHandle, ref frame_handle); return frame_handle; } public void DoExtendedRenderring() { FrameInfo framinfo = m_FrameInfo; var frame_handle = framinfo.frameHandle; // NRDebugger.Info("[NativeRenderer] DoExtendedRenderring: frameHandle={0}", frame_handle); NativeApi.NRFrameSetColorTextures(m_RenderingHandle, frame_handle, m_FrameTexturesPtr, 2); NativeApi.NRFrameSetRenderingPose(m_RenderingHandle, frame_handle, ref framinfo.headPose); NativeApi.NRFrameSetFocusPlanePoint(m_RenderingHandle, frame_handle, ref framinfo.focusPosition); NativeApi.NRFrameSetFocusPlaneNormal(m_RenderingHandle, frame_handle, ref framinfo.normalPosition); NativeApi.NRFrameSetPresentTime(m_RenderingHandle, frame_handle, framinfo.presentTime); NativeApi.NRFrameSetFlag(m_RenderingHandle, frame_handle, (int)(framinfo.changeFlag)); NativeApi.NRFrameSetColorTextureType(m_RenderingHandle, frame_handle, framinfo.textureType); var result = NativeApi.NRRenderingDoRenderEx(m_RenderingHandle, frame_handle); NativeErrorListener.Check(result, this, "DoRenderEXP"); NativeApi.NRFrameDestroy(m_RenderingHandle, frame_handle); } public void WriteFrameData(FrameInfo frame, UInt64 viewportListHandle, bool directMode) { m_FrameInfo = frame; m_ViewportListHandle = viewportListHandle; if (directMode) { TexturesArray textures = new TexturesArray() { leftTex = frame.leftTex, rightTex = frame.rightTex }; Marshal.StructureToPtr(textures, m_FrameTexturesPtr, true); } } public bool Destroy() { if (m_RenderingHandle == 0) { return false; } NativeResult result = NativeApi.NRRenderingDestroy(m_RenderingHandle); NativeErrorListener.Check(result, this, "Destroy"); return result == NativeResult.Success; } private partial struct NativeApi { [DllImport(NativeConstants.NRNativeLibrary)] public static extern NativeResult NRRenderingCreate(ref UInt64 out_rendering_handle); [DllImport(NativeConstants.NRNativeLibrary)] public static extern NativeResult NRRenderingInitSetTextureColorSpace(UInt64 rendering_handle, NativeColorSpace color_space); [DllImport(NativeConstants.NRNativeLibrary)] public static extern NativeResult NRRenderingStart(UInt64 rendering_handle); [DllImport(NativeConstants.NRNativeLibrary)] public static extern NativeResult NRRenderingDestroy(UInt64 rendering_handle); [DllImport(NativeConstants.NRNativeLibrary)] public static extern NativeResult NRRenderingPause(UInt64 rendering_handle); [DllImport(NativeConstants.NRNativeLibrary)] public static extern NativeResult NRRenderingResume(UInt64 rendering_handle); #if !UNITY_EDITOR [DllImport(NativeConstants.NRNativeLibrary)] public static extern NativeResult NRRenderingInitSetAndroidSurface( UInt64 rendering_handle, IntPtr android_surface); #endif //overlay dont need this function [DllImport(NativeConstants.NRNativeLibrary)] public static extern NativeResult NRRenderingDoRenderEx(UInt64 rendering_handle, UInt64 frame_handle); //overlay dont need this function [DllImport(NativeConstants.NRNativeLibrary)] public static extern NativeResult NRRenderingInitSetFlags(UInt64 rendering_handle, NRRenderingFlags rendering_flags); //overlay dont need this function [DllImport(NativeConstants.NRNativeLibrary)] public static extern NativeResult NRFrameCreate(UInt64 rendering_handle, ref UInt64 out_frame_handle); //overlay dont need this function [DllImport(NativeConstants.NRNativeLibrary)] public static extern NativeResult NRFrameDestroy(UInt64 rendering_handle, UInt64 frame_handle); /// /// overlay dont need this function /// /// /// /// /// /// [DllImport(NativeConstants.NRNativeLibrary)] public static extern NativeResult NRFrameSetColorTextures(UInt64 rendering_handle, UInt64 frame_handle, IntPtr color_textures, int color_texture_count); [DllImport(NativeConstants.NRNativeLibrary)] public static extern NativeResult NRFrameSetRenderingPose(UInt64 rendering_handle, UInt64 frame_handle, ref NativeMat4f transform); [DllImport(NativeConstants.NRNativeLibrary)] public static extern NativeResult NRFrameSetFocusPlanePoint(UInt64 rendering_handle, UInt64 frame_handle, ref NativeVector3f plane_point); [DllImport(NativeConstants.NRNativeLibrary)] public static extern NativeResult NRFrameSetFocusPlaneNormal(UInt64 rendering_handle, UInt64 frame_handle, ref NativeVector3f plane_normal); [DllImport(NativeConstants.NRNativeLibrary)] public static extern NativeResult NRFrameSetPresentTime(UInt64 rendering_handle, UInt64 frame_handle, UInt64 present_time); [DllImport(NativeConstants.NRNativeLibrary)] public static extern NativeResult NRFrameSetFlag(UInt64 rendering_handle, UInt64 frame_handle, int change_flag); [DllImport(NativeConstants.NRNativeLibrary)] public static extern NativeResult NRFrameSetFocusPlane(UInt64 rendering_handle, UInt64 frame_handle, ref NativeVector3f plane_point, ref NativeVector3f plane_normal); /// /// overlay dont need this function /// /// /// /// /// [DllImport(NativeConstants.NRNativeLibrary)] public static extern NativeResult NRFrameSetColorTextureType(UInt64 rendering_handle, UInt64 frame_handle, NRTextureType texture_type); [DllImport(NativeConstants.NRNativeLibrary)] public static extern NativeResult NRRenderingGetFramePresentTime(UInt64 rendering_handle, ref UInt64 frame_present_time); [DllImport(NativeConstants.NRNativeLibrary)] public static extern NativeResult NRRenderingGetFramePresentTimeByCount(UInt64 rendering_handle, int extra_frame_count, ref UInt64 frame_present_time); /// /// overlay dont need this function /// /// /// /// /// /// [DllImport(NativeConstants.NRNativeLibrary)] public static extern NativeResult NRRenderingDoRender(UInt64 rendering_handle, IntPtr left_eye_texture, IntPtr right_eye_texture, ref NativeMat4f head_pose); }; } }