Work in progress to get the render items beeing tagged correctly for groupCulled

This commit is contained in:
samcake 2018-02-13 17:50:01 -08:00
parent a98f55298b
commit 1d3ae1b187
11 changed files with 57 additions and 36 deletions

View file

@ -1111,7 +1111,7 @@ void MyAvatar::setEnableDebugDrawIKChains(bool isEnabled) {
} }
void MyAvatar::setEnableMeshVisible(bool isEnabled) { void MyAvatar::setEnableMeshVisible(bool isEnabled) {
_skeletonModel->setVisibleInScene(isEnabled, qApp->getMain3DScene(), render::ItemKey::TAG_BITS_NONE); _skeletonModel->setVisibleInScene(isEnabled, qApp->getMain3DScene(), render::ItemKey::TAG_BITS_NONE, true);
} }
void MyAvatar::setEnableInverseKinematics(bool isEnabled) { void MyAvatar::setEnableInverseKinematics(bool isEnabled) {
@ -1461,7 +1461,7 @@ void MyAvatar::clearJointsData() {
void MyAvatar::setSkeletonModelURL(const QUrl& skeletonModelURL) { void MyAvatar::setSkeletonModelURL(const QUrl& skeletonModelURL) {
Avatar::setSkeletonModelURL(skeletonModelURL); Avatar::setSkeletonModelURL(skeletonModelURL);
_skeletonModel->setVisibleInScene(true, qApp->getMain3DScene(), render::ItemKey::TAG_BITS_NONE); _skeletonModel->setVisibleInScene(true, qApp->getMain3DScene(), render::ItemKey::TAG_BITS_NONE, true);
_headBoneSet.clear(); _headBoneSet.clear();
_cauterizationNeedsUpdate = true; _cauterizationNeedsUpdate = true;
saveAvatarUrl(); saveAvatarUrl();
@ -1808,7 +1808,7 @@ void MyAvatar::attach(const QString& modelURL, const QString& jointName,
void MyAvatar::setVisibleInSceneIfReady(Model* model, const render::ScenePointer& scene, bool visible) { void MyAvatar::setVisibleInSceneIfReady(Model* model, const render::ScenePointer& scene, bool visible) {
if (model->isActive() && model->isRenderable()) { if (model->isActive() && model->isRenderable()) {
model->setVisibleInScene(visible, scene, render::ItemKey::TAG_BITS_NONE); model->setVisibleInScene(visible, scene, render::ItemKey::TAG_BITS_NONE, true);
} }
} }
@ -2008,7 +2008,7 @@ void MyAvatar::preDisplaySide(RenderArgs* renderArgs) {
_attachmentData[i].jointName.compare("HeadTop_End", Qt::CaseInsensitive) == 0 || _attachmentData[i].jointName.compare("HeadTop_End", Qt::CaseInsensitive) == 0 ||
_attachmentData[i].jointName.compare("Face", Qt::CaseInsensitive) == 0) { _attachmentData[i].jointName.compare("Face", Qt::CaseInsensitive) == 0) {
_attachmentModels[i]->setVisibleInScene(shouldDrawHead, qApp->getMain3DScene(), _attachmentModels[i]->setVisibleInScene(shouldDrawHead, qApp->getMain3DScene(),
render::ItemKey::TAG_BITS_NONE); render::ItemKey::TAG_BITS_NONE, true);
} }
} }
} }

View file

@ -87,7 +87,7 @@ void ModelOverlay::update(float deltatime) {
if (_visibleDirty) { if (_visibleDirty) {
_visibleDirty = false; _visibleDirty = false;
// don't show overlays in mirrors // don't show overlays in mirrors
_model->setVisibleInScene(getVisible(), scene, render::ItemKey::TAG_BITS_0); _model->setVisibleInScene(getVisible(), scene, render::ItemKey::TAG_BITS_0, false);
} }
if (_drawInFrontDirty) { if (_drawInFrontDirty) {
_drawInFrontDirty = false; _drawInFrontDirty = false;

View file

@ -1343,7 +1343,7 @@ void ModelEntityRenderer::doRenderUpdateSynchronousTyped(const ScenePointer& sce
// FIXME: this seems like it could be optimized if we tracked our last known visible state in // FIXME: this seems like it could be optimized if we tracked our last known visible state in
// the renderable item. As it stands now the model checks it's visible/invisible state // the renderable item. As it stands now the model checks it's visible/invisible state
// so most of the time we don't do anything in this function. // so most of the time we don't do anything in this function.
model->setVisibleInScene(_visible, scene, viewTaskBits); model->setVisibleInScene(_visible, scene, viewTaskBits, false);
} }
// TODO? early exit here when not visible? // TODO? early exit here when not visible?

View file

@ -71,7 +71,7 @@ void MeshPartPayload::updateMaterial(graphics::MaterialPointer drawMaterial) {
_drawMaterial = drawMaterial; _drawMaterial = drawMaterial;
} }
void MeshPartPayload::updateKey(bool isVisible, bool isLayered, uint8_t tagBits) { void MeshPartPayload::updateKey(bool isVisible, bool isLayered, uint8_t tagBits, bool isGroupCulled) {
ItemKey::Builder builder; ItemKey::Builder builder;
builder.withTypeShape(); builder.withTypeShape();
@ -85,6 +85,10 @@ void MeshPartPayload::updateKey(bool isVisible, bool isLayered, uint8_t tagBits)
builder.withLayered(); builder.withLayered();
} }
if (isGroupCulled) {
builder.withMetaCulled();
}
if (_drawMaterial) { if (_drawMaterial) {
auto matKey = _drawMaterial->getKey(); auto matKey = _drawMaterial->getKey();
if (matKey.isTranslucent()) { if (matKey.isTranslucent()) {
@ -403,7 +407,7 @@ void ModelMeshPartPayload::updateTransformForSkinnedMesh(const Transform& render
_worldBound.transform(boundTransform); _worldBound.transform(boundTransform);
} }
void ModelMeshPartPayload::updateKey(bool isVisible, bool isLayered, uint8_t tagBits) { void ModelMeshPartPayload::updateKey(bool isVisible, bool isLayered, uint8_t tagBits, bool isGroupCulled) {
ItemKey::Builder builder; ItemKey::Builder builder;
builder.withTypeShape(); builder.withTypeShape();
@ -417,6 +421,10 @@ void ModelMeshPartPayload::updateKey(bool isVisible, bool isLayered, uint8_t tag
builder.withLayered(); builder.withLayered();
} }
if (isGroupCulled) {
builder.withMetaCulled();
}
if (_isBlendShaped || _isSkinned) { if (_isBlendShaped || _isSkinned) {
builder.withDeformed(); builder.withDeformed();
} }

View file

@ -33,7 +33,7 @@ public:
typedef render::Payload<MeshPartPayload> Payload; typedef render::Payload<MeshPartPayload> Payload;
typedef Payload::DataPointer Pointer; typedef Payload::DataPointer Pointer;
virtual void updateKey(bool isVisible, bool isLayered, uint8_t tagBits); virtual void updateKey(bool isVisible, bool isLayered, uint8_t tagBits, bool isGroupCulled = false);
virtual void updateMeshPart(const std::shared_ptr<const graphics::Mesh>& drawMesh, int partIndex); virtual void updateMeshPart(const std::shared_ptr<const graphics::Mesh>& drawMesh, int partIndex);
@ -99,7 +99,7 @@ public:
using TransformType = glm::mat4; using TransformType = glm::mat4;
#endif #endif
void updateKey(bool isVisible, bool isLayered, uint8_t tagBits) override; void updateKey(bool isVisible, bool isLayered, uint8_t tagBits, bool isGroupCulled = false) override;
void updateClusterBuffer(const std::vector<TransformType>& clusterTransforms); void updateClusterBuffer(const std::vector<TransformType>& clusterTransforms);
void updateTransformForSkinnedMesh(const Transform& renderTransform, const Transform& boundTransform); void updateTransformForSkinnedMesh(const Transform& renderTransform, const Transform& boundTransform);

View file

@ -271,6 +271,7 @@ void Model::updateRenderItems() {
uint8_t viewTagBits = self->getViewTagBits(); uint8_t viewTagBits = self->getViewTagBits();
bool isLayeredInFront = self->isLayeredInFront(); bool isLayeredInFront = self->isLayeredInFront();
bool isLayeredInHUD = self->isLayeredInHUD(); bool isLayeredInHUD = self->isLayeredInHUD();
bool isGroupCulled = self->isGroupCulled();
render::Transaction transaction; render::Transaction transaction;
for (int i = 0; i < (int) self->_modelMeshRenderItemIDs.size(); i++) { for (int i = 0; i < (int) self->_modelMeshRenderItemIDs.size(); i++) {
@ -284,7 +285,7 @@ void Model::updateRenderItems() {
transaction.updateItem<ModelMeshPartPayload>(itemID, [modelTransform, clusterTransforms, transaction.updateItem<ModelMeshPartPayload>(itemID, [modelTransform, clusterTransforms,
invalidatePayloadShapeKey, isWireframe, isVisible, invalidatePayloadShapeKey, isWireframe, isVisible,
viewTagBits, isLayeredInFront, viewTagBits, isLayeredInFront,
isLayeredInHUD](ModelMeshPartPayload& data) { isLayeredInHUD, isGroupCulled](ModelMeshPartPayload& data) {
data.updateClusterBuffer(clusterTransforms); data.updateClusterBuffer(clusterTransforms);
Transform renderTransform = modelTransform; Transform renderTransform = modelTransform;
@ -300,7 +301,7 @@ void Model::updateRenderItems() {
} }
data.updateTransformForSkinnedMesh(renderTransform, modelTransform); data.updateTransformForSkinnedMesh(renderTransform, modelTransform);
data.updateKey(isVisible, isLayeredInFront || isLayeredInHUD, viewTagBits); data.updateKey(isVisible, isLayeredInFront || isLayeredInHUD, viewTagBits, isGroupCulled);
data.setLayer(isLayeredInFront, isLayeredInHUD); data.setLayer(isLayeredInFront, isLayeredInHUD);
data.setShapeKey(invalidatePayloadShapeKey, isWireframe); data.setShapeKey(invalidatePayloadShapeKey, isWireframe);
}); });
@ -684,10 +685,11 @@ void Model::calculateTriangleSets() {
} }
} }
void Model::setVisibleInScene(bool isVisible, const render::ScenePointer& scene, uint8_t viewTagBits) { void Model::setVisibleInScene(bool isVisible, const render::ScenePointer& scene, uint8_t viewTagBits, bool isGroupCulled) {
if (_isVisible != isVisible || _viewTagBits != viewTagBits) { if (_isVisible != isVisible || _viewTagBits != viewTagBits || _isGroupCulled != isGroupCulled) {
_isVisible = isVisible; _isVisible = isVisible;
_viewTagBits = viewTagBits; _viewTagBits = viewTagBits;
_isGroupCulled = isGroupCulled;
bool isLayeredInFront = _isLayeredInFront; bool isLayeredInFront = _isLayeredInFront;
bool isLayeredInHUD = _isLayeredInHUD; bool isLayeredInHUD = _isLayeredInHUD;
@ -695,14 +697,14 @@ void Model::setVisibleInScene(bool isVisible, const render::ScenePointer& scene,
render::Transaction transaction; render::Transaction transaction;
foreach (auto item, _modelMeshRenderItemsMap.keys()) { foreach (auto item, _modelMeshRenderItemsMap.keys()) {
transaction.updateItem<ModelMeshPartPayload>(item, [isVisible, viewTagBits, isLayeredInFront, transaction.updateItem<ModelMeshPartPayload>(item, [isVisible, viewTagBits, isLayeredInFront,
isLayeredInHUD](ModelMeshPartPayload& data) { isLayeredInHUD, isGroupCulled](ModelMeshPartPayload& data) {
data.updateKey(isVisible, isLayeredInFront || isLayeredInHUD, viewTagBits); data.updateKey(isVisible, isLayeredInFront || isLayeredInHUD, viewTagBits, isGroupCulled);
}); });
} }
foreach(auto item, _collisionRenderItemsMap.keys()) { foreach(auto item, _collisionRenderItemsMap.keys()) {
transaction.updateItem<ModelMeshPartPayload>(item, [isVisible, viewTagBits, isLayeredInFront, transaction.updateItem<ModelMeshPartPayload>(item, [isVisible, viewTagBits, isLayeredInFront,
isLayeredInHUD](ModelMeshPartPayload& data) { isLayeredInHUD, isGroupCulled](ModelMeshPartPayload& data) {
data.updateKey(isVisible, isLayeredInFront || isLayeredInHUD, viewTagBits); data.updateKey(isVisible, isLayeredInFront || isLayeredInHUD, viewTagBits, isGroupCulled);
}); });
} }
scene->enqueueTransaction(transaction); scene->enqueueTransaction(transaction);
@ -717,19 +719,20 @@ void Model::setLayeredInFront(bool isLayeredInFront, const render::ScenePointer&
bool isVisible = _isVisible; bool isVisible = _isVisible;
uint8_t viewTagBits = _viewTagBits; uint8_t viewTagBits = _viewTagBits;
bool isLayeredInHUD = _isLayeredInHUD; bool isLayeredInHUD = _isLayeredInHUD;
bool isGroupCulled = _isGroupCulled;
render::Transaction transaction; render::Transaction transaction;
foreach(auto item, _modelMeshRenderItemsMap.keys()) { foreach(auto item, _modelMeshRenderItemsMap.keys()) {
transaction.updateItem<ModelMeshPartPayload>(item, [isVisible, viewTagBits, isLayeredInFront, transaction.updateItem<ModelMeshPartPayload>(item, [isVisible, viewTagBits, isLayeredInFront,
isLayeredInHUD](ModelMeshPartPayload& data) { isLayeredInHUD, isGroupCulled](ModelMeshPartPayload& data) {
data.updateKey(isVisible, isLayeredInFront || isLayeredInHUD, viewTagBits); data.updateKey(isVisible, isLayeredInFront || isLayeredInHUD, viewTagBits, isGroupCulled);
data.setLayer(isLayeredInFront, isLayeredInHUD); data.setLayer(isLayeredInFront, isLayeredInHUD);
}); });
} }
foreach(auto item, _collisionRenderItemsMap.keys()) { foreach(auto item, _collisionRenderItemsMap.keys()) {
transaction.updateItem<ModelMeshPartPayload>(item, [isVisible, viewTagBits, isLayeredInFront, transaction.updateItem<ModelMeshPartPayload>(item, [isVisible, viewTagBits, isLayeredInFront,
isLayeredInHUD](ModelMeshPartPayload& data) { isLayeredInHUD, isGroupCulled](ModelMeshPartPayload& data) {
data.updateKey(isVisible, isLayeredInFront || isLayeredInHUD, viewTagBits); data.updateKey(isVisible, isLayeredInFront || isLayeredInHUD, viewTagBits, isGroupCulled);
data.setLayer(isLayeredInFront, isLayeredInHUD); data.setLayer(isLayeredInFront, isLayeredInHUD);
}); });
} }
@ -744,19 +747,20 @@ void Model::setLayeredInHUD(bool isLayeredInHUD, const render::ScenePointer& sce
bool isVisible = _isVisible; bool isVisible = _isVisible;
uint8_t viewTagBits = _viewTagBits; uint8_t viewTagBits = _viewTagBits;
bool isLayeredInFront = _isLayeredInFront; bool isLayeredInFront = _isLayeredInFront;
bool isGroupCulled = _isGroupCulled;
render::Transaction transaction; render::Transaction transaction;
foreach(auto item, _modelMeshRenderItemsMap.keys()) { foreach(auto item, _modelMeshRenderItemsMap.keys()) {
transaction.updateItem<ModelMeshPartPayload>(item, [isVisible, viewTagBits, isLayeredInFront, transaction.updateItem<ModelMeshPartPayload>(item, [isVisible, viewTagBits, isLayeredInFront,
isLayeredInHUD](ModelMeshPartPayload& data) { isLayeredInHUD, isGroupCulled](ModelMeshPartPayload& data) {
data.updateKey(isVisible, isLayeredInFront || isLayeredInHUD, viewTagBits); data.updateKey(isVisible, isLayeredInFront || isLayeredInHUD, viewTagBits, isGroupCulled);
data.setLayer(isLayeredInFront, isLayeredInHUD); data.setLayer(isLayeredInFront, isLayeredInHUD);
}); });
} }
foreach(auto item, _collisionRenderItemsMap.keys()) { foreach(auto item, _collisionRenderItemsMap.keys()) {
transaction.updateItem<ModelMeshPartPayload>(item, [isVisible, viewTagBits, isLayeredInFront, transaction.updateItem<ModelMeshPartPayload>(item, [isVisible, viewTagBits, isLayeredInFront,
isLayeredInHUD](ModelMeshPartPayload& data) { isLayeredInHUD, isGroupCulled](ModelMeshPartPayload& data) {
data.updateKey(isVisible, isLayeredInFront || isLayeredInHUD, viewTagBits); data.updateKey(isVisible, isLayeredInFront || isLayeredInHUD, viewTagBits, isGroupCulled);
data.setLayer(isLayeredInFront, isLayeredInHUD); data.setLayer(isLayeredInFront, isLayeredInHUD);
}); });
} }

View file

@ -86,7 +86,7 @@ public:
const QUrl& getURL() const { return _url; } const QUrl& getURL() const { return _url; }
// new Scene/Engine rendering support // new Scene/Engine rendering support
void setVisibleInScene(bool isVisible, const render::ScenePointer& scene, uint8_t viewTagBits); void setVisibleInScene(bool isVisible, const render::ScenePointer& scene, uint8_t viewTagBits, bool isGroupCulled);
void setLayeredInFront(bool isLayeredInFront, const render::ScenePointer& scene); void setLayeredInFront(bool isLayeredInFront, const render::ScenePointer& scene);
void setLayeredInHUD(bool isLayeredInHUD, const render::ScenePointer& scene); void setLayeredInHUD(bool isLayeredInHUD, const render::ScenePointer& scene);
bool needsFixupInScene() const; bool needsFixupInScene() const;
@ -109,6 +109,8 @@ public:
bool isLayeredInFront() const { return _isLayeredInFront; } bool isLayeredInFront() const { return _isLayeredInFront; }
bool isLayeredInHUD() const { return _isLayeredInHUD; } bool isLayeredInHUD() const { return _isLayeredInHUD; }
bool isGroupCulled() const { return _isGroupCulled; }
virtual void updateRenderItems(); virtual void updateRenderItems();
void setRenderItemsNeedUpdate(); void setRenderItemsNeedUpdate();
bool getRenderItemsNeedUpdate() { return _renderItemsNeedUpdate; } bool getRenderItemsNeedUpdate() { return _renderItemsNeedUpdate; }
@ -462,6 +464,8 @@ protected:
bool _isLayeredInFront { false }; bool _isLayeredInFront { false };
bool _isLayeredInHUD { false }; bool _isLayeredInHUD { false };
bool _isGroupCulled{ false };
bool shouldInvalidatePayloadShapeKey(int meshIndex); bool shouldInvalidatePayloadShapeKey(int meshIndex);
private: private:

View file

@ -211,13 +211,14 @@ void CullSpatialSelection::run(const RenderContextPointer& renderContext,
outItems.clear(); outItems.clear();
outItems.reserve(inSelection.numItems()); outItems.reserve(inSelection.numItems());
const auto filter = inputs.get1(); const auto srcFilter = inputs.get1();
if (!filter.selectsNothing()) { if (!srcFilter.selectsNothing()) {
// Now get the bound, and auto filter = render::ItemFilter::Builder(srcFilter).withoutMetaCulled().build();
// Now get the bound, and
// filter individually against the _filter // filter individually against the _filter
// visibility cull if partially selected ( octree cell contianing it was partial) // visibility cull if partially selected ( octree cell contianing it was partial)
// distance cull if was a subcell item ( octree cell is way bigger than the item bound itself, so now need to test per item) // distance cull if was a subcell item ( octree cell is way bigger than the item bound itself, so now need to test per item)
if (_skipCulling) { if (_skipCulling) {
// inside & fit items: filter only, culling is disabled // inside & fit items: filter only, culling is disabled
{ {

View file

@ -118,7 +118,12 @@ uint32_t Item::fetchMetaSubItemBounds(ItemBounds& subItemBounds, Scene& scene) c
auto numSubs = fetchMetaSubItems(subItems); auto numSubs = fetchMetaSubItems(subItems);
for (auto id : subItems) { for (auto id : subItems) {
subItemBounds.emplace_back(id, scene.getItem(id).getBound()); auto& item = scene.getItem(id);
if (item.exist()) {
subItemBounds.emplace_back(id, item.getBound());
} else {
numSubs--;
}
} }
return numSubs; return numSubs;
} }

View file

@ -125,6 +125,7 @@ public:
Builder& withShadowCaster() { _flags.set(SHADOW_CASTER); return (*this); } Builder& withShadowCaster() { _flags.set(SHADOW_CASTER); return (*this); }
Builder& withLayered() { _flags.set(LAYERED); return (*this); } Builder& withLayered() { _flags.set(LAYERED); return (*this); }
Builder& withCullGroup() { _flags.set(CULL_GROUP); return (*this); } Builder& withCullGroup() { _flags.set(CULL_GROUP); return (*this); }
Builder& withMetaCulled() { _flags.set(__META_CULLED); return (*this); }
Builder& withTag(Tag tag) { _flags.set(FIRST_TAG_BIT + tag); return (*this); } Builder& withTag(Tag tag) { _flags.set(FIRST_TAG_BIT + tag); return (*this); }
// Set ALL the tags in one call using the Tag bits // Set ALL the tags in one call using the Tag bits
@ -135,9 +136,6 @@ public:
static Builder transparentShape() { return Builder().withTypeShape().withTransparent(); } static Builder transparentShape() { return Builder().withTypeShape().withTransparent(); }
static Builder light() { return Builder().withTypeLight(); } static Builder light() { return Builder().withTypeLight(); }
static Builder background() { return Builder().withViewSpace().withLayered(); } static Builder background() { return Builder().withViewSpace().withLayered(); }
// Not meant to be public, part of the inner item / key / filter system
Builder& __withMetaCulled() { _flags.set(__META_CULLED); return (*this); }
}; };
ItemKey(const Builder& builder) : ItemKey(builder._flags) {} ItemKey(const Builder& builder) : ItemKey(builder._flags) {}
@ -205,6 +203,7 @@ public:
ItemKey::Flags _mask{ 0 }; ItemKey::Flags _mask{ 0 };
public: public:
Builder() {} Builder() {}
Builder(const ItemFilter& srcFilter) : _value(srcFilter._value), _mask(srcFilter._mask) {}
ItemFilter build() const { return ItemFilter(_value, _mask); } ItemFilter build() const { return ItemFilter(_value, _mask); }

View file

@ -22,7 +22,7 @@ void RenderFetchCullSortTask::build(JobModel& task, const Varying& input, Varyin
// CPU jobs: // CPU jobs:
// Fetch and cull the items from the scene // Fetch and cull the items from the scene
const ItemFilter filter = ItemFilter::Builder::visibleWorldItems().withoutLayered().withoutMetaCulled().withTagBits(tagBits, tagMask); const ItemFilter filter = ItemFilter::Builder::visibleWorldItems().withoutLayered().withTagBits(tagBits, tagMask);
const auto spatialFilter = render::Varying(filter); const auto spatialFilter = render::Varying(filter);
const auto fetchInput = FetchSpatialTree::Inputs(filter, glm::ivec2(0,0)).asVarying(); const auto fetchInput = FetchSpatialTree::Inputs(filter, glm::ivec2(0,0)).asVarying();
const auto spatialSelection = task.addJob<FetchSpatialTree>("FetchSceneSelection", fetchInput); const auto spatialSelection = task.addJob<FetchSpatialTree>("FetchSceneSelection", fetchInput);