diff --git a/interface/src/avatar/Head.cpp b/interface/src/avatar/Head.cpp index 67d7c56906..288f215bbe 100644 --- a/interface/src/avatar/Head.cpp +++ b/interface/src/avatar/Head.cpp @@ -158,7 +158,7 @@ void Head::simulate(float deltaTime, bool isMine, float gyroCameraSensitivity) { const float MOUTH_SIZE_SCALE = 2500.0f; _averageLoudness = faceshift->getMouthSize() * faceshift->getMouthSize() * MOUTH_SIZE_SCALE; const float BROW_HEIGHT_SCALE = 0.005f; - _browAudioLift = faceshift->getBrowHeight() * BROW_HEIGHT_SCALE; + _browAudioLift = faceshift->getBrowUpCenter() * BROW_HEIGHT_SCALE; } else { // Update eye saccades diff --git a/interface/src/avatar/PerlinFace.cpp b/interface/src/avatar/PerlinFace.cpp index 6c712f66fc..15d90f5403 100644 --- a/interface/src/avatar/PerlinFace.cpp +++ b/interface/src/avatar/PerlinFace.cpp @@ -87,7 +87,10 @@ PerlinFace::PerlinFace(Head *owningHead) _browsD_R(0), _browsU_C(0), _browsU_L(0), - _browsU_R(0) { + _browsU_R(0), + _mouthSize(0), + _leftBlink(0), + _rightBlink(0) { } PerlinFace::~PerlinFace() { @@ -189,6 +192,30 @@ void PerlinFace::render() { glDrawArrays(GL_TRIANGLES, 0, VERTEX_PER_TRIANGLE * _trianglesCount); + // Draw eyes + glColor3d(0, 0, 0); + glBegin(GL_LINE_LOOP); + glVertex3d(_vertices[EYE_LEFT].x, _vertices[EYE_LEFT].y, _vertices[EYE_LEFT].z); + glVertex3d(_vertices[EYE_MID_TOP].x, _vertices[EYE_MID_TOP].y, _vertices[EYE_MID_TOP].z); + glVertex3d(_vertices[EYE_RIGHT].x, _vertices[EYE_RIGHT].y, _vertices[EYE_RIGHT].z); + glVertex3d(_vertices[EYE_MID_BOTTOM].x, _vertices[EYE_MID_BOTTOM].y, _vertices[EYE_MID_BOTTOM].z); + glEnd(); + + glBegin(GL_LINE_LOOP); + glVertex3d(_vertices[NUM_VERTICES + EYE_LEFT].x, + _vertices[NUM_VERTICES + EYE_LEFT].y, + _vertices[NUM_VERTICES + EYE_LEFT].z); + glVertex3d(_vertices[NUM_VERTICES + EYE_MID_TOP].x, + _vertices[NUM_VERTICES + EYE_MID_TOP].y, + _vertices[NUM_VERTICES + EYE_MID_TOP].z); + glVertex3d(_vertices[NUM_VERTICES + EYE_RIGHT].x, + _vertices[NUM_VERTICES + EYE_RIGHT].y, + _vertices[NUM_VERTICES + EYE_RIGHT].z); + glVertex3d(_vertices[NUM_VERTICES + EYE_MID_BOTTOM].x, + _vertices[NUM_VERTICES + EYE_MID_BOTTOM].y, + _vertices[NUM_VERTICES + EYE_MID_BOTTOM].z); + glEnd(); + /*/ // Draw points for debug. @@ -223,13 +250,16 @@ void PerlinFace::updatePositions() { const float BROWS_DOWN_MAX = 1; const float BROWS_UP_CENTER_MAX = 1; - Faceshift* faceshift = Application::getFaceshift(); + Faceshift* faceshift = Application::getInstance()->getFaceshift(); if (faceshift->isActive()) { _browsD_L = faceshift->getBrowDownLeft(); _browsD_R = faceshift->getBrowDownRight(); - _browsU_C = faceshift->getBrowHeight(); + _browsU_C = faceshift->getBrowUpCenter(); _browsU_L = faceshift->getBrowUpLeft(); _browsU_R = faceshift->getBrowUpRight(); + _mouthSize = faceshift->getMouthSize(); + _leftBlink = faceshift->getLeftBlink(); + _rightBlink = faceshift->getRightBlink(); } @@ -265,22 +295,31 @@ void PerlinFace::updatePositions() { _vertices[MOUTH_BOTTOM_IN].y = VERTICES[FLOAT_PER_VERTEX * MOUTH_BOTTOM_IN + 1] - + 6.2; + + (1.0 - _mouthSize) * 6.2; _vertices[MOUTH_BOTTOM_OUT].y = VERTICES[FLOAT_PER_VERTEX * MOUTH_BOTTOM_OUT + 1] - + 6; + + (1.0 - _mouthSize) * 6; _vertices[MOUTH_MID_IN].y = VERTICES[FLOAT_PER_VERTEX * MOUTH_MID_IN + 1] - + 3; + + (1.0 - _mouthSize) * 3; _vertices[MOUTH_MID_OUT].y = VERTICES[FLOAT_PER_VERTEX * MOUTH_MID_OUT + 1] - + 3; + + (1.0 - _mouthSize) * 3; _vertices[NUM_VERTICES + MOUTH_BOTTOM_IN].y = VERTICES[FLOAT_PER_VERTEX * (NUM_VERTICES + MOUTH_BOTTOM_IN) + 1] - + 6.2; + + (1.0 - _mouthSize) * 6.2; _vertices[NUM_VERTICES + MOUTH_BOTTOM_OUT].y = VERTICES[FLOAT_PER_VERTEX * (NUM_VERTICES + MOUTH_BOTTOM_OUT) + 1] - + 6; + + (1.0 - _mouthSize) * 6; _vertices[NUM_VERTICES + MOUTH_MID_IN].y = VERTICES[FLOAT_PER_VERTEX * (NUM_VERTICES + MOUTH_MID_IN) + 1] - + 3; + + (1.0 - _mouthSize) * 3; _vertices[NUM_VERTICES + MOUTH_MID_OUT].y = VERTICES[FLOAT_PER_VERTEX * (NUM_VERTICES + MOUTH_MID_OUT) + 1] - + 3; + + (1.0 - _mouthSize) * 3; + + // Eyelid + _vertices[EYE_MID_TOP] = (1.0f - _leftBlink) * _vertices[EYE_MID_TOP] + _leftBlink * (_vertices[EYE_MID_TOP] + _vertices[EYE_MID_BOTTOM]) / 2.0f; + _vertices[EYE_MID_BOTTOM] = (1.0f - _leftBlink) * _vertices[EYE_MID_BOTTOM] + _leftBlink * (_vertices[EYE_MID_TOP] + _vertices[EYE_MID_BOTTOM]) / 2.0f; + + _vertices[NUM_VERTICES + EYE_MID_TOP] = (1.0f - _leftBlink) * _vertices[NUM_VERTICES + EYE_MID_TOP] + + _leftBlink * (_vertices[NUM_VERTICES + EYE_MID_TOP] + _vertices[NUM_VERTICES + EYE_MID_BOTTOM]) / 2.0f; + _vertices[NUM_VERTICES + EYE_MID_BOTTOM] = (1.0f - _leftBlink) * _vertices[NUM_VERTICES + EYE_MID_BOTTOM] + + _leftBlink * (_vertices[NUM_VERTICES + EYE_MID_TOP] + _vertices[NUM_VERTICES + EYE_MID_BOTTOM]) / 2.0f; } diff --git a/interface/src/avatar/PerlinFace.h b/interface/src/avatar/PerlinFace.h index c2a44f31e4..a31766e59e 100644 --- a/interface/src/avatar/PerlinFace.h +++ b/interface/src/avatar/PerlinFace.h @@ -61,6 +61,11 @@ private: float _browsU_C; float _browsU_L; float _browsU_R; + + float _mouthSize; + + float _leftBlink; + float _rightBlink; }; #endif /* defined(__interface__Face__) */ diff --git a/interface/src/devices/Faceshift.cpp b/interface/src/devices/Faceshift.cpp index 17ec80877e..196e204782 100644 --- a/interface/src/devices/Faceshift.cpp +++ b/interface/src/devices/Faceshift.cpp @@ -25,7 +25,7 @@ Faceshift::Faceshift() : _rightBlinkIndex(-1), _browDownLeft(0.0f), _browDownRight(0.0f), - _browHeight(0.0f), + _browUpCenter(0.0f), _browUpLeft(0.0f), _browUpRight(0.0f), _browDownLeftIndex(-1), @@ -135,7 +135,7 @@ void Faceshift::readFromSocket() { _browDownRight = data.m_coeffs[_browDownRightIndex]; } if (_browUpCenterIndex != -1) { - _browHeight = data.m_coeffs[_browUpCenterIndex]; + _browUpCenter = data.m_coeffs[_browUpCenterIndex]; } if (_browUpLeftIndex != -1) { _browUpLeft = data.m_coeffs[_browUpLeftIndex]; diff --git a/interface/src/devices/Faceshift.h b/interface/src/devices/Faceshift.h index 0ecd1dd268..84306ca10c 100644 --- a/interface/src/devices/Faceshift.h +++ b/interface/src/devices/Faceshift.h @@ -43,7 +43,7 @@ public: float getBrowDownLeft() const { return _browDownLeft; } float getBrowDownRight() const { return _browDownRight; } - float getBrowHeight() const { return _browHeight; } + float getBrowUpCenter() const { return _browUpCenter; } float getBrowUpLeft() const { return _browUpLeft; } float getBrowUpRight() const { return _browUpRight; } @@ -87,9 +87,11 @@ private: int _leftBlinkIndex; int _rightBlinkIndex; + + // Brows float _browDownLeft; float _browDownRight; - float _browHeight; + float _browUpCenter; float _browUpLeft; float _browUpRight;