00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 
00025 
00026 
00027 #include "OSDLRenderer.h"
00028 
00029 #include "OSDLScheduler.h"    
00030 
00031 
00032 
00033 using namespace Ceylan::Log ;
00034 
00035 using namespace OSDL::Events ;
00036 using namespace OSDL::Rendering ;
00037 using namespace OSDL::Engine ;
00038 
00039 using std::string ;
00040 
00041 
00042 
00043 #ifdef OSDL_USES_CONFIG_H
00044 #include <OSDLConfig.h>       
00045 #endif // OSDL_USES_CONFIG_H
00046 
00047 
00048 #if OSDL_DEBUG_RENDERER
00049 
00050 #define OSDL_RENDER_LOG(message) send( message ) ;
00051 
00052 #else // OSDL_DEBUG_RENDERER
00053 
00054 #define OSDL_RENDER_LOG(message)
00055 
00056 #endif // OSDL_DEBUG_RENDERER
00057 
00058 
00059 
00060 Renderer * Renderer::_internalRootRenderer = 0 ;
00061 
00062 
00063 
00064 
00065 RenderingException::RenderingException( const std::string & reason ) :
00066     OSDL::Exception( "RenderingException: " + reason )
00067 {
00068 
00069 }
00070 
00071 
00072 
00073 RenderingException::~RenderingException() throw()
00074 {
00075 
00076 }
00077 
00078 
00079 
00080 
00081 Renderer::Renderer( bool registerToScheduler ) :
00082     Object(),
00083     _renderingDone( 0 ),
00084     _renderingSkipped( 0 ),
00085     _lastRender( 0 )
00086 {
00087 
00088     if ( registerToScheduler )
00089     {
00090         try
00091         {
00092         
00093             
00094             Scheduler::GetExistingScheduler().setRenderer( * this ) ;
00095             
00096         }
00097         catch( const RenderingException & e )
00098         {
00099             throw RenderingException( 
00100                 "Renderer constructor: no already existing scheduler ("
00101                 + e.toString() + ") whereas registering had been requested." ) ;
00102         } 
00103     }
00104     
00105 }
00106 
00107 
00108 
00109 Renderer::~Renderer() throw()
00110 {
00111 
00112     
00113     
00114 }
00115 
00116 
00117 
00118 void Renderer::render( RenderingTick currentRenderingTick )
00119 {
00120 
00121     OSDL_RENDER_LOG( "Rendering! " ) ;
00122     
00123     
00124 
00125 
00126 
00127 
00128     _renderingDone++ ;
00129     
00130 }
00131 
00132 
00133 
00134 void Renderer::onRenderingSkipped( RenderingTick skippedRenderingTick )
00135 {
00136 
00137     OSDL_RENDER_LOG( "Rendering skipped." ) ;
00138     _renderingSkipped++ ;
00139     
00140 }
00141 
00142 
00143 
00144 const string Renderer::toString( Ceylan::VerbosityLevels level ) const 
00145 {
00146 
00147     string res = "Basic renderer, last rendering tick was " 
00148         + Ceylan::toString( _lastRender )
00149         + ", having performed " 
00150         + Ceylan::toString( _renderingDone )    + " rendering(s) for "
00151         + Ceylan::toString( _renderingSkipped ) + " skip(s)" ;
00152     
00153     if ( _renderingDone + _renderingSkipped != 0 )
00154         res += " (rendering proportion: " 
00155             + Ceylan::toString( 100 * _renderingDone / ( _renderingDone 
00156                 + _renderingSkipped ) ) + "%)" ;
00157             
00158     return res ;
00159     
00160 }
00161 
00162 
00163 
00164 bool Renderer::HasExistingRootRenderer()
00165 {
00166 
00167     return ( _internalRootRenderer != 0 ) ;
00168     
00169 }
00170 
00171 
00172 
00173 Renderer & Renderer::GetExistingRootRenderer()
00174 {
00175 
00176     if ( Renderer::_internalRootRenderer == 0 )
00177         throw RenderingException( 
00178             "Renderer::GetExistingRenderer: no Renderer available." ) ;
00179     return * Renderer::_internalRootRenderer ;
00180 
00181 }
00182 
00183 
00184 
00185 void Renderer::DeleteExistingRootRenderer()
00186 {
00187 
00188     if ( Renderer::_internalRootRenderer != 0 )
00189         throw RenderingException( "Renderer::DeleteExistingRenderer: "
00190             "there was no already existing Renderer." ) ;
00191             
00192     LogPlug::debug( "Renderer::DeleteExistingRenderer: effective deleting." ) ;
00193 
00194     delete Renderer::_internalRootRenderer ;
00195     Renderer::_internalRootRenderer = 0 ;
00196 
00197 }
00198 
00199 
00200 
00201 void Renderer::DeleteRootRenderer()
00202 {
00203 
00204     if ( Renderer::_internalRootRenderer != 0 )
00205     {
00206     
00207         LogPlug::debug( "Renderer::DeleteRenderer: effective deleting." ) ;
00208 
00209         delete Renderer::_internalRootRenderer ;
00210         Renderer::_internalRootRenderer = 0 ;
00211         
00212     }
00213     else
00214     {
00215     
00216         LogPlug::debug( "Renderer::DeleteRenderer: no deleting needed." ) ;
00217         
00218     }
00219 
00220 }
00221