00001 
00004 #ifndef FBXFILESDK_KFBXPLUGINS_KFBXGEOMETRYCONVERTER_H
00005 #define FBXFILESDK_KFBXPLUGINS_KFBXGEOMETRYCONVERTER_H
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 
00025 
00026 
00027 
00028 
00029 
00030 
00031 
00032 
00033 
00034 
00035 
00036 
00037 
00038 
00039 
00040 
00041 
00042 #include <fbxfilesdk/components/kbaselib/kaydaradef_h.h>
00043 #include <fbxfilesdk/components/kbaselib/kaydara.h>
00044 
00045 #include <fbxfilesdk/components/kbaselib/klib/karrayul.h>
00046 
00047 #include <fbxfilesdk/fbxfilesdk_nsbegin.h>
00048 
00049 class KFbxNode;
00050 class KFbxLayerContainer;
00051 class KFbxGeometryBase;
00052 class KFbxGeometry;
00053 class KFbxMesh;
00054 class KFbxPatch;
00055 class KFbxNurb;
00056 class KFbxCluster;
00057 class KFbxSdkManager;
00058 class KFBXSurfaceEvaluator;
00059 class KFbxWeightedMapping;
00060 class KFbxVector4;
00061 class KFbxNurbsSurface;
00062 class KFbxNurbsCurve;
00063 
00064 class KFbxShape;
00065 class KFbxScene;
00066 class KFbxVector2;
00067 class KString;
00072 class KFBX_DLL KFbxGeometryConverter
00073 {
00074 public:
00075     KFbxGeometryConverter(KFbxSdkManager* pManager);
00076     ~KFbxGeometryConverter();
00077 
00087     KFbxMesh* TriangulateMesh(KFbxMesh const* pMesh);
00088 
00094     KFbxMesh* TriangulatePatch(KFbxPatch const* pPatch);
00095 
00101     KFbxMesh* TriangulateNurb(KFbxNurb const* pNurb);
00102 
00109     bool TriangulateInPlace(KFbxNode* pNode);
00110 
00120     bool AddAlternateGeometry(
00121         KFbxNode*             pNode, 
00122         KFbxGeometry*         pSrcGeom, 
00123         KFbxGeometry*         pAltGeom,
00124         KFbxWeightedMapping* pSrcToAltWeightedMapping,
00125         bool                 pConvertDeformations
00126         );
00127 
00135     bool ConvertGeometryAnimation(
00136         KFbxNode*             pNode, 
00137         KFbxGeometry*         pSrcGeom, 
00138         KFbxGeometry*         pDstGeom
00139         );
00140 
00149     bool ComputeGeometryControlPointsWeightedMapping(
00150         KFbxGeometry*         pSrcGeom, 
00151         KFbxGeometry*         pDstGeom, 
00152         KFbxWeightedMapping* pSrcToDstWeightedMapping,
00153         bool                 pSwapUV = false
00154         );
00155 
00157 
00162 
00168     KFbxNurb* ConvertPatchToNurb(KFbxPatch *pPatch);
00169 
00175     bool ConvertPatchToNurbInPlace(KFbxNode* pNode);
00176 
00182     KFbxNurbsSurface* ConvertPatchToNurbsSurface(KFbxPatch *pPatch);
00183 
00189     bool ConvertPatchToNurbsSurfaceInPlace(KFbxNode* pNode);
00190 
00195     KFbxNurbsSurface* ConvertNurbToNurbsSurface( KFbxNurb* pNurb );
00196 
00201     KFbxNurb* ConvertNurbsSurfaceToNurb( KFbxNurbsSurface* pNurb );
00202 
00207     bool ConvertNurbToNurbsSurfaceInPlace(KFbxNode* pNode);
00208 
00213     bool ConvertNurbsSurfaceToNurbInPlace(KFbxNode* pNode);
00214 
00216 
00221 
00228     KFbxNurb* FlipNurb(KFbxNurb* pNurb, bool pSwapUV, bool pSwapClusters);
00229 
00236     KFbxNurbsSurface* FlipNurbsSurface(KFbxNurbsSurface* pNurb, bool pSwapUV, bool pSwapClusters);
00237 
00239 
00244 
00258     bool EmulateNormalsByPolygonVertex(KFbxMesh* pMesh);
00259 
00269     bool ComputeEdgeSmoothingFromNormals( KFbxMesh* pMesh ) const;
00270 
00280     bool ComputePolygonSmoothingFromEdgeSmoothing( KFbxMesh* pMesh, int pIndex=0 ) const;
00281 
00289     bool ComputeEdgeSmoothingFromPolygonSmoothing( KFbxMesh* pMesh, int pIndex=0 ) const;
00290 
00292 
00293 
00295     
00296     
00297     
00298     
00299     
00300     
00302 
00303 #ifndef DOXYGEN_SHOULD_SKIP_THIS
00304 
00305 public:
00306 
00314     bool AddTriangulatedMeshGeometry(KFbxNode* pNode, int pUVStepCoeff);
00315 
00320 
00334     bool SplitMeshPerMaterial(KFbxMesh* pMesh);
00335 
00337 
00342     bool SplitMeshesPerMaterial(KFbxScene* pScene);
00343 
00349     bool CreateAndCopyLayerElement(KFbxMesh *pNewMesh, KFbxMesh *pRefMesh);
00350 
00356     bool SetLayerElements(KFbxMesh *pNewMesh, KFbxMesh *pMesh, int pPolygonIndex, int pPolyPointIndex, int pLoopIndex, bool pIsSearched, bool pIsEndPolygon);
00357 
00364     KFbxMesh* TriangulateMesh2(KFbxMesh const* pMesh, bool& pStatus);
00365 
00378     int TriangulatePolygon(KFbxMesh *pNewMesh, KFbxVector4 *pControlPoints, int* pVertexIndices, int * pPolyVertexIndices, int pStartVertexIndex, KFbxVector4& pNormal, int pMaterialIndex, int pPolygonSize, int polygonIndex);
00379 
00380 
00381 protected:
00382 
00383     bool ComputePatchToMeshControlPointsWeightedMapping
00384         (
00385         KFbxPatch*             pSrcPatch, 
00386         KFbxMesh*             pDstMesh, 
00387         KFbxWeightedMapping* pMapping,
00388         bool                 pSwapUV = false
00389         );
00390     bool ComputeNurbToMeshControlPointsWeightedMapping
00391         (
00392         KFbxNurbsSurface*     pSrcNurb, 
00393         KFbxMesh*             pDstMesh, 
00394         KFbxWeightedMapping* pMapping,
00395         bool                 pRescaleUVs = false,
00396         bool                 pSwapUV = false
00397         );
00398 
00399     void InitializeWeightInControlPoints(KFbxGeometryBase* pGeometry);
00400     void InitializeWeightInNormals(KFbxLayerContainer* pLayerContainer);
00401     void TriangulateContinuousSurface
00402         ( 
00403         KFbxMesh* pMesh, 
00404         KFBXSurfaceEvaluator* pSurface, 
00405         kUInt pPointCountX, 
00406         kUInt pPointCountY, 
00407         bool ClockWise = false
00408         );
00409     void CheckForZeroWeightInShape(KFbxGeometry *pGeometry);
00410     KFbxMesh* CreateMeshFromParametricSurface(KFbxGeometry const* pGeometry);
00411     KFbxNurb* CreateNurbFromPatch(KFbxPatch* pPatch);
00412     KFbxNurbsSurface* CreateNurbsSurfaceFromPatch(KFbxPatch* pPatch);
00413 
00414     void ConvertShapes(KFbxGeometry const* pSource, 
00415         KFbxGeometry* pDestination, 
00416         KFBXSurfaceEvaluator* pEvaluator, 
00417         int pUCount, 
00418         int pVCount);
00419     void ConvertShapes(KFbxGeometry const* pSource,
00420         KFbxGeometry* pDestination, 
00421         KFbxWeightedMapping* pSourceToDestinationMapping);
00422     void ConvertClusters(KFbxGeometry const* pSource, 
00423         KFbxGeometry* pDestination, 
00424         KFbxWeightedMapping* pSourceToDestinationMapping);
00425     void ConvertClusters(KArrayTemplate<KFbxCluster*> const& pSourceClusters, 
00426         int pSourceControlPointsCount,
00427         KArrayTemplate<KFbxCluster*>& pDestinationClusters, 
00428         int pDestinationControlPointsCount,
00429         KFbxWeightedMapping* pSourceToDestinationMapping);
00430     void BuildClusterToSourceMapping(KArrayTemplate<KFbxCluster*> const& pSourceClusters, 
00431         KFbxWeightedMapping* pClusterToSourceMapping);
00432     void CheckClusterToSourceMapping(KFbxWeightedMapping* pClusterToSourceMapping);
00433     void ConvertCluster(int pSourceClusterIndex, 
00434         KFbxWeightedMapping* pClusterToSourceMapping,
00435         KFbxWeightedMapping* pSourceToDestinationMapping,
00436         KFbxCluster* pDestinationCluster);
00437     void DuplicateControlPoints(KArrayTemplate<KFbxVector4>& pControlPoints, 
00438         KArrayTemplate<int>& pPolygonVertices);
00439     void UpdatePolygon(KFbxMesh *pNewMesh, KFbxMesh const *pRefMesh, int pPolygonIndex, int* pNewIndex, int &pVerticeIndexMeshTriangulated, int &pPolygonIndexMeshTriangulated);
00440     void UpdatePolygon(KFbxMesh *pNewMesh, KFbxMesh const *pRefMesh, int pPolygonIndex, int* pNewIndex, int &pVerticeIndexMeshTriangulated, int &pPolygonIndexMeshTriangulated, bool pUseOriginal);
00441     void ResizePolygon(KFbxMesh *pNewMesh, int pNewCountVertices = 0, int pNewCountPolygons =0, bool pClearFlag = true);
00442 
00443     template <class T1, class T2>
00444     void ConvertNurbs( T1* pNewNurb, T2* pOldNurb );
00445 
00446     bool CopyAnimationCurves(KFbxNode* pNode, KFbxGeometry* pNewGeometry );
00447 
00448     bool FlipNurbsCurve( KFbxNurbsCurve* pCurve ) const;
00449 
00450     void FlipControlPoints( KFbxGeometryBase* pPoints, int pUCount, int pVCount ) const;
00451 
00452     bool ConvertMaterialReferenceMode( KFbxMesh* pMeshRef ) const;
00453 
00454     void RevertMaterialReferenceModeConversion( KFbxMesh* pMeshRef ) const;
00455 
00456     KFbxSdkManager* mManager;
00457 
00458 #endif // #ifndef DOXYGEN_SHOULD_SKIP_THIS 
00459 
00460 };
00461 
00462 #include <fbxfilesdk/fbxfilesdk_nsend.h>
00463 
00464 #endif // FBXFILESDK_KFBXPLUGINS_KFBXGEOMETRYCONVERTER_H
00465