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();
|
newRemainingOctrees.clear();
|
||||||
newRemainingOctreesTestResults.clear();
|
newRemainingOctreesTestResults.clear();
|
||||||
for (std::vector<KROctreeNode*>::iterator octree_itr = remainingOctrees.begin(); octree_itr != remainingOctrees.end(); octree_itr++) {
|
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++) {
|
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;
|
remainingOctrees = newRemainingOctrees;
|
||||||
remainingOctreesTestResults = newRemainingOctreesTestResults;
|
remainingOctreesTestResults = newRemainingOctreesTestResults;
|
||||||
@@ -170,7 +170,7 @@ void KRScene::render(KRNode::RenderInfo& ri)
|
|||||||
newRemainingOctrees.clear();
|
newRemainingOctrees.clear();
|
||||||
newRemainingOctreesTestResults.clear();
|
newRemainingOctreesTestResults.clear();
|
||||||
for (std::vector<KROctreeNode*>::iterator octree_itr = remainingOctreesTestResultsOnly.begin(); octree_itr != remainingOctreesTestResultsOnly.end(); octree_itr++) {
|
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
|
// 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();
|
unordered_map<AABB, int>& visibleBounds = ri.viewport->getVisibleBounds();
|
||||||
if (pOctreeNode) {
|
if (pOctreeNode) {
|
||||||
|
|
||||||
AABB octreeBounds = pOctreeNode->getBounds();
|
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;
|
bool in_viewport = false;
|
||||||
if (ri.renderPass->getType() == RenderPassType::RENDER_PASS_PRESTREAM) {
|
if (ri.renderPass->getType() == RenderPassType::RENDER_PASS_PRESTREAM) {
|
||||||
// When pre-streaming, objects are streamed in behind and in-front of the camera
|
// 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();
|
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++) {
|
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
|
// 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);
|
// 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();
|
std::set<KRLight*>& getLights();
|
||||||
|
|
||||||
private:
|
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;
|
KRNode* m_pRootNode;
|
||||||
KRLight* m_pFirstLight;
|
KRLight* m_pFirstLight;
|
||||||
|
|||||||
Reference in New Issue
Block a user