From 6f7dc609e6efa0d44dd655150f5d536978c198dc Mon Sep 17 00:00:00 2001 From: David Rose Date: Wed, 9 Apr 2003 22:35:05 +0000 Subject: [PATCH] support decals properly --- pandatool/src/mayaegg/mayaToEggConverter.cxx | 84 +++++++++++++++++--- pandatool/src/mayaegg/mayaToEggConverter.h | 12 ++- pandatool/src/mayaprogs/mayaToEgg.cxx | 37 ++++++--- pandatool/src/mayaprogs/mayaToEgg.h | 6 +- 4 files changed, 118 insertions(+), 21 deletions(-) diff --git a/pandatool/src/mayaegg/mayaToEggConverter.cxx b/pandatool/src/mayaegg/mayaToEggConverter.cxx index 026a47309e..7c92af462d 100644 --- a/pandatool/src/mayaegg/mayaToEggConverter.cxx +++ b/pandatool/src/mayaegg/mayaToEggConverter.cxx @@ -86,7 +86,7 @@ MayaToEggConverter(const string &program_name) : _from_selection = false; _polygon_output = false; _polygon_tolerance = 0.01; - _ignore_transforms = false; + _transform_type = TT_model; } //////////////////////////////////////////////////////////////////// @@ -816,7 +816,25 @@ get_transform(const MDagPath &dag_path, EggGroup *egg_group) { return; } - if (_ignore_transforms) { + switch (_transform_type) { + case TT_all: + break; + + case TT_model: + if (!egg_group->get_model_flag() && + !egg_group->get_dcs_flag()) { + return; + } + break; + + case TT_dcs: + if (!egg_group->get_dcs_flag()) { + return; + } + break; + + case TT_none: + case TT_invalid: return; } @@ -850,15 +868,24 @@ get_transform(const MDagPath &dag_path, EggGroup *egg_group) { } MMatrix mat = matrix.asMatrix(); - MMatrix ident_mat; - ident_mat.setToIdentity(); + LMatrix4d m4d(mat[0][0], mat[0][1], mat[0][2], mat[0][3], + mat[1][0], mat[1][1], mat[1][2], mat[1][3], + mat[2][0], mat[2][1], mat[2][2], mat[2][3], + mat[3][0], mat[3][1], mat[3][2], mat[3][3]); - if (!mat.isEquivalent(ident_mat, 0.0001)) { - egg_group->set_transform - (LMatrix4d(mat[0][0], mat[0][1], mat[0][2], mat[0][3], - mat[1][0], mat[1][1], mat[1][2], mat[1][3], - mat[2][0], mat[2][1], mat[2][2], mat[2][3], - mat[3][0], mat[3][1], mat[3][2], mat[3][3])); + // Now convert the matrix to the local frame. + mat = dag_path.inclusiveMatrix(&status); + if (!status) { + status.perror("Can't get coordinate space for matrix"); + return; + } + LMatrix4d n2w(mat[0][0], mat[0][1], mat[0][2], mat[0][3], + mat[1][0], mat[1][1], mat[1][2], mat[1][3], + mat[2][0], mat[2][1], mat[2][2], mat[2][3], + mat[3][0], mat[3][1], mat[3][2], mat[3][3]); + m4d = m4d * n2w * egg_group->get_node_frame_inv(); + if (!m4d.almost_equal(LMatrix4d::ident_mat(), 0.0001)) { + egg_group->set_transform(m4d); } } @@ -1658,6 +1685,22 @@ r_get_egg_group(const string &name, const MDagPath &dag_path, egg_group->remove_object_type("billboard"); egg_group->set_group_type(EggGroup::GT_instance); egg_group->set_billboard_type(EggGroup::BT_axis); + + } else if (egg_group->has_object_type("billboard-point")) { + egg_group->remove_object_type("billboard-point"); + egg_group->set_group_type(EggGroup::GT_instance); + egg_group->set_billboard_type(EggGroup::BT_point_camera_relative); + } + + // We also treat the object type "dcs" and "model" as a special + // case, so we can test for these flags later. + if (egg_group->has_object_type("dcs")) { + egg_group->remove_object_type("dcs"); + egg_group->set_dcs_flag(true); + } + if (egg_group->has_object_type("model")) { + egg_group->remove_object_type("model"); + egg_group->set_model_flag(true); } } @@ -1861,3 +1904,24 @@ reparent_decals(EggGroupNode *egg_parent) { return okflag; } + +//////////////////////////////////////////////////////////////////// +// Function: MayaShader::string_transform_type +// Access: Public, Static +// Description: Returns the TransformType value corresponding to the +// indicated string, or TT_invalid. +//////////////////////////////////////////////////////////////////// +MayaToEggConverter::TransformType MayaToEggConverter:: +string_transform_type(const string &arg) { + if (cmp_nocase(arg, "all") == 0) { + return TT_all; + } else if (cmp_nocase(arg, "model") == 0) { + return TT_model; + } else if (cmp_nocase(arg, "dcs") == 0) { + return TT_dcs; + } else if (cmp_nocase(arg, "none") == 0) { + return TT_none; + } else { + return TT_invalid; + } +} diff --git a/pandatool/src/mayaegg/mayaToEggConverter.h b/pandatool/src/mayaegg/mayaToEggConverter.h index 6a0d16c24b..365b0095c8 100644 --- a/pandatool/src/mayaegg/mayaToEggConverter.h +++ b/pandatool/src/mayaegg/mayaToEggConverter.h @@ -138,7 +138,17 @@ public: bool _polygon_output; double _polygon_tolerance; - bool _ignore_transforms; + + enum TransformType { + TT_invalid, + TT_all, + TT_model, + TT_dcs, + TT_none, + }; + TransformType _transform_type; + + static TransformType string_transform_type(const string &arg); }; diff --git a/pandatool/src/mayaprogs/mayaToEgg.cxx b/pandatool/src/mayaprogs/mayaToEgg.cxx index 0ae74438e6..f79b7cce9f 100644 --- a/pandatool/src/mayaprogs/mayaToEgg.cxx +++ b/pandatool/src/mayaprogs/mayaToEgg.cxx @@ -55,21 +55,21 @@ MayaToEgg() : &MayaToEgg::dispatch_double, NULL, &_polygon_tolerance); add_option - ("notrans", "", 0, - "Don't convert explicit DAG transformations given in the Maya file. " - "Instead, convert all vertices to world space and write the file as " - "one big transform space. Using this option doesn't change the " - "position of objects in the scene, just the number of explicit " - "transforms appearing in the resulting egg file.", - &MayaToEgg::dispatch_none, &_ignore_transforms); + ("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 ("v", "", 0, "Increase verbosity. More v's means more verbose.", &MayaToEgg::dispatch_count, NULL, &_verbose); - _polygon_tolerance = 0.01; _verbose = 0; + _polygon_tolerance = 0.01; + _transform_type = MayaToEggConverter::TT_model; } //////////////////////////////////////////////////////////////////// @@ -108,7 +108,7 @@ run() { // Copy in the command-line parameters. converter._polygon_output = _polygon_output; converter._polygon_tolerance = _polygon_tolerance; - converter._ignore_transforms = _ignore_transforms; + converter._transform_type = _transform_type; // Copy in the path and animation parameters. apply_parameters(converter); @@ -139,6 +139,25 @@ run() { 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; +} int main(int argc, char *argv[]) { MayaToEgg prog; diff --git a/pandatool/src/mayaprogs/mayaToEgg.h b/pandatool/src/mayaprogs/mayaToEgg.h index ca47b7f90b..fc300188c7 100644 --- a/pandatool/src/mayaprogs/mayaToEgg.h +++ b/pandatool/src/mayaprogs/mayaToEgg.h @@ -21,6 +21,7 @@ #include "pandatoolbase.h" #include "somethingToEgg.h" +#include "mayaToEggConverter.h" //////////////////////////////////////////////////////////////////// // Class : MayaToEgg @@ -32,10 +33,13 @@ public: void run(); +protected: + static bool dispatch_transform_type(const string &opt, const string &arg, void *var); + int _verbose; bool _polygon_output; double _polygon_tolerance; - bool _ignore_transforms; + MayaToEggConverter::TransformType _transform_type; }; #endif