diff options
Diffstat (limited to 'gfx/vr/gfxVR.cpp')
-rw-r--r-- | gfx/vr/gfxVR.cpp | 127 |
1 files changed, 127 insertions, 0 deletions
diff --git a/gfx/vr/gfxVR.cpp b/gfx/vr/gfxVR.cpp new file mode 100644 index 000000000..c0babb4f8 --- /dev/null +++ b/gfx/vr/gfxVR.cpp @@ -0,0 +1,127 @@ +/* -*- Mode: C++; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 2 -*- + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#include <math.h> + +#include "gfxVR.h" +#ifdef MOZ_GAMEPAD +#include "mozilla/dom/GamepadEventTypes.h" +#include "mozilla/dom/GamepadBinding.h" +#endif + +#ifndef M_PI +# define M_PI 3.14159265358979323846 +#endif + +using namespace mozilla; +using namespace mozilla::gfx; + +Atomic<uint32_t> VRDisplayManager::sDisplayBase(0); +Atomic<uint32_t> VRControllerManager::sControllerBase(0); + +/* static */ uint32_t +VRDisplayManager::AllocateDisplayID() +{ + return ++sDisplayBase; +} + +Matrix4x4 +VRFieldOfView::ConstructProjectionMatrix(float zNear, float zFar, + bool rightHanded) const +{ + float upTan = tan(upDegrees * M_PI / 180.0); + float downTan = tan(downDegrees * M_PI / 180.0); + float leftTan = tan(leftDegrees * M_PI / 180.0); + float rightTan = tan(rightDegrees * M_PI / 180.0); + + float handednessScale = rightHanded ? -1.0 : 1.0; + + float pxscale = 2.0f / (leftTan + rightTan); + float pxoffset = (leftTan - rightTan) * pxscale * 0.5; + float pyscale = 2.0f / (upTan + downTan); + float pyoffset = (upTan - downTan) * pyscale * 0.5; + + Matrix4x4 mobj; + float *m = &mobj._11; + + m[0*4+0] = pxscale; + m[2*4+0] = pxoffset * handednessScale; + + m[1*4+1] = pyscale; + m[2*4+1] = -pyoffset * handednessScale; + + m[2*4+2] = zFar / (zNear - zFar) * -handednessScale; + m[3*4+2] = (zFar * zNear) / (zNear - zFar); + + m[2*4+3] = handednessScale; + m[3*4+3] = 0.0f; + + return mobj; +} + +/* static */ uint32_t +VRControllerManager::AllocateControllerID() +{ + return ++sControllerBase; +} + +void +VRControllerManager::AddGamepad(const char* aID, uint32_t aMapping, + uint32_t aNumButtons, uint32_t aNumAxes) +{ + dom::GamepadAdded a(NS_ConvertUTF8toUTF16(nsDependentCString(aID)), mControllerCount, + aMapping, dom::GamepadServiceType::VR, aNumButtons, + aNumAxes); + + VRManager* vm = VRManager::Get(); + MOZ_ASSERT(vm); + vm->NotifyGamepadChange<dom::GamepadAdded>(a); +} + +void +VRControllerManager::RemoveGamepad(uint32_t aIndex) +{ + dom::GamepadRemoved a(aIndex, dom::GamepadServiceType::VR); + + VRManager* vm = VRManager::Get(); + MOZ_ASSERT(vm); + vm->NotifyGamepadChange<dom::GamepadRemoved>(a); +} + +void +VRControllerManager::NewButtonEvent(uint32_t aIndex, uint32_t aButton, + bool aPressed) +{ + dom::GamepadButtonInformation a(aIndex, dom::GamepadServiceType::VR, + aButton, aPressed, aPressed ? 1.0L : 0.0L); + + VRManager* vm = VRManager::Get(); + MOZ_ASSERT(vm); + vm->NotifyGamepadChange<dom::GamepadButtonInformation>(a); +} + +void +VRControllerManager::NewAxisMove(uint32_t aIndex, uint32_t aAxis, + double aValue) +{ + dom::GamepadAxisInformation a(aIndex, dom::GamepadServiceType::VR, + aAxis, aValue); + + VRManager* vm = VRManager::Get(); + MOZ_ASSERT(vm); + vm->NotifyGamepadChange<dom::GamepadAxisInformation>(a); +} + +void +VRControllerManager::NewPoseState(uint32_t aIndex, + const dom::GamepadPoseState& aPose) +{ + dom::GamepadPoseInformation a(aIndex, dom::GamepadServiceType::VR, + aPose); + + VRManager* vm = VRManager::Get(); + MOZ_ASSERT(vm); + vm->NotifyGamepadChange<dom::GamepadPoseInformation>(a); +} |