structured character support
This commit is contained in:
parent
38440c72bd
commit
7d2e756b48
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -252,6 +252,10 @@ public:
|
|||
PT(BamCacheRecord) _record;
|
||||
bool _error;
|
||||
|
||||
CharacterMaker * _dynamic_override_char_maker;
|
||||
bool _dynamic_override;
|
||||
|
||||
|
||||
friend class EggRenderState;
|
||||
friend class PandaNode;
|
||||
};
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Reference in New Issue