mirror of
https://github.com/JulianGro/overte.git
synced 2025-04-26 02:55:25 +02:00
1. Fixed thread-crash at terminate() time by terminating the LeapManager properly 2. Fixed an intermittent thread-crash when Leap active by removing auto-connection between controller and listener 3. Added fingerRoot positions to display and data packet 4. Introduced a vec3-based convention so that more finger data may be added without causing trouble for old clients and servers 5. My avatar's fingers are different color from others
133 lines
3.8 KiB
C++
Executable file
133 lines
3.8 KiB
C++
Executable file
//
|
|
// Hand.cpp
|
|
// interface
|
|
//
|
|
// Copyright (c) 2013 High Fidelity, Inc. All rights reserved.
|
|
|
|
#include <QImage>
|
|
|
|
#include <AgentList.h>
|
|
|
|
#include "Application.h"
|
|
#include "Avatar.h"
|
|
#include "Hand.h"
|
|
#include "Util.h"
|
|
#include "renderer/ProgramObject.h"
|
|
|
|
using namespace std;
|
|
|
|
Hand::Hand(Avatar* owningAvatar) :
|
|
HandData((AvatarData*)owningAvatar),
|
|
_owningAvatar(owningAvatar),
|
|
_renderAlpha(1.0),
|
|
_lookingInMirror(false),
|
|
_ballColor(0.0, 0.0, 0.4),
|
|
_position(0.0, 0.4, 0.0),
|
|
_orientation(0.0, 0.0, 0.0, 1.0)
|
|
{
|
|
}
|
|
|
|
void Hand::init() {
|
|
// Different colors for my hand and others' hands
|
|
if (_owningAvatar && _owningAvatar->isMyAvatar())
|
|
_ballColor = glm::vec3(0.0, 0.4, 0.0);
|
|
else
|
|
_ballColor = glm::vec3(0.0, 0.0, 0.4);
|
|
}
|
|
|
|
void Hand::reset() {
|
|
}
|
|
|
|
void Hand::simulate(float deltaTime, bool isMine) {
|
|
}
|
|
|
|
glm::vec3 Hand::leapPositionToWorldPosition(const glm::vec3& leapPosition) {
|
|
float unitScale = 0.001; // convert mm to meters
|
|
return _position + _orientation * (leapPosition * unitScale);
|
|
}
|
|
|
|
void Hand::calculateGeometry() {
|
|
glm::vec3 offset(0.2, -0.2, -0.3); // place the hand in front of the face where we can see it
|
|
|
|
Head& head = _owningAvatar->getHead();
|
|
_position = head.getPosition() + head.getOrientation() * offset;
|
|
_orientation = head.getOrientation();
|
|
|
|
int numLeapBalls = _fingerTips.size() + _fingerRoots.size();
|
|
_leapBalls.resize(numLeapBalls);
|
|
|
|
for (int i = 0; i < _fingerTips.size(); ++i) {
|
|
_leapBalls[i].rotation = _orientation;
|
|
_leapBalls[i].position = leapPositionToWorldPosition(_fingerTips[i]);
|
|
_leapBalls[i].radius = 0.01;
|
|
_leapBalls[i].touchForce = 0.0;
|
|
_leapBalls[i].isCollidable = true;
|
|
}
|
|
}
|
|
|
|
|
|
void Hand::render(bool lookingInMirror) {
|
|
|
|
_renderAlpha = 1.0;
|
|
_lookingInMirror = lookingInMirror;
|
|
|
|
calculateGeometry();
|
|
|
|
glEnable(GL_DEPTH_TEST);
|
|
glEnable(GL_RESCALE_NORMAL);
|
|
|
|
renderHandSpheres();
|
|
}
|
|
|
|
void Hand::renderHandSpheres() {
|
|
glPushMatrix();
|
|
// Draw the leap balls
|
|
for (size_t i = 0; i < _leapBalls.size(); i++) {
|
|
float alpha = 1.0f;
|
|
|
|
if (alpha > 0.0f) {
|
|
glColor4f(_ballColor.r, _ballColor.g, _ballColor.b, alpha);
|
|
|
|
glPushMatrix();
|
|
glTranslatef(_leapBalls[i].position.x, _leapBalls[i].position.y, _leapBalls[i].position.z);
|
|
glutSolidSphere(_leapBalls[i].radius, 20.0f, 20.0f);
|
|
glPopMatrix();
|
|
}
|
|
}
|
|
|
|
// Draw the finger root cones
|
|
if (_fingerTips.size() == _fingerRoots.size()) {
|
|
for (size_t i = 0; i < _fingerTips.size(); ++i) {
|
|
glColor4f(_ballColor.r, _ballColor.g, _ballColor.b, 0.5);
|
|
glm::vec3 tip = leapPositionToWorldPosition(_fingerTips[i]);
|
|
glm::vec3 root = leapPositionToWorldPosition(_fingerRoots[i]);
|
|
Avatar::renderJointConnectingCone(root, tip, 0.001, 0.003);
|
|
}
|
|
}
|
|
|
|
// Draw the palms
|
|
if (_handPositions.size() == _handNormals.size()) {
|
|
for (size_t i = 0; i < _handPositions.size(); ++i) {
|
|
glColor4f(_ballColor.r, _ballColor.g, _ballColor.b, 0.25);
|
|
glm::vec3 tip = leapPositionToWorldPosition(_handPositions[i]);
|
|
glm::vec3 root = leapPositionToWorldPosition(_handPositions[i] + (_handNormals[i] * 2.0f));
|
|
Avatar::renderJointConnectingCone(root, tip, 0.05, 0.03);
|
|
}
|
|
}
|
|
|
|
glPopMatrix();
|
|
}
|
|
|
|
void Hand::setLeapFingers(const std::vector<glm::vec3>& fingerTips,
|
|
const std::vector<glm::vec3>& fingerRoots) {
|
|
_fingerTips = fingerTips;
|
|
_fingerRoots = fingerRoots;
|
|
}
|
|
|
|
void Hand::setLeapHands(const std::vector<glm::vec3>& handPositions,
|
|
const std::vector<glm::vec3>& handNormals) {
|
|
_handPositions = handPositions;
|
|
_handNormals = handNormals;
|
|
}
|
|
|
|
|