diff options
Diffstat (limited to 'LibOVR/Src/CAPI/CAPI_HSWDisplay.h')
-rw-r--r-- | LibOVR/Src/CAPI/CAPI_HSWDisplay.h | 249 |
1 files changed, 249 insertions, 0 deletions
diff --git a/LibOVR/Src/CAPI/CAPI_HSWDisplay.h b/LibOVR/Src/CAPI/CAPI_HSWDisplay.h new file mode 100644 index 0000000..ee984d8 --- /dev/null +++ b/LibOVR/Src/CAPI/CAPI_HSWDisplay.h @@ -0,0 +1,249 @@ +/************************************************************************************ + +Filename : CAPI_HSWDisplay.h +Content : Implements Health and Safety Warning system. +Created : July 3, 2014 +Authors : Paul Pedriana + +Copyright : Copyright 2014 Oculus VR, LLC All Rights reserved. + +Licensed under the Oculus VR Rift SDK License Version 3.2 (the "License"); +you may not use the Oculus VR Rift SDK except in compliance with the License, +which is provided at the time of installation or download, or which +otherwise accompanies this software in either electronic or hard copy form. + +You may obtain a copy of the License at + +http://www.oculusvr.com/licenses/LICENSE-3.2 + +Unless required by applicable law or agreed to in writing, the Oculus VR SDK +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +************************************************************************************/ + +#ifndef OVR_CAPI_HSWDisplay_h +#define OVR_CAPI_HSWDisplay_h + +#include "../OVR_CAPI.h" +#include "CAPI_HMDRenderState.h" +#include <time.h> + + + +//------------------------------------------------------------------------------------- +// ***** HSWDISPLAY_LOG +// +// Debug log wrapper. + +#if !defined(HSWDISPLAY_LOG_ENABLED) + #ifdef OVR_BUILD_DEBUG + #define HSWDISPLAY_LOG_ENABLED 1 + #else + #define HSWDISPLAY_LOG_ENABLED 0 + #endif +#endif + +#if HSWDISPLAY_LOG_ENABLED + #define HSWDISPLAY_LOG(...) OVR_DEBUG_LOG(__VA_ARGS__) +#else + #define HSWDISPLAY_LOG(...) +#endif + + +//------------------------------------------------------------------------------------- +// ***** HSWDISPLAY_DISTANCE +// +// Floating point value in the range of ~0.75 to ~3.0 which controls the distance +// (in meters) of the display from the viewer. + +#ifndef HSWDISPLAY_DISTANCE + #define HSWDISPLAY_DISTANCE 1.5f +#endif + + +//------------------------------------------------------------------------------------- +// ***** HSWDISPLAY_SCALE +// +// Floating point value in the range of ~0.1 to ~2.0 which controls the size scale of the +// SDK-rendered HSW display. The value is an arbitrary relative value, though this may +// change in future SDK versions. + +#ifndef HSWDISPLAY_SCALE + #define HSWDISPLAY_SCALE 0.92f +#endif + + + + +//------------------------------------------------------------------------------------- +// ***** Experimental C API functions +// +// These are currently not formally supported and may be promoted to the formal C API +// or may be removed in the future. + +extern "C" +{ + // Normally if an application uses SDK-based distortion rendering + // (ovrHmd_BeginFrame / ovrHmd_EndFrame) then the SDK also takes care of + // drawing the health and safety warning. If an application is using + // SDK-based rendering but wants to draw the warning display itself, + // it call this function with enabled set to false. + OVR_EXPORT void ovrhmd_EnableHSWDisplaySDKRender(ovrHmd hmd, ovrBool enabled); +} + + +namespace OVR { namespace CAPI { + + +//------------------------------------------------------------------------------------- +// ***** CAPI::HSWDisplay +// +// Note: This will be renamed to HSWDisplay in the future. +// +// Implements the logic for the Health and Safety (HAS) warning display. Primarily this +// is two things: providing information about whether the warning needs to be currently +// displayed, and implementing the display itself. +// +// An HSWDisplay is associated 1:1 with an HMD. There can be at most one HSWDisplay +// being displayed on an HMD at a time. If a warning needs to be displayed while an +// existing one is present, it replaces the existing one. +// +// Notes +// Warnings are displayed per HMD (head mounted display). +// The app can have multiple HMDs. +// There can be multiple users of a given HMD over time, with each identified by a different user profile. +// There can be multiple apps using HMDs. +// +// Shows upon first entering a VR application (or VR mode in an application) when in Event Mode (e.g. trade show). +// Shows upon each wearing of the HMD. +// If the user profile is switched while display is active, the display must restart. +// Doesn't show in app when app was started by a launcher app. +// +// First display ever (per profile): 15 seconds until the display can be dismissed. +// Subsequent displays: 6 seconds until the display can be dismissed. Per profile. +// Dismissing occurs via HMD tap, designated keypress, gaze detection on OK button for N seconds, +// and possibly via an input gesture in the future. +// +// If the warning fades out upon completion, the fade out should begin after the full display time has elapsed, +// but it needs to avoid interfering (e.g. obscuring) with the application. This likely means the application +// would need to put in a couple seconds delay to allow the fade to complete. +// Ideally we'd handle the case of a user switching HMDs and not needing to see the warning again. + +class HSWDisplay : public RefCountBase<HSWDisplay> +{ +public: + HSWDisplay(ovrRenderAPIType api, ovrHmd hmd, const HMDRenderState& renderState); + + virtual ~HSWDisplay(); + + // Must be called after construction and before use. + virtual bool Initialize(const ovrRenderAPIConfig*) + { return true; } + + // Must be called before destruction. + virtual void Shutdown() {} + + // Enables or disables the HSW display system. It may be disabled only for development uses. + // It is enabled by default. + void Enable(bool enable); + + // Enables or disables our internal rendering when Render is called. If set to false then the + // application is expected to implement drawing of the display when Displayed is true. + // It is enabled by default. + void EnableRender(bool enable); + + // Triggers a display of the HSW display for the associated HMD. Restarts the display if + // the warning is already being displayed. + void Display(); + + // This function should be called per HMD every frame in order to give this class processing time. + // Writes the new state to newHSWDisplayState if it's non-NULL. + // The graphicsContext argument indicates if the Tick is occurring within a graphics context and + // thus if graphics operations are allowed during the TickState call. + // Returns true if the new state results in a required warning display (ovrHSWDisplayState::Displayed became true). + bool TickState(ovrHSWDisplayState *newHSWDisplayState = NULL, bool graphicsContext = false); + + // Gets the current state of the HSW display. + // Corresponds to ovrhmd_GetHSWDisplayState. + void GetState(ovrHSWDisplayState *hasWarningState) const; + + // Removes the HSW display display if the minimum dismissal time has occurred. + // Returns true if the warning display could be dissmissed or was not displayed at the time of the call. + // Corresponds to ovrhmd_DismissHSWDisplay. + bool Dismiss(); + + // Returns true if the HMD appears to be currently mounted and in a state that a + // warning display would be viewable. + bool IsDisplayViewable() const; + + // Draws the warning to the eye texture(s). This must be done at the end of a + // frame but prior to executing the distortion rendering of the eye textures. + virtual void Render(ovrEyeType, const ovrTexture*); + + // Resets the current profile's HAS settings (e.g. to act as if the user has never seen the HSW display before). + void ResetProfileData(); + + // Returns the ovrRenderAPIType. This is essentially the same as RTTI, as it's indicating what subclass + // is being used for this. + ovrRenderAPIType GetRenderAPIType() const // e.g. ovrRenderAPI_D3D11 + { return RenderAPIType; } + + // Returns the required HSW display text for the current profile's locale. + // Useful for implementing custom warning displays. Returns the required strlen + // of the text, and thus success is indicated by a return value < strCapacity. + // size_t GetText(char *str, size_t strCapacity); + + // Creates and constructs an instance of an HSWDisplay subclass based on the API type. + static HSWDisplay* Factory(ovrRenderAPIType apiType, ovrHmd hmd, const HMDRenderState& renderState); + +private: + OVR_NON_COPYABLE(HSWDisplay) + +protected: + virtual void DisplayInternal() {} + virtual void DismissInternal() {} + virtual void RenderInternal(ovrEyeType, const ovrTexture*) {} + virtual void UnloadGraphics() {} + virtual void LoadGraphics() {} + + // Profile functionality + time_t GetCurrentProfileLastHSWTime() const; + void SetCurrentProfileLastHSWTime(time_t t); + + // Generates an appropriate stereo ortho projection matrix. + static void GetOrthoProjection(const HMDRenderState& RenderState, Matrix4f OrthoProjection[2]); + + // Returns the default HSW display texture data. + static const uint8_t* GetDefaultTexture(size_t& TextureSize); + +protected: + bool Enabled; // If true then the HSW display system is enabled. True by default. + bool Displayed; // If true then the warning is currently visible and the following variables have meaning. Else there is no warning being displayed for this application on the given HMD. + bool SDKRendered; // If true then the display is being rendered by the SDK as opposed to the application. + bool DismissRequested; // If true then the warning has been requested to be hidden. + bool RenderEnabled; // If true then we handle rendering when Render is called. Else we skip it and assume the application is otherwise handling it itself. + bool UnloadGraphicsRequested; // If true then an unload of graphics was requested. This acts as a message from the main thread to the drawing thread so that the unload happens in the expected thread. + double StartTime; // Absolute time when the warning was first displayed. See ovr_GetTimeInSeconds(). + double DismissibleTime; // Absolute time when the warning can be dismissed. + double LastPollTime; // Used to prevent us from polling the required display state every frame but rather more like every 200 milliseconds. + const ovrHmd HMD; // The HMDState this HSWDisplay instance corresponds to. + mutable bool HMDMounted; // True if the HMD was most recently found to be mounted. We need this in order to maintain HMDNewlyMounted. + mutable bool HMDNewlyMounted; // True if HMDMounted has transitioned from false to true. We need this in order to tell if the HMD was recently mounted so we can display the HSW display. + const ovrRenderAPIType RenderAPIType; // e.g. ovrRenderAPI_D3D11 + const HMDRenderState& RenderState; // Information about the rendering setup. + + // Settings cache + mutable String LastProfileName; + mutable int LastHSWTime; + +}; // class HSWDisplay + + + +}} // namespace OVR::CAPI + + +#endif // OVR_CAPI_HSWDisplay_h |