@@ -674,24 +674,42 @@ namespace {
674674 return swapchainImageIndex;
675675 }
676676
677- void UpdateSpinningCube (XrTime predictedDisplayTime) {
678- if (!m_mainCubeIndex) {
677+ void InitializeSpinningCube (XrTime predictedDisplayTime) {
678+ auto createReferenceSpace = [session = m_session.Get ()](XrReferenceSpaceType referenceSpaceType, XrPosef poseInReferenceSpace) {
679+ xr::SpaceHandle space;
680+ XrReferenceSpaceCreateInfo createInfo{XR_TYPE_REFERENCE_SPACE_CREATE_INFO };
681+ createInfo.referenceSpaceType = referenceSpaceType;
682+ createInfo.poseInReferenceSpace = poseInReferenceSpace;
683+ CHECK_XRCMD (xrCreateReferenceSpace (session, &createInfo, space.Put ()));
684+ return space;
685+ };
686+
687+ {
679688 // Initialize a big cube 1 meter in front of user.
680- Hologram hologram = CreateHologram ( xr::math::Pose::Translation ({ 0 , 0 , - 1 }), predictedDisplayTime) ;
689+ Hologram hologram{} ;
681690 hologram.Cube .Scale = {0 .25f , 0 .25f , 0 .25f };
691+ hologram.Cube .Space = createReferenceSpace (XR_REFERENCE_SPACE_TYPE_LOCAL , xr::math::Pose::Translation ({0 , 0 , -1 }));
682692 m_holograms.push_back (std::move (hologram));
683693 m_mainCubeIndex = (uint32_t )m_holograms.size () - 1 ;
684694 }
685695
686- if (!m_spinningCubeIndex) {
696+ {
687697 // Initialize a small cube and remember the time when animation is started.
688- Hologram hologram = CreateHologram ( xr::math::Pose::Translation ({ 0 , 0 , - 1 }), predictedDisplayTime) ;
698+ Hologram hologram{} ;
689699 hologram.Cube .Scale = {0 .1f , 0 .1f , 0 .1f };
700+ hologram.Cube .Space = createReferenceSpace (XR_REFERENCE_SPACE_TYPE_LOCAL , xr::math::Pose::Translation ({0 , 0 , -1 }));
690701 m_holograms.push_back (std::move (hologram));
691702 m_spinningCubeIndex = (uint32_t )m_holograms.size () - 1 ;
692703
693704 m_spinningCubeStartTime = predictedDisplayTime;
694705 }
706+ }
707+
708+ void UpdateSpinningCube (XrTime predictedDisplayTime) {
709+ if (!m_mainCubeIndex || !m_spinningCubeIndex) {
710+ // Deferred initialization of spinning cubes so they appear at right place for the first frame.
711+ InitializeSpinningCube (predictedDisplayTime);
712+ }
695713
696714 // Pause spinning cube animation when app loses 3D focus
697715 if (IsSessionFocused ()) {
0 commit comments