00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
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;
00051 CComPtr<IXMLDOMNode> iGameNode;
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();
00090 const TCHAR * Ext(int n);
00091 const TCHAR * LongDesc();
00092 const TCHAR * ShortDesc();
00093 const TCHAR * AuthorName();
00094 const TCHAR * CopyrightMessage();
00095 const TCHAR * OtherMessage1();
00096 const TCHAR * OtherMessage2();
00097 unsigned int Version();
00098 void ShowAbout(HWND hWnd);
00099
00100
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
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"); }
00166 HINSTANCE HInstance() { return hInstance; }
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
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
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
00270 for(int j = 0; j < numWeights; j++)
00271 {
00272 int boneIndex = skin->GetBoneID(currVertIndex,j);
00273
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
00286 Point2 texCoords;
00287 mesh->GetTexVertex(currTexIndex,texCoords);
00288 fprintf(outfile,"%f %f\n",texCoords.x,texCoords.y);
00289
00290 Point3 currNorm;
00291 mesh->GetNormal(i,currNorm);
00292 fprintf(outfile,"%f %f %f\n",currNorm.x, currNorm.y, currNorm.z);
00293 }
00294
00295
00296
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
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;
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
00385 return 1;
00386 }
00387
00388 const TCHAR *IGameExporter::Ext(int n)
00389 {
00390
00391 return _T("mma");
00392 }
00393
00394 const TCHAR *IGameExporter::LongDesc()
00395 {
00396
00397 return _T("Merry Men Animation");
00398 }
00399
00400 const TCHAR *IGameExporter::ShortDesc()
00401 {
00402
00403 return _T("Merry Men Animation");
00404 }
00405
00406 const TCHAR *IGameExporter::AuthorName()
00407 {
00408
00409 return _T("Ryan Brown");
00410 }
00411
00412 const TCHAR *IGameExporter::CopyrightMessage()
00413 {
00414
00415 return _T("You can't use this, jackface.");
00416 }
00417
00418 const TCHAR *IGameExporter::OtherMessage1()
00419 {
00420
00421 return _T("Moron.");
00422 }
00423
00424 const TCHAR *IGameExporter::OtherMessage2()
00425 {
00426
00427 return _T("Don't read this.");
00428 }
00429
00430 unsigned int IGameExporter::Version()
00431 {
00432
00433 return 1;
00434 }
00435
00436 void IGameExporter::ShowAbout(HWND hWnd)
00437 {
00438
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);
00461 today.remove(today.length()-1);
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
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
00547
00548
00549
00550
00551
00552
00553
00554
00555
00556
00557
00558
00559
00560
00561
00562
00563
00564
00565
00566
00567
00568
00569
00570
00571
00572
00573
00574
00575
00576
00577
00578
00579
00580
00581
00582
00583
00584
00585
00586
00587 }
00588
00589
00590
00591
00592
00593
00594
00595
00596
00597
00598
00599
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
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;
00654
00655
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
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
00746 AngAxisFromQ(ap.q, &rotAngle, rotAxis);
00747 AngAxisFromQ(ap.u, &scaleAxAngle, scaleAxis);
00748
00749
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
00976 GMatrix m;
00977 DumpMatrix(Key[i].sampleKey.gval.ExtractMatrix3(),data);
00978 }
00979 }
00980 }
00981
00982
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
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
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
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
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
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
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
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
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
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
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)
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())
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)
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
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
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
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
02024 cm->SetCoordSystem(IGameConversionManager::IGAME_OGL);
02025
02026 pIgame->InitialiseIGame(false);
02027
02028
02029
02030
02031
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
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
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