00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014 #include "pcggui.h"
00015 #include <map>
00016
00017 #define pcggui_CLASS_ID Class_ID(0x67910a43, 0xc56b6dbc)
00018
00019 static pcggui thepcggui;
00020 static FILE *file;
00021
00022 #define SKIN_INTERFACE 0x00010000
00023 #define SKIN_CLASS_ID Class_ID(9815843,87654)
00024 #define PHYSIQUE_CLASS_ID Class_ID(PHYSIQUE_CLASS_ID_A, PHYSIQUE_CLASS_ID_B)
00025
00026 typedef signed int sint32;
00027 typedef std::map<INode*, uint> TInodePtrInt;
00028
00029
00030
00031
00032 class pcgguiClassDesc : public ClassDesc2 {
00033 public:
00034 int IsPublic() { return TRUE; }
00035 void * Create(BOOL loading = FALSE) { return &thepcggui; }
00036 const TCHAR * ClassName() { return GetString(IDS_CLASS_NAME); }
00037 SClass_ID SuperClassID() { return UTILITY_CLASS_ID; }
00038 Class_ID ClassID() { return pcggui_CLASS_ID; }
00039 const TCHAR* Category() { return GetString(IDS_CATEGORY); }
00040
00041 const TCHAR* InternalName() { return _T("pcggui"); }
00042 HINSTANCE HInstance() { return hInstance; }
00043
00044
00045 };
00046
00047 static pcgguiClassDesc pcgguiDesc;
00048 ClassDesc2* GetpcgguiDesc() { return &pcgguiDesc; }
00049
00050
00051
00052
00053 static BOOL CALLBACK pcgguiDlgProc(
00054 HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
00055 {
00056 switch (msg) {
00057 case WM_INITDIALOG:
00058 thepcggui.Init(hWnd);
00059 break;
00060
00061 case WM_DESTROY:
00062 thepcggui.Destroy(hWnd);
00063 break;
00064
00065 case WM_COMMAND:
00066 switch(LOWORD(wParam)) {
00067 case IDC_BUTTON_CONVERT:
00068 thepcggui.CovertScene();
00069 break;
00070
00071 case IDC_REFERENCE_MODEL:
00072 thepcggui.SetReferenceModelMode(IsDlgButtonChecked(hWnd, IDC_REFERENCE_MODEL));
00073 break;
00074
00075 case IDC_BUTTON_EXPORT:
00076 thepcggui.ExportAll();
00077 break;
00078
00079 case IDC_BUTTON_SAVE:
00080 thepcggui.SaveAll();
00081 break;
00082
00083 case IDC_BUTTON_LOAD:
00084 thepcggui.LoadAll();
00085 break;
00086
00087 case IDC_BUTTON_SAVE_ANALYZER:
00088 thepcggui.SaveAnalyzer();
00089 break;
00090
00091 case IDC_BUTTON_LOAD_ANALYZER:
00092 thepcggui.LoadAnalyzer();
00093 break;
00094
00095 case IDC_BUTTON_ANALYZE:
00096 thepcggui.Analyze();
00097 break;
00098
00099 case IDC_BUTTON_RENDER:
00100 thepcggui.Render();
00101 break;
00102
00103 default:
00104 break;
00105 };
00106 break;
00107
00108
00109 case WM_LBUTTONDOWN:
00110 case WM_LBUTTONUP:
00111 case WM_MOUSEMOVE:
00112 thepcggui.ip->RollupMouseMessage(hWnd,msg,wParam,lParam);
00113 break;
00114
00115 default:
00116 return FALSE;
00117 }
00118 return TRUE;
00119 }
00120
00121
00122 class NullView: public View {
00123 public:
00124 Point2 ViewToScreen(Point3 p) { return Point2(p.x,p.y); }
00125 NullView() { worldToView.IdentityMatrix(); screenW=640.0f; screenH = 480.0f; }
00126 };
00127
00128
00129
00130 pcggui::pcggui()
00131 {
00132 iu = NULL;
00133 ip = NULL;
00134 hPanel = NULL;
00135 }
00136
00137 pcggui::~pcggui()
00138 {
00139
00140 }
00141
00142 void pcggui::BeginEditParams(Interface *ip,IUtil *iu)
00143 {
00144 fopen_s(&file,"c:\\testdebug.txt","w");
00145 fprintf(file,"");
00146 fclose(file);
00147 fopen_s(&file,"c:\\testdebug.txt","a");
00148 fprintf(file,"\nFile Opened\n");
00149 this->iu = iu;
00150 this->ip = ip;
00151 hPanel = ip->AddRollupPage(
00152 hInstance,
00153 MAKEINTRESOURCE(IDD_PANEL),
00154 pcgguiDlgProc,
00155 GetString(IDS_PARAMS),
00156 0);
00157 }
00158
00159 void pcggui::EndEditParams(Interface *ip,IUtil *iu)
00160 {
00161 this->iu = NULL;
00162 this->ip = NULL;
00163 ip->DeleteRollupPage(hPanel);
00164 hPanel = NULL;
00165 fclose(file);
00166 }
00167
00168 void pcggui::Init(HWND hWnd)
00169 {
00170 fprintf(file,"Init\n");
00171 }
00172
00173 void pcggui::Destroy(HWND hWnd)
00174 {
00175 fprintf(file,"Destroy\n");
00176 }
00177
00178 void pcggui::CovertScene() {
00179 model::ExampleModel* em = new model::ExampleModel();
00180 model::ReferenceModel* rm = new model::ReferenceModel();
00181 TimeValue currtime = thepcggui.ip->GetTime();
00182 INode* node;
00183 BOOL needDel;
00184 NullView nullView;
00185 unsigned long offset = 0;
00186 unsigned long tmpOffset = 0;
00187
00188 if(thepcggui.ip->GetRootNode()->NumberOfChildren() > 0) {
00189 for(int n=0;n<thepcggui.ip->GetRootNode()->NumberOfChildren();n++) {
00190
00191 node = thepcggui.ip->GetRootNode()->GetChildNode(n);
00192 ObjectState os = node->EvalWorldState(currtime);
00193
00195
00196
00197
00198 Object* pObj = node->GetObjectRef();
00199
00200
00201 while (pObj && pObj->SuperClassID() == GEN_DERIVOB_CLASS_ID) {
00202 IDerivedObject* pDerObj = (IDerivedObject*) pObj;
00203
00204 for (int Idx = 0; Idx < pDerObj->NumModifiers(); Idx++) {
00205 Modifier* mod = pDerObj->GetModifier(Idx);
00206 DebugPrint("Mod Name: %s\n",mod->GetName());
00207 DebugPrint("Mod class ID: 0x%x - %d\n",mod->ClassID(),mod->ClassID());
00208
00209
00210
00211
00212
00213 }
00214
00215
00216 pObj = pDerObj->GetObjRef();
00217 }
00218
00219
00220 if(os.obj->SuperClassID()==GEOMOBJECT_CLASS_ID) {
00221 if(node->GetBoneNodeOnOff()) {
00222 if(refModel) {
00223 ConvertBone(node,rm);
00224 }
00225 } else {
00226 Mesh *mesh = ((GeomObject*)os.obj)->GetRenderMesh(thepcggui.ip->GetTime(),node,nullView,needDel);
00227 if (!mesh) return;
00228
00229 mesh->buildNormals();
00230 Matrix3 tm = node->GetObjTMAfterWSM(thepcggui.ip->GetTime());
00231 for (int i=0; i<mesh->getNumVerts(); i++) {
00232 Point3 v = (tm * mesh->verts[i]);
00233 model::Vertex* vertex = new model::Vertex();
00234 vertex->setCoordinates(v.x, v.y, v.z);
00235 vertex->setNormal(mesh->getNormal(i).x,mesh->getNormal(i).y,mesh->getNormal(i).z);
00236 if(refModel) {
00237 rm->addVertex(vertex);
00238 } else {
00239 em->addVertex(vertex);
00240 }
00241 tmpOffset = i;
00242 }
00243 for (int i=0; i<mesh->getNumFaces(); i++) {
00244 model::Face* face = new model::Face();
00245 if(refModel) {
00246 face->setVertices(
00247 rm->getVertex(offset + (int)mesh->faces[i].v[0]),
00248 rm->getVertex(offset + (int)mesh->faces[i].v[1]),
00249 rm->getVertex(offset + (int)mesh->faces[i].v[2]));
00250 rm->addFace(face);
00251 } else {
00252 face->setVertices(
00253 em->getVertex(offset + (int)mesh->faces[i].v[0]),
00254 em->getVertex(offset + (int)mesh->faces[i].v[1]),
00255 em->getVertex(offset + (int)mesh->faces[i].v[2]));
00256 em->addFace(face);
00257 }
00258 }
00259 offset = tmpOffset;
00260 }
00261 }
00262 }
00263 for(int n=0;n<thepcggui.ip->GetRootNode()->NumberOfChildren();n++) {
00264 node = thepcggui.ip->GetRootNode()->GetChildNode(n);
00265 ObjectState os = node->EvalWorldState(currtime);
00266 if(os.obj->SuperClassID()==GEOMOBJECT_CLASS_ID) {
00267 if(!node->GetBoneNodeOnOff()) {
00268 if(refModel) {
00269 DebugPrint("Error Code: %d\n",ConvertSkin(node,rm));
00270 }
00271 }
00272 }
00273 }
00274 if(refModel) {
00275 referenceModels.push_back(rm);
00276 } else {
00277 exampleModels.push_back(em);
00278 }
00279 }
00280 }
00281
00282 void pcggui::ConvertBone(INode* pParent, model::ReferenceModel* rm) {
00283 DebugPrint("Sub Named Object: \"%s\"\n",pParent->GetName());
00284
00285 rm->getSkeleton()->addBone(NULL,NULL,10,pParent->GetName());
00286
00287 for(int q=0;q<pParent->NumberOfChildren();q++) {
00288 ConvertBone(pParent->GetChildNode(q),rm);
00289 }
00290 }
00291
00292 void pcggui::ExportAll() {
00293 functions::Exporter ex = functions::Exporter();
00294 char tmp[100];
00295
00296 for(int i=0; i<exampleModels.size(); i++) {
00297 sprintf_s(tmp,"c:\\exampleModel%d.x3d",i);
00298 ex.exportModel(exampleModels[i],tmp);
00299 }
00300
00301 for(int i=0; i<referenceModels.size(); i++) {
00302 sprintf_s(tmp,"c:\\referenceModel%d.x3d",i);
00303 ex.exportModel(referenceModels[i],tmp);
00304 }
00305
00306 }
00307
00308 void pcggui::SaveAll() {
00309 char tmp[100];
00310
00311 for(int i=0; i<exampleModels.size(); i++) {
00312 sprintf_s(tmp,"c:\\savedExampleModel%d.pcg",i);
00313 exampleModels[i]->save(tmp);
00314 }
00315
00316 for(int i=0; i<referenceModels.size(); i++) {
00317 sprintf_s(tmp,"c:\\savedReferenceModel%d.pcg",i);
00318 referenceModels[i]->save(tmp);
00319 }
00320 }
00321
00322 void pcggui::LoadAll() {
00323 char tmp[100];
00324 int number = 10;
00325
00326 exampleModels.clear();
00327 referenceModels.clear();
00328
00329 for(int i=0; i<number; i++) {
00330 sprintf_s(tmp,"c:\\savedExampleModel%d.pcg",i);
00331 model::ExampleModel* em = new model::ExampleModel();
00332 if(em->load(tmp)) {
00333 exampleModels.push_back(em);
00334 }
00335 }
00336
00337 for(int i=0; i<number; i++) {
00338 sprintf_s(tmp,"c:\\savedReferenceModel%d.pcg",i);
00339 model::ReferenceModel* rm = new model::ReferenceModel();
00340 if(rm->load(tmp)) {
00341 referenceModels.push_back(rm);
00342 }
00343 }
00344 }
00345
00346 void pcggui::SaveAnalyzer() {
00347 pca.save("c:\\PCG-ANALYZER");
00348 }
00349
00350 void pcggui::LoadAnalyzer() {
00351 pca.load("c:\\PCG-ANALYZER");
00352 }
00353
00354 void pcggui::Analyze() {
00355 DebugPrint("*************Starting to Analyze*************\n");
00356 pca.mergeData(*referenceModels[0],exampleModels);
00357 DebugPrint("Calculating mean\n");
00358 pca.mean();
00359 DebugPrint("Adjusting data\n");
00360 pca.adjust();
00361 DebugPrint("Finding Covariance\n");
00362 pca.covariance();
00363 DebugPrint("Begin EigenVector calculations\n");
00364 DebugPrint("Timer Started\n");
00365 clock_t begin = clock();
00366 pca.findComponents(model::Analyzer::HOUSEHOLDER);
00367 clock_t end = clock();
00368 DebugPrint("Timer Stopped\n");
00369 DebugPrint("Time elapsed in seconds: %d\n", difftime(end, begin));
00370 DebugPrint("End EigenVector calculations\n");
00371 pca.computeEnergy();
00372 pca.selectComponents();
00373 pca.transformation();
00374 }
00375
00376 void pcggui::Render() {
00377 Mesh mesh;
00378 model::ExampleModel* em = exampleModels[0];
00379 mesh.setNumVerts(em->getVertexs().size());
00380 mesh.setNumFaces(em->getFaces().size());
00381 for(int i=0;i<em->getVertexs().size();i++) {
00382 Vertex* v = em->getVertex(i);
00383 mesh.setVert(i,Point3(v->getCoordinates()->x,v->getCoordinates()->y,v->getCoordinates()->z));
00384 mesh.setNormal(i,Point3(v->getNormal()->x,v->getNormal()->y,v->getNormal()->z));
00385 }
00386 for(int i=0;i<em->getFaces().size();i++) {
00387 model::Face* f = em->getFace(i);
00388 mesh.faces[i].setVerts(f->getVertex(0)->getIndex(),f->getVertex(1)->getIndex(),f->getVertex(2)->getIndex());
00389 }
00390
00391
00392
00393
00394
00395 GeomObject *obj = (GeomObject*)ip->CreateInstance(GEOMOBJECT_CLASS_ID, Class_ID(BOXOBJ_CLASS_ID ,0));
00396 assert(obj);
00397
00398
00399
00400
00401
00402
00403
00404
00405 IDerivedObject *dobj = CreateDerivedObject(obj);
00406
00407
00408 INode *node = ip->CreateObjectNode(dobj);
00409
00410
00411 TSTR name(_T("MyNode"));
00412 ip->MakeNameUnique(name);
00413 node->SetName(name);
00414
00415
00416 Object *oldObj = node->GetObjectRef();
00417 ObjectState os = oldObj->Eval(ip->GetTime());
00418
00419
00420 Object *newobj = (Object*)os.obj->Clone();
00421 newobj->SetSubSelState(0);
00422 oldObj->SetAFlag(A_LOCK_TARGET);
00423 node->SetObjectRef(newobj);
00424 node->NotifyDependents(FOREVER,0,REFMSG_SUBANIM_STRUCTURE_CHANGED);
00425 oldObj->ClearAFlag(A_LOCK_TARGET);
00426 oldObj->MaybeAutoDelete();
00427
00428
00429
00430 ip->RedrawViews(ip->GetTime());
00431
00432 }
00433
00434
00435
00436
00437 Modifier* pcggui::getModifier (INode* pNode, Class_ID modCID)
00438 {
00439 Object* pObj = pNode->GetObjectRef();
00440
00441 if (!pObj)
00442 return NULL;
00443
00444 ObjectState os = pNode->EvalWorldState(0);
00445 if (os.obj && (os.obj->SuperClassID() != GEOMOBJECT_CLASS_ID) && (os.obj->SuperClassID() != LIGHT_CLASS_ID) )
00446 {
00447 return NULL;
00448 }
00449
00450
00451 while (pObj && (pObj->SuperClassID() == GEN_DERIVOB_CLASS_ID))
00452 {
00453 IDerivedObject* pDObj = (IDerivedObject*)pObj;
00454 int m;
00455 int nNumMods = pDObj->NumModifiers();
00456
00457 for (m=0; m<nNumMods; ++m)
00458 {
00459 Modifier* pMod = pDObj->GetModifier(m);
00460 if (pMod)
00461 {
00462 if (pMod->ClassID() == modCID)
00463 {
00464
00465 return pMod;
00466 }
00467 }
00468 }
00469 pObj = pDObj->GetObjRef();
00470 }
00471
00472 return NULL;
00473 }
00474
00475 uint pcggui::ConvertSkin(INode* node, model::ReferenceModel* rm) {
00476
00477 uint ok=NoError;
00478
00479
00480 Modifier* skin=getModifier (node, SKIN_CLASS_ID);
00481
00482
00483 if (skin)
00484 {
00485
00486
00487
00488 ISkin *comSkinInterface=(ISkin*)skin->GetInterface (SKIN_INTERFACE);
00489
00490
00491 assert (comSkinInterface);
00492
00493
00494 if (comSkinInterface)
00495 {
00496
00497 ISkinContextData *localData=comSkinInterface->GetContextInterface(node);
00498
00499
00500 assert (localData);
00501
00502
00503 if (localData)
00504 {
00505
00506 uint vertCount=localData->GetNumPoints();
00507
00508
00509
00510 for (uint vert=0; vert<vertCount; vert++)
00511 {
00512
00513 uint boneCount=localData->GetNumAssignedBones (vert);
00514
00515
00516 if (boneCount==0)
00517 {
00518
00519 ok=VertexWithoutWeight;
00520 break;
00521 }
00522
00523
00524
00525 std::map<float, uint> weightMap;
00526
00527
00528 for (uint bone=0; bone<boneCount; bone++)
00529 {
00530
00531 float weight=localData->GetBoneWeight (vert, bone);
00532
00533
00534 uint boneId=localData->GetAssignedBone (vert, bone);
00535
00536
00537 weightMap.insert (std::map<float, uint>::value_type (weight, boneId));
00538 }
00539
00540
00541 float sum=0.f;
00542 std::map<float, uint>::iterator ite=weightMap.begin();
00543 while (ite!=weightMap.end())
00544 {
00545
00546 sum+=ite->first;
00547
00548
00549 ite++;
00550 }
00551
00552
00553 uint id=0;
00554 ite=weightMap.end();
00555 while (ite!=weightMap.begin())
00556 {
00557
00558 ite--;
00559
00560
00561 Bone* bone = rm->getSkeleton()->getBone(comSkinInterface->GetBone(ite->second)->GetName());
00562
00563
00564
00565 bone->addMapping(new model::Mapping(vert,ite->first/sum));
00566
00567
00568 id++;
00569 }
00570
00571 if (ite!=weightMap.begin())
00572 {
00573
00574 break;
00575 }
00576 }
00577 }
00578 }
00579
00580
00581 skin->ReleaseInterface (SKIN_INTERFACE, comSkinInterface);
00582 }
00583
00584
00585
00586
00587
00588
00589
00590
00591
00592
00593
00594
00595
00596
00597
00598
00599
00600
00601
00602
00603
00604
00605
00606
00607
00608
00609
00610
00611
00612
00613
00614
00615
00616
00617
00618
00619
00620
00621
00622
00623
00624
00625
00626
00627
00628
00629
00630
00631
00632
00633
00634
00635
00636
00637
00638
00639
00640
00641
00642
00643
00644
00645
00646
00647
00648
00649
00650
00651
00652
00653
00654
00655
00656
00657
00658
00659
00660
00661
00662
00663
00664
00665
00666
00667
00668
00669
00670
00671
00672
00673
00674
00675
00676
00677
00678
00679
00680
00681
00682
00683
00684
00685
00686
00687
00688
00689
00690
00691
00692
00693
00694
00695
00696
00697
00698
00699
00700
00701
00702
00703
00704
00705
00706
00707
00708
00709
00710
00711
00712
00713
00714
00715
00716
00717
00718
00719
00720
00721
00722
00723
00724
00725
00726
00727
00728
00729
00730
00731
00732
00733
00734
00735
00736
00737
00738
00739
00740
00741
00742
00743
00744
00745
00746
00747
00748
00749
00750
00751
00752
00753
00754
00755
00756
00757
00758
00759
00760
00761
00762
00763
00764
00765
00766
00767
00768
00769
00770
00771 return ok;
00772 }