//============================== // VRMenuEventHandler::HandleEvents void VRMenuEventHandler::HandleEvents( App * app, VrFrame const & vrFrame, OvrVRMenuMgr & menuMgr, menuHandle_t const rootHandle, Array< VRMenuEvent > const & events ) const { VRMenuObject * root = menuMgr.ToObject( rootHandle ); if ( root == NULL ) { return; } // find the list of all objects that are in the focused path Array< menuHandle_t > focusPath; FindTargetPath( menuMgr, rootHandle, FocusedHandle, focusPath ); Array< menuHandle_t > targetPath; for ( int i = 0; i < events.GetSizeI(); ++i ) { VRMenuEvent const & event = events[i]; switch ( event.DispatchType ) { case EVENT_DISPATCH_BROADCAST: { // broadcast to everything BroadcastEvent( app, vrFrame, menuMgr, event, root ); } break; case EVENT_DISPATCH_FOCUS: // send to the focus path only -- this list should be parent -> child order DispatchToPath( app, vrFrame, menuMgr, event, focusPath, false ); break; case EVENT_DISPATCH_TARGET: if ( targetPath.GetSizeI() == 0 || event.TargetHandle != targetPath.Back() ) { targetPath.Clear(); FindTargetPath( menuMgr, rootHandle, event.TargetHandle, targetPath ); } DispatchToPath( app, vrFrame, menuMgr, event, targetPath, false ); break; default: OVR_ASSERT( !"unknown dispatch type" ); break; } } }
//============================== // OvrSliderComponent::SetCaretPoseFromFrac void OvrSliderComponent::SetCaretPoseFromFrac( OvrVRMenuMgr & menuMgr, VRMenuObject * self, float const frac ) { OVR_UNUSED( frac ); VRMenuObject * caret = menuMgr.ToObject( self->ChildHandleForId( menuMgr, ScrubberId ) ); if ( caret != NULL ) { Posef curPose = CaretBasePose; float range = MaxValue - MinValue; float frac = floor( SliderFrac * range ) / range; curPose.Position += ( LocalSlideDelta * -0.5f ) + LocalSlideDelta * frac; caret->SetLocalPose( curPose ); } // find the fill object and scale it menuHandle_t fillHandle = Menu.HandleForId( menuMgr, FillId ); VRMenuObject * fillObj = menuMgr.ToObject( fillHandle ); if ( fillObj != NULL ) { Vector4f clipUVs( 0.0f, 1.0f - SliderFrac, 1.0f, 1.0f ); VRMenuSurface & surf = fillObj->GetSurface( 0 ); surf.SetClipUVs( clipUVs ); //LOG( "SliderFrac = %.2f", SliderFrac ); //LOG( "Setting clip UVs to ( %.2f, %.2f, %.2f, %.2f )", clipUVs.x, clipUVs.y, clipUVs.z, clipUVs.w ); } }
//============================== // OvrSliderComponent::OnFrameUpdate eMsgStatus OvrSliderComponent::OnFrameUpdate( App * app, VrFrame const & vrFrame, OvrVRMenuMgr & menuMgr, VRMenuObject * self, VRMenuEvent const & event ) { if ( TouchDown ) { UpdateText( menuMgr, self, BubbleId ); UpdateText( menuMgr, self, TextId ); } if ( BubbleFadeOutTime > 0.0 ) { if ( ovr_GetTimeInSeconds() >= BubbleFadeOutTime ) { BubbleFadeOutTime = -1.0; BubbleFader.StartFadeOut(); } } VRMenuObject * bubble = menuMgr.ToObject( self->ChildHandleForId( menuMgr, BubbleId ) ); if ( bubble != NULL ) { float const fadeTime = 0.5f; float const fadeRate = 1.0 / fadeTime; BubbleFader.Update( fadeRate, vrFrame.DeltaSeconds ); Vector4f color = bubble->GetColor(); color.w = BubbleFader.GetFinalAlpha(); bubble->SetColor( color ); Vector4f textColor = bubble->GetTextColor(); textColor.w = color.w; bubble->SetTextColor( textColor ); } return MSG_STATUS_ALIVE; }
//============================== // VRMenuEventHandler::DispatchToPath bool VRMenuEventHandler::DispatchToPath( App * app, VrFrame const & vrFrame, OvrVRMenuMgr & menuMgr, VRMenuEvent const & event, Array< menuHandle_t > const & path, bool const log ) const { // send to the focus path only -- this list should be parent -> child order for ( int i = 0; i < path.GetSizeI(); ++i ) { VRMenuObject * obj = menuMgr.ToObject( path[i] ); char const * const indent = " "; // set to if ( obj != NULL && DispatchToComponents( app, vrFrame, menuMgr, event, obj ) ) { if ( log ) { LOG( "%sDispatchToPath: %s, object '%s' consumed event.", &indent[64 - i * 2], VRMenuEvent::EventTypeNames[event.EventType], ( obj != NULL ? obj->GetText().ToCStr() : "<null>" ) ); } return true; // consumed by a component } if ( log ) { LOG( "%sDispatchToPath: %s, object '%s' passed event.", &indent[64 - i * 2], VRMenuEvent::EventTypeNames[event.EventType], obj != NULL ? obj->GetText().ToCStr() : "<null>" ); } } return false; }
void OvrScrollBarComponent::SetBaseColor( OvrVRMenuMgr & menuMgr, VRMenuObject * self, const Vector4f & color ) { // Set alpha on the base - move this to somewhere more explicit if needed VRMenuObject * base = menuMgr.ToObject( self->ChildHandleForId( menuMgr, ScrollBarBaseId ) ); if ( base != NULL ) { base->SetSurfaceColor( 0, color ); } }
void ResumeMovieView::SetPosition( OvrVRMenuMgr & menuMgr, const Vector3f &pos ) { menuHandle_t centerRootHandle = Menu->HandleForId( menuMgr, ID_CENTER_ROOT ); VRMenuObject * centerRoot = menuMgr.ToObject( centerRootHandle ); OVR_ASSERT( centerRoot != NULL ); Posef pose = centerRoot->GetLocalPose(); pose.Position = pos; centerRoot->SetLocalPose( pose ); }
//============================== // FindTargetPath static void FindTargetPath( OvrVRMenuMgr const & menuMgr, menuHandle_t const curHandle, Array< menuHandle_t > & targetPath ) { VRMenuObject * obj = menuMgr.ToObject( curHandle ); if ( obj != NULL ) { FindTargetPath( menuMgr, obj->GetParentHandle(), targetPath ); targetPath.PushBack( curHandle ); } }
//============================== // OvrSliderComponent::SetCaretPoseFromFrac void OvrSliderComponent::SetCaretPoseFromFrac( OvrVRMenuMgr & menuMgr, VRMenuObject * self, float const frac ) { VRMenuObject * caret = menuMgr.ToObject( self->ChildHandleForId( menuMgr, ScrubberId ) ); if ( caret != NULL ) { Posef curPose = CaretBasePose; float range = MaxValue - MinValue; float frac = floor( SliderFrac * range ) / range; curPose.Position += ( LocalSlideDelta * -0.5f ) + LocalSlideDelta * frac; caret->SetLocalPose( curPose ); } }
void OvrScrollBarComponent::UpdateScrollBar( OvrVRMenuMgr & menuMgr, VRMenuObject * self, const int numElements ) { NumOfItems = numElements; if ( IsVertical ) { ScrollBarCurrentbaseLength = ScrollBarBaseHeight; } else { ScrollBarCurrentbaseLength = ScrollBarBaseWidth; } ScrollBarCurrentThumbLength = ScrollBarCurrentbaseLength / NumOfItems; ScrollBarCurrentThumbLength = ( ScrollBarCurrentThumbLength < BASE_THUMB_WIDTH ) ? BASE_THUMB_WIDTH : ScrollBarCurrentThumbLength; if ( IsVertical ) { ScrollBarThumbHeight = ScrollBarCurrentThumbLength; } else { ScrollBarThumbWidth = ScrollBarCurrentThumbLength; } VRMenuObject * thumb = menuMgr.ToObject( self->ChildHandleForId( menuMgr, ScrollBarThumbId ) ); if ( thumb != NULL && NumOfItems > 0 ) { thumb->SetSurfaceDims( 0, Vector2f( ScrollBarThumbWidth, ScrollBarThumbHeight ) ); thumb->RegenerateSurfaceGeometry( 0, false ); } VRMenuObject * base = menuMgr.ToObject( self->ChildHandleForId( menuMgr, ScrollBarBaseId ) ); if ( thumb != NULL ) { base->SetSurfaceDims( 0, Vector2f( ScrollBarBaseWidth, ScrollBarBaseHeight ) ); base->RegenerateSurfaceGeometry( 0, false ); } }
//============================== // OvrSliderComponent::OnInit eMsgStatus OvrSliderComponent::OnInit( App * app, VrFrame const & vrFrame, OvrVRMenuMgr & menuMgr, VRMenuObject * self, VRMenuEvent const & event ) { // find the starting offset of the caret LOG( "OvrSliderComponent - VRMENU_EVENT_INIT" ); VRMenuObject * caret = menuMgr.ToObject( self->ChildHandleForId( menuMgr, ScrubberId ) ); if ( caret != NULL ) { CaretBasePose = caret->GetLocalPose(); } SetCaretPoseFromFrac( menuMgr, self, SliderFrac ); UpdateText( menuMgr, self, BubbleId ); return MSG_STATUS_ALIVE; }
void OvrTrailsAnimComponent::SetFrameVisibilities( App * app, VrFrame const & vrFrame, OvrVRMenuMgr & menuMgr, VRMenuObject * self ) const { // LOG( "FracFrame: %f", GetFractionalFrame() ); for ( int i = 0; i < self->NumChildren(); ++i ) { menuHandle_t childHandle = self->GetChildHandleForIndex( i ); if ( VRMenuObject * childObject = menuMgr.ToObject( childHandle ) ) { Vector4f color = childObject->GetColor(); color.w = GetAlphaForFrame( i ); childObject->SetColor( color ); } } }
//============================== // OvrSliderComponent::UpdateText void OvrSliderComponent::UpdateText( OvrVRMenuMgr & menuMgr, VRMenuObject * self, VRMenuId_t const id ) { if ( !id.IsValid() ) { return; } VRMenuObject * obj = menuMgr.ToObject( self->ChildHandleForId( menuMgr, id ) ); if ( obj != NULL ) { char valueStr[127]; GetStringValue( valueStr, sizeof( valueStr ) ); obj->SetText( valueStr ); } }
void MoviePlayerView::CreateMenu( App * app, OvrVRMenuMgr & menuMgr, BitmapFont const & font ) { Menu = VRMenu::Create( "MoviePlayerMenu" ); Array< VRMenuObjectParms const * > parms; Posef moveScreenPose( Quatf( Vector3f( 0.0f, 1.0f, 0.0f ), 0.0f ), Vector3f( 0.0f, 0.0f, -1.8f ) ); VRMenuFontParms moveScreenFontParms( true, true, false, false, false, 0.5f ); VRMenuSurfaceParms moveScreenSurfParms( "", NULL, SURFACE_TEXTURE_MAX, NULL, SURFACE_TEXTURE_MAX, NULL, SURFACE_TEXTURE_MAX ); VRMenuObjectParms moveScreenParms( VRMENU_BUTTON, Array< VRMenuComponent* >(), moveScreenSurfParms, Strings::MoviePlayer_Reorient, moveScreenPose, Vector3f( 1.0f ), moveScreenFontParms, ID_MOVE_SCREEN, VRMenuObjectFlags_t(), VRMenuObjectInitFlags_t( VRMENUOBJECT_INIT_FORCE_POSITION ) ); parms.PushBack( &moveScreenParms ); Menu->InitWithItems(menuMgr, font, 0.0f, VRMenuFlags_t( VRMENU_FLAG_TRACK_GAZE ) | VRMENU_FLAG_BACK_KEY_DOESNT_EXIT, parms); parms.Clear(); MoveScreenHandle = Menu->HandleForId( menuMgr, ID_MOVE_SCREEN ); MoveScreenObj = menuMgr.ToObject( MoveScreenHandle ); MoveScreenObj->AddFlags( VRMENUOBJECT_DONT_RENDER ); Vector3f moveScreenTextPosition = Vector3f( 0.0f, -24 * VRMenuObject::DEFAULT_TEXEL_SCALE, 0.0f ); MoveScreenObj->SetTextLocalPosition( moveScreenTextPosition ); // ============================================================================== // // finalize // Cinema.app->GetGuiSys().AddMenu( Menu ); }
//============================== // VRMenuEventHandler::BroadcastEvent bool VRMenuEventHandler::BroadcastEvent( App * app, VrFrame const & vrFrame, OvrVRMenuMgr & menuMgr, VRMenuEvent const & event, VRMenuObject * receiver ) const { DROID_ASSERT( receiver != NULL, "VrMenu" ); // allow parent components to handle first if ( DispatchToComponents( app, vrFrame, menuMgr, event, receiver ) ) { return true; } // if the parent did not consume, dispatch to children int numChildren = receiver->NumChildren(); for ( int i = 0; i < numChildren; ++i ) { menuHandle_t childHandle = receiver->GetChildHandleForIndex( i ); VRMenuObject * child = menuMgr.ToObject( childHandle ); if ( child != NULL && BroadcastEvent( app, vrFrame, menuMgr, event, child ) ) { return true; // consumed by child } } return false; }
//============================== // VRMenuEventHandler::Frame void VRMenuEventHandler::Frame( App * app, VrFrame const & vrFrame, OvrVRMenuMgr & menuMgr, BitmapFont const & font, menuHandle_t const & rootHandle,Posef const & menuPose, gazeCursorUserId_t const & gazeUserId, Array< VRMenuEvent > & events ) { VRMenuObject * root = menuMgr.ToObject( rootHandle ); if ( root == NULL ) { return; } // find the object the gaze is touching and update gaze focus const Matrix4f viewMatrix = app->GetLastViewMatrix(); const Vector3f viewPos( GetViewMatrixPosition( viewMatrix ) ); const Vector3f viewFwd( GetViewMatrixForward( viewMatrix ) ); HitTestResult result; menuHandle_t hitHandle = root->HitTest( app, menuMgr, font, menuPose, viewPos, viewFwd, ContentFlags_t( CONTENT_SOLID ), result ); result.RayStart = viewPos; result.RayDir = viewFwd; VRMenuObject * hit = hitHandle.IsValid() ? menuMgr.ToObject( hitHandle ) : NULL; app->GetGazeCursor().UpdateForUser( gazeUserId, result.t, ( hit != NULL && !( hit->GetFlags() & VRMenuObjectFlags_t( VRMENUOBJECT_NO_GAZE_HILIGHT ) ) ) ? CURSOR_STATE_HILIGHT : CURSOR_STATE_NORMAL ); /* if ( hit != NULL ) { app->ShowInfoText( 0.0f, "%s", hit->GetText().ToCStr() ); } */ bool focusChanged = ( hitHandle != FocusedHandle ); if ( focusChanged ) { // focus changed VRMenuObject * oldFocus = menuMgr.ToObject( FocusedHandle ); if ( oldFocus != NULL ) { // setup event for item losing the focus VRMenuEvent event( VRMENU_EVENT_FOCUS_LOST, EVENT_DISPATCH_TARGET, FocusedHandle, Vector3f( 0.0f ), result ); events.PushBack( event ); } if ( hit != NULL ) { if ( ( hit->GetFlags() & VRMENUOBJECT_FLAG_NO_FOCUS_GAINED ) == 0 ) { // set up event for item gaining the focus VRMenuEvent event( VRMENU_EVENT_FOCUS_GAINED, EVENT_DISPATCH_FOCUS, hitHandle, Vector3f( 0.0f ), result ); events.PushBack( event ); } } FocusedHandle = hitHandle; } bool touchPressed = ( vrFrame.Input.buttonPressed & ( BUTTON_TOUCH | BUTTON_A ) ) != 0; bool touchReleased = !touchPressed && ( vrFrame.Input.buttonReleased & ( BUTTON_TOUCH | BUTTON_A ) ) != 0; bool touchDown = ( vrFrame.Input.buttonState & BUTTON_TOUCH ) != 0; if ( ( vrFrame.Input.buttonPressed & BUTTON_SWIPE_UP ) != 0 ) { VRMenuEvent event( VRMENU_EVENT_SWIPE_UP, EVENT_DISPATCH_FOCUS, FocusedHandle, Vector3f( 0.0f ), result ); events.PushBack( event ); } if ( ( vrFrame.Input.buttonPressed & BUTTON_SWIPE_DOWN ) != 0 ) { VRMenuEvent event( VRMENU_EVENT_SWIPE_DOWN, EVENT_DISPATCH_FOCUS, FocusedHandle, Vector3f( 0.0f ), result ); events.PushBack( event ); } if ( ( vrFrame.Input.buttonPressed & BUTTON_SWIPE_FORWARD ) != 0 ) { VRMenuEvent event( VRMENU_EVENT_SWIPE_FORWARD, EVENT_DISPATCH_FOCUS, FocusedHandle, Vector3f( 0.0f ), result ); events.PushBack( event ); } if ( ( vrFrame.Input.buttonPressed & BUTTON_SWIPE_BACK ) != 0 ) { VRMenuEvent event( VRMENU_EVENT_SWIPE_BACK, EVENT_DISPATCH_FOCUS, FocusedHandle, Vector3f( 0.0f ), result ); events.PushBack( event ); } /* // report swipe data char const * swipeNames[5] = { "none", "down", "up", "back", "forward" }; int swipeUpDown = ( vrFrame.Input.buttonPressed & BUTTON_SWIPE_UP ) ? 2 : 0; swipeUpDown = ( vrFrame.Input.buttonPressed & BUTTON_SWIPE_DOWN ) ? 1 : swipeUpDown; int swipeForwardBack = ( vrFrame.Input.buttonPressed & BUTTON_SWIPE_FORWARD ) ? 4 : 0; swipeForwardBack = ( vrFrame.Input.buttonPressed & BUTTON_SWIPE_BACK ) ? 3 : swipeForwardBack; app->ShowInfoText( 1.0f, "touch %s\n( %s, %s )\n( %.2f, %.2f )\n( %.2f, %.2f )", touchDown ? swipeNames[1] : swipeNames[2], swipeNames[swipeUpDown], swipeNames[swipeForwardBack], vrFrame.Input.touch[0], vrFrame.Input.touch[1], vrFrame.Input.touchRelative[0], vrFrame.Input.touchRelative[1] ); */ // if nothing is focused, send events to the root if ( touchPressed ) { VRMenuEvent event( VRMENU_EVENT_TOUCH_DOWN, EVENT_DISPATCH_FOCUS, FocusedHandle, Vector3f( 0.0f ), result ); events.PushBack( event ); } if ( touchReleased ) { VRMenuEvent event( VRMENU_EVENT_TOUCH_UP, EVENT_DISPATCH_FOCUS, FocusedHandle, Vector3f( vrFrame.Input.touchRelative, 0.0f ), result ); events.PushBack( event ); } if ( touchDown ) { if ( vrFrame.Input.touchRelative.LengthSq() > Mathf::SmallestNonDenormal ) { VRMenuEvent event( VRMENU_EVENT_TOUCH_RELATIVE, EVENT_DISPATCH_FOCUS, FocusedHandle, Vector3f( vrFrame.Input.touchRelative, 0.0f ), result ); events.PushBack( event ); } VRMenuEvent event( VRMENU_EVENT_TOUCH_ABSOLUTE, EVENT_DISPATCH_FOCUS, FocusedHandle, Vector3f( vrFrame.Input.touch, 0.0f ), result ); events.PushBack( event ); } { // always post the frame event to the root VRMenuEvent event( VRMENU_EVENT_FRAME_UPDATE, EVENT_DISPATCH_BROADCAST, menuHandle_t(), Vector3f( 0.0f ), result ); events.PushBack( event ); } }
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 ); }
void OvrScrollBarComponent::SetScrollFrac( OvrVRMenuMgr & menuMgr, VRMenuObject * self, const float pos ) { if ( NumOfItems <= 0 ) return; // Updating thumb length when pulled beyond its bounds const float scrollEnd = (float)( NumOfItems - 1 ); const float outOfBoundsOffset = 0.5f; const float minThumbLength = ScrollBarCurrentThumbLength * THUMB_SHRINK_FACTOR; const float maxThumbLength = ScrollBarCurrentThumbLength; const float minThumbOffset = 0.0f; const float maxThumbOffset = ( maxThumbLength - minThumbLength ) * 0.5f; float currentThumbLength = ScrollBarCurrentThumbLength; float thumbPosOffset = 0.0f; if ( pos < 0.0f ) { currentThumbLength = LinearRangeMapFloat( pos, -outOfBoundsOffset, 0.0f, minThumbLength, maxThumbLength ); thumbPosOffset = LinearRangeMapFloat( pos, -outOfBoundsOffset, 0.0f, -maxThumbOffset, minThumbOffset ); } else if ( pos > scrollEnd ) { currentThumbLength = LinearRangeMapFloat( pos, scrollEnd + outOfBoundsOffset, scrollEnd, minThumbLength, maxThumbLength ); thumbPosOffset = LinearRangeMapFloat( pos, scrollEnd + outOfBoundsOffset, scrollEnd, maxThumbOffset, minThumbOffset ); } float thumbWidth = ScrollBarThumbWidth; float thumbHeight = ScrollBarThumbHeight; if ( IsVertical ) { thumbHeight = currentThumbLength; } else { thumbWidth = currentThumbLength; } VRMenuObject * thumb = menuMgr.ToObject( self->ChildHandleForId( menuMgr, ScrollBarThumbId ) ); if ( thumb != NULL && NumOfItems > 0 ) { thumb->SetSurfaceDims( 0, Vector2f( thumbWidth, thumbHeight ) ); thumb->RegenerateSurfaceGeometry( 0, false ); } // Updating thumb position float clampedPos = Alg::Clamp( pos, 0.0f, (float)(NumOfItems - 1) ); float thumbPos = LinearRangeMapFloat( clampedPos, 0.0f, (float)(NumOfItems - 1), 0.0f, ( ScrollBarCurrentbaseLength - currentThumbLength ) ); thumbPos -= ( ScrollBarCurrentbaseLength - currentThumbLength ) * 0.5f; thumbPos += thumbPosOffset; thumbPos *= VRMenuObject::DEFAULT_TEXEL_SCALE; if ( thumb != NULL ) { Vector3f direction = RIGHT; if ( IsVertical ) { direction = DOWN; } thumb->SetLocalPosition( ( direction * thumbPos ) - ( FWD * THUMB_FROM_BASE_OFFSET ) ); } }