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
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__