diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp
index 8817ea3d05..c698bb3c1b 100755
--- a/interface/src/avatar/MyAvatar.cpp
+++ b/interface/src/avatar/MyAvatar.cpp
@@ -1126,8 +1126,11 @@ void MyAvatar::setEnableDebugDrawIKChains(bool isEnabled) {
_enableDebugDrawIKChains = isEnabled;
}
+bool MyAvatar::getEnableMeshVisible() const {
+ return Avatar::getEnableMeshVisible();
+}
+
void MyAvatar::setEnableMeshVisible(bool isEnabled) {
- _skeletonModel->setVisibleInScene(isEnabled, qApp->getMain3DScene(), render::ItemKey::TAG_BITS_0 | render::ItemKey::TAG_BITS_1, true);
Avatar::setEnableMeshVisible(isEnabled);
}
diff --git a/interface/src/avatar/MyAvatar.h b/interface/src/avatar/MyAvatar.h
index 5e78d508fe..4070d3372c 100644
--- a/interface/src/avatar/MyAvatar.h
+++ b/interface/src/avatar/MyAvatar.h
@@ -1159,7 +1159,7 @@ public slots:
* @function MyAvatar.getEnableMeshVisible
* @returns {boolean} true
if your avatar's mesh is visible, otherwise false
.
*/
- bool getEnableMeshVisible() const override { return _skeletonModel->isVisible(); }
+ bool getEnableMeshVisible() const override;
/**jsdoc
* Set whether or not your avatar mesh is visible.
diff --git a/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp b/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp
index 858318746c..a3b5a731bb 100644
--- a/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp
+++ b/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp
@@ -55,7 +55,9 @@ namespace render {
ItemKey::Builder keyBuilder = ItemKey::Builder::opaqueShape().withTypeMeta().withTagBits(ItemKey::TAG_BITS_0 | ItemKey::TAG_BITS_1).withMetaCullGroup();
auto avatarPtr = static_pointer_cast(avatar);
auto model = avatarPtr->getSkeletonModel();
- if (model && !model->isVisible()) {
+ //if (model && !model->isVisible()) {
+
+ if (!avatarPtr->getEnableMeshVisible() && model) {
keyBuilder.withInvisible();
}
return keyBuilder.build();
@@ -767,16 +769,14 @@ void Avatar::render(RenderArgs* renderArgs) {
void Avatar::setEnableMeshVisible(bool isEnabled) {
- render::Transaction transaction;
- if (render::Item::isValidID(_renderItemID)) {
- transaction.updateItem>(_renderItemID, [](render::Payload& p) {
- });
+ if (_isMeshEnableVisible != isEnabled) {
+ _isMeshEnableVisible = isEnabled;
+ _needMeshVisibleSwitch = true;
}
- qApp->getMain3DScene()->enqueueTransaction(transaction);
}
bool Avatar::getEnableMeshVisible() const {
- return true;
+ return _isMeshEnableVisible;
}
void Avatar::fixupModelsInScene(const render::ScenePointer& scene) {
@@ -801,6 +801,12 @@ void Avatar::fixupModelsInScene(const render::ScenePointer& scene) {
}
}
+ if (_needMeshVisibleSwitch) {
+ // _skeletonModel->setVisibleInScene(_isMeshEnableVisible, scene, render::ItemKey::TAG_BITS_0 | render::ItemKey::TAG_BITS_1, true);
+ updateRenderItem(transaction);
+ _needMeshVisibleSwitch = false;
+ }
+
if (_mustFadeIn && canTryFade) {
// Do it now to be sure all the sub items are ready and the fade is sent to them too
fade(transaction, render::Transition::USER_ENTER_DOMAIN);
diff --git a/libraries/avatars-renderer/src/avatars-renderer/Avatar.h b/libraries/avatars-renderer/src/avatars-renderer/Avatar.h
index 06bc1b174c..f7e89653b5 100644
--- a/libraries/avatars-renderer/src/avatars-renderer/Avatar.h
+++ b/libraries/avatars-renderer/src/avatars-renderer/Avatar.h
@@ -536,6 +536,9 @@ protected:
std::mutex _materialsLock;
void processMaterials();
+
+ bool _isMeshEnableVisible{ true };
+ bool _needMeshVisibleSwitch{ true };
};
#endif // hifi_Avatar_h
diff --git a/libraries/render/src/render/CullTask.cpp b/libraries/render/src/render/CullTask.cpp
index b5819f114f..ce6755b893 100644
--- a/libraries/render/src/render/CullTask.cpp
+++ b/libraries/render/src/render/CullTask.cpp
@@ -368,9 +368,9 @@ void CullShapeBounds::run(const RenderContextPointer& renderContext, const Input
RenderArgs* args = renderContext->args;
const auto& inShapes = inputs.get0();
- const auto& cullFilter = inputs.get1();
- const auto& boundsFilter = inputs.get2();
- const auto& antiFrustum = inputs.get3();
+ const auto& cullFilter = inputs.get1();
+ const auto& boundsFilter = inputs.get2();
+ const auto& antiFrustum = inputs.get3();
auto& outShapes = outputs.edit0();
auto& outBounds = outputs.edit1();
@@ -380,7 +380,7 @@ void CullShapeBounds::run(const RenderContextPointer& renderContext, const Input
if (!cullFilter.selectsNothing() || !boundsFilter.selectsNothing()) {
auto& details = args->_details.edit(_detailType);
Test test(_cullFunctor, args, details, antiFrustum);
- auto scene = args->_scene;
+ auto scene = args->_scene;
for (auto& inItems : inShapes) {
auto key = inItems.first;
@@ -395,26 +395,26 @@ void CullShapeBounds::run(const RenderContextPointer& renderContext, const Input
if (antiFrustum == nullptr) {
for (auto& item : inItems.second) {
if (test.solidAngleTest(item.bound) && test.frustumTest(item.bound)) {
- const auto shapeKey = scene->getItem(item.id).getKey();
- if (cullFilter.test(shapeKey)) {
- outItems->second.emplace_back(item);
- }
- if (boundsFilter.test(shapeKey)) {
- outBounds += item.bound;
- }
+ const auto shapeKey = scene->getItem(item.id).getKey();
+ if (cullFilter.test(shapeKey)) {
+ outItems->second.emplace_back(item);
+ }
+ if (boundsFilter.test(shapeKey)) {
+ outBounds += item.bound;
+ }
}
}
} else {
for (auto& item : inItems.second) {
if (test.solidAngleTest(item.bound) && test.frustumTest(item.bound) && test.antiFrustumTest(item.bound)) {
- const auto shapeKey = scene->getItem(item.id).getKey();
- if (cullFilter.test(shapeKey)) {
- outItems->second.emplace_back(item);
- }
- if (boundsFilter.test(shapeKey)) {
- outBounds += item.bound;
- }
- }
+ const auto shapeKey = scene->getItem(item.id).getKey();
+ if (cullFilter.test(shapeKey)) {
+ outItems->second.emplace_back(item);
+ }
+ if (boundsFilter.test(shapeKey)) {
+ outBounds += item.bound;
+ }
+ }
}
}
details._rendered += (int)outItems->second.size();