igame_test

annotate src/test.cc @ 0:01278d9b2d5e

initial commit
author John Tsiombikas <nuclear@member.fsf.org>
date Sun, 18 Aug 2013 06:10:03 +0300
parents
children
rev   line source
nuclear@0 1 #include <stdio.h>
nuclear@0 2 #include <string.h>
nuclear@0 3 #include <errno.h>
nuclear@0 4 #include <windows.h>
nuclear@0 5 #include <shlobj.h>
nuclear@0 6 #include "max.h"
nuclear@0 7 #include "impexp.h" // SceneExport
nuclear@0 8 #include "iparamb2.h" // ClassDesc2
nuclear@0 9 #include "plugapi.h"
nuclear@0 10 #include "IGame.h"
nuclear@0 11 #include "IGameExport.h"
nuclear@0 12 #include "IConversionmanager.h"
nuclear@0 13
nuclear@0 14
nuclear@0 15 #pragma comment (lib, "core.lib")
nuclear@0 16 #pragma comment (lib, "geom.lib")
nuclear@0 17 #pragma comment (lib, "gfx.lib")
nuclear@0 18 #pragma comment (lib, "mesh.lib")
nuclear@0 19 #pragma comment (lib, "maxutil.lib")
nuclear@0 20 #pragma comment (lib, "maxscrpt.lib")
nuclear@0 21 #pragma comment (lib, "paramblk2.lib")
nuclear@0 22 #pragma comment (lib, "msxml2.lib")
nuclear@0 23 #pragma comment (lib, "igame.lib")
nuclear@0 24 #pragma comment (lib, "comctl32.lib")
nuclear@0 25
nuclear@0 26
nuclear@0 27 static FILE *logfile;
nuclear@0 28 static HINSTANCE hinst;
nuclear@0 29
nuclear@0 30 class TestExporter : public SceneExport {
nuclear@0 31 public:
nuclear@0 32 IGameScene *igame;
nuclear@0 33
nuclear@0 34 int ExtCount();
nuclear@0 35 const TCHAR *Ext(int n);
nuclear@0 36 const TCHAR *LongDesc();
nuclear@0 37 const TCHAR *ShortDesc();
nuclear@0 38 const TCHAR *AuthorName();
nuclear@0 39 const TCHAR *CopyrightMessage();
nuclear@0 40 const TCHAR *OtherMessage1();
nuclear@0 41 const TCHAR *OtherMessage2();
nuclear@0 42 unsigned int Version();
nuclear@0 43 void ShowAbout(HWND win);
nuclear@0 44
nuclear@0 45 int DoExport(const MCHAR *name, ExpInterface *eiface, Interface *iface, BOOL silent = FALSE, DWORD opt = 0);
nuclear@0 46
nuclear@0 47 bool export_materials(FILE *fp);
nuclear@0 48 };
nuclear@0 49
nuclear@0 50
nuclear@0 51 int TestExporter::ExtCount()
nuclear@0 52 {
nuclear@0 53 return 1;
nuclear@0 54 }
nuclear@0 55
nuclear@0 56 const TCHAR *TestExporter::Ext(int n)
nuclear@0 57 {
nuclear@0 58 return L"txt";
nuclear@0 59 }
nuclear@0 60
nuclear@0 61 const TCHAR *TestExporter::LongDesc()
nuclear@0 62 {
nuclear@0 63 return L"Test exporter file";
nuclear@0 64 }
nuclear@0 65
nuclear@0 66 const TCHAR *TestExporter::ShortDesc()
nuclear@0 67 {
nuclear@0 68 return L"Test exporter";
nuclear@0 69 }
nuclear@0 70
nuclear@0 71 const TCHAR *TestExporter::AuthorName()
nuclear@0 72 {
nuclear@0 73 return L"John Tsiombikas";
nuclear@0 74 }
nuclear@0 75
nuclear@0 76 const TCHAR *TestExporter::CopyrightMessage()
nuclear@0 77 {
nuclear@0 78 return L"Public domain";
nuclear@0 79 }
nuclear@0 80
nuclear@0 81 const TCHAR *TestExporter::OtherMessage1()
nuclear@0 82 {
nuclear@0 83 return L"other1";
nuclear@0 84 }
nuclear@0 85
nuclear@0 86 const TCHAR *TestExporter::OtherMessage2()
nuclear@0 87 {
nuclear@0 88 return L"other2";
nuclear@0 89 }
nuclear@0 90
nuclear@0 91 unsigned int TestExporter::Version()
nuclear@0 92 {
nuclear@0 93 return 10;
nuclear@0 94 }
nuclear@0 95
nuclear@0 96 void TestExporter::ShowAbout(HWND win)
nuclear@0 97 {
nuclear@0 98 MessageBoxA(win, "TestExporter plugin", "About this plugin", 0);
nuclear@0 99 }
nuclear@0 100
nuclear@0 101 int TestExporter::DoExport(const MCHAR *name, ExpInterface *eiface, Interface *iface,
nuclear@0 102 BOOL non_interactive, DWORD opt)
nuclear@0 103 {
nuclear@0 104 char fname[512];
nuclear@0 105 wcstombs(fname, name, sizeof fname - 1);
nuclear@0 106
nuclear@0 107 FILE *fp = fopen(fname, "wb");
nuclear@0 108 if(!fp) {
nuclear@0 109 fprintf(logfile, "failed to open %s for writting: %s", fname, strerror(errno));
nuclear@0 110 return IMPEXP_FAIL;
nuclear@0 111 }
nuclear@0 112
nuclear@0 113 if(!(igame = GetIGameInterface())) {
nuclear@0 114 fprintf(logfile, "failed to get the igame interface\n");
nuclear@0 115 fclose(fp);
nuclear@0 116 return IMPEXP_FAIL;
nuclear@0 117 }
nuclear@0 118 IGameConversionManager *cm = GetConversionManager();
nuclear@0 119 cm->SetCoordSystem(IGameConversionManager::IGAME_OGL);
nuclear@0 120 igame->InitialiseIGame();
nuclear@0 121 igame->SetStaticFrame(0);
nuclear@0 122
nuclear@0 123 export_materials(fp);
nuclear@0 124
nuclear@0 125 fclose(fp);
nuclear@0 126
nuclear@0 127 return IMPEXP_SUCCESS;
nuclear@0 128 }
nuclear@0 129
nuclear@0 130 bool TestExporter::export_materials(FILE *fp)
nuclear@0 131 {
nuclear@0 132 IGameProperty *prop;
nuclear@0 133
nuclear@0 134 int num_mtl = igame->GetRootMaterialCount();
nuclear@0 135 fprintf(fp, "number of materials: %d\n", num_mtl);
nuclear@0 136
nuclear@0 137 for(int i=0; i<num_mtl; i++) {
nuclear@0 138 IGameMaterial *mtl = igame->GetRootMaterial(i);
nuclear@0 139 if(mtl) {
nuclear@0 140 Point3 diffuse(1, 1, 1);
nuclear@0 141 Point3 specular(0, 0, 0);
nuclear@0 142 float shin = 1.0, sstr = 1.0;
nuclear@0 143 char name[512] = "unnamed";
nuclear@0 144
nuclear@0 145 const MCHAR *wname = mtl->GetMaterialName();
nuclear@0 146 if(wname) {
nuclear@0 147 wcstombs(name, wname, sizeof name - 1);
nuclear@0 148 }
nuclear@0 149
nuclear@0 150 if((prop = mtl->GetDiffuseData())) {
nuclear@0 151 prop->GetPropertyValue(diffuse);
nuclear@0 152 }
nuclear@0 153 if((prop = mtl->GetSpecularData())) {
nuclear@0 154 prop->GetPropertyValue(specular);
nuclear@0 155 }
nuclear@0 156 if((prop = mtl->GetSpecularLevelData())) {
nuclear@0 157 prop->GetPropertyValue(sstr);
nuclear@0 158 }
nuclear@0 159 if((prop = mtl->GetGlossinessData())) {
nuclear@0 160 prop->GetPropertyValue(shin);
nuclear@0 161 }
nuclear@0 162
nuclear@0 163 fprintf(fp, "Material %d (%s):\n", i, name);
nuclear@0 164 fprintf(fp, " diffuse: %f %f %f\n", diffuse[0], diffuse[1], diffuse[2]);
nuclear@0 165 fprintf(fp, " specular: %f %f %f\n", specular[0] * sstr, specular[1] * sstr, specular[2] * sstr);
nuclear@0 166 fprintf(fp, " shininess: %f\n", shin * 100.0);
nuclear@0 167
nuclear@0 168 for(int j=0; j<mtl->GetNumberOfTextureMaps(); j++) {
nuclear@0 169 IGameTextureMap *tex = mtl->GetIGameTextureMap(j);
nuclear@0 170 const MCHAR *wfname = tex->GetBitmapFileName();
nuclear@0 171 if(wfname) {
nuclear@0 172 char fname[512];
nuclear@0 173 wcstombs(fname, wfname, sizeof fname - 1);
nuclear@0 174 fprintf(fp, " texture%d: %s\n", j, fname);
nuclear@0 175 }
nuclear@0 176 }
nuclear@0 177 }
nuclear@0 178 }
nuclear@0 179
nuclear@0 180 return true;
nuclear@0 181 }
nuclear@0 182
nuclear@0 183 // ------------------------------------------
nuclear@0 184
nuclear@0 185 class TestClassDesc : public ClassDesc2 {
nuclear@0 186 public:
nuclear@0 187 int IsPublic() { return TRUE; }
nuclear@0 188 void *Create(BOOL loading = FALSE) { return new TestExporter; }
nuclear@0 189 const TCHAR *ClassName() { return L"TestExporter"; }
nuclear@0 190 SClass_ID SuperClassID() { return SCENE_EXPORT_CLASS_ID; }
nuclear@0 191 Class_ID ClassID() { return Class_ID(0x77050f0d, 0x7d4c5ab5); }
nuclear@0 192 const TCHAR *Category() { return L"Mutant Stargoat"; }
nuclear@0 193
nuclear@0 194 const TCHAR *InternalName() { return L"TestExporter"; }
nuclear@0 195 HINSTANCE HInstance() { return hinst; }
nuclear@0 196 };
nuclear@0 197
nuclear@0 198 static TestClassDesc class_desc;
nuclear@0 199
nuclear@0 200 BOOL WINAPI DllMain(HINSTANCE inst_handle, ULONG reason, void *reserved)
nuclear@0 201 {
nuclear@0 202 if(reason == DLL_PROCESS_ATTACH) {
nuclear@0 203 hinst = inst_handle;
nuclear@0 204 DisableThreadLibraryCalls(hinst);
nuclear@0 205 }
nuclear@0 206 return TRUE;
nuclear@0 207 }
nuclear@0 208
nuclear@0 209 extern "C" {
nuclear@0 210
nuclear@0 211 __declspec(dllexport) const TCHAR *LibDescription()
nuclear@0 212 {
nuclear@0 213 return L"test exporter";
nuclear@0 214 }
nuclear@0 215
nuclear@0 216 __declspec(dllexport) int LibNumberClasses()
nuclear@0 217 {
nuclear@0 218 return 1;
nuclear@0 219 }
nuclear@0 220
nuclear@0 221 __declspec(dllexport) ClassDesc *LibClassDesc(int i)
nuclear@0 222 {
nuclear@0 223 return i == 0 ? &class_desc : 0;
nuclear@0 224 }
nuclear@0 225
nuclear@0 226 __declspec(dllexport) ULONG LibVersion()
nuclear@0 227 {
nuclear@0 228 return Get3DSMAXVersion();
nuclear@0 229 }
nuclear@0 230
nuclear@0 231 __declspec(dllexport) int LibInitialize()
nuclear@0 232 {
nuclear@0 233 static char path[1024];
nuclear@0 234
nuclear@0 235 SHGetFolderPathA(0, CSIDL_PERSONAL, 0, 0, path);
nuclear@0 236 strcat(path, "/testexp.log");
nuclear@0 237
nuclear@0 238 if((logfile = fopen(path, "w"))) {
nuclear@0 239 setvbuf(logfile, 0, _IONBF, 0);
nuclear@0 240 }
nuclear@0 241 return TRUE;
nuclear@0 242 }
nuclear@0 243
nuclear@0 244 __declspec(dllexport) int LibShutdown()
nuclear@0 245 {
nuclear@0 246 if(logfile) {
nuclear@0 247 fclose(logfile);
nuclear@0 248 logfile = 0;
nuclear@0 249 }
nuclear@0 250 return TRUE;
nuclear@0 251 }
nuclear@0 252
nuclear@0 253 } // extern "C"