|
@@ -1,5 +1,18 @@
|
|
|
|
+#include "platform/input/openVR/openVRProvider.h"
|
|
#include "platform/input/openVR/openVROverlay.h"
|
|
#include "platform/input/openVR/openVROverlay.h"
|
|
|
|
|
|
|
|
+#include "gfx/D3D11/gfxD3D11Device.h"
|
|
|
|
+#include "gfx/D3D11/gfxD3D11TextureObject.h"
|
|
|
|
+#include "gfx/D3D11/gfxD3D11EnumTranslate.h"
|
|
|
|
+
|
|
|
|
+#ifdef TORQUE_OPENGL
|
|
|
|
+#include "gfx/gl/gfxGLDevice.h"
|
|
|
|
+#include "gfx/gl/gfxGLTextureObject.h"
|
|
|
|
+#include "gfx/gl/gfxGLEnumTranslate.h"
|
|
|
|
+#endif
|
|
|
|
+
|
|
|
|
+#include "postFx/postEffectCommon.h"
|
|
|
|
+
|
|
ImplementEnumType(OpenVROverlayType,
|
|
ImplementEnumType(OpenVROverlayType,
|
|
"Desired overlay type for OpenVROverlay. .\n\n"
|
|
"Desired overlay type for OpenVROverlay. .\n\n"
|
|
"@ingroup OpenVR")
|
|
"@ingroup OpenVR")
|
|
@@ -7,9 +20,18 @@ ImplementEnumType(OpenVROverlayType,
|
|
{ OpenVROverlay::OVERLAYTYPE_DASHBOARD, "Dashboard" },
|
|
{ OpenVROverlay::OVERLAYTYPE_DASHBOARD, "Dashboard" },
|
|
EndImplementEnumType;
|
|
EndImplementEnumType;
|
|
|
|
|
|
|
|
+IMPLEMENT_CONOBJECT(OpenVROverlay);
|
|
|
|
+
|
|
OpenVROverlay::OpenVROverlay()
|
|
OpenVROverlay::OpenVROverlay()
|
|
{
|
|
{
|
|
|
|
+ mTransform = MatrixF(1);
|
|
|
|
+ mOverlayWidth = 1.5f;
|
|
|
|
+ mOverlayFlags = 0;
|
|
|
|
+
|
|
|
|
+ mOverlayColor = ColorF(1, 1, 1, 1);
|
|
|
|
+ mTrackingOrigin = vr::TrackingUniverseSeated;
|
|
|
|
|
|
|
|
+ mTargetFormat = GFXFormatR8G8B8A8_LINEAR_FORCE; // needed for openvr!
|
|
}
|
|
}
|
|
|
|
|
|
OpenVROverlay::~OpenVROverlay()
|
|
OpenVROverlay::~OpenVROverlay()
|
|
@@ -17,8 +39,53 @@ OpenVROverlay::~OpenVROverlay()
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+static bool setProtectedOverlayTypeDirty(void *obj, const char *array, const char *data)
|
|
|
|
+{
|
|
|
|
+ OpenVROverlay *object = static_cast<OpenVROverlay*>(obj);
|
|
|
|
+ object->mOverlayTypeDirty = true;
|
|
|
|
+ return true;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static bool setProtectedOverlayDirty(void *obj, const char *array, const char *data)
|
|
|
|
+{
|
|
|
|
+ OpenVROverlay *object = static_cast<OpenVROverlay*>(obj);
|
|
|
|
+ object->mOverlayDirty = true;
|
|
|
|
+ return true;
|
|
|
|
+}
|
|
|
|
+
|
|
void OpenVROverlay::initPersistFields()
|
|
void OpenVROverlay::initPersistFields()
|
|
{
|
|
{
|
|
|
|
+ addProtectedField("overlayType", TypeOpenVROverlayType, Offset(mOverlayType, OpenVROverlay), &setProtectedOverlayTypeDirty, &defaultProtectedGetFn,
|
|
|
|
+ "Type of overlay.");
|
|
|
|
+ addProtectedField("overlayFlags", TypeS32, Offset(mOverlayFlags, OpenVROverlay), &setProtectedOverlayDirty, &defaultProtectedGetFn,
|
|
|
|
+ "Flags for overlay.");
|
|
|
|
+ addProtectedField("overlayWidth", TypeS32, Offset(mOverlayWidth, OpenVROverlay), &setProtectedOverlayDirty, &defaultProtectedGetFn,
|
|
|
|
+ "Width of overlay.");
|
|
|
|
+ addProtectedField("overlayColor", TypeColorF, Offset(mOverlayColor, OpenVROverlay), &setProtectedOverlayDirty, &defaultProtectedGetFn,
|
|
|
|
+ "Backing color of overlay.");
|
|
|
|
+
|
|
|
|
+ addProtectedField("transformType", TypeOpenVROverlayTransformType, Offset(mOverlayTransformType, OpenVROverlay), &setProtectedOverlayDirty, &defaultProtectedGetFn,
|
|
|
|
+ "Transform type of overlay.");
|
|
|
|
+ addProtectedField("transformPosition", TypeMatrixPosition, Offset(mTransform, OpenVROverlay), &setProtectedOverlayDirty, &defaultProtectedGetFn,
|
|
|
|
+ "Position of overlay.");
|
|
|
|
+ addProtectedField("transformRotation", TypeMatrixRotation, Offset(mTransform, OpenVROverlay), &setProtectedOverlayDirty, &defaultProtectedGetFn,
|
|
|
|
+ "Rotation of overlay.");
|
|
|
|
+ addProtectedField("transformDeviceIndex", TypeS32, Offset(mTransformDeviceIndex, OpenVROverlay), &setProtectedOverlayDirty, &defaultProtectedGetFn,
|
|
|
|
+ "Rotation of overlay.");
|
|
|
|
+ addProtectedField("transformDeviceComponent", TypeString, Offset(mTransformDeviceComponent, OpenVROverlay), &setProtectedOverlayDirty, &defaultProtectedGetFn,
|
|
|
|
+ "Rotation of overlay.");
|
|
|
|
+
|
|
|
|
+ addProtectedField("inputMethod", TypeOpenVROverlayInputMethod, Offset(mTransformDeviceComponent, OpenVROverlay), &setProtectedOverlayDirty, &defaultProtectedGetFn,
|
|
|
|
+ "Type of input method.");
|
|
|
|
+ addProtectedField("mouseScale", TypePoint2F, Offset(mMouseScale, OpenVROverlay), &setProtectedOverlayDirty, &defaultProtectedGetFn,
|
|
|
|
+ "Scale of mouse input.");
|
|
|
|
+
|
|
|
|
+ addProtectedField("trackingOrigin", TypeOpenVRTrackingUniverseOrigin, Offset(mTrackingOrigin, OpenVROverlay), &setProtectedOverlayDirty, &defaultProtectedGetFn,
|
|
|
|
+ "Tracking origin.");
|
|
|
|
+
|
|
|
|
+ addProtectedField("controllerDevice", TypeS32, Offset(mControllerDeviceIndex, OpenVROverlay), &setProtectedOverlayDirty, &defaultProtectedGetFn,
|
|
|
|
+ "Index of controller to attach overlay to.");
|
|
|
|
+
|
|
Parent::initPersistFields();
|
|
Parent::initPersistFields();
|
|
}
|
|
}
|
|
|
|
|
|
@@ -41,11 +108,49 @@ void OpenVROverlay::onRemove()
|
|
vr::VROverlay()->DestroyOverlay(mOverlayHandle);
|
|
vr::VROverlay()->DestroyOverlay(mOverlayHandle);
|
|
mOverlayHandle = NULL;
|
|
mOverlayHandle = NULL;
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ if (mThumbOverlayHandle)
|
|
|
|
+ {
|
|
|
|
+ vr::VROverlay()->DestroyOverlay(mThumbOverlayHandle);
|
|
|
|
+ mThumbOverlayHandle = NULL;
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
void OpenVROverlay::resetOverlay()
|
|
void OpenVROverlay::resetOverlay()
|
|
{
|
|
{
|
|
|
|
+ vr::IVROverlay *overlay = vr::VROverlay();
|
|
|
|
+ if (!overlay)
|
|
|
|
+ return;
|
|
|
|
+
|
|
|
|
+ if (mOverlayHandle)
|
|
|
|
+ {
|
|
|
|
+ overlay->DestroyOverlay(mOverlayHandle);
|
|
|
|
+ mOverlayHandle = NULL;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (mThumbOverlayHandle)
|
|
|
|
+ {
|
|
|
|
+ overlay->DestroyOverlay(mThumbOverlayHandle);
|
|
|
|
+ mThumbOverlayHandle = NULL;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (mOverlayType == OpenVROverlay::OVERLAYTYPE_DASHBOARD)
|
|
|
|
+ {
|
|
|
|
+ overlay->CreateDashboardOverlay(mInternalName, mInternalName, &mOverlayHandle, &mThumbOverlayHandle);
|
|
|
|
+ }
|
|
|
|
+ else
|
|
|
|
+ {
|
|
|
|
+ overlay->CreateOverlay(mInternalName, mInternalName, &mOverlayHandle);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ mOverlayDirty = true;
|
|
mOverlayTypeDirty = false;
|
|
mOverlayTypeDirty = false;
|
|
|
|
+
|
|
|
|
+ // Pre-render start frame so we have a texture available
|
|
|
|
+ if (!mTarget)
|
|
|
|
+ {
|
|
|
|
+ renderFrame(false, false);
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
void OpenVROverlay::updateOverlay()
|
|
void OpenVROverlay::updateOverlay()
|
|
@@ -53,16 +158,74 @@ void OpenVROverlay::updateOverlay()
|
|
if (mOverlayTypeDirty)
|
|
if (mOverlayTypeDirty)
|
|
resetOverlay();
|
|
resetOverlay();
|
|
|
|
|
|
- // Update params TODO
|
|
|
|
|
|
+ // Update params
|
|
|
|
+ vr::IVROverlay *overlay = vr::VROverlay();
|
|
|
|
+ if (!overlay || !mOverlayHandle)
|
|
|
|
+ return;
|
|
|
|
+
|
|
|
|
+ if (!mOverlayDirty)
|
|
|
|
+ return;
|
|
|
|
+
|
|
|
|
+ MatrixF vrMat(1);
|
|
|
|
+ vr::HmdMatrix34_t ovrMat;
|
|
|
|
+ vr::HmdVector2_t ovrMouseScale;
|
|
|
|
+ ovrMouseScale.v[0] = mMouseScale.x;
|
|
|
|
+ ovrMouseScale.v[1] = mMouseScale.y;
|
|
|
|
+
|
|
|
|
+ OpenVRUtil::convertTransformToOVR(mTransform, vrMat);
|
|
|
|
+ OpenVRUtil::convertMatrixFPlainToSteamVRAffineMatrix(vrMat, ovrMat);
|
|
|
|
+
|
|
|
|
+ MatrixF reverseMat = OpenVRUtil::convertSteamVRAffineMatrixToMatrixFPlain(ovrMat);
|
|
|
|
+ MatrixF finalReverseMat(1);
|
|
|
|
+ OpenVRUtil::convertTransformFromOVR(reverseMat, finalReverseMat);
|
|
|
|
+
|
|
|
|
+ switch (mOverlayTransformType)
|
|
|
|
+ {
|
|
|
|
+ case vr::VROverlayTransform_Absolute:
|
|
|
|
+ overlay->SetOverlayTransformAbsolute(mOverlayHandle, mTrackingOrigin, &ovrMat);
|
|
|
|
+ break;
|
|
|
|
+ case vr::VROverlayTransform_TrackedDeviceRelative:
|
|
|
|
+ overlay->SetOverlayTransformTrackedDeviceRelative(mOverlayHandle, mTransformDeviceIndex, &ovrMat);
|
|
|
|
+ break;
|
|
|
|
+ case vr::VROverlayTransform_TrackedComponent:
|
|
|
|
+ overlay->SetOverlayTransformTrackedDeviceComponent(mOverlayHandle, mTransformDeviceIndex, mTransformDeviceComponent.c_str());
|
|
|
|
+ break;
|
|
|
|
+ // NOTE: system not handled here - doesn't seem possible to create these
|
|
|
|
+ default:
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // overlay->SetOverlayColor(mOverlayHandle, mOverlayColor.red, mOverlayColor.green, mOverlayColor.blue);
|
|
|
|
+ overlay->SetOverlayAlpha(mOverlayHandle, mOverlayColor.alpha);
|
|
|
|
+ overlay->SetOverlayMouseScale(mOverlayHandle, &ovrMouseScale);
|
|
|
|
+ overlay->SetOverlayInputMethod(mOverlayHandle, mInputMethod);
|
|
|
|
+ overlay->SetOverlayWidthInMeters(mOverlayHandle, mOverlayWidth);
|
|
|
|
+
|
|
|
|
+ // NOTE: if flags in openvr change, double check this
|
|
|
|
+ /*for (U32 i = vr::VROverlayFlags_None; i <= vr::VROverlayFlags_ShowTouchPadScrollWheel; i++)
|
|
|
|
+ {
|
|
|
|
+ overlay->SetOverlayFlag(mOverlayHandle, (vr::VROverlayFlags)i, mOverlayFlags & (1 << i));
|
|
|
|
+ }*/
|
|
|
|
+
|
|
mOverlayDirty = false;
|
|
mOverlayDirty = false;
|
|
}
|
|
}
|
|
|
|
|
|
void OpenVROverlay::showOverlay()
|
|
void OpenVROverlay::showOverlay()
|
|
{
|
|
{
|
|
|
|
+ updateOverlay();
|
|
if (mOverlayHandle == NULL)
|
|
if (mOverlayHandle == NULL)
|
|
return;
|
|
return;
|
|
|
|
|
|
- vr::VROverlay()->ShowOverlay(mOverlayHandle);
|
|
|
|
|
|
+ vr::EVROverlayError err = vr::VROverlay()->ShowOverlay(mOverlayHandle);
|
|
|
|
+ if (err != vr::VROverlayError_None)
|
|
|
|
+ {
|
|
|
|
+ Con::errorf("VR Overlay error!");
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (!mStagingTexture)
|
|
|
|
+ {
|
|
|
|
+ renderFrame(false, false);
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
void OpenVROverlay::hideOverlay()
|
|
void OpenVROverlay::hideOverlay()
|
|
@@ -104,7 +267,7 @@ bool OpenVROverlay::isActiveDashboardOverlay()
|
|
return false; // TODO WHERE DID I GET THIS FROM
|
|
return false; // TODO WHERE DID I GET THIS FROM
|
|
}
|
|
}
|
|
|
|
|
|
-MatrixF OpenVROverlay::getTransformForOverlayCoordinates(const vr::ETrackingUniverseOrigin trackingOrigin, const Point2F &pos)
|
|
|
|
|
|
+MatrixF OpenVROverlay::getTransformForOverlayCoordinates(const Point2F &pos)
|
|
{
|
|
{
|
|
if (mOverlayHandle == NULL)
|
|
if (mOverlayHandle == NULL)
|
|
return MatrixF::Identity;
|
|
return MatrixF::Identity;
|
|
@@ -114,7 +277,7 @@ MatrixF OpenVROverlay::getTransformForOverlayCoordinates(const vr::ETrackingUniv
|
|
vec.v[1] = pos.y;
|
|
vec.v[1] = pos.y;
|
|
vr::HmdMatrix34_t outMat;
|
|
vr::HmdMatrix34_t outMat;
|
|
MatrixF outTorqueMat;
|
|
MatrixF outTorqueMat;
|
|
- if (vr::VROverlay()->GetTransformForOverlayCoordinates(mOverlayHandle, trackingOrigin, vec, &outMat) != vr::VROverlayError_None)
|
|
|
|
|
|
+ if (vr::VROverlay()->GetTransformForOverlayCoordinates(mOverlayHandle, mTrackingOrigin, vec, &outMat) != vr::VROverlayError_None)
|
|
return MatrixF::Identity;
|
|
return MatrixF::Identity;
|
|
|
|
|
|
MatrixF vrMat(1);
|
|
MatrixF vrMat(1);
|
|
@@ -123,7 +286,7 @@ MatrixF OpenVROverlay::getTransformForOverlayCoordinates(const vr::ETrackingUniv
|
|
return outTorqueMat;
|
|
return outTorqueMat;
|
|
}
|
|
}
|
|
|
|
|
|
-bool OpenVROverlay::castRay(const vr::ETrackingUniverseOrigin trackingOrigin, const Point3F &origin, const Point3F &direction, RayInfo *info)
|
|
|
|
|
|
+bool OpenVROverlay::castRay(const Point3F &origin, const Point3F &direction, RayInfo *info)
|
|
{
|
|
{
|
|
if (mOverlayHandle == NULL)
|
|
if (mOverlayHandle == NULL)
|
|
return false;
|
|
return false;
|
|
@@ -131,7 +294,7 @@ bool OpenVROverlay::castRay(const vr::ETrackingUniverseOrigin trackingOrigin, c
|
|
vr::VROverlayIntersectionParams_t params;
|
|
vr::VROverlayIntersectionParams_t params;
|
|
vr::VROverlayIntersectionResults_t result;
|
|
vr::VROverlayIntersectionResults_t result;
|
|
|
|
|
|
- params.eOrigin = trackingOrigin;
|
|
|
|
|
|
+ params.eOrigin = mTrackingOrigin;
|
|
params.vSource.v[0] = origin.x;
|
|
params.vSource.v[0] = origin.x;
|
|
params.vSource.v[1] = origin.y;
|
|
params.vSource.v[1] = origin.y;
|
|
params.vSource.v[2] = origin.z;
|
|
params.vSource.v[2] = origin.z;
|
|
@@ -159,3 +322,135 @@ void OpenVROverlay::moveGamepadFocusToNeighbour()
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+void OpenVROverlay::handleOpenVREvents()
|
|
|
|
+{
|
|
|
|
+ vr::VREvent_t vrEvent;
|
|
|
|
+ while (vr::VROverlay()->PollNextOverlayEvent(mOverlayHandle, &vrEvent, sizeof(vrEvent)))
|
|
|
|
+ {
|
|
|
|
+ InputEventInfo eventInfo;
|
|
|
|
+ eventInfo.deviceType = MouseDeviceType;
|
|
|
|
+ eventInfo.deviceInst = 0;
|
|
|
|
+ eventInfo.objType = SI_AXIS;
|
|
|
|
+ eventInfo.modifier = (InputModifiers)0;
|
|
|
|
+ eventInfo.ascii = 0;
|
|
|
|
+
|
|
|
|
+ switch (vrEvent.eventType)
|
|
|
|
+ {
|
|
|
|
+ case vr::VREvent_MouseMove:
|
|
|
|
+ {
|
|
|
|
+ eventInfo.objType = SI_AXIS;
|
|
|
|
+ eventInfo.objInst = SI_XAXIS;
|
|
|
|
+ eventInfo.action = SI_MAKE;
|
|
|
|
+ eventInfo.fValue = vrEvent.data.mouse.x;
|
|
|
|
+ processMouseEvent(eventInfo);
|
|
|
|
+
|
|
|
|
+ eventInfo.objType = SI_AXIS;
|
|
|
|
+ eventInfo.objInst = SI_YAXIS;
|
|
|
|
+ eventInfo.action = SI_MAKE;
|
|
|
|
+ eventInfo.fValue = vrEvent.data.mouse.y;
|
|
|
|
+ processMouseEvent(eventInfo);
|
|
|
|
+ }
|
|
|
|
+ break;
|
|
|
|
+
|
|
|
|
+ case vr::VREvent_MouseButtonDown:
|
|
|
|
+ {
|
|
|
|
+ eventInfo.objType = SI_BUTTON;
|
|
|
|
+ eventInfo.objInst = (InputObjectInstances)OpenVRUtil::convertOpenVRButtonToTorqueButton(vrEvent.data.mouse.button);
|
|
|
|
+ eventInfo.action = SI_MAKE;
|
|
|
|
+ eventInfo.fValue = 1.0f;
|
|
|
|
+ processMouseEvent(eventInfo);
|
|
|
|
+ }
|
|
|
|
+ break;
|
|
|
|
+
|
|
|
|
+ case vr::VREvent_MouseButtonUp:
|
|
|
|
+ {
|
|
|
|
+ eventInfo.objType = SI_BUTTON;
|
|
|
|
+ eventInfo.objInst = (InputObjectInstances)OpenVRUtil::convertOpenVRButtonToTorqueButton(vrEvent.data.mouse.button);
|
|
|
|
+ eventInfo.action = SI_BREAK;
|
|
|
|
+ eventInfo.fValue = 0.0f;
|
|
|
|
+ processMouseEvent(eventInfo);
|
|
|
|
+ }
|
|
|
|
+ break;
|
|
|
|
+
|
|
|
|
+ case vr::VREvent_OverlayShown:
|
|
|
|
+ {
|
|
|
|
+ markDirty();
|
|
|
|
+ }
|
|
|
|
+ break;
|
|
|
|
+
|
|
|
|
+ case vr::VREvent_Quit:
|
|
|
|
+ AssertFatal(false, "WTF is going on here");
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (mThumbOverlayHandle != vr::k_ulOverlayHandleInvalid)
|
|
|
|
+ {
|
|
|
|
+ while (vr::VROverlay()->PollNextOverlayEvent(mThumbOverlayHandle, &vrEvent, sizeof(vrEvent)))
|
|
|
|
+ {
|
|
|
|
+ switch (vrEvent.eventType)
|
|
|
|
+ {
|
|
|
|
+ case vr::VREvent_OverlayShown:
|
|
|
|
+ {
|
|
|
|
+ markDirty();
|
|
|
|
+ }
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+void OpenVROverlay::onFrameRendered()
|
|
|
|
+{
|
|
|
|
+ vr::IVROverlay *overlay = vr::VROverlay();
|
|
|
|
+ if (!overlay || !mOverlayHandle)
|
|
|
|
+ return;
|
|
|
|
+
|
|
|
|
+ updateOverlay();
|
|
|
|
+
|
|
|
|
+ Point2I desiredSize = mTarget->getSize();
|
|
|
|
+ if (mStagingTexture.isNull() || mStagingTexture.getWidthHeight() != desiredSize)
|
|
|
|
+ {
|
|
|
|
+ Point2I sz = mStagingTexture.getWidthHeight();
|
|
|
|
+ mStagingTexture.set(desiredSize.x, desiredSize.y, mTargetFormat, &VRTextureProfile, "OpenVROverlay staging texture");
|
|
|
|
+ }
|
|
|
|
+ mTarget->resolveTo(mStagingTexture);
|
|
|
|
+
|
|
|
|
+ vr::Texture_t tex;
|
|
|
|
+ if (GFX->getAdapterType() == Direct3D11)
|
|
|
|
+ {
|
|
|
|
+ tex = { (void*)static_cast<GFXD3D11TextureObject*>(mStagingTexture.getPointer())->getResource(), vr::API_DirectX, vr::ColorSpace_Auto };
|
|
|
|
+ }
|
|
|
|
+#ifdef TORQUE_OPENGL
|
|
|
|
+ else if (GFX->getAdapterType() == OpenGL)
|
|
|
|
+ {
|
|
|
|
+ tex = { (void*)static_cast<GFXGLTextureObject*>(mStagingTexture.getPointer())->getHandle(), vr::API_OpenGL, vr::ColorSpace_Auto };
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+#endif
|
|
|
|
+ else
|
|
|
|
+ {
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ //mStagingTexture->dumpToDisk("PNG", "D:\\test.png");
|
|
|
|
+
|
|
|
|
+ vr::EVROverlayError err = overlay->SetOverlayTexture(mOverlayHandle, &tex);
|
|
|
|
+ if (err != vr::VROverlayError_None)
|
|
|
|
+ {
|
|
|
|
+ Con::errorf("VR: Error setting overlay texture.");
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ //Con::printf("Overlay visible ? %s", vr::VROverlay()->IsOverlayVisible(mOverlayHandle) ? "YES" : "NO");
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+DefineEngineMethod(OpenVROverlay, showOverlay, void, (), , "")
|
|
|
|
+{
|
|
|
|
+ object->showOverlay();
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+DefineEngineMethod(OpenVROverlay, hideOverlay, void, (), , "")
|
|
|
|
+{
|
|
|
|
+ object->hideOverlay();
|
|
|
|
+}
|