- Main Page
- Classes
- Files
- Directories
- Examples

- File List
- File Members

# fbxmesh.h

Go to the documentation of this file.

    00001 /****************************************************************************************
    00002
    00003    Copyright (C) 2012 Autodesk, Inc.
    00004    All rights reserved.
    00005
    00006    Use of this software is subject to the terms of the Autodesk license agreement
    00007    provided at the time of installation or download, or which otherwise accompanies
    00008    this software in either electronic or hard copy form.
    00009
    00010 ****************************************************************************************/
    00011
    00013 #ifndef _FBXSDK_SCENE_GEOMETRY_MESH_H_
    00014 #define _FBXSDK_SCENE_GEOMETRY_MESH_H_
    00015
    00016 #include <fbxsdk/fbxsdk_def.h>
    00017
    00018 #include <fbxsdk/scene/geometry/fbxgeometry.h>
    00019
    00020 #include <fbxsdk/core/math/fbxvector4.h>
    00021 #include <fbxsdk/core/math/fbxvector2.h>
    00022
    00023 #include <fbxsdk/core/base/fbxarray.h>
    00024
    00025 #include <fbxsdk/fbxsdk_nsbegin.h>
    00026
    00027 class FbxMesh;
    00028 class FbxManager;
    00029
    00040 class FBXSDK_DLL FbxMesh : public FbxGeometry
    00041 {
    00042     FBXSDK_OBJECT_DECLARE(FbxMesh,FbxGeometry);
    00043
    00044 public:
    00048     virtual FbxNodeAttribute::EType GetAttributeType() const;
    00049
    00054
    00070     void BeginPolygon(int pMaterial = -1, int pTexture = -1, int pGroup = -1, bool pLegacy=true);
    00071
    00082     void BeginPolygonExt(int pMaterial, int* pTextures);
    00083
    00091     void AddPolygon(int pIndex, int pTextureUVIndex = -1);
    00092
    00094     void EndPolygon();
    00095
    00099     inline int GetPolygonCount() const { return mPolygons.GetCount(); }
    00100
    00106     inline int GetPolygonSize(int pPolygonIndex) const
    00107     {
    00108         return (pPolygonIndex >= 0 && pPolygonIndex < mPolygons.GetCount()) ? mPolygons[pPolygonIndex].mSize : -1;
    00109     }
    00110
    00119     int GetPolygonGroup(int pPolygonIndex) const;
    00120
    00128     inline void SetPolygonGroup(int pPolygonIndex, int pGroup) const
    00129     {
    00130         if (pPolygonIndex >= 0 && pPolygonIndex<mPolygons.GetCount())
    00131             mPolygons[pPolygonIndex].mGroup = pGroup;
    00132     }
    00133
    00142     inline int GetPolygonVertex(int pPolygonIndex, int pPositionInPolygon) const
    00143     {
    00144         return (pPolygonIndex >= 0 && pPolygonIndex < mPolygons.GetCount() && pPositionInPolygon >= 0 && pPositionInPolygon < mPolygons[pPolygonIndex].mSize) ?
    00145             mPolygonVertices[mPolygons[pPolygonIndex].mIndex + pPositionInPolygon] : -1;
    00146     }
    00147
    00155     bool GetPolygonVertexNormal(int pPolyIndex, int pVertexIndex, FbxVector4& pNormal) const;
    00156
    00161     bool GetPolygonVertexNormals(FbxArray<FbxVector4>& pNormals) const;
    00162
    00171     bool GetPolygonVertexUV(int pPolyIndex, int pVertexIndex, const char* pUVSetName, FbxVector2& pUV) const;
    00172
    00178     bool GetPolygonVertexUVs(const char* pUVSetName, FbxArray<FbxVector2>& pUVs) const;
    00179
    00187     int* GetPolygonVertices() const;
    00188
    00196     int GetPolygonVertexCount() const;
    00197
    00217     int GetPolygonVertexIndex( int pPolygonIndex ) const;
    00218
    00225     int RemovePolygon(int pPolygonIndex);
    00226
    00233     int RemoveDuplicatedEdges(FbxArray<int>& pEdgeIndexList);
    00234
    00236
    00246
    00253     void InitTextureUV(int pCount, FbxLayerElement::EType pTypeIdentifier=FbxLayerElement::eTextureDiffuse);
    00254
    00262     void AddTextureUV(FbxVector2 pUV, FbxLayerElement::EType pTypeIdentifier=FbxLayerElement::eTextureDiffuse);
    00263
    00267     int GetTextureUVCount(FbxLayerElement::EType pTypeIdentifier=FbxLayerElement::eTextureDiffuse);
    00268
    00272     int GetUVLayerCount() const;
    00273
    00284     FbxArray<FbxLayerElement::EType> GetAllChannelUV(int pLayer);
    00285
    00287
    00297
    00311     void InitMaterialIndices(FbxLayerElement::EMappingMode pMappingMode);
    00312
    00325     void InitTextureIndices(FbxLayerElement::EMappingMode pMappingMode, FbxLayerElement::EType pTextureType);
    00326
    00342     void InitTextureUVIndices(FbxLayerElement::EMappingMode pMappingMode, FbxLayerElement::EType pTypeIdentifier=FbxLayerElement::eTextureDiffuse);
    00343
    00354     int GetTextureUVIndex(int pPolygonIndex, int pPositionInPolygon, FbxLayerElement::EType pTypeIdentifier=FbxLayerElement::eTextureDiffuse);
    00355
    00356
    00366     void SetTextureUVIndex(int pPolygonIndex, int pPositionInPolygon, int pIndex, FbxLayerElement::EType pTypeIdentifier/*=FbxLayerElement::eTextureDiffuse*/);
    00367
    00369
    00374
    00378     void Reset();
    00379
    00385     void ComputeVertexNormals(bool pCW =  false);
    00386
    00391     bool CheckIfVertexNormalsCCW();
    00392
    00394     class DuplicateVertex
    00395     {
    00396     public:
    00398         DuplicateVertex() :
    00399           lVertexPolyIndex(0),
    00400           lNewVertexIndex(0),
    00401           lNormal(0,0,0)
    00402           {
    00403           };
    00404
    00405         int lVertexPolyIndex ;
    00406         int lNewVertexIndex;
    00407         FbxVector4 lNormal;
    00408         FbxVector2 lUV;
    00409
    00410         int lEdgeIndex;
    00411     };
    00412
    00414     class VertexNormalInfo
    00415     {
    00416     public:
    00418         VertexNormalInfo():
    00419           mTotalNormal(0,0,0),
    00420           mNumNormal(0)
    00421           {
    00422           };
    00423
    00424           FbxVector4 mTotalNormal;
    00425           int mNumNormal;
    00426     };
    00427
    00431     bool CheckSamePointTwice() const;
    00432
    00438     int RemoveBadPolygons();
    00439
    00441
    00446
    00452     bool SplitPoints(FbxLayerElement::EType pTypeIdentifier=FbxLayerElement::eTextureDiffuse);
    00453
    00458     bool BuildMergeList(FbxArray<int>& pMergeList, bool pExport=false);
    00459
    00463     void MergePointsForPolygonVerteNormals(FbxArray<int> &pMergeList);
    00464
    00466
    00467
    00472
    00476     void BuildMeshEdgeArray();
    00477
    00481     int GetMeshEdgeCount() const;
    00482
    00492     int GetMeshEdgeIndex( int pStartVertexIndex, int pEndVertexIndex, bool& pReversed, int pExistedEdgeCount = -1 );
    00493
    00499     int GetMeshEdgeIndexForPolygon( int pPolygon, int pPositionInPolygon );
    00500
    00507     void GetMeshEdgeVertices( int pEdgeIndex, int& pStartVertexIndex, int& pEndVertexIndex ) const;
    00508
    00513     void BeginGetMeshEdgeVertices();
    00514
    00519     void EndGetMeshEdgeVertices();
    00520
    00524     void SetMeshEdgeCount( int pEdgeCount );
    00525
    00530     inline void SetMeshEdge( int pEdgeIndex, int pValue )
    00531     {
    00532         if( pEdgeIndex >= 0 && pEdgeIndex < mEdgeArray.GetCount() ) mEdgeArray[pEdgeIndex] = pValue;
    00533     }
    00534
    00544     int AddMeshEdgeIndex( int pStartVertexIndex, int pEndVertexIndex, bool pCheckForDuplicates );
    00545
    00558     int SetMeshEdgeIndex( int pEdgeIndex, int pStartVertexIndex, int pEndVertexIndex, bool pCheckForDuplicates, int pExistedEdgeCount=-1 );
    00559
    00563     void BeginAddMeshEdgeIndex();
    00564
    00567     void EndAddMeshEdgeIndex();
    00568
    00569
    00576     int AddMeshEdgeIndexForPolygon( int pPolygonIndex, int pPositionInPolygon );
    00577
    00588     bool SetMeshEdgeIndex( int pEdgeIndex, int pPolygonIndex, int pPositionInPolygon );
    00589
    00590
    00592     struct ComponentMap
    00593     {
    00594         FbxArray<int> mData;
    00595         FbxArray<int> mOffsets;
    00596
    00597         int GetDataCount(int pIndex) { return mOffsets[pIndex + 1] - mOffsets[pIndex]; }
    00598         int GetData(int pIndex, int pSubIndex) { return mData[ mOffsets[pIndex] + pSubIndex ]; }
    00599         int GetComponentCount() { return mOffsets.GetCount() - 1; }
    00600     };
    00601
    00603     void ComputeComponentMaps( ComponentMap& pEdgeToPolyMap, ComponentMap& pPolyToEdgeMap );
    00604
    00608     bool IsTriangleMesh() const;
    00609
    00611
    00615     inline void ReservePolygonCount( int pCount ) { mPolygons.Reserve( pCount ); }
    00616
    00621     inline void ReservePolygonVertexCount( int pCount ) { mPolygonVertices.Reserve( pCount ); }
    00622
    00623     bool GetTextureUV(FbxLayerElementArrayTemplate<FbxVector2>** pLockableArray, FbxLayerElement::EType pTypeIdentifier=FbxLayerElement::eTextureDiffuse) const;
    00624     bool GetMaterialIndices(FbxLayerElementArrayTemplate<int>** pLockableArray) const;
    00625     bool GetTextureIndices(FbxLayerElementArrayTemplate<int>** pLockableArray, FbxLayerElement::EType pTextureType) const;
    00626
    00627
    00632
    00637     double GetEdgeCreaseInfo(int pEdgeIndex);
    00638
    00643     bool GetEdgeCreaseInfoArray(FbxLayerElementArrayTemplate<double>** pCreaseArray);
    00644
    00649     double GetVertexCreaseInfo(int pVertexIndex);
    00650
    00655     bool GetVertexCreaseInfoArray(FbxLayerElementArrayTemplate<double>** pCreaseArray);
    00656
    00662     bool SetEdgeCreaseInfo(int pEdgeIndex, double pWeight);
    00663
    00668     bool SetEdgeCreaseInfoArray(FbxArray<double>* pWeightArray);
    00669
    00675     bool SetVertexCreaseInfo(int pVertexIndex, double pWeight);
    00676
    00681     bool SetVertexCreaseInfoArray(FbxArray<double>* pWeightArray);
    00682
    00684
    00689
    00694     enum ESmoothness
    00695     {
    00696         eHull,
    00697         eRough,
    00698         eMedium,
    00699         eFine
    00700     };
    00701
    00705     enum EBoundaryRule
    00706     {
    00707         eLegacy,
    00708         eCreaseAll,
    00709         eCreaseEdge
    00710     };
    00711
    00716     FbxMesh::ESmoothness GetMeshSmoothness() const;
    00717
    00722     void SetMeshSmoothness(FbxMesh::ESmoothness pSmoothness);
    00723
    00727     int GetMeshPreviewDivisionLevels() const;
    00728
    00732     void SetMeshPreviewDivisionLevels(int pPreviewDivisionLevels);
    00733
    00738     int GetMeshRenderDivisionLevels() const;
    00739
    00743     void SetMeshRenderDivisionLevels(int pRenderDivisionLevels);
    00744
    00748     bool GetDisplaySubdivisions() const;
    00749
    00753     void SetDisplaySubdivisions(bool pDisplySubdivisions);
    00754
    00758     EBoundaryRule GetBoundaryRule() const;
    00759
    00764     void SetBoundaryRule(EBoundaryRule pBoundaryRule);
    00765
    00769     bool GetPreserveBorders() const;
    00770
    00775     void SetPreserveBorders(bool pPreserveBorders);
    00776
    00780     bool GetPreserveHardEdges() const;
    00781
    00786     void SetPreserveHardEdges(bool pPreserveHardEdges);
    00787
    00791     bool GetPropagateEdgeHardness() const;
    00792
    00797     void SetPropagateEdgeHardness(bool pPropagateEdgeHardness);
    00798
    00800
    00805
    00810     bool GetPolyHoleInfo(int pFaceIndex);
    00811
    00816     bool GetPolyHoleInfoArray(FbxLayerElementArrayTemplate<bool>** pHoleArray);
    00817
    00818
    00824     bool SetPolyHoleInfo(int pFaceIndex, bool pIsHole);
    00825
    00830     bool SetPolyHoleInfoArray(FbxArray<bool>* pHoleArray);
    00831
    00833
    00838 private:
    00839
    00840     bool GenerateTangentsData(FbxLayerElementUV* pUVSet, int pLayerIndex, bool pOverwrite = false);
    00841
    00842     bool ComputeTangents(FbxVector4* pPolyVetices, FbxVector2* pUvs, int pPolySize, FbxArray<FbxVector4> &pTan1, FbxArray<FbxVector4> &pTan2);
    00843
    00844 public:
    00845
    00855     bool GenerateTangentsData(FbxString pUVSetName = "", bool pOverwrite = false);
    00856
    00865     bool GenerateTangentsData(int pUVSetLayerIndex, bool pOverwrite = false);
    00866
    00867
    00875     bool GenerateTangentsDataForAllUVSets(bool pOverwrite = false);
    00876
    00878
    00880 //
    00881 //  WARNING!
    00882 //
    00883 //  Anything beyond these lines may not be documented accurately and is
    00884 //  subject to change without notice.
    00885 //
    00887 #ifndef DOXYGEN_SHOULD_SKIP_THIS
    00888
    00889     virtual FbxObject& Copy(const FbxObject& pObject);
    00890
    00891 protected:
    00892     void InitTextureIndices(FbxLayerElementTexture* pLayerElementTexture, FbxLayerElement::EMappingMode pMappingMode);
    00893     void RemoveTextureIndex(FbxLayerElementTexture* pLayerElementTextures, int pPolygonIndex, int pOffset);
    00894     void RemoveUVIndex(FbxLayerElementUV* pLayerElementUV, int pPolygonIndex, int pOffset);
    00895
    00902     bool GetBadPolyIndices(FbxArray<int>& pArrayBadPolyIndices, bool pCheckOne) const;
    00903
    00904     FbxMesh(FbxManager& pManager, char const* pName);
    00905
    00906     virtual void Destruct(bool pRecursive, bool pDependents);
    00907
    00908     struct SplitEdgeData
    00909     {
    00910         int mOriginalEdge;
    00911         bool mIsNew;
    00912     };
    00913
    00914     //smooth mesh preview
    00915     ESmoothness mSmoothness;
    00916     int mPreviewDivisionLevels;
    00917     int mRenderDivisionLevels;
    00918
    00919     bool mDisplaySubdivisions;
    00920     EBoundaryRule mBoundaryRule;
    00921     bool mPreserveBorders;
    00922     bool mPreserveHardEdges;
    00923     bool mPropagateEdgeHardness;
    00924
    00925 public:
    00926     //Please use GetPolygonVertexIndex and GetPolygonVertices to access these arrays.
    00927     //DO NOT MODIFY them directly, otherwise unexpected behavior will occur.
    00928     //These members are public only for application data copy performance reasons.
    00929     struct PolygonDef{ int mIndex; int mSize; int mGroup; };
    00930     FbxArray<PolygonDef> mPolygons;
    00931     FbxArray<int> mPolygonVertices;
    00932
    00933 protected:
    00934     struct PolygonIndexDef
    00935     {
    00936         int mPolygonIndex;
    00937         int mSubPolygonIndex;
    00938     };
    00939
    00940     struct V2PVMap
    00941     {
    00942         PolygonIndexDef* mV2PV;
    00943         int* mV2PVOffset;
    00944         int* mV2PVCount;
    00945         int* mPVEdge;
    00946         bool mValid;
    00947     };
    00948
    00949     V2PVMap mV2PVMap;
    00950
    00951     struct EdgeLookupDef
    00952     {
    00953         FbxArray<int> mPVFlags;
    00954         bool mValid;
    00955     };
    00956
    00957     EdgeLookupDef mPVEndFlags;
    00958
    00959 public:
    00960     FbxArray< int > mEdgeArray;
    00961
    00962 protected:
    00963     // Finds the polygon index for the given edge
    00964     int FindPolygonIndex( int pEdgeIndex );
    00965     static int PolygonIndexCompare( const void *p1, const void *p2 );
    00966
    00967     void PolySetTexture(FbxLayer* pLayer, int pTextureIndex,
    00968                         FbxLayerElement::EType pTextureType);
    00969     template<class T> bool GetPolygonVertexLayerElementValue(const FbxLayerElementTemplate<T>* pLayerElement,
    00970             int pPolyIndex, int pVertexIndex, T& pValue) const;
    00971
    00972     friend class FbxGeometryConverter;
    00973     friend class FbxWriter3ds;
    00974
    00975 #endif // #ifndef DOXYGEN_SHOULD_SKIP_THIS
    00976
    00977 };
    00978
    00979 #include <fbxsdk/fbxsdk_nsend.h>
    00980
    00981 #endif /* _FBXSDK_SCENE_GEOMETRY_MESH_H_ */