Main Page   Modules   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members   Related Pages  

/home/rdbrown/doxygen/cse125g1/IGameExporter/IGameExporter.cpp

00001 /**********************************************************************
00002  *<
00003         FILE: IGameExporter.cpp
00004 
00005         DESCRIPTION:    Sample to test the IGame Interfaces.  It follows a similar format
00006                                         to the Ascii Exporter.  However is does diverge a little in order
00007                                         to handle properties etc..
00008 
00009         TODO: Break the file down into smaller chunks for easier loading.
00010 
00011         CREATED BY:             Neil Hazzard    
00012 
00013         HISTORY:                parttime coding Summer 2002
00014 
00015  *>     Copyright (c) 2002, All Rights Reserved.
00016  **********************************************************************/
00017 
00018 #include "msxml2.h"
00019 #include "IGameExporter.h"
00020 #include "XMLUtility.h"
00021 #include "decomp.h"
00022 
00023 #include "IGame.h"
00024 #include "IGameObject.h"
00025 #include "IGameProperty.h"
00026 #include "IGameControl.h"
00027 #include "IGameModifier.h"
00028 #include "IConversionManager.h"
00029 #include "IGameError.h"
00030 
00031 #include <vector>
00032 using namespace std;
00033 
00034 
00035 #define IGAMEEXPORTER_CLASS_ID  Class_ID(0x79d613a4, 0x4f21c3ad)
00036 
00037 #define BEZIER  0
00038 #define TCB             1
00039 #define LINEAR  2
00040 #define SAMPLE  3
00041 
00042 
00043 class IGameExporter : public SceneExport {
00044         public:
00045 
00046                 FILE *outfile;
00047                 IGameScene * pIgame;
00048 
00049                 IXMLDOMDocument * pXMLDoc;
00050                 IXMLDOMNode * pRoot;            //this is our root node         
00051                 CComPtr<IXMLDOMNode> iGameNode; //the IGame child - which is the main node
00052                 CComPtr<IXMLDOMNode> rootNode;
00053                 static HWND hParams;
00054 
00055                 int curNode;
00056 
00057                 int staticFrame;
00058                 int framePerSample;
00059                 BOOL exportGeom;
00060                 BOOL exportNormals;
00061                 BOOL exportVertexColor;
00062                 BOOL exportControllers;
00063                 BOOL exportFaceSmgp;
00064                 BOOL exportTexCoords;
00065                 BOOL exportMappingChannel;
00066                 BOOL exportConstraints;
00067                 BOOL exportMaterials;
00068                 BOOL exportSplines;
00069                 BOOL exportModifiers;
00070                 BOOL exportSkin;
00071                 BOOL exportGenMod;
00072                 BOOL forceSample;
00073                 BOOL splitFile;
00074                 BOOL exportQuaternions;
00075                 BOOL exportObjectSpace;
00076                 BOOL exportRelative;
00077                 BOOL exportNormalsPerFace;
00078                 int cS;
00079                 int exportCoord;
00080                 bool showPrompts;
00081                 bool exportSelected;
00082 
00083                 TSTR splitPath;
00084 
00085                 float version;
00086 
00087 
00088 
00089                 int                             ExtCount();                                     // Number of extensions supported
00090                 const TCHAR *   Ext(int n);                                     // Extension #n (i.e. "3DS")
00091                 const TCHAR *   LongDesc();                                     // Long ASCII description (i.e. "Autodesk 3D Studio File")
00092                 const TCHAR *   ShortDesc();                            // Short ASCII description (i.e. "3D Studio")
00093                 const TCHAR *   AuthorName();                           // ASCII Author name
00094                 const TCHAR *   CopyrightMessage();                     // ASCII Copyright message
00095                 const TCHAR *   OtherMessage1();                        // Other message #1
00096                 const TCHAR *   OtherMessage2();                        // Other message #2
00097                 unsigned int    Version();                                      // Version number * 100 (i.e. v3.01 = 301)
00098                 void                    ShowAbout(HWND hWnd);           // Show DLL's "About..." box
00099 
00100                 //BOOL SupportsOptions(int ext, DWORD options);
00101                 int     DoExport(const TCHAR *name,ExpInterface *ei,Interface *i, BOOL suppressPrompts=FALSE, DWORD options=0);
00102 
00103                 
00104                 void ExportSceneInfo();
00105                 void ExportNodeInfo(IGameNode * node);
00106                 void ExportChildNodeInfo(IGameNode * child);
00107                 void ExportMaterials();
00108                 void ExportPositionControllers(CComPtr<IXMLDOMNode> node, IGameControl * cont);
00109                 void ExportRotationControllers(CComPtr<IXMLDOMNode> node, IGameControl * cont);
00110                 void ExportScaleControllers(CComPtr<IXMLDOMNode> node, IGameControl * cont);
00111                 void ExportControllers(CComPtr<IXMLDOMNode> node, IGameControl * cont);
00112 
00113                 void DumpMaterial(CComPtr<IXMLDOMNode> node,IGameMaterial * mat, int index, int matID = -1);
00114                 void DumpTexture(CComPtr<IXMLDOMNode> node,IGameMaterial * mat);
00115                 void DumpBezierKeys(DWORD Type, IGameKeyTab Keys, CComPtr<IXMLDOMNode> prsData);
00116                 void DumpTCBKeys(DWORD Type, IGameKeyTab Keys, CComPtr<IXMLDOMNode> prsData);
00117                 void DumpLinearKeys(DWORD Type, IGameKeyTab Keys, CComPtr<IXMLDOMNode> prsData);
00118                 void DumpConstraints(CComPtr<IXMLDOMNode> prsData, IGameConstraint * c);
00119                 void DumpModifiers(CComPtr<IXMLDOMNode> prsData, IGameModifier * m);
00120                 void DumpSkin(CComPtr<IXMLDOMNode> modNode, IGameSkin * s);
00121                 void DumpIKChain(IGameIKChain * ikch, CComPtr<IXMLDOMNode> ikData);
00122 
00123                 void DumpEulerController(IGameControl * sc,CComPtr<IXMLDOMNode> prsNode);
00124                 void DumpProperties(CComPtr<IXMLDOMNode> node, IGameProperty * prop);
00125                 void DumpMesh(IGameMesh *gm,CComPtr<IXMLDOMNode> geomData);
00126                 void DumpSpline(IGameSpline *sp,CComPtr<IXMLDOMNode> splineData);
00127                 void DumpLight(IGameLight *lt, CComPtr<IXMLDOMNode> parent);
00128                 void DumpCamera(IGameCamera *ca, CComPtr<IXMLDOMNode> parent);
00129                 void DumpGenericFace(IGameMesh * gm,FaceEx *fe, CComPtr<IXMLDOMNode> faceData, bool smgrp, bool n, bool vc, bool tv);
00130                 void DumpSampleKeys(IGameControl * sc,CComPtr<IXMLDOMNode> prsNode, DWORD Type, bool quick = false);
00131                 void DumpListController(IGameControl * sc,CComPtr<IXMLDOMNode> listNode);
00132                 void DumpMatrix(Matrix3 tm,CComPtr<IXMLDOMNode> parent);
00133 
00134 
00135                 void MakeSplitFilename(IGameNode * node, TSTR & buf);
00136                 BOOL ReadConfig();
00137                 void WriteConfig();
00138                 TSTR GetCfgFilename();
00139                 IGameExporter();
00140                 ~IGameExporter();
00141 
00142                 //good stuff
00143                 IGameMesh *mesh;
00144                 IGameNode *skel;
00145                 IGameSkin *skin;
00146                 vector<IGameKeyTab> boneKeys;
00147                 void ExportMesh();
00148                 void ExportSkeleton(IGameNode *bone);
00149                 void ExportAnimation();
00150                 int RecursiveChildCount(IGameNode *node, int count);
00151                 int *boneIndices;
00152                 int numBones, currBone;
00153 };
00154 
00155 
00156 class IGameExporterClassDesc:public ClassDesc2 {
00157         public:
00158         int                     IsPublic() { return TRUE; }
00159         void *                  Create(BOOL loading = FALSE) { return new IGameExporter(); }
00160         const TCHAR *   ClassName() { return GetString(IDS_CLASS_NAME); }
00161         SClass_ID               SuperClassID() { return SCENE_EXPORT_CLASS_ID; }
00162         Class_ID                ClassID() { return IGAMEEXPORTER_CLASS_ID; }
00163         const TCHAR*    Category() { return GetString(IDS_CATEGORY); }
00164 
00165         const TCHAR*    InternalName() { return _T("IGameExporter"); }  // returns fixed parsable name (scripter-visible name)
00166         HINSTANCE               HInstance() { return hInstance; }                               // returns owning module handle
00167 
00168 };
00169 
00170 
00171 
00172 static IGameExporterClassDesc IGameExporterDesc;
00173 ClassDesc2* GetIGameExporterDesc() { return &IGameExporterDesc; }
00174 
00175 int numVertex;
00176 
00177 void stripWhiteSpace(TSTR * buf, TCHAR &newBuf)
00178 {
00179 
00180         TCHAR newb[256]={""};
00181         strcpy(newb,buf->data());
00182 
00183         int len = strlen(newb);
00184 
00185         int index = 0;
00186 
00187         for(int i=0;i<len;i++)
00188         {
00189                 if((newb[i] != ' ') && (!ispunct(newb[i])))
00190                         (&newBuf)[index++] = newb[i];
00191         }
00192 }
00193 int IGameExporter::RecursiveChildCount(IGameNode *node, int count)
00194 {
00195         int newBones = 1;
00196         for(int i = 0; i < node->GetChildCount(); i++)
00197                 newBones += RecursiveChildCount(node->GetNodeChild(i), count);
00198 
00199         return count+newBones;
00200 }
00201 void IGameExporter::ExportSkeleton(IGameNode *bone)
00202 {
00203         IGameObject * obj = bone->GetIGameObject();
00204         boneIndices[currBone] = bone->GetNodeID();
00205         currBone++;
00206         IGameKey xKey,yKey,zKey;
00207         GMatrix tm = bone->GetLocalTM();
00208         IGameControl *control = bone->GetIGameControl();
00209         fprintf(outfile,"bone %s\n",bone->GetName());
00210         fprintf(outfile,"offset %f %f %f\n",tm.GetRow(3).x,tm.GetRow(3).y,tm.GetRow(3).z);
00211         if(control)
00212         {       
00213                 IGameKeyTab keys;
00214                 float ex,ey,ez;
00215                 control->GetFullSampledKeys(keys,1,IGAME_ROT,false);
00216                 keys[0].sampleKey.qval.GetEuler(&ex,&ey,&ez);
00217                 fprintf(outfile,"pose %f %f %f\n",ex,ey,ez);
00218                 boneKeys.push_back(keys);
00219         }
00220         if(skin)
00221         {       
00222                 skin->GetInitBoneTM(bone,tm);
00223                 for(int i = 0; i < 4; i++)
00224                         fprintf(outfile,"%f %f %f\n",tm.GetRow(i).x,tm.GetRow(i).y,tm.GetRow(i).z);
00225         }
00226         for(int i = 0; i < bone->GetChildCount(); i++)
00227                 ExportSkeleton(bone->GetNodeChild(i));
00228         fprintf(outfile,"endbone\n");
00229 }
00230 void IGameExporter::ExportMesh()
00231 {
00232         mesh->SetCreateOptimizedNormalList();
00233         if(!mesh->InitializeData())
00234                 return;
00235         int numVerts = mesh->GetNumberOfNormals();
00236         int numFaces = mesh->GetNumberOfFaces();
00237         fprintf(outfile,"mesh\n");
00238         fprintf(outfile,"scale 0.0133\n");
00239         fprintf(outfile,"verts\n");
00240         fprintf(outfile,"%d\n", numVerts);
00241 
00242         Point3 currVert;
00243         for(int i = 0; i < numVerts; i++)
00244         {
00245                 int currVertIndex = 0;
00246                 for(int j = 0; j < numFaces; j++)
00247                 {
00248                         FaceEx *face = mesh->GetFace(j);
00249                         if(face->norm[0] == i) { currVertIndex = face->vert[0]; break; }
00250                         if(face->norm[1] == i) { currVertIndex = face->vert[1]; break; }
00251                         if(face->norm[2] == i) { currVertIndex = face->vert[2]; break; }
00252                 }
00253                 //figure out which tex coord goes with this normal
00254                 int currTexIndex = 0;
00255                 for(int j = 0; j < numFaces; j++)
00256                 {
00257                         FaceEx *face = mesh->GetFace(j);
00258                         if(face->norm[0] == i) { currTexIndex = face->texCoord[0]; break; }
00259                         if(face->norm[1] == i) { currTexIndex = face->texCoord[1]; break; }
00260                         if(face->norm[2] == i) { currTexIndex = face->texCoord[2]; break; }
00261                 }
00262                 //output the vert
00263                 mesh->GetVertex(currVertIndex,currVert,true);
00264                 fprintf(outfile,"%f %f %f ",currVert.x, currVert.y, currVert.z);
00265                 if(skin)
00266                 {
00267                         int numWeights = skin->GetNumberOfBones(currVertIndex);
00268                         fprintf(outfile,"%d ",numWeights);
00269                         //output the bones and weights
00270                         for(int j = 0; j < numWeights; j++)
00271                         {
00272                                 int boneIndex = skin->GetBoneID(currVertIndex,j);
00273                                 //find bone index
00274                                 for(int k = 0; k < numBones; k++)
00275                                         if(boneIndices[k] == boneIndex)
00276                                         {
00277                                                 boneIndex = k;
00278                                                 break;
00279                                         }
00280                                 fprintf(outfile,"%d %f ",boneIndex,skin->GetWeight(currVertIndex,j));
00281                         }
00282                         fprintf(outfile,"\n");
00283                 }
00284                 else fprintf(outfile,"0\n");
00285                 //output tex coords
00286                 Point2 texCoords;
00287                 mesh->GetTexVertex(currTexIndex,texCoords);
00288                 fprintf(outfile,"%f %f\n",texCoords.x,texCoords.y);
00289                 //output normal
00290                 Point3 currNorm;
00291                 mesh->GetNormal(i,currNorm);
00292                 fprintf(outfile,"%f %f %f\n",currNorm.x, currNorm.y, currNorm.z);
00293         }
00294 
00295         //fprintf(outfile,"texture\n");
00296         //fprintf(outfile,"%s\n",mesh->GetMaterialFromFace(0)->GetIGameTextureMap(0)->GetBitmapFileName());
00297 
00298         fprintf(outfile,"faces\n");
00299         fprintf(outfile,"%d\n", numFaces);
00300         FaceEx *currFace;
00301         for(int i = 0; i < numFaces; i++)
00302         {
00303                 currFace = mesh->GetFace(i);
00304                 fprintf(outfile,"%d %d %d %d %d %d\n",currFace->vert[0],currFace->vert[1],currFace->vert[2],
00305                                                                                         currFace->norm[0],currFace->norm[1],currFace->norm[2]);
00306         }
00307 }
00308 
00309 void IGameExporter::ExportAnimation()
00310 {
00311         float ex,ey,ez;
00312         int numKeys = boneKeys[0].Count();
00313         fprintf(outfile,"keyframes %d\n", numKeys);
00314         IGameControl *control = skel->GetIGameControl();
00315         IGameKeyTab rootTranslation;
00316         if(control)
00317         {       
00318                 fprintf(outfile,"roottranslation\n");
00319                 float ex,ey,ez;
00320                 control->GetFullSampledKeys(rootTranslation,1,IGAME_POS,false);
00321         }
00322         fprintf(outfile,"numbones %d\n", numBones);
00323         for(int j = 0; j < numKeys; j++)
00324         {
00325                 fprintf(outfile,"time %f\n",0.05f*(float)j);
00326                 if(control)
00327                 {
00328                         Point3 pval = rootTranslation[j].sampleKey.pval;
00329                         fprintf(outfile,"%f %f %f\n",pval.x,pval.y,pval.z);
00330                 }
00331                 for(int i = 0; i < boneKeys.size(); i++)
00332                 {
00333                         boneKeys[i][j].sampleKey.qval.GetEuler(&ex,&ey,&ez);
00334                         fprintf(outfile,"%f %f %f\n",ex,ey,ez);
00335                 }
00336         }
00337 
00338 }
00339 //--- IGameExporter -------------------------------------------------------
00340 IGameExporter::IGameExporter()
00341 {
00342 
00343         staticFrame = 0;
00344         framePerSample = 4;
00345         exportGeom = TRUE;
00346         exportNormals = TRUE;
00347         exportVertexColor = FALSE;
00348         exportControllers = FALSE;
00349         exportFaceSmgp = FALSE;
00350         exportTexCoords = TRUE;
00351         exportMappingChannel = FALSE;
00352         exportMaterials = TRUE;
00353         exportConstraints = FALSE;
00354         exportSplines = FALSE;
00355         exportModifiers = FALSE;
00356         forceSample = FALSE;
00357         exportSkin = TRUE;
00358         exportGenMod = FALSE;
00359         cS = 0; //max default
00360         pRoot = NULL;
00361         pXMLDoc = NULL;
00362         splitFile = TRUE;
00363         exportQuaternions = TRUE;
00364         exportObjectSpace = FALSE;
00365         exportRelative = FALSE;
00366         exportNormalsPerFace = FALSE;
00367 
00368 }
00369 
00370 IGameExporter::~IGameExporter() 
00371 {
00372         iGameNode = NULL;
00373         if(pRoot)
00374                 pRoot->Release(); 
00375         pRoot = NULL;
00376         if(pXMLDoc)
00377                 pXMLDoc->Release();
00378         
00379         pXMLDoc = NULL;
00380 }
00381 
00382 int IGameExporter::ExtCount()
00383 {
00384         //TODO: Returns the number of file name extensions supported by the plug-in.
00385         return 1;
00386 }
00387 
00388 const TCHAR *IGameExporter::Ext(int n)
00389 {               
00390         //TODO: Return the 'i-th' file name extension (i.e. "3DS").
00391         return _T("mma");
00392 }
00393 
00394 const TCHAR *IGameExporter::LongDesc()
00395 {
00396         //TODO: Return long ASCII description (i.e. "Targa 2.0 Image File")
00397         return _T("Merry Men Animation");
00398 }
00399         
00400 const TCHAR *IGameExporter::ShortDesc() 
00401 {                       
00402         //TODO: Return short ASCII description (i.e. "Targa")
00403         return _T("Merry Men Animation");
00404 }
00405 
00406 const TCHAR *IGameExporter::AuthorName()
00407 {                       
00408         //TODO: Return ASCII Author name
00409         return _T("Ryan Brown");
00410 }
00411 
00412 const TCHAR *IGameExporter::CopyrightMessage() 
00413 {       
00414         // Return ASCII Copyright message
00415         return _T("You can't use this, jackface.");
00416 }
00417 
00418 const TCHAR *IGameExporter::OtherMessage1() 
00419 {               
00420         //TODO: Return Other message #1 if any
00421         return _T("Moron.");
00422 }
00423 
00424 const TCHAR *IGameExporter::OtherMessage2() 
00425 {               
00426         //TODO: Return other message #2 in any
00427         return _T("Don't read this.");
00428 }
00429 
00430 unsigned int IGameExporter::Version()
00431 {                               
00432         //TODO: Return Version number * 100 (i.e. v3.01 = 301)
00433         return 1;
00434 }
00435 
00436 void IGameExporter::ShowAbout(HWND hWnd)
00437 {                       
00438         // Optional
00439 }
00440 
00441 void IGameExporter::MakeSplitFilename(IGameNode * node, TSTR & buf)
00442 {
00443         buf = splitPath;
00444         buf = buf + "\\" + node->GetName() + ".xml";
00445         
00446 }
00447 
00448 void IGameExporter::ExportSceneInfo()
00449 {
00450         TSTR buf;
00451         CComPtr <IXMLDOMNode> sceneNode;
00452         CComPtr <IXMLDOMNode> tempNode;
00453 
00454         struct tm *newtime;
00455         time_t aclock;
00456 
00457         time( &aclock );
00458         newtime = localtime(&aclock);
00459 
00460         TSTR today = _tasctime(newtime);        // The date string has a \n appended.
00461         today.remove(today.length()-1);         // Remove the \n
00462 
00463         CreateXMLNode(pXMLDoc, pRoot, _T("IGame"), &iGameNode);
00464         AddXMLAttribute(iGameNode, _T("Version"), _T("1.0"));
00465         AddXMLAttribute(iGameNode, _T("Date"), today.data());
00466         
00467         CreateXMLNode(pXMLDoc,iGameNode,_T("SceneInfo"),&sceneNode);
00468 
00469         CreateXMLNode(pXMLDoc,sceneNode,_T("Info"),&tempNode);
00470         AddXMLAttribute(tempNode,_T("FileName"),const_cast<TCHAR*>(pIgame->GetSceneFileName()));
00471         tempNode = NULL;
00472 
00473         CreateXMLNode(pXMLDoc,sceneNode,_T("Info"),&tempNode);
00474         buf.printf("%d",pIgame->GetSceneStartTime() / pIgame->GetSceneTicks());
00475         AddXMLAttribute(tempNode,_T("StartFrame"),buf.data());
00476         tempNode = NULL;
00477         
00478         CreateXMLNode(pXMLDoc,sceneNode,_T("Info"),&tempNode);
00479         buf.printf("%d",pIgame->GetSceneEndTime()/pIgame->GetSceneTicks());
00480         AddXMLAttribute(tempNode,_T("EndFrame"),buf.data());
00481         tempNode = NULL;
00482         
00483         CreateXMLNode(pXMLDoc,sceneNode,_T("Info"),&tempNode);
00484         buf.printf("%d",GetFrameRate());
00485         AddXMLAttribute(tempNode,_T("FrameRate"),buf.data());
00486         tempNode = NULL;
00487         
00488         CreateXMLNode(pXMLDoc,sceneNode,_T("Info"),&tempNode);
00489         buf.printf("%d",pIgame->GetSceneTicks());
00490         AddXMLAttribute(tempNode,_T("TicksPerFrame"),buf.data());
00491         tempNode = NULL;
00492 
00493         CreateXMLNode(pXMLDoc,sceneNode,_T("Info"),&tempNode);
00494         if(cS == 0)
00495                 buf = TSTR("3dsmax");
00496         if(cS == 1)
00497                 buf = TSTR("directx");
00498         if(cS == 2)
00499                 buf = TSTR("opengl");
00500 
00501         AddXMLAttribute(tempNode,_T("CoordinateSystem"),buf.data());
00502 
00503         sceneNode = NULL;
00504         tempNode = NULL;
00505 
00506 
00507 }
00508 
00509 void IGameExporter::ExportChildNodeInfo(IGameNode * child)
00510 {
00511         if(child->IsGroupOwner())
00512         {
00513 
00514         }
00515         else
00516         {
00517                 IGameObject * obj = child->GetIGameObject();
00518                 //fprintf(outfile,"node %s\n",child->GetName());
00519                 switch(obj->GetIGameType())
00520                 {
00521                         
00522                         case IGameObject::IGAME_BONE:
00523                         {
00524                                 skel = child;
00525                                 break;
00526                         }
00527 
00528 
00529                         case IGameObject::IGAME_MESH:
00530                         {
00531                                 if(child->GetChildCount() == 0)
00532                                 {
00533                                         mesh = (IGameMesh*)obj;
00534                                         skin = mesh->GetIGameSkin();
00535                                 }
00536                                 else
00537                                 {
00538                                         fprintf(outfile,"this skel is a mesh\n");
00539                                         skel = child;
00540                                 }
00541                                 break;
00542                         }
00543                 }
00544 
00545                 /*
00546                 if(splitFile)
00547                 {
00548                         TSTR buf;
00549                         MakeSplitFilename(child,buf);
00550                         pSubDocMesh->save(CComVariant(buf.data()));
00551 
00552                 }
00553                 //dump PRS Controller data
00554                 prsNode = NULL;
00555 
00556                 // In our "Game Engine" we deal with Bezier Position, Scale and TCB Rotation controllers !!
00557                 // Only list controllers on position, rotation...
00558                 if(exportControllers)
00559                 {
00560                         CComPtr<IXMLDOMNode>subContNode;
00561                         bool exportBiped = false;
00562                         CreateXMLNode(pXMLDoc,parent,_T("PRSData"),&prsNode);
00563                         IGameControl * pGameControl = child->GetIGameControl();
00564                         ExportControllers(prsNode,pGameControl);
00565 
00566                 }
00567 
00568                 if(exportModifiers)
00569                 {
00570                         int numMod = obj->GetNumModifiers();
00571                         if(numMod > 0)
00572                         {
00573                                 CComPtr <IXMLDOMNode> mod;
00574                                 CreateXMLNode(pXMLDoc,parent,_T("Modifiers"),&mod);
00575                                 TSTR Buf;
00576                                 buf.printf("%d",numMod);
00577                                 AddXMLAttribute(mod,_T("count"),buf.data());
00578 
00579                                 for(int i=0;i<numMod;i++)
00580                                 {
00581                                         IGameModifier * m = obj->GetIGameModifier(i);
00582                                         DumpModifiers(mod,m);
00583                                 }
00584                         }
00585                 }
00586                 */
00587         }       
00588         /*
00589         for(int i=0;i<child->GetChildCount();i++)
00590         {
00591                 IGameNode * newchild = child->GetNodeChild(i);
00592                 // we deal with targets in the light/camera section
00593                 if(newchild->IsTarget())
00594                         continue;
00595 
00596                 ExportChildNodeInfo(newchild);
00597         }
00598 
00599         child->ReleaseIGameObject();
00600         */
00601 }
00602 
00603 
00604 void IGameExporter::ExportControllers(CComPtr<IXMLDOMNode> node, IGameControl * pGameControl)
00605 {
00606         ExportPositionControllers(node,pGameControl);
00607         ExportRotationControllers(node,pGameControl);
00608         ExportScaleControllers(node,pGameControl);
00609 }
00610 
00611 void IGameExporter::ExportPositionControllers(CComPtr<IXMLDOMNode> node, IGameControl * pGameControl)
00612 {
00613         IGameKeyTab poskeys;
00614         bool exportBiped = false;
00615 
00616 
00617         IGameControl::MaxControlType T = pGameControl->GetControlType(IGAME_POS);
00618 
00619         //position
00620         if(T==IGameControl::IGAME_MAXSTD && pGameControl->GetBezierKeys(poskeys,IGAME_POS) && !forceSample)
00621                 DumpBezierKeys(IGAME_POS,poskeys,node);
00622 
00623         else if(T==IGameControl::IGAME_MAXSTD && pGameControl->GetLinearKeys(poskeys,IGAME_POS) && !forceSample)
00624                 DumpLinearKeys(IGAME_POS,poskeys,node);
00625 
00626         else if(T==IGameControl::IGAME_POS_CONSTRAINT && !forceSample)
00627         {
00628                 IGameConstraint * cnst = pGameControl->GetConstraint(IGAME_POS);
00629                 DumpConstraints(node,cnst);
00630         }
00631         else if(T==IGameControl::IGAME_LIST && !forceSample)
00632         {
00633                 DumpListController(pGameControl,node);
00634 
00635         }
00636         else if(T==IGameControl::IGAME_BIPED)
00637                 exportBiped = true;
00638         else
00639         {
00640                 if(forceSample || T==IGameControl::IGAME_UNKNOWN)
00641                         DumpSampleKeys(pGameControl,node,IGAME_POS);
00642         }
00643         if(exportBiped)
00644                 DumpSampleKeys(pGameControl,node,IGAME_TM);
00645                 
00646 }
00647 
00648 void IGameExporter::ExportRotationControllers(CComPtr<IXMLDOMNode> node, IGameControl * pGameControl)
00649 {
00650 
00651         IGameKeyTab rotkeys;
00652         bool exportBiped = false;
00653         bool exported = false;          //this will at least export something !!
00654 
00655         //rotation
00656         IGameControl::MaxControlType T = pGameControl->GetControlType(IGAME_ROT);
00657 
00658         if(T==IGameControl::IGAME_MAXSTD && pGameControl->GetTCBKeys(rotkeys,IGAME_ROT) && !forceSample)
00659         {
00660                 DumpTCBKeys(IGAME_ROT,rotkeys,node);
00661                 exported = true;
00662         }
00663         else if(T==IGameControl::IGAME_MAXSTD && pGameControl->GetLinearKeys(rotkeys,IGAME_ROT) && !forceSample)
00664         {
00665                 DumpLinearKeys(IGAME_ROT,rotkeys,node);
00666                 exported = true;
00667         }
00668         else if(T==IGameControl::IGAME_MAXSTD && pGameControl->GetBezierKeys(rotkeys,IGAME_ROT) && !forceSample)
00669         {
00670                 DumpBezierKeys(IGAME_ROT,rotkeys,node);
00671                 exported = true;
00672         }
00673         else if(T==IGameControl::IGAME_ROT_CONSTRAINT && !forceSample)
00674         {
00675                 IGameConstraint * cnst = pGameControl->GetConstraint(IGAME_ROT);
00676                 DumpConstraints(node,cnst);
00677                 exported = true;
00678         }
00679         else if(T==IGameControl::IGAME_LIST&& !forceSample)
00680         {
00681                 DumpListController(pGameControl,node);
00682                 exported = true;
00683 
00684         }
00685         else if(T==IGameControl::IGAME_EULER&& !forceSample)
00686         {
00687                 DumpEulerController(pGameControl,node);
00688                 exported = true;
00689         }
00690 
00691         else if(T==IGameControl::IGAME_BIPED)
00692         {
00693                 exportBiped = true;
00694                 exported = true;
00695         }
00696 
00697         else
00698         {
00699                 if(forceSample || !exported || T==IGameControl::IGAME_UNKNOWN)
00700                         DumpSampleKeys(pGameControl,node, IGAME_ROT);
00701         }
00702         if(exportBiped)
00703                 DumpSampleKeys(pGameControl,node,IGAME_TM);
00704 }
00705 
00706 void IGameExporter::ExportScaleControllers(CComPtr<IXMLDOMNode> node, IGameControl * pGameControl)
00707 {
00708         IGameKeyTab scalekeys;
00709         bool exportBiped = false;
00710 
00711 
00712         //scale
00713         IGameControl::MaxControlType T= pGameControl->GetControlType(IGAME_SCALE);
00714 
00715         if(T==IGameControl::IGAME_MAXSTD && pGameControl->GetBezierKeys(scalekeys,IGAME_SCALE) && !forceSample)
00716                 DumpBezierKeys(IGAME_SCALE,scalekeys,node);
00717         else if(T==IGameControl::IGAME_BIPED)
00718                 exportBiped = true;
00719         else
00720         {
00721                 if(forceSample || T==IGameControl::IGAME_UNKNOWN)
00722                         DumpSampleKeys(pGameControl,node, IGAME_SCALE);
00723         }
00724 
00725         if(exportBiped)
00726                 DumpSampleKeys(pGameControl,node,IGAME_TM);
00727 
00728 
00729         
00730 }
00731 
00732 void IGameExporter::DumpMatrix(Matrix3 tm,CComPtr<IXMLDOMNode> parent)
00733 {
00734         CComPtr <IXMLDOMNode> tmNode;
00735         AffineParts ap;
00736         float rotAngle;
00737         Point3 rotAxis;
00738         float scaleAxAngle;
00739         Point3 scaleAxis;
00740         Matrix3 m = tm;
00741         TSTR Buf;
00742         
00743         decomp_affine(m, &ap);
00744 
00745         // Quaternions are dumped as angle axis.
00746         AngAxisFromQ(ap.q, &rotAngle, rotAxis);
00747         AngAxisFromQ(ap.u, &scaleAxAngle, scaleAxis);
00748 
00749 //      CreateXMLNode(pXMLDoc,parent,_T("NodeTM"),&tmNodeParent);
00750         CreateXMLNode(pXMLDoc,parent,_T("Translation"),&tmNode);
00751         Buf.printf("%f %f %f",ap.t.x,ap.t.y,ap.t.z);
00752         AddXMLText(pXMLDoc,tmNode,Buf.data());
00753         tmNode = NULL;
00754         CreateXMLNode(pXMLDoc,parent,_T("Rotation"),&tmNode);
00755         if(!exportQuaternions)
00756                 Buf.printf("%f %f %f %f",rotAxis.x, rotAxis.y, rotAxis.z, rotAngle);
00757         else
00758                 Buf.printf("%f %f %f %f",ap.q.x, ap.q.y, ap.q.z, ap.q.w);
00759 
00760         AddXMLText(pXMLDoc,tmNode,Buf.data());
00761         tmNode = NULL;
00762         CreateXMLNode(pXMLDoc,parent,_T("Scale"),&tmNode);
00763 
00764         Buf.printf("%f %f %f %f %f %f",ap.k.x, ap.k.y, ap.k.z, scaleAxis.x,scaleAxis.y,scaleAxis.z);
00765         AddXMLText(pXMLDoc,tmNode,Buf.data());
00766 
00767 
00768 }
00769 
00770 void GetKeyTypeName(TSTR &name, DWORD Type)
00771 {
00772         if(Type==IGAME_POS)
00773                 name.printf("Position");
00774         else if(Type==IGAME_ROT)
00775                 name.printf("Rotation");
00776         else if(Type==IGAME_POINT3)
00777                 name.printf("Point3");
00778         else if(Type==IGAME_FLOAT)
00779                 name.printf("float");
00780         else if(Type==IGAME_SCALE)
00781                 name.printf("Scale");
00782         else if(Type == IGameConstraint::IGAME_PATH)
00783                 name.printf("Path");
00784         else if(Type == IGameConstraint::IGAME_POSITION)
00785                 name.printf("Position");
00786         else if(Type == IGameConstraint::IGAME_ORIENTATION)
00787                 name.printf("Orientation");
00788         else if (Type == IGameConstraint::IGAME_LOOKAT)
00789                 name.printf("lookAt");
00790         else if(Type == IGAME_TM)
00791                 name.printf("NodeTM");
00792         else if(Type == IGAME_EULER_X)
00793                 name.printf("EulerX");
00794         else if(Type == IGAME_EULER_Y)
00795                 name.printf("EulerY");
00796         else if(Type == IGAME_EULER_Z)
00797                 name.printf("EulerZ");
00798 
00799 
00800         else
00801                 name.printf("Huh!!");
00802 
00803 }
00804 
00805 void IGameExporter::DumpEulerController(IGameControl * sc,CComPtr<IXMLDOMNode> prsNode)
00806 {
00807         TSTR data;
00808         CComPtr <IXMLDOMNode> eulerNode = NULL;
00809 
00810         IGameKeyTab xCont,yCont,zCont;
00811 
00812         if(sc->GetBezierKeys(xCont,IGAME_EULER_X))
00813         {
00814                 if(eulerNode ==NULL)
00815                         CreateXMLNode(pXMLDoc,prsNode,_T("EulerController"),&eulerNode);
00816 
00817                 DumpBezierKeys(IGAME_EULER_X,xCont,eulerNode);
00818         }
00819 
00820         if(sc->GetBezierKeys(yCont,IGAME_EULER_Y))
00821         {
00822                 if(eulerNode ==NULL)
00823                         CreateXMLNode(pXMLDoc,prsNode,_T("EulerController"),&eulerNode);
00824                 
00825                 DumpBezierKeys(IGAME_EULER_Y,yCont,eulerNode);
00826                 
00827         }
00828 
00829         if(sc->GetBezierKeys(zCont,IGAME_EULER_Z))
00830         {
00831                 if(eulerNode ==NULL)
00832                         CreateXMLNode(pXMLDoc,prsNode,_T("EulerController"),&eulerNode);
00833                         
00834                 DumpBezierKeys(IGAME_EULER_Z,zCont,eulerNode);
00835                 
00836         }
00837         if(sc->GetLinearKeys(xCont,IGAME_EULER_X))
00838         {
00839                 if(eulerNode ==NULL)
00840                         CreateXMLNode(pXMLDoc,prsNode,_T("EulerController"),&eulerNode);
00841         
00842                 DumpLinearKeys(IGAME_EULER_X,xCont,eulerNode);
00843 
00844         }
00845 
00846         if(sc->GetLinearKeys(yCont,IGAME_EULER_Y))
00847         {
00848                 if(eulerNode ==NULL)
00849                         CreateXMLNode(pXMLDoc,prsNode,_T("EulerController"),&eulerNode);
00850                 
00851                 DumpLinearKeys(IGAME_EULER_Y,yCont,eulerNode);
00852                 
00853         }
00854 
00855         if(sc->GetLinearKeys(zCont,IGAME_EULER_Z))
00856         {
00857                 if(eulerNode ==NULL)
00858                         CreateXMLNode(pXMLDoc,prsNode,_T("EulerController"),&eulerNode);
00859                 
00860                 DumpLinearKeys(IGAME_EULER_Z,zCont,eulerNode);
00861         }
00862 
00863 }
00864 
00865 void IGameExporter::DumpListController(IGameControl * sc,CComPtr<IXMLDOMNode> prsNode)
00866 {
00867         TSTR data;
00868         CComPtr <IXMLDOMNode> posListNode,rotListNode;
00869         int subNum;
00870         subNum = sc->GetNumOfListSubControls(IGAME_POS);
00871         if(subNum)
00872         {
00873         data.printf("%d",subNum);
00874                 CreateXMLNode(pXMLDoc,prsNode,_T("PositionListController"),&posListNode);
00875                 AddXMLAttribute(posListNode,_T("NumSubController"),data.data());
00876                 for(int i=0;i<subNum;i++)
00877         {
00878                 IGameKeyTab SubCont;
00879                         IGameControl * sub = sc->GetListSubControl(i,IGAME_POS);
00880                         ExportPositionControllers(posListNode,sub);
00881 
00882                 }
00883         }
00884         subNum = sc->GetNumOfListSubControls(IGAME_ROT);
00885         if(subNum)
00886                 {
00887                 data.printf("%d",subNum);
00888                 CreateXMLNode(pXMLDoc,prsNode,_T("RotationListController"),&rotListNode);
00889                 AddXMLAttribute(rotListNode,_T("NumSubController"),data.data());
00890                 for(int i=0;i<subNum;i++)
00891                 {
00892                         IGameKeyTab SubCont;
00893                         IGameControl * sub = sc->GetListSubControl(i,IGAME_POS);
00894                         ExportRotationControllers(rotListNode,sub);
00895 
00896                 }
00897         }
00898 }
00899 
00900 void IGameExporter::DumpSampleKeys(IGameControl * sc,CComPtr<IXMLDOMNode> prsNode, DWORD Type, bool quick)
00901 {
00902         Tab<Matrix3>sKey;  
00903         Tab<GMatrix>gKey;
00904         IGameKeyTab Key;
00905         IGameControl * c = sc;
00906         CComPtr<IXMLDOMNode> sampleData;
00907         TSTR Buf;
00908         bool relative = false;
00909 
00910         TSTR name;
00911         GetKeyTypeName(name,Type);
00912         sampleData = NULL;
00913 
00914         if(!c)
00915                 return;
00916 
00917         relative = exportRelative ? true : false;
00918 
00919         if(!quick && c->GetFullSampledKeys(Key,framePerSample,IGameControlType(Type),relative) )
00920         {
00921 
00922                 CreateXMLNode(pXMLDoc,prsNode,name,&sampleData);
00923                 Buf.printf("%d",Key.Count());
00924                 AddXMLAttribute(sampleData,_T("KeyCount"),Buf.data());
00925                 AddXMLAttribute(sampleData,_T("Type"),_T("FullSampled"));
00926                 Buf.printf("%d",framePerSample);
00927                 AddXMLAttribute(sampleData,_T("SampleRate"),Buf.data());
00928 
00929                 for(int i=0;i<Key.Count();i++)
00930                 {
00931                         CComPtr<IXMLDOMNode> data;
00932                         CreateXMLNode(pXMLDoc,sampleData,_T("Sample"),&data);
00933                         int fc = Key[i].t;
00934                         Buf.printf("%d",fc);
00935                         AddXMLAttribute(data,_T("frame"),Buf.data());
00936 
00937                         if(Type ==IGAME_POS)
00938                         {
00939                                 Point3 k = Key[i].sampleKey.pval;
00940                                 Buf.printf("%f %f %f",k.x,k.y,k.z); 
00941                                 AddXMLText(pXMLDoc,data,Buf.data());
00942                         }
00943                         if(Type == IGAME_ROT)
00944                         {
00945                                 Quat q = Key[i].sampleKey.qval;
00946                                 AngAxis a(q);
00947                                 if(!exportQuaternions)
00948                                         Buf.printf("%f %f %f %f",a.axis.x, a.axis.y, a.axis.z, a.angle);
00949                                 else
00950                                         Buf.printf("%f %f %f %f",q.x,q.y, q.z, q.w);
00951 
00952                                 AddXMLText(pXMLDoc,data,Buf.data());
00953 
00954                         }
00955                         if(Type == IGAME_SCALE)
00956                         {
00957                                 ScaleValue sval = Key[i].sampleKey.sval;
00958                                 Point3 s = sval.s;
00959                                 AngAxis a(sval.q);
00960                                 if(!exportQuaternions)
00961                                         Buf.printf("%f %f %f %f %f %f %f",sval.s.x,sval.s.y,sval.s.z,a.axis.x, a.axis.y, a.axis.z, a.angle);
00962                                 else
00963                                         Buf.printf("%f %f %f %f %f %f %f",sval.s.x,sval.s.y,sval.s.z,sval.q.x, sval.q.y,sval.q.z, sval.q.w);
00964                                 AddXMLText(pXMLDoc,data,Buf.data());
00965 
00966                         }
00967                         if(Type == IGAME_FLOAT)
00968                         {
00969                                 float f = Key[i].sampleKey.fval;
00970                                 Buf.printf("%f",f);     
00971                                 AddXMLText(pXMLDoc,data,Buf.data());
00972                         }
00973                         if(Type == IGAME_TM)
00974                         {
00975                                 //Even though its a 4x4 we dump it as a 4x3 ;-)
00976                                 GMatrix m;
00977                                 DumpMatrix(Key[i].sampleKey.gval.ExtractMatrix3(),data);
00978                         }
00979                 }
00980         }
00981 
00982         //mainly for the IK On/Off controller
00983         if(quick && c->GetQuickSampledKeys(Key,IGameControlType(Type)) )
00984         {
00985 
00986                 CreateXMLNode(pXMLDoc,prsNode,name,&sampleData);
00987                 Buf.printf("%d",Key.Count());
00988                 AddXMLAttribute(sampleData,_T("KeyCount"),Buf.data());
00989                 AddXMLAttribute(sampleData,_T("Type"),_T("QuickSampled"));
00990 
00991                 for(int i=0;i<Key.Count();i++)
00992                 {
00993                         CComPtr<IXMLDOMNode> data;
00994                         CreateXMLNode(pXMLDoc,sampleData,_T("Sample"),&data);
00995                         int fc = Key[i].t;
00996                         Buf.printf("%d",fc);
00997                         AddXMLAttribute(data,_T("frame"),Buf.data());
00998                         if(Type == IGAME_FLOAT)
00999                         {
01000                                 float f = Key[i].sampleKey.fval;
01001                                 Buf.printf("%f",f);     
01002                                 AddXMLText(pXMLDoc,data,Buf.data());
01003                         }
01004 
01005                 }
01006         }
01007 
01008 }
01009 void IGameExporter::DumpSkin(CComPtr<IXMLDOMNode> modNode, IGameSkin * s)
01010 {
01011         CComPtr <IXMLDOMNode> skinNode;
01012         TSTR Buf;
01013 
01014         if(s->GetSkinType()== IGameSkin::IGAME_PHYSIQUE)
01015                 Buf.printf("%s",_T("Physique"));
01016         else
01017                 Buf.printf("%s",_T("MaxSkin"));
01018 
01019         AddXMLAttribute(modNode,_T("skinType"),Buf.data());
01020 
01021         GMatrix skinTM;
01022 
01023         s->GetInitSkinTM(skinTM);
01024 
01025         for(int x=0; x<s->GetNumOfSkinnedVerts();x++)
01026         {
01027                 int type = s->GetVertexType(x);
01028                 if(type==IGameSkin::IGAME_RIGID)
01029                 {
01030                         CComPtr <IXMLDOMNode> boneNode;
01031                         skinNode = NULL;
01032                         CreateXMLNode(pXMLDoc,modNode,_T("Skin"),&skinNode);
01033                         Buf.printf("%d",x);
01034                         AddXMLAttribute(skinNode,_T("vertexID"),Buf.data());
01035                         AddXMLAttribute(skinNode,_T("Type"),_T("Rigid"));
01036                         CreateXMLNode(pXMLDoc,skinNode,_T("Bone"),&boneNode);
01037                         ULONG id = s->GetBoneID(x,0);
01038                         Buf.printf("%d",id);
01039                         AddXMLAttribute(boneNode,_T("BoneID"),Buf.data());
01040 
01041                 }
01042                 else //blended
01043                 {
01044                         CComPtr <IXMLDOMNode> boneNode;
01045                         skinNode = NULL;
01046                         CreateXMLNode(pXMLDoc,modNode,_T("Skin"),&skinNode);
01047                         Buf.printf("%d",x);
01048                         AddXMLAttribute(skinNode,_T("vertexID"),Buf.data());
01049                         AddXMLAttribute(skinNode,_T("Type"),_T("Blended"));
01050 
01051                         for(int y=0;y<s->GetNumberOfBones(x);y++)
01052                         {
01053                                 boneNode = NULL;
01054                                 CreateXMLNode(pXMLDoc,skinNode,_T("Bone"),&boneNode);
01055                                 ULONG id = s->GetBoneID(x,y);
01056                                 Buf.printf("%d",id);
01057                                 AddXMLAttribute(boneNode,_T("BoneID"),Buf.data());
01058                                 float weight = s->GetWeight(x,y);
01059                                 Buf.printf("%f",weight);
01060                                 AddXMLAttribute(boneNode,_T("Weight"),Buf.data());
01061                         }
01062                 }
01063         }
01064 }
01065 
01066 void IGameExporter::DumpModifiers(CComPtr<IXMLDOMNode> modNode, IGameModifier * m)
01067 {
01068         CComPtr <IXMLDOMNode> propNode;
01069         TSTR buf;
01070         if(exportSkin || exportGenMod)
01071         {
01072         
01073                 CreateXMLNode(pXMLDoc,modNode,_T("Modifier"),&propNode);
01074                 AddXMLAttribute(propNode,_T("modName"),m->GetInternalName());
01075                 bool bS = m->IsSkin();
01076                 if(bS)
01077                         buf.printf(_T("true"));
01078                 else
01079                         buf.printf(_T("false"));
01080                 AddXMLAttribute(propNode,_T("IsSkin"),buf.data());
01081                 
01082                 if(m->IsSkin() && exportSkin)
01083                 {
01084                         IGameSkin * skin = (IGameSkin*)m;
01085                         DumpSkin(propNode,skin);
01086                 }
01087         }
01088 
01089 }
01090 
01091 void IGameExporter::DumpLight(IGameLight *lt, CComPtr<IXMLDOMNode> parent)
01092 {
01093 
01094         IGameProperty * prop;
01095         CComPtr <IXMLDOMNode> propNode,targNode;
01096 
01097 
01098         CreateXMLNode(pXMLDoc,parent,_T("Properties"),&propNode);
01099         prop = lt->GetLightColor();
01100         DumpProperties(propNode,prop);
01101         prop = lt->GetLightMultiplier();
01102         DumpProperties(propNode,prop);
01103         prop = lt->GetLightAspectRatio();
01104         DumpProperties(propNode,prop);
01105         prop = lt->GetLightAttenEnd();
01106         DumpProperties(propNode,prop);
01107         prop = lt->GetLightAttenStart();
01108         DumpProperties(propNode,prop);
01109         prop = lt->GetLightFallOff();
01110         DumpProperties(propNode,prop);
01111         prop = lt->GetLightAspectRatio();
01112         DumpProperties(propNode,prop);
01113         
01114         if(lt->GetLightType()==TSPOT_LIGHT )
01115         {
01116                 CreateXMLNode(pXMLDoc,parent,_T("Target"),&targNode);
01117 //              ExportChildNodeInfo(targNode,lt->GetLightTarget());
01118         }
01119 
01120 }
01121 
01122 void IGameExporter::DumpCamera(IGameCamera *ca, CComPtr<IXMLDOMNode> parent)
01123 {
01124 
01125         IGameProperty * prop;
01126         CComPtr <IXMLDOMNode> propNode,targNode;
01127 
01128 
01129         CreateXMLNode(pXMLDoc,parent,_T("Properties"),&propNode);
01130         prop = ca->GetCameraFOV();
01131         DumpProperties(propNode,prop);
01132         prop = ca->GetCameraFarClip();
01133         DumpProperties(propNode,prop);
01134         prop = ca->GetCameraNearClip();
01135         DumpProperties(propNode,prop);
01136         prop = ca->GetCameraTargetDist();
01137         DumpProperties(propNode,prop);
01138         
01139         if(ca->GetCameraTarget())
01140         {
01141                 CreateXMLNode(pXMLDoc,parent,_T("Target"),&targNode);
01142 //              ExportChildNodeInfo(targNode,ca->GetCameraTarget());
01143         }
01144         
01145 
01146 }
01147 
01148 void IGameExporter::DumpIKChain(IGameIKChain * ikch, CComPtr<IXMLDOMNode> ikData)
01149 {
01150         CComPtr <IXMLDOMNode> ikRoot,ikNode, ikEnabled;
01151         TSTR buf;
01152 
01153         CreateXMLNode(pXMLDoc,ikData,_T("IKNodes"),&ikRoot);
01154         buf.printf("%d",ikch->GetNumberofBonesinChain());
01155         AddXMLAttribute(ikRoot,_T("NumOfNodesInChain"),buf.data());
01156 
01157         for(int i=0;i<ikch->GetNumberofBonesinChain();i++)
01158         {
01159                 ikNode = NULL;
01160                 IGameNode * node = ikch->GetIGameNodeInChain(i);
01161                 CreateXMLNode(pXMLDoc,ikRoot,_T("ChainNode"),&ikNode);
01162                 buf.printf("%d",node->GetNodeID());
01163                 AddXMLAttribute(ikNode,_T("NodeID"),buf.data());
01164                 
01165         }
01166 
01167         IGameControl * cont = ikch->GetIKEnabledController();
01168         if(cont)
01169         {
01170                 CreateXMLNode(pXMLDoc,ikData,_T("IKEnabled"),&ikEnabled);
01171                 DumpSampleKeys(cont,ikEnabled,IGAME_FLOAT,true);
01172         }
01173 
01174         
01175 }
01176 
01177 void IGameExporter::DumpSpline(IGameSpline * sp,CComPtr<IXMLDOMNode> splineData)
01178 {
01179         CComPtr <IXMLDOMNode> spline,knotData;
01180         TSTR buf;
01181 
01182         buf.printf("%d",sp->GetNumberOfSplines());
01183         AddXMLAttribute(splineData,_T("NumOfSplines"),buf.data());
01184 
01185         for(int i=0;i<sp->GetNumberOfSplines();i++)
01186         {
01187                 IGameSpline3D * sp3d = sp->GetIGameSpline3D(i);
01188                 spline=NULL;
01189                 CreateXMLNode(pXMLDoc,splineData,_T("Spline"),&spline);
01190                 buf.printf("%d",i+1);
01191                 AddXMLAttribute(spline,_T("index"),buf.data());
01192                 int num = sp3d->GetIGameKnotCount();
01193                 buf.printf("%d",num);
01194                 AddXMLAttribute(spline,_T("NumOfKnots"),buf.data());
01195                 for(int j=0;j<num;j++)
01196                 {
01197                         TSTR data;
01198                         Point3 v;
01199                         CComPtr <IXMLDOMNode> point,invec,outvec;
01200                         knotData=NULL;
01201                         IGameKnot * knot = sp3d->GetIGameKnot(j);
01202                         CreateXMLNode(pXMLDoc,spline,_T("knot"),&knotData);
01203                         CreateXMLNode(pXMLDoc,knotData,_T("Point"),&point);
01204                         v = knot->GetKnotPoint();
01205                         if(exportObjectSpace)
01206                         {
01207                                 GMatrix g = sp->GetIGameObjectTM();
01208                                 Matrix3 gm = g.ExtractMatrix3();
01209                                 Matrix3 invgm = Inverse(gm);
01210                                 v = v * invgm;
01211                         }
01212                         data.printf("%f %f %f",v.x,v.y,v.z);
01213                         AddXMLText(pXMLDoc,point,data.data());
01214                         CreateXMLNode(pXMLDoc,knotData,_T("inVec"),&invec);
01215                         v = knot->GetInVec();
01216                         if(exportObjectSpace)
01217                         {
01218                                 GMatrix g = sp->GetIGameObjectTM();
01219                                 Matrix3 gm = g.ExtractMatrix3();
01220                                 Matrix3 invgm = Inverse(gm);
01221                                 v = v * invgm;
01222                         }
01223                         data.printf("%f %f %f",v.x,v.y,v.z);
01224                         AddXMLText(pXMLDoc,invec,data.data());
01225                         CreateXMLNode(pXMLDoc,knotData,_T("outVec"),&outvec);
01226                         v = knot->GetOutVec();
01227                         if(exportObjectSpace)
01228                         {
01229                                 GMatrix g = sp->GetIGameObjectTM();
01230                                 Matrix3 gm = g.ExtractMatrix3();
01231                                 Matrix3 invgm = Inverse(gm);
01232                                 v = v * invgm;
01233                         }
01234                         data.printf("%f %f %f",v.x,v.y,v.z);
01235                         AddXMLText(pXMLDoc,outvec,data.data());
01236 
01237                 }
01238         }
01239 
01240         IPropertyContainer * cc = sp->GetIPropertyContainer();
01241         IGameProperty * prop = cc->QueryProperty(_T("IGameTestString"));
01242         prop = cc->QueryProperty(_T("IGameTestString"));
01243 
01244         if(prop)
01245         {
01246                 TCHAR * name;
01247                 prop->GetPropertyValue(name);
01248 
01249         }
01250 
01251                 
01252 
01253 }
01254 
01255 void IGameExporter::DumpGenericFace(IGameMesh * gM,FaceEx *fe, CComPtr<IXMLDOMNode> faceData, bool smgrp, bool n, bool vc, bool tv)
01256 {
01257         TSTR data;
01258         FaceEx *f = fe;
01259         CComPtr <IXMLDOMNode> prop = NULL;
01260         TSTR buf;
01261 
01262         CreateXMLNode(pXMLDoc,faceData,_T("vert"),&prop);
01263         buf.printf("%d %d %d",f->vert[0],f->vert[1],f->vert[2]);
01264         AddXMLText(pXMLDoc,prop,buf.data());
01265         
01266         prop =NULL;     
01267         if(smgrp){
01268                 CreateXMLNode(pXMLDoc,faceData,_T("smGrp"),&prop);
01269                 buf.printf("%d",f->smGrp);
01270                 AddXMLText(pXMLDoc,prop,buf.data());
01271         }
01272 
01273         prop =NULL;
01274         CreateXMLNode(pXMLDoc,faceData,_T("MatID"),&prop);
01275         buf.printf("%d",f->matID);
01276         AddXMLText(pXMLDoc,prop,buf.data());
01277 
01278         if(exportNormals && n && !exportNormalsPerFace)
01279         {
01280                 prop =NULL;
01281                 CreateXMLNode(pXMLDoc,faceData,_T("norm"),&prop);
01282                 buf.printf("%d %d %d",f->norm[0],f->norm[1],f->norm[2]);
01283                 AddXMLText(pXMLDoc,prop,buf.data());
01284         }
01285         if(exportVertexColor && vc)
01286         {
01287                 prop =NULL;
01288                 CreateXMLNode(pXMLDoc,faceData,_T("vColor"),&prop);
01289                 buf.printf("%d %d %d",f->color[0],f->color[1],f->color[2]);
01290                 AddXMLText(pXMLDoc,prop,buf.data());
01291         }
01292         if(exportTexCoords && tv)
01293         {
01294                 prop =NULL;
01295                 CreateXMLNode(pXMLDoc,faceData,_T("tvert"),&prop);
01296                 buf.printf("%d %d %d",f->texCoord[0],f->texCoord[1],f->texCoord[2]);
01297                 AddXMLText(pXMLDoc,prop,buf.data());
01298         }
01299 
01300         if(exportNormalsPerFace)
01301         {
01302                 CComPtr <IXMLDOMNode> perFaceNorm = NULL;
01303                 CreateXMLNode(pXMLDoc,faceData,_T("VertexNormals"),&perFaceNorm);
01304                 for(int vv=0; vv<3; vv++)
01305                 {
01306                         CComPtr <IXMLDOMNode> normals = NULL;
01307                         CreateXMLNode(pXMLDoc,perFaceNorm,_T("Normal"),&normals);
01308                         Point3 n;
01309                         if(gM->GetNormal(f,vv, n))
01310                         {
01311                                 buf.printf("%f %f %f\n",n.x,n.y,n.z);
01312                                 AddXMLText(pXMLDoc,normals,buf.data());
01313                         }
01314                 }
01315         }
01316 
01317 
01318 
01319 
01320 
01321 }
01322 
01323 void IGameExporter::DumpMesh(IGameMesh * gm,CComPtr<IXMLDOMNode> geomData)
01324 {
01325         CComPtr <IXMLDOMNode> vertData,normData,faceData,vcData,tvData;
01326         CComPtr <IXMLDOMNode> propNode;
01327         TSTR buf;
01328         bool vcSet = false;
01329         bool nSet = false;
01330         bool tvSet = false;
01331 
01332 
01333         // dump Vertices
01334         CreateXMLNode(pXMLDoc,geomData,_T("Vertices"),&vertData);
01335         int numVerts = gm->GetNumberOfVerts();
01336         numVertex = numVerts;
01337 
01338         buf.printf("%d",numVerts);
01339         AddXMLAttribute(vertData,_T("Count"),buf.data());
01340         for(int i = 0;i<numVerts;i++)
01341         {
01342                 CComPtr <IXMLDOMNode> vert = NULL;
01343                 TSTR data;
01344                 CreateXMLNode(pXMLDoc,vertData,_T("vertex"),&vert);
01345 
01346                 buf.printf("%d",i);
01347                 AddXMLAttribute(vert,_T("index"),buf.data());
01348                 Point3 v; 
01349                 if(gm->GetVertex(i,v))
01350                 {
01351                         if(exportObjectSpace)
01352                         {
01353                                 GMatrix g = gm->GetIGameObjectTM();
01354                                 Matrix3 gm = g.ExtractMatrix3();
01355                                 Matrix3 invgm = Inverse(gm);
01356                                 v = v * invgm;
01357                         }
01358                         data.printf("%f %f %f",v.x,v.y,v.z);
01359                         AddXMLText(pXMLDoc,vert,data.data());
01360                 }
01361                         
01362         }
01363         if(exportNormals && !exportNormalsPerFace)
01364         {
01365                 // dump Normals
01366                 int numNorms = gm->GetNumberOfNormals();
01367                 if(numNorms >0)
01368                 {
01369                         nSet = true;
01370                         CreateXMLNode(pXMLDoc,geomData,_T("Normals"),&normData);
01371                         buf.printf("%d",numNorms);
01372                         AddXMLAttribute(normData,_T("Count"),buf.data());
01373                 }
01374                 
01375                 for(int i = 0;i<numNorms;i++)
01376                 {
01377                         CComPtr <IXMLDOMNode> norm = NULL;
01378                         TSTR data;
01379                         CreateXMLNode(pXMLDoc,normData,_T("normal"),&norm);
01380                         buf.printf("%d",i);
01381                         AddXMLAttribute(norm,_T("index"),buf.data());
01382                         Point3 n;
01383                         if(gm->GetNormal(i,n))
01384                         {
01385                                 buf.printf("%f %f %f",n.x,n.y,n.z);
01386                                 AddXMLText(pXMLDoc,norm,buf.data());
01387                         }
01388                 }
01389         }
01390         if(exportTexCoords)
01391         {
01392                 // dump tvs
01393                 int numTVs = gm->GetNumberOfTexVerts();
01394                 if(numTVs >0)
01395                 {
01396                         tvSet = true;
01397                         CreateXMLNode(pXMLDoc,geomData,_T("TextureCordinates"),&tvData);
01398                         buf.printf("%d",numTVs);
01399                         AddXMLAttribute(tvData,_T("Count"),buf.data());
01400                 }
01401                 for(int i = 0;i<numTVs;i++)
01402                 {
01403                         CComPtr <IXMLDOMNode> norm = NULL;
01404                         TSTR data;
01405                         CreateXMLNode(pXMLDoc,tvData,_T("tVertex"),&norm);
01406                         buf.printf("%d",i);
01407                         AddXMLAttribute(norm,_T("index"),buf.data());
01408                         Point2 tv;
01409                         if(gm->GetTexVertex(i,tv))
01410                         {
01411                                 buf.printf("%f %f",tv.x,tv.y);
01412                                 AddXMLText(pXMLDoc,norm,buf.data());
01413                         }
01414                 }
01415         }
01416 
01417         if(exportVertexColor)
01418         {
01419                 // dump VC
01420                 int numVCs = gm->GetNumberOfColorVerts();
01421                 if(numVCs >0)
01422                 {
01423                         vcSet = true;
01424                         CreateXMLNode(pXMLDoc,geomData,_T("VertexColor"),&vcData);
01425                         buf.printf("%d",numVCs);
01426                         AddXMLAttribute(vcData,_T("Count"),buf.data());
01427                 }
01428                 for(int i = 0;i<numVCs;i++)
01429                 {
01430                         CComPtr <IXMLDOMNode> vc = NULL;
01431                         TSTR data;
01432                         CreateXMLNode(pXMLDoc,vcData,_T("vColor"),&vc);
01433                         buf.printf("%d",i);
01434                         AddXMLAttribute(vc,_T("index"),buf.data());
01435                         Point3 n;
01436                         if(gm->GetColorVertex(i,n))
01437                         {
01438                                 buf.printf("%f %f %f",n.x,n.y,n.z);
01439                                 AddXMLText(pXMLDoc,vc,buf.data());
01440                         }
01441                 }
01442         }
01443 
01444         // dump Face data
01445         CreateXMLNode(pXMLDoc,geomData,_T("Faces"),&faceData);
01446 
01447         if(exportFaceSmgp)
01448         {
01449                 Tab<DWORD> smGrps = gm->GetActiveSmgrps();
01450 
01451                 for (int x=0;x<smGrps.Count();x++)
01452                 {
01453                         CComPtr <IXMLDOMNode> smgrpFace;
01454                         TSTR data;
01455                         Tab <int > smFace = gm->GetFaceIndexFromSmgrp(smGrps[x]);
01456                         CreateXMLNode(pXMLDoc,faceData,_T("SmoothingBased"),&smgrpFace);
01457                         buf.printf("%d",smGrps[x]);
01458                         AddXMLAttribute(smgrpFace,_T("Group"),buf.data());
01459                         buf.printf("%d",smFace.Count());
01460                         AddXMLAttribute(smgrpFace,_T("Count"),buf.data());
01461 
01462                         for(int f=0;f<smFace.Count();f++)
01463                         {
01464                                 CComPtr <IXMLDOMNode> norm = NULL;
01465                                 CreateXMLNode(pXMLDoc,smgrpFace,_T("Face"),&norm);
01466                                 data.printf("%d",smFace[f]);
01467                                 AddXMLAttribute(norm,_T("index"),data.data());
01468                                 DumpGenericFace(gm,gm->GetFace(smFace[f]),norm,false,nSet,vcSet,tvSet);
01469                         }
01470 
01471                 }
01472         }
01473         else
01474         {
01475                 TSTR data;
01476                 int numFaces = gm->GetNumberOfFaces();
01477                 buf.printf("%d",numFaces);
01478                 AddXMLAttribute(faceData,_T("Count"),buf.data());
01479 
01480                 for(int f=0;f<numFaces;f++)
01481                 {
01482                         CComPtr <IXMLDOMNode> norm = NULL;
01483                         CreateXMLNode(pXMLDoc,faceData,_T("Face"),&norm);
01484                         data.printf("%d",f);
01485                         AddXMLAttribute(norm,_T("index"),data.data());
01486                         DumpGenericFace(gm, gm->GetFace(f),norm,true,nSet,vcSet,tvSet);
01487 
01488 
01489                 }
01490                 
01491         }
01492 
01493         if(exportMappingChannel)
01494         {
01495                 TSTR data;
01496                 CComPtr <IXMLDOMNode> channelNode;
01497                 Tab<int> mapNums = gm->GetActiveMapChannelNum();
01498                 CreateXMLNode(pXMLDoc,geomData,_T("MappingChannels"),&channelNode);
01499                 int mapCount = mapNums.Count();
01500                 buf.printf("%d",mapCount);
01501                 AddXMLAttribute(channelNode,_T("Count"),buf.data());
01502 
01503                 for(int i=0;i < mapCount;i++)
01504                 {
01505                         CComPtr <IXMLDOMNode> channelItem, mvertData,vert,mfaceData,face;
01506                         CreateXMLNode(pXMLDoc,channelNode,_T("MapChannel"),&channelItem);
01507                         buf.printf("%d",mapNums[i]);
01508                         AddXMLAttribute(channelItem,_T("ChannelNum"),buf.data());
01509                         CreateXMLNode(pXMLDoc,channelItem,_T("MapVertexData"),&mvertData);
01510                         int vCount = gm->GetNumberOfMapVerts(mapNums[i]);
01511                         buf.printf("%d",vCount);
01512                         AddXMLAttribute(mvertData,_T("Count"),buf.data());
01513 
01514                         for(int j=0;j<vCount;j++)
01515                         {
01516                                 vert = NULL;
01517                                 CreateXMLNode(pXMLDoc,mvertData,_T("mapvertex"),&vert);
01518                                 buf.printf("%d",j);
01519                                 AddXMLAttribute(vert,_T("index"),buf.data());
01520                                 Point3 v;
01521                                 if(gm->GetMapVertex(mapNums[i],j,v))
01522                                 {
01523                                         data.printf("%f %f %f",v.x,v.y,v.z);
01524                                         AddXMLText(pXMLDoc,vert,data.data());
01525                                 }
01526                 
01527                         }
01528                         CreateXMLNode(pXMLDoc,channelItem,_T("MapFaceData"),&mfaceData);
01529                         int fCount = gm->GetNumberOfFaces();
01530                         buf.printf("%d",fCount);
01531                         AddXMLAttribute(mfaceData,_T("Count"),buf.data());
01532 
01533                         for(int k=0;k<fCount;k++)
01534                         {
01535                                 face = NULL;
01536                                 CreateXMLNode(pXMLDoc,mfaceData,_T("mapface"),&face);
01537                                 buf.printf("%d",k);
01538                                 AddXMLAttribute(face,_T("index"),buf.data());
01539                                 DWORD  v[3];
01540                                 gm->GetMapFaceIndex(mapNums[i],k,v);
01541                                 data.printf("%d %d %d",v[0],v[1],v[2]);
01542                                 AddXMLText(pXMLDoc,face,data.data());
01543                         
01544                         }
01545                 }
01546 
01547         }
01548 
01549 #if 0
01550 //test code
01551         Tab<int> matids;
01552 
01553         matids = gm->GetActiveMatIDs();
01554 
01555         for(i=0;i<matids.Count();i++)
01556         {
01557                 Tab<FaceEx*> faces;
01558 
01559                 faces = gm->GetFacesFromMatID(matids[i]);
01560 
01561                 for(int k=0; k<faces.Count();k++)
01562                 {
01563                         IGameMaterial * faceMat = gm->GetMaterialFromFace(faces[k]);
01564 //                      TSTR name(faceMat->GetMaterialName());
01565                 }
01566                 for(k=0;k<gm->GetNumberOfFaces();k++)
01567                 {
01568                         IGameMaterial * faceMat = gm->GetMaterialFromFace(k);
01569                 }
01570                 
01571         }
01572 
01573         Tab <DWORD> smgrps = gm->GetActiveSmgrps();
01574 #endif
01575 
01576         vertData = NULL;
01577         normData = NULL;
01578         faceData = NULL;
01579 }
01580 
01581 
01582 
01583 void IGameExporter::DumpConstraints(CComPtr<IXMLDOMNode> prsData, IGameConstraint * c)
01584 {
01585         TSTR buf,name;
01586         CComPtr <IXMLDOMNode> prsChild;
01587         CComPtr <IXMLDOMNode> constNode;
01588 
01589         if(exportConstraints)
01590         {
01591         
01592                 CreateXMLNode(pXMLDoc,prsData,_T("Constrainst"),&prsChild);
01593                 GetKeyTypeName(name, c->GetConstraintType());
01594                 AddXMLAttribute(prsChild,_T("Type"),name.data());
01595                 buf.printf("%d",c->NumberOfConstraintNodes());
01596                 AddXMLAttribute(prsChild,_T("NodeCount"),buf.data());
01597 
01598                 for(int i=0;i<c->NumberOfConstraintNodes();i++ )
01599                 {
01600                         constNode = NULL;
01601                         CreateXMLNode(pXMLDoc,prsChild,_T("ConstNode"),&constNode);
01602                         float w = c->GetConstraintWeight(i);
01603                         int id = c->GetConstraintNodes(i)->GetNodeID();
01604                         
01605                         buf.printf("%d", id);
01606                         AddXMLAttribute(constNode,_T("NodeID"),buf.data());
01607 
01608                         buf.printf("%f", w);
01609                         AddXMLAttribute(constNode,_T("Weight"),buf.data());
01610 
01611                 }
01612                 for(i=0;i<c->GetIPropertyContainer()->GetNumberOfProperties();i++)
01613                 {
01614                         DumpProperties(prsChild,c->GetIPropertyContainer()->GetProperty(i));
01615                 }
01616         }
01617 }
01618 
01619 
01620 
01621 
01622 void IGameExporter::DumpBezierKeys(DWORD Type, IGameKeyTab Keys, CComPtr<IXMLDOMNode> prsData)
01623 {
01624         TSTR buf,name;
01625         CComPtr <IXMLDOMNode> prsChild;
01626         GetKeyTypeName(name,Type);
01627 
01628         if(Keys.Count()==0)
01629                 return;
01630 
01631         CreateXMLNode(pXMLDoc,prsData,name,&prsChild);
01632 
01633         buf.printf("%d",Keys.Count());
01634         AddXMLAttribute(prsChild,_T("KeyCount"),buf.data());
01635         AddXMLAttribute(prsChild,_T("Type"),_T("Bezier"));
01636 
01637         for(int i = 0;i<Keys.Count();i++)
01638         {
01639                 CComPtr <IXMLDOMNode> key = NULL;
01640                 TSTR data;
01641                 CreateXMLNode(pXMLDoc,prsChild,_T("Key"),&key);
01642                 buf.printf("%d",Keys[i].t);
01643                 AddXMLAttribute(key,_T("time"),buf.data());
01644                 if(Type==IGAME_POS || Type==IGAME_POINT3)
01645                 {
01646                         Point3 k = Keys[i].bezierKey.pval;
01647                         data.printf("%f %f %f",k.x,k.y,k.z); 
01648                 }
01649                 else if (Type == IGAME_ROT)
01650                 {
01651                         Quat q = Keys[i].bezierKey.qval;
01652                         AngAxis a(q);
01653                         if(!exportQuaternions)
01654                                 data.printf("%f %f %f %f",a.axis.x, a.axis.y, a.axis.z, a.angle);
01655                         else
01656                                 data.printf("%f %f %f %f",q.x, q.y, q.z, q.w);
01657 
01658                 }
01659                 else if ( Type == IGAME_FLOAT || Type==IGAME_EULER_X || Type == IGAME_EULER_Y || Type==IGAME_EULER_Z)
01660                 {
01661                         float f = Keys[i].bezierKey.fval;
01662                         data.printf("%f",f);
01663                 }
01664                 else{
01665                         ScaleValue sval = Keys[i].bezierKey.sval;
01666                         Point3 s = sval.s;
01667                         AngAxis a(sval.q);
01668                         if(!exportQuaternions)
01669                                 data.printf("%f %f %f %f %f %f %f",sval.s.x,sval.s.y,sval.s.z,a.axis.x, a.axis.y, a.axis.z, a.angle);
01670                         else
01671                                 data.printf("%f %f %f %f %f %f %f",sval.s.x,sval.s.y,sval.s.z,sval.q.x, sval.q.y,sval.q.z, sval.q.w);
01672 
01673                 }
01674                 AddXMLText(pXMLDoc,key,data.data());
01675                 
01676         }
01677 
01678         prsChild = NULL;
01679 
01680 }
01681 void IGameExporter::DumpLinearKeys(DWORD Type, IGameKeyTab Keys, CComPtr<IXMLDOMNode> prsData)
01682 {
01683         TSTR buf,name;
01684         CComPtr <IXMLDOMNode> prsChild;
01685         GetKeyTypeName(name,Type);
01686 
01687         if(Keys.Count()==0)
01688                 return;
01689 
01690         CreateXMLNode(pXMLDoc,prsData,name.data(),&prsChild);
01691 
01692         buf.printf("%d",Keys.Count());
01693         AddXMLAttribute(prsChild,_T("KeyCount"),buf.data());
01694         AddXMLAttribute(prsChild,_T("Type"),_T("Linear"));
01695 
01696         for(int i = 0;i<Keys.Count();i++)
01697         {
01698                 CComPtr <IXMLDOMNode> key = NULL;
01699                 TSTR data;
01700                 CreateXMLNode(pXMLDoc,prsChild,_T("Key"),&key);
01701                 buf.printf("%d",Keys[i].t);
01702                 AddXMLAttribute(key,_T("time"),buf.data());
01703                 if(Type==IGAME_POS)
01704                 {
01705                         Point3 k = Keys[i].linearKey.pval;
01706                         data.printf("%f %f %f",k.x,k.y,k.z); 
01707                 }
01708                 else if (Type == IGAME_ROT)
01709                 {
01710                         Quat q = Keys[i].linearKey.qval;
01711                         AngAxis a(q);
01712                         if(!exportQuaternions)
01713                                 data.printf("%f %f %f %f",a.axis.x, a.axis.y, a.axis.z, a.angle);
01714                         else
01715                                 data.printf("%f %f %f %f",q.x, q.y, q.z, q.w);
01716 
01717                 }
01718                 else if ( Type == IGAME_FLOAT || Type==IGAME_EULER_X || Type == IGAME_EULER_Y || Type==IGAME_EULER_Z)
01719                 {
01720                         float f = Keys[i].linearKey.fval;
01721                         data.printf("%f",f);    
01722                 }
01723                 else{
01724                         ScaleValue sval = Keys[i].linearKey.sval;
01725                         Point3 s = sval.s;
01726                         AngAxis a(sval.q);
01727                         if(exportQuaternions)
01728                                 data.printf("%f %f %f %f %f %f %f",sval.s.x,sval.s.y,sval.s.z,a.axis.x, a.axis.y, a.axis.z, a.angle);
01729                         else
01730                                 data.printf("%f %f %f %f %f %f %f",sval.s.x,sval.s.y,sval.s.z,sval.q.x, sval.q.y,sval.q.z, sval.q.w);
01731 
01732                 }
01733                 AddXMLText(pXMLDoc,key,data.data());
01734                 
01735         }
01736 
01737         prsChild = NULL;
01738 
01739 
01740 }
01741 void IGameExporter::DumpTCBKeys(DWORD Type, IGameKeyTab Keys, CComPtr<IXMLDOMNode> prsData)
01742 {
01743         TSTR buf,name;
01744         CComPtr <IXMLDOMNode> prsChild;
01745 
01746         if(Keys.Count()==0)
01747                 return;
01748 
01749         GetKeyTypeName(name,Type);
01750         CreateXMLNode(pXMLDoc,prsData,name.data(),&prsChild);
01751 
01752         buf.printf("%d",Keys.Count());
01753         AddXMLAttribute(prsChild,_T("KeyCount"),buf.data());
01754         AddXMLAttribute(prsChild,_T("Type"),_T("TCB"));
01755 
01756         for(int i = 0;i<Keys.Count();i++)
01757         {
01758                 CComPtr <IXMLDOMNode> key = NULL;
01759                 TSTR data;
01760                 CreateXMLNode(pXMLDoc,prsChild,_T("Key"),&key);
01761                 buf.printf("%d",Keys[i].t);
01762                 AddXMLAttribute(key,_T("time"),buf.data());
01763                 if(Type==IGAME_POS)
01764                 {
01765                         Point3 k = Keys[i].tcbKey.pval;
01766                         data.printf("%f %f %f",k.x,k.y,k.z); 
01767                 }
01768                 else if (Type == IGAME_ROT)
01769                 {
01770                         AngAxis a = Keys[i].tcbKey.aval;
01771                         data.printf("%f %f %f %f",a.axis.x, a.axis.y, a.axis.z, a.angle);
01772 
01773                 }
01774                 else{
01775                         ScaleValue sval = Keys[i].tcbKey.sval;
01776                         Point3 s = sval.s;
01777                         AngAxis a(sval.q);
01778                         if(!exportQuaternions)
01779                                 data.printf("%f %f %f %f %f %f %f",sval.s.x,sval.s.y,sval.s.z,a.axis.x, a.axis.y, a.axis.z, a.angle);
01780                         else
01781                                 data.printf("%f %f %f %f %f %f %f",sval.s.x,sval.s.y,sval.s.z,sval.q.x, sval.q.y,sval.q.z, sval.q.w);
01782 
01783                 }
01784                 AddXMLText(pXMLDoc,key,data.data());
01785                 
01786         }
01787 
01788         prsChild = NULL;
01789 
01790 
01791 }
01792 
01793 void IGameExporter::DumpProperties(CComPtr<IXMLDOMNode> node, IGameProperty * prop)
01794 {
01795         TSTR Buf;
01796         IGameKeyTab keys;
01797         CComPtr <IXMLDOMNode> propData;
01798         CComPtr <IXMLDOMNode> keyNode;
01799 
01800         if(!prop)       //fix me NH...
01801                 return;
01802         CreateXMLNode(pXMLDoc,node,_T("Prop"),&propData);
01803         AddXMLAttribute(propData,_T("name"),prop->GetName());
01804 
01805         if(prop->GetType() == IGAME_POINT3_PROP)
01806         {
01807                 Point3 p; 
01808                 prop->GetPropertyValue(p);
01809                 Buf.printf("%f %f %f",p.x,p.y,p.z);
01810         }
01811         else if( prop->GetType() == IGAME_FLOAT_PROP)
01812         {
01813                 float f;
01814                 prop->GetPropertyValue(f);
01815                 Buf.printf("%f", f);
01816         }
01817         else if(prop->GetType()==IGAME_STRING_PROP)
01818         {
01819                 TCHAR * b;
01820                 prop->GetPropertyValue(b);
01821                 Buf.printf("$s",b);
01822         }
01823         else
01824         {
01825                 int i;
01826                 prop->GetPropertyValue(i);
01827                 Buf.printf("%d", i);
01828 
01829         }
01830         AddXMLAttribute(propData,_T("value"),Buf.data());
01831 
01832         if(prop->IsPropAnimated() && exportControllers)
01833         {
01834                 IGameControl * c = prop->GetIGameControl();
01835                 CreateXMLNode(pXMLDoc,propData,_T("PropKeyData"),&keyNode);
01836 
01837 
01838                 if(prop->GetType() == IGAME_POINT3_PROP)
01839                 {
01840                         if(     c->GetBezierKeys(keys,IGAME_POINT3 )){
01841                                 DumpBezierKeys(IGAME_POINT3,keys,keyNode);
01842                         }
01843                 }
01844                 if(prop->GetType()==IGAME_FLOAT_PROP)
01845                 {
01846                         if(     c->GetBezierKeys(keys,IGAME_FLOAT )){
01847                                 DumpBezierKeys(IGAME_FLOAT,keys,keyNode);
01848                         }
01849                 }
01850         }
01851         propData = NULL;
01852         keyNode = NULL;
01853 }       
01854 
01855 
01856 void IGameExporter::DumpTexture(CComPtr<IXMLDOMNode> node,IGameMaterial * mat)
01857 {
01858         CComPtr <IXMLDOMNode> textureRoot;
01859         TSTR buf;
01860         int texCount = mat->GetNumberOfTextureMaps();
01861 
01862         if(texCount>0)
01863         {
01864                 CreateXMLNode(pXMLDoc,node,_T("TextureMaps"),&textureRoot);
01865                 buf.printf("%d",texCount);
01866                 AddXMLAttribute(textureRoot,_T("Count"),buf.data());
01867         }
01868         
01869         for(int i=0;i<texCount;i++)
01870         {
01871                 CComPtr <IXMLDOMNode> texture;
01872                 IGameTextureMap * tex = mat->GetIGameTextureMap(i);
01873                 CreateXMLNode(pXMLDoc,textureRoot,_T("Texture"),&texture);
01874                 buf.printf("%d",i);
01875                 AddXMLAttribute(texture,_T("index"),buf.data());
01876                 TCHAR * name = tex->GetTextureName();
01877                 AddXMLAttribute(texture,_T("name"),name);
01878                 int slot = tex->GetStdMapSlot();
01879                 buf.printf("%d",slot);
01880                 AddXMLAttribute(texture,_T("StdSlotType"),buf.data());
01881 
01882                 if(tex->IsEntitySupported())    //its a bitmap texture
01883                 {
01884                         CComPtr <IXMLDOMNode> bitmapTexture;
01885                         CreateXMLNode(pXMLDoc,texture,_T("BitmapTexture"),&bitmapTexture);
01886 
01887                         CComPtr <IXMLDOMNode> bitmapName;
01888                         CreateXMLNode(pXMLDoc,bitmapTexture,_T("Name"),&bitmapName);
01889                         AddXMLText(pXMLDoc,bitmapName,tex->GetBitmapFileName());
01890 
01891                         IGameProperty * prop = tex->GetClipHData();
01892                         DumpProperties(bitmapTexture,prop);
01893 
01894                         prop = tex->GetClipUData();
01895                         DumpProperties(bitmapTexture,prop);
01896 
01897                         prop = tex->GetClipVData();
01898                         DumpProperties(bitmapTexture,prop);
01899 
01900                         prop = tex->GetClipWData();
01901                         DumpProperties(bitmapTexture,prop);
01902 
01903                 }
01904 
01905         }
01906 
01907 }
01908 
01909 void IGameExporter::DumpMaterial(CComPtr<IXMLDOMNode> node,IGameMaterial * mat, int index, int matID )
01910 {
01911         TSTR buf;
01912         IGameProperty *prop;
01913         CComPtr <IXMLDOMNode> material;
01914         CComPtr <IXMLDOMNode> propNode;
01915 
01916         CreateXMLNode(pXMLDoc,node,_T("Material"),&material);
01917         buf.printf("%d",index);
01918         AddXMLAttribute(material,_T("index"),buf.data());
01919         
01920         if(matID !=-1)  // we are not a sub material
01921         {
01922                 buf.printf("%d",matID);
01923                 AddXMLAttribute(material,_T("MaterialID"),buf.data());
01924         }
01925 
01926         AddXMLAttribute(material,_T("Name"),mat->GetMaterialName());
01927         CComPtr <IXMLDOMNode> matData;
01928         CreateXMLNode(pXMLDoc,material,_T("NumSubMtls"),&matData);
01929         buf.printf("%d",mat->GetSubMaterialCount());
01930         AddXMLText(pXMLDoc,matData,buf.data());
01931 
01932         //WE ONLY WANT THE PROPERTIES OF THE ACTUAL MATERIAL NOT THE CONTAINER - FOR NOW.....
01933         if(!mat->IsMultiType())
01934         {
01935                 CreateXMLNode(pXMLDoc,material,_T("Properties"),&propNode);
01936                 prop = mat->GetDiffuseData();
01937                 DumpProperties(propNode,prop);
01938                 prop = mat->GetAmbientData();
01939                 DumpProperties(propNode,prop);
01940                 prop = mat->GetSpecularData();
01941                 DumpProperties(propNode,prop);
01942                 prop = mat->GetOpacityData();
01943                 DumpProperties(propNode,prop);
01944                 prop = mat->GetGlossinessData();
01945                 DumpProperties(propNode,prop);
01946                 prop = mat->GetSpecularLevelData();
01947                 DumpProperties(propNode,prop);
01948         }
01949 
01950         //do the textures if they are there
01951 
01952         DumpTexture(material,mat);
01953 
01954         if(mat->IsMultiType())
01955         {
01956                 CComPtr <IXMLDOMNode> multi;
01957                 CreateXMLNode(pXMLDoc,material,_T("MultiMaterial"),&multi);
01958                 for(int k=0;k<mat->GetSubMaterialCount();k++)
01959                 {
01960                         int mID = mat->GetMaterialID(k);
01961                         IGameMaterial * subMat = mat->GetSubMaterial(k);
01962                         DumpMaterial(multi,subMat,k, mID);
01963                 }
01964         }
01965         
01966 }
01967 
01968 void IGameExporter::ExportMaterials()
01969 {
01970         CComPtr <IXMLDOMNode> matNode;
01971         TSTR buf;
01972         if(exportMaterials)
01973         {
01974         
01975                 CreateXMLNode(pXMLDoc,iGameNode,_T("MaterialList"),&matNode);
01976                 int matCount = pIgame->GetRootMaterialCount();
01977                 buf.printf("%d",matCount);
01978                 AddXMLAttribute(matNode,_T("Count"),buf.data());
01979 
01980                 for(int j =0;j<matCount;j++)
01981                 {
01982                         IGameMaterial * mat = pIgame->GetRootMaterial(j);
01983                         if(mat)
01984                                 DumpMaterial(matNode,mat,j);
01985                 }
01986         }
01987 }
01988 
01989 // Dummy function for progress bar
01990 DWORD WINAPI fn(LPVOID arg)
01991 {
01992         return(0);
01993 }
01994 
01995 
01996 
01997 class MyErrorProc : public IGameErrorCallBack
01998 {
01999 public:
02000         void ErrorProc(IGameError error)
02001         {
02002                 TCHAR * buf = GetLastIGameErrorText();
02003                 DebugPrint("ErrorCode = %d ErrorText = %s\n", error,buf);
02004         }
02005 };
02006 
02007 
02008 int     IGameExporter::DoExport(const TCHAR *name,ExpInterface *ei,Interface *i, BOOL suppressPrompts, DWORD options)
02009 {       
02010         outfile = fopen(name,_T("w"));
02011         Interface * ip = GetCOREInterface();
02012 
02013         MyErrorProc pErrorProc;
02014 
02015         SetErrorCallBack(&pErrorProc);
02016 
02017         curNode = 0;
02018         ip->ProgressStart(_T("Exporting Using IGame.."), TRUE, fn, NULL);
02019         
02020         pIgame = GetIGameInterface();
02021 
02022         IGameConversionManager * cm = GetConversionManager();
02023 //      cm->SetUserCoordSystem(Whacky);
02024         cm->SetCoordSystem(IGameConversionManager::IGAME_OGL);
02025 //      pIgame->SetPropertyFile(_T("hello world"));
02026         pIgame->InitialiseIGame(false);
02027         
02028 //      TSTR path,file,ext;
02029         
02030 //      ExportSceneInfo();
02031 //      ExportMaterials();
02032 
02033 
02034         skel = NULL;
02035         mesh = NULL;
02036         skin = NULL;
02037 
02038         for(int loop = 0; loop < pIgame->GetTopLevelNodeCount();loop++)
02039         {
02040                 IGameNode * pGameNode = pIgame->GetTopLevelNode(loop);
02041                 //check for selected state - we deal with targets in the light/camera section
02042                 if(pGameNode->IsTarget())
02043                         continue;
02044                 ExportChildNodeInfo(pGameNode);
02045 
02046         }
02047         if(skel)
02048         {
02049                 fprintf(outfile,"numbones %d\n", numBones = RecursiveChildCount(skel,0));
02050                 fprintf(outfile,"scale 0.0533\n");
02051                 currBone = 0;
02052                 boneIndices = new int[numBones];
02053                 ExportSkeleton(skel);
02054         }
02055         if(mesh)
02056         {
02057                 ExportMesh();
02058         }
02059         if(skel)
02060         {
02061                 ExportAnimation();
02062         }
02063 
02064         pIgame->ReleaseIGame();
02065         ip->ProgressEnd();
02066         fclose(outfile);
02067         return TRUE;
02068 }
02069 
02070 
02071 TSTR IGameExporter::GetCfgFilename()
02072 {
02073         TSTR filename;
02074         
02075         filename += GetCOREInterface()->GetDir(APP_PLUGCFG_DIR);
02076         filename += "\\";
02077         filename += "IgameExport.cfg";
02078         return filename;
02079 }
02080 
02081 // NOTE: Update anytime the CFG file changes
02082 #define CFG_VERSION 0x03
02083 
02084 BOOL IGameExporter::ReadConfig()
02085 {
02086         TSTR filename = GetCfgFilename();
02087         FILE* cfgStream;
02088 
02089         cfgStream = fopen(filename, "rb");
02090         if (!cfgStream)
02091                 return FALSE;
02092         
02093         exportGeom = fgetc(cfgStream);
02094         exportNormals = fgetc(cfgStream);
02095         exportControllers = fgetc(cfgStream);
02096         exportFaceSmgp = fgetc(cfgStream);
02097         exportVertexColor = fgetc(cfgStream);
02098         exportTexCoords = fgetc(cfgStream);
02099         staticFrame = _getw(cfgStream);
02100         framePerSample = _getw(cfgStream);
02101         exportMappingChannel = fgetc(cfgStream);
02102         exportMaterials = fgetc(cfgStream);
02103         exportSplines = fgetc(cfgStream);
02104         exportModifiers = fgetc(cfgStream);
02105         forceSample = fgetc(cfgStream);
02106         exportConstraints = fgetc(cfgStream);
02107         exportSkin = fgetc(cfgStream);
02108         exportGenMod = fgetc(cfgStream);
02109         cS = fgetc(cfgStream);
02110         splitFile = fgetc(cfgStream);
02111         exportQuaternions = fgetc(cfgStream);
02112         exportObjectSpace = fgetc(cfgStream);
02113         exportRelative = fgetc(cfgStream);
02114         exportNormalsPerFace = fgetc(cfgStream);
02115         fclose(cfgStream);
02116         return TRUE;
02117 }
02118 
02119 void IGameExporter::WriteConfig()
02120 {
02121         TSTR filename = GetCfgFilename();
02122         FILE* cfgStream;
02123 
02124         cfgStream = fopen(filename, "wb");
02125         if (!cfgStream)
02126                 return;
02127 
02128         
02129         fputc(exportGeom,cfgStream);
02130         fputc(exportNormals,cfgStream);
02131         fputc(exportControllers,cfgStream);
02132         fputc(exportFaceSmgp,cfgStream);
02133         fputc(exportVertexColor,cfgStream);
02134         fputc(exportTexCoords,cfgStream);
02135         _putw(staticFrame,cfgStream);
02136         _putw(framePerSample,cfgStream);
02137         fputc(exportMappingChannel,cfgStream);
02138         fputc(exportMaterials,cfgStream);
02139         fputc(exportSplines,cfgStream);
02140         fputc(exportModifiers,cfgStream);
02141         fputc(forceSample,cfgStream);
02142         fputc(exportConstraints,cfgStream);
02143         fputc(exportSkin,cfgStream);
02144         fputc(exportGenMod,cfgStream);
02145         fputc(cS,cfgStream);
02146         fputc(splitFile,cfgStream);
02147         fputc(exportQuaternions,cfgStream);
02148         fputc(exportObjectSpace,cfgStream);
02149         fputc(exportRelative,cfgStream);
02150         fputc(exportNormalsPerFace, cfgStream);
02151         fclose(cfgStream);
02152 }
02153 
02154 

Generated on Thu Aug 18 16:02:59 2005 for Robin Hood: Thieves & Knights by doxygen1.2.18