mirror of
https://github.com/overte-org/overte.git
synced 2025-08-13 21:59:40 +02:00
105 lines
3.4 KiB
C++
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
|