130 lines
4.5 KiB
Plaintext
130 lines
4.5 KiB
Plaintext
// Filename: sequenceNode.I
|
|
// Created by: drose (06Mar02)
|
|
//
|
|
////////////////////////////////////////////////////////////////////
|
|
//
|
|
// PANDA 3D SOFTWARE
|
|
// Copyright (c) 2001 - 2004, Disney Enterprises, Inc. All rights reserved
|
|
//
|
|
// All use of this software is subject to the terms of the Panda 3d
|
|
// Software license. You should have received a copy of this license
|
|
// along with this source code; you will also find a current copy of
|
|
// the license at http://etc.cmu.edu/panda3d/docs/license/ .
|
|
//
|
|
// To contact the maintainers of this program write to
|
|
// panda3d-general@lists.sourceforge.net .
|
|
//
|
|
////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
// Function: SequenceNode::CData::Constructor
|
|
// Access: Public
|
|
// Description:
|
|
////////////////////////////////////////////////////////////////////
|
|
INLINE SequenceNode::CData::
|
|
CData() {
|
|
_cycle_rate = 0.0f;
|
|
_frame_offset = 0.0f;
|
|
_start_time = 0.0f;
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
// Function: SequenceNode::CData::Copy Constructor
|
|
// Access: Public
|
|
// Description:
|
|
////////////////////////////////////////////////////////////////////
|
|
INLINE SequenceNode::CData::
|
|
CData(const SequenceNode::CData ©) :
|
|
_cycle_rate(copy._cycle_rate),
|
|
_frame_offset(copy._frame_offset),
|
|
_start_time(copy._start_time)
|
|
{
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
// Function: SequenceNode::Constructor
|
|
// Access: Published
|
|
// Description:
|
|
////////////////////////////////////////////////////////////////////
|
|
INLINE SequenceNode::
|
|
SequenceNode(float cycle_rate, const string &name) :
|
|
SelectiveChildNode(name)
|
|
{
|
|
CDWriter cdata(_cycler);
|
|
cdata->_cycle_rate = cycle_rate;
|
|
cdata->_frame_offset = 0.0f;
|
|
|
|
float now = ClockObject::get_global_clock()->get_frame_time();
|
|
cdata->_start_time = now;
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
// Function: SequenceNode::set_cycle_rate
|
|
// Access: Published
|
|
// Description: Sets the rate of cycling for the children of the
|
|
// SequenceNode, in cycles per second.
|
|
////////////////////////////////////////////////////////////////////
|
|
INLINE void SequenceNode::
|
|
set_cycle_rate(float cycle_rate) {
|
|
// Do some fussing so we keep the same frame visible while we
|
|
// change this.
|
|
CDWriter cdata(_cycler);
|
|
float now = ClockObject::get_global_clock()->get_frame_time();
|
|
cdata->_frame_offset = calc_frame(now);
|
|
cdata->_start_time = now;
|
|
cdata->_cycle_rate = cycle_rate;
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
// Function: SequenceNode::get_cycle_rate
|
|
// Access: Published
|
|
// Description: Returns the rate of cycling for the children of the
|
|
// SequenceNode, in cycles per second.
|
|
////////////////////////////////////////////////////////////////////
|
|
INLINE float SequenceNode::
|
|
get_cycle_rate() const {
|
|
CDReader cdata(_cycler);
|
|
return cdata->_cycle_rate;
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
// Function: SequenceNode::set_visible_child
|
|
// Access: Published
|
|
// Description: Sets the particular child that this SequenceNode will
|
|
// display this frame. Future frames will proceed from
|
|
// here.
|
|
////////////////////////////////////////////////////////////////////
|
|
INLINE void SequenceNode::
|
|
set_visible_child(int index) {
|
|
int num_children = get_num_children();
|
|
if (num_children != 0) {
|
|
CDWriter cdata(_cycler);
|
|
float now = ClockObject::get_global_clock()->get_frame_time();
|
|
cdata->_frame_offset = (index - (now - cdata->_start_time) * cdata->_cycle_rate);
|
|
}
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
// Function: SequenceNode::calc_frame
|
|
// Access: Private
|
|
// Description: Returns the floating-point frame number at the
|
|
// indicated time.
|
|
////////////////////////////////////////////////////////////////////
|
|
INLINE float SequenceNode::
|
|
calc_frame(float now) const {
|
|
CDReader cdata(_cycler);
|
|
return (now - cdata->_start_time) * cdata->_cycle_rate + cdata->_frame_offset;
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
// Function: SequenceNode::calc_frame
|
|
// Access: Private
|
|
// Description: Returns the floating-point frame number at the
|
|
// current time.
|
|
////////////////////////////////////////////////////////////////////
|
|
INLINE float SequenceNode::
|
|
calc_frame() const {
|
|
return calc_frame(ClockObject::get_global_clock()->get_frame_time());
|
|
}
|