Bug fixes for switching between head/body and full body avatars

The head model visibility is now updated in preRender()
Moved the near clip plane in a bit more
Invalidate head bone vector on LOD switching.
Removed _currentSkeletonModel pointer, instead use _prevShouldDrawHead to detect when we should flip the visibility bit.
This commit is contained in:
Anthony J. Thibault 2015-06-22 18:19:17 -07:00
parent b88d7c2e05
commit 3853395298
4 changed files with 28 additions and 24 deletions

View file

@ -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;

View file

@ -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

View file

@ -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 {

View file

@ -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) {