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