22 #include <maya/MStringArray.h> 23 #include <maya/MGlobal.h> 24 #include <maya/MFileIO.h> 25 #include <maya/MItDag.h> 26 #include <maya/MFnDagNode.h> 27 #include <maya/MFnNurbsSurface.h> 28 #include <maya/MFnMesh.h> 29 #include <maya/MObject.h> 30 #include <maya/MDagPath.h> 31 #include <maya/MIntArray.h> 44 set_program_brief(
"copy Maya .mb files into a CVS source hierarchy");
45 set_program_description
46 (
"mayacopy copies one or more Maya .mb files into a " 47 "CVS source hierarchy. " 48 "Rather than copying the named files immediately into the current " 49 "directory, it first scans the entire source hierarchy, identifying all " 50 "the already-existing files. If the named file to copy matches the " 51 "name of an already-existing file in the current directory or elsewhere " 52 "in the hierarchy, that file is overwritten. Other .mb files, as " 53 "well as texture files, that are externally referenced by the " 54 "named .mb file(s) are similarly copied.");
57 add_runline(
"[opts] file.mb [file.mb ... ]");
61 "Don't attempt to strip the Maya version number from the tail of the " 62 "source filename before it is copied into the tree.",
63 &CVSCopy::dispatch_none, &_keep_ver);
75 "Character animation files do not need to copy the texures. " 76 "This option omits the textures of the models to be re-mayacopied",
77 &CVSCopy::dispatch_none, &_omit_tex);
81 "Character animation files do not need to copy internal file references. " 82 "This option omits the references of the models to be re-mayacopied",
83 &CVSCopy::dispatch_none, &_omit_ref);
87 "Write a .ma file instead of a .mb file (regardless of input type)",
88 &CVSCopy::dispatch_none, &_maya_ascii);
90 add_path_replace_options();
98 _maya = MayaApi::open_api(_program_name);
99 if (!_maya->is_valid()) {
100 nout <<
"Unable to initialize Maya.\n";
104 SourceFiles::iterator fi;
105 for (fi = _source_files.begin(); fi != _source_files.end(); ++fi) {
112 nout <<
"\nUnable to copy, aborting!\n\n";
126 ExtraData *ed = (ExtraData *)extra_data;
129 return copy_maya_file(source, dest, dir);
135 return copy_texture(source, dest, dir);
138 nout <<
"Internal error: invalid type " << (int)ed->_type <<
"\n";
149 filter_filename(
const string &source) {
154 size_t dot = source.rfind(
'.');
155 size_t underscore = source.rfind(
"_v", dot);
156 if ((underscore != string::npos) && !isdigit(source.at(underscore+2)))
157 underscore = string::npos;
159 string extension = source.substr(dot);
160 if (extension ==
".ma" || extension ==
".mb") {
171 if (underscore == string::npos) {
173 return source.substr(0, dot) + extension;
175 return source.substr(0, underscore) + extension;
185 if (!_maya->read(source)) {
187 <<
"Unable to read " << source <<
"\n";
193 MStatus status = MFileIO::getReferences(refs);
194 if (status != MStatus::kSuccess) {
195 status.perror(
"MItDag constructor");
200 unsigned int num_refs = refs.length();
202 unsigned int ref_index;
203 maya_cat.info() <<
"num_refs = " << num_refs << endl;
204 for (ref_index = 0; ref_index < num_refs; ref_index++) {
205 maya_cat.info() <<
"curr_idx " << _curr_idx << endl;
206 string lookup = refs[ref_index].asChar();
207 string blah =
"file -q -referenceNode \"" + lookup +
"\";";
208 maya_cat.info() << blah << endl;
210 status = MGlobal::executeCommand(MString(blah.c_str()), result);
211 maya_cat.info() <<
"result = " << result.asChar() << endl;
215 size_t dup = lookup.find(
'{');
216 if (dup != string::npos){
223 string refNode = result.asChar();
224 string refCheckCmd =
"file -rfn " + refNode +
" -q -dr;";
226 status = MGlobal::executeCommand(MString(refCheckCmd.c_str()), deferredRef);
227 maya_cat.info() <<
"deferredRef = " << deferredRef << endl;
228 if (deferredRef == 1) {
236 _tree.choose_directory(filename.
get_basename(), dir, _force, _interactive);
239 if (maya_cat.is_spam()) {
245 if (maya_cat.is_debug()) {
246 string cmdStr =
"pwd";
248 status = MGlobal::executeCommand(MString(cmdStr.c_str()), result3);
249 maya_cat.debug() <<
"result = " << result3.asChar() <<
"\n";
251 _exec_string.push_back(
"file -loadReference \"" +
string(result.asChar()) +
"\" -type \"mayaBinary\" -options \"v=0\" \"" + new_filename.
to_os_generic() +
"\";");
253 maya_cat.info() <<
"executing command: " << _exec_string[_curr_idx] <<
"\n";
254 status = MGlobal::executeCommand(MString(_exec_string[_curr_idx].c_str()));
255 if (status != MStatus::kSuccess) {
256 status.perror(
"loadReference failed");
267 for (
int i = 0; i < num_shaders; i++) {
269 for (
size_t j = 0; j < shader->_all_maps.size(); j++) {
270 if (!extract_texture(*shader->_all_maps[j], dir)) {
278 if (!_maya->write(dest)) {
280 <<
"Cannot write " << dest <<
"\n";
284 for (ref_index = 0; ref_index < num_refs; ref_index++) {
289 string lookup = refs[ref_index].asChar();
292 size_t dup = lookup.find(
'{');
293 if (dup != string::npos){
301 <<
"External ref: " << filename <<
"\n";
324 _path_replace->convert_path(color_def._texture_filename);
325 if (!texture_filename.
exists()) {
326 nout <<
"*** Error: texture " << texture_filename
327 <<
" does not exist.\n";
330 nout <<
"*** Error: texture " << texture_filename
331 <<
" is not a regular file.\n";
335 ed._type = FT_texture;
338 import(texture_filename, &ed, _map_dir);
359 if (!copy_binary_file(source, dest)) {
374 MItDag dag_iterator(MItDag::kDepthFirst, MFn::kTransform, &status);
375 if (status != MStatus::kSuccess) {
376 status.perror(
"MItDag constructor");
384 while (!dag_iterator.isDone()) {
386 status = dag_iterator.getPath(dag_path);
387 if (status != MStatus::kSuccess) {
388 status.perror(
"MItDag::getPath");
390 if (!collect_shader_for_node(dag_path)) {
399 nout <<
"Errors encountered in traversal.\n";
410 collect_shader_for_node(
const MDagPath &dag_path) {
412 MFnDagNode dag_node(dag_path, &status);
413 if (status != MStatus::kSuccess) {
414 status.perror(
"MFnDagNode constructor");
418 if (dag_path.hasFn(MFn::kNurbsSurface)) {
419 MFnNurbsSurface surface(dag_path, &status);
424 }
else if (dag_path.hasFn(MFn::kMesh)) {
425 MFnMesh mesh(dag_path, &status);
428 MObjectArray shaders;
429 MIntArray poly_shader_indices;
431 status = mesh.getConnectedShaders(dag_path.instanceNumber(),
432 shaders, poly_shader_indices);
434 unsigned int num_shaders = shaders.length();
435 for (
unsigned int shader_index = 0;
436 shader_index < num_shaders;
438 MObject engine = shaders[shader_index];
452 int main(
int argc,
char *argv[]) {
bool is_valid() const
Returns true if this FilePath represents a valid file, or false if it represents an error return.
virtual void parse_command_line(int argc, char **argv)
Dispatches on each of the options on the command line, and passes the remaining parameters to handle_...
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
MayaShader * find_shader_for_node(MObject node, bool legacy_shader)
Extracts the shader assigned to the indicated node.
std::string to_os_generic() const
This is similar to to_os_specific(), but it is designed to generate a filename that can be understood...
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
Filename get_fullpath() const
Returns the full pathname to this particular directory.
This represents one particular directory in the hierarchy of source directory files.
The name of a file, such as a texture file or an Egg file.
This defines the various attributes that Maya may associate with the "color" channel for a particular...
MayaShader * get_shader(int n) const
Returns the nth MayaShader that has been discovered so far.
Corresponds to a single "shader" in Maya.
MayaShader * find_shader_for_shading_engine(MObject engine, bool legacy_shader)
Returns the MayaShader object associated with the indicated "shading engine".
bool is_regular_file() const
Returns true if the filename exists and is the name of a regular file (i.e.
std::string get_basename() const
Returns the basename part of the filename.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
Filename get_fullpath() const
Returns the full path to this file.
void clear()
Frees all of the previously-defined MayaShader objects associated with this set.
bool reset_maya_texture(const Filename &texture)
Changes the texture filename stored in the Maya file for this particular shader.
Filename get_rel_from(const CVSSourceDirectory *other) const
Returns the relative path to this file as seen from the indicated source directory.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
A program to copy Maya .mb files into the cvs tree.
int get_num_shaders() const
Returns the number of unique MayaShaders that have been discovered so far.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
bool exists() const
Returns true if the filename exists on the disk, false otherwise.
static Filename from_os_specific(const std::string &os_specific, Type type=T_general)
This named constructor returns a Panda-style filename (that is, using forward slashes,...
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.