#include "orimpexpcamera_engine.h"
ORCameraEngine::ORCameraEngine()
{
mExportProperties = false;
mExportMesh = false;
mExportAnimation = true;
}
ORCameraEngine::~ORCameraEngine()
{
}
{
int lNumberOfCameras;
char lNameBuf[50];
FBString lCameraName;
FBCamera* lCamera;
double lResolutionWidth, lResolutionHeight,
lPixelAspect,
lNearPlane, lFarPlane,
lAov, lFocalLength;
double lKeyFrames;
double lTime;
double lPos[3], lRot[3], lSca[3];
FBString lXYZ[3];
lXYZ[0] = "X";
lXYZ[1] = "Y";
lXYZ[2] = "Z";
FBAnimationNode* lPosVNode, *lRotVNode, *lScaVNode;
FBAnimationNode* lPosNode, *lRotNode, *lScaNode;
FBFCurve* lPosFCurve, *lRotFCurve, *lScaFCurve;
FBTime lFBTime;
mImportFile = fopen( pFilename, "rt" );
if( mImportFile ==
NULL )
return;
fscanf( mImportFile, "%d", &lNumberOfCameras );
for( i=0; i<lNumberOfCameras; i++)
{
fscanf( mImportFile, "%s", lNameBuf );
fscanf( mImportFile, "%lf", &lResolutionWidth );
fscanf( mImportFile, "%lf", &lResolutionHeight );
fscanf( mImportFile, "%lf", &lPixelAspect );
fscanf( mImportFile, "%lf", &lNearPlane );
fscanf( mImportFile, "%lf", &lFarPlane );
fscanf( mImportFile, "%lf", &lAov );
fscanf( mImportFile, "%lf", &lFocalLength );
lCameraName = lNameBuf;
lCamera = new FBCamera(lCameraName);
lCamera->Show = true;
lCamera->ResolutionWidth = lResolutionWidth;
lCamera->PixelAspectRatio = lPixelAspect;
lCamera->NearPlaneDistance = lNearPlane;
lCamera->FarPlaneDistance = lFarPlane;
lCamera->FieldOfView = lAov;
lCamera->FocalLength = lFocalLength;
lCamera->Translation.SetAnimated(true);
lCamera->Rotation.SetAnimated(true);
lCamera->Scaling.SetAnimated(true);
for( k=0; k<3; k++)
{
lPosNode = FindAnimationNode( lPosVNode, lXYZ[k] );
lRotNode = FindAnimationNode( lRotVNode, lXYZ[k] );
lScaNode = FindAnimationNode( lScaVNode, lXYZ[k] );
lPosFCurve = (FBFCurve*) lPosNode->FCurve;
lRotFCurve = (FBFCurve*) lRotNode->FCurve;
lScaFCurve = (FBFCurve*) lScaNode->FCurve;
if( ! lPosFCurve ) lPosFCurve = new FBFCurve;
else lPosFCurve->Keys.RemoveAll();
if( ! lRotFCurve ) lRotFCurve = new FBFCurve;
else lPosFCurve->Keys.RemoveAll();
if( ! lScaFCurve ) lScaFCurve = new FBFCurve;
else lPosFCurve->Keys.RemoveAll();
lPosNode->FCurve = lPosFCurve;
lRotNode->FCurve = lRotFCurve;
lScaNode->FCurve = lScaFCurve;
}
fscanf( mImportFile, "%lf", &lKeyFrames );
for( j=0; j<lKeyFrames; j++ )
{
fscanf( mImportFile, "%lf", &lTime );
fscanf( mImportFile, "%lf", &lPos[0] );
fscanf( mImportFile, "%lf", &lPos[1] );
fscanf( mImportFile, "%lf", &lPos[2] );
fscanf( mImportFile, "%lf", &lRot[0] );
fscanf( mImportFile, "%lf", &lRot[1] );
fscanf( mImportFile, "%lf", &lRot[2] );
fscanf( mImportFile, "%lf", &lSca[0] );
fscanf( mImportFile, "%lf", &lSca[1] );
fscanf( mImportFile, "%lf", &lSca[2] );
lFBTime.SetSecondDouble( lTime );
for( k=0; k<3; k++)
{
lPosNode = FindAnimationNode( lPosVNode, lXYZ[k] );
lRotNode = FindAnimationNode( lRotVNode, lXYZ[k] );
lScaNode = FindAnimationNode( lScaVNode, lXYZ[k] );
lPosFCurve = (FBFCurve*) lPosNode->FCurve;
lRotFCurve = (FBFCurve*) lRotNode->FCurve;
lScaFCurve = (FBFCurve*) lScaNode->FCurve;
lPosFCurve->KeyAdd( lFBTime, lPos[k] );
lRotFCurve->KeyAdd( lFBTime, lRot[k] );
lScaFCurve->KeyAdd( lFBTime, lSca[k] );
lPosNode->FCurve = lPosFCurve;
lRotNode->FCurve = lRotFCurve;
lScaNode->FCurve = lScaFCurve;
}
}
lCamera->Show = true;
}
fclose( mImportFile );
}
FBAnimationNode* ORCameraEngine::FindAnimationNode( FBAnimationNode* pNode, const char* pNodeName )
{
FBAnimationNode* lNode =
NULL;
FBString lName;
for( i=0; i<pNode->Nodes.GetCount(); i++)
{
lName = pNode->Nodes[
i]->Name;
if( lName == pNodeName )
{
break;
}
}
return lNode;
}
void ORCameraEngine::Export(char* pFilename)
{
int lIdx;
int lFirstUserCameraIndex = 7;
mExportFile.Open( pFilename );
mExportFile.SectionOpen( "Cameras" );
{
if( mExportProperties )
{
mExportFile.SectionOpen( "Camera Information" );
{
for( lIdx = lFirstUserCameraIndex; lIdx < mSystem.Scene->Cameras.GetCount(); ++lIdx )
{
ExportCameraInfo( mSystem.Scene->Cameras[lIdx] );
}
}
mExportFile.SectionClose();
}
if( mExportAnimation )
{
mExportFile.SectionOpen( "Camera Animation (FCurves)" );
{
for( lIdx = lFirstUserCameraIndex; lIdx < mSystem.Scene->Cameras.GetCount(); ++lIdx )
{
ExportCameraFCurves( mSystem.Scene->Cameras[lIdx] );
}
}
mExportFile.SectionClose();
}
if( mExportMesh )
{
mExportFile.SectionOpen( "Camera mesh information" );
{
for( lIdx=lFirstUserCameraIndex; lIdx < mSystem.Scene->Cameras.GetCount(); ++lIdx )
{
ExportMesh( mSystem.Scene->Cameras[lIdx] );
}
}
}
}
mExportFile.SectionClose();
mExportFile.Close();
}
void ORCameraEngine::ExportCameraInfo( FBCamera* pCamera )
{
mExportFile.SectionOpen( pCamera->Name );
{
ExportPropertyList( pCamera );
}
mExportFile.SectionClose();
}
void ORCameraEngine::ExportCameraFCurves( FBCamera* pCamera )
{
mExportFile.SectionOpen( pCamera->Name );
{
ExportFCurves( pCamera->AnimationNode );
}
mExportFile.SectionClose();
}
void ORCameraEngine::ExportMesh( FBModel* pModel )
{
FBMesh* lMesh = pModel->TessellatedMesh;
FBString lLabelMesh( pModel->Name);
lLabelMesh += "_Mesh";
if( lMesh->VertexCount() )
{
mExportFile.SectionOpen( lLabelMesh );
{
for( i=0; i<lMesh->VertexCount(); i++ )
{
lVertex = lMesh->VertexGet(i);
lNormal = lMesh->VertexNormalGet(i);
lUV = lMesh->VertexUVGet(i);
fprintf( mExportFile.GetIndentFile(), "Vertex %d:\tV(%f,%f,%f) N(%f,%f,%f) UV(%f,%f)\n",
lVertex[0], lVertex[1], lVertex[2],
lNormal[0], lNormal[1], lNormal[2],
lUV[0], lUV[1] );
}
}
mExportFile.SectionClose();
}
}
void ORCameraEngine::ExportFCurves( FBAnimationNode* pNode )
{
if( pNode->Nodes.GetCount() == 0 )
{
ExportFCurve( pNode );
}
else
{
mExportFile.SectionOpen( pNode->Name );
for( i=0;i<pNode->Nodes.GetCount(); i++ )
{
ExportFCurves( pNode->Nodes[i] );
}
mExportFile.SectionClose();
}
}
void ORCameraEngine::ExportFCurve( FBAnimationNode* pNode )
{
FBFCurve* lFCurve = (FBFCurve*) pNode->FCurve;
if( lFCurve )
{
fprintf( mExportFile.GetIndentFile(), "%s\t", (const char*)pNode->Name );
for( i=0; i<lFCurve->Keys.GetCount(); i++)
{
fprintf( mExportFile.GetFile(),
"(%lf, %lf), ", (double)((FBTime)lFCurve->Keys[
i].Time).GetSecondDouble(), (double)lFCurve->Keys[i].Value );
}
fprintf( mExportFile.GetFile(), "\n" );
}
}
void ORCameraEngine::ExportPropertyList( FBComponent* pComponent )
{
FBProperty* lProperty;
FBString lString;
for( i=0;i<pComponent->PropertyList.GetCount();i++)
{
lProperty = pComponent->PropertyList[
i];
lString = lProperty->AsString() ? lProperty->AsString():"***NoStringVersion***";
fprintf( mExportFile.GetIndentFile(), "%s\t%s\n", (char*)lProperty->GetName(), (char*)lString );
}
}