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