00001 #pragma once
00002 #ifndef RENDERGROUP_H
00003 #define RENDERGROUP_H
00004
00005 #include "Types.h"
00006 #include "UpdateInterface.h"
00007 #include "RenderInterface.h"
00008 #include "PropertyContainer.h"
00009
00010 #include <map>
00011 #include <limits.h>
00012
00013 using namespace std;
00014
00015 namespace RenderTools {
00016
00017 class Rendergroup : public UpdateInterface, public RenderInterface, public AbstractPropertyContainer {
00018 public:
00019 Rendergroup( void );
00020 virtual ~Rendergroup( void );
00021
00022 static PropertyPtr create( const XMLNodePtr & xml = XMLNodePtr() );
00023 virtual void createProperties( void );
00024 virtual const string getTypeName( bool ofComponent = false ) const;
00025
00026 static void addRendergroup( const RendergroupPtr & group, bool send = true );
00027 static void removeRendergroup( const RendergroupPtr & group, bool send = true );
00028 static void clear( bool send = true );
00029 static bool setActiveRendergroup( int i );
00030 static bool setActiveRendergroup( const RendergroupPtr & group );
00031 static bool setActiveRenderpass( int i );
00032 static bool setActiveRenderpass( const RenderpassPtr & pass );
00033 static const RendergroupPtr getActiveRendergroup( void );
00034 static const int getActiveRendergroupIndex( void );
00035 static const RenderpassPtr getActiveRenderpass( void );
00036 static const int getActiveRenderpassIndex( void );
00037 static const RendergroupPtr getRendergroup( unsigned int i );
00038 static const int findRendergroupIndex( string name = "" );
00039 static const RendergroupPtr findRendergroup( string name = "" );
00040 static const RendergroupList findRendergroups( string name = "" );
00041
00042 static void renderSingleGroup( unsigned int i );
00043 static void renderSingleGroup( string name );
00044 static void renderAllGroups( void );
00045 static void updateSingleGroup( unsigned int i );
00046 static void updateAllGroups( void );
00047
00048 virtual void onPropertyEvent( const PropertyEvent & e );
00049 virtual void onUpdate( void );
00050 virtual void onRender( void );
00051 virtual void onInitialize( void );
00052
00053 bool isPointer( const CameraPtr & ) const;
00054 void findPointer( const string name, CameraPtr & ) const;
00055 const CameraList findCameras( const string name ) const;
00056 const CameraPtr findCamera( const string name ) const;
00057 const int findCameraIndex( const string name ) const;
00058 void addPointer( const CameraPtr & p, bool send = true );
00059 void addCamera( const CameraPtr & p, bool send = true );
00060 void setCameras( const CameraContainerPtr & list, bool send = true );
00061 const CameraPtr getCamera( unsigned int index ) const;
00062 const CameraContainerPtr getCameras( void ) const;
00063 void removeCamera( const CameraPtr & pointer, bool send = true );
00064 void removeCameras( bool send = true );
00065
00066 bool isPointer( const StatesetPtr & ) const;
00067 void findPointer( const string name, StatesetPtr & ) const;
00068 const StatesetList findStatesets( const string name ) const;
00069 const StatesetPtr findStateset( const string name ) const;
00070 const int findStatesetIndex( const string name ) const;
00071 void addPointer( const StatesetPtr & p, bool send = true );
00072 void addStateset( const StatesetPtr & p, bool send = true );
00073 void setStatesets( const StatesetContainerPtr & list, bool send = true );
00074 const StatesetPtr getStateset( unsigned int index ) const;
00075 const StatesetContainerPtr getStatesets( void ) const;
00076 void removeStateset( const StatesetPtr & pointer, bool send = true );
00077 void removeStatesets( bool send = true );
00078
00079 bool isPointer( const SamplerPtr & ) const;
00080 void findPointer( const string name, SamplerPtr & ) const;
00081 const SamplerList findSamplers( const string name ) const;
00082 const SamplerPtr findSampler( const string name ) const;
00083 const int findSamplerIndex( const string name ) const;
00084 void addPointer( const SamplerPtr & p, bool send = true );
00085 void addSampler( const SamplerPtr & p, bool send = true );
00086 void setSamplers( const SamplerContainerPtr & list, bool send = true );
00087 const SamplerPtr getSampler( unsigned int index ) const;
00088 const SamplerContainerPtr getSamplers( void ) const;
00089 void removeSampler( const SamplerPtr & pointer, bool send = true );
00090 void removeSamplers( bool send = true );
00091
00092 bool isPointer( const FramebufferPtr & ) const;
00093 void findPointer( const string name, FramebufferPtr & ) const;
00094 const FramebufferList findFramebuffers( const string name ) const;
00095 const FramebufferPtr findFramebuffer( const string name ) const;
00096 const int findFramebufferIndex( const string name ) const;
00097 void addPointer( const FramebufferPtr & p, bool send = true );
00098 void addFramebuffer( const FramebufferPtr & p, bool send = true );
00099 void setFramebuffers( const FramebufferContainerPtr & list, bool send = true );
00100 const FramebufferPtr getFramebuffer( unsigned int index ) const;
00101 const FramebufferContainerPtr getFramebuffers( void ) const;
00102 void removeFramebuffer( const FramebufferPtr & pointer, bool send = true );
00103 void removeFramebuffers( bool send = true );
00104
00105 bool isPointer( const RenderbufferPtr & ) const;
00106 void findPointer( const string name, RenderbufferPtr & ) const;
00107 const RenderbufferList findRenderbuffers( const string name ) const;
00108 const RenderbufferPtr findRenderbuffer( const string name ) const;
00109 const int findRenderbufferIndex( const string name ) const;
00110 void addPointer( const RenderbufferPtr & p, bool send = true );
00111 void addRenderbuffer( const RenderbufferPtr & p, bool send = true );
00112 void setRenderbuffers( const RenderbufferContainerPtr & list, bool send = true );
00113 const RenderbufferPtr getRenderbuffer( unsigned int index ) const;
00114 const RenderbufferContainerPtr getRenderbuffers( void ) const;
00115 void removeRenderbuffer( const RenderbufferPtr & pointer, bool send = true );
00116 void removeRenderbuffers( bool send = true );
00117
00118 bool isPointer( const VertexbufferPtr & ) const;
00119 void findPointer( const string name, VertexbufferPtr & ) const;
00120 const VertexbufferList findVertexbuffers( const string name ) const;
00121 const VertexbufferPtr findVertexbuffer( const string name ) const;
00122 const int findVertexbufferIndex( const string name ) const;
00123 void addPointer( const VertexbufferPtr & p, bool send = true );
00124 void addVertexbuffer( const VertexbufferPtr & p, bool send = true );
00125 void setVertexbuffers( const VertexbufferContainerPtr & list, bool send = true );
00126 const VertexbufferPtr getVertexbuffer( unsigned int index ) const;
00127 const VertexbufferContainerPtr getVertexbuffers( void ) const;
00128 void removeVertexbuffer( const VertexbufferPtr & pointer, bool send = true );
00129 void removeVertexbuffers( bool send = true );
00130
00131 bool isPointer( const RendernodePtr & ) const;
00132 void findPointer( const string name, RendernodePtr & ) const;
00133 const RendernodeList findRendernodes( const string name ) const;
00134 const RendernodePtr findRendernode( const string name ) const;
00135 const int findRendernodeIndex( const string name ) const;
00136 void addPointer( const RendernodePtr & p, bool send = true );
00137 void addRendernode( const RendernodePtr & p, bool send = true );
00138 void setRendernodes( const RendernodeContainerPtr & list, bool send = true );
00139 const RendernodePtr getRendernode( unsigned int index ) const;
00140 const RendernodeContainerPtr getRendernodes( void ) const;
00141 void removeRendernode( const RendernodePtr & pointer, bool send = true );
00142 void removeRendernodes( bool send = true );
00143
00144 bool isPointer( const RenderpassPtr & ) const;
00145 void findPointer( const string name, RenderpassPtr & ) const;
00146 const RenderpassList findRenderpasses( const string name ) const;
00147 const RenderpassPtr findRenderpass( const string name ) const;
00148 const int findRenderpassIndex( const string name ) const;
00149 void addPointer( const RenderpassPtr & p, bool send = true );
00150 void addRenderpass( const RenderpassPtr & p, bool send = true );
00151 void setRenderpasses( const RenderpassContainerPtr & list, bool send = true );
00152 const RenderpassPtr getRenderpass( unsigned int index ) const;
00153 const RenderpassContainerPtr getRenderpasses( void ) const;
00154 void removeRenderpass( const RenderpassPtr & pointer, bool send = true );
00155 void removeRenderpasses( bool send = true );
00156
00157 RendergroupPtr operator << ( const CameraPtr & p );
00158 RendergroupPtr operator << ( const StatesetPtr & p );
00159 RendergroupPtr operator << ( const RendernodePtr & p );
00160 RendergroupPtr operator << ( const RenderpassPtr & p );
00161 RendergroupPtr operator << ( const FramebufferPtr & p );
00162 RendergroupPtr operator << ( const RenderbufferPtr & p );
00163 RendergroupPtr operator << ( const VertexbufferPtr & p );
00164 RendergroupPtr operator << ( const SamplerPtr & p );
00165 RendergroupPtr operator << ( const XMLNodePtr & p );
00166
00167 #ifndef RT_GLES1
00168
00169 void bindSamplersToUniforms( void );
00170
00171 const PropertyPtr findUniform( const string name = "" ) const;
00172 const PropertyList findUniforms( const string name = "" ) const;
00173 const int findUniformIndex( const string name = "" ) const;
00174
00175 bool isPointer( const ProgramPtr & ) const;
00176 void findPointer( const string name, ProgramPtr & ) const;
00177 const ProgramList findPrograms( const string name ) const;
00178 const ProgramPtr findProgram( const string name ) const;
00179 const int findProgramIndex( const string name ) const;
00180 void addPointer( const ProgramPtr & p, bool send = true );
00181 void addProgram( const ProgramPtr & p, bool send = true );
00182 void setPrograms( const ProgramContainerPtr & list, bool send = true );
00183 const ProgramPtr getProgram( unsigned int index ) const;
00184 const ProgramContainerPtr getPrograms( void ) const;
00185 void removeProgram( const ProgramPtr & pointer, bool send = true );
00186 void removePrograms( bool send = true );
00187
00188 RendergroupPtr operator << ( const ProgramPtr & p );
00189
00190 #endif
00191
00192 protected:
00193 CameraContainerPtr m_cameras;
00194 StatesetContainerPtr m_statesets;
00195 SamplerContainerPtr m_samplers;
00196 FramebufferContainerPtr m_framebuffers;
00197 RenderbufferContainerPtr m_renderbuffers;
00198 VertexbufferContainerPtr m_vertexbuffers;
00199 RendernodeContainerPtr m_rendernodes;
00200 RenderpassContainerPtr m_renderpasses;
00201 #ifndef RT_GLES1
00202 ProgramContainerPtr m_programs;
00203 #endif
00204 static RendergroupWeakList s_groups;
00205 static int s_activeGroup;
00206 static int s_activePass;
00207 static bool s_doExperiment;
00208
00209 };
00210
00211 #ifndef RT_GLES1
00212
00213 inline void bindUniforms( const string name, const string value, int element = -1 ){
00214 const RendergroupPtr & group = Rendergroup::getActiveRendergroup();
00215 if( group ){
00216 PropertyList list = group->findUniforms( name );
00217 for( unsigned int i = 0; i < list.size(); i++ ){
00218 list[ i ]->setValue( value, element );
00219 }
00220 }
00221 }
00222
00223 #endif
00224
00225 };
00226
00227 #endif
00228