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__