blob: 63336e2b569fc86971afa6784575fc04472ca0f9 [file] [log] [blame]
// Copyright 2018 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef SRC_UI_LIB_ESCHER_HMD_POSE_BUFFER_H_
#define SRC_UI_LIB_ESCHER_HMD_POSE_BUFFER_H_
#include "src/ui/lib/escher/vk/buffer.h"
// clang-format off
#include "src/ui/lib/glm_workaround/glm_workaround.h"
// clang-format on
#include <glm/gtc/quaternion.hpp>
#include <glm/gtx/quaternion.hpp>
namespace escher {
namespace hmd {
// A packed combination of a quaternion and a 3D position intended to be packed
// into a PoseBuffer for late latched head tracking applications. See
// commands.fidl for details on PoseBuffer
struct Pose {
Pose(glm::quat quaternion, glm::vec3 position) {
a = quaternion.x;
b = quaternion.y;
c = quaternion.z;
d = quaternion.w;
x = position.x;
y = position.y;
z = position.z;
for (size_t i = 0; i < kReservedBytes; i++)
reserved[i] = 0;
}
// Quaternion
float a;
float b;
float c;
float d;
// Position
float x;
float y;
float z;
// Reserved/Padding
static constexpr size_t kReservedBytes = 4;
uint8_t reserved[kReservedBytes];
};
static_assert(sizeof(Pose) == 32, "Pose structure is not 32 bytes");
struct PoseBuffer {
PoseBuffer() {}
PoseBuffer(BufferPtr buffer, uint32_t num_entries, int64_t base_time, int64_t time_interval)
: buffer(buffer),
num_entries(num_entries),
base_time(base_time),
time_interval(time_interval) {}
BufferPtr buffer;
uint32_t num_entries = 0;
int64_t base_time = 0;
int64_t time_interval = 0;
operator bool() const { return !!buffer; }
};
} // namespace hmd
} // namespace escher
#endif // SRC_UI_LIB_ESCHER_HMD_POSE_BUFFER_H_