157 lines
4.9 KiB
C
157 lines
4.9 KiB
C
|
/**
|
||
|
* PANDA 3D SOFTWARE
|
||
|
* Copyright (c) Carnegie Mellon University. All rights reserved.
|
||
|
*
|
||
|
* All use of this software is subject to the terms of the revised BSD
|
||
|
* license. You should have received a copy of this license along
|
||
|
* with this source code in a file named "LICENSE."
|
||
|
*
|
||
|
* @file partGroup.h
|
||
|
* @author drose
|
||
|
* @date 1999-02-22
|
||
|
*/
|
||
|
|
||
|
#ifndef PARTGROUP_H
|
||
|
#define PARTGROUP_H
|
||
|
|
||
|
#include "pandabase.h"
|
||
|
|
||
|
#include "typedWritableReferenceCount.h"
|
||
|
#include "pointerTo.h"
|
||
|
#include "namable.h"
|
||
|
#include "typedef.h"
|
||
|
#include "thread.h"
|
||
|
#include "plist.h"
|
||
|
#include "luse.h"
|
||
|
|
||
|
class AnimControl;
|
||
|
class AnimGroup;
|
||
|
class PartBundle;
|
||
|
class PartSubset;
|
||
|
class BamReader;
|
||
|
class FactoryParams;
|
||
|
class BitArray;
|
||
|
class CycleData;
|
||
|
class TransformState;
|
||
|
class PandaNode;
|
||
|
class AnimChannelBase;
|
||
|
|
||
|
/**
|
||
|
* This is the base class for PartRoot and MovingPart. It defines a hierarchy
|
||
|
* of MovingParts.
|
||
|
*/
|
||
|
class EXPCL_PANDA_CHAN PartGroup : public TypedWritableReferenceCount, public Namable {
|
||
|
PUBLISHED:
|
||
|
// This enum defines bits which may be passed into check_hierarchy() and
|
||
|
// PartBundle::bind_anim() to allow an inexact match of channel hierarchies.
|
||
|
// This specifies conditions that we don't care about enforcing.
|
||
|
enum HierarchyMatchFlags {
|
||
|
HMF_ok_part_extra = 0x01,
|
||
|
HMF_ok_anim_extra = 0x02,
|
||
|
HMF_ok_wrong_root_name = 0x04,
|
||
|
};
|
||
|
|
||
|
protected:
|
||
|
// The default constructor is protected: don't try to create a PartGroup
|
||
|
// without a parent. To create a PartGroup hierarchy, you must first create
|
||
|
// a PartBundle, and use that as the parent of any subsequent children.
|
||
|
INLINE PartGroup(const std::string &name = "");
|
||
|
INLINE PartGroup(const PartGroup ©);
|
||
|
|
||
|
PUBLISHED:
|
||
|
// This is the normal PartGroup constructor.
|
||
|
explicit PartGroup(PartGroup *parent, const std::string &name);
|
||
|
virtual ~PartGroup();
|
||
|
virtual bool is_character_joint() const;
|
||
|
|
||
|
virtual PartGroup *make_copy() const;
|
||
|
PartGroup *copy_subgraph() const;
|
||
|
|
||
|
int get_num_children() const;
|
||
|
PartGroup *get_child(int n) const;
|
||
|
MAKE_SEQ(get_children, get_num_children, get_child);
|
||
|
|
||
|
PartGroup *get_child_named(const std::string &name) const;
|
||
|
PartGroup *find_child(const std::string &name) const;
|
||
|
void sort_descendants();
|
||
|
|
||
|
MAKE_SEQ_PROPERTY(children, get_num_children, get_child);
|
||
|
|
||
|
bool apply_freeze(const TransformState *transform);
|
||
|
virtual bool apply_freeze_matrix(const LVecBase3 &pos, const LVecBase3 &hpr, const LVecBase3 &scale);
|
||
|
virtual bool apply_freeze_scalar(PN_stdfloat value);
|
||
|
virtual bool apply_control(PandaNode *node);
|
||
|
virtual bool clear_forced_channel();
|
||
|
virtual AnimChannelBase *get_forced_channel() const;
|
||
|
|
||
|
virtual void write(std::ostream &out, int indent_level) const;
|
||
|
virtual void write_with_value(std::ostream &out, int indent_level) const;
|
||
|
|
||
|
public:
|
||
|
virtual TypeHandle get_value_type() const;
|
||
|
|
||
|
bool check_hierarchy(const AnimGroup *anim,
|
||
|
const PartGroup *parent,
|
||
|
int hierarchy_match_flags = 0) const;
|
||
|
|
||
|
virtual bool do_update(PartBundle *root, const CycleData *root_cdata,
|
||
|
PartGroup *parent, bool parent_changed,
|
||
|
bool anim_changed, Thread *current_thread);
|
||
|
virtual void do_xform(const LMatrix4 &mat, const LMatrix4 &inv_mat);
|
||
|
virtual void determine_effective_channels(const CycleData *root_cdata);
|
||
|
|
||
|
protected:
|
||
|
void write_descendants(std::ostream &out, int indent_level) const;
|
||
|
void write_descendants_with_value(std::ostream &out, int indent_level) const;
|
||
|
|
||
|
virtual void pick_channel_index(plist<int> &holes, int &next) const;
|
||
|
virtual void bind_hierarchy(AnimGroup *anim, int channel_index,
|
||
|
int &joint_index, bool is_included,
|
||
|
BitArray &bound_joints,
|
||
|
const PartSubset &subset);
|
||
|
virtual void find_bound_joints(int &joint_index, bool is_included,
|
||
|
BitArray &bound_joints,
|
||
|
const PartSubset &subset);
|
||
|
|
||
|
typedef pvector< PT(PartGroup) > Children;
|
||
|
Children _children;
|
||
|
|
||
|
public:
|
||
|
static void register_with_read_factory();
|
||
|
virtual void write_datagram(BamWriter* manager, Datagram &me);
|
||
|
virtual int complete_pointers(TypedWritable **p_list,
|
||
|
BamReader *manager);
|
||
|
|
||
|
static TypedWritable *make_PartGroup(const FactoryParams ¶ms);
|
||
|
|
||
|
protected:
|
||
|
void fillin(DatagramIterator& scan, BamReader* manager);
|
||
|
|
||
|
public:
|
||
|
virtual TypeHandle get_type() const {
|
||
|
return get_class_type();
|
||
|
}
|
||
|
virtual TypeHandle force_init_type() {init_type(); return get_class_type();}
|
||
|
static TypeHandle get_class_type() {
|
||
|
return _type_handle;
|
||
|
}
|
||
|
|
||
|
public:
|
||
|
static void init_type() {
|
||
|
TypedWritableReferenceCount::init_type();
|
||
|
register_type(_type_handle, "PartGroup",
|
||
|
TypedWritableReferenceCount::get_class_type());
|
||
|
}
|
||
|
|
||
|
private:
|
||
|
static TypeHandle _type_handle;
|
||
|
|
||
|
friend class Character;
|
||
|
friend class CharacterJointBundle;
|
||
|
friend class PartBundle;
|
||
|
};
|
||
|
|
||
|
#include "partGroup.I"
|
||
|
|
||
|
#endif
|