@@ -674,24 +674,42 @@ namespace {
674
674
return swapchainImageIndex;
675
675
}
676
676
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
+ {
679
688
// 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{} ;
681
690
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 }));
682
692
m_holograms.push_back (std::move (hologram));
683
693
m_mainCubeIndex = (uint32_t )m_holograms.size () - 1 ;
684
694
}
685
695
686
- if (!m_spinningCubeIndex) {
696
+ {
687
697
// 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{} ;
689
699
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 }));
690
701
m_holograms.push_back (std::move (hologram));
691
702
m_spinningCubeIndex = (uint32_t )m_holograms.size () - 1 ;
692
703
693
704
m_spinningCubeStartTime = predictedDisplayTime;
694
705
}
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
+ }
695
713
696
714
// Pause spinning cube animation when app loses 3D focus
697
715
if (IsSessionFocused ()) {
0 commit comments