fbxgeometryconverter.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_UTILS_GEOMETRY_CONVERTER_H_
00014 #define _FBXSDK_UTILS_GEOMETRY_CONVERTER_H_
00015 
00016 #include <fbxsdk/fbxsdk_def.h>
00017 
00018 #include <fbxsdk/core/base/fbxarray.h>
00019 
00020 #include <fbxsdk/fbxsdk_nsbegin.h>
00021 
00022 class FbxManager;
00023 class FbxScene;
00024 class FbxNode;
00025 class FbxNodeAttribute;
00026 class FbxGeometryBase;
00027 class FbxMesh;
00028 class FbxPatch;
00029 class FbxNurbs;
00030 class FbxNurbsCurve;
00031 class FbxNurbsSurface;
00032 class FbxGeometry;
00033 class FbxCluster;
00034 class FbxWeightedMapping;
00035 class FbxLayerContainer;
00036 class FbxSurfaceEvaluator;
00037 class FbxVector4;
00038 
00045 class FBXSDK_DLL FbxGeometryConverter
00046 {
00047 public:
00051     FbxGeometryConverter(FbxManager* pManager);
00052 
00055     ~FbxGeometryConverter();
00056 
00066         FbxMesh* TriangulateMesh(FbxMesh const* pMesh);
00067 
00074         FbxMesh* TriangulatePatch(FbxPatch const* pPatch);
00075 
00082         FbxMesh* TriangulateNurbs(FbxNurbs const* pNurbs);
00083 
00090         bool TriangulateInPlace(FbxNode* pNode);
00091 
00103         bool AddAlternateGeometry(FbxNode* pNode, FbxGeometry* pSrcGeom, FbxGeometry* pAltGeom, FbxWeightedMapping* pSrcToAltWeightedMapping, bool pConvertDeformations);
00104 
00114         bool ConvertGeometryAnimation(FbxNode* pNode, FbxGeometry* pSrcGeom, FbxGeometry* pDstGeom);
00115 
00124         bool ComputeGeometryControlPointsWeightedMapping(FbxGeometry* pSrcGeom, FbxGeometry* pDstGeom, FbxWeightedMapping* pSrcToDstWeightedMapping, bool pSwapUV=false);
00126 
00136         FbxNurbs* ConvertPatchToNurbs(FbxPatch *pPatch);
00137 
00144         bool ConvertPatchToNurbsInPlace(FbxNode* pNode);
00145 
00151         FbxNurbsSurface* ConvertPatchToNurbsSurface(FbxPatch *pPatch);
00152 
00159         bool ConvertPatchToNurbsSurfaceInPlace(FbxNode* pNode);
00160 
00165         FbxNurbsSurface* ConvertNurbsToNurbsSurface( FbxNurbs* pNurbs );
00166 
00171         FbxNurbs* ConvertNurbsSurfaceToNurbs( FbxNurbsSurface* pNurbs );
00172 
00178         bool ConvertNurbsToNurbsSurfaceInPlace(FbxNode* pNode);
00179 
00185         bool ConvertNurbsSurfaceToNurbsInPlace(FbxNode* pNode);
00187 
00198         FbxNurbs* FlipNurbs(FbxNurbs* pNurbs, bool pSwapUV, bool pSwapClusters);
00199 
00206         FbxNurbsSurface* FlipNurbsSurface(FbxNurbsSurface* pNurbs, bool pSwapUV, bool pSwapClusters);
00208 
00226         bool EmulateNormalsByPolygonVertex(FbxMesh* pMesh);
00227 
00237         bool ComputeEdgeSmoothingFromNormals( FbxMesh* pMesh ) const;
00238 
00248         bool ComputePolygonSmoothingFromEdgeSmoothing( FbxMesh* pMesh, int pIndex=0 ) const;
00249 
00257         bool ComputeEdgeSmoothingFromPolygonSmoothing( FbxMesh* pMesh, int pIndex=0 ) const;
00259 
00261 //
00262 //  WARNING!
00263 //
00264 //    Anything beyond these lines may not be documented accurately and is 
00265 //     subject to change without notice.
00266 //
00268 #ifndef DOXYGEN_SHOULD_SKIP_THIS
00269 public:
00276     void ReplaceNodeAttribute(FbxNode* pNode, FbxNodeAttribute* pNewNodeAttr);
00277 
00286     bool AddTriangulatedMeshGeometry(FbxNode* pNode, int pUVStepCoeff);
00287 
00301     bool SplitMeshPerMaterial(FbxMesh* pMesh);
00302 
00307     bool SplitMeshesPerMaterial(FbxScene* pScene);
00308 
00314     bool CreateAndCopyLayerElement(FbxMesh *pNewMesh, FbxMesh *pRefMesh);
00315 
00321     bool SetLayerElements(FbxMesh *pNewMesh, FbxMesh *pMesh, int pPolygonIndex, int pPolyPointIndex, int pLoopIndex, bool pIsSearched, bool pIsEndPolygon);
00322 
00329     FbxMesh* TriangulateMeshAdvance(FbxMesh const* pMesh, bool& pStatus);
00330 
00352     FbxNode* MergeMeshes(FbxArray<FbxNode*>& pMeshNodes, const char* pNodeName, FbxScene* pScene);
00353 
00372     static void FbxTriangulation(int *Index, int pNumSide);
00373 protected:
00374     bool ComputePatchToMeshControlPointsWeightedMapping(FbxPatch* pSrcPatch, FbxMesh* pDstMesh, FbxWeightedMapping* pMapping, bool pSwapUV=false);
00375     bool ComputeNurbsToMeshControlPointsWeightedMapping(FbxNurbsSurface* pSrcNurbs, FbxMesh* pDstMesh, FbxWeightedMapping* pMapping, bool pRescaleUVs=false, bool pSwapUV=false);
00376 
00377     void InitializeWeightInControlPoints(FbxGeometryBase* pGeometry);
00378     void InitializeWeightInNormals(FbxLayerContainer* pLayerContainer);
00379     void TriangulateContinuousSurface(FbxMesh* pMesh, FbxSurfaceEvaluator* pSurface, FbxUInt pPointCountX, FbxUInt pPointCountY, bool ClockWise=false);
00380     void CheckForZeroWeightInShape(FbxGeometry *pGeometry);
00381     FbxMesh* CreateMeshFromParametricSurface(FbxGeometry const* pGeometry);
00382     FbxNurbs* CreateNurbsFromPatch(FbxPatch* pPatch);
00383     FbxNurbsSurface* CreateNurbsSurfaceFromPatch(FbxPatch* pPatch);
00384 
00385     void ConvertShapes(FbxGeometry const* pSource, FbxGeometry* pDestination, FbxSurfaceEvaluator* pEvaluator, int pUCount, int pVCount);
00386     void ConvertShapes(FbxGeometry const* pSource, FbxGeometry* pDestination, FbxWeightedMapping* pSourceToDestinationMapping);
00387     void ConvertClusters(FbxGeometry const* pSource, FbxGeometry* pDestination, FbxWeightedMapping* pSourceToDestinationMapping);
00388     void ConvertClusters(FbxArray<FbxCluster*> const& pSourceClusters, int pSourceControlPointsCount, FbxArray<FbxCluster*>& pDestinationClusters, int pDestinationControlPointsCount, FbxWeightedMapping* pSourceToDestinationMapping);
00389     void BuildClusterToSourceMapping(FbxArray<FbxCluster*> const& pSourceClusters, FbxWeightedMapping* pClusterToSourceMapping);
00390     void CheckClusterToSourceMapping(FbxWeightedMapping* pClusterToSourceMapping);
00391     void ConvertCluster(int pSourceClusterIndex, FbxWeightedMapping* pClusterToSourceMapping, FbxWeightedMapping* pSourceToDestinationMapping, FbxCluster* pDestinationCluster);
00392     void DuplicateControlPoints(FbxArray<FbxVector4>& pControlPoints, FbxArray<int>& pPolygonVertices);
00393     void UpdatePolygon(FbxMesh *pNewMesh, FbxMesh const *pRefMesh, int pPolygonIndex, int* pNewIndex, int &pVerticeIndexMeshTriangulated, int &pPolygonIndexMeshTriangulated);
00394     void UpdatePolygon(FbxMesh *pNewMesh, FbxMesh const *pRefMesh, int pPolygonIndex, int* pNewIndex, int &pVerticeIndexMeshTriangulated, int &pPolygonIndexMeshTriangulated, int pTriangleNum);
00395     void ResizePolygon(FbxMesh *pNewMesh, int pNewCountVertices = 0, int pNewCountPolygons =0, bool pClearFlag = true);
00396 
00397     template <class T1, class T2> void ConvertNurbs(T1* pNewNurbs, T2* pOldNurb);
00398 
00399     bool CopyAnimationCurves(FbxNode* pNode, FbxGeometry* pNewGeometry);
00400     bool FlipNurbsCurve(FbxNurbsCurve* pCurve) const;
00401     void FlipControlPoints(FbxGeometryBase* pPoints, int pUCount, int pVCount) const;
00402     bool ConvertMaterialReferenceMode(FbxMesh* pMeshRef) const;
00403     void RevertMaterialReferenceModeConversion(FbxMesh* pMeshRef) const;
00404 
00405     FbxManager* mManager;
00406 
00407 #endif // #ifndef DOXYGEN_SHOULD_SKIP_THIS 
00408 };
00409 
00410 #include <fbxsdk/fbxsdk_nsend.h>
00411 
00412 #endif /* _FBXSDK_UTILS_GEOMETRY_CONVERTER_H_ */