blob: 8d24c2bae1b61838dff75fa54156922a75f718f8 [file] [log] [blame]
/*
* Copyright (C) 2018 Igalia, S.L. All right reserved.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public License
* along with this library; see the file COPYING.LIB. If not, write to
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301, USA.
*
*/
#pragma once
#include "FloatPoint3D.h"
#include "TransformationMatrix.h"
#include "VRPlatformDisplayClient.h"
#include <wtf/WeakPtr.h>
#include <wtf/text/WTFString.h>
namespace WebCore {
typedef unsigned VRDisplayCapabilityFlags;
enum VRDisplayCapabilityFlag {
VRDisplayCapabilityFlagNone = 0,
VRDisplayCapabilityFlagPosition = 1 << 1,
VRDisplayCapabilityFlagOrientation = 1 << 2,
VRDisplayCapabilityFlagExternalDisplay = 1 << 3,
VRDisplayCapabilityFlagPresent = 1 << 4
};
/* The purpose of this class is to encapsulate all the info about the display in a single class/data
* structure. This way we wouldn't have to replicate all the API calls of VRDisplay in
* VRPlatformDisplay. Also the client of this API would only have to issue a single call to get all
* the info from the display. Note that it's fairly unlikely that a VR application would only
* require just a few pieces of information from the device.
*/
class VRPlatformDisplayInfo {
public:
const String displayName() const { return m_displayName; }
void setDisplayName(String&& displayName) { m_displayName = WTFMove(displayName); }
bool isConnected() const { return m_isConnected; }
void setIsConnected(bool isConnected) { m_isConnected = isConnected; }
bool isMounted() const { return m_isMounted; }
void setIsMounted(bool isMounted) { m_isMounted = isMounted; }
const VRDisplayCapabilityFlags& capabilityFlags() const { return m_capabilityFlags; }
void setCapabilityFlags(const VRDisplayCapabilityFlags& flags) { m_capabilityFlags = flags; }
uint32_t displayIdentifier() const { return m_displayIdentifier; }
void setDisplayIdentifier(uint32_t displayIdentifier) { m_displayIdentifier = displayIdentifier; }
enum Eye { EyeLeft = 0, EyeRight, NumEyes };
const FloatPoint3D& eyeTranslation(Eye eye) const { return m_eyeTranslation[eye]; }
void setEyeTranslation(Eye eye, const FloatPoint3D& translation) { m_eyeTranslation[eye] = translation; }
struct FieldOfView {
double upDegrees;
double downDegrees;
double leftDegrees;
double rightDegrees;
};
const FieldOfView& eyeFieldOfView(Eye eye) const { return m_eyeFieldOfView[eye]; }
void setEyeFieldOfView(Eye eye, const FieldOfView& fieldOfView) { m_eyeFieldOfView[eye] = fieldOfView; }
struct RenderSize {
unsigned width;
unsigned height;
};
const RenderSize& renderSize() const { return m_renderSize; }
void setRenderSize(const RenderSize& renderSize) { m_renderSize = renderSize; }
void setPlayAreaBounds(const FloatSize& playAreaBounds) { m_playAreaBounds = playAreaBounds; }
const Optional<FloatSize>& playAreaBounds() const { return m_playAreaBounds; }
void setSittingToStandingTransform(const TransformationMatrix& transform) { m_sittingToStandingTransform = transform; }
const Optional<TransformationMatrix>& sittingToStandingTransform() const { return m_sittingToStandingTransform; }
private:
String m_displayName;
bool m_isConnected;
bool m_isMounted;
VRDisplayCapabilityFlags m_capabilityFlags;
uint32_t m_displayIdentifier;
FloatPoint3D m_eyeTranslation[Eye::NumEyes];
RenderSize m_renderSize;
FieldOfView m_eyeFieldOfView[Eye::NumEyes];
Optional<FloatSize> m_playAreaBounds;
Optional<TransformationMatrix> m_sittingToStandingTransform;
};
struct VRPlatformTrackingInfo {
struct Quaternion {
Quaternion()
: x(0), y(0), z(0), w(1) { }
Quaternion(float x, float y, float z, float w)
: x(x), y(y), z(z), w(w) { }
Quaternion& conjugate()
{
x *= -1;
y *= -1;
z *= -1;
return *this;
}
Quaternion& operator*(float factor)
{
x *= factor;
y *= factor;
z *= factor;
w *= factor;
return *this;
}
float x, y, z, w;
};
struct Float3 {
Float3(float a, float b, float c)
: data { a, b, c } { }
float data[3];
};
void clear()
{
timestamp = 0;
position = WTF::nullopt;
orientation = WTF::nullopt;
angularAcceleration = WTF::nullopt;
angularVelocity = WTF::nullopt;
linearAcceleration = WTF::nullopt;
linearVelocity = WTF::nullopt;
}
Optional<Quaternion> orientation;
Optional<FloatPoint3D> position;
Optional<Float3> angularAcceleration;
Optional<Float3> angularVelocity;
Optional<Float3> linearAcceleration;
Optional<Float3> linearVelocity;
double timestamp { 0 };
};
class VRPlatformDisplay : public CanMakeWeakPtr<VRPlatformDisplay> {
public:
virtual VRPlatformDisplayInfo getDisplayInfo() = 0;
virtual VRPlatformTrackingInfo getTrackingInfo() = 0;
virtual void updateDisplayInfo() = 0;
virtual ~VRPlatformDisplay() = default;
void setClient(VRPlatformDisplayClient*);
enum class Event {
Connected,
Disconnected,
Mounted,
Unmounted,
};
void notifyVRPlatformDisplayEvent(Event);
private:
VRPlatformDisplayClient* m_client { nullptr };
};
}; // namespace WebCore