overte/libraries/shared/src/Grab.h
2019-01-30 14:43:11 -08:00

105 lines
3.4 KiB
C++

//
// Grab.h
// libraries/avatars/src
//
// Created by Seth Alves on 2018-9-1.
// Copyright 2018 High Fidelity, Inc.
//
// Distributed under the Apache License, Version 2.0.
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
//
#ifndef hifi_Grab_h
#define hifi_Grab_h
#include <QUuid>
#include <QByteArray>
#include "GLMHelpers.h"
#include "StreamUtils.h"
class Grab;
using GrabPointer = std::shared_ptr<Grab>;
using GrabWeakPointer = std::weak_ptr<Grab>;
class GrabLocationAccumulator {
public:
void accumulate(glm::vec3 position, glm::quat orientation) {
_position += position;
_orientation = orientation; // XXX
_count++;
}
glm::vec3 finalizePosition() { return _count > 0 ? _position * (1.0f / _count) : glm::vec3(0.0f); }
glm::quat finalizeOrientation() { return _orientation; } // XXX
protected:
glm::vec3 _position;
glm::quat _orientation;
int _count { 0 };
};
class Grab {
public:
Grab() {};
Grab(const QUuid& newOwnerID, const QUuid& newTargetID, int newParentJointIndex, const QString& newHand,
glm::vec3 newPositionalOffset, glm::quat newRotationalOffset) :
_ownerID(newOwnerID),
_targetID(newTargetID),
_parentJointIndex(newParentJointIndex),
_hand(newHand),
_positionalOffset(newPositionalOffset),
_rotationalOffset(newRotationalOffset),
_released(false) {}
QByteArray toByteArray();
bool fromByteArray(const QByteArray& grabData);
Grab& operator=(const GrabPointer& other) {
_ownerID = other->_ownerID;
_targetID = other->_targetID;
_parentJointIndex = other->_parentJointIndex;
_hand = other->_hand;
_positionalOffset = other->_positionalOffset;
_rotationalOffset = other->_rotationalOffset;
_actionID = other->_actionID;
_released = other->_released;
return *this;
}
QUuid getActionID() const { return _actionID; }
void setActionID(const QUuid& actionID) { _actionID = actionID; }
QUuid getOwnerID() const { return _ownerID; }
void setOwnerID(QUuid ownerID) { _ownerID = ownerID; }
QUuid getTargetID() const { return _targetID; }
void setTargetID(QUuid targetID) { _targetID = targetID; }
int getParentJointIndex() const { return _parentJointIndex; }
void setParentJointIndex(int parentJointIndex) { _parentJointIndex = parentJointIndex; }
QString getHand() const { return _hand; }
void setHand(QString hand) { _hand = hand; }
glm::vec3 getPositionalOffset() const { return _positionalOffset; }
void setPositionalOffset(glm::vec3 positionalOffset) { _positionalOffset = positionalOffset; }
glm::quat getRotationalOffset() const { return _rotationalOffset; }
void setRotationalOffset(glm::quat rotationalOffset) { _rotationalOffset = rotationalOffset; }
bool getReleased() const { return _released; }
void setReleased(bool value) { _released = value; }
protected:
QUuid _actionID; // if an action is created in bullet for this grab, this is the ID
QUuid _ownerID; // avatar ID of grabber
QUuid _targetID; // SpatiallyNestable ID of grabbed
int _parentJointIndex { -1 }; // which avatar joint is being used to grab
QString _hand; // "left" or "right"
glm::vec3 _positionalOffset; // relative to joint
glm::quat _rotationalOffset; // relative to joint
bool _released { false }; // released and scheduled for deletion
};
#endif // hifi_Grab_h