#include "DisplayMesh.h"
#include "DisplayMaterial.h"
#include "DisplayTexture.h"
#include "DisplayLink.h"
#include "DisplayShape.h"
#include "DisplayCache.h"
#if defined (FBXSDK_ENV_MAC)
#pragma GCC diagnostic ignored "-Wformat-security"
#endif
#define MAT_HEADER_LENGTH 200
void DisplayControlsPoints(
FbxMesh* pMesh);
 
void DisplayPolygons(
FbxMesh* pMesh);
 
void DisplayMaterialMapping(
FbxMesh* pMesh);
 
void DisplayTextureMapping(
FbxMesh* pMesh);
 
void DisplayMaterialConnections(
FbxMesh* pMesh);
 
                                       char * header, int pMatId, int l );
{
    DisplayString(
"Mesh Name: ", (
char *) pNode->
GetName());
 
    DisplayMetaDataConnections(lMesh);
    DisplayControlsPoints(lMesh);
    DisplayPolygons(lMesh);
    DisplayMaterialMapping(lMesh);
    DisplayMaterial(lMesh);
    DisplayTexture(lMesh);
    DisplayMaterialConnections(lMesh);
    DisplayLink(lMesh);
    DisplayShape(lMesh);
    
    DisplayCache(lMesh);
}
void DisplayControlsPoints(
FbxMesh* pMesh)
 
{
    DisplayString("    Control Points");
    for (i = 0; i < lControlPointsCount; i++)
    {
        DisplayInt("        Control Point ", i);
        Display3DVector("            Coordinates: ", lControlPoints[i]);
        {
            {
                char header[100];
                FBXSDK_sprintf(header, 100, "            Normal Vector: "); 
            }
        }
    }
    DisplayString("");
}
void DisplayPolygons(
FbxMesh* pMesh)
 
{
    char header[100];
    DisplayString("    Polygons");
    int vertexId = 0;
    for (i = 0; i < lPolygonCount; i++)
    {
        DisplayInt("        Polygon ", i);
        int l;
        {
            {
                {
                    FBXSDK_sprintf(header, 100, "        Assigned to group: "); 
                    DisplayInt(header, polyGroupId);
                    break;
                }
            default:
                
                DisplayString("        \"unsupported group assignment\"");
                break;
            }
        }
        for (j = 0; j < lPolygonSize; j++)
        {
            Display3DVector("            Coordinates: ", lControlPoints[lControlPointIndex]);
            {
                FBXSDK_sprintf(header, 100, "            Color vertex: "); 
                {
                default:
                    break;
                    {
                        DisplayColor(header, leVtxc->
GetDirectArray().GetAt(lControlPointIndex));
 
                        break;
                        {
                        }
                        break;
                    default:
                        break; 
                    }
                    break;
                    {
                        {
                            break;
                            {
                            }
                            break;
                        default:
                            break; 
                        }
                    }
                    break;
                    break;
                }
            }
            {
                FBXSDK_sprintf(header, 100, "            Texture UV: "); 
                {
                default:
                    break;
                    {
                        Display2DVector(header, leUV->
GetDirectArray().GetAt(lControlPointIndex));
 
                        break;
                        {
                        }
                        break;
                    default:
                        break; 
                    }
                    break;
                    {
                        {
                            {
                                Display2DVector(header, leUV->
GetDirectArray().GetAt(lTextureUVIndex));
 
                            }
                            break;
                        default:
                            break; 
                        }
                    }
                    break;
                    break;
                }
            }
            {
                FBXSDK_sprintf(header, 100, "            Normal: "); 
                {
                    {
                        break;
                        {
                        }
                        break;
                    default:
                        break; 
                    }
                }
            }
            {
                FBXSDK_sprintf(header, 100, "            Tangent: "); 
                {
                    {
                        break;
                        {
                        }
                        break;
                    default:
                        break; 
                    }
                }
            }
            {
                FBXSDK_sprintf(header, 100, "            Binormal: "); 
                {
                    {
                        Display3DVector(header, leBinormal->
GetDirectArray().GetAt(vertexId));
 
                        break;
                        {
                        }
                        break;
                    default:
                        break; 
                    }
                }
            }
            vertexId++;
        } 
    } 
    
    {
        FBXSDK_sprintf(header, 100, "    Edge Visibility : ");
        DisplayString(header);
        {
        default:
            break;
            
            
            {
                DisplayInt("        Edge ", j);
                DisplayBool(
"              Edge visibility: ", leVisibility->
GetDirectArray().GetAt(j));
 
            }
            break;
        }
    }
    DisplayString("");
}
{
    if(lLayeredTextureCount > 0)
    {
        for(int j=0; j<lLayeredTextureCount; ++j)
        {
            pConnectionString += " Texture ";
            for(int k =0; k<lNbTextures; ++k)
            {
                
                pConnectionString += "\"";
                pConnectionString += (
char*)lLayeredTexture->
GetName();
 
                pConnectionString += "\"";
                pConnectionString += " ";
            }
            pConnectionString += "of ";
            pConnectionString += pProperty.
GetName();
 
            pConnectionString += " on layer ";
            pConnectionString += j;
        }
        pConnectionString += " |";
    }
    else
    {
        
        if(lNbTextures > 0)
        {
            pConnectionString += " Texture ";
            pConnectionString += " ";
            for(int j =0; j<lNbTextures; ++j)
            {
                if(lTexture)
                {
                    pConnectionString += "\"";
                    pConnectionString += (
char*)lTexture->
GetName();
 
                    pConnectionString += "\"";
                    pConnectionString += " ";
                }
            }
            pConnectionString += "of ";
            pConnectionString += pProperty.
GetName();
 
            pConnectionString += " |";
        }
    }
}
void DisplayMaterialTextureConnections( 
FbxSurfaceMaterial* pMaterial, 
char * header, 
int pMatId, 
int l )
 
{
    if(!pMaterial)
        return;
    FbxString lConnectionString = 
"            Material %d -- ";
 
    
    
    DisplayTextureNames(lProperty, lConnectionString);
    
    DisplayTextureNames(lProperty, lConnectionString);
    
    DisplayTextureNames(lProperty, lConnectionString);
    
    DisplayTextureNames(lProperty, lConnectionString);
    
    DisplayTextureNames(lProperty, lConnectionString); 
    
    DisplayTextureNames(lProperty, lConnectionString);          
    
    DisplayTextureNames(lProperty, lConnectionString);  
    
    DisplayTextureNames(lProperty, lConnectionString);
    
    DisplayTextureNames(lProperty, lConnectionString);
    
    DisplayTextureNames(lProperty, lConnectionString);
    
    DisplayTextureNames(lProperty, lConnectionString);
    
    DisplayTextureNames(lProperty, lConnectionString);
    
    DisplayTextureNames(lProperty, lConnectionString);
    
    DisplayTextureNames(lProperty, lConnectionString);
    
    DisplayTextureNames(lProperty, lConnectionString);
    
    bool lStringOverflow = (lConnectionString.
GetLen() + 10 >= MAT_HEADER_LENGTH); 
 
    if (lStringOverflow)
    {
        
        lConnectionString = lConnectionString.
Left(MAT_HEADER_LENGTH - 10);
 
        lConnectionString = lConnectionString + "...";
    }
    FBXSDK_sprintf(header, MAT_HEADER_LENGTH, lConnectionString.
Buffer(), pMatId, l);
 
    DisplayString(header);
}
void DisplayMaterialConnections(
FbxMesh* pMesh)
 
{
    char header[MAT_HEADER_LENGTH];
    DisplayString("    Polygons Material Connections");
    
    bool lIsAllSame = true;
    {
        {
            lIsAllSame = false;
            break;
        }
    }
    
    if(lIsAllSame)
    {
        {
            {
                if(lMatId >= 0)
                {
                    DisplayInt("        All polygons share the same material in mesh ", l);
                    DisplayMaterialTextureConnections(lMaterial, header, lMatId, l);
                }
            }
        }
        
        if(l == 0)
            DisplayString("        no material applied");
    }
    
    else
    {
        for (i = 0; i < lPolygonCount; i++)
        {
            DisplayInt("        Polygon ", i);
            {
                int lMatId = -1;
                if(lMatId >= 0)
                {
                    DisplayMaterialTextureConnections(lMaterial, header, lMatId, l);
                }
            }
        }
    }
}
void DisplayMaterialMapping(
FbxMesh* pMesh)
 
{
    const char* lMappingTypes[] = { "None", "By Control Point", "By Polygon Vertex", "By Polygon", "By Edge", "All Same" };
    const char* lReferenceMode[] = { "Direct", "Index", "Index to Direct"};
    int lMtrlCount = 0;
    if(pMesh){
        if(lNode)
    }
    {
        if (leMat)
        {
            char header[100];
            FBXSDK_sprintf(header, 100, "    Material Element %d: ", l); 
            DisplayString(header);
            int lMaterialCount = 0;
            {
                lMaterialCount = lMtrlCount;
            }
            {
                int i;
                lString = "           Indices: ";
                for (i = 0; i < lIndexArrayCount; i++)
                {
                    if (i < lIndexArrayCount - 1)
                    {
                        lString += ", ";
                    }
                }
                lString += "\n";
                FBXSDK_printf(lString);
            }
        }
    }
    DisplayString("");
}