00001
00002 #include "Renderbuffer.h"
00003 #include "RenderTools.h"
00004 #include "Error.h"
00005 #include "XMLNode.h"
00006
00007 namespace RenderTools {
00008
00009 GLuint Renderbuffer::s_defaultColorbufferID = 0;
00010 GLuint Renderbuffer::s_defaultDepthbufferID = 0;
00011 GLuint Renderbuffer::s_defaultStencilbufferID = 0;
00012
00013 Renderbuffer::Renderbuffer( void ):
00014 AbstractPropertyContainer(),
00015 m_format( GL_RGBA ),
00016 m_w( 0 ),
00017 m_h( 0 ),
00018 m_id( 0 ){
00019 }
00020
00021 PropertyPtr Renderbuffer::create( const XMLNodePtr & xml ){
00022 RenderbufferPtr p( new Renderbuffer() );
00023 p->setName( xml );
00024 p->createProperties();
00025 p->setProperties( xml, false );
00026 return( dynamic_pointer_cast< AbstractProperty, Renderbuffer >( p ) );
00027 }
00028
00029 void Renderbuffer::createProperties( void ){
00030
00031 AbstractPropertyContainer::createProperties();
00032
00033 createProperty( this, "sampler", & m_sampler );
00034
00035 EnumList formats;
00036 formats << GL_ALPHA;
00037 formats << GL_RGB;
00038 formats << GL_RGBA;
00039 formats << GL_LUMINANCE;
00040 formats << GL_LUMINANCE_ALPHA;
00041
00042 createProperty( this, "format", GLenumStruct( & m_format ), formats );
00043 createProperty( this, "width", & m_w );
00044 createProperty( this, "height", & m_h );
00045 }
00046
00047 const string Renderbuffer::getTypeName( bool ofComponent ) const {
00048 return( "Renderbuffer" );
00049 }
00050
00051 void Renderbuffer::onPropertyEvent( const PropertyEvent & e ){
00052
00053 }
00054
00055 void Renderbuffer::onInitialize( void ){
00057 if( m_sampler ){
00059 m_sampler->initialize( true );
00060 if( m_sampler->getPointer() ){
00062 m_w = m_sampler->getPointer()->getWidth();
00063 m_h = m_sampler->getPointer()->getHeight();
00064 m_format = m_sampler->getPointer()->getFormat();
00065 }
00066 else{
00067 Error::error( Error::NULL_POINTER, __FILE__, __LINE__ );
00068 }
00069 }
00071 if( m_w <= ( GLuint )glGetInteger( GL_MAX_RENDERBUFFER_SIZE ) &&
00072 m_h <= ( GLuint )glGetInteger( GL_MAX_RENDERBUFFER_SIZE ) ){
00073 if( getType() != UNACCEPTABLE ){
00074 if( glIsBuffer( m_id ) == GL_FALSE ){
00075 glGenRenderbuffers( 1, & m_id );
00076 }
00078 if( ! hasSampler() ){
00079 glBindRenderbuffer( GL_RENDERBUFFER, m_id );
00080 Error::assertNoErrors( __FILE__, __LINE__ );
00081 glRenderbufferStorage( GL_RENDERBUFFER, m_format, m_w, m_h );
00082 Error::assertNoErrors( __FILE__, __LINE__ );
00083 }
00084 }
00085 else{
00086 Error::error( Error::RENDERBUFFER_UNACCEPTABLE_TYPE, __FILE__, __LINE__ );
00087 }
00088 }
00089 else{
00090 Error::error( Error::RENDERBUFFER_TOO_LARGE, __FILE__, __LINE__ );
00091 }
00092 Error::assertNoErrors( __FILE__, __LINE__ );
00093 }
00094
00095 void Renderbuffer::onBind( int unit ){
00096 glBindRenderbuffer( GL_RENDERBUFFER, m_id );
00097 }
00098
00099 void Renderbuffer::onUnbind( int unit ){
00100 glBindRenderbuffer( GL_RENDERBUFFER, s_defaultColorbufferID );
00101 }
00102
00107 Renderbuffer::~Renderbuffer( void ){
00108 if( RenderTools::isGLInitialized() ){
00109 glDeleteRenderbuffers( 1, & m_id );
00110 }
00111 }
00112
00113 GLuint Renderbuffer::getID( void ) const {
00114 return( m_id );
00115 }
00116
00117 GLuint Renderbuffer::getWidth( void ) const {
00118 return( m_w );
00119 }
00120
00121 GLuint Renderbuffer::getHeight( void ) const {
00122 return( m_h );
00123 }
00124
00125 Renderbuffer::BufferType Renderbuffer::getType( void ) const {
00126 return( getTypeFromFormat( m_format) );
00127 }
00128
00129 const SamplerProxyPtr Renderbuffer::getSamplerProxy( void ) const {
00130 return( m_sampler );
00131 }
00132
00133 bool Renderbuffer::hasSampler( void ) const {
00134 return( m_sampler->getName() != "" );
00135 }
00136
00142 Renderbuffer::BufferType Renderbuffer::getTypeFromFormat( GLint format ){
00143 switch( format ){
00144 #ifdef GL_ALPHA
00145 case GL_ALPHA:
00146 #endif
00147 #ifdef GL_ALPHA4
00148 case GL_ALPHA4:
00149 #endif
00150 #ifdef GL_ALPHA8
00151 case GL_ALPHA8:
00152 #endif
00153 #ifdef GL_ALPHA12
00154 case GL_ALPHA12:
00155 #endif
00156 #ifdef GL_ALPHA16
00157 case GL_ALPHA16:
00158 #endif
00159 #ifdef GL_LUMINANCE
00160 case GL_LUMINANCE:
00161 #endif
00162 #ifdef GL_LUMINANCE4
00163 case GL_LUMINANCE4:
00164 #endif
00165 #ifdef GL_LUMINANCE8
00166 case GL_LUMINANCE8:
00167 #endif
00168 #ifdef GL_LUMINANCE12
00169 case GL_LUMINANCE12:
00170 #endif
00171 #ifdef GL_LUMINANCE16
00172 case GL_LUMINANCE16:
00173 #endif
00174 #ifdef GL_LUMINANCE_ALPHA
00175 case GL_LUMINANCE_ALPHA:
00176 #endif
00177 #ifdef GL_LUMINANCE4_ALPHA4
00178 case GL_LUMINANCE4_ALPHA4:
00179 #endif
00180 #ifdef GL_LUMINANCE6_ALPHA2
00181 case GL_LUMINANCE6_ALPHA2:
00182 #endif
00183 #ifdef GL_LUMINANCE8_ALPHA8
00184 case GL_LUMINANCE8_ALPHA8:
00185 #endif
00186 #ifdef GL_LUMINANCE12_ALPHA4
00187 case GL_LUMINANCE12_ALPHA4:
00188 #endif
00189 #ifdef GL_LUMINANCE12_ALPHA12
00190 case GL_LUMINANCE12_ALPHA12:
00191 #endif
00192 #ifdef GL_LUMINANCE16_ALPHA16
00193 case GL_LUMINANCE16_ALPHA16:
00194 #endif
00195 #ifdef GL_INTENSITY
00196 case GL_INTENSITY:
00197 #endif
00198 #ifdef GL_INTENSITY4
00199 case GL_INTENSITY4:
00200 #endif
00201 #ifdef GL_INTENSITY8
00202 case GL_INTENSITY8:
00203 #endif
00204 #ifdef GL_INTENSITY12
00205 case GL_INTENSITY12:
00206 #endif
00207 #ifdef GL_INTENSITY16
00208 case GL_INTENSITY16:
00209 #endif
00210 #ifdef GL_RGB
00211 case GL_RGB:
00212 #endif
00213 #ifdef GL_R3_G3_B2
00214 case GL_R3_G3_B2:
00215 #endif
00216 #ifdef GL_RGB4
00217 case GL_RGB4:
00218 #endif
00219 #ifdef GL_RGB5
00220 case GL_RGB5:
00221 #endif
00222 #ifdef GL_RGB8
00223 case GL_RGB8:
00224 #endif
00225 #ifdef GL_RGB8_OES
00226 case GL_RGB8_OES:
00227 #endif
00228 #ifdef GL_RGBA8_OES
00229 case GL_RGBA8_OES:
00230 #endif
00231 #ifdef GL_RGB10
00232 case GL_RGB10:
00233 #endif
00234 #ifdef GL_RGB12
00235 case GL_RGB12:
00236 #endif
00237 #ifdef GL_RGB16
00238 case GL_RGB16:
00239 #endif
00240 #ifdef GL_RGBA
00241 case GL_RGBA:
00242 #endif
00243 #ifdef GL_RGBA2
00244 case GL_RGBA2:
00245 #endif
00246 #ifdef GL_RGBA4
00247 case GL_RGBA4:
00248 #endif
00249 #ifdef GL_RGB5_A1
00250 case GL_RGB5_A1:
00251 #endif
00252 #ifdef GL_RGBA8
00253 case GL_RGBA8:
00254 #endif
00255 #ifdef GL_RGB10_A2
00256 case GL_RGB10_A2:
00257 #endif
00258 #ifdef GL_RGBA12
00259 case GL_RGBA12:
00260 #endif
00261 #ifdef GL_RGBA16
00262 case GL_RGBA16:
00263 #endif
00264 #ifdef GL_RGBA32F_ARB
00265 case GL_RGBA32F_ARB:
00266 #endif
00267 #ifdef GL_RGB32F_ARB
00268 case GL_RGB32F_ARB:
00269 #endif
00270 #ifdef GL_ALPHA32F_ARB
00271 case GL_ALPHA32F_ARB:
00272 #endif
00273 #ifdef GL_INTENSITY32F_ARB
00274 case GL_INTENSITY32F_ARB:
00275 #endif
00276 #ifdef GL_LUMINANCE32F_ARB
00277 case GL_LUMINANCE32F_ARB:
00278 #endif
00279 #ifdef GL_LUMINANCE_ALPHA32F_ARB
00280 case GL_LUMINANCE_ALPHA32F_ARB:
00281 #endif
00282 #ifdef GL_RGBA16F_ARB
00283 case GL_RGBA16F_ARB:
00284 #endif
00285 #ifdef GL_RGB16F_ARB
00286 case GL_RGB16F_ARB:
00287 #endif
00288 #ifdef GL_ALPHA16F_ARB
00289 case GL_ALPHA16F_ARB:
00290 #endif
00291 #ifdef GL_INTENSITY16F_ARB
00292 case GL_INTENSITY16F_ARB:
00293 #endif
00294 #ifdef GL_LUMINANCE16F_ARB
00295 case GL_LUMINANCE16F_ARB:
00296 #endif
00297 #ifdef GL_LUMINANCE_ALPHA16F_ARB
00298 case GL_LUMINANCE_ALPHA16F_ARB:
00299 #endif
00300 #ifdef GL_FLOAT_R_NV
00301 case GL_FLOAT_R_NV:
00302 #endif
00303 #ifdef GL_FLOAT_RG_NV
00304 case GL_FLOAT_RG_NV:
00305 #endif
00306 #ifdef GL_FLOAT_RGB_NV
00307 case GL_FLOAT_RGB_NV:
00308 #endif
00309 #ifdef GL_FLOAT_RGBA_NV
00310 case GL_FLOAT_RGBA_NV:
00311 #endif
00312 #ifdef GL_FLOAT_R16_NV
00313 case GL_FLOAT_R16_NV:
00314 #endif
00315 #ifdef GL_FLOAT_R32_NV
00316 case GL_FLOAT_R32_NV:
00317 #endif
00318 #ifdef GL_FLOAT_RG16_NV
00319 case GL_FLOAT_RG16_NV:
00320 #endif
00321 #ifdef GL_FLOAT_RG32_NV
00322 case GL_FLOAT_RG32_NV:
00323 #endif
00324 #ifdef GL_FLOAT_RGB16_NV
00325 case GL_FLOAT_RGB16_NV:
00326 #endif
00327 #ifdef GL_FLOAT_RGB32_NV
00328 case GL_FLOAT_RGB32_NV:
00329 #endif
00330 #ifdef GL_FLOAT_RGBA16_NV
00331 case GL_FLOAT_RGBA16_NV:
00332 #endif
00333 #ifdef GL_FLOAT_RGBA32_NV
00334 case GL_FLOAT_RGBA32_NV:
00335 #endif
00336 return( COLORBUFFER );
00337 #ifdef GL_DEPTH_COMPONENT16
00338 case GL_DEPTH_COMPONENT16:
00339 #endif
00340 #ifdef GL_DEPTH_COMPONENT24
00341 case GL_DEPTH_COMPONENT24:
00342 #endif
00343 #ifdef GL_DEPTH_COMPONENT32
00344 case GL_DEPTH_COMPONENT32:
00345 #endif
00346 #ifdef GL_DEPTH_COMPONENT32F_NV
00347 case GL_DEPTH_COMPONENT32F_NV:
00348 #endif
00349 #ifdef GL_DEPTH_BUFFER_FLOAT_MODE_NV
00350 case GL_DEPTH_BUFFER_FLOAT_MODE_NV:
00351 #endif
00352 return( DEPTHBUFFER );
00353 #ifdef GL_STENCIL_INDEX
00354 case GL_STENCIL_INDEX:
00355 #endif
00356 #ifdef GL_STENCIL_INDEX1_EXT
00357 case GL_STENCIL_INDEX1_EXT:
00358 #endif
00359 #ifdef GL_STENCIL_INDEX4_EXT
00360 case GL_STENCIL_INDEX4_EXT:
00361 #endif
00362 #ifdef GL_STENCIL_INDEX8_EXT
00363 case GL_STENCIL_INDEX8_EXT:
00364 #endif
00365 #ifdef GL_STENCIL_INDEX16_EXT
00366 case GL_STENCIL_INDEX16_EXT:
00367 #endif
00368 return( STENCILBUFFER );
00369 #ifdef GL_DEPTH24_STENCIL8
00370 case GL_DEPTH24_STENCIL8:
00371 #endif
00372 #ifdef GL_UNSIGNED_INT_24_8_EXT
00373 case GL_UNSIGNED_INT_24_8_EXT:
00374 #endif
00375 return( DEPTHSTENCILBUFFER );
00376 default:
00377 return( UNACCEPTABLE );
00378 }
00379 }
00380
00381 void Renderbuffer::setDefaultColorbufferID( GLuint id ){
00382 s_defaultColorbufferID = id;
00383 }
00384
00385 void Renderbuffer::setDefaultDepthbufferID( GLuint id ){
00386 s_defaultDepthbufferID = id;
00387 }
00388
00389 void Renderbuffer::setDefaultStencilbufferID( GLuint id ){
00390 s_defaultStencilbufferID = id;
00391 }
00392
00393 GLuint Renderbuffer::getDefaultColorbufferID( void ){
00394 return( s_defaultColorbufferID );
00395 }
00396
00397 GLuint Renderbuffer::getDefaultDepthbufferID( void ){
00398 return( s_defaultDepthbufferID );
00399 }
00400
00401 GLuint Renderbuffer::getDefaultStencilbufferID( void ){
00402 return( s_defaultStencilbufferID );
00403 }
00404
00405
00406 };
00407
00408