#pragma once #include #include #include #include #include class QQuickWindow; // application namespace namespace advsettings { // forward declaration class OverlayController; struct ChaperoneProfile { std::string profileName; bool includesChaperoneGeometry = false; unsigned chaperoneGeometryQuadCount = 0; std::unique_ptr chaperoneGeometryQuads = nullptr; vr::HmdMatrix34_t standingCenter; float playSpaceAreaX = 0.0f; float playSpaceAreaZ = 0.0f; bool includesVisibility = false; float visibility = 0.6f; bool includesFadeDistance = false; float fadeDistance = 0.7f; bool includesCenterMarker = false; bool centerMarker = false; bool includesPlaySpaceMarker = false; bool playSpaceMarker = false; bool includesFloorBoundsMarker = false; bool floorBoundsMarker = false; bool includesBoundsColor = false; int boundsColor[3] = {0, 0, 0}; bool includesChaperoneStyle = false; int chaperoneStyle = 0; bool includesForceBounds = false; bool forceBounds = false; bool includesProximityWarningSettings = false; bool enableChaperoneSwitchToBeginner = false; float chaperoneSwitchToBeginnerDistance = 0.0f; bool enableChaperoneHapticFeedback = false; float chaperoneHapticFeedbackDistance = 0.0f; bool enableChaperoneAlarmSound = false; bool chaperoneAlarmSoundLooping = true; bool chaperoneAlarmSoundAdjustVolume = false; float chaperoneAlarmSoundDistance = 0.0f; bool enableChaperoneShowDashboard = false; float chaperoneShowDashboardDistance = 0.0f; bool enableChaperoneVelocityModifier = false; float chaperoneVelocityModifier = 0.0f; }; class ChaperoneTabController : public QObject { Q_OBJECT Q_PROPERTY(float boundsVisibility READ boundsVisibility WRITE setBoundsVisibility NOTIFY boundsVisibilityChanged) Q_PROPERTY(float fadeDistance READ fadeDistance WRITE setFadeDistance NOTIFY fadeDistanceChanged) Q_PROPERTY(float height READ height WRITE setHeight NOTIFY heightChanged) Q_PROPERTY(bool centerMarker READ centerMarker WRITE setCenterMarker NOTIFY centerMarkerChanged) Q_PROPERTY(bool playSpaceMarker READ playSpaceMarker WRITE setPlaySpaceMarker NOTIFY playSpaceMarkerChanged) Q_PROPERTY(bool forceBounds READ forceBounds WRITE setForceBounds NOTIFY forceBoundsChanged) Q_PROPERTY(bool chaperoneSwitchToBeginnerEnabled READ isChaperoneSwitchToBeginnerEnabled WRITE setChaperoneSwitchToBeginnerEnabled NOTIFY chaperoneSwitchToBeginnerEnabledChanged) Q_PROPERTY(float chaperoneSwitchToBeginnerDistance READ chaperoneSwitchToBeginnerDistance WRITE setChaperoneSwitchToBeginnerDistance NOTIFY chaperoneSwitchToBeginnerDistanceChanged) Q_PROPERTY(bool chaperoneHapticFeedbackEnabled READ isChaperoneHapticFeedbackEnabled WRITE setChaperoneHapticFeedbackEnabled NOTIFY chaperoneHapticFeedbackEnabledChanged) Q_PROPERTY(float chaperoneHapticFeedbackDistance READ chaperoneHapticFeedbackDistance WRITE setChaperoneHapticFeedbackDistance NOTIFY chaperoneHapticFeedbackDistanceChanged) Q_PROPERTY(bool chaperoneAlarmSoundEnabled READ isChaperoneAlarmSoundEnabled WRITE setChaperoneAlarmSoundEnabled NOTIFY chaperoneAlarmSoundEnabledChanged) Q_PROPERTY(bool chaperoneAlarmSoundLooping READ isChaperoneAlarmSoundLooping WRITE setChaperoneAlarmSoundLooping NOTIFY chaperoneAlarmSoundLoopingChanged) Q_PROPERTY(bool chaperoneAlarmSoundAdjustVolume READ isChaperoneAlarmSoundAdjustVolume WRITE setChaperoneAlarmSoundAdjustVolume NOTIFY chaperoneAlarmSoundAdjustVolumeChanged) Q_PROPERTY(float chaperoneAlarmSoundDistance READ chaperoneAlarmSoundDistance WRITE setChaperoneAlarmSoundDistance NOTIFY chaperoneAlarmSoundDistanceChanged) Q_PROPERTY(bool chaperoneShowDashboardEnabled READ isChaperoneShowDashboardEnabled WRITE setChaperoneShowDashboardEnabled NOTIFY chaperoneShowDashboardEnabledChanged) Q_PROPERTY(float chaperoneShowDashboardDistance READ chaperoneShowDashboardDistance WRITE setChaperoneShowDashboardDistance NOTIFY chaperoneShowDashboardDistanceChanged) Q_PROPERTY(bool chaperoneVelocityModifierEnabled READ isChaperoneVelocityModifierEnabled WRITE setChaperoneVelocityModifierEnabled NOTIFY chaperoneVelocityModifierEnabledChanged) Q_PROPERTY(float chaperoneVelocityModifier READ chaperoneVelocityModifier WRITE setChaperoneVelocityModifier NOTIFY chaperoneVelocityModifierChanged) private: OverlayController* parent; QQuickWindow* widget; float m_visibility = 0.6f; float m_fadeDistance = 0.7f; float m_fadeDistanceModified = 0.7f; float m_height = 2.0f; bool m_centerMarker = false; bool m_playSpaceMarker = false; bool m_forceBounds = false; bool m_enableChaperoneSwitchToBeginner = false; float m_chaperoneSwitchToBeginnerDistance = 0.5f; bool m_chaperoneSwitchToBeginnerActive = false; int32_t m_chaperoneSwitchToBeginnerLastStyle = 0; bool m_enableChaperoneHapticFeedback = true; float m_chaperoneHapticFeedbackDistance = 0.5f; bool m_chaperoneHapticFeedbackActive = false; std::thread m_chaperoneHapticFeedbackThread; bool m_enableChaperoneAlarmSound = false; bool m_chaperoneAlarmSoundLooping = true; bool m_chaperoneAlarmSoundAdjustVolume = false; float m_chaperoneAlarmSoundDistance = 0.5f; bool m_chaperoneAlarmSoundActive = false; bool m_enableChaperoneShowDashboard = false; float m_chaperoneShowDashboardDistance = 0.5f; bool m_chaperoneShowDashboardActive = false; bool m_enableChaperoneVelocityModifier = false; float m_chaperoneVelocityModifier = 0.0f; float m_chaperoneVelocityModifierCurrent = 1.0f; unsigned settingsUpdateCounter = 0; std::vector chaperoneProfiles; public: ~ChaperoneTabController(); void initStage1(); void initStage2(OverlayController* parent, QQuickWindow* widget); void eventLoopTick(vr::TrackedDevicePose_t* devicePoses, float leftSpeed, float rightSpeed, float hmdSpeed); void handleChaperoneWarnings(float distance); float boundsVisibility() const; float fadeDistance() const; float height() const; bool centerMarker() const; bool playSpaceMarker() const; bool forceBounds() const; bool isChaperoneSwitchToBeginnerEnabled() const; float chaperoneSwitchToBeginnerDistance() const; bool isChaperoneHapticFeedbackEnabled() const; float chaperoneHapticFeedbackDistance() const; bool isChaperoneAlarmSoundEnabled() const; bool isChaperoneAlarmSoundLooping() const; bool isChaperoneAlarmSoundAdjustVolume() const; float chaperoneAlarmSoundDistance() const; bool isChaperoneShowDashboardEnabled() const; float chaperoneShowDashboardDistance() const; bool isChaperoneVelocityModifierEnabled() const; float chaperoneVelocityModifier() const; void reloadChaperoneProfiles(); void saveChaperoneProfiles(); Q_INVOKABLE unsigned getChaperoneProfileCount(); Q_INVOKABLE QString getChaperoneProfileName(unsigned index); float getBoundsMaxY(); public slots: void setBoundsVisibility(float value, bool notify = true); void setFadeDistance(float value, bool notify = true); void setHeight(float value, bool notify = true); void updateHeight(float value, bool notify = true); void setCenterMarker(bool value, bool notify = true); void setPlaySpaceMarker(bool value, bool notify = true); void setForceBounds(bool value, bool notify = true); void setChaperoneSwitchToBeginnerEnabled(bool value, bool notify = true); void setChaperoneSwitchToBeginnerDistance(float value, bool notify = true); void setChaperoneHapticFeedbackEnabled(bool value, bool notify = true); void setChaperoneHapticFeedbackDistance(float value, bool notify = true); void setChaperoneAlarmSoundEnabled(bool value, bool notify = true); void setChaperoneAlarmSoundLooping(bool value, bool notify = true); void setChaperoneAlarmSoundAdjustVolume(bool value, bool notify = true); void setChaperoneAlarmSoundDistance(float value, bool notify = true); void setChaperoneShowDashboardEnabled(bool value, bool notify = true); void setChaperoneShowDashboardDistance(float value, bool notify = true); void setChaperoneVelocityModifierEnabled(bool value, bool notify = true); void setChaperoneVelocityModifier(float value, bool notify = true); void flipOrientation(); void reloadFromDisk(); void addChaperoneProfile(QString name, bool includeGeometry, bool includeVisbility, bool includeFadeDistance, bool includeCenterMarker, bool includePlaySpaceMarker, bool includeFloorBounds, bool includeBoundsColor, bool includeChaperoneStyle, bool includeForceBounds, bool includesProximityWarningSettings); void applyChaperoneProfile(unsigned index); void deleteChaperoneProfile(unsigned index); void reset(); void shutdown(); signals: void boundsVisibilityChanged(float value); void fadeDistanceChanged(float value); void heightChanged(float value); void centerMarkerChanged(bool value); void playSpaceMarkerChanged(bool value); void forceBoundsChanged(bool value); void chaperoneSwitchToBeginnerEnabledChanged(bool value); void chaperoneSwitchToBeginnerDistanceChanged(float value); void chaperoneHapticFeedbackEnabledChanged(bool value); void chaperoneHapticFeedbackDistanceChanged(float value); void chaperoneAlarmSoundEnabledChanged(bool value); void chaperoneAlarmSoundLoopingChanged(bool value); void chaperoneAlarmSoundAdjustVolumeChanged(bool value); void chaperoneAlarmSoundDistanceChanged(float value); void chaperoneShowDashboardEnabledChanged(bool value); void chaperoneShowDashboardDistanceChanged(float value); void chaperoneVelocityModifierEnabledChanged(bool value); void chaperoneVelocityModifierChanged(float value); void chaperoneProfilesUpdated(); }; } // namespace advsettings