diff --git a/KREngine/KREngine/Classes/KRNode.cpp b/KREngine/KREngine/Classes/KRNode.cpp index 6d4c9ad..a0dcd11 100644 --- a/KREngine/KREngine/Classes/KRNode.cpp +++ b/KREngine/KREngine/Classes/KRNode.cpp @@ -160,10 +160,12 @@ KRNode *KRNode::LoadXML(KRScene &scene, tinyxml2::XMLElement *e) { bool KRNode::render(KRCamera *pCamera, KRContext *pContext, KRBoundingVolume &frustrumVolume, KRMat4 &viewMatrix, KRVector3 &cameraPosition, KRVector3 &lightDirection, KRMat4 *pShadowMatrices, GLuint *shadowDepthTextures, int cShadowBuffers, KRNode::RenderPass renderPass) { + /* for(std::vector::iterator itr=m_childNodes.begin(); itr < m_childNodes.end(); ++itr) { KRNode *child = (*itr); child->render(pCamera, pContext, frustrumVolume, viewMatrix, cameraPosition, lightDirection, pShadowMatrices, shadowDepthTextures, cShadowBuffers, renderPass); } + */ return false; } diff --git a/KREngine/KREngine/Classes/KROctree.cpp b/KREngine/KREngine/Classes/KROctree.cpp index 8f2464c..f90de69 100644 --- a/KREngine/KREngine/Classes/KROctree.cpp +++ b/KREngine/KREngine/Classes/KROctree.cpp @@ -82,3 +82,14 @@ void KROctree::shrink() } } } + +KROctreeNode *KROctree::getRootNode() +{ + return m_pRootNode; +} + +std::set &KROctree::getOuterSceneNodes() +{ + return m_outerSceneNodes; +} + diff --git a/KREngine/KREngine/Classes/KROctree.h b/KREngine/KREngine/Classes/KROctree.h index 9ac49a6..5c4b9a4 100644 --- a/KREngine/KREngine/Classes/KROctree.h +++ b/KREngine/KREngine/Classes/KROctree.h @@ -6,11 +6,12 @@ // Copyright (c) 2012 Kearwood Software. All rights reserved. // -#ifndef KRAABBTREE_H -#define KRAABBTREE_H +#ifndef KROCTREE_H +#define KROCTREE_H #import "KREngine-common.h" #include "KROctreeNode.h" +#include "KRMat4.h" class KRNode; @@ -23,11 +24,15 @@ public: void remove(KRNode *pNode); void update(KRNode *pNode); + KROctreeNode *getRootNode(); + std::set &getOuterSceneNodes(); + private: KROctreeNode *m_pRootNode; std::setm_outerSceneNodes; + //std::set visibleMVPs; void shrink(); }; -#endif /* defined(KRAABBTREE_H) */ +#endif /* defined(KROCTREE_H) */ diff --git a/KREngine/KREngine/Classes/KROctreeNode.cpp b/KREngine/KREngine/Classes/KROctreeNode.cpp index 1040f38..f42cf9b 100644 --- a/KREngine/KREngine/Classes/KROctreeNode.cpp +++ b/KREngine/KREngine/Classes/KROctreeNode.cpp @@ -170,3 +170,14 @@ KROctreeNode *KROctreeNode::stripChild() } return NULL; } + + +KROctreeNode **KROctreeNode::getChildren() +{ + return m_children; +} + +std::set &KROctreeNode::getSceneNodes() +{ + return m_sceneNodes; +} diff --git a/KREngine/KREngine/Classes/KROctreeNode.h b/KREngine/KREngine/Classes/KROctreeNode.h index 5bbb67f..79883f6 100644 --- a/KREngine/KREngine/Classes/KROctreeNode.h +++ b/KREngine/KREngine/Classes/KROctreeNode.h @@ -6,8 +6,8 @@ // Copyright (c) 2012 Kearwood Software. All rights reserved. // -#ifndef KRAABBTREENODE_H -#define KRAABBTREENODE_H +#ifndef KROCTREENODE_H +#define KROCTREENODE_H #import "KREngine-common.h" #include "KRVector3.h" @@ -20,6 +20,9 @@ public: KROctreeNode(const KRVector3 &minPoint, const KRVector3 &maxPoint, int iChild, KROctreeNode *pChild); ~KROctreeNode(); + KROctreeNode **getChildren(); + std::set &getSceneNodes(); + void add(KRNode *pNode); void remove(KRNode *pNode); void update(KRNode *pNode); @@ -44,4 +47,4 @@ private: }; -#endif /* defined(KRAABBTREENODE_H) */ +#endif /* defined(KROCTREENODE_H) */ diff --git a/KREngine/KREngine/Classes/KRScene.cpp b/KREngine/KREngine/Classes/KRScene.cpp index 2ea4a7b..06898ed 100644 --- a/KREngine/KREngine/Classes/KRScene.cpp +++ b/KREngine/KREngine/Classes/KRScene.cpp @@ -123,7 +123,25 @@ void KRScene::render(KRCamera *pCamera, KRContext *pContext, KRBoundingVolume &f */ - m_pRootNode->render(pCamera, pContext, frustrumVolume, viewMatrix, cameraPosition, forward_render_light_direction, pShadowMatrices, shadowDepthTextures, cShadowBuffers, renderPass); + //m_pRootNode->render(pCamera, pContext, frustrumVolume, viewMatrix, cameraPosition, forward_render_light_direction, pShadowMatrices, shadowDepthTextures, cShadowBuffers, renderPass); + render(m_nodeTree.getRootNode(), pCamera, pContext, frustrumVolume, viewMatrix, cameraPosition, forward_render_light_direction, pShadowMatrices, shadowDepthTextures, cShadowBuffers, renderPass); + + + for(std::set::iterator itr=m_nodeTree.getOuterSceneNodes().begin(); itr != m_nodeTree.getOuterSceneNodes().end(); itr++) { + (*itr)->render(pCamera, pContext, frustrumVolume, viewMatrix, cameraPosition, lightDirection, pShadowMatrices, shadowDepthTextures, cShadowBuffers, renderPass); + } +} + +void KRScene::render(KROctreeNode *pOctreeNode, KRCamera *pCamera, KRContext *pContext, KRBoundingVolume &frustrumVolume, KRMat4 &viewMatrix, KRVector3 &cameraPosition, KRVector3 &lightDirection, KRMat4 *pShadowMatrices, GLuint *shadowDepthTextures, int cShadowBuffers, KRNode::RenderPass renderPass) +{ + if(pOctreeNode) { + for(std::set::iterator itr=pOctreeNode->getSceneNodes().begin(); itr != pOctreeNode->getSceneNodes().end(); itr++) { + (*itr)->render(pCamera, pContext, frustrumVolume, viewMatrix, cameraPosition, lightDirection, pShadowMatrices, shadowDepthTextures, cShadowBuffers, renderPass); + } + for(int i=0; i<8; i++) { + render(pOctreeNode->getChildren()[i], pCamera, pContext, frustrumVolume, viewMatrix, cameraPosition, lightDirection, pShadowMatrices, shadowDepthTextures, cShadowBuffers, renderPass); + } + } } #endif diff --git a/KREngine/KREngine/Classes/KRScene.h b/KREngine/KREngine/Classes/KRScene.h index 051f537..669bc35 100644 --- a/KREngine/KREngine/Classes/KRScene.h +++ b/KREngine/KREngine/Classes/KRScene.h @@ -66,6 +66,8 @@ public: void render(KRCamera *pCamera, KRContext *pContext, KRBoundingVolume &frustrumVolume, KRMat4 &viewMatrix, KRVector3 &cameraPosition, KRVector3 &lightDirection, KRMat4 *pShadowMatrices, GLuint *shadowDepthTextures, int cShadowBuffers, KRNode::RenderPass renderPass); + void render(KROctreeNode *pOctreeNode, KRCamera *pCamera, KRContext *pContext, KRBoundingVolume &frustrumVolume, KRMat4 &viewMatrix, KRVector3 &cameraPosition, KRVector3 &lightDirection, KRMat4 *pShadowMatrices, GLuint *shadowDepthTextures, int cShadowBuffers, KRNode::RenderPass renderPass); + #endif KRBoundingVolume getExtents(KRContext *pContext);