00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #pragma once
00013
00015 #include "nvsgcommon.h"
00016
00017 #include "nvsg/Animation.h"
00018 #include "nvsg/Camera.h"
00019 #include "nvsg/Node.h"
00020
00021 namespace nvmath
00022 {
00023 class Trafo;
00024 }
00025 namespace nvsg
00026 {
00027 class StateSet;
00028 }
00029
00030 namespace nvsg
00031 {
00033 class Scene : public nvutil::RCObject
00034 , public nvutil::ISWMRSync
00035 {
00036 public:
00038
00039 NVSG_API static const Scene * create( void );
00040
00042 NVSG_API void setBackColor( const nvmath::Vec3f &color
00043 );
00044
00046 NVSG_API const nvmath::Vec3f & getBackColor( void ) const;
00047
00049
00051 NVSG_API void addCamera( const Camera * pCamera
00052 );
00053
00055 NVSG_API void removeCamera( size_t index
00056 );
00057
00059
00060 NVSG_API const Camera * getCamera( size_t index = 0
00061 ) const;
00062
00064
00066 NVSG_API size_t getNumberOfCameras( void ) const;
00067
00069
00072 NVSG_API size_t getNumberOfCameraAnimations( void ) const;
00073
00075
00077 NVSG_API void addCameraAnimation( const Animation<nvmath::Trafo> * pAnimation
00078 );
00079
00081
00082 NVSG_API const Animation<nvmath::Trafo> * getCameraAnimation( size_t index = 0
00083 ) const;
00084
00086 NVSG_API void removeCameraAnimation( size_t index
00087 );
00088
00090
00092 NVSG_API size_t getNumberOfFrames( void ) const;
00093
00095
00096 NVSG_API void setRootNode( const Node * root
00097 );
00098
00100
00101 NVSG_API const Node * getRootNode( void ) const;
00102
00104
00107 NVSG_API void setDefaultStateSet( const StateSet * pStateSet
00108 );
00109
00111
00113 NVSG_API const StateSet * getDefaultStateSet( void ) const;
00114
00116
00118 NVSG_API void setOverrideStateSet( const StateSet * pStateSet
00119 );
00120
00122
00124 NVSG_API const StateSet * getOverrideStateSet( void ) const;
00125
00127
00128 NVSG_API bool containsCgFx( void ) const;
00129
00131
00132 NVSG_API bool containsLight( void ) const;
00133
00135
00136 NVSG_API bool containsTransparentMaterial( void ) const;
00137
00139
00140 NVSG_API bool containsTransparentTexture( void ) const;
00141
00143
00149 NVSG_API bool waitToRead( size_t milliseconds = 0xFFFFFFFF
00150 ) const;
00151
00153
00155 NVSG_API void doneReading( void ) const;
00156
00158
00164 NVSG_API bool waitToWrite( size_t milliseconds = 0xFFFFFFFF
00165 ) const;
00166
00168
00170 NVSG_API void doneWriting( void ) const;
00171
00172 protected:
00174 NVSG_API Scene( void );
00175
00177 NVSG_API virtual ~Scene( void );
00178
00179 private:
00180 nvmath::Vec3f m_backColor;
00181 std::vector<const Camera *> m_cameras;
00182 std::vector<const Animation<nvmath::Trafo>*> m_cameraAnimations;
00183 const StateSet * m_defaultStateSet;
00184 const StateSet * m_overrideStateSet;
00185 const Node * m_root;
00186
00187 nvutil::SWMRSync m_lock;
00188 };
00189
00190 inline void Scene::addCamera( const Camera *pCamera )
00191 {
00192 __TRACE();
00193 m_cameras.push_back( pCamera );
00194 pCamera->addRef();
00195 }
00196
00197 inline void Scene::removeCamera( size_t index )
00198 {
00199 __TRACE();
00200 __ASSERT(index < m_cameras.size());
00201
00202 m_cameras[index]->removeRef();
00203 m_cameras.erase(m_cameras.begin()+index);
00204 }
00205
00206 inline void Scene::addCameraAnimation( const Animation<nvmath::Trafo> *pAnimation )
00207 {
00208 __TRACE();
00209 m_cameraAnimations.push_back( pAnimation );
00210 pAnimation->addRef();
00211 }
00212
00213 inline void Scene::removeCameraAnimation( size_t index )
00214 {
00215 __TRACE();
00216 __ASSERT(index < m_cameraAnimations.size());
00217
00218 m_cameraAnimations[index]->removeRef();
00219 m_cameraAnimations.erase(m_cameraAnimations.begin()+index);
00220 }
00221
00222 inline const Camera * Scene::getCamera( size_t index ) const
00223 {
00224 __TRACE();
00225 return( ( index < m_cameras.size() ) ? m_cameras[index] : NULL );
00226 }
00227
00228 inline const Animation<nvmath::Trafo> * Scene::getCameraAnimation( size_t index ) const
00229 {
00230 __TRACE();
00231 return( ( index < m_cameraAnimations.size() ) ? m_cameraAnimations[index] : NULL );
00232 }
00233
00234 inline const StateSet * Scene::getDefaultStateSet( void ) const
00235 {
00236 __TRACE();
00237 return( m_defaultStateSet );
00238 }
00239
00240 inline const StateSet * Scene::getOverrideStateSet( void ) const
00241 {
00242 __TRACE();
00243 return( m_overrideStateSet );
00244 }
00245
00246 inline size_t Scene::getNumberOfCameras( void ) const
00247 {
00248 __TRACE();
00249 return( m_cameras.size() );
00250 }
00251
00252 inline size_t Scene::getNumberOfCameraAnimations( void ) const
00253 {
00254 __TRACE();
00255 return( m_cameraAnimations.size() );
00256 }
00257
00258 inline const Node * Scene::getRootNode( void ) const
00259 {
00260 __TRACE();
00261 return( m_root );
00262 }
00263
00264 inline size_t Scene::getNumberOfFrames( void ) const
00265 {
00266 __TRACE();
00267 __ASSERT( m_root );
00268 size_t nof = m_root->getNumberOfFrames();
00269 for ( size_t i=0 ; !nof && i<m_cameraAnimations.size() ; i++ )
00270 {
00271 nof = m_cameraAnimations[i]->getNumberOfFrames();
00272 }
00273
00274 #if defined( _DEBUG )
00275 for ( size_t i=0 ; i<m_cameraAnimations.size() ; i++ )
00276 {
00277 size_t nofca = m_cameraAnimations[i]->getNumberOfFrames();
00278 __ASSERT( ( nofca == 0 ) || ( nofca == nof ) );
00279 }
00280 #endif
00281
00282 return( nof );
00283 }
00284
00285 inline bool Scene::containsCgFx( void ) const
00286 {
00287 __TRACE();
00288 return( m_root->containsCgFx() );
00289 }
00290
00291 inline bool Scene::containsLight( void ) const
00292 {
00293 __TRACE();
00294 return( m_root->containsLight() );
00295 }
00296
00297 inline bool Scene::containsTransparentMaterial( void ) const
00298 {
00299 __TRACE();
00300 return( m_root->containsTransparentMaterial() );
00301 }
00302
00303 inline bool Scene::containsTransparentTexture( void ) const
00304 {
00305 __TRACE();
00306 return( m_root->containsTransparentTexture() );
00307 }
00308
00309 inline const nvmath::Vec3f& Scene::getBackColor( void ) const
00310 {
00311 __TRACE();
00312 return( m_backColor );
00313 }
00314
00315 inline void Scene::setBackColor( const nvmath::Vec3f &color )
00316 {
00317 __TRACE();
00318 m_backColor = color;
00319 }
00320
00321 inline bool Scene::waitToRead( size_t milliseconds ) const
00322 {
00323 __TRACE();
00324 size_t status;
00325 return m_lock.waitToRead(milliseconds, status);
00326 }
00327
00328 inline void Scene::doneReading( void ) const
00329 {
00330 __TRACE();
00331 m_lock.doneReading();
00332 }
00333
00334 inline bool Scene::waitToWrite( size_t milliseconds ) const
00335 {
00336 __TRACE();
00337 size_t status;
00338 return m_lock.waitToWrite(milliseconds, status);
00339 }
00340
00341 inline void Scene::doneWriting( void ) const
00342 {
00343 __TRACE();
00344 m_lock.doneWriting();
00345 }
00346 }