26 _skeleton_node =
nullptr;
39 node_desc->_joint_entry =
build_joint(max_node, node_desc);
50 MaxNodeDesc *node_desc = r_build_joint(node_joint, max_node);
52 node_desc->set_joint(
true);
56 bool MaxNodeTree::node_in_list(ULONG handle, ULONG *list,
int len) {
57 if (!list)
return true;
58 for (
int i = 0; i < len; i++)
59 if (list[i] == handle)
return true;
63 bool MaxNodeTree::is_joint(INode *node) {
64 Control *c = node->GetTMController();
65 return (node->GetBoneNodeOnOff() ||
67 ((c->ClassID() == BIPSLAVE_CONTROL_CLASS_ID) ||
68 (c->ClassID() == BIPBODY_CONTROL_CLASS_ID) ||
69 (c->ClassID() == FOOTPRINT_CLASS_ID))));
73 r_build_hierarchy(INode *root, ULONG *selection_list,
int len) {
74 if (node_in_list(root->GetHandle(), selection_list, len))
77 for (
int i = 0; i < root->NumberOfChildren(); i++ ) {
79 r_build_hierarchy(root->GetChildNode(i), selection_list, len);
91 if (root ==
nullptr) {
97 r_build_hierarchy(root, selection_list, len);
100 _root->check_pseudo_joints(
false);
112 return _nodes.size();
120 nassertr(n >= 0 && n < (
int)_nodes.size(),
nullptr);
132 _egg_data = egg_data;
133 _egg_root = egg_root;
134 _skeleton_node = skeleton_node;
143 nassertr(_egg_root !=
nullptr,
nullptr);
145 if (node_desc->_egg_group ==
nullptr) {
149 nassertr(node_desc->_parent !=
nullptr,
nullptr);
150 egg_group =
new EggGroup(node_desc->get_name());
152 egg_group->set_group_type(EggGroup::GT_joint);
154 if (node_desc->_parent == _root) {
159 set_collision_tags(node_desc, egg_group);
168 if(node_desc->_parent->_parent == _root)
170 set_collision_tags(node_desc, egg_group);
177 node_desc->_egg_group = egg_group;
180 return node_desc->_egg_group;
189 nassertr(_skeleton_node !=
nullptr,
nullptr);
190 nassertr(node_desc->
is_joint(),
nullptr);
192 if (node_desc->_egg_table ==
nullptr) {
194 nassertr(node_desc->_parent !=
nullptr,
nullptr);
199 node_desc->_anim->set_fps(_fps);
202 if (!node_desc->_parent->
is_joint()) {
212 node_desc->_egg_table = egg_table;
215 return node_desc->_egg_table;
225 return node_desc->_anim;
232 r_build_node(INode* max_node) {
236 ULONG node_handle = 0;
239 node_handle = max_node->GetHandle();
242 NodesByPath::const_iterator ni = _nodes_by_path.find(node_handle);
243 if (ni != _nodes_by_path.end()) {
258 if (max_node->IsRootNode()) {
259 parent_node =
nullptr;
261 parent_node = max_node->GetParentNode();
264 MaxNodeDesc *parent_node_desc = r_build_node(parent_node);
265 node_desc =
new MaxNodeDesc(parent_node_desc, max_node);
266 _nodes.push_back(node_desc);
269 _nodes_by_path.insert(NodesByPath::value_type(node_handle, node_desc));
277 r_build_joint(
MaxNodeDesc *node_desc, INode *max_node)
280 if (node_desc == _root) {
282 _nodes.push_back(node_joint);
284 }
else if (node_desc->
is_node_joint() && node_desc->_joint_entry) {
285 node_joint =
new MaxNodeDesc(node_desc->_joint_entry, max_node);
286 _nodes.push_back(node_joint);
289 return r_build_joint(node_desc->_parent, max_node);
301 ULONG node_handle = 0;
304 node_handle = max_node->GetHandle();
307 NodesByPath::const_iterator ni = _nodes_by_path.find(node_handle);
308 if (ni != _nodes_by_path.end()) {
324 return node->_joint_entry;
341 if (node_desc->
get_max_node()->GetUserPropInt(_T(
"polyset"), check)) {
344 egg_group->set_collision_name(node_desc->get_name());
345 egg_group->set_cs_type(EggGroup::CST_polyset);
348 if (node_desc->
get_max_node()->GetUserPropInt(_T(
"plane"), check)) {
351 egg_group->set_collision_name(node_desc->get_name());
352 egg_group->set_cs_type(EggGroup::CST_plane);
355 if (node_desc->
get_max_node()->GetUserPropInt(_T(
"polygon"), check)) {
358 egg_group->set_collision_name(node_desc->get_name());
359 egg_group->set_cs_type(EggGroup::CST_polygon);
362 if (node_desc->
get_max_node()->GetUserPropInt(_T(
"sphere"), check)) {
365 egg_group->set_collision_name(node_desc->get_name());
366 egg_group->set_cs_type(EggGroup::CST_sphere);
369 if (node_desc->
get_max_node()->GetUserPropInt(_T(
"inv-sphere"), check)) {
372 egg_group->set_collision_name(node_desc->get_name());
373 egg_group->set_cs_type(EggGroup::CST_inv_sphere);
376 if (node_desc->
get_max_node()->GetUserPropInt(_T(
"invsphere"), check)) {
379 egg_group->set_collision_name(node_desc->get_name());
380 egg_group->set_cs_type(EggGroup::CST_inv_sphere);
383 if (node_desc->
get_max_node()->GetUserPropInt(_T(
"tube"), check)) {
386 egg_group->set_collision_name(node_desc->get_name());
387 egg_group->set_cs_type(EggGroup::CST_tube);
390 if (node_desc->
get_max_node()->GetUserPropInt(_T(
"floor-mesh"), check)) {
393 egg_group->set_collision_name(node_desc->get_name());
394 egg_group->set_cs_type(EggGroup::CST_floor_mesh);
398 if (node_desc->
get_max_node()->GetUserPropInt(_T(
"descend"), check)) {
401 egg_group->set_collide_flags(EggGroup::CF_descend);
404 if (node_desc->
get_max_node()->GetUserPropInt(_T(
"event"), check)) {
407 egg_group->set_collide_flags(EggGroup::CF_event);
410 if (node_desc->
get_max_node()->GetUserPropInt(_T(
"keep"), check)) {
413 egg_group->set_collide_flags(EggGroup::CF_keep);
416 if (node_desc->
get_max_node()->GetUserPropInt(_T(
"solid"), check)) {
419 egg_group->set_collide_flags(EggGroup::CF_solid);
422 if (node_desc->
get_max_node()->GetUserPropInt(_T(
"center"), check)) {
425 egg_group->set_collide_flags(EggGroup::CF_center);
428 if (node_desc->
get_max_node()->GetUserPropInt(_T(
"turnstile"), check)) {
431 egg_group->set_collide_flags(EggGroup::CF_turnstile);
434 if (node_desc->
get_max_node()->GetUserPropInt(_T(
"level"), check)) {
437 egg_group->set_collide_flags(EggGroup::CF_level);
440 if (node_desc->
get_max_node()->GetUserPropInt(_T(
"intangible"), check)) {
443 egg_group->set_collide_flags(EggGroup::CF_intangible);