# xsi_iceattributedataarray.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 __XSIICEATTRIBUTEDATAARRAY_H__
    00018 #define __XSIICEATTRIBUTEDATAARRAY_H__
    00019
    00020 #include <sicppsdk.h>
    00021 #include <xsi_iceattributedataarray.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_indexset.h>
    00031
    00032 namespace XSI {
    00033
    00034 class ICEAttribute;
    00035
    00036 class CBaseICEAttributeDataArray
    00037 {
    00038 public:
    00039     friend class ICEAttribute;
    00040
    00041     CBaseICEAttributeDataArray( XSI::siICENodeDataType in_dataType, XSI::siICENodeStructureType in_structType )
    00042         :   m_dataType( in_dataType ),
    00043             m_structType( in_structType ),
    00044             m_nCount(0),
    00045             m_nHandle(0),
    00046             m_pData(NULL),
    00047             m_bIsConstant(false)
    00048     {}
    00049
    00050     virtual ~CBaseICEAttributeDataArray()
    00051     {
    00052         m_attrib.ReleaseDataArray( *this );
    00053     }
    00054
    00055 protected:
    00056     const void* GetDataPtr( ) const
    00057     {
    00058         return (const void*)m_pData;
    00059     }
    00060
    00061     ULONG GetHandle() const
    00062     {
    00063         return m_nHandle;
    00064     }
    00065
    00066     XSI::siICENodeDataType GetDataType() const
    00067     {
    00068         return m_dataType;
    00069     }
    00070
    00071     XSI::siICENodeStructureType GetStructureType() const
    00072     {
    00073         return m_structType;
    00074     }
    00075
    00076     void*& GetDataRef( )
    00077     {
    00078         return m_pData;
    00079     }
    00080
    00081     ULONG& GetHandleRef()
    00082     {
    00083         return m_nHandle;
    00084     }
    00085
    00086     ULONG& GetCountRef()
    00087     {
    00088         return m_nCount;
    00089     }
    00090
    00091     ICEAttribute& GetICEAttributeRef()
    00092     {
    00093         return m_attrib;
    00094     }
    00095
    00096     CBitsetHelper& GetBitsetRef()
    00097     {
    00098         return m_bitset;
    00099     }
    00100
    00101     bool& GetConstantRef()
    00102     {
    00103         return m_bIsConstant;
    00104     }
    00105
    00106 protected:
    00107     CStatus GetSubDataArray( ULONG in_index, CBaseICEAttributeDataArray& out_dataArray ) const
    00108     {
    00109         CStatus st = m_attrib.GetSubDataArray( *this, in_index, out_dataArray );
    00110         assert( st == CStatus::OK );
    00111         return st;
    00112     }
    00113
    00114     ULONG m_nCount;
    00115     CBitsetHelper m_bitset;
    00116     bool m_bIsConstant;
    00117
    00118 private:
    00119     CBaseICEAttributeDataArray( const CBaseICEAttributeDataArray& );
    00120
    00121     ULONG m_nHandle;
    00122     void* m_pData;
    00123     XSI::siICENodeStructureType m_structType;
    00124     XSI::siICENodeDataType m_dataType;
    00125     ICEAttribute m_attrib;
    00126 };
    00127
    00128 //*****************************************************************************
    00190 //*****************************************************************************
    00191 template<class T>
    00192 class CICEAttributeDataArray : public CBaseICEAttributeDataArray
    00193 {
    00194 public:
    00195
    00197     CICEAttributeDataArray( ) : CBaseICEAttributeDataArray( GetDefaultType( ), XSI::siICENodeStructureSingle ) {}
    00198
    00200     ~CICEAttributeDataArray( ) {}
    00201
    00207     const T& operator[]( ULONG in_index ) const
    00208     {
    00209         const T* pData = (const T*)GetDataPtr();
    00210         assert( pData != NULL || in_index < GetCount() );
    00211
    00212         static T defVal;
    00213         return pData ? ( m_bIsConstant ? *pData : pData[in_index] ) : defVal;
    00214     }
    00215
    00219     ULONG GetCount() const
    00220     {
    00221         return m_nCount;
    00222     }
    00223
    00227     bool IsConstant() const
    00228     {
    00229         return m_bIsConstant;
    00230     }
    00231
    00232 private:
    00233     static XSI::siICENodeDataType GetDefaultType( );
    00234
    00235 };
    00236
    00237 //*****************************************************************************
    00238 // NB: Do not use the Doxygen \class tag for this template!!!
    00245 //*****************************************************************************
    00246 template<>
    00247 class CICEAttributeDataArray<bool> : public CBaseICEAttributeDataArray
    00248 {
    00249 public:
    00251     CICEAttributeDataArray<bool>( ) :
    00252         CBaseICEAttributeDataArray( GetDefaultType( ), XSI::siICENodeStructureSingle )
    00253     {}
    00254
    00256     ~CICEAttributeDataArray<bool>( ) {}
    00257
    00263     const bool operator[]( ULONG in_index ) const
    00264     {
    00265         return m_bitset.GetBit( in_index );
    00266     }
    00267
    00271     ULONG GetCount() const
    00272     {
    00273         return m_nCount;
    00274     }
    00275
    00276 private:
    00277     static SICPPSDK_INLINE XSI::siICENodeDataType GetDefaultType( )
    00278     {
    00279         return siICENodeDataBool;
    00280     }
    00281 };
    00282
    00360 typedef XSI::CICEAttributeDataArray< float > CICEAttributeDataArrayFloat;
    00361 typedef XSI::CICEAttributeDataArray< LONG > CICEAttributeDataArrayLong;
    00362 typedef XSI::CICEAttributeDataArray< bool > CICEAttributeDataArrayBool;
    00363 typedef XSI::CICEAttributeDataArray< XSI::MATH::CVector2f > CICEAttributeDataArrayVector2f;
    00364 typedef XSI::CICEAttributeDataArray< XSI::MATH::CVector3f > CICEAttributeDataArrayVector3f;
    00365 typedef XSI::CICEAttributeDataArray< XSI::MATH::CVector4f > CICEAttributeDataArrayVector4f;
    00366 typedef XSI::CICEAttributeDataArray< XSI::MATH::CQuaternionf > CICEAttributeDataArrayQuaternionf;
    00367 typedef XSI::CICEAttributeDataArray< XSI::MATH::CRotationf > CICEAttributeDataArrayRotationf;
    00368 typedef XSI::CICEAttributeDataArray< XSI::MATH::CMatrix3f > CICEAttributeDataArrayMatrix3f;
    00369 typedef XSI::CICEAttributeDataArray< XSI::MATH::CMatrix4f > CICEAttributeDataArrayMatrix4f;
    00370 typedef XSI::CICEAttributeDataArray< XSI::MATH::CColor4f > CICEAttributeDataArrayColor4f;
    00371 typedef XSI::CICEAttributeDataArray< XSI::MATH::CShape> CICEAttributeDataArrayShape;
    00372
    00373 template<> SICPPSDK_INLINE XSI::siICENodeDataType CICEAttributeDataArrayFloat::GetDefaultType( ){return siICENodeDataFloat;}
    00374 template<> SICPPSDK_INLINE XSI::siICENodeDataType CICEAttributeDataArrayLong::GetDefaultType( ){return siICENodeDataLong;}
    00375 template<> SICPPSDK_INLINE XSI::siICENodeDataType CICEAttributeDataArrayVector2f::GetDefaultType( ){return siICENodeDataVector2;}
    00376 template<> SICPPSDK_INLINE XSI::siICENodeDataType CICEAttributeDataArrayVector3f::GetDefaultType( ){return siICENodeDataVector3;}
    00377 template<> SICPPSDK_INLINE XSI::siICENodeDataType CICEAttributeDataArrayVector4f::GetDefaultType( ){return siICENodeDataVector4;}
    00378 template<> SICPPSDK_INLINE XSI::siICENodeDataType CICEAttributeDataArrayQuaternionf::GetDefaultType( ){return siICENodeDataQuaternion;}
    00379 template<> SICPPSDK_INLINE XSI::siICENodeDataType CICEAttributeDataArrayMatrix3f::GetDefaultType( ){return siICENodeDataMatrix33;}
    00380 template<> SICPPSDK_INLINE XSI::siICENodeDataType CICEAttributeDataArrayMatrix4f::GetDefaultType( ){return siICENodeDataMatrix44;}
    00381 template<> SICPPSDK_INLINE XSI::siICENodeDataType CICEAttributeDataArrayColor4f::GetDefaultType( ){return siICENodeDataColor4;}
    00382 template<> SICPPSDK_INLINE XSI::siICENodeDataType CICEAttributeDataArrayRotationf::GetDefaultType( ){return siICENodeDataRotation;}
    00383 template<> SICPPSDK_INLINE XSI::siICENodeDataType CICEAttributeDataArrayShape::GetDefaultType( ){return siICENodeDataShape;}
    00384
    00385 };
    00386
    00387 #endif // __XSIICEATTRIBUTEDATAARRAY_H__