mirror of
https://github.com/overte-org/overte.git
synced 2025-08-06 16:36:54 +02:00
Merge branch 'master' of https://github.com/highfidelity/hifi
This commit is contained in:
commit
222655d948
13 changed files with 171 additions and 184 deletions
|
@ -69,3 +69,12 @@ void FaceModel::maybeUpdateEyeRotation(const JointState& parentState, const FBXJ
|
||||||
state.rotation = glm::angleAxis(glm::clamp(glm::angle(between), -MAX_ANGLE, MAX_ANGLE), glm::axis(between)) *
|
state.rotation = glm::angleAxis(glm::clamp(glm::angle(between), -MAX_ANGLE, MAX_ANGLE), glm::axis(between)) *
|
||||||
joint.rotation;
|
joint.rotation;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool FaceModel::getEyePositions(glm::vec3& firstEyePosition, glm::vec3& secondEyePosition) const {
|
||||||
|
if (!isActive()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
const FBXGeometry& geometry = _geometry->getFBXGeometry();
|
||||||
|
return getJointPosition(geometry.leftEyeJointIndex, firstEyePosition) &&
|
||||||
|
getJointPosition(geometry.rightEyeJointIndex, secondEyePosition);
|
||||||
|
}
|
||||||
|
|
|
@ -29,6 +29,10 @@ public:
|
||||||
virtual void maybeUpdateNeckRotation(const JointState& parentState, const FBXJoint& joint, JointState& state);
|
virtual void maybeUpdateNeckRotation(const JointState& parentState, const FBXJoint& joint, JointState& state);
|
||||||
virtual void maybeUpdateEyeRotation(const JointState& parentState, const FBXJoint& joint, JointState& state);
|
virtual void maybeUpdateEyeRotation(const JointState& parentState, const FBXJoint& joint, JointState& state);
|
||||||
|
|
||||||
|
/// Retrieve the positions of up to two eye meshes.
|
||||||
|
/// \return whether or not both eye meshes were found
|
||||||
|
bool getEyePositions(glm::vec3& firstEyePosition, glm::vec3& secondEyePosition) const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
Head* _owningHead;
|
Head* _owningHead;
|
||||||
|
|
|
@ -103,7 +103,7 @@ void Hand::collideAgainstOurself() {
|
||||||
getLeftRightPalmIndices(leftPalmIndex, rightPalmIndex);
|
getLeftRightPalmIndices(leftPalmIndex, rightPalmIndex);
|
||||||
float scaledPalmRadius = PALM_COLLISION_RADIUS * _owningAvatar->getScale();
|
float scaledPalmRadius = PALM_COLLISION_RADIUS * _owningAvatar->getScale();
|
||||||
|
|
||||||
const Model& skeletonModel = _owningAvatar->getSkeletonModel();
|
const SkeletonModel& skeletonModel = _owningAvatar->getSkeletonModel();
|
||||||
for (int i = 0; i < int(getNumPalms()); i++) {
|
for (int i = 0; i < int(getNumPalms()); i++) {
|
||||||
PalmData& palm = getPalms()[i];
|
PalmData& palm = getPalms()[i];
|
||||||
if (!palm.isActive()) {
|
if (!palm.isActive()) {
|
||||||
|
|
|
@ -31,7 +31,6 @@ Head::Head(Avatar* owningAvatar) :
|
||||||
_rightEyePosition(0.0f, 0.0f, 0.0f),
|
_rightEyePosition(0.0f, 0.0f, 0.0f),
|
||||||
_eyePosition(0.0f, 0.0f, 0.0f),
|
_eyePosition(0.0f, 0.0f, 0.0f),
|
||||||
_scale(1.0f),
|
_scale(1.0f),
|
||||||
_gravity(0.0f, -1.0f, 0.0f),
|
|
||||||
_lastLoudness(0.0f),
|
_lastLoudness(0.0f),
|
||||||
_audioAttack(0.0f),
|
_audioAttack(0.0f),
|
||||||
_angularVelocity(0,0,0),
|
_angularVelocity(0,0,0),
|
||||||
|
|
|
@ -45,7 +45,6 @@ public:
|
||||||
void render(float alpha, Model::RenderMode mode);
|
void render(float alpha, Model::RenderMode mode);
|
||||||
void setScale(float scale);
|
void setScale(float scale);
|
||||||
void setPosition(glm::vec3 position) { _position = position; }
|
void setPosition(glm::vec3 position) { _position = position; }
|
||||||
void setGravity(glm::vec3 gravity) { _gravity = gravity; }
|
|
||||||
void setAverageLoudness(float averageLoudness) { _averageLoudness = averageLoudness; }
|
void setAverageLoudness(float averageLoudness) { _averageLoudness = averageLoudness; }
|
||||||
void setReturnToCenter (bool returnHeadToCenter) { _returnHeadToCenter = returnHeadToCenter; }
|
void setReturnToCenter (bool returnHeadToCenter) { _returnHeadToCenter = returnHeadToCenter; }
|
||||||
void setRenderLookatVectors(bool onOff) { _renderLookatVectors = onOff; }
|
void setRenderLookatVectors(bool onOff) { _renderLookatVectors = onOff; }
|
||||||
|
@ -118,7 +117,6 @@ private:
|
||||||
glm::vec3 _rightEyePosition;
|
glm::vec3 _rightEyePosition;
|
||||||
glm::vec3 _eyePosition;
|
glm::vec3 _eyePosition;
|
||||||
float _scale;
|
float _scale;
|
||||||
glm::vec3 _gravity;
|
|
||||||
float _lastLoudness;
|
float _lastLoudness;
|
||||||
float _audioAttack;
|
float _audioAttack;
|
||||||
glm::vec3 _angularVelocity;
|
glm::vec3 _angularVelocity;
|
||||||
|
|
|
@ -378,7 +378,6 @@ void MyAvatar::setLocalGravity(glm::vec3 gravity) {
|
||||||
|
|
||||||
void MyAvatar::setGravity(const glm::vec3& gravity) {
|
void MyAvatar::setGravity(const glm::vec3& gravity) {
|
||||||
_gravity = gravity;
|
_gravity = gravity;
|
||||||
getHead()->setGravity(_gravity);
|
|
||||||
|
|
||||||
// use the gravity to determine the new world up direction, if possible
|
// use the gravity to determine the new world up direction, if possible
|
||||||
float gravityLength = glm::length(gravity);
|
float gravityLength = glm::length(gravity);
|
||||||
|
|
|
@ -198,10 +198,25 @@ void SkeletonModel::applyPalmData(int jointIndex, PalmData& palm) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void SkeletonModel::updateJointState(int index) {
|
void SkeletonModel::updateJointState(int index) {
|
||||||
|
JointState& state = _jointStates[index];
|
||||||
|
const FBXGeometry& geometry = _geometry->getFBXGeometry();
|
||||||
|
const FBXJoint& joint = geometry.joints.at(index);
|
||||||
|
if (joint.parentIndex != -1) {
|
||||||
|
const JointState& parentState = _jointStates.at(joint.parentIndex);
|
||||||
|
if (index == geometry.leanJointIndex) {
|
||||||
|
maybeUpdateLeanRotation(parentState, joint, state);
|
||||||
|
|
||||||
|
} else if (index == geometry.neckJointIndex) {
|
||||||
|
maybeUpdateNeckRotation(parentState, joint, state);
|
||||||
|
|
||||||
|
} else if (index == geometry.leftEyeJointIndex || index == geometry.rightEyeJointIndex) {
|
||||||
|
maybeUpdateEyeRotation(parentState, joint, state);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Model::updateJointState(index);
|
Model::updateJointState(index);
|
||||||
|
|
||||||
if (index == _geometry->getFBXGeometry().rootJointIndex) {
|
if (index == _geometry->getFBXGeometry().rootJointIndex) {
|
||||||
JointState& state = _jointStates[index];
|
|
||||||
state.transform[3][0] = 0.0f;
|
state.transform[3][0] = 0.0f;
|
||||||
state.transform[3][1] = 0.0f;
|
state.transform[3][1] = 0.0f;
|
||||||
state.transform[3][2] = 0.0f;
|
state.transform[3][2] = 0.0f;
|
||||||
|
@ -347,4 +362,72 @@ void SkeletonModel::setHandPosition(int jointIndex, const glm::vec3& position, c
|
||||||
|
|
||||||
setJointRotation(jointIndex, rotation, true, PALM_PRIORITY);
|
setJointRotation(jointIndex, rotation, true, PALM_PRIORITY);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool SkeletonModel::getLeftHandPosition(glm::vec3& position) const {
|
||||||
|
return getJointPosition(getLeftHandJointIndex(), position);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool SkeletonModel::getLeftHandRotation(glm::quat& rotation) const {
|
||||||
|
return getJointRotation(getLeftHandJointIndex(), rotation);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool SkeletonModel::getRightHandPosition(glm::vec3& position) const {
|
||||||
|
return getJointPosition(getRightHandJointIndex(), position);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool SkeletonModel::getRightHandRotation(glm::quat& rotation) const {
|
||||||
|
return getJointRotation(getRightHandJointIndex(), rotation);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool SkeletonModel::restoreLeftHandPosition(float percent, float priority) {
|
||||||
|
return restoreJointPosition(getLeftHandJointIndex(), percent, priority);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool SkeletonModel::getLeftShoulderPosition(glm::vec3& position) const {
|
||||||
|
return getJointPosition(getLastFreeJointIndex(getLeftHandJointIndex()), position);
|
||||||
|
}
|
||||||
|
|
||||||
|
float SkeletonModel::getLeftArmLength() const {
|
||||||
|
return getLimbLength(getLeftHandJointIndex());
|
||||||
|
}
|
||||||
|
|
||||||
|
bool SkeletonModel::restoreRightHandPosition(float percent, float priority) {
|
||||||
|
return restoreJointPosition(getRightHandJointIndex(), percent, priority);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool SkeletonModel::getRightShoulderPosition(glm::vec3& position) const {
|
||||||
|
return getJointPosition(getLastFreeJointIndex(getRightHandJointIndex()), position);
|
||||||
|
}
|
||||||
|
|
||||||
|
float SkeletonModel::getRightArmLength() const {
|
||||||
|
return getLimbLength(getRightHandJointIndex());
|
||||||
|
}
|
||||||
|
|
||||||
|
bool SkeletonModel::getHeadPosition(glm::vec3& headPosition) const {
|
||||||
|
return isActive() && getJointPosition(_geometry->getFBXGeometry().headJointIndex, headPosition);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool SkeletonModel::getNeckPosition(glm::vec3& neckPosition) const {
|
||||||
|
return isActive() && getJointPosition(_geometry->getFBXGeometry().neckJointIndex, neckPosition);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool SkeletonModel::getNeckParentRotation(glm::quat& neckParentRotation) const {
|
||||||
|
if (!isActive()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
const FBXGeometry& geometry = _geometry->getFBXGeometry();
|
||||||
|
if (geometry.neckJointIndex == -1) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return getJointRotation(geometry.joints.at(geometry.neckJointIndex).parentIndex, neckParentRotation);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool SkeletonModel::getEyePositions(glm::vec3& firstEyePosition, glm::vec3& secondEyePosition) const {
|
||||||
|
if (!isActive()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
const FBXGeometry& geometry = _geometry->getFBXGeometry();
|
||||||
|
return getJointPosition(geometry.leftEyeJointIndex, firstEyePosition) &&
|
||||||
|
getJointPosition(geometry.rightEyeJointIndex, secondEyePosition);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -34,7 +34,69 @@ public:
|
||||||
void getBodyShapes(QVector<const Shape*>& shapes) const;
|
void getBodyShapes(QVector<const Shape*>& shapes) const;
|
||||||
|
|
||||||
void renderIKConstraints();
|
void renderIKConstraints();
|
||||||
|
|
||||||
|
/// Returns the index of the left hand joint, or -1 if not found.
|
||||||
|
int getLeftHandJointIndex() const { return isActive() ? _geometry->getFBXGeometry().leftHandJointIndex : -1; }
|
||||||
|
|
||||||
|
/// Returns the index of the right hand joint, or -1 if not found.
|
||||||
|
int getRightHandJointIndex() const { return isActive() ? _geometry->getFBXGeometry().rightHandJointIndex : -1; }
|
||||||
|
|
||||||
|
/// Retrieve the position of the left hand
|
||||||
|
/// \return true whether or not the position was found
|
||||||
|
bool getLeftHandPosition(glm::vec3& position) const;
|
||||||
|
|
||||||
|
/// Retrieve the rotation of the left hand
|
||||||
|
/// \return true whether or not the rotation was found
|
||||||
|
bool getLeftHandRotation(glm::quat& rotation) const;
|
||||||
|
|
||||||
|
/// Retrieve the position of the right hand
|
||||||
|
/// \return true whether or not the position was found
|
||||||
|
bool getRightHandPosition(glm::vec3& position) const;
|
||||||
|
|
||||||
|
/// Retrieve the rotation of the right hand
|
||||||
|
/// \return true whether or not the rotation was found
|
||||||
|
bool getRightHandRotation(glm::quat& rotation) const;
|
||||||
|
|
||||||
|
/// Restores some percentage of the default position of the left hand.
|
||||||
|
/// \param percent the percentage of the default position to restore
|
||||||
|
/// \return whether or not the left hand joint was found
|
||||||
|
bool restoreLeftHandPosition(float percent = 1.0f, float priority = 1.0f);
|
||||||
|
|
||||||
|
/// Gets the position of the left shoulder.
|
||||||
|
/// \return whether or not the left shoulder joint was found
|
||||||
|
bool getLeftShoulderPosition(glm::vec3& position) const;
|
||||||
|
|
||||||
|
/// Returns the extended length from the left hand to its last free ancestor.
|
||||||
|
float getLeftArmLength() const;
|
||||||
|
|
||||||
|
/// Restores some percentage of the default position of the right hand.
|
||||||
|
/// \param percent the percentage of the default position to restore
|
||||||
|
/// \return whether or not the right hand joint was found
|
||||||
|
bool restoreRightHandPosition(float percent = 1.0f, float priority = 1.0f);
|
||||||
|
|
||||||
|
/// Gets the position of the right shoulder.
|
||||||
|
/// \return whether or not the right shoulder joint was found
|
||||||
|
bool getRightShoulderPosition(glm::vec3& position) const;
|
||||||
|
|
||||||
|
/// Returns the extended length from the right hand to its first free ancestor.
|
||||||
|
float getRightArmLength() const;
|
||||||
|
|
||||||
|
/// Returns the position of the head joint.
|
||||||
|
/// \return whether or not the head was found
|
||||||
|
bool getHeadPosition(glm::vec3& headPosition) const;
|
||||||
|
|
||||||
|
/// Returns the position of the neck joint.
|
||||||
|
/// \return whether or not the neck was found
|
||||||
|
bool getNeckPosition(glm::vec3& neckPosition) const;
|
||||||
|
|
||||||
|
/// Returns the rotation of the neck joint's parent.
|
||||||
|
/// \return whether or not the neck was found
|
||||||
|
bool getNeckParentRotation(glm::quat& neckRotation) const;
|
||||||
|
|
||||||
|
/// Retrieve the positions of up to two eye meshes.
|
||||||
|
/// \return whether or not both eye meshes were found
|
||||||
|
bool getEyePositions(glm::vec3& firstEyePosition, glm::vec3& secondEyePosition) const;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
void applyHandPosition(int jointIndex, const glm::vec3& position);
|
void applyHandPosition(int jointIndex, const glm::vec3& position);
|
||||||
|
@ -44,9 +106,9 @@ protected:
|
||||||
/// Updates the state of the joint at the specified index.
|
/// Updates the state of the joint at the specified index.
|
||||||
virtual void updateJointState(int index);
|
virtual void updateJointState(int index);
|
||||||
|
|
||||||
virtual void maybeUpdateLeanRotation(const JointState& parentState, const FBXJoint& joint, JointState& state);
|
void maybeUpdateLeanRotation(const JointState& parentState, const FBXJoint& joint, JointState& state);
|
||||||
virtual void maybeUpdateNeckRotation(const JointState& parentState, const FBXJoint& joint, JointState& state);
|
void maybeUpdateNeckRotation(const JointState& parentState, const FBXJoint& joint, JointState& state);
|
||||||
virtual void maybeUpdateEyeRotation(const JointState& parentState, const FBXJoint& joint, JointState& state);
|
void maybeUpdateEyeRotation(const JointState& parentState, const FBXJoint& joint, JointState& state);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
|
|
|
@ -63,7 +63,7 @@ static void setPalm(float deltaTime, int index) {
|
||||||
if (!Application::getInstance()->getJoystickManager()->getJoystickStates().isEmpty()) {
|
if (!Application::getInstance()->getJoystickManager()->getJoystickStates().isEmpty()) {
|
||||||
const JoystickState& state = Application::getInstance()->getJoystickManager()->getJoystickStates().at(0);
|
const JoystickState& state = Application::getInstance()->getJoystickManager()->getJoystickStates().at(0);
|
||||||
if (state.axes.size() >= 4 && state.buttons.size() >= 4) {
|
if (state.axes.size() >= 4 && state.buttons.size() >= 4) {
|
||||||
if (index == SIXENSE_CONTROLLER_ID_LEFT_HAND) {
|
if (index == LEFT_HAND_INDEX) {
|
||||||
palm->setControllerButtons(state.buttons.at(1) ? BUTTON_FWD : 0);
|
palm->setControllerButtons(state.buttons.at(1) ? BUTTON_FWD : 0);
|
||||||
palm->setTrigger(state.buttons.at(0) ? 1.0f : 0.0f);
|
palm->setTrigger(state.buttons.at(0) ? 1.0f : 0.0f);
|
||||||
palm->setJoystick(state.axes.at(0), -state.axes.at(1));
|
palm->setJoystick(state.axes.at(0), -state.axes.at(1));
|
||||||
|
@ -82,7 +82,7 @@ static void setPalm(float deltaTime, int index) {
|
||||||
Model* skeletonModel = &Application::getInstance()->getAvatar()->getSkeletonModel();
|
Model* skeletonModel = &Application::getInstance()->getAvatar()->getSkeletonModel();
|
||||||
int jointIndex;
|
int jointIndex;
|
||||||
glm::quat inverseRotation = glm::inverse(Application::getInstance()->getAvatar()->getOrientation());
|
glm::quat inverseRotation = glm::inverse(Application::getInstance()->getAvatar()->getOrientation());
|
||||||
if (index == SIXENSE_CONTROLLER_ID_LEFT_HAND) {
|
if (index == LEFT_HAND_INDEX) {
|
||||||
jointIndex = skeletonModel->getLeftHandJointIndex();
|
jointIndex = skeletonModel->getLeftHandJointIndex();
|
||||||
skeletonModel->getJointRotation(jointIndex, rotation, true);
|
skeletonModel->getJointRotation(jointIndex, rotation, true);
|
||||||
rotation = inverseRotation * rotation * glm::quat(glm::vec3(0.0f, PI_OVER_TWO, 0.0f));
|
rotation = inverseRotation * rotation * glm::quat(glm::vec3(0.0f, PI_OVER_TWO, 0.0f));
|
||||||
|
@ -180,8 +180,8 @@ void PrioVR::update(float deltaTime) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// convert the joysticks into palm data
|
// convert the joysticks into palm data
|
||||||
setPalm(deltaTime, SIXENSE_CONTROLLER_ID_LEFT_HAND);
|
setPalm(deltaTime, LEFT_HAND_INDEX);
|
||||||
setPalm(deltaTime, SIXENSE_CONTROLLER_ID_RIGHT_HAND);
|
setPalm(deltaTime, RIGHT_HAND_INDEX);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -613,78 +613,6 @@ int Model::getLastFreeJointIndex(int jointIndex) const {
|
||||||
return (isActive() && jointIndex != -1) ? _geometry->getFBXGeometry().joints.at(jointIndex).freeLineage.last() : -1;
|
return (isActive() && jointIndex != -1) ? _geometry->getFBXGeometry().joints.at(jointIndex).freeLineage.last() : -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Model::getHeadPosition(glm::vec3& headPosition) const {
|
|
||||||
return isActive() && getJointPosition(_geometry->getFBXGeometry().headJointIndex, headPosition);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool Model::getNeckPosition(glm::vec3& neckPosition) const {
|
|
||||||
return isActive() && getJointPosition(_geometry->getFBXGeometry().neckJointIndex, neckPosition);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool Model::getNeckRotation(glm::quat& neckRotation) const {
|
|
||||||
return isActive() && getJointRotation(_geometry->getFBXGeometry().neckJointIndex, neckRotation);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool Model::getNeckParentRotation(glm::quat& neckParentRotation) const {
|
|
||||||
if (!isActive()) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
const FBXGeometry& geometry = _geometry->getFBXGeometry();
|
|
||||||
if (geometry.neckJointIndex == -1) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return getJointRotation(geometry.joints.at(geometry.neckJointIndex).parentIndex, neckParentRotation);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool Model::getEyePositions(glm::vec3& firstEyePosition, glm::vec3& secondEyePosition) const {
|
|
||||||
if (!isActive()) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
const FBXGeometry& geometry = _geometry->getFBXGeometry();
|
|
||||||
return getJointPosition(geometry.leftEyeJointIndex, firstEyePosition) &&
|
|
||||||
getJointPosition(geometry.rightEyeJointIndex, secondEyePosition);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool Model::getLeftHandPosition(glm::vec3& position) const {
|
|
||||||
return getJointPosition(getLeftHandJointIndex(), position);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool Model::getLeftHandRotation(glm::quat& rotation) const {
|
|
||||||
return getJointRotation(getLeftHandJointIndex(), rotation);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool Model::getRightHandPosition(glm::vec3& position) const {
|
|
||||||
return getJointPosition(getRightHandJointIndex(), position);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool Model::getRightHandRotation(glm::quat& rotation) const {
|
|
||||||
return getJointRotation(getRightHandJointIndex(), rotation);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool Model::restoreLeftHandPosition(float percent, float priority) {
|
|
||||||
return restoreJointPosition(getLeftHandJointIndex(), percent, priority);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool Model::getLeftShoulderPosition(glm::vec3& position) const {
|
|
||||||
return getJointPosition(getLastFreeJointIndex(getLeftHandJointIndex()), position);
|
|
||||||
}
|
|
||||||
|
|
||||||
float Model::getLeftArmLength() const {
|
|
||||||
return getLimbLength(getLeftHandJointIndex());
|
|
||||||
}
|
|
||||||
|
|
||||||
bool Model::restoreRightHandPosition(float percent, float priority) {
|
|
||||||
return restoreJointPosition(getRightHandJointIndex(), percent, priority);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool Model::getRightShoulderPosition(glm::vec3& position) const {
|
|
||||||
return getJointPosition(getLastFreeJointIndex(getRightHandJointIndex()), position);
|
|
||||||
}
|
|
||||||
|
|
||||||
float Model::getRightArmLength() const {
|
|
||||||
return getLimbLength(getRightHandJointIndex());
|
|
||||||
}
|
|
||||||
|
|
||||||
void Model::setURL(const QUrl& url, const QUrl& fallback, bool retainCurrent, bool delayLoad) {
|
void Model::setURL(const QUrl& url, const QUrl& fallback, bool retainCurrent, bool delayLoad) {
|
||||||
// don't recreate the geometry if it's the same URL
|
// don't recreate the geometry if it's the same URL
|
||||||
if (_url == url) {
|
if (_url == url) {
|
||||||
|
@ -1210,15 +1138,6 @@ void Model::updateJointState(int index) {
|
||||||
state.combinedRotation = _rotation * combinedRotation;
|
state.combinedRotation = _rotation * combinedRotation;
|
||||||
} else {
|
} else {
|
||||||
const JointState& parentState = _jointStates.at(joint.parentIndex);
|
const JointState& parentState = _jointStates.at(joint.parentIndex);
|
||||||
if (index == geometry.leanJointIndex) {
|
|
||||||
maybeUpdateLeanRotation(parentState, joint, state);
|
|
||||||
|
|
||||||
} else if (index == geometry.neckJointIndex) {
|
|
||||||
maybeUpdateNeckRotation(parentState, joint, state);
|
|
||||||
|
|
||||||
} else if (index == geometry.leftEyeJointIndex || index == geometry.rightEyeJointIndex) {
|
|
||||||
maybeUpdateEyeRotation(parentState, joint, state);
|
|
||||||
}
|
|
||||||
glm::quat combinedRotation = joint.preRotation * state.rotation * joint.postRotation;
|
glm::quat combinedRotation = joint.preRotation * state.rotation * joint.postRotation;
|
||||||
state.transform = parentState.transform * glm::translate(state.translation) * joint.preTransform *
|
state.transform = parentState.transform * glm::translate(state.translation) * joint.preTransform *
|
||||||
glm::mat4_cast(combinedRotation) * joint.postTransform;
|
glm::mat4_cast(combinedRotation) * joint.postTransform;
|
||||||
|
@ -1226,18 +1145,6 @@ void Model::updateJointState(int index) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Model::maybeUpdateLeanRotation(const JointState& parentState, const FBXJoint& joint, JointState& state) {
|
|
||||||
// nothing by default
|
|
||||||
}
|
|
||||||
|
|
||||||
void Model::maybeUpdateNeckRotation(const JointState& parentState, const FBXJoint& joint, JointState& state) {
|
|
||||||
// nothing by default
|
|
||||||
}
|
|
||||||
|
|
||||||
void Model::maybeUpdateEyeRotation(const JointState& parentState, const FBXJoint& joint, JointState& state) {
|
|
||||||
// nothing by default
|
|
||||||
}
|
|
||||||
|
|
||||||
bool Model::setJointPosition(int jointIndex, const glm::vec3& translation, const glm::quat& rotation, bool useRotation,
|
bool Model::setJointPosition(int jointIndex, const glm::vec3& translation, const glm::quat& rotation, bool useRotation,
|
||||||
int lastFreeIndex, bool allIntermediatesFree, const glm::vec3& alignment, float priority) {
|
int lastFreeIndex, bool allIntermediatesFree, const glm::vec3& alignment, float priority) {
|
||||||
if (jointIndex == -1 || _jointStates.isEmpty()) {
|
if (jointIndex == -1 || _jointStates.isEmpty()) {
|
||||||
|
|
|
@ -115,78 +115,12 @@ public:
|
||||||
/// Sets the joint state at the specified index.
|
/// Sets the joint state at the specified index.
|
||||||
void setJointState(int index, bool valid, const glm::quat& rotation = glm::quat(), float priority = 1.0f);
|
void setJointState(int index, bool valid, const glm::quat& rotation = glm::quat(), float priority = 1.0f);
|
||||||
|
|
||||||
/// Returns the index of the left hand joint, or -1 if not found.
|
|
||||||
int getLeftHandJointIndex() const { return isActive() ? _geometry->getFBXGeometry().leftHandJointIndex : -1; }
|
|
||||||
|
|
||||||
/// Returns the index of the right hand joint, or -1 if not found.
|
|
||||||
int getRightHandJointIndex() const { return isActive() ? _geometry->getFBXGeometry().rightHandJointIndex : -1; }
|
|
||||||
|
|
||||||
/// Returns the index of the parent of the indexed joint, or -1 if not found.
|
/// Returns the index of the parent of the indexed joint, or -1 if not found.
|
||||||
int getParentJointIndex(int jointIndex) const;
|
int getParentJointIndex(int jointIndex) const;
|
||||||
|
|
||||||
/// Returns the index of the last free ancestor of the indexed joint, or -1 if not found.
|
/// Returns the index of the last free ancestor of the indexed joint, or -1 if not found.
|
||||||
int getLastFreeJointIndex(int jointIndex) const;
|
int getLastFreeJointIndex(int jointIndex) const;
|
||||||
|
|
||||||
/// Returns the position of the head joint.
|
|
||||||
/// \return whether or not the head was found
|
|
||||||
bool getHeadPosition(glm::vec3& headPosition) const;
|
|
||||||
|
|
||||||
/// Returns the position of the neck joint.
|
|
||||||
/// \return whether or not the neck was found
|
|
||||||
bool getNeckPosition(glm::vec3& neckPosition) const;
|
|
||||||
|
|
||||||
/// Returns the rotation of the neck joint.
|
|
||||||
/// \return whether or not the neck was found
|
|
||||||
bool getNeckRotation(glm::quat& neckRotation) const;
|
|
||||||
|
|
||||||
/// Returns the rotation of the neck joint's parent.
|
|
||||||
/// \return whether or not the neck was found
|
|
||||||
bool getNeckParentRotation(glm::quat& neckRotation) const;
|
|
||||||
|
|
||||||
/// Retrieve the positions of up to two eye meshes.
|
|
||||||
/// \return whether or not both eye meshes were found
|
|
||||||
bool getEyePositions(glm::vec3& firstEyePosition, glm::vec3& secondEyePosition) const;
|
|
||||||
|
|
||||||
/// Retrieve the position of the left hand
|
|
||||||
/// \return true whether or not the position was found
|
|
||||||
bool getLeftHandPosition(glm::vec3& position) const;
|
|
||||||
|
|
||||||
/// Retrieve the rotation of the left hand
|
|
||||||
/// \return true whether or not the rotation was found
|
|
||||||
bool getLeftHandRotation(glm::quat& rotation) const;
|
|
||||||
|
|
||||||
/// Retrieve the position of the right hand
|
|
||||||
/// \return true whether or not the position was found
|
|
||||||
bool getRightHandPosition(glm::vec3& position) const;
|
|
||||||
|
|
||||||
/// Retrieve the rotation of the right hand
|
|
||||||
/// \return true whether or not the rotation was found
|
|
||||||
bool getRightHandRotation(glm::quat& rotation) const;
|
|
||||||
|
|
||||||
/// Restores some percentage of the default position of the left hand.
|
|
||||||
/// \param percent the percentage of the default position to restore
|
|
||||||
/// \return whether or not the left hand joint was found
|
|
||||||
bool restoreLeftHandPosition(float percent = 1.0f, float priority = 1.0f);
|
|
||||||
|
|
||||||
/// Gets the position of the left shoulder.
|
|
||||||
/// \return whether or not the left shoulder joint was found
|
|
||||||
bool getLeftShoulderPosition(glm::vec3& position) const;
|
|
||||||
|
|
||||||
/// Returns the extended length from the left hand to its last free ancestor.
|
|
||||||
float getLeftArmLength() const;
|
|
||||||
|
|
||||||
/// Restores some percentage of the default position of the right hand.
|
|
||||||
/// \param percent the percentage of the default position to restore
|
|
||||||
/// \return whether or not the right hand joint was found
|
|
||||||
bool restoreRightHandPosition(float percent = 1.0f, float priority = 1.0f);
|
|
||||||
|
|
||||||
/// Gets the position of the right shoulder.
|
|
||||||
/// \return whether or not the right shoulder joint was found
|
|
||||||
bool getRightShoulderPosition(glm::vec3& position) const;
|
|
||||||
|
|
||||||
/// Returns the extended length from the right hand to its first free ancestor.
|
|
||||||
float getRightArmLength() const;
|
|
||||||
|
|
||||||
bool getJointPosition(int jointIndex, glm::vec3& position) const;
|
bool getJointPosition(int jointIndex, glm::vec3& position) const;
|
||||||
bool getJointRotation(int jointIndex, glm::quat& rotation, bool fromBind = false) const;
|
bool getJointRotation(int jointIndex, glm::quat& rotation, bool fromBind = false) const;
|
||||||
|
|
||||||
|
@ -284,10 +218,6 @@ protected:
|
||||||
/// Updates the state of the joint at the specified index.
|
/// Updates the state of the joint at the specified index.
|
||||||
virtual void updateJointState(int index);
|
virtual void updateJointState(int index);
|
||||||
|
|
||||||
virtual void maybeUpdateLeanRotation(const JointState& parentState, const FBXJoint& joint, JointState& state);
|
|
||||||
virtual void maybeUpdateNeckRotation(const JointState& parentState, const FBXJoint& joint, JointState& state);
|
|
||||||
virtual void maybeUpdateEyeRotation(const JointState& parentState, const FBXJoint& joint, JointState& state);
|
|
||||||
|
|
||||||
bool setJointPosition(int jointIndex, const glm::vec3& translation, const glm::quat& rotation = glm::quat(),
|
bool setJointPosition(int jointIndex, const glm::vec3& translation, const glm::quat& rotation = glm::quat(),
|
||||||
bool useRotation = false, int lastFreeIndex = -1, bool allIntermediatesFree = false,
|
bool useRotation = false, int lastFreeIndex = -1, bool allIntermediatesFree = false,
|
||||||
const glm::vec3& alignment = glm::vec3(0.0f, -1.0f, 0.0f), float priority = 1.0f);
|
const glm::vec3& alignment = glm::vec3(0.0f, -1.0f, 0.0f), float priority = 1.0f);
|
||||||
|
|
|
@ -53,10 +53,10 @@ void HandData::getLeftRightPalmIndices(int& leftPalmIndex, int& rightPalmIndex)
|
||||||
for (size_t i = 0; i < _palms.size(); i++) {
|
for (size_t i = 0; i < _palms.size(); i++) {
|
||||||
const PalmData& palm = _palms[i];
|
const PalmData& palm = _palms[i];
|
||||||
if (palm.isActive()) {
|
if (palm.isActive()) {
|
||||||
if (palm.getSixenseID() == SIXENSE_CONTROLLER_ID_LEFT_HAND) {
|
if (palm.getSixenseID() == LEFT_HAND_INDEX) {
|
||||||
leftPalmIndex = i;
|
leftPalmIndex = i;
|
||||||
}
|
}
|
||||||
if (palm.getSixenseID() == SIXENSE_CONTROLLER_ID_RIGHT_HAND) {
|
if (palm.getSixenseID() == RIGHT_HAND_INDEX) {
|
||||||
rightPalmIndex = i;
|
rightPalmIndex = i;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -23,16 +23,12 @@
|
||||||
class AvatarData;
|
class AvatarData;
|
||||||
class PalmData;
|
class PalmData;
|
||||||
|
|
||||||
|
const int LEFT_HAND_INDEX = 0;
|
||||||
|
const int RIGHT_HAND_INDEX = 1;
|
||||||
const int NUM_HANDS = 2;
|
const int NUM_HANDS = 2;
|
||||||
const int NUM_FINGERS_PER_HAND = 5;
|
|
||||||
const int NUM_FINGERS = NUM_HANDS * NUM_FINGERS_PER_HAND;
|
|
||||||
|
|
||||||
const int LEAPID_INVALID = -1;
|
|
||||||
const int SIXENSEID_INVALID = -1;
|
const int SIXENSEID_INVALID = -1;
|
||||||
|
|
||||||
const int SIXENSE_CONTROLLER_ID_LEFT_HAND = 0;
|
|
||||||
const int SIXENSE_CONTROLLER_ID_RIGHT_HAND = 1;
|
|
||||||
|
|
||||||
class HandData {
|
class HandData {
|
||||||
public:
|
public:
|
||||||
HandData(AvatarData* owningAvatar);
|
HandData(AvatarData* owningAvatar);
|
||||||
|
|
Loading…
Reference in a new issue