#include "orimpexpgames_engine.h"
ORGamesExportEngine::ORGamesExportEngine()
{
mExportGlobalInfo = true;
mExportModels = true;
mExportAnimation = true;
mExportMesh = true;
mExportDevices = true;
mExportConstraints = true;
mExportCameras = true;
mExportLights = true;
mExportTextures = true;
mExportMaterials = true;
mExportTakes = true;
mExportMedia = true;
mExportSelected = true;
}
ORGamesExportEngine::~ORGamesExportEngine()
{
}
void ORGamesExportEngine::Export(const char* pFilename)
{
mFile = fopen( pFilename, "wt" );
if( mFile )
{
ExportGlobalInfo ();
ExportModels ();
ExportConstraints ();
ExportDevices ();
ExportMaterials ();
ExportMedia ();
ExportTakes ();
ExportTextures ();
fclose( mFile );
}
}
void ORGamesExportEngine::ExportGlobalInfo()
{
if( mExportGlobalInfo )
{
FileHeaderOpen("Global Info");
fprintf( mFile, "Computer Name :\t%s\n", (const char*)mSystem.ComputerName );
fprintf( mFile, "Application Version :\t%lf\n", ((double)mSystem.Version)/1000.0 );
fprintf( mFile, "System Time :\t%s\n", (const char*)mSystem.SystemTime.AsString() );
fprintf( mFile, "Local Time :\t%s\n", (const char*)mSystem.LocalTime.AsString() );
fprintf( mFile, "Images Path :\t%s\n", (const char*)mSystem.PathImages );
fprintf( mFile, "Mesh Path :\t%s\n", (const char*)mSystem.PathMeshs );
fprintf( mFile, "Comm Ports :\t[" );
for( i=0; i< mSystem.CommPorts.GetCount(); i++ )
{
fprintf( mFile, "%d", mSystem.CommPorts[i] );
if( i != mSystem.CommPorts.GetCount() -1 )
{
fprintf( mFile, "," );
}
}
fprintf( mFile, "]\n" );
if( (const char*)mApplication.FBXFileName )
{
fprintf( mFile, "Current File :\t%s\n\n", (const char*) mApplication.FBXFileName );
}
FileHeaderClose();
}
}
void ORGamesExportEngine::ExportModels()
{
if( mExportModels )
{
FileHeaderOpen("Models");
ExportModel( mSystem.SceneRootModel );
FileHeaderClose();
}
if( mExportCameras )
{
FileHeaderOpen("Cameras");
for( i=0; i< mSystem.Scene->Cameras.GetCount(); i++ )
{
ExportModel(mSystem.Scene->Cameras[i], false, false);
}
FileHeaderClose();
}
if( mExportLights )
{
FileHeaderOpen("Lights");
for( i=0; i<mSystem.Scene->Lights.GetCount(); i++ )
{
ExportModel(mSystem.Scene->Lights[i], false, false);
}
FileHeaderClose();
}
}
void ORGamesExportEngine::ExportConstraints()
{
if( mExportConstraints )
{
FBConstraint* lConstraint;
FBConstraintManager* lConstraintMgr = &FBConstraintManager::TheOne();
FileHeaderOpen("Constraints");
fprintf( mFile, "Constraint Types :\n" );
for( i = 0; i < lConstraintMgr->TypeGetCount(); i++ )
{
fprintf( mFile, "\t%s\n", (const char*)lConstraintMgr->TypeGetName( i ) );
}
for( j=0; j<mSystem.Scene->Constraints.GetCount(); j++)
{
lConstraint = mSystem.Scene->Constraints[j];
fprintf( mFile, "\t%s\n", (const char*)lConstraint->Name );
ExportPropertyList( lConstraint, 2 );
}
FileHeaderClose();
}
}
void ORGamesExportEngine::ExportDevices()
{
if( mExportDevices )
{
FBDevice* lDevice;
FileHeaderOpen("Devices");
for( i=0; i<mSystem.Scene->Devices.GetCount(); i++ )
{
lDevice = mSystem.Scene->Devices[
i];
fprintf( mFile, "%s\n", (const char*)lDevice->Name );
ExportPropertyList( lDevice, 2 );
}
FileHeaderClose();
}
}
void ORGamesExportEngine::ExportTextures()
{
if( mExportTextures )
{
FBTexture* lTexture;
FileHeaderOpen("Textures");
for( i=0; i<mSystem.Scene->Textures.GetCount(); i++ )
{
lTexture = mSystem.Scene->Textures[
i];
fprintf( mFile, "%s\n", (const char*)lTexture->Name );
ExportTexture( lTexture );
ExportPropertyList( lTexture );
}
FileHeaderClose();
}
}
void ORGamesExportEngine::ExportMaterials()
{
if( mExportMaterials )
{
FBMaterial* lMaterial;
FileHeaderOpen("Materials");
for( i=0; i<mSystem.Scene->Materials.GetCount(); i++ )
{
lMaterial = mSystem.Scene->Materials[
i];
fprintf( mFile, "%s\n", (const char*)lMaterial->Name );
ExportMaterial( lMaterial );
ExportPropertyList( lMaterial );
}
FileHeaderClose();
}
}
void ORGamesExportEngine::ExportMedia()
{
if( mExportMedia )
{
FBVideoClip* lVideo;
FileHeaderOpen("Media");
for( i=0; i<mSystem.Scene->VideoClips.GetCount(); i++)
{
lVideo = mSystem.Scene->VideoClips[
i];
fprintf( mFile, "%s\n", (const char*)lVideo->Name );
ExportPropertyList( lVideo );
}
FileHeaderClose();
}
}
void ORGamesExportEngine::ExportTakes()
{
if( mExportTakes )
{
FBTake* lTake;
FileHeaderOpen("Takes");
for( i=0; i<mSystem.Scene->Takes.GetCount(); i++ )
{
lTake = mSystem.Scene->Takes[
i];
fprintf( mFile, "%s\n", (const char*)lTake->Name );
ExportPropertyList( lTake );
}
FileHeaderClose();
}
}
void ORGamesExportEngine::ExportModel( FBModel* pModel, bool pRecursive, bool pIgnoreLightsCameras )
{
if( ! mExportSelected || ( mExportSelected && pModel->Selected ) )
{
bool lLightCam = pModel->Is( FBCamera::TypeInfo ) || pModel->Is( FBLight::TypeInfo ) ;
if( !lLightCam || !pIgnoreLightsCameras )
{
fprintf( mFile, "%s\n", (const char*)pModel->Name );
if( mExportProperties )
{
ExportPropertyList( pModel );
}
if( pModel->Is( FBModelOptical::TypeInfo ) )
{
ExportOpticalModelInfo( (FBModelOptical*) pModel );
}
if( mExportAnimation )
{
ExportAnimationNodes( pModel->AnimationNode, pModel->Name );
}
if( mExportMesh )
{
ExportMesh( pModel );
}
if( mExportMaterials )
{
ExportMaterials( pModel );
}
fprintf( mFile, "\n" );
}
}
if( pRecursive )
{
for( i=0; i<pModel->Children.GetCount(); i++ )
{
ExportModel( pModel->Children[i] );
}
}
}
void ORGamesExportEngine::ExportPropertyList( FBComponent* pComponent, int pTabNumber )
{
FBProperty* lProperty;
FBString lString;
char lBuffer[50] = "<No String Value Representation>";
for( i=0;i<pTabNumber; i++ )
{
fprintf( mFile, "\t" );
}
for( i=0;i<pComponent->PropertyList.GetCount();i++)
{
lProperty = pComponent->PropertyList[
i];
lString = lProperty->AsString()?lProperty->AsString():lBuffer;
fprintf( mFile, "%s\t%s\n", (char*)lProperty->GetName(), (char*)lString );
}
}
void ORGamesExportEngine::ExportAnimationNodes(FBAnimationNode* pNode, const char *pParentName)
{
FBString lName;
FBString lTimeString;
FBTime lTime;
int lKeyCount;
lName = pParentName;
lName += "/";
lName += pNode->Name;
if(pNode->Nodes.GetCount()==0)
{
fprintf(mFile,"\tNode name:%s UserName:%s\n",(const char *)lName, (const char *)pNode->UserName);
lCurve = pNode->FCurve;
if(lCurve)
{
lKeyCount = lCurve->Keys.GetCount();
fprintf(mFile,"\t\t%d Key Frames\n", lKeyCount);
for(int i=0;i<lKeyCount;i++)
{
lTime = lCurve->Keys[
i].Time;
lTimeString = (char *)lTime.GetTimeString();
fprintf(mFile,"\t\tKeyIndex[%d]: Time[%s] Val[%lf] Deriv[%.2lf,%.2lf] TCB[%lf,%lf,%lf]\n",
i,
(char *)lTimeString,
(double)lCurve->Keys[i].Value,
(double)lCurve->Keys[i].LeftDerivative,
(double)lCurve->Keys[i].RightDerivative,
(double)lCurve->Keys[i].Tension,
(double)lCurve->Keys[i].Continuity,
(double)lCurve->Keys[i].Bias
);
}
fprintf( mFile, "\n" );
}
else
{
fprintf( mFile, "\t\tNode has no recorded data\n" );
}
}
for(i=0;i<pNode->Nodes.GetCount();i++)
{
ExportAnimationNodes(pNode->Nodes[i], (char *)lName) ;
}
}
void ORGamesExportEngine::ExportMesh( FBModel* pModel )
{
FBModelVertexData* lModelVertexData = pModel->ModelVertexData;
int lVertexCount = lModelVertexData->GetVertexCount();
FBUV* lUVs = (
FBUV*)lModelVertexData->GetUVSetArray();
int* lIndexes = lModelVertexData->GetIndexArray();
fprintf( mFile, "\tVertices :\tCount=%d\n", lVertexCount );
for(int i=0;i<lVertexCount;i++)
{
fprintf(mFile,"\t\tVertex[%3d] P=[%.2lf,%.2lf,%.2lf] N=[%.2lf,%.2lf,%.2lf] UV=[%.2lf,%.2lf]\n",
i,
lVertices[i][0],lVertices[i][1],lVertices[i][2],
lNormals[i][0],lNormals[i][1],lNormals[i][2],
lUVs[i][0],lUVs[i][1]);
}
int lSubPatchCount = lModelVertexData->GetSubPatchCount();
fprintf( mFile, "\tSubPatch :\tCount=%d\n", lSubPatchCount );
for(int i=0;i<lSubPatchCount;i++)
{
bool lSkip = false;
switch (lModelVertexData->GetSubPatchPrimitiveType(i))
{
default: lSkip = true;
}
if (lSkip)
continue;
const int lSubPatchIndexOffset = lModelVertexData->GetSubPatchIndexOffset(i);
const int lSubPatchIndexEnd = lSubPatchIndexOffset + lModelVertexData->GetSubPatchIndexSize(i);
for(int j=lSubPatchIndexOffset;j<lSubPatchIndexEnd;j++)
{
fprintf(mFile,"%d ",lIndexes[j]);
}
fprintf(mFile,"] MatId=[%d]\n",lModelVertexData->GetSubPatchMaterialId(i));
}
}
void ORGamesExportEngine::ExportMaterials( FBModel* pModel )
{
int lMaterialCount;
FBMaterial* lMaterial;
lMaterialCount = pModel->Materials.GetCount();
fprintf( mFile, "\tMaterials :\tCount=%d\n", lMaterialCount );
for(i=0;i< lMaterialCount;i++)
{
lMaterial = pModel->Materials[
i];
fprintf(mFile,"\t\tMaterial[%s] ",(const char *)(lMaterial->Name));
fprintf(mFile,"Id[%d]\n",i);
ExportMaterial( lMaterial );
}
}
void ORGamesExportEngine::ExportOpticalModelInfo( FBModelOptical* pModel )
{
FBTime lStart,lStop,lPeriod;
FBModelMarkerOptical* lMarker =
NULL;
lStart = pModel->SamplingStart;
lStop = pModel->SamplingStop;
lPeriod = pModel->SamplingPeriod;
fprintf(mFile,"\tAnimation: start:%s stop:%s period: %lf (%lf Hz)\n",
(char *) lStart.GetTimeString(),
(char *) lStop.GetTimeString(),
(double) lPeriod.GetMilliSeconds(),
1.0/(double) lPeriod.GetMilliSeconds());
if(pModel->ExportSetup())
{
for(i=0;i< pModel->Children.GetCount();i++)
{
lMarker = (FBModelMarkerOptical*)pModel->Children[i];
lFrameCount = lMarker->ExportBegin();
fprintf(mFile,"\tMarker[%d]: name:%s length:%d frames\n",i,(const char *)lMarker->Name,lFrameCount);
for(f=0;f< lFrameCount;f++)
{
if(lMarker->ExportKey( &x,&y,&z,&o))
{
fprintf(mFile,"\t\tframe[%d]= [%.2lf,%.2lf,%.2lf,%.2lf]\n",f, x,y,z,o);
}
else
{
fprintf(mFile,"\t\t------------Error at frame %d\n",f);
}
}
lMarker->ExportEnd();
}
}
}
void ORGamesExportEngine::ExportMaterial( FBMaterial* pMaterial )
{
fprintf(mFile,"\t\tMaterial[%s]\t",(const char *)(pMaterial->Name));
FBColor lPropColorValue;
float lPropDoubleValue;
FBTexture* lPropTex;
lPropColorValue = pMaterial->Ambient;
fprintf(mFile,
"AmbientValue=[%.2lf,%.2lf,%.2lf] AmbientTex=[%s]\n", lPropColorValue[0], lPropColorValue[1],lPropColorValue[2], lPropTex? (
const char*)(lPropTex->Name) :
NULL);
lPropDoubleValue = pMaterial->AmbientFactor;
fprintf(mFile,
"AmbientFactorValue=[%.2lf] AmbientTex=[%s]\n", lPropDoubleValue, lPropTex? (
const char*)(lPropTex->Name) :
NULL);
lPropColorValue = pMaterial->Emissive;
fprintf(mFile,
"EmissiveValue=[%.2lf,%.2lf,%.2lf] EmissiveTex=[%s]\n", lPropColorValue[0], lPropColorValue[1],lPropColorValue[2], lPropTex? (
const char*)(lPropTex->Name) :
NULL);
lPropDoubleValue = pMaterial->EmissiveFactor;
fprintf(mFile,
"EmissiveFactorValue=[%.2lf] EmissiveTex=[%s]\n", lPropDoubleValue, lPropTex? (
const char*)(lPropTex->Name) :
NULL);
lPropColorValue = pMaterial->Diffuse;
fprintf(mFile,
"DiffuseValue=[%.2lf,%.2lf,%.2lf] DiffuseTex=[%s]\n", lPropColorValue[0], lPropColorValue[1],lPropColorValue[2], lPropTex? (
const char*)(lPropTex->Name) :
NULL);
lPropDoubleValue = pMaterial->DiffuseFactor;
fprintf(mFile,
"DiffuseFactorValue=[%.2lf] DiffuseFactorTex=[%s]\n", lPropDoubleValue, lPropTex? (
const char*)(lPropTex->Name) :
NULL);
lPropColorValue = pMaterial->TransparentColor;
fprintf(mFile,
"TransparentColorValue=[%.2lf,%.2lf,%.2lf] TransparentColorTex=[%s]\n", lPropColorValue[0], lPropColorValue[1],lPropColorValue[2], lPropTex? (
const char*)(lPropTex->Name) :
NULL);
lPropDoubleValue = pMaterial->TransparencyFactor;
fprintf(mFile,
"TransparencyFactorValue=[%.2lf] TransparencyFactorTex=[%s]\n", lPropDoubleValue, lPropTex? (
const char*)(lPropTex->Name) :
NULL);
lPropColorValue = pMaterial->Bump;
fprintf(mFile,
"BumpValue=[%.2lf,%.2lf,%.2lf] BumpTex=[%s]\n", lPropColorValue[0], lPropColorValue[1],lPropColorValue[2], lPropTex? (
const char*)(lPropTex->Name) :
NULL);
lPropColorValue = pMaterial->NormalMap;
fprintf(mFile,
"NormalMapValue=[%.2lf,%.2lf,%.2lf] NormalMapTex=[%s]\n", lPropColorValue[0], lPropColorValue[1],lPropColorValue[2], lPropTex? (
const char*)(lPropTex->Name) :
NULL);
lPropColorValue = pMaterial->Specular;
fprintf(mFile,
"SpecularValue=[%.2lf,%.2lf,%.2lf] SpecularTex=[%s]\n", lPropColorValue[0], lPropColorValue[1],lPropColorValue[2], lPropTex? (
const char*)(lPropTex->Name) :
NULL);
lPropDoubleValue = pMaterial->SpecularFactor;
fprintf(mFile,
"SpecularFactorValue=[%.2lf] SpecularFactorTex=[%s]\n", lPropDoubleValue, lPropTex? (
const char*)(lPropTex->Name) :
NULL);
lPropDoubleValue = pMaterial->Shininess;
fprintf(mFile,
"ShininessValue=[%.2lf] ShininessTex=[%s]\n", lPropDoubleValue, lPropTex? (
const char*)(lPropTex->Name) :
NULL);
lPropColorValue = pMaterial->Reflection;
fprintf(mFile,
"ReflectionValue=[%.2lf,%.2lf,%.2lf] ReflectionTex=[%s]\n", lPropColorValue[0], lPropColorValue[1],lPropColorValue[2], lPropTex? (
const char*)(lPropTex->Name) :
NULL);
lPropDoubleValue = pMaterial->ReflectionFactor;
fprintf(mFile,
"ReflectionFactorValue=[%.2lf] ReflectionFactorTex=[%s]\n", lPropDoubleValue, lPropTex? (
const char*)(lPropTex->Name) :
NULL);
}
void ORGamesExportEngine::ExportTexture( FBTexture* pTexture )
{
const char* lFilename = "NotFileBased";
if( pTexture !=
NULL && pTexture->Video !=
NULL )
{
FBVideoClip* lVideoClip = FBCast<FBVideoClip>(pTexture->Video);
{
lFilename = lVideoClip->Filename;
}
}
fprintf(mFile,"\t\tTexture[%s] File: %s, res:[%dx%d]\n",
(const char *)(pTexture->Name),
lFilename,
(int)pTexture->Width,
(int)pTexture->Height);
}
void ORGamesExportEngine::FileHeaderOpen( const char* pHeader )
{
fprintf( mFile, "====================================================================================\n" );
fprintf( mFile, " %s\n", pHeader );
fprintf( mFile, "_______________________________________________________\n" );
}
void ORGamesExportEngine::FileHeaderClose()
{
fprintf( mFile, "====================================================================================\n" );
}