OpenWalnut
1.2.5
|
00001 //--------------------------------------------------------------------------- 00002 // 00003 // Project: OpenWalnut ( http://www.openwalnut.org ) 00004 // 00005 // Copyright 2009 OpenWalnut Community, BSV@Uni-Leipzig and CNCF@MPI-CBS 00006 // For more information see http://www.openwalnut.org/copying 00007 // 00008 // This file is part of OpenWalnut. 00009 // 00010 // OpenWalnut is free software: you can redistribute it and/or modify 00011 // it under the terms of the GNU Lesser General Public License as published by 00012 // the Free Software Foundation, either version 3 of the License, or 00013 // (at your option) any later version. 00014 // 00015 // OpenWalnut is distributed in the hope that it will be useful, 00016 // but WITHOUT ANY WARRANTY; without even the implied warranty of 00017 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00018 // GNU Lesser General Public License for more details. 00019 // 00020 // You should have received a copy of the GNU Lesser General Public License 00021 // along with OpenWalnut. If not, see <http://www.gnu.org/licenses/>. 00022 // 00023 //--------------------------------------------------------------------------- 00024 00025 #include <string> 00026 00027 #include <boost/lexical_cast.hpp> 00028 00029 #include <osg/Texture> 00030 #include <osg/Texture2D> 00031 00032 #include "../WGETextureHud.h" 00033 00034 #include "WGEOffscreenRenderPass.h" 00035 00036 WGEOffscreenRenderPass::WGEOffscreenRenderPass( size_t textureWidth, size_t textureHeight, int num ): 00037 osg::Camera(), 00038 m_width( textureWidth ), 00039 m_height( textureHeight ), 00040 m_fbo( new osg::FrameBufferObject() ), 00041 m_hud( NULL ) 00042 { 00043 // initialize members 00044 setClearColor( osg::Vec4( 0.0, 0.0, 0.0, 0.0 ) ); 00045 setClearMask( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); 00046 setReferenceFrame( osg::Transform::RELATIVE_RF ); 00047 setRenderTargetImplementation( osg::Camera::FRAME_BUFFER_OBJECT ); 00048 setRenderOrder( osg::Camera::PRE_RENDER, num ); 00049 } 00050 00051 WGEOffscreenRenderPass::WGEOffscreenRenderPass( size_t textureWidth, size_t textureHeight, osg::ref_ptr< WGETextureHud > hud, std::string name, 00052 int num ): 00053 osg::Camera(), 00054 m_width( textureWidth ), 00055 m_height( textureHeight ), 00056 m_fbo( new osg::FrameBufferObject() ), 00057 m_hud( hud ), 00058 m_name( name ) 00059 { 00060 // initialize members 00061 setClearColor( osg::Vec4( 0.0, 0.0, 0.0, 0.0 ) ); 00062 setClearMask( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); 00063 setReferenceFrame( osg::Transform::RELATIVE_RF ); 00064 setRenderTargetImplementation( osg::Camera::FRAME_BUFFER_OBJECT ); 00065 setRenderOrder( osg::Camera::PRE_RENDER, num ); 00066 } 00067 00068 WGEOffscreenRenderPass::~WGEOffscreenRenderPass() 00069 { 00070 // cleanup 00071 } 00072 00073 void WGEOffscreenRenderPass::attach( BufferComponent buffer, osg::ref_ptr< osg::Texture2D > texture ) 00074 { 00075 m_fbo->setAttachment( buffer, osg::FrameBufferAttachment( texture ) ); 00076 00077 if( m_hud ) 00078 { 00079 m_hud->addTexture( new WGETextureHud::WGETextureHudEntry( texture, m_name + " - " + getBufferName( buffer ) ) ); 00080 } 00081 00082 osg::Camera::attach( buffer, texture ); 00083 } 00084 00085 osg::ref_ptr< osg::Texture2D > WGEOffscreenRenderPass::attach( BufferComponent buffer, GLint internalFormat ) 00086 { 00087 osg::ref_ptr< osg::Texture2D > tex; 00088 if( buffer == DEPTH_BUFFER ) // depth buffers need a special texture type (else: FBO status = 0x8cd6 (FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT)) 00089 { 00090 tex = createTexture( GL_DEPTH_COMPONENT ); 00091 } 00092 else 00093 { 00094 #if defined(__APPLE__) 00095 tex = createTexture( GL_RGBA ); // on MacOS X, only RGBA textures work as attachment for FBO's 00096 #else 00097 tex = createTexture( internalFormat ); 00098 #endif 00099 } 00100 attach( buffer, tex ); 00101 return tex; 00102 } 00103 00104 void WGEOffscreenRenderPass::detach( BufferComponent buffer ) 00105 { 00106 // remove the texture from HUD if existing 00107 if( m_hud && osg::Camera::getBufferAttachmentMap().count( buffer ) ) 00108 { 00109 m_hud->removeTexture( osg::Camera::getBufferAttachmentMap()[ buffer ]._texture ); 00110 } 00111 00112 m_fbo->setAttachment( buffer, osg::FrameBufferAttachment() ); 00113 00114 osg::Camera::detach( buffer ); 00115 } 00116 00117 osg::ref_ptr< osg::Texture2D > WGEOffscreenRenderPass::createTexture( GLint internalFormat ) 00118 { 00119 osg::ref_ptr< osg::Texture2D > tex = new osg::Texture2D; 00120 tex->setTextureSize( m_width, m_height ); 00121 tex->setInternalFormat( internalFormat ); 00122 00123 // setup interpolation 00124 tex->setFilter( osg::Texture::MIN_FILTER, osg::Texture::LINEAR ); 00125 tex->setFilter( osg::Texture::MAG_FILTER, osg::Texture::LINEAR ); 00126 00127 // do repeat the texture 00128 tex->setWrap( osg::Texture::WRAP_S, osg::Texture::REPEAT ); 00129 tex->setWrap( osg::Texture::WRAP_T, osg::Texture::REPEAT ); 00130 00131 return tex; 00132 } 00133 00134 std::string WGEOffscreenRenderPass::getName() const 00135 { 00136 return m_name; 00137 } 00138 00139 size_t WGEOffscreenRenderPass::getTextureWidth() const 00140 { 00141 return m_width; 00142 } 00143 00144 size_t WGEOffscreenRenderPass::getTextureHeight() const 00145 { 00146 return m_height; 00147 } 00148 00149 void WGEOffscreenRenderPass::addUniform( osg::ref_ptr< osg::Uniform > uniform ) 00150 { 00151 this->getOrCreateStateSet()->addUniform( uniform ); 00152 } 00153 00154 std::string WGEOffscreenRenderPass::getBufferName( BufferComponent buffer ) 00155 { 00156 switch ( buffer ) 00157 { 00158 case DEPTH_BUFFER: 00159 return "Depth"; 00160 case STENCIL_BUFFER: 00161 return "Stencil"; 00162 case PACKED_DEPTH_STENCIL_BUFFER: 00163 return "Depth+Stencil"; 00164 case COLOR_BUFFER: 00165 return "Color 0"; 00166 case COLOR_BUFFER0: 00167 return "Color 0"; 00168 case COLOR_BUFFER1: 00169 return "Color 1"; 00170 case COLOR_BUFFER2: 00171 return "Color 2"; 00172 case COLOR_BUFFER3: 00173 return "Color 3"; 00174 case COLOR_BUFFER4: 00175 return "Color 4"; 00176 case COLOR_BUFFER5: 00177 return "Color 5"; 00178 case COLOR_BUFFER6: 00179 return "Color 6"; 00180 case COLOR_BUFFER7: 00181 return "Color 7"; 00182 case COLOR_BUFFER8: 00183 return "Color 8"; 00184 case COLOR_BUFFER9: 00185 return "Color 9"; 00186 case COLOR_BUFFER10: 00187 return "Color 10"; 00188 case COLOR_BUFFER11: 00189 return "Color 11"; 00190 case COLOR_BUFFER12: 00191 return "Color 12"; 00192 case COLOR_BUFFER13: 00193 return "Color 13"; 00194 case COLOR_BUFFER14: 00195 return "Color 14"; 00196 case COLOR_BUFFER15: 00197 return "Color 15"; 00198 default: 00199 return "Unknown"; 00200 } 00201 } 00202