Browse Source

ptloader-units

David Rose 20 years ago
parent
commit
d9b6585a78

+ 15 - 0
pandatool/src/mayaprogs/mayaPview.cxx

@@ -23,6 +23,8 @@
 #include "config_util.h"
 #include "textNode.h"
 #include "multiplexStream.h"
+#include "distanceUnit.h"
+#include "configVariableEnum.h"
 
 // We must define this to prevent Maya from doubly-declaring its
 // MApiVersion string in this file as well as in libmayaegg.
@@ -182,6 +184,19 @@ convert(const NodePath &parent, bool animate) {
 
   // 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();
+  ConfigVariableEnum<DistanceUnit> ptloader_units("ptloader-units", DU_invalid);
+  if (input_units != DU_invalid && ptloader_units != DU_invalid && 
+      input_units != ptloader_units) {
+    // Convert the file to the units specified by the ptloader-units
+    // Configrc variable.
+    nout
+      << "Converting from " << format_long_unit(input_units)
+      << " to " << format_long_unit(ptloader_units) << "\n";
+    double scale = convert_units(input_units, ptloader_units);
+    egg_data->transform(LMatrix4d::scale_mat(scale));
+  }
+
   egg_data->set_coordinate_system(CS_default);
   PT(PandaNode) result = load_egg_data(egg_data);
 

+ 17 - 1
pandatool/src/pandatoolbase/distanceUnit.cxx

@@ -17,7 +17,7 @@
 ////////////////////////////////////////////////////////////////////
 
 #include "distanceUnit.h"
-
+#include "config_pandatoolbase.h"
 #include "string_utils.h"
 #include "notify.h"
 
@@ -114,6 +114,22 @@ operator << (ostream &out, DistanceUnit unit) {
   return out << format_abbrev_unit(unit);
 }
 
+////////////////////////////////////////////////////////////////////
+//     Function: DistanceUnit input operator
+//  Description:
+////////////////////////////////////////////////////////////////////
+istream &
+operator >> (istream &in, DistanceUnit &unit) {
+  string word;
+  in >> word;
+  unit = string_distance_unit(word);
+  if (unit == DU_invalid) {
+    pandatoolbase_cat->error()
+      << "Invalid distance unit: " << word << "\n";
+  }
+  return in;
+}
+
 ////////////////////////////////////////////////////////////////////
 //     Function: string_distance_unit
 //  Description: Converts from a string, as might be input by the

+ 1 - 0
pandatool/src/pandatoolbase/distanceUnit.h

@@ -44,6 +44,7 @@ string format_abbrev_unit(DistanceUnit unit);
 string format_long_unit(DistanceUnit unit);
 
 ostream &operator << (ostream &out, DistanceUnit unit);
+istream &operator >> (istream &in, DistanceUnit &unit);
 DistanceUnit string_distance_unit(const string &str);
 
 double convert_units(DistanceUnit from, DistanceUnit to);

+ 5 - 10
pandatool/src/ptloader/config_ptloader.cxx

@@ -39,7 +39,11 @@ ConfigureFn(config_ptloader) {
   init_libptloader();
 }
 
-DistanceUnit ptloader_units = DU_invalid;
+ConfigVariableEnum<DistanceUnit> ptloader_units
+("ptloader-units", DU_invalid,
+ PRC_DESC("Specifies the preferred units into which models will be converted "
+	  "when using libptloader to automatically convert files to Panda "
+	  "at load time, via e.g. \"pview myMayaFile.mb\"."));
 
 ////////////////////////////////////////////////////////////////////
 //     Function: init_libptloader
@@ -57,15 +61,6 @@ init_libptloader() {
   }
   initialized = true;
 
-  string units = config_ptloader.GetString("ptloader-units", "feet");
-  if (!units.empty()) {
-    ptloader_units = string_distance_unit(units);
-    if (ptloader_units == DU_invalid) {
-      ptloader_cat->warning()
-        << "Invalid ptloader-units: " << units << "\n";
-    }
-  }
-
   LoaderFileTypePandatool::init_type();
 
   LoaderFileTypeRegistry *reg = LoaderFileTypeRegistry::get_global_ptr();

+ 2 - 1
pandatool/src/ptloader/config_ptloader.h

@@ -23,11 +23,12 @@
 
 #include "dconfig.h"
 #include "distanceUnit.h"
+#include "configVariableEnum.h"
 
 ConfigureDecl(config_ptloader, EXPCL_PTLOADER, EXPTP_PTLOADER);
 NotifyCategoryDecl(ptloader, EXPCL_PTLOADER, EXPTP_PTLOADER);
 
-extern DistanceUnit ptloader_units;
+extern ConfigVariableEnum<DistanceUnit> ptloader_units;
 
 extern EXPCL_PTLOADER void init_libptloader();