1 //
2 // i- X-Ray game object (*.ogf)
3 // i- X-Ray game skeletal motions (*.omf)
4 // i- X-Ray game detail object (*.dm)
5 // ie X-Ray object (*.object)
6 // -e X-Ray skeletal object (*.object)
7 // -e X-Ray skeletal motion (*.skl)
8 // i- X-Ray skeletal motions (.skls;*.skl)
9
10 #define NOMINMAX
11 #include <maya/MFnPlugin.h>
12 #include <maya/MPxFileTranslator.h>
13 #include "maya_import_tools.h"
14 #include "maya_export_tools.h"
15 #include "maya_xray_material.h"
16 #include "maya_fix_fpu_cw.h"
17 #include "maya_progress.h"
18 #include "xr_file_system.h"
19 #include "xr_log.h"
20 #include "xr_object.h"
21 #include "xr_dm.h"
22 #include "xr_ogf.h"
23 #include "xr_ogf_v4.h"
24 #include "xr_skl_motion.h"
25 #include "xr_object.h"
26
27 using namespace xray_re;
28
29 const char PLUGIN_VENDOR[] = "ZENOBIAN mod team";
30 const char PLUGIN_VERSION[] = __DATE__;
31
32 const MString dm_reader("X-Ray game detail object");
33 const MString object_translator("X-Ray object");
34 const MString skl_object_writer("X-Ray skeletal object");
35 const MString ogf_reader("X-Ray game object");
36 const MString omf_reader("X-Ray game skeletal motions");
37 const MString skl_translator("X-Ray skeletal motion");
38 const MString skls_reader("X-Ray skeletal motions");
39
40 class maya_dm_reader: public MPxFileTranslator {
41 public:
42 virtual MStatus reader(const MFileObject& file, const MString& options, FileAccessMode mode);
43 virtual bool haveReadMethod() const;
44 virtual bool canBeOpened() const;
45 virtual MString defaultExtension() const;
46 virtual MString filter() const;
47 virtual MFileKind identifyFile(const MFileObject& file, const char* buffer, short size) const;
48
49 static void* creator();
50 };
51
52 class maya_object_translator: public MPxFileTranslator {
53 public:
54 virtual MStatus reader(const MFileObject& file, const MString& options, FileAccessMode mode);
55 virtual MStatus writer(const MFileObject& file, const MString& options, FileAccessMode mode);
56 virtual bool haveReadMethod() const;
57 virtual bool haveWriteMethod() const;
58 virtual MString defaultExtension() const;
59 virtual MString filter() const;
60 virtual bool canBeOpened() const;
61 virtual MFileKind identifyFile(const MFileObject& file, const char* buffer, short size) const;
62
63 static void* creator();
64 };
65
66 class maya_skl_object_writer: public MPxFileTranslator {
67 public:
68 virtual MStatus writer(const MFileObject& file, const MString& options, FileAccessMode mode);
69 virtual bool haveWriteMethod() const;
70 virtual MFileKind identifyFile(const MFileObject& file, const char* buffer, short size) const;
71 virtual MString defaultExtension() const;
72
73 static void* creator();
74 };
75
76 class maya_ogf_reader: public MPxFileTranslator {
77 public:
78 virtual MStatus reader(const MFileObject& file, const MString& options, FileAccessMode mode);
79 virtual bool haveReadMethod() const;
80 virtual bool canBeOpened() const;
81 virtual MString defaultExtension() const;
82 virtual MString filter() const;
83 virtual MFileKind identifyFile(const MFileObject& file, const char* buffer, short size) const;
84
85 static void* creator();
86 };
87
88 class maya_omf_reader: public MPxFileTranslator {
89 public:
90 virtual MStatus reader(const MFileObject& file, const MString& options, FileAccessMode mode);
91 virtual bool haveReadMethod() const;
92 virtual MString defaultExtension() const;
93 virtual MString filter() const;
94 virtual MFileKind identifyFile(const MFileObject& file, const char* buffer, short size) const;
95
96 static void* creator();
97 };
98
99 class maya_skl_translator: public MPxFileTranslator {
100 public:
101 virtual MStatus reader(const MFileObject& file, const MString& options, FileAccessMode mode);
102 virtual MStatus writer(const MFileObject& file, const MString& options, FileAccessMode mode);
103 virtual bool haveReadMethod() const;
104 virtual bool haveWriteMethod() const;
105 virtual MString defaultExtension() const;
106 virtual MString filter() const;
107 virtual MFileKind identifyFile(const MFileObject& file, const char* buffer, short size) const;
108
109 static void* creator();
110 };
111
112 class maya_skls_reader: public MPxFileTranslator {
113 public:
114 virtual MStatus reader(const MFileObject& file, const MString& options, FileAccessMode mode);
115 virtual bool haveReadMethod() const;
116 virtual MString defaultExtension() const;
117 virtual MString filter() const;
118 virtual MFileKind identifyFile(const MFileObject& file, const char* buffer, short size) const;
119
120 static void* creator();
121 };
122
extract_extension(const MFileObject & file)123 static inline MString extract_extension(const MFileObject& file)
124 {
125 MString name(file.resolvedName());
126 // FIXME: assumes there _is_ extension.
127 return name.substring(name.rindex('.') + 1, name.numChars() - 1).toLowerCase();
128 }
129
reader(const MFileObject & file,const MString & options,FileAccessMode mode)130 MStatus maya_dm_reader::reader(const MFileObject& file, const MString& options, FileAccessMode mode)
131 {
132 fix_fpu_cw();
133
134 MStatus status = MS::kFailure;
135 if (mode == kImportAccessMode || mode == kOpenAccessMode) {
136 start_progress(2, "Loading DM");
137 const char *path = file.resolvedFullName().asChar();
138 xr_dm* dm = new xr_dm;
139 if (dm->load_dm(path)) {
140 advance_progress();
141 dm->to_object();
142 advance_progress();
143 end_progress();
144 maya_import_tools(dm, &status);
145 } else {
146 msg("can't open %s", path);
147 end_progress();
148 }
149 delete dm;
150 }
151 return status;
152 }
153
haveReadMethod() const154 bool maya_dm_reader::haveReadMethod() const { return true; }
155
canBeOpened() const156 bool maya_dm_reader::canBeOpened() const { return true; }
157
defaultExtension() const158 MString maya_dm_reader::defaultExtension() const { return MString("dm"); }
159
filter() const160 MString maya_dm_reader::filter() const { return MString("*.dm"); }
161
identifyFile(const MFileObject & file,const char * buffer,short size) const162 MPxFileTranslator::MFileKind maya_dm_reader::identifyFile(const MFileObject& file, const char* buffer, short size) const
163 {
164 return extract_extension(file) == defaultExtension() ? kIsMyFileType : kNotMyFileType;
165 }
166
creator()167 void* maya_dm_reader::creator() { return new maya_dm_reader; }
168
reader(const MFileObject & file,const MString & options,FileAccessMode mode)169 MStatus maya_object_translator::reader(const MFileObject& file, const MString& options, FileAccessMode mode)
170 {
171 fix_fpu_cw();
172
173 MStatus status = MS::kFailure;
174 if (mode == kImportAccessMode || mode == kOpenAccessMode) {
175 const char* path = file.resolvedFullName().asChar();
176 xr_object* object = new xr_object;
177 if (object->load_object(path))
178 maya_import_tools(object, &status);
179 else
180 msg("can't open %s", path);
181 delete object;
182 }
183 return status;
184 }
185
writer(const MFileObject & file,const MString & options,FileAccessMode mode)186 MStatus maya_object_translator::writer(const MFileObject& file, const MString& options, FileAccessMode mode)
187 {
188 fix_fpu_cw();
189
190 switch (mode) {
191 case kExportAccessMode:
192 case kSaveAccessMode:
193 case kExportActiveAccessMode:
194 break;
195 default:
196 return MS::kFailure;
197 }
198
199 return maya_export_tools().export_object(file.resolvedFullName().asChar(),
200 mode == kExportActiveAccessMode);
201 }
202
haveReadMethod() const203 bool maya_object_translator::haveReadMethod() const { return true; }
204
haveWriteMethod() const205 bool maya_object_translator::haveWriteMethod() const { return true; }
206
defaultExtension() const207 MString maya_object_translator::defaultExtension() const { return MString("object"); }
208
filter() const209 MString maya_object_translator::filter() const
210 {
211 # if (MAYA_API_VERSION >= 201200)
212 return MString("*.object");
213 # else
214 return MString("*.ob*");
215 # endif
216 }
217
canBeOpened() const218 bool maya_object_translator::canBeOpened() const { return true; }
219
identifyFile(const MFileObject & file,const char * buffer,short size) const220 MPxFileTranslator::MFileKind maya_object_translator::identifyFile(const MFileObject& file, const char* buffer, short size) const
221 {
222 return extract_extension(file) == defaultExtension() ? kIsMyFileType : kNotMyFileType;
223 }
224
creator()225 void* maya_object_translator::creator() { return new maya_object_translator; }
226
writer(const MFileObject & file,const MString & options,FileAccessMode mode)227 MStatus maya_skl_object_writer::writer(const MFileObject& file, const MString& options, FileAccessMode mode)
228 {
229 fix_fpu_cw();
230
231 switch (mode) {
232 case kExportAccessMode:
233 case kSaveAccessMode:
234 case kExportActiveAccessMode:
235 break;
236 default:
237 return MS::kFailure;
238 }
239
240 return maya_export_tools().export_skl_object(file.resolvedFullName().asChar(),
241 mode == kExportActiveAccessMode);
242 }
243
haveWriteMethod() const244 bool maya_skl_object_writer::haveWriteMethod() const { return true; }
245
defaultExtension() const246 MString maya_skl_object_writer::defaultExtension() const { return MString("object"); }
247
identifyFile(const MFileObject & file,const char * buffer,short size) const248 MPxFileTranslator::MFileKind maya_skl_object_writer::identifyFile(const MFileObject& file, const char* buffer, short size) const
249 {
250 return extract_extension(file) == defaultExtension() ? kIsMyFileType : kNotMyFileType;
251 }
252
creator()253 void* maya_skl_object_writer::creator() { return new maya_skl_object_writer; }
254
reader(const MFileObject & file,const MString & options,FileAccessMode mode)255 MStatus maya_ogf_reader::reader(const MFileObject& file, const MString& options, FileAccessMode mode)
256 {
257 fix_fpu_cw();
258
259 MStatus status = MS::kFailure;
260 if (mode == kImportAccessMode || mode == kOpenAccessMode) {
261 start_progress(2, "Loading OGF");
262 const char* path = file.resolvedFullName().asChar();
263 xr_ogf* ogf = xr_ogf::load_ogf(path);
264 if (ogf) {
265 advance_progress();
266 ogf->to_object();
267 advance_progress();
268 end_progress();
269 maya_import_tools(ogf, &status);
270 delete ogf;
271 } else {
272 msg("can't open %s", path);
273 end_progress();
274 }
275 }
276 return status;
277 }
278
haveReadMethod() const279 bool maya_ogf_reader::haveReadMethod() const { return true; }
280
canBeOpened() const281 bool maya_ogf_reader::canBeOpened() const { return true; }
282
defaultExtension() const283 MString maya_ogf_reader::defaultExtension() const { return MString("ogf"); }
284
filter() const285 MString maya_ogf_reader::filter() const { return MString("*.ogf"); }
286
identifyFile(const MFileObject & file,const char * buffer,short size) const287 MPxFileTranslator::MFileKind maya_ogf_reader::identifyFile(const MFileObject& file, const char* buffer, short size) const
288 {
289 return extract_extension(file) == defaultExtension() ? kIsMyFileType : kNotMyFileType;
290 }
291
creator()292 void* maya_ogf_reader::creator() { return new maya_ogf_reader; }
293
reader(const MFileObject & file,const MString & options,FileAccessMode mode)294 MStatus maya_omf_reader::reader(const MFileObject& file, const MString& options, FileAccessMode mode)
295 {
296 fix_fpu_cw();
297
298 MStatus status = MS::kFailure;
299 if (mode == kImportAccessMode) {
300 start_progress(1, "Loading OMF");
301 const char* path = file.resolvedFullName().asChar();
302 xr_ogf_v4* omf = new xr_ogf_v4;
303 if (omf->load_omf(path)) {
304 advance_progress();
305 maya_import_tools imp_tools;
306 MObject character_obj = imp_tools.lookup_character(&status);
307 if (status) {
308 imp_tools.reset_animation_state();
309 status = imp_tools.import_motions(omf->motions(), character_obj);
310 }
311 end_progress();
312 } else {
313 msg("can't open %s", path);
314 end_progress();
315 }
316 delete omf;
317 }
318 return status;
319 }
320
haveReadMethod() const321 bool maya_omf_reader::haveReadMethod() const { return true; }
322
defaultExtension() const323 MString maya_omf_reader::defaultExtension() const { return MString("omf"); }
324
filter() const325 MString maya_omf_reader::filter() const { return MString("*.omf"); }
326
identifyFile(const MFileObject & file,const char * buffer,short size) const327 MPxFileTranslator::MFileKind maya_omf_reader::identifyFile(const MFileObject& file, const char* buffer, short size) const
328 {
329 return extract_extension(file) == defaultExtension() ? kIsMyFileType : kNotMyFileType;
330 }
331
creator()332 void* maya_omf_reader::creator() { return new maya_omf_reader; }
333
reader(const MFileObject & file,const MString & options,FileAccessMode mode)334 MStatus maya_skl_translator::reader(const MFileObject& file, const MString& options, FileAccessMode mode)
335 {
336 fix_fpu_cw();
337
338 MStatus status = MS::kFailure;
339 if (mode == kImportAccessMode) {
340 maya_import_tools imp_tools;
341 const char* path = file.resolvedFullName().asChar();
342 xr_skl_motion* smotion = new xr_skl_motion;
343 if (!smotion->load_skl(path)) {
344 msg("can't open %s", path);
345 delete smotion;
346 return MS::kFailure;
347 }
348 MObject character_obj = imp_tools.lookup_character(&status);
349 if (status) {
350 imp_tools.reset_animation_state();
351 status = imp_tools.import_motion(smotion, character_obj);
352 }
353 delete smotion;
354 }
355 return status;
356 }
357
writer(const MFileObject & file,const MString & options,FileAccessMode mode)358 MStatus maya_skl_translator::writer(const MFileObject& file, const MString& options, FileAccessMode mode)
359 {
360 fix_fpu_cw();
361
362 switch (mode) {
363 case kExportAccessMode:
364 case kSaveAccessMode:
365 case kExportActiveAccessMode:
366 break;
367 default:
368 return MS::kFailure;
369 }
370
371 return maya_export_tools().export_skl(file.resolvedFullName().asChar(),
372 mode == kExportActiveAccessMode);
373 }
374
haveReadMethod() const375 bool maya_skl_translator::haveReadMethod() const { return true; }
376
haveWriteMethod() const377 bool maya_skl_translator::haveWriteMethod() const { return true; }
378
defaultExtension() const379 MString maya_skl_translator::defaultExtension() const { return MString("skl"); }
380
filter() const381 MString maya_skl_translator::filter() const { return MString("*.skl"); }
382
identifyFile(const MFileObject & file,const char * buffer,short size) const383 MPxFileTranslator::MFileKind maya_skl_translator::identifyFile(const MFileObject& file, const char* buffer, short size) const
384 {
385 return extract_extension(file) == defaultExtension() ? kIsMyFileType : kNotMyFileType;
386 }
387
creator()388 void* maya_skl_translator::creator() { return new maya_skl_translator; }
389
reader(const MFileObject & file,const MString & options,FileAccessMode mode)390 MStatus maya_skls_reader::reader(const MFileObject& file, const MString& options, FileAccessMode mode)
391 {
392 fix_fpu_cw();
393
394 MStatus status = MS::kFailure;
395 if (mode == kImportAccessMode) {
396 maya_import_tools imp_tools;
397 const char* path = file.resolvedFullName().asChar();
398 xr_object* object = new xr_object;
399 if (!object->load_skls(path)) {
400 msg("can't open %s", path);
401 delete object;
402 return MS::kFailure;
403 }
404 MObject character_obj = imp_tools.lookup_character(&status);
405 if (status) {
406 imp_tools.reset_animation_state();
407 status = imp_tools.import_motions(object->motions(), character_obj);
408 }
409 delete object;
410 }
411 return status;
412 }
413
haveReadMethod() const414 bool maya_skls_reader::haveReadMethod() const { return true; }
415
defaultExtension() const416 MString maya_skls_reader::defaultExtension() const { return MString("skls"); }
417
filter() const418 MString maya_skls_reader::filter() const
419 {
420 # if (MAYA_API_VERSION >= 201200)
421 return MString("*.skls");
422 # else
423 return MString("*.sk*");
424 # endif
425 }
426
identifyFile(const MFileObject & file,const char * buffer,short size) const427 MPxFileTranslator::MFileKind maya_skls_reader::identifyFile(const MFileObject& file, const char* buffer, short size) const
428 {
429 return extract_extension(file) == defaultExtension() ? kIsMyFileType : kNotMyFileType;
430 }
431
creator()432 void* maya_skls_reader::creator() { return new maya_skls_reader; }
433
initializePlugin(MObject obj)434 MStatus initializePlugin(MObject obj)
435 {
436 MStatus status;
437
438 MString fs_spec("$MAYA_LOCATION\\bin\\xray_path.ltx");
439 xr_file_system& fs = xr_file_system::instance();
440 if (!fs.initialize(fs_spec.expandEnvironmentVariablesAndTilde().asChar())) {
441 msg("can't initialize the file system");
442 return MS::kFailure;
443 }
444 xr_log::instance().init("xrayMayaTools", "xray_tools");
445
446 MFnPlugin plugin_fn(obj, PLUGIN_VENDOR, PLUGIN_VERSION);
447 if (!(status = maya_xray_material::initialize(plugin_fn)))
448 return status;
449 if (!(status = plugin_fn.registerFileTranslator(object_translator, "", maya_object_translator::creator, "", "", true)))
450 return status;
451 if (!(status = plugin_fn.registerFileTranslator(skl_object_writer, "", maya_skl_object_writer::creator, "", "", true)))
452 return status;
453 if (!(status = plugin_fn.registerFileTranslator(dm_reader, "", maya_dm_reader::creator, "", "", true)))
454 return status;
455 if (!(status = plugin_fn.registerFileTranslator(ogf_reader, "", maya_ogf_reader::creator, "", "", true)))
456 return status;
457 if (!(status = plugin_fn.registerFileTranslator(omf_reader, "", maya_omf_reader::creator, "", "", true)))
458 return status;
459 if (!(status = plugin_fn.registerFileTranslator(skl_translator, "", maya_skl_translator::creator, "", "", true)))
460 return status;
461 if (!(status = plugin_fn.registerFileTranslator(skls_reader, "", maya_skls_reader::creator, "", "", true)))
462 return status;
463
464 return status;
465 }
466
uninitializePlugin(MObject obj)467 MStatus uninitializePlugin(MObject obj)
468 {
469 MFnPlugin plugin_fn(obj);
470 maya_xray_material::uninitialize(plugin_fn);
471 plugin_fn.deregisterFileTranslator(object_translator);
472 plugin_fn.deregisterFileTranslator(skl_object_writer);
473 plugin_fn.deregisterFileTranslator(dm_reader);
474 plugin_fn.deregisterFileTranslator(ogf_reader);
475 plugin_fn.deregisterFileTranslator(omf_reader);
476 plugin_fn.deregisterFileTranslator(skl_translator);
477 plugin_fn.deregisterFileTranslator(skls_reader);
478
479 return MS::kSuccess;
480 }
481