diff --git a/panda/src/egg2pg/config_egg2pg.cxx b/panda/src/egg2pg/config_egg2pg.cxx index fdc06814f0..a134333f70 100644 --- a/panda/src/egg2pg/config_egg2pg.cxx +++ b/panda/src/egg2pg/config_egg2pg.cxx @@ -169,6 +169,14 @@ ConfigVariableBool egg_preload_simple_textures "fact, the egg loader will generate simple texture images if " "either this or preload-simple-textures is true.")); +ConfigVariableDouble egg_vertex_membership_quantize +("egg-vertex-membership-quantize", 0.01, + PRC_DESC("Specifies the nearest amount to round each vertex joint " + "membership value when loading an egg file. This affects animated " + "egg files only. There is a substantial runtime " + "performance advantage for reducing trivial differences in joint " + "membership. Set this to 0 to leave joint membership as it is.")); + ConfigureFn(config_egg2pg) { init_libegg2pg(); } diff --git a/panda/src/egg2pg/config_egg2pg.h b/panda/src/egg2pg/config_egg2pg.h index c5096b4e02..8f3358a04a 100644 --- a/panda/src/egg2pg/config_egg2pg.h +++ b/panda/src/egg2pg/config_egg2pg.h @@ -52,6 +52,7 @@ extern EXPCL_PANDAEGG ConfigVariableInt egg_max_vertices; extern EXPCL_PANDAEGG ConfigVariableInt egg_max_indices; extern EXPCL_PANDAEGG ConfigVariableBool egg_emulate_bface; extern EXPCL_PANDAEGG ConfigVariableBool egg_preload_simple_textures; +extern EXPCL_PANDAEGG ConfigVariableDouble egg_vertex_membership_quantize; extern EXPCL_PANDAEGG void init_libegg2pg(); diff --git a/panda/src/egg2pg/eggLoader.cxx b/panda/src/egg2pg/eggLoader.cxx index 93c7b30f60..75ad3dca7e 100644 --- a/panda/src/egg2pg/eggLoader.cxx +++ b/panda/src/egg2pg/eggLoader.cxx @@ -93,6 +93,7 @@ #include "thread.h" #include "uvScrollNode.h" #include "textureStagePool.h" +#include "cmath.h" #include #include @@ -2487,10 +2488,14 @@ make_vertex_data(const EggRenderState *render_state, } else { // If the vertex does have an explicit membership, ignore its // parentage and assign it where it wants to be. + double quantize = egg_vertex_membership_quantize; EggVertex::GroupRef::const_iterator gri; for (gri = vertex->gref_begin(); gri != vertex->gref_end(); ++gri) { EggGroup *egg_joint = (*gri); double membership = egg_joint->get_vertex_membership(vertex); + if (quantize != 0.0) { + membership = cfloor(membership / quantize + 0.5) * quantize; + } PT(VertexTransform) vt = character_maker->egg_to_transform(egg_joint); nassertr(vt != (VertexTransform *)NULL, vertex_data);