Browse Source

getting closer with mayapview

David Rose 23 years ago
parent
commit
499e4e239a

+ 19 - 2
pandatool/src/maya/mayaApi.cxx

@@ -41,6 +41,20 @@ MayaApi *MayaApi::_global_api = (MayaApi *)NULL;
 ////////////////////////////////////////////////////////////////////
 MayaApi::
 MayaApi(const string &program_name) {
+  if (program_name == "plug-in") {
+    // In this special case, we are invoking the code from within a
+    // plug-in, so we need not (and should not) call
+    // MLibrary::initialize().
+    _plug_in = true;
+    _is_valid = true;
+    return;
+  }
+
+  // Otherwise, if program_name is any other name, we are invoking the
+  // code from a standalone application and we do need to call
+  // MLibrary::initialize().
+  _plug_in = false;
+
   // Beginning with Maya4.5, the call to initialize seems to change
   // the current directory!  Yikes!
 
@@ -100,7 +114,7 @@ operator = (const MayaApi &copy) {
 MayaApi::
 ~MayaApi() {
   nassertv(_global_api == this);
-  if (_is_valid) {
+  if (_is_valid && !_plug_in) {
     // Caution!  Calling this function seems to call exit() somewhere
     // within Maya code.
     MLibrary::cleanup();
@@ -119,7 +133,10 @@ MayaApi::
 //               If program_name is supplied, it is passed to Maya as
 //               the name of the currently-executing program.
 //               Otherwise, the current program name is extracted from
-//               the execution environment, if possible.
+//               the execution environment, if possible.  The special
+//               program_name "plug-in" is used for code that is
+//               intended to be invoked as a plug-in only; in this
+//               case, the maya library is not re-initialized.
 ////////////////////////////////////////////////////////////////////
 PT(MayaApi) MayaApi::
 open_api(string program_name) {

+ 1 - 0
pandatool/src/maya/mayaApi.h

@@ -55,6 +55,7 @@ public:
 
 private:
   bool _is_valid;
+  bool _plug_in;
   static MayaApi *_global_api;
 };
 

+ 2 - 3
pandatool/src/mayaprogs/Sources.pp

@@ -81,10 +81,9 @@
 
   #define UNIX_SYS_LIBS \
     m
+  #define BUILDING_DLL BUILDING_MISC
 
   #if $[WINDOWS_PLATFORM]
-    // Explicitly export the maya initialize and shutdown functions.
-    #define LINKER_FLAGS $[LINKER_FLAGS] /export:initializePlugin /export:uninitializePlugin
     // On Windows, Maya expects its plugins to be named with a .mll
     // extension, but it's a perfectly normal dll otherwise.  This
     // ppremake hack achieves that filename.
@@ -92,7 +91,7 @@
   #endif
 
   #define SOURCES \
-    mayaPview.cxx
+    mayaPview.cxx mayaPview.h
 
 #end lib_target
   

+ 118 - 18
pandatool/src/mayaprogs/mayaPview.cxx

@@ -16,30 +16,45 @@
 //
 ////////////////////////////////////////////////////////////////////
 
-#include "pandaFramework.h"
+#include "mayaPview.h"
+#include "mayaToEggConverter.h"
+#include "eggData.h"
+#include "load_egg_file.h"
+
+// We must define this to prevent Maya from doubly-declaring its
+// MApiVersion string in this file as well as in libmayaegg.
+#define _MApiVersion
 
 #include "pre_maya_include.h"
-#include <maya/MSimple.h>
+#include <maya/MString.h>
+#include <maya/MFnPlugin.h>
 #include "post_maya_include.h"
 
-static PandaFramework framework;
-static bool opened_framework = false;
-
-// This Maya macro sets up a class that meets the plug-in requirements
-// for a simple command.
-DeclareSimpleCommand(MayaPview, "VR Studio", "1.0");
+////////////////////////////////////////////////////////////////////
+//     Function: MayaPview::Constructor
+//       Access: Public
+//  Description:
+////////////////////////////////////////////////////////////////////
+MayaPview::
+MayaPview() {
+}
 
+////////////////////////////////////////////////////////////////////
+//     Function: MayaPview::doIt
+//       Access: Public, Virtual
+//  Description: Called when the plugin command is invoked.
+////////////////////////////////////////////////////////////////////
 MStatus MayaPview::
 doIt(const MArgList &) {
-  if (!opened_framework) {
-    int argc = 0;
-    char **argv = NULL;
-    framework.open_framework(argc, argv);
-    framework.set_window_title("Panda Viewer");
-    framework.enable_default_keys();
-  }
+  int argc = 0;
+  char **argv = NULL;
+  PandaFramework framework;
+  framework.open_framework(argc, argv);
+  framework.set_window_title("Panda Viewer");
+  framework.enable_default_keys();
 
-  WindowFramework *window = framework.open_window();
+  PT(WindowFramework) window;
+  window = framework.open_window();
   if (window == (WindowFramework *)NULL) {
     // Couldn't open a window.
     nout << "Couldn't open a window!\n";
@@ -50,11 +65,96 @@ doIt(const MArgList &) {
 
   window->enable_keyboard();
   window->setup_trackball();
+  framework.get_models().instance_to(window->get_render());
+
+  if (!convert(framework.get_models())) {
+    return MS::kFailure;
+  }
 
-  window->load_default_model(framework.get_models());
   window->loop_animations();
 
-  framework.clear_exit_flag();
   framework.main_loop();
   return MS::kSuccess;
 }
+
+////////////////////////////////////////////////////////////////////
+//     Function: MayaPview::creator
+//       Access: Public, Static
+//  Description: This is used to create a new instance of the plugin.
+////////////////////////////////////////////////////////////////////
+void *MayaPview::
+creator() {
+  return new MayaPview;
+}
+
+////////////////////////////////////////////////////////////////////
+//     Function: MayaPview::convert
+//       Access: Private
+//  Description: Actually converts the Maya selection to Panda
+//               geometry, and parents it to the indicated NodePath.
+////////////////////////////////////////////////////////////////////
+bool MayaPview::
+convert(const NodePath &parent) {
+  // Now make a converter to get all the Maya structures.
+  MayaToEggConverter converter("plug-in");
+
+  // We always want polygon output since we want to be able to see the
+  // results.
+  converter._polygon_output = true;
+
+  EggData egg_data;
+  converter.set_egg_data(&egg_data, false);
+
+  if (!converter.convert_maya()) {
+    nout << "Errors in conversion.\n";
+    return false;
+  }
+
+  // Now the converter has filled up our egg structure with data, so
+  // convert this egg data to Panda data for immediate viewing.
+  egg_data.set_coordinate_system(CS_default);
+  PT(PandaNode) result = load_egg_data(egg_data);
+
+  if (result == (PandaNode *)NULL) {
+    nout << "Unable to load converted egg data.\n";
+    return false;
+  }
+
+  parent.attach_new_node(result);
+  return true;
+}
+
+
+
+
+////////////////////////////////////////////////////////////////////
+//     Function: initializePlugin
+//  Description: Called by Maya when the plugin is loaded.
+////////////////////////////////////////////////////////////////////
+EXPCL_MISC MStatus 
+initializePlugin(MObject obj) {
+  MFnPlugin plugin(obj, "VR Studio", "1.0");
+  MStatus status;
+  status = plugin.registerCommand("pview", MayaPview::creator);
+  if (!status) {
+    status.perror("registerCommand");
+  }
+
+  return status;
+}
+
+////////////////////////////////////////////////////////////////////
+//     Function: uninitializePlugin
+//  Description: Called by Maya when the plugin is unloaded.
+////////////////////////////////////////////////////////////////////
+EXPCL_MISC MStatus
+uninitializePlugin(MObject obj) {
+  MFnPlugin plugin(obj);
+  MStatus status;
+  status = plugin.deregisterCommand("pview");
+
+  if (!status) {
+    status.perror("deregisterCommand");
+  }
+  return status;
+}

+ 52 - 0
pandatool/src/mayaprogs/mayaPview.h

@@ -0,0 +1,52 @@
+// Filename: mayaPview.h
+// Created by:  drose (11Mar03)
+//
+////////////////////////////////////////////////////////////////////
+//
+// PANDA 3D SOFTWARE
+// Copyright (c) 2001, Disney Enterprises, Inc.  All rights reserved
+//
+// All use of this software is subject to the terms of the Panda 3d
+// Software license.  You should have received a copy of this license
+// along with this source code; you will also find a current copy of
+// the license at http://www.panda3d.org/license.txt .
+//
+// To contact the maintainers of this program write to
+// [email protected] .
+//
+////////////////////////////////////////////////////////////////////
+
+#ifndef MAYAPVIEW_H
+#define MAYAPVIEW_H
+
+#include "pandatoolbase.h"
+#include "pandaFramework.h"
+
+#include "pre_maya_include.h"
+#include <maya/MArgList.h>
+#include <maya/MPxCommand.h>
+#include <maya/MObject.h>
+#include "post_maya_include.h"
+
+////////////////////////////////////////////////////////////////////
+//       Class : MayaPview
+// Description : This class serves as a plug-in to Maya to allow
+//               viewing the current Maya selection as it will be
+//               converted to Panda.
+////////////////////////////////////////////////////////////////////
+class MayaPview : public MPxCommand {
+public:
+  MayaPview();
+  virtual MStatus doIt(const MArgList &);
+
+  static void *creator();
+
+private:
+  bool convert(const NodePath &parent);
+};
+
+EXPCL_MISC MStatus initializePlugin(MObject obj);
+EXPCL_MISC MStatus uninitializePlugin(MObject obj);
+
+
+#endif