mirror of
https://github.com/panda3d/panda3d.git
synced 2025-10-04 02:42:49 -04:00
199 lines
5.7 KiB
C++
199 lines
5.7 KiB
C++
// Filename: cInterval.h
|
|
// Created by: drose (27Aug02)
|
|
//
|
|
////////////////////////////////////////////////////////////////////
|
|
//
|
|
// PANDA 3D SOFTWARE
|
|
// Copyright (c) 2001, 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://www.panda3d.org/license.txt .
|
|
//
|
|
// To contact the maintainers of this program write to
|
|
// panda3d@yahoogroups.com .
|
|
//
|
|
////////////////////////////////////////////////////////////////////
|
|
|
|
#ifndef CINTERVAL_H
|
|
#define CINTERVAL_H
|
|
|
|
#include "directbase.h"
|
|
#include "typedReferenceCount.h"
|
|
#include "pvector.h"
|
|
#include "config_interval.h"
|
|
|
|
class CIntervalManager;
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
// Class : CInterval
|
|
// Description : The base class for timeline components. A CInterval
|
|
// represents a single action, event, or collection of
|
|
// nested intervals that will be performed at some
|
|
// specific time or over a period of time.
|
|
//
|
|
// This is essentially similar to the Python "Interval"
|
|
// class, but it is implemented in C++ (hence the name).
|
|
// Intervals that may be implemented in C++ will inherit
|
|
// from this class; Intervals that must be implemented
|
|
// in Python will inherit from the similar Python class.
|
|
////////////////////////////////////////////////////////////////////
|
|
class EXPCL_DIRECT CInterval : public TypedReferenceCount {
|
|
public:
|
|
CInterval(const string &name, double duration, bool open_ended);
|
|
|
|
PUBLISHED:
|
|
INLINE const string &get_name() const;
|
|
INLINE double get_duration() const;
|
|
INLINE bool get_open_ended() const;
|
|
|
|
enum EventType {
|
|
ET_initialize,
|
|
ET_instant,
|
|
ET_step,
|
|
ET_finalize,
|
|
ET_reverse_initialize,
|
|
ET_reverse_instant,
|
|
ET_reverse_finalize,
|
|
ET_interrupt
|
|
};
|
|
|
|
enum State {
|
|
S_initial,
|
|
S_started,
|
|
S_paused,
|
|
S_final
|
|
};
|
|
|
|
INLINE State get_state() const;
|
|
INLINE bool is_stopped() const;
|
|
|
|
INLINE void set_done_event(const string &event);
|
|
INLINE const string &get_done_event() const;
|
|
|
|
void set_t(double t);
|
|
INLINE double get_t() const;
|
|
|
|
INLINE void set_auto_pause(bool auto_pause);
|
|
INLINE bool get_auto_pause() const;
|
|
INLINE void set_auto_finish(bool auto_finish);
|
|
INLINE bool get_auto_finish() const;
|
|
|
|
INLINE void set_wants_t_callback(bool wants_t_callback);
|
|
INLINE bool get_wants_t_callback() const;
|
|
|
|
INLINE void set_manager(CIntervalManager *manager);
|
|
INLINE CIntervalManager *get_manager() const;
|
|
|
|
void start(double start_t = 0.0, double end_t = -1.0, double play_rate = 1.0);
|
|
void loop(double start_t = 0.0, double end_t = -1.0, double play_rate = 1.0);
|
|
double pause();
|
|
void resume();
|
|
void resume(double start_t);
|
|
void resume_until(double end_t);
|
|
void finish();
|
|
bool is_playing() const;
|
|
|
|
// These functions control the actual playback of the interval.
|
|
// Don't call them directly; they're intended to be called from a
|
|
// supervising object, e.g. the Python start() .. finish()
|
|
// interface.
|
|
|
|
// These cannot be declared private because they must be accessible
|
|
// to Python, but the method names are prefixed with priv_ to remind
|
|
// you that you probably don't want to be using them directly.
|
|
void priv_do_event(double t, EventType event);
|
|
virtual void priv_initialize(double t);
|
|
virtual void priv_instant();
|
|
virtual void priv_step(double t);
|
|
virtual void priv_finalize();
|
|
virtual void priv_reverse_initialize(double t);
|
|
virtual void priv_reverse_instant();
|
|
virtual void priv_reverse_finalize();
|
|
virtual void priv_interrupt();
|
|
|
|
virtual void output(ostream &out) const;
|
|
virtual void write(ostream &out, int indent_level) const;
|
|
|
|
void setup_play(double start_time, double end_time, double play_rate,
|
|
bool do_loop);
|
|
void setup_resume();
|
|
void setup_resume_until(double end_t);
|
|
bool step_play();
|
|
|
|
public:
|
|
void mark_dirty();
|
|
INLINE bool check_t_callback();
|
|
|
|
protected:
|
|
void interval_done();
|
|
|
|
INLINE void recompute() const;
|
|
virtual void do_recompute();
|
|
INLINE void check_stopped(TypeHandle type, const char *method_name) const;
|
|
INLINE void check_started(TypeHandle type, const char *method_name) const;
|
|
|
|
State _state;
|
|
double _curr_t;
|
|
string _name;
|
|
string _done_event;
|
|
double _duration;
|
|
|
|
bool _auto_pause;
|
|
bool _auto_finish;
|
|
bool _wants_t_callback;
|
|
double _last_t_callback;
|
|
CIntervalManager *_manager;
|
|
|
|
// For setup_play() and step_play().
|
|
double _clock_start;
|
|
double _start_t;
|
|
double _end_t;
|
|
bool _end_t_at_end;
|
|
bool _start_t_at_start;
|
|
double _play_rate;
|
|
bool _do_loop;
|
|
int _loop_count;
|
|
|
|
private:
|
|
bool _open_ended;
|
|
bool _dirty;
|
|
|
|
// We keep a record of the "parent" intervals (that is, any
|
|
// CMetaInterval objects that keep a pointer to this one) strictly
|
|
// so we can mark all of our parents dirty when this interval gets
|
|
// dirty.
|
|
typedef pvector<CInterval *> Parents;
|
|
Parents _parents;
|
|
|
|
public:
|
|
static TypeHandle get_class_type() {
|
|
return _type_handle;
|
|
}
|
|
static void init_type() {
|
|
TypedReferenceCount::init_type();
|
|
register_type(_type_handle, "CInterval",
|
|
TypedReferenceCount::get_class_type());
|
|
}
|
|
virtual TypeHandle get_type() const {
|
|
return get_class_type();
|
|
}
|
|
virtual TypeHandle force_init_type() {init_type(); return get_class_type();}
|
|
|
|
private:
|
|
static TypeHandle _type_handle;
|
|
|
|
friend class CMetaInterval;
|
|
};
|
|
|
|
INLINE ostream &operator << (ostream &out, const CInterval &ival);
|
|
ostream &operator << (ostream &out, CInterval::State state);
|
|
|
|
#include "cInterval.I"
|
|
|
|
#endif
|
|
|
|
|
|
|