00001 /* 00002 ----------------------------------------------------------------------------- 00003 This source file is part of OGRE 00004 (Object-oriented Graphics Rendering Engine) 00005 For the latest info, see http://ogre.sourceforge.net/ 00006 00007 Copyright © 2000-2003 The OGRE Team 00008 Also see acknowledgements in Readme.html 00009 00010 This program is free software; you can redistribute it and/or modify it under 00011 the terms of the GNU Lesser General Public License as published by the Free Software 00012 Foundation; either version 2 of the License, or (at your option) any later 00013 version. 00014 00015 This program is distributed in the hope that it will be useful, but WITHOUT 00016 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 00017 FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. 00018 00019 You should have received a copy of the GNU Lesser General Public License along with 00020 this program; if not, write to the Free Software Foundation, Inc., 59 Temple 00021 Place - Suite 330, Boston, MA 02111-1307, USA, or go to 00022 http://www.gnu.org/copyleft/lesser.txt. 00023 ----------------------------------------------------------------------------- 00024 */ 00025 00026 #include "OgreGLHardwareOcclusionQuery.h" 00027 #include "OgreException.h" 00028 00029 namespace Ogre { 00030 00031 int GLHardwareOcclusionQuery::m_Skip = 0; 00032 00040 /* Functions used; 00041 00042 glGenOcclusionQueriesNV_ptr( 1, m_uintQuery ); 00043 glDeleteOcclusionQueriesNV_ptr( 1, &m_uintQuery[0] ); 00044 glBeginOcclusionQueryNV_ptr( m_uintQuery[0] ); 00045 glEndOcclusionQueryNV_ptr(); 00046 glGetOcclusionQueryuivNV_ptr( m_uintQuery[0], GL_PIXEL_COUNT_NV, NumOfFragments ); 00047 00048 TO DO: change this to the new ARB functions... 00049 00050 */ 00051 00052 00057 GLHardwareOcclusionQuery::GLHardwareOcclusionQuery() 00058 { 00059 m_uintPixelCount = 0; 00060 m_SkipCounter = 0; 00061 00062 // Check for hardware occlusion support 00063 if( glDeleteOcclusionQueriesNV_ptr != 0 ) // This is a hack to see if hw occlusion is supported. pointer is 0 if it's not supported. 00064 { 00065 m_bHWOcclusionSupport = true; 00066 } 00067 else 00068 { 00069 m_bHWOcclusionSupport = false; 00070 } 00071 00072 if( m_bHWOcclusionSupport ) 00073 { 00074 glGenOcclusionQueriesNV_ptr( 1, m_uintQuery ); 00075 } 00076 } 00077 00078 00082 GLHardwareOcclusionQuery::~GLHardwareOcclusionQuery() 00083 { 00084 if( m_bHWOcclusionSupport ) 00085 { 00086 glDeleteOcclusionQueriesNV_ptr( 1, &m_uintQuery[0] ); 00087 } 00088 } 00089 00090 //------------------------------------------------------------------ 00091 // Occlusion query functions (see base class documentation for this) 00092 //-- 00093 void GLHardwareOcclusionQuery::beginOcclusionQuery() 00094 { 00095 if( m_bHWOcclusionSupport ) // Make it fail silently if hardware occlusion isn't supported 00096 { 00097 if ( m_SkipCounter == m_Skip ) { m_SkipCounter = 0; }; // Counter starts at 0 again at m_Skip 00098 if ( m_SkipCounter == 0 && m_uintPixelCount != 0 ) // New or none visable objects must allways be tested but visable objects can be skiped 00099 { 00100 glBeginOcclusionQueryNV_ptr( m_uintQuery[0] ); 00101 } 00102 } 00103 } 00104 00105 void GLHardwareOcclusionQuery::endOcclusionQuery() 00106 { 00107 if( m_bHWOcclusionSupport ) // Make it fail silently if hardware occlusion isn't supported 00108 { 00109 if( m_SkipCounter == 0 && m_uintPixelCount != 0 ) // New or none visable objects must allways be tested but visable objects can be skiped 00110 { 00111 glEndOcclusionQueryNV_ptr(); 00112 } 00113 m_SkipCounter++; 00114 } 00115 } 00116 00117 bool GLHardwareOcclusionQuery::pullOcclusionQuery( unsigned int * NumOfFragments) 00118 { 00119 if( m_bHWOcclusionSupport ) // Make it fail silently if hardware occlusion isn't supported 00120 { 00121 glGetOcclusionQueryuivNV_ptr( m_uintQuery[0], GL_PIXEL_COUNT_NV, NumOfFragments ); 00122 } 00123 else 00124 { 00125 *NumOfFragments = 100000; // Fails quitlly -> every object tested is visable. 00126 } 00127 00128 m_uintPixelCount = *NumOfFragments; 00129 00130 return true; 00131 } 00132 00133 //------------------------------------------------------------------ 00134 // OpenGL dosn't use the flag, but to fulfil the abstract interface we need to include this function. 00135 // Using this function in OpenGL mode simple works the same way as calling the other function without the flag parameter, 00136 // but in DX9 it works differentlly, see notes in the DX9 implementation. 00137 //-- 00138 bool GLHardwareOcclusionQuery::pullOcclusionQuery( unsigned int* NumOfFragments, const HW_OCCLUSIONQUERY flag ) 00139 { 00140 if( m_bHWOcclusionSupport ) // Make it fail silently if hardware occlusion isn't supported 00141 { 00142 glGetOcclusionQueryuivNV_ptr( m_uintQuery[0], GL_PIXEL_COUNT_NV, NumOfFragments ); 00143 } 00144 else 00145 { 00146 *NumOfFragments = 100000; // Fails quitlly -> every object tested is visable. 00147 } 00148 00149 m_uintPixelCount = *NumOfFragments; 00150 00151 return true; 00152 } 00153 00154 00155 } 00156 00157
Copyright © 2002-2003 by The OGRE Team
Last modified Fri May 14 23:22:11 2004