@@ -94,6 +94,8 @@ VRSceneCompositor::VRSceneCompositor()
9494
9595VRSceneCompositor::~VRSceneCompositor ()
9696{
97+ if (_xrDriver)
98+ _xrDriver->setCompositorAlive (false );
9799 shutdownControllerRayResources ();
98100}
99101
@@ -114,18 +116,24 @@ XrSession VRSceneCompositor::getXrSession() const
114116
115117void VRSceneCompositor::setXrDriver (OpenXRDriver* context)
116118{
119+ if (_xrDriver)
120+ _xrDriver->setCompositorAlive (false );
117121 _xrDriver = context;
122+ if (_xrDriver)
123+ _xrDriver->setCompositorAlive (true );
118124}
119125
120126void VRSceneCompositor::pollEvents ()
121127{
128+ auto xrDriver = _xrDriver;
122129 SceneCompositor::pollEvents ();
123130
124- if (!_xrDriver )
131+ if (!xrDriver || !xrDriver-> isCompositorAlive () )
125132 return ;
126133
127- _xrDriver->setXrToSceneScale (_xrToSceneScale);
128- _xrDriver->pollEvents ();
134+ xrDriver->setXrToSceneScale (_xrToSceneScale);
135+ syncPointerRayCamera (_director->getRunningScene ());
136+ xrDriver->pollEvents ();
129137}
130138
131139bool VRSceneCompositor::isVRActive () const
@@ -154,6 +162,58 @@ void VRSceneCompositor::setXrToSceneScale(float scale)
154162 _xrDriver->setXrToSceneScale (_xrToSceneScale);
155163}
156164
165+ Camera* VRSceneCompositor::selectPointerRaySourceCamera (Scene* scene) const
166+ {
167+ if (!scene)
168+ return nullptr ;
169+
170+ auto defaultCamera = scene->getDefaultCamera ();
171+ if (defaultCamera && defaultCamera->isVisible ())
172+ return defaultCamera;
173+
174+ for (auto camera : scene->getCameras ())
175+ {
176+ if (camera && camera->isVisible ())
177+ return camera;
178+ }
179+
180+ return defaultCamera;
181+ }
182+
183+ Camera* VRSceneCompositor::ensurePointerRayCamera (Scene* scene)
184+ {
185+ auto sourceCamera = selectPointerRaySourceCamera (scene);
186+ if (!sourceCamera)
187+ return nullptr ;
188+
189+ if (!_pointerRayCamera)
190+ _pointerRayCamera = RefPtr<Camera>(Camera::createPerspective (60 .0f , 1 .0f , _nearZ, _farZ));
191+
192+ const auto canvasSize = _director->getCanvasSize ();
193+ const float aspect = canvasSize.height > 0 .0f ? canvasSize.width / canvasSize.height : 1 .0f ;
194+ _pointerRayCamera->initPerspective (60 .0f , aspect, _nearZ, _farZ);
195+ _pointerRayCamera->setNodeToParentTransform (sourceCamera->getNodeToWorldTransform ());
196+ _pointerRayCamera->setAdditionalTransform (Mat4::identity);
197+ _pointerRayCamera->setCameraFlag (sourceCamera->getCameraFlag ());
198+
199+ return _pointerRayCamera.get ();
200+ }
201+
202+ void VRSceneCompositor::syncPointerRayCamera (Scene* scene)
203+ {
204+ if (!_xrDriver)
205+ return ;
206+
207+ auto camera = ensurePointerRayCamera (scene);
208+ if (!camera)
209+ {
210+ _xrDriver->clearPointerRayTransform ();
211+ return ;
212+ }
213+
214+ _xrDriver->setPointerRayTransform (camera->getNodeToWorldTransform ());
215+ }
216+
157217void VRSceneCompositor::ensureControllerRayResources ()
158218{
159219 if (_controllerRayResourcesInitialized)
@@ -361,7 +421,7 @@ void VRSceneCompositor::renderScene(Renderer* renderer, Scene* scene)
361421 camera->setAdditionalTransform (Mat4::identity);
362422 }
363423
364- auto rayCamera = eyeCamera;
424+ auto rayCamera = _pointerRayCamera ? _pointerRayCamera. get () : eyeCamera;
365425 if (rayCamera)
366426 {
367427 Camera::setVisitingCamera (rayCamera);
0 commit comments