#include <fbxsdk.h>
#include "../Common/Common.h"
#define SAMPLE_FILENAME "Layers.fbx"
#define BACKGROUND_IMAGE_NAME "Spotty"
#define BACKGROUND_IMAGE "spotty.jpg"
#define GEO1_IMAGE_NAME "One"
#define GEO1_IMAGE "1.jpg"
#define GEO2_IMAGE_NAME "Waffle"
#define GEO2_IMAGE "waffle.jpg"
typedef double Vector4[4];
typedef double Vector2[2];
FbxNode* CreateCube(FbxScene* pScene, const char* pName);
FbxTexture* CreateTexture(FbxScene* pScene, const char* name, const char* filename);
int main(int argc, char** argv)
{
FbxManager* lSdkManager = NULL;
FbxScene* lScene = NULL;
bool lResult;
InitializeSdkObjects(lSdkManager, lScene);
FbxNode* lCube = CreateCube(lScene, "Cube");
FbxNode* lRootNode = lScene->GetRootNode();
lRootNode->AddChild(lCube);
const char* lSampleFileName = NULL;
for( int i = 1; i < argc; ++i )
{
if( FBXSDK_stricmp(argv[i], "-test") == 0 ) continue;
else if( !lSampleFileName ) lSampleFileName = argv[i];
}
if( !lSampleFileName ) lSampleFileName = SAMPLE_FILENAME;
lResult = SaveScene(lSdkManager, lScene, lSampleFileName);
if(lResult == false)
{
FBXSDK_printf("\n\nAn error occurred while saving the scene...\n");
DestroySdkObjects(lSdkManager, lResult);
return 0;
}
DestroySdkObjects(lSdkManager, lResult);
return 0;
}
FbxNode* CreateCube(FbxScene* pScene, const char* pName)
{
static int vtxId[24] = {
0,1,2,3,
1,5,6,2,
5,4,7,6,
4,0,3,7,
0,4,5,1,
3,2,6,7
};
static Vector4 lControlPoints[8] = {
{ -50.0, 0.0, 50.0, 1.0}, { 50.0, 0.0, 50.0, 1.0}, { 50.0,100.0, 50.0, 1.0}, { -50.0,100.0, 50.0, 1.0},
{ -50.0, 0.0, -50.0, 1.0}, { 50.0, 0.0, -50.0, 1.0}, { 50.0,100.0, -50.0, 1.0}, { -50.0,100.0, -50.0, 1.0}
};
static Vector4 lNormals[8] = {
{-0.577350258827209,-0.577350258827209, 0.577350258827209, 1.0},
{ 0.577350258827209,-0.577350258827209, 0.577350258827209, 1.0},
{ 0.577350258827209, 0.577350258827209, 0.577350258827209, 1.0},
{-0.577350258827209, 0.577350258827209, 0.577350258827209, 1.0},
{-0.577350258827209,-0.577350258827209,-0.577350258827209, 1.0},
{ 0.577350258827209,-0.577350258827209,-0.577350258827209, 1.0},
{ 0.577350258827209, 0.577350258827209,-0.577350258827209, 1.0},
{-0.577350258827209, 0.577350258827209,-0.577350258827209, 1.0}
};
static Vector2 lUVs0[14] = {
{ 0.0, 0.0},
{ 1.0, 0.0},
{ 0.0, 1.0},
{ 1.0, 1.0},
{ 0.0, 2.0},
{ 1.0, 2.0},
{ 0.0, 3.0},
{ 1.0, 3.0},
{ 0.0, 4.0},
{ 1.0, 4.0},
{ 2.0, 0.0},
{ 2.0, 1.0},
{-1.0, 0.0},
{-1.0, 1.0}
};
static Vector2 lUVs1[14] = {
{ 0.0, 1.0},
{ 1.0, 0.0},
{ 0.0, 0.0},
{ 1.0, 1.0}
};
static int uvsId[24] = {
0,1,3,2,2,3,5,4,4,5,7,6,6,7,9,8,1,10,11,3,12,0,2,13
};
static Vector4 lColors[8] = {
{1.0, 1.0, 1.0, 1.0},
{1.0, 1.0, 0.0, 1.0},
{1.0, 0.0, 1.0, 1.0},
{0.0, 1.0, 1.0, 1.0},
{0.0, 0.0, 1.0, 1.0},
{1.0, 0.0, 0.0, 1.0},
{0.0, 1.0, 0.0, 1.0},
{0.0, 0.0, 0.0, 1.0},
};
FbxMesh* lMesh = FbxMesh::Create(pScene,"");
lMesh->InitControlPoints(8);
FbxVector4* vertex = lMesh->GetControlPoints();
memcpy((void*)vertex, (void*)lControlPoints, 8*sizeof(FbxVector4));
FbxGeometryElementMaterial* lMaterialElement = lMesh->CreateElementMaterial();
lMaterialElement->SetMappingMode(FbxGeometryElement::eByPolygon);
lMaterialElement->SetReferenceMode(FbxGeometryElement::eIndexToDirect);
int vId = 0;
for (int f=0; f<6; f++)
{
lMesh->BeginPolygon(f);
for (int v=0; v<4; v++)
lMesh->AddPolygon(vtxId[vId++]);
lMesh->EndPolygon();
}
FbxGeometryElementNormal* lNormalElement = lMesh->CreateElementNormal();
lNormalElement->SetMappingMode(FbxGeometryElement::eByControlPoint);
lNormalElement->SetReferenceMode(FbxGeometryElement::eDirect);
for (int n=0; n<8; n++)
lNormalElement->GetDirectArray().Add(FbxVector4(lNormals[n][0], lNormals[n][1], lNormals[n][2]));
FbxGeometryElementVertexColor* lVertexColorElement = lMesh->CreateElementVertexColor();
lVertexColorElement->SetMappingMode(FbxGeometryElement::eByControlPoint);
lVertexColorElement->SetReferenceMode(FbxGeometryElement::eDirect);
for (int c=0; c<8; c++)
lVertexColorElement->GetDirectArray().Add(FbxColor(lColors[c][0]*.8, lColors[c][1]*0.8, lColors[c][2]*.8, lColors[c][3]*.8));
FbxGeometryElementPolygonGroup* lPolygonGroupElement = lMesh->CreateElementPolygonGroup();
lPolygonGroupElement->SetMappingMode(FbxGeometryElement::eByPolygon);
lPolygonGroupElement->SetReferenceMode(FbxGeometryElement::eIndex);
lPolygonGroupElement->GetIndexArray().Add(0);
lPolygonGroupElement->GetIndexArray().Add(0);
lPolygonGroupElement->GetIndexArray().Add(0);
lPolygonGroupElement->GetIndexArray().Add(0);
lPolygonGroupElement->GetIndexArray().Add(1);
lPolygonGroupElement->GetIndexArray().Add(1);
FbxTexture* lTexture[3];
FbxLayeredTexture::EBlendMode lBlendMode[3];
FbxGeometryElementUV* lUVElement0 = lMesh->CreateElementUV( BACKGROUND_IMAGE_NAME);
FBX_ASSERT( lUVElement0 != NULL);
lUVElement0->SetMappingMode(FbxGeometryElement::eByPolygonVertex);
lUVElement0->SetReferenceMode(FbxGeometryElement::eIndexToDirect);
int i;
for (i = 0; i<14; i++)
lUVElement0->GetDirectArray().Add(FbxVector2(lUVs0[i][0], lUVs0[i][1]));
for (i = 0; i<24; i++)
lUVElement0->GetIndexArray().Add(uvsId[i]);
FbxNode* lNode = FbxNode::Create(pScene,pName);
lNode->SetNodeAttribute(lMesh);
lNode->SetShadingMode(FbxNode::eTextureShading);
FbxSurfacePhong* lMaterial[6];
for (i = 0; i < 6; i++ )
{
FbxString lMaterialName = "material";
lMaterialName += i;
lMaterial[i] = FbxSurfacePhong::Create(pScene,lMaterialName.Buffer());
lMaterial[i]->Emissive.Set(FbxDouble3(0.0, 0.0, 0.0));
lMaterial[i]->Ambient.Set(FbxDouble3(lColors[i][0], lColors[i][1], lColors[i][2]));
lMaterial[i]->Diffuse.Set(FbxDouble3(1.0, 1.0, 1.0));
lMaterial[i]->Specular.Set(FbxDouble3(0.0, 0.0, 0.0));
lMaterial[i]->TransparencyFactor.Set(0.0);
lMaterial[i]->Shininess.Set(0.5);
lMaterial[i]->ShadingModel.Set(FbxString("phong"));
lNode->AddMaterial(lMaterial[i]);
}
lTexture[0] = CreateTexture(pScene, BACKGROUND_IMAGE_NAME, BACKGROUND_IMAGE);
lBlendMode[0] = FbxLayeredTexture::eTranslucent;
FbxGeometryElementUV* lUVElement1 = lMesh->CreateElementUV( GEO1_IMAGE_NAME);
FBX_ASSERT( lUVElement1 != NULL);
lUVElement1->SetMappingMode(FbxGeometryElement::eByPolygonVertex);
lUVElement1->SetReferenceMode(FbxGeometryElement::eIndexToDirect);
for (i = 0; i <4; i++)
lUVElement1->GetDirectArray().Add(FbxVector2(lUVs1[i][0], lUVs1[i][1]));
for (i = 0; i<24; i++)
lUVElement1->GetIndexArray().Add(uvsId[i%4]);
lTexture[1] = CreateTexture(pScene, GEO1_IMAGE_NAME, GEO1_IMAGE);
lBlendMode[1] = FbxLayeredTexture::eModulate;
FbxGeometryElementUV* lUVElement2 = lMesh->CreateElementUV( GEO2_IMAGE_NAME);
FBX_ASSERT( lUVElement2 != NULL);
*lUVElement2 = *lUVElement0;
lTexture[2] = CreateTexture(pScene, GEO2_IMAGE_NAME, GEO2_IMAGE);
lBlendMode[2] = FbxLayeredTexture::eModulate;
FbxLayeredTexture* lLayeredTexture[2];
lLayeredTexture[0] = FbxLayeredTexture::Create(pScene, "layeredTexture0");
lLayeredTexture[1] = FbxLayeredTexture::Create(pScene, "layeredTexture1");
for (i = 0; i < 3; i++)
{
lLayeredTexture[0]->ConnectSrcObject(lTexture[i]);
lLayeredTexture[0]->SetTextureBlendMode(i, lBlendMode[i]);
if (i < 2)
{
lLayeredTexture[1]->ConnectSrcObject(lTexture[i]);
lLayeredTexture[1]->SetTextureBlendMode(i, lBlendMode[i]);
}
}
lMaterial[0]->Diffuse.ConnectSrcObject(lLayeredTexture[0]);
for (i = 1; i < 6; i++)
lMaterial[i]->Diffuse.ConnectSrcObject(lLayeredTexture[1]);
return lNode;
}
FbxTexture* CreateTexture(FbxScene* pScene, const char* name, const char* filename)
{
FbxFileTexture* lTexture = FbxFileTexture::Create(pScene,name);
lTexture->SetFileName(filename);
lTexture->SetTextureUse(FbxTexture::eStandard);
lTexture->SetMappingType(FbxTexture::eUV);
lTexture->SetMaterialUse(FbxFileTexture::eModelMaterial);
lTexture->SetSwapUV(false);
lTexture->SetTranslation(0.0, 0.0);
lTexture->SetScale(1.0, 1.0);
lTexture->SetRotation(0.0, 0.0);
return lTexture;
}