#include "../Common/Common.h"
#define SAMPLE_FILENAME "Normals.fbx"
void GetSmoothing(
FbxManager* pSdkManager, 
FbxNode* pNode, 
bool pCompute = 
false, 
bool pConvertToSmoothingGroup = 
false);
 
static bool gVerbose = true;
int main(int argc, char** argv)
{
    bool lResult;
    
    InitializeSdkObjects(lSdkManager, lScene);
    
    
    for( int i = 1, c = argc; i < c; ++i )
    {
        if( 
FbxString(argv[i]) == 
"-test" ) gVerbose = 
false;
 
        else if( lFilePath.IsEmpty() ) lFilePath = argv[i];
    }
    if( lFilePath.IsEmpty() ) lFilePath = SAMPLE_FILENAME;
    FBXSDK_printf("\n\nFile: %s\n\n", lFilePath.Buffer());
    lResult = LoadScene(lSdkManager, lScene, lFilePath.Buffer());
    if(lResult == false)
    {
        FBXSDK_printf("\n\nAn error occurred while loading the scene...");        
    }
    else 
    {
        if(!lScene)
        {
            FBX_ASSERT_NOW("null scene");
        }
        
        
        GetNormals(lRootNode);
        
        bool lComputeFromNormals = false;
        
        bool lConvertToSmoothingGroup = false;
        
        GetSmoothing(lSdkManager, lRootNode, lComputeFromNormals, lConvertToSmoothingGroup);
    }
    
    DestroySdkObjects(lSdkManager, lResult);
    return 0;
}
void GetSmoothing(
FbxManager* pSdkManager, 
FbxNode* pNode, 
bool pCompute, 
bool pConvertToSmoothingGroup)
 
{
    if(!pNode || !pSdkManager)
        return;
    
    if(lMesh)
    {
        
        FBXSDK_printf(
"current mesh node: %s\n", pNode->
GetName());
 
        
        
        
        
        
        
        
        
        
        
        
        
        if(pCompute)
        {
            lGeometryConverter.ComputeEdgeSmoothingFromNormals(lMesh);
            
            if(pConvertToSmoothingGroup)
                lGeometryConverter.ComputePolygonSmoothingFromEdgeSmoothing(lMesh);
        }
        
        
        
        
        
        if(lSmoothingElement)
        {
            
            
            {
                
                {
                    int lSmoothingIndex = 0;
                    
                    
                        lSmoothingIndex = lEdgeIndex;
                    
                        lSmoothingIndex = lSmoothingElement->
GetIndexArray().GetAt(lEdgeIndex);
 
                    
                    int lSmoothingFlag = lSmoothingElement->
GetDirectArray().GetAt(lSmoothingIndex);
 
                    if( gVerbose ) FBXSDK_printf("hard/soft value for edge[%d]: %d \n", lEdgeIndex, lSmoothingFlag);
                    
                    
                }
            }
            
            
            {
                
                for(
int lPolygonIndex = 0; lPolygonIndex < lMesh->
GetPolygonCount(); lPolygonIndex++)
 
                {
                    int lSmoothingIndex = 0;
                    
                        lSmoothingIndex = lPolygonIndex;
                    
                        lSmoothingIndex = lSmoothingElement->
GetIndexArray().GetAt(lPolygonIndex);
 
                    
                    int lSmoothingFlag = lSmoothingElement->
GetDirectArray().GetAt(lSmoothingIndex);
 
                    if( gVerbose ) FBXSDK_printf("smoothing group ID for polygon[%d]: %d \n", lPolygonIndex, lSmoothingFlag);
                    
                    
                }
            }
        }
    }
    
    for (i = 0; i < lCount; i++)
    {
        GetSmoothing(pSdkManager, pNode->
GetChild(i), pCompute, pConvertToSmoothingGroup);
 
    }
}
{
    if(!pNode)
        return;
    
    if(lMesh)
    {
        
        FBXSDK_printf(
"current mesh node: %s\n", pNode->
GetName());
 
        
        if(lNormalElement)
        {
            
            
            {
                
                {
                    int lNormalIndex = 0;
                    
                    
                        lNormalIndex = lVertexIndex;
                    
                        lNormalIndex = lNormalElement->
GetIndexArray().GetAt(lVertexIndex);
 
                    
                    FbxVector4 lNormal = lNormalElement->GetDirectArray().GetAt(lNormalIndex);
 
                    if( gVerbose ) FBXSDK_printf("normals for vertex[%d]: %f %f %f %f \n", lVertexIndex, lNormal[0], lNormal[1], lNormal[2], lNormal[3]);
                    
                    
                }
            }
            
            
            {
                int lIndexByPolygonVertex = 0;
                
                for(
int lPolygonIndex = 0; lPolygonIndex < lMesh->
GetPolygonCount(); lPolygonIndex++)
 
                {
                    
                    
                    for(int i = 0; i < lPolygonSize; i++)
                    {
                        int lNormalIndex = 0;
                        
                            lNormalIndex = lIndexByPolygonVertex;
                        
                            lNormalIndex = lNormalElement->GetIndexArray().GetAt(lIndexByPolygonVertex);
                        
                        FbxVector4 lNormal = lNormalElement->GetDirectArray().GetAt(lNormalIndex);
 
                        if( gVerbose ) FBXSDK_printf("normals for polygon[%d]vertex[%d]: %f %f %f %f \n", 
                            lPolygonIndex, i, lNormal[0], lNormal[1], lNormal[2], lNormal[3]);
                        
                        
                        lIndexByPolygonVertex++;
                    }
                }
            }
        }
    }
    
    for (i = 0; i < lCount; i++)
    {
    }
}