00001 #include "Renderpass.h"
00002 #include "Rendergroup.h"
00003 #include "Error.h"
00004 #include "StopWatch.h"
00005 #include "Profiler.h"
00006 #include "Program.h"
00007 #include "Stateset.h"
00008 #include "Factory.h"
00009 #include "Property.h"
00010 #include "Framebuffer.h"
00011 #include "Rendernode.h"
00012 #include "PropertyProxy.h"
00013
00014 namespace RenderTools{
00015
00016 Renderpass::Renderpass( void ):
00017 AbstractPropertyContainer(){
00018
00019 }
00020
00021 PropertyPtr Renderpass::create( const XMLNodePtr & xml ){
00022 RenderpassPtr p( new Renderpass() );
00023 p->setName( xml );
00024 p->createProperties();
00025 p->setProperties( xml, false );
00026 return( dynamic_pointer_cast< AbstractProperty, Renderpass >( p ) );
00027 }
00028
00029 void Renderpass::createProperties( void ){
00030 AbstractPropertyContainer::createProperties();
00031 createProperty( this, "rendernodes", & m_rendernodes );
00032 createProperty( this, "camera", & m_camera );
00033 createProperty( this, "drawbuffer", & m_drawbuffer );
00034 createProperty( this, "copybuffer", & m_copybuffer );
00035 }
00036
00037 const string Renderpass::getTypeName( bool ofComponent ) const {
00038 return( "Renderpass" );
00039 }
00040
00041
00042 Renderpass::~Renderpass( void ){
00043 }
00044
00045 void Renderpass::addRendernode( const RendernodePtr p ){
00046 if( Rendergroup::getActiveRendergroup() && ! Rendergroup::getActiveRendergroup()->isPointer( p ) ){
00047 Rendergroup::getActiveRendergroup()->addRendernode( p );
00048 }
00049 addRendernode( p->getName() );
00050 }
00051
00052 void Renderpass::addRendernode( const string name ){
00053 RendernodeProxyPtr item( createProperty( m_rendernodes, name ) );
00054 if( isInitialized() ){
00055 item->initialize();
00056 }
00057 }
00058
00059 void Renderpass::removeRendernode( const RendernodePtr ptr ){
00060 for( unsigned int i = 0; i < m_rendernodes->size(); i++ ){
00061 if( m_rendernodes->getItem( i )->getPointer() == ptr ){
00062 m_rendernodes->removeProperty( i, true );
00064 i = 0;
00065 }
00066 }
00067 }
00068
00069 void Renderpass::removeRendernodes( void ){
00070 m_rendernodes->removeProperties();
00071 }
00072
00073 void Renderpass::setDrawbuffer( const string name ){
00074 m_drawbuffer->setName( name );
00075 }
00076
00077 void Renderpass::setCopybuffer( const string name ){
00078 m_copybuffer->setName( name );
00079 }
00080
00081 void Renderpass::setCamera( const string name ){
00082 m_camera->setName( name );
00083 }
00084
00085 const RendernodeProxyPtr Renderpass::getRendernodeProxy( unsigned int which ) const {
00086 return( m_rendernodes->getItem( which ) );
00087 }
00088
00089 const CameraProxyPtr Renderpass::getCameraProxy( void ) const {
00090 return( m_camera );
00091 }
00092
00093 const FramebufferProxyPtr Renderpass::getDrawbufferProxy( void ) const {
00094 return( m_drawbuffer );
00095 }
00096
00097 const FramebufferProxyPtr Renderpass::getCopybufferProxy( void ) const {
00098 return( m_copybuffer );
00099 }
00100
00101 const RendernodeProxyContainerPtr Renderpass::getRendernodeProxies( void ) const {
00102 return( m_rendernodes );
00103 }
00104
00105 void Renderpass::onInitialize( void ){
00106 for( unsigned int i = 0; i < m_rendernodes->size(); i++ ){
00107 m_rendernodes->getItem( i )->initialize();
00108 }
00109 m_drawbuffer->initialize();
00110 m_copybuffer->initialize();
00111 m_camera->initialize();
00112 }
00113
00114 void Renderpass::onBind( int unit ){
00115 m_drawbuffer->bind();
00116 m_camera->bind();
00117 }
00118
00119 void Renderpass::onUnbind( int unit ){
00120 if( m_drawbuffer->getPointer() && m_copybuffer->getPointer() ){
00121 Framebuffer::copy( const_pointer_cast< Framebuffer >( m_drawbuffer->getPointer() ), const_pointer_cast< Framebuffer >( m_copybuffer->getPointer() ) );
00122 m_drawbuffer->getPointer()->unbind();
00123 }
00124 }
00125
00126 RenderpassPtr Renderpass::operator << ( const CameraPtr p ){
00127 if( Rendergroup::getActiveRendergroup() ){
00128 if( ! Rendergroup::getActiveRendergroup()->isPointer( p ) ){
00129 Rendergroup::getActiveRendergroup()->addCamera( p );
00130 }
00131 }
00132 else{
00133 Error::warning( Error::NO_ACTIVE_GROUP, __FILE__, __LINE__ );
00134 }
00135 if( m_camera->getName() == "" ){
00136 setCamera( p->getName() );
00137 }
00138 else{
00139 Error::warning( Error::ITEM_ALREADY_EXISTS, __FILE__, __LINE__ );
00140 return( RenderpassPtr() );
00141 }
00142 return( dynamic_pointer_cast< Renderpass, AbstractProperty >( getSharedPtr< AbstractProperty >() ) );
00143 }
00144
00145 RenderpassPtr Renderpass::operator << ( const RendernodePtr p ){
00146 if( Rendergroup::getActiveRendergroup() ){
00147 if( ! Rendergroup::getActiveRendergroup()->isPointer( p ) ){
00148 Rendergroup::getActiveRendergroup()->addRendernode( p );
00149 }
00150 }
00151 else{
00152 Error::warning( Error::NO_ACTIVE_GROUP, __FILE__, __LINE__ );
00153 }
00154 addRendernode( p->getName() );
00155 return( dynamic_pointer_cast< Renderpass, AbstractProperty >( getSharedPtr< AbstractProperty >() ) );
00156 }
00157
00158 RenderpassPtr Renderpass::operator << ( const FramebufferPtr p ){
00159 if( Rendergroup::getActiveRendergroup() ){
00160 if( ! Rendergroup::getActiveRendergroup()->isPointer( p ) ){
00161 Rendergroup::getActiveRendergroup()->addFramebuffer( p );
00162 }
00163 }
00164 else{
00165 Error::warning( Error::NO_ACTIVE_GROUP, __FILE__, __LINE__ );
00166 }
00167 if( m_drawbuffer->getName() == "" ){
00168 setDrawbuffer( p->getName() );
00169 }
00170 else if( m_copybuffer->getName() == "" ){
00171 setCopybuffer( p->getName() );
00172 }
00173 else{
00174 Error::warning( Error::ITEM_ALREADY_EXISTS, __FILE__, __LINE__ );
00175 return( RenderpassPtr() );
00176 }
00177 return( dynamic_pointer_cast< Renderpass, AbstractProperty >( getSharedPtr< AbstractProperty >() ) );
00178 }
00179
00180 RenderpassPtr Renderpass::operator << ( const XMLNodePtr xml ){
00181
00182 if( Rendergroup::getActiveRendergroup() ){
00183 if( xml->getTagName() == "Camera" ){
00184 CameraPtr p = dynamic_pointer_cast< Camera, AbstractProperty >( Factory::create( xml ) );
00185 if( ! Rendergroup::getActiveRendergroup()->findCamera( p->getName() ) ){
00186 Rendergroup::getActiveRendergroup()->addCamera( p );
00187 setCamera( p->getName() );
00188 }
00189 else{
00190 setCamera( p->getName() );
00191 Error::warning( Error::ITEM_ALREADY_EXISTS, __FILE__, __LINE__ );
00192 return( RenderpassPtr() );
00193 }
00194 }
00195 else if( xml->getTagName() == "Rendernode" ){
00196 RendernodePtr p = dynamic_pointer_cast< Rendernode, AbstractProperty >( Factory::create( xml ) );
00197 if( ! Rendergroup::getActiveRendergroup()->findRendernode( p->getName() ) ){
00198 Rendergroup::getActiveRendergroup()->addRendernode( p );
00199 addRendernode( p->getName() );
00200 }
00201 else{
00202 addRendernode( p->getName() );
00203 Error::warning( Error::ITEM_ALREADY_EXISTS, __FILE__, __LINE__ );
00204 return( RenderpassPtr() );
00205 }
00206 }
00207 else if( xml->getTagName() == "Framebuffer" ){
00208 FramebufferPtr p = dynamic_pointer_cast< Framebuffer, AbstractProperty >( Factory::create( xml ) );
00209 if( ! Rendergroup::getActiveRendergroup()->findFramebuffer( p->getName() ) ){
00210 Rendergroup::getActiveRendergroup()->addFramebuffer( p );
00211 if( m_drawbuffer->getName() == "" ){
00212 setDrawbuffer( p->getName() );
00213 }
00214 else if( m_copybuffer->getName() == "" ){
00215 setCopybuffer( p->getName() );
00216 }
00217 else{
00218 Error::warning( Error::ITEM_ALREADY_EXISTS, __FILE__, __LINE__ );
00219 }
00220 }
00221 else{
00222 setDrawbuffer( p->getName() );
00223 Error::warning( Error::ITEM_ALREADY_EXISTS, __FILE__, __LINE__ );
00224 return( RenderpassPtr() );
00225 }
00226 }
00227 }
00228 else{
00229 Error::warning( Error::NO_ACTIVE_GROUP, __FILE__, __LINE__ );
00230 }
00231 return( dynamic_pointer_cast< Renderpass, AbstractProperty >( getSharedPtr< AbstractProperty >() ) );
00232 }
00233
00234
00235 };