diff --git a/pandatool/src/mayaprogs/mayaPview.cxx b/pandatool/src/mayaprogs/mayaPview.cxx index 03112f13c7..c59da228d0 100755 --- a/pandatool/src/mayaprogs/mayaPview.cxx +++ b/pandatool/src/mayaprogs/mayaPview.cxx @@ -21,6 +21,8 @@ #include "eggData.h" #include "load_egg_file.h" #include "config_util.h" +#include "config_chan.h" +#include "config_gobj.h" #include "textNode.h" #include "multiplexStream.h" #include "distanceUnit.h" @@ -37,8 +39,17 @@ #include #include #include +#include #include "post_maya_include.h" +// On Windows, we have code to fork pview as a separate process, which +// seems to be better for Maya. +#ifdef WIN32_VC +#include +#include +#define SEPARATE_PVIEW 1 +#endif // WIN32_VC + //////////////////////////////////////////////////////////////////// // Function: MayaPview::Constructor // Access: Public @@ -73,6 +84,69 @@ doIt(const MArgList &args) { return result; } + if (!MProgressWindow::reserve()) { + nout << "Couldn't reserve progress window.\n"; + return MS::kFailure; + } + MProgressWindow::setTitle("Sending to pview"); + MProgressWindow::setInterruptable(false); + MProgressWindow::setProgressRange(0, 3); + MProgressWindow::setProgressStatus("Converting scene"); + MProgressWindow::startProgress(); + +#ifdef SEPARATE_PVIEW + // We'll write the bam file to a temporary file first. + Filename bam_filename = Filename::temporary("", "pview"); + bam_filename.set_extension("bam"); + + // Since we're just writing to a bam file in this process, and + // running pview in a separate process, we don't actually need to + // load textures at this point. Disable the loading of textures. + textures_header_only = true; + + NodePath root("root"); + if (!convert(root, animate)) { + nout << "failure in conversion.\n"; + MProgressWindow::endProgress(); + return MS::kFailure; + } + + MProgressWindow::setProgressStatus("Writing bam file"); + MProgressWindow::advanceProgress(1); + + if (!root.write_bam_file(bam_filename)) { + nout << "Couldn't write to " << bam_filename << ".\n"; + MProgressWindow::endProgress(); + return MS::kFailure; + } + + MProgressWindow::setProgressStatus("Spawning pview"); + MProgressWindow::advanceProgress(1); + + // Now spawn a pview instance to view this temporary file. + string pview_args = "-clD"; + if (animate) { + pview_args = "-clDa"; + } + + // On Windows, we use the spawn function to run pview + // asynchronously. + string quoted = string("\"") + bam_filename.get_fullpath() + string("\""); + nout << "pview " << pview_args << " " << quoted << "\n"; + int retval = _spawnlp(_P_DETACH, "pview", + "pview", pview_args.c_str(), quoted.c_str(), NULL); + if (retval == -1) { + bam_filename.unlink(); + MProgressWindow::endProgress(); + return MS::kFailure; + } + + nout << "pview running.\n"; + MProgressWindow::endProgress(); + +#else // SEPARATE_PVIEW + // We'll run PandaFramework directly within this process. + // Maya seems to run each invocation of the plugin in a separate // thread. To minimize conflict in our // not-yet-completely-thread-safe Panda, we'll create a separate @@ -90,6 +164,7 @@ doIt(const MArgList &args) { if (window == (WindowFramework *)NULL) { // Couldn't open a window. nout << "Couldn't open a window!\n"; + MProgressWindow::endProgress(); return MS::kFailure; } @@ -117,6 +192,7 @@ doIt(const MArgList &args) { if (!convert(framework.get_models(), animate)) { nout << "failure in conversion.\n"; + MProgressWindow::endProgress(); return MS::kFailure; } @@ -130,7 +206,10 @@ doIt(const MArgList &args) { window->set_anim_controls(true); } + MProgressWindow::endProgress(); framework.main_loop(); +#endif // SEPARATE_PVIEW + return MS::kSuccess; } @@ -158,10 +237,15 @@ convert(const NodePath &parent, bool animate) { // We always want polygon output since we want to be able to see the // results. converter._polygon_output = true; + converter._polygon_tolerance = 0.01; if (animate) { // We also want to get the animation if there is any. converter.set_animation_convert(AC_both); + + // Don't compress animation channels; that can introduce confusing + // artifacts. + compress_channels = false; } PathReplace *path_replace = converter.get_path_replace(); @@ -187,6 +271,9 @@ convert(const NodePath &parent, bool animate) { return false; } + MProgressWindow::setProgressStatus("Converting to bam"); + MProgressWindow::advanceProgress(1); + // Now the converter has filled up our egg structure with data, so // convert this egg data to Panda data for immediate viewing. DistanceUnit input_units = converter.get_input_units();