xsi_dataarray2D.h

Go to the documentation of this file.
00001 //*****************************************************************************
00011 //*****************************************************************************
00012 
00013 #if (_MSC_VER > 1000) || defined(SGI_COMPILER)
00014 #pragma once
00015 #endif
00016 
00017 #ifndef __XSIDATAARRAY2D_H__
00018 #define __XSIDATAARRAY2D_H__
00019 
00020 #include <sicppsdk.h>
00021 #include <xsi_icenodecontext.h>
00022 #include <xsi_indexset.h>
00023 #include <xsi_dataarray.h>
00024 
00025 #include <xsi_vector2f.h>
00026 #include <xsi_vector3f.h>
00027 #include <xsi_vector4f.h>
00028 #include <xsi_quaternionf.h>
00029 #include <xsi_rotationf.h>
00030 #include <xsi_matrix3f.h>
00031 #include <xsi_matrix4f.h>
00032 #include <xsi_color4f.h>
00033 
00034 namespace XSI {
00035 
00036 class ICENodeContext;
00037 
00038 class CBaseDataArray2D : public CBaseDataArray
00039 {
00040     public:
00041     friend class ICENodeContext;
00042     
00043     CBaseDataArray2D() : m_bIsSubArrayConstant(false) {}
00044 
00045     protected:
00046     SICPPSDK_INLINE CStatus AcquireInputDataArray( XSI::siICENodeDataType in_arrayDataType, ULONG in_nInputPortID, ULONG in_nInstanceIndex );
00047     SICPPSDK_INLINE CStatus AcquireOutputDataArray( XSI::siICENodeDataType in_arrayDataType );
00048     SICPPSDK_INLINE CStatus ReleaseDataArray( );
00049     SICPPSDK_INLINE CStatus GetSubArray( ULONG in_nArrayIndex, void*& out_ppData, ULONG& out_nCount, ULONG& out_nStartBit ) const;
00050     SICPPSDK_INLINE CStatus ResizeSubArray( ULONG in_nArrayIndex, ULONG in_nSize, void*& out_ppData, ULONG& out_nCount, ULONG& out_nStartBit ); 
00051     SICPPSDK_INLINE bool GetSubArrayConstant() const;
00052     SICPPSDK_INLINE bool& GetSubArrayConstantRef();
00053     
00054     private:
00055     
00056     bool m_bIsSubArrayConstant;
00057     CBaseDataArray2D( const CBaseDataArray2D& );
00058 };
00059 
00060 SICPPSDK_INLINE CStatus CBaseDataArray2D::AcquireInputDataArray( XSI::siICENodeDataType in_arrayDataType, ULONG in_nInputPortID, ULONG in_nInstanceIndex )
00061 {
00062     return m_ctxt.AcquireInputDataArray2D( *this, in_arrayDataType, in_nInputPortID, in_nInstanceIndex );
00063 }
00064 
00065 SICPPSDK_INLINE CStatus CBaseDataArray2D::AcquireOutputDataArray( XSI::siICENodeDataType in_arrayDataType )
00066 {
00067     return m_ctxt.AcquireOutputDataArray2D( *this, in_arrayDataType );
00068 }
00069 
00070 SICPPSDK_INLINE CStatus CBaseDataArray2D::ReleaseDataArray( )
00071 {
00072     return m_ctxt.ReleaseDataArray( *this );
00073 }
00074 
00075 SICPPSDK_INLINE CStatus CBaseDataArray2D::ResizeSubArray( ULONG in_nArrayIndex, ULONG in_nSize, void*& out_ppData, ULONG& out_nCount, ULONG& out_nStartBit )
00076 {
00077     return m_ctxt.ResizeSubArray( *this, in_nArrayIndex, in_nSize, out_ppData, out_nCount, out_nStartBit );
00078 }
00079 
00080 SICPPSDK_INLINE CStatus CBaseDataArray2D::GetSubArray( ULONG in_nArrayIndex, void*& out_ppData, ULONG& out_nCount, ULONG& out_nStartBit ) const
00081 {
00082     return m_ctxt.GetSubArray( (CBaseDataArray2D&)*this, in_nArrayIndex, out_ppData, out_nCount, out_nStartBit );
00083 }
00084 
00085 SICPPSDK_INLINE bool& CBaseDataArray2D::GetSubArrayConstantRef()
00086 {
00087     return m_bIsSubArrayConstant;
00088 }
00089 
00090 SICPPSDK_INLINE bool CBaseDataArray2D::GetSubArrayConstant() const
00091 {
00092     return m_bIsSubArrayConstant;
00093 }
00094 
00095 //*****************************************************************************
00168 //*****************************************************************************
00169 
00170 template <class T>
00171 class CDataArray2D : public CBaseDataArray2D
00172 {
00173     public:
00174 
00191     typedef T TData;
00192 
00193     //*****************************************************************************
00200     //*****************************************************************************
00201 
00202     class Accessor
00203     {
00204         public:
00205         friend class CDataArray2D<T>;
00206 
00209         Accessor( ) : m_pData(NULL), m_nCount(0), m_bIsConstant(false)
00210         {
00211         }
00212 
00215         Accessor( const Accessor& in_accessor )
00216         {
00217             *this = in_accessor;
00218         }
00219 
00224         Accessor& operator=( const Accessor& in_accessor )
00225         {
00226             m_pData = in_accessor.m_pData;
00227             m_nCount = in_accessor.m_nCount;
00228             m_bIsConstant = in_accessor.m_bIsConstant;
00229             return *this;
00230         }
00231 
00235         ULONG GetCount() const
00236         {
00237             return m_nCount;
00238         }
00239 
00245         const T& operator[]( ULONG in_index ) const
00246         {
00247             return m_pData[ m_bIsConstant ? 0 : in_index ];
00248         }
00249 
00255         T& operator[]( ULONG in_index )
00256         {
00257             return m_pData[ m_bIsConstant ? 0 : in_index ];
00258         }
00259 
00260         private:
00261         void*& GetDataRef()
00262         {
00263             return (void*&)m_pData;
00264         }
00265 
00266         ULONG& GetCountRef()
00267         {
00268             return m_nCount;
00269         }
00270 
00271         void SetAsConstant( bool in_bConst ) 
00272         {
00273             m_bIsConstant = in_bConst;
00274         }
00275 
00276         T* m_pData;
00277         ULONG m_nCount;
00278         bool m_bIsConstant;
00279     };
00280 
00286     SICPPSDK_INLINE CDataArray2D( ICENodeContext& in_ctxt, ULONG in_nInputPortID, ULONG in_nInstanceIndex=0 ) ;
00287 
00291     SICPPSDK_INLINE CDataArray2D( ICENodeContext& in_ctxt ) ;
00292 
00295     SICPPSDK_INLINE ~CDataArray2D( );
00296 
00302     SICPPSDK_INLINE Accessor operator[]( ULONG in_nArrayIndex ) const;
00303 
00310     SICPPSDK_INLINE Accessor Resize( ULONG in_nArrayIndex, ULONG in_nSize );
00311 
00315     SICPPSDK_INLINE ULONG GetCount() const;
00316 
00320     SICPPSDK_INLINE bool IsConstant() const;
00321 
00322 private:
00323     SICPPSDK_INLINE Accessor Get( ULONG in_nArrayIndex ) const;
00324     SICPPSDK_INLINE void Clear();
00325     static SICPPSDK_INLINE XSI::siICENodeDataType GetDefaultType( );
00326 };
00327 
00328 template< class T >
00329 SICPPSDK_INLINE CDataArray2D<T>::CDataArray2D( ICENodeContext& in_ctxt, ULONG in_nInputPortID, ULONG in_nInstanceIndex )
00330 {
00331     m_ctxt = in_ctxt;
00332 
00333     AcquireInputDataArray( GetDefaultType(), in_nInputPortID, in_nInstanceIndex );
00334 }
00335 
00336 template< class T >
00337 SICPPSDK_INLINE CDataArray2D<T>::CDataArray2D( ICENodeContext& in_ctxt )
00338 {
00339     m_ctxt = in_ctxt;
00340 
00341     AcquireOutputDataArray( GetDefaultType() );
00342 }
00343 
00344 template< class T >
00345 SICPPSDK_INLINE CDataArray2D<T>::~CDataArray2D( )
00346 {
00347     ReleaseDataArray( );
00348 }
00349 
00350 template< class T >
00351 SICPPSDK_INLINE typename CDataArray2D<T>::Accessor CDataArray2D<T>::Get( ULONG in_nArrayIndex ) const
00352 {
00353     Accessor a;
00354     ULONG nNotused;
00355     GetSubArray( in_nArrayIndex, a.GetDataRef(), (ULONG&)a.GetCountRef(), nNotused );
00356     a.SetAsConstant( GetSubArrayConstant() );
00357 
00358     return a;
00359 }
00360 
00361 template< class T >
00362 SICPPSDK_INLINE typename CDataArray2D<T>::Accessor CDataArray2D<T>::operator[]( ULONG in_nArrayIndex ) const
00363 {
00364     return Get( in_nArrayIndex );
00365 }
00366 
00367 template< class T >
00368 SICPPSDK_INLINE typename CDataArray2D<T>::Accessor CDataArray2D<T>::Resize( ULONG in_nArrayIndex, ULONG in_nSize )
00369 {
00370     ULONG nNotused;
00371     Accessor a;
00372     ResizeSubArray( in_nArrayIndex, in_nSize, a.GetDataRef(), (ULONG&)a.GetCountRef(), nNotused );
00373     a.SetAsConstant( GetSubArrayConstant() );
00374     return a;
00375 }
00376 
00377 template< class T >
00378 SICPPSDK_INLINE void CDataArray2D<T>::Clear()
00379 {
00380     ReleaseDataArray( );
00381     m_nHandle = UINT_MAX;
00382     m_nCount = 0;
00383     m_bIsConstant = false;
00384     m_bIsSubArrayConstant = false
00385 }
00386 
00387 template< class T >
00388 SICPPSDK_INLINE ULONG CDataArray2D<T>::GetCount() const
00389 {
00390     return m_nCount;
00391 }
00392 
00393 template< class T >
00394 SICPPSDK_INLINE bool CDataArray2D<T>::IsConstant() const
00395 {
00396     return m_bIsConstant;
00397 }
00398 
00399 //*****************************************************************************
00400 // NB: Do not use the Doxygen \class tag for this template!!!
00407 //*****************************************************************************
00408 
00409 template <>
00410 class CDataArray2D<bool> : public CBaseDataArray2D
00411 {
00412     public:
00413     //*****************************************************************************
00420     //*****************************************************************************
00421     class Accessor
00422     {
00423         public:
00424         friend class CDataArray2D<bool>;
00425 
00428         Accessor( ) : m_nStartbit(0), m_bIsConstant(false)
00429         {
00430         }
00431 
00434         Accessor( const Accessor& in_accessor )
00435         {
00436             *this = in_accessor;
00437         }
00438 
00443         Accessor& operator=( const Accessor& in_accessor )
00444         {
00445             m_bitset = in_accessor.m_bitset;
00446             m_nStartbit = in_accessor.m_nStartbit;
00447             m_bIsConstant = in_accessor.m_bIsConstant;
00448             return *this;
00449         }
00450 
00456         const bool operator[] ( ULONG in_index ) const
00457         {
00458             ULONG nIndex = m_nStartbit + m_bitset.GetCount() == UINT_MAX ? 0 : in_index;
00459             return m_bitset.GetBit( nIndex );
00460         }
00461 
00468         CStatus Set( ULONG in_index, bool in_bVal )
00469         {
00470             return m_bitset.SetBit( m_nStartbit + in_index, in_bVal );
00471         }
00472 
00476         ULONG GetCount() const
00477         {
00478             return m_bitset.GetCount( );
00479         }
00480 
00481         private:
00482 
00483         void SetAsConstant( bool in_bConst ) 
00484         {
00485             m_bIsConstant = in_bConst;
00486         }
00487 
00488         ULONG m_nStartbit;
00489         CBitsetHelper m_bitset;
00490         bool m_bIsConstant;
00491     };
00492 
00498     SICPPSDK_INLINE CDataArray2D( ICENodeContext& in_ctxt, ULONG in_nInputPortID, ULONG in_nInstanceIndex=0 ) ;
00499 
00503     SICPPSDK_INLINE CDataArray2D( ICENodeContext& in_ctxt ) ;
00504 
00507     SICPPSDK_INLINE ~CDataArray2D( );
00508 
00514     SICPPSDK_INLINE Accessor operator[]( ULONG in_nArrayIndex ) const;
00515 
00522     SICPPSDK_INLINE Accessor Resize( ULONG in_nArrayIndex, ULONG in_nSize );
00523 
00527     SICPPSDK_INLINE ULONG GetCount() const;
00528 
00532     SICPPSDK_INLINE bool IsConstant() const;
00533 
00534 private:
00535     SICPPSDK_INLINE Accessor Get( ULONG in_nArrayIndex ) const;
00536     static SICPPSDK_INLINE XSI::siICENodeDataType GetDefaultType( );
00537 };
00538 
00539 SICPPSDK_INLINE CDataArray2D<bool>::CDataArray2D( ICENodeContext& in_ctxt, ULONG in_nInputPortID, ULONG in_nInstanceIndex )
00540 {
00541     m_ctxt = in_ctxt;
00542 
00543     AcquireInputDataArray( GetDefaultType(), in_nInputPortID, in_nInstanceIndex );
00544 }
00545 
00546 SICPPSDK_INLINE CDataArray2D<bool>::CDataArray2D( ICENodeContext& in_ctxt )
00547 {
00548     m_ctxt = in_ctxt;
00549 
00550     AcquireOutputDataArray( GetDefaultType() );
00551 }
00552 
00553 SICPPSDK_INLINE CDataArray2D<bool>::~CDataArray2D( )
00554 {
00555     ReleaseDataArray( );
00556 }
00557 
00558 SICPPSDK_INLINE CDataArray2D<bool>::Accessor CDataArray2D<bool>::Get( ULONG in_nArrayIndex ) const
00559 {
00560     Accessor a;
00561     GetSubArray( in_nArrayIndex, (void*&)a.m_bitset.GetArrayRef(), (ULONG&)a.m_bitset.GetCountRef(), a.m_nStartbit );
00562     a.SetAsConstant( GetSubArrayConstant() );
00563     return a;
00564 }
00565 
00566 SICPPSDK_INLINE CDataArray2D<bool>::Accessor CDataArray2D<bool>::operator[]( ULONG in_nArrayIndex ) const
00567 {
00568     return Get( in_nArrayIndex );
00569 }
00570 
00571 SICPPSDK_INLINE CDataArray2D<bool>::Accessor CDataArray2D<bool>::Resize( ULONG in_nArrayIndex, ULONG in_nSize )
00572 {
00573     Accessor a;
00574     ResizeSubArray( in_nArrayIndex, in_nSize, (void*&)a.m_bitset.GetArrayRef(), (ULONG&)a.m_bitset.GetCountRef(), a.m_nStartbit );
00575     a.SetAsConstant( GetSubArrayConstant() );
00576     return a;
00577 }
00578 
00579 SICPPSDK_INLINE ULONG CDataArray2D<bool>::GetCount() const
00580 {
00581     return m_nCount;
00582 }
00583 
00584 SICPPSDK_INLINE bool CDataArray2D<bool>::IsConstant() const
00585 {
00586     return m_bIsConstant;
00587 }
00588 
00589 // Explicit template instances
00666 typedef CDataArray2D< float > CDataArray2DFloat;
00667 typedef CDataArray2D< LONG > CDataArray2DLong;
00668 typedef CDataArray2D< bool > CDataArray2DBool;
00669 typedef CDataArray2D< XSI::MATH::CVector2f > CDataArray2DVector2f;
00670 typedef CDataArray2D< XSI::MATH::CVector3f > CDataArray2DVector3f;
00671 typedef CDataArray2D< XSI::MATH::CVector4f > CDataArray2DVector4f;
00672 typedef CDataArray2D< XSI::MATH::CQuaternionf > CDataArray2DQuaternionf;
00673 typedef CDataArray2D< XSI::MATH::CRotationf > CDataArray2DRotationf;
00674 typedef CDataArray2D< XSI::MATH::CMatrix3f > CDataArray2DMatrix3f;
00675 typedef CDataArray2D< XSI::MATH::CMatrix4f > CDataArray2DMatrix4f;
00676 typedef CDataArray2D< XSI::MATH::CColor4f > CDataArray2DColor4f;
00677 typedef XSI::CDataArray2D< XSI::MATH::CShape> CDataArray2DShape;
00678 
00679 template<> SICPPSDK_INLINE siICENodeDataType CDataArray2DFloat::GetDefaultType( ){return siICENodeDataFloat;}
00680 SICPPSDK_INLINE siICENodeDataType CDataArray2DBool::GetDefaultType( ){return siICENodeDataBool;}
00681 template<> SICPPSDK_INLINE siICENodeDataType CDataArray2DLong::GetDefaultType( ){return siICENodeDataLong;}
00682 template<> SICPPSDK_INLINE siICENodeDataType CDataArray2DVector2f::GetDefaultType( ){return siICENodeDataVector2;}
00683 template<> SICPPSDK_INLINE siICENodeDataType CDataArray2DVector3f::GetDefaultType( ){return siICENodeDataVector3;}
00684 template<> SICPPSDK_INLINE siICENodeDataType CDataArray2DVector4f::GetDefaultType( ){return siICENodeDataVector4;}
00685 template<> SICPPSDK_INLINE siICENodeDataType CDataArray2DQuaternionf::GetDefaultType( ){return siICENodeDataQuaternion;}
00686 template<> SICPPSDK_INLINE siICENodeDataType CDataArray2DMatrix3f::GetDefaultType( ){return siICENodeDataMatrix33;}
00687 template<> SICPPSDK_INLINE siICENodeDataType CDataArray2DMatrix4f::GetDefaultType( ){return siICENodeDataMatrix44;}
00688 template<> SICPPSDK_INLINE siICENodeDataType CDataArray2DColor4f::GetDefaultType( ){return siICENodeDataColor4;}
00689 template<> SICPPSDK_INLINE siICENodeDataType CDataArray2DRotationf::GetDefaultType( ){return siICENodeDataRotation;}
00690 template<> SICPPSDK_INLINE XSI::siICENodeDataType CDataArray2DShape::GetDefaultType( ){return siICENodeDataShape;}
00691 }; // XSI
00692 
00693 #endif // __XSIDATAARRAY2D_H__