Double renderbins for renderables (#2520)

This commit is contained in:
Emma Broman
2023-03-08 10:59:32 +01:00
committed by GitHub
parent 5e7b67e077
commit 4a50c4cbc0
5 changed files with 58 additions and 19 deletions
+11 -2
View File
@@ -224,6 +224,8 @@ void Renderable::update(const UpdateData&) {}
void Renderable::render(const RenderData&, RendererTasks&) {}
void Renderable::renderSecondary(const RenderData&, RendererTasks&) {}
void Renderable::setBoundingSphere(double boundingSphere) {
_boundingSphere = boundingSphere;
}
@@ -267,8 +269,15 @@ void Renderable::setRenderBin(RenderBin bin) {
_renderBin = bin;
}
bool Renderable::matchesRenderBinMask(int binMask) {
return binMask & static_cast<int>(renderBin());
bool Renderable::matchesRenderBinMask(int binMask) const noexcept {
return binMask & static_cast<int>(_renderBin);
}
bool Renderable::matchesSecondaryRenderBin(int binMask) const noexcept {
if (!_secondaryRenderBin.has_value()) {
return false;
}
return binMask & static_cast<int>(*_secondaryRenderBin);
}
void Renderable::setFade(float fade) {
+22 -12
View File
@@ -737,7 +737,7 @@ void SceneGraphNode::render(const RenderData& data, RendererTasks& tasks) {
}
const bool visible = _renderable && _renderable->isVisible() &&
_renderable->isReady() && _renderable->matchesRenderBinMask(data.renderBinMask);
_renderable->isReady();
if (!visible) {
return;
@@ -747,21 +747,31 @@ void SceneGraphNode::render(const RenderData& data, RendererTasks& tasks) {
return;
}
RenderData newData = {
.camera = data.camera,
.time = data.time,
.renderBinMask = data.renderBinMask,
.modelTransform = {
.translation = _worldPositionCached,
.rotation = _worldRotationCached,
.scale = _worldScaleCached
}
};
if (_renderable->matchesSecondaryRenderBin(data.renderBinMask)) {
TracyGpuZone("Render Secondary Bin")
_renderable->renderSecondary(newData, tasks);
}
if (!_renderable->matchesRenderBinMask(data.renderBinMask)) {
return;
}
{
TracyGpuZone("Render")
RenderData newData = {
.camera = data.camera,
.time = data.time,
.renderBinMask = data.renderBinMask,
.modelTransform = {
.translation = _worldPositionCached,
.rotation = _worldRotationCached,
.scale = _worldScaleCached
}
};
_renderable->render(newData, tasks);
if (_computeScreenSpaceValues) {
computeScreenSpaceData(newData);
}