diff --git a/pandatool/src/mayaprogs/mayaToEgg_client.cxx b/pandatool/src/mayaprogs/mayaToEgg_client.cxx index b40db443e9..9c9b152478 100755 --- a/pandatool/src/mayaprogs/mayaToEgg_client.cxx +++ b/pandatool/src/mayaprogs/mayaToEgg_client.cxx @@ -1,5 +1,5 @@ // Filename: mayaToEgg.cxx -// Created by: drose (15Feb00) +// Adapted by: cbrunner (09Nov09) // //////////////////////////////////////////////////////////////////// // @@ -13,10 +13,6 @@ //////////////////////////////////////////////////////////////////// #include "mayaToEgg_client.h" -#include "mayaToEggConverter.h" -#include "config_mayaegg.h" -#include "config_maya.h" // for maya_cat -#include "globPattern.h" #ifdef _WIN32 #include "pystub.h" #endif @@ -26,305 +22,17 @@ // Access: Public // Description: //////////////////////////////////////////////////////////////////// -MayaToEgg:: -MayaToEgg() : +MayaToEggClient:: +MayaToEggClient() : SomethingToEgg("Maya", ".mb") { - add_path_replace_options(); - add_path_store_options(); - add_animation_options(); - add_units_options(); - add_normals_options(); - add_transform_options(); - - set_program_description - ("This program converts Maya model files to egg. Static and animatable " - "models can be converted, with polygon or NURBS output. Animation tables " - "can also be generated to apply to an animatable model."); - - add_option - ("p", "", 0, - "Generate polygon output only. Tesselate all NURBS surfaces to " - "polygons via the built-in Maya tesselator. The tesselation will " - "be based on the tolerance factor given by -ptol.", - &MayaToEgg::dispatch_none, &_polygon_output); - - add_option - ("ptol", "tolerance", 0, - "Specify the fit tolerance for Maya polygon tesselation. The smaller " - "the number, the more polygons will be generated. The default is " - "0.01.", - &MayaToEgg::dispatch_double, NULL, &_polygon_tolerance); - - add_option - ("bface", "", 0, - "Respect the Maya \"double sided\" rendering flag to indicate whether " - "polygons should be double-sided or single-sided. Since this flag " - "is set to double-sided by default in Maya, it is often better to " - "ignore this flag (unless your modelers are diligent in turning it " - "off where it is not desired). If this flag is not specified, the " - "default is to treat all polygons as single-sided, unless an " - "egg object type of \"double-sided\" is set.", - &MayaToEgg::dispatch_none, &_respect_maya_double_sided); - - add_option - ("suppress-vcolor", "", 0, - "Ignore vertex color for geometry that has a texture applied. " - "(This is the way Maya normally renders internally.) The egg flag " - "'vertex-color' may be applied to a particular model to override " - "this setting locally.", - &MayaToEgg::dispatch_none, &_suppress_vertex_color); - - add_option - ("keep-uvs", "", 0, - "Convert all UV sets on all vertices, even those that do not appear " - "to be referenced by any textures.", - &MayaToEgg::dispatch_none, &_keep_all_uvsets); - - add_option - ("round-uvs", "", 0, - "round up uv coordinates to the nearest 1/100th. i.e. -0.001 becomes" - "0.0; 0.444 becomes 0.44; 0.778 becomes 0.78.", - &MayaToEgg::dispatch_none, &_round_uvs); - - add_option - ("trans", "type", 0, - "Specifies which transforms in the Maya file should be converted to " - "transforms in the egg file. The option may be one of all, model, " - "dcs, or none. The default is model, which means only transforms on " - "nodes that have the model flag or the dcs flag are preserved.", - &MayaToEgg::dispatch_transform_type, NULL, &_transform_type); - - add_option - ("subroot", "name", 0, - "Specifies that only a subroot of the geometry in the Maya file should " - "be converted; specifically, the geometry under the node or nodes whose " - "name matches the parameter (which may include globbing characters " - "like * or ?). This parameter may be repeated multiple times to name " - "multiple roots. If it is omitted altogether, the entire file is " - "converted.", - &MayaToEgg::dispatch_vector_string, NULL, &_subroots); - - add_option - ("subset", "name", 0, - "Specifies that only a subset of the geometry in the Maya file should " - "be converted; specifically, the geometry under the node or nodes whose " - "name matches the parameter (which may include globbing characters " - "like * or ?). This parameter may be repeated multiple times to name " - "multiple roots. If it is omitted altogether, the entire file is " - "converted.", - &MayaToEgg::dispatch_vector_string, NULL, &_subsets); - - add_option - ("exclude", "name", 0, - "Specifies that a subset of the geometry in the Maya file should " - "not be converted; specifically, the geometry under the node or nodes whose " - "name matches the parameter (which may include globbing characters " - "like * or ?). This parameter may be repeated multiple times to name " - "multiple roots.", - &MayaToEgg::dispatch_vector_string, NULL, &_excludes); - - add_option - ("ignore-slider", "name", 0, - "Specifies the name of a slider (blend shape deformer) that maya2egg " - "should not process. The slider will not be touched during conversion " - "and it will not become a part of the animation. This " - "parameter may including globbing characters, and it may be repeated " - "as needed.", - &MayaToEgg::dispatch_vector_string, NULL, &_ignore_sliders); - - add_option - ("force-joint", "name", 0, - "Specifies the name of a DAG node that maya2egg " - "should treat as a joint, even if it does not appear to be a Maya joint " - "and does not appear to be animated.", - &MayaToEgg::dispatch_vector_string, NULL, &_force_joints); - - add_option - ("v", "", 0, - "Increase verbosity. More v's means more verbose.", - &MayaToEgg::dispatch_count, NULL, &_verbose); - - // Unfortunately, the Maya API doesn't allow us to differentiate - // between relative and absolute pathnames--everything comes out as - // an absolute pathname, even if it is stored in the Maya file as a - // relative path. So we can't support -noabs. - remove_option("noabs"); - - _verbose = 0; - _polygon_tolerance = 0.01; - _transform_type = MayaToEggConverter::TT_model; - _got_tbnauto = true; - manager = new QueuedConnectionManager(); - reader = new QueuedConnectionReader(manager, 0); - writer = new ConnectionWriter(manager, 0); + qManager = new QueuedConnectionManager(); + qReader = new QueuedConnectionReader(manager, 0); + qWriter = new ConnectionWriter(manager, 0); + // We assume the server is local and on port 4242 server.set_host("localhost", 4242); } -//////////////////////////////////////////////////////////////////// -// Function: MayaToEgg::run -// Access: Public -// Description: -//////////////////////////////////////////////////////////////////// -void MayaToEgg:: -run() { - // Set the verbose level by using Notify. - if (_verbose >= 3) { - maya_cat->set_severity(NS_spam); - mayaegg_cat->set_severity(NS_spam); - } else if (_verbose >= 2) { - maya_cat->set_severity(NS_debug); - mayaegg_cat->set_severity(NS_debug); - } else if (_verbose >= 1) { - maya_cat->set_severity(NS_info); - mayaegg_cat->set_severity(NS_info); - } - - // Let's convert the output file to a full path before we initialize - // Maya, since Maya now has a nasty habit of changing the current - // directory. - if (_got_output_filename) { - _output_filename.make_absolute(); - } - - nout << "Initializing Maya.\n"; - MayaToEggConverter converter(_program_name); - if (!converter.open_api()) { - nout << "Unable to initialize Maya.\n"; - exit(1); - } - - // Copy in the command-line parameters. - converter._polygon_output = _polygon_output; - converter._polygon_tolerance = _polygon_tolerance; - converter._respect_maya_double_sided = _respect_maya_double_sided; - converter._always_show_vertex_color = !_suppress_vertex_color; - converter._keep_all_uvsets = _keep_all_uvsets; - converter._round_uvs = _round_uvs; - converter._transform_type = _transform_type; - - vector_string::const_iterator si; - if (!_subroots.empty()) { - converter.clear_subroots(); - for (si = _subroots.begin(); si != _subroots.end(); ++si) { - converter.add_subroot(GlobPattern(*si)); - } - } - - if (!_subsets.empty()) { - converter.clear_subsets(); - for (si = _subsets.begin(); si != _subsets.end(); ++si) { - converter.add_subset(GlobPattern(*si)); - } - } - - if (!_excludes.empty()) { - converter.clear_excludes(); - for (si = _excludes.begin(); si != _excludes.end(); ++si) { - converter.add_exclude(GlobPattern(*si)); - } - } - - if (!_ignore_sliders.empty()) { - converter.clear_ignore_sliders(); - for (si = _ignore_sliders.begin(); si != _ignore_sliders.end(); ++si) { - converter.add_ignore_slider(GlobPattern(*si)); - } - } - - if (!_force_joints.empty()) { - converter.clear_force_joints(); - for (si = _force_joints.begin(); si != _force_joints.end(); ++si) { - converter.add_force_joint(GlobPattern(*si)); - } - } - - // Copy in the path and animation parameters. - apply_parameters(converter); - - // Set the coordinate system to match Maya's. - if (!_got_coordinate_system) { - _coordinate_system = converter._maya->get_coordinate_system(); - } - _data->set_coordinate_system(_coordinate_system); - - converter.set_egg_data(_data); - - if (!converter.convert_file(_input_filename)) { - nout << "Errors in conversion.\n"; - exit(1); - } - - // Use the standard Maya units, if the user didn't specify - // otherwise. This always returns centimeters, which is the way all - // Maya files are stored internally (and is the units returned by - // all of the API functions called here). - if (_input_units == DU_invalid) { - _input_units = converter.get_input_units(); - } - - write_egg_file(); - nout << "\n"; -} - -//////////////////////////////////////////////////////////////////// -// Function: MayaToEgg::dispatch_transform_type -// Access: Protected, Static -// Description: Dispatches a parameter that expects a -// MayaToEggConverter::TransformType option. -//////////////////////////////////////////////////////////////////// -bool MayaToEgg:: -dispatch_transform_type(const string &opt, const string &arg, void *var) { - MayaToEggConverter::TransformType *ip = (MayaToEggConverter::TransformType *)var; - (*ip) = MayaToEggConverter::string_transform_type(arg); - - if ((*ip) == MayaToEggConverter::TT_invalid) { - nout << "Invalid type for -" << opt << ": " << arg << "\n" - << "Valid types are all, model, dcs, and none.\n"; - return false; - } - - return true; -} - -//////////////////////////////////////////////////////////////////// -// Function: MayaToEgg::poll -// Access: Public -// Description: Checks for any network activity and handles it, if -// appropriate, and then returns. This must be called -// periodically -//////////////////////////////////////////////////////////////////// -void MayaToEgg:: -poll() { - // Delete all the readers that we couldn't delete before. - while (!_lost_readers.empty()) { - QueuedConnectionReader *reader = _lost_readers.back(); - _lost_readers.pop_back(); - - delete reader; - } - while (!_removed_readers.empty()) { - QueuedConnectionReader *reader = _removed_readers.back(); - _removed_readers.pop_back(); - delete reader; - } - - // listener->poll(); - - Readers::const_iterator ri = _readers.begin(); - while (ri != _readers.end()) { - // Preincrement the iterator, in case we remove it as a result of - // calling poll(). - Readers::const_iterator rnext = ri; - ++rnext; - QueuedConnectionReader *reader = (*ri).second; - - reader->poll(); - - ri = rnext; - } -} - int main(int argc, char *argv[]) { // We don't want pystub on linux, since it gives problems with Maya's python. #ifdef _WIN32 @@ -332,23 +40,17 @@ int main(int argc, char *argv[]) { pystub(); #endif - MayaToEgg prog; - // prog.parse_command_line(argc, argv); - // prog.run(); - - // TODO: - // - Open a socket and wait for communications - // - When communication is received, send along argc and argv to - // prog.parase_command_line and prog.run() - // [ see commented out section above ] - // - Go back to waiting + MayaToEggClient prog; + // Open a connection to the server process PT(Connection) con = prog.manager->open_TCP_client_connection(prog.server,0); if (con.is_null()) { nout << "port opened fail"; } - prog.reader->add_connection(con); + // Add this connection to the readers list + prog.qReader->add_connection(con); + // Get the current working directory and make sure it's a string Filename cwd = ExecutionEnvironment::get_cwd(); string s_cwd = (string)cwd.to_os_specific(); nout << "CWD: " << s_cwd << "\n"; @@ -356,15 +58,20 @@ int main(int argc, char *argv[]) { nout << "building datagram\n"; NetDatagram datagram; + // First part of the datagram is the argc datagram.add_uint8(argc); + // Add the rest of the arguments as strings to the datagram int i; for (i = 0; i < argc; i++) { datagram.add_string(argv[i]); } + // Lastly, add the current working dir as a string to the datagram datagram.add_string(s_cwd); nout << "sending datagram\n"; + + // Send it and close the connection prog.writer->send(datagram, con); prog.manager->close_connection(con); return 0; diff --git a/pandatool/src/mayaprogs/mayaToEgg_client.h b/pandatool/src/mayaprogs/mayaToEgg_client.h index a5952db498..6c13078954 100755 --- a/pandatool/src/mayaprogs/mayaToEgg_client.h +++ b/pandatool/src/mayaprogs/mayaToEgg_client.h @@ -1,5 +1,5 @@ -// Filename: mayaToEgg.h -// Created by: drose (15Feb00) +// Filename: mayaToEgg_client.h +// Adapted by: cbrunner (09Nov09) // //////////////////////////////////////////////////////////////////// // @@ -12,53 +12,26 @@ // //////////////////////////////////////////////////////////////////// -#ifndef MAYATOEGG_H -#define MAYATOEGG_H +#ifndef MAYATOEGGCLIENT_H +#define MAYATOEGGCLIENT_H -#include "pandatoolbase.h" #include "somethingToEgg.h" -#include "mayaToEggConverter.h" #include "queuedConnectionManager.h" #include "queuedConnectionReader.h" #include "connectionWriter.h" //////////////////////////////////////////////////////////////////// -// Class : MayaToEgg +// Class : MayaToEggClient // Description : //////////////////////////////////////////////////////////////////// -class MayaToEgg : public SomethingToEgg { +class MayaToEggClient : public SomethingToEgg { public: - MayaToEgg(); + MayaToEggClient(); - void run(); - void poll(); QueuedConnectionManager *manager; QueuedConnectionReader *reader; ConnectionWriter *writer; NetAddress server; - -protected: - static bool dispatch_transform_type(const string &opt, const string &arg, void *var); - - int _verbose; - bool _polygon_output; - double _polygon_tolerance; - bool _respect_maya_double_sided; - bool _suppress_vertex_color; - bool _keep_all_uvsets; - bool _round_uvs; - MayaToEggConverter::TransformType _transform_type; - vector_string _subroots; - vector_string _subsets; - vector_string _excludes; - vector_string _ignore_sliders; - vector_string _force_joints; - - typedef pmap Readers; - Readers _readers; - typedef pvector LostReaders; - LostReaders _lost_readers; - LostReaders _removed_readers; }; #endif diff --git a/pandatool/src/mayaprogs/mayaToEgg_server.cxx b/pandatool/src/mayaprogs/mayaToEgg_server.cxx index 6deb109504..87d8d4aa24 100755 --- a/pandatool/src/mayaprogs/mayaToEgg_server.cxx +++ b/pandatool/src/mayaprogs/mayaToEgg_server.cxx @@ -1,5 +1,5 @@ -// Filename: mayaToEgg.cxx -// Created by: drose (15Feb00) +// Filename: mayaToEgg_server.cxx +// Adapted by: cbrunner (09Nov09) // //////////////////////////////////////////////////////////////////// // @@ -25,12 +25,12 @@ #endif //////////////////////////////////////////////////////////////////// -// Function: MayaToEgg::Constructor +// Function: MayaToEggServer::Constructor // Access: Public // Description: //////////////////////////////////////////////////////////////////// -MayaToEgg:: -MayaToEgg() : +MayaToEggServer:: +MayaToEggServer() : SomethingToEgg("Maya", ".mb") { add_path_replace_options(); @@ -50,14 +50,14 @@ MayaToEgg() : "Generate polygon output only. Tesselate all NURBS surfaces to " "polygons via the built-in Maya tesselator. The tesselation will " "be based on the tolerance factor given by -ptol.", - &MayaToEgg::dispatch_none, &_polygon_output); + &MayaToEggServer::dispatch_none, &_polygon_output); add_option ("ptol", "tolerance", 0, "Specify the fit tolerance for Maya polygon tesselation. The smaller " "the number, the more polygons will be generated. The default is " "0.01.", - &MayaToEgg::dispatch_double, NULL, &_polygon_tolerance); + &MayaToEggServer::dispatch_double, NULL, &_polygon_tolerance); add_option ("bface", "", 0, @@ -68,7 +68,7 @@ MayaToEgg() : "off where it is not desired). If this flag is not specified, the " "default is to treat all polygons as single-sided, unless an " "egg object type of \"double-sided\" is set.", - &MayaToEgg::dispatch_none, &_respect_maya_double_sided); + &MayaToEggServer::dispatch_none, &_respect_maya_double_sided); add_option ("suppress-vcolor", "", 0, @@ -76,19 +76,19 @@ MayaToEgg() : "(This is the way Maya normally renders internally.) The egg flag " "'vertex-color' may be applied to a particular model to override " "this setting locally.", - &MayaToEgg::dispatch_none, &_suppress_vertex_color); + &MayaToEggServer::dispatch_none, &_suppress_vertex_color); add_option ("keep-uvs", "", 0, "Convert all UV sets on all vertices, even those that do not appear " "to be referenced by any textures.", - &MayaToEgg::dispatch_none, &_keep_all_uvsets); + &MayaToEggServer::dispatch_none, &_keep_all_uvsets); add_option ("round-uvs", "", 0, "round up uv coordinates to the nearest 1/100th. i.e. -0.001 becomes" "0.0; 0.444 becomes 0.44; 0.778 becomes 0.78.", - &MayaToEgg::dispatch_none, &_round_uvs); + &MayaToEggServer::dispatch_none, &_round_uvs); add_option ("trans", "type", 0, @@ -96,7 +96,7 @@ MayaToEgg() : "transforms in the egg file. The option may be one of all, model, " "dcs, or none. The default is model, which means only transforms on " "nodes that have the model flag or the dcs flag are preserved.", - &MayaToEgg::dispatch_transform_type, NULL, &_transform_type); + &MayaToEggServer::dispatch_transform_type, NULL, &_transform_type); add_option ("subroot", "name", 0, @@ -106,7 +106,7 @@ MayaToEgg() : "like * or ?). This parameter may be repeated multiple times to name " "multiple roots. If it is omitted altogether, the entire file is " "converted.", - &MayaToEgg::dispatch_vector_string, NULL, &_subroots); + &MayaToEggServer::dispatch_vector_string, NULL, &_subroots); add_option ("subset", "name", 0, @@ -116,7 +116,7 @@ MayaToEgg() : "like * or ?). This parameter may be repeated multiple times to name " "multiple roots. If it is omitted altogether, the entire file is " "converted.", - &MayaToEgg::dispatch_vector_string, NULL, &_subsets); + &MayaToEggServer::dispatch_vector_string, NULL, &_subsets); add_option ("exclude", "name", 0, @@ -125,7 +125,7 @@ MayaToEgg() : "name matches the parameter (which may include globbing characters " "like * or ?). This parameter may be repeated multiple times to name " "multiple roots.", - &MayaToEgg::dispatch_vector_string, NULL, &_excludes); + &MayaToEggServer::dispatch_vector_string, NULL, &_excludes); add_option ("ignore-slider", "name", 0, @@ -134,19 +134,19 @@ MayaToEgg() : "and it will not become a part of the animation. This " "parameter may including globbing characters, and it may be repeated " "as needed.", - &MayaToEgg::dispatch_vector_string, NULL, &_ignore_sliders); + &MayaToEggServer::dispatch_vector_string, NULL, &_ignore_sliders); add_option ("force-joint", "name", 0, "Specifies the name of a DAG node that maya2egg " "should treat as a joint, even if it does not appear to be a Maya joint " "and does not appear to be animated.", - &MayaToEgg::dispatch_vector_string, NULL, &_force_joints); + &MayaToEggServer::dispatch_vector_string, NULL, &_force_joints); add_option ("v", "", 0, "Increase verbosity. More v's means more verbose.", - &MayaToEgg::dispatch_count, NULL, &_verbose); + &MayaToEggServer::dispatch_count, NULL, &_verbose); // Unfortunately, the Maya API doesn't allow us to differentiate // between relative and absolute pathnames--everything comes out as @@ -164,17 +164,17 @@ MayaToEgg() : dummy = new MayaToEggConverter(); nout << "Initializing Maya...\n"; if (!dummy->open_api()) { - nout << "Unable to initialize May.\n"; + nout << "Unable to initialize Maya.\n"; exit(1); } } //////////////////////////////////////////////////////////////////// -// Function: MayaToEgg::Destructor +// Function: MayaToEggServer::Destructor // Access: Public // Description: //////////////////////////////////////////////////////////////////// -MayaToEgg:: -~MayaToEgg() { +MayaToEggServer:: +~MayaToEggServer() { delete qManager; delete qReader; delete qListener; @@ -182,11 +182,11 @@ MayaToEgg:: } //////////////////////////////////////////////////////////////////// -// Function: MayaToEgg::run +// Function: MayaToEggServer::run // Access: Public // Description: //////////////////////////////////////////////////////////////////// -void MayaToEgg:: +void MayaToEggServer:: run() { // Set the verbose level by using Notify. if (_verbose >= 3) { @@ -291,12 +291,12 @@ run() { } //////////////////////////////////////////////////////////////////// -// Function: MayaToEgg::dispatch_transform_type +// Function: MayaToEggServer::dispatch_transform_type // Access: Protected, Static // Description: Dispatches a parameter that expects a // MayaToEggConverter::TransformType option. //////////////////////////////////////////////////////////////////// -bool MayaToEgg:: +bool MayaToEggServer:: dispatch_transform_type(const string &opt, const string &arg, void *var) { MayaToEggConverter::TransformType *ip = (MayaToEggConverter::TransformType *)var; (*ip) = MayaToEggConverter::string_transform_type(arg); @@ -311,13 +311,13 @@ dispatch_transform_type(const string &opt, const string &arg, void *var) { } //////////////////////////////////////////////////////////////////// -// Function: MayaToEgg::poll +// Function: MayaToEggServer::poll // Access: Public // Description: Checks for any network activity and handles it, if // appropriate, and then returns. This must be called // periodically //////////////////////////////////////////////////////////////////// -void MayaToEgg:: +void MayaToEggServer:: poll() { // Listen for new connections qListener->poll(); @@ -412,7 +412,7 @@ int main(int argc, char *argv[]) { pystub(); #endif - MayaToEgg prog; + MayaToEggServer prog; // Open a rendezvous port for receiving new connections from the client PT(Connection) rend = prog.qManager->open_TCP_server_rendezvous(4242, 50); if (rend.is_null()) { diff --git a/pandatool/src/mayaprogs/mayaToEgg_server.h b/pandatool/src/mayaprogs/mayaToEgg_server.h index 0b1991463b..623bd8c79f 100755 --- a/pandatool/src/mayaprogs/mayaToEgg_server.h +++ b/pandatool/src/mayaprogs/mayaToEgg_server.h @@ -1,5 +1,5 @@ -// Filename: mayaToEgg.h -// Created by: drose (15Feb00) +// Filename: mayaToEgg_server.h +// Adapted by: cbrunner (09Nov09) // //////////////////////////////////////////////////////////////////// // @@ -12,8 +12,8 @@ // //////////////////////////////////////////////////////////////////// -#ifndef MAYATOEGG_H -#define MAYATOEGG_H +#ifndef MAYATOEGGSERVER_H +#define MAYATOEGGSERVER_H #include "pandatoolbase.h" #include "somethingToEgg.h" @@ -23,13 +23,13 @@ #include "queuedConnectionReader.h" //////////////////////////////////////////////////////////////////// -// Class : MayaToEgg +// Class : MayaToEggServer // Description : //////////////////////////////////////////////////////////////////// -class MayaToEgg : public SomethingToEgg { +class MayaToEggServer : public SomethingToEgg { public: - MayaToEgg(); - ~MayaToEgg(); + MayaToEggServer(); + ~MayaToEggServer(); void run(); void poll();