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