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" |