void OvrOutOfSpaceMenu::BuildMenu( int memoryInKB ) { const VRMenuFontParms fontParms( true, true, false, false, true, 0.505f, 0.43f, 1.0f ); Array< VRMenuObjectParms const * > parms; int menuId = 9000; // --- // Icon { VRMenuSurfaceParms iconSurfParms( "", "res/raw/out_of_disk_space_warning.png", SURFACE_TEXTURE_DIFFUSE, "", SURFACE_TEXTURE_MAX, "", SURFACE_TEXTURE_MAX ); VRMenuObjectParms iconParms( VRMENU_STATIC, Array< VRMenuComponent* >(), iconSurfParms, "", Posef( Quatf(), Vector3f( 0.0f, CENTER_TO_ICON_Y_OFFSET, 0.0f ) ), Vector3f( 1.0f ), fontParms, VRMenuId_t( ++menuId ), VRMenuObjectFlags_t( VRMENUOBJECT_DONT_HIT_ALL ), VRMenuObjectInitFlags_t( VRMENUOBJECT_INIT_FORCE_POSITION ) ); parms.PushBack( &iconParms ); AddItems( AppPtr->GetVRMenuMgr(), AppPtr->GetDefaultFont(), parms, GetRootHandle(), true ); parms.Clear(); } // --- // Message { String outOfSpaceMsg; VrLocale::GetString( AppPtr->GetVrJni(), AppPtr->GetJavaObject(), "@string/out_of_memory", "To use this app, please free up at least %dKB of storage space on your phone.", outOfSpaceMsg ); char charBuff[10]; sprintf( charBuff, "%d", memoryInKB ); outOfSpaceMsg = VrLocale::GetXliffFormattedString( outOfSpaceMsg, charBuff ); BitmapFont & font = AppPtr->GetDefaultFont(); font.WordWrapText( outOfSpaceMsg, 1.4f ); VRMenuObjectParms titleParms( VRMENU_STATIC, Array< VRMenuComponent* >(), VRMenuSurfaceParms(), (const char*)outOfSpaceMsg, Posef( Quatf(), Vector3f( 0.0f, CENTER_TO_TEXT_Y_OFFSET, 0.0f ) ), Vector3f( 1.0f ), fontParms, VRMenuId_t( ++menuId ), VRMenuObjectFlags_t( VRMENUOBJECT_DONT_HIT_TEXT ), VRMenuObjectInitFlags_t( VRMENUOBJECT_INIT_FORCE_POSITION ) ); parms.PushBack( &titleParms ); AddItems( AppPtr->GetVRMenuMgr(), AppPtr->GetDefaultFont(), parms, GetRootHandle(), true ); parms.Clear(); } this->SetMenuPose( Posef( Quatf(), Vector3f( 0.0f, 0.0f, -3.0f ) ) ); }
Posef Player::VirtualWorldTransformfromRealPose(const Posef &sensorHeadPose) { Quatf baseQ = Quatf(Vector3f(0,1,0), BodyYaw.Get()); return Posef(baseQ * sensorHeadPose.Rotation, BodyPos + baseQ.Rotate(sensorHeadPose.Translation)); }
Posef Player::VirtualWorldTransformfromRealPose(const Posef &sensorHeadPose, ovrTrackingOrigin trackingOrigin) { Quatf baseQ = Quatf(Vector3f(0,1,0), GetApparentBodyYaw().Get()); Vector3f bodyPosInOrigin = trackingOrigin == ovrTrackingOrigin_EyeLevel ? BodyPos : BodyPoseFloorLevel; return Posef(baseQ * sensorHeadPose.Rotation, bodyPosInOrigin + baseQ.Rotate(sensorHeadPose.Translation)); }
Posef HMDState::GetEyePredictionPose(ovrEyeType eye) { // Note that this function does not get the frame index parameter and depends // on whichever value is passed into the BeginFrame() function. ovrTrackingState ts = GetMidpointPredictionTracking(BeginFrameIndex); TraceTrackingState(ts); Posef const & hmdPose = ts.HeadPose.ThePose; // Currently HmdToEyeViewOffset is only a 3D vector // (Negate HmdToEyeViewOffset because offset is a view matrix offset and not a camera offset) if (eye == ovrEye_Left) { return Posef(hmdPose.Rotation, ((Posef)hmdPose).Apply(-((Vector3f)RenderState.EyeRenderDesc[0].HmdToEyeViewOffset))); } else { return Posef(hmdPose.Rotation, ((Posef)hmdPose).Apply(-((Vector3f)RenderState.EyeRenderDesc[1].HmdToEyeViewOffset))); } }
//============================== // OvrDefaultComponent::Frame eMsgStatus OvrDefaultComponent::Frame( App * app, VrFrame const & vrFrame, OvrVRMenuMgr & menuMgr, VRMenuObject * self, VRMenuEvent const & event ) { double t = TimeInSeconds(); if ( StartFadeInTime >= 0.0f && t >= StartFadeInTime ) { HilightFader.StartFadeIn(); StartFadeInTime = -1.0f; } else if ( StartFadeOutTime >= 0.0f && t > StartFadeOutTime ) { HilightFader.StartFadeOut(); StartFadeOutTime = -1.0f; } float const fadeRate = 1.0f / FadeDuration; HilightFader.Update( fadeRate, vrFrame.DeltaSeconds ); float const hilightAlpha = HilightFader.GetFinalAlpha(); Vector3f offset = HilightOffset * hilightAlpha; self->SetHilightPose( Posef( Quatf(), offset ) ); int additiveSurfIndex = self->FindSurfaceWithTextureType( SURFACE_TEXTURE_ADDITIVE, true ); if ( additiveSurfIndex >= 0 ) { Vector4f surfColor = self->GetSurfaceColor( additiveSurfIndex ); surfColor.w = hilightAlpha; self->SetSurfaceColor( additiveSurfIndex, surfColor ); } float const scale = ( ( HilightScale - 1.0f ) * hilightAlpha ) + 1.0f; self->SetHilightScale( scale ); if ( SuppressText ) { self->SetTextColor( Vector4f( 0.0f ) ); } else { Vector4f colorDelta = TextHilightColor - TextNormalColor; Vector4f curColor = TextNormalColor + ( colorDelta * hilightAlpha ); self->SetTextColor( curColor ); } return MSG_STATUS_ALIVE; }
OvrVideoMenu::OvrVideoMenu( OvrGuiSys & guiSys, OvrMetaData & metaData, float radius ) : VRMenu( MENU_NAME ) , MetaData( metaData ) , LoadingIconHandle( 0 ) , AttributionHandle( 0 ) , BrowserButtonHandle( 0 ) , VideoControlButtonHandle( 0 ) , Radius( radius ) , ButtonCoolDown( 0.0f ) , OpenTime( 0.0 ) { // Init with empty root Init( guiSys, 0.0f, VRMenuFlags_t() ); // Create Attribution info view Array< VRMenuObjectParms const * > parms; Array< VRMenuComponent* > comps; VRMenuId_t attributionPanelId( ID_CENTER_ROOT.Get() + 10 ); comps.PushBack( new OvrVideoMenuRootComponent( *this ) ); Quatf rot( DOWN, 0.0f ); Vector3f dir( -FWD ); Posef panelPose( rot, dir * Radius ); Vector3f panelScale( 1.0f ); const VRMenuFontParms fontParms( true, true, false, false, true, 0.525f, 0.45f, 1.0f ); VRMenuObjectParms attrParms( VRMENU_STATIC, comps, VRMenuSurfaceParms(), "Attribution Panel", panelPose, panelScale, Posef(), Vector3f( 1.0f ), fontParms, attributionPanelId, VRMenuObjectFlags_t(), VRMenuObjectInitFlags_t( VRMENUOBJECT_INIT_FORCE_POSITION ) ); parms.PushBack( &attrParms ); AddItems( guiSys, parms, GetRootHandle(), false ); parms.Clear(); comps.Clear(); AttributionHandle = HandleForId( guiSys.GetVRMenuMgr(), attributionPanelId ); VRMenuObject * attributionObject = guiSys.GetVRMenuMgr().ToObject( AttributionHandle ); OVR_ASSERT( attributionObject != NULL ); //Browser button float const ICON_HEIGHT = 80.0f * VRMenuObject::DEFAULT_TEXEL_SCALE; Array< VRMenuSurfaceParms > surfParms; Posef browserButtonPose( Quatf(), UP * ICON_HEIGHT * 2.0f ); comps.PushBack( new OvrDefaultComponent( Vector3f( 0.0f, 0.0f, 0.05f ), 1.05f, 0.25f, 0.0f, Vector4f( 1.0f ), Vector4f( 1.0f ) ) ); comps.PushBack( new OvrButton_OnUp( this, ID_BROWSER_BUTTON ) ); comps.PushBack( new OvrSurfaceToggleComponent( ) ); surfParms.PushBack( VRMenuSurfaceParms( "browser", "apk:///assets/nav_home_off.png", SURFACE_TEXTURE_DIFFUSE, NULL, SURFACE_TEXTURE_MAX, NULL, SURFACE_TEXTURE_MAX ) ); surfParms.PushBack( VRMenuSurfaceParms( "browser", "apk:///assets/nav_home_on.png", SURFACE_TEXTURE_DIFFUSE, NULL, SURFACE_TEXTURE_MAX, NULL, SURFACE_TEXTURE_MAX ) ); VRMenuObjectParms browserButtonParms( VRMENU_BUTTON, comps, surfParms, "", browserButtonPose, Vector3f( 1.0f ), Posef(), Vector3f( 1.0f ), fontParms, ID_BROWSER_BUTTON, VRMenuObjectFlags_t( VRMENUOBJECT_DONT_HIT_TEXT ), VRMenuObjectInitFlags_t( VRMENUOBJECT_INIT_FORCE_POSITION ) ); parms.PushBack( &browserButtonParms ); AddItems( guiSys, parms, AttributionHandle, false ); parms.Clear(); comps.Clear(); surfParms.Clear(); BrowserButtonHandle = attributionObject->ChildHandleForId( guiSys.GetVRMenuMgr(), ID_BROWSER_BUTTON ); VRMenuObject * browserButtonObject = guiSys.GetVRMenuMgr().ToObject( BrowserButtonHandle ); OVR_ASSERT( browserButtonObject != NULL ); OVR_UNUSED( browserButtonObject ); //Video control button Posef videoButtonPose( Quatf(), DOWN * ICON_HEIGHT * 2.0f ); comps.PushBack( new OvrDefaultComponent( Vector3f( 0.0f, 0.0f, 0.05f ), 1.05f, 0.25f, 0.0f, Vector4f( 1.0f ), Vector4f( 1.0f ) ) ); comps.PushBack( new OvrButton_OnUp( this, ID_VIDEO_BUTTON ) ); comps.PushBack( new OvrSurfaceToggleComponent( ) ); surfParms.PushBack( VRMenuSurfaceParms( "browser", "apk:///assets/nav_restart_off.png", SURFACE_TEXTURE_DIFFUSE, NULL, SURFACE_TEXTURE_MAX, NULL, SURFACE_TEXTURE_MAX ) ); surfParms.PushBack( VRMenuSurfaceParms( "browser", "apk:///assets/nav_restart_on.png", SURFACE_TEXTURE_DIFFUSE, NULL, SURFACE_TEXTURE_MAX, NULL, SURFACE_TEXTURE_MAX ) ); VRMenuObjectParms controlButtonParms( VRMENU_BUTTON, comps, surfParms, "", videoButtonPose, Vector3f( 1.0f ), Posef(), Vector3f( 1.0f ), fontParms, ID_VIDEO_BUTTON, VRMenuObjectFlags_t( VRMENUOBJECT_DONT_HIT_TEXT ), VRMenuObjectInitFlags_t( VRMENUOBJECT_INIT_FORCE_POSITION ) ); parms.PushBack( &controlButtonParms ); AddItems( guiSys, parms, AttributionHandle, false ); parms.Clear(); comps.Clear(); VideoControlButtonHandle = attributionObject->ChildHandleForId( guiSys.GetVRMenuMgr(), ID_VIDEO_BUTTON ); VRMenuObject * controlButtonObject = guiSys.GetVRMenuMgr().ToObject( VideoControlButtonHandle ); OVR_ASSERT( controlButtonObject != NULL ); OVR_UNUSED( controlButtonObject ); }
OvrPanoMenu::OvrPanoMenu( App * app, Oculus360Photos * photos, OvrVRMenuMgr & menuMgr, BitmapFont const & font, OvrMetaData & metaData, float fadeOutTime, float radius ) : VRMenu( MENU_NAME ) , AppPtr( app ) , MenuMgr( menuMgr ) , Font( font ) , Photos( photos ) , MetaData( metaData ) , LoadingIconHandle( 0 ) , AttributionHandle( 0 ) , BrowserButtonHandle( 0 ) , SwipeLeftIndicatorHandle( 0 ) , SwipeRightIndicatorHandle( 0 ) , Fader( 1.0f ) , FadeOutTime( fadeOutTime ) , currentFadeRate( 0.0f ) , Radius( radius ) , ButtonCoolDown( 0.0f ) { currentFadeRate = 1.0f / FadeOutTime; // Init with empty root Init( menuMgr, font, 0.0f, VRMenuFlags_t() ); // Create Attribution info view Array< VRMenuObjectParms const * > parms; Array< VRMenuComponent* > comps; VRMenuId_t attributionPanelId( ID_CENTER_ROOT.Get() + 10 ); comps.PushBack( new OvrPanoMenuRootComponent( *this ) ); Quatf rot( DOWN, 0.0f ); Vector3f dir( -FWD ); Posef panelPose( rot, dir * Radius ); Vector3f panelScale( 1.0f ); //const Posef textPose( Quatf(), Vector3f( 0.0f, 0.0f, 0.0f ) ); const VRMenuFontParms fontParms( true, true, false, false, true, 0.525f, 0.45f, 1.0f ); VRMenuObjectParms attrParms( VRMENU_STATIC, comps, VRMenuSurfaceParms(), "Attribution Panel", panelPose, panelScale, Posef(), Vector3f( 1.0f ), fontParms, attributionPanelId, VRMenuObjectFlags_t( VRMENUOBJECT_DONT_HIT_TEXT ), VRMenuObjectInitFlags_t( VRMENUOBJECT_INIT_FORCE_POSITION ) ); parms.PushBack( &attrParms ); AddItems( MenuMgr, Font, parms, GetRootHandle(), false ); parms.Clear(); comps.Clear(); AttributionHandle = HandleForId( MenuMgr, attributionPanelId ); VRMenuObject * attributionObject = MenuMgr.ToObject( AttributionHandle ); OVR_ASSERT( attributionObject != NULL ); //Browser button float const ICON_HEIGHT = 80.0f * VRMenuObject::DEFAULT_TEXEL_SCALE; Array< VRMenuSurfaceParms > surfParms; Posef browserButtonPose( Quatf( ), UP * ICON_HEIGHT * 2.0f ); comps.PushBack( new OvrDefaultComponent( Vector3f( 0.0f, 0.0f, 0.05f ), 1.05f, 0.25f, 0.0f, Vector4f( 1.0f ), Vector4f( 1.0f ) ) ); comps.PushBack( new OvrButton_OnUp( this, ID_BROWSER_BUTTON ) ); comps.PushBack( new OvrSurfaceToggleComponent( ) ); surfParms.PushBack( VRMenuSurfaceParms ( "browser", "assets/nav_home_off.png", SURFACE_TEXTURE_DIFFUSE, NULL, SURFACE_TEXTURE_MAX, NULL, SURFACE_TEXTURE_MAX ) ); surfParms.PushBack( VRMenuSurfaceParms( "browser", "assets/nav_home_on.png", SURFACE_TEXTURE_DIFFUSE, NULL, SURFACE_TEXTURE_MAX, NULL, SURFACE_TEXTURE_MAX ) ); VRMenuObjectParms browserButtonParms( VRMENU_BUTTON, comps, surfParms, "", browserButtonPose, Vector3f( 1.0f ), Posef( ), Vector3f( 1.0f ), fontParms, ID_BROWSER_BUTTON, VRMenuObjectFlags_t( VRMENUOBJECT_DONT_HIT_TEXT ), VRMenuObjectInitFlags_t( VRMENUOBJECT_INIT_FORCE_POSITION ) ); parms.PushBack( &browserButtonParms ); AddItems( MenuMgr, Font, parms, AttributionHandle, false ); parms.Clear(); comps.Clear(); surfParms.Clear(); BrowserButtonHandle = attributionObject->ChildHandleForId( MenuMgr, ID_BROWSER_BUTTON ); VRMenuObject * browserButtonObject = MenuMgr.ToObject( BrowserButtonHandle ); OVR_ASSERT( browserButtonObject != NULL ); OVR_UNUSED( browserButtonObject ); //Favorites button Posef favoritesButtonPose( Quatf( ), DOWN * ICON_HEIGHT * 2.0f ); comps.PushBack( new OvrDefaultComponent( Vector3f( 0.0f, 0.0f, 0.05f ), 1.05f, 0.25f, 0.0f, Vector4f( 1.0f ), Vector4f( 1.0f ) ) ); comps.PushBack( new OvrButton_OnUp( this, ID_FAVORITES_BUTTON ) ); comps.PushBack( new OvrSurfaceToggleComponent() ); surfParms.PushBack( VRMenuSurfaceParms( "favorites_off", "assets/nav_star_off.png", SURFACE_TEXTURE_DIFFUSE, NULL, SURFACE_TEXTURE_MAX, NULL, SURFACE_TEXTURE_MAX ) ); surfParms.PushBack( VRMenuSurfaceParms( "favorites_on", "assets/nav_star_on.png", SURFACE_TEXTURE_DIFFUSE, NULL, SURFACE_TEXTURE_MAX, NULL, SURFACE_TEXTURE_MAX ) ); surfParms.PushBack( VRMenuSurfaceParms( "favorites_active_off", "assets/nav_star_active_off.png", SURFACE_TEXTURE_DIFFUSE, NULL, SURFACE_TEXTURE_MAX, NULL, SURFACE_TEXTURE_MAX ) ); surfParms.PushBack( VRMenuSurfaceParms( "favorites_active_on", "assets/nav_star_active_on.png", SURFACE_TEXTURE_DIFFUSE, NULL, SURFACE_TEXTURE_MAX, NULL, SURFACE_TEXTURE_MAX ) ); VRMenuObjectParms favoritesButtonParms( VRMENU_BUTTON, comps, surfParms, "", favoritesButtonPose, Vector3f( 1.0f ), Posef( ), Vector3f( 1.0f ), fontParms, ID_FAVORITES_BUTTON, VRMenuObjectFlags_t( VRMENUOBJECT_DONT_HIT_TEXT ), VRMenuObjectInitFlags_t( VRMENUOBJECT_INIT_FORCE_POSITION ) ); parms.PushBack( &favoritesButtonParms ); AddItems( MenuMgr, Font, parms, AttributionHandle, false ); parms.Clear(); comps.Clear(); FavoritesButtonHandle = attributionObject->ChildHandleForId( MenuMgr, ID_FAVORITES_BUTTON ); VRMenuObject * favoritesButtonObject = MenuMgr.ToObject( FavoritesButtonHandle ); OVR_ASSERT( favoritesButtonObject != NULL ); OVR_UNUSED( favoritesButtonObject ); // Swipe icons const int numFrames = 10; const int numTrails = 3; const int numChildren = 5; const float swipeFPS = 3.0f; const float factor = 1.0f / 8.0f; // Right container VRMenuId_t swipeRightId( ID_CENTER_ROOT.Get() + 401 ); Quatf rotRight( DOWN, ( Mathf::TwoPi * factor ) ); Vector3f rightDir( -FWD * rotRight ); comps.PushBack( new OvrTrailsAnimComponent( swipeFPS, true, numFrames, numTrails, numTrails ) ); VRMenuObjectParms swipeRightRoot( VRMENU_CONTAINER, comps, VRMenuSurfaceParms( ), "", Posef( rotRight, rightDir * Radius ), Vector3f( 1.0f ), Posef( ), Vector3f( 1.0f ), fontParms, swipeRightId, VRMenuObjectFlags_t( VRMENUOBJECT_DONT_HIT_ALL ), VRMenuObjectInitFlags_t( VRMENUOBJECT_INIT_FORCE_POSITION ) ); parms.PushBack( &swipeRightRoot ); AddItems( MenuMgr, Font, parms, AttributionHandle, false ); parms.Clear(); comps.Clear(); SwipeRightIndicatorHandle = attributionObject->ChildHandleForId( MenuMgr, swipeRightId ); VRMenuObject * swipeRightRootObject = MenuMgr.ToObject( SwipeRightIndicatorHandle ); OVR_ASSERT( swipeRightRootObject != NULL ); // Left container VRMenuId_t swipeLeftId( ID_CENTER_ROOT.Get( ) + 402 ); Quatf rotLeft( DOWN, ( Mathf::TwoPi * -factor ) ); Vector3f leftDir( -FWD * rotLeft ); comps.PushBack( new OvrTrailsAnimComponent( swipeFPS, true, numFrames, numTrails, numTrails ) ); VRMenuObjectParms swipeLeftRoot( VRMENU_CONTAINER, comps, VRMenuSurfaceParms( ), "", Posef( rotLeft, leftDir * Radius ), Vector3f( 1.0f ), Posef( ), Vector3f( 1.0f ), fontParms, swipeLeftId, VRMenuObjectFlags_t( VRMENUOBJECT_DONT_HIT_ALL ), VRMenuObjectInitFlags_t( VRMENUOBJECT_INIT_FORCE_POSITION ) ); parms.PushBack( &swipeLeftRoot ); AddItems( MenuMgr, Font, parms, AttributionHandle, false ); parms.Clear(); comps.Clear(); SwipeLeftIndicatorHandle = attributionObject->ChildHandleForId( MenuMgr, swipeLeftId ); VRMenuObject * swipeLeftRootObject = MenuMgr.ToObject( SwipeLeftIndicatorHandle ); OVR_ASSERT( swipeLeftRootObject != NULL ); // Arrow frame children const char * swipeRightIcon = "assets/nav_arrow_right.png"; const char * swipeLeftIcon = "assets/nav_arrow_left.png"; VRMenuSurfaceParms rightIndicatorSurfaceParms( "swipeRightSurface", swipeRightIcon, SURFACE_TEXTURE_DIFFUSE, NULL, SURFACE_TEXTURE_MAX, NULL, SURFACE_TEXTURE_MAX ); VRMenuSurfaceParms leftIndicatorSurfaceParms( "swipeLeftSurface", swipeLeftIcon, SURFACE_TEXTURE_DIFFUSE, NULL, SURFACE_TEXTURE_MAX, NULL, SURFACE_TEXTURE_MAX ); const float surfaceWidth = 25 * VRMenuObject::DEFAULT_TEXEL_SCALE; for ( int i = 0; i < numChildren; ++i ) { //right frame const Vector3f rightPos = ( RIGHT * surfaceWidth * i ) - ( FWD * i * 0.1f ); VRMenuObjectParms swipeRightFrame( VRMENU_STATIC, Array< VRMenuComponent* >(), rightIndicatorSurfaceParms, "", Posef( Quatf( ), rightPos ), Vector3f( 1.0f ), Posef( ), Vector3f( 1.0f ), fontParms, VRMenuId_t( ), VRMenuObjectFlags_t(), VRMenuObjectInitFlags_t( VRMENUOBJECT_INIT_FORCE_POSITION ) ); parms.PushBack( &swipeRightFrame ); AddItems( MenuMgr, Font, parms, SwipeRightIndicatorHandle, false ); parms.Clear(); // left frame const Vector3f leftPos = ( (-RIGHT) * surfaceWidth * i ) - ( FWD * i * 0.1f ); VRMenuObjectParms swipeLeftFrame( VRMENU_STATIC, Array< VRMenuComponent* >(), leftIndicatorSurfaceParms, "", Posef( Quatf( ), leftPos ), Vector3f( 1.0f ), Posef( ), Vector3f( 1.0f ), fontParms, VRMenuId_t( ), VRMenuObjectFlags_t(), VRMenuObjectInitFlags_t( VRMENUOBJECT_INIT_FORCE_POSITION ) ); parms.PushBack( &swipeLeftFrame ); AddItems( MenuMgr, Font, parms, SwipeLeftIndicatorHandle, false ); parms.Clear(); } if ( OvrTrailsAnimComponent* animRightComp = swipeRightRootObject->GetComponentByName< OvrTrailsAnimComponent >( ) ) { animRightComp->Play( ); } if ( OvrTrailsAnimComponent* animLeftComp = swipeLeftRootObject->GetComponentByName< OvrTrailsAnimComponent >( ) ) { animLeftComp->Play( ); } }
//============================== // VRMenuMgrLocal::SubmitForRenderingRecursive void VRMenuMgrLocal::SubmitForRenderingRecursive( OvrDebugLines & debugLines, BitmapFont const & font, BitmapFontSurface & fontSurface, VRMenuRenderFlags_t const & flags, VRMenuObjectLocal const * obj, Posef const & parentModelPose, Vector4f const & parentColor, Vector3f const & parentScale, Bounds3f & cullBounds, SubmittedMenuObject * submitted, int const maxIndices, int & curIndex ) const { if ( curIndex >= maxIndices ) { // If this happens we're probably not correctly clearing the submitted surfaces each frame // OR we've got a LOT of surfaces. LOG( "maxIndices = %i, curIndex = %i", maxIndices, curIndex ); DROID_ASSERT( curIndex < maxIndices, "VrMenu" ); return; } // check if this object is hidden if ( obj->GetFlags() & VRMENUOBJECT_DONT_RENDER ) { return; } Posef const & localPose = obj->GetLocalPose(); Posef curModelPose; curModelPose.Position = parentModelPose.Position + ( parentModelPose.Orientation * parentScale.EntrywiseMultiply( localPose.Position ) ); curModelPose.Orientation = localPose.Orientation * parentModelPose.Orientation; Vector4f curColor = parentColor * obj->GetColor(); Vector3f const & localScale = obj->GetLocalScale(); Vector3f scale = parentScale.EntrywiseMultiply( localScale ); OVR_ASSERT( obj != NULL ); /* VRMenuObject const * parent = ToObject( obj->GetParentHandle() ); if ( parent != NULL ) { fontParms_t fontParms; Vector3f itemUp = curModelPose.Orientation * Vector3f( 0.0f, 1.0f, 0.0f ); Vector3f itemNormal = curModelPose.Orientation * Vector3f( 0.0f, 0.0f, 1.0f ); fontSurface.DrawText3D( font, fontParms, curModelPose.Position, itemNormal, itemUp, 1.0f, Vector4f( 1.0f, 0.0f, 1.0f, 1.0f ), parent->GetText().ToCStr() ); } */ if ( obj->GetType() != VRMENU_CONTAINER ) // containers never render, but their children may { Posef const & hilightPose = obj->GetHilightPose(); Posef itemPose( curModelPose.Orientation * hilightPose.Orientation, curModelPose.Position + ( curModelPose.Orientation * parentScale.EntrywiseMultiply( hilightPose.Position ) ) ); Matrix4f poseMat( itemPose.Orientation ); Vector3f itemUp = poseMat.GetYBasis(); Vector3f itemNormal = poseMat.GetZBasis(); curModelPose = itemPose; // so children like the slider bar caret use our hilight offset and don't end up clipping behind us! VRMenuRenderFlags_t rFlags = flags; VRMenuObjectFlags_t oFlags = obj->GetFlags(); if ( oFlags & VRMENUOBJECT_FLAG_POLYGON_OFFSET ) { rFlags |= VRMENU_RENDER_POLYGON_OFFSET; } if ( oFlags & VRMENUOBJECT_FLAG_NO_DEPTH ) { rFlags |= VRMENU_RENDER_NO_DEPTH; } // the menu object may have zero or more renderable surfaces (if 0, it may draw only text) Array< VRMenuSurface > const & surfaces = obj->GetSurfaces(); for ( int i = 0; i < surfaces.GetSizeI(); ++i ) { VRMenuSurface const & surf = surfaces[i]; if ( surf.IsRenderable() ) { SubmittedMenuObject & sub = submitted[curIndex]; sub.SurfaceIndex = i; sub.Pose = itemPose; sub.Scale = scale; sub.Flags = rFlags; sub.ColorTableOffset = obj->GetColorTableOffset(); sub.SkipAdditivePass = !obj->IsHilighted(); sub.Handle = obj->GetHandle(); // modulate surface color with parent's current color sub.Color = surf.GetColor() * curColor; sub.Offsets = surf.GetAnchorOffsets(); sub.FadeDirection = obj->GetFadeDirection(); #if defined( OVR_BUILD_DEBUG ) sub.SurfaceName = surf.GetName(); #endif curIndex++; } } OVR::String const & text = obj->GetText(); if ( ( oFlags & VRMENUOBJECT_DONT_RENDER_TEXT ) == 0 && text.GetLengthI() > 0 ) { Posef const & textLocalPose = obj->GetTextLocalPose(); Posef curTextPose; curTextPose.Position = itemPose.Position + ( itemPose.Orientation * textLocalPose.Position * scale ); curTextPose.Orientation = textLocalPose.Orientation * itemPose.Orientation; Vector3f textNormal = curTextPose.Orientation * Vector3f( 0.0f, 0.0f, 1.0f ); Vector3f position = curTextPose.Position + textNormal * 0.001f; // this is simply to prevent z-fighting right now Vector3f textScale = scale * obj->GetTextLocalScale(); Vector4f textColor = obj->GetTextColor(); // Apply parent's alpha influence textColor.w *= parentColor.w; VRMenuFontParms const & fp = obj->GetFontParms(); fontParms_t fontParms; fontParms.CenterHoriz = fp.CenterHoriz; fontParms.CenterVert = fp.CenterVert; fontParms.Billboard = fp.Billboard; fontParms.TrackRoll = fp.TrackRoll; fontParms.ColorCenter = fp.ColorCenter; fontParms.AlphaCenter = fp.AlphaCenter; fontSurface.DrawText3D( font, fontParms, position, itemNormal, itemUp, textScale.x * fp.Scale, textColor, text.ToCStr() ); #if 0 // this shows a ruler for the wrap width when rendering text float const wrapw = obj->GetWrapWidth(); Vector3f pos = position + Vector3f( 0.0f, 0.0f, -0.1f ); debugLines.AddLine( pos - wrapw * 0.5f * scale, pos + wrapw * 0.5f * scale, Vector4f( 0.0f, 1.0f, 0.0f, 1.0f ), Vector4f( 1.0f, 0.0f, 0.0f, 1.0f ), 0, false ); #endif } //DROIDLOG( "Spam", "AddPoint for '%s'", text.ToCStr() ); //GetDebugLines().AddPoint( curModelPose.Position, 0.05f, 1, true ); } cullBounds = obj->GetLocalBounds( font ) * parentScale; // submit all children if ( obj->Children.GetSizeI() > 0 ) { for ( int i = 0; i < obj->Children.GetSizeI(); ++i ) { menuHandle_t childHandle = obj->Children[i]; VRMenuObjectLocal const * child = static_cast< VRMenuObjectLocal const * >( ToObject( childHandle ) ); if ( child == NULL ) { continue; } Bounds3f childCullBounds; SubmitForRenderingRecursive( debugLines, font, fontSurface, flags, child, curModelPose, curColor, scale, childCullBounds, submitted, maxIndices, curIndex ); Posef pose = child->GetLocalPose(); pose.Position = pose.Position * scale; childCullBounds = Bounds3f::Transform( pose, childCullBounds ); cullBounds = Bounds3f::Union( cullBounds, childCullBounds ); } } obj->SetCullBounds( cullBounds ); #if 0 OvrCollisionPrimitive const * cp = obj->GetCollisionPrimitive(); if ( cp != NULL ) { cp->DebugRender( debugLines, curModelPose ); } { // for debug drawing, put the cull bounds in world space //LogBounds( obj->GetText().ToCStr(), "Transformed CullBounds", myCullBounds ); debugLines.AddBounds( curModelPose, obj->GetCullBounds(), Vector4f( 0.0f, 1.0f, 1.0f, 1.0f ) ); } { Bounds3f localBounds = obj->GetLocalBounds( font ) * parentScale; //LogBounds( obj->GetText().ToCStr(), "localBounds", localBounds ); debugLines.AddBounds( curModelPose, localBounds, Vector4f( 1.0f, 0.0f, 0.0f, 1.0f ) ); Bounds3f textLocalBounds = obj->GetTextLocalBounds( font ); Posef hilightPose = obj->GetHilightPose(); textLocalBounds = Bounds3f::Transform( Posef( hilightPose.Orientation, hilightPose.Position * scale ), textLocalBounds ); debugLines.AddBounds( curModelPose, textLocalBounds * parentScale, Vector4f( 1.0f, 1.0f, 0.0f, 1.0f ) ); } #endif }
void HMDState::GetTimewarpMatricesEx(ovrEyeType eyeId, ovrPosef renderPose, bool calcPosition, const ovrVector3f hmdToEyeViewOffset[2], ovrMatrix4f twmOut[2], double debugTimingOffsetInSeconds) { // Get timewarp start/end timing double timewarpStartEnd[2]; getTimewarpStartEnd(eyeId, timewarpStartEnd); //TPH, to vary timing, to allow developers to debug, to shunt the predicted time forward //and back, and see if the SDK is truly delivering the correct time. Also to allow //illustration of the detrimental effects when this is not done right. timewarpStartEnd[0] += debugTimingOffsetInSeconds; timewarpStartEnd[1] += debugTimingOffsetInSeconds; ovrTrackingState startState = PredictedTrackingState(timewarpStartEnd[0]); ovrTrackingState endState = PredictedTrackingState(timewarpStartEnd[1]); ovrPosef startHmdPose = startState.HeadPose.ThePose; ovrPosef endHmdPose = endState.HeadPose.ThePose; Vector3f eyeOffset = Vector3f(0.0f, 0.0f, 0.0f); Matrix4f timewarpStart, timewarpEnd; if (calcPosition) { if (!hmdToEyeViewOffset) { OVR_ASSERT(false); LogError("{ERR-102} [FrameTime] No hmdToEyeViewOffset provided even though calcPosition is true."); // disable position to avoid positional issues renderPose.Position = Vector3f::Zero(); startHmdPose.Position = Vector3f::Zero(); endHmdPose.Position = Vector3f::Zero(); } else if (hmdToEyeViewOffset[eyeId].x >= MATH_FLOAT_MAXVALUE) { OVR_ASSERT(false); LogError("{ERR-103} [FrameTime] Invalid hmdToEyeViewOffset provided by client."); // disable position to avoid positional issues renderPose.Position = Vector3f::Zero(); startHmdPose.Position = Vector3f::Zero(); endHmdPose.Position = Vector3f::Zero(); } else { // Currently HmdToEyeViewOffset is only a 3D vector // (Negate HmdToEyeViewOffset because offset is a view matrix offset and not a camera offset) eyeOffset = ((Posef)startHmdPose).Apply(-((Vector3f)hmdToEyeViewOffset[eyeId])); } Posef fromEye = Posef(renderPose).Inverted(); // because we need the view matrix, not the camera matrix CalculatePositionalTimewarpMatrix(fromEye, startHmdPose, eyeOffset, timewarpStart); CalculatePositionalTimewarpMatrix(fromEye, endHmdPose, eyeOffset, timewarpEnd); } else { Quatf fromEye = Quatf(renderPose.Orientation).Inverted(); // because we need the view matrix, not the camera matrix CalculateOrientationTimewarpMatrix(fromEye, startHmdPose.Orientation, timewarpStart); CalculateOrientationTimewarpMatrix(fromEye, endHmdPose.Orientation, timewarpEnd); } twmOut[0] = timewarpStart; twmOut[1] = timewarpEnd; }
Posef MakePose( Quatf const & q, float const fwdDist, float const upDist, float const leftDist ) { return Posef( q, MakePosition( fwdDist, upDist, leftDist ) ); }
void ResumeMovieView::CreateMenu( App * app, OvrVRMenuMgr & menuMgr, BitmapFont const & font ) { Menu = VRMenu::Create( "ResumeMoviePrompt" ); Vector3f fwd( 0.0f, 0.0f, 1.0f ); Vector3f up( 0.0f, 1.0f, 0.0f ); Vector3f defaultScale( 1.0f ); Array< VRMenuObjectParms const * > parms; VRMenuFontParms fontParms( true, true, false, false, false, 1.3f ); Quatf orientation( Vector3f( 0.0f, 1.0f, 0.0f ), 0.0f ); Vector3f centerPos( 0.0f, 0.0f, 0.0f ); VRMenuObjectParms centerRootParms( VRMENU_CONTAINER, Array< VRMenuComponent* >(), VRMenuSurfaceParms(), "CenterRoot", Posef( orientation, centerPos ), Vector3f( 1.0f, 1.0f, 1.0f ), fontParms, ID_CENTER_ROOT, VRMenuObjectFlags_t(), VRMenuObjectInitFlags_t( VRMENUOBJECT_INIT_FORCE_POSITION ) ); parms.PushBack( ¢erRootParms ); Menu->InitWithItems( menuMgr, font, 0.0f, VRMenuFlags_t(), parms ); parms.Clear(); // the centerroot item will get touch relative and touch absolute events and use them to rotate the centerRoot menuHandle_t centerRootHandle = Menu->HandleForId( menuMgr, ID_CENTER_ROOT ); VRMenuObject * centerRoot = menuMgr.ToObject( centerRootHandle ); OVR_ASSERT( centerRoot != NULL ); // ============================================================================== // // title // { Posef panelPose( Quatf( up, 0.0f ), Vector3f( 0.0f, 2.2f, -3.0f ) ); VRMenuObjectParms p( VRMENU_STATIC, Array< VRMenuComponent* >(), VRMenuSurfaceParms(), Strings::ResumeMenu_Title, panelPose, defaultScale, fontParms, VRMenuId_t( ID_TITLE.Get() ), VRMenuObjectFlags_t(), VRMenuObjectInitFlags_t( VRMENUOBJECT_INIT_FORCE_POSITION ) ); parms.PushBack( &p ); Menu->AddItems( menuMgr, font, parms, centerRootHandle, false ); parms.Clear(); } // ============================================================================== // // options // Array<const char *> options; options.PushBack( Strings::ResumeMenu_Resume ); options.PushBack( Strings::ResumeMenu_Restart ); Array<const char *> icons; icons.PushBack( "assets/resume.png" ); icons.PushBack( "assets/restart.png" ); Array<PanelPose> optionPositions; optionPositions.PushBack( PanelPose( Quatf( up, 0.0f / 180.0f * Mathf::Pi ), Vector3f( -0.5f, 1.7f, -3.0f ), Vector4f( 1.0f, 1.0f, 1.0f, 1.0f ) ) ); optionPositions.PushBack( PanelPose( Quatf( up, 0.0f / 180.0f * Mathf::Pi ), Vector3f( 0.5f, 1.7f, -3.0f ), Vector4f( 1.0f, 1.0f, 1.0f, 1.0f ) ) ); int borderWidth = 0, borderHeight = 0; GLuint borderTexture = LoadTextureFromApplicationPackage( "assets/resume_restart_border.png", TextureFlags_t( TEXTUREFLAG_NO_DEFAULT ), borderWidth, borderHeight ); for ( int i = 0; i < optionPositions.GetSizeI(); ++i ) { ResumeMovieComponent * resumeMovieComponent = new ResumeMovieComponent( this, i ); Array< VRMenuComponent* > optionComps; optionComps.PushBack( resumeMovieComponent ); VRMenuSurfaceParms panelSurfParms( "", borderTexture, borderWidth, borderHeight, SURFACE_TEXTURE_ADDITIVE, 0, 0, 0, SURFACE_TEXTURE_MAX, 0, 0, 0, SURFACE_TEXTURE_MAX ); Posef panelPose( optionPositions[ i ].Orientation, optionPositions[ i ].Position ); VRMenuObjectParms * p = new VRMenuObjectParms( VRMENU_BUTTON, optionComps, panelSurfParms, options[ i ], panelPose, defaultScale, fontParms, VRMenuId_t( ID_OPTIONS.Get() + i ), VRMenuObjectFlags_t(), VRMenuObjectInitFlags_t( VRMENUOBJECT_INIT_FORCE_POSITION ) ); parms.PushBack( p ); Menu->AddItems( menuMgr, font, parms, centerRootHandle, false ); DeletePointerArray( parms ); parms.Clear(); // add icon menuHandle_t optionHandle = centerRoot->ChildHandleForId( menuMgr, VRMenuId_t( ID_OPTIONS.Get() + i ) ); VRMenuObject * optionObject = menuMgr.ToObject( optionHandle ); OVR_ASSERT( optionObject != NULL ); int iconWidth = 0, iconHeight = 0; GLuint iconTexture = LoadTextureFromApplicationPackage( icons[ i ], TextureFlags_t( TEXTUREFLAG_NO_DEFAULT ), iconWidth, iconHeight ); VRMenuSurfaceParms iconSurfParms( "", iconTexture, iconWidth, iconHeight, SURFACE_TEXTURE_DIFFUSE, 0, 0, 0, SURFACE_TEXTURE_MAX, 0, 0, 0, SURFACE_TEXTURE_MAX ); Bounds3f textBounds = optionObject->GetTextLocalBounds( font ); optionObject->SetTextLocalPosition( Vector3f( iconWidth * VRMenuObject::DEFAULT_TEXEL_SCALE * 0.5f, 0.0f, 0.0f ) ); Posef iconPose( optionPositions[ i ].Orientation, optionPositions[ i ].Position + Vector3f( textBounds.GetMins().x, 0.0f, 0.01f ) ); p = new VRMenuObjectParms( VRMENU_STATIC, Array< VRMenuComponent* >(), iconSurfParms, NULL, iconPose, defaultScale, fontParms, VRMenuId_t( ID_OPTION_ICONS.Get() + i ), VRMenuObjectFlags_t( VRMENUOBJECT_DONT_HIT_ALL ), VRMenuObjectInitFlags_t( VRMENUOBJECT_INIT_FORCE_POSITION ) ); parms.PushBack( p ); Menu->AddItems( menuMgr, font, parms, centerRootHandle, false ); DeletePointerArray( parms ); parms.Clear(); menuHandle_t iconHandle = centerRoot->ChildHandleForId( menuMgr, VRMenuId_t( ID_OPTION_ICONS.Get() + i ) ); resumeMovieComponent->Icon = menuMgr.ToObject( iconHandle ); } Cinema.app->GetGuiSys().AddMenu( Menu ); }
bool SensorStateReader::GetSensorStateAtTime(double absoluteTime, TrackingState& ss) const { if (!Updater) { ss.StatusFlags = 0; return false; } const LocklessSensorState lstate = Updater->SharedSensorState.GetState(); // Update time ss.HeadPose.TimeInSeconds = absoluteTime; // Update the status flags ss.StatusFlags = lstate.StatusFlags; // If no hardware is connected, override the tracking flags if (0 == (ss.StatusFlags & Status_HMDConnected)) { ss.StatusFlags &= ~Status_TrackingMask; } if (0 == (ss.StatusFlags & Status_PositionConnected)) { ss.StatusFlags &= ~(Status_PositionTracked | Status_CameraPoseTracked); } // If tracking info is invalid, if (0 == (ss.StatusFlags & Status_TrackingMask)) { return false; } // Delta time from the last available data double pdt = absoluteTime - lstate.WorldFromImu.TimeInSeconds; static const double maxPdt = 0.1; // If delta went negative due to synchronization problems between processes or just a lag spike, if (pdt < 0.) { pdt = 0.; } else if (pdt > maxPdt) { if (LastLatWarnTime != lstate.WorldFromImu.TimeInSeconds) { LastLatWarnTime = lstate.WorldFromImu.TimeInSeconds; LogText("[SensorStateReader] Prediction interval too high: %f s, clamping at %f s\n", pdt, maxPdt); } pdt = maxPdt; } ss.HeadPose = PoseStatef(lstate.WorldFromImu); // Do prediction logic and ImuFromCpf transformation ss.HeadPose.ThePose = Posef(CenteredFromWorld * calcPredictedPose(lstate.WorldFromImu, pdt) * lstate.ImuFromCpf); ss.CameraPose = Posef(CenteredFromWorld * lstate.WorldFromCamera); Posed worldFromLeveledCamera = Posed(Quatd(), lstate.WorldFromCamera.Translation); ss.LeveledCameraPose = Posef(CenteredFromWorld * worldFromLeveledCamera); ss.RawSensorData = lstate.RawSensorData; ss.LastVisionProcessingTime = lstate.LastVisionProcessingTime; return true; }