nuclear@5: #include nuclear@5: #include nuclear@5: #include nuclear@5: #include nuclear@5: #include nuclear@5: #include "max.h" nuclear@5: #include "impexp.h" // SceneExport nuclear@5: #include "iparamb2.h" // ClassDesc2 nuclear@5: #include "plugapi.h" nuclear@5: #include "IGame.h" nuclear@5: #include "IGameExport.h" nuclear@5: #include "IConversionmanager.h" nuclear@5: nuclear@5: nuclear@5: #pragma comment (lib, "core.lib") nuclear@5: #pragma comment (lib, "geom.lib") nuclear@5: #pragma comment (lib, "gfx.lib") nuclear@5: #pragma comment (lib, "mesh.lib") nuclear@5: #pragma comment (lib, "maxutil.lib") nuclear@5: #pragma comment (lib, "maxscrpt.lib") nuclear@5: #pragma comment (lib, "paramblk2.lib") nuclear@5: #pragma comment (lib, "msxml2.lib") nuclear@5: #pragma comment (lib, "igame.lib") nuclear@5: #pragma comment (lib, "comctl32.lib") nuclear@5: nuclear@5: nuclear@5: static FILE *logfile; nuclear@5: static HINSTANCE hinst; nuclear@5: nuclear@5: class GoatExporter : public SceneExport { nuclear@5: public: nuclear@5: IGameScene *igame; nuclear@5: nuclear@5: int ExtCount(); nuclear@5: const TCHAR *Ext(int n); nuclear@5: const TCHAR *LongDesc(); nuclear@5: const TCHAR *ShortDesc(); nuclear@5: const TCHAR *AuthorName(); nuclear@5: const TCHAR *CopyrightMessage(); nuclear@5: const TCHAR *OtherMessage1(); nuclear@5: const TCHAR *OtherMessage2(); nuclear@5: unsigned int Version(); nuclear@5: void ShowAbout(HWND win); nuclear@5: nuclear@5: int DoExport(const MCHAR *name, ExpInterface *eiface, Interface *iface, BOOL silent = FALSE, DWORD opt = 0); nuclear@5: nuclear@5: bool export_materials(FILE *fp); nuclear@5: }; nuclear@5: nuclear@5: nuclear@5: int GoatExporter::ExtCount() nuclear@5: { nuclear@5: return 1; nuclear@5: } nuclear@5: nuclear@5: const TCHAR *GoatExporter::Ext(int n) nuclear@5: { nuclear@5: return L"txt"; nuclear@5: } nuclear@5: nuclear@5: const TCHAR *GoatExporter::LongDesc() nuclear@5: { nuclear@5: return L"Goat3D scene file"; nuclear@5: } nuclear@5: nuclear@5: const TCHAR *GoatExporter::ShortDesc() nuclear@5: { nuclear@5: return L"Goat3D"; nuclear@5: } nuclear@5: nuclear@5: const TCHAR *GoatExporter::AuthorName() nuclear@5: { nuclear@5: return L"John Tsiombikas"; nuclear@5: } nuclear@5: nuclear@5: const TCHAR *GoatExporter::CopyrightMessage() nuclear@5: { nuclear@5: return L"Copyright 2013 (C) John Tsiombikas - GNU General Public License v3, see COPYING for details."; nuclear@5: } nuclear@5: nuclear@5: const TCHAR *GoatExporter::OtherMessage1() nuclear@5: { nuclear@5: return L"other1"; nuclear@5: } nuclear@5: nuclear@5: const TCHAR *GoatExporter::OtherMessage2() nuclear@5: { nuclear@5: return L"other2"; nuclear@5: } nuclear@5: nuclear@5: unsigned int GoatExporter::Version() nuclear@5: { nuclear@5: return 10; nuclear@5: } nuclear@5: nuclear@5: void GoatExporter::ShowAbout(HWND win) nuclear@5: { nuclear@5: MessageBoxA(win, "Goat3D exporter plugin", "About this plugin", 0); nuclear@5: } nuclear@5: nuclear@5: int GoatExporter::DoExport(const MCHAR *name, ExpInterface *eiface, Interface *iface, nuclear@5: BOOL non_interactive, DWORD opt) nuclear@5: { nuclear@5: char fname[512]; nuclear@5: wcstombs(fname, name, sizeof fname - 1); nuclear@5: nuclear@5: FILE *fp = fopen(fname, "wb"); nuclear@5: if(!fp) { nuclear@5: fprintf(logfile, "failed to open %s for writting: %s", fname, strerror(errno)); nuclear@5: return IMPEXP_FAIL; nuclear@5: } nuclear@5: nuclear@5: if(!(igame = GetIGameInterface())) { nuclear@5: fprintf(logfile, "failed to get the igame interface\n"); nuclear@5: fclose(fp); nuclear@5: return IMPEXP_FAIL; nuclear@5: } nuclear@5: IGameConversionManager *cm = GetConversionManager(); nuclear@5: cm->SetCoordSystem(IGameConversionManager::IGAME_OGL); nuclear@5: igame->InitialiseIGame(); nuclear@5: igame->SetStaticFrame(0); nuclear@5: nuclear@5: export_materials(fp); nuclear@5: nuclear@5: fclose(fp); nuclear@5: nuclear@5: return IMPEXP_SUCCESS; nuclear@5: } nuclear@5: nuclear@5: bool GoatExporter::export_materials(FILE *fp) nuclear@5: { nuclear@5: IGameProperty *prop; nuclear@5: nuclear@5: int num_mtl = igame->GetRootMaterialCount(); nuclear@5: fprintf(fp, "number of materials: %d\n", num_mtl); nuclear@5: nuclear@5: for(int i=0; iGetRootMaterial(i); nuclear@5: if(mtl) { nuclear@5: Point3 diffuse(1, 1, 1); nuclear@5: Point3 specular(0, 0, 0); nuclear@5: float shin = 1.0, sstr = 1.0; nuclear@5: char name[512] = "unnamed"; nuclear@5: nuclear@5: const MCHAR *wname = mtl->GetMaterialName(); nuclear@5: if(wname) { nuclear@5: wcstombs(name, wname, sizeof name - 1); nuclear@5: } nuclear@5: nuclear@5: if((prop = mtl->GetDiffuseData())) { nuclear@5: prop->GetPropertyValue(diffuse); nuclear@5: } nuclear@5: if((prop = mtl->GetSpecularData())) { nuclear@5: prop->GetPropertyValue(specular); nuclear@5: } nuclear@5: if((prop = mtl->GetSpecularLevelData())) { nuclear@5: prop->GetPropertyValue(sstr); nuclear@5: } nuclear@5: if((prop = mtl->GetGlossinessData())) { nuclear@5: prop->GetPropertyValue(shin); nuclear@5: } nuclear@5: nuclear@5: fprintf(fp, "Material %d (%s):\n", i, name); nuclear@5: fprintf(fp, " diffuse: %f %f %f\n", diffuse[0], diffuse[1], diffuse[2]); nuclear@5: fprintf(fp, " specular: %f %f %f\n", specular[0] * sstr, specular[1] * sstr, specular[2] * sstr); nuclear@5: fprintf(fp, " shininess: %f\n", shin * 100.0); nuclear@5: nuclear@5: for(int j=0; jGetNumberOfTextureMaps(); j++) { nuclear@5: IGameTextureMap *tex = mtl->GetIGameTextureMap(j); nuclear@5: const MCHAR *wfname = tex->GetBitmapFileName(); nuclear@5: if(wfname) { nuclear@5: char fname[512]; nuclear@5: wcstombs(fname, wfname, sizeof fname - 1); nuclear@5: fprintf(fp, " texture%d: %s\n", j, fname); nuclear@5: } nuclear@5: } nuclear@5: } nuclear@5: } nuclear@5: nuclear@5: return true; nuclear@5: } nuclear@5: nuclear@5: // ------------------------------------------ nuclear@5: nuclear@5: class GoatClassDesc : public ClassDesc2 { nuclear@5: public: nuclear@5: int IsPublic() { return TRUE; } nuclear@5: void *Create(BOOL loading = FALSE) { return new GoatExporter; } nuclear@5: const TCHAR *ClassName() { return L"GoatExporter"; } nuclear@5: SClass_ID SuperClassID() { return SCENE_EXPORT_CLASS_ID; } nuclear@5: Class_ID ClassID() { return Class_ID(0x77050f0d, 0x7d4c5ab5); } nuclear@5: const TCHAR *Category() { return L"Mutant Stargoat"; } nuclear@5: nuclear@5: const TCHAR *InternalName() { return L"GoatExporter"; } nuclear@5: HINSTANCE HInstance() { return hinst; } nuclear@5: }; nuclear@5: nuclear@5: static GoatClassDesc class_desc; nuclear@5: nuclear@5: BOOL WINAPI DllMain(HINSTANCE inst_handle, ULONG reason, void *reserved) nuclear@5: { nuclear@5: if(reason == DLL_PROCESS_ATTACH) { nuclear@5: hinst = inst_handle; nuclear@5: DisableThreadLibraryCalls(hinst); nuclear@5: } nuclear@5: return TRUE; nuclear@5: } nuclear@5: nuclear@5: extern "C" { nuclear@5: nuclear@5: __declspec(dllexport) const TCHAR *LibDescription() nuclear@5: { nuclear@5: return L"test exporter"; nuclear@5: } nuclear@5: nuclear@5: __declspec(dllexport) int LibNumberClasses() nuclear@5: { nuclear@5: return 1; nuclear@5: } nuclear@5: nuclear@5: __declspec(dllexport) ClassDesc *LibClassDesc(int i) nuclear@5: { nuclear@5: return i == 0 ? &class_desc : 0; nuclear@5: } nuclear@5: nuclear@5: __declspec(dllexport) ULONG LibVersion() nuclear@5: { nuclear@5: return Get3DSMAXVersion(); nuclear@5: } nuclear@5: nuclear@5: __declspec(dllexport) int LibInitialize() nuclear@5: { nuclear@5: static char path[1024]; nuclear@5: nuclear@5: SHGetFolderPathA(0, CSIDL_PERSONAL, 0, 0, path); nuclear@5: strcat(path, "/testexp.log"); nuclear@5: nuclear@5: if((logfile = fopen(path, "w"))) { nuclear@5: setvbuf(logfile, 0, _IONBF, 0); nuclear@5: } nuclear@5: return TRUE; nuclear@5: } nuclear@5: nuclear@5: __declspec(dllexport) int LibShutdown() nuclear@5: { nuclear@5: if(logfile) { nuclear@5: fclose(logfile); nuclear@5: logfile = 0; nuclear@5: } nuclear@5: return TRUE; nuclear@5: } nuclear@5: nuclear@5: } // extern "C"