Split KRScene::render into KRScene::render and KRScene::render_occlusionResultsPass
This commit is contained in:
@@ -158,10 +158,10 @@ void KRScene::render(KRNode::RenderInfo& ri)
|
||||
newRemainingOctrees.clear();
|
||||
newRemainingOctreesTestResults.clear();
|
||||
for (std::vector<KROctreeNode*>::iterator octree_itr = remainingOctrees.begin(); octree_itr != remainingOctrees.end(); octree_itr++) {
|
||||
render(ri, resourceRequests, *octree_itr, newRemainingOctrees, newRemainingOctreesTestResults, remainingOctreesTestResultsOnly, false, false);
|
||||
render(ri, resourceRequests, *octree_itr, newRemainingOctrees, newRemainingOctreesTestResults, remainingOctreesTestResultsOnly);
|
||||
}
|
||||
for (std::vector<KROctreeNode*>::iterator octree_itr = remainingOctreesTestResults.begin(); octree_itr != remainingOctreesTestResults.end(); octree_itr++) {
|
||||
render(ri, resourceRequests, *octree_itr, newRemainingOctrees, newRemainingOctreesTestResults, remainingOctreesTestResultsOnly, true, false);
|
||||
render_occlusionResultsPass(ri, *octree_itr, newRemainingOctrees, false);
|
||||
}
|
||||
remainingOctrees = newRemainingOctrees;
|
||||
remainingOctreesTestResults = newRemainingOctreesTestResults;
|
||||
@@ -170,7 +170,7 @@ void KRScene::render(KRNode::RenderInfo& ri)
|
||||
newRemainingOctrees.clear();
|
||||
newRemainingOctreesTestResults.clear();
|
||||
for (std::vector<KROctreeNode*>::iterator octree_itr = remainingOctreesTestResultsOnly.begin(); octree_itr != remainingOctreesTestResultsOnly.end(); octree_itr++) {
|
||||
render(ri, resourceRequests, *octree_itr, newRemainingOctrees, newRemainingOctreesTestResults, remainingOctreesTestResultsOnly, true, true);
|
||||
render_occlusionResultsPass(ri, *octree_itr, newRemainingOctrees, true);
|
||||
}
|
||||
|
||||
// TODO: WIP Refactoring, this will be moved to the streaming system
|
||||
@@ -179,37 +179,13 @@ void KRScene::render(KRNode::RenderInfo& ri)
|
||||
}
|
||||
}
|
||||
|
||||
void KRScene::render(KRNode::RenderInfo& ri, std::list<KRResourceRequest>& resourceRequests, KROctreeNode* pOctreeNode, std::vector<KROctreeNode*>& remainingOctrees, std::vector<KROctreeNode*>& remainingOctreesTestResults, std::vector<KROctreeNode*>& remainingOctreesTestResultsOnly, bool bOcclusionResultsPass, bool bOcclusionTestResultsOnly)
|
||||
void KRScene::render(KRNode::RenderInfo& ri, std::list<KRResourceRequest>& resourceRequests, KROctreeNode* pOctreeNode, std::vector<KROctreeNode*>& remainingOctrees, std::vector<KROctreeNode*>& remainingOctreesTestResults, std::vector<KROctreeNode*>& remainingOctreesTestResultsOnly)
|
||||
{
|
||||
unordered_map<AABB, int>& visibleBounds = ri.viewport->getVisibleBounds();
|
||||
if (pOctreeNode) {
|
||||
|
||||
AABB octreeBounds = pOctreeNode->getBounds();
|
||||
|
||||
if (bOcclusionResultsPass) {
|
||||
// ----====---- Occlusion results pass ----====----
|
||||
if (pOctreeNode->m_occlusionTested) {
|
||||
int params = 0;
|
||||
GLDEBUG(glGetQueryObjectuivEXT(pOctreeNode->m_occlusionQuery, GL_QUERY_RESULT_EXT, ¶ms));
|
||||
|
||||
if (params) {
|
||||
// Record the frame number that the test has passed on
|
||||
visibleBounds[octreeBounds] = getContext().getCurrentFrame();
|
||||
|
||||
if (!bOcclusionTestResultsOnly) {
|
||||
// Schedule a pass to perform the rendering
|
||||
remainingOctrees.push_back(pOctreeNode);
|
||||
}
|
||||
} else {
|
||||
// Record -1 to indicate that the visibility test had failed
|
||||
visibleBounds[octreeBounds] = -1;
|
||||
}
|
||||
|
||||
GLDEBUG(glDeleteQueriesEXT(1, &pOctreeNode->m_occlusionQuery));
|
||||
pOctreeNode->m_occlusionTested = false;
|
||||
pOctreeNode->m_occlusionQuery = 0;
|
||||
}
|
||||
} else {
|
||||
bool in_viewport = false;
|
||||
if (ri.renderPass->getType() == RenderPassType::RENDER_PASS_PRESTREAM) {
|
||||
// When pre-streaming, objects are streamed in behind and in-front of the camera
|
||||
@@ -360,7 +336,7 @@ void KRScene::render(KRNode::RenderInfo& ri, std::list<KRResourceRequest>& resou
|
||||
const int* childOctreeOrder = ri.renderPass->getType() == RenderPassType::RENDER_PASS_FORWARD_TRANSPARENT || ri.renderPass->getType() == RenderPassType::RENDER_PASS_ADDITIVE_PARTICLES || ri.renderPass->getType() == RenderPassType::RENDER_PASS_VOLUMETRIC_EFFECTS_ADDITIVE ? ri.viewport->getBackToFrontOrder() : ri.viewport->getFrontToBackOrder();
|
||||
|
||||
for (int i = 0; i < 8; i++) {
|
||||
render(ri, resourceRequests, pOctreeNode->getChildren()[childOctreeOrder[i]], remainingOctrees, remainingOctreesTestResults, remainingOctreesTestResultsOnly, false, false);
|
||||
render(ri, resourceRequests, pOctreeNode->getChildren()[childOctreeOrder[i]], remainingOctrees, remainingOctreesTestResults, remainingOctreesTestResultsOnly);
|
||||
}
|
||||
|
||||
// Remove lights added at this octree level from the stack
|
||||
@@ -377,6 +353,37 @@ void KRScene::render(KRNode::RenderInfo& ri, std::list<KRResourceRequest>& resou
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
void KRScene::render_occlusionResultsPass(KRNode::RenderInfo& ri, KROctreeNode* pOctreeNode, std::vector<KROctreeNode*>& remainingOctrees, bool bOcclusionTestResultsOnly)
|
||||
{
|
||||
unordered_map<AABB, int>& visibleBounds = ri.viewport->getVisibleBounds();
|
||||
if (pOctreeNode) {
|
||||
|
||||
AABB octreeBounds = pOctreeNode->getBounds();
|
||||
|
||||
// ----====---- Occlusion results pass ----====----
|
||||
if (pOctreeNode->m_occlusionTested) {
|
||||
int params = 0;
|
||||
GLDEBUG(glGetQueryObjectuivEXT(pOctreeNode->m_occlusionQuery, GL_QUERY_RESULT_EXT, ¶ms));
|
||||
|
||||
if (params) {
|
||||
// Record the frame number that the test has passed on
|
||||
visibleBounds[octreeBounds] = getContext().getCurrentFrame();
|
||||
|
||||
if (!bOcclusionTestResultsOnly) {
|
||||
// Schedule a pass to perform the rendering
|
||||
remainingOctrees.push_back(pOctreeNode);
|
||||
}
|
||||
} else {
|
||||
// Record -1 to indicate that the visibility test had failed
|
||||
visibleBounds[octreeBounds] = -1;
|
||||
}
|
||||
|
||||
GLDEBUG(glDeleteQueriesEXT(1, &pOctreeNode->m_occlusionQuery));
|
||||
pOctreeNode->m_occlusionTested = false;
|
||||
pOctreeNode->m_occlusionQuery = 0;
|
||||
}
|
||||
}
|
||||
// fprintf(stderr, "Octree culled: (%f, %f, %f) - (%f, %f, %f)\n", pOctreeNode->getBounds().min.x, pOctreeNode->getBounds().min.y, pOctreeNode->getBounds().min.z, pOctreeNode->getBounds().max.x, pOctreeNode->getBounds().max.y, pOctreeNode->getBounds().max.z);
|
||||
}
|
||||
|
||||
@@ -92,7 +92,9 @@ public:
|
||||
std::set<KRLight*>& getLights();
|
||||
|
||||
private:
|
||||
void render(KRNode::RenderInfo& ri, std::list<KRResourceRequest>& resourceRequests, KROctreeNode* pOctreeNode, std::vector<KROctreeNode*>& remainingOctrees, std::vector<KROctreeNode*>& remainingOctreesTestResults, std::vector<KROctreeNode*>& remainingOctreesTestResultsOnly, bool bOcclusionResultsPass, bool bOcclusionTestResultsOnly);
|
||||
void render(KRNode::RenderInfo& ri, std::list<KRResourceRequest>& resourceRequests, KROctreeNode* pOctreeNode, std::vector<KROctreeNode*>& remainingOctrees, std::vector<KROctreeNode*>& remainingOctreesTestResults, std::vector<KROctreeNode*>& remainingOctreesTestResultsOnly);
|
||||
void render_occlusionResultsPass(KRNode::RenderInfo& ri, KROctreeNode* pOctreeNode, std::vector<KROctreeNode*>& remainingOctrees, bool bOcclusionTestResultsOnly);
|
||||
|
||||
|
||||
KRNode* m_pRootNode;
|
||||
KRLight* m_pFirstLight;
|
||||
|
||||
Reference in New Issue
Block a user