Changeset 1183 for GTP/trunk


Ignore:
Timestamp:
08/04/06 17:38:52 (18 years ago)
Author:
szydlowski
Message:

occlusion queries in kdtree scene manager working, but performance issues
many features still not implemented (e.g., visualization)

Location:
GTP/trunk
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • GTP/trunk/App/Demos/Vis/KdTreeDemo/OGRE/include/TestKdTreeAppListener.h

    r1177 r1183  
    5050    Real mMoveSpeed; 
    5151    Degree mRotateSpeed; 
    52     Overlay* mDebugOverlay; 
    53         Overlay* mKdTreeOverlay; 
    5452        Real mRotationPeriod; 
    5553        bool mShowTree; 
    5654        bool mFreeMove; 
    5755 
     56        Real mDelayedQueriesIssued; 
     57        Real mDelayedTraversedNodes; 
     58 
    5859        int mSeqNum; 
     60 
     61        Overlay* mDebugOverlay; 
     62        Overlay* mKdTreeOverlay; 
     63 
     64        OverlayElement *mKdTreeMaxDepthInfo; 
     65        OverlayElement *mKTInfo; 
     66        OverlayElement *mKIInfo; 
     67        OverlayElement *mHighlightLevelInfo; 
     68        OverlayElement *mBuildMethodInfo; 
     69        OverlayElement *mRenderMethodInfo; 
     70        OverlayElement *mMovementInfo; 
     71 
     72        OverlayElement *mFrustumCulledNodesInfo; 
     73        OverlayElement *mQueryCulledNodesInfo; 
     74        OverlayElement *mTraversedNodesInfo; 
     75        OverlayElement *mHierarchyNodesInfo; 
     76        OverlayElement *mRenderedNodesInfo; 
     77        OverlayElement *mObjectsCountInfo; 
     78        OverlayElement *mQueriesIssuedInfo; 
    5979 
    6080    void updateStats(void) 
    6181    { 
     82                static unsigned int opt = 0; 
     83                static char str[100]; 
     84 
    6285        static String currFps = "Current FPS: "; 
    6386        static String avgFps = "Average FPS: "; 
     
    7699 
    77100            guiAvg->setCaption(avgFps + StringConverter::toString(stats.avgFPS)); 
    78             guiCurr->setCaption(currFps + StringConverter::toString(stats.lastFPS)); 
     101            guiCurr->setCaption(currFps + StringConverter::toString((int)stats.lastFPS)); 
    79102            guiBest->setCaption(bestFps + StringConverter::toString(stats.bestFPS) 
    80103                +" "+StringConverter::toString(stats.bestFrameTime)+" ms"); 
     
    87110            OverlayElement* guiDbg = OverlayManager::getSingleton().getOverlayElement("Core/DebugText"); 
    88111            guiDbg->setCaption(mWindow->getDebugText()); 
     112 
     113 
     114                        //-- culling stats 
     115                        mSceneMgr->getOption("NumFrustumCulledNodes", &opt); sprintf(str,": %d", opt);  
     116                        mFrustumCulledNodesInfo->setCaption(str); 
     117 
     118                        mSceneMgr->getOption("NumQueryCulledNodes", &opt); sprintf(str,": %d", opt);  
     119                        mQueryCulledNodesInfo->setCaption(str); 
     120 
     121                        mSceneMgr->getOption("NumHierarchyNodes", &opt); sprintf(str,": %d", opt);  
     122                        mHierarchyNodesInfo->setCaption(str); 
     123 
     124                        mSceneMgr->getOption("NumRenderedNodes", &opt); sprintf(str,": %d", opt);  
     125                        mRenderedNodesInfo->setCaption(str); 
     126 
     127                        // take old value into account in order to create no sudden changes 
     128                        mSceneMgr->getOption("NumQueriesIssued", &opt);  
     129                        mDelayedQueriesIssued = mDelayedQueriesIssued * 0.8 + (float)opt * 0.2f; 
     130                        sprintf(str,": %d", (int)mDelayedQueriesIssued);  
     131                        mQueriesIssuedInfo->setCaption(str); 
     132 
     133                        mSceneMgr->getOption("NumTraversedNodes", &opt);  
     134                        mDelayedTraversedNodes = mDelayedTraversedNodes * 0.8 + (float)opt * 0.2f; 
     135                        sprintf(str,": %d", (int)mDelayedTraversedNodes);  
     136                        mTraversedNodesInfo->setCaption(str); 
    89137        } 
    90138        catch(...) 
     
    95143 
    96144public: 
     145 
     146        // visualization modes for scene nodes 
     147        enum  
     148        { 
     149                NODEVIZ_NONE,  
     150                NODEVIZ_RENDER_NODES,  
     151                NODEVIZ_RENDER_NODES_AND_CONTENT,  
     152                NODEVIZ_MODES_NUM 
     153        }; 
    97154 
    98155    // Constructor takes a RenderWindow because it uses that to determine input context 
     
    128185                mCullTransVec = Vector3::ZERO; 
    129186                mSeqNum = 0; 
     187 
     188                mDelayedQueriesIssued = 0.0; 
     189                mDelayedTraversedNodes = 0.0; 
    130190 
    131191                mCamera = sm->getCamera("PlayerCam"); 
     
    151211 
    152212                initKdTreeOverlay(); 
     213                initStatsOverlay(); 
    153214 
    154215        showDebugOverlay(true); 
     
    166227    } 
    167228 
     229        //----------------------------------------------------------------------- 
     230        void initOverlayElement(OverlayElement **elInfo, String ext,  
     231                String name, int top, String caption) 
     232        { 
     233                OverlayElement *el =  
     234                        OverlayManager::getSingleton().getOverlayElement(ext + name); 
     235 
     236                (*elInfo) = OverlayManager::getSingleton().getOverlayElement(ext + name + "Info"); 
     237                (*elInfo)->setCaption(caption); 
     238 
     239                el->setTop(top); 
     240                (*elInfo)->setTop(top); 
     241        } 
     242        //----------------------------------------------------------------------- 
     243        void initStatsOverlay() 
     244        { 
     245                const int border_height = 10; 
     246                const int vert_space = 15; 
     247 
     248                //-- visibility culling stats overlay 
     249                int top = border_height; 
     250 
     251                String ext = "KdTree/Visibility/"; 
     252 
     253                initOverlayElement(&mFrustumCulledNodesInfo, ext, "FrustumCulledNodes", top, ": 0"); top += vert_space; 
     254                initOverlayElement(&mQueryCulledNodesInfo, ext, "QueryCulledNodes", top, ": 0"); top += vert_space; 
     255                initOverlayElement(&mTraversedNodesInfo, ext, "TraversedNodes", top, ": 0"); top += vert_space; 
     256                initOverlayElement(&mHierarchyNodesInfo, ext, "HierarchyNodes", top, ": 0"); top += vert_space; 
     257                initOverlayElement(&mRenderedNodesInfo, ext, "RenderedNodes", top, ": 0"); top += vert_space; 
     258                initOverlayElement(&mObjectsCountInfo, ext, "ObjectsCount", top, ": 0"); top += vert_space; 
     259                initOverlayElement(&mQueriesIssuedInfo, ext, "QueriesIssued", top, ": 0"); top += vert_space; 
     260 
     261                OverlayElement *visPanel = OverlayManager::getSingleton(). 
     262                        getOverlayElement("KdTree/VisibilityStatsPanel"); 
     263 
     264                visPanel->setHeight(top + border_height); 
     265        } 
     266        //----------------------------------------------------------------------- 
    168267        void initKdTreeOverlay() 
    169268        { 
    170                 String na = " N/A"; 
    171                 String value; 
     269                const int border_height = 10; 
     270                const int vert_space = 15; 
     271                const String na = ": N/A"; 
     272                String sMD, sKT, sKI, sHL, sBM, sRM, sFM; 
     273 
     274                int top = border_height; 
     275 
     276                String ext = "KdTree/"; 
    172277 
    173278                int maxd; 
    174279                if (mSceneMgr->getOption("KdTreeMaxDepth", &maxd)) 
    175                         value = " " + StringConverter::toString(maxd); 
     280                        sMD = ": " + StringConverter::toString(maxd); 
    176281                else 
    177                         value = na; 
    178                 String caption = OverlayManager::getSingleton().getOverlayElement("KdTree/Depth")->getCaption(); 
    179                 OverlayManager::getSingleton().getOverlayElement("KdTree/Depth")->setCaption(caption + value); 
     282                        sMD = na; 
    180283 
    181284                Real kt; 
    182285                if (mSceneMgr->getOption("KT", &kt)) 
    183                         value = " " + StringConverter::toString(kt); 
     286                        sKT = ": " + StringConverter::toString(kt); 
    184287                else 
    185                         value = na; 
    186                 caption = OverlayManager::getSingleton().getOverlayElement("KdTree/KT")->getCaption(); 
    187                 OverlayManager::getSingleton().getOverlayElement("KdTree/KT")->setCaption(caption + value); 
     288                        sKT = na; 
    188289 
    189290                Real ki; 
    190291                if (mSceneMgr->getOption("KI", &ki)) 
    191                         value = " " + StringConverter::toString(ki); 
     292                        sKI = ": " + StringConverter::toString(ki); 
    192293                else 
    193                         value = na; 
    194                 caption = OverlayManager::getSingleton().getOverlayElement("KdTree/KI")->getCaption(); 
    195                 OverlayManager::getSingleton().getOverlayElement("KdTree/KI")->setCaption(caption + value); 
     294                        sKI = na; 
    196295 
    197296                int hl; 
    198297                if (mSceneMgr->getOption("HighlightLevel", &hl)) 
    199                         value = " " + StringConverter::toString(hl); 
     298                        sHL = ": " + StringConverter::toString(hl); 
    200299                else 
    201                         value = na; 
     300                        sHL = na; 
    202301                if (!mShowTree) 
    203                         value = " off"; 
    204                 caption = OverlayManager::getSingleton().getOverlayElement("KdTree/Highlight")->getCaption(); 
    205                 OverlayManager::getSingleton().getOverlayElement("KdTree/Highlight")->setCaption(caption + value); 
     302                        sHL = ": off"; 
    206303 
    207304                String bm; 
    208305                if (mSceneMgr->getOption("BuildMethod", &bm)) 
    209                         value = " " + bm; 
     306                        sBM = ": " + bm; 
    210307                else 
    211                         value = na; 
    212                 caption = OverlayManager::getSingleton().getOverlayElement("KdTree/BuildMethod")->getCaption(); 
    213                 OverlayManager::getSingleton().getOverlayElement("KdTree/BuildMethod")->setCaption(caption + value); 
     308                        sBM = na; 
    214309 
    215310                String rm; 
     
    217312                { 
    218313                        if (rm == "INT") 
    219                                 value = " Internal Frustum Culling"; 
     314                                sRM = ": Internal Frustum Culling"; 
    220315                        else if (rm == "VFC") 
    221                                 value = " View Frustum Culling"; 
     316                                sRM = ": View Frustum Culling"; 
    222317                        else if (rm == "SWC") 
    223                                 value = " Stop and Wait Culling"; 
     318                                sRM = ": Stop and Wait Culling"; 
    224319                        else if (rm == "CHC") 
    225                                 value = " Coherent Hierarchical Culling"; 
     320                                sRM = ": Coherent Hierarchical Culling"; 
    226321                        else 
    227                                 value = na; 
     322                                sRM = na; 
    228323                } 
    229324                else 
    230                         value = na; 
    231                 caption = OverlayManager::getSingleton().getOverlayElement("KdTree/RenderMethod")->getCaption(); 
    232                 OverlayManager::getSingleton().getOverlayElement("KdTree/RenderMethod")->setCaption(caption + value); 
    233  
    234                 value = na; 
     325                        sRM = na; 
     326 
     327                sFM = na; 
    235328                if (mFreeMove) 
    236                         value = " Free"; 
     329                        sFM = ": Free"; 
    237330                else 
    238                         value = " Ground"; 
    239                 caption = OverlayManager::getSingleton().getOverlayElement("KdTree/Movement")->getCaption(); 
    240                 OverlayManager::getSingleton().getOverlayElement("KdTree/Movement")->setCaption(caption + value); 
     331                        sFM = ": Ground"; 
     332 
     333                initOverlayElement(&mRenderMethodInfo, ext, "RenderMethod", top, sRM); top += vert_space; 
     334                initOverlayElement(&mBuildMethodInfo, ext, "BuildMethod", top, sBM); top += vert_space; 
     335                initOverlayElement(&mKdTreeMaxDepthInfo, ext, "KdTreeMaxDepth", top, sMD); top += vert_space; 
     336                initOverlayElement(&mHighlightLevelInfo, ext, "HighlightLevel", top, sHL); top += vert_space; 
     337                initOverlayElement(&mKTInfo, ext, "KT", top, sKT); top += vert_space; 
     338                initOverlayElement(&mKIInfo, ext, "KI", top, sKI); top += vert_space; 
     339                initOverlayElement(&mMovementInfo, ext, "Movement", top, sFM); top += vert_space; 
     340 
     341                OverlayElement *visPanel = OverlayManager::getSingleton(). 
     342                        getOverlayElement("KdTree/OptionsPanel"); 
     343 
     344                visPanel->setHeight(top + border_height); 
    241345        } 
    242346 
    243         void toggleCullCamera() 
     347        void showDebugOverlay(bool show) 
    244348        { 
    245                 mCullCamera = !mCullCamera; 
    246                 int zorder = 2;  
    247                 if (mCullCamera) 
    248                 { 
    249                         Viewport* tvp = mWindow->addViewport(mTopCam,zorder,0.66,0.66,0.34,0.34); 
    250                         tvp->setBackgroundColour(ColourValue(1.0, 0.0, 0.0)); 
    251                         tvp->setOverlaysEnabled(false); 
    252  
    253                         mTopCam->setAspectRatio( 
    254                                 Real(tvp->getActualWidth())/Real(tvp->getActualHeight())); 
     349                if (mDebugOverlay) 
     350                { 
     351                        if (show) 
     352                        { 
     353                                mDebugOverlay->show(); 
     354                                mKdTreeOverlay->show(); 
     355                        } 
     356                        else 
     357                        { 
     358                                mDebugOverlay->hide(); 
     359                                mKdTreeOverlay->hide(); 
     360                        } 
     361                } 
     362        } 
     363 
     364        void toggleVizCamera() 
     365        { 
     366                static const int zorder = 10;  
     367                static nodeVizMode = 0; 
     368 
     369                nodeVizMode = (nodeVizMode + 1) % NODEVIZ_MODES_NUM; 
     370 
     371                if (nodeVizMode != 0) 
     372                { 
     373                        if (!mCullCamera) 
     374                        { 
     375                                Viewport* tvp = mWindow->addViewport(mTopCam,zorder,0.66,0.66,0.34,0.34); 
     376                                tvp->setBackgroundColour(ColourValue(1.0, 0.0, 0.0)); 
     377                                tvp->setOverlaysEnabled(false); 
     378 
     379                                mTopCam->setAspectRatio( 
     380                                        Real(tvp->getActualWidth())/Real(tvp->getActualHeight())); 
     381                                mCullCamera = true; 
     382                                mSceneMgr->setOption("VisualizeCulledNodes", &mCullCamera); 
     383                        } 
     384 
     385                        bool renderNodesForViz = (nodeVizMode == NODEVIZ_RENDER_NODES) ||  
     386                                (nodeVizMode == NODEVIZ_RENDER_NODES_AND_CONTENT); 
     387                        bool renderNodesContentForViz = (nodeVizMode == NODEVIZ_RENDER_NODES_AND_CONTENT); 
     388 
     389                        mSceneMgr->setOption("RenderNodesForViz", &renderNodesForViz); 
     390                        mSceneMgr->setOption("RenderNodesContentForViz", &renderNodesContentForViz); 
    255391                } 
    256392                else 
    257393                { 
    258394                        mWindow->removeViewport(zorder); 
     395                        mCullCamera = false; 
     396                        mSceneMgr->setOption("VisualizeCulledNodes", &mCullCamera); 
    259397                } 
    260398        } 
     
    288426                } 
    289427 
    290                 // stuff for the kdtree overlay 
    291                 static String sRM = "[SPACE] Algorithm: "; 
    292                 static String sBM = "[X] Build Method: "; 
    293                 static String sMaxDepth = "[1][2] Max Tree Depth: "; 
    294                 static String sHL = "[3][4] Highlight: "; 
    295                 static String sKT = "[5][6] KT: "; 
    296                 static String sKI = "[7][8] KI: "; 
    297                 static String sMov = "[Q] Movement: "; 
     428                // stuff for the overlay 
     429                static String sNA = ": N/A"; 
    298430 
    299431                static String bmOptions[] = { "Recursive", "PriorityQueue" }; 
     432                static String bmOptionCaptions[] = { ": Recursive", ": PriorityQueue" }; 
    300433                static int bmOptionsSize = sizeof(bmOptions) / sizeof(String); 
    301434                static int bmCurrent = 0; 
     
    305438                static String rmOptionCaptions[] = 
    306439                { 
    307                         "Internal Frustum Culling", 
    308                         "View Frustum Culling",  
    309                         "Stop and Wait Culling", 
    310                         "Coherent Hierarchical Culling" 
     440                        ": Internal Frustum Culling", 
     441                        ": View Frustum Culling",  
     442                        ": Stop and Wait Culling", 
     443                        ": Coherent Hierarchical Culling" 
    311444                }; 
    312445                static int rmOptionsSize = sizeof(rmOptions) / sizeof (String); 
     
    325458                                if (mSceneMgr->setOption("KdTreeMaxDepth", &currdepth)) 
    326459                                { 
    327                                         OverlayManager::getSingleton().getOverlayElement("KdTree/Depth")->setCaption(sMaxDepth + StringConverter::toString(currdepth)); 
     460                                        mKdTreeMaxDepthInfo->setCaption(": " + StringConverter::toString(currdepth)); 
    328461                                        int hl; 
    329462                                        if (mSceneMgr->getOption("HighlightLevel", &hl)) 
    330                                                 OverlayManager::getSingleton().getOverlayElement("KdTree/Highlight")->setCaption(sHL + StringConverter::toString(hl)); 
     463                                                mHighlightLevelInfo->setCaption(": " + StringConverter::toString(hl)); 
    331464                                        else 
    332                                                 OverlayManager::getSingleton().getOverlayElement("KdTree/Highlight")->setCaption(sHL + "N/A"); 
     465                                                mHighlightLevelInfo->setCaption(sNA); 
    333466                                } 
    334467                        } 
    335468                        else 
    336469                        { 
    337                                 OverlayManager::getSingleton().getOverlayElement("KdTree/Depth")->setCaption(sMaxDepth + "N/A"); 
    338                                 OverlayManager::getSingleton().getOverlayElement("KdTree/Highlight")->setCaption(sHL + "N/A"); 
     470                                mKdTreeMaxDepthInfo->setCaption(sNA); 
     471                                mHighlightLevelInfo->setCaption(sNA); 
    339472                        } 
    340473 
    341474                        if (!mShowTree) 
    342                                 OverlayManager::getSingleton().getOverlayElement("KdTree/Highlight")->setCaption(sHL + "off"); 
     475                                mHighlightLevelInfo->setCaption(": off"); 
    343476 
    344477                        mTimeUntilNextToggle = 0.2; 
     
    356489 
    357490                                if (mSceneMgr->setOption("HighlightLevel", &hl)) 
    358                                         OverlayManager::getSingleton().getOverlayElement("KdTree/Highlight")->setCaption(sHL + StringConverter::toString(hl)); 
     491                                        mHighlightLevelInfo->setCaption(": " + StringConverter::toString(hl)); 
    359492                        } 
    360493                        else 
    361494                        { 
    362                                 OverlayManager::getSingleton().getOverlayElement("KdTree/Highlight")->setCaption(sHL + "N/A"); 
     495                                mHighlightLevelInfo->setCaption(sNA); 
    363496                        } 
    364497 
    365498                        if (!mShowTree) 
    366                                 OverlayManager::getSingleton().getOverlayElement("KdTree/Highlight")->setCaption(sHL + "off"); 
     499                                mHighlightLevelInfo->setCaption(": off"); 
    367500 
    368501                        mTimeUntilNextToggle = 0.2; 
     
    384517                         
    385518                                if (mSceneMgr->setOption("KT", &kt)) 
    386                                         OverlayManager::getSingleton().getOverlayElement("KdTree/KT")->setCaption(sKT + StringConverter::toString(kt)); 
     519                                        mKTInfo->setCaption(": " + StringConverter::toString(kt)); 
    387520                        } 
    388521                        else 
    389522                        { 
    390                                 OverlayManager::getSingleton().getOverlayElement("KdTree/KT")->setCaption(sKT + "N/A"); 
     523                                mKTInfo->setCaption(sNA); 
    391524                        } 
    392525 
     
    408541 
    409542                                if (mSceneMgr->setOption("KI", &ki)) 
    410                                         OverlayManager::getSingleton().getOverlayElement("KdTree/KI")->setCaption(sKI + StringConverter::toString(ki)); 
     543                                        mKIInfo->setCaption(": " + StringConverter::toString(ki)); 
    411544                        } 
    412545                        else 
    413546                        { 
    414                                 OverlayManager::getSingleton().getOverlayElement("KdTree/KI")->setCaption(sKI + "N/A"); 
     547                                mKIInfo->setCaption(sNA); 
    415548                        } 
    416549 
     
    423556                        if (mSceneMgr->getOption("BuildMethod", &bm)) 
    424557                        { 
     558                                for (int idx = 0; idx < bmOptionsSize; idx++) 
     559                                        if (bmOptions[idx] == bm) 
     560                                                bmCurrent = idx; 
    425561                                bmCurrent = (bmCurrent + 1) % bmOptionsSize; 
    426562                                if (mSceneMgr->setOption("BuildMethod", &bmOptions[bmCurrent])) 
    427                                         OverlayManager::getSingleton().getOverlayElement("KdTree/BuildMethod")->setCaption(sBM + bmOptions[bmCurrent]); 
     563                                        mBuildMethodInfo->setCaption(bmOptionCaptions[bmCurrent]); 
    428564                        } 
    429565                        else 
    430566                        { 
    431                                 OverlayManager::getSingleton().getOverlayElement("KdTree/BuildMethod")->setCaption(sBM + "N/A"); 
     567                                mBuildMethodInfo->setCaption(sNA); 
    432568                        } 
    433569 
     
    440576                        if (mSceneMgr->getOption("RenderMethod", &rm)) 
    441577                        { 
     578                                for (int idx = 0; idx < rmOptionsSize; idx++) 
     579                                        if (rmOptions[idx] == rm) 
     580                                                rmCurrent = idx; 
    442581                                rmCurrent = (rmCurrent + 1) % rmOptionsSize; 
    443582                                if (mSceneMgr->setOption("RenderMethod", &rmOptions[rmCurrent])) 
    444                                         OverlayManager::getSingleton().getOverlayElement("KdTree/RenderMethod")->setCaption(sRM + rmOptionCaptions[rmCurrent]); 
     583                                        mRenderMethodInfo->setCaption(rmOptionCaptions[rmCurrent]); 
    445584                        } 
    446585                        else 
    447586                        { 
    448                                 OverlayManager::getSingleton().getOverlayElement("KdTree/RenderMethod")->setCaption(sRM + "N/A"); 
     587                                mRenderMethodInfo->setCaption(sNA); 
    449588                        } 
    450589 
     
    457596                        String move = "N/A"; 
    458597                        if (mFreeMove) 
    459                                 move = "Free"; 
     598                                move = ": Free"; 
    460599                        else 
    461                                 move = "Ground"; 
    462  
    463                         OverlayManager::getSingleton().getOverlayElement("KdTree/Movement")->setCaption(sMov + move); 
     600                                move = ": Ground"; 
     601 
     602                        mMovementInfo->setCaption(move); 
    464603 
    465604                        mTimeUntilNextToggle = 0.5; 
     
    503642                } 
    504643 
    505                 if (mInputDevice->isKeyDown(KC_Y) && mTimeUntilNextToggle <= 0) 
     644                if (mInputDevice->isKeyDown(KC_O) && mTimeUntilNextToggle <= 0) 
    506645                { 
    507646                        LogManager::getSingleton().logMessage("############## Camera Position:"); 
     
    522661                if (mInputDevice->isKeyDown(KC_C) && mTimeUntilNextToggle <= 0) 
    523662                { 
    524                         toggleCullCamera(); 
     663                        toggleVizCamera(); 
    525664                        mTimeUntilNextToggle = 0.5; 
    526665                } 
     
    544683 
    545684                        if (!mShowTree) 
    546                                 OverlayManager::getSingleton().getOverlayElement("KdTree/Highlight")->setCaption(sHL + "off"); 
     685                                mHighlightLevelInfo->setCaption(": off"); 
    547686                        else 
    548687                        { 
    549688                                int hl; 
    550689                                if (mSceneMgr->getOption("HighlightLevel", &hl)) 
    551                                         OverlayManager::getSingleton().getOverlayElement("KdTree/Highlight")->setCaption(sHL + StringConverter::toString(hl)); 
     690                                        mHighlightLevelInfo->setCaption(": " + StringConverter::toString(hl)); 
    552691                                else 
    553                                         OverlayManager::getSingleton().getOverlayElement("KdTree/Highlight")->setCaption(sHL + "N/A"); 
     692                                        mHighlightLevelInfo->setCaption(sNA); 
    554693                        } 
    555694                         
     
    563702                        toggleShowAllBoxes = !toggleShowAllBoxes; 
    564703                        mSceneMgr->setOption("ShowAllBoxes", &toggleShowAllBoxes); 
     704                        mTimeUntilNextToggle = 0.2; 
     705                } 
     706 
     707                if (mInputDevice->isKeyDown(KC_H) && mTimeUntilNextToggle <= 0) 
     708                { 
     709                        bool toggleShow; 
     710                        mSceneMgr->getOption("ShowNodeAABB", &toggleShow); 
     711                        toggleShow = !toggleShow; 
     712                        mSceneMgr->setOption("ShowNodeAABB", &toggleShow); 
    565713                        mTimeUntilNextToggle = 0.2; 
    566714                } 
     
    762910        } 
    763911 
    764     void showDebugOverlay(bool show) 
    765     { 
    766         if (mDebugOverlay) 
    767         { 
    768             if (show) 
    769             { 
    770                 mDebugOverlay->show(); 
    771                                 mKdTreeOverlay->show(); 
    772             } 
    773             else 
    774             { 
    775                 mDebugOverlay->hide(); 
    776                                 mKdTreeOverlay->hide(); 
    777             } 
    778         } 
    779     } 
    780  
    781912    // Override frameStarted event to process that (don't care about frameEnded) 
    782913    bool frameStarted(const FrameEvent& evt) 
  • GTP/trunk/Lib/Vis/OnlineCullingCHC/OGRE/include/OgreKdTree.h

    r1182 r1183  
    211211                        //virtual void cbInsert(KdTree * caller, KdRenderable * rend) = 0; 
    212212 
    213                         WireBoundingBox * getWireBoundingBox() 
     213                        WireBoundingBox * getWireBoundingBox(bool node = true) 
    214214                        { 
    215215                                if (mWBB == 0) 
    216216                                        mWBB = new WireBoundingBox(); 
    217217 
    218                                 mWBB->setupBoundingBox(mAABB); 
     218                                if (node) 
     219                                        mWBB->setupBoundingBox(mAABB); 
     220                                else 
     221                                        mWBB->setupBoundingBox(mWorldAABB); 
    219222                                 
    220223#ifdef KDTREE_DEBUG 
     224                                SceneManager * sceneManager = Root::getSingleton()._getCurrentSceneManager(); 
    221225                                int level = -1; 
    222226                                bool boxes = false; 
    223                                 if (Root::getSingleton()._getCurrentSceneManager()->getOption("HighlightLevel",&level)) 
     227                                if (sceneManager->getOption("HighlightLevel",&level)) 
    224228                                { 
    225229                                        if (mLevel == level) 
     
    232236                                        { 
    233237                                                mWBB->setMaterial("BaseWhiteNoLighting"); 
    234                                                 if (Root::getSingleton()._getCurrentSceneManager()->getOption("ShowAllBoxes", &boxes)) 
     238                                                if (sceneManager->getOption("ShowAllBoxes", &boxes)) 
    235239                                                { 
    236240                                                        if (boxes) 
     
    279283                        /** Updates bound of the real aabb of kdtree 
    280284                        */ 
    281                         virtual void _updateBounds() = 0; 
    282  
     285                        virtual void _updateBounds(bool recurse = true) = 0; 
    283286 
    284287                        Branch * mParent; 
     
    325328 
    326329                        // branches do not posses geometry => just merge child aabbs 
    327                         virtual void _updateBounds() 
     330                        virtual void _updateBounds(bool recurse = true) 
    328331                        { 
    329332                                // reset box 
     
    336339 
    337340                                // update parent recursively 
    338                                 if (mParent) 
    339                                         mParent->_updateBounds(); 
     341                                if (recurse && mParent) 
     342                                        mParent->_updateBounds(recurse); 
    340343                        } 
    341344                         
     
    365368 
    366369                        // update the world aabb based on the contained geometry 
    367                         virtual void _updateBounds(); 
     370                        virtual void _updateBounds(bool recurse = true); 
    368371 
    369372                        virtual void remove(KdRenderable * rend) 
     
    464467                void dump(void); 
    465468                Real calcCost(void); 
     469 
     470                /** Switches between displaying the bounding box of the node and 
     471                the box of the contained scene nodes 
     472                */ 
     473                inline void setShowNodeAABB(bool show = true) { mShowNodeAABB = show; }; 
     474                inline bool getShowNodeAABB(void) { return mShowNodeAABB; }; 
    466475 
    467476                NodePtr getRoot(void) const { return mKdRoot; }; 
     
    523532                Stats mStats; 
    524533 
     534                // show node or object aabb 
     535                bool mShowNodeAABB; 
     536 
     537 
    525538                // DEBUG 
    526539                void KdTree::dump(KdTree::Node * node); 
  • GTP/trunk/Lib/Vis/OnlineCullingCHC/OGRE/src/OgreKdTree.cpp

    r1182 r1183  
    329329        //---------------------------------------------------------------------------- 
    330330 
    331         KdTree::KdTree(int maxdepth): mMaxDepth(maxdepth), mKdRoot(0), mBuildMethod(KDBM_RECURSIVE), mBuildLog(0) 
     331        KdTree::KdTree(int maxdepth):  
     332        mMaxDepth(maxdepth),  
     333        mKdRoot(0),  
     334        mBuildMethod(KDBM_RECURSIVE),  
     335        mBuildLog(0),  
     336        mShowNodeAABB(true) 
    332337        { 
    333338#ifdef KDTREE_DEBUG 
     
    340345                        mp->setDiffuse(cv); 
    341346                } 
    342                 //try 
    343                 //{ 
    344                 //      ColourValue cv(0.0, 1.0, 0.0); 
    345                 //      MaterialPtr mp = MaterialManager::getSingleton().create("aabbHiLite","General"); 
    346                 //      mp->setSelfIllumination(cv); 
    347                 //      mp->setDiffuse(cv); 
    348                 //} 
    349                 //catch (Ogre::Exception&) 
    350                 //{ 
    351                 //      // SO FUCKING DON'T CARE !!! 
    352                 //} 
    353347#endif 
    354348                try 
     
    871865                        ++ mStats.mNumNodes; 
    872866                        ++ mStats.mNumLeaves; 
     867                        // update bounding box 
     868                        leaf->_updateBounds(false); 
    873869                        return leaf; 
    874870                } 
     
    957953                        // update stats 
    958954                        ++ mStats.mNumNodes; 
     955 
     956                        // update bounding box 
     957                        branch->_updateBounds(false); 
     958 
    959959 
    960960                        //assert(branch->mRight || branch->mLeft); 
     
    12611261                        } 
    12621262 
     1263                        // update bounding boxes when geometry (leaf) was added 
     1264                        if (newNode->isLeaf()) 
     1265                                newNode->_updateBounds(); 
     1266 
    12631267                        //cleanup 
    12641268                        OGRE_DELETE(sc.events); 
     
    13361340                        WireBoundingBox * wbb = 0; 
    13371341                        if (showBoxes) 
    1338                                 wbb = node->getWireBoundingBox(); 
     1342                                wbb = node->getWireBoundingBox(mShowNodeAABB); 
    13391343#endif 
    13401344 
     
    13571361#else 
    13581362                                if (showBoxes) 
    1359                                         queue->addRenderable(leaf->getWireBoundingBox()); 
     1363                                        queue->addRenderable(leaf->getWireBoundingBox(mShowNodeAABB)); 
    13601364#endif 
    13611365                        } 
     
    13681372#else 
    13691373                                if (showBoxes) 
    1370                                         queue->addRenderable(branch->getWireBoundingBox()); 
     1374                                        queue->addRenderable(branch->getWireBoundingBox(mShowNodeAABB)); 
    13711375#endif 
    13721376 
     
    14691473 
    14701474        // update the world aabb based on the contained geometry 
    1471         void KdTree::Leaf::_updateBounds() 
     1475        void KdTree::Leaf::_updateBounds(bool recurse) 
    14721476        { 
    14731477                // reset box 
     
    14791483                while (it != end) 
    14801484                { 
     1485                        //(*it)->_updateBounds(); 
    14811486                        mWorldAABB.merge((*it)->getBoundingBox()); 
    14821487                        it++; 
     
    14841489 
    14851490                // update parent recursively 
    1486                 if (mParent) 
    1487                         mParent->_updateBounds(); 
     1491                if (recurse && mParent) 
     1492                        mParent->_updateBounds(recurse); 
    14881493        } 
    14891494} // namespace Ogre 
  • GTP/trunk/Lib/Vis/OnlineCullingCHC/OGRE/src/OgreKdTreeSceneManager.cpp

    r1182 r1183  
    5959 
    6060mHierarchyInterface = new KdTreeHierarchyInterface(this, mDestRenderSystem); 
     61 
     62// test 
     63//String chc = "CHC"; 
     64//setOption("RenderMethod", &chc); 
    6165} 
    6266 
     
    240244                return true; 
    241245        } 
     246        else if (strKey == "ShowNodeAABB") 
     247        { 
     248                bool sn = *static_cast<const bool *>(pValue); 
     249                if (mKdTree) 
     250                        mKdTree->setShowNodeAABB(sn); 
     251                return true; 
     252        } 
     253        // options for CHC 
     254        if (strKey == "UseDepthPass") 
     255        { 
     256                mUseDepthPass = (*static_cast<const bool *>(pValue)); 
     257                return true; 
     258        } 
     259        if (strKey == "PrepareVisualization") 
     260        { 
     261                mShowVisualization = (*static_cast<const bool *>(pValue)); 
     262                return true; 
     263        } 
     264        if (strKey == "RenderNodesForViz") 
     265        { 
     266                mRenderNodesForViz = (*static_cast<const bool *>(pValue)); 
     267                return true; 
     268        } 
     269        if (strKey == "RenderNodesContentForViz") 
     270        { 
     271                mRenderNodesContentForViz = (*static_cast<const bool *>(pValue)); 
     272                return true; 
     273        } 
     274        if (strKey == "SkyBoxEnabled") 
     275        { 
     276                mSkyBoxEnabled = (*static_cast<const bool *>(pValue)); 
     277                return true; 
     278        } 
     279        if (strKey == "SkyPlaneEnabled") 
     280        { 
     281                mSkyPlaneEnabled = (*static_cast<const bool *>(pValue)); 
     282                return true; 
     283        } 
     284        if (strKey == "SkyDomeEnabled") 
     285        { 
     286                mSkyDomeEnabled = (*static_cast<const bool *>(pValue)); 
     287                return true; 
     288        } 
     289        if (strKey == "VisualizeCulledNodes") 
     290        { 
     291                mVisualizeCulledNodes = (*static_cast<const bool *>(pValue)); 
     292                return true; 
     293        } 
     294        if (strKey == "DelayRenderTransparents") 
     295        { 
     296                mDelayRenderTransparents = (*static_cast<const bool *>(pValue)); 
     297                return true; 
     298        } 
     299 
     300        if (strKey == "DepthWrite") 
     301        { 
     302                mEnableDepthWrite = (*static_cast<const bool *>(pValue)); 
     303                return true; 
     304        } 
     305        if (strKey == "UseItemBuffer") 
     306        { 
     307                mUseItemBuffer = (*static_cast<const bool *>(pValue)); 
     308                return true; 
     309        } 
     310        if (strKey == "ExecuteVertexProgramForAllPasses") 
     311        {  
     312                mExecuteVertexProgramForAllPasses  = (*static_cast<const bool *>(pValue)); 
     313                return true; 
     314        } 
     315        if (strKey == "RenderTransparentsForItemBuffer") 
     316        {  
     317                mRenderTransparentsForItemBuffer  = (*static_cast<const bool *>(pValue)); 
     318                return true; 
     319        } 
     320 
    242321 
    243322        return VisibilityOptionsManager(mVisibilityManager, mHierarchyInterface) 
     
    270349        else if (strKey == "ShowAllBoxes") 
    271350        { 
    272                 *static_cast<bool *>(pDestValue) = mShowAllBoxes; 
     351                if (mRenderMethod == KdTree::KDRM_INTERNAL) 
     352                        *static_cast<bool *>(pDestValue) = mShowAllBoxes; 
     353                else 
     354                        *static_cast<bool *>(pDestValue) = mVisualizeCulledNodes; 
    273355                return true; 
    274356        } 
     
    308390                        return false; 
    309391                } 
     392                return true; 
     393        } 
     394        else if (strKey == "ShowKdTree") 
     395        { 
     396                *static_cast<bool *>(pDestValue) = mShowBoxes; 
     397                return true; 
     398        } 
     399        else if (strKey == "ShowNodeAABB") 
     400        { 
     401                if (mKdTree) 
     402                        *static_cast<bool *>(pDestValue) = mKdTree->getShowNodeAABB(); 
     403                else 
     404                        *static_cast<bool *>(pDestValue) = false; 
    310405                return true; 
    311406        } 
     
    331426        refKeys.push_back("RenderMethod"); 
    332427        refKeys.push_back("ShowKdTree"); 
     428        refKeys.push_back("ShowNodeAABB"); 
    333429        refKeys.push_back("TreeBox"); 
    334430#ifdef KDTREE_DEBUG 
     
    639735        while (it != end) 
    640736        { 
    641                 (*it)->queueObjects(cam, getRenderQueue(), onlyShadowCasters); 
     737                if (!(*it)->isQueued(mHierarchyInterface->GetFrameId(), cam)) 
     738                { 
     739                        (*it)->queueObjects(cam, getRenderQueue(), onlyShadowCasters); 
     740                } 
    642741                it++; 
    643742        } 
     
    841940        } 
    842941        // add bounding boxes of rendered objects 
    843         if (0) 
     942        //if (0) 
    844943                //for (BoxList::iterator it = mBoxes.begin(); it != mBoxes.end(); ++it) 
    845944                //{ 
  • GTP/trunk/Lib/Vis/OnlineCullingCHC/OGRE/src/OgreKdTreeSceneNode.cpp

    r1182 r1183  
    1212 
    1313#include <OgreStringConverter.h> 
     14#include <OgreLogManager.h> 
    1415 
    1516namespace Ogre 
     
    140141        } 
    141142 
     143        // recalculate the world aabb 
    142144        AxisAlignedBox KdTreeSceneNode::getBoundingBox() const 
    143145        { 
     146#if 0 
     147                AxisAlignedBox box; 
     148 
     149                // Update bounds from own attached objects 
     150                ObjectMap::const_iterator it = mObjectsByName.begin(); 
     151                ObjectMap::const_iterator end = mObjectsByName.end(); 
     152                for ( ; it != end ; ++it) 
     153                { 
     154                        // Merge world bounds of each object 
     155                        box.merge(it->second->getWorldBoundingBox(true)); 
     156                } 
     157 
     158                if (box.getMinimum() != mWorldAABB.getMinimum() ||box.getMaximum() != mWorldAABB.getMaximum()) 
     159                { 
     160                        try 
     161                        { 
     162                                Log * log = LogManager::getSingleton().getLog("KdTreeBuild.log"); 
     163                                log->logMessage("mWorldAABB was not up to date"); 
     164                        } 
     165                        catch (Exception) 
     166                        { 
     167                                // F.U. 
     168                        } 
     169                } 
     170 
     171                return box; 
     172#else 
    144173                return mWorldAABB; 
     174#endif 
    145175        } 
    146176 
Note: See TracChangeset for help on using the changeset viewer.