#ifndef OPENXR_MENU_HPP #define OPENXR_MENU_HPP #include #include #include #include #include #include "openxrview.hpp" #include "openxrlayer.hpp" struct XrCompositionLayerQuad; namespace MWVR { class GUICamera; class OpenXRMenu { public: OpenXRMenu( osg::ref_ptr geometryRoot, osg::ref_ptr cameraRoot, osg::ref_ptr menuSubgraph, const std::string& title, osg::Vec2 extent_meters, Pose pose, int width, int height, const osg::Vec4& clearColor, osgViewer::Viewer* viewer); ~OpenXRMenu(); const std::string& title() const { return mTitle; } void updateCallback(); void preRenderCallback(osg::RenderInfo& renderInfo); void postRenderCallback(osg::RenderInfo& renderInfo); osg::Camera* camera(); osg::ref_ptr menuTexture(); void updatePose(Pose pose); public: std::string mTitle; osg::ref_ptr mGeometryRoot; osg::ref_ptr mGeometry{ new osg::Geometry }; osg::ref_ptr mTransform{ new osg::PositionAttitudeTransform }; osg::ref_ptr mCameraRoot; osg::ref_ptr mMenuSubgraph; osg::ref_ptr mStateSet{ new osg::StateSet }; osg::ref_ptr mGUICamera; }; class OpenXRMenuManager { public: OpenXRMenuManager( osg::ref_ptr viewer); ~OpenXRMenuManager(void); void showMenus(bool show); void updatePose(void); OpenXRMenu* getMenu(void) const { return mMenu.get(); } private: Pose mPose{}; osg::ref_ptr mOsgViewer{ nullptr }; osg::ref_ptr mGUIGeometriesRoot{ new osg::Group }; osg::ref_ptr mGUICamerasRoot{ new osg::Group }; osg::ref_ptr mGuiRoot{ nullptr }; std::unique_ptr mMenu{ nullptr }; }; } #endif