From 31ff76836344f2b664ce07c90ed6e334cf495d91 Mon Sep 17 00:00:00 2001 From: Jeffrey Ventrella Date: Wed, 29 May 2013 08:30:14 -0700 Subject: [PATCH] fixed some glitches in avatar render alpha transition between 3p and 1p --- interface/src/Avatar.cpp | 23 ++++++++++++++--------- interface/src/AvatarTouch.cpp | 7 +++---- interface/src/AvatarTouch.h | 4 ++-- interface/src/Head.cpp | 11 +++++++---- interface/src/Head.h | 3 ++- 5 files changed, 28 insertions(+), 20 deletions(-) diff --git a/interface/src/Avatar.cpp b/interface/src/Avatar.cpp index 25e1764025..403918c830 100644 --- a/interface/src/Avatar.cpp +++ b/interface/src/Avatar.cpp @@ -1114,16 +1114,19 @@ void Avatar::updateArmIKAndConstraints(float deltaTime) { void Avatar::renderBody(bool lookingInMirror) { - const float RENDER_OPAQUE_BEYOND = 1.2f; // Meters beyond which body is shown opaque + const float RENDER_OPAQUE_BEYOND = 1.0f; // Meters beyond which body is shown opaque const float RENDER_TRANSLUCENT_BEYOND = 0.5f; // Render the body as balls and cones for (int b = 0; b < NUM_AVATAR_JOINTS; b++) { float distanceToCamera = glm::length(_cameraPosition - _joint[b].position); + + float alpha = glm::clamp((distanceToCamera - RENDER_TRANSLUCENT_BEYOND) / (RENDER_OPAQUE_BEYOND - RENDER_TRANSLUCENT_BEYOND), 0.f, 1.f); + // Always render other people, and render myself when beyond threshold distance if (b == AVATAR_JOINT_HEAD_BASE) { // the head is rendered as a special case - if (lookingInMirror || _owningAgent || distanceToCamera > RENDER_OPAQUE_BEYOND) { - _head.render(lookingInMirror, _cameraPosition); + if (lookingInMirror || _owningAgent || distanceToCamera > RENDER_OPAQUE_BEYOND * 0.5) { + _head.render(lookingInMirror, _cameraPosition, alpha); } } else if (_owningAgent || distanceToCamera > RENDER_TRANSLUCENT_BEYOND || b == AVATAR_JOINT_RIGHT_ELBOW @@ -1140,14 +1143,16 @@ void Avatar::renderBody(bool lookingInMirror) { glColor4f(SKIN_COLOR[0] + _joint[b].touchForce * 0.3f, SKIN_COLOR[1] - _joint[b].touchForce * 0.2f, SKIN_COLOR[2] - _joint[b].touchForce * 0.1f, - glm::clamp((distanceToCamera - RENDER_TRANSLUCENT_BEYOND) - / (RENDER_OPAQUE_BEYOND - RENDER_TRANSLUCENT_BEYOND), 0.f, 1.f)); + alpha); } - glPushMatrix(); - glTranslatef(_joint[b].springyPosition.x, _joint[b].springyPosition.y, _joint[b].springyPosition.z); - glutSolidSphere(_joint[b].radius, 20.0f, 20.0f); - glPopMatrix(); + if ((b != AVATAR_JOINT_HEAD_TOP ) + && (b != AVATAR_JOINT_HEAD_BASE )) { + glPushMatrix(); + glTranslatef(_joint[b].springyPosition.x, _joint[b].springyPosition.y, _joint[b].springyPosition.z); + glutSolidSphere(_joint[b].radius, 20.0f, 20.0f); + glPopMatrix(); + } // Render the cone connecting this joint to its parent if (_joint[b].parent != AVATAR_JOINT_NULL) { diff --git a/interface/src/AvatarTouch.cpp b/interface/src/AvatarTouch.cpp index 499e132922..18f4847d33 100644 --- a/interface/src/AvatarTouch.cpp +++ b/interface/src/AvatarTouch.cpp @@ -32,7 +32,7 @@ AvatarTouch::AvatarTouch() { _myOrientation.setToIdentity(); _yourOrientation.setToIdentity(); - for (int p=0; p irisTexture; Head::Head(Avatar* owningAvatar) : HeadData((AvatarData*)owningAvatar), + _renderAlpha(0.0), yawRate(0.0f), _returnHeadToCenter(false), _skinColor(0.0f, 0.0f, 0.0f), @@ -205,8 +206,10 @@ void Head::calculateGeometry(bool lookingInMirror) { } -void Head::render(bool lookingInMirror, glm::vec3 cameraPosition) { +void Head::render(bool lookingInMirror, glm::vec3 cameraPosition, float alpha) { + _renderAlpha = alpha; + calculateGeometry(lookingInMirror); glEnable(GL_DEPTH_TEST); @@ -314,7 +317,7 @@ void Head::renderHeadSphere() { glPushMatrix(); glTranslatef(_position.x, _position.y, _position.z); //translate to head position glScalef(_scale, _scale, _scale); //scale to head size - glColor3f(_skinColor.x, _skinColor.y, _skinColor.z); + glColor4f(_skinColor.x, _skinColor.y, _skinColor.z, _renderAlpha); glutSolidSphere(1, 30, 30); glPopMatrix(); } @@ -322,13 +325,13 @@ void Head::renderHeadSphere() { void Head::renderEars() { glPushMatrix(); - glColor3f(_skinColor.x, _skinColor.y, _skinColor.z); + glColor4f(_skinColor.x, _skinColor.y, _skinColor.z, _renderAlpha); glTranslatef(_leftEarPosition.x, _leftEarPosition.y, _leftEarPosition.z); glutSolidSphere(0.02, 30, 30); glPopMatrix(); glPushMatrix(); - glColor3f(_skinColor.x, _skinColor.y, _skinColor.z); + glColor4f(_skinColor.x, _skinColor.y, _skinColor.z, _renderAlpha); glTranslatef(_rightEarPosition.x, _rightEarPosition.y, _rightEarPosition.z); glutSolidSphere(0.02, 30, 30); glPopMatrix(); diff --git a/interface/src/Head.h b/interface/src/Head.h index 07d7351cb3..b98fa8c6b6 100644 --- a/interface/src/Head.h +++ b/interface/src/Head.h @@ -34,7 +34,7 @@ public: void reset(); void simulate(float deltaTime, bool isMine); - void render(bool lookingInMirror, glm::vec3 cameraPosition); + void render(bool lookingInMirror, glm::vec3 cameraPosition, float alpha); void renderMohawk(bool lookingInMirror, glm::vec3 cameraPosition); void setScale (float scale ) { _scale = scale; } @@ -71,6 +71,7 @@ private: glm::vec3 endVelocity; }; + float _renderAlpha; bool _returnHeadToCenter; glm::vec3 _skinColor; glm::vec3 _position;