diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index 762855e039..0b9d770de0 100644 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -98,8 +98,8 @@ MyAvatar::MyAvatar() : _isLookingAtLeftEye(true), _realWorldFieldOfView("realWorldFieldOfView", DEFAULT_REAL_WORLD_FIELD_OF_VIEW_DEGREES), - _currentSkeletonModel(nullptr), - _firstPersonSkeletonModel(this) + _firstPersonSkeletonModel(this), + _prevShouldDrawHead(true) { _firstPersonSkeletonModel.setIsFirstPerson(true); @@ -1203,16 +1203,9 @@ void MyAvatar::renderBody(RenderArgs* renderArgs, ViewFrustum* renderFrustum, bo } } -void MyAvatar::setCurrentSkeletonModel(SkeletonModel* skeletonModel) { - if (_currentSkeletonModel != skeletonModel && skeletonModel->isActive() && skeletonModel->isRenderable()) { - - render::ScenePointer scene = Application::getInstance()->getMain3DScene(); - - if (_currentSkeletonModel) { - _currentSkeletonModel->setVisibleInScene(false, scene); - } - skeletonModel->setVisibleInScene(true, scene); - _currentSkeletonModel = skeletonModel; +void MyAvatar::setVisibleInSceneIfReady(Model* model, render::ScenePointer scene, bool visible) { + if (model->isActive() && model->isRenderable()) { + model->setVisibleInScene(visible, scene); } } @@ -1221,14 +1214,26 @@ void MyAvatar::preRender(RenderArgs* renderArgs) { render::ScenePointer scene = Application::getInstance()->getMain3DScene(); _skeletonModel.initWhenReady(scene); - _firstPersonSkeletonModel.initWhenReady(scene); - - // set visiblity on each model - if (shouldRenderHead(renderArgs)) { - setCurrentSkeletonModel(&_skeletonModel); - } else { - setCurrentSkeletonModel(&_firstPersonSkeletonModel); + if (_useFullAvatar) { + _firstPersonSkeletonModel.initWhenReady(scene); } + + bool shouldDrawHead = shouldRenderHead(renderArgs); + if (shouldDrawHead != _prevShouldDrawHead) { + if (_useFullAvatar) { + if (shouldDrawHead) { + _skeletonModel.setVisibleInScene(true, scene); + _firstPersonSkeletonModel.setVisibleInScene(false, scene); + } else { + _skeletonModel.setVisibleInScene(false, scene); + _firstPersonSkeletonModel.setVisibleInScene(true, scene); + } + } else { + getHead()->getFaceModel().setVisibleInScene(shouldDrawHead, scene); + } + + } + _prevShouldDrawHead = shouldDrawHead; } const float RENDER_HEAD_CUTOFF_DISTANCE = 0.50f; diff --git a/interface/src/avatar/MyAvatar.h b/interface/src/avatar/MyAvatar.h index 9dda29a918..8543382445 100644 --- a/interface/src/avatar/MyAvatar.h +++ b/interface/src/avatar/MyAvatar.h @@ -211,8 +211,7 @@ private: virtual void setFaceModelURL(const QUrl& faceModelURL); virtual void setSkeletonModelURL(const QUrl& skeletonModelURL); - void setCurrentSkeletonModel(SkeletonModel* skeletonModel); - void initModelWhenReady(Model* model); + void setVisibleInSceneIfReady(Model* model, render::ScenePointer scene, bool visiblity); glm::vec3 _gravity; @@ -271,8 +270,8 @@ private: QString _fullAvatarModelName; // used for rendering when in first person view or when in an HMD. - SkeletonModel* _currentSkeletonModel; SkeletonModel _firstPersonSkeletonModel; + bool _prevShouldDrawHead; }; #endif // hifi_MyAvatar_h diff --git a/libraries/octree/src/ViewFrustum.h b/libraries/octree/src/ViewFrustum.h index 6c279585e2..3e41b58bb6 100644 --- a/libraries/octree/src/ViewFrustum.h +++ b/libraries/octree/src/ViewFrustum.h @@ -30,8 +30,7 @@ const float DEFAULT_KEYHOLE_RADIUS = 3.0f; const float DEFAULT_FIELD_OF_VIEW_DEGREES = 45.0f; const float DEFAULT_ASPECT_RATIO = 16.0f/9.0f; -//const float DEFAULT_NEAR_CLIP = 0.08f; -const float DEFAULT_NEAR_CLIP = 0.1f; +const float DEFAULT_NEAR_CLIP = 0.08f; const float DEFAULT_FAR_CLIP = (float)TREE_SCALE; class ViewFrustum { diff --git a/libraries/render-utils/src/Model.cpp b/libraries/render-utils/src/Model.cpp index d6fe5cea1a..93f3f345f0 100644 --- a/libraries/render-utils/src/Model.cpp +++ b/libraries/render-utils/src/Model.cpp @@ -1370,6 +1370,7 @@ void Model::simulate(float deltaTime, bool fullUpdate) { // because ray picking needs valid boxes to work _calculatedMeshBoxesValid = false; _calculatedMeshTrianglesValid = false; + onInvalidate(); // check for scale to fit if (_scaleToFit && !_scaledToFit) {