From 9855fbcfb4e209ced4e007ebf2a9e02192e63ea5 Mon Sep 17 00:00:00 2001 From: Andrzej Kapolka Date: Mon, 29 Sep 2014 11:45:12 -0700 Subject: [PATCH] Don't bother using a callback to render the eye vectors; just rely on the post-lighting call to Avatar::render, like everything else. This should fix the crash that Philip was seeing (presumably due to avatars' being deleted during the draw process). --- interface/src/avatar/Avatar.cpp | 24 +++++++++++------------- interface/src/avatar/Head.cpp | 15 +++++++-------- interface/src/avatar/Head.h | 6 ++---- interface/src/avatar/MyAvatar.cpp | 24 +++++++++++------------- 4 files changed, 31 insertions(+), 38 deletions(-) diff --git a/interface/src/avatar/Avatar.cpp b/interface/src/avatar/Avatar.cpp index c82eaa2bac..2b72fe2c23 100644 --- a/interface/src/avatar/Avatar.cpp +++ b/interface/src/avatar/Avatar.cpp @@ -520,20 +520,18 @@ void Avatar::renderBody(RenderMode renderMode, bool postLighting, float glowLeve renderAttachments(renderMode); } } - if (!postLighting) { - getHead()->render(1.0f, modelRenderMode); + getHead()->render(1.0f, modelRenderMode, postLighting); - if (Menu::getInstance()->isOptionChecked(MenuOption::StringHair)) { - // Render Hair - glPushMatrix(); - glm::vec3 headPosition = getHead()->getPosition(); - glTranslatef(headPosition.x, headPosition.y, headPosition.z); - const glm::quat& rotation = getHead()->getFinalOrientationInWorldFrame(); - glm::vec3 axis = glm::axis(rotation); - glRotatef(glm::degrees(glm::angle(rotation)), axis.x, axis.y, axis.z); - _hair.render(); - glPopMatrix(); - } + if (!postLighting && Menu::getInstance()->isOptionChecked(MenuOption::StringHair)) { + // Render Hair + glPushMatrix(); + glm::vec3 headPosition = getHead()->getPosition(); + glTranslatef(headPosition.x, headPosition.y, headPosition.z); + const glm::quat& rotation = getHead()->getFinalOrientationInWorldFrame(); + glm::vec3 axis = glm::axis(rotation); + glRotatef(glm::degrees(glm::angle(rotation)), axis.x, axis.y, axis.z); + _hair.render(); + glPopMatrix(); } } diff --git a/interface/src/avatar/Head.cpp b/interface/src/avatar/Head.cpp index f67a131221..bc557bdb57 100644 --- a/interface/src/avatar/Head.cpp +++ b/interface/src/avatar/Head.cpp @@ -211,17 +211,16 @@ void Head::relaxLean(float deltaTime) { _deltaLeanForward *= relaxationFactor; } -void Head::render(float alpha, Model::RenderMode mode) { - _faceModel.render(alpha, mode); - if (_renderLookatVectors && mode != Model::SHADOW_RENDER_MODE) { - Application::getInstance()->getDeferredLightingEffect()->addPostLightingRenderable(this); +void Head::render(float alpha, Model::RenderMode mode, bool postLighting) { + if (postLighting) { + if (_renderLookatVectors) { + renderLookatVectors(_leftEyePosition, _rightEyePosition, getCorrectedLookAtPosition()); + } + } else { + _faceModel.render(alpha, mode); } } -void Head::renderPostLighting() { - renderLookatVectors(_leftEyePosition, _rightEyePosition, getCorrectedLookAtPosition()); -} - void Head::setScale (float scale) { if (_scale == scale) { return; diff --git a/interface/src/avatar/Head.h b/interface/src/avatar/Head.h index efcee9ed8d..bc4142eab0 100644 --- a/interface/src/avatar/Head.h +++ b/interface/src/avatar/Head.h @@ -23,7 +23,6 @@ #include "FaceModel.h" #include "InterfaceConfig.h" #include "world.h" -#include "renderer/DeferredLightingEffect.h" enum eyeContactTargets { LEFT_EYE, @@ -36,15 +35,14 @@ const float EYE_EAR_GAP = 0.08f; class Avatar; class ProgramObject; -class Head : public HeadData, public PostLightingRenderable { +class Head : public HeadData { public: Head(Avatar* owningAvatar); void init(); void reset(); void simulate(float deltaTime, bool isMine, bool billboard = false); - void render(float alpha, Model::RenderMode mode); - virtual void renderPostLighting(); + void render(float alpha, Model::RenderMode mode, bool postLighting); void setScale(float scale); void setPosition(glm::vec3 position) { _position = position; } void setAverageLoudness(float averageLoudness) { _averageLoudness = averageLoudness; } diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index 5cd8ba2052..f7aa8a2bd6 100644 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -1147,20 +1147,18 @@ void MyAvatar::renderBody(RenderMode renderMode, bool postLighting, float glowLe const Camera *camera = Application::getInstance()->getCamera(); const glm::vec3 cameraPos = camera->getPosition() + (camera->getRotation() * glm::vec3(0.0f, 0.0f, 1.0f)) * camera->getDistance(); if (shouldRenderHead(cameraPos, renderMode)) { - if (!postLighting) { - getHead()->render(1.0f, modelRenderMode); + getHead()->render(1.0f, modelRenderMode, postLighting); - if (Menu::getInstance()->isOptionChecked(MenuOption::StringHair)) { - // Render Hair - glPushMatrix(); - glm::vec3 headPosition = getHead()->getPosition(); - glTranslatef(headPosition.x, headPosition.y, headPosition.z); - const glm::quat& rotation = getHead()->getFinalOrientationInWorldFrame(); - glm::vec3 axis = glm::axis(rotation); - glRotatef(glm::degrees(glm::angle(rotation)), axis.x, axis.y, axis.z); - _hair.render(); - glPopMatrix(); - } + if (!postLighting && Menu::getInstance()->isOptionChecked(MenuOption::StringHair)) { + // Render Hair + glPushMatrix(); + glm::vec3 headPosition = getHead()->getPosition(); + glTranslatef(headPosition.x, headPosition.y, headPosition.z); + const glm::quat& rotation = getHead()->getFinalOrientationInWorldFrame(); + glm::vec3 axis = glm::axis(rotation); + glRotatef(glm::degrees(glm::angle(rotation)), axis.x, axis.y, axis.z); + _hair.render(); + glPopMatrix(); } } if (postLighting) {