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
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
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 };
00692
00693 #endif // __XSIDATAARRAY2D_H__