Ignore:
Timestamp:
05/30/05 03:20:23 (20 years ago)
Author:
mattausch
Message:

added depth pass algorithm + delayed transparent object rendering (so depth ordering is right)

Location:
trunk/VUT/work/ogre_changes
Files:
2 added
13 edited

Legend:

Unmodified
Added
Removed
  • trunk/VUT/work/ogre_changes/OgreMain/include/OgreHardwareOcclusionQuery.h

    r92 r115  
    9696      * Pulls the hardware occlusion query too see if there is a result. 
    9797      * @retval NumOfFragments will get the resulting number of fragments. 
    98           * @param waitForResult if true, the query will wait until a result is available 
    99       * @return True if success or false if not. 
    100           * @Remarks Hardware occlusion is an assyncronius process the result may take a frame or so. 
    101           *                     one idea is to test pass1 and if not visible skip pass2. Also note that objects 
    102           *                     not visible must be tested evrey frame. Visable objects don't need testing every frame. 
    103           *                     Testing non visable objects can be don unlit, no texture with low LOD object. 
    104           *        0 will generate all the levels till 1x1. [default: 0] 
    105       */ 
    106 #ifdef GTP_VISIBILITY_MODIFIED_OGRE 
    107           virtual bool pullOcclusionQuery( unsigned int* NumOfFragments, const bool waitForResult ) = 0; 
    108 #else 
    109          virtual bool pullOcclusionQuery( unsigned int* NumOfFragments ) = 0; 
    110 #endif 
    111         /** 
    112       * Pulls the hardware occlusion query too see if there is a result. 
    113       * @retval NumOfFragments will get the resulting number of fragments. 
    114           * @param waitForResult if true, the query will wait until a result is available 
    11598      * @return True if success or false if not. 
    11699          * @Remarks In DX9 mode specifying OCCLUSIONQUERY_FLUSH as the flag, will case the driver to flush whatever API calls are batched. 
    117100          * In OpenGL mode it makes no difference if you specify OCCLUSIONQUERY_FLUSH or OCCLUSIONQUERY_NOFLUSH. 
    118101      */ 
    119 #ifdef GTP_VISIBILITY_MODIFIED_OGRE 
    120         virtual bool pullOcclusionQuery( unsigned int* NumOfFragments, const bool waitForResult, 
    121                                                                          const HW_OCCLUSIONQUERY flag  ) = 0;  
    122 #else 
    123           virtual bool pullOcclusionQuery( unsigned int* NumOfFragments,  
    124                                                                            const HW_OCCLUSIONQUERY flag  ) = 0;  
    125 #endif 
     102        virtual bool pullOcclusionQuery(unsigned int* NumOfFragments, const HW_OCCLUSIONQUERY flag = HWOCCLUSIONQUERY_FLUSH) = 0; 
     103 
    126104        /** 
    127105          * Let's you get the last pixel count with out doing the hardware occlusion test 
     
    143121        virtual void    setSkipRate( int skip ) = 0; 
    144122        virtual int             getSkipRate() = 0; 
     123 
     124#ifdef GTP_VISIBILITY_MODIFIED_OGRE 
     125        /** 
     126                Pulls occlusion query. 
     127                @param NumOfFragments number of visible fragments if query result was available. 
     128                Last query result if query result was not yet available. 
     129 
     130                @param waitForResult if true, the function waits until the result is available. 
     131                Otherwise the function returns immediately, not waiting for the result. 
     132                @returns true if query result was available, false if result was not yet available 
     133        */ 
     134        virtual bool pullOcclusionQuery( unsigned int* NumOfFragments, const bool waitForResult,  
     135                const HW_OCCLUSIONQUERY flag = HWOCCLUSIONQUERY_FLUSH ) = 0;  
     136#endif // GTP_VISIBILITY_MODIFIED_OGRE 
     137 
    145138//---------------------------------------------------------------------- 
    146139// Private members 
  • trunk/VUT/work/ogre_changes/OgreMain/include/OgreSceneManager.h

    r74 r115  
    128128                        @param node scene node to be rendered 
    129129                        @param cam current camera 
     130                        @param leaveTransparentsInQueue if only solid objects should be rendered 
    130131                */ 
    131                 void _renderSceneNode( Camera *cam, SceneNode *node ); 
    132                 /** deletes all queues which we were currently processing 
    133                         @remark clears renderqueue after rendering scene node 
     132                void _renderSceneNode(Camera *cam, SceneNode *node, bool leaveTransparentsInQueue = false); 
     133                /** deletes all processed queues 
     134                        @remark clears render queues after rendering scene node 
    134135                */ 
    135                 void _deleteRenderedQueueGroups(); 
     136                void _deleteRenderedQueueGroups(bool leaveTransparentsInQueue); 
    136137                /** Internal method used by _renderVisibleObjects to deal with renderables 
    137138            which override the camera's own view / projection materices.  
  • trunk/VUT/work/ogre_changes/OgreMain/src/OgreSceneManager.cpp

    r99 r115  
    5959#include "OgreDataStream.h" 
    6060#include "OgreStaticGeometry.h" 
    61 #include <windows.h> //matt: remove later 
     61 
    6262// This class implements the most basic scene manager 
    6363 
     
    665665        if (lastUsedVertexProgram) 
    666666        { 
    667                         //matt: remove later 
    668                         //OutputDebugString("unbinding vertex program\n"); 
    669  
    670667            mDestRenderSystem->unbindGpuProgram(GPT_VERTEX_PROGRAM); 
    671668            lastUsedVertexProgram = false; 
     
    990987                               const String& groupName) 
    991988{ 
    992     mSkyPlaneEnabled = enable; 
    993989    if (enable) 
    994990    { 
     
    10611057 
    10621058    } 
     1059        mSkyPlaneEnabled = enable; 
    10631060} 
    10641061//----------------------------------------------------------------------- 
     
    10711068                             const String& groupName) 
    10721069{ 
    1073     mSkyBoxEnabled = enable; 
    10741070    if (enable) 
    10751071    { 
     
    11431139 
    11441140    } 
    1145  
     1141        mSkyBoxEnabled = enable; 
    11461142} 
    11471143//----------------------------------------------------------------------- 
     
    11571153                              const String& groupName) 
    11581154{ 
    1159     mSkyDomeEnabled = enable; 
    11601155    if (enable) 
    11611156    { 
     
    11641159        { 
    11651160            OGRE_EXCEPT(Exception::ERR_INVALIDPARAMS,  
    1166                 "Sky dome material '" + materialName + " not found.", 
     1161                "Sky dome material '" + materialName + "' not found.", 
    11671162                "SceneManager::setSkyDome"); 
    11681163        } 
     
    12081203 
    12091204    } 
     1205        mSkyDomeEnabled = enable; 
    12101206} 
    12111207//----------------------------------------------------------------------- 
     
    26582654    { 
    26592655        Light* l = i->second; 
     2656                if (l->isVisible()) 
     2657                { 
    26602658        if (l->getType() == Light::LT_DIRECTIONAL) 
    26612659        { 
     
    26752673 
    26762674        } 
     2675    } 
    26772676    } 
    26782677 
     
    41804179#ifdef GTP_VISIBILITY_MODIFIED_OGRE 
    41814180//----------------------------------------------------------------------- 
    4182 void SceneManager::_renderSceneNode( Camera *cam, SceneNode *node ) 
     4181void SceneManager::_renderSceneNode(Camera *cam, SceneNode *node, bool leaveTransparentsInQueue) 
    41834182{ 
    41844183        node->_findVisibleObjects(cam, getRenderQueue(), false, mDisplayNodes, false); 
     
    41864185         
    41874186        // delete all rendered objects from renderqueue 
    4188         _deleteRenderedQueueGroups(); 
    4189 } 
    4190 //----------------------------------------------------------------------- 
    4191 void SceneManager::_deleteRenderedQueueGroups() 
     4187        _deleteRenderedQueueGroups(leaveTransparentsInQueue); 
     4188} 
     4189//----------------------------------------------------------------------- 
     4190void SceneManager::_deleteRenderedQueueGroups(bool leaveTransparentsInQueue) 
    41924191{ 
    41934192        RenderQueue::QueueGroupIterator queueIt = getRenderQueue()->_getQueueGroupIterator(); 
     
    42004199 
    42014200                if (isRenderQueueToBeProcessed(qId)) 
     4201                { 
     4202                        if (leaveTransparentsInQueue) 
     4203                        { 
     4204                                pGroup->clearSolids(); 
     4205                        } 
     4206                        else 
     4207                        { 
    42024208                        pGroup->clear(); 
     4209        } 
     4210                } 
    42034211        } 
    42044212         
  • trunk/VUT/work/ogre_changes/Plugins/OctreeSceneManager/include/OgreOctreeSceneManager.h

    r112 r115  
    105105        /** Renders one octant of an octree, i.e., renders current octant 
    106106                node and does not traverse deeper into the tree. 
     107 
    107108                @remark Note that OctreeNode instances are NOT part of the octree  
    108109                hierarchy, instead one octant of an Octree contains many OctreeNode instances. 
    109                 @param octree the octree to be rendered 
     110                 
    110111                @param cam current camera 
     112                @param octree the octant to be rendered (without children) 
     113                @param onlyShadowCasters if only shadow casters are rendered 
     114                @param leaveTransparentsInQueue if transparemt should be left in queue for later processing 
    111115        */ 
    112         void _renderOctant(Camera* cam, Octree *octree, bool onlyShadowCasters); 
     116        void _renderOctant(Camera* cam, Octree *octree, bool onlyShadowCasters, bool leaveTransparentsInQueue = false); 
    113117 
    114118        /** Returns stored list of boxes */ 
     
    214218    IntersectionSceneQuery* createIntersectionQuery(unsigned long mask); 
    215219 
     220 
    216221protected: 
    217222 
  • trunk/VUT/work/ogre_changes/Plugins/OctreeSceneManager/src/OgreOctree.cpp

    r61 r115  
    109109                mDepth = 0; 
    110110 
    111         //matt: remove later 
    112         //char msg[100]; 
    113         //sprintf(msg, "creating new octant in depth %d", mDepth); 
    114         //OutputDebugString(msg); 
    115  
    116111#endif //GTP_VISIBILITY_MODIFIED_OGRE 
    117112    mNumNodes = 0; 
     
    171166 
    172167        mWireBoundingBox->setupBoundingBox(mBox); 
    173  
    174         // matt: change this back 
    175         //AxisAlignedBox box; _getCullBounds(&box);  
    176         //mWireBoundingBox->setupBoundingBox(box); 
    177  
    178168    return mWireBoundingBox; 
    179169} 
  • trunk/VUT/work/ogre_changes/Plugins/OctreeSceneManager/src/OgreOctreeSceneManager.cpp

    r112 r115  
    3939#include <OgreOctreeCamera.h> 
    4040#include <OgreRenderSystem.h> 
    41 #include <windows.h> 
     41 
    4242 
    4343extern "C" 
     
    508508        } 
    509509 
    510                 //matt: remove later 
    511                 //OutputDebugString("adding octree node\n"); 
    512                  
    513  
    514510        _addOctreeNode( n, octant -> mChildren[ x ][ y ][ z ], ++depth ); 
    515511 
     
    11731169} 
    11741170//----------------------------------------------------------------------- 
    1175 void OctreeSceneManager::_renderOctant(Camera *cam, Octree *octant, bool onlyShadowCasters) 
     1171void OctreeSceneManager::_renderOctant(Camera *cam, Octree *octant, bool onlyShadowCasters,  
     1172                                                                           bool leaveTransparentsInQueue)//, bool useZPassQueue) 
    11761173{ 
    11771174        //Add stuff to be rendered; 
     
    11881185                { 
    11891186                        sn->_addToRenderQueue(cam, getRenderQueue(), onlyShadowCasters); 
    1190                         //node->_findVisibleObjects(cam, getRenderQueue(), false, mDisplayNodes, false); 
    11911187                        mVisible.push_back(sn); 
    11921188 
     
    12071203        if (mShowBoxes) 
    12081204        { 
     1205                octant->getWireBoundingBox()->setMaterial("BaseWhiteNoLighting"); 
     1206 
    12091207                getRenderQueue()->addRenderable(octant->getWireBoundingBox()); 
    12101208                mBoxes.push_back(octant->getWireBoundingBox()); 
    12111209        } 
    12121210 
     1211        //-- the actual rendering 
    12131212        SceneManager::_renderVisibleObjects(); 
    1214  
    12151213        // delete all rendered objects from the render queue 
    1216         _deleteRenderedQueueGroups(); 
     1214        _deleteRenderedQueueGroups(leaveTransparentsInQueue); 
    12171215} 
    12181216#endif // GTP_VISIBILITY_MODIFIED_OGRE 
  • trunk/VUT/work/ogre_changes/RenderSystems/Direct3D9/include/OgreD3D9HardwareOcclusionQuery.h

    r92 r115  
    3333namespace Ogre { 
    3434 
    35  
    36  
    3735// If you use multiple rendering passes you can test only the first pass and all other passes don't have to be rendered  
    38 // if the first pass resultet has too few pixels visable. 
     36        // if the first pass resultet has too few pixels visible. 
    3937 
    4038// Be sure to render all occlluder first and whats out so the RenderQue don't switch places on  
     
    4644  * 
    4745  * @author Lee Sandberg, email lee@abcmedia.se 
     46        * 
     47        * Updated on 12/7/2004 by Chris McGuirk 
    4848  */ 
    4949class D3D9HardwareOcclusionQuery : public HardwareOcclusionQuery 
     
    7171        void beginOcclusionQuery();      
    7272        void endOcclusionQuery(); 
     73                bool pullOcclusionQuery( unsigned int* NumOfFragments, const HW_OCCLUSIONQUERY flag = HWOCCLUSIONQUERY_FLUSH); 
     74                unsigned int getLastQuerysPixelcount() { return mPixelCount; } 
    7375 
    74 #ifdef GTP_VISIBILITY_MODIFIED_OGRE 
    75         bool pullOcclusionQuery( unsigned int* NumOfFragments, const bool waitForResult, 
    76                                                          const HW_OCCLUSIONQUERY flag  );  
    77         bool pullOcclusionQuery( unsigned int* NumOfFragments, const bool waitForResult ); 
    78 #else 
    79         bool pullOcclusionQuery( unsigned int* NumOfFragments ); 
    80         bool pullOcclusionQuery( unsigned int* NumOfFragments, const HW_OCCLUSIONQUERY flag  );  
    81 #endif // GTP_VISIBILITY_MODIFIED_OGRE 
    82  
    83         unsigned int getLastQuerysPixelcount() { return m_uintPixelCount; } 
    84          
    85         // This functions are optional, it's a simple filter that simply skips some hardware occlusion tests on visable objects only 
    86         // It's easy to use if you don't have to keep track on which objects are visable (can be skipped) and what objects arn't visable.. 
    87         // (None visable objects and object you introduce for the first time have allways to be tested allthough the cheepest possible  
    88         // LOD (Level Of Detail) mesh and material wize).  
     76                // These functions are optional, it's a simple filter that simply skips some hardware occlusion tests on visible objects only 
     77                // It's easy to use if you don't have to keep track of which objects are visible (can be skipped) and what objects arn't visible.. 
     78                // (None visible objects and object you introduce for the first time have always to be tested although the cheapest possible  
     79                // LOD (Level Of Detail) mesh and material-wise).  
    8980 
    9081        /** 
    9182          *    
    92           * Remarks This function allows you to set how often the hardware occlusion really are sent to the driver 
     83                * Remarks This function allows you to set how often the hardware occlusion query is sent to the driver 
    9384          * if you set it to 0 every hw occlusion test is acctually made. If you set it to 1 only the half of your queries are sent  
    94           * for all visable objects. 2 will result in 25% of all queries to acctualy be sent.  
    95           * New and none visable objects will be tested all the time. 
    96           * This functionality is here because this class can keep track on visable and none visable objects for you. 
     85                * 2 will result in 25% of all queries to acctualy be sent.  
     86                * This functionality is here because this class can keep track on visible and none visible objects for you. 
    9787          * Once you you set the SkipRate for any hardware occlusion instance it effects all others. 
    9888          */ 
    9989 
     90                void setSkipRate( int skip ) { mSkipInterval = skip; }                  // Using 2 only 50 % of the tests are actully made and 3 results in only 33% of the tests. So on. 
     91                int      getSkipRate() { return mSkipInterval; }  
    10092 
    101         void setSkipRate( int skip ) { m_Skip = skip; }                 // Using 2 only 50 % of the tests are actually made and 3 results in only 33% of the tests. So on. 
    102         int      getSkipRate() { return m_Skip; }  
    103  
     93#ifdef GTP_VISIBILITY_MODIFIED_OGRE 
     94        bool pullOcclusionQuery( unsigned int* NumOfFragments, const bool waitForResult, const HW_OCCLUSIONQUERY flag = HWOCCLUSIONQUERY_FLUSH );  
     95#endif // GTP_VISIBILITY_MODIFIED_OGRE 
    10496//---------------------------------------------------------------------- 
    10597// Protected members 
     
    10799protected: 
    108100 
    109         bool pullOcclusionQuery( unsigned int* NumOfFragments, const bool waitForResult,  
    110                                                      const DWORD queryFlag ); 
    111  
    112         unsigned int            m_uintPixelCount;                
    113         IDirect3DQuery9*        m_pD3DQuery; 
    114         IDirect3DDevice9*   m_pD3DDevice;       // d3d device 
    115         bool                            m_bOcclusionQuery; 
    116         int                                     m_SkipCounter;          // m_SkipConter =  m_SkipConter % m_Skip; if ( m_SkipConter == 0 && m_uintPixelCount !=0 ) TestHWOcclusion else just return  
    117         static int                      m_Skip;                         // This is shared by all instancies 
    118         bool                            m_bHWOcclusionSupport; 
     101                unsigned int            mPixelCount;             
     102                IDirect3DQuery9*        mpQuery; 
     103                IDirect3DDevice9*   mpDevice; 
     104                int                                     mSkipCounter; 
     105                int                                     mSkipInterval; 
     106                bool                            mHasOcclusionSupport; 
    119107}; 
    120108 
  • trunk/VUT/work/ogre_changes/RenderSystems/Direct3D9/src/OgreD3D9HardwareOcclusionQuery.cpp

    r97 r115  
    2929namespace Ogre { 
    3030 
    31 int D3D9HardwareOcclusionQuery::m_Skip = 0; 
    32  
    3331/** 
    3432  * This is a class that is the DirectX9 implementation of  
     
    3634  * 
    3735  * @author Lee Sandberg 
     36        * 
     37        * Updated on 12/7/2004 by Chris McGuirk 
    3838  */ 
    3939 
    4040/** 
    4141  * Default object constructor 
    42   *  
    4342  */ 
    4443D3D9HardwareOcclusionQuery::D3D9HardwareOcclusionQuery( IDirect3DDevice9* pD3DDevice )  
    4544{  
    46         m_pD3DDevice = pD3DDevice; 
    47         m_uintPixelCount = 0;  
    48         m_SkipCounter = 0; 
    49         m_bHWOcclusionSupport = false; 
     45                mpDevice = pD3DDevice; 
     46                mPixelCount = 0;  
     47                mSkipCounter = 0; 
     48                mSkipInterval = 0; 
     49                mHasOcclusionSupport = false; 
    5050 
    51         HRESULT hr = m_pD3DDevice->CreateQuery(D3DQUERYTYPE_OCCLUSION, &m_pD3DQuery); 
     51                // create the occlusion query 
     52                HRESULT hr = mpDevice->CreateQuery(D3DQUERYTYPE_OCCLUSION, &mpQuery); 
     53 
    5254        if ( hr != D3D_OK )  
    5355        { 
    54                 //OGRE_EXCEPT(hr, "D3D9HardwareOcclusionQuery couldn't create hardware occlusion query object.",  
    55         //        "D3D9HardwareOcclusionQuery::D3D9HardwareOcclusionQuery"); 
    56                 m_bHWOcclusionSupport = false; 
     56                        mHasOcclusionSupport = false; 
    5757        } 
    5858        else  
    5959        { 
    60                 m_bHWOcclusionSupport = true; 
     60                        mHasOcclusionSupport = true; 
    6161        } 
    6262} 
    63  
    6463 
    6564/** 
     
    6867D3D9HardwareOcclusionQuery::~D3D9HardwareOcclusionQuery()  
    6968{  
    70         SAFE_RELEASE( m_pD3DQuery );  
     69                SAFE_RELEASE(mpQuery);  
    7170} 
    7271 
    73 #ifndef GTP_VISIBILITY_MODIFIED_OGRE 
    7472//------------------------------------------------------------------ 
    7573// Occlusion query functions (see base class documentation for this) 
     
    7775void D3D9HardwareOcclusionQuery::beginOcclusionQuery()  
    7876{  
    79         if( m_bHWOcclusionSupport )             // Make it fail silently if hardware occlusion isn't supported 
     77                // Make it fail silently if hardware occlusion isn't supported 
     78                if(mHasOcclusionSupport) 
    8079        { 
    81                 if  ( m_SkipCounter ==  m_Skip ) { m_SkipCounter = 0; };                // Counter starts at 0 again at m_Skip  
    82                  
    83                 if ( m_SkipCounter == 0 && m_uintPixelCount != 0 )      // New or none visable objects must allways be tested but visable objects can be skiped 
     80#ifndef GTP_VISIBILITY_MODIFIED_OGRE 
     81                        // Counter starts at 0 again at mSkipInterval  
     82                        if(mSkipCounter == mSkipInterval)  
     83#else 
     84                        if (mSkipCounter >= mSkipInterval)  // otherwise no query ever issued if mSkipInterval = 0 ! 
     85#endif // GTP_VISIBILITY_MODIFIED_OGRE 
    8486                { 
    85                         m_pD3DQuery->Issue(D3DISSUE_BEGIN);  
     87                                mSkipCounter = 0;  
     88} 
     89                        //std::stringstream d; d << "count: " << mSkipCounter; 
     90                        //LogManager::getSingleton().logMessage(d.str()); 
     91                        if (mSkipCounter == 0) 
     92                { 
     93                                mpQuery->Issue(D3DISSUE_BEGIN);  
    8694                } 
    8795        } 
     96         
    8897} 
    89          
    90 void D3D9HardwareOcclusionQuery::endOcclusionQuery()  
    91 {  
    92         if( m_bHWOcclusionSupport )     // Make it fail silently if hardware occlusion isn't supported 
     98 
     99        void D3D9HardwareOcclusionQuery::endOcclusionQuery()  
    93100        { 
    94                 if (m_SkipCounter == 0 && m_uintPixelCount != 0 ) // New or none visable objects must allways be tested but visable objects can be skiped 
    95                 { 
    96                         m_pD3DQuery->Issue(D3DISSUE_END);  
    97                 } 
    98                 m_SkipCounter++;                                                                 // The skip counter is increased  
     101                // Make it fail silently if hardware occlusion isn't supported 
     102                if(mHasOcclusionSupport) 
     103                        { 
     104                        if(mSkipCounter == 0) 
     105                        {  
     106                                mpQuery->Issue(D3DISSUE_END);  
     107        } 
     108 
     109                        // The skip counter is increased 
     110                        mSkipCounter++;  
    99111        } 
    100112} 
    101113 
    102114//------------------------------------------------------------------ 
    103 // This version of pullOcclusionQuery cases the DX9 API/Driver to flush all commands to the 3D card 
    104 // to allow a fast result from the query, but at the cost of poorer batching of API calls to the card. 
    105 // Note: OpenGL dosn't use this flag at all so the application running OpenGL won't display any different behaviour. 
    106 //-- 
    107 bool D3D9HardwareOcclusionQuery::pullOcclusionQuery( unsigned int* NumOfFragments)  
    108 { 
    109         HRESULT hr; 
    110          
    111         if( m_bHWOcclusionSupport )     // Make it fail silently if hardware occlusion isn't supported 
    112         { 
    113                 hr = m_pD3DQuery->GetData( NumOfFragments, sizeof( NumOfFragments ), D3DGETDATA_FLUSH ); 
    114  
    115                 if ( hr != S_OK )  
    116                         { 
    117                                 return false;  
    118                         } 
    119                         else  
    120                         {  
    121                                 m_uintPixelCount = *NumOfFragments;  
    122                                 return true;  
    123                         } 
    124         } 
    125         else 
    126         { 
    127                 m_uintPixelCount = 100000; // Fails quitlly if hardware occlusion is not supported - every object is visable 
    128                 return true; 
    129         } 
    130 } 
    131  
    132 //------------------------------------------------------------------ 
    133 // This version of pullOcclusionQuery cases the DX9 API/Driver to not flush all commands to the 3D card 
     115        // This version of pullOcclusionQuery causes the DX9 API/Driver to not flush all commands to the 3D card 
    134116// to allow a fast result from the query, but the batching of API calls to the card will be normal.  
    135 // But the query wont be processed until the card recives the query in the nexr batch. 
     117        // But the query wont be processed until the card recives the query in the next batch. 
    136118// Note: OpenGL dosn't use this flag at all so the application running OpenGL won't display any different behaviour. 
    137119//-- 
     
    140122        HRESULT hr; 
    141123 
    142         // TO DO: USE lockOpts= D3D9Mappings::get(options); instead of RS_OCCLUSIONQUERY enum 
     124                // Make it fail silently if hardware occlusion isn't supported 
     125                if(mHasOcclusionSupport) 
     126        { 
     127                        DWORD d3dFlags = (flag == HWOCCLUSIONQUERY_FLUSH) ? D3DGETDATA_FLUSH : 0; 
     128         
     129                        // run until success (http://www.gamedev.net/reference/programming/features/occlusionculling/page2.asp) 
     130                        while(hr = mpQuery->GetData( NumOfFragments, sizeof( NumOfFragments ), d3dFlags) == S_FALSE); 
    143131 
    144         if( m_bHWOcclusionSupport )     // Make it fail silently if hardware occlusion isn't supported 
    145         { 
    146          
    147                 switch( flag ) 
    148                 { 
    149                         case HWOCCLUSIONQUERY_FLUSH :    
    150                                 hr = m_pD3DQuery->GetData( NumOfFragments, sizeof( NumOfFragments ), D3DGETDATA_FLUSH ); 
    151                         break; 
    152  
    153                         case HWOCCLUSIONQUERY_NOFLUSH :  
    154                                 hr = m_pD3DQuery->GetData( NumOfFragments, sizeof( NumOfFragments ), 0 ); 
    155                         break; 
    156                 }; 
    157  
    158  
    159  
    160                 if ( hr != S_OK )  
    161                         { 
    162                                 return false;  
     132                        mPixelCount = *NumOfFragments; 
    163133                        } 
    164134                        else  
    165135                        {  
    166                                 m_uintPixelCount = *NumOfFragments;  
    167                                 return true;  
     136                        // fail silently if not supported, assume visible i suppose 
     137                        mPixelCount = 100000; 
    168138                        } 
    169         } 
    170         else  
    171         { 
    172                 m_uintPixelCount = 100000; // Fails quitlly if hardware occlusion is not supported - every object is visable 
     139 
    173140                return true; 
    174141        } 
    175 } 
    176 #else // GTP_VISIBILITY_MODIFIED_OGRE 
     142 
     143#ifdef GTP_VISIBILITY_MODIFIED_OGRE 
    177144//------------------------------------------------------------------ 
    178 void D3D9HardwareOcclusionQuery::beginOcclusionQuery()  
    179 {  
    180         if( m_bHWOcclusionSupport )             // Make it fail silently if hardware occlusion isn't supported 
     145        bool D3D9HardwareOcclusionQuery::pullOcclusionQuery( unsigned int* NumOfFragments, const bool waitForResult,  
     146                                                                                                             const HW_OCCLUSIONQUERY flag )  
    181147        { 
    182                 m_pD3DQuery->Issue(D3DISSUE_BEGIN);  
     148                HRESULT hr = S_OK; 
     149                DWORD queryFlag = (flag == HWOCCLUSIONQUERY_FLUSH) ? D3DGETDATA_FLUSH : 0; 
     150 
     151                if (mHasOcclusionSupport)       // In case hardware occlusion isn't supported 
     152                {        
     153                        do 
     154                        { 
     155                                hr = mpQuery->GetData(NumOfFragments, sizeof(NumOfFragments), queryFlag); 
     156                } 
     157                        while(waitForResult && (hr == S_FALSE)); 
     158                 
     159                        mPixelCount = *NumOfFragments; 
     160                } 
     161                else 
     162                { 
     163                        mPixelCount = 100000; // every object is visible 
     164                } 
     165         
     166                return hr == S_OK; 
    183167        } 
    184 } 
    185 //------------------------------------------------------------------ 
    186 void D3D9HardwareOcclusionQuery::endOcclusionQuery()  
    187 {  
    188         if( m_bHWOcclusionSupport )     // Make it fail silently if hardware occlusion isn't supported 
    189         { 
    190                 m_pD3DQuery->Issue(D3DISSUE_END);  
    191         } 
    192 } 
    193 //------------------------------------------------------------------ 
    194 bool D3D9HardwareOcclusionQuery::pullOcclusionQuery( unsigned int* NumOfFragments, const bool waitForResult )  
    195 { 
    196         return pullOcclusionQuery(NumOfFragments, waitForResult, HWOCCLUSIONQUERY_FLUSH); 
    197 } 
    198  
    199 //------------------------------------------------------------------ 
    200 bool D3D9HardwareOcclusionQuery::pullOcclusionQuery( unsigned int* NumOfFragments, const bool waitForResult,  
    201                                                                                                      const HW_OCCLUSIONQUERY flag  )  
    202 { 
    203         DWORD queryFlag = flag == HWOCCLUSIONQUERY_FLUSH ? D3DGETDATA_FLUSH : 0; 
    204         // TO DO: USE lockOpts= D3D9Mappings::get(options); instead of RS_OCCLUSIONQUERY enum 
    205  
    206         return pullOcclusionQuery(NumOfFragments, waitForResult, queryFlag); 
    207 } 
    208  
    209 //------------------------------------------------------------------ 
    210 bool D3D9HardwareOcclusionQuery::pullOcclusionQuery( unsigned int* NumOfFragments, const bool waitForResult,  
    211                                                                                                      const DWORD queryFlag )  
    212 { 
    213         HRESULT hr = S_OK; 
    214  
    215         if( m_bHWOcclusionSupport )     // In case hardware occlusion isn't supported 
    216         {        
    217                 do 
    218                 { 
    219                         hr = m_pD3DQuery->GetData( NumOfFragments, sizeof( NumOfFragments ), queryFlag ); 
    220                 } 
    221                 while(waitForResult && (hr == S_FALSE)); 
    222                  
    223                 m_uintPixelCount = *NumOfFragments;  
    224         } 
    225         else 
    226         { 
    227                 m_uintPixelCount = 100000; // every object is visible 
    228         } 
    229          
    230         return hr == S_OK; 
    231 } 
    232168 
    233169 
    234170#endif // GTP_VISIBILITY_MODIFIED_OGRE 
    235171 
    236 } // namespace OGre 
     172 
     173} 
  • trunk/VUT/work/ogre_changes/RenderSystems/GL/include/OgreGLHardwareOcclusionQuery.h

    r92 r115  
    8888        void beginOcclusionQuery(); 
    8989        void endOcclusionQuery(); 
    90  
    91 #ifdef GTP_VISIBILITY_MODIFIED_OGRE 
    92         bool pullOcclusionQuery( unsigned int* NumOfFragments, const bool waitForResult, 
    93                                                          const HW_OCCLUSIONQUERY flag  );  
    94         bool pullOcclusionQuery( unsigned int* NumOfFragments, const bool waitForResult ); 
    95 #else 
    96         bool pullOcclusionQuery( unsigned int* NumOfFragments ); 
    9790        bool pullOcclusionQuery( unsigned int* NumOfFragments, const HW_OCCLUSIONQUERY flag  );  
    98 #endif // GTP_VISIBILITY_MODIFIED_OGRE 
    99  
    100         unsigned int getLastQuerysPixelcount() { return m_uintPixelCount; } 
     91        unsigned int getLastQuerysPixelcount() { return mPixelCount; } 
    10192 
    10293        // This functions are optional, it's a simple filter that simply skipps some hardware occlusion tests on visable objects only 
     
    115106          */ 
    116107 
    117         void setSkipRate( int skip ) { m_Skip = skip; }         // Using 2 only 50 % of the tests are actully made and 3 results in only 33% of the tests. So on. 
    118         int      getSkipRate() { return m_Skip; }  
     108        void setSkipRate( int skip ) { mSkipInterval = skip; }          // Using 2 only 50 % of the tests are actully made and 3 results in only 33% of the tests. So on. 
     109        int      getSkipRate() { return mSkipInterval; }  
    119110 
    120  
     111#ifdef GTP_VISIBILITY_MODIFIED_OGRE 
     112        bool pullOcclusionQuery( unsigned int* NumOfFragments, const bool waitForResult, const HW_OCCLUSIONQUERY flag = HWOCCLUSIONQUERY_FLUSH );  
     113#endif // GTP_VISIBILITY_MODIFIED_OGRE 
    121114//---------------------------------------------------------------------- 
    122115// Protected members 
     
    124117protected: 
    125118 
    126         unsigned int    m_uintPixelCount; 
    127         unsigned int    m_uintQuery[1]; 
     119        unsigned int    mPixelCount; 
     120        GLuint                  mQueryID; 
    128121        bool                    m_bOcclusionQuery; 
    129         int                             m_SkipCounter;          // m_SkipConter =  m_SkipConter % m_Skip; if ( m_SkipConter == 0 && m_uintPixelCount !=0 ) TestHWOcclusion else just return  
    130         static int              m_Skip;                         // This is shared by all instancies 
    131         bool                    m_bHWOcclusionSupport; 
     122        int                             mSkipCounter; 
     123        int                             mSkipInterval; 
     124        bool                    mHasOcclusionSupport; 
    132125}; 
    133  
    134126 
    135127} 
  • trunk/VUT/work/ogre_changes/RenderSystems/GL/include/OgreGLPrerequisites.h

    r97 r115  
    7070extern GL_SecondaryColorPointerEXT_Func glSecondaryColorPointerEXT_ptr; 
    7171 
     72// Pointer to glSecondaryColor3fEXT function 
     73typedef void (APIENTRY *GL_SecondaryColor3fEXT_Func)(GLfloat, GLfloat, GLfloat); 
     74extern GL_SecondaryColor3fEXT_Func glSecondaryColor3fEXT_ptr; 
     75 
    7276// Pointer to glGenBuffersARB function 
    7377typedef void (APIENTRY *GL_GenBuffersARB_Func)(GLsizei, GLuint*); 
     
    208212extern GL_GetOcclusionQueryuivNV_Func glGetOcclusionQueryuivNV_ptr; 
    209213 
    210 #ifdef GTP_VISIBILITY_MODIFIED_OGRE 
    211 // Pointer to glGenQueriesARB function 
    212 typedef void (APIENTRY *GL_GenQueriesARB_Func) (GLsizei n, GLuint *ids); 
    213 extern GL_GenQueriesARB_Func glGenQueriesARB_ptr; 
    214  
    215 // Pointer to glDeleteQueriesARB function 
    216 typedef void (APIENTRY *GL_DeleteQueriesARB_Func) (GLsizei n, const GLuint *ids); 
    217 extern GL_DeleteQueriesARB_Func glDeleteQueriesARB_ptr; 
    218  
    219 // Pointer to glIsQueryARB function 
    220 typedef GLboolean (APIENTRY *GL_IsQueryARB_Func) (GLuint id); 
    221 extern GL_IsQueryARB_Func glIsQueryARB_ptr; 
    222  
    223 // Pointer to glBeginQueryARB function 
    224 typedef void (APIENTRY *GL_BeginQueryARB_Func) (GLenum target, GLuint id); 
    225 extern GL_BeginQueryARB_Func glBeginQueryARB_ptr; 
    226  
    227 // Pointer to glEndQueryARB function 
    228 typedef void (APIENTRY *GL_EndQueryARB_Func) (GLenum target); 
    229 extern GL_EndQueryARB_Func glEndQueryARB_ptr; 
    230  
    231 // Pointer to glGetQueryivARB function 
    232 typedef void (APIENTRY *GL_GetQueryivARB_Func) (GLuint id, GLenum pname, GLint *params); 
    233 extern GL_GetQueryivARB_Func glGetQueryivARB_ptr; 
    234  
    235 // Pointer to glGetQueryObjectivARB function 
    236 typedef void (APIENTRY *GL_GetQueryObjectivARB_Func) (GLuint id, GLenum pname, GLint *params); 
    237 extern GL_GetQueryObjectivARB_Func glGetQueryObjectivARB_ptr; 
    238  
    239 // Pointer to glGetQueryObjectuivARB function 
    240 typedef void (APIENTRY *GL_GetQueryObjectuivARB_Func) (GLuint id, GLenum pname, GLuint *params); 
    241 extern GL_GetQueryObjectuivARB_Func glGetQueryObjectuivARB_ptr; 
    242  
    243 #endif // GTP_VISIBILITY_MODIFIED_OGRE 
    244  
    245214extern PFNGLCOMPRESSEDTEXIMAGE1DARBPROC glCompressedTexImage1DARB_ptr; 
    246215extern PFNGLCOMPRESSEDTEXIMAGE2DARBPROC glCompressedTexImage2DARB_ptr; 
     
    253222}; 
    254223 
     224// Pointer to glGenQueriesARB function 
     225typedef void (APIENTRY *GL_GenQueriesARB_Func) (GLuint n, GLuint *ids); 
     226extern GL_GenQueriesARB_Func glGenQueriesARB_ptr; 
     227 
     228// Pointer to glDeleteQueriesARB function 
     229typedef void (APIENTRY *GL_DeleteQueriesARB_Func) (GLuint n, const GLuint *ids); 
     230extern GL_DeleteQueriesARB_Func glDeleteQueriesARB_ptr; 
     231 
     232// Pointer to glBeginQueryARB function 
     233typedef void (APIENTRY *GL_BeginQueryARB_Func) (GLenum target, GLuint id); 
     234extern GL_BeginQueryARB_Func glBeginQueryARB_ptr; 
     235 
     236// Pointer to glEndQueryARB function 
     237typedef void (APIENTRY *GL_EndQueryARB_Func) (GLenum target); 
     238extern GL_EndQueryARB_Func glEndQueryARB_ptr; 
     239#ifdef GTP_VISIBILITY_MODIFIED_OGRE 
     240// Pointer to glGetQueryivARB function 
     241typedef void (APIENTRY *GL_GetQueryivARB_Func) (GLuint id, GLenum pname, GLint *params); 
     242extern GL_GetQueryivARB_Func glGetQueryivARB_ptr; 
     243 
     244// Pointer to glGetQueryObjectivARB function 
     245typedef void (APIENTRY *GL_GetQueryObjectivARB_Func) (GLuint id, GLenum pname, GLint *params); 
     246extern GL_GetQueryObjectivARB_Func glGetQueryObjectivARB_ptr; 
     247#endif // GTP_VISIBILITY_MODIFIED_OGRE 
     248// Pointer to glGetQueryObjectuivARB function 
     249typedef void (APIENTRY *GL_GetQueryObjectuivARB_Func) (GLuint id, GLenum pname, GLuint *params); 
     250extern GL_GetQueryObjectuivARB_Func glGetQueryObjectuivARB_ptr; 
    255251 
    256252 
  • trunk/VUT/work/ogre_changes/RenderSystems/GL/src/OgreGLHardwareOcclusionQuery.cpp

    r99 r115  
    2727#include "OgreException.h" 
    2828 
     29 
    2930namespace Ogre { 
    30  
    31 int GLHardwareOcclusionQuery::m_Skip = 0; 
    3231 
    3332/** 
     
    3635  * 
    3736  * @author Lee Sandberg email: lee@abcmedia.se 
     37  * 
     38  * Updated on 12/7/2004 by Chris McGuirk 
     39  * - Implemented ARB_occlusion_query 
    3840  */ 
    3941 
    40 /* Functions used; 
    41  
    42 glGenOcclusionQueriesNV_ptr( 1, m_uintQuery ); 
    43 glDeleteOcclusionQueriesNV_ptr( 1, &m_uintQuery[0] ); 
    44 glBeginOcclusionQueryNV_ptr( m_uintQuery[0] ); 
    45 glEndOcclusionQueryNV_ptr(); 
    46 glGetOcclusionQueryuivNV_ptr( m_uintQuery[0], GL_PIXEL_COUNT_NV, NumOfFragments ); 
    47  
    48   TO DO: change this to the new ARB functions... 
    49  
    50 */ 
    51  
    52 #ifndef GTP_VISIBILITY_MODIFIED_OGRE 
    5342/** 
    5443  * Default object constructor 
     
    5746GLHardwareOcclusionQuery::GLHardwareOcclusionQuery()  
    5847{  
    59         m_uintPixelCount = 0;  
    60         m_SkipCounter = 0; 
     48        mPixelCount = 0;  
     49        mSkipCounter = 0; 
     50        mSkipInterval = 0; 
    6151 
    6252        // Check for hardware occlusion support 
    63     if( glDeleteOcclusionQueriesNV_ptr != 0 )   // This is a hack to see if hw occlusion is supported. pointer is 0 if it's not supported. 
     53        // This is a hack to see if hw occlusion is supported. pointer is 0 if it's not supported. 
     54        //if (glGenQueriesARB_ptr != 0) 
     55        if (glGenOcclusionQueriesNV_ptr != 0) 
    6456    { 
    65                 m_bHWOcclusionSupport = true; 
     57                mHasOcclusionSupport = true; 
    6658        } 
    6759        else 
    6860        { 
    69                 m_bHWOcclusionSupport = false; 
     61                mHasOcclusionSupport = false; 
    7062        } 
    7163 
    72         if( m_bHWOcclusionSupport ) 
     64        if(mHasOcclusionSupport) 
    7365        { 
    74                 glGenOcclusionQueriesNV_ptr( 1, m_uintQuery );   
     66                //glGenQueriesARB_ptr(1, &mQueryID );    
     67                glGenOcclusionQueriesNV_ptr(1, &mQueryID); 
    7568        } 
    7669} 
    77  
    7870 
    7971/** 
     
    8274GLHardwareOcclusionQuery::~GLHardwareOcclusionQuery()  
    8375{  
    84         if( m_bHWOcclusionSupport ) 
     76        if( mHasOcclusionSupport ) 
    8577        { 
    86                 glDeleteOcclusionQueriesNV_ptr( 1, &m_uintQuery[0] );   
     78                //glDeleteQueriesARB_ptr(1, &mQueryID);   
     79                glDeleteOcclusionQueriesNV_ptr(1, &mQueryID);   
    8780        }        
    8881} 
     
    9386void GLHardwareOcclusionQuery::beginOcclusionQuery()  
    9487{  
    95         if( m_bHWOcclusionSupport )     // Make it fail silently if hardware occlusion isn't supported 
     88        // Make it fail silently if hardware occlusion isn't supported 
     89        if(mHasOcclusionSupport) 
    9690        { 
    97                 if  ( m_SkipCounter ==  m_Skip ) { m_SkipCounter = 0; };                // Counter starts at 0 again at m_Skip  
    98                 if ( m_SkipCounter == 0 && m_uintPixelCount != 0 ) // New or none visable objects must allways be tested but visable objects can be skiped 
     91                // Counter starts at 0 again at mSkipInterval  
     92#ifndef GTP_VISIBILITY_MODIFIED_OGRE 
     93                if(mSkipCounter == mSkipInterval)  
     94#else 
     95                if (mSkipCounter >= mSkipInterval)  // otherwise no query ever issued if mSkipInterval = 0 ! 
     96#endif // GTP_VISIBILITY_MODIFIED_OGRE 
     97        { 
     98                        mSkipCounter = 0;  
     99                } 
     100 
     101                if (mSkipCounter == 0) 
    99102                { 
    100                         glBeginOcclusionQueryNV_ptr( m_uintQuery[0] ); 
     103                        //glBeginQueryARB_ptr(GL_SAMPLES_PASSED_ARB, mQueryID); 
     104                        glBeginOcclusionQueryNV_ptr(mQueryID); 
    101105                } 
    102106        } 
     
    105109void GLHardwareOcclusionQuery::endOcclusionQuery()  
    106110{  
    107         if( m_bHWOcclusionSupport )     // Make it fail silently if hardware occlusion isn't supported 
     111        // Make it fail silently if hardware occlusion isn't supported 
     112        if(mHasOcclusionSupport) 
    108113        { 
    109                 if( m_SkipCounter == 0 && m_uintPixelCount != 0 ) // New or none visable objects must allways be tested but visable objects can be skiped 
     114                if( mSkipCounter == 0) 
    110115                { 
     116                        //glEndQueryARB_ptr(GL_SAMPLES_PASSED_ARB); 
    111117                        glEndOcclusionQueryNV_ptr(); 
    112118                } 
    113                 m_SkipCounter++; 
    114         } 
    115 } 
    116119 
    117 bool GLHardwareOcclusionQuery::pullOcclusionQuery( unsigned int * NumOfFragments)  
    118 { 
    119         if( m_bHWOcclusionSupport )     // Make it fail silently if hardware occlusion isn't supported 
    120         { 
    121                 glGetOcclusionQueryuivNV_ptr( m_uintQuery[0], GL_PIXEL_COUNT_NV, NumOfFragments ); 
     120                mSkipCounter++; 
    122121        }  
    123         else 
    124         { 
    125                 *NumOfFragments = 100000;               // Fails quitlly -> every object tested is visable. 
    126         } 
    127  
    128         m_uintPixelCount = *NumOfFragments;  
    129  
    130         return true; 
    131122} 
    132123 
    133124//------------------------------------------------------------------ 
    134 // OpenGL dosn't use the flag, but to fulfil the abstract interface we need to include this function. 
    135 // Using this function in OpenGL mode simple works the same way as calling the other function without the flag parameter, 
    136 // but in DX9 it works differentlly, see notes in the DX9 implementation. 
    137 //-- 
     125// OpenGL dosn't use the flag paramter. 
     126//------------------------------------------------------------------ 
    138127bool GLHardwareOcclusionQuery::pullOcclusionQuery( unsigned int* NumOfFragments, const HW_OCCLUSIONQUERY flag  )  
    139128{ 
    140         if( m_bHWOcclusionSupport )     // Make it fail silently if hardware occlusion isn't supported 
     129        if( mHasOcclusionSupport )      // Make it fail silently if hardware occlusion isn't supported 
    141130        { 
    142                 glGetOcclusionQueryuivNV_ptr( m_uintQuery[0], GL_PIXEL_COUNT_NV, NumOfFragments ); 
     131                //glGetQueryObjectuivARB_ptr(mQueryID, GL_QUERY_RESULT_ARB, NumOfFragments); 
     132glGetOcclusionQueryuivNV_ptr(mQueryID, GL_PIXEL_COUNT_NV, NumOfFragments); 
    143133        } 
    144134        else 
     
    147137        } 
    148138 
    149         m_uintPixelCount = *NumOfFragments;  
     139        mPixelCount = *NumOfFragments;  
    150140         
    151141        return true; 
    152142} 
    153143 
    154 #else // GTP_VISIBILITY_MODIFIED_OGRE 
    155  
    156 //------------------------------------------------------------------ 
    157 GLHardwareOcclusionQuery::GLHardwareOcclusionQuery()  
    158 {  
    159         m_uintPixelCount = 0;  
    160         m_SkipCounter = 0; 
    161  
    162         // Check for hardware occlusion support 
    163     if ( glDeleteOcclusionQueriesNV_ptr != 0 )  // This is a hack to see if hw occlusion is supported. pointer is 0 if it's not supported. 
    164         //if ( glDeleteQueriesARB_ptr != 0 ) 
    165         { 
    166                 m_bHWOcclusionSupport = true; 
    167         } 
    168         else 
    169         { 
    170                 m_bHWOcclusionSupport = false; 
    171         } 
    172  
    173         if ( m_bHWOcclusionSupport ) 
    174         { 
    175                 glGenOcclusionQueriesNV_ptr( 1, m_uintQuery );   
    176                 //glGenQueriesARB_ptr(1, m_uintQuery); 
    177         } 
    178 } 
    179  
    180  
    181 //------------------------------------------------------------------ 
    182 GLHardwareOcclusionQuery::~GLHardwareOcclusionQuery()  
    183 {  
    184         if ( m_bHWOcclusionSupport ) 
    185         { 
    186                 glDeleteOcclusionQueriesNV_ptr( 1, &m_uintQuery[0] );   
    187                 //glDeleteQueriesARB_ptr(1, &m_uintQuery[0]); 
    188         }        
    189 } 
    190  
    191 //------------------------------------------------------------------ 
    192 void GLHardwareOcclusionQuery::beginOcclusionQuery()  
    193 {  
    194         if ( m_bHWOcclusionSupport )    // Make it fail silently if hardware occlusion isn't supported 
    195         { 
    196                 // do the actual occlusion query for this node 
    197                 glBeginOcclusionQueryNV_ptr( m_uintQuery[0] ); 
    198                 //glBeginQueryARB_ptr(GL_SAMPLES_PASSED_ARB, m_uintQuery[0]); 
    199         } 
    200 } 
    201          
    202 void GLHardwareOcclusionQuery::endOcclusionQuery()  
    203 {  
    204         if ( m_bHWOcclusionSupport )    // Make it fail silently if hardware occlusion isn't supported 
    205         { 
    206                 glEndOcclusionQueryNV_ptr(); 
    207                 //glEndQueryARB_ptr(GL_SAMPLES_PASSED_ARB); 
    208         } 
    209 } 
    210 //------------------------------------------------------------------ 
    211 bool GLHardwareOcclusionQuery::pullOcclusionQuery( unsigned int * NumOfFragments, const bool waitForResult)  
     144#ifdef GTP_VISIBILITY_MODIFIED_OGRE 
     145        //------------------------------------------------------------------ 
     146        bool GLHardwareOcclusionQuery::pullOcclusionQuery( unsigned int * NumOfFragments, const bool waitForResult, const HW_OCCLUSIONQUERY flag)  
    212147{ 
    213148        unsigned int isAvailable = GL_TRUE; 
    214         //int isAvailable = GL_TRUE; 
    215149 
    216         if( m_bHWOcclusionSupport )      
     150                if (mHasOcclusionSupport)        
    217151        { 
    218152                if (!waitForResult) 
    219153                { 
    220                         glGetOcclusionQueryuivNV_ptr( m_uintQuery[0], GL_PIXEL_COUNT_AVAILABLE_NV, &isAvailable ); 
    221                         //glGetQueryivARB_ptr(m_uintQuery[0], GL_QUERY_RESULT_AVAILABLE_ARB, &isAvailable); 
     154                        // use nv queries rather that arb because they are faster (no flush) 
     155                                //glGetQueryivARB_ptr(mQueryID, GL_QUERY_RESULT_AVAILABLE_ARB, &isAvailable); 
     156                                glGetOcclusionQueryuivNV_ptr(mQueryID, GL_PIXEL_COUNT_AVAILABLE_NV, &isAvailable); 
    222157                } 
    223158 
    224159                if (isAvailable == GL_TRUE) 
    225160                { 
    226                         glGetOcclusionQueryuivNV_ptr( m_uintQuery[0], GL_PIXEL_COUNT_NV, NumOfFragments ); 
    227                         //glGetQueryObjectuivARB_ptr( m_uintQuery[0], GL_QUERY_RESULT_ARB, NumOfFragments); 
     161                                //glGetQueryObjectuivARB_ptr(mQueryID, GL_QUERY_RESULT_ARB, NumOfFragments); 
     162                                glGetOcclusionQueryuivNV_ptr(mQueryID, GL_PIXEL_COUNT_NV, NumOfFragments); 
    228163                } 
    229164        }  
     
    234169        } 
    235170 
    236         m_uintPixelCount = *NumOfFragments;  
     171                mPixelCount = *NumOfFragments;  
    237172 
    238173        return isAvailable == GL_TRUE;   
    239174} 
    240175 
    241 //------------------------------------------------------------------ 
    242 bool GLHardwareOcclusionQuery::pullOcclusionQuery( unsigned int* NumOfFragments, const bool waitForResult, const HW_OCCLUSIONQUERY flag  )  
    243 { 
    244         return pullOcclusionQuery(NumOfFragments, waitForResult); 
     176#endif // GTP_VIBILITY_MODIFIED_OGRE 
    245177} 
    246  
    247 #endif // GTP_VISIBILITY_MODIFIED_OGRE 
    248  
    249  
    250 } 
    251  
    252  
  • trunk/VUT/work/ogre_changes/RenderSystems/GL/src/OgreGLRenderSystem.cpp

    r97 r115  
    5858GL_ClientActiveTextureARB_Func glClientActiveTextureARB_ptr; 
    5959GL_SecondaryColorPointerEXT_Func glSecondaryColorPointerEXT_ptr; 
     60GL_SecondaryColor3fEXT_Func glSecondaryColor3fEXT_ptr; 
    6061GL_GenBuffersARB_Func glGenBuffersARB_ptr; 
    6162GL_BindBufferARB_Func glBindBufferARB_ptr; 
     
    9798GL_EndOcclusionQueryNV_Func glEndOcclusionQueryNV_ptr; 
    9899GL_GetOcclusionQueryuivNV_Func glGetOcclusionQueryuivNV_ptr; 
    99   
    100 #ifdef GTP_VISIBILITY_MODIFIED_OGRE 
    101100GL_GenQueriesARB_Func glGenQueriesARB_ptr; 
    102101GL_DeleteQueriesARB_Func glDeleteQueriesARB_ptr; 
    103 GL_IsQueryARB_Func glIsQueryARB_ptr; 
    104102GL_BeginQueryARB_Func glBeginQueryARB_ptr; 
    105103GL_EndQueryARB_Func glEndQueryARB_ptr; 
     104#ifdef GTP_VISIBILITY_MODIFIED_OGRE 
    106105GL_GetQueryivARB_Func glGetQueryivARB_ptr; 
    107106GL_GetQueryObjectivARB_Func glGetQueryObjectivARB_ptr; 
     107#endif // GTP_VISIBILITY_MODIFIED_OGRE 
    108108GL_GetQueryObjectuivARB_Func glGetQueryObjectuivARB_ptr; 
    109 #endif // GTP_VISIBILITY_MODIFIED_OGRE 
    110109 
    111110namespace Ogre { 
     
    191190        glClientActiveTextureARB_ptr = 0; 
    192191        glSecondaryColorPointerEXT_ptr = 0; 
     192        glSecondaryColor3fEXT_ptr = 0; 
    193193        glGenBuffersARB_ptr = 0; 
    194194        glBindBufferARB_ptr = 0; 
     
    220220        glEndOcclusionQueryNV_ptr = 0; 
    221221        glGetOcclusionQueryuivNV_ptr = 0; 
    222  
    223 #ifdef GTP_VISIBILITY_MODIFIED_OGRE 
    224222                glGenQueriesARB_ptr = 0; 
    225223                glDeleteQueriesARB_ptr = 0; 
    226                 glIsQueryARB_ptr = 0; 
    227224                glBeginQueryARB_ptr = 0; 
    228225                glEndQueryARB_ptr = 0; 
     226#ifdef GTP_VISIBILITY_MODIFIED_OGRE 
    229227                glGetQueryivARB_ptr = 0; 
    230228                glGetQueryObjectivARB_ptr = 0; 
     229#endif // GTP_VISIBILITY_MODIFIED_OGRE 
    231230                glGetQueryObjectuivARB_ptr = 0; 
    232 #endif // GTP_VISIBILITY_MODIFIED_OGRE 
    233231 
    234232        mCurrentLights = 0; 
     
    543541        glSecondaryColorPointerEXT_ptr =  
    544542            (GL_SecondaryColorPointerEXT_Func)mGLSupport->getProcAddress("glSecondaryColorPointerEXT"); 
     543        glSecondaryColor3fEXT_ptr =  
     544            (GL_SecondaryColor3fEXT_Func)mGLSupport->getProcAddress("glSecondaryColor3fEXT"); 
    545545        glGenBuffersARB_ptr =  
    546546            (GL_GenBuffersARB_Func)mGLSupport->getProcAddress("glGenBuffersARB"); 
     
    622622        glGetOcclusionQueryuivNV_ptr = 
    623623            (GL_GetOcclusionQueryuivNV_Func)mGLSupport->getProcAddress("glGetOcclusionQueryuivNV"); 
    624                 glGetQueryObjectivARB_ptr =  
    625                          (GL_GetQueryObjectivARB_Func)mGLSupport->getProcAddress("glGetQueryObjectivARB"); 
    626                 glGetQueryObjectuivARB_ptr =  
    627                          (GL_GetQueryObjectuivARB_Func)mGLSupport->getProcAddress("glGetQueryObjectuivARB"); 
    628 #ifdef GTP_VISIBILITY_MODIFIED_OGRE 
     624 
    629625                glGenQueriesARB_ptr =  
    630626                         (GL_GenQueriesARB_Func)mGLSupport->getProcAddress("glGenQueriesARB"); 
    631627                glDeleteQueriesARB_ptr = 
    632628                        (GL_DeleteQueriesARB_Func)mGLSupport->getProcAddress("glDeleteQueriesARB"); 
    633                 glIsQueryARB_ptr = 
    634                         (GL_IsQueryARB_Func)mGLSupport->getProcAddress("glIsQueryARB"); 
    635629                glBeginQueryARB_ptr = 
    636630                         (GL_BeginQueryARB_Func)mGLSupport->getProcAddress("glBeginQueryARB"); 
    637631                glEndQueryARB_ptr = 
    638632                         (GL_EndQueryARB_Func)mGLSupport->getProcAddress("glEndQueryARB"); 
     633        #ifdef GTP_VISIBILITY_MODIFIED_OGRE 
    639634                glGetQueryivARB_ptr =  
    640635                        (GL_GetQueryivARB_Func)mGLSupport->getProcAddress("glGetQueryivARB"); 
    641636                glGetQueryObjectivARB_ptr =  
    642637                         (GL_GetQueryObjectivARB_Func)mGLSupport->getProcAddress("glGetQueryObjectivARB"); 
     638        #endif // GTP_VISIBILITY_MODIFIED_OGRE 
    643639                glGetQueryObjectuivARB_ptr =  
    644640                         (GL_GetQueryObjectuivARB_Func)mGLSupport->getProcAddress("glGetQueryObjectuivARB"); 
    645 #endif // GTP_VISIBILITY_MODIFIED_OGRE 
    646641 
    647642        mCapabilities->log(LogManager::getSingleton().getDefaultLog()); 
     
    18571852                    cv1[2] = bm.colourArg1.b; 
    18581853                    cv1[3] = bm.colourArg1.a; 
     1854                        mManualBlendColours[stage][0] = bm.colourArg1; 
     1855 
    18591856 
    18601857                    cv2[0] = bm.colourArg2.r; 
     
    18621859                    cv2[2] = bm.colourArg2.b; 
    18631860                    cv2[3] = bm.colourArg2.a; 
     1861                        mManualBlendColours[stage][1] = bm.colourArg2; 
    18641862        } 
    18651863 
    18661864                if (bm.blendType == LBT_ALPHA) 
    18671865        { 
    1868                     cv1[0] = 0; 
    1869                     cv1[1] = 0; 
    1870                     cv1[2] = 0; 
     1866                    cv1[0] = mManualBlendColours[stage][0].r; 
     1867                    cv1[1] = mManualBlendColours[stage][0].g; 
     1868                    cv1[2] = mManualBlendColours[stage][0].b; 
    18711869                    cv1[3] = bm.alphaArg1; 
    18721870 
    1873                     cv2[0] = 0; 
    1874                     cv2[1] = 0; 
    1875                     cv2[2] = 0; 
     1871                    cv2[0] = mManualBlendColours[stage][1].r; 
     1872                    cv2[1] = mManualBlendColours[stage][1].g; 
     1873                    cv2[2] = mManualBlendColours[stage][1].b; 
    18761874                    cv2[3] = bm.alphaArg2; 
    18771875        } 
     
    22492247        } 
    22502248        glColor4f(1,1,1,1); 
     2249        glSecondaryColor3fEXT_ptr(0.0f, 0.0f, 0.0f); 
    22512250 
    22522251        // UnGuard 
     
    25372536        glLightModeli(GL_LIGHT_MODEL_COLOR_CONTROL, GL_SEPARATE_SPECULAR_COLOR); 
    25382537        glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER, 1);         
     2538        glEnable(GL_COLOR_SUM); 
     2539 
    25392540        // Check for FSAA 
    25402541        // Enable the extension if it was enabled by the GLSupport 
  • trunk/VUT/work/ogre_changes/Samples/Common/include/ExampleFrameListener.h

    r100 r115  
    300300                return true; 
    301301        } 
    302 #ifdef GTP_VISIBILITY_MODIFIED_OGRE 
    303         virtual void moveCamera() // made virtual by matt (16.05.05) 
    304 #else 
     302 
    305303        void moveCamera() 
    306 #endif // GTP_VISIBILTIY_MODIFIED_OGRE 
    307304        { 
    308305 
Note: See TracChangeset for help on using the changeset viewer.