Main Page   Modules   Namespace List   Class Hierarchy   Alphabetical List   Compound List   File List   Namespace Members   Compound Members   File Members   Related Pages  

Object.h

Go to the documentation of this file.
00001 // Copyright NVIDIA Corporation 2002-2004
00002 // TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, THIS SOFTWARE IS PROVIDED
00003 // *AS IS* AND NVIDIA AND ITS SUPPLIERS DISCLAIM ALL WARRANTIES, EITHER EXPRESS
00004 // OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY
00005 // AND FITNESS FOR A PARTICULAR PURPOSE.  IN NO EVENT SHALL NVIDIA OR ITS SUPPLIERS
00006 // BE LIABLE FOR ANY SPECIAL, INCIDENTAL, INDIRECT, OR CONSEQUENTIAL DAMAGES
00007 // WHATSOEVER (INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS,
00008 // BUSINESS INTERRUPTION, LOSS OF BUSINESS INFORMATION, OR ANY OTHER PECUNIARY LOSS)
00009 // ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF NVIDIA HAS
00010 // BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES 
00011 
00012 #pragma once
00013 
00015 #include "nvsgcommon.h"
00016 
00017 #include  "nvutil/RCObject.h"
00018 #include  "nvutil/SWMRSync.h"
00019 #include  "nvsg/DAL.h"
00020 #include  <typeinfo> // using typeid requires this
00021 
00022 namespace nvsg
00023 {
00025 
00026   typedef unsigned long long DataID;
00027 
00029 
00038   enum
00039   {
00040     OC_INVALID = 0xFFFFFFFF 
00041   , OC_OBJECT = 0           
00042   // nodes (0x00-0x1F)
00043   , OC_NODE = OC_OBJECT     
00044   , OC_GEONODE              
00045   , OC_GROUP                
00046   , OC_LOD                  
00047   , OC_SWITCH               
00048   , OC_TRANSFORM            
00049   , OC_ANIMATEDTRANSFORM    
00050   , OC_DIRECTEDLIGHT        
00051   , OC_POINTLIGHT           
00052   , OC_SPOTLIGHT            
00053   // drawables (0x20-0x3F)
00054   , OC_DRAWABLES = 0x20     
00055   , OC_GEOSET               
00056   , OC_QUADS                
00057   , OC_ANIMATEDQUADS        
00058   , OC_QUADSTRIPS           
00059   , OC_TRIANGLES            
00060   , OC_ANIMATEDTRIANGLES    
00061   , OC_SKINNEDTRIANGLES     
00062   , OC_TRISTRIPS            
00063   // states (0x40-0x5F)
00064   , OC_STATESET = 0x40      
00065   , OC_STATEATTRIBUTE       
00066   , OC_CGFX                 
00067   , OC_FACEATTRIBUTE        
00068   , OC_MATERIAL             
00069   , OC_TEXTUREATTRIBUTE     
00070   , OC_TEXTUREATTRIBUTEITEM 
00071   // animations (0x60-0x7F) 
00072   , OC_ANIMATION = 0x60                       
00073   , OC_FRAMEDTRAFOANIMATION                   
00074   , OC_FRAMEDVNVECTORANIMATION                
00075   , OC_LINEARINTERPOLATEDTRAFOANIMATION       
00076   , OC_LINEARINTERPOLATEDVNVECTORANIMATION    
00077   // cameras (0x80-0x9F)  
00078   , OC_CAMERA = 0x80                          
00079   , OC_JITTERCAMERA                           
00080   , OC_PARALLELCAMERA                         
00081   , OC_PERSPECTIVECAMERA                      
00082   , OC_STEREOCAMERA                           
00083   // highlight objects (0xA0-0xBF)
00084   , OC_HIGHLIGHTOBJECT = 0xA0                 
00085   , OC_HIGHLIGHTBOX                           
00086   , OC_HIGHLIGHTEDGES                         
00087   // custom (0xC0 and higher)
00088   , OC_CUSTOMOBJECT = 0xC0                    
00089   };
00090 
00092 
00093   class Object : public nvutil::RCObject
00094                , public nvutil::ISWMRSync
00095                , public DALHost // an object can host a DAL
00096   {
00097   public:
00099 
00100     unsigned int getObjectCode() const;
00101 
00103 
00105     NVSG_API virtual bool isDataShared( void ) const;
00106 
00108 
00110     NVSG_API virtual DataID getDataID( void ) const;
00111 
00113     NVSG_API void setName( const std::string& name    
00114                           );
00115 
00117 
00118     NVSG_API const std::string& getName( void ) const;
00119 
00121 
00128     NVSG_API bool waitToRead( size_t milliseconds = 0xFFFFFFFF   //<! Time-out interval, in milliseconds. 
00129                             ) const;
00130 
00132 
00134     NVSG_API void doneReading( void ) const;
00135     
00137 
00144     NVSG_API bool waitToWrite( size_t milliseconds = 0xFFFFFFFF   
00145                              ) const;
00146     
00148 
00150     NVSG_API void doneWriting( void ) const;
00151 
00152   protected: 
00154     NVSG_API Object( void );
00155 
00157     NVSG_API Object( const Object& rhs );
00158 
00160     NVSG_API virtual ~Object();
00161 
00162     unsigned int      m_objectCode; 
00163                                     // accessible for derived classes
00164 
00165   private:
00166     std::string       m_name;   
00167     nvutil::SWMRSync  m_lock;   
00168   };
00169 
00170   inline unsigned int Object::getObjectCode() const
00171   {
00172     __TRACE();
00173     return m_objectCode;
00174   }
00175 
00176   inline void Object::setName( const std::string& name )
00177   {
00178     __TRACE();
00179     m_name = name;
00180   }
00181 
00182   inline const std::string& Object::getName() const
00183   {
00184     __TRACE();
00185     return( m_name );
00186   }
00187 
00188   inline bool Object::waitToRead( size_t milliseconds ) const
00189   {
00190     __TRACE();
00191     size_t status;
00192     return m_lock.waitToRead(milliseconds, status);
00193   }
00194 
00195   inline void Object::doneReading( void ) const
00196   {
00197     __TRACE();
00198     m_lock.doneReading();
00199   }
00200 
00201   inline bool Object::waitToWrite( size_t milliseconds ) const
00202   {
00203     __TRACE();
00204     size_t status;
00205     return m_lock.waitToWrite(milliseconds, status);
00206   }
00207 
00208   inline void Object::doneWriting( void ) const
00209   {
00210     __TRACE();
00211     m_lock.doneWriting();
00212   }
00213 
00232   template<typename T>
00233   inline T * beginEdit( const T * obj  
00234                       )
00235   {
00236     __TRACE();
00237     __ASSERT(obj); // undefined behavior if this fires 
00238     obj->waitToWrite();
00239     return const_cast<T *>(obj);
00240   }
00241 
00259   template<typename T>
00260   inline const T * endEdit(T *& obj 
00261                           )
00262   {
00263     __TRACE();
00264     __ASSERT(obj); // undefined behavior if this fires
00265     const T* cobj = obj;
00266     cobj->doneWriting();
00267     obj = NULL; // force undefined behavior if accessed after endEdit
00268     return( cobj );
00269   }
00270 
00271   // this specialization detects wrong usage of endEdit at compile time
00272   template<typename T>
00273   inline const T * endEdit(const T *& obj)
00274   { // !!! must not call endEdit with a 'pointer to const' !!!
00275 
00276     // generate a compiler error
00277     Object * p=obj;
00278   }
00279 
00281 
00282   template<typename T> 
00283   inline bool isTypeOf( const Object *p )
00284   {
00285     return( dynamic_cast<const T *>( p ) != NULL );
00286   }
00287 
00289 
00290   inline bool areOfSameType( const Object &p0, const Object &p1 )
00291   {
00292     return( !! ( typeid( p0 ) == typeid( p1 ) ) );
00293   }
00294 
00295 } //  namespace nvsg

Generated on Tue Mar 1 13:19:18 2005 for NVSGSDK by NVIDIA