// called by AppThreadFunction public void ovrApp_BackButtonAction() { // 1484 if (this.BackButtonState == ovrBackButtonState.BACK_BUTTON_STATE_PENDING_DOUBLE_TAP) { //ALOGV("back button double tap"); this.BackButtonState = ovrBackButtonState.BACK_BUTTON_STATE_SKIP_UP; } else if (this.BackButtonState == ovrBackButtonState.BACK_BUTTON_STATE_PENDING_SHORT_PRESS && !this.BackButtonDown) { if ((VrApi.vrapi_GetTimeInSeconds() - this.BackButtonDownStartTime) > VrApi_Android.BACK_BUTTON_DOUBLE_TAP_TIME_IN_SECONDS) { ConsoleExtensions.trace("back button short press"); //ALOGV(" ovr_StartSystemActivity( %s )", PUI_CONFIRM_QUIT); VrApi_Android.ovr_StartSystemActivity(ref Java, VrApi.PUI_CONFIRM_QUIT, default(string)); this.BackButtonState = ovrBackButtonState.BACK_BUTTON_STATE_NONE; } } else if (this.BackButtonState == ovrBackButtonState.BACK_BUTTON_STATE_NONE && this.BackButtonDown) { if ((VrApi.vrapi_GetTimeInSeconds() - this.BackButtonDownStartTime) > VrApi_Android.BACK_BUTTON_LONG_PRESS_TIME_IN_SECONDS) { // https://sites.google.com/a/jsc-solutions.net/work/knowledge-base/15-dualvr/20150704/pui_global_menu ConsoleExtensions.trace("back button long press, ovr_StartSystemActivity PUI_GLOBAL_MENU"); //ALOGV(" ovr_StartSystemActivity( %s )", PUI_GLOBAL_MENU); VrApi_Android.ovr_StartSystemActivity(ref Java, VrApi.PUI_GLOBAL_MENU, null); this.BackButtonState = ovrBackButtonState.BACK_BUTTON_STATE_SKIP_UP; } } }
// called by AppThreadFunction public void ovrApp_HandleVrModeChanges() { //ConsoleExtensions.tracei("enter ovrApp_HandleVrModeChanges, FrameIndex: ", (int)FrameIndex); // 1432 if (this.NativeWindow != null && this.Egl.MainSurface == egl.EGL_NO_SURFACE) { ConsoleExtensions.trace("ovrApp_HandleVrModeChanges, ovrEgl_CreateSurface"); this.Egl.ovrEgl_CreateSurface(this.NativeWindow); } if (this.Resumed != false && this.NativeWindow != null) { if (this.Ovr == null) { var parms = VrApi_Helpers.vrapi_DefaultModeParms(ref Java); parms.CpuLevel = 2; parms.GpuLevel = 3; parms.MainThreadTid = unistd.gettid(); #if MULTI_THREADED // Also set the renderer thread to SCHED_FIFO. parms.RenderThreadTid = ovrRenderThread_GetTid(&app->RenderThread); #endif //ALOGV(" eglGetCurrentSurface( EGL_DRAW ) = %p", eglGetCurrentSurface(EGL_DRAW)); ConsoleExtensions.trace("ovrApp_HandleVrModeChanges, vrapi_EnterVrMode"); this.Ovr = VrApi.vrapi_EnterVrMode(ref parms); //ALOGV(" vrapi_EnterVrMode()"); //ALOGV(" eglGetCurrentSurface( EGL_DRAW ) = %p", eglGetCurrentSurface(EGL_DRAW)); } } else { if (this.Ovr != null) { #if MULTI_THREADED // Make sure the renderer thread is no longer using the ovrMobile. ovrRenderThread_Wait(&app->RenderThread); #endif //ALOGV(" eglGetCurrentSurface( EGL_DRAW ) = %p", eglGetCurrentSurface(EGL_DRAW)); ConsoleExtensions.trace("ovrApp_HandleVrModeChanges, vrapi_LeaveVrMode"); VrApi.vrapi_LeaveVrMode(this.Ovr); this.Ovr = null; //ALOGV(" vrapi_LeaveVrMode()"); //ALOGV(" eglGetCurrentSurface( EGL_DRAW ) = %p", eglGetCurrentSurface(EGL_DRAW)); } } if (this.NativeWindow == null && this.Egl.MainSurface != egl.EGL_NO_SURFACE) { ConsoleExtensions.trace("ovrApp_HandleVrModeChanges, ovrEgl_DestroySurface"); this.Egl.ovrEgl_DestroySurface(); } }
// java UI sends over to native, which the uses MQ to send over to bg thread? SharedMemory would be nice? // onKeyEvent public void ovrApp_HandleKeyEvent(keycodes.AKEYCODE keyCode, input.AInputEventAction action) { // 1513 // cannot do this aliasing? //var app = this; // Handle GearVR back button. if (keyCode == keycodes.AKEYCODE.AKEYCODE_BACK) { if (action == input.AInputEventAction.AKEY_EVENT_ACTION_DOWN) { if (!this.BackButtonDown) { if ((VrApi.vrapi_GetTimeInSeconds() - this.BackButtonDownStartTime) < VrApi_Android.BACK_BUTTON_DOUBLE_TAP_TIME_IN_SECONDS) { this.BackButtonState = ovrBackButtonState.BACK_BUTTON_STATE_PENDING_DOUBLE_TAP; } this.BackButtonDownStartTime = VrApi.vrapi_GetTimeInSeconds(); } this.BackButtonDown = true; } else if (action == input.AInputEventAction.AKEY_EVENT_ACTION_UP) { if (this.BackButtonState == ovrBackButtonState.BACK_BUTTON_STATE_NONE) { if ((VrApi.vrapi_GetTimeInSeconds() - this.BackButtonDownStartTime) < VrApi_Android.BACK_BUTTON_SHORT_PRESS_TIME_IN_SECONDS) { this.BackButtonState = ovrBackButtonState.BACK_BUTTON_STATE_PENDING_SHORT_PRESS; } } else if (this.BackButtonState == ovrBackButtonState.BACK_BUTTON_STATE_SKIP_UP) { this.BackButtonState = ovrBackButtonState.BACK_BUTTON_STATE_NONE; } this.BackButtonDown = false; } //return 1; } //return 0; }
object AppThreadFunction() { // 1778 ConsoleExtensions.trace("enter pthread_create AppThreadFunction, call vrapi_DefaultInitParms"); var java = default(ovrJava); java.Vm = this.JavaVm; java.Vm.AttachCurrentThread(java.Vm, out java.Env, null); java.ActivityObject = this.ActivityObject; // 1785 var initParms = VrApi_Helpers.vrapi_DefaultInitParms(ref java); ConsoleExtensions.trace("AppThreadFunction, call vrapi_Initialize"); VrApi.vrapi_Initialize(ref initParms); ConsoleExtensions.trace("AppThreadFunction, create ovrApp, call ovrEgl_CreateContext"); this.appState = new ovrApp(ref java); // 1794 this.appState.Egl.ovrEgl_CreateContext(null); ConsoleExtensions.trace("AppThreadFunction, call vrapi_GetHmdInfo, then ovrRenderer_Create"); var hmdInfo = VrApi.vrapi_GetHmdInfo(ref java); this.appState.Renderer.ovrRenderer_Create(ref hmdInfo); ConsoleExtensions.trace("AppThreadFunction, enter loop, call ovrMessageQueue_GetNextMessage"); bool destroyed = false; while (!destroyed) { #region ovrMessageQueue_GetNextMessage var ok = true; while (ok) { ovrMessage message; var waitForMessages = appState.Ovr == null && !destroyed; if (!this.MessageQueue.ovrMessageQueue_GetNextMessage(out message, waitForMessages)) { break; } // 1812 // no switch for jsc? if (message.Id == MESSAGE.MESSAGE_ON_CREATE) { //ConsoleExtensions.trace("AppThreadFunction, MESSAGE_ON_CREATE"); } else if (message.Id == MESSAGE.MESSAGE_ON_START) { } else if (message.Id == MESSAGE.MESSAGE_ON_RESUME) { appState.Resumed = true; //ConsoleExtensions.trace("AppThreadFunction, MESSAGE_ON_RESUME"); } else if (message.Id == MESSAGE.MESSAGE_ON_PAUSE) { appState.Resumed = false; } else if (message.Id == MESSAGE.MESSAGE_ON_STOP) { } else if (message.Id == MESSAGE.MESSAGE_ON_DESTROY) { appState.NativeWindow = null; destroyed = true; } else if (message.Id == MESSAGE.MESSAGE_ON_SURFACE_CREATED) { //ConsoleExtensions.trace("AppThreadFunction, MESSAGE_ON_SURFACE_CREATED"); var m0 = message[0]; appState.NativeWindow = (native_window.ANativeWindow)m0.Pointer; } else if (message.Id == MESSAGE.MESSAGE_ON_SURFACE_DESTROYED) { appState.NativeWindow = null; } else if (message.Id == MESSAGE.MESSAGE_ON_KEY_EVENT) { appState.ovrApp_HandleKeyEvent((keycodes.AKEYCODE)(int) message[0], (input.AInputEventAction)(int) message[1]); } else if (message.Id == MESSAGE.MESSAGE_ON_TOUCH_EVENT) { //ConsoleExtensions.tracei("AppThreadFunction, MESSAGE_ON_TOUCH_EVENT"); appState.ovrApp_HandleTouchEvent(message[0], message[1], message[2]); } appState.ovrApp_HandleVrModeChanges(); } #endregion appState.ovrApp_BackButtonAction(); appState.ovrApp_HandleSystemEvents(); // not ready yet? // set by vrapi_EnterVrMode if (appState.Ovr == null) { continue; } #region VRAPI_FRAME_INIT_LOADING_ICON_FLUSH if (!appState.Scene.ovrScene_IsCreated()) { // need to keep the enum typename? var parms = VrApi_Helpers.vrapi_DefaultFrameParms(ref appState.Java, ovrFrameInit.VRAPI_FRAME_INIT_LOADING_ICON_FLUSH, 0); parms.FrameIndex = appState.FrameIndex; ConsoleExtensions.trace("vrapi_SubmitFrame VRAPI_FRAME_INIT_LOADING_ICON_FLUSH"); appState.Ovr.vrapi_SubmitFrame(ref parms); //unistd.usleep(1000); appState.Scene.ovrScene_Create(); // keep the loader on for a moment... //unistd.usleep(1000); } #endregion //appState.tracei60("AppThreadFunction, FrameIndex ", (int)appState.FrameIndex); // 1862 appState.FrameIndex++; //ConsoleExtensions.tracei("AppThreadFunction, vrapi_GetPredictedDisplayTime"); var predictedDisplayTime = appState.Ovr.vrapi_GetPredictedDisplayTime(appState.FrameIndex); //ConsoleExtensions.tracei("AppThreadFunction, vrapi_GetPredictedTracking"); this.trackingOld = this.tracking; this.tracking = appState.Ovr.vrapi_GetPredictedTracking(predictedDisplayTime); // like step in physics? appState.Simulation.ovrSimulation_AdvanceSimulation(predictedDisplayTime); { //var parms = appState.Renderer.ovrRenderer_RenderFrame(ref appState, ref tracking); //var parms = appState.Renderer.ovrRenderer_RenderFrame(this, appState, ref tracking); //var parms = this.appState.Renderer.ovrRenderer_RenderFrame(this, ref tracking); var parms = this.appState.Renderer.ovrRenderer_RenderFrame(this); appState.tracei60("vrapi_SubmitFrame ", (int)appState.FrameIndex); if (tracking.Status == trackingOld.Status) { appState.tracei60(" tracking.Status ", (int)tracking.Status); } else { ConsoleExtensions.tracei(" tracking.Status ", (int)tracking.Status); } appState.tracei60(" tracking.HeadPose.Pose.Orientation.x ", (int)(1000 * tracking.HeadPose.Pose.Orientation.x)); appState.tracei60(" tracking.HeadPose.Pose.Orientation.y ", (int)(1000 * tracking.HeadPose.Pose.Orientation.y)); appState.tracei60(" tracking.HeadPose.Pose.Orientation.z ", (int)(1000 * tracking.HeadPose.Pose.Orientation.z)); appState.tracei60(" tracking.HeadPose.Pose.Orientation.w ", (int)(1000 * tracking.HeadPose.Pose.Orientation.w)); appState.Ovr.vrapi_SubmitFrame(ref parms); } // 1891 } // 1896 appState.Renderer.ovrRenderer_Destroy(); // 1898 appState.Scene.ovrScene_Destroy(); appState.Egl.ovrEgl_DestroyContext(); VrApi.vrapi_Shutdown(); java.Vm.DetachCurrentThread(java.Vm); return(null); }