VRPlatformDisplay.h [plain text]
#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
};
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 };
};
};