Explorar el Código

improved mayacopy that does not require replace prefix and is smart about not loading reference files as they are not needed most times

Asad M. Zaman hace 19 años
padre
commit
57ec1e52cb
Se han modificado 2 ficheros con 61 adiciones y 73 borrados
  1. 58 72
      pandatool/src/mayaprogs/mayaCopy.cxx
  2. 3 1
      pandatool/src/mayaprogs/mayaCopy.h

+ 58 - 72
pandatool/src/mayaprogs/mayaCopy.cxx

@@ -62,16 +62,18 @@ MayaCopy() {
      "source filename before it is copied into the tree.",
      &CVSCopy::dispatch_none, &_keep_ver);
 
+  /*
   add_option
     ("rp", "replace_prefix", 80,
      "use these prefixes when replacing reference with the recently copied file from the  "
      "source filename before it is copied into the tree.",
      &CVSCopy::dispatch_vector_string, NULL, &_replace_prefix);
+  */
 
   add_option
     ("omittex", "", 0,
-     "Character animation files do not need to copy the texures. This option omits the "
-     "textures of the models to be re-mayacopied",
+     "Character animation files do not need to copy the texures nor its references. "
+     "This option omits the textures and references of the models to be re-mayacopied",
      &CVSCopy::dispatch_none, &_omit_tex);
 
   add_path_replace_options();
@@ -188,33 +190,31 @@ copy_maya_file(const Filename &source, const Filename &dest,
     return false;
   }
 
+  if (!_omit_tex) {
+    // Get all the shaders so we can determine the set of textures.
+    _shaders.clear();
+    collect_shaders();
+    int num_shaders = _shaders.get_num_shaders();
+    for (int i = 0; i < num_shaders; i++) {
+      MayaShader *shader = _shaders.get_shader(i);
+      for (size_t j = 0; j < shader->_color.size(); j++) {
+        if (!extract_texture(*shader->get_color_def(j), dir)) {
+          return false;
+        }
+      }
+      if (!extract_texture(shader->_transparency, dir)) {
+        return false;
+      }
+    }
+  }
+
   // Finally, copy in any referenced Maya files.
   unsigned int num_refs = refs.length();
 
-  /*
-  if (num_refs != 0) {
-    maya_cat.warning()
-      << "External references are not yet properly supported by mayacopy!\n";
+  if (num_refs > 0) {
+    _omit_tex = true;
   }
-  */
 
-  if (num_refs != 0) {
-    if (_replace_prefix.empty()) {
-      // try to put the first word of the file name as the replace prefix
-      size_t idx = source.get_basename().find("_",0);
-      if (idx != string::npos) {
-        string st = source.get_basename().substr(0, idx);
-        _replace_prefix.push_back(st);
-        maya_cat.info() << "replace_prefix = " << st << endl;
-      }
-      else {
-        maya_cat.error()
-          << "External references exist: " 
-          << "please make sure to specify a _replace_prefix with -rp option\n";
-        exit(1);
-      }
-    }
-  }
   unsigned int ref_index;
   maya_cat.info() << "num_refs = " << num_refs << endl;
   for (ref_index = 0; ref_index < num_refs; ref_index++) {
@@ -227,34 +227,35 @@ copy_maya_file(const Filename &source, const Filename &dest,
     // file -loadReference "mtpRN" -type "mayaBinary" -options "v=0"
     // "m_t_pear_zero.mb";
     string lookup = refs[ref_index].asChar();
+
+    string blah = "file -q -referenceNode \"" + lookup + "\";";
+    //maya_cat.info() << blah << endl;
+    MString result;
+    status = MGlobal::executeCommand(MString(blah.c_str()), result);
+    //maya_cat.info() << "result = " << result.asChar() << endl;
+
+    // for multiple reference of the same model. maya throws in a {#} at the end, ignore that
+    size_t dup = lookup.find('{');
+    if (dup != string::npos){
+      lookup.erase(dup);
+    }
+
     Filename filename = 
-      _path_replace->convert_path(Filename::from_os_specific(refs[ref_index].asChar()));
+      _path_replace->convert_path(Filename::from_os_specific(lookup));
 
     CVSSourceTree::FilePath path =
       _tree.choose_directory(filename.get_basename(), dir, _force, _interactive);
     Filename new_filename = path.get_rel_from(dir);
-    _exec_string = "file -loadReference \"" + _replace_prefix[_curr_idx++] + "RN\" -type \"mayaBinary\" -options \"v=0\" \"" + new_filename.to_os_generic() + "\";";
-    maya_cat.info() << "executing command: " << _exec_string << "\n";
-    //MGlobal::executeCommand("file -loadReference \"mtpRN\" -type \"mayaBinary\" -options \"v=0\" \"m_t_pear_zero.mb\";");
-    status  = MGlobal::executeCommand(MString(_exec_string.c_str()));
-  }
 
-  if (!_omit_tex) {
-    // Get all the shaders so we can determine the set of textures.
-    _shaders.clear();
-    collect_shaders();
-    int num_shaders = _shaders.get_num_shaders();
-    for (int i = 0; i < num_shaders; i++) {
-      MayaShader *shader = _shaders.get_shader(i);
-      for (size_t j = 0; j < shader->_color.size(); j++) {
-        if (!extract_texture(*shader->get_color_def(j), dir)) {
-          return false;
-        }
-      }
-      if (!extract_texture(shader->_transparency, dir)) {
-        return false;
-      }
+    //maya_cat.info() << "curr_idx " << _curr_idx << endl;
+    _exec_string.push_back("file -loadReference \"" + string(result.asChar()) + "\" -type \"mayaBinary\" -options \"v=0\" \"" + new_filename.to_os_generic() + "\";");
+    maya_cat.info() << "executing command: " << _exec_string[_curr_idx] << "\n";
+    //MGlobal::executeCommand("file -loadReference \"mtpRN\" -type \"mayaBinary\" -options \"v=0\" \"m_t_pear_zero.mb\";");
+    status  = MGlobal::executeCommand(MString(_exec_string[ref_index].c_str()));
+    if (!status) {
+      status.perror("loadReference failed");
     }
+    _curr_idx++;
   }
 
   // Now write out the Maya file.
@@ -265,48 +266,33 @@ copy_maya_file(const Filename &source, const Filename &dest,
   }
   
   for (ref_index = 0; ref_index < num_refs; ref_index++) {
-    //maya_cat.info() << "refs filename: " << refs[ref_index].asChar() << "\n";
-    //maya_cat.info() << "os_specific filename: " << Filename::from_os_specific(refs[ref_index].asChar()) << "\n";
+    if (1) { // we may want an option later to pull in all the referenced files
+      continue;
+    }
 
-    //maya_cat.info() << "-----------exec_string = " << _exec_string << endl;
-    string original("loadReference");
-    string replace("unloadReference");
-    size_t index = _exec_string.find("loadReference");
-    _exec_string.replace(index, original.length(), replace, 0, replace.length());
-    maya_cat.info() << "executing command: " << _exec_string << "\n";
-    status  = MGlobal::executeCommand(MString(_exec_string.c_str()));
+    string lookup = refs[ref_index].asChar();
+    // for multiple reference of the same model. maya throws in a {#} at the end, ignore that
+    size_t dup = lookup.find('{');
+    if (dup != string::npos){
+      lookup.erase(dup);
+    }
 
     Filename filename = 
-      _path_replace->convert_path(Filename::from_os_specific(refs[ref_index].asChar()));
+      _path_replace->convert_path(Filename::from_os_specific(lookup));
 
     maya_cat.info()
       << "External ref: " << filename << "\n";
-
+    
     // Now import the file
     ExtraData ed;
     ed._type = FT_maya;
-
+    
     CVSSourceTree::FilePath path = import(filename, &ed, _model_dir);
     if (!path.is_valid()) {
       exit(1);
     }
   }
 
-  /*
-  for (unsigned int ref_index = 0; ref_index < num_refs; ref_index++) {
-    Filename filename = 
-      _path_replace->convert_path(Filename::from_os_specific(refs[ref_index].asChar()));
-    status = MFileIO::reference(MString(filename.get_basename().c_str()));
-    if (!status) {
-      status.perror("MFileIO reference");
-    }
-    status = MFileIO::removeReference(refs[ref_index].asChar());
-    if (!status) {
-      status.perror("MFileIO removeReference");
-    }
-  }
-  */
-
   return true;
 }
 

+ 3 - 1
pandatool/src/mayaprogs/mayaCopy.h

@@ -74,9 +74,11 @@ private:
   bool _keep_ver;
   bool _omit_tex;
   int _curr_idx;
+  /*
   vector_string _replace_prefix;
+  */
 
-  string _exec_string;
+  vector_string _exec_string;
 
   PT(MayaApi) _maya;
   MayaShaders _shaders;