diff --git a/pandatool/src/mayaegg/mayaToEggConverter.cxx b/pandatool/src/mayaegg/mayaToEggConverter.cxx index ccebf0b190..793ba59de1 100644 --- a/pandatool/src/mayaegg/mayaToEggConverter.cxx +++ b/pandatool/src/mayaegg/mayaToEggConverter.cxx @@ -97,6 +97,7 @@ MayaToEggConverter(const string &program_name) : _respect_maya_double_sided = maya_default_double_sided; _always_show_vertex_color = maya_default_vertex_color; _keep_all_uvsets = false; + _round_uvs = false; _transform_type = TT_model; } @@ -120,6 +121,7 @@ MayaToEggConverter(const MayaToEggConverter ©) : _respect_maya_double_sided(copy._respect_maya_double_sided), _always_show_vertex_color(copy._always_show_vertex_color), _keep_all_uvsets(copy._keep_all_uvsets), + _round_uvs(copy._round_uvs), _transform_type(copy._transform_type) { } @@ -779,6 +781,10 @@ bool MayaToEggConverter:: convert_hierarchy(EggGroupNode *egg_root) { int num_nodes = _tree.get_num_nodes(); + if (_round_uvs) { + mayaegg_cat.info() << "will round up uv coordinates" << endl; + } + _tree.clear_egg(get_egg_data(), egg_root, NULL, NULL); for (int i = 0; i < num_nodes; i++) { MayaNodeDesc *node = _tree.get_node(i); @@ -1675,6 +1681,20 @@ find_uv_link(string match) { } return "not found"; } +//////////////////////////////////////////////////////////////////// +// Function: MayaShader::round uvs +// Access: Private +// Description: given uvsets, round them up or down +//////////////////////////////////////////////////////////////////// +int MayaToEggConverter:: +round(double value) { + if (value < 0) + return -(floor(-value + 0.5)); + // or as an alternate use: + // return ceil ( value - 0.5); + else + return floor( value + 0.5); +} /* //////////////////////////////////////////////////////////////////// // Function: MayaToEggConverter::store_tex_names @@ -2020,9 +2040,17 @@ make_polyset(MayaNodeDesc *node_desc, const MDagPath &dag_path, if (!status) { status.perror("MItMeshPolygon::getUV"); } else { - // apply upto 1/1000th precision - uvs[0] = (double)((long)(uvs[0]*1000))/1000.0; - uvs[1] = (double)((long)(uvs[1]*1000))/1000.0; + if (_round_uvs) { + // apply upto 1/1000th precision, but round up + uvs[0] = (long)(uvs[0]*1000); + uvs[1] = (long)(uvs[1]*1000); + //cout << "before rounding uvs[0]: " << uvs[0] << endl; + //cout << "before rounding uvs[1]: " << uvs[1] << endl; + uvs[0] = (double)(round((double)uvs[0]/10.0)*10.0)/1000.0; + uvs[1] = (double)(round((double)uvs[1]/10.0)*10.0)/1000.0; + //cout << "after rounding uvs[0]: " << uvs[0] << endl; + //cout << "after rounding uvs[1]: " << uvs[1] << endl; + } vert.set_uv(colordef_uv_name, TexCoordd(uvs[0], uvs[1])); } } diff --git a/pandatool/src/mayaegg/mayaToEggConverter.h b/pandatool/src/mayaegg/mayaToEggConverter.h index cebb8f933c..9be6fc367e 100644 --- a/pandatool/src/mayaegg/mayaToEggConverter.h +++ b/pandatool/src/mayaegg/mayaToEggConverter.h @@ -155,7 +155,8 @@ private: bool reparent_decals(EggGroupNode *egg_parent); string find_uv_link(string match); - // string find_uv_link_2(string match, const MObjectArray &textures); + + int round(double value); string _program_name; @@ -182,6 +183,7 @@ public: bool _respect_maya_double_sided; bool _always_show_vertex_color; bool _keep_all_uvsets; + bool _round_uvs; enum TransformType { TT_invalid, diff --git a/pandatool/src/mayaprogs/mayaToEgg.cxx b/pandatool/src/mayaprogs/mayaToEgg.cxx index e4a6f5b972..af11679d0d 100644 --- a/pandatool/src/mayaprogs/mayaToEgg.cxx +++ b/pandatool/src/mayaprogs/mayaToEgg.cxx @@ -83,6 +83,12 @@ MayaToEgg() : "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 " @@ -182,6 +188,7 @@ run() { 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; diff --git a/pandatool/src/mayaprogs/mayaToEgg.h b/pandatool/src/mayaprogs/mayaToEgg.h index 616b0cd407..9267e5a269 100644 --- a/pandatool/src/mayaprogs/mayaToEgg.h +++ b/pandatool/src/mayaprogs/mayaToEgg.h @@ -42,6 +42,7 @@ protected: 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;