Cinder

  • Main Page
  • Related Pages
  • Namespaces
  • Classes
  • Files
  • File List
  • File Members

include/cinder/gl/Fbo.h

Go to the documentation of this file.
00001 /*
00002  Copyright (c) 2010, The Barbarian Group
00003  All rights reserved.
00004 
00005  Redistribution and use in source and binary forms, with or without modification, are permitted provided that
00006  the following conditions are met:
00007 
00008     * Redistributions of source code must retain the above copyright notice, this list of conditions and
00009     the following disclaimer.
00010     * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and
00011     the following disclaimer in the documentation and/or other materials provided with the distribution.
00012 
00013  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
00014  WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
00015  PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
00016  ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
00017  TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
00018  HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
00019  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
00020  POSSIBILITY OF SUCH DAMAGE.
00021 */
00022 
00023 #pragma once
00024 
00025 #include "cinder/Cinder.h"
00026 #include "cinder/Exception.h"
00027 #include "cinder/gl/gl.h"
00028 #include "cinder/gl/Texture.h"
00029 
00030 namespace cinder { namespace gl {
00031 
00033 class Fbo {
00034  public:
00035     struct Format;
00036 
00038     Fbo() {}
00040     Fbo( int width, int height, Format format = Format() );
00042     Fbo( int width, int height, bool alpha, bool color = true, bool depth = true );
00043 
00045     int             getWidth() const { return mObj->mWidth; }
00047     int             getHeight() const { return mObj->mHeight; }
00049     Vec2i           getSize() const { return Vec2i( mObj->mWidth, mObj->mHeight ); }
00051     Area            getBounds() const { return Area( 0, 0, mObj->mWidth, mObj->mHeight ); }
00053     float           getAspectRatio() const { return mObj->mWidth / (float)mObj->mHeight; }
00055     const Format&   getFormat() const { return mObj->mFormat; }
00057     GLenum          getTarget() const { return mObj->mFormat.mTarget; }
00058 
00060     Texture&        getTexture();
00062     Texture&        getDepthTexture();  
00063     
00065     void            bindTexture( int textureUnit = 0 );
00067     void            unbindTexture();
00069     void            bindDepthTexture( int textureUnit = 0 );
00071     void            bindFramebuffer();
00073     static void     unbindFramebuffer();
00074 
00076     static GLint    getMaxSamples();
00077     
00078     struct Format {
00079       public:
00081         Format();
00082 
00084         void    setTarget( GLenum target ) { mTarget = target; }
00086         void    setColorInternalFormat( GLenum colorInternalFormat ) { mColorInternalFormat = colorInternalFormat; }
00088         void    setDepthInternalFormat( GLenum depthInternalFormat ) { mDepthInternalFormat = depthInternalFormat; }
00090         void    setSamples( int samples ) { mSamples = samples; }
00092         void    setCoverageSamples( int coverageSamples ) { mCoverageSamples = coverageSamples; }
00094         void    enableColorBuffer( bool colorBuffer = true ) { mColorBuffer = colorBuffer; }
00096         void    enableDepthBuffer( bool depthBuffer = true ) { mDepthBuffer = depthBuffer; }
00097 //      void    enableStencilBuffer( bool stencilBuffer = true ) { mStencilBuffer = stencilBuffer; }
00099         void    enableMipmapping( bool enableMipmapping = true ) { mMipmapping = enableMipmapping; }
00100 
00102         void    setWrap( GLenum wrapS, GLenum wrapT ) { setWrapS( wrapS ); setWrapT( wrapT ); }
00105         void    setWrapS( GLenum wrapS ) { mWrapS = wrapS; }
00108         void    setWrapT( GLenum wrapT ) { mWrapT = wrapT; }
00111         void    setMinFilter( GLenum minFilter ) { mMinFilter = minFilter; }
00114         void    setMagFilter( GLenum magFilter ) { mMagFilter = magFilter; }
00115 
00116         
00118         GLenum  getTarget() const { return mTarget; }
00120         GLenum  getColorInternalFormat() const { return mColorInternalFormat; }
00122         GLenum  getDepthInternalFormat() const { return mDepthInternalFormat; }
00124         int     getSamples() const { return mSamples; }
00126         int     getCoverageSamples() const { return mCoverageSamples; }
00128         bool    hasColorBuffer() const { return mColorBuffer; }
00130         bool    hasDepthBuffer() const { return mDepthBuffer; }
00131 //      bool    hasStencilBuffer() const { return mStencilBuffer; }
00133         bool    hasMipMapping() const { return mMipmapping; }
00134         
00135       protected:
00136         GLenum      mTarget;
00137         GLenum      mColorInternalFormat, mDepthInternalFormat;
00138         int         mSamples;
00139         int         mCoverageSamples;
00140         bool        mMipmapping;
00141         bool        mColorBuffer, mDepthBuffer, mStencilBuffer;
00142         GLenum      mWrapS, mWrapT;
00143         GLenum      mMinFilter, mMagFilter;
00144         
00145         friend class Fbo;
00146     };
00147 
00148  protected:
00149     void        init();
00150     bool        initMultisample( bool csaa );
00151     void        resolveTexture() const;
00152     void        updateMipmaps( bool bindFirst ) const;
00153     bool        checkStatus( class FboExceptionInvalidSpecification *resultExc );
00154 
00155     struct Obj {
00156         Obj();
00157         Obj( int aWidth, int aHeight );
00158         ~Obj();
00159 
00160         int                 mWidth, mHeight;
00161         Format              mFormat;
00162         GLuint              mId, mColorTextureId, mDepthTextureId;
00163         GLuint              mColorRenderBufferId, mDepthRenderBufferId, mResolveFramebufferId;
00164         Texture             mColorTexture, mDepthTexture;
00165         mutable bool        mNeedsResolve, mNeedsMipmapUpdate;
00166     };
00167  
00168     shared_ptr<Obj>     mObj;
00169     
00170     static GLint        sMaxSamples;
00171     
00172   public:
00174 
00175     typedef shared_ptr<Obj> Fbo::*unspecified_bool_type;
00176     operator unspecified_bool_type() { return ( mObj.get() == 0 ) ? 0 : &Fbo::mObj; }
00177     void reset() { mObj.reset(); }
00179 };
00180 
00181 class FboException : public Exception {
00182 };
00183 
00184 class FboExceptionInvalidSpecification : public FboException {
00185   public:
00186     FboExceptionInvalidSpecification() : FboException() { mMessage[0] = 0; }
00187     FboExceptionInvalidSpecification( const std::string &message ) throw();
00188     
00189     virtual const char * what() const throw() { return mMessage; }
00190     
00191   private:  
00192     char    mMessage[256];
00193 };
00194 
00195 } // namespace gl
00196 } // namespace cinder