FBX C++ API Reference
fbxlayer.h
Go to the documentation of this file.
1 /****************************************************************************************
2 
3  Copyright (C) 2016 Autodesk, Inc.
4  All rights reserved.
5 
6  Use of this software is subject to the terms of the Autodesk license agreement
7  provided at the time of installation or download, or which otherwise accompanies
8  this software in either electronic or hard copy form.
9 
10 ****************************************************************************************/
11 
13 #ifndef _FBXSDK_SCENE_GEOMETRY_LAYER_H_
14 #define _FBXSDK_SCENE_GEOMETRY_LAYER_H_
15 
16 #include <fbxsdk/fbxsdk_def.h>
17 
19 #include <fbxsdk/core/fbxstream.h>
22 
23 #include <fbxsdk/fbxsdk_nsbegin.h>
24 
26 class FbxLayerContainer;
27 
39 {
40 public:
75  enum EType
76  {
78 
79  //Non-Texture layer element types
80  //Note: Make sure to update static index below if you change this enum!
86  eUV,
94 
95  //Texture layer element types
96  //Note: Make sure to update static index below if you change this enum!
114 
115  eTypeCount
116  };
117 
118  const static int sTypeTextureStartIndex = int(eTextureDiffuse);
119  const static int sTypeTextureEndIndex = int(eTypeCount) - 1;
120  const static int sTypeTextureCount = sTypeTextureEndIndex - sTypeTextureStartIndex + 1;
121  const static int sTypeNonTextureStartIndex = int(eNormal);
122  const static int sTypeNonTextureEndIndex = int(eVisibility);
123  const static int sTypeNonTextureCount = sTypeNonTextureEndIndex - sTypeNonTextureStartIndex + 1;
124  static const char* const sTextureNames[];
125  static const char* const sTextureUVNames[];
126  static const char* const sNonTextureNames[];
127  static const FbxDataType sTextureDataTypes[];
128  static const char* const sTextureChannelNames[];
129 
141  {
147  eAllSame
148  };
149 
164  {
167  eIndexToDirect
168  };
169 
170 
174  void SetMappingMode(EMappingMode pMappingMode) { mMappingMode = pMappingMode; }
175 
179  void SetReferenceMode(EReferenceMode pReferenceMode) { mReferenceMode = pReferenceMode; }
180 
184  EMappingMode GetMappingMode() const { return mMappingMode; }
185 
189  EReferenceMode GetReferenceMode() const { return mReferenceMode; }
190 
194  void SetName(const char* pName) { mName = FbxString(pName); }
195 
199  const char* GetName() const { return ((FbxLayerElement*)this)->mName.Buffer(); }
200 
205  bool operator==(const FbxLayerElement& pOther) const
206  {
207  return (mName == pOther.mName) &&
208  (mMappingMode == pOther.mMappingMode) &&
209  (mReferenceMode == pOther.mReferenceMode);
210  }
211 
217  {
218  mMappingMode = pOther.mMappingMode;
219  mReferenceMode = pOther.mReferenceMode;
220  // name, type and owner should not be copied because they are
221  // initialized when this object is created
222  return *this;
223  }
224 
226  void Destroy();
227 
229  virtual bool Clear()
230  {
231  return true;
232  }
233 
234 /*****************************************************************************************************************************
235 ** WARNING! Anything beyond these lines is for internal use, may not be documented and is subject to change without notice! **
236 *****************************************************************************************************************************/
237 #ifndef DOXYGEN_SHOULD_SKIP_THIS
238  void SetType(const FbxDataType* pType) { mType = pType; }
239  const FbxLayerContainer* GetOwner() const { return mOwner; }
240 
241  // Reference count added in case of shared objects or corrupted files that uses the same object.
242  // This will prevent the deletion of an object that is stil used.
243  void IncRefCount() { mRefCount++; }
244  int DecRefCount() { mRefCount--; if (mRefCount < 0) { mRefCount = 0; } return mRefCount; }
245 
246 protected:
247  FbxLayerElement()
248  : mMappingMode(eNone)
249  , mReferenceMode(eDirect)
250  , mName("")
251  , mOwner(NULL)
252  , mRefCount(0)
253  {
254  }
255 
256  virtual ~FbxLayerElement()
257  {
258  }
259 
260  EMappingMode mMappingMode;
261  EReferenceMode mReferenceMode;
262 
263  FbxString mName;
264  const FbxDataType* mType;
265  FbxLayerContainer* mOwner;
266  int mRefCount;
267 
268  void Destruct() { if (DecRefCount() == 0) { FbxDelete(this); } }
269  virtual void SetOwner(FbxLayerContainer* pOwner, int pInstance = 0);
270 
272 
273 public:
274  virtual int MemorySize() const { return 0; }
275  virtual bool ContentWriteTo(FbxStream& pStream) const;
276  virtual bool ContentReadFrom(const FbxStream& pStream);
277 
278  friend class FbxLayerContainer;
279 #endif /* !DOXYGEN_SHOULD_SKIP_THIS *****************************************************************************************/
280 };
281 
288 {
289 public:
303  {
312  eDirectLockExist
313  };
314 };
315 
317 {
320 };
321 
322 //Special conversion types, we do not want them to resolve to undefined.
323 typedef FbxHandle* FbxRefPtr;
327 
328 inline EFbxType FbxTypeOf(const FbxRefPtr&){ return eFbxReference; }
329 inline EFbxType FbxTypeOf(const FbxLayerElementArrayPtr&){ return eFbxReference; }
330 inline EFbxType FbxTypeOf(const FbxSurfaceMaterialPtr&){ return eFbxReference; }
331 inline EFbxType FbxTypeOf(const FbxTexturePtr&){ return eFbxReference; }
332 
339 {
340 public:
345 
349  FbxLayerElementArray(EFbxType pDataType);
350 
352  virtual ~FbxLayerElementArray();
353 
355 
360 
362  inline void ClearStatus() { mStatus = LockAccessStatus::eSuccess; }
363 
365  inline LockAccessStatus::ELockAccessStatus GetStatus() const { return mStatus; }
367 
372 
376  inline bool IsWriteLocked() const { return mWriteLock; };
377 
381  inline int GetReadLockCount() const { return mReadLockCount; }
383 
387  bool IsInUse() const;
388 
392  int ReadLock() const;
393 
397  int ReadUnlock() const;
398 
403  bool WriteLock() const;
404 
407  void WriteUnlock() const;
408 
413  bool ReadWriteLock() const;
414 
417  void ReadWriteUnlock() const;
418 
419 
426  {
427  eReadLock = 1,
428  eWriteLock = 2,
429  eReadWriteLock = 3
430  };
431 
444  virtual void* GetLocked(ELockMode pLockMode, EFbxType pDataType);
445 
457  void* GetLocked(ELockMode pLockMode=eReadWriteLock) { return GetLocked(pLockMode, mDataType); }
458 
470  template <class T> inline T* GetLocked(T*, ELockMode pLockMode=eReadWriteLock) {T v; return (T*)GetLocked(pLockMode, FbxTypeOf(v)); }
471 
482  virtual void Release(void** pDataPtr, EFbxType pDataType);
483 
493  void Release(void** pDataPtr) { Release(pDataPtr, mDataType); }
494 
505  template <class T> inline void Release(T** pDataPtr, T* dummy)
506  {
507  T*** voidPtr = &pDataPtr;
508  Release((void**)*voidPtr, FbxTypeOf(*dummy));
509  }
510 
513  virtual size_t GetStride() const;
514 
519 
521  int GetCount() const;
522 
528  bool SetCount(int pCount, EFbxMemoryClearMode pInitializeMode = eClearToZero);
529 
531  void Clear();
532 
537  bool Resize(int pItemCount, EFbxMemoryClearMode pInitializeMode = eClearToZero);
538 
543  bool AddMultiple(int pItemCount, EFbxMemoryClearMode pInitializeMode = eClearToZero);
544 
550  int Add(const void* pItem, EFbxType pValueType);
551 
559  int InsertAt(int pIndex, const void* pItem, EFbxType pValueType);
560 
567  void SetAt(int pIndex, const void* pItem, EFbxType pValueType);
568 
574  void SetLast(const void* pItem, EFbxType pValueType);
575 
582  void RemoveAt(int pIndex, void** pItem, EFbxType pValueType);
583 
589  void RemoveLast(void** pItem, EFbxType pValueType);
590 
596  bool RemoveIt(void** pItem, EFbxType pValueType);
597 
605  bool GetAt(int pIndex, void** pItem, EFbxType pValueType) const;
606 
612  bool GetFirst(void** pItem, EFbxType pValueType) const;
613 
619  bool GetLast(void** pItem, EFbxType pValueType) const;
620 
627  int Find(const void* pItem, EFbxType pValueType) const;
628 
636  int FindAfter(int pAfterIndex, const void* pItem, EFbxType pValueType) const;
637 
645  int FindBefore(int pBeforeIndex, const void* pItem, EFbxType pValueType) const;
646 
651  bool IsEqual(const FbxLayerElementArray& pArray) const;
652 
657  template <class T> inline int Add(T const& pItem) { return Add((const void*)&pItem, FbxTypeOf(pItem)); }
658 
665  template <class T> inline int InsertAt(int pIndex, T const& pItem) { return InsertAt(pIndex, (const void*)&pItem, FbxTypeOf(pItem)); }
666 
672  template <class T> inline void SetAt(int pIndex, T const& pItem) { SetAt(pIndex, (const void*)&pItem, FbxTypeOf(pItem)); }
673 
678  template <class T> inline void SetLast(T const& pItem) { SetLast((const void*)&pItem, FbxTypeOf(pItem)); }
679 
685  template <class T> inline void RemoveAt(int pIndex, T* pItem)
686  {
687  T** voidPtr = &pItem;
688  RemoveAt(pIndex, (void**)voidPtr, FbxTypeOf(*pItem));
689  }
690 
695  template <class T> inline void RemoveLast(T* pItem)
696  {
697  T** voidPtr = &pItem;
698  RemoveLast((void**)voidPtr, FbxTypeOf(*pItem));
699  }
700 
705  template <class T> inline bool RemoveIt(T* pItem)
706  {
707  T** voidPtr = &pItem;
708  return RemoveIt((void**)voidPtr, FbxTypeOf(*pItem));
709  }
710 
717  template <class T> inline bool GetAt(int pIndex, T* pItem) const
718  {
719  T** voidPtr = &pItem;
720  return GetAt(pIndex, (void**)voidPtr, FbxTypeOf(*pItem));
721  }
722 
727  template <class T> inline bool GetFirst(T* pItem) const
728  {
729  T** voidPtr = &pItem;
730  return GetFirst((void**)voidPtr, FbxTypeOf(*pItem));
731  }
732 
737  template <class T> inline bool GetLast(T* pItem) const
738  {
739  T** voidPtr = &pItem;
740  return GetLast((void**)voidPtr, FbxTypeOf(*pItem));
741  }
742 
748  template <class T> inline int Find(T const& pItem) const { return Find((const void*)&pItem, FbxTypeOf(pItem)); }
749 
756  template <class T> inline int FindAfter(int pAfterIndex, T const& pItem) const { return FindAfter(pAfterIndex, (const void*)&pItem, FbxTypeOf(pItem)); }
757 
764  template <class T> inline int FindBefore(int pBeforeIndex, T const& pItem) const { return FindBefore(pBeforeIndex, (const void*)&pItem, FbxTypeOf(pItem)); }
765 
766 
770  template<typename T> inline void CopyTo(FbxArray<T>& pDst)
771  {
772  T src;
773  T* srcPtr = &src;
774 
775  pDst.Clear();
776  if (mDataType != FbxTypeOf(src))
777  {
779  return;
780  }
781 
782  pDst.Resize(GetCount());
783  for (int i = 0; i < GetCount(); i++)
784  {
785  if (GetAt(i, (void**)&srcPtr, mDataType))
786  {
787  pDst.SetAt(i, src);
788  }
789  }
790  SetStatus(LockAccessStatus::eSuccess);
791  }
793 
794 protected:
795  void* GetDataPtr();
796  void* GetReference(int pIndex, EFbxType pValueType);
797  void GetReferenceTo(int pIndex, void** pRef, EFbxType pValueType);
798 
800  {
801  const_cast<FbxLayerElementArray*>(this)->mStatus = pVal;
802  }
803 
804  void SetImplementation(void* pImplementation);
805  inline void* GetImplementation() { return mImplementation; }
806  virtual void ConvertDataType(EFbxType pDataType, void** pDataPtr, size_t* pStride);
807 
809 
810 private:
812 
813  int mReadLockCount;
814  bool mWriteLock;
815  void* mImplementation;
816  size_t mStride;
817  int mDirectLockOn;
818  bool mDirectAccessOn;
819 
820  FbxArray<void*> mConvertedData;
821 
822 };
823 
827 template <typename T>
829 {
834  {
835  mLockedData = mArray.GetLocked((T*)NULL, FbxLayerElementArray::eReadLock);
836  }
837 
842  {
843  if( mLockedData )
844  {
845  mArray.Release((void **) &mLockedData);
846  }
847  }
848 
852  const T* GetData() const
853  {
854  return mLockedData;
855  }
856 
857 private:
858  FbxLayerElementArray& mArray;
859  T* mLockedData;
860 };
861 
863 
868 template <class T> class FbxLayerElementArrayTemplate : public FbxLayerElementArray
869 {
870 public:
871 
876  FbxLayerElementArray(pDataType)
877  {
878  }
879 
884  inline int Add( T const &pItem ) { return FbxLayerElementArray::Add(pItem); }
885 
891  inline int InsertAt(int pIndex, T const &pItem) { return FbxLayerElementArray::InsertAt(pIndex, pItem); }
892 
897  inline void SetAt(int pIndex, T const &pItem) { FbxLayerElementArray::SetAt(pIndex, pItem); }
898 
902  inline void SetLast( T const &pItem) { FbxLayerElementArray::SetLast(pItem); }
903 
908  inline T RemoveAt(int pIndex) { T lValue; FbxLayerElementArray::RemoveAt(pIndex, &lValue); return lValue; }
909 
913  inline T RemoveLast() { T lValue; FbxLayerElementArray::RemoveLast(&lValue); return lValue; }
914 
919  inline bool RemoveIt(T const &pItem) { return FbxLayerElementArray::RemoveIt(&pItem); }
920 
926  inline T GetAt(int pIndex) const { T lValue; FbxLayerElementArray::GetAt(pIndex, &lValue); return lValue; }
927 
931  inline T GetFirst() const { T lValue; FbxLayerElementArray::GetFirst(&lValue); return lValue; }
932 
936  inline T GetLast() const { T lValue; FbxLayerElementArray::GetLast(&lValue); return lValue; }
937 
943  inline int Find(T const &pItem) { return FbxLayerElementArray::Find(pItem); }
944 
951  inline int FindAfter(int pAfterIndex, T const &pItem) { return FbxLayerElementArray::FindAfter(pAfterIndex, pItem); }
952 
959  inline int FindBefore(int pBeforeIndex, T const &pItem) { return FbxLayerElementArray::FindBefore(pBeforeIndex, pItem); }
960 
966  T operator[](int pIndex) const { T lValue; FbxLayerElementArray::GetAt(pIndex, &lValue); return lValue; }
967 
972  {
974  if (ReadWriteLock())
975  {
976  SetCount(pArrayTemplate.GetCount(), eUninitialized);
977 
978  void* lSrc = const_cast<FbxArray<T>&>(pArrayTemplate).GetLocked(eReadLock);
979  void* lDst = GetLocked();
980  memcpy(lDst, lSrc, sizeof(T) * pArrayTemplate.GetCount());
981  const_cast<FbxLayerElementArrayTemplate<T>&>(pArrayTemplate).Release(&lSrc);
982  Release(&lDst);
983 
984  ReadWriteUnlock();
986  }
987  return *this;
988  }
989 
994  {
995  if ( this != &pArrayTemplate )
996  {
998  if (ReadWriteLock())
999  {
1000  SetCount(pArrayTemplate.GetCount(), eUninitialized);
1001 
1002  void* lSrc = const_cast<FbxLayerElementArrayTemplate<T>&>(pArrayTemplate).GetLocked(eReadLock);
1003  void* lDst = GetLocked();
1004  memcpy(lDst, lSrc, sizeof(T) * pArrayTemplate.GetCount());
1005  const_cast<FbxLayerElementArrayTemplate<T>&>(pArrayTemplate).Release(&lSrc);
1006  Release(&lDst);
1007 
1008  ReadWriteUnlock();
1010  }
1011  }
1012  return *this;
1013  }
1014 
1015 private:
1016  // This one is not the best thing to do, but at least I don't get deprecated calls inside this file.
1017  // Note that FbxLayerElementUserData is kind of a weird class in the first place anyway. So either
1018  // we clean it up, or we live with this piece of code ;-)
1020  T& AsReference(int pIndex) { T* v = (T*)FbxLayerElementArray::GetReference(pIndex, mDataType); return (v)?*v:dummy;}
1021 
1022  T dummy;
1023 };
1024 
1025 
1033 extern FBXSDK_DLL int RemapIndexArrayTo(FbxLayerElement* pLayerEl,
1034  FbxLayerElement::EMappingMode pNewMapping,
1035  FbxLayerElementArrayTemplate<int>* pIndexArray);
1036 
1037 
1042 template <class Type> class FbxLayerElementTemplate : public FbxLayerElement
1043 {
1044 public:
1045 
1051  {
1052  FBX_ASSERT(mReferenceMode == FbxLayerElement::eDirect || mReferenceMode == FbxLayerElement::eIndexToDirect);
1053  return *mDirectArray;
1054  }
1055 
1061  {
1062  FBX_ASSERT(mReferenceMode == FbxLayerElement::eDirect || mReferenceMode == FbxLayerElement::eIndexToDirect);
1063  return *mDirectArray;
1064  }
1065 
1071  {
1072  FBX_ASSERT(mReferenceMode == FbxLayerElement::eIndex || mReferenceMode == FbxLayerElement::eIndexToDirect);
1073  return *mIndexArray;
1074  }
1075 
1081  {
1082  FBX_ASSERT(mReferenceMode == FbxLayerElement::eIndex || mReferenceMode == FbxLayerElement::eIndexToDirect);
1083  return *mIndexArray;
1084  }
1085 
1090  bool Clear()
1091  {
1092  bool ret = true;
1093  mDirectArray->Clear();
1094  ret = (mDirectArray->GetStatus() == LockAccessStatus::eSuccess);
1095 
1096  mIndexArray->Clear();
1097  ret |= (mIndexArray->GetStatus() == LockAccessStatus::eSuccess);
1098 
1099  return ret;
1100  }
1101 
1102 public:
1103 
1108  bool operator==(const FbxLayerElementTemplate& pOther) const
1109  {
1110  bool ret = true;
1111 
1112  if (pOther.GetReferenceMode() == FbxLayerElement::eDirect ||
1114  {
1115  const FbxLayerElementArrayTemplate<Type>& directArray = pOther.GetDirectArray();
1116  if( directArray.GetCount() != mDirectArray->GetCount() ||
1117  !directArray.ReadLock() || !mDirectArray->ReadLock() )
1118  {
1119  ret = false;
1120  }
1121 
1122  if( ret && !mDirectArray->IsEqual(directArray) )
1123  ret = false;
1124 
1125  directArray.ReadUnlock();
1126  mDirectArray->ReadUnlock();
1127  }
1128 
1129  if (ret)
1130  {
1131  if (pOther.GetReferenceMode() == FbxLayerElement::eIndex ||
1133  {
1134  const FbxLayerElementArrayTemplate<int>& indexArray = pOther.GetIndexArray();
1135  if( indexArray.GetCount() != mIndexArray->GetCount() ||
1136  !indexArray.ReadLock() || !mIndexArray->ReadLock() )
1137  {
1138  ret = false;
1139  }
1140 
1141  if( ret && !mIndexArray->IsEqual(indexArray) )
1142  ret = false;
1143 
1144  indexArray.ReadUnlock();
1145  mIndexArray->ReadUnlock();
1146  }
1147  }
1148 
1149  if (ret == false)
1150  return false;
1151 
1152  return FbxLayerElement::operator==(pOther);
1153  }
1154 
1159  {
1160  FBX_ASSERT(mDirectArray != NULL);
1161  FBX_ASSERT(mIndexArray != NULL);
1162 
1163  if (pOther.GetReferenceMode() == FbxLayerElement::eDirect ||
1165  {
1166  const FbxLayerElementArrayTemplate<Type>& directArray = pOther.GetDirectArray();
1167  *mDirectArray = directArray;
1168  }
1169 
1170  if (pOther.GetReferenceMode() == FbxLayerElement::eIndex ||
1172  {
1173  const FbxLayerElementArrayTemplate<int>& indexArray = pOther.GetIndexArray();
1174  *mIndexArray = indexArray;
1175  }
1176 
1177  FbxLayerElement* myself = (FbxLayerElement*)this;
1178  FbxLayerElement* myOther = (FbxLayerElement*)&pOther;
1179  *myself = *myOther;
1180  return *this;
1181  }
1182 
1191  {
1192  return RemapIndexArrayTo(this, pNewMapping, mIndexArray);
1193  }
1194 
1195 /*****************************************************************************************************************************
1196 ** WARNING! Anything beyond these lines is for internal use, may not be documented and is subject to change without notice! **
1197 *****************************************************************************************************************************/
1198 #ifndef DOXYGEN_SHOULD_SKIP_THIS
1199 protected:
1201  {
1202  mDirectArray = NULL;
1203  mIndexArray = NULL;
1204  }
1205 
1207  {
1208  FbxDelete(mDirectArray);
1209  FbxDelete(mIndexArray);
1210  }
1211 
1212  virtual void AllocateArrays()
1213  {
1214  mDirectArray = FbxNew< FbxLayerElementArrayTemplate<Type> >(mType->GetType());
1215  mIndexArray = FbxNew< FbxLayerElementArrayTemplate<int> >(FbxIntDT.GetType());
1216  }
1217 
1218 public:
1219  virtual int MemorySize() const
1220  {
1221  int size = FbxLayerElement::MemorySize();
1222  size += (mDirectArray->GetCount()*sizeof(Type));
1223  size += (mIndexArray->GetCount()*sizeof(int));
1224  return size;
1225  }
1226 
1231  virtual bool ContentWriteTo(FbxStream& pStream) const
1232  {
1233  void* a;
1234  unsigned int v;
1235  size_t s;
1236  int count = 0;
1237 
1238  // direct array
1239  count = mDirectArray->GetCount();
1240  s = pStream.Write(&count, sizeof(int));
1241  if (s != sizeof(int)) return false;
1242  if (count > 0)
1243  {
1244  a = mDirectArray->GetLocked();
1245  FBX_ASSERT(a != NULL);
1246  v = count*sizeof(Type);
1247  s = pStream.Write(a, v);
1248  mDirectArray->Release(&a);
1249  if (s != v) return false;
1250  }
1251 
1252  // index array
1253  count = mIndexArray->GetCount();
1254  s = pStream.Write(&count, sizeof(int));
1255  if (s != sizeof(int)) return false;
1256  if (count > 0)
1257  {
1258  a = mIndexArray->GetLocked();
1259  FBX_ASSERT(a != NULL);
1260  v = count*sizeof(int);
1261  s = pStream.Write(a, v);
1262  mIndexArray->Release(&a);
1263  if (s != v) return false;
1264  }
1265 
1266  return FbxLayerElement::ContentWriteTo(pStream);
1267  }
1268 
1269  virtual bool ContentReadFrom(const FbxStream& pStream)
1270  {
1271  void* a;
1272  unsigned int v;
1273  size_t s;
1274  int count = 0;
1275 
1276  // direct array
1277  s = pStream.Read(&count, sizeof(int));
1278  if (s != sizeof(int)) return false;
1279  mDirectArray->Resize(count);
1280  if (count > 0)
1281  {
1282  a = mDirectArray->GetLocked();
1283  FBX_ASSERT(a != NULL);
1284  v = count*sizeof(Type);
1285  s = pStream.Read(a, v);
1286  mDirectArray->Release(&a);
1287  if (s != v) return false;
1288  }
1289 
1290  // index array
1291  s = pStream.Read(&count, sizeof(int));
1292  if (s != sizeof(int)) return false;
1293  mIndexArray->Resize(count);
1294  if (count > 0)
1295  {
1296  a = mIndexArray->GetLocked();
1297  FBX_ASSERT(a != NULL);
1298  v = count*sizeof(int);
1299  s = pStream.Read(a, v);
1300  mIndexArray->Release(&a);
1301  if (s != v) return false;
1302  }
1303  return FbxLayerElement::ContentReadFrom(pStream);
1304  }
1306 
1307  typedef Type ArrayElementType;
1308  typedef FbxLayerElementArrayTemplate<Type> DirectArrayType;
1309  typedef FbxLayerElementArrayTemplate<int> IndexArrayType;
1310 
1311  FbxLayerElementArrayTemplate<Type>* mDirectArray;
1312  FbxLayerElementArrayTemplate<int>* mIndexArray;
1313 #endif /* !DOXYGEN_SHOULD_SKIP_THIS *****************************************************************************************/
1314 };
1315 
1316 #define FBXSDK_LAYER_ELEMENT_CREATE_DECLARE(classDesc) \
1317  FBXSDK_FRIEND_NEW(); \
1318  static Fbx##classDesc* Create(FbxLayerContainer* pOwner, const char* pName);
1319 
1326 {
1327 public:
1328 
1332  FBXSDK_LAYER_ELEMENT_CREATE_DECLARE(LayerElementNormal);
1333 
1334 protected:
1337 };
1338 
1343 {
1344 public:
1345 
1349  FBXSDK_LAYER_ELEMENT_CREATE_DECLARE(LayerElementBinormal);
1350 
1351 protected:
1354 };
1355 
1360 {
1361 public:
1362 
1366  FBXSDK_LAYER_ELEMENT_CREATE_DECLARE(LayerElementTangent);
1367 
1368 protected:
1371 };
1372 
1417 {
1418 public:
1420 
1424  FBXSDK_LAYER_ELEMENT_CREATE_DECLARE(LayerElementMaterial);
1425 
1431  class LayerElementArrayProxy : public FbxLayerElementArrayTemplate<FbxSurfaceMaterial*>
1432  {
1433  public:
1435 
1437  void SetContainer( FbxLayerContainer* pContainer, int pInstance = 0);
1438  };
1439 
1440 /*****************************************************************************************************************************
1441 ** WARNING! Anything beyond these lines is for internal use, may not be documented and is subject to change without notice! **
1442 *****************************************************************************************************************************/
1443 #ifndef DOXYGEN_SHOULD_SKIP_THIS
1444  virtual void AllocateArrays();
1445  virtual void SetOwner( FbxLayerContainer* pOwner, int pInstance = 0);
1446  virtual void SetInstance( int pInstance ) { SetOwner( mOwner, pInstance ); }
1447 
1448 protected:
1451 
1452 private:
1454  {
1455  return ParentClass::GetDirectArray();
1456  }
1457 
1459  {
1460  return ParentClass::GetDirectArray();
1461  }
1462 
1463  friend class FbxLayerContainer;
1464 #endif /* !DOXYGEN_SHOULD_SKIP_THIS *****************************************************************************************/
1465 };
1466 
1473 {
1474 public:
1475 
1479  FBXSDK_LAYER_ELEMENT_CREATE_DECLARE(LayerElementPolygonGroup);
1480 
1481 protected:
1484 };
1485 
1501 {
1502 public:
1506  FBXSDK_LAYER_ELEMENT_CREATE_DECLARE(LayerElementUV);
1507 
1508 protected:
1510  ~FbxLayerElementUV();
1511 };
1512 
1517 {
1518 public:
1519 
1523  FBXSDK_LAYER_ELEMENT_CREATE_DECLARE(LayerElementVertexColor);
1524 
1525 protected:
1528 };
1529 
1530 template <class T> inline FbxLayerElementArrayTemplate<T>& FbxGetDirectArray(FbxLayerElementUserData *pLayerElement, int pIndex, bool* pStatus = NULL);
1531 template <class T> inline FbxLayerElementArrayTemplate<T> const& FbxGetDirectArray(FbxLayerElementUserData const *pLayerElement, int pIndex, bool* pStatus = NULL);
1532 template <class T> inline FbxLayerElementArrayTemplate<T>& FbxGetDirectArray(FbxLayerElementUserData *pLayerElement, const char* pName, bool* pStatus = NULL );
1533 template <class T> inline FbxLayerElementArrayTemplate<T> const& FbxGetDirectArray(FbxLayerElementUserData const *pLayerElement, const char* pName, bool* pStatus = NULL );
1534 
1541 {
1542 public:
1544 
1554  static FbxLayerElementUserData* Create(FbxLayerContainer* pOwner, const char* pName, int pId, FbxArray<FbxDataType>& pDataTypes, FbxArray<const char*>& pDataNames);
1555 
1561  static FbxLayerElementUserData* Create(FbxLayerContainer* pOwner, FbxLayerElementUserData const& pOther );
1562 
1569  {
1570  if( pIndex >= 0 || pIndex < GetDirectArray().GetCount() )
1571  {
1572  if (pStatus) *pStatus = true;
1573  return (FbxLayerElementArrayTemplate<void*>*)GetDirectArray().AsReference(pIndex);
1574  }
1575  else
1576  {
1577  if( pStatus ) *pStatus = false;
1578  FBX_ASSERT_NOW("Index out of bounds");
1580  }
1581  }
1582 
1588  const FbxLayerElementArrayTemplate<void*>* GetDirectArrayVoid( int pIndex, bool* pStatus = NULL) const
1589  {
1590  if( pIndex >= 0 || pIndex < GetDirectArray().GetCount() )
1591  {
1592  if (pStatus) *pStatus = true;
1593  return (FbxLayerElementArrayTemplate<void*>*)GetDirectArray().AsReference(pIndex);
1594  }
1595  else
1596  {
1597  if( pStatus ) *pStatus = false;
1598  FBX_ASSERT_NOW("Index out of bounds");
1600  }
1601  }
1602 
1603 
1609  FbxLayerElementArrayTemplate<void *>* GetDirectArrayVoid ( const char* pName, bool* pStatus = NULL )
1610  {
1611  FbxString lName( pName );
1612  for( int i = 0; i < mDataNames.GetCount(); ++i )
1613  {
1614  if( *mDataNames[i] == lName )
1615  return GetDirectArrayVoid(i, pStatus);
1616  }
1617 
1618  if (pStatus) *pStatus = false;
1620  }
1621 
1627  const FbxLayerElementArrayTemplate<void*>* GetDirectArrayVoid ( const char* pName, bool* pStatus = NULL ) const
1628  {
1629  FbxString lName( pName );
1630  for( int i = 0; i < mDataNames.GetCount(); ++i )
1631  {
1632  if( *mDataNames[i] == lName )
1633  return GetDirectArrayVoid(i, pStatus);
1634  }
1635 
1636  if (pStatus) *pStatus = false;
1638  }
1639 
1644  FbxDataType GetDataType( int pIndex ) const
1645  {
1646  if( pIndex < 0 || pIndex >= mDataTypes.GetCount() )
1647  return FbxUndefinedDT;
1648 
1649  return mDataTypes[pIndex];
1650  }
1651 
1656  FbxDataType GetDataType( const char* pName ) const
1657  {
1658  FbxString lName( pName );
1659 
1660  for( int i = 0; i < mDataNames.GetCount(); ++i )
1661  {
1662  if( *mDataNames[i] == lName )
1663  return mDataTypes[i];
1664  }
1665 
1666  return FbxUndefinedDT;
1667  }
1668 
1673  const char* GetDataName( int pIndex ) const
1674  {
1675  if( pIndex >= 0 && pIndex < mDataNames.GetCount() )
1676  return mDataNames[pIndex]->Buffer();
1677 
1678  return NULL;
1679  }
1680 
1684  void ResizeAllDirectArrays( int pSize )
1685  {
1686  for( int i = 0; i < GetDirectArray().GetCount(); ++i )
1687  {
1688  switch( mDataTypes[i].GetType() )
1689  {
1690  case eFbxBool: FbxGetDirectArray<bool>(this,i).Resize( pSize ) ; break;
1691  case eFbxInt: FbxGetDirectArray<int>(this,i).Resize( pSize ) ; break;
1692  case eFbxFloat: FbxGetDirectArray<float>(this,i).Resize( pSize ) ; break;
1693  case eFbxDouble: FbxGetDirectArray<double>(this,i).Resize( pSize ); break;
1694  //case eFbxDouble3: GetDirectArray< FbxDouble3 >(i).Resize( pSize ); break;
1695  //case eFbxDouble4: GetDirectArray< FbxDouble4 >(i).Resize( pSize ); break;
1696  //case eFbxDouble4x4: GetDirectArray< FbxDouble4x4>(i).Resize( pSize ); break;
1697  default:
1698  FBX_ASSERT_NOW("unknown type" ); break;
1699  }
1700  }
1701  }
1702 
1706  void RemoveFromAllDirectArrays( int pIndex )
1707  {
1708  for( int i = 0; i < GetDirectArray().GetCount(); ++i )
1709  {
1710  switch( mDataTypes[i].GetType() )
1711  {
1712  case eFbxBool: FbxGetDirectArray<bool>(this,i).RemoveAt( pIndex ) ; break;
1713  case eFbxInt: FbxGetDirectArray<int>(this,i).RemoveAt( pIndex ) ; break;
1714  case eFbxFloat: FbxGetDirectArray<float>(this,i).RemoveAt( pIndex ) ; break;
1715  case eFbxDouble: FbxGetDirectArray<double>(this,i).RemoveAt( pIndex ); break;
1716  //case eFbxDouble3: GetDirectArray< FbxDouble3 >(i).RemoveAt( pIndex ); break;
1717  //case eFbxDouble4: GetDirectArray< FbxDouble4 >(i).RemoveAt( pIndex ); break;
1718  //case eFbxDouble4x4: GetDirectArray< FbxDouble4x4>(i).RemoveAt( pIndex ); break;
1719  default:
1720  FBX_ASSERT_NOW("unknown type" ); break;
1721  }
1722  }
1723  }
1724 
1729  int GetArrayCount( int pIndex ) const
1730  {
1731  if( pIndex >= 0 && pIndex < GetDirectArray().GetCount() )
1732  {
1733  switch( mDataTypes[pIndex].GetType() )
1734  {
1735  case eFbxBool: return FbxGetDirectArray<bool>(this,pIndex).GetCount();
1736  case eFbxInt: return FbxGetDirectArray<int>(this,pIndex).GetCount();
1737  case eFbxFloat: return FbxGetDirectArray<float>(this,pIndex).GetCount();
1738  case eFbxDouble: return FbxGetDirectArray<double>(this,pIndex).GetCount();
1739  //case eFbxDouble3: return GetDirectArray< FbxDouble3 >(pIndex).GetCount();
1740  //case eFbxDouble4: return GetDirectArray< FbxDouble4 >(pIndex).GetCount();
1741  //case eFbxDouble4x4: return GetDirectArray< FbxDouble4x4>(pIndex).GetCount();
1742  default:
1743  FBX_ASSERT_NOW("Unknown type" ); break;
1744  }
1745  }
1746 
1747  return -1;
1748  }
1749 
1753  int GetId() const { return mId; }
1754 
1759  int GetDirectArrayCount() const { return GetDirectArray().GetCount(); }
1760 
1766  {
1767  if (this == &pOther)
1768  return *this;
1769 
1770  Clear();
1771 
1772  mId = pOther.mId;
1773  mDataTypes = pOther.mDataTypes;
1774  mDataNames.Resize(pOther.mDataNames.GetCount());
1775  for(int i = 0; i < pOther.mDataNames.GetCount(); ++i)
1776  mDataNames.SetAt(i, FbxNew< FbxString >( *pOther.mDataNames[i] ) );
1777 
1778  Init();
1779  for(int i = 0; i < pOther.GetDirectArrayCount(); ++i)
1780  {
1781  switch (mDataTypes[i].GetType())
1782  {
1783  case eFbxBool:
1784  FbxGetDirectArray<bool>(this, i) = FbxGetDirectArray<bool>(&pOther, i);
1785  break;
1786 
1787  case eFbxInt:
1788  FbxGetDirectArray<int>(this, i) = FbxGetDirectArray<int>(&pOther, i);
1789  break;
1790 
1791  case eFbxFloat:
1792  FbxGetDirectArray<float>(this, i) = FbxGetDirectArray<float>(&pOther, i);
1793  break;
1794 
1795  case eFbxDouble:
1796  FbxGetDirectArray<double>(this, i) = FbxGetDirectArray<double>(&pOther, i);
1797  break;
1798 
1799  default:
1800  FBX_ASSERT_NOW("Unknown type" );
1801  break;
1802  }
1803  }
1804 
1805  if ( ( mReferenceMode == FbxLayerElement::eIndex ||
1806  mReferenceMode == FbxLayerElement::eIndexToDirect) &&
1807  ( pOther.GetReferenceMode() == FbxLayerElement::eIndex ||
1809  {
1810  GetIndexArray() = pOther.GetIndexArray();
1811  }
1812 
1813  return *this;
1814  }
1815 
1819  bool Clear()
1820  {
1821  int i;
1822  const int lCount = GetDirectArray().GetCount();
1823  FbxLayerElementArray** directArray = NULL;
1824  directArray = GetDirectArray().GetLocked(directArray);
1825  for( i = 0; directArray != NULL && i < lCount; ++i )
1826  {
1827  if( directArray[i] )
1828  FbxDelete(directArray[i]);
1829  }
1830  FbxLayerElementArray*** ptr = &directArray;
1831  GetDirectArray().Release((void**)ptr);
1832  for( i = 0; i < mDataNames.GetCount(); ++i )
1833  {
1834  FBX_SAFE_DELETE(mDataNames[i]);
1835  }
1836  mDataNames.Clear();
1837  mDataTypes.Clear();
1838 
1840 
1841  return true;
1842  }
1843 
1848  virtual int MemorySize() const
1849  {
1851  size += sizeof(mId);
1852 
1853  for(int i = 0; i < mDataTypes.GetCount(); i++)
1854  {
1855  size += sizeof(mDataTypes[i]);
1856  }
1857  size += (mDataNames.GetCount() * sizeof(FbxString*));
1858 
1859  return size;
1860  }
1861 
1862 /*****************************************************************************************************************************
1863 ** WARNING! Anything beyond these lines is for internal use, may not be documented and is subject to change without notice! **
1864 *****************************************************************************************************************************/
1865 #ifndef DOXYGEN_SHOULD_SKIP_THIS
1866 protected:
1876  FbxLayerElementUserData( int pId, FbxArray<FbxDataType>& pDataTypes, FbxArray<const char*>& pDataNames )
1877  :
1878  mId( pId ),
1879  mDataTypes( pDataTypes )
1880  {
1881  FBX_ASSERT( pDataTypes.GetCount() == pDataNames.GetCount() );
1882  for( int i = 0; i < pDataNames.GetCount(); ++i )
1883  {
1884  mDataNames.Add( FbxNew< FbxString >( pDataNames[i] ) );
1885  }
1886  }
1887 
1891  FbxLayerElementUserData( FbxLayerElementUserData const& pOther ) : mId(pOther.mId), mDataTypes(pOther.mDataTypes)
1892  {
1893  for (int lIndex = 0; lIndex < pOther.mDataNames.GetCount(); ++lIndex)
1894  {
1895  mDataNames.Add(FbxNew<FbxString>(*(pOther.mDataNames[lIndex])));
1896  }
1897 
1898  SetType(&FbxLayerElementUserDataDT);
1899  AllocateArrays();
1900 
1901  for(int i = 0; i < pOther.GetDirectArrayCount(); ++i)
1902  {
1903  switch (mDataTypes[i].GetType())
1904  {
1905  case eFbxBool:
1906  FbxGetDirectArray<bool>(this, i) = FbxGetDirectArray<bool>(&pOther, i);
1907  break;
1908 
1909  case eFbxInt:
1910  FbxGetDirectArray<int>(this, i) = FbxGetDirectArray<int>(&pOther, i);
1911  break;
1912 
1913  case eFbxFloat:
1914  FbxGetDirectArray<float>(this, i) = FbxGetDirectArray<float>(&pOther, i);
1915  break;
1916 
1917  case eFbxDouble:
1918  FbxGetDirectArray<double>(this, i) = FbxGetDirectArray<double>(&pOther, i);
1919  break;
1920 
1921  default:
1922  FBX_ASSERT_NOW("Unknown type" );
1923  break;
1924  }
1925  }
1926 
1927  if ( ( mReferenceMode == FbxLayerElement::eIndex ||
1928  mReferenceMode == FbxLayerElement::eIndexToDirect) &&
1929  ( pOther.GetReferenceMode() == FbxLayerElement::eIndex ||
1931  {
1932  GetIndexArray() = pOther.GetIndexArray();
1933  }
1934  }
1935 
1938  {
1939  Clear();
1940  }
1941 
1943  virtual void AllocateArrays()
1944  {
1946  Init();
1947  }
1948 
1949 
1950 private:
1951 
1952  void Init()
1953  {
1954  int i;
1955  GetDirectArray().Resize( mDataTypes.GetCount() );
1956 
1957  // initialize arrays
1958  for( i = 0; i < mDataTypes.GetCount(); ++i )
1959  {
1960  FbxHandle** dst = NULL;
1961  dst = GetDirectArray().GetLocked(dst);
1962  if (dst)
1963  {
1964  switch( mDataTypes[i].GetType() )
1965  {
1966  case eFbxBool: dst[i] = (FbxHandle*)FbxNew< FbxLayerElementArrayTemplate<bool> >(mDataTypes[i].GetType()); break;
1967  case eFbxInt: dst[i] = (FbxHandle*)FbxNew< FbxLayerElementArrayTemplate<int> >(mDataTypes[i].GetType()); break;
1968  case eFbxFloat: dst[i] = (FbxHandle*)FbxNew< FbxLayerElementArrayTemplate<float> >(mDataTypes[i].GetType()); break;
1969  case eFbxDouble: dst[i] = (FbxHandle*)FbxNew< FbxLayerElementArrayTemplate<double> >(mDataTypes[i].GetType()); break;
1970  default:
1971  FBX_ASSERT_NOW("Trying to assign an unknown type" ); break;
1972  }
1973  FbxHandle*** ptr = &dst;
1974  GetDirectArray().Release((void**)ptr);
1975  }
1976  }
1977  }
1978 
1979  int mId;
1980  FbxArray<FbxDataType> mDataTypes;
1981  FbxArray<FbxString*> mDataNames;
1982 #endif /* !DOXYGEN_SHOULD_SKIP_THIS *****************************************************************************************/
1983 };
1984 
1992 template <class T>
1993 inline FbxLayerElementArrayTemplate<T>& FbxGetDirectArray( FbxLayerElementUserData *pLayerElement,int pIndex, bool* pStatus)
1994 {
1995  return *(FbxLayerElementArrayTemplate<T>*)pLayerElement->GetDirectArrayVoid(pIndex,pStatus);
1996 }
1997 
2005 template <class T>
2006 inline FbxLayerElementArrayTemplate<T> const& FbxGetDirectArray(FbxLayerElementUserData const *pLayerElement, int pIndex, bool* pStatus)
2007 {
2008  return *(const FbxLayerElementArrayTemplate<T>*)pLayerElement->GetDirectArrayVoid(pIndex,pStatus);
2009 }
2010 
2011 
2019 template <class T>
2020 inline FbxLayerElementArrayTemplate<T>& FbxGetDirectArray( FbxLayerElementUserData *pLayerElement,const char* pName, bool* pStatus )
2021 {
2022  return *(FbxLayerElementArrayTemplate<T>*)pLayerElement->GetDirectArrayVoid(pName,pStatus);
2023 }
2024 
2032 template <class T>
2033 inline FbxLayerElementArrayTemplate<T> const& FbxGetDirectArray(FbxLayerElementUserData const *pLayerElement, const char* pName, bool* pStatus )
2034 {
2035  return *(const FbxLayerElementArrayTemplate<T>*)pLayerElement->GetDirectArrayVoid(pName,pStatus);
2036 }
2037 
2038 
2046 {
2047 public:
2049 
2055  static FbxLayerElementSmoothing* Create(FbxLayerContainer* pOwner, const char* pName);
2056 
2062  {
2063  if( pMode != FbxLayerElement::eDirect )
2064  {
2065  FBX_ASSERT_NOW( "Smoothing layer elements must be direct mapped" );
2066  return;
2067  }
2068  }
2069 
2070 /*****************************************************************************************************************************
2071 ** WARNING! Anything beyond these lines is for internal use, may not be documented and is subject to change without notice! **
2072 *****************************************************************************************************************************/
2073 #ifndef DOXYGEN_SHOULD_SKIP_THIS
2074 protected:
2076  {
2077  mReferenceMode = FbxLayerElement::eDirect;
2078  }
2079 #endif /* !DOXYGEN_SHOULD_SKIP_THIS *****************************************************************************************/
2080 };
2081 
2086 {
2087 public:
2089 
2095  static FbxLayerElementCrease* Create(FbxLayerContainer* pOwner, const char* pName);
2096 
2102  {
2103  if( pMode != FbxLayerElement::eDirect )
2104  {
2105  FBX_ASSERT_NOW( "Crease layer elements must be direct mapped" );
2106  return;
2107  }
2108  }
2109 
2110 /*****************************************************************************************************************************
2111 ** WARNING! Anything beyond these lines is for internal use, may not be documented and is subject to change without notice! **
2112 *****************************************************************************************************************************/
2113 #ifndef DOXYGEN_SHOULD_SKIP_THIS
2114 protected:
2116  {
2117  mReferenceMode = FbxLayerElement::eDirect;
2118  }
2119 #endif /* !DOXYGEN_SHOULD_SKIP_THIS *****************************************************************************************/
2120 };
2121 
2126 {
2127 public:
2129 
2135  static FbxLayerElementHole* Create(FbxLayerContainer* pOwner, const char* pName);
2136 
2142  {
2143  if( pMode != FbxLayerElement::eDirect )
2144  {
2145  FBX_ASSERT_NOW( "hole layer elements must be direct mapped" );
2146  return;
2147  }
2148  }
2149 
2150 /*****************************************************************************************************************************
2151 ** WARNING! Anything beyond these lines is for internal use, may not be documented and is subject to change without notice! **
2152 *****************************************************************************************************************************/
2153 #ifndef DOXYGEN_SHOULD_SKIP_THIS
2154 protected:
2156  {
2157  mReferenceMode = FbxLayerElement::eDirect;
2158  }
2159 #endif /* !DOXYGEN_SHOULD_SKIP_THIS *****************************************************************************************/
2160 };
2161 
2165 {
2166 public:
2167 
2171  FBXSDK_LAYER_ELEMENT_CREATE_DECLARE(LayerElementVisibility);
2172 
2173 /*****************************************************************************************************************************
2174 ** WARNING! Anything beyond these lines is for internal use, may not be documented and is subject to change without notice! **
2175 *****************************************************************************************************************************/
2176 #ifndef DOXYGEN_SHOULD_SKIP_THIS
2177 protected:
2180 #endif /* !DOXYGEN_SHOULD_SKIP_THIS *****************************************************************************************/
2181 };
2182 
2202 {
2203 public:
2207  FBXSDK_LAYER_ELEMENT_CREATE_DECLARE(LayerElementTexture);
2208 
2244  {
2276  eBlendModeCount
2277  };
2278 
2282  void SetBlendMode(EBlendMode pBlendMode) { mBlendMode = pBlendMode; }
2283 
2288  void SetAlpha(double pAlpha)
2289  {
2290  if (pAlpha > 1.0)
2291  mAlpha = 1.0;
2292  else if (pAlpha < 0.0)
2293  mAlpha = 0.0;
2294  else
2295  mAlpha = pAlpha;
2296  }
2297 
2301  EBlendMode GetBlendMode() const { return mBlendMode; }
2302 
2306  double GetAlpha() const { return mAlpha; }
2307 
2308 /*****************************************************************************************************************************
2309 ** WARNING! Anything beyond these lines is for internal use, may not be documented and is subject to change without notice! **
2310 *****************************************************************************************************************************/
2311 #ifndef DOXYGEN_SHOULD_SKIP_THIS
2312  virtual int MemorySize() const
2313  {
2315  size += sizeof(mBlendMode);
2316  size += sizeof(mAlpha);
2317  return size;
2318  }
2319 
2320 protected:
2325  FbxLayerElementTexture() : mBlendMode(eTranslucent)
2326  {
2327  mReferenceMode = eIndexToDirect;
2328  mAlpha = 1.0;
2329  }
2330 
2331 private:
2332  EBlendMode mBlendMode;
2333  double mAlpha;
2334 #endif /* !DOXYGEN_SHOULD_SKIP_THIS *****************************************************************************************/
2335 };
2336 
2337 
2392 {
2393 
2394 public:
2396 
2401 
2406  FbxLayerElementNormal* GetNormals();
2407 
2412  const FbxLayerElementNormal* GetNormals() const;
2413 
2418  FbxLayerElementTangent* GetTangents();
2419 
2424  const FbxLayerElementTangent* GetTangents() const;
2425 
2430  FbxLayerElementBinormal* GetBinormals();
2431 
2436  const FbxLayerElementBinormal* GetBinormals() const;
2437 
2441  FbxLayerElementMaterial* GetMaterials();
2442 
2446  const FbxLayerElementMaterial* GetMaterials() const;
2447 
2451  FbxLayerElementPolygonGroup* GetPolygonGroups();
2452 
2456  const FbxLayerElementPolygonGroup* GetPolygonGroups() const;
2457 
2465 
2472  const FbxLayerElementUV* GetUVs(FbxLayerElement::EType pTypeIdentifier=FbxLayerElement::eTextureDiffuse) const;
2473 
2474 
2477  int GetUVSetCount() const;
2478 
2481  FbxArray<FbxLayerElement::EType> GetUVSetChannels() const;
2482 
2485  FbxArray<const FbxLayerElementUV*> GetUVSets() const;
2486 
2491  FbxLayerElementVertexColor* GetVertexColors();
2492 
2497  const FbxLayerElementVertexColor* GetVertexColors() const;
2498 
2503  FbxLayerElementSmoothing* GetSmoothing();
2504 
2509  const FbxLayerElementSmoothing* GetSmoothing() const;
2510 
2515  FbxLayerElementCrease* GetVertexCrease();
2516 
2521  const FbxLayerElementCrease* GetVertexCrease() const;
2522 
2527  FbxLayerElementCrease* GetEdgeCrease();
2528 
2533  const FbxLayerElementCrease* GetEdgeCrease() const;
2534 
2539  FbxLayerElementHole* GetHole();
2540 
2545  const FbxLayerElementHole* GetHole() const;
2546 
2550  FbxLayerElementUserData* GetUserData();
2551 
2555  const FbxLayerElementUserData* GetUserData() const;
2556 
2560  FbxLayerElementVisibility* GetVisibility();
2561 
2565  const FbxLayerElementVisibility* GetVisibility() const;
2566 
2571  FbxLayerElementTexture* GetTextures(FbxLayerElement::EType pType);
2572 
2577  const FbxLayerElementTexture* GetTextures(FbxLayerElement::EType pType) const;
2578 
2583  void SetTextures(FbxLayerElement::EType pType, FbxLayerElementTexture* pTextures);
2584 
2603  FbxLayerElement* GetLayerElementOfType(FbxLayerElement::EType pType, bool pIsUV=false);
2604 
2623  const FbxLayerElement* GetLayerElementOfType(FbxLayerElement::EType pType, bool pIsUV=false) const;
2624 
2629  void SetNormals(FbxLayerElementNormal* pNormals);
2630 
2635  void SetBinormals(FbxLayerElementBinormal* pBinormals);
2636 
2641  void SetTangents(FbxLayerElementTangent* pTangents);
2642 
2646  void SetMaterials(FbxLayerElementMaterial* pMaterials);
2647 
2651  void SetPolygonGroups(FbxLayerElementPolygonGroup* pPolygonGroups);
2652 
2660 
2665  void SetVertexColors (FbxLayerElementVertexColor* pVertexColors);
2666 
2671  void SetSmoothing (FbxLayerElementSmoothing* pSmoothing);
2672 
2677  void SetVertexCrease (FbxLayerElementCrease* pCrease);
2678 
2683  void SetEdgeCrease (FbxLayerElementCrease* pCrease);
2684 
2689  void SetHole (FbxLayerElementHole* pHole);
2690 
2694  void SetUserData (FbxLayerElementUserData* pUserData);
2695 
2699  void SetVisibility( FbxLayerElementVisibility* pVisibility );
2700 
2719  void SetLayerElementOfType(FbxLayerElement* pLayerElement, FbxLayerElement::EType pType, bool pIsUV=false);
2720 
2727  FbxLayerElement* CreateLayerElementOfType(FbxLayerElement::EType pType, bool pIsUV=false);
2728 
2732  void Clone(FbxLayer const& pSrcLayer);
2733 
2734 /*****************************************************************************************************************************
2735 ** WARNING! Anything beyond these lines is for internal use, may not be documented and is subject to change without notice! **
2736 *****************************************************************************************************************************/
2737 #ifndef DOXYGEN_SHOULD_SKIP_THIS
2738 protected:
2740  FbxLayer& operator=(FbxLayer const& pSrcLayer);
2742 private:
2743 
2744  FbxLayer(FbxLayerContainer& pOwner);
2745  virtual ~FbxLayer();
2746 
2747  void Clear();
2748 
2749  FbxLayerContainer& mOwner;
2750 
2754 
2755 
2756  friend class FbxLayerContainer;
2757 
2758 public:
2763  bool ContentWriteTo(FbxStream& pStream) const;
2764  bool ContentReadFrom(const FbxStream& pStream);
2766  virtual int MemoryUsage() const;
2767 #endif /* !DOXYGEN_SHOULD_SKIP_THIS *****************************************************************************************/
2768 };
2769 
2773 #define FBXSDK_FOR_EACH_TEXTURE(lLayerIndex) for((lLayerIndex)=0;(lLayerIndex)<FbxLayerElement::sTypeTextureCount;(lLayerIndex)++)
2774 
2778 #define FBXSDK_FOR_EACH_NON_TEXTURE(lLayerIndex) for((lLayerIndex)=0;(lLayerIndex)<FbxLayerElement::sTypeNonTextureCount;(lLayerIndex)++)
2779 
2783 #define FBXSDK_TEXTURE_INDEX(ElementType) (int(ElementType)-FbxLayerElement::sTypeTextureStartIndex)
2784 
2788 #define FBXSDK_TEXTURE_TYPE(TextureIndex) (FbxLayerElement::EType((TextureIndex)+FbxLayerElement::sTypeTextureStartIndex))
2789 
2793 #define FBXSDK_NON_TEXTURE_INDEX(ElementType) (int(ElementType)-FbxLayerElement::sTypeNonTextureStartIndex)
2794 
2798 #define FBXSDK_NON_TEXTURE_TYPE(Index) (FbxLayerElement::EType((Index)+FbxLayerElement::sTypeNonTextureStartIndex))
2799 
2825 
2826 #undef FBXSDK_LAYER_ELEMENT_CREATE_DECLARE
2827 
2828 #include <fbxsdk/fbxsdk_nsend.h>
2829 
2830 #endif /* _FBXSDK_SCENE_GEOMETRY_LAYER_H_ */
int RemapIndexArrayTo(FbxLayerElement *pLayerEl, FbxLayerElement::EMappingMode pNewMapping, FbxLayerElementArrayTemplate< int > *pIndexArray)
Remap the index array to a new EMappingMode.
int GetId() const
Queries the this layer element's ID.
Definition: fbxlayer.h:1753
FbxDataType FbxLayerElementUserDataDT
FbxLayerElementArrayTemplate< int > & GetIndexArray() const
Returns the index array of Layer Elements.
Definition: fbxlayer.h:1070
Layer element for mapping Tangents to a geometry.
Definition: fbxlayer.h:1359
bool RemoveIt(T const &pItem)
Removes one item from the data buffer.
Definition: fbxlayer.h:919
int GetReadLockCount() const
Retrieves the read lock count.
Definition: fbxlayer.h:381
FbxLayerElement & operator=(FbxLayerElement const &pOther)
Assignment operator.
Definition: fbxlayer.h:216
void * GetReference(int pIndex, EFbxType pValueType)
void ReadWriteUnlock() const
Releases the write lock on this array.
int GetArrayCount(int pIndex) const
Returns the direct array count for the attribute at pIndex.
Definition: fbxlayer.h:1729
FBX SDK environment definition.
void * GetImplementation()
Definition: fbxlayer.h:805
int FindAfter(int pAfterIndex, T const &pItem) const
Searches for an item after the specified index in the data buffer.
Definition: fbxlayer.h:756
void SetReferenceMode(EReferenceMode pReferenceMode)
Sets the Reference Mode.
Definition: fbxlayer.h:179
#define FBXSDK_FRIEND_NEW()
Definition: fbxnew.h:420
FbxLayer class provides a base for the layering mechanism.
Definition: fbxlayer.h:2391
Layer element for mapping materials (FbxSurfaceMaterial) to a geometry.
Definition: fbxlayer.h:1416
FbxLayerElementArrayTemplate< void * > * GetDirectArrayVoid(const char *pName, bool *pStatus=((void *) 0))
Returns the direct array with the specified attribute name.
Definition: fbxlayer.h:1609
FbxLayerElementArrayTemplate(EFbxType pDataType)
Constructor.
Definition: fbxlayer.h:875
void RemoveLast(void **pItem, EFbxType pValueType)
Removes the last item from the data buffer.
static const int sTypeTextureCount
The count of texture type layer elements.
Definition: fbxlayer.h:120
32 bit signed integer.
bool Clear()
Removes all elements from the direct and the index arrays.
Definition: fbxlayer.h:1090
const T * GetData() const
Definition: fbxlayer.h:852
bool IsWriteLocked() const
Returns whether write is locked.
Definition: fbxlayer.h:376
FbxLayerElementBinormal FbxGeometryElementBinormal
Definition: fbxlayer.h:2814
FbxLayerElementNormal FbxGeometryElementNormal
Definition: fbxlayer.h:2813
FbxLayerElementArrayTemplate provides data array manipulation of the data buffer for FbxLayerElement...
Definition: fbxlayer.h:868
const char * GetDataName(int pIndex) const
Returns the attribute name at the specified index.
Definition: fbxlayer.h:1673
EReferenceMode
Determines how the mapping information is stored in the array of coordinates.
Definition: fbxlayer.h:163
void SetReferenceMode(FbxLayerElement::EReferenceMode pMode)
Sets the Reference Mode.
Definition: fbxlayer.h:2101
Abstract class for implementing I/O operations through a stream of data.
Definition: fbxstream.h:26
Double width floating point value.
T RemoveAt(int pIndex)
Removes the specified item from the data buffer.
Definition: fbxlayer.h:908
EMappingMode GetMappingMode() const
Returns the Mapping Mode.
Definition: fbxlayer.h:184
#define NULL
Definition: fbxarch.h:213
int FindBefore(int pBeforeIndex, T const &pItem)
Searches for one item before the specified index in the data buffer.
Definition: fbxlayer.h:959
FbxLayerElementArrayTemplate< Type > & GetDirectArray() const
Returns the direct array of Layer Elements.
Definition: fbxlayer.h:1050
This class contains material settings.
Utility class to manipulate strings.
Definition: fbxstring.h:66
void RemoveAt(int pIndex, T *pItem)
Removes the specified item from the data buffer.
Definition: fbxlayer.h:685
FbxDataType FbxUndefinedDT
void SetLast(T const &pItem)
Sets the value of the last item.
Definition: fbxlayer.h:902
Layer element for mapping custom user data to a geometry.
Definition: fbxlayer.h:1540
Contains a collection of FbxLayer objects.
virtual size_t Write(const void *, FbxUInt64)=0
Writes a memory block.
int GetDirectArrayCount() const
Returns this layer element's direct array count.
Definition: fbxlayer.h:1759
Layer element for indicating if specified components are shown/hidden.
Definition: fbxlayer.h:2164
FBX SDK data type class.
Definition: fbxdatatypes.h:26
void SetAt(int pIndex, const void *pItem, EFbxType pValueType)
Sets the value for the specified item.
Layer element for mapping Vertex Colors to a geometry.
Definition: fbxlayer.h:1516
int RemapIndexTo(FbxLayerElement::EMappingMode pNewMapping)
Changes the Mapping mode to the new one and re-computes the index array.
Definition: fbxlayer.h:1190
int Find(const void *pItem, EFbxType pValueType) const
Searches for an item in the data buffer.
bool GetLast(T *pItem) const
Returns the last item's value.
Definition: fbxlayer.h:737
void SetAt(int pIndex, T const &pItem)
Sets the value of the specified item.
Definition: fbxlayer.h:897
void SetMappingMode(EMappingMode pMappingMode)
Sets the Mapping Mode.
Definition: fbxlayer.h:174
FbxLayerElementVertexColor FbxGeometryElementVertexColor
Definition: fbxlayer.h:2819
void SetName(const char *pName)
Sets the name of this object.
Definition: fbxlayer.h:194
Layer element for mapping UVs to a geometry.
Definition: fbxlayer.h:1500
void FbxDelete(T *p)
Deletion policy for pointer template classes that uses the FbxDelete() function.
Definition: fbxnew.h:341
Layer element for mapping Normals to a geometry.
Definition: fbxlayer.h:1325
int Find(T const &pItem)
Searches for an item in the data buffer.
Definition: fbxlayer.h:943
This class is the base class for textures, ie classes FbxFileTexture, FbxLayeredTexture and FbxProced...
Definition: fbxtexture.h:26
FbxLayerElementCrease FbxGeometryElementCrease
Definition: fbxlayer.h:2822
void SetReferenceMode(FbxLayerElement::EReferenceMode pMode)
Sets the Reference Mode.
Definition: fbxlayer.h:2061
void SetReferenceMode(FbxLayerElement::EReferenceMode pMode)
Sets the Reference Mode.
Definition: fbxlayer.h:2141
bool operator==(const FbxLayerElement &pOther) const
Equivalence operator.
Definition: fbxlayer.h:205
int ReadLock() const
Increments the number of read locks on this array.
int InsertAt(int pIndex, T const &pItem)
Inserts a new item at the specified position of the data buffer.
Definition: fbxlayer.h:665
bool RemoveIt(T *pItem)
Removes one item from the data buffer.
Definition: fbxlayer.h:705
ELockMode
Identifies the access mode to the data buffer.
Definition: fbxlayer.h:425
void SetLast(const void *pItem, EFbxType pValueType)
Sets the value of the last item.
const char * GetName() const
Returns the name of this object.
Definition: fbxlayer.h:199
T * FbxNew()
Definition: fbxnew.h:59
FbxLayerElementVisibility FbxGeometryElementVisibility
Definition: fbxlayer.h:2824
FbxSurfaceMaterial * FbxSurfaceMaterialPtr
Definition: fbxlayer.h:325
FbxLayerElementArrayTemplate< Type > & GetDirectArray()
Returns the direct array of Layer Elements.
Definition: fbxlayer.h:1060
FbxLayerElementTemplate< FbxSurfaceMaterial * > ParentClass
Definition: fbxlayer.h:1419
const FbxLayerElementArrayTemplate< void * > * GetDirectArrayVoid(const char *pName, bool *pStatus=((void *) 0)) const
Returns the direct array with the specified attribute name.
Definition: fbxlayer.h:1627
T GetAt(int pIndex) const
Returns the specified item's value.
Definition: fbxlayer.h:926
void Clear()
Reset the number of element to zero and free the memory allocated.
Definition: fbxarray.h:490
int InsertAt(int pIndex, T const &pItem)
Inserts a new item at the specified position of the data buffer.
Definition: fbxlayer.h:891
void SetAlpha(double pAlpha)
Sets the transparency level between multiple texture levels.
Definition: fbxlayer.h:2288
bool operator==(const FbxLayerElementTemplate &pOther) const
Equivalence operator.
Definition: fbxlayer.h:1108
FbxLayerElementArray & operator=(const FbxArray< T > &pArrayTemplate)
Assignment operator.
Definition: fbxlayer.h:971
FbxDataType GetDataType(const char *pName) const
Returns the specified attribute data type.
Definition: fbxlayer.h:1656
Boolean.
virtual size_t Read(void *, FbxUInt64) const =0
Read bytes from the stream and store them in the memory block.
bool GetFirst(T *pItem) const
Returns the first item's value.
Definition: fbxlayer.h:727
int FindBefore(int pBeforeIndex, T const &pItem) const
Searches for one item before the specified index in the data buffer.
Definition: fbxlayer.h:764
LockAccessStatus::ELockAccessStatus GetStatus() const
Retrieves the access state.
Definition: fbxlayer.h:365
FbxLayerElementMaterial FbxGeometryElementMaterial
Definition: fbxlayer.h:2816
T RemoveLast()
Removes the last item from the data buffer.
Definition: fbxlayer.h:913
FbxLayerElementTangent FbxGeometryElementTangent
Definition: fbxlayer.h:2815
FbxLayerElementTemplate & operator=(FbxLayerElementTemplate const &pOther)
Assignment operator.
Definition: fbxlayer.h:1158
FbxLayerElementArray is the base class for FbxLayerElementArrayTemplate, it provides lock handling an...
Definition: fbxlayer.h:338
EFbxType
Type identifier constants.
void SetAt(int pIndex, T const &pItem)
Sets the value of the specified item.
Definition: fbxlayer.h:672
This class complements the FbxLayerElement class.
Definition: fbxlayer.h:1042
bool RemoveIt(void **pItem, EFbxType pValueType)
Removes one item from the data buffer.
FbxTexture * FbxTexturePtr
Definition: fbxlayer.h:326
virtual bool Clear()
Clears all the data from this layer element.
Definition: fbxlayer.h:229
int GetCount() const
Returns the count of items in the data buffer.
EMappingMode
Determines how the element is mapped to a surface.
Definition: fbxlayer.h:140
#define FBXSDK_LAYER_ELEMENT_CREATE_DECLARE(classDesc)
Definition: fbxlayer.h:1316
Layer element for indicating hole of polygon of a geometry.
Definition: fbxlayer.h:2125
void ClearStatus()
Clears the access state and sets it to eSuccess.
Definition: fbxlayer.h:362
void SetAt(const int pIndex, const T &pElement)
Set the element at given position in the array.
Definition: fbxarray.h:263
int Add(T const &pItem)
Appends a new item to the end of the data buffer.
Definition: fbxlayer.h:657
int Find(T const &pItem) const
Searches for an item in the data buffer.
Definition: fbxlayer.h:748
FbxLayerElementUserData & operator=(FbxLayerElementUserData const &pOther)
Assignment operator which performs a deep copy.
Definition: fbxlayer.h:1765
EFbxType FbxTypeOf(const FbxRefPtr &)
Definition: fbxlayer.h:328
static const int sTypeNonTextureCount
The count of non-texture type layer elements.
Definition: fbxlayer.h:123
void SetLast(T const &pItem)
Sets the value of the last item.
Definition: fbxlayer.h:678
void RemoveAt(int pIndex, void **pItem, EFbxType pValueType)
Removes the specified item from the data buffer.
FbxLayerElementArrayReadLock(FbxLayerElementArray &pArray)
Definition: fbxlayer.h:833
int InsertAt(int pIndex, const void *pItem, EFbxType pValueType)
Inserts a new item at the specified position of the data buffer.
virtual bool ContentReadFrom(const FbxStream &pStream)
Reads the content of the object from the given stream.
FbxLayerElementArrayTemplate< FbxSurfaceMaterial * > ParentClass
Definition: fbxlayer.h:1434
EFbxType GetType() const
Retrieve this data type.
virtual void * GetLocked(ELockMode pLockMode, EFbxType pDataType)
Grants a locked access to the data buffer.
void Release(void **pDataPtr)
Unlock the data buffer.
Definition: fbxlayer.h:493
Layer element for indicating smoothness of components of a geometry.
Definition: fbxlayer.h:2045
FbxHandle * FbxRefPtr
Definition: fbxlayer.h:323
EFbxMemoryClearMode
Definition: fbxlayer.h:316
double GetAlpha() const
Returns the transparency level between multiple levels of textures.
Definition: fbxlayer.h:2306
Layer element for indicating crease of components of a geometry.
Definition: fbxlayer.h:2085
T GetLast() const
Returns the last item's value.
Definition: fbxlayer.h:936
FbxLayerElementUserData FbxGeometryElementUserData
Definition: fbxlayer.h:2820
virtual void Release(void **pDataPtr, EFbxType pDataType)
Unlock the data buffer.
FbxLayerElementSmoothing FbxGeometryElementSmoothing
Definition: fbxlayer.h:2821
EFbxType mDataType
Definition: fbxlayer.h:808
bool Resize(const int pSize, bool pPreserveCapacityIfPossible=false)
Inserts or erases elements at the end such that Size() becomes pSize, increasing capacity if needed...
Definition: fbxarray.h:412
void Release(T **pDataPtr, T *dummy)
Unlock the data buffer.
Definition: fbxlayer.h:505
void RemoveFromAllDirectArrays(int pIndex)
Removes a single element at pIndex from every direct array.
Definition: fbxlayer.h:1706
Layer element for mapping Textures to a geometry.
Definition: fbxlayer.h:2201
EType
Layer Element type identifier.
Definition: fbxlayer.h:75
bool ReadWriteLock() const
Locks this array for writing.
T operator[](int pIndex) const
Returns the specified item's value.
Definition: fbxlayer.h:966
int ReadUnlock() const
Releases a read lock on this array.
FbxLayerElementUV FbxGeometryElementUV
Definition: fbxlayer.h:2818
FbxLayerElementArray * FbxLayerElementArrayPtr
Definition: fbxlayer.h:324
bool Clear()
Removes all data from this layer element.
Definition: fbxlayer.h:1819
int FindAfter(int pAfterIndex, T const &pItem)
Searches for an item after the specified index in the data buffer.
Definition: fbxlayer.h:951
FbxLayerElementArrayTemplate< T > & FbxGetDirectArray(FbxLayerElementUserData *pLayerElement, int pIndex, bool *pStatus=((void *) 0))
Returns the direct array with the given attribute index.
Definition: fbxlayer.h:1993
int Add(T const &pItem)
Appends a new item to the end of the data buffer.
Definition: fbxlayer.h:884
#define FBX_SAFE_DELETE(p)
Definition: fbxsdk_def.h:53
void * GetLocked(ELockMode pLockMode=eReadWriteLock)
Grants a locked access to the data buffer.
Definition: fbxlayer.h:457
T * GetLocked(T *, ELockMode pLockMode=eReadWriteLock)
Grants a locked access to the data buffer.
Definition: fbxlayer.h:470
Reference to object or property.
void RemoveLast(T *pItem)
Removes the last item from the data buffer.
Definition: fbxlayer.h:695
bool SetCount(int pCount, EFbxMemoryClearMode pInitializeMode=eClearToZero)
Sets the count of items in the data buffer.
FbxLayerElementPolygonGroup FbxGeometryElementPolygonGroup
Definition: fbxlayer.h:2817
FbxDataType GetDataType(int pIndex) const
Returns the data type for the specified index.
Definition: fbxlayer.h:1644
#define FBXSDK_DLL
Definition: fbxarch.h:176
int FindAfter(int pAfterIndex, const void *pItem, EFbxType pValueType) const
Searches for an item after the specified index in the data buffer.
FbxDataType FbxIntDT
bool GetAt(int pIndex, void **pItem, EFbxType pValueType) const
Returns the specified item's value.
const FbxLayerElementArrayTemplate< void * > * GetDirectArrayVoid(int pIndex, bool *pStatus=((void *) 0)) const
Returns the direct array with the specified attribute index.
Definition: fbxlayer.h:1588
FbxLayerElementArrayTemplate< int > & GetIndexArray()
Returns the index array of Layer Elements.
Definition: fbxlayer.h:1080
EBlendMode GetBlendMode() const
Returns the way Textures blend between layers.
Definition: fbxlayer.h:2301
FbxLayerElementHole FbxGeometryElementHole
Definition: fbxlayer.h:2823
Layer element for grouping related polygons together.
Definition: fbxlayer.h:1472
FbxLayerElement FbxGeometryElement
Defines geometry element classes.
Definition: fbxlayer.h:2812
void CopyTo(FbxArray< T > &pDst)
Copies the items in the data buffer to an array.
Definition: fbxlayer.h:770
EReferenceMode GetReferenceMode() const
Returns the Reference Mode.
Definition: fbxlayer.h:189
void ResizeAllDirectArrays(int pSize)
Resizes all direct arrays to the specified size.
Definition: fbxlayer.h:1684
FbxLayerElementArrayTemplate< void * > * GetDirectArrayVoid(int pIndex, bool *pStatus=((void *) 0))
Returns the direct array with the specified attribute index.
Definition: fbxlayer.h:1568
FbxLayerElementArrayTemplate< T > & operator=(const FbxLayerElementArrayTemplate< T > &pArrayTemplate)
Assignment operator.
Definition: fbxlayer.h:993
EBlendMode
Lets you control how textures are combined when you apply multiple layers of texture to a surface...
Definition: fbxlayer.h:2243
void SetStatus(LockAccessStatus::ELockAccessStatus pVal) const
Definition: fbxlayer.h:799
bool GetFirst(void **pItem, EFbxType pValueType) const
Returns the first item's value.
bool GetAt(int pIndex, T *pItem) const
Returns the specified item's value.
Definition: fbxlayer.h:717
int Add(const void *pItem, EFbxType pValueType)
Appends a new item to the end of the data buffer.
bool GetLast(void **pItem, EFbxType pValueType) const
Returns the last item's value.
Base class for elements of layers (FbxLayer).
Definition: fbxlayer.h:38
virtual int MemorySize() const
Queries the amount of memory used by this object as well as its content.
Definition: fbxlayer.h:1848
virtual bool ContentWriteTo(FbxStream &pStream) const
Writes the content of the object to the given stream.
Class for array of basic elements such as pointers and basic types.
Definition: fbxarray.h:37
Floating point value.
int FindBefore(int pBeforeIndex, const void *pItem, EFbxType pValueType) const
Searches for an item before the specified index in the data buffer.
void SetBlendMode(EBlendMode pBlendMode)
Sets the way Textures blend between layers.
Definition: fbxlayer.h:2282
T GetFirst() const
Returns the first item's value.
Definition: fbxlayer.h:931
Layer element for mapping Binormals to a geometry.
Definition: fbxlayer.h:1342