00001
00011
00012
00013 #if (_MSC_VER > 1000) || defined(SGI_COMPILER)
00014 #pragma once
00015 #endif
00016
00017 #ifndef __XSIICEATTRIBUTEDATAARRAY_H__
00018 #define __XSIICEATTRIBUTEDATAARRAY_H__
00019
00020 #include <sicppsdk.h>
00021 #include <xsi_iceattribute.h>
00022 #include <xsi_vector2f.h>
00023 #include <xsi_vector3f.h>
00024 #include <xsi_vector4f.h>
00025 #include <xsi_quaternionf.h>
00026 #include <xsi_rotationf.h>
00027 #include <xsi_matrix3f.h>
00028 #include <xsi_matrix4f.h>
00029 #include <xsi_color4f.h>
00030 #include <xsi_shape.h>
00031 #include <xsi_indexset.h>
00032
00033 namespace XSI {
00034
00035
00068
00069
00070 class CBaseICEAttributeDataArray
00071 {
00072 public:
00073 friend class ICEAttribute;
00074
00075 CBaseICEAttributeDataArray( XSI::siICENodeDataType in_dataType, XSI::siICENodeStructureType in_structType )
00076 : m_nCount(0),
00077 m_bIsConstant(false),
00078 m_nAccessIndex(UINT_MAX),
00079 m_nHandle(0),
00080 m_pData(NULL),
00081 m_structType( in_structType ),
00082 m_dataType( in_dataType ),
00083 m_pParent(NULL)
00084 {}
00085
00089 ULONG GetCount() const
00090 {
00091 return m_nCount;
00092 }
00093
00097 bool IsConstant() const
00098 {
00099 return m_bIsConstant;
00100 }
00101
00105 XSI::siICENodeDataType GetDataType() const
00106 {
00107 return m_dataType;
00108 }
00109
00113 XSI::siICENodeStructureType GetStructureType() const
00114 {
00115 return m_pParent ? m_pParent->GetStructureType( ) : m_structType;
00116 }
00117
00118 virtual ~CBaseICEAttributeDataArray()
00119 {
00120 m_attrib.ReleaseDataArray( *this );
00121 }
00122
00123 protected:
00124 const void* GetDataPtr( ) const
00125 {
00126 return (const void*)m_pData;
00127 }
00128
00129 ULONG GetHandle() const
00130 {
00131 return m_pParent ? m_pParent->GetHandle( ) : m_nHandle;
00132 }
00133
00134 ULONG GetAccessIndex() const
00135 {
00136 return m_pParent ? m_pParent->GetAccessIndex( ) : m_nAccessIndex;
00137 }
00138
00139 void*& GetDataRef( )
00140 {
00141 return m_pData;
00142 }
00143
00144 ULONG& GetHandleRef()
00145 {
00146 return m_nHandle;
00147 }
00148
00149 ULONG& GetCountRef()
00150 {
00151 return m_nCount;
00152 }
00153
00154 ICEAttribute& GetICEAttributeRef()
00155 {
00156 return m_attrib;
00157 }
00158
00159 CBitsetHelper& GetBitsetRef()
00160 {
00161 return m_bitset;
00162 }
00163
00164 bool& GetConstantRef()
00165 {
00166 return m_bIsConstant;
00167 }
00168
00169 void SetParent( CBaseICEAttributeDataArray* in_pParent )
00170 {
00171 m_pParent = in_pParent;
00172 }
00173
00174 ULONG& GetAccessIndexRef()
00175 {
00176 return m_nAccessIndex;
00177 }
00178
00179 protected:
00180 CStatus GetSubDataArray( ULONG in_index, CBaseICEAttributeDataArray& out_dataArray ) const
00181 {
00182 CStatus st = m_attrib.GetSubDataArray( (CBaseICEAttributeDataArray&)*this, in_index, out_dataArray );
00183 assert( st == CStatus::OK );
00184 return st;
00185 }
00186
00187 CStatus ResizeSubDataArray( ULONG in_index, ULONG in_ulSize, CBaseICEAttributeDataArray& out_dataArray )
00188 {
00189 if( m_attrib.IsReadonly() )
00190 return CStatus::AccessDenied;
00191
00192 CStatus st = m_attrib.ResizeSubDataArray((CBaseICEAttributeDataArray&)*this, in_index, in_ulSize, out_dataArray );
00193 assert( st == CStatus::OK );
00194 return st;
00195 }
00196
00197 CStatus GetCustomTypeData( ULONG in_nIndex, const unsigned char** out_ppData, ULONG& out_nSize ) const
00198 {
00199 if ( GetStructureType() == XSI::siICENodeStructureSingle )
00200 {
00201 return m_attrib.GetCustomTypeData( (CBaseICEAttributeDataArray&)*this, in_nIndex, out_ppData, out_nSize );
00202 }
00203 return m_attrib.GetCustomTypeData2D( (CBaseICEAttributeDataArray&)*this, in_nIndex, out_ppData, out_nSize );
00204 }
00205
00206 CStatus GetStringData( ULONG in_nIndex, const wchar_t** out_ppData, ULONG& out_nSize ) const
00207 {
00208 if ( GetStructureType() == XSI::siICENodeStructureSingle )
00209 {
00210 return m_attrib.GetStringData( (CBaseICEAttributeDataArray&)*this, in_nIndex, out_ppData, out_nSize );
00211 }
00212 return m_attrib.GetStringData2D( (CBaseICEAttributeDataArray&)*this, in_nIndex, out_ppData, out_nSize );
00213 }
00214
00215 CStatus SetStringData( ULONG in_nIndex, const wchar_t* in_pData, ULONG in_nSize )
00216 {
00217 return m_attrib.SetStringData( (CBaseICEAttributeDataArray&)*this, in_nIndex, in_pData, in_nSize );
00218 }
00219
00220 ULONG m_nCount;
00221 CBitsetHelper m_bitset;
00222 bool m_bIsConstant;
00223
00224 private:
00225 ULONG m_nAccessIndex;
00226 ULONG m_nHandle;
00227 void* m_pData;
00228 XSI::siICENodeStructureType m_structType;
00229 XSI::siICENodeDataType m_dataType;
00230 ICEAttribute m_attrib;
00231 CBaseICEAttributeDataArray* m_pParent;
00232 };
00233
00234
00295
00296 template<class T>
00297 class CICEAttributeDataArray : public CBaseICEAttributeDataArray
00298 {
00299 public:
00300
00302 CICEAttributeDataArray( ) : CBaseICEAttributeDataArray( GetDefaultType( ), XSI::siICENodeStructureSingle ) {}
00303
00305 ~CICEAttributeDataArray( ) {}
00306
00312 const T& operator[]( ULONG in_index ) const
00313 {
00314 const T* pData = (const T*)GetDataPtr();
00315 assert( pData != NULL || in_index < GetCount() );
00316
00317 if (!pData)
00318 {
00319 static T defVal;
00320 return defVal;
00321 }
00322
00323 if (m_bIsConstant)
00324 {
00325 return *pData;
00326 }
00327
00328 return pData[in_index];
00329 }
00330
00337 T& operator[]( ULONG in_index )
00338 {
00339 T* pData = (T*) GetDataPtr();
00340 assert( pData != NULL || in_index < GetCount() );
00341
00342 if (!pData || in_index >= GetCount() || GetICEAttributeRef().IsReadonly() )
00343 {
00344 static T defVal;
00345 return defVal;
00346 }
00347
00348 if (m_bIsConstant)
00349 {
00350 return pData[0];
00351 }
00352
00353 return pData[in_index];
00354 }
00355
00356
00357 private:
00358 static XSI::siICENodeDataType GetDefaultType( );
00359
00360 };
00361
00362
00363
00368
00369 template<>
00370 class CICEAttributeDataArray<bool> : public CBaseICEAttributeDataArray
00371 {
00372 public:
00374 CICEAttributeDataArray<bool>( ) :
00375 CBaseICEAttributeDataArray( GetDefaultType( ), XSI::siICENodeStructureSingle )
00376 {}
00377
00379 ~CICEAttributeDataArray<bool>( ) {}
00380
00386 const bool operator[]( ULONG in_index ) const
00387 {
00388 return m_bitset.GetBit( in_index );
00389 }
00390
00399 CStatus SetData( ULONG in_nIndex, bool in_bVal )
00400 {
00401 if( in_nIndex >= GetCount() )
00402 return CStatus::InvalidArgument;
00403
00404 if( GetICEAttributeRef().IsReadonly() )
00405 return CStatus::AccessDenied;
00406
00407 return m_bitset.SetBit( in_nIndex, in_bVal );
00408 }
00409
00410 private:
00411 static SICPPSDK_INLINE XSI::siICENodeDataType GetDefaultType( )
00412 {
00413 return siICENodeDataBool;
00414 }
00415 };
00416
00417
00452
00453
00454 class CICEAttributeDataArrayCustomType : public CBaseICEAttributeDataArray
00455 {
00456 public:
00457 typedef unsigned char TData;
00458
00461 SICPPSDK_INLINE CICEAttributeDataArrayCustomType( ) : CBaseICEAttributeDataArray( GetDefaultType( ), XSI::siICENodeStructureSingle )
00462 {}
00463
00466 SICPPSDK_INLINE ~CICEAttributeDataArrayCustomType( )
00467 {}
00468
00478 SICPPSDK_INLINE CStatus GetData( ULONG in_nIndex, const TData** out_ppData, ULONG& out_nSize ) const;
00479
00480 private:
00481 static SICPPSDK_INLINE XSI::siICENodeDataType GetDefaultType( )
00482 {
00483 return siICENodeDataCustomType;
00484 }
00485 };
00486
00487 CStatus CICEAttributeDataArrayCustomType::GetData( ULONG in_nIndex, const TData** out_ppData, ULONG& out_nSize ) const
00488 {
00489 return GetCustomTypeData( in_nIndex, out_ppData, out_nSize );
00490 }
00491
00492
00526
00527
00528 class CICEAttributeDataArrayString : public CBaseICEAttributeDataArray
00529 {
00530 public:
00531 typedef wchar_t TData;
00532
00535 SICPPSDK_INLINE CICEAttributeDataArrayString( ) : CBaseICEAttributeDataArray( GetDefaultType( ), XSI::siICENodeStructureSingle )
00536 {}
00537
00540 SICPPSDK_INLINE ~CICEAttributeDataArrayString( )
00541 {}
00542
00555 SICPPSDK_INLINE CStatus GetData( ULONG in_nIndex, const TData** out_ppStr, ULONG& out_nCount ) const;
00556
00562 SICPPSDK_INLINE CStatus GetData( ULONG in_nIndex, CString& out_str ) const;
00563 SICPPSDK_INLINE CStatus SetData( ULONG in_nIndex, const CString& in_str );
00564
00570 SICPPSDK_INLINE CString operator[]( ULONG in_nIndex ) const;
00571
00572 private:
00573 static SICPPSDK_INLINE XSI::siICENodeDataType GetDefaultType( )
00574 {
00575 return siICENodeDataString;
00576 }
00577 };
00578
00579 CStatus CICEAttributeDataArrayString::GetData( ULONG in_nIndex, const TData** out_ppStr, ULONG& out_nCount ) const
00580 {
00581 return GetStringData( in_nIndex, out_ppStr, out_nCount );
00582 }
00583
00584 SICPPSDK_INLINE CStatus CICEAttributeDataArrayString::GetData( ULONG in_nIndex, CString& out_str ) const
00585 {
00586 const wchar_t* pzStr;
00587 ULONG nSize;
00588 CStatus st = GetStringData( in_nIndex, &pzStr, nSize );
00589 out_str = CString( pzStr, nSize );
00590 return st;
00591 }
00592
00593 SICPPSDK_INLINE CStatus CICEAttributeDataArrayString::SetData( ULONG in_nIndex, const CString& in_str )
00594 {
00595 if( in_nIndex >= GetCount() )
00596 return CStatus::InvalidArgument;
00597
00598 if( GetICEAttributeRef().IsReadonly() )
00599 return CStatus::AccessDenied;
00600
00601 return SetStringData( in_nIndex, in_str.GetWideString(), in_str.Length() );
00602 }
00603
00604 SICPPSDK_INLINE CString CICEAttributeDataArrayString::operator[]( ULONG i ) const
00605 {
00606 CString str;
00607 GetData( i, str );
00608 return str;
00609 }
00610
00688 typedef XSI::CICEAttributeDataArray< float > CICEAttributeDataArrayFloat;
00689 typedef XSI::CICEAttributeDataArray< LONG > CICEAttributeDataArrayLong;
00690 typedef XSI::CICEAttributeDataArray< bool > CICEAttributeDataArrayBool;
00691 typedef XSI::CICEAttributeDataArray< XSI::MATH::CVector2f > CICEAttributeDataArrayVector2f;
00692 typedef XSI::CICEAttributeDataArray< XSI::MATH::CVector3f > CICEAttributeDataArrayVector3f;
00693 typedef XSI::CICEAttributeDataArray< XSI::MATH::CVector4f > CICEAttributeDataArrayVector4f;
00694 typedef XSI::CICEAttributeDataArray< XSI::MATH::CQuaternionf > CICEAttributeDataArrayQuaternionf;
00695 typedef XSI::CICEAttributeDataArray< XSI::MATH::CRotationf > CICEAttributeDataArrayRotationf;
00696 typedef XSI::CICEAttributeDataArray< XSI::MATH::CMatrix3f > CICEAttributeDataArrayMatrix3f;
00697 typedef XSI::CICEAttributeDataArray< XSI::MATH::CMatrix4f > CICEAttributeDataArrayMatrix4f;
00698 typedef XSI::CICEAttributeDataArray< XSI::MATH::CColor4f > CICEAttributeDataArrayColor4f;
00699 typedef XSI::CICEAttributeDataArray< XSI::MATH::CShape> CICEAttributeDataArrayShape;
00700
00701 template<> SICPPSDK_INLINE XSI::siICENodeDataType CICEAttributeDataArrayFloat::GetDefaultType( ){return siICENodeDataFloat;}
00702 template<> SICPPSDK_INLINE XSI::siICENodeDataType CICEAttributeDataArrayLong::GetDefaultType( ){return siICENodeDataLong;}
00703 template<> SICPPSDK_INLINE XSI::siICENodeDataType CICEAttributeDataArrayVector2f::GetDefaultType( ){return siICENodeDataVector2;}
00704 template<> SICPPSDK_INLINE XSI::siICENodeDataType CICEAttributeDataArrayVector3f::GetDefaultType( ){return siICENodeDataVector3;}
00705 template<> SICPPSDK_INLINE XSI::siICENodeDataType CICEAttributeDataArrayVector4f::GetDefaultType( ){return siICENodeDataVector4;}
00706 template<> SICPPSDK_INLINE XSI::siICENodeDataType CICEAttributeDataArrayQuaternionf::GetDefaultType( ){return siICENodeDataQuaternion;}
00707 template<> SICPPSDK_INLINE XSI::siICENodeDataType CICEAttributeDataArrayMatrix3f::GetDefaultType( ){return siICENodeDataMatrix33;}
00708 template<> SICPPSDK_INLINE XSI::siICENodeDataType CICEAttributeDataArrayMatrix4f::GetDefaultType( ){return siICENodeDataMatrix44;}
00709 template<> SICPPSDK_INLINE XSI::siICENodeDataType CICEAttributeDataArrayColor4f::GetDefaultType( ){return siICENodeDataColor4;}
00710 template<> SICPPSDK_INLINE XSI::siICENodeDataType CICEAttributeDataArrayRotationf::GetDefaultType( ){return siICENodeDataRotation;}
00711 template<> SICPPSDK_INLINE XSI::siICENodeDataType CICEAttributeDataArrayShape::GetDefaultType( ){return siICENodeDataShape;}
00712
00713 };
00714
00715 #endif // __XSIICEATTRIBUTEDATAARRAY_H__