Panda3D
|
This is the root of a MovingPart hierarchy. More...
#include "partBundle.h"
Public Types | |
enum | BlendType { BT_linear , BT_normalized_linear , BT_componentwise , BT_componentwise_quat } |
typedef pmap< AnimControl *, PN_stdfloat > | ChannelBlend |
![]() | |
enum | HierarchyMatchFlags { HMF_ok_part_extra = 0x01 , HMF_ok_anim_extra = 0x02 , HMF_ok_wrong_root_name = 0x04 } |
Public Member Functions | |
PartBundle (const std::string &name="") | |
Normally, a PartBundle constructor should not be called directly–it will get created when a PartBundleNode is created. More... | |
void | clear_anim_preload () |
Removes any AnimPreloadTable associated with the PartBundle. More... | |
void | clear_control_effects () |
Sets the control effect of all AnimControls to zero (but does not "stop" the AnimControls). More... | |
virtual int | complete_pointers (TypedWritable **p_list, BamReader *manager) |
Takes in a vector of pointers to TypedWritable objects that correspond to all the requests for pointers that this object made to BamReader. More... | |
virtual void | control_activated (AnimControl *control) |
Called by the AnimControl whenever it starts an animation. More... | |
bool | control_joint (const std::string &joint_name, PandaNode *node) |
Specifies that the joint with the indicated name should be animated with the transform on the indicated node. More... | |
void | control_removed (AnimControl *control) |
Called by the AnimControl when it destructs. More... | |
CPT (AnimPreloadTable) get_anim_preload() const | |
bool | do_bind_anim (AnimControl *control, AnimBundle *anim, int hierarchy_match_flags, const PartSubset &subset) |
The internal implementation of bind_anim(), this receives a pointer to an uninitialized AnimControl and fills it in if the bind is successful. More... | |
virtual void | finalize (BamReader *manager) |
Called by the BamReader to perform any final actions needed for setting up the object after all objects have been read and all pointers have been completed. More... | |
virtual TypeHandle | force_init_type () |
bool | force_update () |
Updates all the parts in the bundle to reflect the data for the current frame, whether we believe it needs it or not. More... | |
bool | freeze_joint (const std::string &joint_name, const LVecBase3 &pos, const LVecBase3 &hpr, const LVecBase3 &scale) |
Specifies that the joint with the indicated name should be frozen with the specified transform. More... | |
bool | freeze_joint (const std::string &joint_name, const TransformState *transform) |
Specifies that the joint with the indicated name should be frozen with the specified transform. More... | |
bool | freeze_joint (const std::string &joint_name, PN_stdfloat value) |
Specifies that the joint with the indicated name should be frozen with the specified transform. More... | |
bool | get_anim_blend_flag () const |
BlendType | get_blend_type () const |
PN_stdfloat | get_control_effect (AnimControl *control) const |
Returns the amount by which the character is affected by the indicated AnimControl and its associated animation. More... | |
bool | get_frame_blend_flag () const |
PartBundleNode * | get_node (int n) const |
int | get_num_nodes () const |
const LMatrix4 & | get_root_xform () const |
virtual TypeHandle | get_type () const |
virtual PartGroup * | make_copy () const |
Allocates and returns a new copy of the node. More... | |
void | merge_anim_preloads (const PartBundle *other) |
Copies the contents of the other PartBundle's preload table into this one. More... | |
virtual void | output (std::ostream &out) const |
Writes a one-line description of the bundle. More... | |
PT (AnimControl) bind_anim(AnimBundle *anim | |
PT (AnimControl) load_bind_anim(Loader *loader | |
PT (AnimPreloadTable) modify_anim_preload() | |
PT (PartBundle) apply_transform(const TransformState *transform) | |
bool | release_joint (const std::string &joint_name) |
Releases the named joint from the effects of a previous call to freeze_joint() or control_joint(). More... | |
void | set_anim_blend_flag (bool anim_blend_flag) |
void | set_anim_preload (AnimPreloadTable *table) |
Replaces the AnimPreloadTable associated with the PartBundle. More... | |
void | set_blend_type (BlendType bt) |
void | set_control_effect (AnimControl *control, PN_stdfloat effect) |
Sets the amount by which the character is affected by the indicated AnimControl (and its associated animation). More... | |
void | set_frame_blend_flag (bool frame_blend_flag) |
void | set_root_xform (const LMatrix4 &root_xform) |
void | set_update_delay (double delay) |
Specifies the minimum amount of time, in seconds, that should elapse between any two consecutive updates. More... | |
bool | update () |
Updates all the parts in the bundle to reflect the data for the current frame (as set in each of the AnimControls). More... | |
void | wait_pending () |
Blocks the current thread until all currently-pending AnimControls, with a nonzero control effect, have been loaded and are properly bound. More... | |
virtual void | write (std::ostream &out, int indent_level) const |
Writes a brief description of the bundle and all of its descendants. More... | |
virtual void | write_datagram (BamWriter *manager, Datagram &dg) |
Writes the contents of this object to the datagram for shipping out to a Bam file. More... | |
void | xform (const LMatrix4 &mat) |
Applies the indicated transform to the root of the animated hierarchy. More... | |
![]() | |
PartGroup (PartGroup *parent, const std::string &name) | |
Creates the PartGroup, and adds it to the indicated parent. More... | |
virtual bool | apply_control (PandaNode *node) |
Specifies a node to influence this particular joint so that it will always hold the node's transform. More... | |
bool | apply_freeze (const TransformState *transform) |
Freezes this particular joint so that it will always hold the specified transform. More... | |
virtual bool | apply_freeze_matrix (const LVecBase3 &pos, const LVecBase3 &hpr, const LVecBase3 &scale) |
Freezes this particular joint so that it will always hold the specified transform. More... | |
virtual bool | apply_freeze_scalar (PN_stdfloat value) |
Freezes this particular joint so that it will always hold the specified transform. More... | |
bool | check_hierarchy (const AnimGroup *anim, const PartGroup *parent, int hierarchy_match_flags=0) const |
Walks the part hierarchy in tandem with the indicated anim hierarchy, and returns true if the hierarchies match, false otherwise. More... | |
virtual bool | clear_forced_channel () |
Undoes the effect of a previous call to apply_freeze() or apply_control(). More... | |
PartGroup * | copy_subgraph () const |
Allocates and returns a new copy of this node and of all of its children. More... | |
virtual void | determine_effective_channels (const CycleData *root_cdata) |
Should be called whenever the ChannelBlend values have changed, this recursively updates the _effective_channel member in each part. More... | |
virtual bool | do_update (PartBundle *root, const CycleData *root_cdata, PartGroup *parent, bool parent_changed, bool anim_changed, Thread *current_thread) |
Recursively update this particular part and all of its descendents for the current frame. More... | |
virtual void | do_xform (const LMatrix4 &mat, const LMatrix4 &inv_mat) |
Called by PartBundle::xform(), this indicates the indicated transform is being applied to the root joint. More... | |
PartGroup * | find_child (const std::string &name) const |
Returns the first descendant found with the indicated name, or NULL if no such descendant exists. More... | |
PartGroup * | get_child (int n) const |
PartGroup * | get_child_named (const std::string &name) const |
Returns the first child found with the indicated name, or NULL if no such child exists. More... | |
virtual AnimChannelBase * | get_forced_channel () const |
Returns the AnimChannelBase that has been forced to this joint by a previous call to apply_freeze() or apply_control(), or NULL if no such channel has been applied. More... | |
int | get_num_children () const |
virtual TypeHandle | get_value_type () const |
Returns the TypeHandle associated with the ValueType we are concerned with. More... | |
virtual bool | is_character_joint () const |
Returns true if this part is a CharacterJoint, false otherwise. More... | |
void | sort_descendants () |
Sorts the children nodes at each level of the hierarchy into alphabetical order. More... | |
virtual void | write_with_value (std::ostream &out, int indent_level) const |
Writes a brief description of the group, showing its current value, and that of all of its descendants. More... | |
![]() | |
TypedWritableReferenceCount (const TypedWritableReferenceCount ©) | |
virtual ReferenceCount * | as_reference_count () |
Returns the pointer cast to a ReferenceCount pointer, if it is in fact of that type. More... | |
void | operator= (const TypedWritableReferenceCount ©) |
![]() | |
TypedWritable (const TypedWritable ©) | |
vector_uchar | encode_to_bam_stream () const |
Converts the TypedWritable object into a single stream of data using a BamWriter, and returns that data as a bytes object. More... | |
bool | encode_to_bam_stream (vector_uchar &data, BamWriter *writer=nullptr) const |
Converts the TypedWritable object into a single stream of data using a BamWriter, and stores that data in the indicated string. More... | |
UpdateSeq | get_bam_modified () const |
Returns the current bam_modified counter. More... | |
void | mark_bam_modified () |
Increments the bam_modified counter, so that this object will be invalidated and retransmitted on any open bam streams. More... | |
void | operator= (const TypedWritable ©) |
virtual bool | require_fully_complete () const |
Some objects require all of their nested pointers to have been completed before the objects themselves can be completed. More... | |
virtual void | update_bam_nested (BamWriter *manager) |
Called by the BamWriter when this object has not itself been modified recently, but it should check its nested objects for updates. More... | |
![]() | |
TypedObject (const TypedObject ©)=default | |
TypedObject * | as_typed_object () |
Returns the object, upcast (if necessary) to a TypedObject pointer. More... | |
const TypedObject * | as_typed_object () const |
Returns the object, upcast (if necessary) to a TypedObject pointer. More... | |
int | get_best_parent_from_Set (const std::set< int > &) const |
int | get_type_index () const |
Returns the internal index number associated with this object's TypeHandle, a unique number for each different type. More... | |
bool | is_exact_type (TypeHandle handle) const |
Returns true if the current object is the indicated type exactly. More... | |
bool | is_of_type (TypeHandle handle) const |
Returns true if the current object is or derives from the indicated type. More... | |
TypedObject & | operator= (const TypedObject ©)=default |
![]() | |
void | operator delete (void *, void *) |
void | operator delete (void *ptr) |
void | operator delete[] (void *, void *) |
void | operator delete[] (void *ptr) |
void * | operator new (size_t size) |
void * | operator new (size_t size, void *ptr) |
void * | operator new[] (size_t size) |
void * | operator new[] (size_t size, void *ptr) |
![]() | |
int | get_ref_count () const |
WeakReferenceList * | get_weak_list () const |
Returns the WeakReferenceList associated with this ReferenceCount object. More... | |
bool | has_weak_list () const |
Returns true if this particular ReferenceCount object has a WeakReferenceList created, false otherwise. More... | |
void | local_object () |
This function should be called, once, immediately after creating a new instance of some ReferenceCount-derived object on the stack. More... | |
void | ref () const |
Explicitly increments the reference count. More... | |
bool | ref_if_nonzero () const |
Atomically increases the reference count of this object if it is not zero. More... | |
bool | test_ref_count_integrity () const |
Does some easy checks to make sure that the reference count isn't completely bogus. More... | |
bool | test_ref_count_nonzero () const |
Does some easy checks to make sure that the reference count isn't zero, or completely bogus. More... | |
virtual bool | unref () const |
Explicitly decrements the reference count. More... | |
bool | unref_if_one () const |
Atomically decreases the reference count of this object if it is one. More... | |
WeakReferenceList * | weak_ref () |
Adds the indicated PointerToVoid as a weak reference to this object. More... | |
void | weak_unref () |
Removes the indicated PointerToVoid as a weak reference to this object. More... | |
![]() | |
Namable (const std::string &initial_name="") | |
void | clear_name () |
Resets the Namable's name to empty. More... | |
const std::string & | get_name () const |
bool | has_name () const |
Returns true if the Namable has a nonempty name set, false if the name is empty. More... | |
void | output (std::ostream &out) const |
Outputs the Namable. More... | |
void | set_name (const std::string &name) |
Static Public Member Functions | |
static TypeHandle | get_class_type () |
static void | init_type () |
static void | register_with_read_factory () |
Factory method to generate a PartBundle object. More... | |
![]() | |
static TypeHandle | get_class_type () |
static void | init_type () |
static TypedWritable * | make_PartGroup (const FactoryParams ¶ms) |
Factory method to generate a PartGroup object. More... | |
static void | register_with_read_factory () |
Factory method to generate a PartGroup object. More... | |
![]() | |
static TypeHandle | get_class_type () |
static void | init_type () |
static | PT (TypedWritableReferenceCount) decode_from_bam_stream(vector_uchar data |
![]() | |
static bool | decode_raw_from_bam_stream (TypedWritable *&ptr, ReferenceCount *&ref_ptr, vector_uchar data, BamReader *reader=nullptr) |
Reads the bytes created by a previous call to encode_to_bam_stream(), and extracts the single object on those bytes. More... | |
static TypeHandle | get_class_type () |
static void | init_type () |
![]() | |
static TypeHandle | get_class_type () |
static void | init_type () |
This function is declared non-inline to work around a compiler bug in g++ 2.96. More... | |
![]() | |
static TypeHandle | get_class_type () |
static void | init_type () |
![]() | |
static TypeHandle | get_class_type () |
static void | init_type () |
Public Attributes | |
const Filename int const PartSubset bool | allow_async |
const Filename & | filename |
get_anim_blend_flag | |
Returns whether the character allows multiple different animations to be bound simultaneously. More... | |
get_blend_type | |
Returns the algorithm that is used when blending multiple frames or multiple animations together, when either anim_blend_flag or frame_blend_flag is set to true. More... | |
get_frame_blend_flag | |
Returns whether the character interpolates (blends) between two sequential animation frames, or whether it holds the current frame until the next one is ready. More... | |
get_node | |
Returns the nth PartBundleNode associated with this PartBundle. More... | |
get_num_nodes | |
Returns the number of PartBundleNodes that contain a pointer to this PartBundle. More... | |
get_root_xform | |
Returns the transform matrix which is implicitly applied at the root of the animated hierarchy. More... | |
int | hierarchy_match_flags = 0 |
const Filename int | hierarchy_match_flags |
set_anim_blend_flag | |
Defines the way the character responds to multiple calls to set_control_effect()). More... | |
set_blend_type | |
Defines the algorithm that is used when blending multiple frames or multiple animations together, when either anim_blend_flag or frame_blend_flag is set to true. More... | |
set_frame_blend_flag | |
Specifies whether the character interpolates (blends) between two sequential frames of an active animation, showing a smooth intra-frame motion, or whether it holds each frame until the next frame is ready, showing precisely the specified animation. More... | |
set_root_xform | |
Specifies the transform matrix which is implicitly applied at the root of the animated hierarchy. More... | |
int const PartSubset & | subset = PartSubset()) |
const Filename int const PartSubset & | subset |
![]() | |
get_child | |
Returns the nth child of the group. More... | |
get_num_children | |
Returns the number of child nodes of the group. More... | |
![]() | |
static BamReader * | reader = nullptr) |
![]() | |
get_type | |
![]() | |
get_ref_count | |
Returns the current reference count. More... | |
![]() | |
get_name | |
set_name | |
Friends | |
class | Character |
class | MovingPartBase |
class | MovingPartMatrix |
class | MovingPartScalar |
class | PartBundleNode |
Additional Inherited Members | |
![]() | |
static TypedWritable *const | Null = nullptr |
This is the root of a MovingPart hierarchy.
It defines the hierarchy of moving parts that make up an animatable object.
Definition at line 46 of file partBundle.h.
|
explicit |
Normally, a PartBundle constructor should not be called directly–it will get created when a PartBundleNode is created.
Definition at line 71 of file partBundle.cxx.
|
inline |
Removes any AnimPreloadTable associated with the PartBundle.
Definition at line 44 of file partBundle.I.
void PartBundle::clear_control_effects | ( | ) |
Sets the control effect of all AnimControls to zero (but does not "stop" the AnimControls).
The character will no longer be affected by any animation, and will return to its default pose (unless restore-initial-pose is false).
The AnimControls which are no longer associated will not be using any CPU cycles, but they may still be in the "playing" state; if they are later reassociated with the PartBundle they will resume at their current frame as if they'd been running all along.
Definition at line 196 of file partBundle.cxx.
|
virtual |
Takes in a vector of pointers to TypedWritable objects that correspond to all the requests for pointers that this object made to BamReader.
Reimplemented from PartGroup.
Definition at line 780 of file partBundle.cxx.
|
virtual |
Called by the AnimControl whenever it starts an animation.
This is just a hook so the bundle can do something, if necessary, before the animation starts.
Definition at line 532 of file partBundle.cxx.
bool PartBundle::control_joint | ( | const std::string & | joint_name, |
PandaNode * | node | ||
) |
Specifies that the joint with the indicated name should be animated with the transform on the indicated node.
It will henceforth always follow the node's transform, regardless of any animations that may subsequently be bound to the joint.
Returns true if the joint is successfully controlled, or false if the named child is not a joint (or slider) or does not exist.
Definition at line 435 of file partBundle.cxx.
References PartGroup::apply_control(), and PartGroup::find_child().
void PartBundle::control_removed | ( | AnimControl * | control | ) |
Called by the AnimControl when it destructs.
This needs to remove the AnimControl pointer from all pipeline stages.
Definition at line 551 of file partBundle.cxx.
bool PartBundle::do_bind_anim | ( | AnimControl * | control, |
AnimBundle * | anim, | ||
int | hierarchy_match_flags, | ||
const PartSubset & | subset | ||
) |
The internal implementation of bind_anim(), this receives a pointer to an uninitialized AnimControl and fills it in if the bind is successful.
Returns true if successful, false otherwise.
Definition at line 578 of file partBundle.cxx.
Referenced by PT().
|
virtual |
Called by the BamReader to perform any final actions needed for setting up the object after all objects have been read and all pointers have been completed.
Reimplemented from TypedWritable.
Definition at line 758 of file partBundle.cxx.
References PartGroup::do_update(), and Thread::get_current_thread.
bool PartBundle::force_update | ( | ) |
Updates all the parts in the bundle to reflect the data for the current frame, whether we believe it needs it or not.
Definition at line 508 of file partBundle.cxx.
References PartGroup::do_update(), Thread::get_current_thread, and AnimControl::mark_channels().
bool PartBundle::freeze_joint | ( | const std::string & | joint_name, |
const LVecBase3 & | pos, | ||
const LVecBase3 & | hpr, | ||
const LVecBase3 & | scale | ||
) |
Specifies that the joint with the indicated name should be frozen with the specified transform.
It will henceforth always hold this fixed transform, regardless of any animations that may subsequently be bound to the joint.
Returns true if the joint is successfully frozen, or false if the named child is not a joint (or slider) or does not exist.
Definition at line 392 of file partBundle.cxx.
bool PartBundle::freeze_joint | ( | const std::string & | joint_name, |
const TransformState * | transform | ||
) |
Specifies that the joint with the indicated name should be frozen with the specified transform.
It will henceforth always hold this fixed transform, regardless of any animations that may subsequently be bound to the joint.
Returns true if the joint is successfully frozen, or false if the named child is not a joint (or slider) or does not exist.
Definition at line 371 of file partBundle.cxx.
References PartGroup::apply_freeze(), and PartGroup::find_child().
bool PartBundle::freeze_joint | ( | const std::string & | joint_name, |
PN_stdfloat | value | ||
) |
Specifies that the joint with the indicated name should be frozen with the specified transform.
It will henceforth always hold this fixed transform, regardless of any animations that may subsequently be bound to the joint.
Returns true if the joint is successfully frozen, or false if the named child is not a joint (or slider) or does not exist.
Definition at line 413 of file partBundle.cxx.
References PartGroup::apply_freeze_scalar(), and PartGroup::find_child().
|
inline |
Returns the amount by which the character is affected by the indicated AnimControl and its associated animation.
See set_control_effect().
Definition at line 196 of file partBundle.I.
|
virtual |
Allocates and returns a new copy of the node.
Children are not copied, but see copy_subgraph().
Reimplemented from PartGroup.
Definition at line 82 of file partBundle.cxx.
void PartBundle::merge_anim_preloads | ( | const PartBundle * | other | ) |
Copies the contents of the other PartBundle's preload table into this one.
Definition at line 90 of file partBundle.cxx.
Referenced by Character::merge_bundles().
|
virtual |
Writes a one-line description of the bundle.
Definition at line 213 of file partBundle.cxx.
|
static |
Factory method to generate a PartBundle object.
Definition at line 828 of file partBundle.cxx.
References BamReader::get_factory(), and Factory< Type >::register_factory().
bool PartBundle::release_joint | ( | const std::string & | joint_name | ) |
Releases the named joint from the effects of a previous call to freeze_joint() or control_joint().
It will henceforth once again follow whatever transforms are dictated by the animation.
Returns true if the joint is released, or false if the named child was not previously controlled or frozen, or it does not exist.
Definition at line 456 of file partBundle.cxx.
References PartGroup::clear_forced_channel(), and PartGroup::find_child().
|
inline |
Replaces the AnimPreloadTable associated with the PartBundle.
Definition at line 36 of file partBundle.I.
|
inline |
Sets the amount by which the character is affected by the indicated AnimControl (and its associated animation).
Normally, this will only be zero or one. Zero indicates the animation does not affect the character, and one means it does.
If the _anim_blend_flag is not false (see set_anim_blend_flag()), it is possible to have multiple AnimControls in effect simultaneously. In this case, the effect is a weight that indicates the relative importance of each AnimControl to the final animation.
Definition at line 184 of file partBundle.I.
|
inline |
Specifies the minimum amount of time, in seconds, that should elapse between any two consecutive updates.
This is normally used by Character::set_lod_animation(), and should not be called directly.
Definition at line 207 of file partBundle.I.
bool PartBundle::update | ( | ) |
Updates all the parts in the bundle to reflect the data for the current frame (as set in each of the AnimControls).
Returns true if any part has changed as a result of this, or false otherwise.
Definition at line 476 of file partBundle.cxx.
References PartGroup::do_update(), Thread::get_current_thread, ClockObject::get_frame_time, ClockObject::get_global_clock(), and AnimControl::mark_channels().
void PartBundle::wait_pending | ( | ) |
Blocks the current thread until all currently-pending AnimControls, with a nonzero control effect, have been loaded and are properly bound.
Definition at line 348 of file partBundle.cxx.
References AnimControl::wait_pending().
|
virtual |
Writes a brief description of the bundle and all of its descendants.
Reimplemented from PartGroup.
Definition at line 221 of file partBundle.cxx.
References indent().
Writes the contents of this object to the datagram for shipping out to a Bam file.
Reimplemented from PartGroup.
Definition at line 769 of file partBundle.cxx.
References BamWriter::write_cdata(), PartGroup::write_datagram(), and BamWriter::write_pointer().
|
inline |
Applies the indicated transform to the root of the animated hierarchy.
Definition at line 135 of file partBundle.I.
|
inline |
Returns whether the character allows multiple different animations to be bound simultaneously.
Definition at line 117 of file partBundle.h.
|
inline |
Returns the algorithm that is used when blending multiple frames or multiple animations together, when either anim_blend_flag or frame_blend_flag is set to true.
Definition at line 116 of file partBundle.h.
|
inline |
Returns whether the character interpolates (blends) between two sequential animation frames, or whether it holds the current frame until the next one is ready.
Definition at line 118 of file partBundle.h.
|
inline |
Returns the nth PartBundleNode associated with this PartBundle.
Definition at line 114 of file partBundle.h.
|
inline |
Returns the number of PartBundleNodes that contain a pointer to this PartBundle.
Definition at line 114 of file partBundle.h.
|
inline |
Returns the transform matrix which is implicitly applied at the root of the animated hierarchy.
Definition at line 119 of file partBundle.h.
void PartBundle::set_anim_blend_flag |
Defines the way the character responds to multiple calls to set_control_effect()).
By default, this flag is set false, which disallows multiple animations. When this flag is false, it is not necessary to explicitly set the control_effect when starting an animation; starting the animation will implicitly remove the control_effect from the previous animation and set it on the current one.
However, if this flag is set true, the control_effect must be explicitly set via set_control_effect() whenever an animation is to affect the character.
Definition at line 117 of file partBundle.h.
|
inline |
Defines the algorithm that is used when blending multiple frames or multiple animations together, when either anim_blend_flag or frame_blend_flag is set to true.
See partBundle.h for a description of the meaning of each of the BlendType values.
Definition at line 116 of file partBundle.h.
|
inline |
Specifies whether the character interpolates (blends) between two sequential frames of an active animation, showing a smooth intra-frame motion, or whether it holds each frame until the next frame is ready, showing precisely the specified animation.
When this value is false, the character holds each frame until the next is ready. When this is true, the character will interpolate between two consecutive frames of animation for each frame the animation is onscreen, according to the amount of time elapsed between the frames.
The default value of this flag is determined by the interpolate-frames Config.prc variable.
Use set_blend_type() to change the algorithm that the character uses to interpolate matrix positions.
Definition at line 118 of file partBundle.h.
|
inline |
Specifies the transform matrix which is implicitly applied at the root of the animated hierarchy.
Definition at line 119 of file partBundle.h.