#include "GeometryUtility.h"
FbxNode * CreatePyramid(FbxScene * pScene, const char * pName, double pBottomWidth, double pHeight)
{
FbxMesh * lPyramid = FbxMesh::Create(pScene, pName);
const double lBottomWidthHalf = pBottomWidth / 2;
const FbxVector4 PyramidControlPointArray[] =
{
FbxVector4(0, pHeight, 0),
FbxVector4(lBottomWidthHalf, 0, lBottomWidthHalf),
FbxVector4(lBottomWidthHalf, 0, -lBottomWidthHalf),
FbxVector4(-lBottomWidthHalf, 0, -lBottomWidthHalf),
FbxVector4(-lBottomWidthHalf, 0, lBottomWidthHalf)
};
const int lControlPointCount = sizeof(PyramidControlPointArray) / sizeof(FbxVector4);
lPyramid->InitControlPoints(lControlPointCount);
for (int lIndex = 0; lIndex < lControlPointCount; ++lIndex)
{
lPyramid->SetControlPointAt(PyramidControlPointArray[lIndex], lIndex);
}
lPyramid->BeginPolygon();
lPyramid->AddPolygon(1);
lPyramid->AddPolygon(4);
lPyramid->AddPolygon(3);
lPyramid->AddPolygon(2);
lPyramid->EndPolygon();
lPyramid->BeginPolygon();
lPyramid->AddPolygon(0);
lPyramid->AddPolygon(1);
lPyramid->AddPolygon(2);
lPyramid->EndPolygon();
lPyramid->BeginPolygon();
lPyramid->AddPolygon(0);
lPyramid->AddPolygon(2);
lPyramid->AddPolygon(3);
lPyramid->EndPolygon();
lPyramid->BeginPolygon();
lPyramid->AddPolygon(0);
lPyramid->AddPolygon(3);
lPyramid->AddPolygon(4);
lPyramid->EndPolygon();
lPyramid->BeginPolygon();
lPyramid->AddPolygon(0);
lPyramid->AddPolygon(4);
lPyramid->AddPolygon(1);
lPyramid->EndPolygon();
FbxNode * lPyramidNode = FbxNode::Create(pScene, pName);
lPyramidNode->SetNodeAttribute(lPyramid);
pScene->GetRootNode()->AddChild(lPyramidNode);
return lPyramidNode;
}
typedef double Vector4[4];
typedef double Vector2[2];
FbxNode* CreateCube(FbxScene* pScene, const char* pName, FbxDouble3& pLclTranslation)
{
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] = {
{ -5.0, 0.0, 5.0, 1.0}, { 5.0, 0.0, 5.0, 1.0}, { 5.0,10.0, 5.0, 1.0}, { -5.0,10.0, 5.0, 1.0},
{ -5.0, 0.0, -5.0, 1.0}, { 5.0, 0.0, -5.0, 1.0}, { 5.0,10.0, -5.0, 1.0}, { -5.0,10.0, -5.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 lUVs[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
};
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::eAllSame);
lMaterialElement->SetReferenceMode(FbxGeometryElement::eIndexToDirect);
lMaterialElement->GetIndexArray().Add(0);
int vId = 0;
for (int f=0; f<6; f++)
{
lMesh->BeginPolygon();
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]));
FbxNode* lNode = FbxNode::Create(pScene,pName);
lNode->LclTranslation.Set(pLclTranslation);
lNode->SetNodeAttribute(lMesh);
lNode->SetShadingMode(FbxNode::eTextureShading);
FbxGeometryElementUV* lUVElement1 = lMesh->CreateElementUV("UVSet1");
FBX_ASSERT( lUVElement1 != NULL);
lUVElement1->SetMappingMode(FbxGeometryElement::eByPolygonVertex);
lUVElement1->SetReferenceMode(FbxGeometryElement::eIndexToDirect);
for (int i = 0; i <4; i++)
lUVElement1->GetDirectArray().Add(FbxVector2(lUVs[i][0], lUVs[i][1]));
for (int i = 0; i<24; i++)
lUVElement1->GetIndexArray().Add(uvsId[i%4]);
return lNode;
}