//----------------------------------------------------------------------------- // Torque Game Engine // Copyright (C) GarageGames.com, Inc. //----------------------------------------------------------------------------- #pragma pack(push,8) #include #include #include #pragma pack(pop) #include "max2dtsExporter/SceneEnum.h" #include "max2dtsExporter/maxUtil.h" #include "Platform/platform.h" #include "Platform/platformAssert.h" #include "max2dtsExporter/exportUtil.h" #include "max2dtsExporter/exporter.h" extern HINSTANCE hInstance; extern TCHAR *GetString(S32); extern const char * GetVersionString(); #define EditBoxesToo 0x80000000 class ExportUtil : public UtilityObj { public: IUtil *iu; Interface *ip; HWND hPanel1; HWND hPanel1b; HWND hPanel2; HWND hPanel3; HWND hPanel4; HWND hPanel5; //Constructor/Destructor ExportUtil(); ~ExportUtil(); void BeginEditParams(Interface *ip, IUtil *iu); void EndEditParams(Interface *ip, IUtil *iu); void DeleteThis() {} void Init(HWND hWnd); void Destroy(HWND hWnd); void initializePanels(S32 mask = -1); }; static ExportUtil exportUtil; // This is the Class Descriptor for the U plug-in class ExportUtilClassDesc:public ClassDesc { public: S32 IsPublic() {return 1;} void * Create(BOOL loading = FALSE) { loading; return &exportUtil;} const TCHAR * ClassName() {return "DTS Exporter Utility";} SClass_ID SuperClassID() {return UTILITY_CLASS_ID;} Class_ID ClassID() {return ExportUtil_CLASS_ID;} const TCHAR* Category() {return "Exporter Utility";} void ResetClassParams (BOOL fileReset); }; static ExportUtilClassDesc exportUtilDesc; ClassDesc * GetExportUtilDesc() {return &exportUtilDesc;} Interface * GetMaxInterface() { return exportUtil.ip; } //TODO: Should implement this method to reset the plugin params when Max is reset void ExportUtilClassDesc::ResetClassParams (BOOL fileReset) { } #define MAX_FILENAME_LEN 128 char filenameBuffer[MAX_FILENAME_LEN]; void findFiles(const char * filePattern, Vector & matches) { WIN32_FIND_DATA findData; HANDLE searchHandle = FindFirstFile(filePattern,&findData); if (searchHandle != INVALID_HANDLE_VALUE) { matches.push_back(dStrdup(findData.cFileName)); while (FindNextFile(searchHandle,&findData)) matches.push_back(dStrdup(findData.cFileName)); } } void clearFindFiles(Vector & matches) { for (S32 i=0; iRollupMouseMessage(hWnd,msg,wParam,lParam); break; default: return FALSE; } return TRUE; } static BOOL CALLBACK RenumberDlgFunc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_INITDIALOG: break; case WM_DESTROY: break; case WM_COMMAND: { switch(LOWORD(wParam)) { case IDCANCEL: EndDialog(hWnd,-99); break; case IDOK: char buffer[128]; if (GetDlgItemText(hWnd,IDC_EDIT,buffer,128)>0) { int newSize = dAtoi(buffer); EndDialog(hWnd,newSize); } else EndDialog(hWnd,-99); break; } break; } case WM_LBUTTONDOWN: case WM_LBUTTONUP: case WM_MOUSEMOVE: break; default: return FALSE; } return TRUE; } static BOOL CALLBACK ExportUtilDlgProc1b(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_INITDIALOG: exportUtil.Init(hWnd); break; case WM_DESTROY: exportUtil.Destroy(hWnd); break; case WM_COMMAND: { OPENFILENAME ofn; switch(LOWORD(wParam)) { case IDC_EXPORT_WHOLE : initOFN(ofn,"Torque 3Space Shape File (*.dts)\0*.dts\0","dts","Export DTS",exportUtil.ip->GetDir(APP_EXPORT_DIR)); if (GetSaveFileName(&ofn)) exportUtil.ip->ExportToFile(ofn.lpstrFile); break; case IDC_EXPORT_SEQUENCES : initOFN(ofn,"Torque 3Space Sequence File (*.dsq)\0*.dsq\0","dsq","Export DSQ",exportUtil.ip->GetDir(APP_EXPORT_DIR)); if (GetSaveFileName(&ofn)) exportUtil.ip->ExportToFile(ofn.lpstrFile); break; case IDC_EXPORT_TEXT: initOFN(ofn,"Torque 3Space Scene Text Export (*.txt)\0*.txt\0","txt","Scene Text Export",exportUtil.ip->GetDir(APP_EXPORT_DIR)); if (GetSaveFileName(&ofn)) exportUtil.ip->ExportToFile(ofn.lpstrFile); break; case IDC_RENUMBER: { S32 newNumber = DialogBox(hInstance,MAKEINTRESOURCE(IDD_RENUMBER),hWnd,RenumberDlgFunc); if (newNumber >=0 && exportUtil.ip) renumberNodes(exportUtil.ip,newNumber); break; } case IDC_REGISTER_DETAILS: registerDetails(exportUtil.ip); break; case IDC_EMBED: embedSubtree(exportUtil.ip); break; } break; } case WM_LBUTTONDOWN: case WM_LBUTTONUP: case WM_MOUSEMOVE: exportUtil.ip->RollupMouseMessage(hWnd,msg,wParam,lParam); break; default: return FALSE; } return TRUE; } static BOOL CALLBACK ExportUtilDlgProc2(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_INITDIALOG: exportUtil.Init(hWnd); break; case WM_DESTROY: exportUtil.Destroy(hWnd); break; case WM_COMMAND: switch(LOWORD(wParam)) { case IDC_COLLAPSE : transformCollapse = !transformCollapse; break; case IDC_ENABLE_SEQUENCES : enableSequences = !enableSequences; break; case IDC_ENABLE_TWO_SIDED : enableTwoSidedMaterials = !enableTwoSidedMaterials; break; case IDC_ANIMATION_DELTA: if (HIWORD(wParam)==EN_CHANGE) { ICustEdit * edit = GetICustEdit( GetDlgItem(exportUtil.hPanel2,IDC_ANIMATION_DELTA) ); if (!edit->GotReturn()) return TRUE; F32 tmp = edit->GetFloat(); if (tmp > 10E-12f) animationDelta = tmp; ReleaseICustEdit(edit); exportUtil.initializePanels(2 + EditBoxesToo); } break; case IDC_BASE_TEXTURE_PATH: if (HIWORD(wParam)==EN_CHANGE) { ICustEdit * edit = GetICustEdit( GetDlgItem(exportUtil.hPanel2,IDC_BASE_TEXTURE_PATH) ); if (!edit->GotReturn()) return TRUE; char buffer[256]; edit->GetText(buffer,sizeof(buffer)); setBaseTexturePath(buffer); ReleaseICustEdit(edit); exportUtil.initializePanels(2 + EditBoxesToo); } break; default : break; } exportUtil.initializePanels(2); break; case WM_LBUTTONDOWN: case WM_LBUTTONUP: case WM_MOUSEMOVE: exportUtil.ip->RollupMouseMessage(hWnd,msg,wParam,lParam); break; default: return FALSE; } return TRUE; } static BOOL CALLBACK ExportUtilDlgProc3(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_INITDIALOG: exportUtil.Init(hWnd); break; case WM_DESTROY: exportUtil.Destroy(hWnd); break; case WM_COMMAND: switch(LOWORD(wParam)) { case IDC_ALLOW_EMPTY : allowEmptySubtrees = !allowEmptySubtrees; break; case IDC_ALLOW_CROSSED : allowCrossedDetails = !allowCrossedDetails; break; case IDC_ALLOW_UNUSED : allowUnusedMeshes = !allowUnusedMeshes; break; case IDC_ALLOW_OLD : allowOldSequences = !allowOldSequences; break; case IDC_REQUIRE_VICON : viconNeeded = !viconNeeded; break; } exportUtil.initializePanels(4); break; case WM_LBUTTONDOWN: case WM_LBUTTONUP: case WM_MOUSEMOVE: exportUtil.ip->RollupMouseMessage(hWnd,msg,wParam,lParam); break; default: return FALSE; } return TRUE; } static BOOL CALLBACK ExportUtilDlgProc4(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_INITDIALOG: exportUtil.Init(hWnd); break; case WM_DESTROY: exportUtil.Destroy(hWnd); break; case WM_COMMAND: { switch(LOWORD(wParam)) { case IDC_PASS1 : dumpMask ^= PDPass1; break; case IDC_PASS2 : dumpMask ^= PDPass2; break; case IDC_PASS3 : dumpMask ^= PDPass3; break; case IDC_NODE_STATES : dumpMask ^= PDNodeStates; break; case IDC_OBJECT_STATES : dumpMask ^= PDObjectStates; break; case IDC_NODE_STATE_DETAILS : dumpMask ^= PDNodeStateDetails; break; case IDC_OBJECT_STATE_DETAILS : dumpMask ^= PDObjectStateDetails; break; case IDC_OBJECT_OFFSETS : dumpMask ^= PDObjectOffsets; break; case IDC_SEQUENCE_DETAILS : dumpMask ^= PDSequences; break; case IDC_SHAPE_HIERARCHY : dumpMask ^= PDShapeHierarchy; break; } exportUtil.initializePanels(8); break; } case WM_LBUTTONDOWN: case WM_LBUTTONUP: case WM_MOUSEMOVE: exportUtil.ip->RollupMouseMessage(hWnd,msg,wParam,lParam); break; default: return FALSE; } return TRUE; } // ok,ok, so this should probably be in a header somewhere...so sue me extern char globalConfig[270]; static BOOL CALLBACK ExportUtilDlgProc5(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_INITDIALOG: exportUtil.Init(hWnd); break; case WM_DESTROY: exportUtil.Destroy(hWnd); break; case WM_COMMAND: { OPENFILENAME ofn; switch(LOWORD(wParam)) { case IDC_CONFIG_LOAD_DEFAULT : SceneEnumProc::readConfigFile(globalConfig); break; case IDC_CONFIG_SAVE_DEFAULT : SceneEnumProc::writeConfigFile(globalConfig); break; case IDC_CONFIG_LOAD : initOFN(ofn,"Exporter Configuration File (*.cfg)\0*.cfg\0","cfg","Load Configuration File",NULL); if (GetOpenFileName(&ofn)) SceneEnumProc::readConfigFile(ofn.lpstrFile); break; case IDC_CONFIG_SAVE : initOFN(ofn,"Exporter Configuration File (*.cfg)\0*.cfg\0","dsq","Save Configuration File",NULL); if (GetSaveFileName(&ofn)) SceneEnumProc::writeConfigFile(ofn.lpstrFile); break; } exportUtil.initializePanels(); break; } case WM_LBUTTONDOWN: case WM_LBUTTONUP: case WM_MOUSEMOVE: exportUtil.ip->RollupMouseMessage(hWnd,msg,wParam,lParam); break; default: return FALSE; } return TRUE; } ExportUtil::ExportUtil() { iu = NULL; ip = NULL; hPanel1 = NULL; hPanel1b = NULL; hPanel2 = NULL; hPanel3 = NULL; hPanel4 = NULL; hPanel5 = NULL; } ExportUtil::~ExportUtil() { } void ExportUtil::BeginEditParams(Interface *ip, IUtil *iu) { this->iu = iu; this->ip = ip; hPanel1 = ip->AddRollupPage( hInstance, MAKEINTRESOURCE(IDD_UTIL_PANEL1), ExportUtilDlgProc1, "About", 0, APPENDROLL_CLOSED); hPanel1b = ip->AddRollupPage( hInstance, MAKEINTRESOURCE(IDD_UTIL_PANEL1B), ExportUtilDlgProc1b, "Utilities", 0); hPanel2 = ip->AddRollupPage( hInstance, MAKEINTRESOURCE(IDD_UTIL_PANEL2), ExportUtilDlgProc2, "Parameters", 0, APPENDROLL_CLOSED); hPanel3 = ip->AddRollupPage( hInstance, MAKEINTRESOURCE(IDD_UTIL_PANEL3), ExportUtilDlgProc3, "Error Control", 0, APPENDROLL_CLOSED); hPanel4 = ip->AddRollupPage( hInstance, MAKEINTRESOURCE(IDD_UTIL_PANEL4), ExportUtilDlgProc4, "Dump File Control", 0, APPENDROLL_CLOSED); hPanel5 = ip->AddRollupPage( hInstance, MAKEINTRESOURCE(IDD_UTIL_PANEL5), ExportUtilDlgProc5, "Configuration Control", 0, APPENDROLL_CLOSED); initializePanels(); } void ExportUtil::EndEditParams(Interface *ip, IUtil *iu) { this->iu = NULL; this->ip = NULL; ip->DeleteRollupPage(hPanel1); hPanel1 = NULL; ip->DeleteRollupPage(hPanel1b); hPanel1b = NULL; ip->DeleteRollupPage(hPanel2); hPanel2 = NULL; ip->DeleteRollupPage(hPanel3); hPanel3 = NULL; ip->DeleteRollupPage(hPanel4); hPanel4 = NULL; ip->DeleteRollupPage(hPanel5); hPanel5 = NULL; } void ExportUtil::Init(HWND hWnd) { } void ExportUtil::Destroy(HWND hWnd) { } void ExportUtil::initializePanels(S32 mask) { ICustButton * button; ICustEdit * edit; char buffer[255]; // Panel 1 -- about panel if (mask & 1) { // add text to about panel dStrcpy(buffer,avar("Torque DTS Exporter\n%s\nCompiled %s\n%s",GetVersionString(),__DATE__,__TIME__)); SetDlgItemText(hPanel1,IDC_STATIC_ABOUT,buffer); } // Panel 2 -- Parameters if (mask&2) { CheckDlgButton(hPanel2,IDC_COLLAPSE,transformCollapse); CheckDlgButton(hPanel2,IDC_ENABLE_SEQUENCES,enableSequences); CheckDlgButton(hPanel2,IDC_ENABLE_TWO_SIDED,enableTwoSidedMaterials); if (mask & EditBoxesToo) { edit = GetICustEdit(GetDlgItem(hPanel2,IDC_ANIMATION_DELTA)); dStrcpy(buffer,avar("%f",animationDelta)); if (edit) // may already be locked { edit->SetText( buffer ); edit->WantReturn(true); ReleaseICustEdit(edit); } edit = GetICustEdit(GetDlgItem(hPanel2,IDC_BASE_TEXTURE_PATH)); dStrcpy(buffer,baseTexturePath); if (edit) { edit->SetText( buffer ); edit->WantReturn(true); ReleaseICustEdit(edit); } } } // Panel 3 -- Error Control if (mask & 4) { CheckDlgButton(hPanel3,IDC_ALLOW_EMPTY,allowEmptySubtrees); CheckDlgButton(hPanel3,IDC_ALLOW_CROSSED,allowCrossedDetails); CheckDlgButton(hPanel3,IDC_ALLOW_UNUSED,allowUnusedMeshes); CheckDlgButton(hPanel3,IDC_ALLOW_OLD,allowOldSequences); CheckDlgButton(hPanel3,IDC_REQUIRE_VICON,viconNeeded); } // Panel 4 -- Dump file control if (mask & 8) { CheckDlgButton(hPanel4,IDC_PASS1,dumpMask & PDPass1); CheckDlgButton(hPanel4,IDC_PASS2,dumpMask & PDPass2); CheckDlgButton(hPanel4,IDC_PASS3,dumpMask & PDPass3); CheckDlgButton(hPanel4,IDC_NODE_STATES,dumpMask & PDNodeStates); CheckDlgButton(hPanel4,IDC_OBJECT_STATES,dumpMask & PDObjectStates); CheckDlgButton(hPanel4,IDC_NODE_STATE_DETAILS,dumpMask & PDNodeStateDetails); CheckDlgButton(hPanel4,IDC_OBJECT_STATE_DETAILS,dumpMask & PDObjectStateDetails); CheckDlgButton(hPanel4,IDC_OBJECT_OFFSETS,dumpMask & PDObjectOffsets); CheckDlgButton(hPanel4,IDC_SEQUENCE_DETAILS,dumpMask & PDSequences); CheckDlgButton(hPanel4,IDC_SHAPE_HIERARCHY,dumpMask & PDShapeHierarchy); } // Panel 5 -- Configuration control if (mask & 16) { // make buttons push buttons rather than check buttons... button = GetICustButton(GetDlgItem(hPanel5,IDC_CONFIG_LOAD_DEFAULT)); button->SetType(CBT_PUSH); ReleaseICustButton(button); button = GetICustButton(GetDlgItem(hPanel5,IDC_CONFIG_SAVE_DEFAULT)); button->SetType(CBT_PUSH); ReleaseICustButton(button); button = GetICustButton(GetDlgItem(hPanel5,IDC_CONFIG_LOAD)); button->SetType(CBT_PUSH); ReleaseICustButton(button); button = GetICustButton(GetDlgItem(hPanel5,IDC_CONFIG_SAVE)); button->SetType(CBT_PUSH); ReleaseICustButton(button); } // Panel 1b -- Utility panel if (mask & 32) { // make buttons push buttons rather than check buttons... button = GetICustButton(GetDlgItem(hPanel1b,IDC_EXPORT_WHOLE)); button->SetType(CBT_PUSH); ReleaseICustButton(button); button = GetICustButton(GetDlgItem(hPanel1b,IDC_EXPORT_SEQUENCES)); button->SetType(CBT_PUSH); ReleaseICustButton(button); button = GetICustButton(GetDlgItem(hPanel1b,IDC_EXPORT_TEXT)); button->SetType(CBT_PUSH); ReleaseICustButton(button); button = GetICustButton(GetDlgItem(hPanel1b,IDC_RENUMBER)); button->SetType(CBT_PUSH); ReleaseICustButton(button); button = GetICustButton(GetDlgItem(hPanel1b,IDC_EMBED)); button->SetType(CBT_PUSH); ReleaseICustButton(button); button = GetICustButton(GetDlgItem(hPanel1b,IDC_REGISTER_DETAILS)); button->SetType(CBT_PUSH); ReleaseICustButton(button); } }