Don't leave out the head when we draw our shadow.

This commit is contained in:
Andrzej Kapolka 2013-11-21 13:57:55 -08:00
parent 898135fbf2
commit 3137e9a3e6
8 changed files with 33 additions and 37 deletions

View file

@ -1876,7 +1876,7 @@ bool Application::isLookingAtMyAvatar(Avatar* avatar) {
return false; return false;
} }
void Application::renderLookatIndicator(glm::vec3 pointOfInterest, Camera& whichCamera) { void Application::renderLookatIndicator(glm::vec3 pointOfInterest) {
const float DISTANCE_FROM_HEAD_SPHERE = 0.1f * _lookatIndicatorScale; const float DISTANCE_FROM_HEAD_SPHERE = 0.1f * _lookatIndicatorScale;
const float INDICATOR_RADIUS = 0.1f * _lookatIndicatorScale; const float INDICATOR_RADIUS = 0.1f * _lookatIndicatorScale;
@ -2822,7 +2822,7 @@ void Application::updateShadowMap() {
glTranslatef(translation.x, translation.y, translation.z); glTranslatef(translation.x, translation.y, translation.z);
renderAvatars(_myCamera); renderAvatars(true);
glPopMatrix(); glPopMatrix();
@ -3182,7 +3182,7 @@ void Application::displaySide(Camera& whichCamera, bool selfAvatarOnly) {
_myAvatar.renderScreenTint(SCREEN_TINT_BEFORE_AVATARS); _myAvatar.renderScreenTint(SCREEN_TINT_BEFORE_AVATARS);
renderAvatars(whichCamera, selfAvatarOnly); renderAvatars(whichCamera.getMode() == CAMERA_MODE_MIRROR, selfAvatarOnly);
_myAvatar.renderScreenTint(SCREEN_TINT_AFTER_AVATARS); _myAvatar.renderScreenTint(SCREEN_TINT_AFTER_AVATARS);
@ -3806,7 +3806,7 @@ void Application::renderCoverageMapsRecursively(CoverageMap* map) {
} }
} }
void Application::renderAvatars(Camera& whichCamera, bool selfAvatarOnly) { void Application::renderAvatars(bool forceRenderHead, bool selfAvatarOnly) {
if (!Menu::getInstance()->isOptionChecked(MenuOption::Avatars)) { if (!Menu::getInstance()->isOptionChecked(MenuOption::Avatars)) {
return; return;
} }
@ -3834,12 +3834,11 @@ void Application::renderAvatars(Camera& whichCamera, bool selfAvatarOnly) {
} }
// Render my own Avatar // Render my own Avatar
_myAvatar.render(whichCamera.getMode() == CAMERA_MODE_MIRROR, _myAvatar.render(forceRenderHead, Menu::getInstance()->isOptionChecked(MenuOption::AvatarAsBalls));
Menu::getInstance()->isOptionChecked(MenuOption::AvatarAsBalls));
_myAvatar.setDisplayingLookatVectors(Menu::getInstance()->isOptionChecked(MenuOption::LookAtVectors)); _myAvatar.setDisplayingLookatVectors(Menu::getInstance()->isOptionChecked(MenuOption::LookAtVectors));
if (Menu::getInstance()->isOptionChecked(MenuOption::LookAtIndicator) && _lookatTargetAvatar) { if (Menu::getInstance()->isOptionChecked(MenuOption::LookAtIndicator) && _lookatTargetAvatar) {
renderLookatIndicator(_lookatOtherPosition, whichCamera); renderLookatIndicator(_lookatOtherPosition);
} }
} }

View file

@ -262,7 +262,7 @@ private:
glm::vec3& eyePosition, QUuid &nodeUUID); glm::vec3& eyePosition, QUuid &nodeUUID);
bool isLookingAtMyAvatar(Avatar* avatar); bool isLookingAtMyAvatar(Avatar* avatar);
void renderLookatIndicator(glm::vec3 pointOfInterest, Camera& whichCamera); void renderLookatIndicator(glm::vec3 pointOfInterest);
void renderFollowIndicator(); void renderFollowIndicator();
void updateAvatar(float deltaTime); void updateAvatar(float deltaTime);
void updateAvatars(float deltaTime, glm::vec3 mouseRayOrigin, glm::vec3 mouseRayDirection); void updateAvatars(float deltaTime, glm::vec3 mouseRayOrigin, glm::vec3 mouseRayDirection);
@ -276,7 +276,7 @@ private:
void displaySide(Camera& whichCamera, bool selfAvatarOnly = false); void displaySide(Camera& whichCamera, bool selfAvatarOnly = false);
void displayOverlay(); void displayOverlay();
void displayStats(); void displayStats();
void renderAvatars(Camera& whichCamera, bool selfAvatarOnly = false); void renderAvatars(bool forceRenderHead, bool selfAvatarOnly = false);
void renderViewFrustum(ViewFrustum& viewFrustum); void renderViewFrustum(ViewFrustum& viewFrustum);
void checkBandwidthMeterClick(); void checkBandwidthMeterClick();

View file

@ -439,7 +439,7 @@ static TextRenderer* textRenderer() {
return renderer; return renderer;
} }
void Avatar::render(bool lookingInMirror, bool renderAvatarBalls) { void Avatar::render(bool forceRenderHead, bool renderAvatarBalls) {
if (Application::getInstance()->getAvatar()->getHand().isRaveGloveActive()) { if (Application::getInstance()->getAvatar()->getHand().isRaveGloveActive()) {
_hand.setRaveLights(RAVE_LIGHTS_AVATAR); _hand.setRaveLights(RAVE_LIGHTS_AVATAR);
@ -455,7 +455,7 @@ void Avatar::render(bool lookingInMirror, bool renderAvatarBalls) {
Glower glower(_moving && glm::length(toTarget) > GLOW_DISTANCE ? 1.0f : 0.0f); Glower glower(_moving && glm::length(toTarget) > GLOW_DISTANCE ? 1.0f : 0.0f);
// render body // render body
renderBody(lookingInMirror, renderAvatarBalls); renderBody(forceRenderHead, renderAvatarBalls);
// render sphere when far away // render sphere when far away
const float MAX_ANGLE = 10.f; const float MAX_ANGLE = 10.f;
@ -709,15 +709,15 @@ glm::quat Avatar::computeRotationFromBodyToWorldUp(float proportion) const {
return glm::angleAxis(angle * proportion, axis); return glm::angleAxis(angle * proportion, axis);
} }
float Avatar::getBallRenderAlpha(int ball, bool lookingInMirror) const { float Avatar::getBallRenderAlpha(int ball, bool forceRenderHead) const {
return 1.0f; return 1.0f;
} }
void Avatar::renderBody(bool lookingInMirror, bool renderAvatarBalls) { void Avatar::renderBody(bool forceRenderHead, bool renderAvatarBalls) {
if (_head.getVideoFace().isFullFrame()) { if (_head.getVideoFace().isFullFrame()) {
// Render the full-frame video // Render the full-frame video
float alpha = getBallRenderAlpha(BODY_BALL_HEAD_BASE, lookingInMirror); float alpha = getBallRenderAlpha(BODY_BALL_HEAD_BASE, forceRenderHead);
if (alpha > 0.0f) { if (alpha > 0.0f) {
_head.getVideoFace().render(1.0f); _head.getVideoFace().render(1.0f);
} }
@ -726,7 +726,7 @@ void Avatar::renderBody(bool lookingInMirror, bool renderAvatarBalls) {
glm::vec3 skinColor, darkSkinColor; glm::vec3 skinColor, darkSkinColor;
getSkinColors(skinColor, darkSkinColor); getSkinColors(skinColor, darkSkinColor);
for (int b = 0; b < NUM_AVATAR_BODY_BALLS; b++) { for (int b = 0; b < NUM_AVATAR_BODY_BALLS; b++) {
float alpha = getBallRenderAlpha(b, lookingInMirror); float alpha = getBallRenderAlpha(b, forceRenderHead);
// When we have leap hands, hide part of the arms. // When we have leap hands, hide part of the arms.
if (_hand.getNumPalms() > 0) { if (_hand.getNumPalms() > 0) {
@ -779,7 +779,7 @@ void Avatar::renderBody(bool lookingInMirror, bool renderAvatarBalls) {
} }
} else { } else {
// Render the body's voxels and head // Render the body's voxels and head
float alpha = getBallRenderAlpha(BODY_BALL_HEAD_BASE, lookingInMirror); float alpha = getBallRenderAlpha(BODY_BALL_HEAD_BASE, forceRenderHead);
if (alpha > 0.0f) { if (alpha > 0.0f) {
if (!_skeletonModel.render(alpha)) { if (!_skeletonModel.render(alpha)) {
_voxels.render(false); _voxels.render(false);
@ -787,7 +787,7 @@ void Avatar::renderBody(bool lookingInMirror, bool renderAvatarBalls) {
_head.render(alpha, false); _head.render(alpha, false);
} }
} }
_hand.render(lookingInMirror); _hand.render();
} }
void Avatar::getSkinColors(glm::vec3& lighter, glm::vec3& darker) { void Avatar::getSkinColors(glm::vec3& lighter, glm::vec3& darker) {

View file

@ -141,7 +141,7 @@ public:
void init(); void init();
void simulate(float deltaTime, Transmitter* transmitter); void simulate(float deltaTime, Transmitter* transmitter);
void follow(Avatar* leadingAvatar); void follow(Avatar* leadingAvatar);
void render(bool lookingInMirror, bool renderAvatarBalls); void render(bool forceRenderHead, bool renderAvatarBalls);
//setters //setters
void setDisplayingLookatVectors(bool displayingLookatVectors) { _head.setRenderLookatVectors(displayingLookatVectors); } void setDisplayingLookatVectors(bool displayingLookatVectors) { _head.setRenderLookatVectors(displayingLookatVectors); }
@ -255,8 +255,8 @@ private:
// private methods... // private methods...
glm::vec3 calculateAverageEyePosition() { return _head.calculateAverageEyePosition(); } // get the position smack-dab between the eyes (for lookat) glm::vec3 calculateAverageEyePosition() { return _head.calculateAverageEyePosition(); } // get the position smack-dab between the eyes (for lookat)
float getBallRenderAlpha(int ball, bool lookingInMirror) const; float getBallRenderAlpha(int ball, bool forceRenderHead) const;
void renderBody(bool lookingInMirror, bool renderAvatarBalls); void renderBody(bool forceRenderHead, bool renderAvatarBalls);
void initializeBodyBalls(); void initializeBodyBalls();
void resetBodyBalls(); void resetBodyBalls();
void updateHandMovementAndTouching(float deltaTime, bool enableHandMovement); void updateHandMovementAndTouching(float deltaTime, bool enableHandMovement);

View file

@ -24,7 +24,6 @@ Hand::Hand(Avatar* owningAvatar) :
_raveGloveInitialized(false), _raveGloveInitialized(false),
_owningAvatar(owningAvatar), _owningAvatar(owningAvatar),
_renderAlpha(1.0), _renderAlpha(1.0),
_lookingInMirror(false),
_ballColor(0.0, 0.0, 0.4) _ballColor(0.0, 0.0, 0.4)
{ {
// initialize all finger particle emitters with an invalid id as default // initialize all finger particle emitters with an invalid id as default
@ -133,10 +132,9 @@ void Hand::setRaveGloveEffectsMode(QKeyEvent* event) {
}; };
} }
void Hand::render(bool lookingInMirror) { void Hand::render() {
_renderAlpha = 1.0; _renderAlpha = 1.0;
_lookingInMirror = lookingInMirror;
if (Menu::getInstance()->isOptionChecked(MenuOption::DisplayLeapHands)) { if (Menu::getInstance()->isOptionChecked(MenuOption::DisplayLeapHands)) {
if (!isRaveGloveActive()) { if (!isRaveGloveActive()) {

View file

@ -50,7 +50,7 @@ public:
void init(); void init();
void reset(); void reset();
void simulate(float deltaTime, bool isMine); void simulate(float deltaTime, bool isMine);
void render(bool lookingInMirror); void render();
void renderRaveGloveStage(); void renderRaveGloveStage();
void setRaveLights(RaveLightsSetting setting); void setRaveLights(RaveLightsSetting setting);
@ -75,7 +75,6 @@ private:
Avatar* _owningAvatar; Avatar* _owningAvatar;
float _renderAlpha; float _renderAlpha;
bool _lookingInMirror;
glm::vec3 _ballColor; glm::vec3 _ballColor;
std::vector<HandBall> _leapFingerTipBalls; std::vector<HandBall> _leapFingerTipBalls;
std::vector<HandBall> _leapFingerRootBalls; std::vector<HandBall> _leapFingerRootBalls;

View file

@ -485,7 +485,7 @@ static TextRenderer* textRenderer() {
return renderer; return renderer;
} }
void MyAvatar::render(bool lookingInMirror, bool renderAvatarBalls) { void MyAvatar::render(bool forceRenderHead, bool renderAvatarBalls) {
if (Application::getInstance()->getAvatar()->getHand().isRaveGloveActive()) { if (Application::getInstance()->getAvatar()->getHand().isRaveGloveActive()) {
_hand.setRaveLights(RAVE_LIGHTS_AVATAR); _hand.setRaveLights(RAVE_LIGHTS_AVATAR);
@ -495,7 +495,7 @@ void MyAvatar::render(bool lookingInMirror, bool renderAvatarBalls) {
renderDiskShadow(_position, glm::vec3(0.0f, 1.0f, 0.0f), _scale * 0.1f, 0.2f); renderDiskShadow(_position, glm::vec3(0.0f, 1.0f, 0.0f), _scale * 0.1f, 0.2f);
// render body // render body
renderBody(lookingInMirror, renderAvatarBalls); renderBody(forceRenderHead, renderAvatarBalls);
// if this is my avatar, then render my interactions with the other avatar // if this is my avatar, then render my interactions with the other avatar
_avatarTouch.render(Application::getInstance()->getCamera()->getPosition()); _avatarTouch.render(Application::getInstance()->getCamera()->getPosition());
@ -623,19 +623,19 @@ glm::vec3 MyAvatar::getEyeLevelPosition() const {
glm::vec3(0.0f, _pelvisToHeadLength + _scale * BODY_BALL_RADIUS_HEAD_BASE * EYE_UP_OFFSET, 0.0f); glm::vec3(0.0f, _pelvisToHeadLength + _scale * BODY_BALL_RADIUS_HEAD_BASE * EYE_UP_OFFSET, 0.0f);
} }
float MyAvatar::getBallRenderAlpha(int ball, bool lookingInMirror) const { float MyAvatar::getBallRenderAlpha(int ball, bool forceRenderHead) const {
const float RENDER_OPAQUE_OUTSIDE = _scale * 0.25f; // render opaque if greater than this distance const float RENDER_OPAQUE_OUTSIDE = _scale * 0.25f; // render opaque if greater than this distance
const float DO_NOT_RENDER_INSIDE = _scale * 0.25f; // do not render if less than this distance const float DO_NOT_RENDER_INSIDE = _scale * 0.25f; // do not render if less than this distance
float distanceToCamera = glm::length(Application::getInstance()->getCamera()->getPosition() - _bodyBall[ball].position); float distanceToCamera = glm::length(Application::getInstance()->getCamera()->getPosition() - _bodyBall[ball].position);
return (lookingInMirror) ? 1.0f : glm::clamp( return (forceRenderHead) ? 1.0f : glm::clamp(
(distanceToCamera - DO_NOT_RENDER_INSIDE) / (RENDER_OPAQUE_OUTSIDE - DO_NOT_RENDER_INSIDE), 0.f, 1.f); (distanceToCamera - DO_NOT_RENDER_INSIDE) / (RENDER_OPAQUE_OUTSIDE - DO_NOT_RENDER_INSIDE), 0.f, 1.f);
} }
void MyAvatar::renderBody(bool lookingInMirror, bool renderAvatarBalls) { void MyAvatar::renderBody(bool forceRenderHead, bool renderAvatarBalls) {
if (_head.getVideoFace().isFullFrame()) { if (_head.getVideoFace().isFullFrame()) {
// Render the full-frame video // Render the full-frame video
float alpha = getBallRenderAlpha(BODY_BALL_HEAD_BASE, lookingInMirror); float alpha = getBallRenderAlpha(BODY_BALL_HEAD_BASE, forceRenderHead);
if (alpha > 0.0f) { if (alpha > 0.0f) {
_head.getVideoFace().render(1.0f); _head.getVideoFace().render(1.0f);
} }
@ -644,7 +644,7 @@ void MyAvatar::renderBody(bool lookingInMirror, bool renderAvatarBalls) {
glm::vec3 skinColor, darkSkinColor; glm::vec3 skinColor, darkSkinColor;
getSkinColors(skinColor, darkSkinColor); getSkinColors(skinColor, darkSkinColor);
for (int b = 0; b < NUM_AVATAR_BODY_BALLS; b++) { for (int b = 0; b < NUM_AVATAR_BODY_BALLS; b++) {
float alpha = getBallRenderAlpha(b, lookingInMirror); float alpha = getBallRenderAlpha(b, forceRenderHead);
// When we have leap hands, hide part of the arms. // When we have leap hands, hide part of the arms.
if (_hand.getNumPalms() > 0) { if (_hand.getNumPalms() > 0) {
@ -710,12 +710,12 @@ void MyAvatar::renderBody(bool lookingInMirror, bool renderAvatarBalls) {
if (!_skeletonModel.render(1.0f)) { if (!_skeletonModel.render(1.0f)) {
_voxels.render(false); _voxels.render(false);
} }
float alpha = getBallRenderAlpha(BODY_BALL_HEAD_BASE, lookingInMirror); float alpha = getBallRenderAlpha(BODY_BALL_HEAD_BASE, forceRenderHead);
if (alpha > 0.0f) { if (alpha > 0.0f) {
_head.render(alpha, true); _head.render(alpha, true);
} }
} }
_hand.render(lookingInMirror); _hand.render();
} }
void MyAvatar::updateThrust(float deltaTime, Transmitter * transmitter) { void MyAvatar::updateThrust(float deltaTime, Transmitter * transmitter) {

View file

@ -20,7 +20,7 @@ public:
void reset(); void reset();
void simulate(float deltaTime, Transmitter* transmitter); void simulate(float deltaTime, Transmitter* transmitter);
void updateFromGyrosAndOrWebcam(float pitchFromTouch, bool turnWithHead); void updateFromGyrosAndOrWebcam(float pitchFromTouch, bool turnWithHead);
void render(bool lookingInMirror, bool renderAvatarBalls); void render(bool forceRenderHead, bool renderAvatarBalls);
void renderScreenTint(ScreenTintLayer layer); void renderScreenTint(ScreenTintLayer layer);
// setters // setters
@ -84,8 +84,8 @@ private:
int _moveTargetStepCounter; int _moveTargetStepCounter;
// private methods // private methods
float getBallRenderAlpha(int ball, bool lookingInMirror) const; float getBallRenderAlpha(int ball, bool forceRenderHead) const;
void renderBody(bool lookingInMirror, bool renderAvatarBalls); void renderBody(bool forceRenderHead, bool renderAvatarBalls);
void updateThrust(float deltaTime, Transmitter * transmitter); void updateThrust(float deltaTime, Transmitter * transmitter);
void updateHandMovementAndTouching(float deltaTime, bool enableHandMovement); void updateHandMovementAndTouching(float deltaTime, bool enableHandMovement);
void updateAvatarCollisions(float deltaTime); void updateAvatarCollisions(float deltaTime);