Changeset 1195


Ignore:
Timestamp:
08/10/06 17:08:57 (18 years ago)
Author:
szydlowski
Message:

visualization workin' fine (TM)
demo recording/playback partially implemented

Files:
12 edited

Legend:

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

    r1187 r1195  
    66#include <ivreader.h> 
    77#include "TestKdTreeAppListener.h" 
     8 
     9 
     10class KdTreeAppRenderTargetListener : public RenderTargetListener 
     11{ 
     12public: 
     13        KdTreeAppRenderTargetListener(SceneManager *sceneMgr); 
     14 
     15protected: 
     16        void preViewportUpdate (const RenderTargetViewportEvent &evt); 
     17        void postRenderTargetUpdate (const RenderTargetEvent &evt); 
     18 
     19        SceneManager *mSceneMgr; 
     20 
     21        ShadowTechnique mSavedShadowTechnique; 
     22        ColourValue mSavedAmbientLight; 
     23}; 
    824 
    925class KdTreeApp : public ExampleApplication 
     
    1531        ~KdTreeApp() 
    1632        { 
     33                delete mRenderTargerListener; 
    1734                delete mFrameListener; 
    1835        } 
     
    2441        Camera *mFollowCam; 
    2542        KdTreeAppListener *mFrameListener; 
     43        KdTreeAppRenderTargetListener *mRenderTargerListener; 
    2644 
    2745        String  mSceneFiles; 
     
    6987}; 
    7088 
    71 class KdTreeAppRenderTargetListener : public RenderTargetListener 
    72 { 
    73 public: 
    74         KdTreeAppRenderTargetListener(SceneManager *sceneMgr); 
    75  
    76 protected: 
    77         void preViewportUpdate (const RenderTargetViewportEvent &evt); 
    78         void postRenderTargetUpdate (const RenderTargetEvent &evt); 
    79  
    80         SceneManager *mSceneMgr; 
    81  
    82         ShadowTechnique mSavedShadowTechnique; 
    83         ColourValue mSavedAmbientLight; 
    84 }; 
    85  
    8689#endif 
  • GTP/trunk/App/Demos/Vis/KdTreeDemo/OGRE/include/TestKdTreeAppListener.h

    r1187 r1195  
    5555        bool mShowTree; 
    5656        bool mFreeMove; 
     57        bool mTopCamFollow; 
    5758 
    5859        Real mDelayedQueriesIssued; 
     
    7172        OverlayElement *mRenderMethodInfo; 
    7273        OverlayElement *mMovementInfo; 
     74        OverlayElement *mTopCamInfo; 
    7375 
    7476        OverlayElement *mFrustumCulledNodesInfo; 
     
    107109    void updateStats(void); 
    108110 
     111        // stuff for walkthrough recording/playback 
     112        struct FrameInfo 
     113        { 
     114                FrameInfo(Vector3 pos, Quaternion or, Real time): 
     115                mPosition(pos), mOrientation(or), mElapsedTime(time) 
     116                { } 
     117 
     118                Vector3 mPosition; 
     119                Quaternion mOrientation; 
     120                Real    mElapsedTime; 
     121        }; 
     122 
     123        typedef std::list<FrameInfo> FrameList; 
     124 
     125        enum AppState 
     126        { 
     127                AS_NORMAL, 
     128                AS_RECORD, 
     129                AS_PLAYBACK 
     130        }; 
     131 
     132        FrameList mFrameList; 
     133 
     134        AppState mAppState; 
     135 
     136        void toggleRecord(); 
     137        void togglePlayback(); 
     138        void saveFrameInfo(Real elapsedTime); 
     139 
    109140public: 
     141        void loadFrames(const String& filename); 
     142        void saveFrames(const String& filename); 
    110143 
    111144        // visualization modes for scene nodes 
  • GTP/trunk/App/Demos/Vis/KdTreeDemo/OGRE/src/TestKdTree.cpp

    r1190 r1195  
    246246                        light->setDirection(-1,-1,-1); 
    247247                } 
    248                 light->setDiffuseColour(ColourValue()); 
     248                light->setDiffuseColour(ColourValue::White); 
    249249                light->setSpecularColour(ColourValue(1, 1, 0.2)); 
    250250 
     
    276276        mFrameListener->showDebugOverlay( true ); 
    277277        mRoot->addFrameListener(mFrameListener); 
    278         mWindow->addListener(new KdTreeAppRenderTargetListener(mSceneMgr)); 
     278        mRenderTargerListener = new KdTreeAppRenderTargetListener(mSceneMgr); 
     279        mWindow->addListener(mRenderTargerListener); 
    279280} 
    280281 
     
    312313        mTopCam->setDirection(0,0,-1); 
    313314        mTopCam->pitch(Radian(-Math::HALF_PI)); 
    314         mTopCam->setCullingFrustum(mCamera); 
     315        //mTopCam->setCullingFrustum(mCamera); 
    315316        mTopCam->setNearClipDistance(1); 
    316317 
  • GTP/trunk/App/Demos/Vis/KdTreeDemo/OGRE/src/TestKdTreeAppListener.cpp

    r1192 r1195  
     1#include <fstream> 
     2#include <cstdlib> 
     3 
    14#include "TestKdTreeAppListener.h" 
    25 
     
    9295        } 
    9396 
     97        mTopCamFollow = true; 
    9498        mFreeMove = false; 
    9599        mShowTree = false; 
     
    97101        mVizCamTransVect = Vector3::ZERO; 
    98102        mSeqNum = 0; 
     103 
     104        mAppState = AS_NORMAL; 
    99105 
    100106        mDelayedQueriesIssued = 0.0; 
     
    127133 
    128134        showDebugOverlay(true); 
     135 
     136        loadFrames("demo-in.txt"); 
    129137} 
    130138//----------------------------------------------------------------------- 
     
    139147                PlatformManager::getSingleton().destroyInputReader( mInputDevice ); 
    140148        } 
     149 
     150        // save demo 
     151        if (!mFrameList.empty()) 
     152                saveFrames("demo-out.txt"); 
    141153} 
    142154//----------------------------------------------------------------------- 
     
    183195        const int vert_space = 15; 
    184196        const String na = ": N/A"; 
    185         String sMD, sKT, sKI, sHL, sBM, sRM, sFM; 
     197        String sMD, sKT, sKI, sHL, sBM, sRM, sFM, sTC; 
    186198 
    187199        int top = border_height; 
     
    244256                sFM = ": Ground"; 
    245257 
     258        sTC = na; 
     259        if (mTopCamFollow) 
     260                sTC = ": Follow"; 
     261        else 
     262                sTC = ": Free"; 
     263 
    246264        initOverlayElement(&mRenderMethodInfo, ext, "RenderMethod", top, sRM); top += vert_space; 
    247265        initOverlayElement(&mBuildMethodInfo, ext, "BuildMethod", top, sBM); top += vert_space; 
     
    251269        initOverlayElement(&mKIInfo, ext, "KI", top, sKI); top += vert_space; 
    252270        initOverlayElement(&mMovementInfo, ext, "Movement", top, sFM); top += vert_space; 
     271        initOverlayElement(&mTopCamInfo, ext, "TopCam", top, sTC); top += vert_space; 
    253272 
    254273        OverlayElement *visPanel = OverlayManager::getSingleton(). 
     
    313332bool KdTreeAppListener::processUnbufferedKeyInput(const FrameEvent& evt) 
    314333{ 
     334        // demo recording stuff 
     335        if (mInputDevice->isKeyDown(KC_F5) && mTimeUntilNextToggle <= 0) 
     336        { 
     337                toggleRecord(); 
     338                mTimeUntilNextToggle = 0.5; 
     339        } 
     340 
     341        if (mInputDevice->isKeyDown(KC_F9) && mTimeUntilNextToggle <= 0) 
     342        { 
     343                togglePlayback(); 
     344                mTimeUntilNextToggle = 0.5; 
     345        } 
     346 
     347        const static int vizCamSpeedup = 12; 
    315348        // moving the cull camera 
    316349        if (mInputDevice->isKeyDown(KC_NUMPAD2)) 
    317350        { 
    318                 mVizCamTransVect.y = -mMoveScale; 
     351                mVizCamTransVect.y = -mMoveScale * vizCamSpeedup; 
    319352        } 
    320353        if (mInputDevice->isKeyDown(KC_NUMPAD8)) 
    321354        { 
    322                 mVizCamTransVect.y = mMoveScale; 
     355                mVizCamTransVect.y = mMoveScale * vizCamSpeedup; 
    323356        } 
    324357        if (mInputDevice->isKeyDown(KC_NUMPAD4)) 
    325358        { 
    326                 mVizCamTransVect.x = mMoveScale; 
     359                mVizCamTransVect.x = -mMoveScale * vizCamSpeedup; 
    327360        } 
    328361        if (mInputDevice->isKeyDown(KC_NUMPAD6)) 
    329362        { 
    330                 mVizCamTransVect.x = -mMoveScale; 
     363                mVizCamTransVect.x = mMoveScale * vizCamSpeedup; 
    331364        } 
    332365        if (mInputDevice->isKeyDown(KC_SUBTRACT)) 
    333366        { 
    334                 mVizCamTransVect.z = mMoveScale; 
     367                mVizCamTransVect.z = mMoveScale * vizCamSpeedup; 
    335368        } 
    336369        if (mInputDevice->isKeyDown(KC_ADD)) 
    337370        { 
    338                 mVizCamTransVect.z = -mMoveScale; 
     371                mVizCamTransVect.z = -mMoveScale * vizCamSpeedup; 
    339372        } 
    340373 
    341374        // stuff for the overlay 
    342         static String sNA = ": N/A"; 
     375        const static String sNA = ": N/A"; 
    343376 
    344377        static String bmOptions[] = { "Recursive", "PriorityQueue" }; 
     
    504537        } 
    505538 
    506         if (mInputDevice->isKeyDown(KC_Q) && mTimeUntilNextToggle <= 0) 
     539        if (mInputDevice->isKeyDown(KC_U) && mTimeUntilNextToggle <= 0) 
    507540        { 
    508541                mFreeMove = !mFreeMove; 
    509                 String move = "N/A"; 
     542                String move = ": N/A"; 
    510543                if (mFreeMove) 
    511544                        move = ": Free"; 
     
    518551        } 
    519552 
     553        if (mInputDevice->isKeyDown(KC_I) && mTimeUntilNextToggle <= 0) 
     554        { 
     555                mTopCamFollow = !mTopCamFollow; 
     556                String move = ": N/A"; 
     557                if (mTopCamFollow) 
     558                        move = ": Follow"; 
     559                else 
     560                        move = ": Free"; 
     561 
     562                mTopCamInfo->setCaption(move); 
     563 
     564                mTimeUntilNextToggle = 0.5; 
     565        } 
    520566 
    521567        if (mInputDevice->isKeyDown(KC_BACK) && mTimeUntilNextToggle <= 0) 
     
    801847        mCamNode->translate(mCamNode->getLocalAxes(), mTranslateVector); 
    802848        mTopCam->moveRelative(mVizCamTransVect); 
     849        if (mTopCamFollow) 
     850        { 
     851                Vector3 toppos = mTopCam->getPosition(); 
     852                Vector3 campos = mCamNode->getPosition(); 
     853                mTopCam->setPosition(Vector3::ZERO); 
     854                mTopCam->setOrientation(Quaternion::IDENTITY); 
     855                mTopCam->setPosition(campos.x, toppos.y, campos.z); 
     856                mTopCam->pitch(Radian(-Math::HALF_PI)); 
     857        } 
    803858 
    804859        if (!mFreeMove) 
     
    894949 
    895950        } 
     951 
     952 
     953        //saveFrameInfo(evt.timeSinceLastFrame); 
     954        if (mAppState == AS_RECORD) 
     955        { 
     956                mFrameList.push_back(FrameInfo(mCamNode->getPosition(), mCamNode->getOrientation(), evt.timeSinceLastFrame)); 
     957        } 
     958 
    896959 
    897960        //Camera        *followCam = mSceneMgr->getCamera("FollowCam"); 
     
    9531016        } 
    9541017} 
     1018 
     1019/************************************************************************/ 
     1020/* functions for recording & playback of demos                          */ 
     1021/************************************************************************/ 
     1022 
     1023//----------------------------------------------------------------------------- 
     1024void KdTreeAppListener::toggleRecord() 
     1025{ 
     1026        // TODO: overlay 
     1027        if (mAppState == AS_NORMAL) 
     1028        { 
     1029                mAppState = AS_RECORD; 
     1030        } 
     1031        else if (mAppState == AS_RECORD) 
     1032        { 
     1033                mAppState = AS_NORMAL; 
     1034        } 
     1035} 
     1036 
     1037//----------------------------------------------------------------------------- 
     1038void KdTreeAppListener::togglePlayback() 
     1039{ 
     1040        // TODO: overlay 
     1041        if (mAppState == AS_NORMAL) 
     1042        { 
     1043                mAppState = AS_PLAYBACK; 
     1044        } 
     1045        else if (mAppState == AS_PLAYBACK) 
     1046        { 
     1047                mAppState = AS_NORMAL; 
     1048        } 
     1049} 
     1050 
     1051//----------------------------------------------------------------------------- 
     1052void KdTreeAppListener::saveFrameInfo(Real elapsedTime) 
     1053{ 
     1054        mFrameList.push_back(FrameInfo(mCamNode->getPosition(), mCamNode->getOrientation(), elapsedTime)); 
     1055} 
     1056 
     1057//----------------------------------------------------------------------------- 
     1058void KdTreeAppListener::saveFrames(const String& filename) 
     1059{ 
     1060        // open file 
     1061        std::ofstream dest(filename.c_str()); 
     1062        if (!dest) 
     1063        { 
     1064                LogManager::getSingleton().logMessage("Failed to open file for saving demo: " + filename); 
     1065                return; 
     1066        } 
     1067 
     1068        FrameList::iterator it = mFrameList.begin(); 
     1069        FrameList::iterator end = mFrameList.end(); 
     1070 
     1071        // dump values 
     1072        while (it != end) 
     1073        { 
     1074                dest <<  
     1075                        StringConverter::toString(it->mPosition) << " " <<  
     1076                        StringConverter::toString(it->mOrientation) << " " <<  
     1077                        StringConverter::toString(it->mElapsedTime) << "\n"; 
     1078                ++ it; 
     1079        } 
     1080 
     1081        dest.close(); 
     1082} 
     1083 
     1084//----------------------------------------------------------------------------- 
     1085void KdTreeAppListener::loadFrames(const String& filename) 
     1086{ 
     1087        // open file 
     1088        std::ifstream src(filename.c_str()); 
     1089        if (!src) 
     1090        { 
     1091                LogManager::getSingleton().logMessage("Failed to open file for reading demo: " + filename); 
     1092                return; 
     1093        } 
     1094 
     1095        // clear the list 
     1096        mFrameList.clear(); 
     1097 
     1098        Vector3 pos; 
     1099        Quaternion or; 
     1100        Real time; 
     1101 
     1102        while (!src.eof()) 
     1103        { 
     1104                src >> pos.x;    
     1105                src >> pos.y;    
     1106                src >> pos.z; 
     1107 
     1108                src >> or.w; 
     1109                src >> or.x; 
     1110                src >> or.y; 
     1111                src >> or.z; 
     1112 
     1113                src >> time; 
     1114 
     1115                mFrameList.push_back(FrameInfo(pos, or, time)); 
     1116        } 
     1117 
     1118        // HACK pop last frame, was doubled while reading 
     1119        mFrameList.pop_back(); 
     1120 
     1121        src.close(); 
     1122} 
  • GTP/trunk/Lib/Vis/OnlineCullingCHC/OGRE/include/OgreKdRenderable.h

    r1173 r1195  
    1212 
    1313#include "OgreKdTree.h" 
    14 #include "HierarchyInterface.h" 
    1514 
    1615namespace Ogre 
  • GTP/trunk/Lib/Vis/OnlineCullingCHC/OGRE/include/OgreKdTree.h

    r1192 r1195  
    2727#include <stack> 
    2828 
     29#include "HierarchyInterface.h" 
    2930 
    3031 
     
    210211 
    211212                        // Gets this node's parent (NULL if this is the root). 
    212                         Node *getParent(void) const { return mParent; }; 
    213                         // Gets the nodes left & right child nodes, or NULL if not present 
    214                         // or node is leaf 
    215                         virtual Node *getLeftChild(void) const = 0; 
    216                         virtual Node *getRightChild(void) const = 0; 
    217                          
    218                         // returns the level the node is on 
    219                         int getLevel(void) const { return mLevel; }; 
    220  
     213                        KdTree::Node *getParent(void) const { return mParent; }; 
     214 
     215                        // Gets the nodes left & right child nodes, or NULL if not present or node is leaf 
     216                        virtual KdTree::Node *getLeftChild(void) const = 0; 
     217                        virtual KdTree::Node *getRightChild(void) const = 0; 
     218 
     219                        // add contained objects to render queue 
    221220                        virtual void queueVisibleObjects(unsigned long currentFrame,  
    222221                                Camera* cam, RenderQueue* queue, bool onlyShadowCasters, bool showBoxes) = 0; 
     222 
     223                        // add contained geometry (Entities) to list 
     224                        virtual void getGeometryList(GtpVisibility::GeometryVector *geometryList) = 0; 
    223225                         
     226                        // create (when necessary), setup and return wire bounding box representing the node 
    224227                        WireBoundingBox * getWireBoundingBox() 
    225228                        { 
     
    238241                                 
    239242                                return mWBB; 
    240  
    241243                        } 
     244 
     245                        // returns the level the node is on 
     246                        int getLevel(void) const { return mLevel; }; 
    242247 
    243248                        // functions for the CHC hierarchy interface 
     
    270275                        */ 
    271276                        virtual void _updateBounds(bool recurse = true) = 0; 
    272  
     277                         
     278                        /** bounding box of the node**/ 
    273279                        AxisAlignedBox mAABB; 
    274280 
    275                         // for the CHC hierarchy interface 
    276                         /** the real extent of the node. */ 
     281                        /** mounding box of all objects inside the node */ 
    277282                        AxisAlignedBox mWorldAABB; 
    278283                protected: 
     
    283288                        WireBoundingBox * mWBB; 
    284289                         
     290                        // for the CHC hierarchy interface 
    285291                        unsigned int mLastRendered; 
    286292                        unsigned int mLastVisited; 
     
    317323 
    318324                        // a branch should have at least one child 
    319                         virtual Node * getLeftChild() const { return mLeft; }; 
    320                         virtual Node * getRightChild() const { return mRight; }; 
     325                        virtual KdTree::Node * getLeftChild() const { return mLeft; }; 
     326                        virtual KdTree::Node * getRightChild() const { return mRight; }; 
    321327 
    322328                        virtual void queueVisibleObjects(unsigned long currentFrame,  
     
    327333                                                queue->addRenderable(getWireBoundingBox()); 
    328334                        } 
     335 
     336                        // a branch has no geometry, do nothing 
     337                        virtual void getGeometryList(GtpVisibility::GeometryVector *geometryList) { } 
    329338 
    330339                        // branches do not posses geometry => just merge child aabbs 
     
    369378 
    370379                        // a leaf never has children  
    371                         virtual Node * getLeftChild() const { return 0; }; 
    372                         virtual Node * getRightChild() const { return 0; }; 
     380                        virtual KdTree::Node * getLeftChild() const { return 0; }; 
     381                        virtual KdTree::Node * getRightChild() const { return 0; }; 
    373382 
    374383                        virtual void queueVisibleObjects(unsigned long currentFrame,  
    375384                                Camera* cam, RenderQueue* queue, bool onlyShadowCasters, bool showBoxes); 
    376385 
     386                        virtual void getGeometryList(GtpVisibility::GeometryVector *geometryList); 
     387 
    377388                        // update the world aabb based on the contained geometry 
    378389                        virtual void _updateBounds(bool recurse = true); 
     
    394405                struct SplitCandidate 
    395406                { 
    396                         SplitCandidate(PlaneEventList * e, int n, AxisAlignedBox& a, KdTree::Branch * p, Real c, Real d, SplitInfo * b, PlaneEvent::Side s): 
    397                                 events(e), nObjects(n), aabb(a), parent(p), cost(c), decrease(d), best(b), side(s) { }; 
     407                        SplitCandidate(PlaneEventList * e, int n, AxisAlignedBox& a, 
     408                                KdTree::Branch * p, Real c, Real d, SplitInfo * b, PlaneEvent::Side s): 
     409                        events(e), nObjects(n), aabb(a), parent(p), cost(c), decrease(d), best(b), side(s) 
     410                        { }; 
    398411 
    399412                        bool operator < (const SplitCandidate& rhs) const 
     
    504517 
    505518                // test visibility of objects and add to render queue 
    506                 void queueVisibleObjects(Camera* cam, RenderQueue* queue, bool onlyShadowCasters, bool showBoxes = false); 
     519                void queueVisibleObjects(Camera* cam, RenderQueue* queue, bool onlyShadowCasters,  
     520                        bool showBoxes, KdTree::NodeList& visibleNodes); 
     521 
     522                // find visible nodes & place in list 
     523                //void findVisibleNodes(NodeList& visibleNodes, Camera * cam); 
    507524 
    508525                // self-explanatory ... 
     
    536553 
    537554                // recursive rendering function 
    538                 void recQueueVisibleObjects(KdTree::Node * node, unsigned long currentFrame,  
    539                         Camera* cam, RenderQueue* queue, bool onlyShadowCasters, bool showBoxes); 
     555                void recQueueVisibleObjects(KdTree::Node * node, unsigned long currentFrame, Camera* cam, 
     556                        RenderQueue* queue, bool onlyShadowCasters, bool showBoxes, KdTree::NodeList& visibleNodes); 
     557 
     558                // recursively find visible nodes 
     559                //void recFindVisibleNodes(KdTree::Node * node, NodeList& visibleNodes, Camera * cam); 
    540560 
    541561                // the root node of the kdtree 
  • GTP/trunk/Lib/Vis/OnlineCullingCHC/OGRE/scripts/Plugin_VisibilitySceneManager.vcproj

    r1165 r1195  
    2121                                Optimization="0" 
    2222                                AdditionalIncludeDirectories="&quot;$(OGRE_PATH)\PlugIns\OctreeSceneManager\include&quot;;&quot;$(OGRE_PATH)\Samples\Common\include&quot;;&quot;$(OGRE_PATH)\Dependencies\include\CEGUI&quot;;&quot;$(OGRE_PATH)\Samples\Common\CEGUIRenderer\include&quot;;&quot;$(OGRE_PATH)\OgreMain\include&quot;;&quot;$(OGRE_PATH)\Dependencies\include&quot;;..\include;..\..\..\OnlineCullingCHC\include;..\..\..\Preprocessing\src" 
    23                                 PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;PLUGIN_OCCLUSIONCULLINGSCENEMANAGER_EXPORTS;GTP_VISIBILITY_MODIFIED_OGRE;KDTREE_DEBUG" 
     23                                PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_USRDLL;PLUGIN_OCCLUSIONCULLINGSCENEMANAGER_EXPORTS;GTP_VISIBILITY_MODIFIED_OGRE" 
    2424                                MinimalRebuild="TRUE" 
    2525                                BasicRuntimeChecks="3" 
     
    8989                                OptimizeForProcessor="2" 
    9090                                AdditionalIncludeDirectories="&quot;$(OGRE_PATH)\PlugIns\OctreeSceneManager\include&quot;;&quot;$(OGRE_PATH)\Samples\Common\include&quot;;&quot;$(OGRE_PATH)\Dependencies\include\CEGUI&quot;;&quot;$(OGRE_PATH)\Samples\Common\CEGUIRenderer\include&quot;;&quot;$(OGRE_PATH)\OgreMain\include&quot;;&quot;$(OGRE_PATH)\Dependencies\include&quot;;..\include;..\..\..\OnlineCullingCHC\include;..\..\..\Preprocessing\src" 
    91                                 PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;GTP_VISIBILITY_MODIFIED_OGRE;KDTREE_DEBUG" 
     91                                PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_USRDLL;GTP_VISIBILITY_MODIFIED_OGRE" 
    9292                                StringPooling="TRUE" 
    9393                                RuntimeLibrary="2" 
  • GTP/trunk/Lib/Vis/OnlineCullingCHC/OGRE/src/OgreKdTree.cpp

    r1192 r1195  
    307307        mMaxDepth(maxdepth),  
    308308        mBuildMethod(bm),  
    309         mHiLiteLevel(HILITE_OFF), 
     309        mHiLiteLevel(0), 
    310310        mShowAllBoxes(false), 
    311311        mShowNodes(true), 
     
    335335        void KdTree::init() 
    336336        { 
    337                 // init visualization materials 
    338                 MaterialPtr mphi = MaterialManager::getSingleton().getByName("KdTree/BoxHiLite"); 
    339                 if (mphi.isNull()) 
     337                MaterialPtr mat; 
     338                TextureUnitState *tex; 
     339 
     340                // init visualization materials (unlit solid green/yellow) 
     341                mat = MaterialManager::getSingleton().getByName("KdTree/BoxHiLite"); 
     342                if (mat.isNull()) 
    340343                { 
    341344                        ColourValue green(0, 1, 0); 
    342                         mphi = MaterialManager::getSingleton().create("KdTree/BoxHiLite", "General"); 
    343                         mphi->setAmbient(green); 
    344                         mphi->setDiffuse(green); 
    345                         mphi->setLightingEnabled(true); 
    346                         mphi->getTechnique(0)->getPass(0)->removeAllTextureUnitStates(); 
    347                 } 
    348  
    349                 MaterialPtr mpviz = MaterialManager::getSingleton().getByName("KdTree/BoxViz"); 
    350                 if (mpviz.isNull()) 
     345                        mat = MaterialManager::getSingleton().create("KdTree/BoxHiLite", "General"); 
     346                        //mat->setAmbient(green); 
     347                        //mat->setDiffuse(green); 
     348                        mat->setLightingEnabled(false); 
     349                        tex = mat->getTechnique(0)->getPass(0)->createTextureUnitState(); 
     350                        tex->setColourOperationEx(LBX_SOURCE2, LBS_CURRENT, LBS_MANUAL, green, green); 
     351                } 
     352 
     353                mat = MaterialManager::getSingleton().getByName("KdTree/BoxViz"); 
     354                if (mat.isNull()) 
    351355                { 
    352356                        ColourValue yellow(1, 1, 0); 
    353                         mpviz = MaterialManager::getSingleton().create("KdTree/BoxViz", "General"); 
    354                         mpviz->setAmbient(yellow); 
    355                         mpviz->setDiffuse(yellow); 
    356                         mpviz->setLightingEnabled(true); 
    357                         mpviz->getTechnique(0)->getPass(0)->removeAllTextureUnitStates(); 
     357                        mat = MaterialManager::getSingleton().create("KdTree/BoxViz", "General"); 
     358                        //mat->setAmbient(yellow); 
     359                        //mat->setDiffuse(yellow); 
     360                        mat->setLightingEnabled(false); 
     361                        tex = mat->getTechnique(0)->getPass(0)->createTextureUnitState(); 
     362                        tex->setColourOperationEx(LBX_SOURCE2, LBS_CURRENT, LBS_MANUAL, yellow, yellow); 
    358363                } 
    359364 
     
    11801185 
    11811186        //------------------------------------------------------------------------- 
    1182         void KdTree::queueVisibleObjects(Camera* cam, RenderQueue* queue, bool onlyShadowCasters, bool showBoxes) 
     1187        void KdTree::queueVisibleObjects(Camera* cam, RenderQueue* queue, bool onlyShadowCasters,  
     1188                bool showBoxes, KdTree::NodeList& visibleNodes) 
    11831189        { 
    11841190                if (mKdRoot) 
    11851191                        recQueueVisibleObjects(mKdRoot, Root::getSingleton().getCurrentFrameNumber(), 
    1186                                 cam, queue, onlyShadowCasters, showBoxes); 
     1192                                cam, queue, onlyShadowCasters, showBoxes, visibleNodes); 
    11871193        } 
    11881194 
    11891195        //------------------------------------------------------------------------- 
    11901196        void KdTree::recQueueVisibleObjects(KdTree::Node * node, unsigned long currentFrame,  
    1191                 Camera* cam, RenderQueue* queue, bool onlyShadowCasters, bool showBoxes) 
     1197                Camera* cam, RenderQueue* queue, bool onlyShadowCasters, bool showBoxes, KdTree::NodeList& visibleNodes) 
    11921198        { 
    11931199                // test visibility 
    11941200                if (cam->isVisible(node->mAABB)) 
    11951201                { 
    1196 #if 0 
     1202                        visibleNodes.push_back(node); 
     1203 
    11971204                        node->queueVisibleObjects(currentFrame, cam, queue, onlyShadowCasters, showBoxes); 
    11981205 
    11991206                        if (node->getLeftChild()) 
    1200                                 recQueueVisibleObjects(node->getLeftChild(), currentFrame, cam, queue, onlyShadowCasters, showBoxes); 
     1207                                recQueueVisibleObjects(node->getLeftChild(), currentFrame,  
     1208                                cam, queue, onlyShadowCasters, showBoxes, visibleNodes); 
    12011209                        if (node->getRightChild()) 
    1202                                 recQueueVisibleObjects(node->getRightChild(), currentFrame, cam, queue, onlyShadowCasters, showBoxes); 
    1203 #else 
    1204 #ifdef KDTREE_DEBUG 
    1205                         WireBoundingBox * wbb = 0; 
    1206                         if (showBoxes) 
    1207                                 wbb = node->getWireBoundingBox(); 
    1208 #endif 
    1209  
    1210                         if (node->isLeaf()) 
    1211                         { 
    1212                                 KdTree::Leaf * leaf = KDLEAFPTR_CAST(node); 
    1213                                 KdRenderableList::iterator it  = leaf->mKdRenderables.begin(); 
    1214                                 KdRenderableList::iterator end = leaf->mKdRenderables.end(); 
    1215                                 while (it != end) 
    1216                                 {                        
    1217                                         if (!(*it)->isQueued(currentFrame, cam)) 
    1218                                         { 
    1219                                                 (*it)->queueObjects(cam, queue, onlyShadowCasters); 
    1220                                         } 
    1221                                         it++; 
    1222                                 } 
    1223 #ifdef KDTREE_DEBUG 
    1224                                 if (wbb) 
    1225                                         queue->addRenderable(wbb); 
    1226 #else 
    1227                                 if (showBoxes) 
    1228                                         queue->addRenderable(leaf->getWireBoundingBox()); 
    1229 #endif 
    1230                         } 
    1231                         else 
    1232                         { 
    1233                                 KdTree::Branch * branch = KDBRANCHPTR_CAST(node); 
    1234 #ifdef KDTREE_DEBUG 
    1235                                 if (wbb) 
    1236                                         queue->addRenderable(wbb); 
    1237 #else 
    1238                                 if (showBoxes) 
    1239                                         queue->addRenderable(branch->getWireBoundingBox()); 
    1240 #endif 
    1241  
    1242                                 if (branch->mLeft) 
    1243                                         recQueueVisibleObjects(branch->mLeft, currentFrame, cam, queue, onlyShadowCasters, showBoxes); 
    1244                                 if (branch->mRight) 
    1245                                         recQueueVisibleObjects(branch->mRight, currentFrame, cam, queue, onlyShadowCasters, showBoxes); 
    1246                         } 
    1247 #endif 
    1248                 } 
    1249         } 
     1210                                recQueueVisibleObjects(node->getRightChild(), currentFrame,  
     1211                                cam, queue, onlyShadowCasters, showBoxes, visibleNodes); 
     1212                } 
     1213        } 
     1214 
     1215        ////------------------------------------------------------------------------- 
     1216        //void KdTree::findVisibleNodes(NodeList& visibleNodes, Camera * cam) 
     1217        //{ 
     1218        //      if (mKdRoot) 
     1219        //              recFindVisibleNodes(mKdRoot, visibleNodes, cam); 
     1220        //} 
     1221 
     1222        ////------------------------------------------------------------------------- 
     1223        //void KdTree::recFindVisibleNodes(KdTree::Node * node, NodeList& visibleNodes, Camera * cam) 
     1224        //{ 
     1225        //      // test visibility 
     1226        //      if (cam->isVisible(node->mAABB)) 
     1227        //      { 
     1228        //              visibleNodes.push_back(node); 
     1229 
     1230        //              if (node->getLeftChild()) 
     1231        //                      recFindVisibleNodes(node->getLeftChild(), visibleNodes, cam); 
     1232        //              if (node->getRightChild()) 
     1233        //                      recFindVisibleNodes(node->getRightChild(), visibleNodes, cam); 
     1234        //      } 
     1235        //} 
    12501236 
    12511237        /************************************************************************/ 
     
    13561342        } 
    13571343 
     1344        //------------------------------------------------------------------------- 
    13581345        void KdTree::Leaf::queueVisibleObjects(unsigned long currentFrame,  
    13591346                Camera* cam, RenderQueue* queue, bool onlyShadowCasters, bool showBoxes) 
     
    13761363 
    13771364        //------------------------------------------------------------------------- 
     1365        void KdTree::Leaf::getGeometryList(GtpVisibility::GeometryVector *geometryList) 
     1366        { 
     1367                KdRenderableList::iterator it = mKdRenderables.begin(); 
     1368                KdRenderableList::iterator end = mKdRenderables.end(); 
     1369                while (it != end) 
     1370                { 
     1371                        (*it)->getGeometryList(geometryList); 
     1372                        it++; 
     1373                } 
     1374        } 
     1375 
     1376        //------------------------------------------------------------------------- 
    13781377        // update the world aabb based on the contained geometry 
    13791378        void KdTree::Leaf::_updateBounds(bool recurse) 
  • GTP/trunk/Lib/Vis/OnlineCullingCHC/OGRE/src/OgreKdTreeHierarchyInterface.cpp

    r1187 r1195  
    4242        else 
    4343        { 
    44                 KdTree::Branch * kdbranch = KDBRANCHPTR_CAST(node); 
    45                 if (kdbranch->mLeft) 
    46                         mDistanceQueue->push(kdbranch->mLeft); 
    47                 if (kdbranch->mRight) 
    48                         mDistanceQueue->push(kdbranch->mRight); 
     44                //KdTree::Branch * kdbranch = KDBRANCHPTR_CAST(node); 
     45                //if (kdbranch->mLeft) 
     46                //      mDistanceQueue->push(kdbranch->mLeft); 
     47                //if (kdbranch->mRight) 
     48                //      mDistanceQueue->push(kdbranch->mRight); 
     49                if (kdnode->getLeftChild()) 
     50                        mDistanceQueue->push(kdnode->getLeftChild()); 
     51                if (kdnode->getRightChild()) 
     52                        mDistanceQueue->push(kdnode->getRightChild()); 
    4953        } 
    5054} 
     
    133137        } 
    134138 
    135         // TODO: maybe boxlist? 
    136139        dynamic_cast<KdTreeSceneManager *>(mSceneManager)->getRenderQueue()->addRenderable(box); 
    137140} 
     
    141144                                                                                                   bool includeChildren)  
    142145{ 
    143         KdTree::Node * kdnode = KDNODEPTR_CAST(node); 
    144         if (kdnode->isLeaf()) 
    145         { 
    146                 KdTree::Leaf * kdleaf = KDLEAFPTR_CAST(node); 
    147                 KdRenderableList::iterator it = kdleaf->mKdRenderables.begin(); 
    148                 KdRenderableList::iterator end = kdleaf->mKdRenderables.end(); 
    149                 while (it != end) 
    150                 { 
    151                         (*it)->getGeometryList(geometryList); 
    152                         it++; 
    153                 } 
    154         } 
     146        KDNODEPTR_CAST(node)->getGeometryList(geometryList); 
    155147} 
    156148 
  • GTP/trunk/Lib/Vis/OnlineCullingCHC/OGRE/src/OgreKdTreeSceneManager.cpp

    r1192 r1195  
    539539        { 
    540540                getRenderQueue()->clear(); 
    541                 if (mKdTree) 
    542                         mKdTree->queueVisibleObjects(cam, getRenderQueue(), onlyShadowCasters, mShowBoxes); 
     541                if (mShowVisualization) 
     542                { 
     543                        PrepareVisualization(cam); 
     544                } 
     545                else 
     546                { 
     547                        mVisibleNodes.clear(); 
     548                        if (mKdTree) 
     549                                mKdTree->queueVisibleObjects(cam, getRenderQueue(), onlyShadowCasters, mShowBoxes, mVisibleNodes); 
     550                } 
    543551        } 
    544552        else 
     
    561569                                getRenderQueue()->clear(); 
    562570                                if (mKdTree) 
    563                                         mKdTree->queueVisibleObjects(cam, getRenderQueue(), onlyShadowCasters, mShowBoxes); 
     571                                        mKdTree->queueVisibleObjects(cam, getRenderQueue(), onlyShadowCasters, mShowBoxes, mVisibleNodes); 
    564572                        } 
    565573 
     
    571579                        //updatePvs(cam); 
    572580                } 
    573         } 
    574  
    575         mVisibleNodes.clear();   
     581                mVisibleNodes.clear();   
     582        } 
    576583} 
    577584 
     
    726733        mVisibleNodes.push_back(node); 
    727734 
    728         //KdRenderableList::const_iterator it = nodelist.begin(); 
    729         //KdRenderableList::const_iterator end = nodelist.end(); 
    730         //while (it != end) 
    731         //{ 
    732         //      if (!(*it)->isQueued(mHierarchyInterface->GetFrameId(), cam)) 
    733         //      { 
    734         //              mVisibleNodes.push_back(*it); 
    735         //              (*it)->queueObjects(cam, getRenderQueue(), onlyShadowCasters); 
    736         //      } 
    737         //      it++; 
    738         //} 
    739  
    740735        _renderQueueGroupObjects(currentGroup, QueuedRenderableCollection::OM_PASS_GROUP); 
    741736} 
     
    937932        if (mRenderNodesForViz || mRenderNodesContentForViz) 
    938933        { 
    939                 // HACK: change node material so it is better suited for visualization 
    940                 //MaterialPtr nodeMat = MaterialManager::getSingleton().getByName("Core/NodeMaterial"); 
     934                RenderQueue * queue = getRenderQueue(); 
     935                unsigned long frameid = 0; 
     936 
     937                if (mRenderMethod == KdTree::KDRM_INTERNAL) 
     938                        frameid = Root::getSingleton().getCurrentFrameNumber(); 
     939                else 
     940                        frameid = mHierarchyInterface->GetFrameId(); 
    941941 
    942942                for (KdTree::NodeList::iterator it = mVisibleNodes.begin(); it != mVisibleNodes.end(); ++it) 
    943943                { 
    944                         if (mRenderNodesForViz) 
     944                        if (mRenderNodesForViz && (*it)->isLeaf()) 
    945945                        { 
    946946                                WireBoundingBox * wirebox = (*it)->getWireBoundingBox(); 
    947                                 if (wirebox) 
    948                                         getRenderQueue()->addRenderable(wirebox); 
     947                                wirebox->setMaterial("KdTree/BoxViz"); 
     948                                getRenderQueue()->addRenderable(wirebox); 
    949949                        } 
    950950                        // add renderables itself 
    951951                        if (mRenderNodesContentForViz)  
    952952                        { 
    953                                 (*it)->queueVisibleObjects(mHierarchyInterface->GetFrameId(),  
    954                                         cam, getRenderQueue(), false, true); 
     953                                (*it)->queueVisibleObjects(frameid, cam, queue, false, false); 
    955954                        } 
    956955                } 
  • GTP/trunk/Lib/Vis/OnlineCullingCHC/OGRE/src/OgreKdTreeSceneNode.cpp

    r1190 r1195  
    142142                        { 
    143143                                Entity *ent = static_cast<Entity *>(movable); 
    144                                 //std::stringstream d; d << "ent " << ent->getName();  
    145                                 //LogManager::getSingleton().logMessage(d.str()); 
    146144                                geometryList->push_back(ent); 
    147145                        } 
  • OGRE/trunk/resources/overlays/TestKdTree.overlay

    r1183 r1195  
    126126                        width 120 
    127127                        height 30 
    128                         caption [Q] Movement 
     128                        caption [U] Movement 
    129129                } 
    130130                element TextArea(KdTree/MovementInfo): KdTree/Templates/BasicText 
     
    135135                        caption : 
    136136                } 
     137                element TextArea(KdTree/TopCam): KdTree/Templates/BasicText 
     138                { 
     139                        left 5 
     140                        width 120 
     141                        height 30 
     142                        caption [I] Viz Cam 
     143                } 
     144                element TextArea(KdTree/TopCamInfo): KdTree/Templates/BasicText 
     145                { 
     146                        left 160 
     147                        width 180 
     148                        height 30 
     149                        caption : 
     150                }                
    137151        } 
    138152         
Note: See TracChangeset for help on using the changeset viewer.