structured character support

This commit is contained in:
Zachary Pavlov 2009-06-20 00:17:05 +00:00
parent 38440c72bd
commit 7d2e756b48
6 changed files with 84 additions and 6 deletions

View File

@ -35,13 +35,17 @@
#include "eggAnimPreload.h"
#include "animPreloadTable.h"
////////////////////////////////////////////////////////////////////
// Function: CharacterMaker::Construtor
// Access: Public
// Description:
////////////////////////////////////////////////////////////////////
CharacterMaker::
CharacterMaker(EggGroup *root, EggLoader &loader)
CharacterMaker(EggGroup *root, EggLoader &loader, bool structured)
: _loader(loader), _egg_root(root) {
_character_node = new Character(_egg_root->get_name());
@ -49,6 +53,7 @@ CharacterMaker(EggGroup *root, EggLoader &loader)
_morph_root = (PartGroup *)NULL;
_skeleton_root = new PartGroup(_bundle, "<skeleton>");
_structured = structured;
}
////////////////////////////////////////////////////////////////////
@ -224,8 +229,11 @@ egg_to_slider(const string &name) {
CharacterJointBundle *CharacterMaker::
make_bundle() {
build_joint_hierarchy(_egg_root, _skeleton_root, -1);
make_geometry(_egg_root);
//if we are structured, the egg loader is going to take care of making the geometry
if(!_structured) {
make_geometry(_egg_root);
}
_bundle->sort_descendants();
parent_joint_nodes(_skeleton_root);

View File

@ -24,6 +24,7 @@
#include "typedef.h"
#include "pmap.h"
class EggNode;
class EggGroup;
class EggGroupNode;
@ -46,7 +47,7 @@ class PandaNode;
////////////////////////////////////////////////////////////////////
class EXPCL_PANDAEGG CharacterMaker {
public:
CharacterMaker(EggGroup *root, EggLoader &loader);
CharacterMaker(EggGroup *root, EggLoader &loader, bool structured = false);
Character *make_node();
@ -89,6 +90,9 @@ private:
CharacterJointBundle *_bundle;
PartGroup *_morph_root;
PartGroup *_skeleton_root;
bool _structured;
};
#endif

View File

@ -135,6 +135,8 @@ EggLoader() {
_data = new EggData;
_data->set_coordinate_system(egg_coordinate_system);
_error = false;
_dynamic_override = false;
_dynamic_override_char_maker = NULL;
}
////////////////////////////////////////////////////////////////////
@ -148,6 +150,8 @@ EggLoader(const EggData *data) :
_data(new EggData(*data))
{
_error = false;
_dynamic_override = true;
_dynamic_override_char_maker = NULL;
}
@ -210,7 +214,6 @@ build_graph() {
apply_deferred_nodes(_root, DeferredNodeProperty());
}
////////////////////////////////////////////////////////////////////
// Function: EggLoader::reparent_decals
// Access: Public
@ -1696,7 +1699,7 @@ make_node(EggBin *egg_bin, PandaNode *parent) {
// node (a parent of one or more similar EggPrimitives).
switch (egg_bin->get_bin_number()) {
case EggBinner::BN_polyset:
make_polyset(egg_bin, parent, NULL, false, NULL);
make_polyset(egg_bin, parent, NULL, _dynamic_override, _dynamic_override_char_maker);
return NULL;
case EggBinner::BN_lod:
@ -1788,8 +1791,23 @@ make_node(EggGroup *egg_group, PandaNode *parent) {
if (egg_group->get_dart_type() != EggGroup::DT_none) {
// A group with the <Dart> flag set means to create a character.
CharacterMaker char_maker(egg_group, *this);
bool structured = (egg_group->get_dart_type() == EggGroup::DT_structured);
CharacterMaker char_maker(egg_group, *this, structured);
node = char_maker.make_node();
if(structured) {
//we're going to generate the rest of the children normally
//except we'll be making dynamic geometry
_dynamic_override = true;
_dynamic_override_char_maker = &char_maker;
EggGroup::const_iterator ci;
for (ci = egg_group->begin(); ci != egg_group->end(); ++ci) {
make_node(*ci, node);
}
_dynamic_override_char_maker = NULL;
_dynamic_override = false;
}
} else if (egg_group->get_cs_type() != EggGroup::CST_none) {
// A collision group: create collision geometry.

View File

@ -252,6 +252,10 @@ public:
PT(BamCacheRecord) _record;
bool _error;
CharacterMaker * _dynamic_override_char_maker;
bool _dynamic_override;
friend class EggRenderState;
friend class PandaNode;
};

View File

@ -198,6 +198,12 @@ EggOptchar() {
"to quantize different channels by a different amount.",
&EggOptchar::dispatch_double_components, NULL, &_quantize_anims);
add_option
("dart", "[default, sync, nosync, or structured]", 0,
"change the dart value in the given eggs",
&EggOptchar::dispatch_string, NULL, &_dart_type);
_optimal_hierarchy = false;
_vref_quantum = 0.01;
}
@ -290,6 +296,7 @@ run() {
do_preload();
}
// Finally, set the default poses. It's important not to do this
// until after we have adjusted all of the transforms for the
// various joints.
@ -297,6 +304,13 @@ run() {
do_defpose();
}
if (!_dart_type.empty()) {
Eggs::iterator ei;
for (ei = _eggs.begin(); ei != _eggs.end(); ++ei) {
change_dart_type(*ei, _dart_type);
}
}
write_eggs();
}
}
@ -1400,6 +1414,33 @@ rename_joints() {
}
}
////////////////////////////////////////////////////////////////////
// Function: EggOptchar::change_dart_type
// Access: Private
// Description: Recursively walks the indicated egg hierarchy,
// renaming geometry to the indicated name.
////////////////////////////////////////////////////////////////////
void EggOptchar::
change_dart_type(EggGroupNode *egg_group, const string &new_dart_type) {
EggGroupNode::iterator gi;
for (gi = egg_group->begin(); gi != egg_group->end(); ++gi) {
EggNode *child = (*gi);
if (child->is_of_type(EggGroupNode::get_class_type())) {
EggGroupNode *group = DCAST(EggGroupNode, child);
if (child->is_of_type(EggGroup::get_class_type())) {
EggGroup *gr = DCAST(EggGroup, child);
EggGroup::DartType dt = gr->get_dart_type();
if(dt != EggGroup::DT_none) {
EggGroup::DartType newDt = gr->string_dart_type(new_dart_type);
gr->set_dart_type(newDt);
}
}
change_dart_type(group, new_dart_type);
}
}
}
////////////////////////////////////////////////////////////////////
// Function: EggOptchar::rename_primitives
// Access: Private

View File

@ -78,6 +78,7 @@ private:
void do_flag_groups(EggGroupNode *egg_group);
void rename_joints();
void rename_primitives(EggGroupNode *egg_group, const string &name);
void change_dart_type(EggGroupNode *egg_group, const string &new_dart_type);
void do_preload();
void do_defpose();
@ -103,6 +104,8 @@ private:
vector_string _expose_components;
vector_string _suppress_components;
string _dart_type;
class DoubleString {
public:
double _a;